diff --git a/.github/workflows/ci_macos.yaml b/.github/workflows/ci_macos.yaml index 6180a44ea..e3f14f115 100644 --- a/.github/workflows/ci_macos.yaml +++ b/.github/workflows/ci_macos.yaml @@ -23,7 +23,6 @@ jobs: env: boost_path: "${{ github.workspace }}/../boost" - openssl_root: "$(brew --prefix openssl@3)" libtorrent_path: "${{ github.workspace }}/../libtorrent" steps: @@ -70,7 +69,7 @@ jobs: mv "${{ github.workspace }}/.."/boost_* "${{ env.boost_path }}" - name: Install Qt - uses: jurplel/install-qt-action@v3 + uses: jurplel/install-qt-action@v4 with: version: ${{ matrix.qt_version }} archives: qtbase qtdeclarative qtsvg qttools @@ -94,8 +93,7 @@ jobs: -DCMAKE_CXX_STANDARD=17 \ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ -DBOOST_ROOT="${{ env.boost_path }}" \ - -Ddeprecated-functions=OFF \ - -DOPENSSL_ROOT_DIR="${{ env.openssl_root }}" + -Ddeprecated-functions=OFF cmake --build build sudo cmake --install build @@ -109,7 +107,6 @@ jobs: -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ -DBOOST_ROOT="${{ env.boost_path }}" \ - -DOPENSSL_ROOT_DIR="${{ env.openssl_root }}" \ -DTESTING=ON \ -DVERBOSE_CONFIGURE=ON \ -D${{ matrix.qbt_gui }} diff --git a/.github/workflows/ci_python.yaml b/.github/workflows/ci_python.yaml index f08b382b4..fe525c8c6 100644 --- a/.github/workflows/ci_python.yaml +++ b/.github/workflows/ci_python.yaml @@ -53,7 +53,7 @@ jobs: python-version: '3.7' - name: Install tools (search engine) - run: pip install bandit pycodestyle pyflakes + run: pip install bandit mypy pycodestyle pyflakes pyright - name: Gather files (search engine) run: | @@ -61,6 +61,16 @@ jobs: echo $PY_FILES echo "PY_FILES=$PY_FILES" >> "$GITHUB_ENV" + - name: Check typings (search engine) + run: | + MYPYPATH="src/searchengine/nova3" \ + mypy \ + --follow-imports skip \ + --strict \ + $PY_FILES + pyright \ + $PY_FILES + - name: Lint code (search engine) run: | pyflakes $PY_FILES diff --git a/.github/workflows/ci_ubuntu.yaml b/.github/workflows/ci_ubuntu.yaml index bcae07196..172876852 100644 --- a/.github/workflows/ci_ubuntu.yaml +++ b/.github/workflows/ci_ubuntu.yaml @@ -64,7 +64,7 @@ jobs: mv "${{ github.workspace }}/.."/boost_* "${{ env.boost_path }}" - name: Install Qt - uses: jurplel/install-qt-action@v3 + uses: jurplel/install-qt-action@v4 with: version: ${{ matrix.qt_version }} archives: icu qtbase qtdeclarative qtsvg qttools @@ -138,12 +138,12 @@ jobs: curl \ -L \ -Z \ - -O https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage \ - -O https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage \ + -O https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-static-x86_64.AppImage \ + -O https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-static-x86_64.AppImage \ -O https://github.com/linuxdeploy/linuxdeploy-plugin-appimage/releases/download/continuous/linuxdeploy-plugin-appimage-x86_64.AppImage chmod +x \ - linuxdeploy-x86_64.AppImage \ - linuxdeploy-plugin-qt-x86_64.AppImage \ + linuxdeploy-static-x86_64.AppImage \ + linuxdeploy-plugin-qt-static-x86_64.AppImage \ linuxdeploy-plugin-appimage-x86_64.AppImage - name: Prepare files for AppImage @@ -156,12 +156,12 @@ jobs: - name: Package AppImage run: | - ./linuxdeploy-x86_64.AppImage --appdir qbittorrent --plugin qt + ./linuxdeploy-static-x86_64.AppImage --appdir qbittorrent --plugin qt rm qbittorrent/apprun-hooks/* cp .github/workflows/helper/appimage/export_vars.sh qbittorrent/apprun-hooks/export_vars.sh NO_APPSTREAM=1 \ OUTPUT=upload/qbittorrent-CI_Ubuntu_x86_64.AppImage \ - ./linuxdeploy-x86_64.AppImage --appdir qbittorrent --output appimage + ./linuxdeploy-static-x86_64.AppImage --appdir qbittorrent --output appimage - name: Upload build artifacts uses: actions/upload-artifact@v4 diff --git a/.github/workflows/ci_windows.yaml b/.github/workflows/ci_windows.yaml index d6050d2fa..df7134182 100644 --- a/.github/workflows/ci_windows.yaml +++ b/.github/workflows/ci_windows.yaml @@ -93,7 +93,7 @@ jobs: move "${{ github.workspace }}/../boost_*" "${{ env.boost_path }}" - name: Install Qt - uses: jurplel/install-qt-action@v3 + uses: jurplel/install-qt-action@v4 with: version: "6.7.0" archives: qtbase qtsvg qttools @@ -153,26 +153,26 @@ jobs: copy build/qbittorrent.pdb upload/qBittorrent copy dist/windows/qt.conf upload/qBittorrent # runtimes - copy "${{ env.Qt6_DIR }}/bin/Qt6Core.dll" upload/qBittorrent - copy "${{ env.Qt6_DIR }}/bin/Qt6Gui.dll" upload/qBittorrent - copy "${{ env.Qt6_DIR }}/bin/Qt6Network.dll" upload/qBittorrent - copy "${{ env.Qt6_DIR }}/bin/Qt6Sql.dll" upload/qBittorrent - copy "${{ env.Qt6_DIR }}/bin/Qt6Svg.dll" upload/qBittorrent - copy "${{ env.Qt6_DIR }}/bin/Qt6Widgets.dll" upload/qBittorrent - copy "${{ env.Qt6_DIR }}/bin/Qt6Xml.dll" upload/qBittorrent + copy "${{ env.Qt_ROOT_DIR }}/bin/Qt6Core.dll" upload/qBittorrent + copy "${{ env.Qt_ROOT_DIR }}/bin/Qt6Gui.dll" upload/qBittorrent + copy "${{ env.Qt_ROOT_DIR }}/bin/Qt6Network.dll" upload/qBittorrent + copy "${{ env.Qt_ROOT_DIR }}/bin/Qt6Sql.dll" upload/qBittorrent + copy "${{ env.Qt_ROOT_DIR }}/bin/Qt6Svg.dll" upload/qBittorrent + copy "${{ env.Qt_ROOT_DIR }}/bin/Qt6Widgets.dll" upload/qBittorrent + copy "${{ env.Qt_ROOT_DIR }}/bin/Qt6Xml.dll" upload/qBittorrent mkdir upload/qBittorrent/plugins/iconengines - copy "${{ env.Qt6_DIR }}/plugins/iconengines/qsvgicon.dll" upload/qBittorrent/plugins/iconengines + copy "${{ env.Qt_ROOT_DIR }}/plugins/iconengines/qsvgicon.dll" upload/qBittorrent/plugins/iconengines mkdir upload/qBittorrent/plugins/imageformats - copy "${{ env.Qt6_DIR }}/plugins/imageformats/qico.dll" upload/qBittorrent/plugins/imageformats - copy "${{ env.Qt6_DIR }}/plugins/imageformats/qsvg.dll" upload/qBittorrent/plugins/imageformats + copy "${{ env.Qt_ROOT_DIR }}/plugins/imageformats/qico.dll" upload/qBittorrent/plugins/imageformats + copy "${{ env.Qt_ROOT_DIR }}/plugins/imageformats/qsvg.dll" upload/qBittorrent/plugins/imageformats mkdir upload/qBittorrent/plugins/platforms - copy "${{ env.Qt6_DIR }}/plugins/platforms/qwindows.dll" upload/qBittorrent/plugins/platforms + copy "${{ env.Qt_ROOT_DIR }}/plugins/platforms/qwindows.dll" upload/qBittorrent/plugins/platforms mkdir upload/qBittorrent/plugins/sqldrivers - copy "${{ env.Qt6_DIR }}/plugins/sqldrivers/qsqlite.dll" upload/qBittorrent/plugins/sqldrivers + copy "${{ env.Qt_ROOT_DIR }}/plugins/sqldrivers/qsqlite.dll" upload/qBittorrent/plugins/sqldrivers mkdir upload/qBittorrent/plugins/styles - copy "${{ env.Qt6_DIR }}/plugins/styles/qmodernwindowsstyle.dll" upload/qBittorrent/plugins/styles + copy "${{ env.Qt_ROOT_DIR }}/plugins/styles/qmodernwindowsstyle.dll" upload/qBittorrent/plugins/styles mkdir upload/qBittorrent/plugins/tls - copy "${{ env.Qt6_DIR }}/plugins/tls/qschannelbackend.dll" upload/qBittorrent/plugins/tls + copy "${{ env.Qt_ROOT_DIR }}/plugins/tls/qschannelbackend.dll" upload/qBittorrent/plugins/tls # cmake additionals mkdir upload/cmake copy build/compile_commands.json upload/cmake diff --git a/.github/workflows/coverity-scan.yaml b/.github/workflows/coverity-scan.yaml index cf3c3dc3b..fa66c6cb3 100644 --- a/.github/workflows/coverity-scan.yaml +++ b/.github/workflows/coverity-scan.yaml @@ -52,7 +52,7 @@ jobs: mv "${{ github.workspace }}/.."/boost_* "${{ env.boost_path }}" - name: Install Qt - uses: jurplel/install-qt-action@v3 + uses: jurplel/install-qt-action@v4 with: version: ${{ matrix.qt_version }} archives: icu qtbase qtdeclarative qtsvg qttools diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 816654ef8..504c83ada 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -78,11 +78,7 @@ repos: m4/.* | src/base/3rdparty/.* | src/searchengine/nova3/socks.py | - src/webui/www/private/lang/.* | - src/webui/www/private/scripts/lib/.* | - src/webui/www/public/lang/.* | - src/webui/www/public/scripts/lib/.* | - src/webui/www/transifex/.* + src/webui/www/private/scripts/lib/.* )$ exclude_types: - ts @@ -106,11 +102,7 @@ repos: m4/.* | src/base/3rdparty/.* | src/searchengine/nova3/socks.py | - src/webui/www/private/lang/.* | - src/webui/www/private/scripts/lib/.* | - src/webui/www/public/lang/.* | - src/webui/www/public/scripts/lib/.* | - src/webui/www/transifex/.* + src/webui/www/private/scripts/lib/.* )$ exclude_types: - svg diff --git a/.tx/config b/.tx/config index 593cf8675..95d5b1afa 100644 --- a/.tx/config +++ b/.tx/config @@ -17,14 +17,6 @@ type = QT minimum_perc = 23 lang_map = pt: pt_PT, zh: zh_CN -[o:sledgehammer999:p:qbittorrent:r:qbittorrent_webui_json] -file_filter = src/webui/www/transifex/.json -source_file = src/webui/www/transifex/en.json -source_lang = en -type = KEYVALUEJSON -minimum_perc = 23 -lang_map = pt: pt_PT, zh: zh_CN - [o:sledgehammer999:p:qbittorrent:r:qbittorrentdesktop_master] source_file = dist/unix/org.qbittorrent.qBittorrent.desktop source_lang = en diff --git a/Changelog b/Changelog index 8d702641d..c615b366e 100644 --- a/Changelog +++ b/Changelog @@ -12,14 +12,28 @@ Unreleased - sledgehammer999 - v5.0.0 - FEATURE: Enable Ctrl+F hotkey for more inputs (thalieht) - FEATURE: Add seeding limits to RSS and Watched folders options UI (glassez) - FEATURE: Subcategories implicitly follow the parent category options (glassez) - - FEATURE: Add support for SSL torrents (Chocobo1, Radu Carpa) - FEATURE: Add option to name each qbittorrent instance (Chocobo1) - FEATURE: Add button for sending test email (Thomas Piccirello) - FEATURE: Allow torrents to override default share limit action (glassez) + - FEATURE: Use Start/Stop instead of Resume/Pause (thalieht) + - FEATURE: Add the Popularity metric (Aliaksei Urbanski) + - FEATURE: Focus on Download button if torrent link retrieved from the clipboard (glassez) + - FEATURE: Add ability to pause/resume entire BitTorrent session (glassez) + - FEATURE: Add an option to set BitTorrent session shutdown timeout (glassez) + - FEATURE: Apply "Excluded file names" to folder names as well (glassez) + - FEATURE: Allow to use regular expression to filter torrent content (glassez) + - FEATURE: Allow to move content files to Trash instead of deleting them (glassez) + - FEATURE: Add ability to display torrent "privateness" in UI (ManiMatter) + - FEATURE: Add a flag in `Peers` tab denoting a connection using NAT hole punching (stalkerok) - BUGFIX: Display error message when unrecoverable error occurred (glassez) - BUGFIX: Update size of selected files when selection is changed (glassez) - BUGFIX: Normalize tags by trimming leading/trailing whitespace (glassez) - BUGFIX: Correctly handle share limits in torrent options dialog (glassez) + - BUGFIX: Adjust tracker tier when adding additional trackers (Chocobo1) + - BUGFIX: Fix inconsistent naming between `Done/Progress` column (luzpaz) + - BUGFIX: Sanitize peer client names (Hanabishi) + - BUGFIX: Apply share limits immediately when torrent downloading is finished (glassez) + - BUGFIX: Show download progress for folders with zero byte size as 100 instead of 0 (vikas_c) - WEBUI: Improve WebUI responsiveness (Chocobo1) - WEBUI: Do not exit the app when WebUI has failed to start (Hanabishi) - WEBUI: Add `Moving` filter to side panel (xavier2k6) @@ -28,14 +42,35 @@ Unreleased - sledgehammer999 - v5.0.0 - WEBUI: Leave the fields empty when value is invalid (Chocobo1) - WEBUI: Use natural sorting (Chocobo1) - WEBUI: Improve WebUI login behavior (JayRet) + - WEBUI: Conditionally show filters sidebar (Thomas Piccirello) + - WEBUI: Add support for running concurrent searches (Thomas Piccirello) + - WEBUI: Improve accuracy of trackers list (Thomas Piccirello) + - WEBUI: Fix error when category doesn't exist (Thomas Piccirello) + - WEBUI: Improve table scrolling and selection on mobile (Thomas Piccirello) + - WEBUI: Restore search tabs on load (Thomas Piccirello) + - WEBUI: Restore previously used tab on load (Thomas Piccirello) + - WEBUI: Increase default height of 'Share ratio limit' dialog (thalieht) + - WEBUI: Use enabled search plugins by default (Thomas Piccirello) + - WEBUI: Add columns `Incomplete Save Path`, `Info Hash v1`, `Info Hash v2` (thalieht) + - WEBUI: Always create generic filter items (skomerko) - WEBAPI: Fix wrong timestamp values (Chocobo1) - WEBAPI: Send binary data with filename and mime type specified (glassez) - WEBAPI: Expose API for the torrent creator (glassez, Radu Carpa) + - WEBAPI: Add support for SSL torrents (Chocobo1, Radu Carpa) + - WEBAPI: Provide endpoint for listing directory content (Paweł Kotiuk) + - WEBAPI: Provide "private" flag via "torrents/info" endpoint (ManiMatter) + - WEBAPI: Add a way to download .torrent file using search plugin (glassez) + - WEBAPI: Add "private" filter for "torrents/info" endpoint (ManiMatter) + - WEBAPI: Add root_path to "torrents/info" result (David Newhall) - RSS: Show RSS feed title in HTML browser (Jay) - RSS: Allow to set delay between requests to the same host (jNullj) - SEARCH: Allow users to specify Python executable path (Chocobo1) + - SEARCH: Lazy load search plugins (milahu) + - SEARCH: Add date column to the built-in search engine (ducalex) + - SEARCH: Allow to rearrange search tabs (glassez) - WINDOWS: Use Fusion style on Windows 10+. It has better compatibility with dark mode (glassez) - WINDOWS: Allow to set qBittorrent as default program (glassez) + - WINDOWS: Don't access "Favorites" folder unexpectedly (glassez) - LINUX: Add support for systemd power management (Chocobo1) - LINUX: Add support for localized man pages (Victor Chernyakin) - LINUX: Specify a locale if none is set (Chocobo1) diff --git a/dist/unix/org.qbittorrent.qBittorrent.metainfo.xml b/dist/unix/org.qbittorrent.qBittorrent.metainfo.xml index 6a840a610..c0489f3a0 100644 --- a/dist/unix/org.qbittorrent.qBittorrent.metainfo.xml +++ b/dist/unix/org.qbittorrent.qBittorrent.metainfo.xml @@ -62,6 +62,6 @@ https://github.com/qbittorrent/qBittorrent/blob/master/CONTRIBUTING.md - + diff --git a/src/base/CMakeLists.txt b/src/base/CMakeLists.txt index d764871d7..38154e98a 100644 --- a/src/base/CMakeLists.txt +++ b/src/base/CMakeLists.txt @@ -38,6 +38,8 @@ add_library(qbt_base STATIC bittorrent/torrent.h bittorrent/torrentcontenthandler.h bittorrent/torrentcontentlayout.h + bittorrent/torrentcontentremoveoption.h + bittorrent/torrentcontentremover.h bittorrent/torrentcreationmanager.h bittorrent/torrentcreationtask.h bittorrent/torrentcreator.h @@ -145,6 +147,7 @@ add_library(qbt_base STATIC bittorrent/sslparameters.cpp bittorrent/torrent.cpp bittorrent/torrentcontenthandler.cpp + bittorrent/torrentcontentremover.cpp bittorrent/torrentcreationmanager.cpp bittorrent/torrentcreationtask.cpp bittorrent/torrentcreator.cpp diff --git a/src/base/bittorrent/bencoderesumedatastorage.cpp b/src/base/bittorrent/bencoderesumedatastorage.cpp index 4107c5aa9..a34e5a34a 100644 --- a/src/base/bittorrent/bencoderesumedatastorage.cpp +++ b/src/base/bittorrent/bencoderesumedatastorage.cpp @@ -40,7 +40,6 @@ #include #include -#include "base/algorithm.h" #include "base/exceptions.h" #include "base/global.h" #include "base/logger.h" diff --git a/src/base/bittorrent/customstorage.cpp b/src/base/bittorrent/customstorage.cpp index c4957ef07..9134b1507 100644 --- a/src/base/bittorrent/customstorage.cpp +++ b/src/base/bittorrent/customstorage.cpp @@ -240,11 +240,11 @@ void CustomDiskIOThread::handleCompleteFiles(lt::storage_index_t storage, const lt::storage_interface *customStorageConstructor(const lt::storage_params ¶ms, lt::file_pool &pool) { - return new CustomStorage {params, pool}; + return new CustomStorage(params, pool); } CustomStorage::CustomStorage(const lt::storage_params ¶ms, lt::file_pool &filePool) - : lt::default_storage {params, filePool} + : lt::default_storage(params, filePool) , m_savePath {params.path} { } diff --git a/src/base/bittorrent/peerinfo.cpp b/src/base/bittorrent/peerinfo.cpp index cf27ba302..3706b1e81 100644 --- a/src/base/bittorrent/peerinfo.cpp +++ b/src/base/bittorrent/peerinfo.cpp @@ -367,6 +367,10 @@ void PeerInfo::determineFlags() if (useUTPSocket()) updateFlags(u'P', C_UTP); + // h = Peer is using NAT hole punching + if (isHolepunched()) + updateFlags(u'h', tr("Peer is using NAT hole punching")); + m_flags.chop(1); m_flagsDescription.chop(1); } diff --git a/src/base/bittorrent/session.h b/src/base/bittorrent/session.h index d4d3e758a..96f4816fd 100644 --- a/src/base/bittorrent/session.h +++ b/src/base/bittorrent/session.h @@ -37,17 +37,12 @@ #include "addtorrentparams.h" #include "categoryoptions.h" #include "sharelimitaction.h" +#include "torrentcontentremoveoption.h" #include "trackerentry.h" #include "trackerentrystatus.h" class QString; -enum DeleteOption -{ - DeleteTorrent, - DeleteTorrentAndFiles -}; - namespace BitTorrent { class InfoHash; @@ -58,6 +53,12 @@ namespace BitTorrent struct CacheStatus; struct SessionStatus; + enum class TorrentRemoveOption + { + KeepContent, + RemoveContent + }; + // Using `Q_ENUM_NS()` without a wrapper namespace in our case is not advised // since `Q_NAMESPACE` cannot be used when the same namespace resides at different files. // https://www.kdab.com/new-qt-5-8-meta-object-support-namespaces/#comment-143779 @@ -425,7 +426,7 @@ namespace BitTorrent virtual void setExcludedFileNamesEnabled(bool enabled) = 0; virtual QStringList excludedFileNames() const = 0; virtual void setExcludedFileNames(const QStringList &newList) = 0; - virtual bool isFilenameExcluded(const QString &fileName) const = 0; + virtual void applyFilenameFilter(const PathList &files, QList &priorities) = 0; virtual QStringList bannedIPs() const = 0; virtual void setBannedIPs(const QStringList &newList) = 0; virtual ResumeDataStorageType resumeDataStorageType() const = 0; @@ -434,6 +435,8 @@ namespace BitTorrent virtual void setMergeTrackersEnabled(bool enabled) = 0; virtual bool isStartPaused() const = 0; virtual void setStartPaused(bool value) = 0; + virtual TorrentContentRemoveOption torrentContentRemoveOption() const = 0; + virtual void setTorrentContentRemoveOption(TorrentContentRemoveOption option) = 0; virtual bool isRestored() const = 0; @@ -453,7 +456,7 @@ namespace BitTorrent virtual bool isKnownTorrent(const InfoHash &infoHash) const = 0; virtual bool addTorrent(const TorrentDescriptor &torrentDescr, const AddTorrentParams ¶ms = {}) = 0; - virtual bool deleteTorrent(const TorrentID &id, DeleteOption deleteOption = DeleteOption::DeleteTorrent) = 0; + virtual bool removeTorrent(const TorrentID &id, TorrentRemoveOption deleteOption = TorrentRemoveOption::KeepContent) = 0; virtual bool downloadMetadata(const TorrentDescriptor &torrentDescr) = 0; virtual bool cancelDownloadMetadata(const TorrentID &id) = 0; diff --git a/src/base/bittorrent/sessionimpl.cpp b/src/base/bittorrent/sessionimpl.cpp index 5822bcb63..8c21682e8 100644 --- a/src/base/bittorrent/sessionimpl.cpp +++ b/src/base/bittorrent/sessionimpl.cpp @@ -101,6 +101,7 @@ #include "nativesessionextension.h" #include "portforwarderimpl.h" #include "resumedatastorage.h" +#include "torrentcontentremover.h" #include "torrentdescriptor.h" #include "torrentimpl.h" #include "tracker.h" @@ -525,6 +526,7 @@ SessionImpl::SessionImpl(QObject *parent) , m_I2POutboundQuantity {BITTORRENT_SESSION_KEY(u"I2P/OutboundQuantity"_s), 3} , m_I2PInboundLength {BITTORRENT_SESSION_KEY(u"I2P/InboundLength"_s), 3} , m_I2POutboundLength {BITTORRENT_SESSION_KEY(u"I2P/OutboundLength"_s), 3} + , m_torrentContentRemoveOption {BITTORRENT_SESSION_KEY(u"TorrentContentRemoveOption"_s), TorrentContentRemoveOption::MoveToTrash} , m_startPaused {BITTORRENT_SESSION_KEY(u"StartPaused"_s)} , m_seedingLimitTimer {new QTimer(this)} , m_resumeDataTimer {new QTimer(this)} @@ -550,7 +552,14 @@ SessionImpl::SessionImpl(QObject *parent) , this, [this]() { m_recentErroredTorrents.clear(); }); m_seedingLimitTimer->setInterval(10s); - connect(m_seedingLimitTimer, &QTimer::timeout, this, &SessionImpl::processShareLimits); + connect(m_seedingLimitTimer, &QTimer::timeout, this, [this] + { + // We shouldn't iterate over `m_torrents` in the loop below + // since `deleteTorrent()` modifies it indirectly + const QHash torrents {m_torrents}; + for (TorrentImpl *torrent : torrents) + processTorrentShareLimits(torrent); + }); initializeNativeSession(); configureComponents(); @@ -586,6 +595,11 @@ SessionImpl::SessionImpl(QObject *parent) connect(m_ioThread.get(), &QThread::finished, m_fileSearcher, &QObject::deleteLater); connect(m_fileSearcher, &FileSearcher::searchFinished, this, &SessionImpl::fileSearchFinished); + m_torrentContentRemover = new TorrentContentRemover; + m_torrentContentRemover->moveToThread(m_ioThread.get()); + connect(m_ioThread.get(), &QThread::finished, m_torrentContentRemover, &QObject::deleteLater); + connect(m_torrentContentRemover, &TorrentContentRemover::jobFinished, this, &SessionImpl::torrentContentRemovingFinished); + m_ioThread->start(); initMetrics(); @@ -604,7 +618,7 @@ SessionImpl::~SessionImpl() { m_nativeSession->pause(); - const qint64 timeout = (m_shutdownTimeout >= 0) ? (m_shutdownTimeout * 1000) : -1; + const auto timeout = (m_shutdownTimeout >= 0) ? (static_cast(m_shutdownTimeout) * 1000) : -1; const QDeadlineTimer shutdownDeadlineTimer {timeout}; if (m_torrentsQueueChanged) @@ -2236,72 +2250,66 @@ void SessionImpl::populateAdditionalTrackers() m_additionalTrackerEntries = parseTrackerEntries(additionalTrackers()); } -void SessionImpl::processShareLimits() +void SessionImpl::processTorrentShareLimits(TorrentImpl *torrent) { + if (!torrent->isFinished() || torrent->isForced()) + return; + const auto effectiveLimit = [](const T limit, const T useGlobalLimit, const T globalLimit) -> T { return (limit == useGlobalLimit) ? globalLimit : limit; }; - // We shouldn't iterate over `m_torrents` in the loop below - // since `deleteTorrent()` modifies it indirectly - const QHash torrents {m_torrents}; - for (const auto &[torrentID, torrent] : torrents.asKeyValueRange()) + const qreal ratioLimit = effectiveLimit(torrent->ratioLimit(), Torrent::USE_GLOBAL_RATIO, globalMaxRatio()); + const int seedingTimeLimit = effectiveLimit(torrent->seedingTimeLimit(), Torrent::USE_GLOBAL_SEEDING_TIME, globalMaxSeedingMinutes()); + const int inactiveSeedingTimeLimit = effectiveLimit(torrent->inactiveSeedingTimeLimit(), Torrent::USE_GLOBAL_INACTIVE_SEEDING_TIME, globalMaxInactiveSeedingMinutes()); + + bool reached = false; + QString description; + + if (const qreal ratio = torrent->realRatio(); + (ratioLimit >= 0) && (ratio <= Torrent::MAX_RATIO) && (ratio >= ratioLimit)) { - if (!torrent->isFinished() || torrent->isForced()) - continue; + reached = true; + description = tr("Torrent reached the share ratio limit."); + } + else if (const qlonglong seedingTimeInMinutes = torrent->finishedTime() / 60; + (seedingTimeLimit >= 0) && (seedingTimeInMinutes <= Torrent::MAX_SEEDING_TIME) && (seedingTimeInMinutes >= seedingTimeLimit)) + { + reached = true; + description = tr("Torrent reached the seeding time limit."); + } + else if (const qlonglong inactiveSeedingTimeInMinutes = torrent->timeSinceActivity() / 60; + (inactiveSeedingTimeLimit >= 0) && (inactiveSeedingTimeInMinutes <= Torrent::MAX_INACTIVE_SEEDING_TIME) && (inactiveSeedingTimeInMinutes >= inactiveSeedingTimeLimit)) + { + reached = true; + description = tr("Torrent reached the inactive seeding time limit."); + } - const qreal ratioLimit = effectiveLimit(torrent->ratioLimit(), Torrent::USE_GLOBAL_RATIO, globalMaxRatio()); - const int seedingTimeLimit = effectiveLimit(torrent->seedingTimeLimit(), Torrent::USE_GLOBAL_SEEDING_TIME, globalMaxSeedingMinutes()); - const int inactiveSeedingTimeLimit = effectiveLimit(torrent->inactiveSeedingTimeLimit(), Torrent::USE_GLOBAL_INACTIVE_SEEDING_TIME, globalMaxInactiveSeedingMinutes()); + if (reached) + { + const QString torrentName = tr("Torrent: \"%1\".").arg(torrent->name()); + const ShareLimitAction shareLimitAction = (torrent->shareLimitAction() == ShareLimitAction::Default) ? m_shareLimitAction : torrent->shareLimitAction(); - bool reached = false; - QString description; - - if (const qreal ratio = torrent->realRatio(); - (ratioLimit >= 0) && (ratio <= Torrent::MAX_RATIO) && (ratio >= ratioLimit)) + if (shareLimitAction == ShareLimitAction::Remove) { - reached = true; - description = tr("Torrent reached the share ratio limit."); + LogMsg(u"%1 %2 %3"_s.arg(description, tr("Removing torrent."), torrentName)); + removeTorrent(torrent->id(), TorrentRemoveOption::KeepContent); } - else if (const qlonglong seedingTimeInMinutes = torrent->finishedTime() / 60; - (seedingTimeLimit >= 0) && (seedingTimeInMinutes <= Torrent::MAX_SEEDING_TIME) && (seedingTimeInMinutes >= seedingTimeLimit)) + else if (shareLimitAction == ShareLimitAction::RemoveWithContent) { - reached = true; - description = tr("Torrent reached the seeding time limit."); + LogMsg(u"%1 %2 %3"_s.arg(description, tr("Removing torrent and deleting its content."), torrentName)); + removeTorrent(torrent->id(), TorrentRemoveOption::RemoveContent); } - else if (const qlonglong inactiveSeedingTimeInMinutes = torrent->timeSinceActivity() / 60; - (inactiveSeedingTimeLimit >= 0) && (inactiveSeedingTimeInMinutes <= Torrent::MAX_INACTIVE_SEEDING_TIME) && (inactiveSeedingTimeInMinutes >= inactiveSeedingTimeLimit)) + else if ((shareLimitAction == ShareLimitAction::Stop) && !torrent->isStopped()) { - reached = true; - description = tr("Torrent reached the inactive seeding time limit."); + torrent->stop(); + LogMsg(u"%1 %2 %3"_s.arg(description, tr("Torrent stopped."), torrentName)); } - - if (reached) + else if ((shareLimitAction == ShareLimitAction::EnableSuperSeeding) && !torrent->isStopped() && !torrent->superSeeding()) { - const QString torrentName = tr("Torrent: \"%1\".").arg(torrent->name()); - const ShareLimitAction shareLimitAction = (torrent->shareLimitAction() == ShareLimitAction::Default) ? m_shareLimitAction : torrent->shareLimitAction(); - - if (shareLimitAction == ShareLimitAction::Remove) - { - LogMsg(u"%1 %2 %3"_s.arg(description, tr("Removing torrent."), torrentName)); - deleteTorrent(torrentID); - } - else if (shareLimitAction == ShareLimitAction::RemoveWithContent) - { - LogMsg(u"%1 %2 %3"_s.arg(description, tr("Removing torrent and deleting its content."), torrentName)); - deleteTorrent(torrentID, DeleteTorrentAndFiles); - } - else if ((shareLimitAction == ShareLimitAction::Stop) && !torrent->isStopped()) - { - torrent->stop(); - LogMsg(u"%1 %2 %3"_s.arg(description, tr("Torrent stopped."), torrentName)); - } - else if ((shareLimitAction == ShareLimitAction::EnableSuperSeeding) && !torrent->isStopped() && !torrent->superSeeding()) - { - torrent->setSuperSeeding(true); - LogMsg(u"%1 %2 %3"_s.arg(description, tr("Super seeding enabled."), torrentName)); - } + torrent->setSuperSeeding(true); + LogMsg(u"%1 %2 %3"_s.arg(description, tr("Super seeding enabled."), torrentName)); } } } @@ -2331,6 +2339,19 @@ void SessionImpl::fileSearchFinished(const TorrentID &id, const Path &savePath, } } +void SessionImpl::torrentContentRemovingFinished(const QString &torrentName, const QString &errorMessage) +{ + if (errorMessage.isEmpty()) + { + LogMsg(tr("Torrent content removed. Torrent: \"%1\"").arg(torrentName)); + } + else + { + LogMsg(tr("Failed to remove torrent content. Torrent: \"%1\". Error: \"%2\"") + .arg(torrentName, errorMessage), Log::WARNING); + } +} + Torrent *SessionImpl::getTorrent(const TorrentID &id) const { return m_torrents.value(id); @@ -2377,26 +2398,29 @@ void SessionImpl::banIP(const QString &ip) // Delete a torrent from the session, given its hash // and from the disk, if the corresponding deleteOption is chosen -bool SessionImpl::deleteTorrent(const TorrentID &id, const DeleteOption deleteOption) +bool SessionImpl::removeTorrent(const TorrentID &id, const TorrentRemoveOption deleteOption) { TorrentImpl *const torrent = m_torrents.take(id); if (!torrent) return false; - qDebug("Deleting torrent with ID: %s", qUtf8Printable(torrent->id().toString())); + const TorrentID torrentID = torrent->id(); + const QString torrentName = torrent->name(); + + qDebug("Deleting torrent with ID: %s", qUtf8Printable(torrentID.toString())); emit torrentAboutToBeRemoved(torrent); if (const InfoHash infoHash = torrent->infoHash(); infoHash.isHybrid()) m_hybridTorrentsByAltID.remove(TorrentID::fromSHA1Hash(infoHash.v1())); // Remove it from session - if (deleteOption == DeleteTorrent) + if (deleteOption == TorrentRemoveOption::KeepContent) { - m_removingTorrents[torrent->id()] = {torrent->name(), {}, deleteOption}; + m_removingTorrents[torrentID] = {torrentName, torrent->actualStorageLocation(), {}, deleteOption}; const lt::torrent_handle nativeHandle {torrent->nativeHandle()}; const auto iter = std::find_if(m_moveStorageQueue.begin(), m_moveStorageQueue.end() - , [&nativeHandle](const MoveStorageJob &job) + , [&nativeHandle](const MoveStorageJob &job) { return job.torrentHandle == nativeHandle; }); @@ -2414,14 +2438,14 @@ bool SessionImpl::deleteTorrent(const TorrentID &id, const DeleteOption deleteOp } else { - m_removingTorrents[torrent->id()] = {torrent->name(), torrent->rootPath(), deleteOption}; + m_removingTorrents[torrentID] = {torrentName, torrent->actualStorageLocation(), torrent->actualFilePaths(), deleteOption}; if (m_moveStorageQueue.size() > 1) { // Delete "move storage job" for the deleted torrent // (note: we shouldn't delete active job) const auto iter = std::find_if((m_moveStorageQueue.begin() + 1), m_moveStorageQueue.end() - , [torrent](const MoveStorageJob &job) + , [torrent](const MoveStorageJob &job) { return job.torrentHandle == torrent->nativeHandle(); }); @@ -2429,12 +2453,13 @@ bool SessionImpl::deleteTorrent(const TorrentID &id, const DeleteOption deleteOp m_moveStorageQueue.erase(iter); } - m_nativeSession->remove_torrent(torrent->nativeHandle(), lt::session::delete_files); + m_nativeSession->remove_torrent(torrent->nativeHandle(), lt::session::delete_partfile); } // Remove it from torrent resume directory - m_resumeDataStorage->remove(torrent->id()); + m_resumeDataStorage->remove(torrentID); + LogMsg(tr("Torrent removed. Torrent: \"%1\"").arg(torrentName)); delete torrent; return true; } @@ -2462,7 +2487,7 @@ bool SessionImpl::cancelDownloadMetadata(const TorrentID &id) } #endif - m_nativeSession->remove_torrent(nativeHandle, lt::session::delete_files); + m_nativeSession->remove_torrent(nativeHandle); return true; } @@ -2769,26 +2794,22 @@ bool SessionImpl::addTorrent_impl(const TorrentDescriptor &source, const AddTorr Q_ASSERT(p.file_priorities.empty()); Q_ASSERT(addTorrentParams.filePriorities.isEmpty() || (addTorrentParams.filePriorities.size() == nativeIndexes.size())); + QList filePriorities = addTorrentParams.filePriorities; + + if (filePriorities.isEmpty() && isExcludedFileNamesEnabled()) + { + // Check file name blacklist when priorities are not explicitly set + applyFilenameFilter(filePaths, filePriorities); + } + const int internalFilesCount = torrentInfo.nativeInfo()->files().num_files(); // including .pad files // Use qBittorrent default priority rather than libtorrent's (4) p.file_priorities = std::vector(internalFilesCount, LT::toNative(DownloadPriority::Normal)); - if (addTorrentParams.filePriorities.isEmpty()) + if (!filePriorities.isEmpty()) { - if (isExcludedFileNamesEnabled()) - { - // Check file name blacklist when priorities are not explicitly set - for (int i = 0; i < filePaths.size(); ++i) - { - if (isFilenameExcluded(filePaths.at(i).filename())) - p.file_priorities[LT::toUnderlyingType(nativeIndexes[i])] = lt::dont_download; - } - } - } - else - { - for (int i = 0; i < addTorrentParams.filePriorities.size(); ++i) - p.file_priorities[LT::toUnderlyingType(nativeIndexes[i])] = LT::toNative(addTorrentParams.filePriorities[i]); + for (int i = 0; i < filePriorities.size(); ++i) + p.file_priorities[LT::toUnderlyingType(nativeIndexes[i])] = LT::toNative(filePriorities[i]); } Q_ASSERT(p.ti); @@ -3874,21 +3895,41 @@ void SessionImpl::populateExcludedFileNamesRegExpList() for (const QString &str : excludedNames) { - const QString pattern = QRegularExpression::anchoredPattern(QRegularExpression::wildcardToRegularExpression(str)); + const QString pattern = QRegularExpression::wildcardToRegularExpression(str); const QRegularExpression re {pattern, QRegularExpression::CaseInsensitiveOption}; m_excludedFileNamesRegExpList.append(re); } } -bool SessionImpl::isFilenameExcluded(const QString &fileName) const +void SessionImpl::applyFilenameFilter(const PathList &files, QList &priorities) { if (!isExcludedFileNamesEnabled()) - return false; + return; - return std::any_of(m_excludedFileNamesRegExpList.begin(), m_excludedFileNamesRegExpList.end(), [&fileName](const QRegularExpression &re) + const auto isFilenameExcluded = [patterns = m_excludedFileNamesRegExpList](const Path &fileName) { - return re.match(fileName).hasMatch(); - }); + return std::any_of(patterns.begin(), patterns.end(), [&fileName](const QRegularExpression &re) + { + Path path = fileName; + while (!re.match(path.filename()).hasMatch()) + { + path = path.parentPath(); + if (path.isEmpty()) + return false; + } + return true; + }); + }; + + priorities.resize(files.count(), DownloadPriority::Normal); + for (int i = 0; i < priorities.size(); ++i) + { + if (priorities[i] == BitTorrent::DownloadPriority::Ignored) + continue; + + if (isFilenameExcluded(files.at(i))) + priorities[i] = BitTorrent::DownloadPriority::Ignored; + } } void SessionImpl::setBannedIPs(const QStringList &newList) @@ -3957,6 +3998,16 @@ void SessionImpl::setStartPaused(const bool value) m_startPaused = value; } +TorrentContentRemoveOption SessionImpl::torrentContentRemoveOption() const +{ + return m_torrentContentRemoveOption; +} + +void SessionImpl::setTorrentContentRemoveOption(const TorrentContentRemoveOption option) +{ + m_torrentContentRemoveOption = option; +} + QStringList SessionImpl::bannedIPs() const { return m_bannedIPs; @@ -4890,7 +4941,7 @@ void SessionImpl::updateSeedingLimitTimer() if ((globalMaxRatio() == Torrent::NO_RATIO_LIMIT) && !hasPerTorrentRatioLimit() && (globalMaxSeedingMinutes() == Torrent::NO_SEEDING_TIME_LIMIT) && !hasPerTorrentSeedingTimeLimit() && (globalMaxInactiveSeedingMinutes() == Torrent::NO_INACTIVE_SEEDING_TIME_LIMIT) && !hasPerTorrentInactiveSeedingTimeLimit()) - { + { if (m_seedingLimitTimer->isActive()) m_seedingLimitTimer->stop(); } @@ -5002,18 +5053,7 @@ void SessionImpl::handleTorrentChecked(TorrentImpl *const torrent) void SessionImpl::handleTorrentFinished(TorrentImpl *const torrent) { - LogMsg(tr("Torrent download finished. Torrent: \"%1\"").arg(torrent->name())); - emit torrentFinished(torrent); - - if (const Path exportPath = finishedTorrentExportDirectory(); !exportPath.isEmpty()) - exportTorrentFile(torrent, exportPath); - - const bool hasUnfinishedTorrents = std::any_of(m_torrents.cbegin(), m_torrents.cend(), [](const TorrentImpl *torrent) - { - return !(torrent->isFinished() || torrent->isStopped() || torrent->isErrored()); - }); - if (!hasUnfinishedTorrents) - emit allTorrentsFinished(); + m_pendingFinishedTorrents.append(torrent); } void SessionImpl::handleTorrentResumeDataReady(TorrentImpl *const torrent, const LoadTorrentParams &data) @@ -5141,7 +5181,7 @@ void SessionImpl::handleMoveTorrentStorageJobFinished(const Path &newPath) // Last job is completed for torrent that being removing, so actually remove it const lt::torrent_handle nativeHandle {finishedJob.torrentHandle}; const RemovingTorrentData &removingTorrentData = m_removingTorrents[nativeHandle.info_hash()]; - if (removingTorrentData.deleteOption == DeleteTorrent) + if (removingTorrentData.removeOption == TorrentRemoveOption::KeepContent) m_nativeSession->remove_torrent(nativeHandle, lt::session::delete_partfile); } } @@ -5660,74 +5700,32 @@ TorrentImpl *SessionImpl::createTorrent(const lt::torrent_handle &nativeHandle, return torrent; } -void SessionImpl::handleTorrentRemovedAlert(const lt::torrent_removed_alert *alert) +void SessionImpl::handleTorrentRemovedAlert(const lt::torrent_removed_alert */*alert*/) { -#ifdef QBT_USES_LIBTORRENT2 - const auto id = TorrentID::fromInfoHash(alert->info_hashes); -#else - const auto id = TorrentID::fromInfoHash(alert->info_hash); -#endif - - const auto removingTorrentDataIter = m_removingTorrents.find(id); - if (removingTorrentDataIter != m_removingTorrents.end()) - { - if (removingTorrentDataIter->deleteOption == DeleteTorrent) - { - LogMsg(tr("Removed torrent. Torrent: \"%1\"").arg(removingTorrentDataIter->name)); - m_removingTorrents.erase(removingTorrentDataIter); - } - } + // We cannot consider `torrent_removed_alert` as a starting point for removing content, + // because it has an inconsistent posting time between different versions of libtorrent, + // so files may still be in use in some cases. } void SessionImpl::handleTorrentDeletedAlert(const lt::torrent_deleted_alert *alert) { #ifdef QBT_USES_LIBTORRENT2 - const auto id = TorrentID::fromInfoHash(alert->info_hashes); + const auto torrentID = TorrentID::fromInfoHash(alert->info_hashes); #else - const auto id = TorrentID::fromInfoHash(alert->info_hash); + const auto torrentID = TorrentID::fromInfoHash(alert->info_hash); #endif - - const auto removingTorrentDataIter = m_removingTorrents.find(id); - if (removingTorrentDataIter == m_removingTorrents.end()) - return; - - // torrent_deleted_alert can also be posted due to deletion of partfile. Ignore it in such a case. - if (removingTorrentDataIter->deleteOption == DeleteTorrent) - return; - - Utils::Fs::smartRemoveEmptyFolderTree(removingTorrentDataIter->pathToRemove); - LogMsg(tr("Removed torrent and deleted its content. Torrent: \"%1\"").arg(removingTorrentDataIter->name)); - m_removingTorrents.erase(removingTorrentDataIter); + handleRemovedTorrent(torrentID); } void SessionImpl::handleTorrentDeleteFailedAlert(const lt::torrent_delete_failed_alert *alert) { #ifdef QBT_USES_LIBTORRENT2 - const auto id = TorrentID::fromInfoHash(alert->info_hashes); + const auto torrentID = TorrentID::fromInfoHash(alert->info_hashes); #else - const auto id = TorrentID::fromInfoHash(alert->info_hash); + const auto torrentID = TorrentID::fromInfoHash(alert->info_hash); #endif - - const auto removingTorrentDataIter = m_removingTorrents.find(id); - if (removingTorrentDataIter == m_removingTorrents.end()) - return; - - if (alert->error) - { - // libtorrent won't delete the directory if it contains files not listed in the torrent, - // so we remove the directory ourselves - Utils::Fs::smartRemoveEmptyFolderTree(removingTorrentDataIter->pathToRemove); - - LogMsg(tr("Removed torrent but failed to delete its content and/or partfile. Torrent: \"%1\". Error: \"%2\"") - .arg(removingTorrentDataIter->name, QString::fromLocal8Bit(alert->error.message().c_str())) - , Log::WARNING); - } - else // torrent without metadata, hence no files on disk - { - LogMsg(tr("Removed torrent. Torrent: \"%1\"").arg(removingTorrentDataIter->name)); - } - - m_removingTorrents.erase(removingTorrentDataIter); + const auto errorMessage = alert->error ? QString::fromLocal8Bit(alert->error.message().c_str()) : QString(); + handleRemovedTorrent(torrentID, errorMessage); } void SessionImpl::handleTorrentNeedCertAlert(const lt::torrent_need_cert_alert *alert) @@ -6079,6 +6077,29 @@ void SessionImpl::handleStateUpdateAlert(const lt::state_update_alert *alert) if (!updatedTorrents.isEmpty()) emit torrentsUpdated(updatedTorrents); + if (!m_pendingFinishedTorrents.isEmpty()) + { + for (TorrentImpl *torrent : m_pendingFinishedTorrents) + { + LogMsg(tr("Torrent download finished. Torrent: \"%1\"").arg(torrent->name())); + emit torrentFinished(torrent); + + if (const Path exportPath = finishedTorrentExportDirectory(); !exportPath.isEmpty()) + exportTorrentFile(torrent, exportPath); + + processTorrentShareLimits(torrent); + } + + m_pendingFinishedTorrents.clear(); + + const bool hasUnfinishedTorrents = std::any_of(m_torrents.cbegin(), m_torrents.cend(), [](const TorrentImpl *torrent) + { + return !(torrent->isFinished() || torrent->isStopped() || torrent->isErrored()); + }); + if (!hasUnfinishedTorrents) + emit allTorrentsFinished(); + } + if (m_needSaveTorrentsQueue) saveTorrentsQueue(); @@ -6140,7 +6161,7 @@ void SessionImpl::handleTorrentConflictAlert(const lt::torrent_conflict_alert *a if (torrent2) { if (torrent1) - deleteTorrent(torrentIDv1); + removeTorrent(torrentIDv1); else cancelDownloadMetadata(torrentIDv1); @@ -6249,3 +6270,29 @@ void SessionImpl::updateTrackerEntryStatuses(lt::torrent_handle torrentHandle, Q } }); } + +void SessionImpl::handleRemovedTorrent(const TorrentID &torrentID, const QString &partfileRemoveError) +{ + const auto removingTorrentDataIter = m_removingTorrents.find(torrentID); + if (removingTorrentDataIter == m_removingTorrents.end()) + return; + + if (!partfileRemoveError.isEmpty()) + { + LogMsg(tr("Failed to remove partfile. Torrent: \"%1\". Reason: \"%2\".") + .arg(removingTorrentDataIter->name, partfileRemoveError) + , Log::WARNING); + } + + if ((removingTorrentDataIter->removeOption == TorrentRemoveOption::RemoveContent) + && !removingTorrentDataIter->contentStoragePath.isEmpty()) + { + QMetaObject::invokeMethod(m_torrentContentRemover, [this, jobData = *removingTorrentDataIter] + { + m_torrentContentRemover->performJob(jobData.name, jobData.contentStoragePath + , jobData.fileNames, m_torrentContentRemoveOption); + }); + } + + m_removingTorrents.erase(removingTorrentDataIter); +} diff --git a/src/base/bittorrent/sessionimpl.h b/src/base/bittorrent/sessionimpl.h index 40ffbfffa..a5bac0847 100644 --- a/src/base/bittorrent/sessionimpl.h +++ b/src/base/bittorrent/sessionimpl.h @@ -75,6 +75,7 @@ namespace BitTorrent class InfoHash; class ResumeDataStorage; class Torrent; + class TorrentContentRemover; class TorrentDescriptor; class TorrentImpl; class Tracker; @@ -402,7 +403,7 @@ namespace BitTorrent void setExcludedFileNamesEnabled(bool enabled) override; QStringList excludedFileNames() const override; void setExcludedFileNames(const QStringList &excludedFileNames) override; - bool isFilenameExcluded(const QString &fileName) const override; + void applyFilenameFilter(const PathList &files, QList &priorities) override; QStringList bannedIPs() const override; void setBannedIPs(const QStringList &newList) override; ResumeDataStorageType resumeDataStorageType() const override; @@ -411,6 +412,8 @@ namespace BitTorrent void setMergeTrackersEnabled(bool enabled) override; bool isStartPaused() const override; void setStartPaused(bool value) override; + TorrentContentRemoveOption torrentContentRemoveOption() const override; + void setTorrentContentRemoveOption(TorrentContentRemoveOption option) override; bool isRestored() const override; @@ -430,7 +433,7 @@ namespace BitTorrent bool isKnownTorrent(const InfoHash &infoHash) const override; bool addTorrent(const TorrentDescriptor &torrentDescr, const AddTorrentParams ¶ms = {}) override; - bool deleteTorrent(const TorrentID &id, DeleteOption deleteOption = DeleteTorrent) override; + bool removeTorrent(const TorrentID &id, TorrentRemoveOption deleteOption = TorrentRemoveOption::KeepContent) override; bool downloadMetadata(const TorrentDescriptor &torrentDescr) override; bool cancelDownloadMetadata(const TorrentID &id) override; @@ -487,11 +490,11 @@ namespace BitTorrent void configureDeferred(); void readAlerts(); void enqueueRefresh(); - void processShareLimits(); void generateResumeData(); void handleIPFilterParsed(int ruleCount); void handleIPFilterError(); void fileSearchFinished(const TorrentID &id, const Path &savePath, const PathList &fileNames); + void torrentContentRemovingFinished(const QString &torrentName, const QString &errorMessage); private: struct ResumeSessionContext; @@ -507,8 +510,9 @@ namespace BitTorrent struct RemovingTorrentData { QString name; - Path pathToRemove; - DeleteOption deleteOption {}; + Path contentStoragePath; + PathList fileNames; + TorrentRemoveOption removeOption {}; }; explicit SessionImpl(QObject *parent = nullptr); @@ -536,6 +540,7 @@ namespace BitTorrent void enableIPFilter(); void disableIPFilter(); void processTrackerStatuses(); + void processTorrentShareLimits(TorrentImpl *torrent); void populateExcludedFileNamesRegExpList(); void prepareStartup(); void handleLoadedResumeData(ResumeSessionContext *context); @@ -599,13 +604,7 @@ namespace BitTorrent void updateTrackerEntryStatuses(lt::torrent_handle torrentHandle, QHash>> updatedTrackers); - // BitTorrent - lt::session *m_nativeSession = nullptr; - NativeSessionExtension *m_nativeSessionExtension = nullptr; - - bool m_deferredConfigureScheduled = false; - bool m_IPFilteringConfigured = false; - mutable bool m_listenInterfaceConfigured = false; + void handleRemovedTorrent(const TorrentID &torrentID, const QString &partfileRemoveError = {}); CachedSettingValue m_DHTBootstrapNodes; CachedSettingValue m_isDHTEnabled; @@ -731,8 +730,16 @@ namespace BitTorrent CachedSettingValue m_I2POutboundQuantity; CachedSettingValue m_I2PInboundLength; CachedSettingValue m_I2POutboundLength; + CachedSettingValue m_torrentContentRemoveOption; SettingValue m_startPaused; + lt::session *m_nativeSession = nullptr; + NativeSessionExtension *m_nativeSessionExtension = nullptr; + + bool m_deferredConfigureScheduled = false; + bool m_IPFilteringConfigured = false; + mutable bool m_listenInterfaceConfigured = false; + bool m_isRestored = false; bool m_isPaused = isStartPaused(); @@ -766,6 +773,7 @@ namespace BitTorrent QThreadPool *m_asyncWorker = nullptr; ResumeDataStorage *m_resumeDataStorage = nullptr; FileSearcher *m_fileSearcher = nullptr; + TorrentContentRemover *m_torrentContentRemover = nullptr; QHash m_downloadedMetadata; @@ -809,6 +817,8 @@ namespace BitTorrent QTimer *m_wakeupCheckTimer = nullptr; QDateTime m_wakeupCheckTimestamp; + QList m_pendingFinishedTorrents; + friend void Session::initInstance(); friend void Session::freeInstance(); friend Session *Session::instance(); diff --git a/src/base/bittorrent/torrent.h b/src/base/bittorrent/torrent.h index 34cccd4ff..2dcffdf85 100644 --- a/src/base/bittorrent/torrent.h +++ b/src/base/bittorrent/torrent.h @@ -228,6 +228,7 @@ namespace BitTorrent virtual void setShareLimitAction(ShareLimitAction action) = 0; virtual PathList filePaths() const = 0; + virtual PathList actualFilePaths() const = 0; virtual TorrentInfo info() const = 0; virtual bool isFinished() const = 0; diff --git a/src/base/bittorrent/torrentcontentremoveoption.h b/src/base/bittorrent/torrentcontentremoveoption.h new file mode 100644 index 000000000..1083e5ec0 --- /dev/null +++ b/src/base/bittorrent/torrentcontentremoveoption.h @@ -0,0 +1,50 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2024 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 BitTorrent +{ + // Using `Q_ENUM_NS()` without a wrapper namespace in our case is not advised + // since `Q_NAMESPACE` cannot be used when the same namespace resides at different files. + // https://www.kdab.com/new-qt-5-8-meta-object-support-namespaces/#comment-143779 + inline namespace TorrentContentRemoveOptionNS + { + Q_NAMESPACE + + enum class TorrentContentRemoveOption + { + Delete, + MoveToTrash + }; + + Q_ENUM_NS(TorrentContentRemoveOption) + } +} diff --git a/src/base/bittorrent/torrentcontentremover.cpp b/src/base/bittorrent/torrentcontentremover.cpp new file mode 100644 index 000000000..861f4be96 --- /dev/null +++ b/src/base/bittorrent/torrentcontentremover.cpp @@ -0,0 +1,61 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2024 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 "torrentcontentremover.h" + +#include "base/utils/fs.h" + +void BitTorrent::TorrentContentRemover::performJob(const QString &torrentName, const Path &basePath + , const PathList &fileNames, const TorrentContentRemoveOption option) +{ + QString errorMessage; + + if (!fileNames.isEmpty()) + { + const auto removeFileFn = [&option](const Path &filePath) + { + return ((option == TorrentContentRemoveOption::MoveToTrash) + ? Utils::Fs::moveFileToTrash : Utils::Fs::removeFile)(filePath); + }; + + for (const Path &fileName : fileNames) + { + if (const auto result = removeFileFn(basePath / fileName) + ; !result && errorMessage.isEmpty()) + { + errorMessage = result.error(); + } + } + + const Path rootPath = Path::findRootFolder(fileNames); + if (!rootPath.isEmpty()) + Utils::Fs::smartRemoveEmptyFolderTree(basePath / rootPath); + } + + emit jobFinished(torrentName, errorMessage); +} diff --git a/src/base/bittorrent/torrentcontentremover.h b/src/base/bittorrent/torrentcontentremover.h new file mode 100644 index 000000000..a18161493 --- /dev/null +++ b/src/base/bittorrent/torrentcontentremover.h @@ -0,0 +1,53 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2024 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 "base/path.h" +#include "torrentcontentremoveoption.h" + +namespace BitTorrent +{ + class TorrentContentRemover final : public QObject + { + Q_OBJECT + Q_DISABLE_COPY_MOVE(TorrentContentRemover) + + public: + using QObject::QObject; + + public slots: + void performJob(const QString &torrentName, const Path &basePath + , const PathList &fileNames, TorrentContentRemoveOption option); + + signals: + void jobFinished(const QString &torrentName, const QString &errorMessage); + }; +} diff --git a/src/base/bittorrent/torrentimpl.cpp b/src/base/bittorrent/torrentimpl.cpp index 4cc41c084..da5e4690e 100644 --- a/src/base/bittorrent/torrentimpl.cpp +++ b/src/base/bittorrent/torrentimpl.cpp @@ -77,6 +77,10 @@ #include "base/utils/os.h" #endif // Q_OS_MACOS || Q_OS_WIN +#ifndef QBT_USES_LIBTORRENT2 +#include "customstorage.h" +#endif + using namespace BitTorrent; namespace @@ -456,6 +460,8 @@ Path TorrentImpl::savePath() const void TorrentImpl::setSavePath(const Path &path) { Q_ASSERT(!isAutoTMMEnabled()); + if (isAutoTMMEnabled()) [[unlikely]] + return; const Path basePath = m_session->useCategoryPathsInManualMode() ? m_session->categorySavePath(category()) : m_session->savePath(); @@ -483,6 +489,8 @@ Path TorrentImpl::downloadPath() const void TorrentImpl::setDownloadPath(const Path &path) { Q_ASSERT(!isAutoTMMEnabled()); + if (isAutoTMMEnabled()) [[unlikely]] + return; const Path basePath = m_session->useCategoryPathsInManualMode() ? m_session->categoryDownloadPath(category()) : m_session->downloadPath(); @@ -982,6 +990,21 @@ PathList TorrentImpl::filePaths() const return m_filePaths; } +PathList TorrentImpl::actualFilePaths() const +{ + if (!hasMetadata()) + return {}; + + PathList paths; + paths.reserve(filesCount()); + + const lt::file_storage files = nativeTorrentInfo()->files(); + for (const lt::file_index_t &nativeIndex : asConst(m_torrentInfo.nativeIndexes())) + paths.emplaceBack(files.file_path(nativeIndex)); + + return paths; +} + QVector TorrentImpl::filePriorities() const { return m_filePriorities; @@ -1447,11 +1470,13 @@ QBitArray TorrentImpl::pieces() const QBitArray TorrentImpl::downloadingPieces() const { - QBitArray result(piecesCount()); + if (!hasMetadata()) + return {}; std::vector queue; m_nativeHandle.get_download_queue(queue); + QBitArray result {piecesCount()}; for (const lt::partial_piece_info &info : queue) result.setBit(LT::toUnderlyingType(info.piece_index)); @@ -1791,12 +1816,13 @@ void TorrentImpl::endReceivedMetadataHandling(const Path &savePath, const PathLi const Path filePath = actualFilePath.removedExtension(QB_EXT); m_filePaths.append(filePath); - lt::download_priority_t &nativePriority = p.file_priorities[LT::toUnderlyingType(nativeIndex)]; - if ((nativePriority != lt::dont_download) && m_session->isFilenameExcluded(filePath.filename())) - nativePriority = lt::dont_download; - const auto priority = LT::fromNative(nativePriority); - m_filePriorities.append(priority); + m_filePriorities.append(LT::fromNative(p.file_priorities[LT::toUnderlyingType(nativeIndex)])); } + + m_session->applyFilenameFilter(fileNames, m_filePriorities); + for (int i = 0; i < m_filePriorities.size(); ++i) + p.file_priorities[LT::toUnderlyingType(nativeIndexes[i])] = LT::toNative(m_filePriorities[i]); + p.save_path = savePath.toString().toStdString(); p.ti = metadata; @@ -1859,6 +1885,9 @@ void TorrentImpl::reload() auto *const extensionData = new ExtensionData; p.userdata = LTClientData(extensionData); +#ifndef QBT_USES_LIBTORRENT2 + p.storage = customStorageConstructor; +#endif m_nativeHandle = m_nativeSession->add_torrent(p); m_nativeStatus = extensionData->status; @@ -1933,8 +1962,17 @@ void TorrentImpl::moveStorage(const Path &newPath, const MoveStorageContext cont { if (!hasMetadata()) { - m_savePath = newPath; - m_session->handleTorrentSavePathChanged(this); + if (context == MoveStorageContext::ChangeSavePath) + { + m_savePath = newPath; + m_session->handleTorrentSavePathChanged(this); + } + else if (context == MoveStorageContext::ChangeDownloadPath) + { + m_downloadPath = newPath; + m_session->handleTorrentSavePathChanged(this); + } + return; } diff --git a/src/base/bittorrent/torrentimpl.h b/src/base/bittorrent/torrentimpl.h index 54b84c1f4..ffc83b202 100644 --- a/src/base/bittorrent/torrentimpl.h +++ b/src/base/bittorrent/torrentimpl.h @@ -153,6 +153,7 @@ namespace BitTorrent Path actualFilePath(int index) const override; qlonglong fileSize(int index) const override; PathList filePaths() const override; + PathList actualFilePaths() const override; QVector filePriorities() const override; TorrentInfo info() const override; diff --git a/src/base/http/connection.cpp b/src/base/http/connection.cpp index 4a96295e4..32a7ce840 100644 --- a/src/base/http/connection.cpp +++ b/src/base/http/connection.cpp @@ -44,6 +44,7 @@ Connection::Connection(QTcpSocket *socket, IRequestHandler *requestHandler, QObj , m_requestHandler(requestHandler) { m_socket->setParent(this); + connect(m_socket, &QAbstractSocket::disconnected, this, &Connection::closed); // reserve common size for requests, don't use the max allowed size which is too big for // memory constrained platforms @@ -62,11 +63,6 @@ Connection::Connection(QTcpSocket *socket, IRequestHandler *requestHandler, QObj }); } -Connection::~Connection() -{ - m_socket->close(); -} - void Connection::read() { // reuse existing buffer and avoid unnecessary memory allocation/relocation @@ -182,11 +178,6 @@ bool Connection::hasExpired(const qint64 timeout) const && m_idleTimer.hasExpired(timeout); } -bool Connection::isClosed() const -{ - return (m_socket->state() == QAbstractSocket::UnconnectedState); -} - bool Connection::acceptsGzipEncoding(QString codings) { // [rfc7231] 5.3.4. Accept-Encoding diff --git a/src/base/http/connection.h b/src/base/http/connection.h index 5b8f67a78..46a263106 100644 --- a/src/base/http/connection.h +++ b/src/base/http/connection.h @@ -47,10 +47,11 @@ namespace Http public: Connection(QTcpSocket *socket, IRequestHandler *requestHandler, QObject *parent = nullptr); - ~Connection(); bool hasExpired(qint64 timeout) const; - bool isClosed() const; + + signals: + void closed(); private: static bool acceptsGzipEncoding(QString codings); diff --git a/src/base/http/server.cpp b/src/base/http/server.cpp index 1e2320e11..19233dc27 100644 --- a/src/base/http/server.cpp +++ b/src/base/http/server.cpp @@ -32,7 +32,10 @@ #include #include +#include +#include +#include #include #include #include @@ -40,7 +43,6 @@ #include #include -#include "base/algorithm.h" #include "base/global.h" #include "base/utils/net.h" #include "base/utils/sslkey.h" @@ -113,32 +115,38 @@ Server::Server(IRequestHandler *requestHandler, QObject *parent) void Server::incomingConnection(const qintptr socketDescriptor) { - if (m_connections.size() >= CONNECTIONS_LIMIT) return; - - QTcpSocket *serverSocket = nullptr; - if (m_https) - serverSocket = new QSslSocket(this); - else - serverSocket = new QTcpSocket(this); - + std::unique_ptr serverSocket = m_https ? std::make_unique(this) : std::make_unique(this); if (!serverSocket->setSocketDescriptor(socketDescriptor)) + return; + + if (m_connections.size() >= CONNECTIONS_LIMIT) { - delete serverSocket; + qWarning("Too many connections. Exceeded CONNECTIONS_LIMIT (%d). Connection closed.", CONNECTIONS_LIMIT); return; } - if (m_https) + try { - static_cast(serverSocket)->setProtocol(QSsl::SecureProtocols); - static_cast(serverSocket)->setPrivateKey(m_key); - static_cast(serverSocket)->setLocalCertificateChain(m_certificates); - static_cast(serverSocket)->setPeerVerifyMode(QSslSocket::VerifyNone); - static_cast(serverSocket)->startServerEncryption(); - } + if (m_https) + { + auto *sslSocket = static_cast(serverSocket.get()); + sslSocket->setProtocol(QSsl::SecureProtocols); + sslSocket->setPrivateKey(m_key); + sslSocket->setLocalCertificateChain(m_certificates); + sslSocket->setPeerVerifyMode(QSslSocket::VerifyNone); + sslSocket->startServerEncryption(); + } - auto *c = new Connection(serverSocket, m_requestHandler, this); - m_connections.insert(c); - connect(serverSocket, &QAbstractSocket::disconnected, this, [c, this]() { removeConnection(c); }); + auto *connection = new Connection(serverSocket.release(), m_requestHandler, this); + m_connections.insert(connection); + connect(connection, &Connection::closed, this, [this, connection] { removeConnection(connection); }); + } + catch (const std::bad_alloc &exception) + { + // drop the connection instead of throwing exception and crash + qWarning("Failed to allocate memory for HTTP connection. Connection closed."); + return; + } } void Server::removeConnection(Connection *connection) diff --git a/src/base/preferences.cpp b/src/base/preferences.cpp index 13c1c8b00..d97390cbb 100644 --- a/src/base/preferences.cpp +++ b/src/base/preferences.cpp @@ -134,17 +134,17 @@ void Preferences::setCustomUIThemePath(const Path &path) setValue(u"Preferences/General/CustomUIThemePath"_s, path); } -bool Preferences::deleteTorrentFilesAsDefault() const +bool Preferences::removeTorrentContent() const { return value(u"Preferences/General/DeleteTorrentsFilesAsDefault"_s, false); } -void Preferences::setDeleteTorrentFilesAsDefault(const bool del) +void Preferences::setRemoveTorrentContent(const bool remove) { - if (del == deleteTorrentFilesAsDefault()) + if (remove == removeTorrentContent()) return; - setValue(u"Preferences/General/DeleteTorrentsFilesAsDefault"_s, del); + setValue(u"Preferences/General/DeleteTorrentsFilesAsDefault"_s, remove); } bool Preferences::confirmOnExit() const diff --git a/src/base/preferences.h b/src/base/preferences.h index 90f26b055..fcc70bb97 100644 --- a/src/base/preferences.h +++ b/src/base/preferences.h @@ -105,8 +105,8 @@ public: void setUseCustomUITheme(bool use); Path customUIThemePath() const; void setCustomUIThemePath(const Path &path); - bool deleteTorrentFilesAsDefault() const; - void setDeleteTorrentFilesAsDefault(bool del); + bool removeTorrentContent() const; + void setRemoveTorrentContent(bool remove); bool confirmOnExit() const; void setConfirmOnExit(bool confirm); bool speedInTitleBar() const; diff --git a/src/base/torrentfilter.cpp b/src/base/torrentfilter.cpp index 7ad8cf112..89d9a97e9 100644 --- a/src/base/torrentfilter.cpp +++ b/src/base/torrentfilter.cpp @@ -52,19 +52,21 @@ const TorrentFilter TorrentFilter::ErroredTorrent(TorrentFilter::Errored); using BitTorrent::Torrent; TorrentFilter::TorrentFilter(const Type type, const std::optional &idSet - , const std::optional &category, const std::optional &tag) + , const std::optional &category, const std::optional &tag, const std::optional isPrivate) : m_type {type} , m_category {category} , m_tag {tag} , m_idSet {idSet} + , m_private {isPrivate} { } TorrentFilter::TorrentFilter(const QString &filter, const std::optional &idSet - , const std::optional &category, const std::optional &tag) + , const std::optional &category, const std::optional &tag, const std::optional isPrivate) : m_category {category} , m_tag {tag} , m_idSet {idSet} + , m_private {isPrivate} { setTypeByName(filter); } @@ -147,11 +149,22 @@ bool TorrentFilter::setTag(const std::optional &tag) return false; } +bool TorrentFilter::setPrivate(const std::optional isPrivate) +{ + if (m_private != isPrivate) + { + m_private = isPrivate; + return true; + } + + return false; +} + bool TorrentFilter::match(const Torrent *const torrent) const { if (!torrent) return false; - return (matchState(torrent) && matchHash(torrent) && matchCategory(torrent) && matchTag(torrent)); + return (matchState(torrent) && matchHash(torrent) && matchCategory(torrent) && matchTag(torrent) && matchPrivate(torrent)); } bool TorrentFilter::matchState(const BitTorrent::Torrent *const torrent) const @@ -224,3 +237,11 @@ bool TorrentFilter::matchTag(const BitTorrent::Torrent *const torrent) const return torrent->hasTag(*m_tag); } + +bool TorrentFilter::matchPrivate(const BitTorrent::Torrent *const torrent) const +{ + if (!m_private) + return true; + + return m_private == torrent->isPrivate(); +} diff --git a/src/base/torrentfilter.h b/src/base/torrentfilter.h index 19092fb8e..39fd3e06f 100644 --- a/src/base/torrentfilter.h +++ b/src/base/torrentfilter.h @@ -87,16 +87,24 @@ public: TorrentFilter() = default; // category & tags: pass empty string for uncategorized / untagged torrents. - TorrentFilter(Type type, const std::optional &idSet = AnyID - , const std::optional &category = AnyCategory, const std::optional &tag = AnyTag); - TorrentFilter(const QString &filter, const std::optional &idSet = AnyID - , const std::optional &category = AnyCategory, const std::optional &tags = AnyTag); + TorrentFilter(Type type + , const std::optional &idSet = AnyID + , const std::optional &category = AnyCategory + , const std::optional &tag = AnyTag + , std::optional isPrivate = {}); + TorrentFilter(const QString &filter + , const std::optional &idSet = AnyID + , const std::optional &category = AnyCategory + , const std::optional &tags = AnyTag + , std::optional isPrivate = {}); + bool setType(Type type); bool setTypeByName(const QString &filter); bool setTorrentIDSet(const std::optional &idSet); bool setCategory(const std::optional &category); bool setTag(const std::optional &tag); + bool setPrivate(std::optional isPrivate); bool match(const BitTorrent::Torrent *torrent) const; @@ -105,9 +113,11 @@ private: bool matchHash(const BitTorrent::Torrent *torrent) const; bool matchCategory(const BitTorrent::Torrent *torrent) const; bool matchTag(const BitTorrent::Torrent *torrent) const; + bool matchPrivate(const BitTorrent::Torrent *torrent) const; Type m_type {All}; std::optional m_category; std::optional m_tag; std::optional m_idSet; + std::optional m_private; }; diff --git a/src/base/utils/fs.cpp b/src/base/utils/fs.cpp index 4d89f49a0..dbcfafb74 100644 --- a/src/base/utils/fs.cpp +++ b/src/base/utils/fs.cpp @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2022 Vladimir Golovnev + * Copyright (C) 2022-2024 Vladimir Golovnev * Copyright (C) 2012 Christophe Dumez * * This program is free software; you can redistribute it and/or @@ -29,8 +29,6 @@ #include "fs.h" -#include -#include #include #if defined(Q_OS_WIN) @@ -52,6 +50,7 @@ #include #endif +#include #include #include #include @@ -311,20 +310,42 @@ bool Utils::Fs::renameFile(const Path &from, const Path &to) * * This function will try to fix the file permissions before removing it. */ -bool Utils::Fs::removeFile(const Path &path) +nonstd::expected Utils::Fs::removeFile(const Path &path) { - if (QFile::remove(path.data())) - return true; - QFile file {path.data()}; + if (file.remove()) + return {}; + if (!file.exists()) - return true; + return {}; // Make sure we have read/write permissions file.setPermissions(file.permissions() | QFile::ReadOwner | QFile::WriteOwner | QFile::ReadUser | QFile::WriteUser); - return file.remove(); + if (file.remove()) + return {}; + + return nonstd::make_unexpected(file.errorString()); } +nonstd::expected Utils::Fs::moveFileToTrash(const Path &path) +{ + QFile file {path.data()}; + if (file.moveToTrash()) + return {}; + + if (!file.exists()) + return {}; + + // Make sure we have read/write permissions + file.setPermissions(file.permissions() | QFile::ReadOwner | QFile::WriteOwner | QFile::ReadUser | QFile::WriteUser); + if (file.moveToTrash()) + return {}; + + const QString errorMessage = file.errorString(); + return nonstd::make_unexpected(!errorMessage.isEmpty() ? errorMessage : QCoreApplication::translate("fs", "Unknown error")); +} + + bool Utils::Fs::isReadable(const Path &path) { return QFileInfo(path.data()).isReadable(); diff --git a/src/base/utils/fs.h b/src/base/utils/fs.h index 3dccb1d2d..eced8b072 100644 --- a/src/base/utils/fs.h +++ b/src/base/utils/fs.h @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2022 Vladimir Golovnev + * Copyright (C) 2022-2024 Vladimir Golovnev * Copyright (C) 2012 Christophe Dumez * * This program is free software; you can redistribute it and/or @@ -35,6 +35,7 @@ #include +#include "base/3rdparty/expected.hpp" #include "base/global.h" #include "base/pathfwd.h" @@ -60,7 +61,8 @@ namespace Utils::Fs bool copyFile(const Path &from, const Path &to); bool renameFile(const Path &from, const Path &to); - bool removeFile(const Path &path); + nonstd::expected removeFile(const Path &path); + nonstd::expected moveFileToTrash(const Path &path); bool mkdir(const Path &dirPath); bool mkpath(const Path &dirPath); bool rmdir(const Path &dirPath); diff --git a/src/base/version.h.in b/src/base/version.h.in index 9e06e895b..d626efdb2 100644 --- a/src/base/version.h.in +++ b/src/base/version.h.in @@ -32,7 +32,7 @@ #define QBT_VERSION_MINOR 0 #define QBT_VERSION_BUGFIX 0 #define QBT_VERSION_BUILD 0 -#define QBT_VERSION_STATUS "beta1" // Should be empty for stable releases! +#define QBT_VERSION_STATUS "rc1" // Should be empty for stable releases! #define QBT__STRINGIFY(x) #x #define QBT_STRINGIFY(x) QBT__STRINGIFY(x) diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 1a426ed6e..9db94e77e 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -52,6 +52,8 @@ add_library(qbt_gui STATIC desktopintegration.h downloadfromurldialog.h executionlogwidget.h + filterpatternformat.h + filterpatternformatmenu.h flowlayout.h fspathedit.h fspathedit_p.h @@ -151,6 +153,7 @@ add_library(qbt_gui STATIC desktopintegration.cpp downloadfromurldialog.cpp executionlogwidget.cpp + filterpatternformatmenu.cpp flowlayout.cpp fspathedit.cpp fspathedit_p.cpp diff --git a/src/gui/addnewtorrentdialog.cpp b/src/gui/addnewtorrentdialog.cpp index 99ecdda59..07eb4cc16 100644 --- a/src/gui/addnewtorrentdialog.cpp +++ b/src/gui/addnewtorrentdialog.cpp @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2022-2023 Vladimir Golovnev + * Copyright (C) 2022-2024 Vladimir Golovnev * Copyright (C) 2012 Christophe Dumez * * This program is free software; you can redistribute it and/or @@ -64,6 +64,7 @@ #include "base/utils/fs.h" #include "base/utils/misc.h" #include "base/utils/string.h" +#include "filterpatternformatmenu.h" #include "lineedit.h" #include "torrenttagsdialog.h" @@ -181,6 +182,11 @@ public: return (m_filePaths.isEmpty() ? m_torrentInfo.filePath(index) : m_filePaths.at(index)); } + PathList filePaths() const + { + return (m_filePaths.isEmpty() ? m_torrentInfo.filePaths() : m_filePaths); + } + void renameFile(const int index, const Path &newFilePath) override { Q_ASSERT((index >= 0) && (index < filesCount())); @@ -290,6 +296,7 @@ AddNewTorrentDialog::AddNewTorrentDialog(const BitTorrent::TorrentDescriptor &to , m_storeRememberLastSavePath {SETTINGS_KEY(u"RememberLastSavePath"_s)} , m_storeTreeHeaderState {u"GUI/Qt6/" SETTINGS_KEY(u"TreeHeaderState"_s)} , m_storeSplitterState {u"GUI/Qt6/" SETTINGS_KEY(u"SplitterState"_s)} + , m_storeFilterPatternFormat {u"GUI/" SETTINGS_KEY(u"FilterPatternFormat"_s)} { m_ui->setupUi(this); @@ -316,6 +323,8 @@ AddNewTorrentDialog::AddNewTorrentDialog(const BitTorrent::TorrentDescriptor &to // Torrent content filtering m_filterLine->setPlaceholderText(tr("Filter files...")); m_filterLine->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + m_filterLine->setContextMenuPolicy(Qt::CustomContextMenu); + connect(m_filterLine, &QWidget::customContextMenuRequested, this, &AddNewTorrentDialog::showContentFilterContextMenu); m_ui->contentFilterLayout->insertWidget(3, m_filterLine); const auto *focusSearchHotkey = new QShortcut(QKeySequence::Find, this); connect(focusSearchHotkey, &QShortcut::activated, this, [this]() @@ -360,7 +369,7 @@ AddNewTorrentDialog::AddNewTorrentDialog(const BitTorrent::TorrentDescriptor &to }); dlg->open(); }); - connect(m_filterLine, &LineEdit::textChanged, m_ui->contentTreeView, &TorrentContentWidget::setFilterPattern); + connect(m_filterLine, &LineEdit::textChanged, this, &AddNewTorrentDialog::setContentFilterPattern); connect(m_ui->buttonSelectAll, &QPushButton::clicked, m_ui->contentTreeView, &TorrentContentWidget::checkAll); connect(m_ui->buttonSelectNone, &QPushButton::clicked, m_ui->contentTreeView, &TorrentContentWidget::checkNone); connect(Preferences::instance(), &Preferences::changed, [] @@ -691,6 +700,28 @@ void AddNewTorrentDialog::saveTorrentFile() } } +void AddNewTorrentDialog::showContentFilterContextMenu() +{ + QMenu *menu = m_filterLine->createStandardContextMenu(); + + auto *formatMenu = new FilterPatternFormatMenu(m_storeFilterPatternFormat.get(FilterPatternFormat::Wildcards), menu); + connect(formatMenu, &FilterPatternFormatMenu::patternFormatChanged, this, [this](const FilterPatternFormat format) + { + m_storeFilterPatternFormat = format; + setContentFilterPattern(); + }); + + menu->addSeparator(); + menu->addMenu(formatMenu); + menu->setAttribute(Qt::WA_DeleteOnClose); + menu->popup(QCursor::pos()); +} + +void AddNewTorrentDialog::setContentFilterPattern() +{ + m_ui->contentTreeView->setFilterPattern(m_filterLine->text(), m_storeFilterPatternFormat.get(FilterPatternFormat::Wildcards)); +} + void AddNewTorrentDialog::populateSavePaths() { Q_ASSERT(m_currentContext); @@ -886,15 +917,7 @@ void AddNewTorrentDialog::setupTreeview() { // Check file name blacklist for torrents that are manually added QVector priorities = m_contentAdaptor->filePriorities(); - for (int i = 0; i < priorities.size(); ++i) - { - if (priorities[i] == BitTorrent::DownloadPriority::Ignored) - continue; - - if (BitTorrent::Session::instance()->isFilenameExcluded(torrentInfo.filePath(i).filename())) - priorities[i] = BitTorrent::DownloadPriority::Ignored; - } - + BitTorrent::Session::instance()->applyFilenameFilter(m_contentAdaptor->filePaths(), priorities); m_contentAdaptor->prioritizeFiles(priorities); } diff --git a/src/gui/addnewtorrentdialog.h b/src/gui/addnewtorrentdialog.h index 1dd1eb1b1..f81bd305b 100644 --- a/src/gui/addnewtorrentdialog.h +++ b/src/gui/addnewtorrentdialog.h @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2022-2023 Vladimir Golovnev + * Copyright (C) 2022-2024 Vladimir Golovnev * Copyright (C) 2012 Christophe Dumez * * This program is free software; you can redistribute it and/or @@ -35,6 +35,7 @@ #include "base/path.h" #include "base/settingvalue.h" +#include "filterpatternformat.h" class LineEdit; @@ -92,6 +93,8 @@ private: void setMetadataProgressIndicator(bool visibleIndicator, const QString &labelText = {}); void setupTreeview(); void saveTorrentFile(); + void showContentFilterContextMenu(); + void setContentFilterPattern(); Ui::AddNewTorrentDialog *m_ui = nullptr; std::unique_ptr m_contentAdaptor; @@ -107,4 +110,5 @@ private: SettingValue m_storeRememberLastSavePath; SettingValue m_storeTreeHeaderState; SettingValue m_storeSplitterState; + SettingValue m_storeFilterPatternFormat; }; diff --git a/src/gui/advancedsettings.cpp b/src/gui/advancedsettings.cpp index d81cfecc6..15133c222 100644 --- a/src/gui/advancedsettings.cpp +++ b/src/gui/advancedsettings.cpp @@ -63,6 +63,7 @@ namespace // qBittorrent section QBITTORRENT_HEADER, RESUME_DATA_STORAGE, + TORRENT_CONTENT_REMOVE_OPTION, #if defined(QBT_USES_LIBTORRENT2) && !defined(Q_OS_MACOS) MEMORY_WORKING_SET_LIMIT, #endif @@ -364,6 +365,8 @@ void AdvancedSettings::saveAdvancedSettings() const session->setI2PInboundLength(m_spinBoxI2PInboundLength.value()); session->setI2POutboundLength(m_spinBoxI2POutboundLength.value()); #endif + + session->setTorrentContentRemoveOption(m_comboBoxTorrentContentRemoveOption.currentData().value()); } #ifndef QBT_USES_LIBTORRENT2 @@ -472,6 +475,11 @@ void AdvancedSettings::loadAdvancedSettings() m_comboBoxResumeDataStorage.setCurrentIndex(m_comboBoxResumeDataStorage.findData(QVariant::fromValue(session->resumeDataStorageType()))); addRow(RESUME_DATA_STORAGE, tr("Resume data storage type (requires restart)"), &m_comboBoxResumeDataStorage); + m_comboBoxTorrentContentRemoveOption.addItem(tr("Delete files permanently"), QVariant::fromValue(BitTorrent::TorrentContentRemoveOption::Delete)); + m_comboBoxTorrentContentRemoveOption.addItem(tr("Move files to trash (if possible)"), QVariant::fromValue(BitTorrent::TorrentContentRemoveOption::MoveToTrash)); + m_comboBoxTorrentContentRemoveOption.setCurrentIndex(m_comboBoxTorrentContentRemoveOption.findData(QVariant::fromValue(session->torrentContentRemoveOption()))); + addRow(TORRENT_CONTENT_REMOVE_OPTION, tr("Torrent content removing mode"), &m_comboBoxTorrentContentRemoveOption); + #if defined(QBT_USES_LIBTORRENT2) && !defined(Q_OS_MACOS) // Physical memory (RAM) usage limit m_spinBoxMemoryWorkingSetLimit.setMinimum(1); diff --git a/src/gui/advancedsettings.h b/src/gui/advancedsettings.h index 386a44d10..c1f7b9a66 100644 --- a/src/gui/advancedsettings.h +++ b/src/gui/advancedsettings.h @@ -81,7 +81,7 @@ private: m_checkBoxMultiConnectionsPerIp, m_checkBoxValidateHTTPSTrackerCertificate, m_checkBoxSSRFMitigation, m_checkBoxBlockPeersOnPrivilegedPorts, m_checkBoxPieceExtentAffinity, m_checkBoxSuggestMode, m_checkBoxSpeedWidgetEnabled, m_checkBoxIDNSupport, m_checkBoxConfirmRemoveTrackerFromAllTorrents, m_checkBoxStartSessionPaused; QComboBox m_comboBoxInterface, m_comboBoxInterfaceAddress, m_comboBoxDiskIOReadMode, m_comboBoxDiskIOWriteMode, m_comboBoxUtpMixedMode, m_comboBoxChokingAlgorithm, - m_comboBoxSeedChokingAlgorithm, m_comboBoxResumeDataStorage; + m_comboBoxSeedChokingAlgorithm, m_comboBoxResumeDataStorage, m_comboBoxTorrentContentRemoveOption; QLineEdit m_lineEditAppInstanceName, m_pythonExecutablePath, m_lineEditAnnounceIP, m_lineEditDHTBootstrapNodes; #ifndef QBT_USES_LIBTORRENT2 diff --git a/src/gui/deletionconfirmationdialog.cpp b/src/gui/deletionconfirmationdialog.cpp index e667a4ad3..9f5fe5452 100644 --- a/src/gui/deletionconfirmationdialog.cpp +++ b/src/gui/deletionconfirmationdialog.cpp @@ -1,5 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2024 Vladimir Golovnev * Copyright (C) 2006 Christophe Dumez * * This program is free software; you can redistribute it and/or @@ -30,6 +31,7 @@ #include +#include "base/bittorrent/session.h" #include "base/global.h" #include "base/preferences.h" #include "uithememanager.h" @@ -53,8 +55,8 @@ DeletionConfirmationDialog::DeletionConfirmationDialog(QWidget *parent, const in m_ui->rememberBtn->setIcon(UIThemeManager::instance()->getIcon(u"object-locked"_s)); m_ui->rememberBtn->setIconSize(Utils::Gui::mediumIconSize()); - m_ui->checkPermDelete->setChecked(defaultDeleteFiles || Preferences::instance()->deleteTorrentFilesAsDefault()); - connect(m_ui->checkPermDelete, &QCheckBox::clicked, this, &DeletionConfirmationDialog::updateRememberButtonState); + m_ui->checkRemoveContent->setChecked(defaultDeleteFiles || Preferences::instance()->removeTorrentContent()); + connect(m_ui->checkRemoveContent, &QCheckBox::clicked, this, &DeletionConfirmationDialog::updateRememberButtonState); m_ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Remove")); m_ui->buttonBox->button(QDialogButtonBox::Cancel)->setFocus(); @@ -67,18 +69,18 @@ DeletionConfirmationDialog::~DeletionConfirmationDialog() delete m_ui; } -bool DeletionConfirmationDialog::isDeleteFileSelected() const +bool DeletionConfirmationDialog::isRemoveContentSelected() const { - return m_ui->checkPermDelete->isChecked(); + return m_ui->checkRemoveContent->isChecked(); } void DeletionConfirmationDialog::updateRememberButtonState() { - m_ui->rememberBtn->setEnabled(m_ui->checkPermDelete->isChecked() != Preferences::instance()->deleteTorrentFilesAsDefault()); + m_ui->rememberBtn->setEnabled(m_ui->checkRemoveContent->isChecked() != Preferences::instance()->removeTorrentContent()); } void DeletionConfirmationDialog::on_rememberBtn_clicked() { - Preferences::instance()->setDeleteTorrentFilesAsDefault(m_ui->checkPermDelete->isChecked()); + Preferences::instance()->setRemoveTorrentContent(m_ui->checkRemoveContent->isChecked()); m_ui->rememberBtn->setEnabled(false); } diff --git a/src/gui/deletionconfirmationdialog.h b/src/gui/deletionconfirmationdialog.h index f93f1746b..9ff657849 100644 --- a/src/gui/deletionconfirmationdialog.h +++ b/src/gui/deletionconfirmationdialog.h @@ -1,5 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2024 Vladimir Golovnev * Copyright (C) 2006 Christophe Dumez * * This program is free software; you can redistribute it and/or @@ -37,16 +38,16 @@ namespace Ui class DeletionConfirmationDialog; } -class DeletionConfirmationDialog : public QDialog +class DeletionConfirmationDialog final : public QDialog { Q_OBJECT Q_DISABLE_COPY_MOVE(DeletionConfirmationDialog) public: DeletionConfirmationDialog(QWidget *parent, int size, const QString &name, bool defaultDeleteFiles); - ~DeletionConfirmationDialog(); + ~DeletionConfirmationDialog() override; - bool isDeleteFileSelected() const; + bool isRemoveContentSelected() const; private slots: void updateRememberButtonState(); diff --git a/src/gui/deletionconfirmationdialog.ui b/src/gui/deletionconfirmationdialog.ui index 9912e2b44..56834c918 100644 --- a/src/gui/deletionconfirmationdialog.ui +++ b/src/gui/deletionconfirmationdialog.ui @@ -75,7 +75,7 @@ - + 0 @@ -88,7 +88,7 @@ - Also permanently delete the files + Also remove the content files diff --git a/src/gui/filterpatternformat.h b/src/gui/filterpatternformat.h new file mode 100644 index 000000000..71b3c5c51 --- /dev/null +++ b/src/gui/filterpatternformat.h @@ -0,0 +1,48 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2024 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 + +// Using `Q_ENUM_NS()` without a wrapper namespace in our case is not advised +// since `Q_NAMESPACE` cannot be used when the same namespace resides at different files. +// https://www.kdab.com/new-qt-5-8-meta-object-support-namespaces/#comment-143779 +inline namespace FilterPatternFormatNS +{ + Q_NAMESPACE + + enum class FilterPatternFormat + { + PlainText, + Wildcards, + Regex + }; + + Q_ENUM_NS(FilterPatternFormat) +} diff --git a/src/gui/filterpatternformatmenu.cpp b/src/gui/filterpatternformatmenu.cpp new file mode 100644 index 000000000..d13ab685a --- /dev/null +++ b/src/gui/filterpatternformatmenu.cpp @@ -0,0 +1,82 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2024 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 "filterpatternformatmenu.h" + +#include + +FilterPatternFormatMenu::FilterPatternFormatMenu(const FilterPatternFormat format, QWidget *parent) + : QMenu(parent) +{ + setTitle(tr("Pattern Format")); + + auto *patternFormatGroup = new QActionGroup(this); + patternFormatGroup->setExclusive(true); + + QAction *plainTextAction = addAction(tr("Plain text")); + plainTextAction->setCheckable(true); + patternFormatGroup->addAction(plainTextAction); + + QAction *wildcardsAction = addAction(tr("Wildcards")); + wildcardsAction->setCheckable(true); + patternFormatGroup->addAction(wildcardsAction); + + QAction *regexAction = addAction(tr("Regular expression")); + regexAction->setCheckable(true); + patternFormatGroup->addAction(regexAction); + + switch (format) + { + case FilterPatternFormat::Wildcards: + default: + wildcardsAction->setChecked(true); + break; + case FilterPatternFormat::PlainText: + plainTextAction->setChecked(true); + break; + case FilterPatternFormat::Regex: + regexAction->setChecked(true); + break; + } + + connect(plainTextAction, &QAction::toggled, this, [this](const bool checked) + { + if (checked) + emit patternFormatChanged(FilterPatternFormat::PlainText); + }); + connect(wildcardsAction, &QAction::toggled, this, [this](const bool checked) + { + if (checked) + emit patternFormatChanged(FilterPatternFormat::Wildcards); + }); + connect(regexAction, &QAction::toggled, this, [this](const bool checked) + { + if (checked) + emit patternFormatChanged(FilterPatternFormat::Regex); + }); +} diff --git a/src/gui/filterpatternformatmenu.h b/src/gui/filterpatternformatmenu.h new file mode 100644 index 000000000..e201fd89d --- /dev/null +++ b/src/gui/filterpatternformatmenu.h @@ -0,0 +1,45 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2024 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 "filterpatternformat.h" + +class FilterPatternFormatMenu final : public QMenu +{ + Q_OBJECT + Q_DISABLE_COPY_MOVE(FilterPatternFormatMenu) + +public: + explicit FilterPatternFormatMenu(FilterPatternFormat format, QWidget *parent = nullptr); + +signals: + void patternFormatChanged(FilterPatternFormat format); +}; diff --git a/src/gui/properties/downloadedpiecesbar.cpp b/src/gui/properties/downloadedpiecesbar.cpp index 486d761d4..d7b1a849d 100644 --- a/src/gui/properties/downloadedpiecesbar.cpp +++ b/src/gui/properties/downloadedpiecesbar.cpp @@ -1,5 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2024 Vladimir Golovnev * Copyright (C) 2006 Christophe Dumez * * This program is free software; you can redistribute it and/or @@ -46,9 +47,9 @@ namespace } DownloadedPiecesBar::DownloadedPiecesBar(QWidget *parent) - : base {parent} - , m_dlPieceColor {dlPieceColor(pieceColor())} + : base(parent) { + updateColorsImpl(); } QVector DownloadedPiecesBar::bitfieldToFloatVector(const QBitArray &vecin, int reqSize) @@ -128,25 +129,24 @@ QVector DownloadedPiecesBar::bitfieldToFloatVector(const QBitArray &vecin return result; } -bool DownloadedPiecesBar::updateImage(QImage &image) +QImage DownloadedPiecesBar::renderImage() { // qDebug() << "updateImage"; - QImage image2(width() - 2 * borderWidth, 1, QImage::Format_RGB888); - if (image2.isNull()) + QImage image {width() - 2 * borderWidth, 1, QImage::Format_RGB888}; + if (image.isNull()) { - qDebug() << "QImage image2() allocation failed, width():" << width(); - return false; + qDebug() << "QImage allocation failed, width():" << width(); + return image; } if (m_pieces.isEmpty()) { - image2.fill(backgroundColor()); - image = image2; - return true; + image.fill(backgroundColor()); + return image; } - QVector scaledPieces = bitfieldToFloatVector(m_pieces, image2.width()); - QVector scaledPiecesDl = bitfieldToFloatVector(m_downloadedPieces, image2.width()); + QVector scaledPieces = bitfieldToFloatVector(m_pieces, image.width()); + QVector scaledPiecesDl = bitfieldToFloatVector(m_downloadedPieces, image.width()); // filling image for (int x = 0; x < scaledPieces.size(); ++x) @@ -161,15 +161,15 @@ bool DownloadedPiecesBar::updateImage(QImage &image) QRgb mixedColor = mixTwoColors(pieceColor().rgb(), m_dlPieceColor.rgb(), ratio); mixedColor = mixTwoColors(backgroundColor().rgb(), mixedColor, fillRatio); - image2.setPixel(x, 0, mixedColor); + image.setPixel(x, 0, mixedColor); } else { - image2.setPixel(x, 0, pieceColors()[piecesToValue * 255]); + image.setPixel(x, 0, pieceColors()[piecesToValue * 255]); } } - image = image2; - return true; + + return image; } void DownloadedPiecesBar::setProgress(const QBitArray &pieces, const QBitArray &downloadedPieces) @@ -177,7 +177,7 @@ void DownloadedPiecesBar::setProgress(const QBitArray &pieces, const QBitArray & m_pieces = pieces; m_downloadedPieces = downloadedPieces; - requestImageUpdate(); + redraw(); } void DownloadedPiecesBar::clear() @@ -198,3 +198,14 @@ QString DownloadedPiecesBar::simpleToolTipText() const + u""; } + +void DownloadedPiecesBar::updateColors() +{ + PiecesBar::updateColors(); + updateColorsImpl(); +} + +void DownloadedPiecesBar::updateColorsImpl() +{ + m_dlPieceColor = dlPieceColor(pieceColor()); +} diff --git a/src/gui/properties/downloadedpiecesbar.h b/src/gui/properties/downloadedpiecesbar.h index d98a114b2..2e8a1e00b 100644 --- a/src/gui/properties/downloadedpiecesbar.h +++ b/src/gui/properties/downloadedpiecesbar.h @@ -1,5 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2024 Vladimir Golovnev * Copyright (C) 2006 Christophe Dumez * * This program is free software; you can redistribute it and/or @@ -52,11 +53,13 @@ public: private: // scale bitfield vector to float vector QVector bitfieldToFloatVector(const QBitArray &vecin, int reqSize); - bool updateImage(QImage &image) override; + QImage renderImage() override; QString simpleToolTipText() const override; + void updateColors() override; + void updateColorsImpl(); // incomplete piece color - const QColor m_dlPieceColor; + QColor m_dlPieceColor; // last used bitfields, uses to better resize redraw // TODO: make a diff pieces to new pieces and update only changed pixels, speedup when update > 20x faster QBitArray m_pieces; diff --git a/src/gui/properties/peerlistwidget.cpp b/src/gui/properties/peerlistwidget.cpp index 02f0cc609..87acbc666 100644 --- a/src/gui/properties/peerlistwidget.cpp +++ b/src/gui/properties/peerlistwidget.cpp @@ -411,7 +411,7 @@ void PeerListWidget::loadPeers(const BitTorrent::Torrent *torrent) return; // Remove I2P peers since they will be completely reloaded. - for (QStandardItem *item : asConst(m_I2PPeerItems)) + for (const QStandardItem *item : asConst(m_I2PPeerItems)) m_listModel->removeRow(item->row()); m_I2PPeerItems.clear(); @@ -466,10 +466,14 @@ void PeerListWidget::loadPeers(const BitTorrent::Torrent *torrent) { QStandardItem *item = m_peerItems.take(peerEndpoint); - QSet &items = m_itemsByIP[peerEndpoint.address.ip]; - items.remove(item); - if (items.isEmpty()) - m_itemsByIP.remove(peerEndpoint.address.ip); + const auto items = m_itemsByIP.find(peerEndpoint.address.ip); + Q_ASSERT(items != m_itemsByIP.end()); + if (items == m_itemsByIP.end()) [[unlikely]] + continue; + + items->remove(item); + if (items->isEmpty()) + m_itemsByIP.erase(items); m_listModel->removeRow(item->row()); } diff --git a/src/gui/properties/pieceavailabilitybar.cpp b/src/gui/properties/pieceavailabilitybar.cpp index 0f33d704b..66b375e92 100644 --- a/src/gui/properties/pieceavailabilitybar.cpp +++ b/src/gui/properties/pieceavailabilitybar.cpp @@ -1,5 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2024 Vladimir Golovnev * Copyright (C) 2006 Christophe Dumez * * This program is free software; you can redistribute it and/or @@ -126,39 +127,38 @@ QVector PieceAvailabilityBar::intToFloatVector(const QVector &vecin, return result; } -bool PieceAvailabilityBar::updateImage(QImage &image) +QImage PieceAvailabilityBar::renderImage() { - QImage image2(width() - 2 * borderWidth, 1, QImage::Format_RGB888); - if (image2.isNull()) + QImage image {width() - 2 * borderWidth, 1, QImage::Format_RGB888}; + if (image.isNull()) { - qDebug() << "QImage image2() allocation failed, width():" << width(); - return false; + qDebug() << "QImage allocation failed, width():" << width(); + return image; } if (m_pieces.empty()) { - image2.fill(backgroundColor()); - image = image2; - return true; + image.fill(backgroundColor()); + return image; } - QVector scaledPieces = intToFloatVector(m_pieces, image2.width()); + QVector scaledPieces = intToFloatVector(m_pieces, image.width()); // filling image for (int x = 0; x < scaledPieces.size(); ++x) { float piecesToValue = scaledPieces.at(x); - image2.setPixel(x, 0, pieceColors()[piecesToValue * 255]); + image.setPixel(x, 0, pieceColors()[piecesToValue * 255]); } - image = image2; - return true; + + return image; } void PieceAvailabilityBar::setAvailability(const QVector &avail) { m_pieces = avail; - requestImageUpdate(); + redraw(); } void PieceAvailabilityBar::clear() diff --git a/src/gui/properties/pieceavailabilitybar.h b/src/gui/properties/pieceavailabilitybar.h index 05472d489..07ece9701 100644 --- a/src/gui/properties/pieceavailabilitybar.h +++ b/src/gui/properties/pieceavailabilitybar.h @@ -1,5 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2024 Vladimir Golovnev * Copyright (C) 2006 Christophe Dumez * * This program is free software; you can redistribute it and/or @@ -46,7 +47,7 @@ public: void clear() override; private: - bool updateImage(QImage &image) override; + QImage renderImage() override; QString simpleToolTipText() const override; // last used int vector, uses to better resize redraw diff --git a/src/gui/properties/piecesbar.cpp b/src/gui/properties/piecesbar.cpp index 0d42ec2ab..065fd26e2 100644 --- a/src/gui/properties/piecesbar.cpp +++ b/src/gui/properties/piecesbar.cpp @@ -1,5 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2024 Vladimir Golovnev * Copyright (C) 2016 Eugene Shalygin * Copyright (C) 2006 Christophe Dumez * @@ -41,6 +42,7 @@ #include "base/indexrange.h" #include "base/path.h" #include "base/utils/misc.h" +#include "gui/uithememanager.h" namespace { @@ -114,10 +116,16 @@ namespace } PiecesBar::PiecesBar(QWidget *parent) - : QWidget {parent} + : QWidget(parent) { - updatePieceColors(); setMouseTracking(true); + + updateColorsImpl(); + connect(UIThemeManager::instance(), &UIThemeManager::themeChanged, this, [this] + { + updateColors(); + redraw(); + }); } void PiecesBar::setTorrent(const BitTorrent::Torrent *torrent) @@ -154,7 +162,7 @@ void PiecesBar::leaveEvent(QEvent *e) { m_hovered = false; m_highlightedRegion = {}; - requestImageUpdate(); + redraw(); base::leaveEvent(e); } @@ -178,7 +186,10 @@ void PiecesBar::paintEvent(QPaintEvent *) else { if (m_image.width() != imageRect.width()) - updateImage(m_image); + { + if (const QImage image = renderImage(); !image.isNull()) + m_image = image; + } painter.drawImage(imageRect, m_image); } @@ -196,30 +207,33 @@ void PiecesBar::paintEvent(QPaintEvent *) painter.drawPath(border); } -void PiecesBar::requestImageUpdate() +void PiecesBar::redraw() { - if (updateImage(m_image)) + if (const QImage image = renderImage(); !image.isNull()) + { + m_image = image; update(); + } } QColor PiecesBar::backgroundColor() const { - return palette().color(QPalette::Base); + return palette().color(QPalette::Active, QPalette::Base); } QColor PiecesBar::borderColor() const { - return palette().color(QPalette::Dark); + return palette().color(QPalette::Active, QPalette::Dark); } QColor PiecesBar::pieceColor() const { - return palette().color(QPalette::Highlight); + return palette().color(QPalette::Active, QPalette::Highlight); } QColor PiecesBar::colorBoxBorderColor() const { - return palette().color(QPalette::ToolTipText); + return palette().color(QPalette::Active, QPalette::ToolTipText); } const QVector &PiecesBar::pieceColors() const @@ -325,12 +339,17 @@ void PiecesBar::highlightFile(int imagePos) } } -void PiecesBar::updatePieceColors() +void PiecesBar::updateColors() +{ + updateColorsImpl(); +} + +void PiecesBar::updateColorsImpl() { m_pieceColors = QVector(256); for (int i = 0; i < 256; ++i) { - float ratio = (i / 255.0); + const float ratio = (i / 255.0); m_pieceColors[i] = mixTwoColors(backgroundColor().rgb(), pieceColor().rgb(), ratio); } } diff --git a/src/gui/properties/piecesbar.h b/src/gui/properties/piecesbar.h index 2f6e20615..c7f74d2ba 100644 --- a/src/gui/properties/piecesbar.h +++ b/src/gui/properties/piecesbar.h @@ -1,5 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2024 Vladimir Golovnev * Copyright (C) 2016 Eugene Shalygin * Copyright (C) 2006 Christophe Dumez * @@ -54,17 +55,15 @@ public: virtual void clear(); - // QObject interface - bool event(QEvent *e) override; - protected: - // QWidget interface + bool event(QEvent *e) override; void enterEvent(QEnterEvent *e) override; void leaveEvent(QEvent *e) override; void mouseMoveEvent(QMouseEvent *e) override; - void paintEvent(QPaintEvent *e) override; - void requestImageUpdate(); + + virtual void updateColors(); + void redraw(); QColor backgroundColor() const; QColor borderColor() const; @@ -82,11 +81,9 @@ private: void highlightFile(int imagePos); virtual QString simpleToolTipText() const = 0; + virtual QImage renderImage() = 0; - // draw new image to replace the actual image - // returns true if image was successfully updated - virtual bool updateImage(QImage &image) = 0; - void updatePieceColors(); + void updateColorsImpl(); const BitTorrent::Torrent *m_torrent = nullptr; QImage m_image; diff --git a/src/gui/properties/propertieswidget.cpp b/src/gui/properties/propertieswidget.cpp index 980978cb9..26d737732 100644 --- a/src/gui/properties/propertieswidget.cpp +++ b/src/gui/properties/propertieswidget.cpp @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2022 Vladimir Golovnev + * Copyright (C) 2022-2024 Vladimir Golovnev * Copyright (C) 2006 Christophe Dumez * * This program is free software; you can redistribute it and/or @@ -52,6 +52,7 @@ #include "base/utils/misc.h" #include "base/utils/string.h" #include "gui/autoexpandabledialog.h" +#include "gui/filterpatternformatmenu.h" #include "gui/lineedit.h" #include "gui/trackerlist/trackerlistwidget.h" #include "gui/uithememanager.h" @@ -66,6 +67,7 @@ PropertiesWidget::PropertiesWidget(QWidget *parent) : QWidget(parent) , m_ui {new Ui::PropertiesWidget} + , m_storeFilterPatternFormat {u"GUI/PropertiesWidget/FilterPatternFormat"_s} { m_ui->setupUi(this); #ifndef Q_OS_MACOS @@ -78,7 +80,9 @@ PropertiesWidget::PropertiesWidget(QWidget *parent) m_contentFilterLine = new LineEdit(this); m_contentFilterLine->setPlaceholderText(tr("Filter files...")); m_contentFilterLine->setFixedWidth(300); - connect(m_contentFilterLine, &LineEdit::textChanged, m_ui->filesList, &TorrentContentWidget::setFilterPattern); + m_contentFilterLine->setContextMenuPolicy(Qt::CustomContextMenu); + connect(m_contentFilterLine, &QWidget::customContextMenuRequested, this, &PropertiesWidget::showContentFilterContextMenu); + connect(m_contentFilterLine, &LineEdit::textChanged, this, &PropertiesWidget::setContentFilterPattern); m_ui->contentFilterLayout->insertWidget(3, m_contentFilterLine); m_ui->filesList->setDoubleClickAction(TorrentContentWidget::DoubleClickAction::Open); @@ -206,6 +210,7 @@ void PropertiesWidget::clear() m_ui->labelSavePathVal->clear(); m_ui->labelCreatedOnVal->clear(); m_ui->labelTotalPiecesVal->clear(); + m_ui->labelPrivateVal->clear(); m_ui->labelInfohash1Val->clear(); m_ui->labelInfohash2Val->clear(); m_ui->labelCommentVal->clear(); @@ -274,6 +279,28 @@ void PropertiesWidget::updateSavePath(BitTorrent::Torrent *const torrent) m_ui->labelSavePathVal->setText(m_torrent->savePath().toString()); } +void PropertiesWidget::showContentFilterContextMenu() +{ + QMenu *menu = m_contentFilterLine->createStandardContextMenu(); + + auto *formatMenu = new FilterPatternFormatMenu(m_storeFilterPatternFormat.get(FilterPatternFormat::Wildcards), menu); + connect(formatMenu, &FilterPatternFormatMenu::patternFormatChanged, this, [this](const FilterPatternFormat format) + { + m_storeFilterPatternFormat = format; + setContentFilterPattern(); + }); + + menu->addSeparator(); + menu->addMenu(formatMenu); + menu->setAttribute(Qt::WA_DeleteOnClose); + menu->popup(QCursor::pos()); +} + +void PropertiesWidget::setContentFilterPattern() +{ + m_ui->filesList->setFilterPattern(m_contentFilterLine->text(), m_storeFilterPatternFormat.get(FilterPatternFormat::Wildcards)); +} + void PropertiesWidget::updateTorrentInfos(BitTorrent::Torrent *const torrent) { if (torrent == m_torrent) @@ -309,7 +336,14 @@ void PropertiesWidget::loadTorrentInfos(BitTorrent::Torrent *const torrent) m_ui->labelCommentVal->setText(Utils::Misc::parseHtmlLinks(m_torrent->comment().toHtmlEscaped())); m_ui->labelCreatedByVal->setText(m_torrent->creator()); + + m_ui->labelPrivateVal->setText(m_torrent->isPrivate() ? tr("Yes") : tr("No")); } + else + { + m_ui->labelPrivateVal->setText(tr("N/A")); + } + // Load dynamic data loadDynamicData(); } diff --git a/src/gui/properties/propertieswidget.h b/src/gui/properties/propertieswidget.h index 31a1963b0..21b1b5fc5 100644 --- a/src/gui/properties/propertieswidget.h +++ b/src/gui/properties/propertieswidget.h @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2022 Vladimir Golovnev + * Copyright (C) 2022-2024 Vladimir Golovnev * Copyright (C) 2006 Christophe Dumez * * This program is free software; you can redistribute it and/or @@ -32,7 +32,8 @@ #include #include -#include "base/pathfwd.h" +#include "base/settingvalue.h" +#include "gui/filterpatternformat.h" class QPushButton; class QTreeView; @@ -102,6 +103,8 @@ private slots: private: QPushButton *getButtonFromIndex(int index); + void showContentFilterContextMenu(); + void setContentFilterPattern(); Ui::PropertiesWidget *m_ui = nullptr; BitTorrent::Torrent *m_torrent = nullptr; @@ -115,4 +118,6 @@ private: PropTabBar *m_tabBar = nullptr; LineEdit *m_contentFilterLine = nullptr; int m_handleWidth = -1; + + SettingValue m_storeFilterPatternFormat; }; diff --git a/src/gui/properties/propertieswidget.ui b/src/gui/properties/propertieswidget.ui index 17ffa6b4f..71b3864f9 100644 --- a/src/gui/properties/propertieswidget.ui +++ b/src/gui/properties/propertieswidget.ui @@ -823,6 +823,38 @@ + + + + 0 + 0 + + + + Private: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + Qt::PlainText + + + Qt::TextSelectableByMouse + + + + @@ -838,71 +870,7 @@ - - - - - 0 - 0 - - - - Info Hash v2: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - 0 - 0 - - - - Qt::PlainText - - - Qt::TextSelectableByMouse - - - - - - - - 0 - 0 - - - - Save Path: - - - Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing - - - - - - - - 0 - 0 - - - - Comment: - - - Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing - - - - @@ -918,7 +886,55 @@ + + + + + 0 + 0 + + + + Info Hash v2: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + 0 + 0 + + + + Qt::PlainText + + + Qt::TextSelectableByMouse + + + + + + + + 0 + 0 + + + + Save Path: + + + Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing + + + + @@ -937,7 +953,23 @@ - + + + + + 0 + 0 + + + + Comment: + + + Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing + + + + diff --git a/src/gui/torrentcontentmodel.cpp b/src/gui/torrentcontentmodel.cpp index 61c43cebc..694e75958 100644 --- a/src/gui/torrentcontentmodel.cpp +++ b/src/gui/torrentcontentmodel.cpp @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2022-2023 Vladimir Golovnev + * Copyright (C) 2022-2024 Vladimir Golovnev * Copyright (C) 2006-2012 Christophe Dumez * * This program is free software; you can redistribute it and/or @@ -37,17 +37,12 @@ #include #include -#if defined(Q_OS_WIN) -#include -#include -#else -#include -#include -#endif - -#if defined Q_OS_WIN || defined Q_OS_MACOS +#if defined(Q_OS_MACOS) #define QBT_PIXMAP_CACHE_FOR_FILE_ICONS #include +#elif !defined(Q_OS_WIN) +#include +#include #endif #include "base/bittorrent/downloadpriority.h" @@ -116,27 +111,8 @@ namespace }; #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 - { - QPixmap pixmapForExtension(const QString &ext) const override - { - const std::wstring extWStr = QString(u'.' + ext).toStdWString(); - - SHFILEINFOW sfi {}; - const HRESULT hr = ::SHGetFileInfoW(extWStr.c_str(), - FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi), (SHGFI_ICON | SHGFI_USEFILEATTRIBUTES)); - if (FAILED(hr)) - return {}; - - const auto iconPixmap = QPixmap::fromImage(QImage::fromHICON(sfi.hIcon)); - ::DestroyIcon(sfi.hIcon); - return iconPixmap; - } - }; -#elif defined(Q_OS_MACOS) - // There is a similar bug on macOS, to be reported to Qt +#if defined(Q_OS_MACOS) + // There is a bug on macOS, to be reported to Qt // https://github.com/qbittorrent/qBittorrent/pull/6156#issuecomment-316302615 class MacFileIconProvider final : public CachingFileIconProvider { @@ -145,7 +121,7 @@ namespace return MacUtils::pixmapForExtension(ext, QSize(32, 32)); } }; -#else +#elif !defined(Q_OS_WIN) /** * @brief Tests whether QFileIconProvider actually works * @@ -189,7 +165,7 @@ TorrentContentModel::TorrentContentModel(QObject *parent) : QAbstractItemModel(parent) , m_rootItem(new TorrentContentModelFolder(QVector({ tr("Name"), tr("Total Size"), tr("Progress"), tr("Download Priority"), tr("Remaining"), tr("Availability") }))) #if defined(Q_OS_WIN) - , m_fileIconProvider {new WinShellFileIconProvider} + , m_fileIconProvider {new QFileIconProvider} #elif defined(Q_OS_MACOS) , m_fileIconProvider {new MacFileIconProvider} #else diff --git a/src/gui/torrentcontentmodelfolder.cpp b/src/gui/torrentcontentmodelfolder.cpp index abece9c9b..b8a536216 100644 --- a/src/gui/torrentcontentmodelfolder.cpp +++ b/src/gui/torrentcontentmodelfolder.cpp @@ -147,10 +147,19 @@ void TorrentContentModelFolder::recalculateProgress() tRemaining += child->remaining(); } - if (!isRootItem() && (tSize > 0)) + if (!isRootItem()) { - m_progress = tProgress / tSize; - m_remaining = tRemaining; + if (tSize > 0) + { + m_progress = tProgress / tSize; + m_remaining = tRemaining; + } + else + { + m_progress = 1.0; + m_remaining = 0; + } + Q_ASSERT(m_progress <= 1.); } } diff --git a/src/gui/torrentcontentwidget.cpp b/src/gui/torrentcontentwidget.cpp index 1b3817408..59c401871 100644 --- a/src/gui/torrentcontentwidget.cpp +++ b/src/gui/torrentcontentwidget.cpp @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2022 Vladimir Golovnev + * Copyright (C) 2022-2024 Vladimir Golovnev * Copyright (C) 2014 Ivan Sorokin * * This program is free software; you can redistribute it and/or @@ -56,6 +56,19 @@ #include "gui/macutilities.h" #endif +namespace +{ + QList toPersistentIndexes(const QModelIndexList &indexes) + { + QList persistentIndexes; + persistentIndexes.reserve(indexes.size()); + for (const QModelIndex &index : indexes) + persistentIndexes.emplaceBack(index); + + return persistentIndexes; + } +} + TorrentContentWidget::TorrentContentWidget(QWidget *parent) : QTreeView(parent) { @@ -173,10 +186,20 @@ Path TorrentContentWidget::getItemPath(const QModelIndex &index) const return path; } -void TorrentContentWidget::setFilterPattern(const QString &patternText) +void TorrentContentWidget::setFilterPattern(const QString &patternText, const FilterPatternFormat format) { - const QString pattern = Utils::String::wildcardToRegexPattern(patternText); - m_filterModel->setFilterRegularExpression(QRegularExpression(pattern, QRegularExpression::CaseInsensitiveOption)); + if (format == FilterPatternFormat::PlainText) + { + m_filterModel->setFilterFixedString(patternText); + m_filterModel->setFilterCaseSensitivity(Qt::CaseInsensitive); + } + else + { + const QString pattern = ((format == FilterPatternFormat::Regex) + ? patternText : Utils::String::wildcardToRegexPattern(patternText)); + m_filterModel->setFilterRegularExpression(QRegularExpression(pattern, QRegularExpression::CaseInsensitiveOption)); + } + if (patternText.isEmpty()) { collapseAll(); @@ -219,9 +242,9 @@ void TorrentContentWidget::keyPressEvent(QKeyEvent *event) const Qt::CheckState state = (static_cast(value.toInt()) == Qt::Checked) ? Qt::Unchecked : Qt::Checked; - const QModelIndexList selection = selectionModel()->selectedRows(TorrentContentModelItem::COL_NAME); + const QList selection = toPersistentIndexes(selectionModel()->selectedRows(TorrentContentModelItem::COL_NAME)); - for (const QModelIndex &index : selection) + for (const QPersistentModelIndex &index : selection) model()->setData(index, state, Qt::CheckStateRole); } @@ -248,10 +271,10 @@ void TorrentContentWidget::renameSelectedFile() void TorrentContentWidget::applyPriorities(const BitTorrent::DownloadPriority priority) { - const QModelIndexList selectedRows = selectionModel()->selectedRows(0); - for (const QModelIndex &index : selectedRows) + const QList selectedRows = toPersistentIndexes(selectionModel()->selectedRows(Priority)); + for (const QPersistentModelIndex &index : selectedRows) { - model()->setData(index.sibling(index.row(), Priority), static_cast(priority)); + model()->setData(index, static_cast(priority)); } } @@ -261,7 +284,7 @@ void TorrentContentWidget::applyPrioritiesByOrder() // a download priority that will apply to each item. The number of groups depends on how // many "download priority" are available to be assigned - const QModelIndexList selectedRows = selectionModel()->selectedRows(0); + const QList selectedRows = toPersistentIndexes(selectionModel()->selectedRows(Priority)); const qsizetype priorityGroups = 3; const auto priorityGroupSize = std::max((selectedRows.length() / priorityGroups), 1); @@ -283,8 +306,8 @@ void TorrentContentWidget::applyPrioritiesByOrder() break; } - const QModelIndex &index = selectedRows[i]; - model()->setData(index.sibling(index.row(), Priority), static_cast(priority)); + const QPersistentModelIndex &index = selectedRows[i]; + model()->setData(index, static_cast(priority)); } } diff --git a/src/gui/torrentcontentwidget.h b/src/gui/torrentcontentwidget.h index 4baccb883..1e9f0835c 100644 --- a/src/gui/torrentcontentwidget.h +++ b/src/gui/torrentcontentwidget.h @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2022 Vladimir Golovnev + * Copyright (C) 2022-2024 Vladimir Golovnev * Copyright (C) 2014 Ivan Sorokin * * This program is free software; you can redistribute it and/or @@ -33,6 +33,7 @@ #include "base/bittorrent/downloadpriority.h" #include "base/pathfwd.h" +#include "filterpatternformat.h" class QShortcut; @@ -92,7 +93,7 @@ public: int getFileIndex(const QModelIndex &index) const; Path getItemPath(const QModelIndex &index) const; - void setFilterPattern(const QString &patternText); + void setFilterPattern(const QString &patternText, FilterPatternFormat format = FilterPatternFormat::Wildcards); void checkAll(); void checkNone(); diff --git a/src/gui/torrenttagsdialog.cpp b/src/gui/torrenttagsdialog.cpp index 9e48443b0..9901a4ba8 100644 --- a/src/gui/torrenttagsdialog.cpp +++ b/src/gui/torrenttagsdialog.cpp @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2023 Vladimir Golovnev + * Copyright (C) 2023-2024 Vladimir Golovnev * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -37,6 +37,7 @@ #include "base/global.h" #include "autoexpandabledialog.h" #include "flowlayout.h" +#include "utils.h" #include "ui_torrenttagsdialog.h" @@ -52,10 +53,10 @@ TorrentTagsDialog::TorrentTagsDialog(const TagSet &initialTags, QWidget *parent) connect(m_ui->buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); connect(m_ui->buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); - auto *tagsLayout = new FlowLayout(m_ui->scrollArea); + auto *tagsLayout = new FlowLayout(m_ui->scrollArea->widget()); for (const Tag &tag : asConst(initialTags.united(BitTorrent::Session::instance()->tags()))) { - auto *tagWidget = new QCheckBox(tag.toString()); + auto *tagWidget = new QCheckBox(Utils::Gui::tagToWidgetText(tag)); if (initialTags.contains(tag)) tagWidget->setChecked(true); tagsLayout->addWidget(tagWidget); @@ -78,12 +79,12 @@ TorrentTagsDialog::~TorrentTagsDialog() TagSet TorrentTagsDialog::tags() const { TagSet tags; - auto *layout = m_ui->scrollArea->layout(); + auto *layout = m_ui->scrollArea->widget()->layout(); for (int i = 0; i < (layout->count() - 1); ++i) { const auto *tagWidget = static_cast(layout->itemAt(i)->widget()); if (tagWidget->isChecked()) - tags.insert(Tag(tagWidget->text())); + tags.insert(Utils::Gui::widgetTextToTag(tagWidget->text())); } return tags; @@ -111,9 +112,9 @@ void TorrentTagsDialog::addNewTag() } else { - auto *layout = m_ui->scrollArea->layout(); + auto *layout = m_ui->scrollArea->widget()->layout(); auto *btn = layout->takeAt(layout->count() - 1); - auto *tagWidget = new QCheckBox(tag.toString()); + auto *tagWidget = new QCheckBox(Utils::Gui::tagToWidgetText(tag)); tagWidget->setChecked(true); layout->addWidget(tagWidget); layout->addItem(btn); diff --git a/src/gui/trackerlist/trackerlistmodel.cpp b/src/gui/trackerlist/trackerlistmodel.cpp index 92fb8acb3..0d0b8fdf7 100644 --- a/src/gui/trackerlist/trackerlistmodel.cpp +++ b/src/gui/trackerlist/trackerlistmodel.cpp @@ -488,11 +488,11 @@ QVariant TrackerListModel::headerData(const int section, const Qt::Orientation o switch (section) { case COL_URL: - return tr("URL/Announce endpoint"); + return tr("URL/Announce Endpoint"); case COL_TIER: return tr("Tier"); case COL_PROTOCOL: - return tr("Protocol"); + return tr("BT Protocol"); case COL_STATUS: return tr("Status"); case COL_PEERS: @@ -506,9 +506,9 @@ QVariant TrackerListModel::headerData(const int section, const Qt::Orientation o case COL_MSG: return tr("Message"); case COL_NEXT_ANNOUNCE: - return tr("Next announce"); + return tr("Next Announce"); case COL_MIN_ANNOUNCE: - return tr("Min announce"); + return tr("Min Announce"); default: return {}; } @@ -585,7 +585,7 @@ QVariant TrackerListModel::data(const QModelIndex &index, const int role) const case COL_TIER: return (isEndpoint || (index.row() < STICKY_ROW_COUNT)) ? QString() : QString::number(itemPtr->tier); case COL_PROTOCOL: - return isEndpoint ? tr("v%1").arg(itemPtr->btVersion) : QString(); + return isEndpoint ? (u'v' + QString::number(itemPtr->btVersion)) : QString(); case COL_STATUS: if (isEndpoint) return toString(itemPtr->status); diff --git a/src/gui/transferlistfilters/statusfilterwidget.cpp b/src/gui/transferlistfilters/statusfilterwidget.cpp index 802b5535b..dbb75e0da 100644 --- a/src/gui/transferlistfilters/statusfilterwidget.cpp +++ b/src/gui/transferlistfilters/statusfilterwidget.cpp @@ -235,10 +235,7 @@ void StatusFilterWidget::applyFilter(int row) void StatusFilterWidget::handleTorrentsLoaded(const QVector &torrents) { - for (const BitTorrent::Torrent *torrent : torrents) - updateTorrentStatus(torrent); - - updateTexts(); + update(torrents); } void StatusFilterWidget::torrentAboutToBeDeleted(BitTorrent::Torrent *const torrent) @@ -273,6 +270,12 @@ void StatusFilterWidget::torrentAboutToBeDeleted(BitTorrent::Torrent *const torr m_nbStalled = m_nbStalledUploading + m_nbStalledDownloading; updateTexts(); + + if (Preferences::instance()->getHideZeroStatusFilters()) + { + hideZeroItems(); + updateGeometry(); + } } void StatusFilterWidget::configure() diff --git a/src/gui/transferlistfilterswidget.cpp b/src/gui/transferlistfilterswidget.cpp index feb93d1a6..348290ace 100644 --- a/src/gui/transferlistfilterswidget.cpp +++ b/src/gui/transferlistfilterswidget.cpp @@ -39,7 +39,6 @@ #include #include -#include "base/algorithm.h" #include "base/bittorrent/session.h" #include "base/bittorrent/torrent.h" #include "base/bittorrent/trackerentrystatus.h" diff --git a/src/gui/transferlistmodel.cpp b/src/gui/transferlistmodel.cpp index cb35a51c0..63f1b3ebb 100644 --- a/src/gui/transferlistmodel.cpp +++ b/src/gui/transferlistmodel.cpp @@ -193,6 +193,7 @@ QVariant TransferListModel::headerData(const int section, const Qt::Orientation case TR_INFOHASH_V1: return tr("Info Hash v1", "i.e: torrent info hash v1"); case TR_INFOHASH_V2: return tr("Info Hash v2", "i.e: torrent info hash v2"); case TR_REANNOUNCE: return tr("Reannounce In", "Indicates the time until next trackers reannounce"); + case TR_PRIVATE: return tr("Private", "Flags private torrents"); default: return {}; } } @@ -357,6 +358,15 @@ QString TransferListModel::displayValue(const BitTorrent::Torrent *torrent, cons return Utils::Misc::userFriendlyDuration(time); }; + const auto privateString = [hideValues](const bool isPrivate, const bool hasMetadata) -> QString + { + if (hideValues && !isPrivate) + return {}; + if (hasMetadata) + return isPrivate ? tr("Yes") : tr("No"); + return tr("N/A"); + }; + switch (column) { case TR_NAME: @@ -431,6 +441,8 @@ QString TransferListModel::displayValue(const BitTorrent::Torrent *torrent, cons return hashString(torrent->infoHash().v2()); case TR_REANNOUNCE: return reannounceString(torrent->nextAnnounce()); + case TR_PRIVATE: + return privateString(torrent->isPrivate(), torrent->hasMetadata()); } return {}; @@ -512,6 +524,8 @@ QVariant TransferListModel::internalValue(const BitTorrent::Torrent *torrent, co return QVariant::fromValue(torrent->infoHash().v2()); case TR_REANNOUNCE: return torrent->nextAnnounce(); + case TR_PRIVATE: + return (torrent->hasMetadata() ? torrent->isPrivate() : QVariant()); } return {}; diff --git a/src/gui/transferlistmodel.h b/src/gui/transferlistmodel.h index 061db4683..5942f77da 100644 --- a/src/gui/transferlistmodel.h +++ b/src/gui/transferlistmodel.h @@ -86,6 +86,7 @@ public: TR_INFOHASH_V1, TR_INFOHASH_V2, TR_REANNOUNCE, + TR_PRIVATE, NB_COLUMNS }; diff --git a/src/gui/transferlistsortmodel.cpp b/src/gui/transferlistsortmodel.cpp index 2f9ce6ff0..782aead74 100644 --- a/src/gui/transferlistsortmodel.cpp +++ b/src/gui/transferlistsortmodel.cpp @@ -59,8 +59,8 @@ namespace int customCompare(const TagSet &left, const TagSet &right, const Utils::Compare::NaturalCompare &compare) { for (auto leftIter = left.cbegin(), rightIter = right.cbegin(); - (leftIter != left.cend()) && (rightIter != right.cend()); - ++leftIter, ++rightIter) + (leftIter != left.cend()) && (rightIter != right.cend()); + ++leftIter, ++rightIter) { const int result = compare(leftIter->toString(), rightIter->toString()); if (result != 0) @@ -84,6 +84,17 @@ namespace return isLeftValid ? -1 : 1; } + int compareAsBool(const QVariant &left, const QVariant &right) + { + const bool leftValid = left.isValid(); + const bool rightValid = right.isValid(); + if (leftValid && rightValid) + return threeWayCompare(left.toBool(), right.toBool()); + if (!leftValid && !rightValid) + return 0; + return leftValid ? -1 : 1; + } + int adjustSubSortColumn(const int column) { return ((column >= 0) && (column < TransferListModel::NB_COLUMNS)) @@ -214,6 +225,9 @@ int TransferListSortModel::compare(const QModelIndex &left, const QModelIndex &r case TransferListModel::TR_UPSPEED: return customCompare(leftValue.toInt(), rightValue.toInt()); + case TransferListModel::TR_PRIVATE: + return compareAsBool(leftValue, rightValue); + case TransferListModel::TR_PEERS: case TransferListModel::TR_SEEDS: { diff --git a/src/gui/transferlistwidget.cpp b/src/gui/transferlistwidget.cpp index a1b79b29e..7b857e1a3 100644 --- a/src/gui/transferlistwidget.cpp +++ b/src/gui/transferlistwidget.cpp @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2023 Vladimir Golovnev + * Copyright (C) 2023-2024 Vladimir Golovnev * Copyright (C) 2006 Christophe Dumez * * This program is free software; you can redistribute it and/or @@ -116,9 +116,10 @@ namespace void removeTorrents(const QVector &torrents, const bool isDeleteFileSelected) { auto *session = BitTorrent::Session::instance(); - const DeleteOption deleteOption = isDeleteFileSelected ? DeleteTorrentAndFiles : DeleteTorrent; + const BitTorrent::TorrentRemoveOption removeOption = isDeleteFileSelected + ? BitTorrent::TorrentRemoveOption::RemoveContent : BitTorrent::TorrentRemoveOption::KeepContent; for (const BitTorrent::Torrent *torrent : torrents) - session->deleteTorrent(torrent->id(), deleteOption); + session->removeTorrent(torrent->id(), removeOption); } } @@ -183,6 +184,7 @@ TransferListWidget::TransferListWidget(QWidget *parent, MainWindow *mainWindow) setColumnHidden(TransferListModel::TR_LAST_ACTIVITY, true); setColumnHidden(TransferListModel::TR_TOTAL_SIZE, true); setColumnHidden(TransferListModel::TR_REANNOUNCE, true); + setColumnHidden(TransferListModel::TR_PRIVATE, true); } //Ensure that at least one column is visible at all times @@ -442,7 +444,7 @@ void TransferListWidget::deleteSelectedTorrents(const bool deleteLocalFiles) { // Some torrents might be removed when waiting for user input, so refetch the torrent list // NOTE: this will only work when dialog is modal - removeTorrents(getSelectedTorrents(), dialog->isDeleteFileSelected()); + removeTorrents(getSelectedTorrents(), dialog->isRemoveContentSelected()); }); dialog->open(); } @@ -465,7 +467,7 @@ void TransferListWidget::deleteVisibleTorrents() { // Some torrents might be removed when waiting for user input, so refetch the torrent list // NOTE: this will only work when dialog is modal - removeTorrents(getVisibleTorrents(), dialog->isDeleteFileSelected()); + removeTorrents(getVisibleTorrents(), dialog->isRemoveContentSelected()); }); dialog->open(); } @@ -1190,7 +1192,7 @@ void TransferListWidget::displayListMenu() const TagSet tags = BitTorrent::Session::instance()->tags(); for (const Tag &tag : asConst(tags)) { - auto *action = new TriStateAction(tag.toString(), tagsMenu); + auto *action = new TriStateAction(Utils::Gui::tagToWidgetText(tag), tagsMenu); action->setCloseOnInteraction(false); const Qt::CheckState initialState = tagsInAll.contains(tag) ? Qt::Checked diff --git a/src/gui/utils.cpp b/src/gui/utils.cpp index c7c1f24c4..f310c7f26 100644 --- a/src/gui/utils.cpp +++ b/src/gui/utils.cpp @@ -1,5 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2024 Vladimir Golovnev * Copyright (C) 2017 Mike Tzou * * This program is free software; you can redistribute it and/or @@ -54,6 +55,7 @@ #include "base/global.h" #include "base/path.h" +#include "base/tag.h" #include "base/utils/fs.h" #include "base/utils/version.h" @@ -216,3 +218,29 @@ void Utils::Gui::openFolderSelect(const Path &path) openPath(path.parentPath()); #endif } + +QString Utils::Gui::tagToWidgetText(const Tag &tag) +{ + return tag.toString().replace(u'&', u"&&"_s); +} + +Tag Utils::Gui::widgetTextToTag(const QString &text) +{ + // replace pairs of '&' with single '&' and remove non-paired occurrences of '&' + QString cleanedText; + cleanedText.reserve(text.size()); + bool amp = false; + for (const QChar c : text) + { + if (c == u'&') + { + amp = !amp; + if (amp) + continue; + } + + cleanedText.append(c); + } + + return Tag(cleanedText); +} diff --git a/src/gui/utils.h b/src/gui/utils.h index c633cb45d..46a49c2f6 100644 --- a/src/gui/utils.h +++ b/src/gui/utils.h @@ -1,5 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2024 Vladimir Golovnev * Copyright (C) 2017 Mike Tzou * * This program is free software; you can redistribute it and/or @@ -34,8 +35,11 @@ class QIcon; class QPixmap; class QPoint; class QSize; +class QString; class QWidget; +class Tag; + namespace Utils::Gui { bool isDarkTheme(); @@ -51,4 +55,7 @@ namespace Utils::Gui void openPath(const Path &path); void openFolderSelect(const Path &path); + + QString tagToWidgetText(const Tag &tag); + Tag widgetTextToTag(const QString &text); } diff --git a/src/qbittorrent.exe.manifest b/src/qbittorrent.exe.manifest index 939a56d1e..1725117fd 100644 --- a/src/qbittorrent.exe.manifest +++ b/src/qbittorrent.exe.manifest @@ -1,5 +1,12 @@ + + @@ -28,6 +35,7 @@ + diff --git a/src/searchengine/nova3/helpers.py b/src/searchengine/nova3/helpers.py index d453f1c4d..f0206e383 100644 --- a/src/searchengine/nova3/helpers.py +++ b/src/searchengine/nova3/helpers.py @@ -1,4 +1,4 @@ -#VERSION: 1.45 +#VERSION: 1.47 # Author: # Christophe DUMEZ (chris@qbittorrent.org) @@ -39,9 +39,11 @@ import tempfile import urllib.error import urllib.parse import urllib.request +from collections.abc import Mapping +from typing import Any, Dict, Optional -def getBrowserUserAgent(): +def getBrowserUserAgent() -> str: """ Disguise as browser to circumvent website blocking """ # Firefox release calendar @@ -57,7 +59,7 @@ def getBrowserUserAgent(): return f"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:{nowVersion}.0) Gecko/20100101 Firefox/{nowVersion}.0" -headers = {'User-Agent': getBrowserUserAgent()} +headers: Dict[str, Any] = {'User-Agent': getBrowserUserAgent()} # SOCKS5 Proxy support if "sock_proxy" in os.environ and len(os.environ["sock_proxy"].strip()) > 0: @@ -67,13 +69,13 @@ if "sock_proxy" in os.environ and len(os.environ["sock_proxy"].strip()) > 0: if m is not None: socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, m.group('host'), int(m.group('port')), True, m.group('username'), m.group('password')) - socket.socket = socks.socksocket + socket.socket = socks.socksocket # type: ignore[misc] -def htmlentitydecode(s): +def htmlentitydecode(s: str) -> str: # First convert alpha entities (such as é) # (Inspired from http://mail.python.org/pipermail/python-list/2007-June/443813.html) - def entity2char(m): + def entity2char(m: re.Match[str]) -> str: entity = m.group(1) if entity in html.entities.name2codepoint: return chr(html.entities.name2codepoint[entity]) @@ -87,15 +89,15 @@ def htmlentitydecode(s): return re.sub(r'&#x(\w+);', lambda x: chr(int(x.group(1), 16)), t) -def retrieve_url(url): +def retrieve_url(url: str, custom_headers: Mapping[str, Any] = {}) -> str: """ Return the content of the url page as a string """ - req = urllib.request.Request(url, headers=headers) + req = urllib.request.Request(url, headers={**headers, **custom_headers}) try: response = urllib.request.urlopen(req) except urllib.error.URLError as errno: print(" ".join(("Connection error:", str(errno.reason)))) return "" - dat = response.read() + dat: bytes = response.read() # Check if it is gzipped if dat[:2] == b'\x1f\x8b': # Data is gzip encoded, decode it @@ -109,16 +111,15 @@ def retrieve_url(url): ignore, charset = info['Content-Type'].split('charset=') except Exception: pass - dat = dat.decode(charset, 'replace') - dat = htmlentitydecode(dat) - # return dat.encode('utf-8', 'replace') - return dat + datStr = dat.decode(charset, 'replace') + datStr = htmlentitydecode(datStr) + return datStr -def download_file(url, referer=None): +def download_file(url: str, referer: Optional[str] = None) -> str: """ Download file at url and write it to a file, return the path to the file and the url """ - file, path = tempfile.mkstemp() - file = os.fdopen(file, "wb") + fileHandle, path = tempfile.mkstemp() + file = os.fdopen(fileHandle, "wb") # Download url req = urllib.request.Request(url, headers=headers) if referer is not None: diff --git a/src/searchengine/nova3/nova2.py b/src/searchengine/nova3/nova2.py index 2c5963beb..9db438b96 100644 --- a/src/searchengine/nova3/nova2.py +++ b/src/searchengine/nova3/nova2.py @@ -1,4 +1,4 @@ -#VERSION: 1.45 +#VERSION: 1.46 # Author: # Fabien Devaux @@ -37,17 +37,21 @@ import importlib import pathlib import sys import urllib.parse +from collections.abc import Iterable, Iterator, Sequence +from enum import Enum from glob import glob from multiprocessing import Pool, cpu_count from os import path +from typing import Dict, List, Optional, Set, Tuple, Type -THREADED = True +THREADED: bool = True try: - MAX_THREADS = cpu_count() + MAX_THREADS: int = cpu_count() except NotImplementedError: MAX_THREADS = 1 -CATEGORIES = {'all', 'movies', 'tv', 'music', 'games', 'anime', 'software', 'pictures', 'books'} +Category = Enum('Category', ['all', 'movies', 'tv', 'music', 'games', 'anime', 'software', 'pictures', 'books']) + ################################################################################ # Every engine should have a "search" method taking @@ -58,11 +62,29 @@ CATEGORIES = {'all', 'movies', 'tv', 'music', 'games', 'anime', 'software', 'pic ################################################################################ +EngineName = str + + +class Engine: + url: str + name: EngineName + supported_categories: Dict[str, str] + + def __init__(self) -> None: + pass + + def search(self, what: str, cat: str = Category.all.name) -> None: + pass + + def download_torrent(self, info: str) -> None: + pass + + # global state -engine_dict = dict() +engine_dict: Dict[EngineName, Optional[Type[Engine]]] = {} -def list_engines(): +def list_engines() -> List[EngineName]: """ List all engines, including broken engines that fail on import @@ -81,10 +103,10 @@ def list_engines(): return found_engines -def get_engine(engine_name): - #global engine_dict +def get_engine(engine_name: EngineName) -> Optional[Type[Engine]]: if engine_name in engine_dict: return engine_dict[engine_name] + # when import fails, engine is None engine = None try: @@ -97,35 +119,37 @@ def get_engine(engine_name): return engine -def initialize_engines(found_engines): +def initialize_engines(found_engines: Iterable[EngineName]) -> Set[EngineName]: """ Import available engines - Return list of available engines + Return set of available engines """ - supported_engines = [] + supported_engines = set() for engine_name in found_engines: # import engine engine = get_engine(engine_name) if engine is None: continue - supported_engines.append(engine_name) + supported_engines.add(engine_name) return supported_engines -def engines_to_xml(supported_engines): +def engines_to_xml(supported_engines: Iterable[EngineName]) -> Iterator[str]: """ Generates xml for supported engines """ tab = " " * 4 for engine_name in supported_engines: search_engine = get_engine(engine_name) + if search_engine is None: + continue supported_categories = "" if hasattr(search_engine, "supported_categories"): supported_categories = " ".join((key for key in search_engine.supported_categories.keys() - if key != "all")) + if key != Category.all.name)) yield "".join((tab, "<", engine_name, ">\n", tab, tab, "", search_engine.name, "\n", @@ -134,7 +158,7 @@ def engines_to_xml(supported_engines): tab, "\n")) -def displayCapabilities(supported_engines): +def displayCapabilities(supported_engines: Iterable[EngineName]) -> None: """ Display capabilities in XML format @@ -151,21 +175,24 @@ def displayCapabilities(supported_engines): print(xml) -def run_search(engine_list): +def run_search(engine_list: Tuple[Optional[Type[Engine]], str, Category]) -> bool: """ Run search in engine - @param engine_list List with engine, query and category + @param engine_list Tuple with engine, query and category @retval False if any exceptions occurred @retval True otherwise """ - engine, what, cat = engine_list + engine_class, what, cat = engine_list + if engine_class is None: + return False + try: - engine = engine() + engine = engine_class() # avoid exceptions due to invalid category if hasattr(engine, 'supported_categories'): - if cat in engine.supported_categories: - engine.search(what, cat) + if cat.name in engine.supported_categories: + engine.search(what, cat.name) else: engine.search(what) @@ -174,7 +201,7 @@ def run_search(engine_list): return False -def main(args): +def main(args: Sequence[str]) -> None: # qbt tend to run this script in 'isolate mode' so append the current path manually current_path = str(pathlib.Path(__file__).parent.resolve()) if current_path not in sys.path: @@ -182,7 +209,7 @@ def main(args): found_engines = list_engines() - def show_usage(): + def show_usage() -> None: print("./nova2.py all|engine1[,engine2]* ", file=sys.stderr) print("found engines: " + ','.join(found_engines), file=sys.stderr) print("to list available engines: ./nova2.py --capabilities [--names]", file=sys.stderr) @@ -190,7 +217,6 @@ def main(args): if not args: show_usage() sys.exit(1) - elif args[0] == "--capabilities": supported_engines = initialize_engines(found_engines) if "--names" in args: @@ -198,14 +224,14 @@ def main(args): return displayCapabilities(supported_engines) return - elif len(args) < 3: show_usage() sys.exit(1) cat = args[1].lower() - - if cat not in CATEGORIES: + try: + category = Category[cat] + except KeyError: print(" - ".join(('Invalid category', cat)), file=sys.stderr) sys.exit(1) @@ -223,16 +249,18 @@ def main(args): engines_list = initialize_engines(found_engines) else: # discard not-found engines - engines_list = [engine for engine in engines_list if engine in found_engines] + engines_list = {engine for engine in engines_list if engine in found_engines} what = urllib.parse.quote(' '.join(args[2:])) + params = ((get_engine(engine_name), what, category) for engine_name in engines_list) + if THREADED: # child process spawning is controlled min(number of searches, number of cpu) with Pool(min(len(engines_list), MAX_THREADS)) as pool: - pool.map(run_search, ([get_engine(engine_name), what, cat] for engine_name in engines_list)) + pool.map(run_search, params) else: # py3 note: map is needed to be evaluated for content to be executed - all(map(run_search, ([get_engine(engine_name), what, cat] for engine_name in engines_list))) + all(map(run_search, params)) if __name__ == "__main__": diff --git a/src/searchengine/nova3/novaprinter.py b/src/searchengine/nova3/novaprinter.py index 80f73aae3..f4c9dcbb0 100644 --- a/src/searchengine/nova3/novaprinter.py +++ b/src/searchengine/nova3/novaprinter.py @@ -1,4 +1,4 @@ -#VERSION: 1.48 +#VERSION: 1.50 # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -24,8 +24,25 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +import re +from collections.abc import Mapping +from typing import Any, Union -def prettyPrinter(dictionary): +# TODO: enable the following when using Python >= 3.8 +#SearchResults = TypedDict('SearchResults', { +# 'link': str, +# 'name': str, +# 'size': Union[float, int, str], +# 'seeds': int, +# 'leech': int, +# 'engine_url': str, +# 'desc_link': str, # Optional # TODO: use `NotRequired[str]` when using Python >= 3.11 +# 'pub_date': int # Optional # TODO: use `NotRequired[int]` when using Python >= 3.11 +#}) +SearchResults = Mapping[str, Any] + + +def prettyPrinter(dictionary: SearchResults) -> None: outtext = "|".join(( dictionary["link"], dictionary["name"].replace("|", " "), @@ -34,7 +51,7 @@ def prettyPrinter(dictionary): str(dictionary["leech"]), dictionary["engine_url"], dictionary.get("desc_link", ""), # Optional - str(dictionary.get("pub_date", -1)), # Optional + str(dictionary.get("pub_date", -1)) # Optional )) # fd 1 is stdout @@ -42,30 +59,32 @@ def prettyPrinter(dictionary): print(outtext, file=utf8stdout) -def anySizeToBytes(size_string): +sizeUnitRegex: re.Pattern[str] = re.compile(r"^(?P\d*\.?\d+) *(?P[a-z]+)?", re.IGNORECASE) + + +def anySizeToBytes(size_string: Union[float, int, str]) -> int: """ Convert a string like '1 KB' to '1024' (bytes) - """ - # separate integer from unit - try: - size, unit = size_string.split() - except Exception: - try: - size = size_string.strip() - unit = ''.join([c for c in size if c.isalpha()]) - if len(unit) > 0: - size = size[:-len(unit)] - except Exception: - return -1 - if len(size) == 0: - return -1 - size = float(size) - if len(unit) == 0: - return int(size) - short_unit = unit.upper()[0] - # convert - units_dict = {'T': 40, 'G': 30, 'M': 20, 'K': 10} - if short_unit in units_dict: - size = size * 2**units_dict[short_unit] - return int(size) + The canonical type for `size_string` is `str`. However numeric types are also accepted in order to + accommodate poorly written plugins. + """ + + if isinstance(size_string, int): + return size_string + if isinstance(size_string, float): + return round(size_string) + + match = sizeUnitRegex.match(size_string.strip()) + if match is None: + return -1 + + size = float(match.group('size')) # need to match decimals + unit = match.group('unit') + + if unit is not None: + units_exponents = {'T': 40, 'G': 30, 'M': 20, 'K': 10} + exponent = units_exponents.get(unit[0].upper(), 0) + size *= 2**exponent + + return round(size) diff --git a/src/webui/api/appcontroller.cpp b/src/webui/api/appcontroller.cpp index 7a6fa4547..2d216ff92 100644 --- a/src/webui/api/appcontroller.cpp +++ b/src/webui/api/appcontroller.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -135,7 +136,7 @@ void AppController::preferencesAction() data[u"file_log_age"_s] = app()->fileLoggerAge(); data[u"file_log_age_type"_s] = app()->fileLoggerAgeType(); // Delete torrent contents files on torrent removal - data[u"delete_torrent_content_files"_s] = pref->deleteTorrentFilesAsDefault(); + data[u"delete_torrent_content_files"_s] = pref->removeTorrentContent(); // Downloads // When adding a torrent @@ -349,6 +350,8 @@ void AppController::preferencesAction() // qBitorrent preferences // Resume data storage type data[u"resume_data_storage_type"_s] = Utils::String::fromEnum(session->resumeDataStorageType()); + // Torrent content removing mode + data[u"torrent_content_remove_option"_s] = Utils::String::fromEnum(session->torrentContentRemoveOption()); // Physical memory (RAM) usage limit data[u"memory_working_set_limit"_s] = app()->memoryWorkingSetLimit(); // Current network interface @@ -518,7 +521,7 @@ void AppController::setPreferencesAction() app()->setFileLoggerAgeType(it.value().toInt()); // Delete torrent content files on torrent removal if (hasKey(u"delete_torrent_content_files"_s)) - pref->setDeleteTorrentFilesAsDefault(it.value().toBool()); + pref->setRemoveTorrentContent(it.value().toBool()); // Downloads // When adding a torrent @@ -930,6 +933,9 @@ void AppController::setPreferencesAction() // Resume data storage type if (hasKey(u"resume_data_storage_type"_s)) session->setResumeDataStorageType(Utils::String::toEnum(it.value().toString(), BitTorrent::ResumeDataStorageType::Legacy)); + // Torrent content removing mode + if (hasKey(u"torrent_content_remove_option"_s)) + session->setTorrentContentRemoveOption(Utils::String::toEnum(it.value().toString(), BitTorrent::TorrentContentRemoveOption::MoveToTrash)); // Physical memory (RAM) usage limit if (hasKey(u"memory_working_set_limit"_s)) app()->setMemoryWorkingSetLimit(it.value().toInt()); @@ -1159,8 +1165,11 @@ void AppController::getDirectoryContentAction() throw APIError(APIErrorType::BadParams, tr("Invalid mode, allowed values: %1").arg(u"all, dirs, files"_s)); }; - const QStringList dirs = dir.entryList(QDir::NoDotAndDotDot | parseDirectoryContentMode(visibility)); - setResult(QJsonArray::fromStringList(dirs)); + QJsonArray ret; + QDirIterator it {dirPath, (QDir::NoDotAndDotDot | parseDirectoryContentMode(visibility))}; + while (it.hasNext()) + ret.append(it.next()); + setResult(ret); } void AppController::networkInterfaceListAction() diff --git a/src/webui/api/serialize/serialize_torrent.cpp b/src/webui/api/serialize/serialize_torrent.cpp index 8883f4b82..d48a3a5c8 100644 --- a/src/webui/api/serialize/serialize_torrent.cpp +++ b/src/webui/api/serialize/serialize_torrent.cpp @@ -135,6 +135,7 @@ QVariantMap serialize(const BitTorrent::Torrent &torrent) {KEY_TORRENT_SAVE_PATH, torrent.savePath().toString()}, {KEY_TORRENT_DOWNLOAD_PATH, torrent.downloadPath().toString()}, {KEY_TORRENT_CONTENT_PATH, torrent.contentPath().toString()}, + {KEY_TORRENT_ROOT_PATH, torrent.rootPath().toString()}, {KEY_TORRENT_ADDED_ON, Utils::DateTime::toSecsSinceEpoch(torrent.addedTime())}, {KEY_TORRENT_COMPLETION_ON, Utils::DateTime::toSecsSinceEpoch(torrent.completedTime())}, {KEY_TORRENT_TRACKER, torrent.currentTracker()}, @@ -163,8 +164,8 @@ QVariantMap serialize(const BitTorrent::Torrent &torrent) {KEY_TORRENT_AVAILABILITY, torrent.distributedCopies()}, {KEY_TORRENT_REANNOUNCE, torrent.nextAnnounce()}, {KEY_TORRENT_COMMENT, torrent.comment()}, - {KEY_TORRENT_ISPRIVATE, torrent.isPrivate()}, - - {KEY_TORRENT_TOTAL_SIZE, torrent.totalSize()} + {KEY_TORRENT_PRIVATE, (torrent.hasMetadata() ? torrent.isPrivate() : QVariant())}, + {KEY_TORRENT_TOTAL_SIZE, torrent.totalSize()}, + {KEY_TORRENT_HAS_METADATA, torrent.hasMetadata()} }; } diff --git a/src/webui/api/serialize/serialize_torrent.h b/src/webui/api/serialize/serialize_torrent.h index ee9d20ab7..883efa6dd 100644 --- a/src/webui/api/serialize/serialize_torrent.h +++ b/src/webui/api/serialize/serialize_torrent.h @@ -66,6 +66,7 @@ inline const QString KEY_TORRENT_FORCE_START = u"force_start"_s; inline const QString KEY_TORRENT_SAVE_PATH = u"save_path"_s; inline const QString KEY_TORRENT_DOWNLOAD_PATH = u"download_path"_s; inline const QString KEY_TORRENT_CONTENT_PATH = u"content_path"_s; +inline const QString KEY_TORRENT_ROOT_PATH = u"root_path"_s; inline const QString KEY_TORRENT_ADDED_ON = u"added_on"_s; inline const QString KEY_TORRENT_COMPLETION_ON = u"completion_on"_s; inline const QString KEY_TORRENT_TRACKER = u"tracker"_s; @@ -93,6 +94,7 @@ inline const QString KEY_TORRENT_SEEDING_TIME = u"seeding_time"_s; inline const QString KEY_TORRENT_AVAILABILITY = u"availability"_s; inline const QString KEY_TORRENT_REANNOUNCE = u"reannounce"_s; inline const QString KEY_TORRENT_COMMENT = u"comment"_s; -inline const QString KEY_TORRENT_ISPRIVATE = u"is_private"_s; +inline const QString KEY_TORRENT_PRIVATE = u"private"_s; +inline const QString KEY_TORRENT_HAS_METADATA = u"has_metadata"_s; QVariantMap serialize(const BitTorrent::Torrent &torrent); diff --git a/src/webui/api/synccontroller.cpp b/src/webui/api/synccontroller.cpp index 99330ed59..dd883132a 100644 --- a/src/webui/api/synccontroller.cpp +++ b/src/webui/api/synccontroller.cpp @@ -222,6 +222,7 @@ namespace case QMetaType::UInt: case QMetaType::QDateTime: case QMetaType::Nullptr: + case QMetaType::UnknownType: if (prevData[key] != value) syncData[key] = value; break; diff --git a/src/webui/api/torrentscontroller.cpp b/src/webui/api/torrentscontroller.cpp index 2d40d3645..74272921b 100644 --- a/src/webui/api/torrentscontroller.cpp +++ b/src/webui/api/torrentscontroller.cpp @@ -111,10 +111,13 @@ const QString KEY_PROP_CREATION_DATE = u"creation_date"_s; const QString KEY_PROP_SAVE_PATH = u"save_path"_s; const QString KEY_PROP_DOWNLOAD_PATH = u"download_path"_s; const QString KEY_PROP_COMMENT = u"comment"_s; -const QString KEY_PROP_ISPRIVATE = u"is_private"_s; +const QString KEY_PROP_IS_PRIVATE = u"is_private"_s; // deprecated, "private" should be used instead +const QString KEY_PROP_PRIVATE = u"private"_s; const QString KEY_PROP_SSL_CERTIFICATE = u"ssl_certificate"_s; const QString KEY_PROP_SSL_PRIVATEKEY = u"ssl_private_key"_s; const QString KEY_PROP_SSL_DHPARAMS = u"ssl_dh_params"_s; +const QString KEY_PROP_HAS_METADATA = u"has_metadata"_s; + // File keys const QString KEY_FILE_INDEX = u"index"_s; @@ -282,6 +285,7 @@ void TorrentsController::countAction() // - category (string): torrent category for filtering by it (empty string means "uncategorized"; no "category" param presented means "any category") // - tag (string): torrent tag for filtering by it (empty string means "untagged"; no "tag" param presented means "any tag") // - hashes (string): filter by hashes, can contain multiple hashes separated by | +// - private (bool): filter torrents that are from private trackers (true) or not (false). Empty means any torrent (no filtering) // - sort (string): name of column for sorting by its value // - reverse (bool): enable reverse sorting // - limit (int): set limit number of torrents returned (if greater than 0, otherwise - unlimited) @@ -296,6 +300,7 @@ void TorrentsController::infoAction() int limit {params()[u"limit"_s].toInt()}; int offset {params()[u"offset"_s].toInt()}; const QStringList hashes {params()[u"hashes"_s].split(u'|', Qt::SkipEmptyParts)}; + const std::optional isPrivate = parseBool(params()[u"private"_s]); std::optional idSet; if (!hashes.isEmpty()) @@ -305,7 +310,7 @@ void TorrentsController::infoAction() idSet->insert(BitTorrent::TorrentID::fromString(hash)); } - const TorrentFilter torrentFilter {filter, idSet, category, tag}; + const TorrentFilter torrentFilter {filter, idSet, category, tag, isPrivate}; QVariantList torrentList; for (const BitTorrent::Torrent *torrent : asConst(BitTorrent::Session::instance()->torrents())) { @@ -435,6 +440,8 @@ void TorrentsController::propertiesAction() const int uploadLimit = torrent->uploadLimit(); const qreal ratio = torrent->realRatio(); const qreal popularity = torrent->popularity(); + const bool hasMetadata = torrent->hasMetadata(); + const bool isPrivate = torrent->isPrivate(); const QJsonObject ret { @@ -470,14 +477,16 @@ void TorrentsController::propertiesAction() {KEY_PROP_PIECE_SIZE, torrent->pieceLength()}, {KEY_PROP_PIECES_HAVE, torrent->piecesHave()}, {KEY_PROP_CREATED_BY, torrent->creator()}, - {KEY_PROP_ISPRIVATE, torrent->isPrivate()}, + {KEY_PROP_IS_PRIVATE, torrent->isPrivate()}, // used for maintaining backward compatibility + {KEY_PROP_PRIVATE, (hasMetadata ? isPrivate : QJsonValue())}, {KEY_PROP_ADDITION_DATE, Utils::DateTime::toSecsSinceEpoch(torrent->addedTime())}, {KEY_PROP_LAST_SEEN, Utils::DateTime::toSecsSinceEpoch(torrent->lastSeenComplete())}, {KEY_PROP_COMPLETION_DATE, Utils::DateTime::toSecsSinceEpoch(torrent->completedTime())}, {KEY_PROP_CREATION_DATE, Utils::DateTime::toSecsSinceEpoch(torrent->creationDate())}, {KEY_PROP_SAVE_PATH, torrent->savePath().toString()}, {KEY_PROP_DOWNLOAD_PATH, torrent->downloadPath().toString()}, - {KEY_PROP_COMMENT, torrent->comment()} + {KEY_PROP_COMMENT, torrent->comment()}, + {KEY_PROP_HAS_METADATA, torrent->hasMetadata()} }; setResult(ret); @@ -1092,11 +1101,11 @@ void TorrentsController::deleteAction() requireParams({u"hashes"_s, u"deleteFiles"_s}); const QStringList hashes {params()[u"hashes"_s].split(u'|')}; - const DeleteOption deleteOption = parseBool(params()[u"deleteFiles"_s]).value_or(false) - ? DeleteTorrentAndFiles : DeleteTorrent; + const BitTorrent::TorrentRemoveOption deleteOption = parseBool(params()[u"deleteFiles"_s]).value_or(false) + ? BitTorrent::TorrentRemoveOption::RemoveContent : BitTorrent::TorrentRemoveOption::KeepContent; applyToTorrents(hashes, [deleteOption](const BitTorrent::Torrent *torrent) { - BitTorrent::Session::instance()->deleteTorrent(torrent->id(), deleteOption); + BitTorrent::Session::instance()->removeTorrent(torrent->id(), deleteOption); }); } diff --git a/src/webui/webapplication.cpp b/src/webui/webapplication.cpp index 1394e1e46..220767ff7 100644 --- a/src/webui/webapplication.cpp +++ b/src/webui/webapplication.cpp @@ -533,15 +533,12 @@ void WebApplication::sendFile(const Path &path) const QDateTime lastModified = Utils::Fs::lastModified(path); // find translated file in cache - if (!m_isAltUIUsed) + if (const auto it = m_translatedFiles.constFind(path); + (it != m_translatedFiles.constEnd()) && (lastModified <= it->lastModified)) { - if (const auto it = m_translatedFiles.constFind(path); - (it != m_translatedFiles.constEnd()) && (lastModified <= it->lastModified)) - { - print(it->data, it->mimeType); - setHeader({Http::HEADER_CACHE_CONTROL, getCachingInterval(it->mimeType)}); - return; - } + print(it->data, it->mimeType); + setHeader({Http::HEADER_CACHE_CONTROL, getCachingInterval(it->mimeType)}); + return; } const auto readResult = Utils::IO::readFile(path, MAX_ALLOWED_FILESIZE); @@ -572,7 +569,7 @@ void WebApplication::sendFile(const Path &path) QByteArray data = readResult.value(); const QMimeType mimeType = QMimeDatabase().mimeTypeForFileNameAndData(path.data(), data); - const bool isTranslatable = !m_isAltUIUsed && mimeType.inherits(u"text/plain"_s); + const bool isTranslatable = mimeType.inherits(u"text/plain"_s); if (isTranslatable) { @@ -740,16 +737,15 @@ void WebApplication::sessionStart() connect(m_freeDiskSpaceChecker, &FreeDiskSpaceChecker::checked, syncController, &SyncController::updateFreeDiskSpace); m_currentSession->registerAPIController(u"sync"_s, syncController); - QNetworkCookie cookie {m_sessionCookieName.toLatin1(), m_currentSession->id().toUtf8()}; + QNetworkCookie cookie {m_sessionCookieName.toLatin1(), m_currentSession->id().toLatin1()}; cookie.setHttpOnly(true); cookie.setSecure(m_isSecureCookieEnabled && m_isHttpsEnabled); cookie.setPath(u"/"_s); - QByteArray cookieRawForm = cookie.toRawForm(); if (m_isCSRFProtectionEnabled) - cookieRawForm.append("; SameSite=Strict"); + cookie.setSameSitePolicy(QNetworkCookie::SameSite::Strict); else if (cookie.isSecure()) - cookieRawForm.append("; SameSite=None"); - setHeader({Http::HEADER_SET_COOKIE, QString::fromLatin1(cookieRawForm)}); + cookie.setSameSitePolicy(QNetworkCookie::SameSite::None); + setHeader({Http::HEADER_SET_COOKIE, QString::fromLatin1(cookie.toRawForm())}); } void WebApplication::sessionEnd() diff --git a/src/webui/webapplication.h b/src/webui/webapplication.h index b14ce770f..16b1f2950 100644 --- a/src/webui/webapplication.h +++ b/src/webui/webapplication.h @@ -54,7 +54,7 @@ #include "base/utils/version.h" #include "api/isessionmanager.h" -inline const Utils::Version<3, 2> API_VERSION {2, 11, 0}; +inline const Utils::Version<3, 2> API_VERSION {2, 11, 2}; class QTimer; diff --git a/src/webui/www/eslint.config.mjs b/src/webui/www/eslint.config.mjs index ba6f91a0d..e77e7d422 100644 --- a/src/webui/www/eslint.config.mjs +++ b/src/webui/www/eslint.config.mjs @@ -1,8 +1,8 @@ -import Globals from 'globals'; -import Html from 'eslint-plugin-html'; -import Js from '@eslint/js'; -import Stylistic from '@stylistic/eslint-plugin'; -import * as RegexpPlugin from 'eslint-plugin-regexp'; +import Globals from "globals"; +import Html from "eslint-plugin-html"; +import Js from "@eslint/js"; +import Stylistic from "@stylistic/eslint-plugin"; +import * as RegexpPlugin from "eslint-plugin-regexp"; export default [ Js.configs.recommended, @@ -26,9 +26,16 @@ export default [ Stylistic }, rules: { + "curly": ["error", "multi-or-nest", "consistent"], "eqeqeq": "error", + "guard-for-in": "error", "no-undef": "off", "no-unused-vars": "off", + "no-var": "error", + "operator-assignment": "error", + "prefer-arrow-callback": "error", + "prefer-const": "error", + "radix": "error", "Stylistic/no-mixed-operators": [ "error", { @@ -38,7 +45,16 @@ export default [ } ], "Stylistic/nonblock-statement-body-position": ["error", "below"], - "Stylistic/semi": "error" + "Stylistic/quotes": [ + "error", + "double", + { + "avoidEscape": true, + "allowTemplateLiterals": true + } + ], + "Stylistic/semi": "error", + "Stylistic/spaced-comment": ["error", "always", { "exceptions": ["*"] }] } } ]; diff --git a/src/webui/www/package.json b/src/webui/www/package.json index 975a90014..bad08c881 100644 --- a/src/webui/www/package.json +++ b/src/webui/www/package.json @@ -6,9 +6,8 @@ "url": "https://github.com/qbittorrent/qBittorrent.git" }, "scripts": { - "extract_translation": "i18next -c public/i18next-parser.config.mjs public/index.html public/scripts/login.js", - "format": "js-beautify -r private/*.html private/scripts/*.js private/views/*.html public/*.html public/scripts/*.js && prettier --write **.css", - "lint": "eslint private/*.html private/scripts/*.js private/views/*.html public/*.html public/scripts/*.js && stylelint **/*.css && html-validate private public" + "format": "js-beautify -r *.mjs private/*.html private/scripts/*.js private/views/*.html public/*.html public/scripts/*.js && prettier --write **.css", + "lint": "eslint *.mjs private/*.html private/scripts/*.js private/views/*.html public/*.html public/scripts/*.js && stylelint **/*.css && html-validate private public" }, "devDependencies": { "@stylistic/eslint-plugin": "*", @@ -16,7 +15,6 @@ "eslint-plugin-html": "*", "eslint-plugin-regexp": "*", "html-validate": "*", - "i18next-parser": "*", "js-beautify": "*", "prettier": "*", "stylelint": "*", diff --git a/src/webui/www/private/addpeers.html b/src/webui/www/private/addpeers.html index a86673d14..b9be98ff1 100644 --- a/src/webui/www/private/addpeers.html +++ b/src/webui/www/private/addpeers.html @@ -8,42 +8,42 @@ diff --git a/src/webui/www/private/edittracker.html b/src/webui/www/private/edittracker.html index feb5f5766..8df7c5e9d 100644 --- a/src/webui/www/private/edittracker.html +++ b/src/webui/www/private/edittracker.html @@ -8,44 +8,44 @@ diff --git a/src/webui/www/private/upload.html b/src/webui/www/private/upload.html index ccdbc1124..3d2ee024b 100644 --- a/src/webui/www/private/upload.html +++ b/src/webui/www/private/upload.html @@ -150,28 +150,27 @@
diff --git a/src/webui/www/private/uploadlimit.html b/src/webui/www/private/uploadlimit.html index 87d0db7b6..ef3b2731b 100644 --- a/src/webui/www/private/uploadlimit.html +++ b/src/webui/www/private/uploadlimit.html @@ -25,17 +25,17 @@ diff --git a/src/webui/www/private/views/about.html b/src/webui/www/private/views/about.html index 450a0a46e..e566106a8 100644 --- a/src/webui/www/private/views/about.html +++ b/src/webui/www/private/views/about.html @@ -841,18 +841,18 @@ diff --git a/src/webui/www/private/views/aboutToolbar.html b/src/webui/www/private/views/aboutToolbar.html index 3d9afd0e6..771645098 100644 --- a/src/webui/www/private/views/aboutToolbar.html +++ b/src/webui/www/private/views/aboutToolbar.html @@ -11,39 +11,39 @@ diff --git a/src/webui/www/private/views/filters.html b/src/webui/www/private/views/filters.html index 9b65dfa40..cf73c2ba3 100644 --- a/src/webui/www/private/views/filters.html +++ b/src/webui/www/private/views/filters.html @@ -42,11 +42,10 @@ diff --git a/src/webui/www/private/views/properties.html b/src/webui/www/private/views/properties.html index 473221ed1..b42c8d19f 100644 --- a/src/webui/www/private/views/properties.html +++ b/src/webui/www/private/views/properties.html @@ -74,6 +74,10 @@ QBT_TR(Created On:)QBT_TR[CONTEXT=PropertiesWidget] + + QBT_TR(Private:)QBT_TR[CONTEXT=PropertiesWidget] + + QBT_TR(Info Hash v1:)QBT_TR[CONTEXT=PropertiesWidget] @@ -168,10 +172,10 @@ diff --git a/src/webui/www/private/views/searchplugins.html b/src/webui/www/private/views/searchplugins.html index 4e18d4923..e913ff670 100644 --- a/src/webui/www/private/views/searchplugins.html +++ b/src/webui/www/private/views/searchplugins.html @@ -77,11 +77,10 @@ - +
-

qBittorrent WebUI

+

qBittorrent QBT_TR(WebUI)QBT_TR[CONTEXT=OptionsDialog]

-
+
-
+
- +
diff --git a/src/webui/www/public/lang/ar.json b/src/webui/www/public/lang/ar.json deleted file mode 100644 index 3a03d4368..000000000 --- a/src/webui/www/public/lang/ar.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "اسم المستخدم أو كلمة السر غير صالحة.", - "Login": "ولوج", - "Password": "كلمة السر", - "Unable to log in, server is probably unreachable.": "", - "Username": "اسم المستخدم" -} diff --git a/src/webui/www/public/lang/az@latin.json b/src/webui/www/public/lang/az@latin.json deleted file mode 100644 index e60a5f89e..000000000 --- a/src/webui/www/public/lang/az@latin.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "İstifadəçi adı və Şifrə səhvdir.", - "Login": "Giriş", - "Password": "Şifrə", - "Unable to log in, server is probably unreachable.": "", - "Username": "İstifadəçi adı" -} diff --git a/src/webui/www/public/lang/be.json b/src/webui/www/public/lang/be.json deleted file mode 100644 index e07c49169..000000000 --- a/src/webui/www/public/lang/be.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Нядзейсныя імя карыстальніка ці пароль.", - "Login": "Логін", - "Password": "Пароль", - "Unable to log in, server is probably unreachable.": "", - "Username": "Імя карыстальніка" -} diff --git a/src/webui/www/public/lang/bg.json b/src/webui/www/public/lang/bg.json deleted file mode 100644 index 75a688ecd..000000000 --- a/src/webui/www/public/lang/bg.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Невалидно потребителско име или парола.", - "Login": "Вход", - "Password": "Парола", - "Unable to log in, server is probably unreachable.": "", - "Username": "Потребителско име" -} diff --git a/src/webui/www/public/lang/ca.json b/src/webui/www/public/lang/ca.json deleted file mode 100644 index a12ff4a52..000000000 --- a/src/webui/www/public/lang/ca.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Nom d'usuari o contrasenya incorrectes.", - "Login": "Inicia sessió", - "Password": "Contrasenya", - "Unable to log in, server is probably unreachable.": "", - "Username": "Nom d'usuari" -} diff --git a/src/webui/www/public/lang/cs.json b/src/webui/www/public/lang/cs.json deleted file mode 100644 index 71d878e31..000000000 --- a/src/webui/www/public/lang/cs.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Neplatné jméno nebo heslo", - "Login": "Přihlášení", - "Password": "Heslo", - "Unable to log in, server is probably unreachable.": "", - "Username": "Uživatelské jméno" -} diff --git a/src/webui/www/public/lang/da.json b/src/webui/www/public/lang/da.json deleted file mode 100644 index c2587bc5a..000000000 --- a/src/webui/www/public/lang/da.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Ugyldigt brugernavn eller adgangskode.", - "Login": "Login", - "Password": "Adgangskode", - "Unable to log in, server is probably unreachable.": "", - "Username": "Brugernavn" -} diff --git a/src/webui/www/public/lang/de.json b/src/webui/www/public/lang/de.json deleted file mode 100644 index bcdfe9764..000000000 --- a/src/webui/www/public/lang/de.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Ungültiger Benutzername oder Passwort.", - "Login": "Anmelden", - "Password": "Passwort", - "Unable to log in, server is probably unreachable.": "", - "Username": "Benutzername" -} diff --git a/src/webui/www/public/lang/el.json b/src/webui/www/public/lang/el.json deleted file mode 100644 index 82d7dc20e..000000000 --- a/src/webui/www/public/lang/el.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Μη έγκυρο Όνομα Χρήστη ή Κωδικός Πρόσβασης.", - "Login": "Σύνδεση", - "Password": "Κωδικός Πρόσβασης", - "Unable to log in, server is probably unreachable.": "", - "Username": "Όνομα χρήστη" -} diff --git a/src/webui/www/public/lang/en.json b/src/webui/www/public/lang/en.json deleted file mode 100644 index 44c903470..000000000 --- a/src/webui/www/public/lang/en.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Invalid Username or Password.", - "Login": "Login", - "Password": "Password", - "Unable to log in, server is probably unreachable.": "Unable to log in, server is probably unreachable.", - "Username": "Username" -} diff --git a/src/webui/www/public/lang/en_AU.json b/src/webui/www/public/lang/en_AU.json deleted file mode 100644 index 83b457bf9..000000000 --- a/src/webui/www/public/lang/en_AU.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Invalid Username or Password.", - "Login": "Login", - "Password": "Password", - "Unable to log in, server is probably unreachable.": "", - "Username": "Username" -} diff --git a/src/webui/www/public/lang/en_GB.json b/src/webui/www/public/lang/en_GB.json deleted file mode 100644 index 850c5bdeb..000000000 --- a/src/webui/www/public/lang/en_GB.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "", - "Login": "Login", - "Password": "", - "Unable to log in, server is probably unreachable.": "", - "Username": "" -} diff --git a/src/webui/www/public/lang/eo.json b/src/webui/www/public/lang/eo.json deleted file mode 100644 index d0861a58f..000000000 --- a/src/webui/www/public/lang/eo.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Malvalida uzantnomo aŭ pasvorto.", - "Login": "Ensaluti", - "Password": "Pasvorto", - "Unable to log in, server is probably unreachable.": "", - "Username": "" -} diff --git a/src/webui/www/public/lang/es.json b/src/webui/www/public/lang/es.json deleted file mode 100644 index e61039301..000000000 --- a/src/webui/www/public/lang/es.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Nombre de usuario o contraseña inválidos.", - "Login": "Iniciar sesión", - "Password": "Contraseña", - "Unable to log in, server is probably unreachable.": "", - "Username": "Nombre de usuario" -} diff --git a/src/webui/www/public/lang/et.json b/src/webui/www/public/lang/et.json deleted file mode 100644 index 8266545ad..000000000 --- a/src/webui/www/public/lang/et.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Sobimatu Kasutajanimi või Parool", - "Login": "Logi sisse", - "Password": "Parool", - "Unable to log in, server is probably unreachable.": "", - "Username": "Kasutajanimi" -} diff --git a/src/webui/www/public/lang/eu.json b/src/webui/www/public/lang/eu.json deleted file mode 100644 index 895c47233..000000000 --- a/src/webui/www/public/lang/eu.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Erabiltzaile-izen edo Sarhitz baliogabea.", - "Login": "Hasi Saioa", - "Password": "Sarhitza", - "Unable to log in, server is probably unreachable.": "", - "Username": "Erabiltzaile-izena" -} diff --git a/src/webui/www/public/lang/fa.json b/src/webui/www/public/lang/fa.json deleted file mode 100644 index c395be6a2..000000000 --- a/src/webui/www/public/lang/fa.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "نام کاربری یا کلمه عبور نامعتبر", - "Login": "ورود", - "Password": "کلمه عبور", - "Unable to log in, server is probably unreachable.": "", - "Username": "نام کاربری" -} diff --git a/src/webui/www/public/lang/fi.json b/src/webui/www/public/lang/fi.json deleted file mode 100644 index 431973769..000000000 --- a/src/webui/www/public/lang/fi.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Virheellinen käyttäjätunnus tai salasana.", - "Login": "Kirjaudu", - "Password": "Salasana", - "Unable to log in, server is probably unreachable.": "", - "Username": "Käyttäjänimi" -} diff --git a/src/webui/www/public/lang/fr.json b/src/webui/www/public/lang/fr.json deleted file mode 100644 index 6e2ae0387..000000000 --- a/src/webui/www/public/lang/fr.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Nom d'utilisateur ou mot de passe invalide.", - "Login": "Se connecter", - "Password": "Mot de passe", - "Unable to log in, server is probably unreachable.": "", - "Username": "Nom d'utilisateur" -} diff --git a/src/webui/www/public/lang/gl.json b/src/webui/www/public/lang/gl.json deleted file mode 100644 index d7ee83910..000000000 --- a/src/webui/www/public/lang/gl.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "O usuario ou o contrasinal son incorrectos.", - "Login": "Iniciar sesión", - "Password": "Contrasinal", - "Unable to log in, server is probably unreachable.": "", - "Username": "Nome do usuario" -} diff --git a/src/webui/www/public/lang/he.json b/src/webui/www/public/lang/he.json deleted file mode 100644 index 33d9e3dd9..000000000 --- a/src/webui/www/public/lang/he.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "שם משתמש או סיסמה בלתי תקפים.", - "Login": "היכנס", - "Password": "סיסמה", - "Unable to log in, server is probably unreachable.": "", - "Username": "שם משתמש" -} diff --git a/src/webui/www/public/lang/hi_IN.json b/src/webui/www/public/lang/hi_IN.json deleted file mode 100644 index f70a3404c..000000000 --- a/src/webui/www/public/lang/hi_IN.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "यूजरनेम व पासवर्ड अमान्य हैं।", - "Login": "लॉगिन", - "Password": "पासवर्ड", - "Unable to log in, server is probably unreachable.": "", - "Username": "यूजरनेम" -} diff --git a/src/webui/www/public/lang/hr.json b/src/webui/www/public/lang/hr.json deleted file mode 100644 index 121265a5d..000000000 --- a/src/webui/www/public/lang/hr.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Neispravno korisničko ime ili lozinka", - "Login": "Prijava", - "Password": "Lozinka", - "Unable to log in, server is probably unreachable.": "", - "Username": "Korisničko ime" -} diff --git a/src/webui/www/public/lang/hu.json b/src/webui/www/public/lang/hu.json deleted file mode 100644 index eb9c1cdcc..000000000 --- a/src/webui/www/public/lang/hu.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Érvénytelen felhasználónév vagy Jelszó.", - "Login": "Bejelentkezés", - "Password": "Jelszó", - "Unable to log in, server is probably unreachable.": "", - "Username": "Felhasználónév" -} diff --git a/src/webui/www/public/lang/hy.json b/src/webui/www/public/lang/hy.json deleted file mode 100644 index fdb153e43..000000000 --- a/src/webui/www/public/lang/hy.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "", - "Login": "Օգտանուն", - "Password": "Գաղտնաբառ", - "Unable to log in, server is probably unreachable.": "", - "Username": "Մուտքանուն" -} diff --git a/src/webui/www/public/lang/id.json b/src/webui/www/public/lang/id.json deleted file mode 100644 index 4616d7d1b..000000000 --- a/src/webui/www/public/lang/id.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Nama Pengguna atau Sandi tidak valid.", - "Login": "Masuk", - "Password": "Sandi", - "Unable to log in, server is probably unreachable.": "", - "Username": "Nama pengguna" -} diff --git a/src/webui/www/public/lang/is.json b/src/webui/www/public/lang/is.json deleted file mode 100644 index 7cb56ca4a..000000000 --- a/src/webui/www/public/lang/is.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Rangt notandanafn eða lykilorð.", - "Login": "Skrá inn", - "Password": "Lykilorð", - "Unable to log in, server is probably unreachable.": "", - "Username": "" -} diff --git a/src/webui/www/public/lang/it.json b/src/webui/www/public/lang/it.json deleted file mode 100644 index 1cfc8e080..000000000 --- a/src/webui/www/public/lang/it.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Username o password errati.", - "Login": "Login", - "Password": "Password", - "Unable to log in, server is probably unreachable.": "", - "Username": "Nome utente" -} diff --git a/src/webui/www/public/lang/ja.json b/src/webui/www/public/lang/ja.json deleted file mode 100644 index c14cee522..000000000 --- a/src/webui/www/public/lang/ja.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "ユーザー名またはパスワーが正しくありません。", - "Login": "ログイン", - "Password": "パスワード", - "Unable to log in, server is probably unreachable.": "", - "Username": "ユーザー名" -} diff --git a/src/webui/www/public/lang/ka.json b/src/webui/www/public/lang/ka.json deleted file mode 100644 index 8ce2e1298..000000000 --- a/src/webui/www/public/lang/ka.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "არასწორი მომხმარებლის სახელი ან პაროლი.", - "Login": "შესვლა", - "Password": "პაროლი", - "Unable to log in, server is probably unreachable.": "", - "Username": "მომხმარებლის სახელი" -} diff --git a/src/webui/www/public/lang/ko.json b/src/webui/www/public/lang/ko.json deleted file mode 100644 index e4a7833e3..000000000 --- a/src/webui/www/public/lang/ko.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "사용자 이름/암호가 올바르지 않습니다.", - "Login": "로그인", - "Password": "암호", - "Unable to log in, server is probably unreachable.": "", - "Username": "사용자 이름" -} diff --git a/src/webui/www/public/lang/lt.json b/src/webui/www/public/lang/lt.json deleted file mode 100644 index 8cbd84aad..000000000 --- a/src/webui/www/public/lang/lt.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Neteisingas naudotojo vardas ar slaptažodis.", - "Login": "Prisijungimas", - "Password": "Slaptažodis", - "Unable to log in, server is probably unreachable.": "", - "Username": "Naudotojo vardas" -} diff --git a/src/webui/www/public/lang/ltg.json b/src/webui/www/public/lang/ltg.json deleted file mode 100644 index 2bfa901ba..000000000 --- a/src/webui/www/public/lang/ltg.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Napareizs slāgvuords voi paroļs", - "Login": "Dasaslāgt", - "Password": "Paroļs", - "Unable to log in, server is probably unreachable.": "", - "Username": "Lītuotuojs" -} diff --git a/src/webui/www/public/lang/lv_LV.json b/src/webui/www/public/lang/lv_LV.json deleted file mode 100644 index dc33f805e..000000000 --- a/src/webui/www/public/lang/lv_LV.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Nederīgs lietotājvārds vai parole.", - "Login": "Pierakstīties", - "Password": "Parole", - "Unable to log in, server is probably unreachable.": "", - "Username": "Lietotājvārds" -} diff --git a/src/webui/www/public/lang/mn_MN.json b/src/webui/www/public/lang/mn_MN.json deleted file mode 100644 index ef7e70724..000000000 --- a/src/webui/www/public/lang/mn_MN.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Хэрэглэгчийн нэр эсвэл нууц үг тохирохгүй байна.", - "Login": "Нэвтрэх", - "Password": "Нууц үг", - "Unable to log in, server is probably unreachable.": "", - "Username": "Хэрэглэгчийн нэр" -} diff --git a/src/webui/www/public/lang/ms_MY.json b/src/webui/www/public/lang/ms_MY.json deleted file mode 100644 index 39ad429d1..000000000 --- a/src/webui/www/public/lang/ms_MY.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Nama Pengguna atau Kata Laluan tidak sah.", - "Login": "Daftar Masuk", - "Password": "Kata Laluan", - "Unable to log in, server is probably unreachable.": "", - "Username": "Nama pengguna" -} diff --git a/src/webui/www/public/lang/nb.json b/src/webui/www/public/lang/nb.json deleted file mode 100644 index c282eb94c..000000000 --- a/src/webui/www/public/lang/nb.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Ugyldig brukernavn eller passord.", - "Login": "Logg inn", - "Password": "Passord", - "Unable to log in, server is probably unreachable.": "", - "Username": "Brukernavn" -} diff --git a/src/webui/www/public/lang/nl.json b/src/webui/www/public/lang/nl.json deleted file mode 100644 index 5ebf2690e..000000000 --- a/src/webui/www/public/lang/nl.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Ongeldige gebruikersnaam of wachtwoord.", - "Login": "Login", - "Password": "Wachtwoord", - "Unable to log in, server is probably unreachable.": "", - "Username": "Gebruikersnaam" -} diff --git a/src/webui/www/public/lang/oc.json b/src/webui/www/public/lang/oc.json deleted file mode 100644 index c1670ee9e..000000000 --- a/src/webui/www/public/lang/oc.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Nom d'utilizaire o senhal invalid.", - "Login": "Identificant", - "Password": "Senhal", - "Unable to log in, server is probably unreachable.": "", - "Username": "" -} diff --git a/src/webui/www/public/lang/pl.json b/src/webui/www/public/lang/pl.json deleted file mode 100644 index ec80ac209..000000000 --- a/src/webui/www/public/lang/pl.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Nieprawidłowa nazwa użytkownika lub hasło.", - "Login": "Login", - "Password": "Hasło", - "Unable to log in, server is probably unreachable.": "", - "Username": "Nazwa użytkownika" -} diff --git a/src/webui/www/public/lang/pt_BR.json b/src/webui/www/public/lang/pt_BR.json deleted file mode 100644 index eccca525f..000000000 --- a/src/webui/www/public/lang/pt_BR.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Nome de usuário ou senha inválidos.", - "Login": "Login", - "Password": "Senha", - "Unable to log in, server is probably unreachable.": "", - "Username": "Nome de usuário" -} diff --git a/src/webui/www/public/lang/pt_PT.json b/src/webui/www/public/lang/pt_PT.json deleted file mode 100644 index 9b4b4e0a7..000000000 --- a/src/webui/www/public/lang/pt_PT.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Palavra-passe ou nome de utilizador inválido.", - "Login": "Iniciar sessão", - "Password": "Palavra-passe", - "Unable to log in, server is probably unreachable.": "", - "Username": "Nome de utilizador" -} diff --git a/src/webui/www/public/lang/ro.json b/src/webui/www/public/lang/ro.json deleted file mode 100644 index d239bf1b0..000000000 --- a/src/webui/www/public/lang/ro.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Numele de utilizator sau parola nu sunt valide.", - "Login": "Autentifică", - "Password": "Parolă", - "Unable to log in, server is probably unreachable.": "", - "Username": "Nume de utilizator" -} diff --git a/src/webui/www/public/lang/ru.json b/src/webui/www/public/lang/ru.json deleted file mode 100644 index 29360817a..000000000 --- a/src/webui/www/public/lang/ru.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Неверное имя пользователя или пароль.", - "Login": "Войти", - "Password": "Пароль", - "Unable to log in, server is probably unreachable.": "", - "Username": "Имя пользователя" -} diff --git a/src/webui/www/public/lang/sk.json b/src/webui/www/public/lang/sk.json deleted file mode 100644 index fff5a1d55..000000000 --- a/src/webui/www/public/lang/sk.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Nesprávne užívateľské meno alebo heslo.", - "Login": "Prihlasovacie meno", - "Password": "Heslo", - "Unable to log in, server is probably unreachable.": "", - "Username": "Meno používateľa" -} diff --git a/src/webui/www/public/lang/sl.json b/src/webui/www/public/lang/sl.json deleted file mode 100644 index fb0a3a00a..000000000 --- a/src/webui/www/public/lang/sl.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Neveljavno uporabniško ime ali geslo.", - "Login": "Prijava", - "Password": "Geslo", - "Unable to log in, server is probably unreachable.": "", - "Username": "Uporabniško ime" -} diff --git a/src/webui/www/public/lang/sr.json b/src/webui/www/public/lang/sr.json deleted file mode 100644 index b97440c5e..000000000 --- a/src/webui/www/public/lang/sr.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Неважеће корисничко име или шифра.", - "Login": "Логовање", - "Password": "Шифра", - "Unable to log in, server is probably unreachable.": "", - "Username": "Корисничко име" -} diff --git a/src/webui/www/public/lang/sv.json b/src/webui/www/public/lang/sv.json deleted file mode 100644 index 826c9860e..000000000 --- a/src/webui/www/public/lang/sv.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Felaktigt användarnamn eller lösenord.", - "Login": "Inloggning", - "Password": "Lösenord", - "Unable to log in, server is probably unreachable.": "", - "Username": "Användarnamn" -} diff --git a/src/webui/www/public/lang/th.json b/src/webui/www/public/lang/th.json deleted file mode 100644 index 50ed9850d..000000000 --- a/src/webui/www/public/lang/th.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง.", - "Login": "ล็อกอิน", - "Password": "รหัสผ่าน", - "Unable to log in, server is probably unreachable.": "", - "Username": "ชื่อผู้ใช้" -} diff --git a/src/webui/www/public/lang/tr.json b/src/webui/www/public/lang/tr.json deleted file mode 100644 index c358fd5d9..000000000 --- a/src/webui/www/public/lang/tr.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Geçersiz Kullanıcı Adı veya Parola.", - "Login": "Oturum Aç", - "Password": "Parola", - "Unable to log in, server is probably unreachable.": "", - "Username": "Kullanıcı adı" -} diff --git a/src/webui/www/public/lang/uk.json b/src/webui/www/public/lang/uk.json deleted file mode 100644 index cc487900b..000000000 --- a/src/webui/www/public/lang/uk.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Неправильний логін або пароль.", - "Login": "Логін", - "Password": "Пароль", - "Unable to log in, server is probably unreachable.": "", - "Username": "Ім'я користувача" -} diff --git a/src/webui/www/public/lang/uz@Latn.json b/src/webui/www/public/lang/uz@Latn.json deleted file mode 100644 index 7f03cdc8d..000000000 --- a/src/webui/www/public/lang/uz@Latn.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Foydalanuvchi ismi yoki parol noto‘g‘ri.", - "Login": "Kirish", - "Password": "Parol", - "Unable to log in, server is probably unreachable.": "", - "Username": "" -} diff --git a/src/webui/www/public/lang/vi.json b/src/webui/www/public/lang/vi.json deleted file mode 100644 index 30f6580f2..000000000 --- a/src/webui/www/public/lang/vi.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "Tên tài khoản hoặc Mật khẩu không hợp lệ", - "Login": "Đăng nhập", - "Password": "Mật khẩu", - "Unable to log in, server is probably unreachable.": "", - "Username": "Tên tài khoản" -} diff --git a/src/webui/www/public/lang/zh_CN.json b/src/webui/www/public/lang/zh_CN.json deleted file mode 100644 index a0fe9ae57..000000000 --- a/src/webui/www/public/lang/zh_CN.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "无效的用户名或密码。", - "Login": "登录", - "Password": "密码", - "Unable to log in, server is probably unreachable.": "", - "Username": "用户名" -} diff --git a/src/webui/www/public/lang/zh_HK.json b/src/webui/www/public/lang/zh_HK.json deleted file mode 100644 index ab03d6962..000000000 --- a/src/webui/www/public/lang/zh_HK.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "無效用戶名稱或密碼。", - "Login": "登入", - "Password": "密碼", - "Unable to log in, server is probably unreachable.": "", - "Username": "用戶名" -} diff --git a/src/webui/www/public/lang/zh_TW.json b/src/webui/www/public/lang/zh_TW.json deleted file mode 100644 index 44046933b..000000000 --- a/src/webui/www/public/lang/zh_TW.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Invalid Username or Password.": "無效的使用者名稱或密碼。", - "Login": "登入", - "Password": "密碼", - "Unable to log in, server is probably unreachable.": "", - "Username": "使用者名稱" -} diff --git a/src/webui/www/public/scripts/lib/i18next.min.js b/src/webui/www/public/scripts/lib/i18next.min.js deleted file mode 100644 index 95aef8eed..000000000 --- a/src/webui/www/public/scripts/lib/i18next.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).i18next=e()}(this,(function(){"use strict";const t={type:"logger",log(t){this.output("log",t)},warn(t){this.output("warn",t)},error(t){this.output("error",t)},output(t,e){console&&console[t]&&console[t].apply(console,e)}};class e{constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.init(t,e)}init(e){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.prefix=s.prefix||"i18next:",this.logger=e||t,this.options=s,this.debug=s.debug}log(){for(var t=arguments.length,e=new Array(t),s=0;s{this.observers[t]||(this.observers[t]=new Map);const s=this.observers[t].get(e)||0;this.observers[t].set(e,s+1)})),this}off(t,e){this.observers[t]&&(e?this.observers[t].delete(e):delete this.observers[t])}emit(t){for(var e=arguments.length,s=new Array(e>1?e-1:0),i=1;i{let[e,i]=t;for(let t=0;t{let[i,n]=e;for(let e=0;e{t=s,e=i}));return s.resolve=t,s.reject=e,s}function o(t){return null==t?"":""+t}const r=/###/g;function a(t,e,s){function i(t){return t&&t.indexOf("###")>-1?t.replace(r,"."):t}function n(){return!t||"string"==typeof t}const o="string"!=typeof e?e:e.split(".");let a=0;for(;a":">",'"':""","'":"'","/":"/"};function g(t){return"string"==typeof t?t.replace(/[&<>"'\/]/g,(t=>c[t])):t}const d=[" ",",","?","!",";"],f=new class{constructor(t){this.capacity=t,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(t){const e=this.regExpMap.get(t);if(void 0!==e)return e;const s=new RegExp(t);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(t,s),this.regExpQueue.push(t),s}}(20);function m(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:".";if(!t)return;if(t[e])return t[e];const i=e.split(s);let n=t;for(let t=0;t-1&&r0?t.replace("_","-"):t}class v extends i{constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{ns:["translation"],defaultNS:"translation"};super(),this.data=t||{},this.options=e,void 0===this.options.keySeparator&&(this.options.keySeparator="."),void 0===this.options.ignoreJSONStructure&&(this.options.ignoreJSONStructure=!0)}addNamespaces(t){this.options.ns.indexOf(t)<0&&this.options.ns.push(t)}removeNamespaces(t){const e=this.options.ns.indexOf(t);e>-1&&this.options.ns.splice(e,1)}getResource(t,e,s){let i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};const n=void 0!==i.keySeparator?i.keySeparator:this.options.keySeparator,o=void 0!==i.ignoreJSONStructure?i.ignoreJSONStructure:this.options.ignoreJSONStructure;let r;t.indexOf(".")>-1?r=t.split("."):(r=[t,e],s&&(Array.isArray(s)?r.push(...s):"string"==typeof s&&n?r.push(...s.split(n)):r.push(s)));const a=u(this.data,r);return!a&&!e&&!s&&t.indexOf(".")>-1&&(t=r[0],e=r[1],s=r.slice(2).join(".")),a||!o||"string"!=typeof s?a:m(this.data&&this.data[t]&&this.data[t][e],s,n)}addResource(t,e,s,i){let n=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{silent:!1};const o=void 0!==n.keySeparator?n.keySeparator:this.options.keySeparator;let r=[t,e];s&&(r=r.concat(o?s.split(o):s)),t.indexOf(".")>-1&&(r=t.split("."),i=e,e=r[1]),this.addNamespaces(e),l(this.data,r,i),n.silent||this.emit("added",t,e,s,i)}addResources(t,e,s){let i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{silent:!1};for(const i in s)"string"!=typeof s[i]&&"[object Array]"!==Object.prototype.toString.apply(s[i])||this.addResource(t,e,i,s[i],{silent:!0});i.silent||this.emit("added",t,e,s)}addResourceBundle(t,e,s,i,n){let o=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{silent:!1,skipCopy:!1},r=[t,e];t.indexOf(".")>-1&&(r=t.split("."),i=s,s=e,e=r[1]),this.addNamespaces(e);let a=u(this.data,r)||{};o.skipCopy||(s=JSON.parse(JSON.stringify(s))),i?h(a,s,n):a={...a,...s},l(this.data,r,a),o.silent||this.emit("added",t,e,s)}removeResourceBundle(t,e){this.hasResourceBundle(t,e)&&delete this.data[t][e],this.removeNamespaces(e),this.emit("removed",t,e)}hasResourceBundle(t,e){return void 0!==this.getResource(t,e)}getResourceBundle(t,e){return e||(e=this.options.defaultNS),"v1"===this.options.compatibilityAPI?{...this.getResource(t,e)}:this.getResource(t,e)}getDataByLanguage(t){return this.data[t]}hasLanguageSomeTranslations(t){const e=this.getDataByLanguage(t);return!!(e&&Object.keys(e)||[]).find((t=>e[t]&&Object.keys(e[t]).length>0))}toJSON(){return this.data}}var b={processors:{},addPostProcessor(t){this.processors[t.name]=t},handle(t,e,s,i,n){return t.forEach((t=>{this.processors[t]&&(e=this.processors[t].process(e,s,i,n))})),e}};const x={};class S extends i{constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};var i,n;super(),i=t,n=this,["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"].forEach((t=>{i[t]&&(n[t]=i[t])})),this.options=e,void 0===this.options.keySeparator&&(this.options.keySeparator="."),this.logger=s.create("translator")}changeLanguage(t){t&&(this.language=t)}exists(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{interpolation:{}};if(null==t)return!1;const s=this.resolve(t,e);return s&&void 0!==s.res}extractFromKey(t,e){let s=void 0!==e.nsSeparator?e.nsSeparator:this.options.nsSeparator;void 0===s&&(s=":");const i=void 0!==e.keySeparator?e.keySeparator:this.options.keySeparator;let n=e.ns||this.options.defaultNS||[];const o=s&&t.indexOf(s)>-1,r=!(this.options.userDefinedKeySeparator||e.keySeparator||this.options.userDefinedNsSeparator||e.nsSeparator||function(t,e,s){e=e||"",s=s||"";const i=d.filter((t=>e.indexOf(t)<0&&s.indexOf(t)<0));if(0===i.length)return!0;const n=f.getRegExp(`(${i.map((t=>"?"===t?"\\?":t)).join("|")})`);let o=!n.test(t);if(!o){const e=t.indexOf(s);e>0&&!n.test(t.substring(0,e))&&(o=!0)}return o}(t,s,i));if(o&&!r){const e=t.match(this.interpolator.nestingRegexp);if(e&&e.length>0)return{key:t,namespaces:n};const o=t.split(s);(s!==i||s===i&&this.options.ns.indexOf(o[0])>-1)&&(n=o.shift()),t=o.join(i)}return"string"==typeof n&&(n=[n]),{key:t,namespaces:n}}translate(t,e,s){if("object"!=typeof e&&this.options.overloadTranslationOptionHandler&&(e=this.options.overloadTranslationOptionHandler(arguments)),"object"==typeof e&&(e={...e}),e||(e={}),null==t)return"";Array.isArray(t)||(t=[String(t)]);const i=void 0!==e.returnDetails?e.returnDetails:this.options.returnDetails,n=void 0!==e.keySeparator?e.keySeparator:this.options.keySeparator,{key:o,namespaces:r}=this.extractFromKey(t[t.length-1],e),a=r[r.length-1],l=e.lng||this.language,u=e.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(l&&"cimode"===l.toLowerCase()){if(u){const t=e.nsSeparator||this.options.nsSeparator;return i?{res:`${a}${t}${o}`,usedKey:o,exactUsedKey:o,usedLng:l,usedNS:a,usedParams:this.getUsedParamsDetails(e)}:`${a}${t}${o}`}return i?{res:o,usedKey:o,exactUsedKey:o,usedLng:l,usedNS:a,usedParams:this.getUsedParamsDetails(e)}:o}const h=this.resolve(t,e);let p=h&&h.res;const c=h&&h.usedKey||o,g=h&&h.exactUsedKey||o,d=Object.prototype.toString.apply(p),f=void 0!==e.joinArrays?e.joinArrays:this.options.joinArrays,m=!this.i18nFormat||this.i18nFormat.handleAsObject;if(m&&p&&("string"!=typeof p&&"boolean"!=typeof p&&"number"!=typeof p)&&["[object Number]","[object Function]","[object RegExp]"].indexOf(d)<0&&("string"!=typeof f||"[object Array]"!==d)){if(!e.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn("accessing an object - but returnObjects options is not enabled!");const t=this.options.returnedObjectHandler?this.options.returnedObjectHandler(c,p,{...e,ns:r}):`key '${o} (${this.language})' returned an object instead of string.`;return i?(h.res=t,h.usedParams=this.getUsedParamsDetails(e),h):t}if(n){const t="[object Array]"===d,s=t?[]:{},i=t?g:c;for(const t in p)if(Object.prototype.hasOwnProperty.call(p,t)){const o=`${i}${n}${t}`;s[t]=this.translate(o,{...e,joinArrays:!1,ns:r}),s[t]===o&&(s[t]=p[t])}p=s}}else if(m&&"string"==typeof f&&"[object Array]"===d)p=p.join(f),p&&(p=this.extendTranslation(p,t,e,s));else{let i=!1,r=!1;const u=void 0!==e.count&&"string"!=typeof e.count,c=S.hasDefaultValue(e),g=u?this.pluralResolver.getSuffix(l,e.count,e):"",d=e.ordinal&&u?this.pluralResolver.getSuffix(l,e.count,{ordinal:!1}):"",f=u&&!e.ordinal&&0===e.count&&this.pluralResolver.shouldUseIntlApi(),m=f&&e[`defaultValue${this.options.pluralSeparator}zero`]||e[`defaultValue${g}`]||e[`defaultValue${d}`]||e.defaultValue;!this.isValidLookup(p)&&c&&(i=!0,p=m),this.isValidLookup(p)||(r=!0,p=o);const y=(e.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&r?void 0:p,v=c&&m!==p&&this.options.updateMissing;if(r||i||v){if(this.logger.log(v?"updateKey":"missingKey",l,a,o,v?m:p),n){const t=this.resolve(o,{...e,keySeparator:!1});t&&t.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}let t=[];const s=this.languageUtils.getFallbackCodes(this.options.fallbackLng,e.lng||this.language);if("fallback"===this.options.saveMissingTo&&s&&s[0])for(let e=0;e{const n=c&&i!==p?i:y;this.options.missingKeyHandler?this.options.missingKeyHandler(t,a,s,n,v,e):this.backendConnector&&this.backendConnector.saveMissing&&this.backendConnector.saveMissing(t,a,s,n,v,e),this.emit("missingKey",t,a,s,p)};this.options.saveMissing&&(this.options.saveMissingPlurals&&u?t.forEach((t=>{const s=this.pluralResolver.getSuffixes(t,e);f&&e[`defaultValue${this.options.pluralSeparator}zero`]&&s.indexOf(`${this.options.pluralSeparator}zero`)<0&&s.push(`${this.options.pluralSeparator}zero`),s.forEach((s=>{i([t],o+s,e[`defaultValue${s}`]||m)}))})):i(t,o,m))}p=this.extendTranslation(p,t,e,h,s),r&&p===o&&this.options.appendNamespaceToMissingKey&&(p=`${a}:${o}`),(r||i)&&this.options.parseMissingKeyHandler&&(p="v1"!==this.options.compatibilityAPI?this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${a}:${o}`:o,i?p:void 0):this.options.parseMissingKeyHandler(p))}return i?(h.res=p,h.usedParams=this.getUsedParamsDetails(e),h):p}extendTranslation(t,e,s,i,n){var o=this;if(this.i18nFormat&&this.i18nFormat.parse)t=this.i18nFormat.parse(t,{...this.options.interpolation.defaultVariables,...s},s.lng||this.language||i.usedLng,i.usedNS,i.usedKey,{resolved:i});else if(!s.skipInterpolation){s.interpolation&&this.interpolator.init({...s,interpolation:{...this.options.interpolation,...s.interpolation}});const r="string"==typeof t&&(s&&s.interpolation&&void 0!==s.interpolation.skipOnVariables?s.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables);let a;if(r){const e=t.match(this.interpolator.nestingRegexp);a=e&&e.length}let l=s.replace&&"string"!=typeof s.replace?s.replace:s;if(this.options.interpolation.defaultVariables&&(l={...this.options.interpolation.defaultVariables,...l}),t=this.interpolator.interpolate(t,l,s.lng||this.language,s),r){const e=t.match(this.interpolator.nestingRegexp);a<(e&&e.length)&&(s.nest=!1)}!s.lng&&"v1"!==this.options.compatibilityAPI&&i&&i.res&&(s.lng=i.usedLng),!1!==s.nest&&(t=this.interpolator.nest(t,(function(){for(var t=arguments.length,i=new Array(t),r=0;r1&&void 0!==arguments[1]?arguments[1]:{};return"string"==typeof t&&(t=[t]),t.forEach((t=>{if(this.isValidLookup(e))return;const a=this.extractFromKey(t,r),l=a.key;s=l;let u=a.namespaces;this.options.fallbackNS&&(u=u.concat(this.options.fallbackNS));const h=void 0!==r.count&&"string"!=typeof r.count,p=h&&!r.ordinal&&0===r.count&&this.pluralResolver.shouldUseIntlApi(),c=void 0!==r.context&&("string"==typeof r.context||"number"==typeof r.context)&&""!==r.context,g=r.lngs?r.lngs:this.languageUtils.toResolveHierarchy(r.lng||this.language,r.fallbackLng);u.forEach((t=>{this.isValidLookup(e)||(o=t,!x[`${g[0]}-${t}`]&&this.utils&&this.utils.hasLoadedNamespace&&!this.utils.hasLoadedNamespace(o)&&(x[`${g[0]}-${t}`]=!0,this.logger.warn(`key "${s}" for languages "${g.join(", ")}" won't get resolved as namespace "${o}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),g.forEach((s=>{if(this.isValidLookup(e))return;n=s;const o=[l];if(this.i18nFormat&&this.i18nFormat.addLookupKeys)this.i18nFormat.addLookupKeys(o,l,s,t,r);else{let t;h&&(t=this.pluralResolver.getSuffix(s,r.count,r));const e=`${this.options.pluralSeparator}zero`,i=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(h&&(o.push(l+t),r.ordinal&&0===t.indexOf(i)&&o.push(l+t.replace(i,this.options.pluralSeparator)),p&&o.push(l+e)),c){const s=`${l}${this.options.contextSeparator}${r.context}`;o.push(s),h&&(o.push(s+t),r.ordinal&&0===t.indexOf(i)&&o.push(s+t.replace(i,this.options.pluralSeparator)),p&&o.push(s+e))}}let a;for(;a=o.pop();)this.isValidLookup(e)||(i=a,e=this.getResource(s,t,a,r))})))}))})),{res:e,usedKey:s,exactUsedKey:i,usedLng:n,usedNS:o}}isValidLookup(t){return!(void 0===t||!this.options.returnNull&&null===t||!this.options.returnEmptyString&&""===t)}getResource(t,e,s){let i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return this.i18nFormat&&this.i18nFormat.getResource?this.i18nFormat.getResource(t,e,s,i):this.resourceStore.getResource(t,e,s,i)}getUsedParamsDetails(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const e=["defaultValue","ordinal","context","replace","lng","lngs","fallbackLng","ns","keySeparator","nsSeparator","returnObjects","returnDetails","joinArrays","postProcess","interpolation"],s=t.replace&&"string"!=typeof t.replace;let i=s?t.replace:t;if(s&&void 0!==t.count&&(i.count=t.count),this.options.interpolation.defaultVariables&&(i={...this.options.interpolation.defaultVariables,...i}),!s){i={...i};for(const t of e)delete i[t]}return i}static hasDefaultValue(t){const e="defaultValue";for(const s in t)if(Object.prototype.hasOwnProperty.call(t,s)&&e===s.substring(0,12)&&void 0!==t[s])return!0;return!1}}function k(t){return t.charAt(0).toUpperCase()+t.slice(1)}class O{constructor(t){this.options=t,this.supportedLngs=this.options.supportedLngs||!1,this.logger=s.create("languageUtils")}getScriptPartFromCode(t){if(!(t=y(t))||t.indexOf("-")<0)return null;const e=t.split("-");return 2===e.length?null:(e.pop(),"x"===e[e.length-1].toLowerCase()?null:this.formatLanguageCode(e.join("-")))}getLanguagePartFromCode(t){if(!(t=y(t))||t.indexOf("-")<0)return t;const e=t.split("-");return this.formatLanguageCode(e[0])}formatLanguageCode(t){if("string"==typeof t&&t.indexOf("-")>-1){const e=["hans","hant","latn","cyrl","cans","mong","arab"];let s=t.split("-");return this.options.lowerCaseLng?s=s.map((t=>t.toLowerCase())):2===s.length?(s[0]=s[0].toLowerCase(),s[1]=s[1].toUpperCase(),e.indexOf(s[1].toLowerCase())>-1&&(s[1]=k(s[1].toLowerCase()))):3===s.length&&(s[0]=s[0].toLowerCase(),2===s[1].length&&(s[1]=s[1].toUpperCase()),"sgn"!==s[0]&&2===s[2].length&&(s[2]=s[2].toUpperCase()),e.indexOf(s[1].toLowerCase())>-1&&(s[1]=k(s[1].toLowerCase())),e.indexOf(s[2].toLowerCase())>-1&&(s[2]=k(s[2].toLowerCase()))),s.join("-")}return this.options.cleanCode||this.options.lowerCaseLng?t.toLowerCase():t}isSupportedCode(t){return("languageOnly"===this.options.load||this.options.nonExplicitSupportedLngs)&&(t=this.getLanguagePartFromCode(t)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(t)>-1}getBestMatchFromCodes(t){if(!t)return null;let e;return t.forEach((t=>{if(e)return;const s=this.formatLanguageCode(t);this.options.supportedLngs&&!this.isSupportedCode(s)||(e=s)})),!e&&this.options.supportedLngs&&t.forEach((t=>{if(e)return;const s=this.getLanguagePartFromCode(t);if(this.isSupportedCode(s))return e=s;e=this.options.supportedLngs.find((t=>t===s?t:t.indexOf("-")<0&&s.indexOf("-")<0?void 0:0===t.indexOf(s)?t:void 0))})),e||(e=this.getFallbackCodes(this.options.fallbackLng)[0]),e}getFallbackCodes(t,e){if(!t)return[];if("function"==typeof t&&(t=t(e)),"string"==typeof t&&(t=[t]),"[object Array]"===Object.prototype.toString.apply(t))return t;if(!e)return t.default||[];let s=t[e];return s||(s=t[this.getScriptPartFromCode(e)]),s||(s=t[this.formatLanguageCode(e)]),s||(s=t[this.getLanguagePartFromCode(e)]),s||(s=t.default),s||[]}toResolveHierarchy(t,e){const s=this.getFallbackCodes(e||this.options.fallbackLng||[],t),i=[],n=t=>{t&&(this.isSupportedCode(t)?i.push(t):this.logger.warn(`rejecting language code not found in supportedLngs: ${t}`))};return"string"==typeof t&&(t.indexOf("-")>-1||t.indexOf("_")>-1)?("languageOnly"!==this.options.load&&n(this.formatLanguageCode(t)),"languageOnly"!==this.options.load&&"currentOnly"!==this.options.load&&n(this.getScriptPartFromCode(t)),"currentOnly"!==this.options.load&&n(this.getLanguagePartFromCode(t))):"string"==typeof t&&n(this.formatLanguageCode(t)),s.forEach((t=>{i.indexOf(t)<0&&n(this.formatLanguageCode(t))})),i}}let L=[{lngs:["ach","ak","am","arn","br","fil","gun","ln","mfe","mg","mi","oc","pt","pt-BR","tg","tl","ti","tr","uz","wa"],nr:[1,2],fc:1},{lngs:["af","an","ast","az","bg","bn","ca","da","de","dev","el","en","eo","es","et","eu","fi","fo","fur","fy","gl","gu","ha","hi","hu","hy","ia","it","kk","kn","ku","lb","mai","ml","mn","mr","nah","nap","nb","ne","nl","nn","no","nso","pa","pap","pms","ps","pt-PT","rm","sco","se","si","so","son","sq","sv","sw","ta","te","tk","ur","yo"],nr:[1,2],fc:2},{lngs:["ay","bo","cgg","fa","ht","id","ja","jbo","ka","km","ko","ky","lo","ms","sah","su","th","tt","ug","vi","wo","zh"],nr:[1],fc:3},{lngs:["be","bs","cnr","dz","hr","ru","sr","uk"],nr:[1,2,5],fc:4},{lngs:["ar"],nr:[0,1,2,3,11,100],fc:5},{lngs:["cs","sk"],nr:[1,2,5],fc:6},{lngs:["csb","pl"],nr:[1,2,5],fc:7},{lngs:["cy"],nr:[1,2,3,8],fc:8},{lngs:["fr"],nr:[1,2],fc:9},{lngs:["ga"],nr:[1,2,3,7,11],fc:10},{lngs:["gd"],nr:[1,2,3,20],fc:11},{lngs:["is"],nr:[1,2],fc:12},{lngs:["jv"],nr:[0,1],fc:13},{lngs:["kw"],nr:[1,2,3,4],fc:14},{lngs:["lt"],nr:[1,2,10],fc:15},{lngs:["lv"],nr:[1,2,0],fc:16},{lngs:["mk"],nr:[1,2],fc:17},{lngs:["mnk"],nr:[0,1,2],fc:18},{lngs:["mt"],nr:[1,2,11,20],fc:19},{lngs:["or"],nr:[2,1],fc:2},{lngs:["ro"],nr:[1,2,20],fc:20},{lngs:["sl"],nr:[5,1,2,3],fc:21},{lngs:["he","iw"],nr:[1,2,20,21],fc:22}],w={1:function(t){return Number(t>1)},2:function(t){return Number(1!=t)},3:function(t){return 0},4:function(t){return Number(t%10==1&&t%100!=11?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2)},5:function(t){return Number(0==t?0:1==t?1:2==t?2:t%100>=3&&t%100<=10?3:t%100>=11?4:5)},6:function(t){return Number(1==t?0:t>=2&&t<=4?1:2)},7:function(t){return Number(1==t?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2)},8:function(t){return Number(1==t?0:2==t?1:8!=t&&11!=t?2:3)},9:function(t){return Number(t>=2)},10:function(t){return Number(1==t?0:2==t?1:t<7?2:t<11?3:4)},11:function(t){return Number(1==t||11==t?0:2==t||12==t?1:t>2&&t<20?2:3)},12:function(t){return Number(t%10!=1||t%100==11)},13:function(t){return Number(0!==t)},14:function(t){return Number(1==t?0:2==t?1:3==t?2:3)},15:function(t){return Number(t%10==1&&t%100!=11?0:t%10>=2&&(t%100<10||t%100>=20)?1:2)},16:function(t){return Number(t%10==1&&t%100!=11?0:0!==t?1:2)},17:function(t){return Number(1==t||t%10==1&&t%100!=11?0:1)},18:function(t){return Number(0==t?0:1==t?1:2)},19:function(t){return Number(1==t?0:0==t||t%100>1&&t%100<11?1:t%100>10&&t%100<20?2:3)},20:function(t){return Number(1==t?0:0==t||t%100>0&&t%100<20?1:2)},21:function(t){return Number(t%100==1?1:t%100==2?2:t%100==3||t%100==4?3:0)},22:function(t){return Number(1==t?0:2==t?1:(t<0||t>10)&&t%10==0?2:3)}};const N=["v1","v2","v3"],$=["v4"],R={zero:0,one:1,two:2,few:3,many:4,other:5};class C{constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.languageUtils=t,this.options=e,this.logger=s.create("pluralResolver"),this.options.compatibilityJSON&&!$.includes(this.options.compatibilityJSON)||"undefined"!=typeof Intl&&Intl.PluralRules||(this.options.compatibilityJSON="v3",this.logger.error("Your environment seems not to be Intl API compatible, use an Intl.PluralRules polyfill. Will fallback to the compatibilityJSON v3 format handling.")),this.rules=function(){const t={};return L.forEach((e=>{e.lngs.forEach((s=>{t[s]={numbers:e.nr,plurals:w[e.fc]}}))})),t}()}addRule(t,e){this.rules[t]=e}getRule(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(this.shouldUseIntlApi())try{return new Intl.PluralRules(y("dev"===t?"en":t),{type:e.ordinal?"ordinal":"cardinal"})}catch(t){return}return this.rules[t]||this.rules[this.languageUtils.getLanguagePartFromCode(t)]}needsPlural(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s=this.getRule(t,e);return this.shouldUseIntlApi()?s&&s.resolvedOptions().pluralCategories.length>1:s&&s.numbers.length>1}getPluralFormsOfKey(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.getSuffixes(t,s).map((t=>`${e}${t}`))}getSuffixes(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s=this.getRule(t,e);return s?this.shouldUseIntlApi()?s.resolvedOptions().pluralCategories.sort(((t,e)=>R[t]-R[e])).map((t=>`${this.options.prepend}${e.ordinal?`ordinal${this.options.prepend}`:""}${t}`)):s.numbers.map((s=>this.getSuffix(t,s,e))):[]}getSuffix(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const i=this.getRule(t,s);return i?this.shouldUseIntlApi()?`${this.options.prepend}${s.ordinal?`ordinal${this.options.prepend}`:""}${i.select(e)}`:this.getSuffixRetroCompatible(i,e):(this.logger.warn(`no plural rule found for: ${t}`),"")}getSuffixRetroCompatible(t,e){const s=t.noAbs?t.plurals(e):t.plurals(Math.abs(e));let i=t.numbers[s];this.options.simplifyPluralSuffix&&2===t.numbers.length&&1===t.numbers[0]&&(2===i?i="plural":1===i&&(i=""));const n=()=>this.options.prepend&&i.toString()?this.options.prepend+i.toString():i.toString();return"v1"===this.options.compatibilityJSON?1===i?"":"number"==typeof i?`_plural_${i.toString()}`:n():"v2"===this.options.compatibilityJSON||this.options.simplifyPluralSuffix&&2===t.numbers.length&&1===t.numbers[0]?n():this.options.prepend&&s.toString()?this.options.prepend+s.toString():s.toString()}shouldUseIntlApi(){return!N.includes(this.options.compatibilityJSON)}}function P(t,e,s){let i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:".",n=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],o=function(t,e,s){const i=u(t,s);return void 0!==i?i:u(e,s)}(t,e,s);return!o&&n&&"string"==typeof s&&(o=m(t,s,i),void 0===o&&(o=m(e,s,i))),o}class j{constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.logger=s.create("interpolator"),this.options=t,this.format=t.interpolation&&t.interpolation.format||(t=>t),this.init(t)}init(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};t.interpolation||(t.interpolation={escapeValue:!0});const e=t.interpolation;this.escape=void 0!==e.escape?e.escape:g,this.escapeValue=void 0===e.escapeValue||e.escapeValue,this.useRawValueToEscape=void 0!==e.useRawValueToEscape&&e.useRawValueToEscape,this.prefix=e.prefix?p(e.prefix):e.prefixEscaped||"{{",this.suffix=e.suffix?p(e.suffix):e.suffixEscaped||"}}",this.formatSeparator=e.formatSeparator?e.formatSeparator:e.formatSeparator||",",this.unescapePrefix=e.unescapeSuffix?"":e.unescapePrefix||"-",this.unescapeSuffix=this.unescapePrefix?"":e.unescapeSuffix||"",this.nestingPrefix=e.nestingPrefix?p(e.nestingPrefix):e.nestingPrefixEscaped||p("$t("),this.nestingSuffix=e.nestingSuffix?p(e.nestingSuffix):e.nestingSuffixEscaped||p(")"),this.nestingOptionsSeparator=e.nestingOptionsSeparator?e.nestingOptionsSeparator:e.nestingOptionsSeparator||",",this.maxReplaces=e.maxReplaces?e.maxReplaces:1e3,this.alwaysFormat=void 0!==e.alwaysFormat&&e.alwaysFormat,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){const t=(t,e)=>t&&t.source===e?(t.lastIndex=0,t):new RegExp(e,"g");this.regexp=t(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=t(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=t(this.nestingRegexp,`${this.nestingPrefix}(.+?)${this.nestingSuffix}`)}interpolate(t,e,s,i){let n,r,a;const l=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{};function u(t){return t.replace(/\$/g,"$$$$")}const h=t=>{if(t.indexOf(this.formatSeparator)<0){const n=P(e,l,t,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(n,void 0,s,{...i,...e,interpolationkey:t}):n}const n=t.split(this.formatSeparator),o=n.shift().trim(),r=n.join(this.formatSeparator).trim();return this.format(P(e,l,o,this.options.keySeparator,this.options.ignoreJSONStructure),r,s,{...i,...e,interpolationkey:o})};this.resetRegExp();const p=i&&i.missingInterpolationHandler||this.options.missingInterpolationHandler,c=i&&i.interpolation&&void 0!==i.interpolation.skipOnVariables?i.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:t=>u(t)},{regex:this.regexp,safeValue:t=>this.escapeValue?u(this.escape(t)):u(t)}].forEach((e=>{for(a=0;n=e.regex.exec(t);){const s=n[1].trim();if(r=h(s),void 0===r)if("function"==typeof p){const e=p(t,n,i);r="string"==typeof e?e:""}else if(i&&Object.prototype.hasOwnProperty.call(i,s))r="";else{if(c){r=n[0];continue}this.logger.warn(`missed to pass in variable ${s} for interpolating ${t}`),r=""}else"string"==typeof r||this.useRawValueToEscape||(r=o(r));const l=e.safeValue(r);if(t=t.replace(n[0],l),c?(e.regex.lastIndex+=r.length,e.regex.lastIndex-=n[0].length):e.regex.lastIndex=0,a++,a>=this.maxReplaces)break}})),t}nest(t,e){let s,i,n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};function a(t,e){const s=this.nestingOptionsSeparator;if(t.indexOf(s)<0)return t;const i=t.split(new RegExp(`${s}[ ]*{`));let o=`{${i[1]}`;t=i[0],o=this.interpolate(o,n);const r=o.match(/'/g),a=o.match(/"/g);(r&&r.length%2==0&&!a||a.length%2!=0)&&(o=o.replace(/'/g,'"'));try{n=JSON.parse(o),e&&(n={...e,...n})}catch(e){return this.logger.warn(`failed parsing options string in nesting for key ${t}`,e),`${t}${s}${o}`}return delete n.defaultValue,t}for(;s=this.nestingRegexp.exec(t);){let l=[];n={...r},n=n.replace&&"string"!=typeof n.replace?n.replace:n,n.applyPostProcessor=!1,delete n.defaultValue;let u=!1;if(-1!==s[0].indexOf(this.formatSeparator)&&!/{.*}/.test(s[1])){const t=s[1].split(this.formatSeparator).map((t=>t.trim()));s[1]=t.shift(),l=t,u=!0}if(i=e(a.call(this,s[1].trim(),n),n),i&&s[0]===t&&"string"!=typeof i)return i;"string"!=typeof i&&(i=o(i)),i||(this.logger.warn(`missed to resolve ${s[1]} for nesting ${t}`),i=""),u&&(i=l.reduce(((t,e)=>this.format(t,e,r.lng,{...r,interpolationkey:s[1].trim()})),i.trim())),t=t.replace(s[0],i),this.regexp.lastIndex=0}return t}}function E(t){const e={};return function(s,i,n){const o=i+JSON.stringify(n);let r=e[o];return r||(r=t(y(i),n),e[o]=r),r(s)}}class I{constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.logger=s.create("formatter"),this.options=t,this.formats={number:E(((t,e)=>{const s=new Intl.NumberFormat(t,{...e});return t=>s.format(t)})),currency:E(((t,e)=>{const s=new Intl.NumberFormat(t,{...e,style:"currency"});return t=>s.format(t)})),datetime:E(((t,e)=>{const s=new Intl.DateTimeFormat(t,{...e});return t=>s.format(t)})),relativetime:E(((t,e)=>{const s=new Intl.RelativeTimeFormat(t,{...e});return t=>s.format(t,e.range||"day")})),list:E(((t,e)=>{const s=new Intl.ListFormat(t,{...e});return t=>s.format(t)}))},this.init(t)}init(t){const e=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{interpolation:{}}).interpolation;this.formatSeparator=e.formatSeparator?e.formatSeparator:e.formatSeparator||","}add(t,e){this.formats[t.toLowerCase().trim()]=e}addCached(t,e){this.formats[t.toLowerCase().trim()]=E(e)}format(t,e,s){let i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return e.split(this.formatSeparator).reduce(((t,e)=>{const{formatName:n,formatOptions:o}=function(t){let e=t.toLowerCase().trim();const s={};if(t.indexOf("(")>-1){const i=t.split("(");e=i[0].toLowerCase().trim();const n=i[1].substring(0,i[1].length-1);"currency"===e&&n.indexOf(":")<0?s.currency||(s.currency=n.trim()):"relativetime"===e&&n.indexOf(":")<0?s.range||(s.range=n.trim()):n.split(";").forEach((t=>{if(!t)return;const[e,...i]=t.split(":"),n=i.join(":").trim().replace(/^'+|'+$/g,"");s[e.trim()]||(s[e.trim()]=n),"false"===n&&(s[e.trim()]=!1),"true"===n&&(s[e.trim()]=!0),isNaN(n)||(s[e.trim()]=parseInt(n,10))}))}return{formatName:e,formatOptions:s}}(e);if(this.formats[n]){let e=t;try{const r=i&&i.formatParams&&i.formatParams[i.interpolationkey]||{},a=r.locale||r.lng||i.locale||i.lng||s;e=this.formats[n](t,a,{...o,...i,...r})}catch(t){this.logger.warn(t)}return e}return this.logger.warn(`there was no format function for ${n}`),t}),t)}}class F extends i{constructor(t,e,i){let n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};super(),this.backend=t,this.store=e,this.services=i,this.languageUtils=i.languageUtils,this.options=n,this.logger=s.create("backendConnector"),this.waitingReads=[],this.maxParallelReads=n.maxParallelReads||10,this.readingCalls=0,this.maxRetries=n.maxRetries>=0?n.maxRetries:5,this.retryTimeout=n.retryTimeout>=1?n.retryTimeout:350,this.state={},this.queue=[],this.backend&&this.backend.init&&this.backend.init(i,n.backend,n)}queueLoad(t,e,s,i){const n={},o={},r={},a={};return t.forEach((t=>{let i=!0;e.forEach((e=>{const r=`${t}|${e}`;!s.reload&&this.store.hasResourceBundle(t,e)?this.state[r]=2:this.state[r]<0||(1===this.state[r]?void 0===o[r]&&(o[r]=!0):(this.state[r]=1,i=!1,void 0===o[r]&&(o[r]=!0),void 0===n[r]&&(n[r]=!0),void 0===a[e]&&(a[e]=!0)))})),i||(r[t]=!0)})),(Object.keys(n).length||Object.keys(o).length)&&this.queue.push({pending:o,pendingCount:Object.keys(o).length,loaded:{},errors:[],callback:i}),{toLoad:Object.keys(n),pending:Object.keys(o),toLoadLanguages:Object.keys(r),toLoadNamespaces:Object.keys(a)}}loaded(t,e,s){const i=t.split("|"),n=i[0],o=i[1];e&&this.emit("failedLoading",n,o,e),s&&this.store.addResourceBundle(n,o,s,void 0,void 0,{skipCopy:!0}),this.state[t]=e?-1:2;const r={};this.queue.forEach((s=>{!function(t,e,s,i){const{obj:n,k:o}=a(t,e,Object);n[o]=n[o]||[],i&&(n[o]=n[o].concat(s)),i||n[o].push(s)}(s.loaded,[n],o),function(t,e){void 0!==t.pending[e]&&(delete t.pending[e],t.pendingCount--)}(s,t),e&&s.errors.push(e),0!==s.pendingCount||s.done||(Object.keys(s.loaded).forEach((t=>{r[t]||(r[t]={});const e=s.loaded[t];e.length&&e.forEach((e=>{void 0===r[t][e]&&(r[t][e]=!0)}))})),s.done=!0,s.errors.length?s.callback(s.errors):s.callback())})),this.emit("loaded",r),this.queue=this.queue.filter((t=>!t.done))}read(t,e,s){let i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,n=arguments.length>4&&void 0!==arguments[4]?arguments[4]:this.retryTimeout,o=arguments.length>5?arguments[5]:void 0;if(!t.length)return o(null,{});if(this.readingCalls>=this.maxParallelReads)return void this.waitingReads.push({lng:t,ns:e,fcName:s,tried:i,wait:n,callback:o});this.readingCalls++;const r=(r,a)=>{if(this.readingCalls--,this.waitingReads.length>0){const t=this.waitingReads.shift();this.read(t.lng,t.ns,t.fcName,t.tried,t.wait,t.callback)}r&&a&&i{this.read.call(this,t,e,s,i+1,2*n,o)}),n):o(r,a)},a=this.backend[s].bind(this.backend);if(2!==a.length)return a(t,e,r);try{const s=a(t,e);s&&"function"==typeof s.then?s.then((t=>r(null,t))).catch(r):r(null,s)}catch(t){r(t)}}prepareLoading(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=arguments.length>3?arguments[3]:void 0;if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),i&&i();"string"==typeof t&&(t=this.languageUtils.toResolveHierarchy(t)),"string"==typeof e&&(e=[e]);const n=this.queueLoad(t,e,s,i);if(!n.toLoad.length)return n.pending.length||i(),null;n.toLoad.forEach((t=>{this.loadOne(t)}))}load(t,e,s){this.prepareLoading(t,e,{},s)}reload(t,e,s){this.prepareLoading(t,e,{reload:!0},s)}loadOne(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const s=t.split("|"),i=s[0],n=s[1];this.read(i,n,"read",void 0,void 0,((s,o)=>{s&&this.logger.warn(`${e}loading namespace ${n} for language ${i} failed`,s),!s&&o&&this.logger.log(`${e}loaded namespace ${n} for language ${i}`,o),this.loaded(t,s,o)}))}saveMissing(t,e,s,i,n){let o=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:()=>{};if(this.services.utils&&this.services.utils.hasLoadedNamespace&&!this.services.utils.hasLoadedNamespace(e))this.logger.warn(`did not save key "${s}" as the namespace "${e}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");else if(null!=s&&""!==s){if(this.backend&&this.backend.create){const a={...o,isUpdate:n},l=this.backend.create.bind(this.backend);if(l.length<6)try{let n;n=5===l.length?l(t,e,s,i,a):l(t,e,s,i),n&&"function"==typeof n.then?n.then((t=>r(null,t))).catch(r):r(null,n)}catch(t){r(t)}else l(t,e,s,i,r,a)}t&&t[0]&&this.store.addResource(t[0],e,s,i)}}}function V(){return{debug:!1,initImmediate:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:function(t){let e={};if("object"==typeof t[1]&&(e=t[1]),"string"==typeof t[1]&&(e.defaultValue=t[1]),"string"==typeof t[2]&&(e.tDescription=t[2]),"object"==typeof t[2]||"object"==typeof t[3]){const s=t[3]||t[2];Object.keys(s).forEach((t=>{e[t]=s[t]}))}return e},interpolation:{escapeValue:!0,format:t=>t,prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!0}}}function A(t){return"string"==typeof t.ns&&(t.ns=[t.ns]),"string"==typeof t.fallbackLng&&(t.fallbackLng=[t.fallbackLng]),"string"==typeof t.fallbackNS&&(t.fallbackNS=[t.fallbackNS]),t.supportedLngs&&t.supportedLngs.indexOf("cimode")<0&&(t.supportedLngs=t.supportedLngs.concat(["cimode"])),t}function D(){}class U extends i{constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;var i;if(super(),this.options=A(t),this.services={},this.logger=s,this.modules={external:[]},i=this,Object.getOwnPropertyNames(Object.getPrototypeOf(i)).forEach((t=>{"function"==typeof i[t]&&(i[t]=i[t].bind(i))})),e&&!this.isInitialized&&!t.isClone){if(!this.options.initImmediate)return this.init(t,e),this;setTimeout((()=>{this.init(t,e)}),0)}}init(){var t=this;let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},i=arguments.length>1?arguments[1]:void 0;this.isInitializing=!0,"function"==typeof e&&(i=e,e={}),!e.defaultNS&&!1!==e.defaultNS&&e.ns&&("string"==typeof e.ns?e.defaultNS=e.ns:e.ns.indexOf("translation")<0&&(e.defaultNS=e.ns[0]));const o=V();function r(t){return t?"function"==typeof t?new t:t:null}if(this.options={...o,...this.options,...A(e)},"v1"!==this.options.compatibilityAPI&&(this.options.interpolation={...o.interpolation,...this.options.interpolation}),void 0!==e.keySeparator&&(this.options.userDefinedKeySeparator=e.keySeparator),void 0!==e.nsSeparator&&(this.options.userDefinedNsSeparator=e.nsSeparator),!this.options.isClone){let e;this.modules.logger?s.init(r(this.modules.logger),this.options):s.init(null,this.options),this.modules.formatter?e=this.modules.formatter:"undefined"!=typeof Intl&&(e=I);const i=new O(this.options);this.store=new v(this.options.resources,this.options);const n=this.services;n.logger=s,n.resourceStore=this.store,n.languageUtils=i,n.pluralResolver=new C(i,{prepend:this.options.pluralSeparator,compatibilityJSON:this.options.compatibilityJSON,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),!e||this.options.interpolation.format&&this.options.interpolation.format!==o.interpolation.format||(n.formatter=r(e),n.formatter.init(n,this.options),this.options.interpolation.format=n.formatter.format.bind(n.formatter)),n.interpolator=new j(this.options),n.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},n.backendConnector=new F(r(this.modules.backend),n.resourceStore,n,this.options),n.backendConnector.on("*",(function(e){for(var s=arguments.length,i=new Array(s>1?s-1:0),n=1;n1?s-1:0),n=1;n{t.init&&t.init(this)}))}if(this.format=this.options.interpolation.format,i||(i=D),this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){const t=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);t.length>0&&"dev"!==t[0]&&(this.options.lng=t[0])}this.services.languageDetector||this.options.lng||this.logger.warn("init: no languageDetector is used and no lng is defined");["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"].forEach((e=>{this[e]=function(){return t.store[e](...arguments)}}));["addResource","addResources","addResourceBundle","removeResourceBundle"].forEach((e=>{this[e]=function(){return t.store[e](...arguments),t}}));const a=n(),l=()=>{const t=(t,e)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn("init: i18next is already initialized. You should call init just once!"),this.isInitialized=!0,this.options.isClone||this.logger.log("initialized",this.options),this.emit("initialized",this.options),a.resolve(e),i(t,e)};if(this.languages&&"v1"!==this.options.compatibilityAPI&&!this.isInitialized)return t(null,this.t.bind(this));this.changeLanguage(this.options.lng,t)};return this.options.resources||!this.options.initImmediate?l():setTimeout(l,0),a}loadResources(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:D;const s="string"==typeof t?t:this.language;if("function"==typeof t&&(e=t),!this.options.resources||this.options.partialBundledLanguages){if(s&&"cimode"===s.toLowerCase()&&(!this.options.preload||0===this.options.preload.length))return e();const t=[],i=e=>{if(!e)return;if("cimode"===e)return;this.services.languageUtils.toResolveHierarchy(e).forEach((e=>{"cimode"!==e&&t.indexOf(e)<0&&t.push(e)}))};if(s)i(s);else{this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach((t=>i(t)))}this.options.preload&&this.options.preload.forEach((t=>i(t))),this.services.backendConnector.load(t,this.options.ns,(t=>{t||this.resolvedLanguage||!this.language||this.setResolvedLanguage(this.language),e(t)}))}else e(null)}reloadResources(t,e,s){const i=n();return t||(t=this.languages),e||(e=this.options.ns),s||(s=D),this.services.backendConnector.reload(t,e,(t=>{i.resolve(),s(t)})),i}use(t){if(!t)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!t.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return"backend"===t.type&&(this.modules.backend=t),("logger"===t.type||t.log&&t.warn&&t.error)&&(this.modules.logger=t),"languageDetector"===t.type&&(this.modules.languageDetector=t),"i18nFormat"===t.type&&(this.modules.i18nFormat=t),"postProcessor"===t.type&&b.addPostProcessor(t),"formatter"===t.type&&(this.modules.formatter=t),"3rdParty"===t.type&&this.modules.external.push(t),this}setResolvedLanguage(t){if(t&&this.languages&&!(["cimode","dev"].indexOf(t)>-1))for(let t=0;t-1)&&this.store.hasLanguageSomeTranslations(e)){this.resolvedLanguage=e;break}}}changeLanguage(t,e){var s=this;this.isLanguageChangingTo=t;const i=n();this.emit("languageChanging",t);const o=t=>{this.language=t,this.languages=this.services.languageUtils.toResolveHierarchy(t),this.resolvedLanguage=void 0,this.setResolvedLanguage(t)},r=(t,n)=>{n?(o(n),this.translator.changeLanguage(n),this.isLanguageChangingTo=void 0,this.emit("languageChanged",n),this.logger.log("languageChanged",n)):this.isLanguageChangingTo=void 0,i.resolve((function(){return s.t(...arguments)})),e&&e(t,(function(){return s.t(...arguments)}))},a=e=>{t||e||!this.services.languageDetector||(e=[]);const s="string"==typeof e?e:this.services.languageUtils.getBestMatchFromCodes(e);s&&(this.language||o(s),this.translator.language||this.translator.changeLanguage(s),this.services.languageDetector&&this.services.languageDetector.cacheUserLanguage&&this.services.languageDetector.cacheUserLanguage(s)),this.loadResources(s,(t=>{r(t,s)}))};return t||!this.services.languageDetector||this.services.languageDetector.async?!t&&this.services.languageDetector&&this.services.languageDetector.async?0===this.services.languageDetector.detect.length?this.services.languageDetector.detect().then(a):this.services.languageDetector.detect(a):a(t):a(this.services.languageDetector.detect()),i}getFixedT(t,e,s){var i=this;const n=function(t,e){let o;if("object"!=typeof e){for(var r=arguments.length,a=new Array(r>2?r-2:0),l=2;l`${o.keyPrefix}${u}${t}`)):o.keyPrefix?`${o.keyPrefix}${u}${t}`:t,i.t(h,o)};return"string"==typeof t?n.lng=t:n.lngs=t,n.ns=e,n.keyPrefix=s,n}t(){return this.translator&&this.translator.translate(...arguments)}exists(){return this.translator&&this.translator.exists(...arguments)}setDefaultNamespace(t){this.options.defaultNS=t}hasLoadedNamespace(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;const s=e.lng||this.resolvedLanguage||this.languages[0],i=!!this.options&&this.options.fallbackLng,n=this.languages[this.languages.length-1];if("cimode"===s.toLowerCase())return!0;const o=(t,e)=>{const s=this.services.backendConnector.state[`${t}|${e}`];return-1===s||2===s};if(e.precheck){const t=e.precheck(this,o);if(void 0!==t)return t}return!!this.hasResourceBundle(s,t)||(!(this.services.backendConnector.backend&&(!this.options.resources||this.options.partialBundledLanguages))||!(!o(s,t)||i&&!o(n,t)))}loadNamespaces(t,e){const s=n();return this.options.ns?("string"==typeof t&&(t=[t]),t.forEach((t=>{this.options.ns.indexOf(t)<0&&this.options.ns.push(t)})),this.loadResources((t=>{s.resolve(),e&&e(t)})),s):(e&&e(),Promise.resolve())}loadLanguages(t,e){const s=n();"string"==typeof t&&(t=[t]);const i=this.options.preload||[],o=t.filter((t=>i.indexOf(t)<0));return o.length?(this.options.preload=i.concat(o),this.loadResources((t=>{s.resolve(),e&&e(t)})),s):(e&&e(),Promise.resolve())}dir(t){if(t||(t=this.resolvedLanguage||(this.languages&&this.languages.length>0?this.languages[0]:this.language)),!t)return"rtl";const e=this.services&&this.services.languageUtils||new O(V());return["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam","ckb"].indexOf(e.getLanguagePartFromCode(t))>-1||t.toLowerCase().indexOf("-arab")>1?"rtl":"ltr"}static createInstance(){return new U(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},arguments.length>1?arguments[1]:void 0)}cloneInstance(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:D;const s=t.forkResourceStore;s&&delete t.forkResourceStore;const i={...this.options,...t,isClone:!0},n=new U(i);void 0===t.debug&&void 0===t.prefix||(n.logger=n.logger.clone(t));return["store","services","language"].forEach((t=>{n[t]=this[t]})),n.services={...this.services},n.services.utils={hasLoadedNamespace:n.hasLoadedNamespace.bind(n)},s&&(n.store=new v(this.store.data,i),n.services.resourceStore=n.store),n.translator=new S(n.services,i),n.translator.on("*",(function(t){for(var e=arguments.length,s=new Array(e>1?e-1:0),i=1;i { - const langs = new Set(); - - // list of available languages: https://github.com/qbittorrent/qBittorrent/tree/master/src/webui/www/public/lang - const queryLang = new URLSearchParams(window.location.search).get('lang'); - if (queryLang !== null) { - // use the fallback lang if `queryLang` is present but empty - // limit the length of the language string to prevent Client-side Request Forgery - if ((queryLang.length > 0) && (queryLang.length <= 8)) - langs.add(queryLang.replace('-', '_')); - } - else { - for (const lang of navigator.languages) { - langs.add(lang.replace('-', '_')); - - const idx = lang.indexOf('-'); - if (idx > 0) - langs.add(lang.slice(0, idx)); - } - } - - langs.add('en'); // fallback - return Array.from(langs); - })(); - - // it is faster to fetch all translation files at once than one by one - const fetches = languages.map(lang => fetch(`lang/${lang}.json`)); - const fetchResults = await Promise.allSettled(fetches); - const translations = fetchResults - .map((value, idx) => ({ lang: languages[idx], result: value })) - .filter(v => (v.result.value.status === 200)); - const translation = { - lang: (translations.length > 0) ? translations[0].lang.replace('_', '-') : undefined, - data: (translations.length > 0) ? (await translations[0].result.value.json()) : {} - }; - - // present it to i18next - const i18nextOptions = { - lng: translation.lang, - fallbackLng: false, - load: 'currentOnly', - resources: { - [translation.lang]: { translation: translation.data } - }, - returnEmptyString: false - }; - i18next.init(i18nextOptions, replaceI18nText); -} - -function replaceI18nText() { - const tr = i18next.t; // workaround for warnings from i18next-parser - for (const element of document.getElementsByClassName('qbt-translatable')) { - const translationKey = element.getAttribute('data-i18n'); - const translatedValue = tr(translationKey); - switch (element.nodeName) { - case 'INPUT': - element.value = translatedValue; - break; - case 'LABEL': - element.textContent = translatedValue; - break; - default: - console.error(`Unhandled element: ${element}`); - break; - } - } - - document.documentElement.lang = i18next.language.split('-')[0]; -} +"use strict"; function submitLoginForm(event) { event.preventDefault(); - const errorMsgElement = document.getElementById('error_msg'); + const errorMsgElement = document.getElementById("error_msg"); const xhr = new XMLHttpRequest(); - xhr.open('POST', 'api/v2/auth/login', true); - xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=UTF-8'); - xhr.addEventListener('readystatechange', () => { + xhr.open("POST", "api/v2/auth/login", true); + xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8"); + xhr.addEventListener("readystatechange", () => { if (xhr.readyState === 4) { // DONE state if ((xhr.status === 200) && (xhr.responseText === "Ok.")) location.replace(location); else - errorMsgElement.textContent = i18next.t('Invalid Username or Password.'); + errorMsgElement.textContent = "QBT_TR(Invalid Username or Password.)QBT_TR[CONTEXT=HttpServer]"; } }); - xhr.addEventListener('error', () => { + xhr.addEventListener("error", () => { errorMsgElement.textContent = (xhr.responseText !== "") ? xhr.responseText - : i18next.t('Unable to log in, server is probably unreachable.'); + : "QBT_TR(Unable to log in, qBittorrent is probably unreachable.)QBT_TR[CONTEXT=HttpServer]"; }); - const usernameElement = document.getElementById('username'); - const passwordElement = document.getElementById('password'); + const usernameElement = document.getElementById("username"); + const passwordElement = document.getElementById("password"); const queryString = "username=" + encodeURIComponent(usernameElement.value) + "&password=" + encodeURIComponent(passwordElement.value); xhr.send(queryString); // clear the field - passwordElement.value = ''; + passwordElement.value = ""; } -document.addEventListener('DOMContentLoaded', () => { - const loginForm = document.getElementById('loginform'); - loginForm.setAttribute('method', 'POST'); - loginForm.addEventListener('submit', submitLoginForm); - - setupI18n(); +document.addEventListener("DOMContentLoaded", () => { + const loginForm = document.getElementById("loginform"); + loginForm.setAttribute("method", "POST"); + loginForm.addEventListener("submit", submitLoginForm); }); diff --git a/src/webui/www/translations/webui_ar.ts b/src/webui/www/translations/webui_ar.ts index 17ac63dd9..629f0bdb9 100644 --- a/src/webui/www/translations/webui_ar.ts +++ b/src/webui/www/translations/webui_ar.ts @@ -98,11 +98,11 @@ Resume torrents - استئناف التورنتات + استئناف التورنتات Pause torrents - إلباث التورنتات + إلباث التورنتات New Category @@ -120,6 +120,14 @@ Add subcategory... إضافة تصنيف فرعي... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - لا يمكن الولوج، والسبب على الأرجح هو عدم إمكانية الوصول إلى كيوبت‎تورنت. + لا يمكن الولوج، والسبب على الأرجح هو عدم إمكانية الوصول إلى كيوبت‎تورنت. Invalid Username or Password. - اسم المستخدم أو كلمة السر غير صالحة. + اسم المستخدم أو كلمة السر غير صالحة. Username - اسم المستخدم + اسم المستخدم Password - كلمة السر + كلمة السر Login - ولوج + ولوج Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - استئناف + استئناف Top Toolbar @@ -456,7 +468,7 @@ Resume All - استئناف الكل + استئناف الكل Statistics @@ -468,11 +480,11 @@ Pause - إلباث + إلباث Pause All - إلباث الكل + إلباث الكل Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - هل ترغب في استئناف جميع ملفات التورنت؟ + هل ترغب في استئناف جميع ملفات التورنت؟ Would you like to pause all torrents? - هل ترغب في إيقاف جميع ملفات التورنت مؤقتًا؟ + هل ترغب في إيقاف جميع ملفات التورنت مؤقتًا؟ Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - إضافة هذه المتتبعات تلقائيًا إلى التنزيلات الجديدة: + إضافة هذه المتتبعات تلقائيًا إلى التنزيلات الجديدة: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - إلباث التورنت + إلباث التورنت Remove torrent and its files @@ -1856,6 +1892,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2220,6 +2272,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2350,11 +2410,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resumed (0) - مُستأنف (0) + مُستأنف (0) Paused (0) - مُلبث (0) + مُلبث (0) Active (0) @@ -2386,11 +2446,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused (%1) - مُلبث (%1) + مُلبث (%1) Resumed (%1) - مُستأنف (%1) + مُستأنف (%1) Active (%1) @@ -2444,6 +2504,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) نقل (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2463,7 +2539,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Done % Done - اكتمل + اكتمل Status @@ -2600,6 +2676,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2736,7 +2820,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused - مُلبث + مُلبث Completed @@ -2802,6 +2886,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata [إجباري] يُنزّل البيانات الوصفية + + Stopped + + TransferListFiltersWidget @@ -2843,17 +2931,17 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resume Resume/start the torrent - استئناف + استئناف Force Resume Force Resume/start the torrent - إجبار الاستئناف + إجبار الاستئناف Pause Pause the torrent - إلباث + إلباث Limit share ratio... @@ -3025,6 +3113,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3270,6 +3370,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3332,6 +3436,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders الباذرون + + Published On + + SearchPluginsTable @@ -3399,11 +3507,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Pause torrents - إلباث التورنتات + إلباث التورنتات Resume torrents - استئناف التورنتات + استئناف التورنتات Remove unused tags @@ -3421,6 +3529,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents إزالة التورنت + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3561,6 +3677,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link تنزيل الرابط + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3860,7 +3992,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Add Paused: - إضافة المُلبث: + إضافة المُلبث: Please type the name of the new download rule. @@ -3920,12 +4052,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - استئناف التورنتات + استئناف التورنتات All (%1) @@ -3937,12 +4073,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - إلباث التورنتات + إلباث التورنتات Remove torrents إزالة التورنت + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4090,4 +4234,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_az@latin.ts b/src/webui/www/translations/webui_az@latin.ts index 13fdc4672..df20d8a95 100644 --- a/src/webui/www/translations/webui_az@latin.ts +++ b/src/webui/www/translations/webui_az@latin.ts @@ -98,11 +98,11 @@ Resume torrents - Torrentləri davam etdirmək + Torrentləri davam etdirmək Pause torrents - Torrentlərə fasilə + Torrentlərə fasilə New Category @@ -120,6 +120,14 @@ Add subcategory... Alt kateqoriya əlavə edin... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Giriş mümkün olmadı, qBittorrent çox güman ki, əlçatmazdır. + Giriş mümkün olmadı, qBittorrent çox güman ki, əlçatmazdır. Invalid Username or Password. - İstifadəçi adı və Şifrə səhvdir. + İstifadəçi adı və Şifrə səhvdir. Username - İstifadəçi adı + İstifadəçi adı Password - Şifrə + Şifrə Login - Giriş + Giriş Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Davam etdirmək + Davam etdirmək Top Toolbar @@ -456,7 +468,7 @@ Resume All - Hamısına davam + Hamısına davam Statistics @@ -468,11 +480,11 @@ Pause - Fasilə + Fasilə Pause All - Hamısına fasilə + Hamısına fasilə Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Bütün torrentlər davam etdirilsin? + Bütün torrentlər davam etdirilsin? Would you like to pause all torrents? - Bütün torrenlərə fasilə verilsin? + Bütün torrenlərə fasilə verilsin? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Bu izləyiciləri avtomatik yeni yükləmələrə əlavə edin: + Bu izləyiciləri avtomatik yeni yükləmələrə əlavə edin: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Torrentə fasilə + Torrentə fasilə Remove torrent and its files @@ -1904,6 +1940,22 @@ serveri tərəfindən istifadə olunan domen adını göstərməlisiniz. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2268,6 +2320,14 @@ serveri tərəfindən istifadə olunan domen adını göstərməlisiniz. Match all occurrences Bütün hadisələri uyğunlaşdırın + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2398,11 +2458,11 @@ serveri tərəfindən istifadə olunan domen adını göstərməlisiniz. Resumed (0) - Davam etdirilən (0) + Davam etdirilən (0) Paused (0) - Fasilədə (0) + Fasilədə (0) Active (0) @@ -2434,11 +2494,11 @@ serveri tərəfindən istifadə olunan domen adını göstərməlisiniz. Paused (%1) - Fasilədə (%1) + Fasilədə (%1) Resumed (%1) - Davam etdirilən (%1) + Davam etdirilən (%1) Active (%1) @@ -2492,6 +2552,22 @@ serveri tərəfindən istifadə olunan domen adını göstərməlisiniz. Moving (0) Köçürülür (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2511,7 +2587,7 @@ serveri tərəfindən istifadə olunan domen adını göstərməlisiniz. Done % Done - İcra olundu + İcra olundu Status @@ -2648,6 +2724,14 @@ serveri tərəfindən istifadə olunan domen adını göstərməlisiniz. Reannounce In Növbəti anons vaxtı + + Popularity + + + + Progress + + TrackerListWidget @@ -2784,7 +2868,7 @@ serveri tərəfindən istifadə olunan domen adını göstərməlisiniz. Paused - Fasilədə + Fasilədə Completed @@ -2850,6 +2934,10 @@ serveri tərəfindən istifadə olunan domen adını göstərməlisiniz. [F] Downloading metadata [F] Torrent verilənləri endirilir + + Stopped + + TransferListFiltersWidget @@ -2891,17 +2979,17 @@ serveri tərəfindən istifadə olunan domen adını göstərməlisiniz. Resume Resume/start the torrent - Davam etdirmək + Davam etdirmək Force Resume Force Resume/start the torrent - Məcburi davam etdirmək + Məcburi davam etdirmək Pause Pause the torrent - Fasilə + Fasilə Limit share ratio... @@ -3073,6 +3161,18 @@ serveri tərəfindən istifadə olunan domen adını göstərməlisiniz. Comment Şərh + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3318,6 +3418,10 @@ serveri tərəfindən istifadə olunan domen adını göstərməlisiniz. There aren't any search plugins installed. Heç bir axtarış plaqini quraşdırılmayıb + + Start a search above. + + PluginSelectDlg @@ -3380,6 +3484,10 @@ serveri tərəfindən istifadə olunan domen adını göstərməlisiniz. Seeders Göndəricilər + + Published On + + SearchPluginsTable @@ -3447,11 +3555,11 @@ serveri tərəfindən istifadə olunan domen adını göstərməlisiniz. Pause torrents - Torrentlərə fasilə + Torrentlərə fasilə Resume torrents - Torrentləri davam etdirmək + Torrentləri davam etdirmək Remove unused tags @@ -3469,6 +3577,14 @@ serveri tərəfindən istifadə olunan domen adını göstərməlisiniz. Remove torrents Torrentləri silin + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3609,6 +3725,22 @@ serveri tərəfindən istifadə olunan domen adını göstərməlisiniz. Download link Endirmə keçidi + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3908,7 +4040,7 @@ serveri tərəfindən istifadə olunan domen adını göstərməlisiniz. Add Paused: - Fasilədə, kimi əlavə edin: + Fasilədə, kimi əlavə edin: Please type the name of the new download rule. @@ -3968,12 +4100,16 @@ Bu formatlar dəstəklənir: S01E01, 1x1, 2017.12.31 və 31.12.2017 (Həmçinin Add Tags: Etiketlər əlavə edin: + + Add Stopped: + + TrackerFiltersList Resume torrents - Torrentləri davam etdirmək + Torrentləri davam etdirmək All (%1) @@ -3985,12 +4121,20 @@ Bu formatlar dəstəklənir: S01E01, 1x1, 2017.12.31 və 31.12.2017 (Həmçinin Pause torrents - Torrentlərə fasilə + Torrentlərə fasilə Remove torrents Torrentləri silin + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4138,4 +4282,11 @@ Bu formatlar dəstəklənir: S01E01, 1x1, 2017.12.31 və 31.12.2017 (Həmçinin Jurnallama səviyyəsini seçin... + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_be.ts b/src/webui/www/translations/webui_be.ts index b39aaff44..5d97d4fd8 100644 --- a/src/webui/www/translations/webui_be.ts +++ b/src/webui/www/translations/webui_be.ts @@ -98,11 +98,11 @@ Resume torrents - Узнавіць торэнты + Узнавіць торэнты Pause torrents - Спыніць торэнты + Спыніць торэнты New Category @@ -120,6 +120,14 @@ Add subcategory... Дадаць падкатэгорыю... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Немагчыма ўвайсці. Выглядае, што qBittorrent недасяжны. + Немагчыма ўвайсці. Выглядае, што qBittorrent недасяжны. Invalid Username or Password. - Нядзейсныя імя карыстальніка ці пароль. + Нядзейсныя імя карыстальніка ці пароль. Username - Імя карыстальніка + Імя карыстальніка Password - Пароль + Пароль Login - Логін + Логін Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Узнавціь + Узнавціь Top Toolbar @@ -456,7 +468,7 @@ Resume All - Узнавіць усё + Узнавіць усё Statistics @@ -468,11 +480,11 @@ Pause - Спыніць + Спыніць Pause All - Спыніць усё + Спыніць усё Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Сапраўды ўзнавіць усе торэнты? + Сапраўды ўзнавіць усе торэнты? Would you like to pause all torrents? - Сапраўды прыпыніць усе торэнты? + Сапраўды прыпыніць усе торэнты? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Аўтаматычна дадаваць гэтыя трэкеры да новых спамповак: + Аўтаматычна дадаваць гэтыя трэкеры да новых спамповак: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Прыпыніць торэнт + Прыпыніць торэнт Remove torrent and its files @@ -1868,6 +1904,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2232,6 +2284,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2362,11 +2422,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resumed (0) - Узноўленыя (0) + Узноўленыя (0) Paused (0) - Спыненыя (0) + Спыненыя (0) Active (0) @@ -2398,11 +2458,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused (%1) - Спыненыя (%1) + Спыненыя (%1) Resumed (%1) - Узноўленыя (%1) + Узноўленыя (%1) Active (%1) @@ -2456,6 +2516,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) Перамяшчаецца (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2475,7 +2551,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Done % Done - Рух + Рух Status @@ -2612,6 +2688,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2748,7 +2832,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused - Спынены + Спынены Completed @@ -2814,6 +2898,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata [F] Спампоўванне метаданых + + Stopped + + TransferListFiltersWidget @@ -2855,17 +2943,17 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resume Resume/start the torrent - Узнавіць + Узнавіць Force Resume Force Resume/start the torrent - Узнавіць прымусова + Узнавіць прымусова Pause Pause the torrent - Спыніць + Спыніць Limit share ratio... @@ -3037,6 +3125,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3282,6 +3382,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. Не ўсталявана аніякіх пошукавых убудоваў. + + Start a search above. + + PluginSelectDlg @@ -3344,6 +3448,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders Сіды + + Published On + + SearchPluginsTable @@ -3411,11 +3519,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Pause torrents - Прыпыніць торэнты + Прыпыніць торэнты Resume torrents - Узнавіць торэнты + Узнавіць торэнты Remove unused tags @@ -3433,6 +3541,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents Remove torrents + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3573,6 +3689,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link Спасылку спампоўвання + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3872,7 +4004,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Add Paused: - Дадаваць спыненым: + Дадаваць спыненым: Please type the name of the new download rule. @@ -3932,12 +4064,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: Дадаць тэгі: + + Add Stopped: + + TrackerFiltersList Resume torrents - Узнавіць торэнты + Узнавіць торэнты All (%1) @@ -3949,12 +4085,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - Прыпыніць торэнты + Прыпыніць торэнты Remove torrents Выдаліць торэнты + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4102,4 +4246,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Абраць узровень часапіса... + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_bg.ts b/src/webui/www/translations/webui_bg.ts index 0fb0ca72d..1122f6d83 100644 --- a/src/webui/www/translations/webui_bg.ts +++ b/src/webui/www/translations/webui_bg.ts @@ -98,11 +98,11 @@ Resume torrents - Продължаване на торентите + Продължаване на торентите Pause torrents - Пауза на торентите + Пауза на торентите New Category @@ -120,6 +120,14 @@ Add subcategory... Добавяне подкатегория... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Невъзможност за логване, qBittorrent вероятно е недостъпен. + Невъзможност за логване, qBittorrent вероятно е недостъпен. Invalid Username or Password. - Невалидно потребителско име или парола. + Невалидно потребителско име или парола. Username - Потребителско име + Потребителско име Password - Парола + Парола Login - Вход + Вход Apply @@ -408,6 +416,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -437,7 +449,7 @@ Resume - Пауза + Пауза Top Toolbar @@ -457,7 +469,7 @@ Resume All - Пауза Всички + Пауза Всички Statistics @@ -469,11 +481,11 @@ Pause - Пауза + Пауза Pause All - Пауза Всички + Пауза Всички Add Torrent File... @@ -622,11 +634,11 @@ Would you like to resume all torrents? - Бихте ли искали да продължите всички торенти? + Бихте ли искали да продължите всички торенти? Would you like to pause all torrents? - Бихте ли искали да поставите на пауза всички торенти? + Бихте ли искали да поставите на пауза всички торенти? Execution Log @@ -640,6 +652,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -693,7 +729,7 @@ Automatically add these trackers to new downloads: - Автоматично добавяне на тези тракери към нови сваляния: + Автоматично добавяне на тези тракери към нови сваляния: Web User Interface (Remote control) @@ -1207,7 +1243,7 @@ Pause torrent - Пауза на торент + Пауза на торент Remove torrent and its files @@ -1853,6 +1889,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2217,6 +2269,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2347,11 +2407,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resumed (0) - Продължени (0) + Продължени (0) Paused (0) - В Пауза (0) + В Пауза (0) Active (0) @@ -2383,11 +2443,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused (%1) - В Пауза (%1) + В Пауза (%1) Resumed (%1) - Продължени (%1) + Продължени (%1) Active (%1) @@ -2441,6 +2501,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) Преместване (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2460,7 +2536,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Done % Done - Готово + Готово Status @@ -2597,6 +2673,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2733,7 +2817,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused - Пауза + Пауза Completed @@ -2799,6 +2883,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata [П] Сваляне на метаданните + + Stopped + + TransferListFiltersWidget @@ -2840,17 +2928,17 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resume Resume/start the torrent - Продължи + Продължи Force Resume Force Resume/start the torrent - Насилствено Продължение + Насилствено Продължение Pause Pause the torrent - Пауза + Пауза Limit share ratio... @@ -3022,6 +3110,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3267,6 +3367,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. Няма никакви инсталирани търсещи приставки. + + Start a search above. + + PluginSelectDlg @@ -3329,6 +3433,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders Даващи + + Published On + + SearchPluginsTable @@ -3396,11 +3504,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Pause torrents - Пауза на торентите + Пауза на торентите Resume torrents - Продължи торентите + Продължи торентите Remove unused tags @@ -3418,6 +3526,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents Премахни торенти + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3558,6 +3674,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link Връзка за сваляне + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3857,7 +3989,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Add Paused: - Добави поставените на пауза: + Добави поставените на пауза: Please type the name of the new download rule. @@ -3917,12 +4049,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - Продължи торентите + Продължи торентите All (%1) @@ -3934,12 +4070,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - Пауза на торентите + Пауза на торентите Remove torrents Премахни торенти + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4087,4 +4231,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_ca.ts b/src/webui/www/translations/webui_ca.ts index f4055a297..dfabda5f0 100644 --- a/src/webui/www/translations/webui_ca.ts +++ b/src/webui/www/translations/webui_ca.ts @@ -98,11 +98,11 @@ Resume torrents - Reprèn els torrents + Reprèn els torrents Pause torrents - Interromp els torrents + Interromp els torrents New Category @@ -120,6 +120,14 @@ Add subcategory... Afegeix una subcategoria... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - No ha estat possible iniciar sessió, el qBittorrent deu estar il·localitzable en aquests moments. + 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. + Nom d'usuari o contrasenya incorrectes. Username - Nom d'usuari + Nom d'usuari Password - Contrasenya + Contrasenya Login - Inicia sessió + Inicia sessió Apply @@ -408,6 +416,10 @@ Si us plau, no useu cap caràcter especial al nom de la categoria. JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -437,7 +449,7 @@ Si us plau, no useu cap caràcter especial al nom de la categoria. Resume - Reprèn + Reprèn Top Toolbar @@ -457,7 +469,7 @@ Si us plau, no useu cap caràcter especial al nom de la categoria. Resume All - Reprèn-ho tot + Reprèn-ho tot Statistics @@ -469,11 +481,11 @@ Si us plau, no useu cap caràcter especial al nom de la categoria. Pause - Interromp + Interromp Pause All - Interromp-ho tot + Interromp-ho tot Add Torrent File... @@ -622,11 +634,11 @@ Si us plau, no useu cap caràcter especial al nom de la categoria. Would you like to resume all torrents? - Voleu reprendre tots els torrents? + Voleu reprendre tots els torrents? Would you like to pause all torrents? - Voleu interrompre tots els torrents? + Voleu interrompre tots els torrents? Execution Log @@ -640,6 +652,30 @@ Si us plau, no useu cap caràcter especial al nom de la categoria. [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -693,7 +729,7 @@ Si us plau, no useu cap caràcter especial al nom de la categoria. Automatically add these trackers to new downloads: - Afegeix automàticament aquests rastrejadors a les baixades noves: + Afegeix automàticament aquests rastrejadors a les baixades noves: Web User Interface (Remote control) @@ -1207,7 +1243,7 @@ Si us plau, no useu cap caràcter especial al nom de la categoria. Pause torrent - Interromp el torrent + Interromp el torrent Remove torrent and its files @@ -1905,6 +1941,22 @@ Useu ";" per separar les entrades. Podeu usar el comodí "*". Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2269,6 +2321,14 @@ Useu ";" per separar les entrades. Podeu usar el comodí "*". Match all occurrences Coincideix amb totes les ocurrències + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2399,11 +2459,11 @@ Useu ";" per separar les entrades. Podeu usar el comodí "*". Resumed (0) - Represos (0) + Represos (0) Paused (0) - Interromputs (0) + Interromputs (0) Active (0) @@ -2435,11 +2495,11 @@ Useu ";" per separar les entrades. Podeu usar el comodí "*". Paused (%1) - Interromputs (%1) + Interromputs (%1) Resumed (%1) - Represos (%1) + Represos (%1) Active (%1) @@ -2493,6 +2553,22 @@ Useu ";" per separar les entrades. Podeu usar el comodí "*". Moving (0) Es mou (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2512,7 +2588,7 @@ Useu ";" per separar les entrades. Podeu usar el comodí "*". Done % Done - Progrés + Progrés Status @@ -2649,6 +2725,14 @@ Useu ";" per separar les entrades. Podeu usar el comodí "*". Reannounce In Es torna a anunciar d'aquí a + + Popularity + + + + Progress + + TrackerListWidget @@ -2785,7 +2869,7 @@ Useu ";" per separar les entrades. Podeu usar el comodí "*". Paused - Interromput + Interromput Completed @@ -2851,6 +2935,10 @@ Useu ";" per separar les entrades. Podeu usar el comodí "*". [F] Downloading metadata [F] Baixant metadades + + Stopped + + TransferListFiltersWidget @@ -2892,17 +2980,17 @@ Useu ";" per separar les entrades. Podeu usar el comodí "*". Resume Resume/start the torrent - Reprèn + Reprèn Force Resume Force Resume/start the torrent - Força la represa + Força la represa Pause Pause the torrent - Interromp + Interromp Limit share ratio... @@ -3074,6 +3162,18 @@ Useu ";" per separar les entrades. Podeu usar el comodí "*". Comment Comentari + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3319,6 +3419,10 @@ Useu ";" per separar les entrades. Podeu usar el comodí "*". There aren't any search plugins installed. No hi ha cap connector de cerca instal·lat. + + Start a search above. + + PluginSelectDlg @@ -3381,6 +3485,10 @@ Useu ";" per separar les entrades. Podeu usar el comodí "*". Seeders Sembradors + + Published On + + SearchPluginsTable @@ -3448,11 +3556,11 @@ Useu ";" per separar les entrades. Podeu usar el comodí "*". Pause torrents - Interromp els torrents + Interromp els torrents Resume torrents - Reprèn els torrents + Reprèn els torrents Remove unused tags @@ -3470,6 +3578,14 @@ Useu ";" per separar les entrades. Podeu usar el comodí "*". Remove torrents Suprimeix els torrents + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3610,6 +3726,22 @@ Useu ";" per separar les entrades. Podeu usar el comodí "*". Download link Enllaç de baixada + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3909,7 +4041,7 @@ Useu ";" per separar les entrades. Podeu usar el comodí "*". Add Paused: - Afegeix els interromputs: + Afegeix els interromputs: Please type the name of the new download rule. @@ -3969,12 +4101,16 @@ Admet els formats S01E01, 1x1, 2017.12.31 i 31.12.2017 (Els formats de data tamb Add Tags: Afegeix etiquetes: + + Add Stopped: + + TrackerFiltersList Resume torrents - Reprèn els torrents + Reprèn els torrents All (%1) @@ -3986,12 +4122,20 @@ Admet els formats S01E01, 1x1, 2017.12.31 i 31.12.2017 (Els formats de data tamb Pause torrents - Interromp els torrents + Interromp els torrents Remove torrents Suprimeix els torrents + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4139,4 +4283,11 @@ Admet els formats S01E01, 1x1, 2017.12.31 i 31.12.2017 (Els formats de data tamb Trieu un nivell de registre... + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_cs.ts b/src/webui/www/translations/webui_cs.ts index f22f06d03..8b169f306 100644 --- a/src/webui/www/translations/webui_cs.ts +++ b/src/webui/www/translations/webui_cs.ts @@ -98,11 +98,11 @@ Resume torrents - Obnovit torrenty + Obnovit torrenty Pause torrents - Zastavit torrenty + Zastavit torrenty New Category @@ -120,6 +120,14 @@ Add subcategory... Přidat podkategorii + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Nelze se přihlásit, qBittorrent je pravděpodobně nedostupný + Nelze se přihlásit, qBittorrent je pravděpodobně nedostupný Invalid Username or Password. - Neplatné jméno nebo heslo + Neplatné jméno nebo heslo Username - Uživatelské jméno + Uživatelské jméno Password - Heslo + Heslo Login - Přihlášení + Přihlášení Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Obnovit + Obnovit Top Toolbar @@ -456,7 +468,7 @@ Resume All - Obnovit vše + Obnovit vše Statistics @@ -468,11 +480,11 @@ Pause - Zastavit + Zastavit Pause All - Zastavit vše + Zastavit vše Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Přejete si obnovit všechny torrenty? + Přejete si obnovit všechny torrenty? Would you like to pause all torrents? - Přejete si pozastavit všechny torrenty? + Přejete si pozastavit všechny torrenty? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Automaticky přidat tyto trackery k novým stahováním: + Automaticky přidat tyto trackery k novým stahováním: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Zastavit torrent + Zastavit torrent Remove torrent and its files @@ -1904,6 +1940,22 @@ Použijte ';' pro oddělení více položek. Můžete použít masku '*'.Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2268,6 +2320,14 @@ Použijte ';' pro oddělení více položek. Můžete použít masku '*'.Match all occurrences Odpovídat všem výskytům + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2398,11 +2458,11 @@ Použijte ';' pro oddělení více položek. Můžete použít masku '*'. Resumed (0) - Obnoveno (0) + Obnoveno (0) Paused (0) - Zastaveno (0) + Zastaveno (0) Active (0) @@ -2434,11 +2494,11 @@ Použijte ';' pro oddělení více položek. Můžete použít masku '*'. Paused (%1) - Zastaveno (%1) + Zastaveno (%1) Resumed (%1) - Obnoveno (%1) + Obnoveno (%1) Active (%1) @@ -2492,6 +2552,22 @@ Použijte ';' pro oddělení více položek. Můžete použít masku '*'.Moving (0) Přesouvání (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2511,7 +2587,7 @@ Použijte ';' pro oddělení více položek. Můžete použít masku '*'. Done % Done - Hotovo + Hotovo Status @@ -2648,6 +2724,14 @@ Použijte ';' pro oddělení více položek. Můžete použít masku '*'.Reannounce In Znovu oznámit za + + Popularity + + + + Progress + + TrackerListWidget @@ -2784,7 +2868,7 @@ Použijte ';' pro oddělení více položek. Můžete použít masku '*'. Paused - Zastaveno + Zastaveno Completed @@ -2850,6 +2934,10 @@ Použijte ';' pro oddělení více položek. Můžete použít masku '*'.[F] Downloading metadata [F] Stahuji metadata + + Stopped + + TransferListFiltersWidget @@ -2891,17 +2979,17 @@ Použijte ';' pro oddělení více položek. Můžete použít masku '*'. Resume Resume/start the torrent - Obnovit + Obnovit Force Resume Force Resume/start the torrent - Vynutit obnovení + Vynutit obnovení Pause Pause the torrent - Zastavit + Zastavit Limit share ratio... @@ -3073,6 +3161,18 @@ Použijte ';' pro oddělení více položek. Můžete použít masku '*'.Comment Komentář + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3318,6 +3418,10 @@ Použijte ';' pro oddělení více položek. Můžete použít masku '*'.There aren't any search plugins installed. Žádné vyhledávací pluginy nejsou instalovány. + + Start a search above. + + PluginSelectDlg @@ -3380,6 +3484,10 @@ Použijte ';' pro oddělení více položek. Můžete použít masku '*'.Seeders Seedeři + + Published On + + SearchPluginsTable @@ -3447,11 +3555,11 @@ Použijte ';' pro oddělení více položek. Můžete použít masku '*'. Pause torrents - Zastavení torrentů + Zastavení torrentů Resume torrents - Pokračování torrentů + Pokračování torrentů Remove unused tags @@ -3469,6 +3577,14 @@ Použijte ';' pro oddělení více položek. Můžete použít masku '*'.Remove torrents Odstranit torrenty + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3609,6 +3725,22 @@ Použijte ';' pro oddělení více položek. Můžete použít masku '*'.Download link Download link + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3908,7 +4040,7 @@ Použijte ';' pro oddělení více položek. Můžete použít masku '*'. Add Paused: - Přidat zastavený: + Přidat zastavený: Please type the name of the new download rule. @@ -3968,12 +4100,16 @@ Podporuje formáty: S01E01, 1x1, 2017.12.31 a 31.12.2017 (Formáty dat také pod Add Tags: Přidat štítky: + + Add Stopped: + + TrackerFiltersList Resume torrents - Obnovit torrenty + Obnovit torrenty All (%1) @@ -3985,12 +4121,20 @@ Podporuje formáty: S01E01, 1x1, 2017.12.31 a 31.12.2017 (Formáty dat také pod Pause torrents - Zastavit torrenty + Zastavit torrenty Remove torrents Odstranit torrenty + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4138,4 +4282,11 @@ Podporuje formáty: S01E01, 1x1, 2017.12.31 a 31.12.2017 (Formáty dat také pod Vyber úroveň logu: + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_da.ts b/src/webui/www/translations/webui_da.ts index 8a83b4e02..a79ba5211 100644 --- a/src/webui/www/translations/webui_da.ts +++ b/src/webui/www/translations/webui_da.ts @@ -98,11 +98,11 @@ Resume torrents - Genoptag torrents + Genoptag torrents Pause torrents - Sæt torrents på pause + Sæt torrents på pause New Category @@ -120,6 +120,14 @@ Add subcategory... Tilføj underkategori... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ 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, qBittorrent er formodentligt ikke til at få kontakt med. Invalid Username or Password. - Ugyldigt brugernavn eller adgangskode. + Ugyldigt brugernavn eller adgangskode. Username - Brugernavn + Brugernavn Password - Adgangskode + Adgangskode Login - Login + Login Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Genoptag + Genoptag Top Toolbar @@ -456,7 +468,7 @@ Resume All - Genoptag alle + Genoptag alle Statistics @@ -468,11 +480,11 @@ Pause - Sæt på pause + Sæt på pause Pause All - Sæt alle på pause + Sæt alle på pause Add Torrent File... @@ -619,14 +631,6 @@ Remove Fjern - - Would you like to resume all torrents? - - - - Would you like to pause all torrents? - - Execution Log Eksekveringslog @@ -639,6 +643,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +720,7 @@ Automatically add these trackers to new downloads: - Tilføj automatisk disse trackere til nye downloads: + Tilføj automatisk disse trackere til nye downloads: Web User Interface (Remote control) @@ -1206,7 +1234,7 @@ Pause torrent - Sæt torrent på pause + Sæt torrent på pause Remove torrent and its files @@ -1856,6 +1884,22 @@ Brug ';' til af adskille flere indtastninger. Jokertegnet '*' kan bruges.Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2220,6 +2264,14 @@ Brug ';' til af adskille flere indtastninger. Jokertegnet '*' kan bruges.Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2350,11 +2402,11 @@ Brug ';' til af adskille flere indtastninger. Jokertegnet '*' kan bruges. Resumed (0) - Genoptaget (0) + Genoptaget (0) Paused (0) - Sat på pause (0) + Sat på pause (0) Active (0) @@ -2386,11 +2438,11 @@ Brug ';' til af adskille flere indtastninger. Jokertegnet '*' kan bruges. Paused (%1) - Sat på pause (%1) + Sat på pause (%1) Resumed (%1) - Genoptaget (%1) + Genoptaget (%1) Active (%1) @@ -2444,6 +2496,22 @@ Brug ';' til af adskille flere indtastninger. Jokertegnet '*' kan bruges.Moving (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2463,7 +2531,7 @@ Brug ';' til af adskille flere indtastninger. Jokertegnet '*' kan bruges. Done % Done - Færdig + Færdig Status @@ -2600,6 +2668,14 @@ Brug ';' til af adskille flere indtastninger. Jokertegnet '*' kan bruges.Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2736,7 +2812,7 @@ Brug ';' til af adskille flere indtastninger. Jokertegnet '*' kan bruges. Paused - Sat på pause + Sat på pause Completed @@ -2802,6 +2878,10 @@ Brug ';' til af adskille flere indtastninger. Jokertegnet '*' kan bruges.[F] Downloading metadata + + Stopped + + TransferListFiltersWidget @@ -2843,17 +2923,17 @@ Brug ';' til af adskille flere indtastninger. Jokertegnet '*' kan bruges. Resume Resume/start the torrent - Genoptag + Genoptag Force Resume Force Resume/start the torrent - Tving genoptag + Tving genoptag Pause Pause the torrent - Sæt på pause + Sæt på pause Limit share ratio... @@ -3025,6 +3105,18 @@ Brug ';' til af adskille flere indtastninger. Jokertegnet '*' kan bruges.Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3270,6 +3362,10 @@ Brug ';' til af adskille flere indtastninger. Jokertegnet '*' kan bruges.There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3332,6 +3428,10 @@ Brug ';' til af adskille flere indtastninger. Jokertegnet '*' kan bruges.Seeders Seedere + + Published On + + SearchPluginsTable @@ -3399,11 +3499,11 @@ Brug ';' til af adskille flere indtastninger. Jokertegnet '*' kan bruges. Pause torrents - Sæt torrents på pause + Sæt torrents på pause Resume torrents - Genoptag torrents + Genoptag torrents Remove unused tags @@ -3421,6 +3521,14 @@ Brug ';' til af adskille flere indtastninger. Jokertegnet '*' kan bruges.Remove torrents + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3561,6 +3669,22 @@ Brug ';' til af adskille flere indtastninger. Jokertegnet '*' kan bruges.Download link Downloadlink + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3860,7 +3984,7 @@ Brug ';' til af adskille flere indtastninger. Jokertegnet '*' kan bruges. Add Paused: - Tilføj sat på pause: + Tilføj sat på pause: Please type the name of the new download rule. @@ -3919,12 +4043,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - Genoptag torrents + Genoptag torrents All (%1) @@ -3936,12 +4064,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - Sæt torrents på pause + Sæt torrents på pause Remove torrents + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4089,4 +4225,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_de.ts b/src/webui/www/translations/webui_de.ts index 9f8dc02d7..353c8d677 100644 --- a/src/webui/www/translations/webui_de.ts +++ b/src/webui/www/translations/webui_de.ts @@ -98,11 +98,11 @@ Resume torrents - Torrents fortsetzen + Torrents fortsetzen Pause torrents - Torrents pausieren + Torrents pausieren New Category @@ -120,6 +120,14 @@ Add subcategory... Unterkategorie hinzufügen ... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Fehler beim Einloggen – vermutlich ist qBittorrent nicht erreichbar. + Fehler beim Einloggen – vermutlich ist qBittorrent nicht erreichbar. Invalid Username or Password. - Ungültiger Benutzername oder Passwort. + Ungültiger Benutzername oder Passwort. Username - Benutzername + Benutzername Password - Passwort + Passwort Login - Anmelden + Anmelden Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Fortsetzen + Fortsetzen Top Toolbar @@ -456,7 +468,7 @@ Resume All - Alle fortsetzen + Alle fortsetzen Statistics @@ -468,11 +480,11 @@ Pause - Pausieren + Pausieren Pause All - Alle anhalten + Alle anhalten Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Sollen alle Torrents fortgesetzt werden? + Sollen alle Torrents fortgesetzt werden? Would you like to pause all torrents? - Sollen alle Torrents angehalten werden? + Sollen alle Torrents angehalten werden? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Diese Tracker automatisch zu neuen Downloads hinzufügen: + Diese Tracker automatisch zu neuen Downloads hinzufügen: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Torrent pausieren + Torrent pausieren Remove torrent and its files @@ -1906,6 +1942,22 @@ Platzhalter '*' kann verwendet werden. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2270,6 +2322,14 @@ Platzhalter '*' kann verwendet werden. Match all occurrences Alle Vorkommen abgleichen + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2400,11 +2460,11 @@ Platzhalter '*' kann verwendet werden. Resumed (0) - Fortgesetzt (0) + Fortgesetzt (0) Paused (0) - Pausiert (0) + Pausiert (0) Active (0) @@ -2436,11 +2496,11 @@ Platzhalter '*' kann verwendet werden. Paused (%1) - Pausiert (%1) + Pausiert (%1) Resumed (%1) - Fortgesetzt (%1) + Fortgesetzt (%1) Active (%1) @@ -2494,6 +2554,22 @@ Platzhalter '*' kann verwendet werden. Moving (0) Verschiebe (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2513,7 +2589,7 @@ Platzhalter '*' kann verwendet werden. Done % Done - Fertig + Fertig Status @@ -2650,6 +2726,14 @@ Platzhalter '*' kann verwendet werden. Reannounce In Erneute Anmeldung in + + Popularity + + + + Progress + + TrackerListWidget @@ -2786,7 +2870,7 @@ Platzhalter '*' kann verwendet werden. Paused - Angehalten + Angehalten Completed @@ -2852,6 +2936,10 @@ Platzhalter '*' kann verwendet werden. [F] Downloading metadata [F] Lade Metadaten + + Stopped + + TransferListFiltersWidget @@ -2893,17 +2981,17 @@ Platzhalter '*' kann verwendet werden. Resume Resume/start the torrent - Fortsetzen + Fortsetzen Force Resume Force Resume/start the torrent - Fortsetzen erzwingen + Fortsetzen erzwingen Pause Pause the torrent - Anhalten + Anhalten Limit share ratio... @@ -3075,6 +3163,18 @@ Platzhalter '*' kann verwendet werden. Comment Kommentar + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3320,6 +3420,10 @@ Platzhalter '*' kann verwendet werden. There aren't any search plugins installed. Es sind keine Such-Plugins installiert. + + Start a search above. + + PluginSelectDlg @@ -3382,6 +3486,10 @@ Platzhalter '*' kann verwendet werden. Seeders Seeder + + Published On + + SearchPluginsTable @@ -3449,11 +3557,11 @@ Platzhalter '*' kann verwendet werden. Pause torrents - Torrents pausieren + Torrents pausieren Resume torrents - Torrents fortsetzen + Torrents fortsetzen Remove unused tags @@ -3471,6 +3579,14 @@ Platzhalter '*' kann verwendet werden. Remove torrents Torrents entfernen + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3611,6 +3727,22 @@ Platzhalter '*' kann verwendet werden. Download link Download-Link + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3910,7 +4042,7 @@ Platzhalter '*' kann verwendet werden. Add Paused: - Pausiert hinzufügen: + Pausiert hinzufügen: Please type the name of the new download rule. @@ -3970,12 +4102,16 @@ Er unterstützt die Formate: S01E01, 1x1, 2017.12.31 und 31.12.2017 (Datums-Form Add Tags: Schlagwörter hinzufügen: + + Add Stopped: + + TrackerFiltersList Resume torrents - Torrents fortsetzen + Torrents fortsetzen All (%1) @@ -3987,12 +4123,20 @@ Er unterstützt die Formate: S01E01, 1x1, 2017.12.31 und 31.12.2017 (Datums-Form Pause torrents - Torrents pausieren + Torrents pausieren Remove torrents Torrents entfernen + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4140,4 +4284,11 @@ Er unterstützt die Formate: S01E01, 1x1, 2017.12.31 und 31.12.2017 (Datums-Form Wähle ein Log Level... + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_el.ts b/src/webui/www/translations/webui_el.ts index 5046bcce2..6f69703da 100644 --- a/src/webui/www/translations/webui_el.ts +++ b/src/webui/www/translations/webui_el.ts @@ -98,11 +98,11 @@ Resume torrents - Συνέχιση torrents + Συνέχιση torrents Pause torrents - Παύση των torrents + Παύση των torrents New Category @@ -120,6 +120,14 @@ Add subcategory... Προσθήκη υποκατηγορίας... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Αδυναμία σύνδεσης, το qBittorrent είναι πιθανώς μη διαθέσιμο. + Αδυναμία σύνδεσης, το qBittorrent είναι πιθανώς μη διαθέσιμο. Invalid Username or Password. - Μη έγκυρο Όνομα Χρήστη ή Κωδικός Πρόσβασης. + Μη έγκυρο Όνομα Χρήστη ή Κωδικός Πρόσβασης. Username - Όνομα χρήστη + Όνομα χρήστη Password - Κωδικός Πρόσβασης + Κωδικός Πρόσβασης Login - Σύνδεση + Σύνδεση Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Συνέχιση + Συνέχιση Top Toolbar @@ -456,7 +468,7 @@ Resume All - Συνέχιση Όλων + Συνέχιση Όλων Statistics @@ -468,11 +480,11 @@ Pause - Παύση + Παύση Pause All - Παύση Όλων + Παύση Όλων Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Θέλετε σίγουρα να θέσετε σε συνέχιση όλα τα torrent; + Θέλετε σίγουρα να θέσετε σε συνέχιση όλα τα torrent; Would you like to pause all torrents? - Θέλετε σίγουρα να θέσετε σε παύση όλα τα torrent; + Θέλετε σίγουρα να θέσετε σε παύση όλα τα torrent; Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Αυτόματη προσθήκη αυτών των trackers σε νέες λήψεις: + Αυτόματη προσθήκη αυτών των trackers σε νέες λήψεις: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Παύση torrent + Παύση torrent Remove torrent and its files @@ -1904,6 +1940,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2268,6 +2320,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences Αντιστοίχιση όλων των εμφανίσεων + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2398,11 +2458,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resumed (0) - Σε Συνέχιση (0) + Σε Συνέχιση (0) Paused (0) - Σε Παύση (0) + Σε Παύση (0) Active (0) @@ -2434,11 +2494,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused (%1) - Σε Παύση (%1) + Σε Παύση (%1) Resumed (%1) - Σε Συνέχιση (%1) + Σε Συνέχιση (%1) Active (%1) @@ -2492,6 +2552,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) Μετακίνηση (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2511,7 +2587,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Done % Done - Ολοκληρώθηκε + Ολοκληρώθηκε Status @@ -2648,6 +2724,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In Επανανακοίνωση σε: + + Popularity + + + + Progress + + TrackerListWidget @@ -2784,7 +2868,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused - Σε Παύση + Σε Παύση Completed @@ -2850,6 +2934,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata [Ε] Λήψη μεταδεδομένων + + Stopped + + TransferListFiltersWidget @@ -2891,17 +2979,17 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resume Resume/start the torrent - Συνέχιση + Συνέχιση Force Resume Force Resume/start the torrent - Εξαναγκαστική Συνέχιση + Εξαναγκαστική Συνέχιση Pause Pause the torrent - Παύση + Παύση Limit share ratio... @@ -3073,6 +3161,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment Σχόλιο + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3318,6 +3418,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. Δεν υπάρχουν εγκατεστημένες προσθήκες + + Start a search above. + + PluginSelectDlg @@ -3380,6 +3484,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders Seeders + + Published On + + SearchPluginsTable @@ -3447,11 +3555,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Pause torrents - Παύση των torrents + Παύση των torrents Resume torrents - Συνέχιση των torrents + Συνέχιση των torrents Remove unused tags @@ -3469,6 +3577,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents Αφαίρεση torrent + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3609,6 +3725,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link Σύνδεσμος λήψης + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3908,7 +4040,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Add Paused: - Προσθήκη Σε Παύση: + Προσθήκη Σε Παύση: Please type the name of the new download rule. @@ -3968,12 +4100,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: Προσθήκη ετικετών + + Add Stopped: + + TrackerFiltersList Resume torrents - Συνέχιση των torrents + Συνέχιση των torrents All (%1) @@ -3985,12 +4121,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - Παύση των torrents + Παύση των torrents Remove torrents Αφαίρεση torrent + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4138,4 +4282,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Επιλέξτε ένα επίπεδο καταγραφής... + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_en.ts b/src/webui/www/translations/webui_en.ts index 1c343412a..73571d70d 100644 --- a/src/webui/www/translations/webui_en.ts +++ b/src/webui/www/translations/webui_en.ts @@ -96,14 +96,6 @@ Remove unused categories - - Resume torrents - - - - Pause torrents - - New Category @@ -120,6 +112,14 @@ Add subcategory... + + Start torrents + + + + Stop torrents + + HttpServer @@ -375,6 +375,30 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Unable to log in, qBittorrent is probably unreachable. + + + + Could not contact qBittorrent + + + + Password + + + + Username + + + + Invalid Username or Password. + + + + Login + + MainWindow @@ -402,10 +426,6 @@ Options... - - Resume - - Top Toolbar @@ -422,10 +442,6 @@ Donate! - - Resume All - - Statistics @@ -434,14 +450,6 @@ About - - Pause - - - - Pause All - - Add Torrent File... @@ -582,14 +590,6 @@ Remove - - Would you like to resume all torrents? - - - - Would you like to pause all torrents? - - Execution Log @@ -602,6 +602,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -649,10 +673,6 @@ Torrent Queueing - - Automatically add these trackers to new downloads: - - Web User Interface (Remote control) @@ -1147,10 +1167,6 @@ Fastest upload - - Pause torrent - - Remove torrent and its files @@ -1795,6 +1811,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2159,6 +2191,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2287,14 +2327,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. Completed (0) - - Resumed (0) - - - - Paused (0) - - Active (0) @@ -2323,14 +2355,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. Completed (%1) - - Paused (%1) - - - - Resumed (%1) - - Active (%1) @@ -2383,6 +2407,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2399,11 +2439,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. i.e: torrent size - - Done - % Done - - Status Torrent status (e.g. downloading, seeding, paused) @@ -2539,6 +2574,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2673,10 +2716,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. e.g.: 1h 20m ago - - Paused - - Completed @@ -2741,6 +2780,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata + + Stopped + + TransferListFiltersWidget @@ -2779,21 +2822,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. Rename - - Resume - Resume/start the torrent - - - - Force Resume - Force Resume/start the torrent - - - - Pause - Pause the torrent - - Limit share ratio... @@ -2964,6 +2992,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3209,6 +3249,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3271,6 +3315,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders + + Published On + + SearchPluginsTable @@ -3336,14 +3384,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. Tag: - - Pause torrents - - - - Resume torrents - - Remove unused tags @@ -3360,6 +3400,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3500,6 +3548,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3797,10 +3861,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. If word order is important use * instead of whitespace. - - Add Paused: - - Please type the name of the new download rule. @@ -3858,13 +3918,13 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: + + Add Stopped: + + TrackerFiltersList - - Resume torrents - - All (%1) @@ -3874,11 +3934,15 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also - Pause torrents + Remove torrents - Remove torrents + Start torrents + + + + Stop torrents @@ -4028,4 +4092,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_en_AU.ts b/src/webui/www/translations/webui_en_AU.ts index 05fe0b5cc..dbba82adc 100644 --- a/src/webui/www/translations/webui_en_AU.ts +++ b/src/webui/www/translations/webui_en_AU.ts @@ -98,11 +98,11 @@ Resume torrents - Resume torrents + Resume torrents Pause torrents - Pause torrents + Pause torrents New Category @@ -120,6 +120,14 @@ Add subcategory... Add subcategory... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Unable to log in, qBittorrent is probably unreachable. + Unable to log in, qBittorrent is probably unreachable. Invalid Username or Password. - Invalid Username or Password. + Invalid Username or Password. Username - Username + Username Password - Password + Password Login - Login + Login Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Resume + Resume Top Toolbar @@ -456,7 +468,7 @@ Resume All - Resume All + Resume All Statistics @@ -468,11 +480,11 @@ Pause - Pause + Pause Pause All - Pause All + Pause All Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Would you like to resume all torrents? + Would you like to resume all torrents? Would you like to pause all torrents? - Would you like to pause all torrents? + Would you like to pause all torrents? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Automatically add these trackers to new downloads: + Automatically add these trackers to new downloads: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Pause torrent + Pause torrent Remove torrent and its files @@ -1904,6 +1940,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2268,6 +2320,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2398,11 +2458,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resumed (0) - Resumed (0) + Resumed (0) Paused (0) - Paused (0) + Paused (0) Active (0) @@ -2434,11 +2494,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused (%1) - Paused (%1) + Paused (%1) Resumed (%1) - Resumed (%1) + Resumed (%1) Active (%1) @@ -2492,6 +2552,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) Moving (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2511,7 +2587,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Done % Done - Done + Done Status @@ -2648,6 +2724,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2784,7 +2868,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused - Paused + Paused Completed @@ -2850,6 +2934,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata [F] Downloading metadata + + Stopped + + TransferListFiltersWidget @@ -2891,17 +2979,17 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resume Resume/start the torrent - Resume + Resume Force Resume Force Resume/start the torrent - Force Resume + Force Resume Pause Pause the torrent - Pause + Pause Limit share ratio... @@ -3073,6 +3161,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3318,6 +3418,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3380,6 +3484,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders Seeders + + Published On + + SearchPluginsTable @@ -3447,11 +3555,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Pause torrents - Pause torrents + Pause torrents Resume torrents - Resume torrents + Resume torrents Remove unused tags @@ -3469,6 +3577,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents Remove torrents + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3609,6 +3725,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link Download link + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3908,7 +4040,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Add Paused: - Add Paused: + Add Paused: Please type the name of the new download rule. @@ -3968,12 +4100,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - Resume torrents + Resume torrents All (%1) @@ -3985,12 +4121,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - Pause torrents + Pause torrents Remove torrents Remove torrents + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4138,4 +4282,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Choose a log level... + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_en_GB.ts b/src/webui/www/translations/webui_en_GB.ts index 342a1f9e6..426596870 100644 --- a/src/webui/www/translations/webui_en_GB.ts +++ b/src/webui/www/translations/webui_en_GB.ts @@ -98,11 +98,11 @@ Resume torrents - Resume torrents + Resume torrents Pause torrents - Pause torrents + Pause torrents New Category @@ -120,6 +120,14 @@ Add subcategory... Add subcategory... + + Start torrents + + + + Stop torrents + + HttpServer @@ -189,7 +197,7 @@ Login - Login + Login Apply @@ -379,6 +387,26 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Unable to log in, qBittorrent is probably unreachable. + + + + Could not contact qBittorrent + + + + Password + + + + Username + + + + Invalid Username or Password. + + MainWindow @@ -408,7 +436,7 @@ Resume - Resume + Resume Top Toolbar @@ -428,7 +456,7 @@ Resume All - Resume All + Resume All Statistics @@ -440,11 +468,11 @@ Pause - Pause + Pause Pause All - Pause All + Pause All Add Torrent File... @@ -591,14 +619,6 @@ Remove Remove - - Would you like to resume all torrents? - - - - Would you like to pause all torrents? - - Execution Log Execution Log @@ -611,6 +631,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -662,10 +706,6 @@ Torrent Queueing Torrent Queueing - - Automatically add these trackers to new downloads: - - Web User Interface (Remote control) @@ -1168,10 +1208,6 @@ Fastest upload Fastest upload - - Pause torrent - - Remove torrent and its files @@ -1820,6 +1856,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2184,6 +2236,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2312,14 +2372,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. Completed (0) - - Resumed (0) - - - - Paused (0) - - Active (0) @@ -2348,14 +2400,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. Completed (%1) - - Paused (%1) - - - - Resumed (%1) - - Active (%1) @@ -2408,6 +2452,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2427,7 +2487,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Done % Done - Done + Done Status @@ -2564,6 +2624,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2700,7 +2768,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused - Paused + Paused Completed @@ -2766,6 +2834,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata + + Stopped + + TransferListFiltersWidget @@ -2807,17 +2879,17 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resume Resume/start the torrent - Resume + Resume Force Resume Force Resume/start the torrent - Force Resume + Force Resume Pause Pause the torrent - Pause + Pause Limit share ratio... @@ -2989,6 +3061,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3234,6 +3318,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3296,6 +3384,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders Seeders + + Published On + + SearchPluginsTable @@ -3363,11 +3455,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Pause torrents - Pause torrents + Pause torrents Resume torrents - Resume torrents + Resume torrents Remove unused tags @@ -3385,6 +3477,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents Remove torrents + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3525,6 +3625,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3824,7 +3940,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Add Paused: - Add Paused: + Add Paused: Please type the name of the new download rule. @@ -3884,12 +4000,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - Resume torrents + Resume torrents All (%1) @@ -3901,12 +4021,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - Pause torrents + Pause torrents Remove torrents Remove torrents + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4054,4 +4182,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_eo.ts b/src/webui/www/translations/webui_eo.ts index 0d240bfe1..0814b8be9 100644 --- a/src/webui/www/translations/webui_eo.ts +++ b/src/webui/www/translations/webui_eo.ts @@ -98,11 +98,11 @@ Resume torrents - Reaktivigi la torentojn + Reaktivigi la torentojn Pause torrents - Paŭzigi la torentojn + Paŭzigi la torentojn New Category @@ -120,6 +120,14 @@ Add subcategory... + + Start torrents + + + + Stop torrents + + HttpServer @@ -189,19 +197,19 @@ Unable to log in, qBittorrent is probably unreachable. - Ne eblis ensaluti, qBittorrent eblas esti neatingebla. + Ne eblis ensaluti, qBittorrent eblas esti neatingebla. Invalid Username or Password. - Malvalida uzantnomo aŭ pasvorto. + Malvalida uzantnomo aŭ pasvorto. Password - Pasvorto + Pasvorto Login - Ensaluti + Ensaluti Apply @@ -391,6 +399,14 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + + + Username + + MainWindow @@ -420,7 +436,7 @@ Resume - Reaktivigi + Reaktivigi Top Toolbar @@ -440,7 +456,7 @@ Resume All - Reaktivigu Ĉion + Reaktivigu Ĉion Statistics @@ -452,11 +468,11 @@ Pause - Paŭzigu + Paŭzigu Pause All - Paŭzigu Ĉion + Paŭzigu Ĉion Add Torrent File... @@ -603,14 +619,6 @@ Remove - - Would you like to resume all torrents? - - - - Would you like to pause all torrents? - - Execution Log @@ -623,6 +631,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -676,7 +708,7 @@ Automatically add these trackers to new downloads: - Aŭtomate aldoni tiujn spurilojn al novaj elŝutoj: + Aŭtomate aldoni tiujn spurilojn al novaj elŝutoj: Web User Interface (Remote control) @@ -1176,10 +1208,6 @@ Fastest upload - - Pause torrent - - Remove torrent and its files @@ -1824,6 +1852,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2188,6 +2232,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2318,11 +2370,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resumed (0) - Reaktiviĝita (0) + Reaktiviĝita (0) Paused (0) - Paŭzinta (0) + Paŭzinta (0) Active (0) @@ -2354,11 +2406,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused (%1) - Paŭzinta (%1) + Paŭzinta (%1) Resumed (%1) - Reaktiviĝita (%1) + Reaktiviĝita (%1) Active (%1) @@ -2412,6 +2464,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2431,7 +2499,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Done % Done - Finita + Finita Status @@ -2568,6 +2636,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2704,7 +2780,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused - Paŭzinta + Paŭzinta Completed @@ -2770,6 +2846,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata + + Stopped + + TransferListFiltersWidget @@ -2811,17 +2891,17 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resume Resume/start the torrent - Reaktivigi + Reaktivigi Force Resume Force Resume/start the torrent - Devigi reaktivigado + Devigi reaktivigado Pause Pause the torrent - Paŭzigi + Paŭzigi Limit share ratio... @@ -2993,6 +3073,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3238,6 +3330,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3300,6 +3396,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders Fontoj + + Published On + + SearchPluginsTable @@ -3367,11 +3467,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Pause torrents - Paŭzigi la torentojn + Paŭzigi la torentojn Resume torrents - Reaktivigi la torentojn + Reaktivigi la torentojn Remove unused tags @@ -3389,6 +3489,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3529,6 +3637,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3828,7 +3952,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Add Paused: - Aldoni Paŭzinte: + Aldoni Paŭzinte: Please type the name of the new download rule. @@ -3887,12 +4011,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - Reaktivigi la torentojn + Reaktivigi la torentojn All (%1) @@ -3904,12 +4032,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - Paŭzigi la torentojn + Paŭzigi la torentojn Remove torrents + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4057,4 +4193,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_es.ts b/src/webui/www/translations/webui_es.ts index 0cfc88d6b..4df2b650f 100644 --- a/src/webui/www/translations/webui_es.ts +++ b/src/webui/www/translations/webui_es.ts @@ -98,11 +98,11 @@ Resume torrents - Continuar torrents + Continuar torrents Pause torrents - Pausar torrents + Pausar torrents New Category @@ -120,6 +120,14 @@ Add subcategory... Agregar subcategoría... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Error al iniciar sesión, imposible conectar a qBittorrent. + Error al iniciar sesión, imposible conectar a qBittorrent. Invalid Username or Password. - Nombre de usuario o contraseña inválidos. + Nombre de usuario o contraseña inválidos. Username - Nombre de usuario + Nombre de usuario Password - Contraseña + Contraseña Login - Iniciar sesión + Iniciar sesión Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Continuar + Continuar Top Toolbar @@ -456,7 +468,7 @@ Resume All - Reanudar todos + Reanudar todos Statistics @@ -468,11 +480,11 @@ Pause - Pausar + Pausar Pause All - Pausar todos + Pausar todos Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - ¿Le gustaría reanudar todos los torrents? + ¿Le gustaría reanudar todos los torrents? Would you like to pause all torrents? - ¿Le gustaría pausar todos los torrents? + ¿Le gustaría pausar todos los torrents? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Agregar automáticamente estos trackers a las descargas: + Agregar automáticamente estos trackers a las descargas: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Pausar torrent + Pausar torrent Remove torrent and its files @@ -1904,6 +1940,22 @@ Use ';' para dividir múltiples entradas. Puede usar el comodin '*'.Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2268,6 +2320,14 @@ Use ';' para dividir múltiples entradas. Puede usar el comodin '*'.Match all occurrences Coincidir con todas las ocurrencias + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2398,11 +2458,11 @@ Use ';' para dividir múltiples entradas. Puede usar el comodin '*'. Resumed (0) - Continuados (0) + Continuados (0) Paused (0) - Pausados (0) + Pausados (0) Active (0) @@ -2434,11 +2494,11 @@ Use ';' para dividir múltiples entradas. Puede usar el comodin '*'. Paused (%1) - Pausados (%1) + Pausados (%1) Resumed (%1) - Continuados (%1) + Continuados (%1) Active (%1) @@ -2492,6 +2552,22 @@ Use ';' para dividir múltiples entradas. Puede usar el comodin '*'.Moving (0) Moviendo (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2511,7 +2587,7 @@ Use ';' para dividir múltiples entradas. Puede usar el comodin '*'. Done % Done - Progreso + Progreso Status @@ -2648,6 +2724,14 @@ Use ';' para dividir múltiples entradas. Puede usar el comodin '*'.Reannounce In Reanunciar en + + Popularity + + + + Progress + + TrackerListWidget @@ -2784,7 +2868,7 @@ Use ';' para dividir múltiples entradas. Puede usar el comodin '*'. Paused - Pausados + Pausados Completed @@ -2850,6 +2934,10 @@ Use ';' para dividir múltiples entradas. Puede usar el comodin '*'.[F] Downloading metadata [F] Descargando metadatos + + Stopped + + TransferListFiltersWidget @@ -2891,17 +2979,17 @@ Use ';' para dividir múltiples entradas. Puede usar el comodin '*'. Resume Resume/start the torrent - Continuar + Continuar Force Resume Force Resume/start the torrent - Forzar continuación + Forzar continuación Pause Pause the torrent - Pausar + Pausar Limit share ratio... @@ -3073,6 +3161,18 @@ Use ';' para dividir múltiples entradas. Puede usar el comodin '*'.Comment Comentario + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3318,6 +3418,10 @@ Use ';' para dividir múltiples entradas. Puede usar el comodin '*'.There aren't any search plugins installed. No hay complementos de búsqueda instalados. + + Start a search above. + + PluginSelectDlg @@ -3380,6 +3484,10 @@ Use ';' para dividir múltiples entradas. Puede usar el comodin '*'.Seeders Semillas + + Published On + + SearchPluginsTable @@ -3447,11 +3555,11 @@ Use ';' para dividir múltiples entradas. Puede usar el comodin '*'. Pause torrents - Pausar torrents + Pausar torrents Resume torrents - Reanudar torrents + Reanudar torrents Remove unused tags @@ -3469,6 +3577,14 @@ Use ';' para dividir múltiples entradas. Puede usar el comodin '*'.Remove torrents Eliminar torrents + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3609,6 +3725,22 @@ Use ';' para dividir múltiples entradas. Puede usar el comodin '*'.Download link Enlace de descarga + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3908,7 +4040,7 @@ Use ';' para dividir múltiples entradas. Puede usar el comodin '*'. Add Paused: - Añadir pausado: + Añadir pausado: Please type the name of the new download rule. @@ -3968,12 +4100,16 @@ Admite los formatos: S01E01, 1x1, 2017.12.31 y 31.12.2017 (los formatos de fecha Add Tags: Añadir etiquetas + + Add Stopped: + + TrackerFiltersList Resume torrents - Reanudar torrents + Reanudar torrents All (%1) @@ -3985,12 +4121,20 @@ Admite los formatos: S01E01, 1x1, 2017.12.31 y 31.12.2017 (los formatos de fecha Pause torrents - Pausar torrents + Pausar torrents Remove torrents Eliminar torrents + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4138,4 +4282,11 @@ Admite los formatos: S01E01, 1x1, 2017.12.31 y 31.12.2017 (los formatos de fecha Elija un nivel de registro... + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_et.ts b/src/webui/www/translations/webui_et.ts index 88e50f633..f28070ad2 100644 --- a/src/webui/www/translations/webui_et.ts +++ b/src/webui/www/translations/webui_et.ts @@ -98,11 +98,11 @@ Resume torrents - Jätka torrentitega + Jätka torrentitega Pause torrents - Pausi torrentid + Pausi torrentid New Category @@ -120,6 +120,14 @@ Add subcategory... Lisa alamkategooria... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Ei saa sisse logida, qBittorrent arvatavasti pole kättesaadav. + Ei saa sisse logida, qBittorrent arvatavasti pole kättesaadav. Invalid Username or Password. - Sobimatu Kasutajanimi või Parool + Sobimatu Kasutajanimi või Parool Username - Kasutajanimi + Kasutajanimi Password - Parool + Parool Login - Logi sisse + Logi sisse Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Jätka + Jätka Top Toolbar @@ -456,7 +468,7 @@ Resume All - Jätka Kõikidega + Jätka Kõikidega Statistics @@ -468,11 +480,11 @@ Pause - Paus + Paus Pause All - Pausi Kõik + Pausi Kõik Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Kas soovite jätkata kõikide torrentitega? + Kas soovite jätkata kõikide torrentitega? Would you like to pause all torrents? - Kas soovite pausile panna kõik torrentid? + Kas soovite pausile panna kõik torrentid? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Automaatselt lisa need jälitajad uutele allalaadimistele: + Automaatselt lisa need jälitajad uutele allalaadimistele: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Pausi torrent + Pausi torrent Remove torrent and its files @@ -1856,6 +1892,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2220,6 +2272,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2348,13 +2408,9 @@ Use ';' to split multiple entries. Can use wildcard '*'. Completed (0) Lõpetatud (0) - - Resumed (0) - - Paused (0) - Pausitud (0) + Pausitud (0) Active (0) @@ -2386,11 +2442,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused (%1) - Pausitud (%1) - - - Resumed (%1) - + Pausitud (%1) Active (%1) @@ -2444,6 +2496,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) Teisaldakse (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2463,7 +2531,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Done % Done - Lõpetatud + Lõpetatud Status @@ -2600,6 +2668,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2736,7 +2812,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused - Pausitud + Pausitud Completed @@ -2802,6 +2878,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata [S] Allalaaditakse metadata't + + Stopped + + TransferListFiltersWidget @@ -2843,17 +2923,17 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resume Resume/start the torrent - Jätka + Jätka Force Resume Force Resume/start the torrent - Sunni Jätkama + Sunni Jätkama Pause Pause the torrent - Paus + Paus Limit share ratio... @@ -3025,6 +3105,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment Kommentaar + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3270,6 +3362,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3332,6 +3428,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders Jagajaid + + Published On + + SearchPluginsTable @@ -3399,11 +3499,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Pause torrents - Pausi torrentid + Pausi torrentid Resume torrents - Jätka torrentitega + Jätka torrentitega Remove unused tags @@ -3421,6 +3521,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents Eemalda torrentid + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3561,6 +3669,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link Allalaadimise link + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3860,7 +3984,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Add Paused: - Lisa Pausitud: + Lisa Pausitud: Please type the name of the new download rule. @@ -3920,12 +4044,16 @@ Toetab formaate: S01E01, 1x1, 2017.12.31 ja 31.12.2017 (kuupäevade formaate toe Add Tags: Lisa sildid: + + Add Stopped: + + TrackerFiltersList Resume torrents - Jätka torrentitega + Jätka torrentitega All (%1) @@ -3937,12 +4065,20 @@ Toetab formaate: S01E01, 1x1, 2017.12.31 ja 31.12.2017 (kuupäevade formaate toe Pause torrents - Pausi torrentid + Pausi torrentid Remove torrents Eemalda torrentid + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4090,4 +4226,11 @@ Toetab formaate: S01E01, 1x1, 2017.12.31 ja 31.12.2017 (kuupäevade formaate toe Vali logi tase... + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_eu.ts b/src/webui/www/translations/webui_eu.ts index 991e2f4b2..55ecfd395 100644 --- a/src/webui/www/translations/webui_eu.ts +++ b/src/webui/www/translations/webui_eu.ts @@ -98,11 +98,11 @@ Resume torrents - Berrekin torrentak + Berrekin torrentak Pause torrents - Pausatu torrentak + Pausatu torrentak New Category @@ -120,6 +120,14 @@ Add subcategory... Gehitu azpikategoria... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Ezinezkoa saioa hastea, qBittorrent zihurrenik eskuraezina dago. + Ezinezkoa saioa hastea, qBittorrent zihurrenik eskuraezina dago. Invalid Username or Password. - Erabiltzaile-izen edo Sarhitz baliogabea. + Erabiltzaile-izen edo Sarhitz baliogabea. Username - Erabiltzaile-izena + Erabiltzaile-izena Password - Sarhitza + Sarhitza Login - Hasi Saioa + Hasi Saioa Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Berrekin + Berrekin Top Toolbar @@ -456,7 +468,7 @@ Resume All - Berrekin Denak + Berrekin Denak Statistics @@ -468,11 +480,11 @@ Pause - Pausatu + Pausatu Pause All - Pasatu Denak + Pasatu Denak Add Torrent File... @@ -619,14 +631,6 @@ Remove Kendu - - Would you like to resume all torrents? - - - - Would you like to pause all torrents? - - Execution Log Ekintza Oharra @@ -639,6 +643,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +720,7 @@ Automatically add these trackers to new downloads: - Berezgaitasunez gehitu aztarnari hauek jeitsiera berriei: + Berezgaitasunez gehitu aztarnari hauek jeitsiera berriei: Web User Interface (Remote control) @@ -1206,7 +1234,7 @@ Pause torrent - Pausatu torrenta + Pausatu torrenta Remove torrent and its files @@ -1856,6 +1884,22 @@ Erabili ';' sarrera ugari banantzeko. '*' ordez-hizkia erabili daiteke.Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2220,6 +2264,14 @@ Erabili ';' sarrera ugari banantzeko. '*' ordez-hizkia erabili daiteke.Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2350,11 +2402,11 @@ Erabili ';' sarrera ugari banantzeko. '*' ordez-hizkia erabili daiteke. Resumed (0) - Berrekinda (0) + Berrekinda (0) Paused (0) - Pausatuta (0) + Pausatuta (0) Active (0) @@ -2386,11 +2438,11 @@ Erabili ';' sarrera ugari banantzeko. '*' ordez-hizkia erabili daiteke. Paused (%1) - Pausatuta (%1) + Pausatuta (%1) Resumed (%1) - Berrekinda (%1) + Berrekinda (%1) Active (%1) @@ -2444,6 +2496,22 @@ Erabili ';' sarrera ugari banantzeko. '*' ordez-hizkia erabili daiteke.Moving (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2463,7 +2531,7 @@ Erabili ';' sarrera ugari banantzeko. '*' ordez-hizkia erabili daiteke. Done % Done - Eginda + Eginda Status @@ -2600,6 +2668,14 @@ Erabili ';' sarrera ugari banantzeko. '*' ordez-hizkia erabili daiteke.Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2736,7 +2812,7 @@ Erabili ';' sarrera ugari banantzeko. '*' ordez-hizkia erabili daiteke. Paused - Pausatuta + Pausatuta Completed @@ -2802,6 +2878,10 @@ Erabili ';' sarrera ugari banantzeko. '*' ordez-hizkia erabili daiteke.[F] Downloading metadata [F] Metadatuak deskargatzen + + Stopped + + TransferListFiltersWidget @@ -2843,17 +2923,17 @@ Erabili ';' sarrera ugari banantzeko. '*' ordez-hizkia erabili daiteke. Resume Resume/start the torrent - Berrekin + Berrekin Force Resume Force Resume/start the torrent - Behartu Berrekitea + Behartu Berrekitea Pause Pause the torrent - Pausatu + Pausatu Limit share ratio... @@ -3025,6 +3105,18 @@ Erabili ';' sarrera ugari banantzeko. '*' ordez-hizkia erabili daiteke.Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3270,6 +3362,10 @@ Erabili ';' sarrera ugari banantzeko. '*' ordez-hizkia erabili daiteke.There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3332,6 +3428,10 @@ Erabili ';' sarrera ugari banantzeko. '*' ordez-hizkia erabili daiteke.Seeders Emaleak + + Published On + + SearchPluginsTable @@ -3399,11 +3499,11 @@ Erabili ';' sarrera ugari banantzeko. '*' ordez-hizkia erabili daiteke. Pause torrents - Pausatu torrentak + Pausatu torrentak Resume torrents - Berrekin torrentak + Berrekin torrentak Remove unused tags @@ -3421,6 +3521,14 @@ Erabili ';' sarrera ugari banantzeko. '*' ordez-hizkia erabili daiteke.Remove torrents + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3561,6 +3669,22 @@ Erabili ';' sarrera ugari banantzeko. '*' ordez-hizkia erabili daiteke.Download link Deskarga esteka + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3860,7 +3984,7 @@ Erabili ';' sarrera ugari banantzeko. '*' ordez-hizkia erabili daiteke. Add Paused: - Gehitu pausatuta: + Gehitu pausatuta: Please type the name of the new download rule. @@ -3920,12 +4044,16 @@ Sostengatutako heuskarriak: S01E01, 1x1, 2017.12.31 eta 31.12.2017 (Data heuskar Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - Berrekin torrentak + Berrekin torrentak All (%1) @@ -3937,12 +4065,20 @@ Sostengatutako heuskarriak: S01E01, 1x1, 2017.12.31 eta 31.12.2017 (Data heuskar Pause torrents - Pausatu torrentak + Pausatu torrentak Remove torrents + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4090,4 +4226,11 @@ Sostengatutako heuskarriak: S01E01, 1x1, 2017.12.31 eta 31.12.2017 (Data heuskar + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_fa.ts b/src/webui/www/translations/webui_fa.ts index 4a852a659..3f2e206cf 100644 --- a/src/webui/www/translations/webui_fa.ts +++ b/src/webui/www/translations/webui_fa.ts @@ -98,11 +98,11 @@ Resume torrents - ادامه دانلود تورنتها + ادامه دانلود تورنتها Pause torrents - توقف دانلود تورنتها + توقف دانلود تورنتها New Category @@ -120,6 +120,14 @@ Add subcategory... افزودن زیر دسته + + Start torrents + + + + Stop torrents + + HttpServer @@ -189,19 +197,19 @@ Invalid Username or Password. - نام کاربری یا کلمه عبور نامعتبر + نام کاربری یا کلمه عبور نامعتبر Username - نام کاربری + نام کاربری Password - کلمه عبور + کلمه عبور Login - ورود + ورود Apply @@ -391,6 +399,14 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Unable to log in, qBittorrent is probably unreachable. + + + + Could not contact qBittorrent + + MainWindow @@ -420,7 +436,7 @@ Resume - ادامه + ادامه Top Toolbar @@ -440,7 +456,7 @@ Resume All - ادامه همه + ادامه همه Statistics @@ -452,11 +468,11 @@ Pause - توقف + توقف Pause All - توقف همه + توقف همه Add Torrent File... @@ -598,14 +614,6 @@ Remove حذف - - Would you like to resume all torrents? - - - - Would you like to pause all torrents? - - Execution Log @@ -618,6 +626,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -669,10 +701,6 @@ Torrent Queueing صف انتظار تورنت - - Automatically add these trackers to new downloads: - - Web User Interface (Remote control) @@ -1169,7 +1197,7 @@ Pause torrent - توقف تورنت + توقف تورنت Remove torrent and its files @@ -1815,6 +1843,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2179,6 +2223,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2307,14 +2359,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. Completed (0) کامل شده (0) - - Resumed (0) - - - - Paused (0) - - Active (0) فعال (0) @@ -2345,11 +2389,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused (%1) - متوقف شده (%1) + متوقف شده (%1) Resumed (%1) - ادامه دانلود (%1) + ادامه دانلود (%1) Active (%1) @@ -2403,6 +2447,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2419,11 +2479,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. i.e: torrent size سایز - - Done - % Done - - Status Torrent status (e.g. downloading, seeding, paused) @@ -2559,6 +2614,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2695,7 +2758,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused - متوقف شده + متوقف شده Completed @@ -2761,6 +2824,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata + + Stopped + + TransferListFiltersWidget @@ -2802,17 +2869,17 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resume Resume/start the torrent - ادامه + ادامه Force Resume Force Resume/start the torrent - اجبار به ادامه + اجبار به ادامه Pause Pause the torrent - توقف + توقف Limit share ratio... @@ -2984,6 +3051,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3229,6 +3308,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3291,6 +3374,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders + + Published On + + SearchPluginsTable @@ -3358,11 +3445,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Pause torrents - توقف دانلود تورنتها + توقف دانلود تورنتها Resume torrents - ادامه دانلود تورنتها + ادامه دانلود تورنتها Remove unused tags @@ -3380,6 +3467,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3520,6 +3615,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link لینک بارگیری + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3819,7 +3930,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Add Paused: - افزودن در حالت متوقف شده: + افزودن در حالت متوقف شده: Please type the name of the new download rule. @@ -3878,12 +3989,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - ادامه دانلود تورنتها + ادامه دانلود تورنتها All (%1) @@ -3895,12 +4010,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - توقف دانلود تورنتها + توقف دانلود تورنتها Remove torrents + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4048,4 +4171,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_fi.ts b/src/webui/www/translations/webui_fi.ts index 5451fdcc3..402c78cb1 100644 --- a/src/webui/www/translations/webui_fi.ts +++ b/src/webui/www/translations/webui_fi.ts @@ -98,11 +98,11 @@ Resume torrents - Jatka torrentteja + Jatka torrentteja Pause torrents - Pysäytä torrentit + Pysäytä torrentit New Category @@ -120,6 +120,14 @@ Add subcategory... Lisää alakategoria... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Kirjautuminen epäonnistui, qBittorrent ei luultavasti ole tavoitettavissa. + Kirjautuminen epäonnistui, qBittorrent ei luultavasti ole tavoitettavissa. Invalid Username or Password. - Virheellinen käyttäjätunnus tai salasana. + Virheellinen käyttäjätunnus tai salasana. Username - Käyttäjänimi + Käyttäjänimi Password - Salasana + Salasana Login - Kirjaudu + Kirjaudu Apply @@ -403,6 +411,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -432,7 +444,7 @@ Resume - Jatka + Jatka Top Toolbar @@ -452,7 +464,7 @@ Resume All - Jatka kaikkia + Jatka kaikkia Statistics @@ -464,11 +476,11 @@ Pause - Pysäytä + Pysäytä Pause All - Pysäytä kaikki + Pysäytä kaikki Add Torrent File... @@ -617,11 +629,11 @@ Would you like to resume all torrents? - Haluatko jatkaa kaikkia torrenteja? + Haluatko jatkaa kaikkia torrenteja? Would you like to pause all torrents? - Haluatko keskeyttää kaikki torrentit? + Haluatko keskeyttää kaikki torrentit? Execution Log @@ -635,6 +647,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -688,7 +724,7 @@ Automatically add these trackers to new downloads: - Lisää nämä seurantapalvelimet automaattisesti uusiin latauksiin: + Lisää nämä seurantapalvelimet automaattisesti uusiin latauksiin: Web User Interface (Remote control) @@ -1202,7 +1238,7 @@ Pause torrent - Pysäytä torrent + Pysäytä torrent Remove torrent and its files @@ -1848,6 +1884,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2212,6 +2264,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2342,11 +2402,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resumed (0) - Jatkettu (0) + Jatkettu (0) Paused (0) - Pysäytetty (0) + Pysäytetty (0) Active (0) @@ -2378,11 +2438,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused (%1) - Pysäytetty (%1) + Pysäytetty (%1) Resumed (%1) - Jatkettu (%1) + Jatkettu (%1) Active (%1) @@ -2436,6 +2496,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) Siirretään (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2455,7 +2531,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Done % Done - Valmis + Valmis Status @@ -2592,6 +2668,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2728,7 +2812,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused - Pysäytetty + Pysäytetty Completed @@ -2794,6 +2878,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata [P] Ladataan metatioetoja + + Stopped + + TransferListFiltersWidget @@ -2835,17 +2923,17 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resume Resume/start the torrent - Jatka + Jatka Force Resume Force Resume/start the torrent - Pakota jatkaminen + Pakota jatkaminen Pause Pause the torrent - Pysäytä + Pysäytä Limit share ratio... @@ -3017,6 +3105,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3262,6 +3362,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3324,6 +3428,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders Jakoja + + Published On + + SearchPluginsTable @@ -3391,11 +3499,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Pause torrents - Pysäytä torrentit + Pysäytä torrentit Resume torrents - Jatka torrentteja + Jatka torrentteja Remove unused tags @@ -3413,6 +3521,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents Poista torrentit + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3553,6 +3669,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link Lataa linkki + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3852,7 +3984,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Add Paused: - Lisää pysäytettynä: + Lisää pysäytettynä: Please type the name of the new download rule. @@ -3912,12 +4044,16 @@ Nämä muodot ovat tuetut: S01E01, 1x1, 2017.12.31 ja 31.12.2017 (päiväysmuodo Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - Jatka torrentteja + Jatka torrentteja All (%1) @@ -3929,12 +4065,20 @@ Nämä muodot ovat tuetut: S01E01, 1x1, 2017.12.31 ja 31.12.2017 (päiväysmuodo Pause torrents - Pysäytä torrentit + Pysäytä torrentit Remove torrents Poista torrentit + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4082,4 +4226,11 @@ Nämä muodot ovat tuetut: S01E01, 1x1, 2017.12.31 ja 31.12.2017 (päiväysmuodo + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_fr.ts b/src/webui/www/translations/webui_fr.ts index d8d7d3511..3203ba709 100644 --- a/src/webui/www/translations/webui_fr.ts +++ b/src/webui/www/translations/webui_fr.ts @@ -98,11 +98,11 @@ Resume torrents - Reprendre les torrents + Reprendre les torrents Pause torrents - Mettre en pause les torrents + Mettre en pause les torrents New Category @@ -120,6 +120,14 @@ Add subcategory... Ajouter une sous-catégorie… + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Impossible de se connecter, qBittorrent est probablement inaccessible. + Impossible de se connecter, qBittorrent est probablement inaccessible. Invalid Username or Password. - Nom d'utilisateur ou mot de passe invalide. + Nom d'utilisateur ou mot de passe invalide. Username - Nom d'utilisateur + Nom d'utilisateur Password - Mot de passe + Mot de passe Login - Se connecter + Se connecter Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Reprendre + Reprendre Top Toolbar @@ -456,7 +468,7 @@ Resume All - Tout reprendre + Tout reprendre Statistics @@ -468,11 +480,11 @@ Pause - Mettre en pause + Mettre en pause Pause All - Tout mettre en pause + Tout mettre en pause Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Souhaitez-vous reprendre tous les torrents ? + Souhaitez-vous reprendre tous les torrents ? Would you like to pause all torrents? - Souhaitez-vous mettre en pause tous les torrents ? + Souhaitez-vous mettre en pause tous les torrents ? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Ajouter automatiquement ces trackers aux nouveaux téléchargements : + Ajouter automatiquement ces trackers aux nouveaux téléchargements : Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Mettre en pause le torrent + Mettre en pause le torrent Remove torrent and its files @@ -1903,6 +1939,22 @@ Utiliser ';' pour diviser plusieurs entrées. Le caractère générique '*' peut Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2267,6 +2319,14 @@ Utiliser ';' pour diviser plusieurs entrées. Le caractère générique '*' peut Match all occurrences Correspondance de toutes les occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2397,11 +2457,11 @@ Utiliser ';' pour diviser plusieurs entrées. Le caractère générique '*' peut Resumed (0) - Repris (0) + Repris (0) Paused (0) - En pause (0) + En pause (0) Active (0) @@ -2433,11 +2493,11 @@ Utiliser ';' pour diviser plusieurs entrées. Le caractère générique '*' peut Paused (%1) - En pause (%1) + En pause (%1) Resumed (%1) - Repris (%1) + Repris (%1) Active (%1) @@ -2491,6 +2551,22 @@ Utiliser ';' pour diviser plusieurs entrées. Le caractère générique '*' peut Moving (0) En déplacement (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2510,7 +2586,7 @@ Utiliser ';' pour diviser plusieurs entrées. Le caractère générique '*' peut Done % Done - Terminé + Terminé Status @@ -2647,6 +2723,14 @@ Utiliser ';' pour diviser plusieurs entrées. Le caractère générique '*' peut Reannounce In Réannonce dans + + Popularity + + + + Progress + + TrackerListWidget @@ -2783,7 +2867,7 @@ Utiliser ';' pour diviser plusieurs entrées. Le caractère générique '*' peut Paused - En pause + En pause Completed @@ -2849,6 +2933,10 @@ Utiliser ';' pour diviser plusieurs entrées. Le caractère générique '*' peut [F] Downloading metadata [F] En téléchargement des métadonnées + + Stopped + + TransferListFiltersWidget @@ -2890,17 +2978,17 @@ Utiliser ';' pour diviser plusieurs entrées. Le caractère générique '*' peut Resume Resume/start the torrent - Reprendre + Reprendre Force Resume Force Resume/start the torrent - Forcer la reprise + Forcer la reprise Pause Pause the torrent - Mettre en pause + Mettre en pause Limit share ratio... @@ -3072,6 +3160,18 @@ Utiliser ';' pour diviser plusieurs entrées. Le caractère générique '*' peut Comment Commentaire + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3317,6 +3417,10 @@ Utiliser ';' pour diviser plusieurs entrées. Le caractère générique '*' peut There aren't any search plugins installed. Aucun greffon de recherche n'est installé. + + Start a search above. + + PluginSelectDlg @@ -3379,6 +3483,10 @@ Utiliser ';' pour diviser plusieurs entrées. Le caractère générique '*' peut Seeders Partageurs + + Published On + + SearchPluginsTable @@ -3446,11 +3554,11 @@ Utiliser ';' pour diviser plusieurs entrées. Le caractère générique '*' peut Pause torrents - Mettre en pause les torrents + Mettre en pause les torrents Resume torrents - Reprendre les torrents + Reprendre les torrents Remove unused tags @@ -3468,6 +3576,14 @@ Utiliser ';' pour diviser plusieurs entrées. Le caractère générique '*' peut Remove torrents Retirer les torrents + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3608,6 +3724,22 @@ Utiliser ';' pour diviser plusieurs entrées. Le caractère générique '*' peut Download link Télécharger le lien + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3907,7 +4039,7 @@ Utiliser ';' pour diviser plusieurs entrées. Le caractère générique '*' peut Add Paused: - Ajouter en pause : + Ajouter en pause : Please type the name of the new download rule. @@ -3967,12 +4099,16 @@ Les formats supportés : S01E01, 1x1, 2017.12.31 et 31.12.2017 (les formats date Add Tags: Ajouter des Tags : + + Add Stopped: + + TrackerFiltersList Resume torrents - Reprendre les torrents + Reprendre les torrents All (%1) @@ -3984,12 +4120,20 @@ Les formats supportés : S01E01, 1x1, 2017.12.31 et 31.12.2017 (les formats date Pause torrents - Mettre en pause les torrents + Mettre en pause les torrents Remove torrents Retirer les torrents + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4137,4 +4281,11 @@ Les formats supportés : S01E01, 1x1, 2017.12.31 et 31.12.2017 (les formats date Choisissez un niveau de journalisation… + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_gl.ts b/src/webui/www/translations/webui_gl.ts index ed2a96ead..3438c78cb 100644 --- a/src/webui/www/translations/webui_gl.ts +++ b/src/webui/www/translations/webui_gl.ts @@ -98,11 +98,11 @@ Resume torrents - Continuar os torrents + Continuar os torrents Pause torrents - Deter os torrents + Deter os torrents New Category @@ -120,6 +120,14 @@ Add subcategory... Engadir subcategoría... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Non é posíbel iniciar sesión. Probabelmente o qBittorrent non está accesíbel. + Non é posíbel iniciar sesión. Probabelmente o qBittorrent non está accesíbel. Invalid Username or Password. - O usuario ou o contrasinal son incorrectos. + O usuario ou o contrasinal son incorrectos. Username - Nome do usuario + Nome do usuario Password - Contrasinal + Contrasinal Login - Iniciar sesión + Iniciar sesión Apply @@ -408,6 +416,10 @@ Non use caracteres especiais no nome da categoría. JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -437,7 +449,7 @@ Non use caracteres especiais no nome da categoría. Resume - Continuar + Continuar Top Toolbar @@ -457,7 +469,7 @@ Non use caracteres especiais no nome da categoría. Resume All - Continuar todo + Continuar todo Statistics @@ -469,11 +481,11 @@ Non use caracteres especiais no nome da categoría. Pause - Deter + Deter Pause All - Pausar todo + Pausar todo Add Torrent File... @@ -620,14 +632,6 @@ Non use caracteres especiais no nome da categoría. Remove Eliminar - - Would you like to resume all torrents? - - - - Would you like to pause all torrents? - - Execution Log Rexistro de execución @@ -640,6 +644,30 @@ Non use caracteres especiais no nome da categoría. [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -693,7 +721,7 @@ Non use caracteres especiais no nome da categoría. Automatically add these trackers to new downloads: - Engadir automaticamente estes localizadores ás novas descargas: + Engadir automaticamente estes localizadores ás novas descargas: Web User Interface (Remote control) @@ -1207,7 +1235,7 @@ Non use caracteres especiais no nome da categoría. Pause torrent - Deter o torrent + Deter o torrent Remove torrent and its files @@ -1857,6 +1885,22 @@ Usar «;» para dividir entradas múltiples. Pode usar o comodín «*».Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2221,6 +2265,14 @@ Usar «;» para dividir entradas múltiples. Pode usar o comodín «*».Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2351,11 +2403,11 @@ Usar «;» para dividir entradas múltiples. Pode usar o comodín «*». Resumed (0) - Comezados (0) + Comezados (0) Paused (0) - Detidos (0) + Detidos (0) Active (0) @@ -2387,11 +2439,11 @@ Usar «;» para dividir entradas múltiples. Pode usar o comodín «*». Paused (%1) - Detidos (%1) + Detidos (%1) Resumed (%1) - Comezados (%1) + Comezados (%1) Active (%1) @@ -2445,6 +2497,22 @@ Usar «;» para dividir entradas múltiples. Pode usar o comodín «*».Moving (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2464,7 +2532,7 @@ Usar «;» para dividir entradas múltiples. Pode usar o comodín «*». Done % Done - Feito + Feito Status @@ -2601,6 +2669,14 @@ Usar «;» para dividir entradas múltiples. Pode usar o comodín «*».Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2737,7 +2813,7 @@ Usar «;» para dividir entradas múltiples. Pode usar o comodín «*». Paused - Detido + Detido Completed @@ -2803,6 +2879,10 @@ Usar «;» para dividir entradas múltiples. Pode usar o comodín «*».[F] Downloading metadata [F] Baixando metadatos + + Stopped + + TransferListFiltersWidget @@ -2844,17 +2924,17 @@ Usar «;» para dividir entradas múltiples. Pode usar o comodín «*». Resume Resume/start the torrent - Continuar + Continuar Force Resume Force Resume/start the torrent - Forzar continuación + Forzar continuación Pause Pause the torrent - Deter + Deter Limit share ratio... @@ -3026,6 +3106,18 @@ Usar «;» para dividir entradas múltiples. Pode usar o comodín «*».Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3271,6 +3363,10 @@ Usar «;» para dividir entradas múltiples. Pode usar o comodín «*».There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3333,6 +3429,10 @@ Usar «;» para dividir entradas múltiples. Pode usar o comodín «*».Seeders Sementadores + + Published On + + SearchPluginsTable @@ -3400,11 +3500,11 @@ Usar «;» para dividir entradas múltiples. Pode usar o comodín «*». Pause torrents - Deter os torrents + Deter os torrents Resume torrents - Continuar os torrents + Continuar os torrents Remove unused tags @@ -3422,6 +3522,14 @@ Usar «;» para dividir entradas múltiples. Pode usar o comodín «*».Remove torrents + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3562,6 +3670,22 @@ Usar «;» para dividir entradas múltiples. Pode usar o comodín «*».Download link Descargar ligazón + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3861,7 +3985,7 @@ Usar «;» para dividir entradas múltiples. Pode usar o comodín «*». Add Paused: - Engadir como detidos: + Engadir como detidos: Please type the name of the new download rule. @@ -3921,12 +4045,16 @@ Compatíbel cos formatos: S01E01, 1x1, 2017.12.31 e 31.12.2017 (os formatos da d Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - Continuar os torrents + Continuar os torrents All (%1) @@ -3938,12 +4066,20 @@ Compatíbel cos formatos: S01E01, 1x1, 2017.12.31 e 31.12.2017 (os formatos da d Pause torrents - Deter os torrents + Deter os torrents Remove torrents + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4091,4 +4227,11 @@ Compatíbel cos formatos: S01E01, 1x1, 2017.12.31 e 31.12.2017 (os formatos da d + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_he.ts b/src/webui/www/translations/webui_he.ts index 1acb04fb3..eff0482ba 100644 --- a/src/webui/www/translations/webui_he.ts +++ b/src/webui/www/translations/webui_he.ts @@ -98,11 +98,11 @@ Resume torrents - המשך טורנטים + המשך טורנטים Pause torrents - השהה טורנטים + השהה טורנטים New Category @@ -120,6 +120,14 @@ Add subcategory... הוסף תת־קטגוריה… + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - לא היה ניתן להיכנס, qBittorrent כנראה בלתי נגיש. + לא היה ניתן להיכנס, qBittorrent כנראה בלתי נגיש. Invalid Username or Password. - שם משתמש או סיסמה בלתי תקפים. + שם משתמש או סיסמה בלתי תקפים. Username - שם משתמש + שם משתמש Password - סיסמה + סיסמה Login - היכנס + היכנס Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - המשך + המשך Top Toolbar @@ -456,7 +468,7 @@ Resume All - המשך הכול + המשך הכול Statistics @@ -468,11 +480,11 @@ Pause - השהה + השהה Pause All - השהה הכול + השהה הכול Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - האם אתה רוצה להמשיך את כל הטורנטים ? + האם אתה רוצה להמשיך את כל הטורנטים ? Would you like to pause all torrents? - האם אתה רוצה לעצור את כל הטורנטים ? + האם אתה רוצה לעצור את כל הטורנטים ? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - הוסף באופן אוטומטי גששים אלו אל הורדות חדשות: + הוסף באופן אוטומטי גששים אלו אל הורדות חדשות: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - השהה טורנט + השהה טורנט Remove torrent and its files @@ -1856,6 +1892,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2220,6 +2272,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2350,11 +2410,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resumed (0) - מומשך (0) + מומשך (0) Paused (0) - מושהה (0) + מושהה (0) Active (0) @@ -2386,11 +2446,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused (%1) - מושהה (%1) + מושהה (%1) Resumed (%1) - מומשך (%1) + מומשך (%1) Active (%1) @@ -2444,6 +2504,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) מעביר (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2463,7 +2539,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Done % Done - בוצע + בוצע Status @@ -2600,6 +2676,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2736,7 +2820,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused - מושהה + מושהה Completed @@ -2802,6 +2886,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata [א] מוריד מטא־נתונים + + Stopped + + TransferListFiltersWidget @@ -2843,17 +2931,17 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resume Resume/start the torrent - המשך + המשך Force Resume Force Resume/start the torrent - אלץ המשכה + אלץ המשכה Pause Pause the torrent - השהה + השהה Limit share ratio... @@ -3025,6 +3113,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3270,6 +3370,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3332,6 +3436,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders זורעים + + Published On + + SearchPluginsTable @@ -3399,11 +3507,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Pause torrents - השהה טורנטים + השהה טורנטים Resume torrents - המשך טורנטים + המשך טורנטים Remove unused tags @@ -3421,6 +3529,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents הסר טורנטים + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3561,6 +3677,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link קישור הורדה + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3860,7 +3992,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Add Paused: - הוסף מושהים: + הוסף מושהים: Please type the name of the new download rule. @@ -3920,12 +4052,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - המשך טורנטים + המשך טורנטים All (%1) @@ -3937,12 +4073,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - השהה טורנטים + השהה טורנטים Remove torrents הסר טורנטים + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4090,4 +4234,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_hi_IN.ts b/src/webui/www/translations/webui_hi_IN.ts index eac703043..e558b3b69 100644 --- a/src/webui/www/translations/webui_hi_IN.ts +++ b/src/webui/www/translations/webui_hi_IN.ts @@ -98,11 +98,11 @@ Resume torrents - टौरेंटो को प्रारम्भ करें + टौरेंटो को प्रारम्भ करें Pause torrents - टौरेंटो को विराम दें + टौरेंटो को विराम दें New Category @@ -120,6 +120,14 @@ Add subcategory... उपश्रेणी जोड़े… + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - लॉगिन नहीं कर पाए, क्यूबिटटाॅरेंट शायद पहुँच से बाहर है। + लॉगिन नहीं कर पाए, क्यूबिटटाॅरेंट शायद पहुँच से बाहर है। Invalid Username or Password. - यूजरनेम व पासवर्ड अमान्य हैं। + यूजरनेम व पासवर्ड अमान्य हैं। Username - यूजरनेम + यूजरनेम Password - पासवर्ड + पासवर्ड Login - लॉगिन + लॉगिन Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - प्रारम्भ करें + प्रारम्भ करें Top Toolbar @@ -456,7 +468,7 @@ Resume All - सभी को प्रारम्भ करें + सभी को प्रारम्भ करें Statistics @@ -468,11 +480,11 @@ Pause - विराम दें + विराम दें Pause All - सभी को विराम दें + सभी को विराम दें Add Torrent File... @@ -619,14 +631,6 @@ Remove हटायें - - Would you like to resume all torrents? - - - - Would you like to pause all torrents? - - Execution Log निष्पादन वृतांत @@ -639,6 +643,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +720,7 @@ Automatically add these trackers to new downloads: - इन ट्रैकरों को नए डाउनलोडों में स्वतः जोड़ दें: + इन ट्रैकरों को नए डाउनलोडों में स्वतः जोड़ दें: Web User Interface (Remote control) @@ -1206,7 +1234,7 @@ Pause torrent - टौरेंट को विराम दें + टौरेंट को विराम दें Remove torrent and its files @@ -1852,6 +1880,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2216,6 +2260,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2346,11 +2398,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resumed (0) - प्रारम्भित(0) + प्रारम्भित(0) Paused (0) - विरामित (0) + विरामित (0) Active (0) @@ -2382,11 +2434,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused (%1) - विरामित (%1) + विरामित (%1) Resumed (%1) - प्रारम्भित(%1) + प्रारम्भित(%1) Active (%1) @@ -2440,6 +2492,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) स्थानान्तरित हो रहे (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2459,7 +2527,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Done % Done - पूर्ण + पूर्ण Status @@ -2596,6 +2664,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2732,7 +2808,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused - विरामित + विरामित Completed @@ -2798,6 +2874,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata + + Stopped + + TransferListFiltersWidget @@ -2839,17 +2919,17 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resume Resume/start the torrent - प्रारम्भ करें + प्रारम्भ करें Force Resume Force Resume/start the torrent - बलपूर्वक प्रारम्भ करें + बलपूर्वक प्रारम्भ करें Pause Pause the torrent - विराम दें + विराम दें Limit share ratio... @@ -3021,6 +3101,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3266,6 +3358,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3328,6 +3424,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders स्रोतस्वामी + + Published On + + SearchPluginsTable @@ -3395,11 +3495,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Pause torrents - टौरेंटो को विराम दें + टौरेंटो को विराम दें Resume torrents - टौरेंटो को प्रारम्भ करें + टौरेंटो को प्रारम्भ करें Remove unused tags @@ -3417,6 +3517,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents टौरेंटो को हटायें + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3557,6 +3665,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link डाउनलोड लिंक + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3856,7 +3980,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Add Paused: - विरामित जोड़ें: + विरामित जोड़ें: Please type the name of the new download rule. @@ -3916,12 +4040,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - टौरेंटो को प्रारम्भ करें + टौरेंटो को प्रारम्भ करें All (%1) @@ -3933,12 +4061,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - टौरेंटो को विराम दें + टौरेंटो को विराम दें Remove torrents टौरेंटो को हटायें + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4086,4 +4222,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_hr.ts b/src/webui/www/translations/webui_hr.ts index 4ec811e7a..b836a199f 100644 --- a/src/webui/www/translations/webui_hr.ts +++ b/src/webui/www/translations/webui_hr.ts @@ -98,11 +98,11 @@ Resume torrents - Nastavi torrente + Nastavi torrente Pause torrents - Pauziraj torrente + Pauziraj torrente New Category @@ -120,6 +120,14 @@ Add subcategory... Dodaj podkategoriju... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Nije moguća prijava. qBittorrent je vjerojatno nedostupan. + Nije moguća prijava. qBittorrent je vjerojatno nedostupan. Invalid Username or Password. - Neispravno korisničko ime ili lozinka + Neispravno korisničko ime ili lozinka Username - Korisničko ime + Korisničko ime Password - Lozinka + Lozinka Login - Prijava + Prijava Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Nastavi + Nastavi Top Toolbar @@ -456,7 +468,7 @@ Resume All - Nastavi sve + Nastavi sve Statistics @@ -468,11 +480,11 @@ Pause - Pauziraj + Pauziraj Pause All - Pauziraj sve + Pauziraj sve Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Želite li nastaviti sa svim torrentima? + Želite li nastaviti sa svim torrentima? Would you like to pause all torrents? - Želite li pauzirati sve torrente? + Želite li pauzirati sve torrente? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Automatski dodaj ove trackere za nova preuzimanja: + Automatski dodaj ove trackere za nova preuzimanja: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Pauziraj torrente + Pauziraj torrente Remove torrent and its files @@ -1904,6 +1940,22 @@ Koristite ';' za razdvajanje više unosa. Može koristiti zamjenski znak '*'.Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2268,6 +2320,14 @@ Koristite ';' za razdvajanje više unosa. Može koristiti zamjenski znak '*'.Match all occurrences Spoji sve pojave + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2398,11 +2458,11 @@ Koristite ';' za razdvajanje više unosa. Može koristiti zamjenski znak '*'. Resumed (0) - Nastavljeno (0) + Nastavljeno (0) Paused (0) - Pauzirano (0) + Pauzirano (0) Active (0) @@ -2434,11 +2494,11 @@ Koristite ';' za razdvajanje više unosa. Može koristiti zamjenski znak '*'. Paused (%1) - Pauzirano (%1) + Pauzirano (%1) Resumed (%1) - Nastavljeno (%1) + Nastavljeno (%1) Active (%1) @@ -2492,6 +2552,22 @@ Koristite ';' za razdvajanje više unosa. Može koristiti zamjenski znak '*'.Moving (0) Premještanje (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2511,7 +2587,7 @@ Koristite ';' za razdvajanje više unosa. Može koristiti zamjenski znak '*'. Done % Done - Napredak + Napredak Status @@ -2648,6 +2724,14 @@ Koristite ';' za razdvajanje više unosa. Može koristiti zamjenski znak '*'.Reannounce In Ponovno najavi za + + Popularity + + + + Progress + + TrackerListWidget @@ -2784,7 +2868,7 @@ Koristite ';' za razdvajanje više unosa. Može koristiti zamjenski znak '*'. Paused - Pauzirano + Pauzirano Completed @@ -2850,6 +2934,10 @@ Koristite ';' za razdvajanje više unosa. Može koristiti zamjenski znak '*'.[F] Downloading metadata [F] Preuzimanje metapodataka + + Stopped + + TransferListFiltersWidget @@ -2891,17 +2979,17 @@ Koristite ';' za razdvajanje više unosa. Može koristiti zamjenski znak '*'. Resume Resume/start the torrent - Nastavi + Nastavi Force Resume Force Resume/start the torrent - Prisili nastavak + Prisili nastavak Pause Pause the torrent - Pauziraj + Pauziraj Limit share ratio... @@ -3073,6 +3161,18 @@ Koristite ';' za razdvajanje više unosa. Može koristiti zamjenski znak '*'.Comment Komentar + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3318,6 +3418,10 @@ Koristite ';' za razdvajanje više unosa. Može koristiti zamjenski znak '*'.There aren't any search plugins installed. Nema instaliranih dodataka za pretraživanje. + + Start a search above. + + PluginSelectDlg @@ -3380,6 +3484,10 @@ Koristite ';' za razdvajanje više unosa. Može koristiti zamjenski znak '*'.Seeders Seederi + + Published On + + SearchPluginsTable @@ -3447,11 +3555,11 @@ Koristite ';' za razdvajanje više unosa. Može koristiti zamjenski znak '*'. Pause torrents - Pauziraj torrente + Pauziraj torrente Resume torrents - Nastavi torrente + Nastavi torrente Remove unused tags @@ -3469,6 +3577,14 @@ Koristite ';' za razdvajanje više unosa. Može koristiti zamjenski znak '*'.Remove torrents Ukloni torrente + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3609,6 +3725,22 @@ Koristite ';' za razdvajanje više unosa. Može koristiti zamjenski znak '*'.Download link Link preuzimanja + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3908,7 +4040,7 @@ Koristite ';' za razdvajanje više unosa. Može koristiti zamjenski znak '*'. Add Paused: - Dodaj pauzirano: + Dodaj pauzirano: Please type the name of the new download rule. @@ -3967,12 +4099,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: Dodaj oznake: + + Add Stopped: + + TrackerFiltersList Resume torrents - Nastavi torrente + Nastavi torrente All (%1) @@ -3984,12 +4120,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - Pauziraj torrente + Pauziraj torrente Remove torrents Ukloni torrente + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4137,4 +4281,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Odaberite razinu zapisnika... + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_hu.ts b/src/webui/www/translations/webui_hu.ts index c5f053ca5..5a8cb83d2 100644 --- a/src/webui/www/translations/webui_hu.ts +++ b/src/webui/www/translations/webui_hu.ts @@ -98,11 +98,11 @@ Resume torrents - Torrentek folytatása + Torrentek folytatása Pause torrents - Torrentek szüneteltetése + Torrentek szüneteltetése New Category @@ -120,6 +120,14 @@ Add subcategory... Alkategória hozzáadása… + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Nem sikerült bejelentkezni, qBittorrent talán elérhetetlen. + Nem sikerült bejelentkezni, qBittorrent talán elérhetetlen. Invalid Username or Password. - Érvénytelen felhasználónév vagy Jelszó. + Érvénytelen felhasználónév vagy Jelszó. Username - Felhasználónév + Felhasználónév Password - Jelszó + Jelszó Login - Bejelentkezés + Bejelentkezés Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Folytatás + Folytatás Top Toolbar @@ -456,7 +468,7 @@ Resume All - Összes folytatása + Összes folytatása Statistics @@ -468,11 +480,11 @@ Pause - Szünet + Szünet Pause All - Összes szüneteltetése + Összes szüneteltetése Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Folytatja az összes torrentet? + Folytatja az összes torrentet? Would you like to pause all torrents? - Szünetelteti az összes torrentet? + Szünetelteti az összes torrentet? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Ezen trackerek automatikus hozzáadása az új letöltésekhez: + Ezen trackerek automatikus hozzáadása az új letöltésekhez: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Torrent szüneteltetése + Torrent szüneteltetése Remove torrent and its files @@ -1904,6 +1940,22 @@ Használja a ';' karaktert az elválasztásra, ha több is van. A '*' helyettes Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2268,6 +2320,14 @@ Használja a ';' karaktert az elválasztásra, ha több is van. A '*' helyettes Match all occurrences Minden előfordulás egyezzen + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2398,11 +2458,11 @@ Használja a ';' karaktert az elválasztásra, ha több is van. A '*' helyettes Resumed (0) - Folytatott (0) + Folytatott (0) Paused (0) - Szüneteltetett (0) + Szüneteltetett (0) Active (0) @@ -2434,11 +2494,11 @@ Használja a ';' karaktert az elválasztásra, ha több is van. A '*' helyettes Paused (%1) - Szüneteltetett (%1) + Szüneteltetett (%1) Resumed (%1) - Folytatott (%1) + Folytatott (%1) Active (%1) @@ -2492,6 +2552,22 @@ Használja a ';' karaktert az elválasztásra, ha több is van. A '*' helyettes Moving (0) Áthelyezés (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2511,7 +2587,7 @@ Használja a ';' karaktert az elválasztásra, ha több is van. A '*' helyettes Done % Done - Elkészült + Elkészült Status @@ -2648,6 +2724,14 @@ Használja a ';' karaktert az elválasztásra, ha több is van. A '*' helyettes Reannounce In Újrajelentés + + Popularity + + + + Progress + + TrackerListWidget @@ -2784,7 +2868,7 @@ Használja a ';' karaktert az elválasztásra, ha több is van. A '*' helyettes Paused - Szüneteltetett + Szüneteltetett Completed @@ -2850,6 +2934,10 @@ Használja a ';' karaktert az elválasztásra, ha több is van. A '*' helyettes [F] Downloading metadata [K] Metaadatok letöltése + + Stopped + + TransferListFiltersWidget @@ -2891,17 +2979,17 @@ Használja a ';' karaktert az elválasztásra, ha több is van. A '*' helyettes Resume Resume/start the torrent - Folytatás + Folytatás Force Resume Force Resume/start the torrent - Kényszerített folytatás + Kényszerített folytatás Pause Pause the torrent - Szünet + Szünet Limit share ratio... @@ -3073,6 +3161,18 @@ Használja a ';' karaktert az elválasztásra, ha több is van. A '*' helyettes Comment Megjegyzés + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3318,6 +3418,10 @@ Használja a ';' karaktert az elválasztásra, ha több is van. A '*' helyettes There aren't any search plugins installed. Nincsenek telepítve keresőbővítmények. + + Start a search above. + + PluginSelectDlg @@ -3380,6 +3484,10 @@ Használja a ';' karaktert az elválasztásra, ha több is van. A '*' helyettes Seeders Seederek + + Published On + + SearchPluginsTable @@ -3447,11 +3555,11 @@ Használja a ';' karaktert az elválasztásra, ha több is van. A '*' helyettes Pause torrents - Torrentek szüneteltetése + Torrentek szüneteltetése Resume torrents - Torrentek folytatása + Torrentek folytatása Remove unused tags @@ -3469,6 +3577,14 @@ Használja a ';' karaktert az elválasztásra, ha több is van. A '*' helyettes Remove torrents Torrentek eltávolítása + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3609,6 +3725,22 @@ Használja a ';' karaktert az elválasztásra, ha több is van. A '*' helyettes Download link Letöltési link + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3908,7 +4040,7 @@ Használja a ';' karaktert az elválasztásra, ha több is van. A '*' helyettes Add Paused: - Hozzáad szüneteltetve: + Hozzáad szüneteltetve: Please type the name of the new download rule. @@ -3968,12 +4100,16 @@ Támogatja a formátumokat: S01E01, 1x1, 2017.12.31 és 31.12.2017. (A dátumfor Add Tags: Címkék hozzáadása: + + Add Stopped: + + TrackerFiltersList Resume torrents - Torrentek folytatása + Torrentek folytatása All (%1) @@ -3985,12 +4121,20 @@ Támogatja a formátumokat: S01E01, 1x1, 2017.12.31 és 31.12.2017. (A dátumfor Pause torrents - Torrentek szüneteltetése + Torrentek szüneteltetése Remove torrents Torrentek eltávolítása + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4138,4 +4282,11 @@ Támogatja a formátumokat: S01E01, 1x1, 2017.12.31 és 31.12.2017. (A dátumfor Válasszon naplózási szintet... + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_hy.ts b/src/webui/www/translations/webui_hy.ts index 08e0e52db..bbcd19eca 100644 --- a/src/webui/www/translations/webui_hy.ts +++ b/src/webui/www/translations/webui_hy.ts @@ -98,11 +98,11 @@ Resume torrents - Շարունակել torrent-ները + Շարունակել torrent-ները Pause torrents - Դադարեցնել torrent-ները + Դադարեցնել torrent-ները New Category @@ -120,6 +120,14 @@ Add subcategory... Ավելացնել ենթաանվանակարգ... + + Start torrents + + + + Stop torrents + + HttpServer @@ -189,15 +197,15 @@ Username - Մուտքանուն + Մուտքանուն Password - Գաղտնաբառ + Գաղտնաբառ Login - Օգտանուն + Օգտանուն Apply @@ -387,6 +395,18 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Unable to log in, qBittorrent is probably unreachable. + + + + Could not contact qBittorrent + + + + Invalid Username or Password. + + MainWindow @@ -416,7 +436,7 @@ Resume - Շարունակել + Շարունակել Top Toolbar @@ -436,7 +456,7 @@ Resume All - Շարունակել բոլորը + Շարունակել բոլորը Statistics @@ -448,11 +468,11 @@ Pause - Դադար + Դադար Pause All - Դադարեցնել բոլորը + Դադարեցնել բոլորը Add Torrent File... @@ -599,14 +619,6 @@ Remove - - Would you like to resume all torrents? - - - - Would you like to pause all torrents? - - Execution Log Գրանցամատյան @@ -619,6 +631,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -670,10 +706,6 @@ Torrent Queueing Torrent-ը հերթում է - - Automatically add these trackers to new downloads: - - Web User Interface (Remote control) @@ -1174,7 +1206,7 @@ Pause torrent - Դադարեցնել torrent-ը + Դադարեցնել torrent-ը Remove torrent and its files @@ -1820,6 +1852,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2184,6 +2232,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2314,11 +2370,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resumed (0) - Վերսկսված (0) + Վերսկսված (0) Paused (0) - Դադարի մեջ (0) + Դադարի մեջ (0) Active (0) @@ -2350,11 +2406,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused (%1) - Դադարի մեջ (%1) + Դադարի մեջ (%1) Resumed (%1) - Վերսկսված (%1) + Վերսկսված (%1) Active (%1) @@ -2408,6 +2464,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2427,7 +2499,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Done % Done - -ը բեռնվել է + -ը բեռնվել է Status @@ -2564,6 +2636,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2700,7 +2780,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused - Դադարի մեջ է + Դադարի մեջ է Completed @@ -2766,6 +2846,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata + + Stopped + + TransferListFiltersWidget @@ -2807,17 +2891,17 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resume Resume/start the torrent - Վերսկսել + Վերսկսել Force Resume Force Resume/start the torrent - Ստիպողաբար շարունակել + Ստիպողաբար շարունակել Pause Pause the torrent - Դադար + Դադար Limit share ratio... @@ -2989,6 +3073,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3234,6 +3330,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3296,6 +3396,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders Բաժանողներ + + Published On + + SearchPluginsTable @@ -3363,11 +3467,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Pause torrents - Դադարեցնել torrent-ները + Դադարեցնել torrent-ները Resume torrents - Շարունակել torrent-ները + Շարունակել torrent-ները Remove unused tags @@ -3385,6 +3489,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3525,6 +3637,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3822,10 +3950,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. If word order is important use * instead of whitespace. - - Add Paused: - - Please type the name of the new download rule. Նշեք բեռնման կանոնի անունը։ @@ -3883,12 +4007,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - Շարունակել torrent-ները + Շարունակել torrent-ները All (%1) @@ -3900,12 +4028,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - Դադարեցնել torrent-ները + Դադարեցնել torrent-ները Remove torrents + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4053,4 +4189,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_id.ts b/src/webui/www/translations/webui_id.ts index 533ea7f90..b31c3882d 100644 --- a/src/webui/www/translations/webui_id.ts +++ b/src/webui/www/translations/webui_id.ts @@ -98,11 +98,11 @@ Resume torrents - Lanjutkan torrent + Lanjutkan torrent Pause torrents - Jeda torrent + Jeda torrent New Category @@ -120,6 +120,14 @@ Add subcategory... Tambah subkategori... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Tidak bisa masuk, qBittorrent mungkin tidak terjangkau. + Tidak bisa masuk, qBittorrent mungkin tidak terjangkau. Invalid Username or Password. - Nama Pengguna atau Sandi tidak valid. + Nama Pengguna atau Sandi tidak valid. Username - Nama pengguna + Nama pengguna Password - Sandi + Sandi Login - Masuk + Masuk Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Lanjutkan + Lanjutkan Top Toolbar @@ -456,7 +468,7 @@ Resume All - Lanjutkan Semua + Lanjutkan Semua Statistics @@ -468,11 +480,11 @@ Pause - Tangguhkan + Tangguhkan Pause All - Jeda Semua + Jeda Semua Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Ingin lanjutkan semua torrents? + Ingin lanjutkan semua torrents? Would you like to pause all torrents? - Ingin tunda semua torrents? + Ingin tunda semua torrents? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Otomatis tambahkan tracker berikut ke unduhan baru: + Otomatis tambahkan tracker berikut ke unduhan baru: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Jeda torrent + Jeda torrent Remove torrent and its files @@ -1856,6 +1892,22 @@ Gunakan ';' untuk memisahkan banyak kata. Dapat menggunakan wildcard '*'.Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2220,6 +2272,14 @@ Gunakan ';' untuk memisahkan banyak kata. Dapat menggunakan wildcard '*'.Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2350,11 +2410,11 @@ Gunakan ';' untuk memisahkan banyak kata. Dapat menggunakan wildcard '*'. Resumed (0) - Dilanjutkan (0) + Dilanjutkan (0) Paused (0) - Ditangguhkan (0) + Ditangguhkan (0) Active (0) @@ -2386,11 +2446,11 @@ Gunakan ';' untuk memisahkan banyak kata. Dapat menggunakan wildcard '*'. Paused (%1) - Ditangguhkan (%1) + Ditangguhkan (%1) Resumed (%1) - Dilanjutkan (%1) + Dilanjutkan (%1) Active (%1) @@ -2444,6 +2504,22 @@ Gunakan ';' untuk memisahkan banyak kata. Dapat menggunakan wildcard '*'.Moving (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2463,7 +2539,7 @@ Gunakan ';' untuk memisahkan banyak kata. Dapat menggunakan wildcard '*'. Done % Done - Selesai + Selesai Status @@ -2600,6 +2676,14 @@ Gunakan ';' untuk memisahkan banyak kata. Dapat menggunakan wildcard '*'.Reannounce In Umumkan ulang di + + Popularity + + + + Progress + + TrackerListWidget @@ -2736,7 +2820,7 @@ Gunakan ';' untuk memisahkan banyak kata. Dapat menggunakan wildcard '*'. Paused - Ditangguhkan + Ditangguhkan Completed @@ -2802,6 +2886,10 @@ Gunakan ';' untuk memisahkan banyak kata. Dapat menggunakan wildcard '*'.[F] Downloading metadata [F] Mengunduh metadata + + Stopped + + TransferListFiltersWidget @@ -2843,17 +2931,17 @@ Gunakan ';' untuk memisahkan banyak kata. Dapat menggunakan wildcard '*'. Resume Resume/start the torrent - Lanjutkan + Lanjutkan Force Resume Force Resume/start the torrent - Paksa Lanjutkan + Paksa Lanjutkan Pause Pause the torrent - Tangguhkan + Tangguhkan Limit share ratio... @@ -3025,6 +3113,18 @@ Gunakan ';' untuk memisahkan banyak kata. Dapat menggunakan wildcard '*'.Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3270,6 +3370,10 @@ Gunakan ';' untuk memisahkan banyak kata. Dapat menggunakan wildcard '*'.There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3332,6 +3436,10 @@ Gunakan ';' untuk memisahkan banyak kata. Dapat menggunakan wildcard '*'.Seeders Benih + + Published On + + SearchPluginsTable @@ -3399,11 +3507,11 @@ Gunakan ';' untuk memisahkan banyak kata. Dapat menggunakan wildcard '*'. Pause torrents - Jeda torrent + Jeda torrent Resume torrents - Lanjutkan torrent + Lanjutkan torrent Remove unused tags @@ -3421,6 +3529,14 @@ Gunakan ';' untuk memisahkan banyak kata. Dapat menggunakan wildcard '*'.Remove torrents Hilangkan Torrent + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3561,6 +3677,22 @@ Gunakan ';' untuk memisahkan banyak kata. Dapat menggunakan wildcard '*'.Download link Tautan unduhan + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3860,7 +3992,7 @@ Gunakan ';' untuk memisahkan banyak kata. Dapat menggunakan wildcard '*'. Add Paused: - Tambah Jeda: + Tambah Jeda: Please type the name of the new download rule. @@ -3919,12 +4051,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - Lanjutkan torrent + Lanjutkan torrent All (%1) @@ -3936,12 +4072,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - Tangguhkan torrent + Tangguhkan torrent Remove torrents Hilangkan Torrent + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4089,4 +4233,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pilih level log... + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_is.ts b/src/webui/www/translations/webui_is.ts index 1bff95589..fdb88fa29 100644 --- a/src/webui/www/translations/webui_is.ts +++ b/src/webui/www/translations/webui_is.ts @@ -96,14 +96,6 @@ Remove unused categories - - Resume torrents - - - - Pause torrents - - New Category Nýr flokkur @@ -120,6 +112,14 @@ Add subcategory... Bæta við undirflokk… + + Start torrents + + + + Stop torrents + + HttpServer @@ -189,15 +189,15 @@ Invalid Username or Password. - Rangt notandanafn eða lykilorð. + Rangt notandanafn eða lykilorð. Password - Lykilorð + Lykilorð Login - Skrá inn + Skrá inn Apply @@ -387,6 +387,18 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Unable to log in, qBittorrent is probably unreachable. + + + + Could not contact qBittorrent + + + + Username + + MainWindow @@ -414,10 +426,6 @@ Options... Valkostir... - - Resume - - Top Toolbar @@ -434,10 +442,6 @@ Donate! - - Resume All - - Statistics Tölfræði @@ -446,14 +450,6 @@ About Um - - Pause - - - - Pause All - - Add Torrent File... @@ -599,14 +595,6 @@ Remove - - Would you like to resume all torrents? - - - - Would you like to pause all torrents? - - Execution Log @@ -619,6 +607,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -666,10 +678,6 @@ Torrent Queueing - - Automatically add these trackers to new downloads: - - Web User Interface (Remote control) @@ -1164,10 +1172,6 @@ Fastest upload - - Pause torrent - - Remove torrent and its files @@ -1812,6 +1816,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2176,6 +2196,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2304,14 +2332,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. Completed (0) Lokið (0) - - Resumed (0) - - - - Paused (0) - - Active (0) @@ -2340,14 +2360,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. Completed (%1) Lokið (%1) - - Paused (%1) - - - - Resumed (%1) - - Active (%1) @@ -2400,6 +2412,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2419,7 +2447,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Done % Done - Lokið + Lokið Status @@ -2556,6 +2584,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2690,10 +2726,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. e.g.: 1h 20m ago %1 síðan - - Paused - - Completed Lokið @@ -2758,6 +2790,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata + + Stopped + + TransferListFiltersWidget @@ -2796,21 +2832,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. Rename Endurnefna - - Resume - Resume/start the torrent - - - - Force Resume - Force Resume/start the torrent - - - - Pause - Pause the torrent - - Limit share ratio... @@ -2981,6 +3002,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3226,6 +3259,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3288,6 +3325,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders + + Published On + + SearchPluginsTable @@ -3353,14 +3394,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. Tag: - - Pause torrents - - - - Resume torrents - - Remove unused tags @@ -3377,6 +3410,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3517,6 +3558,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3814,10 +3871,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. If word order is important use * instead of whitespace. - - Add Paused: - - Please type the name of the new download rule. @@ -3875,13 +3928,13 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: + + Add Stopped: + + TrackerFiltersList - - Resume torrents - - All (%1) Allt (%1) @@ -3891,11 +3944,15 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also - Pause torrents + Remove torrents - Remove torrents + Start torrents + + + + Stop torrents @@ -4045,4 +4102,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_it.ts b/src/webui/www/translations/webui_it.ts index 482dc04b2..a88bc7e8f 100644 --- a/src/webui/www/translations/webui_it.ts +++ b/src/webui/www/translations/webui_it.ts @@ -98,11 +98,11 @@ Resume torrents - Riprendi torrent + Riprendi torrent Pause torrents - Metti in pausa torrent + Metti in pausa torrent New Category @@ -120,6 +120,14 @@ Add subcategory... Aggiungi sottocategoria... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Impossibile effettuare l'accesso, probabilmente qBittorrent non è raggiungibile. + Impossibile effettuare l'accesso, probabilmente qBittorrent non è raggiungibile. Invalid Username or Password. - Username o password errati. + Username o password errati. Username - Nome utente + Nome utente Password - Password + Password Login - Login + Login Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Riprendi + Riprendi Top Toolbar @@ -456,7 +468,7 @@ Resume All - Riprendi tutti + Riprendi tutti Statistics @@ -468,11 +480,11 @@ Pause - Metti in pausa + Metti in pausa Pause All - Metti in pausa tutti + Metti in pausa tutti Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Vuoi riprendere tutti i torrent? + Vuoi riprendere tutti i torrent? Would you like to pause all torrents? - Vuoi mettere in pausa tutti i torrent? + Vuoi mettere in pausa tutti i torrent? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Aggiungi automaticamente questi server traccia ai nuovi download: + Aggiungi automaticamente questi server traccia ai nuovi download: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Pausa torrent + Pausa torrent Remove torrent and its files @@ -1907,6 +1943,22 @@ Ciò può essere utile se l'utente non è interessato all'anonimizzazione di I2P Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2271,6 +2323,14 @@ Ciò può essere utile se l'utente non è interessato all'anonimizzazione di I2P Match all occurrences Abbina tutte le occorrenze + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2401,11 +2461,11 @@ Ciò può essere utile se l'utente non è interessato all'anonimizzazione di I2P Resumed (0) - Ripresi (0) + Ripresi (0) Paused (0) - In pausa (0) + In pausa (0) Active (0) @@ -2437,11 +2497,11 @@ Ciò può essere utile se l'utente non è interessato all'anonimizzazione di I2P Paused (%1) - In pausa (%1) + In pausa (%1) Resumed (%1) - Ripresi (%1) + Ripresi (%1) Active (%1) @@ -2495,6 +2555,22 @@ Ciò può essere utile se l'utente non è interessato all'anonimizzazione di I2P Moving (0) Spostamento (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2514,7 +2590,7 @@ Ciò può essere utile se l'utente non è interessato all'anonimizzazione di I2P Done % Done - Avanzamento + Avanzamento Status @@ -2651,6 +2727,14 @@ Ciò può essere utile se l'utente non è interessato all'anonimizzazione di I2P Reannounce In Riannuncia + + Popularity + + + + Progress + + TrackerListWidget @@ -2787,7 +2871,7 @@ Ciò può essere utile se l'utente non è interessato all'anonimizzazione di I2P Paused - In pausa + In pausa Completed @@ -2853,6 +2937,10 @@ Ciò può essere utile se l'utente non è interessato all'anonimizzazione di I2P [F] Downloading metadata [F] Download metadati + + Stopped + + TransferListFiltersWidget @@ -2894,17 +2982,17 @@ Ciò può essere utile se l'utente non è interessato all'anonimizzazione di I2P Resume Resume/start the torrent - Riprendi + Riprendi Force Resume Force Resume/start the torrent - Forza avvio + Forza avvio Pause Pause the torrent - Metti in pausa + Metti in pausa Limit share ratio... @@ -3076,6 +3164,18 @@ Ciò può essere utile se l'utente non è interessato all'anonimizzazione di I2P Comment Commento + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3321,6 +3421,10 @@ Ciò può essere utile se l'utente non è interessato all'anonimizzazione di I2P There aren't any search plugins installed. Non c'è nessun plugin di ricerca installato. + + Start a search above. + + PluginSelectDlg @@ -3383,6 +3487,10 @@ Ciò può essere utile se l'utente non è interessato all'anonimizzazione di I2P Seeders Autori seed + + Published On + + SearchPluginsTable @@ -3450,11 +3558,11 @@ Ciò può essere utile se l'utente non è interessato all'anonimizzazione di I2P Pause torrents - Pausa torrent + Pausa torrent Resume torrents - Riprendi torrent + Riprendi torrent Remove unused tags @@ -3472,6 +3580,14 @@ Ciò può essere utile se l'utente non è interessato all'anonimizzazione di I2P Remove torrents Rimuovi torrent + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3613,6 +3729,22 @@ Il database è concesso in licenza con la licenza internazionale Creative Common Download link Collegamento download + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3914,7 +4046,7 @@ Puoi abilitarlo nelle impostazioni dell'applicazione. Add Paused: - Aggiungi in pausa: + Aggiungi in pausa: Please type the name of the new download rule. @@ -3973,12 +4105,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: Aggiungi tag: + + Add Stopped: + + TrackerFiltersList Resume torrents - Riprendi torrent + Riprendi torrent All (%1) @@ -3990,12 +4126,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - Pausa torrent + Pausa torrent Remove torrents Rimuovi torrent + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4143,4 +4287,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Seleziona livello registro... + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_ja.ts b/src/webui/www/translations/webui_ja.ts index 1dfedc3bc..aecec15a7 100644 --- a/src/webui/www/translations/webui_ja.ts +++ b/src/webui/www/translations/webui_ja.ts @@ -98,11 +98,11 @@ Resume torrents - Torrentの再開 + Torrentの再開 Pause torrents - Torrentの停止 + Torrentの停止 New Category @@ -120,6 +120,14 @@ Add subcategory... サブカテゴリーを追加... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - ログインできません。qBittorrentがおそらく通信できていません。 + ログインできません。qBittorrentがおそらく通信できていません。 Invalid Username or Password. - ユーザー名またはパスワーが正しくありません。 + ユーザー名またはパスワーが正しくありません。 Username - ユーザー名 + ユーザー名 Password - パスワード + パスワード Login - ログイン + ログイン Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - 再開 + 再開 Top Toolbar @@ -456,7 +468,7 @@ Resume All - すべて再開 + すべて再開 Statistics @@ -468,11 +480,11 @@ Pause - 停止 + 停止 Pause All - すべて停止 + すべて停止 Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - すべてのTorrentを再開しますか? + すべてのTorrentを再開しますか? Would you like to pause all torrents? - すべてのTorrentを一時停止しますか? + すべてのTorrentを一時停止しますか? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - 新しいダウンロードに以下のトラッカーを自動追加する: + 新しいダウンロードに以下のトラッカーを自動追加する: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Torrent停止 + Torrent停止 Remove torrent and its files @@ -1856,6 +1892,22 @@ DNSリバインディング攻撃を防ぐために、WebUIサーバーが使用 Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2220,6 +2272,14 @@ DNSリバインディング攻撃を防ぐために、WebUIサーバーが使用 Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2350,11 +2410,11 @@ DNSリバインディング攻撃を防ぐために、WebUIサーバーが使用 Resumed (0) - 再開 (0) + 再開 (0) Paused (0) - 停止中 (0) + 停止中 (0) Active (0) @@ -2386,11 +2446,11 @@ DNSリバインディング攻撃を防ぐために、WebUIサーバーが使用 Paused (%1) - 停止中 (%1) + 停止中 (%1) Resumed (%1) - 再開 (%1) + 再開 (%1) Active (%1) @@ -2444,6 +2504,22 @@ DNSリバインディング攻撃を防ぐために、WebUIサーバーが使用 Moving (0) 移動中 (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2463,7 +2539,7 @@ DNSリバインディング攻撃を防ぐために、WebUIサーバーが使用 Done % Done - 進行状況 + 進行状況 Status @@ -2600,6 +2676,14 @@ DNSリバインディング攻撃を防ぐために、WebUIサーバーが使用 Reannounce In 次のアナウンスまで + + Popularity + + + + Progress + + TrackerListWidget @@ -2736,7 +2820,7 @@ DNSリバインディング攻撃を防ぐために、WebUIサーバーが使用 Paused - 停止 + 停止 Completed @@ -2802,6 +2886,10 @@ DNSリバインディング攻撃を防ぐために、WebUIサーバーが使用 [F] Downloading metadata [F] メタデータのダウンロード中 + + Stopped + + TransferListFiltersWidget @@ -2843,17 +2931,17 @@ DNSリバインディング攻撃を防ぐために、WebUIサーバーが使用 Resume Resume/start the torrent - 再開 + 再開 Force Resume Force Resume/start the torrent - 強制再開 + 強制再開 Pause Pause the torrent - 停止 + 停止 Limit share ratio... @@ -3025,6 +3113,18 @@ DNSリバインディング攻撃を防ぐために、WebUIサーバーが使用 Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3270,6 +3370,10 @@ DNSリバインディング攻撃を防ぐために、WebUIサーバーが使用 There aren't any search plugins installed. 検索プラグインがインストールされていません。 + + Start a search above. + + PluginSelectDlg @@ -3332,6 +3436,10 @@ DNSリバインディング攻撃を防ぐために、WebUIサーバーが使用 Seeders シーダー + + Published On + + SearchPluginsTable @@ -3399,11 +3507,11 @@ DNSリバインディング攻撃を防ぐために、WebUIサーバーが使用 Pause torrents - Torrentの停止 + Torrentの停止 Resume torrents - Torrentの再開 + Torrentの再開 Remove unused tags @@ -3421,6 +3529,14 @@ DNSリバインディング攻撃を防ぐために、WebUIサーバーが使用 Remove torrents Torrentを削除 + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3561,6 +3677,22 @@ DNSリバインディング攻撃を防ぐために、WebUIサーバーが使用 Download link ダウンロードのリンク + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3860,7 +3992,7 @@ DNSリバインディング攻撃を防ぐために、WebUIサーバーが使用 Add Paused: - 一時停止で追加: + 一時停止で追加: Please type the name of the new download rule. @@ -3920,12 +4052,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - Torrentの再開 + Torrentの再開 All (%1) @@ -3937,12 +4073,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - Torrentの一時停止 + Torrentの一時停止 Remove torrents Torrentを削除 + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4090,4 +4234,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also ログレベルを選択... + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_ka.ts b/src/webui/www/translations/webui_ka.ts index 8ffc0e278..825aa364b 100644 --- a/src/webui/www/translations/webui_ka.ts +++ b/src/webui/www/translations/webui_ka.ts @@ -98,11 +98,11 @@ Resume torrents - ტორენტების გაგრძელება + ტორენტების გაგრძელება Pause torrents - ტორენტების დაპაუზება + ტორენტების დაპაუზება New Category @@ -120,6 +120,14 @@ Add subcategory... ქვეკატეგორიის დამატება... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - შესვლა არ არის შესაძლებელი, შესაძლებელია qBittorrent-ი არ არის ხელმისაწვდომი. + შესვლა არ არის შესაძლებელი, შესაძლებელია qBittorrent-ი არ არის ხელმისაწვდომი. Invalid Username or Password. - არასწორი მომხმარებლის სახელი ან პაროლი. + არასწორი მომხმარებლის სახელი ან პაროლი. Username - მომხმარებლის სახელი + მომხმარებლის სახელი Password - პაროლი + პაროლი Login - შესვლა + შესვლა Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - გაგრძელება + გაგრძელება Top Toolbar @@ -456,7 +468,7 @@ Resume All - ყველას გაგრძელება + ყველას გაგრძელება Statistics @@ -468,11 +480,11 @@ Pause - პაუზა + პაუზა Pause All - ყველას დაპაუზება + ყველას დაპაუზება Add Torrent File... @@ -614,14 +626,6 @@ Remove წაშლა - - Would you like to resume all torrents? - - - - Would you like to pause all torrents? - - Execution Log გაშვების ჟურნალი @@ -634,6 +638,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -687,7 +715,7 @@ Automatically add these trackers to new downloads: - ამ ტრეკერების ავტომატურად დამატება ახალი ჩამოტვირთვებისთვის + ამ ტრეკერების ავტომატურად დამატება ახალი ჩამოტვირთვებისთვის Web User Interface (Remote control) @@ -1197,7 +1225,7 @@ Pause torrent - ტორენტის დაპაუზება + ტორენტის დაპაუზება Remove torrent and its files @@ -1843,6 +1871,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2207,6 +2251,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2337,11 +2389,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resumed (0) - განახლებული (0) + განახლებული (0) Paused (0) - დაპაუზუბული (0) + დაპაუზუბული (0) Active (0) @@ -2373,11 +2425,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused (%1) - დაპაუზებულია (%1) + დაპაუზებულია (%1) Resumed (%1) - განახლებული (%1) + განახლებული (%1) Active (%1) @@ -2431,6 +2483,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2450,7 +2518,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Done % Done - დასრულდა + დასრულდა Status @@ -2587,6 +2655,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2723,7 +2799,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused - დაპაუზებული + დაპაუზებული Completed @@ -2789,6 +2865,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata [F] მეტამონაცემების ჩამოტვირთვა + + Stopped + + TransferListFiltersWidget @@ -2830,17 +2910,17 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resume Resume/start the torrent - გაგრძელება + გაგრძელება Force Resume Force Resume/start the torrent - გაგრძელების იძულება + გაგრძელების იძულება Pause Pause the torrent - დაპაუზება + დაპაუზება Limit share ratio... @@ -3012,6 +3092,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3257,6 +3349,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3319,6 +3415,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders სიდერები + + Published On + + SearchPluginsTable @@ -3386,11 +3486,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Pause torrents - ტორენტების დაპაუზება + ტორენტების დაპაუზება Resume torrents - ტორენტების გაგრძელება + ტორენტების გაგრძელება Remove unused tags @@ -3408,6 +3508,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3548,6 +3656,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link ჩამოტვირთვის ბმული + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3847,7 +3971,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Add Paused: - დაპაუზებულად დამატება: + დაპაუზებულად დამატება: Please type the name of the new download rule. @@ -3906,12 +4030,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - ტორენტების გაგრძელება + ტორენტების გაგრძელება All (%1) @@ -3923,12 +4051,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - ტორენტების დაპაუზება + ტორენტების დაპაუზება Remove torrents + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4076,4 +4212,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_ko.ts b/src/webui/www/translations/webui_ko.ts index 1e28431b3..ba9403121 100644 --- a/src/webui/www/translations/webui_ko.ts +++ b/src/webui/www/translations/webui_ko.ts @@ -98,11 +98,11 @@ Resume torrents - 토렌트 이어받기 + 토렌트 이어받기 Pause torrents - 토렌트 일시정지 + 토렌트 일시정지 New Category @@ -120,6 +120,14 @@ Add subcategory... 하위 범주 추가… + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - 로그인 할 수 없습니다. qBittorrent가 접근할 수 없는 것 같습니다. + 로그인 할 수 없습니다. qBittorrent가 접근할 수 없는 것 같습니다. Invalid Username or Password. - 사용자 이름/암호가 올바르지 않습니다. + 사용자 이름/암호가 올바르지 않습니다. Username - 사용자 이름 + 사용자 이름 Password - 암호 + 암호 Login - 로그인 + 로그인 Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - 이어받기 + 이어받기 Top Toolbar @@ -456,7 +468,7 @@ Resume All - 모두 이어받기 + 모두 이어받기 Statistics @@ -468,11 +480,11 @@ Pause - 일시정지 + 일시정지 Pause All - 모두 일시정지 + 모두 일시정지 Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - 모든 토렌트를 이어받기하시겠습니까? + 모든 토렌트를 이어받기하시겠습니까? Would you like to pause all torrents? - 모든 토렌트를 일시 정지하시겠습니까? + 모든 토렌트를 일시 정지하시겠습니까? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - 새 내려받기에 자동 추가할 트래커: + 새 내려받기에 자동 추가할 트래커: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - 토렌트 일시정지 + 토렌트 일시정지 Remove torrent and its files @@ -1904,6 +1940,22 @@ DNS 재결합 공격을 방어하기 위해 Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2268,6 +2320,14 @@ DNS 재결합 공격을 방어하기 위해 Match all occurrences 모든 항목 일치 + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2398,11 +2458,11 @@ DNS 재결합 공격을 방어하기 위해 Resumed (0) - 이어받기됨 (0) + 이어받기됨 (0) Paused (0) - 일시정지됨 (0) + 일시정지됨 (0) Active (0) @@ -2434,11 +2494,11 @@ DNS 재결합 공격을 방어하기 위해 Paused (%1) - 일시정지됨 (%1) + 일시정지됨 (%1) Resumed (%1) - 이어받기됨 (%1) + 이어받기됨 (%1) Active (%1) @@ -2492,6 +2552,22 @@ DNS 재결합 공격을 방어하기 위해 Moving (0) 이동 중 (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2511,7 +2587,7 @@ DNS 재결합 공격을 방어하기 위해 Done % Done - 완료 + 완료 Status @@ -2648,6 +2724,14 @@ DNS 재결합 공격을 방어하기 위해 Reannounce In 재공지 + + Popularity + + + + Progress + + TrackerListWidget @@ -2784,7 +2868,7 @@ DNS 재결합 공격을 방어하기 위해 Paused - 일시정지됨 + 일시정지됨 Completed @@ -2850,6 +2934,10 @@ DNS 재결합 공격을 방어하기 위해 [F] Downloading metadata [F] 메타데이터 내려받는 중 + + Stopped + + TransferListFiltersWidget @@ -2891,17 +2979,17 @@ DNS 재결합 공격을 방어하기 위해 Resume Resume/start the torrent - 이어받기 + 이어받기 Force Resume Force Resume/start the torrent - 이어받기 강제 적용 + 이어받기 강제 적용 Pause Pause the torrent - 일시정지 + 일시정지 Limit share ratio... @@ -3073,6 +3161,18 @@ DNS 재결합 공격을 방어하기 위해 Comment 주석 + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3318,6 +3418,10 @@ DNS 재결합 공격을 방어하기 위해 There aren't any search plugins installed. 설치된 검색 플러그인이 없습니다. + + Start a search above. + + PluginSelectDlg @@ -3380,6 +3484,10 @@ DNS 재결합 공격을 방어하기 위해 Seeders 배포자 + + Published On + + SearchPluginsTable @@ -3447,11 +3555,11 @@ DNS 재결합 공격을 방어하기 위해 Pause torrents - 토렌트 일시정지 + 토렌트 일시정지 Resume torrents - 토렌트 이어받기 + 토렌트 이어받기 Remove unused tags @@ -3469,6 +3577,14 @@ DNS 재결합 공격을 방어하기 위해 Remove torrents 토렌트 제거 + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3609,6 +3725,22 @@ DNS 재결합 공격을 방어하기 위해 Download link 내려받기 링크 + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3908,7 +4040,7 @@ DNS 재결합 공격을 방어하기 위해 Add Paused: - 일시정지해서 추가: + 일시정지해서 추가: Please type the name of the new download rule. @@ -3968,12 +4100,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: 태그 추가: + + Add Stopped: + + TrackerFiltersList Resume torrents - 토렌트 이어받기 + 토렌트 이어받기 All (%1) @@ -3985,12 +4121,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - 토렌트 일시정지 + 토렌트 일시정지 Remove torrents 토렌트 제거 + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4138,4 +4282,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also 로그 레벨 선정... + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_lt.ts b/src/webui/www/translations/webui_lt.ts index b11a1af5e..6245ac9f3 100644 --- a/src/webui/www/translations/webui_lt.ts +++ b/src/webui/www/translations/webui_lt.ts @@ -98,11 +98,11 @@ Resume torrents - Pratęsti torentus + Pratęsti torentus Pause torrents - Pristabdyti torentus + Pristabdyti torentus New Category @@ -120,6 +120,14 @@ Add subcategory... Pridėti subkategoriją... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Negalima prisijungti, qBittorrent, tikriausiai, yra nepasiekamas. + Negalima prisijungti, qBittorrent, tikriausiai, yra nepasiekamas. Invalid Username or Password. - Neteisingas naudotojo vardas ar slaptažodis. + Neteisingas naudotojo vardas ar slaptažodis. Username - Naudotojo vardas + Naudotojo vardas Password - Slaptažodis + Slaptažodis Login - Prisijungimas + Prisijungimas Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Tęsti + Tęsti Top Toolbar @@ -456,7 +468,7 @@ Resume All - Tęsti visus + Tęsti visus Statistics @@ -468,11 +480,11 @@ Pause - Pristabdyti + Pristabdyti Pause All - Pristabdyti visus + Pristabdyti visus Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Ar norėtumėte pratęsti visus torentus? + Ar norėtumėte pratęsti visus torentus? Would you like to pause all torrents? - Ar norėtumėte pristabdyti visus torentus? + Ar norėtumėte pristabdyti visus torentus? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Į naujus atsiuntimus, automatiškai pridėti šiuos seklius: + Į naujus atsiuntimus, automatiškai pridėti šiuos seklius: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Pristabdyti torentą + Pristabdyti torentą Remove torrent and its files @@ -1858,6 +1894,22 @@ pakaitos simbolį "*". Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2222,6 +2274,14 @@ pakaitos simbolį "*". Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2352,11 +2412,11 @@ pakaitos simbolį "*". Resumed (0) - Pratęsti (0) + Pratęsti (0) Paused (0) - Pristabdyti (0) + Pristabdyti (0) Active (0) @@ -2388,11 +2448,11 @@ pakaitos simbolį "*". Paused (%1) - Pristabdyti (%1) + Pristabdyti (%1) Resumed (%1) - Pratęsti (%1) + Pratęsti (%1) Active (%1) @@ -2446,6 +2506,22 @@ pakaitos simbolį "*". Moving (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2465,7 +2541,7 @@ pakaitos simbolį "*". Done % Done - Baigta + Baigta Status @@ -2602,6 +2678,14 @@ pakaitos simbolį "*". Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2738,7 +2822,7 @@ pakaitos simbolį "*". Paused - Pristabdyti + Pristabdyti Completed @@ -2804,6 +2888,10 @@ pakaitos simbolį "*". [F] Downloading metadata [P] Atsiunčiami metaduomenys + + Stopped + + TransferListFiltersWidget @@ -2845,17 +2933,17 @@ pakaitos simbolį "*". Resume Resume/start the torrent - Tęsti + Tęsti Force Resume Force Resume/start the torrent - Priverstinai pratęsti + Priverstinai pratęsti Pause Pause the torrent - Pristabdyti + Pristabdyti Limit share ratio... @@ -3027,6 +3115,18 @@ pakaitos simbolį "*". Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3272,6 +3372,10 @@ pakaitos simbolį "*". There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3334,6 +3438,10 @@ pakaitos simbolį "*". Seeders Skleidėjai + + Published On + + SearchPluginsTable @@ -3401,11 +3509,11 @@ pakaitos simbolį "*". Pause torrents - Pristabdyti torentus + Pristabdyti torentus Resume torrents - Pratęsti torentus + Pratęsti torentus Remove unused tags @@ -3423,6 +3531,14 @@ pakaitos simbolį "*". Remove torrents Pašalinti torentai + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3563,6 +3679,22 @@ pakaitos simbolį "*". Download link Atsiuntimo nuoroda + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3862,7 +3994,7 @@ pakaitos simbolį "*". Add Paused: - Pridėti pristabdytus: + Pridėti pristabdytus: Please type the name of the new download rule. @@ -3922,12 +4054,16 @@ Palaiko formatus: S01E01, 1x1, 2017.12.31 ir 31.12.2017 (Datos formatai taip pat Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - Prastęsti torentus + Prastęsti torentus All (%1) @@ -3939,12 +4075,20 @@ Palaiko formatus: S01E01, 1x1, 2017.12.31 ir 31.12.2017 (Datos formatai taip pat Pause torrents - Pristabdyti torentus + Pristabdyti torentus Remove torrents Pašalinti torentai + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4092,4 +4236,11 @@ Palaiko formatus: S01E01, 1x1, 2017.12.31 ir 31.12.2017 (Datos formatai taip pat + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_ltg.ts b/src/webui/www/translations/webui_ltg.ts index 1286d8450..5f390569f 100644 --- a/src/webui/www/translations/webui_ltg.ts +++ b/src/webui/www/translations/webui_ltg.ts @@ -98,11 +98,11 @@ Resume torrents - Aizsuokt torrentus + Aizsuokt torrentus Pause torrents - Nūstuodeit torrentus + Nūstuodeit torrentus New Category @@ -120,6 +120,14 @@ Add subcategory... Pīlikt zamkategoreju... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Dasaslēgšuonās naīsadevās, varams, ka qBittorrent navā dasnēdzuoms. + Dasaslēgšuonās naīsadevās, varams, ka qBittorrent navā dasnēdzuoms. Invalid Username or Password. - Napareizs slāgvuords voi paroļs + Napareizs slāgvuords voi paroļs Username - Lītuotuojs + Lītuotuojs Password - Paroļs + Paroļs Login - Dasaslāgt + Dasaslāgt Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Aizsuokt + Aizsuokt Top Toolbar @@ -456,7 +468,7 @@ Resume All - Aizsuokt vysys + Aizsuokt vysys Statistics @@ -468,11 +480,11 @@ Pause - Nūstateit + Nūstateit Pause All - Nūstuodeit vysys + Nūstuodeit vysys Add Torrent File... @@ -619,14 +631,6 @@ Remove - - Would you like to resume all torrents? - - - - Would you like to pause all torrents? - - Execution Log @@ -639,6 +643,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +720,7 @@ Automatically add these trackers to new downloads: - Automatiski pīlikt šūs trakerus pi jaunīm torrentīm: + Automatiski pīlikt šūs trakerus pi jaunīm torrentīm: Web User Interface (Remote control) @@ -1194,7 +1222,7 @@ Pause torrent - Nūstuodeit torrentu + Nūstuodeit torrentu Remove torrent and its files @@ -1840,6 +1868,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2204,6 +2248,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2334,11 +2386,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resumed (0) - Aizsuoktie (0) + Aizsuoktie (0) Paused (0) - Nūstuodeiti (0) + Nūstuodeiti (0) Active (0) @@ -2370,11 +2422,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused (%1) - Nūstuodeiti (%1) + Nūstuodeiti (%1) Resumed (%1) - Aizsuoktie (%1) + Aizsuoktie (%1) Active (%1) @@ -2428,6 +2480,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2447,7 +2515,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Done % Done - Dabeigti + Dabeigti Status @@ -2584,6 +2652,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2720,7 +2796,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused - Nūstuodeits + Nūstuodeits Completed @@ -2786,6 +2862,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata [P] Atsasyutē metadatus + + Stopped + + TransferListFiltersWidget @@ -2827,17 +2907,17 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resume Resume/start the torrent - Aizsuokt + Aizsuokt Force Resume Force Resume/start the torrent - Dastateiga aizsuoksona + Dastateiga aizsuoksona Pause Pause the torrent - Nūstateit + Nūstateit Limit share ratio... @@ -3009,6 +3089,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3254,6 +3346,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3316,6 +3412,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders Devieji + + Published On + + SearchPluginsTable @@ -3383,11 +3483,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Pause torrents - Nūstuodeit torrentus + Nūstuodeit torrentus Resume torrents - Aizsuokt torrentus + Aizsuokt torrentus Remove unused tags @@ -3405,6 +3505,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3545,6 +3653,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link Atsasyuteišonys saita + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3844,7 +3968,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Add Paused: - Dalikt nūstuodeitu: + Dalikt nūstuodeitu: Please type the name of the new download rule. @@ -3904,12 +4028,16 @@ Formats: S01E01, 1x1, 2017.12.31 i 31.12.2017 (Datam škiramsimbola "." vītā v Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - Aizsuokt torrentus + Aizsuokt torrentus All (%1) @@ -3921,12 +4049,20 @@ Formats: S01E01, 1x1, 2017.12.31 i 31.12.2017 (Datam škiramsimbola "." vītā v Pause torrents - Nūstuodeit torrentus + Nūstuodeit torrentus Remove torrents + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4074,4 +4210,11 @@ Formats: S01E01, 1x1, 2017.12.31 i 31.12.2017 (Datam škiramsimbola "." vītā v + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_lv_LV.ts b/src/webui/www/translations/webui_lv_LV.ts index ef7f64f8d..cae7883e8 100644 --- a/src/webui/www/translations/webui_lv_LV.ts +++ b/src/webui/www/translations/webui_lv_LV.ts @@ -98,11 +98,11 @@ Resume torrents - Atsākt torrentus + Atsākt torrentus Pause torrents - Apturēt torrentus + Apturēt torrentus New Category @@ -120,6 +120,14 @@ Add subcategory... Pievienot apakškategoriju... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Neizdevās pierakstīties, qBittorrent droši vien nav sasniedzams. + Neizdevās pierakstīties, qBittorrent droši vien nav sasniedzams. Invalid Username or Password. - Nederīgs lietotājvārds vai parole. + Nederīgs lietotājvārds vai parole. Username - Lietotājvārds + Lietotājvārds Password - Parole + Parole Login - Pierakstīties + Pierakstīties Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Atsākt + Atsākt Top Toolbar @@ -456,7 +468,7 @@ Resume All - Atsākt visus + Atsākt visus Statistics @@ -468,11 +480,11 @@ Pause - Apturēt + Apturēt Pause All - Apturēt visus + Apturēt visus Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Vai vēlies atsākt visus torrentus? + Vai vēlies atsākt visus torrentus? Would you like to pause all torrents? - Vai vēlies apturēt visus torrentus? + Vai vēlies apturēt visus torrentus? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Automātiski pievienot šos trakerus jaunajiem torrentiem: + Automātiski pievienot šos trakerus jaunajiem torrentiem: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Apturēt torrentu + Apturēt torrentu Remove torrent and its files @@ -1884,6 +1920,22 @@ Izmantojiet ';' lai atdalītu vairākus vārdus. Varat izmantot vietturi '*'.Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2248,6 +2300,14 @@ Izmantojiet ';' lai atdalītu vairākus vārdus. Varat izmantot vietturi '*'.Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2378,11 +2438,11 @@ Izmantojiet ';' lai atdalītu vairākus vārdus. Varat izmantot vietturi '*'. Resumed (0) - Atsākti (0) + Atsākti (0) Paused (0) - Apturēti (0) + Apturēti (0) Active (0) @@ -2414,11 +2474,11 @@ Izmantojiet ';' lai atdalītu vairākus vārdus. Varat izmantot vietturi '*'. Paused (%1) - Apturēti (%1) + Apturēti (%1) Resumed (%1) - Atsākti (%1) + Atsākti (%1) Active (%1) @@ -2472,6 +2532,22 @@ Izmantojiet ';' lai atdalītu vairākus vārdus. Varat izmantot vietturi '*'.Moving (0) Pārvieto (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2491,7 +2567,7 @@ Izmantojiet ';' lai atdalītu vairākus vārdus. Varat izmantot vietturi '*'. Done % Done - Pabeigti + Pabeigti Status @@ -2628,6 +2704,14 @@ Izmantojiet ';' lai atdalītu vairākus vārdus. Varat izmantot vietturi '*'.Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2764,7 +2848,7 @@ Izmantojiet ';' lai atdalītu vairākus vārdus. Varat izmantot vietturi '*'. Paused - Apturēts + Apturēts Completed @@ -2830,6 +2914,10 @@ Izmantojiet ';' lai atdalītu vairākus vārdus. Varat izmantot vietturi '*'.[F] Downloading metadata [P] Lejupielādē metadatus + + Stopped + + TransferListFiltersWidget @@ -2871,17 +2959,17 @@ Izmantojiet ';' lai atdalītu vairākus vārdus. Varat izmantot vietturi '*'. Resume Resume/start the torrent - Atsākt + Atsākt Force Resume Force Resume/start the torrent - Piespiedu atsākšana + Piespiedu atsākšana Pause Pause the torrent - Apturēt + Apturēt Limit share ratio... @@ -3053,6 +3141,18 @@ Izmantojiet ';' lai atdalītu vairākus vārdus. Varat izmantot vietturi '*'.Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3298,6 +3398,10 @@ Izmantojiet ';' lai atdalītu vairākus vārdus. Varat izmantot vietturi '*'.There aren't any search plugins installed. Nav instalēts neviens meklēšanas spraudnis. + + Start a search above. + + PluginSelectDlg @@ -3360,6 +3464,10 @@ Izmantojiet ';' lai atdalītu vairākus vārdus. Varat izmantot vietturi '*'.Seeders Devēji + + Published On + + SearchPluginsTable @@ -3427,11 +3535,11 @@ Izmantojiet ';' lai atdalītu vairākus vārdus. Varat izmantot vietturi '*'. Pause torrents - Apturēt torrentus + Apturēt torrentus Resume torrents - Atsākt torrentus + Atsākt torrentus Remove unused tags @@ -3449,6 +3557,14 @@ Izmantojiet ';' lai atdalītu vairākus vārdus. Varat izmantot vietturi '*'.Remove torrents Dzēst torrentus + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3589,6 +3705,22 @@ Izmantojiet ';' lai atdalītu vairākus vārdus. Varat izmantot vietturi '*'.Download link Lejupielādes adresi + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3888,7 +4020,7 @@ Izmantojiet ';' lai atdalītu vairākus vārdus. Varat izmantot vietturi '*'. Add Paused: - Pievienot apstādinātu: + Pievienot apstādinātu: Please type the name of the new download rule. @@ -3948,12 +4080,16 @@ Atbalsta formātus: S01E01, 1x1, 2017.12.31 un 31.12.2017 (Datumu formātos kā Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - Atsākt torrentus + Atsākt torrentus All (%1) @@ -3965,12 +4101,20 @@ Atbalsta formātus: S01E01, 1x1, 2017.12.31 un 31.12.2017 (Datumu formātos kā Pause torrents - Apturēt torrentus + Apturēt torrentus Remove torrents Dzēst torrentus + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4118,4 +4262,11 @@ Atbalsta formātus: S01E01, 1x1, 2017.12.31 un 31.12.2017 (Datumu formātos kā + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_mn_MN.ts b/src/webui/www/translations/webui_mn_MN.ts index 79aa886e7..3d92084be 100644 --- a/src/webui/www/translations/webui_mn_MN.ts +++ b/src/webui/www/translations/webui_mn_MN.ts @@ -98,11 +98,11 @@ Resume torrents - Торрентуудыг үргэлжлүүлэх + Торрентуудыг үргэлжлүүлэх Pause torrents - Торрентуудыг зогсоох + Торрентуудыг зогсоох New Category @@ -120,6 +120,14 @@ Add subcategory... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Нэвтэрч чадсангүй, qBittorrent-н хандалт таслалдсан байж болно. + Нэвтэрч чадсангүй, qBittorrent-н хандалт таслалдсан байж болно. Invalid Username or Password. - Хэрэглэгчийн нэр эсвэл нууц үг тохирохгүй байна. + Хэрэглэгчийн нэр эсвэл нууц үг тохирохгүй байна. Username - Хэрэглэгчийн нэр + Хэрэглэгчийн нэр Password - Нууц үг + Нууц үг Login - Нэвтрэх + Нэвтрэх Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Үргэлжлүүлэх + Үргэлжлүүлэх Top Toolbar @@ -456,7 +468,7 @@ Resume All - Бүгдийг үргэлжлүүлэх + Бүгдийг үргэлжлүүлэх Statistics @@ -468,11 +480,11 @@ Pause - Түр зогсоох + Түр зогсоох Pause All - Бүгдийг түр зогсоох + Бүгдийг түр зогсоох Add Torrent File... @@ -619,14 +631,6 @@ Remove - - Would you like to resume all torrents? - - - - Would you like to pause all torrents? - - Execution Log Гүйцэтгэх Нэвтрэх @@ -639,6 +643,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -690,10 +718,6 @@ Torrent Queueing Торрентийн дараалал - - Automatically add these trackers to new downloads: - - Web User Interface (Remote control) Веб Хэрэглэгчийн Интерфейс (Зайнаас удирдах) @@ -1192,10 +1216,6 @@ Fastest upload Дээд хурд - - Pause torrent - - Remove torrent and its files @@ -1840,6 +1860,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2204,6 +2240,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2332,14 +2376,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. Completed (0) - - Resumed (0) - - - - Paused (0) - - Active (0) @@ -2368,14 +2404,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. Completed (%1) - - Paused (%1) - - - - Resumed (%1) - - Active (%1) @@ -2428,6 +2456,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2444,11 +2488,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. i.e: torrent size - - Done - % Done - - Status Torrent status (e.g. downloading, seeding, paused) @@ -2584,6 +2623,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2718,10 +2765,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. e.g.: 1h 20m ago - - Paused - - Completed @@ -2786,6 +2829,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata + + Stopped + + TransferListFiltersWidget @@ -2827,17 +2874,12 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resume Resume/start the torrent - Үргэлжлүүлэх - - - Force Resume - Force Resume/start the torrent - + Үргэлжлүүлэх Pause Pause the torrent - Түр зогсоох + Түр зогсоох Limit share ratio... @@ -3009,6 +3051,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3254,6 +3308,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3316,6 +3374,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders + + Published On + + SearchPluginsTable @@ -3383,11 +3445,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Pause torrents - Торрентуудыг зогсоох + Торрентуудыг зогсоох Resume torrents - Торрентуудыг үргэлжлүүлэх + Торрентуудыг үргэлжлүүлэх Remove unused tags @@ -3405,6 +3467,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3545,6 +3615,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3844,7 +3930,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Add Paused: - Завсарлага: + Завсарлага: Please type the name of the new download rule. @@ -3904,12 +3990,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - Торрентуудыг үргэлжлүүлэх + Торрентуудыг үргэлжлүүлэх All (%1) @@ -3921,12 +4011,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - Торрентуудыг зогсоох + Торрентуудыг зогсоох Remove torrents + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4074,4 +4172,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_ms_MY.ts b/src/webui/www/translations/webui_ms_MY.ts index 1d02482c2..df8f5226a 100644 --- a/src/webui/www/translations/webui_ms_MY.ts +++ b/src/webui/www/translations/webui_ms_MY.ts @@ -98,11 +98,11 @@ Resume torrents - Sambung semula torrent + Sambung semula torrent Pause torrents - Jeda torrent + Jeda torrent New Category @@ -120,6 +120,14 @@ Add subcategory... Tambah subkategori... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Tidak boleh daftar masuk, qBittorrent berkemungkinan tidak boleh dicapai. + Tidak boleh daftar masuk, qBittorrent berkemungkinan tidak boleh dicapai. Invalid Username or Password. - Nama Pengguna atau Kata Laluan tidak sah. + Nama Pengguna atau Kata Laluan tidak sah. Username - Nama pengguna + Nama pengguna Password - Kata Laluan + Kata Laluan Login - Daftar Masuk + Daftar Masuk Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Sambung Semula + Sambung Semula Top Toolbar @@ -456,7 +468,7 @@ Resume All - Sambung Semula Semua + Sambung Semula Semua Statistics @@ -468,11 +480,11 @@ Pause - Jeda + Jeda Pause All - Jeda Semua + Jeda Semua Add Torrent File... @@ -619,14 +631,6 @@ Remove - - Would you like to resume all torrents? - - - - Would you like to pause all torrents? - - Execution Log Log Pelakuan @@ -639,6 +643,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +720,7 @@ Automatically add these trackers to new downloads: - Tambah penjejak ini secara automatik ke muat turun baharu: + Tambah penjejak ini secara automatik ke muat turun baharu: Web User Interface (Remote control) @@ -1206,7 +1234,7 @@ Pause torrent - Jeda torrent + Jeda torrent Remove torrent and its files @@ -1856,6 +1884,22 @@ Guna ';' untuk asingkan masukan berbilang. Boleh guna kad liar '*'.Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2220,6 +2264,14 @@ Guna ';' untuk asingkan masukan berbilang. Boleh guna kad liar '*'.Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2350,11 +2402,11 @@ Guna ';' untuk asingkan masukan berbilang. Boleh guna kad liar '*'. Resumed (0) - Disambung Semula (0) + Disambung Semula (0) Paused (0) - Dijeda (0) + Dijeda (0) Active (0) @@ -2386,11 +2438,11 @@ Guna ';' untuk asingkan masukan berbilang. Boleh guna kad liar '*'. Paused (%1) - Dijeda (%1) + Dijeda (%1) Resumed (%1) - Disambung Semula (%1) + Disambung Semula (%1) Active (%1) @@ -2444,6 +2496,22 @@ Guna ';' untuk asingkan masukan berbilang. Boleh guna kad liar '*'.Moving (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2463,7 +2531,7 @@ Guna ';' untuk asingkan masukan berbilang. Boleh guna kad liar '*'. Done % Done - Selesai + Selesai Status @@ -2600,6 +2668,14 @@ Guna ';' untuk asingkan masukan berbilang. Boleh guna kad liar '*'.Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2736,7 +2812,7 @@ Guna ';' untuk asingkan masukan berbilang. Boleh guna kad liar '*'. Paused - Dijeda + Dijeda Completed @@ -2802,6 +2878,10 @@ Guna ';' untuk asingkan masukan berbilang. Boleh guna kad liar '*'.[F] Downloading metadata + + Stopped + + TransferListFiltersWidget @@ -2843,17 +2923,17 @@ Guna ';' untuk asingkan masukan berbilang. Boleh guna kad liar '*'. Resume Resume/start the torrent - Sambung Semula + Sambung Semula Force Resume Force Resume/start the torrent - Paksa Sambung Semula + Paksa Sambung Semula Pause Pause the torrent - Jeda + Jeda Limit share ratio... @@ -3025,6 +3105,18 @@ Guna ';' untuk asingkan masukan berbilang. Boleh guna kad liar '*'.Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3270,6 +3362,10 @@ Guna ';' untuk asingkan masukan berbilang. Boleh guna kad liar '*'.There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3332,6 +3428,10 @@ Guna ';' untuk asingkan masukan berbilang. Boleh guna kad liar '*'.Seeders Penyemai + + Published On + + SearchPluginsTable @@ -3399,11 +3499,11 @@ Guna ';' untuk asingkan masukan berbilang. Boleh guna kad liar '*'. Pause torrents - Jeda torrent + Jeda torrent Resume torrents - Sambung semula torrent + Sambung semula torrent Remove unused tags @@ -3421,6 +3521,14 @@ Guna ';' untuk asingkan masukan berbilang. Boleh guna kad liar '*'.Remove torrents + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3561,6 +3669,22 @@ Guna ';' untuk asingkan masukan berbilang. Boleh guna kad liar '*'.Download link Pautan muat turun + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3860,7 +3984,7 @@ Guna ';' untuk asingkan masukan berbilang. Boleh guna kad liar '*'. Add Paused: - Tambah Dijeda: + Tambah Dijeda: Please type the name of the new download rule. @@ -3919,12 +4043,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - Sambung semula torrent + Sambung semula torrent All (%1) @@ -3936,12 +4064,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - Jeda torrent + Jeda torrent Remove torrents + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4089,4 +4225,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_nb.ts b/src/webui/www/translations/webui_nb.ts index bf5e8be26..c8b339534 100644 --- a/src/webui/www/translations/webui_nb.ts +++ b/src/webui/www/translations/webui_nb.ts @@ -98,11 +98,11 @@ Resume torrents - Gjenoppta torrenter + Gjenoppta torrenter Pause torrents - Sett torrenter på pause + Sett torrenter på pause New Category @@ -120,6 +120,14 @@ Add subcategory... Legg til underkategori … + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Ikke i stand til å logge inn, qBittorrent er sannsynligvis unåelig. + Ikke i stand til å logge inn, qBittorrent er sannsynligvis unåelig. Invalid Username or Password. - Ugyldig brukernavn eller passord. + Ugyldig brukernavn eller passord. Username - Brukernavn + Brukernavn Password - Passord + Passord Login - Logg inn + Logg inn Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Gjenoppta + Gjenoppta Top Toolbar @@ -456,7 +468,7 @@ Resume All - Gjenoppta alle + Gjenoppta alle Statistics @@ -468,11 +480,11 @@ Pause - Sett på pause + Sett på pause Pause All - Sett alt på pause + Sett alt på pause Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Vil du gjenoppta alle torrenter? + Vil du gjenoppta alle torrenter? Would you like to pause all torrents? - Vil du sette alle torrenter på pause? + Vil du sette alle torrenter på pause? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Automatisk legg disse sporerne til nye nedlastinger: + Automatisk legg disse sporerne til nye nedlastinger: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Sett torrent på pause + Sett torrent på pause Remove torrent and its files @@ -1904,6 +1940,22 @@ Bruk ";" for å splitte flerfoldige oppføringer. Jokertegnet "*" kan brukes.Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2268,6 +2320,14 @@ Bruk ";" for å splitte flerfoldige oppføringer. Jokertegnet "*" kan brukes.Match all occurrences Treff alle forekomster + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2398,11 +2458,11 @@ Bruk ";" for å splitte flerfoldige oppføringer. Jokertegnet "*" kan brukes. Resumed (0) - Gjenopptatte (0) + Gjenopptatte (0) Paused (0) - Satt på pause (0) + Satt på pause (0) Active (0) @@ -2434,11 +2494,11 @@ Bruk ";" for å splitte flerfoldige oppføringer. Jokertegnet "*" kan brukes. Paused (%1) - Satt på pause (%1) + Satt på pause (%1) Resumed (%1) - Gjenopptatte (%1) + Gjenopptatte (%1) Active (%1) @@ -2492,6 +2552,22 @@ Bruk ";" for å splitte flerfoldige oppføringer. Jokertegnet "*" kan brukes.Moving (0) Flytter (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2511,7 +2587,7 @@ Bruk ";" for å splitte flerfoldige oppføringer. Jokertegnet "*" kan brukes. Done % Done - Ferdig + Ferdig Status @@ -2648,6 +2724,14 @@ Bruk ";" for å splitte flerfoldige oppføringer. Jokertegnet "*" kan brukes.Reannounce In Reannonsering om + + Popularity + + + + Progress + + TrackerListWidget @@ -2784,7 +2868,7 @@ Bruk ";" for å splitte flerfoldige oppføringer. Jokertegnet "*" kan brukes. Paused - Pauset + Pauset Completed @@ -2850,6 +2934,10 @@ Bruk ";" for å splitte flerfoldige oppføringer. Jokertegnet "*" kan brukes.[F] Downloading metadata [F] Laster ned metadata + + Stopped + + TransferListFiltersWidget @@ -2891,17 +2979,17 @@ Bruk ";" for å splitte flerfoldige oppføringer. Jokertegnet "*" kan brukes. Resume Resume/start the torrent - Gjenoppta + Gjenoppta Force Resume Force Resume/start the torrent - Påtving gjenopptakelse + Påtving gjenopptakelse Pause Pause the torrent - Sett på pause + Sett på pause Limit share ratio... @@ -3073,6 +3161,18 @@ Bruk ";" for å splitte flerfoldige oppføringer. Jokertegnet "*" kan brukes.Comment Kommentar + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3318,6 +3418,10 @@ Bruk ";" for å splitte flerfoldige oppføringer. Jokertegnet "*" kan brukes.There aren't any search plugins installed. Ingen søkeprogramtillegg installert. + + Start a search above. + + PluginSelectDlg @@ -3380,6 +3484,10 @@ Bruk ";" for å splitte flerfoldige oppføringer. Jokertegnet "*" kan brukes.Seeders Delere + + Published On + + SearchPluginsTable @@ -3447,11 +3555,11 @@ Bruk ";" for å splitte flerfoldige oppføringer. Jokertegnet "*" kan brukes. Pause torrents - Sett torrenter på pause + Sett torrenter på pause Resume torrents - Gjenoppta torrenter + Gjenoppta torrenter Remove unused tags @@ -3469,6 +3577,14 @@ Bruk ";" for å splitte flerfoldige oppføringer. Jokertegnet "*" kan brukes.Remove torrents Fjern torrenter + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3609,6 +3725,22 @@ Bruk ";" for å splitte flerfoldige oppføringer. Jokertegnet "*" kan brukes.Download link Nedlastingslenke + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3908,7 +4040,7 @@ Bruk ";" for å splitte flerfoldige oppføringer. Jokertegnet "*" kan brukes. Add Paused: - Legg til uten å starte: + Legg til uten å starte: Please type the name of the new download rule. @@ -3968,12 +4100,16 @@ Støtter de følgende formatene: S01E01, 1x1, 2017.12.31, og 31.12.2017 (Datofor Add Tags: Legg til etiketter: + + Add Stopped: + + TrackerFiltersList Resume torrents - Gjenoppta torrenter + Gjenoppta torrenter All (%1) @@ -3985,12 +4121,20 @@ Støtter de følgende formatene: S01E01, 1x1, 2017.12.31, og 31.12.2017 (Datofor Pause torrents - Sett torrenter på pause + Sett torrenter på pause Remove torrents Fjern torrenter + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4138,4 +4282,11 @@ Støtter de følgende formatene: S01E01, 1x1, 2017.12.31, og 31.12.2017 (Datofor Velg loggnivå … + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_nl.ts b/src/webui/www/translations/webui_nl.ts index de3366d74..836249516 100644 --- a/src/webui/www/translations/webui_nl.ts +++ b/src/webui/www/translations/webui_nl.ts @@ -98,11 +98,11 @@ Resume torrents - Torrents hervatten + Torrents hervatten Pause torrents - Torrents pauzeren + Torrents pauzeren New Category @@ -120,6 +120,14 @@ Add subcategory... Subcategorie toevoegen... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Kan niet inloggen, qBittorrent is waarschijnlijk onbereikbaar. + Kan niet inloggen, qBittorrent is waarschijnlijk onbereikbaar. Invalid Username or Password. - Ongeldige gebruikersnaam of wachtwoord. + Ongeldige gebruikersnaam of wachtwoord. Username - Gebruikersnaam + Gebruikersnaam Password - Wachtwoord + Wachtwoord Login - Login + Login Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Hervatten + Hervatten Top Toolbar @@ -456,7 +468,7 @@ Resume All - Alles hervatten + Alles hervatten Statistics @@ -468,11 +480,11 @@ Pause - Pauzeren + Pauzeren Pause All - Alles pauzeren + Alles pauzeren Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Wilt u alle torrents hervatten? + Wilt u alle torrents hervatten? Would you like to pause all torrents? - Wilt u alle torrents pauzeren? + Wilt u alle torrents pauzeren? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Deze trackers automatisch toevoegen aan nieuwe downloads: + Deze trackers automatisch toevoegen aan nieuwe downloads: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Torrent pauzeren + Torrent pauzeren Remove torrent and its files @@ -1904,6 +1940,22 @@ Gebruik ';' om meerdere items te splitsen. Jokerteken '*' kan gebruikt worden.Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2268,6 +2320,14 @@ Gebruik ';' om meerdere items te splitsen. Jokerteken '*' kan gebruikt worden.Match all occurrences Overeenkomen met alle resultaten + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2398,11 +2458,11 @@ Gebruik ';' om meerdere items te splitsen. Jokerteken '*' kan gebruikt worden. Resumed (0) - Hervat (0) + Hervat (0) Paused (0) - Gepauzeerd (0) + Gepauzeerd (0) Active (0) @@ -2434,11 +2494,11 @@ Gebruik ';' om meerdere items te splitsen. Jokerteken '*' kan gebruikt worden. Paused (%1) - Gepauzeerd (%1) + Gepauzeerd (%1) Resumed (%1) - Hervat (%1) + Hervat (%1) Active (%1) @@ -2492,6 +2552,22 @@ Gebruik ';' om meerdere items te splitsen. Jokerteken '*' kan gebruikt worden.Moving (0) Verplaatsen (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2511,7 +2587,7 @@ Gebruik ';' om meerdere items te splitsen. Jokerteken '*' kan gebruikt worden. Done % Done - Klaar + Klaar Status @@ -2648,6 +2724,14 @@ Gebruik ';' om meerdere items te splitsen. Jokerteken '*' kan gebruikt worden.Reannounce In Opnieuw aankondigen over + + Popularity + + + + Progress + + TrackerListWidget @@ -2784,7 +2868,7 @@ Gebruik ';' om meerdere items te splitsen. Jokerteken '*' kan gebruikt worden. Paused - Gepauzeerd + Gepauzeerd Completed @@ -2850,6 +2934,10 @@ Gebruik ';' om meerdere items te splitsen. Jokerteken '*' kan gebruikt worden.[F] Downloading metadata [F] metadata downloaden + + Stopped + + TransferListFiltersWidget @@ -2891,17 +2979,17 @@ Gebruik ';' om meerdere items te splitsen. Jokerteken '*' kan gebruikt worden. Resume Resume/start the torrent - Hervatten + Hervatten Force Resume Force Resume/start the torrent - Geforceerd hervatten + Geforceerd hervatten Pause Pause the torrent - Pauzeren + Pauzeren Limit share ratio... @@ -3073,6 +3161,18 @@ Gebruik ';' om meerdere items te splitsen. Jokerteken '*' kan gebruikt worden.Comment Opmerking + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3318,6 +3418,10 @@ Gebruik ';' om meerdere items te splitsen. Jokerteken '*' kan gebruikt worden.There aren't any search plugins installed. Er zijn geen zoekplugins geïnstalleerd. + + Start a search above. + + PluginSelectDlg @@ -3380,6 +3484,10 @@ Gebruik ';' om meerdere items te splitsen. Jokerteken '*' kan gebruikt worden.Seeders Seeders + + Published On + + SearchPluginsTable @@ -3447,11 +3555,11 @@ Gebruik ';' om meerdere items te splitsen. Jokerteken '*' kan gebruikt worden. Pause torrents - Torrents pauzeren + Torrents pauzeren Resume torrents - Torrents hervatten + Torrents hervatten Remove unused tags @@ -3469,6 +3577,14 @@ Gebruik ';' om meerdere items te splitsen. Jokerteken '*' kan gebruikt worden.Remove torrents Torrents verwijderen + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3609,6 +3725,22 @@ Gebruik ';' om meerdere items te splitsen. Jokerteken '*' kan gebruikt worden.Download link Downloadkoppeling + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3908,7 +4040,7 @@ Gebruik ';' om meerdere items te splitsen. Jokerteken '*' kan gebruikt worden. Add Paused: - Gepauzeerd toevoegen: + Gepauzeerd toevoegen: Please type the name of the new download rule. @@ -3968,12 +4100,16 @@ Ondersteunt de formaten: S01E01, 1x1, 2017.12.31 en 31.12.2017 (datumformaten o Add Tags: Labels toevoegen: + + Add Stopped: + + TrackerFiltersList Resume torrents - Torrents hervatten + Torrents hervatten All (%1) @@ -3985,12 +4121,20 @@ Ondersteunt de formaten: S01E01, 1x1, 2017.12.31 en 31.12.2017 (datumformaten o Pause torrents - Torrents pauzeren + Torrents pauzeren Remove torrents Torrents verwijderen + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4138,4 +4282,11 @@ Ondersteunt de formaten: S01E01, 1x1, 2017.12.31 en 31.12.2017 (datumformaten o Logniveau kiezen... + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_oc.ts b/src/webui/www/translations/webui_oc.ts index 5aa970754..6e15b383e 100644 --- a/src/webui/www/translations/webui_oc.ts +++ b/src/webui/www/translations/webui_oc.ts @@ -98,11 +98,11 @@ Resume torrents - Aviar los torrents + Aviar los torrents Pause torrents - Metre en pausa los torrents + Metre en pausa los torrents New Category @@ -120,6 +120,14 @@ Add subcategory... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,19 +201,19 @@ Unable to log in, qBittorrent is probably unreachable. - Impossible de se connectr, qBittorrent es probablament inaccessible. + Impossible de se connectr, qBittorrent es probablament inaccessible. Invalid Username or Password. - Nom d'utilizaire o senhal invalid. + Nom d'utilizaire o senhal invalid. Password - Senhal + Senhal Login - Identificant + Identificant Apply @@ -395,6 +403,14 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + + + Username + + MainWindow @@ -424,7 +440,7 @@ Resume - Aviar + Aviar Top Toolbar @@ -444,7 +460,7 @@ Resume All - Aviar tot + Aviar tot Statistics @@ -456,11 +472,11 @@ Pause - Metre en pausa + Metre en pausa Pause All - Tout metre en pausa + Tout metre en pausa Add Torrent File... @@ -607,14 +623,6 @@ Remove - - Would you like to resume all torrents? - - - - Would you like to pause all torrents? - - Execution Log Jornal d'execucion @@ -627,6 +635,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -678,10 +710,6 @@ Torrent Queueing - - Automatically add these trackers to new downloads: - - Web User Interface (Remote control) @@ -1176,10 +1204,6 @@ Fastest upload - - Pause torrent - - Remove torrent and its files @@ -1824,6 +1848,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2188,6 +2228,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2318,11 +2366,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resumed (0) - Aviats (0) + Aviats (0) Paused (0) - En Pausa (0) + En Pausa (0) Active (0) @@ -2354,11 +2402,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused (%1) - En Pausa (%1) + En Pausa (%1) Resumed (%1) - Aviats (%1) + Aviats (%1) Active (%1) @@ -2412,6 +2460,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2431,7 +2495,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Done % Done - Progression + Progression Status @@ -2568,6 +2632,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2704,7 +2776,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused - En pausa + En pausa Completed @@ -2770,6 +2842,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata + + Stopped + + TransferListFiltersWidget @@ -2811,17 +2887,17 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resume Resume/start the torrent - Aviar + Aviar Force Resume Force Resume/start the torrent - Forçar la represa + Forçar la represa Pause Pause the torrent - Metre en pausa + Metre en pausa Limit share ratio... @@ -2993,6 +3069,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3238,6 +3326,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3300,6 +3392,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders Fonts completas + + Published On + + SearchPluginsTable @@ -3367,11 +3463,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Pause torrents - Metre en pausa los torrents + Metre en pausa los torrents Resume torrents - Aviar los torrents + Aviar los torrents Remove unused tags @@ -3389,6 +3485,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3529,6 +3633,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3828,7 +3948,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Add Paused: - Apondre en pausa : + Apondre en pausa : Please type the name of the new download rule. @@ -3887,12 +4007,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - Aviar los torrents + Aviar los torrents All (%1) @@ -3904,12 +4028,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - Metre en pausa los torrents + Metre en pausa los torrents Remove torrents + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4057,4 +4189,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_pl.ts b/src/webui/www/translations/webui_pl.ts index 0597d6e9e..566f63d14 100644 --- a/src/webui/www/translations/webui_pl.ts +++ b/src/webui/www/translations/webui_pl.ts @@ -98,11 +98,11 @@ Resume torrents - Wznów torrenty + Wznów torrenty Pause torrents - Wstrzymaj torrenty + Wstrzymaj torrenty New Category @@ -120,6 +120,14 @@ Add subcategory... Dodaj podkategorię... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Nie można się zalogować, qBittorrent jest prawdopodobnie nieosiągalny. + Nie można się zalogować, qBittorrent jest prawdopodobnie nieosiągalny. Invalid Username or Password. - Nieprawidłowa nazwa użytkownika lub hasło. + Nieprawidłowa nazwa użytkownika lub hasło. Username - Nazwa użytkownika + Nazwa użytkownika Password - Hasło + Hasło Login - Login + Login Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Wznów + Wznów Top Toolbar @@ -456,7 +468,7 @@ Resume All - Wznów wszystkie + Wznów wszystkie Statistics @@ -468,11 +480,11 @@ Pause - Wstrzymaj + Wstrzymaj Pause All - Wstrzymaj wszystkie + Wstrzymaj wszystkie Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Czy chcesz wznowić wszystkie torrenty? + Czy chcesz wznowić wszystkie torrenty? Would you like to pause all torrents? - Czy chcesz wstrzymać wszystkie torrenty? + Czy chcesz wstrzymać wszystkie torrenty? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Automatycznie dodaj te trackery do nowych pobierań: + Automatycznie dodaj te trackery do nowych pobierań: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Wstrzymaj torrent + Wstrzymaj torrent Remove torrent and its files @@ -1904,6 +1940,22 @@ Użyj ';' do rozdzielania wielu wpisów. Można użyć wieloznacznika '*'.Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2268,6 +2320,14 @@ Użyj ';' do rozdzielania wielu wpisów. Można użyć wieloznacznika '*'.Match all occurrences Dopasuj wszystkie wystąpienia + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2398,11 +2458,11 @@ Użyj ';' do rozdzielania wielu wpisów. Można użyć wieloznacznika '*'. Resumed (0) - Wznowione (0) + Wznowione (0) Paused (0) - Wstrzymane (0) + Wstrzymane (0) Active (0) @@ -2434,11 +2494,11 @@ Użyj ';' do rozdzielania wielu wpisów. Można użyć wieloznacznika '*'. Paused (%1) - Wstrzymane (%1) + Wstrzymane (%1) Resumed (%1) - Wznowione (%1) + Wznowione (%1) Active (%1) @@ -2492,6 +2552,22 @@ Użyj ';' do rozdzielania wielu wpisów. Można użyć wieloznacznika '*'.Moving (0) Przenoszenie (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2511,7 +2587,7 @@ Użyj ';' do rozdzielania wielu wpisów. Można użyć wieloznacznika '*'. Done % Done - Ukończono + Ukończono Status @@ -2648,6 +2724,14 @@ Użyj ';' do rozdzielania wielu wpisów. Można użyć wieloznacznika '*'.Reannounce In Rozgłoszenie za + + Popularity + + + + Progress + + TrackerListWidget @@ -2784,7 +2868,7 @@ Użyj ';' do rozdzielania wielu wpisów. Można użyć wieloznacznika '*'. Paused - Wstrzymano + Wstrzymano Completed @@ -2850,6 +2934,10 @@ Użyj ';' do rozdzielania wielu wpisów. Można użyć wieloznacznika '*'.[F] Downloading metadata [W] Pobieranie metadanych + + Stopped + + TransferListFiltersWidget @@ -2891,17 +2979,17 @@ Użyj ';' do rozdzielania wielu wpisów. Można użyć wieloznacznika '*'. Resume Resume/start the torrent - Wznów + Wznów Force Resume Force Resume/start the torrent - Wymuś wznowienie + Wymuś wznowienie Pause Pause the torrent - Wstrzymaj + Wstrzymaj Limit share ratio... @@ -3073,6 +3161,18 @@ Użyj ';' do rozdzielania wielu wpisów. Można użyć wieloznacznika '*'.Comment Komentarz + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3318,6 +3418,10 @@ Użyj ';' do rozdzielania wielu wpisów. Można użyć wieloznacznika '*'.There aren't any search plugins installed. Nie ma zainstalowanych żadnych wtyczek wyszukiwania. + + Start a search above. + + PluginSelectDlg @@ -3380,6 +3484,10 @@ Użyj ';' do rozdzielania wielu wpisów. Można użyć wieloznacznika '*'.Seeders Seedujący + + Published On + + SearchPluginsTable @@ -3447,11 +3555,11 @@ Użyj ';' do rozdzielania wielu wpisów. Można użyć wieloznacznika '*'. Pause torrents - Wstrzymaj torrenty + Wstrzymaj torrenty Resume torrents - Wznów torrenty + Wznów torrenty Remove unused tags @@ -3469,6 +3577,14 @@ Użyj ';' do rozdzielania wielu wpisów. Można użyć wieloznacznika '*'.Remove torrents Usuń torrenty + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3609,6 +3725,22 @@ Użyj ';' do rozdzielania wielu wpisów. Można użyć wieloznacznika '*'.Download link Odnośnik pobierania + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3908,7 +4040,7 @@ Użyj ';' do rozdzielania wielu wpisów. Można użyć wieloznacznika '*'. Add Paused: - Dodaj wstrzymane: + Dodaj wstrzymane: Please type the name of the new download rule. @@ -3968,12 +4100,16 @@ Obsługuje formaty: S01E01, 1x1, 2017.12.31 oraz 31.12.2017 (Formaty daty równi Add Tags: Dodaj znaczniki: + + Add Stopped: + + TrackerFiltersList Resume torrents - Wznów torrenty + Wznów torrenty All (%1) @@ -3985,12 +4121,20 @@ Obsługuje formaty: S01E01, 1x1, 2017.12.31 oraz 31.12.2017 (Formaty daty równi Pause torrents - Wstrzymaj torrenty + Wstrzymaj torrenty Remove torrents Usuń torrenty + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4138,4 +4282,11 @@ Obsługuje formaty: S01E01, 1x1, 2017.12.31 oraz 31.12.2017 (Formaty daty równi Wybierz poziom dziennika... + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_pt_BR.ts b/src/webui/www/translations/webui_pt_BR.ts index 8f887ed3c..e82397b3c 100644 --- a/src/webui/www/translations/webui_pt_BR.ts +++ b/src/webui/www/translations/webui_pt_BR.ts @@ -98,11 +98,11 @@ Resume torrents - Retomar torrents + Retomar torrents Pause torrents - Pausar torrents + Pausar torrents New Category @@ -120,6 +120,14 @@ Add subcategory... Adicionar sub-categoria... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Incapaz de fazer login; o qBittorrent provavelmente é inalcançável. + Incapaz de fazer login; o qBittorrent provavelmente é inalcançável. Invalid Username or Password. - Nome de usuário ou senha inválidos. + Nome de usuário ou senha inválidos. Username - Nome de usuário + Nome de usuário Password - Senha + Senha Login - Login + Login Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Retomar + Retomar Top Toolbar @@ -456,7 +468,7 @@ Resume All - Retomar Todos + Retomar Todos Statistics @@ -468,11 +480,11 @@ Pause - Pausar + Pausar Pause All - Pausar Todos + Pausar Todos Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Você gostaria de retomar todos os torrents? + Você gostaria de retomar todos os torrents? Would you like to pause all torrents? - Você gostaria de pausar todos os torrents? + Você gostaria de pausar todos os torrents? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Automaticamente adicionar estes trackers aos novos downloads: + Automaticamente adicionar estes trackers aos novos downloads: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Pausar torrent + Pausar torrent Remove torrent and its files @@ -1904,6 +1940,22 @@ Use ';' pra dividir múltiplas entradas. Pode usar o wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2268,6 +2320,14 @@ Use ';' pra dividir múltiplas entradas. Pode usar o wildcard '*'. Match all occurrences Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2398,11 +2458,11 @@ Use ';' pra dividir múltiplas entradas. Pode usar o wildcard '*'. Resumed (0) - Retomado (0) + Retomado (0) Paused (0) - Pausado (0) + Pausado (0) Active (0) @@ -2434,11 +2494,11 @@ Use ';' pra dividir múltiplas entradas. Pode usar o wildcard '*'. Paused (%1) - Pausado (%1) + Pausado (%1) Resumed (%1) - Retomado (%1) + Retomado (%1) Active (%1) @@ -2492,6 +2552,22 @@ Use ';' pra dividir múltiplas entradas. Pode usar o wildcard '*'. Moving (0) Movendo (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2511,7 +2587,7 @@ Use ';' pra dividir múltiplas entradas. Pode usar o wildcard '*'. Done % Done - Concluido + Concluido Status @@ -2648,6 +2724,14 @@ Use ';' pra dividir múltiplas entradas. Pode usar o wildcard '*'. Reannounce In Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2784,7 +2868,7 @@ Use ';' pra dividir múltiplas entradas. Pode usar o wildcard '*'. Paused - Pausado + Pausado Completed @@ -2850,6 +2934,10 @@ Use ';' pra dividir múltiplas entradas. Pode usar o wildcard '*'. [F] Downloading metadata [F] Baixando metadados + + Stopped + + TransferListFiltersWidget @@ -2891,17 +2979,17 @@ Use ';' pra dividir múltiplas entradas. Pode usar o wildcard '*'. Resume Resume/start the torrent - Retomar + Retomar Force Resume Force Resume/start the torrent - Forçar Retomada + Forçar Retomada Pause Pause the torrent - Pausar + Pausar Limit share ratio... @@ -3073,6 +3161,18 @@ Use ';' pra dividir múltiplas entradas. Pode usar o wildcard '*'. Comment Comentário + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3318,6 +3418,10 @@ Use ';' pra dividir múltiplas entradas. Pode usar o wildcard '*'. There aren't any search plugins installed. Não há nenhum plugin de busca instalado. + + Start a search above. + + PluginSelectDlg @@ -3380,6 +3484,10 @@ Use ';' pra dividir múltiplas entradas. Pode usar o wildcard '*'. Seeders Seeders + + Published On + + SearchPluginsTable @@ -3447,11 +3555,11 @@ Use ';' pra dividir múltiplas entradas. Pode usar o wildcard '*'. Pause torrents - Pausar torrents + Pausar torrents Resume torrents - Retomar torrents + Retomar torrents Remove unused tags @@ -3469,6 +3577,14 @@ Use ';' pra dividir múltiplas entradas. Pode usar o wildcard '*'. Remove torrents Remover torrents + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3609,6 +3725,22 @@ Use ';' pra dividir múltiplas entradas. Pode usar o wildcard '*'. Download link Link do download + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3908,7 +4040,7 @@ Use ';' pra dividir múltiplas entradas. Pode usar o wildcard '*'. Add Paused: - Adicionar pausado: + Adicionar pausado: Please type the name of the new download rule. @@ -3968,12 +4100,16 @@ Suporta os formatos: S01E01, 1x1, 2017.12.31 e 31.12.2017 (Os formatos de data t Add Tags: Adicionar tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - Retomar torrents + Retomar torrents All (%1) @@ -3985,12 +4121,20 @@ Suporta os formatos: S01E01, 1x1, 2017.12.31 e 31.12.2017 (Os formatos de data t Pause torrents - Pausar torrents + Pausar torrents Remove torrents Remover torrents + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4138,4 +4282,11 @@ Suporta os formatos: S01E01, 1x1, 2017.12.31 e 31.12.2017 (Os formatos de data t Escolha um nível de registro... + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_pt_PT.ts b/src/webui/www/translations/webui_pt_PT.ts index 452ca5cf9..b3a39c95b 100644 --- a/src/webui/www/translations/webui_pt_PT.ts +++ b/src/webui/www/translations/webui_pt_PT.ts @@ -98,11 +98,11 @@ Resume torrents - Retomar torrents + Retomar torrents Pause torrents - Parar torrents + Parar torrents New Category @@ -120,6 +120,14 @@ Add subcategory... Adicionar sub-categoria... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Não foi possível iniciar sessão, o qBittorrent está provavelmente inacessível. + Não foi possível iniciar sessão, o qBittorrent está provavelmente inacessível. Invalid Username or Password. - Palavra-passe ou nome de utilizador inválido. + Palavra-passe ou nome de utilizador inválido. Username - Nome de utilizador + Nome de utilizador Password - Palavra-passe + Palavra-passe Login - Iniciar sessão + Iniciar sessão Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Retomar + Retomar Top Toolbar @@ -456,7 +468,7 @@ Resume All - Retomar tudo + Retomar tudo Statistics @@ -468,11 +480,11 @@ Pause - Pausar + Pausar Pause All - Pausar tudo + Pausar tudo Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Gostaria de retomar todos os torrents? + Gostaria de retomar todos os torrents? Would you like to pause all torrents? - Gostaria de pausar todos os torrents? + Gostaria de pausar todos os torrents? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Adicionar automaticamente estes trackers às novas transferências: + Adicionar automaticamente estes trackers às novas transferências: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Pausar torrent + Pausar torrent Remove torrent and its files @@ -1856,6 +1892,22 @@ Utilize ';' para dividir várias entradas. Pode usar o asterisco '*'.Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2220,6 +2272,14 @@ Utilize ';' para dividir várias entradas. Pode usar o asterisco '*'.Match all occurrences Corresponder todas as ocorrências + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2350,11 +2410,11 @@ Utilize ';' para dividir várias entradas. Pode usar o asterisco '*'. Resumed (0) - Retomado (0) + Retomado (0) Paused (0) - Em pausa (0) + Em pausa (0) Active (0) @@ -2386,11 +2446,11 @@ Utilize ';' para dividir várias entradas. Pode usar o asterisco '*'. Paused (%1) - Em pausa (%1) + Em pausa (%1) Resumed (%1) - Retomados (%1) + Retomados (%1) Active (%1) @@ -2444,6 +2504,22 @@ Utilize ';' para dividir várias entradas. Pode usar o asterisco '*'.Moving (0) A mover (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2463,7 +2539,7 @@ Utilize ';' para dividir várias entradas. Pode usar o asterisco '*'. Done % Done - Concluído + Concluído Status @@ -2600,6 +2676,14 @@ Utilize ';' para dividir várias entradas. Pode usar o asterisco '*'.Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2736,7 +2820,7 @@ Utilize ';' para dividir várias entradas. Pode usar o asterisco '*'. Paused - Em pausa + Em pausa Completed @@ -2802,6 +2886,10 @@ Utilize ';' para dividir várias entradas. Pode usar o asterisco '*'.[F] Downloading metadata [F] A transferir os metadados + + Stopped + + TransferListFiltersWidget @@ -2843,17 +2931,17 @@ Utilize ';' para dividir várias entradas. Pode usar o asterisco '*'. Resume Resume/start the torrent - Retomar + Retomar Force Resume Force Resume/start the torrent - Forçar continuação + Forçar continuação Pause Pause the torrent - Pausar + Pausar Limit share ratio... @@ -3025,6 +3113,18 @@ Utilize ';' para dividir várias entradas. Pode usar o asterisco '*'.Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3270,6 +3370,10 @@ Utilize ';' para dividir várias entradas. Pode usar o asterisco '*'.There aren't any search plugins installed. Não existe nenhum plugin de busca instalado. + + Start a search above. + + PluginSelectDlg @@ -3332,6 +3436,10 @@ Utilize ';' para dividir várias entradas. Pode usar o asterisco '*'.Seeders Semeadores + + Published On + + SearchPluginsTable @@ -3399,11 +3507,11 @@ Utilize ';' para dividir várias entradas. Pode usar o asterisco '*'. Pause torrents - Pausar torrents + Pausar torrents Resume torrents - Retomar torrents + Retomar torrents Remove unused tags @@ -3421,6 +3529,14 @@ Utilize ';' para dividir várias entradas. Pode usar o asterisco '*'.Remove torrents Remover torrents + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3561,6 +3677,22 @@ Utilize ';' para dividir várias entradas. Pode usar o asterisco '*'.Download link Link para download + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3860,7 +3992,7 @@ Utilize ';' para dividir várias entradas. Pode usar o asterisco '*'. Add Paused: - Adicionar em pausa: + Adicionar em pausa: Please type the name of the new download rule. @@ -3920,12 +4052,16 @@ Suporta os formatos: S01E01, 1x1, 2017.12.31 e 31.12.2017 (Suporte também para Add Tags: Adicionar etiquetas: + + Add Stopped: + + TrackerFiltersList Resume torrents - Retomar torrents + Retomar torrents All (%1) @@ -3937,12 +4073,20 @@ Suporta os formatos: S01E01, 1x1, 2017.12.31 e 31.12.2017 (Suporte também para Pause torrents - Parar torrents + Parar torrents Remove torrents Remover torrents + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4090,4 +4234,11 @@ Suporta os formatos: S01E01, 1x1, 2017.12.31 e 31.12.2017 (Suporte também para Escolha um nível de registo... + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_ro.ts b/src/webui/www/translations/webui_ro.ts index 6c2d4440c..f7b435caf 100644 --- a/src/webui/www/translations/webui_ro.ts +++ b/src/webui/www/translations/webui_ro.ts @@ -98,11 +98,11 @@ Resume torrents - Reia torentele + Reia torentele Pause torrents - Întrerupe torentele + Întrerupe torentele New Category @@ -120,6 +120,14 @@ Add subcategory... Adăugare subcategorie... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Nu se poate autentifica, probabil qBittorrent nu poate fi contactat. + Nu se poate autentifica, probabil qBittorrent nu poate fi contactat. Invalid Username or Password. - Numele de utilizator sau parola nu sunt valide. + Numele de utilizator sau parola nu sunt valide. Username - Nume de utilizator + Nume de utilizator Password - Parolă + Parolă Login - Autentifică + Autentifică Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Reia + Reia Top Toolbar @@ -456,7 +468,7 @@ Resume All - Reia toate + Reia toate Statistics @@ -468,11 +480,11 @@ Pause - Întrerupe + Întrerupe Pause All - Întrerupe toate + Întrerupe toate Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Doriți să reluați toate torentele? + Doriți să reluați toate torentele? Would you like to pause all torrents? - Doriți să întrerupeți toate torentele? + Doriți să întrerupeți toate torentele? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Adaugă automat aceste urmăritoare la noile descărcări: + Adaugă automat aceste urmăritoare la noile descărcări: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Întrerupe torentul + Întrerupe torentul Remove torrent and its files @@ -1852,6 +1888,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2216,6 +2268,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2346,11 +2406,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resumed (0) - Reluate (0) + Reluate (0) Paused (0) - Suspendate (0) + Suspendate (0) Active (0) @@ -2382,11 +2442,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused (%1) - Suspendate (%1) + Suspendate (%1) Resumed (%1) - Reluate (%1) + Reluate (%1) Active (%1) @@ -2440,6 +2500,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) Se mută (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2459,7 +2535,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Done % Done - Gata + Gata Status @@ -2596,6 +2672,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2732,7 +2816,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused - Întrerupt + Întrerupt Completed @@ -2798,6 +2882,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata [F] Se descarcă metadate + + Stopped + + TransferListFiltersWidget @@ -2839,17 +2927,17 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resume Resume/start the torrent - Reia + Reia Force Resume Force Resume/start the torrent - Forțează reluarea + Forțează reluarea Pause Pause the torrent - Întrerupe + Întrerupe Limit share ratio... @@ -3021,6 +3109,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3266,6 +3366,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. Nu sunt instalate extensii de căutare. + + Start a search above. + + PluginSelectDlg @@ -3328,6 +3432,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders Surse + + Published On + + SearchPluginsTable @@ -3395,11 +3503,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Pause torrents - Întrerupe torente + Întrerupe torente Resume torrents - Reia torentele + Reia torentele Remove unused tags @@ -3417,6 +3525,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents Elimină torente + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3557,6 +3673,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link Legătură pentru descărcare + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3856,7 +3988,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Add Paused: - Adaugă suspendate: + Adaugă suspendate: Please type the name of the new download rule. @@ -3916,12 +4048,16 @@ Recunoaște formatele: S01E01, 1x1, 2017.12.31 si 31.12.2017 (Formatele pentru d Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - Reia torrentele + Reia torrentele All (%1) @@ -3933,12 +4069,20 @@ Recunoaște formatele: S01E01, 1x1, 2017.12.31 si 31.12.2017 (Formatele pentru d Pause torrents - Întrerupe torente + Întrerupe torente Remove torrents Elimină torente + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4086,4 +4230,11 @@ Recunoaște formatele: S01E01, 1x1, 2017.12.31 si 31.12.2017 (Formatele pentru d + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_ru.ts b/src/webui/www/translations/webui_ru.ts index 334d02cdc..ab0c65dfc 100644 --- a/src/webui/www/translations/webui_ru.ts +++ b/src/webui/www/translations/webui_ru.ts @@ -98,11 +98,11 @@ Resume torrents - Возобновить торренты + Возобновить торренты Pause torrents - Остановить торренты + Остановить торренты New Category @@ -120,6 +120,14 @@ Add subcategory... Добавить подкатегорию… + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Не удалось войти, возможно, qBittorrent недоступен. + Не удалось войти, возможно, qBittorrent недоступен. Invalid Username or Password. - Неверное имя пользователя или пароль. + Неверное имя пользователя или пароль. Username - Имя пользователя + Имя пользователя Password - Пароль + Пароль Login - Войти + Войти Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Возобновить + Возобновить Top Toolbar @@ -456,7 +468,7 @@ Resume All - Возобновить все + Возобновить все Statistics @@ -468,11 +480,11 @@ Pause - Остановить + Остановить Pause All - Остановить все + Остановить все Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Хотите возобновить все торренты? + Хотите возобновить все торренты? Would you like to pause all torrents? - Хотите приостановить все торренты? + Хотите приостановить все торренты? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Автоматически добавлять эти трекеры к новым загрузкам: + Автоматически добавлять эти трекеры к новым загрузкам: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Остановить торрент + Остановить торрент Remove torrent and its files @@ -1904,6 +1940,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2268,6 +2320,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences Сопоставлять все вхождения + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2398,11 +2458,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resumed (0) - Возобновлены (0) + Возобновлены (0) Paused (0) - Остановлены (0) + Остановлены (0) Active (0) @@ -2434,11 +2494,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused (%1) - Остановлены (%1) + Остановлены (%1) Resumed (%1) - Возобновлены (%1) + Возобновлены (%1) Active (%1) @@ -2492,6 +2552,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) Перемещаются (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2511,7 +2587,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Done % Done - Прогресс + Прогресс Status @@ -2648,6 +2724,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In Следующий анонс + + Popularity + + + + Progress + + TrackerListWidget @@ -2784,7 +2868,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused - Остановлен + Остановлен Completed @@ -2850,6 +2934,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata [П] Закачка метаданных + + Stopped + + TransferListFiltersWidget @@ -2891,17 +2979,17 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resume Resume/start the torrent - Возобновить + Возобновить Force Resume Force Resume/start the torrent - Возобновить принудительно + Возобновить принудительно Pause Pause the torrent - Остановить + Остановить Limit share ratio... @@ -3073,6 +3161,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment Комментарий + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3318,6 +3418,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. Отсутствуют установленные поисковые плагины. + + Start a search above. + + PluginSelectDlg @@ -3380,6 +3484,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders Сиды + + Published On + + SearchPluginsTable @@ -3447,11 +3555,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Pause torrents - Остановить торренты + Остановить торренты Resume torrents - Возобновить торренты + Возобновить торренты Remove unused tags @@ -3469,6 +3577,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents Удалить торренты + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3609,6 +3725,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link Ссылку загрузки + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3908,7 +4040,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Add Paused: - Добавить остановленным: + Добавить остановленным: Please type the name of the new download rule. @@ -3968,12 +4100,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: Добавить метки: + + Add Stopped: + + TrackerFiltersList Resume torrents - Возобновить торренты + Возобновить торренты All (%1) @@ -3985,12 +4121,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - Остановить + Остановить Remove torrents Удалить торренты + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4138,4 +4282,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Выберите уровень журнала… + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_sk.ts b/src/webui/www/translations/webui_sk.ts index 1fdca3c97..bd102223c 100644 --- a/src/webui/www/translations/webui_sk.ts +++ b/src/webui/www/translations/webui_sk.ts @@ -98,11 +98,11 @@ Resume torrents - Obnoviť torrenty + Obnoviť torrenty Pause torrents - Pozastaviť torrenty + Pozastaviť torrenty New Category @@ -120,6 +120,14 @@ Add subcategory... Pridať podkategóriu... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Nepodarilo sa prihlásiť, qBittorrent je pravdepodobne nedosiahnuteľný. + Nepodarilo sa prihlásiť, qBittorrent je pravdepodobne nedosiahnuteľný. Invalid Username or Password. - Nesprávne užívateľské meno alebo heslo. + Nesprávne užívateľské meno alebo heslo. Username - Meno používateľa + Meno používateľa Password - Heslo + Heslo Login - Prihlasovacie meno + Prihlasovacie meno Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Pokračovať + Pokračovať Top Toolbar @@ -456,7 +468,7 @@ Resume All - Pokračovať všetky + Pokračovať všetky Statistics @@ -468,11 +480,11 @@ Pause - Pozastaviť + Pozastaviť Pause All - Pozastaviť všetky + Pozastaviť všetky Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Chcete obnoviť všetky torrenty? + Chcete obnoviť všetky torrenty? Would you like to pause all torrents? - Chcete pozastaviť všetky torrenty? + Chcete pozastaviť všetky torrenty? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Automaticky pridať tieto trackery k novým sťahovaniam: + Automaticky pridať tieto trackery k novým sťahovaniam: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Pozastaviť torrent + Pozastaviť torrent Remove torrent and its files @@ -1904,6 +1940,22 @@ Použite ';' pre oddelenie viacerých položiek. Môžete použiť masku '*'.Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2268,6 +2320,14 @@ Použite ';' pre oddelenie viacerých položiek. Môžete použiť masku '*'.Match all occurrences Všetky výskyty + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2398,11 +2458,11 @@ Použite ';' pre oddelenie viacerých položiek. Môžete použiť masku '*'. Resumed (0) - Obnovené (0) + Obnovené (0) Paused (0) - Pozastavené (0) + Pozastavené (0) Active (0) @@ -2434,11 +2494,11 @@ Použite ';' pre oddelenie viacerých položiek. Môžete použiť masku '*'. Paused (%1) - Pozastavené (%1) + Pozastavené (%1) Resumed (%1) - Obnovené (%1) + Obnovené (%1) Active (%1) @@ -2492,6 +2552,22 @@ Použite ';' pre oddelenie viacerých položiek. Môžete použiť masku '*'.Moving (0) Presúvané (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2511,7 +2587,7 @@ Použite ';' pre oddelenie viacerých položiek. Môžete použiť masku '*'. Done % Done - Hotovo + Hotovo Status @@ -2648,6 +2724,14 @@ Použite ';' pre oddelenie viacerých položiek. Môžete použiť masku '*'.Reannounce In Znova ohlásiť o: + + Popularity + + + + Progress + + TrackerListWidget @@ -2784,7 +2868,7 @@ Použite ';' pre oddelenie viacerých položiek. Môžete použiť masku '*'. Paused - Pozastavené + Pozastavené Completed @@ -2850,6 +2934,10 @@ Použite ';' pre oddelenie viacerých položiek. Môžete použiť masku '*'.[F] Downloading metadata [F] Sťahovanie metadát + + Stopped + + TransferListFiltersWidget @@ -2891,17 +2979,17 @@ Použite ';' pre oddelenie viacerých položiek. Môžete použiť masku '*'. Resume Resume/start the torrent - Pokračovať + Pokračovať Force Resume Force Resume/start the torrent - Vynútiť pokračovanie + Vynútiť pokračovanie Pause Pause the torrent - Pozastaviť + Pozastaviť Limit share ratio... @@ -3073,6 +3161,18 @@ Použite ';' pre oddelenie viacerých položiek. Môžete použiť masku '*'.Comment Komentár: + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3319,6 +3419,10 @@ Kliknite na tlačidlo "Vyhľadať pluginy..." vpravo dole v okne, aby ste nejak There aren't any search plugins installed. Nie sú nainštalované žiadne pluginy. + + Start a search above. + + PluginSelectDlg @@ -3381,6 +3485,10 @@ Kliknite na tlačidlo "Vyhľadať pluginy..." vpravo dole v okne, aby ste nejak Seeders Seederi + + Published On + + SearchPluginsTable @@ -3448,11 +3556,11 @@ Kliknite na tlačidlo "Vyhľadať pluginy..." vpravo dole v okne, aby ste nejak Pause torrents - Pozastaviť torrenty + Pozastaviť torrenty Resume torrents - Obnoviť torrenty + Obnoviť torrenty Remove unused tags @@ -3470,6 +3578,14 @@ Kliknite na tlačidlo "Vyhľadať pluginy..." vpravo dole v okne, aby ste nejak Remove torrents Odstrániť torrenty + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3610,6 +3726,22 @@ Kliknite na tlačidlo "Vyhľadať pluginy..." vpravo dole v okne, aby ste nejak Download link Download link + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3909,7 +4041,7 @@ Kliknite na tlačidlo "Vyhľadať pluginy..." vpravo dole v okne, aby ste nejak Add Paused: - Pridať pozastavený: + Pridať pozastavený: Please type the name of the new download rule. @@ -3969,12 +4101,16 @@ Podporuje formáty: S01E01, 1x1, 2017.12.31 a 31.12.2017 (podporuje aj formáty Add Tags: Pridať značky: + + Add Stopped: + + TrackerFiltersList Resume torrents - Obnov torrenty + Obnov torrenty All (%1) @@ -3986,12 +4122,20 @@ Podporuje formáty: S01E01, 1x1, 2017.12.31 a 31.12.2017 (podporuje aj formáty Pause torrents - Pozastaviť torrenty + Pozastaviť torrenty Remove torrents Odstrániť torrenty + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4139,4 +4283,11 @@ Podporuje formáty: S01E01, 1x1, 2017.12.31 a 31.12.2017 (podporuje aj formáty Vyberte úrovne logu... + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_sl.ts b/src/webui/www/translations/webui_sl.ts index 4f374ce78..a5ae348ce 100644 --- a/src/webui/www/translations/webui_sl.ts +++ b/src/webui/www/translations/webui_sl.ts @@ -98,11 +98,11 @@ Resume torrents - Nadaljuj torrente + Nadaljuj torrente Pause torrents - Ustavi torrente + Ustavi torrente New Category @@ -120,6 +120,14 @@ Add subcategory... Dodaj podkategorijo... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Prijava ni mogoča, qBittorrent je verjetno nedosegljiv. + Prijava ni mogoča, qBittorrent je verjetno nedosegljiv. Invalid Username or Password. - Neveljavno uporabniško ime ali geslo. + Neveljavno uporabniško ime ali geslo. Username - Uporabniško ime + Uporabniško ime Password - Geslo + Geslo Login - Prijava + Prijava Apply @@ -403,6 +411,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -432,7 +444,7 @@ Resume - Nadaljuj + Nadaljuj Top Toolbar @@ -452,7 +464,7 @@ Resume All - Nadaljuj vse + Nadaljuj vse Statistics @@ -464,11 +476,11 @@ Pause - Premor + Premor Pause All - Premor vseh + Premor vseh Add Torrent File... @@ -617,11 +629,11 @@ Would you like to resume all torrents? - Ali ste prepričani, da želite nadaljevati vse torrente? + Ali ste prepričani, da želite nadaljevati vse torrente? Would you like to pause all torrents? - Ali ste prepričani, da želite začasno ustaviti vse torrente? + Ali ste prepričani, da želite začasno ustaviti vse torrente? Execution Log @@ -635,6 +647,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -688,7 +724,7 @@ Automatically add these trackers to new downloads: - Samodejno dodaj te sledilnike novim prenosom: + Samodejno dodaj te sledilnike novim prenosom: Web User Interface (Remote control) @@ -1198,7 +1234,7 @@ Pause torrent - Začasno ustavi torrent + Začasno ustavi torrent Remove torrent and its files @@ -1848,6 +1884,22 @@ Uporabi ';' da razčleniš vnose. Lahko uporbiš nadomestni znak '*'.Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2212,6 +2264,14 @@ Uporabi ';' da razčleniš vnose. Lahko uporbiš nadomestni znak '*'.Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2342,11 +2402,11 @@ Uporabi ';' da razčleniš vnose. Lahko uporbiš nadomestni znak '*'. Resumed (0) - Se nadaljuje (0) + Se nadaljuje (0) Paused (0) - V premoru (0) + V premoru (0) Active (0) @@ -2378,11 +2438,11 @@ Uporabi ';' da razčleniš vnose. Lahko uporbiš nadomestni znak '*'. Paused (%1) - V premoru (%1) + V premoru (%1) Resumed (%1) - Se nadaljuje (%1) + Se nadaljuje (%1) Active (%1) @@ -2436,6 +2496,22 @@ Uporabi ';' da razčleniš vnose. Lahko uporbiš nadomestni znak '*'.Moving (0) Premikanje (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2455,7 +2531,7 @@ Uporabi ';' da razčleniš vnose. Lahko uporbiš nadomestni znak '*'. Done % Done - Končano + Končano Status @@ -2592,6 +2668,14 @@ Uporabi ';' da razčleniš vnose. Lahko uporbiš nadomestni znak '*'.Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2728,7 +2812,7 @@ Uporabi ';' da razčleniš vnose. Lahko uporbiš nadomestni znak '*'. Paused - V premoru + V premoru Completed @@ -2794,6 +2878,10 @@ Uporabi ';' da razčleniš vnose. Lahko uporbiš nadomestni znak '*'.[F] Downloading metadata + + Stopped + + TransferListFiltersWidget @@ -2835,17 +2923,17 @@ Uporabi ';' da razčleniš vnose. Lahko uporbiš nadomestni znak '*'. Resume Resume/start the torrent - Nadaljuj + Nadaljuj Force Resume Force Resume/start the torrent - Prisili nadaljevanje + Prisili nadaljevanje Pause Pause the torrent - Premor + Premor Limit share ratio... @@ -3017,6 +3105,18 @@ Uporabi ';' da razčleniš vnose. Lahko uporbiš nadomestni znak '*'.Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3262,6 +3362,10 @@ Uporabi ';' da razčleniš vnose. Lahko uporbiš nadomestni znak '*'.There aren't any search plugins installed. Ni nameščenih vtičnikov za iskanje. + + Start a search above. + + PluginSelectDlg @@ -3324,6 +3428,10 @@ Uporabi ';' da razčleniš vnose. Lahko uporbiš nadomestni znak '*'.Seeders Sejalci + + Published On + + SearchPluginsTable @@ -3391,11 +3499,11 @@ Uporabi ';' da razčleniš vnose. Lahko uporbiš nadomestni znak '*'. Pause torrents - Ustavi torrente + Ustavi torrente Resume torrents - Nadaljuj torrente + Nadaljuj torrente Remove unused tags @@ -3413,6 +3521,14 @@ Uporabi ';' da razčleniš vnose. Lahko uporbiš nadomestni znak '*'.Remove torrents Odstrani torrente + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3553,6 +3669,22 @@ Uporabi ';' da razčleniš vnose. Lahko uporbiš nadomestni znak '*'.Download link Povezava za prejem + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3852,7 +3984,7 @@ Uporabi ';' da razčleniš vnose. Lahko uporbiš nadomestni znak '*'. Add Paused: - Dodaj torrente v premoru: + Dodaj torrente v premoru: Please type the name of the new download rule. @@ -3913,12 +4045,16 @@ Podprti formati: S01E01, 1x1, 2017.12.31 and 31.12.2017 Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - Nadaljuj torrente + Nadaljuj torrente All (%1) @@ -3930,12 +4066,20 @@ Podprti formati: S01E01, 1x1, 2017.12.31 and 31.12.2017 Pause torrents - Premor torrentov + Premor torrentov Remove torrents Odstrani torrente + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4083,4 +4227,11 @@ Podprti formati: S01E01, 1x1, 2017.12.31 and 31.12.2017 Izberi raven dnevnika: + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_sr.ts b/src/webui/www/translations/webui_sr.ts index 41ed91196..4f462ac3f 100644 --- a/src/webui/www/translations/webui_sr.ts +++ b/src/webui/www/translations/webui_sr.ts @@ -98,11 +98,11 @@ Resume torrents - Пусти торенте + Пусти торенте Pause torrents - Паузирај торенте + Паузирај торенте New Category @@ -120,6 +120,14 @@ Add subcategory... Додај поткатегорију... + + Start torrents + + + + Stop torrents + + HttpServer @@ -189,23 +197,23 @@ Unable to log in, qBittorrent is probably unreachable. - Није могуће улоговати се, qBittorrent је вероватно недоступан. + Није могуће улоговати се, qBittorrent је вероватно недоступан. Invalid Username or Password. - Неважеће корисничко име или шифра. + Неважеће корисничко име или шифра. Username - Корисничко име + Корисничко име Password - Шифра + Шифра Login - Логовање + Логовање Apply @@ -399,6 +407,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -428,7 +440,7 @@ Resume - Настави + Настави Top Toolbar @@ -448,7 +460,7 @@ Resume All - Настави Све + Настави Све Statistics @@ -460,11 +472,11 @@ Pause - Пауза + Пауза Pause All - Паузирај све + Паузирај све Add Torrent File... @@ -613,11 +625,11 @@ Would you like to resume all torrents? - Желите ли да наставите све торенте? + Желите ли да наставите све торенте? Would you like to pause all torrents? - Желите ли да паузирате све торенте? + Желите ли да паузирате све торенте? Execution Log @@ -631,6 +643,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -684,7 +720,7 @@ Automatically add these trackers to new downloads: - Аутоматски додај ове трекере новим преузимањима + Аутоматски додај ове трекере новим преузимањима Web User Interface (Remote control) @@ -1198,7 +1234,7 @@ Pause torrent - Паузирај торент + Паузирај торент Remove torrent and its files @@ -1844,6 +1880,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2208,6 +2260,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2338,11 +2398,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resumed (0) - Настављено (0) + Настављено (0) Paused (0) - Паузирано (0) + Паузирано (0) Active (0) @@ -2374,11 +2434,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused (%1) - Паузирано (%1) + Паузирано (%1) Resumed (%1) - Настављено (%1) + Настављено (%1) Active (%1) @@ -2432,6 +2492,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) Премештање (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2451,7 +2527,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Done % Done - Урађено + Урађено Status @@ -2588,6 +2664,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2724,7 +2808,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused - Паузиран + Паузиран Completed @@ -2790,6 +2874,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata [F] Преузимање метаподатака + + Stopped + + TransferListFiltersWidget @@ -2831,17 +2919,12 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resume Resume/start the torrent - Настави - - - Force Resume - Force Resume/start the torrent - + Настави Pause Pause the torrent - Пауза + Пауза Limit share ratio... @@ -3013,6 +3096,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3258,6 +3353,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3320,6 +3419,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders Донори + + Published On + + SearchPluginsTable @@ -3387,11 +3490,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Pause torrents - Паузирај торенте + Паузирај торенте Resume torrents - Настави торенте + Настави торенте Remove unused tags @@ -3409,6 +3512,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents Уклони торенте + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3549,6 +3660,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link Веза за преузимање + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3848,7 +3975,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Add Paused: - Додај паузирано: + Додај паузирано: Please type the name of the new download rule. @@ -3908,12 +4035,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - Пусти торенте + Пусти торенте All (%1) @@ -3925,12 +4056,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - Паузирај торенте + Паузирај торенте Remove torrents Уклони торенте + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4078,4 +4217,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_sv.ts b/src/webui/www/translations/webui_sv.ts index 017ecf248..b1c228eaa 100644 --- a/src/webui/www/translations/webui_sv.ts +++ b/src/webui/www/translations/webui_sv.ts @@ -98,11 +98,11 @@ Resume torrents - Återuppta torrenter + Återuppta torrenter Pause torrents - Pausa torrenter + Pausa torrenter New Category @@ -120,6 +120,14 @@ Add subcategory... Lägg till underkategori... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Det gick inte att logga in. qBittorrent är troligtvis inte nåbart. + Det gick inte att logga in. qBittorrent är troligtvis inte nåbart. Invalid Username or Password. - Felaktigt användarnamn eller lösenord. + Felaktigt användarnamn eller lösenord. Username - Användarnamn + Användarnamn Password - Lösenord + Lösenord Login - Inloggning + Inloggning Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Återuppta + Återuppta Top Toolbar @@ -456,7 +468,7 @@ Resume All - Återuppta alla + Återuppta alla Statistics @@ -468,11 +480,11 @@ Pause - Pausa + Pausa Pause All - Pausa alla + Pausa alla Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Vill du återuppta alla torrenter? + Vill du återuppta alla torrenter? Would you like to pause all torrents? - Vill du pausa alla torrenter? + Vill du pausa alla torrenter? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Lägg a&utomatiskt till de här spårarna till nya hämtningar: + Lägg a&utomatiskt till de här spårarna till nya hämtningar: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Pausa torrent + Pausa torrent Remove torrent and its files @@ -1904,6 +1940,22 @@ Använd ";" för att dela upp i flera poster. Du kan använda jokertecknet "*".< Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2268,6 +2320,14 @@ Använd ";" för att dela upp i flera poster. Du kan använda jokertecknet "*".< Match all occurrences Matcha alla händelser + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2398,11 +2458,11 @@ Använd ";" för att dela upp i flera poster. Du kan använda jokertecknet "*".< Resumed (0) - Återupptagen (0) + Återupptagen (0) Paused (0) - Pausad (0) + Pausad (0) Active (0) @@ -2434,11 +2494,11 @@ Använd ";" för att dela upp i flera poster. Du kan använda jokertecknet "*".< Paused (%1) - Pausad (%1) + Pausad (%1) Resumed (%1) - Återupptagna (%1) + Återupptagna (%1) Active (%1) @@ -2492,6 +2552,22 @@ Använd ";" för att dela upp i flera poster. Du kan använda jokertecknet "*".< Moving (0) Flyttar (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2511,7 +2587,7 @@ Använd ";" för att dela upp i flera poster. Du kan använda jokertecknet "*".< Done % Done - Slutfört + Slutfört Status @@ -2648,6 +2724,14 @@ Använd ";" för att dela upp i flera poster. Du kan använda jokertecknet "*".< Reannounce In Annonsera igen om + + Popularity + + + + Progress + + TrackerListWidget @@ -2784,7 +2868,7 @@ Använd ";" för att dela upp i flera poster. Du kan använda jokertecknet "*".< Paused - Pausade + Pausade Completed @@ -2850,6 +2934,10 @@ Använd ";" för att dela upp i flera poster. Du kan använda jokertecknet "*".< [F] Downloading metadata [T] Hämtar metadata + + Stopped + + TransferListFiltersWidget @@ -2891,17 +2979,17 @@ Använd ";" för att dela upp i flera poster. Du kan använda jokertecknet "*".< Resume Resume/start the torrent - Återuppta + Återuppta Force Resume Force Resume/start the torrent - Tvinga återuppta + Tvinga återuppta Pause Pause the torrent - Pausa + Pausa Limit share ratio... @@ -3073,6 +3161,18 @@ Använd ";" för att dela upp i flera poster. Du kan använda jokertecknet "*".< Comment Kommentar + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3318,6 +3418,10 @@ Använd ";" för att dela upp i flera poster. Du kan använda jokertecknet "*".< There aren't any search plugins installed. Det finns inga sökinsticksmoduler installerade. + + Start a search above. + + PluginSelectDlg @@ -3380,6 +3484,10 @@ Använd ";" för att dela upp i flera poster. Du kan använda jokertecknet "*".< Seeders Distributörer + + Published On + + SearchPluginsTable @@ -3447,11 +3555,11 @@ Använd ";" för att dela upp i flera poster. Du kan använda jokertecknet "*".< Pause torrents - Pausa torrenter + Pausa torrenter Resume torrents - Återuppta torrenter + Återuppta torrenter Remove unused tags @@ -3469,6 +3577,14 @@ Använd ";" för att dela upp i flera poster. Du kan använda jokertecknet "*".< Remove torrents Ta bort torrenter + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3609,6 +3725,22 @@ Använd ";" för att dela upp i flera poster. Du kan använda jokertecknet "*".< Download link Hämtningslänk + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3908,7 +4040,7 @@ Använd ";" för att dela upp i flera poster. Du kan använda jokertecknet "*".< Add Paused: - Lägg till pausad: + Lägg till pausad: Please type the name of the new download rule. @@ -3968,12 +4100,16 @@ Stöder formaten: S01E01, 1x1, 2017.12.31 och 31.12.2017 (datumformatet stöder Add Tags: Lägg till taggar: + + Add Stopped: + + TrackerFiltersList Resume torrents - Återuppta torrenter + Återuppta torrenter All (%1) @@ -3985,12 +4121,20 @@ Stöder formaten: S01E01, 1x1, 2017.12.31 och 31.12.2017 (datumformatet stöder Pause torrents - Pausa torrenter + Pausa torrenter Remove torrents Ta bort torrenter + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4138,4 +4282,11 @@ Stöder formaten: S01E01, 1x1, 2017.12.31 och 31.12.2017 (datumformatet stöder Välj loggnivå... + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_th.ts b/src/webui/www/translations/webui_th.ts index 59adffd5d..eb515a6bd 100644 --- a/src/webui/www/translations/webui_th.ts +++ b/src/webui/www/translations/webui_th.ts @@ -98,11 +98,11 @@ Resume torrents - ดำเนินการทอร์เรนต์ต่อ + ดำเนินการทอร์เรนต์ต่อ Pause torrents - หยุดทอร์เรนต์ + หยุดทอร์เรนต์ New Category @@ -120,6 +120,14 @@ Add subcategory... เพิ่มหมวดหมู่ย่อย... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - ไม่สามารถเข้าสู่ระบบได้ qBittorrent อาจไม่สามารถเข้าถึงได้ + ไม่สามารถเข้าสู่ระบบได้ qBittorrent อาจไม่สามารถเข้าถึงได้ Invalid Username or Password. - ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง. + ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง. Username - ชื่อผู้ใช้ + ชื่อผู้ใช้ Password - รหัสผ่าน + รหัสผ่าน Login - ล็อกอิน + ล็อกอิน Apply @@ -403,6 +411,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -432,7 +444,7 @@ Resume - ดำเนินการต่อ + ดำเนินการต่อ Top Toolbar @@ -452,7 +464,7 @@ Resume All - ดำเนินการต่อทั้งหมด + ดำเนินการต่อทั้งหมด Statistics @@ -464,11 +476,11 @@ Pause - พัก + พัก Pause All - หยุดทั้งหมด + หยุดทั้งหมด Add Torrent File... @@ -617,11 +629,11 @@ Would you like to resume all torrents? - ต้องการดำเนินการต่อทุกทอเร้นต์? + ต้องการดำเนินการต่อทุกทอเร้นต์? Would you like to pause all torrents? - ต้องการหยุดชั่วคราวทุกทอเร้นต์? + ต้องการหยุดชั่วคราวทุกทอเร้นต์? Execution Log @@ -635,6 +647,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -686,10 +722,6 @@ Torrent Queueing ทอร์เรนต์กำลังเข้าคิว - - Automatically add these trackers to new downloads: - - Web User Interface (Remote control) Web User Interface (รีโมทคอนโทรล) @@ -1186,7 +1218,7 @@ Pause torrent - หยุดทอร์เรนต์ + หยุดทอร์เรนต์ Remove torrent and its files @@ -1832,6 +1864,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2196,6 +2244,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2326,11 +2382,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resumed (0) - ดำเนินการต่อ (0) + ดำเนินการต่อ (0) Paused (0) - หยุดชั่วคราว (0) + หยุดชั่วคราว (0) Active (0) @@ -2362,11 +2418,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused (%1) - หยุดชั่วคราว (%1) + หยุดชั่วคราว (%1) Resumed (%1) - ดำเนินการต่อ (%1) + ดำเนินการต่อ (%1) Active (%1) @@ -2420,6 +2476,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2436,11 +2508,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. i.e: torrent size ขนาด - - Done - % Done - - Status Torrent status (e.g. downloading, seeding, paused) @@ -2576,6 +2643,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2712,7 +2787,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused - หยุดชั่วคราว + หยุดชั่วคราว Completed @@ -2778,6 +2853,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata [F] กำลังดาวน์โหลดข้อมูลเมตา + + Stopped + + TransferListFiltersWidget @@ -2819,17 +2898,17 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resume Resume/start the torrent - ดำเนินการต่อ + ดำเนินการต่อ Force Resume Force Resume/start the torrent - บังคับให้ดำเนินการต่อ + บังคับให้ดำเนินการต่อ Pause Pause the torrent - พัก + พัก Limit share ratio... @@ -3001,6 +3080,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3246,6 +3337,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3308,6 +3403,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders ผู้ส่ง + + Published On + + SearchPluginsTable @@ -3375,11 +3474,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Pause torrents - หยุดทอร์เรนต์ + หยุดทอร์เรนต์ Resume torrents - ดำเนินการทอร์เรนต์ต่อ + ดำเนินการทอร์เรนต์ต่อ Remove unused tags @@ -3397,6 +3496,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents ลบทอเร้นต์ + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3537,6 +3644,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link ลิ้งค์ดาวน์โหลด + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3836,7 +3959,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Add Paused: - เพิ่มหยุดชั่วคราว: + เพิ่มหยุดชั่วคราว: Please type the name of the new download rule. @@ -3896,12 +4019,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - ดำเนินการทอร์เรนต์ต่อ + ดำเนินการทอร์เรนต์ต่อ All (%1) @@ -3913,12 +4040,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - หยุดทอร์เรนต์ + หยุดทอร์เรนต์ Remove torrents ลบทอเร้นต์ + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4066,4 +4201,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_tr.ts b/src/webui/www/translations/webui_tr.ts index 1f48b85e1..2f05d6f65 100644 --- a/src/webui/www/translations/webui_tr.ts +++ b/src/webui/www/translations/webui_tr.ts @@ -98,11 +98,11 @@ Resume torrents - Torrent'lere devam et + Torrent'lere devam et Pause torrents - Torrent'leri duraklat + Torrent'leri duraklat New Category @@ -120,6 +120,14 @@ Add subcategory... Alt kategori ekle... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Oturum açılamıyor, qBittorrent'e muhtemelen ulaşılamıyor. + Oturum açılamıyor, qBittorrent'e muhtemelen ulaşılamıyor. Invalid Username or Password. - Geçersiz Kullanıcı Adı veya Parola. + Geçersiz Kullanıcı Adı veya Parola. Username - Kullanıcı adı + Kullanıcı adı Password - Parola + Parola Login - Oturum Aç + Oturum Aç Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Devam + Devam Top Toolbar @@ -456,7 +468,7 @@ Resume All - Tümüne Devam + Tümüne Devam Statistics @@ -468,11 +480,11 @@ Pause - Duraklat + Duraklat Pause All - Tümünü Duraklat + Tümünü Duraklat Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Tüm torrent'leri devam ettirmek ister misiniz? + Tüm torrent'leri devam ettirmek ister misiniz? Would you like to pause all torrents? - Tüm torrent'leri duraklatmak ister misiniz? + Tüm torrent'leri duraklatmak ister misiniz? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Bu izleyicileri otomatik olarak yeni indirmelere ekle: + Bu izleyicileri otomatik olarak yeni indirmelere ekle: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Torrent'i duraklat + Torrent'i duraklat Remove torrent and its files @@ -1904,6 +1940,22 @@ sunucusu tarafından kullanılan etki alanı adlarına eklemelisiniz. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2268,6 +2320,14 @@ sunucusu tarafından kullanılan etki alanı adlarına eklemelisiniz. Match all occurrences Tüm oluşumları eşleştir + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2398,11 +2458,11 @@ sunucusu tarafından kullanılan etki alanı adlarına eklemelisiniz. Resumed (0) - Devam Edildi (0) + Devam Edildi (0) Paused (0) - Duraklatıldı (0) + Duraklatıldı (0) Active (0) @@ -2434,11 +2494,11 @@ sunucusu tarafından kullanılan etki alanı adlarına eklemelisiniz. Paused (%1) - Duraklatıldı (%1) + Duraklatıldı (%1) Resumed (%1) - Devam Edildi (%1) + Devam Edildi (%1) Active (%1) @@ -2492,6 +2552,22 @@ sunucusu tarafından kullanılan etki alanı adlarına eklemelisiniz. Moving (0) Taşınıyor (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2511,7 +2587,7 @@ sunucusu tarafından kullanılan etki alanı adlarına eklemelisiniz. Done % Done - Tamamlanma + Tamamlanma Status @@ -2648,6 +2724,14 @@ sunucusu tarafından kullanılan etki alanı adlarına eklemelisiniz. Reannounce In Yeniden Duyuru Süresi + + Popularity + + + + Progress + + TrackerListWidget @@ -2784,7 +2868,7 @@ sunucusu tarafından kullanılan etki alanı adlarına eklemelisiniz. Paused - Duraklatıldı + Duraklatıldı Completed @@ -2850,6 +2934,10 @@ sunucusu tarafından kullanılan etki alanı adlarına eklemelisiniz. [F] Downloading metadata [F] Üstveri indiriliyor + + Stopped + + TransferListFiltersWidget @@ -2891,17 +2979,17 @@ sunucusu tarafından kullanılan etki alanı adlarına eklemelisiniz. Resume Resume/start the torrent - Devam + Devam Force Resume Force Resume/start the torrent - Devam Etmeye Zorla + Devam Etmeye Zorla Pause Pause the torrent - Duraklat + Duraklat Limit share ratio... @@ -3073,6 +3161,18 @@ sunucusu tarafından kullanılan etki alanı adlarına eklemelisiniz. Comment Açıklama + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3318,6 +3418,10 @@ sunucusu tarafından kullanılan etki alanı adlarına eklemelisiniz. There aren't any search plugins installed. Yüklü herhangi bir arama eklentisi yok. + + Start a search above. + + PluginSelectDlg @@ -3380,6 +3484,10 @@ sunucusu tarafından kullanılan etki alanı adlarına eklemelisiniz. Seeders Gönderen + + Published On + + SearchPluginsTable @@ -3447,11 +3555,11 @@ sunucusu tarafından kullanılan etki alanı adlarına eklemelisiniz. Pause torrents - Torrent'leri duraklat + Torrent'leri duraklat Resume torrents - Torrent'lere devam et + Torrent'lere devam et Remove unused tags @@ -3469,6 +3577,14 @@ sunucusu tarafından kullanılan etki alanı adlarına eklemelisiniz. Remove torrents Torrent'leri kaldır + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3609,6 +3725,22 @@ sunucusu tarafından kullanılan etki alanı adlarına eklemelisiniz. Download link İndirme bağlantısı + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3908,7 +4040,7 @@ sunucusu tarafından kullanılan etki alanı adlarına eklemelisiniz. Add Paused: - Duraklatıldı Olarak Ekle: + Duraklatıldı Olarak Ekle: Please type the name of the new download rule. @@ -3968,12 +4100,16 @@ Desteklenen biçimler: S01E01, 1x1, 2017.12.31 ve 31.12.2017 (Tarih biçimleri d Add Tags: Etiketleri Ekle: + + Add Stopped: + + TrackerFiltersList Resume torrents - Torrent'lere devam et + Torrent'lere devam et All (%1) @@ -3985,12 +4121,20 @@ Desteklenen biçimler: S01E01, 1x1, 2017.12.31 ve 31.12.2017 (Tarih biçimleri d Pause torrents - Torrent'leri duraklat + Torrent'leri duraklat Remove torrents Torrent'leri kaldır + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4138,4 +4282,11 @@ Desteklenen biçimler: S01E01, 1x1, 2017.12.31 ve 31.12.2017 (Tarih biçimleri d Bir günlük seviyesi seçin... + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_uk.ts b/src/webui/www/translations/webui_uk.ts index 5172d2183..5b2e3d152 100644 --- a/src/webui/www/translations/webui_uk.ts +++ b/src/webui/www/translations/webui_uk.ts @@ -98,11 +98,11 @@ Resume torrents - Продовжити торренти + Продовжити торренти Pause torrents - Призупинити торренти + Призупинити торренти New Category @@ -120,6 +120,14 @@ Add subcategory... Додати підкатегорію... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Не вдалося увійти, qBittorrent напевне недосяжний. + Не вдалося увійти, qBittorrent напевне недосяжний. Invalid Username or Password. - Неправильний логін або пароль. + Неправильний логін або пароль. Username - Ім'я користувача + Ім'я користувача Password - Пароль + Пароль Login - Логін + Логін Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Продовжити + Продовжити Top Toolbar @@ -456,7 +468,7 @@ Resume All - Продовжити всі + Продовжити всі Statistics @@ -468,11 +480,11 @@ Pause - Призупинити + Призупинити Pause All - Призупинити всі + Призупинити всі Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Бажаєте відновити всі торренти? + Бажаєте відновити всі торренти? Would you like to pause all torrents? - Хочете призупинити всі торренти? + Хочете призупинити всі торренти? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Автоматично додавати ці трекери до нових завантажень: + Автоматично додавати ці трекери до нових завантажень: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Призупинити торрент + Призупинити торрент Remove torrent and its files @@ -1904,6 +1940,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2268,6 +2320,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences Зіставте всі випадки + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2398,11 +2458,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resumed (0) - Відновлені (0) + Відновлені (0) Paused (0) - Призупинені (0) + Призупинені (0) Active (0) @@ -2434,11 +2494,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused (%1) - Призупинені (%1) + Призупинені (%1) Resumed (%1) - Відновлені (%1) + Відновлені (%1) Active (%1) @@ -2492,6 +2552,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) Переміщення (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2511,7 +2587,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Done % Done - Зроблено + Зроблено Status @@ -2648,6 +2724,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In Повторно оголосити In + + Popularity + + + + Progress + + TrackerListWidget @@ -2784,7 +2868,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused - Призупинені + Призупинені Completed @@ -2850,6 +2934,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata [F] Завантаження метаданих + + Stopped + + TransferListFiltersWidget @@ -2891,17 +2979,17 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resume Resume/start the torrent - Продовжити + Продовжити Force Resume Force Resume/start the torrent - Примусово продовжити + Примусово продовжити Pause Pause the torrent - Призупинити + Призупинити Limit share ratio... @@ -3073,6 +3161,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment Коментар + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3318,6 +3418,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. Немає встановлених плагінів пошуку. + + Start a search above. + + PluginSelectDlg @@ -3380,6 +3484,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders Сідери + + Published On + + SearchPluginsTable @@ -3447,11 +3555,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Pause torrents - Призупинити торренти + Призупинити торренти Resume torrents - Продовжити торренти + Продовжити торренти Remove unused tags @@ -3469,6 +3577,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents Вилучити торренти + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3609,6 +3725,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link Сторінка завантаження + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3908,7 +4040,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Add Paused: - Додати призупиненим: + Додати призупиненим: Please type the name of the new download rule. @@ -3968,12 +4100,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: Додати теги: + + Add Stopped: + + TrackerFiltersList Resume torrents - Продовжити торренти + Продовжити торренти All (%1) @@ -3985,12 +4121,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - Призупинити торренти + Призупинити торренти Remove torrents Вилучити торренти + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4138,4 +4282,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Виберіть рівень журналу... + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_uz@Latn.ts b/src/webui/www/translations/webui_uz@Latn.ts index 230a34a19..49acdea00 100644 --- a/src/webui/www/translations/webui_uz@Latn.ts +++ b/src/webui/www/translations/webui_uz@Latn.ts @@ -96,14 +96,6 @@ Remove unused categories - - Resume torrents - Torrentlarni davomlash - - - Pause torrents - Torrentlarni pauza qilish - New Category @@ -120,6 +112,14 @@ Add subcategory... + + Start torrents + + + + Stop torrents + + HttpServer @@ -197,19 +197,19 @@ Unable to log in, qBittorrent is probably unreachable. - Tizimga kirib bo‘lmayapti, qBittorrent dasturini ochib bo‘lmaydi. + Tizimga kirib bo‘lmayapti, qBittorrent dasturini ochib bo‘lmaydi. Invalid Username or Password. - Foydalanuvchi ismi yoki parol noto‘g‘ri. + Foydalanuvchi ismi yoki parol noto‘g‘ri. Password - Parol + Parol Login - Kirish + Kirish Original authors @@ -420,6 +420,14 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + + + Username + + MainWindow @@ -449,7 +457,7 @@ Resume - Davomlash + Davomlash Minimum Priority @@ -485,7 +493,7 @@ Resume All - Hammasini davomlash + Hammasini davomlash Statistics @@ -497,7 +505,7 @@ Pause - Pauza qilish + Pauza qilish Delete @@ -505,7 +513,7 @@ Pause All - Hammasini pauza qilish + Hammasini pauza qilish Add Torrent File... @@ -652,14 +660,6 @@ Remove - - Would you like to resume all torrents? - - - - Would you like to pause all torrents? - - Execution Log @@ -672,6 +672,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -719,10 +743,6 @@ Torrent Queueing - - Automatically add these trackers to new downloads: - - Web User Interface (Remote control) @@ -1217,10 +1237,6 @@ Fastest upload - - Pause torrent - - Remove torrent and its files @@ -1865,6 +1881,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2229,6 +2261,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2357,14 +2397,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. Completed (0) - - Resumed (0) - - - - Paused (0) - - Active (0) @@ -2393,14 +2425,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. Completed (%1) - - Paused (%1) - - - - Resumed (%1) - - Active (%1) @@ -2453,6 +2477,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2469,11 +2509,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. i.e: torrent size - - Done - % Done - - Status Torrent status (e.g. downloading, seeding, paused) @@ -2609,6 +2644,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2743,10 +2786,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. e.g.: 1h 20m ago - - Paused - - Completed @@ -2811,6 +2850,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata + + Stopped + + TransferListFiltersWidget @@ -2849,21 +2892,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. Rename - - Resume - Resume/start the torrent - - - - Force Resume - Force Resume/start the torrent - - - - Pause - Pause the torrent - - Limit share ratio... @@ -3038,6 +3066,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3283,6 +3323,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3345,6 +3389,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders + + Published On + + SearchPluginsTable @@ -3410,14 +3458,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. Tag: - - Pause torrents - - - - Resume torrents - - Remove unused tags @@ -3434,6 +3474,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3574,6 +3622,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3871,10 +3935,6 @@ Use ';' to split multiple entries. Can use wildcard '*'. If word order is important use * instead of whitespace. - - Add Paused: - - Please type the name of the new download rule. @@ -3932,13 +3992,13 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: + + Add Stopped: + + TrackerFiltersList - - Resume torrents - - All (%1) @@ -3948,11 +4008,15 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also - Pause torrents + Remove torrents - Remove torrents + Start torrents + + + + Stop torrents @@ -4102,4 +4166,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_vi.ts b/src/webui/www/translations/webui_vi.ts index 1371f39b1..7aa6616fd 100644 --- a/src/webui/www/translations/webui_vi.ts +++ b/src/webui/www/translations/webui_vi.ts @@ -98,11 +98,11 @@ Resume torrents - Tiếp tục torrent + Tiếp tục torrent Pause torrents - Tạm dừng torrent + Tạm dừng torrent New Category @@ -120,6 +120,14 @@ Add subcategory... Thêm danh mục con... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - Không thể đăng nhập, qBittorrent có thể không truy cập được. + Không thể đăng nhập, qBittorrent có thể không truy cập được. Invalid Username or Password. - Tên tài khoản hoặc Mật khẩu không hợp lệ + Tên tài khoản hoặc Mật khẩu không hợp lệ Username - Tên tài khoản + Tên tài khoản Password - Mật khẩu + Mật khẩu Login - Đăng nhập + Đăng nhập Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - Tiếp Tục Lại + Tiếp Tục Lại Top Toolbar @@ -456,7 +468,7 @@ Resume All - Tiếp Tục Tất Cả + Tiếp Tục Tất Cả Statistics @@ -468,11 +480,11 @@ Pause - Tạm Dừng + Tạm Dừng Pause All - Tạm Dừng Tất Cả + Tạm Dừng Tất Cả Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - Bạn có muốn tiếp tục tất cả các torrent không? + Bạn có muốn tiếp tục tất cả các torrent không? Would you like to pause all torrents? - Bạn có muốn tạm dừng tất cả các torrent? + Bạn có muốn tạm dừng tất cả các torrent? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - Tự động thêm các máy theo dõi này vào các bản tải xuống mới: + Tự động thêm các máy theo dõi này vào các bản tải xuống mới: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - Tạm dừng torrent + Tạm dừng torrent Remove torrent and its files @@ -1904,6 +1940,22 @@ Sử dụng ';' để chia nhiều mục nhập. Có thể sử dụng ký tự Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2268,6 +2320,14 @@ Sử dụng ';' để chia nhiều mục nhập. Có thể sử dụng ký tự Match all occurrences Khớp tất cả các lần xuất hiện + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2398,11 +2458,11 @@ Sử dụng ';' để chia nhiều mục nhập. Có thể sử dụng ký tự Resumed (0) - Đã tiếp tục (0) + Đã tiếp tục (0) Paused (0) - Tạm dừng (0) + Tạm dừng (0) Active (0) @@ -2434,11 +2494,11 @@ Sử dụng ';' để chia nhiều mục nhập. Có thể sử dụng ký tự Paused (%1) - Bị tạm dừng (%1) + Bị tạm dừng (%1) Resumed (%1) - Đã tiếp tục (%1) + Đã tiếp tục (%1) Active (%1) @@ -2492,6 +2552,22 @@ Sử dụng ';' để chia nhiều mục nhập. Có thể sử dụng ký tự Moving (0) Đang di chuyển (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2511,7 +2587,7 @@ Sử dụng ';' để chia nhiều mục nhập. Có thể sử dụng ký tự Done % Done - Xong + Xong Status @@ -2648,6 +2724,14 @@ Sử dụng ';' để chia nhiều mục nhập. Có thể sử dụng ký tự Reannounce In Thông báo lại Trong + + Popularity + + + + Progress + + TrackerListWidget @@ -2784,7 +2868,7 @@ Sử dụng ';' để chia nhiều mục nhập. Có thể sử dụng ký tự Paused - Bị tạm dừng + Bị tạm dừng Completed @@ -2850,6 +2934,10 @@ Sử dụng ';' để chia nhiều mục nhập. Có thể sử dụng ký tự [F] Downloading metadata [F] Đang tải về dữ liệu mô tả + + Stopped + + TransferListFiltersWidget @@ -2891,17 +2979,17 @@ Sử dụng ';' để chia nhiều mục nhập. Có thể sử dụng ký tự Resume Resume/start the torrent - Tiếp tục + Tiếp tục Force Resume Force Resume/start the torrent - Buộc tiếp tục + Buộc tiếp tục Pause Pause the torrent - Tạm dừng + Tạm dừng Limit share ratio... @@ -3073,6 +3161,18 @@ Sử dụng ';' để chia nhiều mục nhập. Có thể sử dụng ký tự Comment Bình luận + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3318,6 +3418,10 @@ Sử dụng ';' để chia nhiều mục nhập. Có thể sử dụng ký tự There aren't any search plugins installed. Không có bất kỳ plugin tìm kiếm nào được cài đặt. + + Start a search above. + + PluginSelectDlg @@ -3380,6 +3484,10 @@ Sử dụng ';' để chia nhiều mục nhập. Có thể sử dụng ký tự Seeders Máy chia sẻ + + Published On + + SearchPluginsTable @@ -3447,11 +3555,11 @@ Sử dụng ';' để chia nhiều mục nhập. Có thể sử dụng ký tự Pause torrents - Tạm dừng torrent + Tạm dừng torrent Resume torrents - Tiếp tục torrent + Tiếp tục torrent Remove unused tags @@ -3469,6 +3577,14 @@ Sử dụng ';' để chia nhiều mục nhập. Có thể sử dụng ký tự Remove torrents Xóa các torrent + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3609,6 +3725,22 @@ Sử dụng ';' để chia nhiều mục nhập. Có thể sử dụng ký tự Download link Liên kết tải xuống + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3908,7 +4040,7 @@ Sử dụng ';' để chia nhiều mục nhập. Có thể sử dụng ký tự Add Paused: - Thêm Bị Tạm Dừng: + Thêm Bị Tạm Dừng: Please type the name of the new download rule. @@ -3968,12 +4100,16 @@ Hỗ trợ định dạng: S01E01, 1x1, 2017.12.31 và 31.12.2017 (Hỗ trợ đ Add Tags: Thêm Thẻ: + + Add Stopped: + + TrackerFiltersList Resume torrents - Tiếp tục torrent + Tiếp tục torrent All (%1) @@ -3985,12 +4121,20 @@ Hỗ trợ định dạng: S01E01, 1x1, 2017.12.31 và 31.12.2017 (Hỗ trợ đ Pause torrents - Tạm dừng torrent + Tạm dừng torrent Remove torrents Xóa các torrent + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4138,4 +4282,11 @@ Hỗ trợ định dạng: S01E01, 1x1, 2017.12.31 và 31.12.2017 (Hỗ trợ đ Chọn cấp độ nhật ký... + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_zh_CN.ts b/src/webui/www/translations/webui_zh_CN.ts index 747a238c0..e6ed9c396 100644 --- a/src/webui/www/translations/webui_zh_CN.ts +++ b/src/webui/www/translations/webui_zh_CN.ts @@ -98,11 +98,11 @@ Resume torrents - 继续 torrent + 继续 torrent Pause torrents - 暂停 torrent + 暂停 torrent New Category @@ -120,6 +120,14 @@ Add subcategory... 添加子分类... + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - 登录失败,可能是无法连接到 qBttorrent。 + 登录失败,可能是无法连接到 qBttorrent。 Invalid Username or Password. - 无效的用户名或密码。 + 无效的用户名或密码。 Username - 用户名 + 用户名 Password - 密码 + 密码 Login - 登录 + 登录 Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - 继续 + 继续 Top Toolbar @@ -456,7 +468,7 @@ Resume All - 重新开始所有任务 + 重新开始所有任务 Statistics @@ -468,11 +480,11 @@ Pause - 暂停 + 暂停 Pause All - 暂停所有任务 + 暂停所有任务 Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - 您要继续所有的 Torrent 吗? + 您要继续所有的 Torrent 吗? Would you like to pause all torrents? - 您要暂停所有的 Torrent 吗? + 您要暂停所有的 Torrent 吗? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - 自动添加以下 tracker 到新的 torrent: + 自动添加以下 tracker 到新的 torrent: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - 暂停 torrent + 暂停 torrent Remove torrent and its files @@ -1904,6 +1940,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2268,6 +2320,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences 匹配所有出现 + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2398,11 +2458,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resumed (0) - 恢复 (0) + 恢复 (0) Paused (0) - 暂停 (0) + 暂停 (0) Active (0) @@ -2434,11 +2494,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused (%1) - 暂停 (%1) + 暂停 (%1) Resumed (%1) - 恢复 (%1) + 恢复 (%1) Active (%1) @@ -2492,6 +2552,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) 正在移动 (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2511,7 +2587,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Done % Done - 已完成 + 已完成 Status @@ -2648,6 +2724,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In 下次重新汇报 + + Popularity + + + + Progress + + TrackerListWidget @@ -2784,7 +2868,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused - 暂停 + 暂停 Completed @@ -2850,6 +2934,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata [F] 下载元数据 + + Stopped + + TransferListFiltersWidget @@ -2891,17 +2979,17 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resume Resume/start the torrent - 继续 + 继续 Force Resume Force Resume/start the torrent - 强制继续 + 强制继续 Pause Pause the torrent - 暂停 + 暂停 Limit share ratio... @@ -3073,6 +3161,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment 注释 + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3318,6 +3418,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. 未安装任何搜索插件 + + Start a search above. + + PluginSelectDlg @@ -3380,6 +3484,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders 做种 + + Published On + + SearchPluginsTable @@ -3447,11 +3555,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Pause torrents - 暂停 torrent + 暂停 torrent Resume torrents - 继续 torrent + 继续 torrent Remove unused tags @@ -3469,6 +3577,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents 移除 Torrent + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3609,6 +3725,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link 下载链接 + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3908,7 +4040,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Add Paused: - 添加后不开始下载: + 添加后不开始下载: Please type the name of the new download rule. @@ -3968,12 +4100,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: 添加标签: + + Add Stopped: + + TrackerFiltersList Resume torrents - 继续 Torrent + 继续 Torrent All (%1) @@ -3985,12 +4121,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - 暂停 Torrent + 暂停 Torrent Remove torrents 移除 Torrent + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4138,4 +4282,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also 选择日志级别... + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_zh_HK.ts b/src/webui/www/translations/webui_zh_HK.ts index 2afeea6b9..1368dad65 100644 --- a/src/webui/www/translations/webui_zh_HK.ts +++ b/src/webui/www/translations/webui_zh_HK.ts @@ -98,11 +98,11 @@ Resume torrents - 回復Torrent + 回復Torrent Pause torrents - 暫停Torrent + 暫停Torrent New Category @@ -120,6 +120,14 @@ Add subcategory... 加入子分類… + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - 無法登入:可能連接不到qBittorrent。 + 無法登入:可能連接不到qBittorrent。 Invalid Username or Password. - 無效用戶名稱或密碼。 + 無效用戶名稱或密碼。 Username - 用戶名 + 用戶名 Password - 密碼 + 密碼 Login - 登入 + 登入 Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - 取消暫停 + 取消暫停 Top Toolbar @@ -456,7 +468,7 @@ Resume All - 全部取消暫停 + 全部取消暫停 Statistics @@ -468,11 +480,11 @@ Pause - 暫停 + 暫停 Pause All - 全部暫停 + 全部暫停 Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - 您想要繼續所有 torrents 嗎? + 您想要繼續所有 torrents 嗎? Would you like to pause all torrents? - 您想要暫停所有 torrents 嗎? + 您想要暫停所有 torrents 嗎? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - 自動加入以下追蹤器到新下載: + 自動加入以下追蹤器到新下載: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - 暫停 torrent + 暫停 torrent Remove torrent and its files @@ -1856,6 +1892,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2220,6 +2272,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2350,11 +2410,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resumed (0) - 回復下載(0) + 回復下載(0) Paused (0) - 暫停(0) + 暫停(0) Active (0) @@ -2386,11 +2446,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused (%1) - 暫停(%1) + 暫停(%1) Resumed (%1) - 回復下載(%1) + 回復下載(%1) Active (%1) @@ -2444,6 +2504,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) 移動中 (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2463,7 +2539,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Done % Done - 完成 + 完成 Status @@ -2600,6 +2676,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In + + Popularity + + + + Progress + + TrackerListWidget @@ -2736,7 +2820,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused - 暫停 + 暫停 Completed @@ -2802,6 +2886,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata [F] 正在下載詮釋資料 + + Stopped + + TransferListFiltersWidget @@ -2843,17 +2931,17 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resume Resume/start the torrent - 取消暫停 + 取消暫停 Force Resume Force Resume/start the torrent - 強制取消暫停 + 強制取消暫停 Pause Pause the torrent - 暫停 + 暫停 Limit share ratio... @@ -3025,6 +3113,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3270,6 +3370,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. + + Start a search above. + + PluginSelectDlg @@ -3332,6 +3436,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders 完整種子 + + Published On + + SearchPluginsTable @@ -3399,11 +3507,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Pause torrents - 暫停Torrent + 暫停Torrent Resume torrents - 回復Torrent + 回復Torrent Remove unused tags @@ -3421,6 +3529,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents 移除 torrents + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3561,6 +3677,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link 下載連結 + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3860,7 +3992,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Add Paused: - 加入已暫停的: + 加入已暫停的: Please type the name of the new download rule. @@ -3920,12 +4052,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: + + Add Stopped: + + TrackerFiltersList Resume torrents - 回復Torrent + 回復Torrent All (%1) @@ -3937,12 +4073,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - 暫停Torrent + 暫停Torrent Remove torrents 移除 torrents + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4090,4 +4234,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/translations/webui_zh_TW.ts b/src/webui/www/translations/webui_zh_TW.ts index 2fbd77eb0..641fe2a24 100644 --- a/src/webui/www/translations/webui_zh_TW.ts +++ b/src/webui/www/translations/webui_zh_TW.ts @@ -98,11 +98,11 @@ Resume torrents - 繼續 torrent + 繼續 torrent Pause torrents - 暫停 torrent + 暫停 torrent New Category @@ -120,6 +120,14 @@ Add subcategory... 新增子分類… + + Start torrents + + + + Stop torrents + + HttpServer @@ -193,23 +201,23 @@ Unable to log in, qBittorrent is probably unreachable. - 無法登入,qBittorrent 可能無法連線。 + 無法登入,qBittorrent 可能無法連線。 Invalid Username or Password. - 無效的使用者名稱或密碼。 + 無效的使用者名稱或密碼。 Username - 使用者名稱 + 使用者名稱 Password - 密碼 + 密碼 Login - 登入 + 登入 Apply @@ -407,6 +415,10 @@ JavaScript Required! You must enable JavaScript for the WebUI to work properly + + Could not contact qBittorrent + + MainWindow @@ -436,7 +448,7 @@ Resume - 繼續 + 繼續 Top Toolbar @@ -456,7 +468,7 @@ Resume All - 全部繼續 + 全部繼續 Statistics @@ -468,11 +480,11 @@ Pause - 暫停 + 暫停 Pause All - 全部暫停 + 全部暫停 Add Torrent File... @@ -621,11 +633,11 @@ Would you like to resume all torrents? - 您想要繼續所有 torrents 嗎? + 您想要繼續所有 torrents 嗎? Would you like to pause all torrents? - 您想要暫停所有 torrents 嗎? + 您想要暫停所有 torrents 嗎? Execution Log @@ -639,6 +651,30 @@ [D: %1, U: %2] + + Would you like to start all torrents? + + + + Stop + + + + Would you like to stop all torrents? + + + + Start All + + + + Stop All + + + + Start + + OptionsDialog @@ -692,7 +728,7 @@ Automatically add these trackers to new downloads: - 自動新增這些 Tracker 到新的下載中: + 自動新增這些 Tracker 到新的下載中: Web User Interface (Remote control) @@ -1206,7 +1242,7 @@ Pause torrent - 暫停 torrent + 暫停 torrent Remove torrent and its files @@ -1904,6 +1940,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Customize application instance name: + + Send test email + + + + Attempted to send email. Check your inbox to confirm success + + + + Automatically append these trackers to new downloads: + + + + Stop torrent + + PeerListWidget @@ -2268,6 +2320,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Match all occurrences 符合所有出現的狀況 + + Popularity: + + + + Ratio / Time Active (in months), indicates how popular the torrent is + + ScanFoldersModel @@ -2398,11 +2458,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resumed (0) - 繼續 (0) + 繼續 (0) Paused (0) - 暫停 (0) + 暫停 (0) Active (0) @@ -2434,11 +2494,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused (%1) - 暫停 (%1) + 暫停 (%1) Resumed (%1) - 繼續 (%1) + 繼續 (%1) Active (%1) @@ -2492,6 +2552,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Moving (0) 移動中 (0) + + Running (%1) + + + + Stopped (0) + + + + Stopped (%1) + + + + Running (0) + + TorrentContentModel @@ -2511,7 +2587,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Done % Done - 完成 + 完成 Status @@ -2648,6 +2724,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Reannounce In 重新發佈於 + + Popularity + + + + Progress + + TrackerListWidget @@ -2784,7 +2868,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Paused - 暫停 + 暫停 Completed @@ -2850,6 +2934,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. [F] Downloading metadata [F] 正在下載詮釋資料 + + Stopped + + TransferListFiltersWidget @@ -2891,17 +2979,17 @@ Use ';' to split multiple entries. Can use wildcard '*'. Resume Resume/start the torrent - 繼續 + 繼續 Force Resume Force Resume/start the torrent - 強制繼續 + 強制繼續 Pause Pause the torrent - 暫停 + 暫停 Limit share ratio... @@ -3073,6 +3161,18 @@ Use ';' to split multiple entries. Can use wildcard '*'. Comment 註解 + + Stop + + + + Force Start + + + + Start + + UpDownRatioDialog @@ -3318,6 +3418,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. There aren't any search plugins installed. 沒有安裝任何搜尋附加元件。 + + Start a search above. + + PluginSelectDlg @@ -3380,6 +3484,10 @@ Use ';' to split multiple entries. Can use wildcard '*'. Seeders 種子 + + Published On + + SearchPluginsTable @@ -3447,11 +3555,11 @@ Use ';' to split multiple entries. Can use wildcard '*'. Pause torrents - 暫停 torrent + 暫停 torrent Resume torrents - 繼續 torrent + 繼續 torrent Remove unused tags @@ -3469,6 +3577,14 @@ Use ';' to split multiple entries. Can use wildcard '*'. Remove torrents 移除 torrents + + Start torrents + + + + Stop torrents + + TagFilterModel @@ -3609,6 +3725,22 @@ Use ';' to split multiple entries. Can use wildcard '*'. Download link 下載連結 + + Searching... + + + + Search has finished + + + + An error occurred during search... + + + + Search aborted + + TorrentContentTreeView @@ -3908,7 +4040,7 @@ Use ';' to split multiple entries. Can use wildcard '*'. Add Paused: - 加入已暫停的: + 加入已暫停的: Please type the name of the new download rule. @@ -3968,12 +4100,16 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Add Tags: 新增標籤: + + Add Stopped: + + TrackerFiltersList Resume torrents - 繼續 torrent + 繼續 torrent All (%1) @@ -3985,12 +4121,20 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also Pause torrents - 暫停 torrent + 暫停 torrent Remove torrents 移除 torrents + + Start torrents + + + + Stop torrents + + FeedListWidget @@ -4138,4 +4282,11 @@ Supports the formats: S01E01, 1x1, 2017.12.31 and 31.12.2017 (Date formats also 選擇紀錄檔層級…… + + SearchWidget + + Close tab + + + \ No newline at end of file diff --git a/src/webui/www/webui.qrc b/src/webui/www/webui.qrc index 90e439035..0382ed08a 100644 --- a/src/webui/www/webui.qrc +++ b/src/webui/www/webui.qrc @@ -400,6 +400,7 @@ private/scripts/prop-trackers.js private/scripts/prop-webseeds.js private/scripts/rename-files.js + private/scripts/search.js private/scripts/speedslider.js private/setlocation.html private/shareratio.html @@ -426,63 +427,6 @@ public/images/qbittorrent-tray.svg public/images/qbittorrent32.png public/index.html - public/lang/ar.json - public/lang/az@latin.json - public/lang/be.json - public/lang/bg.json - public/lang/ca.json - public/lang/cs.json - public/lang/da.json - public/lang/de.json - public/lang/el.json - public/lang/en.json - public/lang/en_AU.json - public/lang/en_GB.json - public/lang/eo.json - public/lang/es.json - public/lang/et.json - public/lang/eu.json - public/lang/fa.json - public/lang/fi.json - public/lang/fr.json - public/lang/gl.json - public/lang/he.json - public/lang/hi_IN.json - public/lang/hr.json - public/lang/hu.json - public/lang/hy.json - public/lang/id.json - public/lang/is.json - public/lang/it.json - public/lang/ja.json - public/lang/ka.json - public/lang/ko.json - public/lang/lt.json - public/lang/ltg.json - public/lang/lv_LV.json - public/lang/mn_MN.json - public/lang/ms_MY.json - public/lang/nb.json - public/lang/nl.json - public/lang/oc.json - public/lang/pl.json - public/lang/pt_BR.json - public/lang/pt_PT.json - public/lang/ro.json - public/lang/ru.json - public/lang/sk.json - public/lang/sl.json - public/lang/sr.json - public/lang/sv.json - public/lang/th.json - public/lang/tr.json - public/lang/uk.json - public/lang/uz@Latn.json - public/lang/vi.json - public/lang/zh_CN.json - public/lang/zh_HK.json - public/lang/zh_TW.json - public/scripts/lib/i18next.min.js public/scripts/login.js