From 69fa916e263d9d38724cb013375d4a0f297a1dab Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Mon, 3 Sep 2007 22:05:40 +0000 Subject: [PATCH] - FEATURE: Added zip support in search plugins manager (can put .py & .png inside) --- INSTALL | 4 + TODO | 3 +- configure | 98 ++++++++++++++++++ qbittorrent.qc | 3 +- qcm/libmagick.qcm | 1 + qcm/libzzip.qcm | 69 +++++++++++++ src/engineSelectDlg.cpp | 203 +++++++++++++++++++++++++++++++------ src/engineSelectDlg.h | 6 +- src/lang/qbittorrent_hu.ts | 155 ++++++++++++++-------------- 9 files changed, 432 insertions(+), 110 deletions(-) create mode 100644 qcm/libzzip.qcm diff --git a/INSTALL b/INSTALL index 90fb6bf11..dee3ec4e2 100644 --- a/INSTALL +++ b/INSTALL @@ -29,6 +29,10 @@ Dependencies: - python >= 2.3 (needed by search engine) - libmagick++ (advised, not required) + * Needed for favicons support (RSS / Search plugins) + +- libzzip (advised, not required) + * Needed for zip support (Search plugins) NOTE FOR NON-KDE USERS: - qt4-qtconfig package is advised when using other systems than KDE. diff --git a/TODO b/TODO index 688d445b4..9efa9d131 100644 --- a/TODO +++ b/TODO @@ -76,7 +76,7 @@ LANGUAGES UPDATED: - Slovak *BETA6* - Ukrainian *BETA6* - Chinese (simplified) *BETA4* -- Hungarian *BETA4* +- Hungarian *BETA6* - Italian *BETA6* - Polish *BETA6* - Portuguese *BETA5* @@ -94,6 +94,7 @@ beta6->beta7 changelog: - FEATURE: Made search engine plugin install more reliable - FEATURE: Allow to drag'n drop plugin to list for install/update - FEATURE: Added some search plugins to http://plugins.qbittorrent.org +- FEATURE: Added zip support in search plugins manager (can put .py & .png inside) - BUGFIX: Updated man page / README / INSTALL - BUGFIX: Paused torrents could be displayed as connected for a sec after checking - BUGFIX: 'Unknown' is now displayed in search results columns where value is -1 diff --git a/configure b/configure index 7b3895b5c..2433c9b64 100755 --- a/configure +++ b/configure @@ -27,6 +27,9 @@ Dependency options: --disable-libmagick Disable use of libmagick --with-libmagick-inc=[path] Path to libmagick++ include files --with-libmagick-lib=[path] Path to libmagick++ library files + --disable-libzzip Disable use of libzzip + --with-libzzip-inc=[path] Path to libzzip++ include files + --with-libzzip-lib=[path] Path to libzzip++ library files EOT } @@ -188,6 +191,21 @@ while [ $# -gt 0 ]; do shift ;; + --disable-libzzip) + QC_DISABLE_libzzip="Y" + shift + ;; + + --with-libzzip-inc=*) + QC_WITH_LIBZZIP_INC=$optarg + shift + ;; + + --with-libzzip-lib=*) + QC_WITH_LIBZZIP_LIB=$optarg + shift + ;; + --verbose) QC_VERBOSE="Y" shift @@ -218,6 +236,9 @@ echo QC_WITH_LIBCOMMONCPP2_LIB=$QC_WITH_LIBCOMMONCPP2_LIB echo QC_DISABLE_libmagick=$QC_DISABLE_libmagick echo QC_WITH_LIBMAGICK_INC=$QC_WITH_LIBMAGICK_INC echo QC_WITH_LIBMAGICK_LIB=$QC_WITH_LIBMAGICK_LIB +echo QC_DISABLE_libzzip=$QC_DISABLE_libzzip +echo QC_WITH_LIBZZIP_INC=$QC_WITH_LIBZZIP_INC +echo QC_WITH_LIBZZIP_LIB=$QC_WITH_LIBZZIP_LIB echo fi @@ -618,11 +639,82 @@ public: magickConfig.waitForStarted(); magickConfig.waitForFinished(); QByteArray result = magickConfig.readAll(); + result = result.replace("\n", ""); conf->addLib(result.data()); conf->addDefine("HAVE_MAGICK"); return true; } }; +#line 1 "libzzip.qcm" +/* +-----BEGIN QCMOD----- +name: libzzip +arg: with-libzzip-inc=[path], Path to libzzip++ include files +arg: with-libzzip-lib=[path], Path to libzzip++ library files +-----END QCMOD----- +*/ +#include +class qc_libzzip : public ConfObj +{ +public: + qc_libzzip(Conf *c) : ConfObj(c) {} + QString name() const { return "Zzip library (libzzip)"; } + QString shortname() const { return "libzzip"; } + QString checkString() const { + if(!conf->getenv("QC_DISABLE_LIBZZIP").isEmpty()) + return ""; + return ConfObj::checkString(); + } + bool exec(){ + if(!conf->getenv("QC_DISABLE_LIBZZIP").isEmpty()) + return false; + QString s; + s = conf->getenv("QC_WITH_LIBZZIP_INC"); + if(!s.isEmpty()) { + if(!conf->checkHeader(s, "zzip/zzip.h")) { + return false; + } + }else{ + QStringList sl; + sl << "/usr/include"; + sl << "/usr/local/include"; + bool found = false; + foreach(s, sl){ + if(conf->checkHeader(s, "zzip/zzip.h")){ + found = true; + break; + } + } + if(!found) + return false; + } + conf->addIncludePath(s); + + s = conf->getenv("QC_WITH_LIBZZIP_LIB"); + if(!s.isEmpty()) { + if(!QFile::exists(s+QString("libzzip.so"))){ + return false; + } + }else{ + QStringList sl; + sl << "/usr/lib/"; + sl << "/usr/local/lib/"; + bool found = false; + foreach(s, sl){ + if(QFile::exists(s+QString("libzzip.so"))){ + found = true; + break; + } + } + if(!found) + return false; + } + conf->addLib(QString("-L") + s); + conf->addLib("-lzzip"); + conf->addDefine("HAVE_ZZIP"); + return true; + } +}; #line 1 "python.qcm" /* -----BEGIN QCMOD----- @@ -661,6 +753,9 @@ cat >$1/modules_new.cpp <required = false; o->disabled = false; + o = new qc_libzzip(conf); + o->required = false; + o->disabled = false; o = new qc_python(conf); o->required = true; o->disabled = false; @@ -1618,6 +1713,9 @@ export QC_WITH_LIBCOMMONCPP2_LIB export QC_DISABLE_libmagick export QC_WITH_LIBMAGICK_INC export QC_WITH_LIBMAGICK_LIB +export QC_DISABLE_libzzip +export QC_WITH_LIBZZIP_INC +export QC_WITH_LIBZZIP_LIB export QC_VERBOSE rm -rf .qconftemp ( diff --git a/qbittorrent.qc b/qbittorrent.qc index 49dc699a6..a4dc53d1d 100644 --- a/qbittorrent.qc +++ b/qbittorrent.qc @@ -15,7 +15,8 @@ - + + diff --git a/qcm/libmagick.qcm b/qcm/libmagick.qcm index 2880f727f..899846541 100644 --- a/qcm/libmagick.qcm +++ b/qcm/libmagick.qcm @@ -69,6 +69,7 @@ public: magickConfig.waitForStarted(); magickConfig.waitForFinished(); QByteArray result = magickConfig.readAll(); + result = result.replace("\n", ""); conf->addLib(result.data()); conf->addDefine("HAVE_MAGICK"); return true; diff --git a/qcm/libzzip.qcm b/qcm/libzzip.qcm new file mode 100644 index 000000000..2547db2f6 --- /dev/null +++ b/qcm/libzzip.qcm @@ -0,0 +1,69 @@ +/* +-----BEGIN QCMOD----- +name: libzzip +arg: with-libzzip-inc=[path], Path to libzzip++ include files +arg: with-libzzip-lib=[path], Path to libzzip++ library files +-----END QCMOD----- +*/ +#include +class qc_libzzip : public ConfObj +{ +public: + qc_libzzip(Conf *c) : ConfObj(c) {} + QString name() const { return "Zzip library (libzzip)"; } + QString shortname() const { return "libzzip"; } + QString checkString() const { + if(!conf->getenv("QC_DISABLE_LIBZZIP").isEmpty()) + return ""; + return ConfObj::checkString(); + } + bool exec(){ + if(!conf->getenv("QC_DISABLE_LIBZZIP").isEmpty()) + return false; + QString s; + s = conf->getenv("QC_WITH_LIBZZIP_INC"); + if(!s.isEmpty()) { + if(!conf->checkHeader(s, "zzip/zzip.h")) { + return false; + } + }else{ + QStringList sl; + sl << "/usr/include"; + sl << "/usr/local/include"; + bool found = false; + foreach(s, sl){ + if(conf->checkHeader(s, "zzip/zzip.h")){ + found = true; + break; + } + } + if(!found) + return false; + } + conf->addIncludePath(s); + + s = conf->getenv("QC_WITH_LIBZZIP_LIB"); + if(!s.isEmpty()) { + if(!QFile::exists(s+QString("libzzip.so"))){ + return false; + } + }else{ + QStringList sl; + sl << "/usr/lib/"; + sl << "/usr/local/lib/"; + bool found = false; + foreach(s, sl){ + if(QFile::exists(s+QString("libzzip.so"))){ + found = true; + break; + } + } + if(!found) + return false; + } + conf->addLib(QString("-L") + s); + conf->addLib("-lzzip"); + conf->addDefine("HAVE_ZZIP"); + return true; + } +}; diff --git a/src/engineSelectDlg.cpp b/src/engineSelectDlg.cpp index 033745672..862f17b2c 100644 --- a/src/engineSelectDlg.cpp +++ b/src/engineSelectDlg.cpp @@ -35,6 +35,10 @@ using namespace Magick; #endif +#ifdef HAVE_ZZIP + #include +#endif + #define ENGINE_NAME 0 #define ENGINE_URL 1 #define ENGINE_STATE 2 @@ -79,8 +83,16 @@ void engineSelectDlg::dropEvent(QDropEvent *event) { downloader->downloadUrl(file); continue; } - if(file.endsWith(".py")) - installPlugin(file); + if(file.endsWith(".py")) { + QString plugin_name = file.split(QDir::separator()).last(); + plugin_name.replace(".py", ""); + installPlugin(file, plugin_name); + } +#ifdef HAVE_ZZIP + if(file.endsWith(".zip")) { + installZipPlugin(file); + } +#endif } } @@ -291,7 +303,6 @@ void engineSelectDlg::loadSupportedSearchEngines(bool first) { QString nameUrlCouple(e); QStringList line = nameUrlCouple.split('|'); if(line.size() != 2) continue; - // Download favicon QString enabledTxt; if(installed_engines.value(id, true)) { enabledTxt = tr("True"); @@ -327,17 +338,132 @@ QList engineSelectDlg::findItemsWithUrl(QString url){ return res; } +QTreeWidgetItem* engineSelectDlg::findItemWithID(QString id){ + QList res; + for(int i=0; itopLevelItemCount(); ++i) { + QTreeWidgetItem *item = pluginsTree->topLevelItem(i); + if(id == item->text(ENGINE_ID)) + return item; + } + return 0; +} + bool engineSelectDlg::isUpdateNeeded(QString plugin_name, float new_version) const { float old_version = misc::getPluginVersion(misc::qBittorrentPath()+"search_engine"+QDir::separator()+"engines"+QDir::separator()+plugin_name+".py"); + qDebug("IsUpdate needed? tobeinstalled: %.2f, alreadyinstalled: %.2f", new_version, old_version); return (new_version > old_version); } -void engineSelectDlg::installPlugin(QString path) { - if(!path.endsWith(".py")) return; +#ifdef HAVE_ZZIP +void engineSelectDlg::installZipPlugin(QString path) { + QStringList plugins; + QStringList favicons; + ZZIP_DIR* dir = zzip_dir_open(path.toUtf8().data(), 0); + if(!dir) { + QMessageBox::warning(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("Search engine plugin archive could not be read.")); + return; + } + ZZIP_DIRENT dirent; + while(zzip_dir_read(dir, &dirent)) { + /* show info for first file */ + QString name(dirent.d_name); + if(name.endsWith(".py")) { + plugins << name; + } else { + if(name.endsWith(".png")) { + favicons << name; + } + } + } + QString plugin; + std::cout << dirent.d_name << std::endl; + ZZIP_FILE* fp = zzip_file_open(dir, dirent.d_name, 0); + if (fp) { + char buf[10]; + zzip_ssize_t len = zzip_file_read(fp, buf, 10); + if (len) { + /* show head of README */ + std::cout << buf; + } + zzip_file_close(fp); + std::cout << std::endl; + } + foreach(plugin, plugins) { + QString plugin_name = plugin.split(QDir::separator()).last(); + plugin_name.chop(3); // Remove .py extension + qDebug("Detected plugin %s in archive", plugin_name.toUtf8().data()); + ZZIP_FILE* fp = zzip_file_open(dir, plugin.toUtf8().data(), 0); + if(fp) { + QTemporaryFile *tmpfile = new QTemporaryFile(); + QString tmpPath; + // Write file + if(tmpfile->open()) { + tmpPath = tmpfile->fileName(); + char buf[255]; + zzip_ssize_t len = zzip_file_read(fp, buf, 255); + while(len) { + tmpfile->write(buf, len); + len = zzip_file_read(fp, buf, 255); + } + zzip_file_close(fp); + tmpfile->close(); + } else { + qDebug("Could not open tmp file"); + QMessageBox::warning(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("%1 search engine plugin could not be installed.", "%1 is the name of the search engine").arg(plugin_name.toUtf8().data())); + delete tmpfile; + continue; + } + // Install plugin + installPlugin(tmpPath, plugin_name); + qDebug("installPlugin() finished"); + delete tmpfile; + qDebug("Deleted tmpfile"); + } else { + qDebug("Cannot read file in archive"); + QMessageBox::warning(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("%1 search engine plugin could not be installed.", "%1 is the name of the search engine").arg(plugin_name.toUtf8().data())); + } + } + QString favicon; + foreach(favicon, favicons) { + qDebug("Detected favicon %s in archive", favicon.toUtf8().data()); + // Ok we have a favicon here + QString plugin_name = favicon.split(QDir::separator()).last(); + plugin_name.chop(4); // Remove .png extension + if(!QFile::exists(misc::qBittorrentPath()+"search_engine"+QDir::separator()+"engines"+QDir::separator()+plugin_name+".py")) + continue; + // Check if we already have a favicon for this plugin + QString iconPath = misc::qBittorrentPath()+"search_engine"+QDir::separator()+"engines"+QDir::separator()+plugin_name+".png"; + if(QFile::exists(iconPath)) continue; + ZZIP_FILE* fp = zzip_file_open(dir, favicon.toUtf8().data(), 0); + if(fp) { + QFile dest_icon(iconPath); + // Write icon + if(dest_icon.open(QIODevice::WriteOnly | QIODevice::Text)) { + char buf[255]; + zzip_ssize_t len = zzip_file_read(fp, buf, 255); + while(len) { + dest_icon.write(buf, len); + len = zzip_file_read(fp, buf, 255); + } + zzip_file_close(fp); + dest_icon.close(); + // Update icon in list + QTreeWidgetItem *item = findItemWithID(plugin_name); + Q_ASSERT(item); + item->setData(ENGINE_NAME, Qt::DecorationRole, QVariant(QIcon(iconPath))); + } + } + } + zzip_dir_close(dir); +} +#endif + +void engineSelectDlg::installPlugin(QString path, QString plugin_name) { + qDebug("Asked to install plugin at %s", path.toUtf8().data()); float new_version = misc::getPluginVersion(path); - QString plugin_name = path.split(QDir::separator()).last(); - plugin_name.replace(".py", ""); + qDebug("Version to be installed: %.2f", new_version); if(!isUpdateNeeded(plugin_name, new_version)) { + qDebug("Apparently update it not needed, we have a more recent version"); QMessageBox::information(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("A more recent version of %1 search engine plugin is already installed.", "%1 is the name of the search engine").arg(plugin_name.toUtf8().data())); return; } @@ -387,10 +513,25 @@ void engineSelectDlg::installPlugin(QString path) { void engineSelectDlg::on_installButton_clicked() { QStringList pathsList = QFileDialog::getOpenFileNames(0, tr("Select search plugins"), QDir::homePath(), +#ifdef HAVE_ZZIP + tr("qBittorrent search plugins")+QString::fromUtf8(" (*.py *.zip)")); +#else tr("qBittorrent search plugins")+QString::fromUtf8(" (*.py)")); +#endif QString path; foreach(path, pathsList) { - installPlugin(path); + if(path.endsWith(".py")) { + QString plugin_name = path.split(QDir::separator()).last(); + plugin_name.replace(".py", ""); + installPlugin(path, plugin_name); + } +#ifdef HAVE_ZZIP + else { + if(path.endsWith(".zip")) { + installZipPlugin(path); + } + } +#endif } } @@ -476,39 +617,32 @@ void engineSelectDlg::processDownloadedFile(QString url, QString filePath) { if(!parseVersionsFile(filePath, "http://www.dchris.eu/search_engine/")) { qDebug("Primary update server failed, try secondary"); downloader->downloadUrl("http://hydr0g3n.free.fr/search_engine/versions.txt"); - return; } + QFile::remove(filePath); + return; } if(url == "http://hydr0g3n.free.fr/search_engine/versions.txt") { if(!parseVersionsFile(filePath, "http://hydr0g3n.free.fr/search_engine/")) { QMessageBox::warning(this, tr("Search plugin update")+" -- "+tr("qBittorrent"), tr("Sorry, update server is temporarily unavailable.")); - return; } + QFile::remove(filePath); + return; } if(url.endsWith(".pyqBT") || url.endsWith(".py")) { - // a plugin update has been downloaded QString plugin_name = url.split('/').last(); - plugin_name.replace(".pyqBT", ""); plugin_name.replace(".py", ""); - QString dest_path = misc::qBittorrentPath()+"search_engine"+QDir::separator()+"engines"+QDir::separator()+plugin_name+".py"; - bool new_plugin = false; - if(QFile::exists(dest_path)) { - // Delete the old plugin - QFile::remove(dest_path); - } else { - // This is a new plugin - new_plugin = true; - } - // Copy the new plugin - QFile::copy(filePath, dest_path); - if(new_plugin) { - // if it is new, refresh the list of plugins - loadSupportedSearchEngines(); - QMessageBox::information(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("%1 search engine plugin was successfully installed.", "%1 is the name of the search engine").arg(plugin_name.toUtf8().data())); - } else { - QMessageBox::information(this, tr("Search plugin update")+" -- "+tr("qBittorrent"), tr("%1 search plugin was successfully updated.", "%1 is the name of the search engine").arg(plugin_name.toUtf8().data())); - } + plugin_name.replace(".pyqBT", ""); + installPlugin(filePath, plugin_name); + QFile::remove(filePath); + return; } +#ifdef HAVE_ZZIP + if(url.endsWith(".zip")) { + installZipPlugin(filePath); + QFile::remove(filePath); + return; + } +#endif } void engineSelectDlg::handleDownloadFailure(QString url, QString reason) { @@ -531,6 +665,13 @@ void engineSelectDlg::handleDownloadFailure(QString url, QString reason) { QString plugin_name = url.split('/').last(); plugin_name.replace(".pyqBT", ""); plugin_name.replace(".py", ""); - QMessageBox::warning(this, tr("Search plugin update")+" -- "+tr("qBittorrent"), tr("Sorry, %1 search plugin update failed.", "%1 is the name of the search engine").arg(plugin_name.toUtf8().data())); + QMessageBox::warning(this, tr("Search plugin update")+" -- "+tr("qBittorrent"), tr("Sorry, %1 search plugin install failed.", "%1 is the name of the search engine").arg(plugin_name.toUtf8().data())); } +#ifdef HAVE_ZZIP + if(url.endsWith(".zip")) { + QString plugin_name = url.split('/').last(); + plugin_name.replace(".zip", ""); + QMessageBox::warning(this, tr("Search plugin update")+" -- "+tr("qBittorrent"), tr("Sorry, %1 search plugin install failed.", "%1 is the name of the search engine").arg(plugin_name.toUtf8().data())); + } +#endif } diff --git a/src/engineSelectDlg.h b/src/engineSelectDlg.h index 30da6368f..15d0a1ad2 100644 --- a/src/engineSelectDlg.h +++ b/src/engineSelectDlg.h @@ -39,6 +39,7 @@ class engineSelectDlg : public QDialog, public Ui::engineSelect{ engineSelectDlg(QWidget *parent); ~engineSelectDlg(); QList findItemsWithUrl(QString url); + QTreeWidgetItem* findItemWithID(QString id); protected: bool parseVersionsFile(QString versions_file, QString updateServer); @@ -64,7 +65,10 @@ class engineSelectDlg : public QDialog, public Ui::engineSelect{ void on_installButton_clicked(); void dropEvent(QDropEvent *event); void dragEnterEvent(QDragEnterEvent *event); - void installPlugin(QString plugin_path); + void installPlugin(QString plugin_path, QString plugin_name); +#ifdef HAVE_ZZIP + void installZipPlugin(QString path); +#endif }; #endif diff --git a/src/lang/qbittorrent_hu.ts b/src/lang/qbittorrent_hu.ts index e01e786fa..0a0365868 100644 --- a/src/lang/qbittorrent_hu.ts +++ b/src/lang/qbittorrent_hu.ts @@ -1,5 +1,6 @@ + AboutDlg @@ -585,115 +586,115 @@ Copyright © 2006 by Christophe Dumez<br> Name i.e: file name - Név + Név Size i.e: file size - Méret + Méret Progress i.e: % downloaded - Folyamat + Folyamat DL Speed i.e: Download speed - + DL Speed UP Speed i.e: Upload speed - + UP Speed Seeds/Leechs i.e: full/partial sources - + Seeds/Leechs Ratio - Arány + Arány ETA i.e: Estimated Time of Arrival / Time left - Idő + Idő qBittorrent %1 started. e.g: qBittorrent v0.x started. - qBittorrent %1 elindítva. + qBittorrent %1 elindítva. Be careful, sharing copyrighted material without permission is against the law. - Csak óvatosan a megosztással. Nehogy megsértsd a szerzői jogokat!. + Csak óvatosan a megosztással. Nehogy megsértsd a szerzői jogokat!. <font color='red'>%1</font> <i>was blocked</i> x.y.z.w was blocked - <font color='red'>%1</font> <i>blokkolva</i> + <font color='red'>%1</font> <i>blokkolva</i> Fast resume data was rejected for torrent %1, checking again... - Hibás ellenőrző adat ennél a torrentnél: %1, újraellenőrzés... + Hibás ellenőrző adat ennél a torrentnél: %1, újraellenőrzés... Url seed lookup failed for url: %1, message: %2 - Url forrás meghatározása sikertelen: %1, hibaüzenet: %2 + Url forrás meghatározása sikertelen: %1, hibaüzenet: %2 '%1' added to download list. '/home/y/xxx.torrent' was added to download list. - '%1' felvéve a letöltési listára. + '%1' felvéve a letöltési listára. '%1' resumed. (fast resume) '/home/y/xxx.torrent' was resumed. (fast resume) - '%1' visszaállítva. (folytatás) + '%1' visszaállítva. (folytatás) '%1' is already in download list. e.g: 'xxx.avi' is already in download list. - '%1' már letöltés alatt. + '%1' már letöltés alatt. Unable to decode torrent file: '%1' e.g: Unable to decode torrent file: '/home/y/xxx.torrent' - Megfejthetetlen torrent: '%1' + Megfejthetetlen torrent: '%1' This file is either corrupted or this isn't a torrent. - Ez a fájl sérült, vagy nem is torrent. + Ez a fájl sérült, vagy nem is torrent. Couldn't listen on any of the given ports. - A megadott porok zártak. + A megadott porok zártak. Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... - Letöltés alatt: '%1', kis türelmet... + Letöltés alatt: '%1', kis türelmet... @@ -1241,13 +1242,13 @@ Mégis leállítod a qBittorrentet? Alt+3 shortcut to switch to third tab - Alt+3 + Alt+3 Ctrl+F shortcut to switch to search tab - + Ctrl+F @@ -1597,7 +1598,7 @@ Mégis leállítod a qBittorrentet? This rss feed is already in the list. - + Ez a hírcsatorna már felvéve. @@ -1619,7 +1620,7 @@ Mégis leállítod a qBittorrentet? Never - + Soha @@ -1773,7 +1774,7 @@ Changelog: Unknown - Ismeretlen + Ismeretlen @@ -1968,7 +1969,7 @@ Changelog: Input file or directory: - + Forrás fájl vagy könyvtár: @@ -2052,7 +2053,7 @@ Changelog: Select a file to add to the torrent - + Válassz fájlt(okat) a torrenthez @@ -2098,82 +2099,82 @@ Changelog: Search - Keresés + Keresés Total DL Speed: - Bejövő sebesség: + Bejövő sebesség: KiB/s - KByte/s + KByte/s Session ratio: - Megosztási arány: + Megosztási arány: Total UP Speed: - Kimenő sebesség: + Kimenő sebesség: Log - Napló + Napló IP filter - IP szűrő + IP szűrő Start - Indítás + Indítás Pause - Szünet + Szünet Delete - Törlés + Törlés Clear - Törlés + Törlés Preview file - Minta fájl + Minta fájl Set upload limit - Feltöltési korlát megadása + Feltöltési korlát megadása Set download limit - Letöltési korlát megadása + Letöltési korlát megadása Delete Permanently - Végleges törlés + Végleges törlés Torrent Properties - + Torrent tulajdonságai @@ -2181,62 +2182,62 @@ Changelog: Search plugins - + Kereső modulok Installed search engines: - + Telepített keresők: Name - Név + Név Url - + Url Enabled - Engedélyez + Státusz You can get new search engine plugins here: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Újabb kereső modulok elérhetőek itt : <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> Install a new one - + Új telepítése Check for updates - + Frissítések ellenőrzése Close - + Bezárás Enable - + Enged Disable - Letiltva + Tilt Uninstall - + Eltávolít @@ -2244,111 +2245,113 @@ Changelog: True - + Engedve False - + Tiltva Uninstall warning - + Figyelemeztetés Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. However, those plugins were disabled. - + Néhány modult nem lehet eltávolítani, mivel a program részei. + Csak azokat lehet, amiket saját kezüleg telepítettél. +Viszont azok a modulok kikapcsolhatóak. Uninstall success - + Sikeresen eltávolítva Select search plugins - + Modul kiválasztása qBittorrent search plugins - + qBittorrent kereső modulok Search plugin install - + Kerső telepítése qBittorrent - qBittorrent + qBittorrent A more recent version of %1 search engine plugin is already installed. %1 is the name of the search engine - + A %1 kereső modul egy újabb verziója már telepítve van. Search plugin update - Kereső modul frissítése + Kereső modul frissítése Sorry, update server is temporarily unavailable. - A kiszolgálő jelenleg nem elérhető. Bocs. + A kiszolgálő jelenleg nem elérhető. Bocs. Sorry, %1 search plugin update failed. %1 is the name of the search engine - + Bocs, nem sikerült frissíteni: %1. All your plugins are already up to date. - + A legújabb kereső modulokat használod. %1 search engine plugin could not be updated, keeping old version. %1 is the name of the search engine - + %1 keresőt nem lehet frissíteni, előző verzió megtartva. %1 search engine plugin could not be installed. %1 is the name of the search engine - + %1 kereső modul telepítése sikertelen. All selected plugins were uninstalled successfully - + Kereső modul(ok) sikeresen eltávolítva %1 search engine plugin was successfully updated. %1 is the name of the search engine - + %1 kereső modul sikeresen frissítve. %1 search engine plugin was successfully installed. %1 is the name of the search engine - + %1 kereső modul sikeresen telepítve. %1 search plugin was successfully updated. %1 is the name of the search engine - + %1 kereső modul sikeresen frissítve. @@ -2855,7 +2858,7 @@ However, those plugins were disabled. Search engines... - + Keresők...