diff --git a/src/gui/optionsdialog.cpp b/src/gui/optionsdialog.cpp index 761e5b8ac..1ed6f6517 100644 --- a/src/gui/optionsdialog.cpp +++ b/src/gui/optionsdialog.cpp @@ -1250,6 +1250,10 @@ void OptionsDialog::on_buttonBox_accepted() m_ui->tabSelection->setCurrentRow(TAB_WEBUI); return; } + if (!isAlternativeWebUIPathValid()) { + m_ui->tabSelection->setCurrentRow(TAB_WEBUI); + return; + } m_applyButton->setEnabled(false); this->hide(); saveOptions(); @@ -1269,6 +1273,10 @@ void OptionsDialog::applySettings(QAbstractButton *button) m_ui->tabSelection->setCurrentRow(TAB_WEBUI); return; } + if (!isAlternativeWebUIPathValid()) { + m_ui->tabSelection->setCurrentRow(TAB_WEBUI); + return; + } saveOptions(); } } @@ -1751,6 +1759,15 @@ bool OptionsDialog::webUIAuthenticationOk() return true; } +bool OptionsDialog::isAlternativeWebUIPathValid() +{ + if (m_ui->groupAltWebUI->isChecked() && m_ui->textWebUIRootFolder->selectedPath().trimmed().isEmpty()) { + QMessageBox::warning(this, tr("Location Error"), tr("The alternative Web UI files location cannot be blank.")); + return false; + } + return true; +} + void OptionsDialog::on_banListButton_clicked() { // call dialog window diff --git a/src/gui/optionsdialog.h b/src/gui/optionsdialog.h index 37d475c50..7ab204c6e 100644 --- a/src/gui/optionsdialog.h +++ b/src/gui/optionsdialog.h @@ -172,6 +172,7 @@ private: bool setSslCertificate(const QByteArray &cert); bool schedTimesOk(); bool webUIAuthenticationOk(); + bool isAlternativeWebUIPathValid(); QByteArray m_sslCert, m_sslKey; diff --git a/src/gui/optionsdialog.ui b/src/gui/optionsdialog.ui index 7d4f83231..8d4fb7c88 100644 --- a/src/gui/optionsdialog.ui +++ b/src/gui/optionsdialog.ui @@ -941,7 +941,7 @@ - When Category changed: + When Category Save Path changed: diff --git a/src/webui/api/appcontroller.cpp b/src/webui/api/appcontroller.cpp index 7fad40bed..bc3539035 100644 --- a/src/webui/api/appcontroller.cpp +++ b/src/webui/api/appcontroller.cpp @@ -52,6 +52,7 @@ #include "base/rss/rss_autodownloader.h" #include "base/rss/rss_session.h" #include "base/scanfoldersmodel.h" +#include "base/torrentfileguard.h" #include "base/utils/fs.h" #include "base/utils/net.h" #include "base/utils/password.h" @@ -84,12 +85,23 @@ void AppController::preferencesAction() QVariantMap data; // Downloads - // Hard Disk + // When adding a torrent + data["create_subfolder_enabled"] = session->isCreateTorrentSubfolder(); + data["start_paused_enabled"] = session->isAddTorrentPaused(); + data["auto_delete_mode"] = static_cast(TorrentFileGuard::autoDeleteMode()); + data["preallocate_all"] = session->isPreallocationEnabled(); + data["incomplete_files_ext"] = session->isAppendExtensionEnabled(); + // Saving Management + data["auto_tmm_enabled"] = !session->isAutoTMMDisabledByDefault(); + data["torrent_changed_tmm_enabled"] = !session->isDisableAutoTMMWhenCategoryChanged(); + data["save_path_changed_tmm_enabled"] = !session->isDisableAutoTMMWhenDefaultSavePathChanged(); + data["category_changed_tmm_enabled"] = !session->isDisableAutoTMMWhenCategorySavePathChanged(); data["save_path"] = Utils::Fs::toNativePath(session->defaultSavePath()); data["temp_path_enabled"] = session->isTempPathEnabled(); data["temp_path"] = Utils::Fs::toNativePath(session->tempPath()); - data["preallocate_all"] = session->isPreallocationEnabled(); - data["incomplete_files_ext"] = session->isAppendExtensionEnabled(); + data["export_dir"] = Utils::Fs::toNativePath(session->torrentExportDirectory()); + data["export_dir_fin"] = Utils::Fs::toNativePath(session->finishedTorrentExportDirectory()); + // Automatically add torrents from const QVariantHash dirs = pref->getScanDirs(); QVariantMap nativeDirs; for (QVariantHash::const_iterator i = dirs.cbegin(), e = dirs.cend(); i != e; ++i) { @@ -99,10 +111,9 @@ void AppController::preferencesAction() nativeDirs.insert(Utils::Fs::toNativePath(i.key()), Utils::Fs::toNativePath(i.value().toString())); } data["scan_dirs"] = nativeDirs; - data["export_dir"] = Utils::Fs::toNativePath(session->torrentExportDirectory()); - data["export_dir_fin"] = Utils::Fs::toNativePath(session->finishedTorrentExportDirectory()); // Email notification upon download completion data["mail_notification_enabled"] = pref->isMailNotificationEnabled(); + data["mail_notification_sender"] = pref->getMailNotificationSender(); data["mail_notification_email"] = pref->getMailNotificationEmail(); data["mail_notification_smtp"] = pref->getMailNotificationSMTP(); data["mail_notification_ssl_enabled"] = pref->getMailNotificationSMTPSSL(); @@ -153,6 +164,7 @@ void AppController::preferencesAction() data["bittorrent_protocol"] = static_cast(session->btProtocol()); data["limit_utp_rate"] = session->isUTPRateLimited(); data["limit_tcp_overhead"] = session->includeOverheadInLimits(); + data["limit_lan_peers"] = !session->ignoreLimitsOnLAN(); // Scheduling data["scheduler_enabled"] = session->isBandwidthSchedulerEnabled(); const QTime start_time = pref->getSchedulerStartTime(); @@ -176,6 +188,9 @@ void AppController::preferencesAction() data["max_active_torrents"] = session->maxActiveTorrents(); data["max_active_uploads"] = session->maxActiveUploads(); data["dont_count_slow_torrents"] = session->ignoreSlowTorrentsForQueueing(); + data["slow_torrent_dl_rate_threshold"] = session->downloadRateForSlowTorrents(); + data["slow_torrent_ul_rate_threshold"] = session->uploadRateForSlowTorrents(); + data["slow_torrent_inactive_timer"] = session->slowTorrentsInactivityTimer(); // Share Ratio Limiting data["max_ratio_enabled"] = (session->globalMaxRatio() >= 0.); data["max_ratio"] = session->globalMaxRatio(); @@ -205,6 +220,9 @@ void AppController::preferencesAction() for (const Utils::Net::Subnet &subnet : asConst(pref->getWebUiAuthSubnetWhitelist())) authSubnetWhitelistStringList << Utils::Net::subnetToString(subnet); data["bypass_auth_subnet_whitelist"] = authSubnetWhitelistStringList.join("\n"); + // Use alternative Web UI + data["alternative_webui_enabled"] = pref->isAltWebUiEnabled(); + data["alternative_webui_path"] = pref->getWebUiRootFolder(); // Security data["web_ui_clickjacking_protection_enabled"] = pref->isWebUiClickjackingProtectionEnabled(); data["web_ui_csrf_protection_enabled"] = pref->isWebUiCSRFProtectionEnabled(); @@ -232,19 +250,42 @@ void AppController::setPreferencesAction() Preferences *const pref = Preferences::instance(); auto session = BitTorrent::Session::instance(); const QVariantMap m = QJsonDocument::fromJson(params()["json"].toUtf8()).toVariant().toMap(); + QVariantMap::ConstIterator it; // Downloads - // Hard Disk + // When adding a torrent + if ((it = m.find(QLatin1String("create_subfolder_enabled"))) != m.constEnd()) + session->setCreateTorrentSubfolder(it.value().toBool()); + if ((it = m.find(QLatin1String("start_paused_enabled"))) != m.constEnd()) + session->setAddTorrentPaused(it.value().toBool()); + if ((it = m.find(QLatin1String("auto_delete_mode"))) != m.constEnd()) + TorrentFileGuard::setAutoDeleteMode(static_cast(it.value().toInt())); + + if ((it = m.find(QLatin1String("preallocate_all"))) != m.constEnd()) + session->setPreallocationEnabled(it.value().toBool()); + if ((it = m.find(QLatin1String("incomplete_files_ext"))) != m.constEnd()) + session->setAppendExtensionEnabled(it.value().toBool()); + + // Saving Management + if ((it = m.find(QLatin1String("auto_tmm_enabled"))) != m.constEnd()) + session->setAutoTMMDisabledByDefault(!it.value().toBool()); + if ((it = m.find(QLatin1String("torrent_changed_tmm_enabled"))) != m.constEnd()) + session->setDisableAutoTMMWhenCategoryChanged(!it.value().toBool()); + if ((it = m.find(QLatin1String("save_path_changed_tmm_enabled"))) != m.constEnd()) + session->setDisableAutoTMMWhenDefaultSavePathChanged(!it.value().toBool()); + if ((it = m.find(QLatin1String("category_changed_tmm_enabled"))) != m.constEnd()) + session->setDisableAutoTMMWhenCategorySavePathChanged(!it.value().toBool()); if (m.contains("save_path")) session->setDefaultSavePath(m["save_path"].toString()); if (m.contains("temp_path_enabled")) session->setTempPathEnabled(m["temp_path_enabled"].toBool()); if (m.contains("temp_path")) session->setTempPath(m["temp_path"].toString()); - if (m.contains("preallocate_all")) - session->setPreallocationEnabled(m["preallocate_all"].toBool()); - if (m.contains("incomplete_files_ext")) - session->setAppendExtensionEnabled(m["incomplete_files_ext"].toBool()); + if ((it = m.find(QLatin1String("export_dir"))) != m.constEnd()) + session->setTorrentExportDirectory(it.value().toString()); + if ((it = m.find(QLatin1String("export_dir_fin"))) != m.constEnd()) + session->setFinishedTorrentExportDirectory(it.value().toString()); + // Automatically add torrents from if (m.contains("scan_dirs")) { const QVariantMap nativeDirs = m["scan_dirs"].toMap(); QVariantHash oldScanDirs = pref->getScanDirs(); @@ -288,13 +329,11 @@ void AppController::setPreferencesAction() } pref->setScanDirs(scanDirs); } - if (m.contains("export_dir")) - session->setTorrentExportDirectory(m["export_dir"].toString()); - if (m.contains("export_dir_fin")) - session->setFinishedTorrentExportDirectory(m["export_dir_fin"].toString()); // Email notification upon download completion if (m.contains("mail_notification_enabled")) pref->setMailNotificationEnabled(m["mail_notification_enabled"].toBool()); + if ((it = m.find(QLatin1String("mail_notification_sender"))) != m.constEnd()) + pref->setMailNotificationSender(it.value().toString()); if (m.contains("mail_notification_email")) pref->setMailNotificationEmail(m["mail_notification_email"].toString()); if (m.contains("mail_notification_smtp")) @@ -379,6 +418,8 @@ void AppController::setPreferencesAction() session->setUTPRateLimited(m["limit_utp_rate"].toBool()); if (m.contains("limit_tcp_overhead")) session->setIncludeOverheadInLimits(m["limit_tcp_overhead"].toBool()); + if ((it = m.find(QLatin1String("limit_lan_peers"))) != m.constEnd()) + session->setIgnoreLimitsOnLAN(!it.value().toBool()); // Scheduling if (m.contains("scheduler_enabled")) session->setBandwidthSchedulerEnabled(m["scheduler_enabled"].toBool()); @@ -412,6 +453,12 @@ void AppController::setPreferencesAction() session->setMaxActiveUploads(m["max_active_uploads"].toInt()); if (m.contains("dont_count_slow_torrents")) session->setIgnoreSlowTorrentsForQueueing(m["dont_count_slow_torrents"].toBool()); + if ((it = m.find(QLatin1String("slow_torrent_dl_rate_threshold"))) != m.constEnd()) + session->setDownloadRateForSlowTorrents(it.value().toInt()); + if ((it = m.find(QLatin1String("slow_torrent_ul_rate_threshold"))) != m.constEnd()) + session->setUploadRateForSlowTorrents(it.value().toInt()); + if ((it = m.find(QLatin1String("slow_torrent_inactive_timer"))) != m.constEnd()) + session->setSlowTorrentsInactivityTimer(it.value().toInt()); // Share Ratio Limiting if (m.contains("max_ratio_enabled")) { if (m["max_ratio_enabled"].toBool()) @@ -483,6 +530,11 @@ void AppController::setPreferencesAction() // recognize new lines and commas as delimiters pref->setWebUiAuthSubnetWhitelist(m["bypass_auth_subnet_whitelist"].toString().split(QRegularExpression("\n|,"), QString::SkipEmptyParts)); } + // Use alternative Web UI + if ((it = m.find(QLatin1String("alternative_webui_enabled"))) != m.constEnd()) + pref->setAltWebUiEnabled(it.value().toBool()); + if ((it = m.find(QLatin1String("alternative_webui_path"))) != m.constEnd()) + pref->setWebUiRootFolder(it.value().toString()); // Security if (m.contains("web_ui_clickjacking_protection_enabled")) pref->setWebUiClickjackingProtectionEnabled(m["web_ui_clickjacking_protection_enabled"].toBool()); @@ -505,7 +557,6 @@ void AppController::setPreferencesAction() // Save preferences pref->apply(); - QVariantMap::ConstIterator it; if ((it = m.find(QLatin1String("rss_refresh_interval"))) != m.constEnd()) RSS::Session::instance()->setRefreshInterval(it.value().toUInt()); if ((it = m.find(QLatin1String("rss_max_articles_per_feed"))) != m.constEnd()) diff --git a/src/webui/api/torrentscontroller.cpp b/src/webui/api/torrentscontroller.cpp index 1082f829d..c25c75790 100644 --- a/src/webui/api/torrentscontroller.cpp +++ b/src/webui/api/torrentscontroller.cpp @@ -469,6 +469,7 @@ void TorrentsController::addAction() const QString torrentName = params()["rename"].trimmed(); const int upLimit = params()["upLimit"].toInt(); const int dlLimit = params()["dlLimit"].toInt(); + const TriStateBool autoTMM = parseTriStateBool(params()["autoTMM"]); QList cookies; if (!cookie.isEmpty()) { @@ -496,6 +497,7 @@ void TorrentsController::addAction() params.name = torrentName; params.uploadLimit = (upLimit > 0) ? upLimit : -1; params.downloadLimit = (dlLimit > 0) ? dlLimit : -1; + params.useAutoTMM = autoTMM; bool partialSuccess = false; for (QString url : asConst(urls.split('\n'))) { diff --git a/src/webui/www/private/css/style.css b/src/webui/www/private/css/style.css index c47a6a758..8a1555c24 100644 --- a/src/webui/www/private/css/style.css +++ b/src/webui/www/private/css/style.css @@ -375,28 +375,8 @@ fieldset.settings label { padding: 2px; } -fieldset.settings .leftLabelSmall { - width: 5em; - float: left; - text-align: right; - margin-right: 0.5em; - display: block; -} - -fieldset.settings .leftLabelMedium { - width: 9em; - float: left; - text-align: right; - margin-right: 0.5em; - display: block; -} - -fieldset.settings .leftLabelLarge { - width: 14em; - float: left; - text-align: right; - margin-right: 0.5em; - display: block; +fieldset.settings + div.formRow { + margin-top: 10px; } div.formRow { diff --git a/src/webui/www/private/download.html b/src/webui/www/private/download.html index a2312ddc8..6b89a3ce8 100644 --- a/src/webui/www/private/download.html +++ b/src/webui/www/private/download.html @@ -18,52 +18,114 @@ QBT_TR(Download Torrents from their URLs or Magnet links)QBT_TR[CONTEXT=HttpServer] QBT_TR(Only one link per line)QBT_TR[CONTEXT=HttpServer] - - - QBT_TR(Save files to location:)QBT_TR[CONTEXT=HttpServer] - - - - QBT_TR(Cookie:)QBT_TR[CONTEXT=HttpServer] - - - - QBT_TR(Rename torrent)QBT_TR[CONTEXT=HttpServer] - - - - QBT_TR(Category:)QBT_TR[CONTEXT=AddNewTorrentDialog] - - - - QBT_TR(Start torrent)QBT_TR[CONTEXT=AddNewTorrentDialog] - - - - - QBT_TR(Skip hash check)QBT_TR[CONTEXT=AddNewTorrentDialog] - - - - QBT_TR(Create subfolder)QBT_TR[CONTEXT=AddNewTorrentDialog] - - - - QBT_TR(Download in sequential order)QBT_TR[CONTEXT=TransferListWidget] - - - - QBT_TR(Download first and last pieces first)QBT_TR[CONTEXT=TransferListWidget] - - - - QBT_TR(Limit download rate)QBT_TR[CONTEXT=HttpServer] - - - - QBT_TR(Limit upload rate)QBT_TR[CONTEXT=HttpServer] - - + + + + + QBT_TR(Torrent Management Mode:)QBT_TR[CONTEXT=AddNewTorrentDialog] + + + + Manual + Automatic + + + + + + QBT_TR(Save files to location:)QBT_TR[CONTEXT=HttpServer] + + + + + + + + QBT_TR(Cookie:)QBT_TR[CONTEXT=HttpServer] + + + + + + + + QBT_TR(Rename torrent)QBT_TR[CONTEXT=HttpServer] + + + + + + + + QBT_TR(Category:)QBT_TR[CONTEXT=AddNewTorrentDialog] + + + + + + + + + + + + + QBT_TR(Start torrent)QBT_TR[CONTEXT=AddNewTorrentDialog] + + + + + + + + + QBT_TR(Skip hash check)QBT_TR[CONTEXT=AddNewTorrentDialog] + + + + + + + + QBT_TR(Create subfolder)QBT_TR[CONTEXT=AddNewTorrentDialog] + + + + + + + + QBT_TR(Download in sequential order)QBT_TR[CONTEXT=TransferListWidget] + + + + + + + + QBT_TR(Download first and last pieces first)QBT_TR[CONTEXT=TransferListWidget] + + + + + + + + QBT_TR(Limit download rate)QBT_TR[CONTEXT=HttpServer] + + + + + + + + QBT_TR(Limit upload rate)QBT_TR[CONTEXT=HttpServer] + + + + + + QBT_TR(Download)QBT_TR[CONTEXT=downloadFromURL] diff --git a/src/webui/www/private/preferences_content.html b/src/webui/www/private/preferences_content.html index fd66f593a..2ae863e93 100644 --- a/src/webui/www/private/preferences_content.html +++ b/src/webui/www/private/preferences_content.html @@ -1,21 +1,120 @@ - QBT_TR(Hard Disk)QBT_TR[CONTEXT=HttpServer] + QBT_TR(When adding a torrent)QBT_TR[CONTEXT=OptionsDialog] - QBT_TR(Save files to location:)QBT_TR[CONTEXT=HttpServer] - + + QBT_TR(Create subfolder for torrents with multiple files)QBT_TR[CONTEXT=OptionsDialog] - - QBT_TR(Keep incomplete torrents in:)QBT_TR[CONTEXT=OptionsDialog] - + + QBT_TR(Do not start the download automatically)QBT_TR[CONTEXT=OptionsDialog] + + + QBT_TR(Delete .torrent files afterwards)QBT_TR[CONTEXT=OptionsDialog] + + + + - QBT_TR(Pre-allocate disk space for all files)QBT_TR[CONTEXT=OptionsDialog] + QBT_TR(Pre-allocate disk space for all files)QBT_TR[CONTEXT=OptionsDialog] + + QBT_TR(Append .!qB extension to incomplete files)QBT_TR[CONTEXT=OptionsDialog] - QBT_TR(Automatically add torrents from:)QBT_TR[CONTEXT=OptionsDialog] + + + + + QBT_TR(Saving Management)QBT_TR[CONTEXT=HttpServer] + + + + QBT_TR(Default Torrent Management Mode:)QBT_TR[CONTEXT=OptionsDialog] + + + + QBT_TR(Manual)QBT_TR[CONTEXT=OptionsDialog] + QBT_TR(Automatic)QBT_TR[CONTEXT=OptionsDialog] + + + + + + QBT_TR(When Torrent Category changed:)QBT_TR[CONTEXT=OptionsDialog] + + + + QBT_TR(Relocate torrent)QBT_TR[CONTEXT=OptionsDialog] + QBT_TR(Switch torrent to Manual Mode)QBT_TR[CONTEXT=OptionsDialog] + + + + + + QBT_TR(When Default Save Path changed:)QBT_TR[CONTEXT=OptionsDialog] + + + + QBT_TR(Relocate affected torrents)QBT_TR[CONTEXT=OptionsDialog] + QBT_TR(Switch affected torrents to Manual Mode)QBT_TR[CONTEXT=OptionsDialog] + + + + + + QBT_TR(When Category Save Path changed:)QBT_TR[CONTEXT=OptionsDialog] + + + + QBT_TR(Relocate affected torrents)QBT_TR[CONTEXT=OptionsDialog] + QBT_TR(Switch affected torrents to Manual Mode)QBT_TR[CONTEXT=OptionsDialog] + + + + + + + + QBT_TR(Default Save Path:)QBT_TR[CONTEXT=OptionsDialog] + + + + + + + + + QBT_TR(Keep incomplete torrents in:)QBT_TR[CONTEXT=OptionsDialog] + + + + + + + + + QBT_TR(Copy .torrent files to:)QBT_TR[CONTEXT=OptionsDialog] + + + + + + + + + QBT_TR(Copy .torrent files for finished downloads to:)QBT_TR[CONTEXT=OptionsDialog] + + + + + + + + + + QBT_TR(Automatically add torrents from:)QBT_TR[CONTEXT=OptionsDialog] @@ -34,48 +133,83 @@ QBT_TR(Default save location)QBT_TR[CONTEXT=ScanFoldersModel] QBT_TR(Other...)QBT_TR[CONTEXT=HttpServer] - + - - - QBT_TR(Copy .torrent files to:)QBT_TR[CONTEXT=OptionsDialog] - - - QBT_TR(Copy .torrent files for finished downloads to:)QBT_TR[CONTEXT=OptionsDialog] - + - - QBT_TR(Email notification upon download completion)QBT_TR[CONTEXT=OptionsDialog] - - QBT_TR(To:)QBT_TR[CONTEXT=OptionsDialog] - - - QBT_TR(SMTP server:)QBT_TR[CONTEXT=OptionsDialog] - + + + QBT_TR(Email notification upon download completion)QBT_TR[CONTEXT=OptionsDialog] + + + + + QBT_TR(From:)QBT_TR[CONTEXT=OptionsDialog] + + + + + + + + QBT_TR(To:)QBT_TR[CONTEXT=OptionsDialog] + + + + + + + + QBT_TR(SMTP server:)QBT_TR[CONTEXT=OptionsDialog] + + + + + + QBT_TR(This server requires a secure connection (SSL))QBT_TR[CONTEXT=OptionsDialog] - QBT_TR(Authentication)QBT_TR[CONTEXT=OptionsDialog] - - QBT_TR(Username:)QBT_TR[CONTEXT=OptionsDialog] - - - QBT_TR(Password:)QBT_TR[CONTEXT=OptionsDialog] - + + + QBT_TR(Authentication)QBT_TR[CONTEXT=OptionsDialog] + + + + + QBT_TR(Username:)QBT_TR[CONTEXT=OptionsDialog] + + + + + + + + QBT_TR(Password:)QBT_TR[CONTEXT=OptionsDialog] + + + + + + - - QBT_TR(Run external program on torrent completion)QBT_TR[CONTEXT=OptionsDialog] - + + + QBT_TR(Run external program on torrent completion)QBT_TR[CONTEXT=OptionsDialog] + + + + QBT_TR(Supported parameters (case sensitive):)QBT_TR[CONTEXT=OptionsDialog] QBT_TR(%N: Torrent name)QBT_TR[CONTEXT=OptionsDialog] @@ -95,20 +229,29 @@ - QBT_TR(Enabled protocol:)QBT_TR[CONTEXT=OptionsDialog] - - QBT_TR(TCP and μTP)QBT_TR[CONTEXT=OptionsDialog] - TCP - μTP - + + QBT_TR(Enabled protocol:)QBT_TR[CONTEXT=OptionsDialog] + + QBT_TR(TCP and μTP)QBT_TR[CONTEXT=OptionsDialog] + TCP + μTP + + QBT_TR(Listening Port)QBT_TR[CONTEXT=OptionsDialog] - QBT_TR(Port used for incoming connections:)QBT_TR[CONTEXT=OptionsDialog] - - - QBT_TR(Use UPnP / NAT-PMP port forwarding from my router)QBT_TR[CONTEXT=OptionsDialog] - - QBT_TR(Use different port on each startup)QBT_TR[CONTEXT=OptionsDialog] + + QBT_TR(Port used for incoming connections:)QBT_TR[CONTEXT=OptionsDialog] + + Random + + + + QBT_TR(Use UPnP / NAT-PMP port forwarding from my router)QBT_TR[CONTEXT=OptionsDialog] + + + + QBT_TR(Use different port on each startup)QBT_TR[CONTEXT=OptionsDialog] + @@ -147,23 +290,33 @@ QBT_TR(Proxy Server)QBT_TR[CONTEXT=OptionsDialog] - - QBT_TR(Type:)QBT_TR[CONTEXT=OptionsDialog] - - QBT_TR((None))QBT_TR[CONTEXT=OptionsDialog] - QBT_TR(SOCKS4)QBT_TR[CONTEXT=OptionsDialog] - QBT_TR(SOCKS5)QBT_TR[CONTEXT=OptionsDialog] - QBT_TR(HTTP)QBT_TR[CONTEXT=OptionsDialog] - - - - QBT_TR(Host:)QBT_TR[CONTEXT=OptionsDialog] - - - - QBT_TR(Port:)QBT_TR[CONTEXT=OptionsDialog] - - + + + + QBT_TR(Type:)QBT_TR[CONTEXT=OptionsDialog] + + + + QBT_TR((None))QBT_TR[CONTEXT=OptionsDialog] + QBT_TR(SOCKS4)QBT_TR[CONTEXT=OptionsDialog] + QBT_TR(SOCKS5)QBT_TR[CONTEXT=OptionsDialog] + QBT_TR(HTTP)QBT_TR[CONTEXT=OptionsDialog] + + + + QBT_TR(Host:)QBT_TR[CONTEXT=OptionsDialog] + + + + + + QBT_TR(Port:)QBT_TR[CONTEXT=OptionsDialog] + + + + + + QBT_TR(Use proxy for peer connections)QBT_TR[CONTEXT=OptionsDialog] @@ -177,26 +330,47 @@ QBT_TR(Use proxy only for torrents)QBT_TR[CONTEXT=OptionsDialog] - - QBT_TR(Authentication)QBT_TR[CONTEXT=OptionsDialog] - - QBT_TR(Username:)QBT_TR[CONTEXT=OptionsDialog] - - + + + QBT_TR(Authentication)QBT_TR[CONTEXT=OptionsDialog] + + + + + QBT_TR(Username:)QBT_TR[CONTEXT=OptionsDialog] + + + + + + + + QBT_TR(Password:)QBT_TR[CONTEXT=OptionsDialog] + + + + + + - QBT_TR(Password:)QBT_TR[CONTEXT=OptionsDialog] - + Info: The password is saved unencrypted - - QBT_TR(IP Filtering)QBT_TR[CONTEXT=OptionsDialog] - QBT_TR(Filter path (.dat, .p2p, .p2b):)QBT_TR[CONTEXT=OptionsDialog] - - - QBT_TR(Apply to trackers)QBT_TR[CONTEXT=OptionsDialog] + + + QBT_TR(IP Filtering)QBT_TR[CONTEXT=OptionsDialog] + + + QBT_TR(Filter path (.dat, .p2p, .p2b):)QBT_TR[CONTEXT=OptionsDialog] + + + + + QBT_TR(Apply to trackers)QBT_TR[CONTEXT=OptionsDialog] + QBT_TR(Manually banned IP addresses...)QBT_TR[CONTEXT=OptionsDialog] @@ -211,6 +385,9 @@ QBT_TR(Global Rate Limits)QBT_TR[CONTEXT=OptionsDialog] + + + QBT_TR(Upload:)QBT_TR[CONTEXT=OptionsDialog] QBT_TR(KiB/s)QBT_TR[CONTEXT=OptionsDialog] @@ -226,6 +403,9 @@ QBT_TR(Alternative Rate Limits)QBT_TR[CONTEXT=OptionsDialog] + + + QBT_TR(Upload:)QBT_TR[CONTEXT=OptionsDialog] QBT_TR(KiB/s)QBT_TR[CONTEXT=OptionsDialog] @@ -237,77 +417,144 @@ QBT_TR(0 means unlimited)QBT_TR[CONTEXT=OptionsDialog] - - QBT_TR(Schedule the use of alternative rate limits)QBT_TR[CONTEXT=OptionsDialog] - QBT_TR(From:)QBT_TR[CONTEXT=OptionsDialog] - : QBT_TR(To:)QBT_TR[CONTEXT=OptionsDialog] - : - QBT_TR(When:)QBT_TR[CONTEXT=OptionsDialog] - - QBT_TR(Every day)QBT_TR[CONTEXT=OptionsDialog] - QBT_TR(Weekdays)QBT_TR[CONTEXT=OptionsDialog] - QBT_TR(Weekends)QBT_TR[CONTEXT=OptionsDialog] - QBT_TR(Monday)QBT_TR[CONTEXT=HttpServer] - QBT_TR(Tuesday)QBT_TR[CONTEXT=HttpServer] - QBT_TR(Wednesday)QBT_TR[CONTEXT=HttpServer] - QBT_TR(Thursday)QBT_TR[CONTEXT=HttpServer] - QBT_TR(Friday)QBT_TR[CONTEXT=HttpServer] - QBT_TR(Saturday)QBT_TR[CONTEXT=HttpServer] - QBT_TR(Sunday)QBT_TR[CONTEXT=HttpServer] - - + + + QBT_TR(Schedule the use of alternative rate limits)QBT_TR[CONTEXT=OptionsDialog] + + + QBT_TR(From:)QBT_TR[CONTEXT=OptionsDialog] + : QBT_TR(To:)QBT_TR[CONTEXT=OptionsDialog] + : + + + QBT_TR(When:)QBT_TR[CONTEXT=OptionsDialog] + + QBT_TR(Every day)QBT_TR[CONTEXT=OptionsDialog] + QBT_TR(Weekdays)QBT_TR[CONTEXT=OptionsDialog] + QBT_TR(Weekends)QBT_TR[CONTEXT=OptionsDialog] + QBT_TR(Monday)QBT_TR[CONTEXT=HttpServer] + QBT_TR(Tuesday)QBT_TR[CONTEXT=HttpServer] + QBT_TR(Wednesday)QBT_TR[CONTEXT=HttpServer] + QBT_TR(Thursday)QBT_TR[CONTEXT=HttpServer] + QBT_TR(Friday)QBT_TR[CONTEXT=HttpServer] + QBT_TR(Saturday)QBT_TR[CONTEXT=HttpServer] + QBT_TR(Sunday)QBT_TR[CONTEXT=HttpServer] + + QBT_TR(Rate Limits Settings)QBT_TR[CONTEXT=OptionsDialog] - - QBT_TR(Apply rate limit to µTP protocol)QBT_TR[CONTEXT=OptionsDialog] - - QBT_TR(Apply rate limit to transport overhead)QBT_TR[CONTEXT=OptionsDialog] + + + QBT_TR(Apply rate limit to µTP protocol)QBT_TR[CONTEXT=OptionsDialog] + + + + QBT_TR(Apply rate limit to transport overhead)QBT_TR[CONTEXT=OptionsDialog] + + + + QBT_TR(Apply rate limit to peers on LAN)QBT_TR[CONTEXT=OptionsDialog] + QBT_TR(Privacy)QBT_TR[CONTEXT=OptionsDialog] - - QBT_TR(Enable DHT (decentralized network) to find more peers)QBT_TR[CONTEXT=OptionsDialog] - - QBT_TR(Enable Peer Exchange (PeX) to find more peers)QBT_TR[CONTEXT=OptionsDialog] - - QBT_TR(Enable Local Peer Discovery to find more peers)QBT_TR[CONTEXT=OptionsDialog] - QBT_TR(Encryption mode:)QBT_TR[CONTEXT=OptionsDialog] - - QBT_TR(Prefer encryption)QBT_TR[CONTEXT=OptionsDialog] - QBT_TR(Require encryption)QBT_TR[CONTEXT=OptionsDialog] - QBT_TR(Disable encryption)QBT_TR[CONTEXT=OptionsDialog] - - - QBT_TR(Enable anonymous mode)QBT_TR[CONTEXT=OptionsDialog] (QBT_TR(More information)QBT_TR[CONTEXT=HttpServer]) - - - - - QBT_TR(Torrent Queueing)QBT_TR[CONTEXT=OptionsDialog] - QBT_TR(Maximum active downloads:)QBT_TR[CONTEXT=OptionsDialog] - + + QBT_TR(Enable DHT (decentralized network) to find more peers)QBT_TR[CONTEXT=OptionsDialog] - QBT_TR(Maximum active uploads:)QBT_TR[CONTEXT=OptionsDialog] - + + QBT_TR(Enable Peer Exchange (PeX) to find more peers)QBT_TR[CONTEXT=OptionsDialog] - QBT_TR(Maximum active torrents:)QBT_TR[CONTEXT=OptionsDialog] - + + QBT_TR(Enable Local Peer Discovery to find more peers)QBT_TR[CONTEXT=OptionsDialog] - - QBT_TR(Do not count slow torrents in these limits)QBT_TR[CONTEXT=OptionsDialog] + QBT_TR(Encryption mode:)QBT_TR[CONTEXT=OptionsDialog] + + QBT_TR(Prefer encryption)QBT_TR[CONTEXT=OptionsDialog] + QBT_TR(Require encryption)QBT_TR[CONTEXT=OptionsDialog] + QBT_TR(Disable encryption)QBT_TR[CONTEXT=OptionsDialog] + + + + + QBT_TR(Enable anonymous mode)QBT_TR[CONTEXT=OptionsDialog] (QBT_TR(More information)QBT_TR[CONTEXT=HttpServer]) + + + + QBT_TR(Torrent Queueing)QBT_TR[CONTEXT=OptionsDialog] + + + + + QBT_TR(Maximum active downloads:)QBT_TR[CONTEXT=OptionsDialog] + + + + + + + + QBT_TR(Maximum active uploads:)QBT_TR[CONTEXT=OptionsDialog] + + + + + + + + QBT_TR(Maximum active torrents:)QBT_TR[CONTEXT=OptionsDialog] + + + + + + + + + + QBT_TR(Do not count slow torrents in these limits)QBT_TR[CONTEXT=OptionsDialog] + + + + + QBT_TR(Download rate threshold:)QBT_TR[CONTEXT=OptionsDialog] + + + QBT_TR(KiB/s)QBT_TR[CONTEXT=OptionsDialog] + + + + + QBT_TR(Upload rate threshold:)QBT_TR[CONTEXT=OptionsDialog] + + + QBT_TR(KiB/s)QBT_TR[CONTEXT=OptionsDialog] + + + + + QBT_TR(Torrent inactivity timer:)QBT_TR[CONTEXT=OptionsDialog] + + + QBT_TR(seconds)QBT_TR[CONTEXT=OptionsDialog] + + + + + + QBT_TR(Share Ratio Limiting)QBT_TR[CONTEXT=OptionsDialog] @@ -343,8 +590,10 @@ - - QBT_TR(Automatically add these trackers to new downloads:)QBT_TR[CONTEXT=OptionsDialog] + + + QBT_TR(Automatically add these trackers to new downloads:)QBT_TR[CONTEXT=OptionsDialog] + @@ -409,33 +658,68 @@ QBT_TR(Web User Interface (Remote control))QBT_TR[CONTEXT=OptionsDialog] - QBT_TR(IP address:)QBT_TR[CONTEXT=OptionsDialog] - QBT_TR(Port:)QBT_TR[CONTEXT=OptionsDialog] - - QBT_TR(Use UPnP / NAT-PMP to forward the port from my router)QBT_TR[CONTEXT=OptionsDialog] + + + + QBT_TR(IP address:)QBT_TR[CONTEXT=OptionsDialog] + + + + QBT_TR(Port:)QBT_TR[CONTEXT=OptionsDialog] + + + + + + + QBT_TR(Use UPnP / NAT-PMP to forward the port from my router)QBT_TR[CONTEXT=OptionsDialog] + - - QBT_TR(Use HTTPS instead of HTTP)QBT_TR[CONTEXT=OptionsDialog] - - QBT_TR(Key:)QBT_TR[CONTEXT=OptionsDialog] - - - - QBT_TR(Certificate:)QBT_TR[CONTEXT=OptionsDialog] - - + + + QBT_TR(Use HTTPS instead of HTTP)QBT_TR[CONTEXT=OptionsDialog] + + + + + QBT_TR(Key:)QBT_TR[CONTEXT=OptionsDialog] + + + + + + + + QBT_TR(Certificate:)QBT_TR[CONTEXT=OptionsDialog] + + + + + + QBT_TR(Information about certificates)QBT_TR[CONTEXT=HttpServer] QBT_TR(Authentication)QBT_TR[CONTEXT=OptionsDialog] - - QBT_TR(Username:)QBT_TR[CONTEXT=OptionsDialog] - - - QBT_TR(Password:)QBT_TR[CONTEXT=OptionsDialog] - - + + + + QBT_TR(Username:)QBT_TR[CONTEXT=OptionsDialog] + + + + + + + + QBT_TR(Password:)QBT_TR[CONTEXT=OptionsDialog] + + + + + + QBT_TR(Bypass authentication for clients on localhost)QBT_TR[CONTEXT=OptionsDialog] @@ -449,6 +733,15 @@ + + + QBT_TR(Use alternative Web UI)QBT_TR[CONTEXT=OptionsDialog] + + QBT_TR(Files location:)QBT_TR[CONTEXT=OptionsDialog] + + + + QBT_TR(Security)QBT_TR[CONTEXT=OptionsDialog] @@ -465,36 +758,60 @@ QBT_TR(Enable Host header validation)QBT_TR[CONTEXT=OptionsDialog] - - QBT_TR(Server domains:)QBT_TR[CONTEXT=OptionsDialog] - - + + + + QBT_TR(Server domains:)QBT_TR[CONTEXT=OptionsDialog] + + + + + + - - QBT_TR(Update my dynamic domain name)QBT_TR[CONTEXT=OptionsDialog] + + + QBT_TR(Update my dynamic domain name)QBT_TR[CONTEXT=OptionsDialog] + DynDNS NO-IP - - - QBT_TR(Domain name:)QBT_TR[CONTEXT=OptionsDialog] - - - QBT_TR(Username:)QBT_TR[CONTEXT=OptionsDialog] - - - QBT_TR(Password:)QBT_TR[CONTEXT=OptionsDialog] - + + + + + QBT_TR(Domain name:)QBT_TR[CONTEXT=OptionsDialog] + + + + + + + + QBT_TR(Username:)QBT_TR[CONTEXT=OptionsDialog] + + + + + + + + QBT_TR(Password:)QBT_TR[CONTEXT=OptionsDialog] + + + + + + - - +
QBT_TR(Only one link per line)QBT_TR[CONTEXT=HttpServer]