diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 715c43959..4b45ff610 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -8,6 +8,11 @@ +### How often does this problem occur? + + + + ### What version of the program are you using? On what operating system? diff --git a/CrashReporter/CrashReporter.pro b/CrashReporter/CrashReporter.pro index 53b07d9b3..1c183ca43 100755 --- a/CrashReporter/CrashReporter.pro +++ b/CrashReporter/CrashReporter.pro @@ -17,4 +17,5 @@ TRANSLATIONS += languages/English.ts \ languages/French.ts \ languages/ChineseSimplified.ts \ languages/Russian.ts \ + languages/Spanish.ts \ languages/YourLanguage.ts diff --git a/CrashReporter/languages/Spanish.ts b/CrashReporter/languages/Spanish.ts new file mode 100644 index 000000000..59f015c53 --- /dev/null +++ b/CrashReporter/languages/Spanish.ts @@ -0,0 +1,57 @@ + + + + + MainWindow + + + Crash Reporter + Reporte de errores + + + + Sorry + Lo sentimos + + + + Grabber encountered a problem and crashed. The program will try to restore your tabs and other settings when it restarts. + Grabber ha encontrado un problema y cerrado inesperadamente. El programa intentará restaurar sus pestañas y configuraciones cuando reinicie. + + + + To help us fix this crash, you can send us a bug report. + Para ayudarnos a resolver este error, puedes enviarnos un reporte de error. + + + + Send a bug report + Enviar un reporte de error + + + + Log + Registros + + + + Settings + Configuraciones + + + + Dump + Vaciado + + + + Restart + Reiniciar + + + + Quit + Cerrar + + + diff --git a/Grabber.pri b/Grabber.pri index 7e455bb08..2606bbcb4 100644 --- a/Grabber.pri +++ b/Grabber.pri @@ -16,7 +16,7 @@ RCC_DIR = $$DESTDIR/qrc UI_DIR = $$DESTDIR/ui # Global -APP_VERSION = \\\"5.2.2\\\" +APP_VERSION = \\\"5.2.3\\\" APP_PREFIX = \\\"$$(PREFIX)\\\" # General @@ -34,6 +34,7 @@ TRANSLATIONS += $${PWD}/languages/English.ts \ $${PWD}/languages/French.ts \ $${PWD}/languages/Russian.ts \ $${PWD}/languages/ChineseSimplified.ts \ + $${PWD}/languages/Spanish.ts \ $${PWD}/languages/YourLanguage.ts # Target WinXP diff --git a/README.md b/README.md index 3ce732ea8..e22a2698f 100755 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ You can download the latest release [here](https://github.com/Bionus/imgbrd-grab * French * Russian * Chinese (simplified) +* Spanish ## Default sources You can add additional sources very easily, but here's a shot list of some sources that are included and supported by default: Danbooru, Gelbooru, yande.re, Shimmie, Sankaku complex, e621, Konachan, rule34, safebooru, behoimi, Zerochan... diff --git a/gui/src/batch/batchwindow.ui b/gui/src/batch/batchwindow.ui index 4abd97092..bce253163 100644 --- a/gui/src/batch/batchwindow.ui +++ b/gui/src/batch/batchwindow.ui @@ -46,7 +46,7 @@ 0 - %p% + %p% diff --git a/gui/src/mainwindow.cpp b/gui/src/mainwindow.cpp index f0a78b382..333af4701 100644 --- a/gui/src/mainwindow.cpp +++ b/gui/src/mainwindow.cpp @@ -34,6 +34,7 @@ #include "helpers.h" #include "downloader/download-query-loader.h" #include "tabs/tabs-loader.h" +#include "theme-loader.h" @@ -48,9 +49,6 @@ void mainWindow::init(QStringList args, QMap params) m_settings->setValue("crashed", true); m_settings->sync(); - loadLanguage(m_settings->value("language", "English").toString(), true); - ui->setupUi(this); - m_showLog = m_settings->value("Log/show", true).toBool(); if (!m_showLog) { ui->tabWidget->removeTab(ui->tabWidget->indexOf(ui->tabLog)); } @@ -60,6 +58,36 @@ void mainWindow::init(QStringList args, QMap params) log(QString("Path: %1").arg(qApp->applicationDirPath())); log(QString("Loading preferences from %1").arg(m_settings->fileName())); + ThemeLoader themeLoader(savePath("themes/", true)); + themeLoader.setTheme(m_settings->value("theme", "Default").toString()); + ui->setupUi(this); + + // On first launch after setup, we restore the setup's language + QString setupSettingsFile = savePath("innosetup.ini"); + if (QFile::exists(setupSettingsFile)) + { + QSettings setupSettings(setupSettingsFile, QSettings::IniFormat); + QString setupLanguage = setupSettings.value("language", "en").toString(); + + QSettings associations(savePath("languages/languages.ini"), QSettings::IniFormat); + associations.beginGroup("innosetup"); + QStringList keys = associations.childKeys(); + + // Only if the setup language is available in Grabber + if (keys.contains(setupLanguage)) + { + m_settings->setValue("language", associations.value(setupLanguage).toString()); + } + + // Remove the setup settings file to not do this every time + QFile::remove(setupSettingsFile); + } + + // Load translations + qApp->installTranslator(&m_translator); + qApp->installTranslator(&m_qtTranslator); + loadLanguage(m_settings->value("language", "English").toString()); + tabifyDockWidget(ui->dock_internet, ui->dock_wiki); tabifyDockWidget(ui->dock_wiki, ui->dock_kfl); tabifyDockWidget(ui->dock_kfl, ui->dock_favorites); @@ -123,8 +151,6 @@ void mainWindow::init(QStringList args, QMap params) ui->actionQuit->setShortcut(QKeySequence::Quit); ui->actionFolder->setShortcut(QKeySequence::Open); - loadLanguage(m_settings->value("language", "English").toString()); - connect(ui->actionQuit, SIGNAL(triggered()), qApp, SLOT(quit())); connect(ui->actionAboutQt, SIGNAL(triggered()), qApp, SLOT(aboutQt())); @@ -165,6 +191,7 @@ void mainWindow::init(QStringList args, QMap params) m_favoritesTab = new favoritesTab(&m_sites, m_profile, this); connect(m_favoritesTab, &searchTab::batchAddGroup, this, &mainWindow::batchAddGroup); connect(m_favoritesTab, SIGNAL(batchAddUnique(DownloadQueryImage)), this, SLOT(batchAddUnique(DownloadQueryImage))); + connect(m_favoritesTab, &searchTab::titleChanged, this, &mainWindow::updateTabTitle); connect(m_favoritesTab, &searchTab::changed, this, &mainWindow::updateTabs); ui->tabWidget->insertTab(m_tabs.size(), m_favoritesTab, tr("Favorites")); ui->tabWidget->setCurrentIndex(0); @@ -225,7 +252,7 @@ void mainWindow::init(QStringList args, QMap params) // Check for updates int cfuInterval = m_settings->value("check_for_updates", 24*60*60).toInt(); QDateTime lastCfu = m_settings->value("last_check_for_updates", QDateTime()).toDateTime(); - if (cfuInterval > 0 && (!lastCfu.isValid() || lastCfu.addSecs(cfuInterval) <= QDateTime::currentDateTime())) + if (cfuInterval >= 0 && (!lastCfu.isValid() || lastCfu.addSecs(cfuInterval) <= QDateTime::currentDateTime())) { m_settings->setValue("last_check_for_updates", QDateTime::currentDateTime()); @@ -490,8 +517,11 @@ bool mainWindow::loadTabs(QString filename) m_tagTabs.append(tagTabs); m_poolTabs.append(poolTabs); - ui->tabWidget->setCurrentIndex(currentTab); - m_forcedTab = true; + if (currentTab >= 0) + { + ui->tabWidget->setCurrentIndex(currentTab); + m_forcedTab = true; + } return true; } @@ -938,12 +968,6 @@ void mainWindow::logClear() void mainWindow::logOpen() { QDesktopServices::openUrl("file:///" + m_profile->getPath() + "/main.log"); } -void mainWindow::switchTranslator(QTranslator& translator, const QString& filename) -{ - qApp->removeTranslator(&translator); - if (translator.load(filename)) - { qApp->installTranslator(&translator); } -} void mainWindow::loadLanguage(const QString& rLanguage, bool shutup) { if (m_currLang != rLanguage) @@ -951,7 +975,10 @@ void mainWindow::loadLanguage(const QString& rLanguage, bool shutup) m_currLang = rLanguage; QLocale locale = QLocale(m_currLang); QLocale::setDefault(locale); - switchTranslator(m_translator, savePath("languages/"+m_currLang+".qm", true)); + + m_translator.load(savePath("languages/"+m_currLang+".qm", true)); + m_qtTranslator.load(savePath("languages/qt/"+m_currLang+".qm", true)); + if (!shutup) { log(QString("Translating texts in %1...").arg(m_currLang)); @@ -1122,6 +1149,7 @@ void mainWindow::getAll(bool all) m_getAllFailed.clear(); m_getAllDownloading.clear(); m_getAllSkippedImages.clear(); + m_batchPending.clear(); QList selected = ui->tableBatchUniques->selectedItems(); int count = selected.size(); @@ -1271,6 +1299,10 @@ void mainWindow::getAllFinishedLogins() int imagesPerPack = pagesPerPack * b.perpage; int packs = qCeil((float)b.total / imagesPerPack); + int lastPageImages = b.total % imagesPerPack; + if (lastPageImages == 0) + lastPageImages = imagesPerPack; + for (int i = 0; i < packs; ++i) { Downloader *downloader = new Downloader(m_profile, @@ -1278,7 +1310,7 @@ void mainWindow::getAllFinishedLogins() QStringList(), QList() << b.site, b.page + i * pagesPerPack, - (i == packs - 1 ? b.total % imagesPerPack : imagesPerPack), + (i == packs - 1 ? lastPageImages : imagesPerPack), b.perpage, b.path, b.filename, @@ -1728,7 +1760,7 @@ void mainWindow::getAllGetImage(QSharedPointer img) { if (whatToDo == "copy") { - m_getAllIgnored++; + m_getAllDownloaded++; log(QString("Copy from %1 vers %2").arg(md5Duplicate).arg(fp)); QFile::copy(md5Duplicate, fp); @@ -1747,7 +1779,7 @@ void mainWindow::getAllGetImage(QSharedPointer img) } else { - m_getAllIgnored++; + m_getAllExists++; log(QString("MD5 \"%1\" of the image %2 already found in file %3").arg(img->md5(), img->url(), md5Duplicate)); } } @@ -1996,6 +2028,7 @@ void mainWindow::getAllFinished() int pos = i - rem; m_progressBars[pos]->deleteLater(); m_progressBars.removeAt(pos); + m_groupBatchs.removeAt(pos); ui->tableBatchGroups->removeRow(pos); rem++; } diff --git a/gui/src/mainwindow.h b/gui/src/mainwindow.h index 0b4fede3d..eadff3678 100644 --- a/gui/src/mainwindow.h +++ b/gui/src/mainwindow.h @@ -67,7 +67,6 @@ class mainWindow : public QMainWindow void md5FixOpen(); void renameExisting(); // Language - void switchTranslator(QTranslator&, const QString&); void loadLanguage(const QString&, bool shutup = false); void changeEvent(QEvent*); // Favorites @@ -194,7 +193,7 @@ class mainWindow : public QMainWindow QSettings *m_settings; batchWindow *m_progressdialog; QString m_currLang, m_link; - QTranslator m_translator; + QTranslator m_translator, m_qtTranslator; QList m_groupBatchs; QList> m_getAllRemaining, m_getAllDownloading, m_getAllFailed, m_images, m_getAllSkippedImages; QWidget *m_currentTab; diff --git a/gui/src/settings/optionswindow.cpp b/gui/src/settings/optionswindow.cpp index 198b2b4e8..8c99044fd 100644 --- a/gui/src/settings/optionswindow.cpp +++ b/gui/src/settings/optionswindow.cpp @@ -15,6 +15,7 @@ #include "functions.h" #include "helpers.h" #include "language-loader.h" +#include "theme-loader.h" @@ -198,6 +199,13 @@ optionsWindow::optionsWindow(Profile *profile, QWidget *parent) ui->layoutCustom->insertRow(i, leName, leTags); } + // Themes + ThemeLoader themeLoader(savePath("themes/", true)); + QStringList themes = themeLoader.getAllThemes(); + for (QString theme : themes) + { ui->comboTheme->addItem(theme, theme); } + ui->comboTheme->setCurrentText(settings->value("theme", "Default").toString()); + QStringList positions = QStringList() << "top" << "left" << "auto"; ui->comboTagsPosition->setCurrentIndex(positions.indexOf(settings->value("tagsposition", "top").toString())); ui->spinPreload->setValue(settings->value("preload", 0).toInt()); @@ -691,6 +699,12 @@ void optionsWindow::save() settings->endGroup(); settings->endGroup(); + // Themes + QString theme = ui->comboTheme->currentText(); + ThemeLoader themeLoader(savePath("themes/", true)); + if (themeLoader.setTheme(theme)) + { settings->setValue("theme", theme); } + QStringList positions = QStringList() << "top" << "left" << "auto"; settings->setValue("tagsposition", positions.at(ui->comboTagsPosition->currentIndex())); settings->setValue("preload", ui->spinPreload->value()); diff --git a/gui/src/settings/optionswindow.ui b/gui/src/settings/optionswindow.ui index a469badfa..052f7555c 100644 --- a/gui/src/settings/optionswindow.ui +++ b/gui/src/settings/optionswindow.ui @@ -14,7 +14,7 @@ Options - + :/images/icon.ico:/images/icon.ico @@ -1548,14 +1548,14 @@ QFormLayout::AllNonFixedFieldsGrow - + Use a scroll area for the results - + Resize previews instead of cropping them @@ -1565,14 +1565,14 @@ - + Upscaling - + % @@ -1585,7 +1585,7 @@ - + Enable autocompletion @@ -1595,14 +1595,14 @@ - + Favorites display - + @@ -1641,14 +1641,14 @@ - + Hide favorites - + 1000 @@ -1658,7 +1658,7 @@ - + <i>The favorites list will be hidden as soon as this image number has been reached.</i> @@ -1668,14 +1668,14 @@ - + Source's type display - + @@ -1699,14 +1699,14 @@ - + Displayed letters - + @@ -1742,7 +1742,7 @@ - + <i>Number of displayed letters near the sources' checkboxes in the "+" part of the main window.</i> @@ -1752,7 +1752,7 @@ - + Show warning if an incompatible modifier is found @@ -1762,7 +1762,7 @@ - + Show other warnings @@ -1772,14 +1772,14 @@ - + Download not loaded pages - + <i>If you activate this option, pressing the "Get this page" button will take into account modifications made to the number of images per page, the page number, etc. even if they weren't loaded.</i> @@ -1789,6 +1789,16 @@ + + + + Theme + + + + + + @@ -2858,7 +2868,10 @@ checkAutocompletion - + + + + diff --git a/gui/src/tabs/favorites-tab.cpp b/gui/src/tabs/favorites-tab.cpp index 07080ff86..2208aab94 100644 --- a/gui/src/tabs/favorites-tab.cpp +++ b/gui/src/tabs/favorites-tab.cpp @@ -321,3 +321,17 @@ void favoritesTab::favoriteProperties(QString name) void favoritesTab::focusSearch() { } + + +void favoritesTab::changeEvent(QEvent *event) +{ + // Automatically retranslate this tab on language change + if (event->type() == QEvent::LanguageChange) + { + ui->retranslateUi(this); + setWindowTitle(tr("Favorites")); + emit titleChanged(this); + } + + QWidget::changeEvent(event); +} diff --git a/gui/src/tabs/favorites-tab.h b/gui/src/tabs/favorites-tab.h index 76e54ce72..3ada1e6a3 100644 --- a/gui/src/tabs/favorites-tab.h +++ b/gui/src/tabs/favorites-tab.h @@ -32,6 +32,9 @@ class favoritesTab : public searchTab QList loadSites() const override; void write(QJsonObject &json) const override; + protected: + void changeEvent(QEvent *event) override; + public slots: // Zooms void setTags(QString); diff --git a/gui/src/tabs/pool-tab.cpp b/gui/src/tabs/pool-tab.cpp index 6ba9ada04..faca05ad4 100644 --- a/gui/src/tabs/pool-tab.cpp +++ b/gui/src/tabs/pool-tab.cpp @@ -199,3 +199,15 @@ void poolTab::focusSearch() QString poolTab::tags() const { return m_search->toPlainText(); } + + +void poolTab::changeEvent(QEvent *event) +{ + // Automatically retranslate this tab on language change + if (event->type() == QEvent::LanguageChange) + { + ui->retranslateUi(this); + } + + QWidget::changeEvent(event); +} diff --git a/gui/src/tabs/pool-tab.h b/gui/src/tabs/pool-tab.h index 485f177ad..54172400a 100644 --- a/gui/src/tabs/pool-tab.h +++ b/gui/src/tabs/pool-tab.h @@ -32,6 +32,9 @@ class poolTab : public searchTab void write(QJsonObject &json) const override; bool read(const QJsonObject &json); + protected: + void changeEvent(QEvent *event) override; + public slots: // Zooms void setTags(QString); diff --git a/gui/src/tabs/tag-tab.cpp b/gui/src/tabs/tag-tab.cpp index 73fc9e505..f5a64ead5 100644 --- a/gui/src/tabs/tag-tab.cpp +++ b/gui/src/tabs/tag-tab.cpp @@ -234,3 +234,15 @@ void tagTab::focusSearch() QString tagTab::tags() const { return m_search->toPlainText(); } + + +void tagTab::changeEvent(QEvent *event) +{ + // Automatically retranslate this tab on language change + if (event->type() == QEvent::LanguageChange) + { + ui->retranslateUi(this); + } + + QWidget::changeEvent(event); +} diff --git a/gui/src/tabs/tag-tab.h b/gui/src/tabs/tag-tab.h index 20c4a54a2..f350d096d 100644 --- a/gui/src/tabs/tag-tab.h +++ b/gui/src/tabs/tag-tab.h @@ -36,6 +36,9 @@ class tagTab : public searchTab void write(QJsonObject &json) const override; bool read(const QJsonObject &json); + protected: + void changeEvent(QEvent *event) override; + public slots: // Zooms void setTags(QString); diff --git a/gui/src/theme-loader.cpp b/gui/src/theme-loader.cpp new file mode 100644 index 000000000..a15a68146 --- /dev/null +++ b/gui/src/theme-loader.cpp @@ -0,0 +1,26 @@ +#include "theme-loader.h" +#include +#include + + +ThemeLoader::ThemeLoader(QString path) + : m_path(path) +{} + +QStringList ThemeLoader::getAllThemes() const +{ + return QDir(m_path).entryList(QDir::Dirs | QDir::NoDotAndDotDot); +} + + +bool ThemeLoader::setTheme(QString name) +{ + QFile f(m_path + "/" + name + "/style.css"); + if (!f.open(QFile::ReadOnly | QFile::Text)) + return false; + + QString css = f.readAll(); + f.close(); + qApp->setStyleSheet(css); + return true; +} diff --git a/gui/src/theme-loader.h b/gui/src/theme-loader.h new file mode 100644 index 000000000..6953bde78 --- /dev/null +++ b/gui/src/theme-loader.h @@ -0,0 +1,19 @@ +#ifndef THEME_LOADER_H +#define THEME_LOADER_H + +#include +#include + + +class ThemeLoader +{ + public: + ThemeLoader(QString path); + QStringList getAllThemes() const; + bool setTheme(QString name); + + private: + QString m_path; +}; + +#endif // THEME_LOADER_H diff --git a/gui/src/ui/verticalscrollarea.cpp b/gui/src/ui/verticalscrollarea.cpp index 8e0b8dfd8..0b8dec1ef 100644 --- a/gui/src/ui/verticalscrollarea.cpp +++ b/gui/src/ui/verticalscrollarea.cpp @@ -35,7 +35,6 @@ void VerticalScrollArea::updateWidgetSize() maxWidth -= verticalScrollBar()->width(); widget()->setMaximumWidth(maxWidth); - if (!m_scrollEnabled) - widget()->setMaximumHeight(height()); + widget()->setMaximumHeight(m_scrollEnabled ? QWIDGETSIZE_MAX : height()); } } diff --git a/gui/src/updater/update-dialog.cpp b/gui/src/updater/update-dialog.cpp index e9673b213..eb1c8213a 100644 --- a/gui/src/updater/update-dialog.cpp +++ b/gui/src/updater/update-dialog.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "update-dialog.h" #include "ui_update-dialog.h" @@ -51,7 +52,12 @@ void UpdateDialog::checkForUpdatesDone(QString newVersion, bool available, QStri void UpdateDialog::accept() { - downloadUpdate(); + #ifdef Q_OS_WIN + downloadUpdate(); + #else + QDesktopServices::openUrl(m_updater.latestUrl()); + close(); + #endif } diff --git a/gui/src/updater/update-dialog.ui b/gui/src/updater/update-dialog.ui index fbc34ec5b..1897ac3f5 100644 --- a/gui/src/updater/update-dialog.ui +++ b/gui/src/updater/update-dialog.ui @@ -61,6 +61,9 @@ { changelog } + + true + diff --git a/gui/src/utils/md5-fix/md5-fix.cpp b/gui/src/utils/md5-fix/md5-fix.cpp index 23295c789..7a25a2311 100644 --- a/gui/src/utils/md5-fix/md5-fix.cpp +++ b/gui/src/utils/md5-fix/md5-fix.cpp @@ -75,16 +75,6 @@ void md5Fix::on_buttonStart_clicked() ui->progressBar->setMaximum(files.size()); ui->progressBar->show(); - // Open MD5 file - QFile f(m_profile->getPath() + "/md5s.txt"); - if (!f.open(QFile::WriteOnly | QFile::Truncate)) - { - error(this, tr("Unable to open the MD5 file.")); - ui->progressBar->hide(); - ui->buttonStart->setEnabled(true); - return; - } - // Parse all files for (QStringPair file : files) { @@ -118,10 +108,9 @@ void md5Fix::on_buttonStart_clicked() } } if (!md5.isEmpty()) - { f.write(QString(md5 + file.second + "\n").toUtf8()); } + { m_profile->addMd5(md5, file.second); } ui->progressBar->setValue(ui->progressBar->value() + 1); } - f.close(); } // Hide progresss bar diff --git a/gui/src/viewer/zoomwindow.cpp b/gui/src/viewer/zoomwindow.cpp index 5f90af58c..065c9cc7e 100644 --- a/gui/src/viewer/zoomwindow.cpp +++ b/gui/src/viewer/zoomwindow.cpp @@ -192,8 +192,11 @@ zoomWindow::~zoomWindow() m_labelTagsLeft->deleteLater(); m_detailsWindow->deleteLater(); + // Quit threads + m_imageLoaderQueueThread.quit(); + m_imageLoaderThread.wait(1000); m_imageLoaderThread.quit(); - m_imageLoaderThread.wait(100); + m_imageLoaderThread.wait(1000); delete ui; } @@ -486,7 +489,10 @@ void zoomWindow::display(const QPixmap &pix, int size) update(!m_finished); if (!pix.size().isEmpty() && m_image->size().isEmpty()) - { m_image->setSize(pix.size()); } + { + m_image->setSize(pix.size()); + updateWindowTitle(); + } if (m_isFullscreen && m_fullScreen != nullptr && m_fullScreen->isVisible()) { m_fullScreen->setImage(m_displayImage.scaled(QApplication::desktop()->screenGeometry().size(), Qt::KeepAspectRatio, Qt::SmoothTransformation)); } @@ -509,14 +515,12 @@ void zoomWindow::replyFinishedDetails() } QString path1 = m_settings->value("Save/path").toString().replace("\\", "/"); - QStringList pth1s = m_image->path(m_settings->value("Save/filename").toString(), path1); + QStringList pth1s = m_image->path(m_settings->value("Save/filename").toString(), path1, 0, true, false, true, true, true); QString source1; bool file1notexists = false; for (QString pth1 : pth1s) { - if (path1.right(1) == "/") - { path1 = path1.left(path1.length()-1); } - QFile file(path1+"/"+pth1); + QFile file(pth1); if (file.exists()) source1 = file.fileName(); else @@ -524,22 +528,22 @@ void zoomWindow::replyFinishedDetails() } QString path2 = m_settings->value("Save/path_favorites").toString().replace("\\", "/"); - QStringList pth2s = m_image->path(m_settings->value("Save/filename_favorites").toString(), path2); + QStringList pth2s = m_image->path(m_settings->value("Save/filename_favorites").toString(), path2, 0, true, false, true, true, true); QString source2; bool file2notexists = false; for (QString pth2 : pth2s) { - if (path2.right(1) == "/") - { path2 = path1.left(path2.length()-1); } - QFile file(path2+"/"+pth2); + QFile file(pth2); if (file.exists()) source2 = file.fileName(); else file2notexists = true; } + QString md5Exists = m_profile->md5Exists(m_image->md5()); + // If the file already exists, we directly display it - if (!file1notexists || !file2notexists) + if (!md5Exists.isEmpty() || !file1notexists || !file2notexists) { if (!file1notexists) { @@ -551,7 +555,7 @@ void zoomWindow::replyFinishedDetails() ui->buttonSaveFav->setText(tr("File already exists (fav)")); ui->buttonSaveNQuitFav->setText(tr("Close (fav)")); } - m_source = !file1notexists ? source1 : source2; + m_source = !md5Exists.isEmpty() ? md5Exists : (!file1notexists ? source1 : source2); m_imagePath = m_source; log(QString("Image loaded from the file %1").arg(m_source)); @@ -597,6 +601,7 @@ void zoomWindow::replyFinishedZoom(QNetworkReply::NetworkError err, QString erro m_url = m_image->url(); m_loadedImage = true; + updateWindowTitle(); pendingUpdate(); draw(); } @@ -1130,7 +1135,7 @@ void zoomWindow::updateWindowTitle() title = tr("Image"); else title = QString(tr("Image") + " (%1)").arg(infos.join(", ")); - setWindowTitle(QString("%1 - %2 (%3/%4)").arg(title, m_image->parentSite()->name(), QString::number(m_images.indexOf(m_image)), QString::number(m_images.count()))); + setWindowTitle(QString("%1 - %2 (%3/%4)").arg(title, m_image->parentSite()->name(), QString::number(m_images.indexOf(m_image) + 1), QString::number(m_images.count()))); } void zoomWindow::next() diff --git a/languages/ChineseSimplified.ts b/languages/ChineseSimplified.ts index d72e0b63e..6262672fc 100644 --- a/languages/ChineseSimplified.ts +++ b/languages/ChineseSimplified.ts @@ -1342,11 +1342,6 @@ Batch download 下载队列 - - - %p% - - Details diff --git a/languages/English.ts b/languages/English.ts index c1d18340f..43055549c 100644 --- a/languages/English.ts +++ b/languages/English.ts @@ -1341,11 +1341,6 @@ Batch download - - - %p% - - Details diff --git a/languages/French.ts b/languages/French.ts index 2c76456ac..43f598dc1 100644 --- a/languages/French.ts +++ b/languages/French.ts @@ -1466,9 +1466,8 @@ Téléchargement groupé - %p% - %p% + %p% diff --git a/languages/Russian.ts b/languages/Russian.ts index c31556c64..e6165de4b 100644 --- a/languages/Russian.ts +++ b/languages/Russian.ts @@ -270,7 +270,7 @@ Empty folders fixer - Фиксер пустых папок + Фиксер пустых папок @@ -290,7 +290,7 @@ No empty folder found. - + Пустых папок не найдено. @@ -300,7 +300,7 @@ Empty folders fixer - Фиксер пустых папок + Фиксер пустых папок @@ -320,15 +320,15 @@ No folder selected. - + Папка не выбрана. You are about to delete %n folder. Are you sure you want to continue? + Вы собираетесь удалить %n папку. Вы уверены что хотите продолжить? + Вы собираетесь удалить %n папки. Вы уверены что хотите продолжить? Вы собираетесь удалить %n папок. Вы уверены что хотите продолжить? - - @@ -380,32 +380,32 @@ image is not "%1" - изображение не "%1" + изображение не "%1" image is "%1" - изображение "%1" + изображение "%1" image's source does not starts with "%1" - источник изображения не начинается с "%1" + источник изображения не начинается с "%1" image's source starts with "%1" - источник изображения начинается с "%1" + источник изображения начинается с "%1" image does not contains "%1" - изображение не содержит "%1" + изображение не содержит "%1" image contains "%1" - изображение содержит "%1" + изображение содержит "%1" @@ -421,7 +421,7 @@ No source of this site is compatible with pools. - Ни один из источников сайта не совместим с объединением. + Ни один из источников сайта не совместим с пулами. @@ -434,52 +434,52 @@ Displays version information. - Отображает информацию о версии. + Отображает информацию о версии. Displays this help. - Показывает помощь. + Показывает помощь. Unknown option '%1'. - Неизвестный параметр: %1. + Неизвестный параметр: %1. Unknown options: %1. - Неизвестные параметры: %1. + Неизвестные параметры: %1. Missing value after '%1'. - Отсутствует значение после '%1'. + Отсутствует значение после '%1'. Unexpected value after '%1'. - Неожиданное значение после '%1'. + Неожиданное значение после '%1'. [options] - [параметры] + [параметры] Usage: %1 - Использование: %1 + Использование: %1 Options: - Параметры: + Параметры: Arguments: - Аргументы: + Аргументы: @@ -511,7 +511,7 @@ Error in Javascript evaluation:<br/> - Ошибка в определении Javascript: <br/> + Ошибка в определении Javascript: <br/> @@ -558,40 +558,40 @@ B - + Б KB - + КБ MB - + МБ GB - + ГБ KiB - + КиБ MiB - + МиБ GiB - + ГиБ @@ -1184,7 +1184,7 @@ Page limit - + Лимит страниц @@ -1318,27 +1318,27 @@ Updater - + Обновление программы A new version is available.<br/>Do you want to update now? - + Доступна новая версия.<br/>Хотите обновить Grabber прямо сейчас? See changelog - + Список изменений Version <b>%1</b> - + Версия <b>%1</b> To go on with the update, the program must be closed. Do you want to close now? - + Для продолжения обновления нужно закрыть Grabber. Закрыть сейчас? @@ -1348,11 +1348,6 @@ Batch download Массовая загрузка - - - %p% - - Details @@ -2173,7 +2168,7 @@ MD5 list fixer - Фиксер списка MD5 сумм + Фиксер списка MD5 сумм @@ -2207,7 +2202,7 @@ It seems that the application was not properly closed for its last use. Do you want to start without restoring your last session? - Видимо приложение в прошлый раз было закрыто некорректно. Хотите ли вы начать новый сеанс? + Видимо приложение в прошлый раз было закрыто некорректно. Хотите ли вы начать новый сеанс? @@ -2227,7 +2222,7 @@ This source is not valid. - + Этот источник не действителен. @@ -2551,7 +2546,7 @@ Please solve the issue before resuming the download. 1 - 1 + 1 @@ -2607,7 +2602,7 @@ Please solve the issue before resuming the download. Species tags - + Теги вида/расы @@ -2622,7 +2617,7 @@ Please solve the issue before resuming the download. Image window - + Окно превью @@ -2765,32 +2760,32 @@ Please solve the issue before resuming the download. Check for updates - + Проверять обновления Every time - + Всегда Once a day - + Раз в день Once a week - + Раз в неделю Once a month - + Раз в месяц Never - + Никогда @@ -2991,7 +2986,7 @@ Please solve the issue before resuming the download. Get extension from file header - + Получать расширение из заголовка файла @@ -3120,7 +3115,7 @@ Please solve the issue before resuming the download. Use a scroll area for the results - + Режим показа результатов поиска с полоской прокрутки @@ -3292,7 +3287,7 @@ Please solve the issue before resuming the download. Enable MD5 search field - Включить отдельное поле для поиска по MD5 + Включить отдельное поле для поиска по MD5 @@ -3348,32 +3343,32 @@ Please solve the issue before resuming the download. Preloading - + Предзагрузка Slideshow - + Слайдшоу s - с + с Middle click to close window - + Зарывать окно средней клавишей мыши Enable scroll wheel navigation - + Включить навигацию колёсиком мыши Image position - + Расположение изображения @@ -3383,31 +3378,31 @@ Please solve the issue before resuming the download. Center - + По центру Bottom - + Снизу Right - + Справа Animation position - + Расположение анимации Video position - + Расположение видео @@ -3431,7 +3426,7 @@ Please solve the issue before resuming the download. Species - + Вид/Раса @@ -3499,7 +3494,7 @@ Please solve the issue before resuming the download. Use system-wide proxy settings - + Использовать системные настройки прокси @@ -3585,7 +3580,7 @@ Please solve the issue before resuming the download. New pool tab - Новая вкладка + Новая вкладка пула @@ -3634,7 +3629,7 @@ Please solve the issue before resuming the download. Search - Поиск + Поиск @@ -3773,7 +3768,7 @@ Please solve the issue before resuming the download. An update for this source is available, but for another version of the program. - Для этого источника доступно обновление, но для другой версии программы. + Для этого источника доступно обновление, но для другой версии программы. @@ -3967,15 +3962,15 @@ Please solve the issue before resuming the download. Safe - Безопасно + Безопасно Questionable - Под вопросом + Под вопросом Explicit - Откровенный + Откровенный @@ -3990,7 +3985,7 @@ Please solve the issue before resuming the download. Error creating folder. %1 - Ошибка при создании папки. + Ошибка при создании папки. %1 @@ -4070,40 +4065,35 @@ Please solve the issue before resuming the download. An unexpected error occured loading the image (%1). %2 - Неожиданная ошибка во время загрузки изображения (%1). + Неожиданная ошибка во время загрузки изображения (%1). %2 Copy file - + Копировать файл Copy data - - - - - Error creating folder. -%1 - + Копировать данные Copy tag - + Копировать тег Copy all tags - + Копировать все теги An unexpected error occured loading the image (%1 - %2). %3 - + Неожиданная ошибка во время загрузки изображения (%1 - %2). +%3 diff --git a/languages/Spanish.ts b/languages/Spanish.ts new file mode 100644 index 000000000..63e4e0d62 --- /dev/null +++ b/languages/Spanish.ts @@ -0,0 +1,4122 @@ + + + + + AboutWindow + + + About Grabber + Acerca de Grabber + + + + <html><head/><body><p>Grabber is a Bionus' creation.<br/>Please visit the <a href="https://github.com/Bionus/imgbrd-grabber"><span style=" text-decoration: underline; color:#0000ff;">site</span></a> to stay updated, or retrieve site or translations files.</p></body></html> + <html><head/><body><p>Grabber es una creación de Bionus.<br/>Por favor visite la <a href="https://github.com/Bionus/imgbrd-grabber"><span style=" text-decoration: underline; color:#0000ff;">página web</span></a> para mantenerse actualizado.</p></body></html> + + + + Special thanks to YMI for his help looking and solving bugs, as well as suggesting new features for the program. + Agradecimientos especiales a YMI por buscar y resolver errores, también por sugerir nuevas características para el programa. + + + + Russian translation byr Николай Тихонов. + Traducción al español por Eddy Castillo. + + + + Grabber is up to date + Grabber está actualizado + + + + A new version is available: %1 + Hay una nueva versión disponible: %1 + + + + AddGroupWindow + + + Add group + Añadir grupo + + + + Site + Sitio web + + + + Tags + Etiquetas + + + + Page + Página + + + + Images per page + Imágenes por página + + + + Images limit + Límite de imágenes + + + + Download images with blacklisted tags + Descargar imágenes con etiquetas en la lista negra + + + + AddUniqueWindow + + + Add an image + Añadir imagen + + + + Add + Añadir + + + + Site + Sitio web + + + + Id + Id + + + + Md5 + MD5 + + + + Filename + Nombre del archivo + + + + Folder + Carpeta + + + + Browse + Navegar + + + + Choose a save folder + Elija una carpeta para guardar + + + + No image found. + No se encontró ninguna imagen. + + + + BlacklistFix1 + + + + Blacklist fixer + Arreglar lista negra + + + + Folder + Carpeta + + + + Force md5 calculation + Forzar el cálculo de MD5 + + + + Get md5 in filename + Usar MD5 en el nombre del archivo + + + + Filename + Nombre del archivo + + + + Blacklist + Lista negra + + + + Source + Fuente + + + + %v/%m + %v/%m + + + + Continue + Continuar + + + + Cancel + Cancelar + + + + This directory does not exist. + Esta carpeta no existe. + + + + If you want to get the MD5 from the filename, you have to include the %md5% token in it. + Si quiere usar el MD5 en el nombre del archivo, debe incluir el identificador %md5% en él. + + + + You are about to download information from %n image(s). Are you sure you want to continue? + + Está a punto de descargar información de %n imagen. ¿Desea continuar? + Está a punto de descargar información de %n imágenes. ¿Desea continuar? + + + + + BlacklistFix2 + + + Blacklist fixer + Arreglar lista negra + + + + Choose images to delete in the list below. + Elija las imágenes a borrar de la lista de abajo. + + + + Thumbnail + Miniatura + + + + Name + Nombre + + + + Tag + Etiqueta + + + + Select found images + Seleccionar las imágenes encontradas + + + + Ok + Aceptar + + + + Cancel + Cancelar + + + + CustomWindow + + + Add a custom token + Añadir un identificador personalizado + + + + <i>Separate tags by spaces or line breaks</i> + Separe las etiquetas con espacios o saltos de linea + + + + Name + Nombre + + + + Tags + Etiquetas + + + + EmptyDirsFix1 + + + + Empty folders fixer + Arreglar carpetas vacías + + + + Folder + Carpeta + + + + Continue + Continuar + + + + Cancel + Cancelar + + + + No empty folder found. + No se encontraron carpetas vacías. + + + + EmptyDirsFix2 + + + + + Empty folders fixer + Arreglar carpetas vacías + + + + Choose folders to delete in the list below. + Elija las carpetas a eliminar de la lista de abajo. + + + + Delete + Eliminar + + + + Cancel + Cancelar + + + + No folder selected. + Ninguna carpeta seleccionada. + + + + You are about to delete %n folder. Are you sure you want to continue? + + Está a punto de borrar %n carpeta. ¿Desea continuar? + Está a punto de borrar %n carpetas. ¿Desea continuar? + + + + + FilenameWindow + + + Filenaming + Renombrado + + + + Classic filenaming + Renombrado clásico + + + + Javascript filenaming + Renombrado por javascript + + + + Warning + Advertencia + + + + You script contains error, are you sure you want to save it? + Su script contiene errores, ¿desea continuar? + + + + Image + + + unknown type "%1" (available types: "%2") + Tipo desconocido "%1" (tipos disponibles: "%2") + + + + image's %1 does not match + %1 de la imagen no coincide + + + + image's %1 match + %1 de la imagen coincide + + + + image is not "%1" + la imagen no es "%1" + + + + image is "%1" + la imagen no es "%1" + + + + image's source does not starts with "%1" + la fuente de la imagen no comienza con "%1" + + + + image's source starts with "%1" + la fuente de la imagen no comienza con "%1" + + + + image does not contains "%1" + la imagen no contiene "%1" + + + + image contains "%1" + la imagen contiene "%1" + + + + Page + + + No valid source of the site returned result. + No se obtuvo resultados de ninguna de las fuentes del sitio web. + + + + PageApi + + + No source of this site is compatible with pools. + Ninguna de las fuentes de este sitio web soporta colecciones. + + + + Tag search is impossible with the chosen source (%1). + Es imposible buscar etiquetas con la fuente elegida (%1). + + + + QCommandLineParser + + + Displays version information. + Muestra información de la versión. + + + + Displays this help. + Muestra esta ayuda. + + + + Unknown option '%1'. + Opción desconocida '%1'. + + + + Unknown options: %1. + Opciones desconocidas: %1. + + + + Missing value after '%1'. + Falta un valor después de '%1'. + + + + Unexpected value after '%1'. + Valor inesperado después de '%1'. + + + + [options] + [opciones] + + + + Usage: %1 + Uso: %1 + + + + Options: + Opciones: + + + + Arguments: + Argumentos: + + + + QObject + + + Error + Error + + + + <b>Error:</b> %1 + <b>Error:</b> %1 + + + + <b>Warning:</b> %1 + <b>Advertencia:</b> %1 + + + + <b>Notice:</b> %1 + <b>Aviso:</b> %1 + + + + MM-dd-yyyy HH.mm + MM-dd-yyyy HH.mm + + + + Filename must not be empty! + ¡El nombre de archivo no debe estar vacío! + + + + Can't validate Javascript expressions. + No se pueden validar las expresiones Javascript. + + + + Your filename doesn't ends by an extension, symbolized by %ext%! You may not be able to open saved files. + ¡El nombre de archivo no termina con una extensión, identificada con %ext%! Es posible que no pueda abrir los archivos guardados. + + + + Your filename is not unique to each image and an image may overwrite a previous one at saving! You should use%md5%, which is unique to each image, to avoid this inconvenience. + ¡El nombre de archivo no es único para cada imagen y se pueden sobreescribir al guardarse! Debería usar %md5%, lo cual es único para cada imagen para evitar este inconveniente. + + + + The %%1% token does not exist and will not be replaced. + El identificador %%1% no existe y no será reemplazado. + + + + Your format contains characters forbidden on Windows! Forbidden characters: * ? " : < > | + ¡El formato contiene caracteres prohibidos en Windows! Caracteres prohibidos: * ? " : < > | + + + + You have chosen to use the %id% token. Know that it is only unique for a selected site. The same ID can identify different images depending on the site. + Está utilizando el identificador %id%. Este solo es único para el sitio web seleccionado. La misma ID puede identificar imágenes diferentes dependiendo del sitio web. + + + + Valid filename! + ¡El nombre del archivo no es válido! + + + + + + B + B + + + + + KB + KB + + + + + MB + MB + + + + + GB + GB + + + + KiB + KiB + + + + MiB + MiB + + + + GiB + GiB + + + + RenameExisting1 + + + + Rename existing images + Renombrar imágenes existentes + + + + Folder + Carpeta + + + + Force md5 calculation + Forzar el cálculo de MD5 + + + + Get md5 in filename + Usar MD5 en el nombre del archivo + + + + Origin filename + Nombre del archivo original + + + + Destintation filename + Nombre del archivo destino + + + + Source + Fuente + + + + %v/%m + %v/%m + + + + Continue + Continuar + + + + Cancel + Cancelar + + + + This folder does not exist. + Esta carpeta no existe. + + + + If you want to get the MD5 from the filename, you have to include the %md5% token in it. + Si quiere usar el MD5 en el nombre del archivo, debe incluir el identificador %md5% en él. + + + + You are about to download information from %n image(s). Are you sure you want to continue? + + Está a punto de descargar información de %n imagen. ¿Desea continuar? + Está a punto de descargar información de %n imágenes. ¿Desea continuar? + + + + + RenameExisting2 + + + Rename existing images + Renombrar imágenes existentes + + + + The following images will be renamed. + Se renombraran las siguientes imágenes. + + + + Thumbnail + Vista previa + + + + Original + Original + + + + Destination + Destino + + + + Ok + Aceptar + + + + Cancel + Cancelar + + + + SearchWindow + + + Search + Buscar + + + + Sort by + Ordenar por + + + + ID (ascending) + ID (ascendente) + + + + ID (descending) + ID (descendente) + + + + Score (ascending) + Puntuación (ascendente) + + + + Score (descending) + Puntuación (descendente) + + + + Megapixels (ascending) + Megapixeles (ascendente) + + + + Megapixels (descending) + Megapixeles (descendente) + + + + Filesize + Tamaño del archivo + + + + Landscape orientation + Orientación horizontal + + + + Portrait orientation + Orientación vertical + + + + Favorites count + Número de favoritos + + + + Rank + Rango + + + + Rating + Clasificación + + + + Safe + Seguro + + + + Safe (no) + No seguro + + + + Questionable + Dudoso + + + + Questionable (no) + No dudoso + + + + Explicit + Explícito + + + + Explicit (no) + No explícito + + + + Status + Estado + + + + Deleted + Eliminado + + + + Active + Activo + + + + Flagged + Marcado + + + + Pending + Pendiente + + + + All + Todos + + + + Date + Fecha + + + + Calendar + Calendario + + + + <i>Remember that some imageboards forbid the usage of more than a certain amount of tags for non-premium members. + <i>Recuerde que algunos imageboards limitan el uso a cierto número de etiquetas para los usuarios sin membresía premium. + + + + Image + Imagen + + + + Tags + Etiquetas + + + + Choose a date + Elija una fecha + + + + Search an image + Buscar una imagen + + + + Site + + + success + éxito + + + + failure + error + + + + SiteWindow + + + Add a site + Añadir un sitio + + + + Type + Tipo + + + + Guess + Invitado + + + + Url + URL + + + + %v/%m + %v/%m + + + + Unable to guess site's type. Are you sure about the url? + No se pudo encontrar el tipo del sitio web. ¿La URL es correcta? + + + + SourcesSettingsWindow + + + Site options + Opciones de sitio web + + + + General + General + + + + Referer (default) + Referente (predeterminado) + + + + + + None + Ninguno + + + + + + Site + Sitio web + + + + + + Page + Página + + + + + + Image + Imagen + + + + Referer (preview) + Referente (vista previa) + + + + + Default + Predeterminado + + + + Referer (image) + Referente (imagen) + + + + Details + Detalles + + + + + + Name + Nombre + + + + Ignore (always) + Ignorar (siempre) + + + + Ignore (page 1) + Ignorar (página 1) + + + + Use a secure connection (https) + Usar conexión segura (https) + + + + Download + Descarga + + + + Max simultaneous downloads + Descargas simultaneas máximas + + + + Images per page + Imágenes por página + + + + Interval (thumbnail) + Intervalo (miniatura) + + + + Interval (image) + Intervalo (imagen) + + + + Interval (page) + Intervalo (página) + + + + Interval (details) + Intervalo (detalles) + + + + Interval (error) + Intervalo (error) + + + + + + + + s + s + + + + Sources + Fuentes + + + + Source 1 + Fuente 1 + + + + + + + XML + XML + + + + + + + JSON + JSON + + + + + + + Regex + Expresión regular + + + + + + + RSS + RSS + + + + Source 2 + Fuente 2 + + + + Source 3 + Fuente 3 + + + + Source 4 + Fuente 4 + + + + Use default sources + Usar fuentes predeterminadas + + + + Credentials + Identificación + + + + + Username + Usuario + + + + + Password + Contraseña + + + + Hash password + Cifrar contraseña + + + + + Test + Prueba + + + + Login + Inicio de sesión + + + + Through url + A través de URL + + + + Method + Método + + + + GET + GET + + + + POST + POST + + + + URL + URL + + + + Cookie + Cookie + + + + Page limit + Límite de páginas + + + + Cookies + Cookies + + + + + Value + Valor + + + + + Add + Añadir + + + + Headers + Cabeceras + + + + Delete + Eliminar + + + + Cancel + Cancelar + + + + Confirm + Aceptar + + + + Hash a password + Cifrar una contraseña + + + + Please enter your password below.<br/>It will then be hashed using the format "%1". + Por favor introduzca su contraseña abajo. </br>Se cifrará usando el formato "%1". + + + + Delete a site + Eliminar un sitio web + + + + Are you sure you want to delete the site %1? + ¿Seguro que quiere eliminar el sitio web %1? + + + + + Success! + ¡Éxito! + + + + + Failure + Error + + + + + Unable to test + No es posible hacer la prueba + + + + TextEdit + + + Favorites + Favoritos + + + + + Remove + Eliminar + + + + + Add + Añadir + + + + Kept for later + Guardar para más tarde + + + + Ratings + Clasificación + + + + Sortings + Ordenar por + + + + Copy + Copiar + + + + Cut + Cortar + + + + Paste + Pegar + + + + UpdateDialog + + + + Updater + Actualizador + + + + A new version is available.<br/>Do you want to update now? + Hay una nueva versión disponible.</br>¿Desea actualizar ahora? + + + + See changelog + Ver los cambios + + + + Version <b>%1</b> + Versión <b>%1</b> + + + + To go on with the update, the program must be closed. Do you want to close now? + Para continuar la actualización, el programa debe cerrarse. ¿Desea cerrar ahora? + + + + batchWindow + + + Batch download + Descarga en lotes + + + + Details + Detalles + + + + + Pause + Pausa + + + + Skip + Ignorar + + + + + Cancel + Cancelar + + + + Batch + Lote + + + + Url + URL + + + + Filesize + Tamaño + + + + Speed + Velocidad + + + + Progress + Progreso + + + + Follow downloaded images + Seguir las imágenes descargadas + + + + Copy links to clipboard + Copiar enlaces al portapapeles + + + + When the download is finished + Al terminar la descarga + + + + Do nothing + No hacer nada + + + + Close window + Cerrar la ventana + + + + Open CD tray + Abrir la bandeja de CD + + + + Open destination folder + Abrir carpeta de destino + + + + Play a sound + Reproducir un sonido + + + + Shutdown + Apagar + + + + Remove + Eliminar + + + + Paused + Pausado + + + + Resume + Continuar + + + + + h 'h' m 'm' s 's' + h 'h' m 'm' s 's' + + + + + m 'm' s 's' + m 'm' s 's' + + + + + s 's' + s 's' + + + + <b>Average speed:</b> %1 %2<br/><br/><b>Elapsed time:</b> %3<br/><b>Remaining time:</b> %4 + <b>Velocidad promedio:</b> %1 %2<br/><br/><b>Tiempo transcurrido:</b> %3<br/><b>Tiempo faltante:</b> %4 + + + + Close + Cerrar + + + + conditionWindow + + + Add a custom token + Añadir un identificador personalizado + + + + <i>You can either use a token or tags as a condition.</i> + <i>Puede añadir un identificador personalizado o etiquetas como condición.</i> + + + + Condition + Condición + + + + Filename + Nombre del archivo + + + + Folder + Carpeta + + + + <i>Leave empty to use the default folder.</i> + <i>Deje vacío el espacio para usar la carpeta predeterminada</i> + + + + <i>Leave empty to use the default filename.</i> + <i>Deje el espacio vacío para usar el nombre de archivo predeterminado.</i> + + + + detailsWindow + + + Details + Detalles + + + + <b>Tags</b> + <b>Etiquetas</b> + + + + + + + + + + + + + + + + + + + + + <i>Unknown</i> + <i>Desconocido</i> + + + + <b>ID</b> + <b>ID</b> + + + + <b>Rating</b> + <b>Clasificación</b> + + + + <b>Score</b> + <b>Puntaje</b> + + + + <b>Author</b> + <b>Autor</b> + + + + <b>Date<.b> + <b>Fecha</b> + + + + <b>Size</b> + <b>Dimensiones</b> + + + + <b>Filesize</b> + <b>Tamaño</b> + + + + <b>MD5</b> + <b>MD5</b> + + + + <b>URL</b> + <b>URL</b> + + + + <b>Source</b> + <b>Fuente</b> + + + + <b>Sample</b> + <b>Muestra</b> + + + + <b>Thumbnail</b> + <b>Miniatura</b> + + + + <b>Page</b> + <b>Página</b> + + + + <b>Parent</b> + <b>Padre</b> + + + + <b>Children</b> + <b>Hijo</b> + + + + <b>Comments</b> + <b>Comentarios</b> + + + + <b>Notes</b> + <b>Notas</b> + + + + Close + Cerrar + + + + 'the' MM/dd/yyyy 'at' hh:mm + 'el' MM/dd/yyyy '-' hh:mm + + + + + + yes + + + + + + + + no + no + + + + yes (#%1) + sí (#%1) + + + + favoriteWindow + + + Edit a favorite + Editar favorito + + + + Tag corresponding to the favorite. It is not often useful to change it. + Etiqueta correspondiente al favorito. Usualmente no sirve cambiarlo. + + + + Tag + Etiqueta + + + + Between 0 and 100, the note can be used to sort the favorites in preference order. + Entre 0 y 100, la nota se puede utilizar para ordenar los favoritos en orden de preferencia. + + + + Note + Nota + + + + % + % + + + + Last time you clicked on "Mark as viewed". + La última vez que dio clic sobre "Marcar como visto". + + + + Last view + Última vista + + + + yyyy/MM/dd HH:mm:ss + yyyy/MM/dd HH:mm:ss + + + + Image whose icon will be displayed in the favorites list. + Imagen cuyo ícono se mostrará en la lista de favoritos. + + + + Image + Imagen + + + + Browse + Navegar + + + + Delete + Eliminar + + + + Choose an image + Elegir una imagen + + + + favoritesTab + + + Favorites + Favoritos + + + + Sort by + Ordenar por + + + + Name + Nombre + + + + Note + Nota + + + + Last view + Última vista + + + + Ascending + Ascendente + + + + Descending + Descendente + + + + O&k + Acepta&r + + + + Number of columns + Número de columnas + + + + Post-filtering + Después del filtro + + + + Images per page + Imágenes por página + + + + Back + Atrás + + + + Mark as &viewed + Marcar como &visto + + + + Get &selected + Obtener &seleccionado + + + + Get this &page + Obtener esta &página + + + + Get &all + Obtener &todo + + + + S&ources + &Fuentes + + + + Merge results + Combinar resultados + + + + Mark all as vie&wed + Marcar &todo como visto + + + + MM/dd/yyyy + MM/dd/yyyy + + + + <b>Name:</b> %1<br/><b>Note:</b> %2 %%<br/><b>Last view:</b> %3 + <b>Nombre:</b> %1<br/><b>Nota:</b> %2 %%<br/><b>Última vista:</b> %3 + + + + + No result since the %1 + Ningún resultado desde %1 + + + + + MM/dd/yyyy 'at' hh:mm + MM/dd/yyyy '-' hh:mm + + + + Mark as viewed + Marcar como visto + + + + Are you sure you want to mark all your favorites as viewed? + ¿Seguro que quiere marcar todos sus favoritos como vistos? + + + + mainWindow + + + Downloads + Descargas + + + + Groups (0/0) + Grupos (0/0) + + + + + + + Tags + Etiquetas + + + + Source + Fuente + + + + Page + Página + + + + Images per page + Imágenes por página + + + + Images limit + Límte de imágenes + + + + + Filename + Nombre del archivo + + + + + + Folder + Carpeta + + + + Get blacklisted + Añadir a la lista negra + + + + Progress + Progreso + + + + + Add + Añadir + + + + Single images + Imágenes individuales + + + + Id + Id + + + + Md5 + MD5 + + + + Rating + Clasificación + + + + Url + URL + + + + Date + Fecha + + + + Site + Sitio web + + + + Delete all + Eliminar todo + + + + Delete selected + Eliminar seleccionado + + + + Download + Descargar + + + + Download selected + Descargar seleccionado + + + + Move down + Mover hacia abajo + + + + Load + Cargar + + + + + Save + Guardar + + + + Move up + Mover hacia arriba + + + + Log + Registros + + + + Clear log + Limpiar registros + + + + Open log + Abrir registros + + + + Help + Ayuda + + + + Tools + Herramientas + + + + View + Ver + + + + File + Archivo + + + + + + Kept for later + Guardado para más tarde + + + + + + Favorites + Favoritos + + + + + Name + Nombre + + + + Note + Nota + + + + Last viewed + Último visto + + + + Ascending + Ascendente + + + + Descending + Descendente + + + + Wiki + Wiki + + + + Destination + Destino + + + + Reset + Reiniciar + + + + Options + Opciones + + + + Ctrl+P + Ctrl+P + + + + Open destination folder + Abrir carpeta de destino + + + + Quit + Cerrar + + + + About Grabber + Acerca de Grabber + + + + About Qt + Acerca de Qt + + + + New tab + Nueva pestaña + + + + Close tab + Cerrar pestaña + + + + Blacklist fixer + Arreglar lista negra + + + + Empty folders fixer + Arreglar carpetas vacías + + + + New pool tab + Nueva pestaña de colecciones + + + + MD5 list fixer + Arreglar lista MD5 + + + + Open options folder + Abrir carpeta de opciones + + + + Project website + Sitio web del proyecto + + + + Report an issue + Reporta un problema + + + + Rename existing images + Renombrar imágenes existentes + + + + No source found + No se encontró ninguna fuente + + + + No source found. Do you have a configuration problem? Try to reinstall the program. + No se encontró ninguna fuente. ¿Será algún problema de configuración? Intente reinstalando el programa. + + + + It seems that the application was not properly closed for its last use. Do you want to restore your last session? + Parece que la aplicación no se cerró correctamente la última vez. ¿Desea restaurar la sesión anterior? + + + + The Mozilla Firefox addon "Danbooru Downloader" has been detected on your system. Do you want to load its preferences? + Se detectó el complemento de Firefox "Danbooru Downloader" en el sistema. ¿Desea cargar su configuración? + + + + Groups (%1/%2) + Grupos (%1/%2) + + + + This source is not valid. + Esta fuente no es válida. + + + + The image per page value must be greater or equal to 1. + El valor de imágenes por página debe ser mayor o igual que 1. + + + + The image limit must be greater or equal to 0. + El límite de imágenes debe ser mayor o igual que 0. + + + + MM/dd/yyyy + MM/dd/yyyy + + + + <b>Name:</b> %1<br/><b>Note:</b> %2 %%<br/><b>Last view:</b> %3 + <b>Nombre:</b> %1<br/><b>Nota:</b> %2 %%<br/><b>Última vista:</b> %3 + + + + Are you sure you want to quit? + ¿Seguro que desea salir de la aplicación? + + + + + Don't keep for later + No guardar para más tarde + + + + You did not specify a save folder! + ¡No se especificó una carpeta para guardar! + + + + You did not specify a filename! + ¡No se especificó un nombre de archivo! + + + + Logging in, please wait... + Iniciando sesión, por favor espere... + + + + Downloading pages, please wait... + Descargando páginas, por favor espere... + + + + All images' urls have been received (%n image(s)). + + Se recibieron todos los URLs de las imágenes (%n imagen). + Se recibieron todos los URLs de las imágenes (%n imágenes). + + + + + Preparing images, please wait... + Preparando las imágenes, por favor espere... + + + + Downloading images... + Descargando imágenes... + + + + An error occured saving the image. +%1 +%2 +Please solve the issue before resuming the download. + Ha ocurrido un error al guardar la imagen. +%1 +%2 +Por favor, resuelva este problema antes de continuar las descarga. + + + + Error + Error + + + + + Getting images + Obteniendo las imágenes + + + + %n file(s) downloaded successfully. + + %n archivo descargado correctamente. + %n archivos descargados correctamente. + + + + + %n file(s) ignored. + + %n archivo ignorado. + %n archivos ignorados. + + + + + %n file(s) already existing. + + %n archivo ya existe. + %n archivos ya existen. + + + + + %n file(s) not found on the server. + + %n archivo no se encontró en el servidor. + %n archivos no se encontraron en el servidor. + + + + + %n file(s) skipped. + + %n archivo ignorado. + %n archivos ignorados. + + + + + %n error(s). + + %n error. + %n errores. + + + + + Errors occured during the images download. Do you want to restart the download of those images? (%1/%2) + Ocurrieron errores durante la descarga de las imágenes. ¿Desea reiniciar la descarga de esas imágenes? (%1/%2) + + + + + + Save link list + Guardar lista de enlaces + + + + + Imageboard-Grabber links (*.igl) + Enlaces en formato Imageboard-Grabber (*.igl) + + + + Link list saved successfully! + ¡Lista de enlaces guardada correctamente! + + + + + Error opening file. + Error al abrir el archivo. + + + + + + Load link list + Cargar lista de enlaces + + + + Link list loaded successfully! + ¡Lista de enlaces cargada correctamente! + + + + Loading %n download(s) + + Cargando %n descarga + Cargando %n descargas + + + + + Choose a save folder + Elige una carpeta para guardar + + + + %n download(s) in progress + + %n descarga en progreso + %n descargas en progreso + + + + + Remove from favorites + Eliminar de favoritos + + + + Add to favorites + Añadir a favoritos + + + + Keep for later + Guardar para más tarde + + + + Open in a new tab + Abrir en una pestaña nueva + + + + Open in a new window + Abrir en una ventana nueva + + + + md5Fix + + + Md5 list fixer + Arreglar lista MD5 + + + + This tool will clear your MD5 list and fill it again with the MD5 of the files found in the folder set below. + Esta herramienta limpia la lista MD5 y la vuelve a llenar con las sumas MD5 de los archivos encontrados en la carpeta seleccionada. + + + + Folder + Carpeta + + + + Force md5 calculation + Forzar cálculo MD5 + + + + Get md5 in filename + Usar MD5 en el nombre del archivo + + + + Filename + Nombre del archivo + + + + %v/%m + %v/%m + + + + Start + Iniciar + + + + Cancel + Cancelar + + + + This folder does not exist. + Esta carpeta no existe. + + + + If you want to get the MD5 from the filename, you have to include the %md5% token in it. + Si quiere usar el MD5 en el nombre del archivo, debe incluir el identificador %md5% en él. + + + + Unable to open the MD5 file. + No se pudo abrir el archivo MD5. + + + + Finished + Finalizado + + + + %n MD5(s) loaded + + %n archivo MD5 cargado + %n archivos MD5 cargados + + + + + optionsWindow + + + Options + Opciones + + + + General + General + + + + Sources + Fuentes + + + + + Save + Guardar + + + + Filename + Nombre del archivo + + + + Conditional filenames + Nombres de archivo condicionales + + + + Separate text file + Archivo de texto separado + + + + Separate log + Registros separados + + + + Artist tags + Etiquetas de artistas + + + + Copyright tags + Etiquetas de derechos de autor + + + + Character tags + Etiquetas de personajes + + + + Species tags + Etiquetas de especies + + + + Custom token + Identificador personalizado + + + + Interface + Interfaz + + + + Image window + Ventana de imagen + + + + Coloring + Colores + + + + Margins and borders + Márgenes y bordes + + + + Log + Registros + + + + Proxy + Proxy + + + + + Commands + Comandos + + + + + Database + Base de datos + + + + Language + Idioma + + + + At start + Al iniciar + + + + + Do nothing + No hacer nada + + + + Load first page + Cargar la primera página + + + + Restore last session + Restaurar la sesión anterior + + + + Blacklist + Lista negra + + + + <i>Separate tags with spaces.</i> + <i>Separe las etiquetas con espacios</i> + + + + Ignore images containing a blacklisted tag + Ignorar las imágenes que contengan una etiqueta de la lista negra + + + + <i>Images containing a blacklisted tag will not be displayed in the results if this box is checked. Else, a confirmation will be asked before showing one of these images.</i> + <i>Cuando esté activado, las imágenes que contengan una etiqueta de la lista negra no se mostrarán. De otra forma, se le preguntará antes de mostrar una de estas imágenes.</i> + + + + Whitelist + Lista blanca + + + + Download + Descargar + + + + Don't download automatically + No descargar automáticamente + + + + When loading image + Cuando cargue la imagen + + + + When loading thumbnail + Cuando cargue la miniatura + + + + <i>Images containing a whitelisted tag will be downloaded automatically according to the option above.</i> + <i>Las imágenes que contengan una etiqueta de la lista blanca serán descargadas automáticamente de acuerdo a la opción elegida.</i> + + + + Ignored tags + Etiquetas ignoradas + + + + <i>These tags will not be taken in account when saving image.</i> + <i>Estas etiquetas no se tomarán en cuenta al guardar la imagen.</i> + + + + Download images containing blacklisted tags + Descargar las imágenes que contengan etiquetas de la lista negra + + + + Adds + Etiquetas adicionales + + + + <i>These tags will be automatically added to every search.</i> + <i>Estas etiquetas se añadirán automáticamente en cada búsqueda.</i> + + + + Ask for confirmation before closing the window + Pedir confirmación antes de cerrar la ventana + + + + Check for updates + Buscar actualizaciones + + + + Every time + Siempre + + + + Once a day + Diariamente + + + + Once a week + Semanalmente + + + + Once a month + Mensualmente + + + + Never + Nunca + + + + Images per page + Imágenes por página + + + + Number of columns + Número de columnas + + + + Source 1 + Fuente 1 + + + + Source 2 + Fuente 2 + + + + Source 3 + Fuente 3 + + + + Source 4 + Fuente 4 + + + + Get more precise tags when searching images + Obtener etiquetas más precisas al buscar las imágenes + + + + + + + XML + XML + + + + + + + JSON + JSON + + + + + + + Regex + Expresión regular + + + + + + + RSS + RSS + + + + Auto tag add + Etiquetas automáticas + + + + Download original images + Descargar imágenes originales + + + + Download sample on error + Descargar la muestra en caso de error + + + + Download images automatically + Descargar imágenes automáticamente + + + + Keep original creation date + Mantener la fecha de creación original + + + + Folder + Carpeta + + + + + + Browse + Navegar + + + + + + Favorites + Favoritos + + + + Tags separator + Separador de etiquetas + + + + Replace spaces by underscores + Substituye los espacios por guiones bajos + + + + Max length + Longitud máxima + + + + <i>If the filename length is greater than this number, it will be shortened. Leave it to 0 to use the default limit.</i> + <i>El nombre del archivo se acortará si es más grande que este número. Al dejarlo en 0 se usará el límite predeterminado.</i> + + + + Simultaneous downloads + Descargas simultáneas + + + + When the download is finished + Al terminar la descarga + + + + Close window + Cerrar la ventana + + + + Open CD tray + Abrir la bandeja de CD + + + + Play a sound + Reproducir un sonido + + + + Shutdown + Apagar + + + + If a file already exists + Si el archivo existe + + + + Copy + Copiar + + + + Move + Mover + + + + Don't save + No guardar + + + + <i>File's identity is based on the MD5 algorithm.</i> + <i>La identidad del archivo se encuentra usando el algoritmo MD5.</i> + + + + Automatic redownload + Repeticiones automáticas de descarga + + + + Replace JPEG by JPG + Reemplazar JPEG por JPG + + + + Get extension from file header + Obtener extensión de la cabecera del archivo + + + + Default + Predeterminado + + + + Add a conditional filename + Añadir nombre de archivo condicional + + + + <i>Each time an image is saved, an external text file will be save with the same name at the same location, containing the image's tags.</i> + <i>Cada vez que se guarde una imagen, se creará un archivo de texto adicional con el mismo nombre en el mismo lugar, conteniendo las etiquetas de la imagen.</i> + + + + Enable external text files + Habilitar archivos de texto externos + + + + Text file content + Contenido del archivo de texto + + + + Available tokens: the same as in the "Save" part. + Identificadores disponibles: Los mismos que se utilizan en la sección "Guardar". + + + + Enable external logging + Habilitar registros externos + + + + Log file + Archivo de registro + + + + Line format + Formato de línea + + + + <i>Each time an image is saved, a new line will be added to the selected file.</i> + <i>Cada vez que se guarde una imagen se añadirá una nueva línea al archivo seleccionado.</i> + + + + + + + If empty + Si está vacío + + + + + + + Separator + Separador + + + + + + + If more than n tags + Si el número de etiquetas es mayor que + + + + + + + Keep all tags + Mantener todas las etiquetas + + + + + + + Keep n tags, then add + Mantener un número de etiquetas y luego añadir + + + + + + + Replace all tags by + Reemplazar todas las etiquetas por + + + + + + + Keep n tags + Mantener un número de etiquetas + + + + + + + One file per tag + Un archivo por etiqueta + + + + Use shortest if possible + Usar la etiqueta más corta + + + + Add a custom token + Añadir un identificador personalizado + + + + Use a scroll area for the results + Usar el área de desplazamiento para los resultados + + + + Resize previews instead of cropping them + Redimensionar las vistas previas en vez de recortarlas + + + + Enable autocompletion + Habilitar el autocompletado + + + + Hide favorites + Esconder los favoritos + + + + <i>The favorites list will be hidden as soon as this image number has been reached.</i> + <i>La lista de favoritos se esconderá al alcanzar este número de imágenes.</i> + + + + Source's type display + Tipo de visualización de la fuente + + + + Text + Texto + + + + + + Image + Imagen + + + + Image and text + Imagen y texto + + + + Don't show + No mostrar + + + + Displayed letters + Letras mostradas + + + + Display n letters + Mostrar un número de letras + + + + Before first dot + Antes del primer punto + + + + Before last dot + Antes del último punto + + + + <i>Number of displayed letters near the sources' checkboxes in the "+" part of the main window.</i> + <i>El número de letras que se mostrará junto a las casillas de las fuentes en la ventana principal.</i> + + + + Tag list position + Posición de la lista de etiquetas + + + + + + + Top + Arriba + + + + + + + Left + Izquierda + + + + Auto + Automático + + + + Show warning if an incompatible modifier is found + Mostrar advertencia si se encuentra un modificador incompatible + + + + Show other warnings + Mostrar otras advertencias + + + + Download not loaded pages + Descargar páginas no cargadas + + + + <i>If you activate this option, pressing the "Get this page" button will take into account modifications made to the number of images per page, the page number, etc. even if they weren't loaded.</i> + <i>Si esta opción está activa, al presionar el botón "Obtener esta página" se tomarán en cuenta las modificaciones hechas al número de imágenes por página, el número de la página, etc. incluso si no pudo cargarse.</i> + + + + Image, name and details + Imagen, nombre y detalles + + + + Image and name + Imagen y nombre + + + + Image and details + Imagen y detalles + + + + Name and details + Nombre y detalles + + + + Image only + Solo la imagen + + + + Name only + Solo el nombre + + + + Details only + Solo los detalles + + + + Favorites display + Visualización de favoritos + + + + Upscaling + Ampliación + + + + % + % + + + + Artists + Artistas + + + + Series + Series + + + + Characters + Personajes + + + + Models + Modelos + + + + Generals + Generales + + + + Blacklisted + En la lista negra + + + + Ignored + Ignorados + + + + + + + + + + + + + + + Color + Color + + + + Preloading + Precarga + + + + Slideshow + Presentación + + + + s + s + + + + Middle click to close window + Clic con el botón central para cerrar la ventana + + + + Enable scroll wheel navigation + Habilitar navegación con la rueda de desplazamiento + + + + Image position + Posición de la imagen + + + + + + + + + Center + Centro + + + + + + Bottom + Abajo + + + + + + Right + Derecha + + + + Animation position + Posición de la animación + + + + Video position + Posición del video + + + + + + + + + + + + + Font + Tipografía + + + + Circle + Círculo + + + + Species + Especies + + + + Hosts + Servidores + + + + + Horizontal margins + Márgenes horizontales + + + + + Borders + Bordes + + + + Images + Imágenes + + + + Vertical margins + Márgenes verticales + + + + Show log + Mostrar registros + + + + Use proxy + Usar proxy + + + + + Host + Servidor + + + + Port + Puerto + + + + Type + Tipo + + + + HTTP + HTTP + + + + SOCKS v5 + SOCKS v5 + + + + Use system-wide proxy settings + Usar la configuración del sistema + + + + + Tag (after) + Etiqueta (después) + + + + + Tag (before) + Etiqueta (antes) + + + + + Additional tags: <i>%tag%</i>, <i>%type%</i>, <i>%number%</i>.<br/><i>%tag%</i>: the tag<br/><i>%type%</i>: tag type, "general", "artist", "copyright", "character", "model" or "photo_set"<br/><i>%number%</i>: the tag type number (between 0 and 6) + Etiquetas adicionales: <i>%tag%</i>, <i>%type%</i>, <i>%number%</i>.<br/><i>%tag%</i>: la etiqueta<br/><i>%type%</i>: tipo de etiqueta, "general", "artist", "copyright", "character", "model" o "photo_set"<br/><i>%number%</i>: el número del tipo de etiqueta (entre 0 y 6) + + + + Start + Inicio + + + + End + Final + + + + Credentials + Identificación + + + + User + Usuario + + + + Password + Contraseña + + + + Driver + Controlador + + + + Choose a save folder + Elija una carpeta para guardar + + + + Choose a save folder for favorites + Elija una carpeta para guardar los favoritos + + + + Choose a color + Elija un color + + + + Choose a font + Elija una tipografía + + + + An error occured creating the save folder. + Ha ocurrido un error al crear la carpeta para guardar. + + + + An error occured creating the favorites save folder. + Ha ocurrido un error al crear la carpeta para guardar los favoritos. + + + + poolTab + + + New pool tab + Nueva pestaña de colecciones + + + + Pl&us + &Más + + + + O&k + Acepta&r + + + + Maybe you meant: + Quizás quiso decir: + + + + Images per page + Imágenes por página + + + + Number of columns + Número de columnas + + + + Post-filtering + Después del filtro + + + + Get &selected + Obtener &seleccionado + + + + Get this &page + Obtener está &página + + + + Get &all + Obtener &todo + + + + searchTab + + + server offline + servidor fuera de línea + + + + too many tags + demasiadas etiquetas + + + + page too far + página demasiado lejos + + + + one of the thumbnails is empty (<a href="%1">%1</a>). + una de las miniaturas está vacía (<a href="%1">%1</a>). + + + + Some tags from the image are in the whitelist: %1. However, some tags are in the blacklist: %2. Do you want to download it anyway? + Algunas etiquetas de la imagen se encuentran en la lista blanca: %1. Sin embargo, algunas etiquetas se encuentran en la lista negra: %2. ¿Desea descargarla de todas formas? + + + + No result + Sin resultados + + + + Possible reasons: %1 + Razones posibles: %1 + + + + Page %1 of %2 (%3 of %4) + Página %1 de %2 (%3 de %4) + + + + <b>Tags:</b> %1<br/><br/> + <b>Etiquetas:</b> %1<br/><br/> + + + + <b>ID:</b> %1<br/> + <b>ID:</b> %1<br/> + + + + <b>Rating:</b> %1<br/> + <b>Clasificación:</b> %1<br/> + + + + <b>Score:</b> %1<br/> + <b>Puntaje:</b> %1<br/> + + + + <b>User:</b> %1<br/><br/> + <b>Usuario:</b> %1<br/> + + + + <b>Size:</b> %1 x %2<br/> + <b>Dimensiones:</b> %1 x %2<br/> + + + + <b>Filesize:</b> %1 %2<br/> + <b>Tamaño:</b> %1 %2<br/> + + + + <b>Date:</b> %1 + <b>Fecha:</b> %1 + + + + 'the 'MM/dd/yyyy' at 'hh:mm + 'el 'MM/dd/yyyy' - 'hh:mm + + + + Blacklist + Lista negra + + + + %n tag figuring in the blacklist detected in this image: %1. Do you want to display it anyway? + + se detectó %n etiqueta de esta imagen en la lista negra: %1. ¿Desea mostrarla de todas formas? + se detectaron %n etiquetas de esta imagen en la lista negra: %1. ¿Desea mostrarla de todas formas? + + + + + sourcesWindow + + + Sources + Fuentes + + + + Check all + Seleccionar todo + + + + Add + Añadir + + + + Cancel + Cancelar + + + + Ok + Aceptar + + + + Options + Opciones + + + + An update for this source is available. + Hay una actualización disponible para esta fuente. + + + + startWindow + + + First launch + Primera ejecución + + + + Before starting, the program needs some informations to work properly. You can skip this step, and these informations will be asked later. + Antes de comenzar, el programa necesita cierta información para funcionar correctamente. Puede saltarse este paso, y se le pedirá más tarde. + + + + Language + Idioma + + + + Folder + Carpeta + + + + Browse + Navegar + + + + Format + Formato + + + + ... + ... + + + + Source + Fuente + + + + <i>If you use Grabber for the first time, it is advised to first read the <a href="https://github.com/Bionus/imgbrd-grabber/wiki/GettingStarted">getting started</a> wiki page.</i> + <i>Si es la primera vez que usa Grabber, es aconsejable que primero lea la página <a href="https://github.com/Bionus/imgbrd-grabber/wiki/GettingStarted">getting started.</a> </i> + + + + Options + Opciones + + + + Choose a save folder + Elige una carpeta para guardar + + + + An error occured creating the save folder. + Ha ocurrido un error al crear la carpeta para guardar. + + + + tagTab + + + New tab + Nueva pestaña + + + + Pl&us + &Más + + + + O&k + Acepta&r + + + + Maybe you meant: + Quizás quiso decir: + + + + Post-filtering + Después del filtro + + + + Number of columns + Número de columnas + + + + Images per page + Imágenes por página + + + + S&ources + &Fuentes + + + + &Merge results + &Combinar resultados + + + + Get &selected + Obtener &seleccionado + + + + Get this &page + Obtener esta &página + + + + Get &all + Obtener &todo + + + + Search + Buscar + + + + zoomWindow + + + + + Image + Imagen + + + + More details + Más detalles + + + + + + Save + Guardar + + + + + + Save and close + Guardar y cerrar + + + + Destination folder + Carpeta de destino + + + + Save as... + Guardar como... + + + + Save (fav) + Guardar (favorito) + + + + Save and close (fav) + Guardar y cerrar (favorito) + + + + Destination folder (fav) + Carpeta de destino (favorito) + + + + Copy file + Copiar archivo + + + + Copy data + Copiar datos + + + + Folder does not exist + La carpeta no existe + + + + The save folder does not exist yet. Create it? + La carpeta para guardar no existe. ¿Desea crearla? + + + + Error creating folder. +%1 + Ocurrió un error al crear la carpeta. +%1 + + + + Remove from favorites + Eliminar de favoritos + + + + Choose as image + Elegir como imagen + + + + Add to favorites + Añadir a favoritos + + + + Don't keep for later + No guardar para más tarde + + + + Keep for later + Guardar para más tarde + + + + Don't ignore + No ignorar + + + + Ignore + Ignorar + + + + Copy tag + Copiar etiqueta + + + + Copy all tags + Copiar todas las etiquetas + + + + Open in a new tab + Abrir en una pestaña nueva + + + + Open in new a window + Abrir en una ventana nueva + + + + Open in browser + Abrir en el navegador web + + + + + File already exists + El archivo ya existe + + + + + Close + Cerrar + + + + + File already exists (fav) + El archivo ya existe (favorito) + + + + + Close (fav) + Cerrar (favorito) + + + + An unexpected error occured loading the image (%1 - %2). +%3 + Ha ocurrido un error inesperado al cargar la imagen (%1 - %2) +%3 + + + + + + Saving... + Guardando... + + + + Saving... (fav) + Guardando... (favorito) + + + + + Error + Error + + + + You did not specified a save folder! Do you want to open the options window? + ¡No se especificó una carpeta para guardar! ¿Desea abrir la ventana de opciones? + + + + You did not specified a save format! Do you want to open the options window? + ¡No se especificó un formato de guardado! ¿Desea abrir la ventana de opciones? + + + + Error saving image. + Error al guardar la imagen. + + + + Saved! (fav) + ¡Guardado! (favorito) + + + + Saved! + ¡Guardado! + + + + Copied! (fav) + ¡Copiado! (favorito) + + + + Copied! + ¡Copiado! + + + + Moved! (fav) + ¡Movido! (favorito) + + + + Moved! + ¡Movido! + + + + Ignored! (fav) + ¡Ignorado! (favorito) + + + + Ignored! + ¡Ignorado! + + + + Save image + Guardar imagen + + + diff --git a/languages/YourLanguage.ts b/languages/YourLanguage.ts index d92329d67..c32634284 100644 --- a/languages/YourLanguage.ts +++ b/languages/YourLanguage.ts @@ -1338,11 +1338,6 @@ Batch download - - - %p% - - Details diff --git a/lib/src/models/filename.cpp b/lib/src/models/filename.cpp index 08d388bb9..6e75fc5ad 100644 --- a/lib/src/models/filename.cpp +++ b/lib/src/models/filename.cpp @@ -460,10 +460,6 @@ QStringList Filename::path(const Image& img, Profile *profile, QString pth, int fns[i] = fns[i].trimmed(); fns[i].replace(QRegExp(" */ *"), "/"); - // We remove empty directory names - while (fns[i].indexOf("//") >= 0) - { fns[i].replace("//", "/"); } - // Max filename size option if (shouldFixFilename) { @@ -473,7 +469,17 @@ QStringList Filename::path(const Image& img, Profile *profile, QString pth, int // Include directory in result if (getFull) - { fns[i] = QDir::toNativeSeparators(pth + "/" + fns[i]); } + { fns[i] = pth + "/" + fns[i]; } + + if (shouldFixFilename) + { + // Native separators + fns[i] = QDir::toNativeSeparators(fns[i]); + + // We remove empty directory names + QChar sep = QDir::separator(); + fns[i].replace(QRegExp(QRegExp::escape(sep) + "{2,}"), sep); + } } return fns; diff --git a/lib/src/updater/program-updater.cpp b/lib/src/updater/program-updater.cpp index 4db6207e7..8b65f19ae 100644 --- a/lib/src/updater/program-updater.cpp +++ b/lib/src/updater/program-updater.cpp @@ -41,6 +41,13 @@ void ProgramUpdater::checkForUpdatesDone() } +QUrl ProgramUpdater::latestUrl() const +{ + QVariant json = Json::parse(m_source); + QMap lastRelease = json.toMap(); + return QUrl(lastRelease["html_url"].toString()); +} + void ProgramUpdater::downloadUpdate() { QVariant json = Json::parse(m_source); diff --git a/lib/src/updater/program-updater.h b/lib/src/updater/program-updater.h index 9139edadf..03f7bd8b9 100644 --- a/lib/src/updater/program-updater.h +++ b/lib/src/updater/program-updater.h @@ -12,6 +12,7 @@ class ProgramUpdater : public Updater public: ProgramUpdater(); ProgramUpdater(QString baseUrl); + QUrl latestUrl() const; public slots: void checkForUpdates(); diff --git a/release/languages/languages.ini b/release/languages/languages.ini index 9acf136cf..d802d76f5 100644 --- a/release/languages/languages.ini +++ b/release/languages/languages.ini @@ -3,4 +3,9 @@ English=English French=French - Français Russian=Russian - русский ChineseSimplified=Chinese (Simplified) - 中文(简体) -ChineseTraditional=Chinese (Traditional) - 中文(繁體) \ No newline at end of file +ChineseTraditional=Chinese (Traditional) - 中文(繁體) +Spanish=Spanish - Español + +[innosetup] +en=English +fr=French \ No newline at end of file diff --git a/release/sites/Shimmie/model.xml b/release/sites/Shimmie/model.xml index 3a79ccf6d..568f0d813 100755 --- a/release/sites/Shimmie/model.xml +++ b/release/sites/Shimmie/model.xml @@ -15,8 +15,8 @@ <li class="tag-type-([^"]+)">[^<]*<a href="[^"]+">[^<]*</a>[^<]*<a href="[^"]+">([^<]+)</a>[^<]*</li>|<a class=['"]tag_name['"] href=['"]([^'"]+)(?:/1)?['"]>([^<]+)</a> - <a(?: class=['"][^'"]*['"])? href=['"][^'">]*\/post\/view\/([^'"]+)['"][^>]*>[^<]*(<img(?: id=['"](?:[^'"]*)['"])? title=['"]([^'"]+)(?: \/\/ ([^'"]+)x([^'"]+) \/\/ [^'"]*)?['"] alt=['"][^'"]*['"](?: height=['"][^'"]*['"])? width=['"][^'"]*['"](?: height=['"][^'"]*['"])?[^>]*(?:src|data-original)=['"][^'"]*(\/_thumbs\/([^\/]*)\/[^'"]*\.jpg|\/thumb\/([^'"]*)\.jpg|questionable\.jpg)['"][^>]*>).*<\/a>|<a href=['"][^'">]*\/i([^'"]+)['"](?: class=['"][^'"]*['"])?[^>]*>[^<]*(<img(?: id=['"](?:[^'"]*)['"])? src=['"][^'"]*(\/_thumbs\/([^'"]*)(?:_th)?\.jpg|\/thumb\/([^'"]*)\.jpg|questionable\.jpg)['"] title=['"]([^'"]+) \/\/ ([^'"]+)x([^'"]+) \/\/ [^'"]*['"] alt=['"][^'"]*['"] ?\/?>)[^<]*<\/a> - id|image|tags|width|height|preview_url|md5|md5|id|image|preview_url|md5|md5|tags|width|height + <a(?: class=['"][^'"]*['"])? href=['"][^'">]*\/post\/view\/([^'"]+)['"][^>]*>[^<]*(<img(?: id=['"](?:[^'"]*)['"])? title=['"]([^'"\/]+)(?: \/\/ ([^'"]+)x([^'"]+) \/\/ ([^'"]*) \/\/ ([^'"]*))?['"] alt=['"][^'"]*['"](?: height=['"][^'"]*['"])? width=['"][^'"]*['"](?: height=['"][^'"]*['"])?[^>]*(?:src|data-original)=['"][^'"]*(\/_thumbs\/([^\/]*)\/[^'"]*\.jpg|\/thumb\/([^'"]*)\.jpg|questionable\.jpg)['"][^>]*>).*<\/a>|<a href=['"][^'">]*\/i([^'"]+)['"](?: class=['"][^'"]*['"])?[^>]*>[^<]*(<img(?: id=['"](?:[^'"]*)['"])? src=['"][^'"]*(\/_thumbs\/([^'"]*)(?:_th)?\.jpg|\/thumb\/([^'"]*)\.jpg|questionable\.jpg)['"] title=['"]([^'"\/]+) \/\/ ([^'"]+)x([^'"]+) \/\/ ([^'"]*) \/\/ ([^'"]*)['"] alt=['"][^'"]*['"] ?\/?>)[^<]*<\/a> + id|image|tags|width|height|filesize|ext|preview_url|md5|md5|id|image|preview_url|md5|md5|tags|width|height|filesize|ext <a href=['"]/post/list(?:/[^/]+)?/(\d*)['"]>Last</a> <img.+ id=['"]main_image['"] src=['"]([^']+)['"][^>]*> true diff --git a/release/themes/Default/style.css b/release/themes/Default/style.css new file mode 100644 index 000000000..e69de29bb diff --git a/releases/setup.iss b/releases/setup.iss index 80e69cc16..513d4d912 100755 --- a/releases/setup.iss +++ b/releases/setup.iss @@ -1,5 +1,5 @@ #define MyAppName "Grabber" -#define MyAppVersion "5.2.2" +#define MyAppVersion "5.2.3" #define MyAppPublisher "Bionus" #define MyAppURL "https://github.com/Bionus/imgbrd-grabber" #define MyAppExeName "Grabber.exe" @@ -89,6 +89,7 @@ Source: "..\release\crashreporter\ChineseSimplified.qm"; DestDir: "{app}\crashre Source: "..\release\crashreporter\English.qm"; DestDir: "{app}\crashreporter"; Flags: ignoreversion Source: "..\release\crashreporter\French.qm"; DestDir: "{app}\crashreporter"; Flags: ignoreversion Source: "..\release\crashreporter\Russian.qm"; DestDir: "{app}\crashreporter"; Flags: ignoreversion +Source: "..\release\crashreporter\Spanish.qm"; DestDir: "{app}\crashreporter"; Flags: ignoreversion Source: "..\release\imageformats\qdds.dll"; DestDir: "{app}\imageformats"; Flags: ignoreversion Source: "..\release\imageformats\qgif.dll"; DestDir: "{app}\imageformats"; Flags: ignoreversion Source: "..\release\imageformats\qicns.dll"; DestDir: "{app}\imageformats"; Flags: ignoreversion @@ -103,7 +104,11 @@ Source: "..\release\languages\ChineseSimplified.qm"; DestDir: "{app}\languages"; Source: "..\release\languages\English.qm"; DestDir: "{app}\languages"; Flags: ignoreversion Source: "..\release\languages\French.qm"; DestDir: "{app}\languages"; Flags: ignoreversion Source: "..\release\languages\Russian.qm"; DestDir: "{app}\languages"; Flags: ignoreversion +Source: "..\release\languages\Spanish.qm"; DestDir: "{app}\languages"; Flags: ignoreversion Source: "..\release\languages\languages.ini"; DestDir: "{app}\languages"; Flags: ignoreversion +Source: "..\release\languages\qt\English.qm"; DestDir: "{app}\languages\qt"; Flags: ignoreversion +Source: "..\release\languages\qt\French.qm"; DestDir: "{app}\languages\qt"; Flags: ignoreversion +Source: "..\release\languages\qt\Russian.qm"; DestDir: "{app}\languages\qt"; Flags: ignoreversion Source: "..\release\platforms\qminimal.dll"; DestDir: "{app}\platforms"; Flags: ignoreversion Source: "..\release\platforms\qoffscreen.dll"; DestDir: "{app}\platforms"; Flags: ignoreversion Source: "..\release\platforms\qwindows.dll"; DestDir: "{app}\platforms"; Flags: ignoreversion @@ -144,6 +149,7 @@ Source: "..\release\sites\Zerochan\icon.png"; DestDir: "{localappdata}\Bionus\G Source: "..\release\sites\Zerochan\model.xml"; DestDir: "{localappdata}\Bionus\Grabber\sites\Zerochan"; Flags: ignoreversion Source: "..\release\sites\Zerochan\sites.txt"; DestDir: "{localappdata}\Bionus\Grabber\sites\Zerochan"; Flags: onlyifdoesntexist Source: "..\release\sites\Zerochan\www.zerochan.net\settings.ini"; DestDir: "{localappdata}\Bionus\Grabber\sites\Zerochan\www.zerochan.net"; Flags: onlyifdoesntexist +Source: "..\release\themes\Default\style.css"; DestDir: "{localappdata}\Bionus\Grabber\themes\Default"; Flags: onlyifdoesntexist [InstallDelete] Type: filesandordirs; Name: "{app}\languages\updater" @@ -185,3 +191,12 @@ begin vcredist2015(); Result := true; end; + +procedure CurStepChanged(CurStep: TSetupStep); +begin + if CurStep = ssPostInstall then + begin + Log('Post install'); + SaveStringToFile(ExpandConstant('{localappdata}') + '\Bionus\Grabber\innosetup.ini', '[general]' + #13#10 + 'language=' + ExpandConstant('{language}') + #13#10, False); + end; +end;