A?adido soporte para archivos PDF

Modificados los .pro para a?adir poppler y opengl en todas las plataformas

Corregido bug relacionado con la actualizaci?n del flow al cambiar su configuraci?n

A?adida image de selecci?n de flow en espa?ol

A?adidas 2 im?genes nuevas para los dos tipos de flow nuevos

Corregidos fallos de compilaci?n en sistemas de 64bit y el include GL/glu.h

A?adidas las traducciones al espa?ol de la versi?n 5.5.0

A?adida la actualizaci?n de bibliotecas a la versi?n actual

A?adida carpeta de dependencias para la compilaci?n en Win32
This commit is contained in:
Luis Ángel San Martín
2013-01-13 18:06:23 +01:00
parent 00cce6635c
commit 1bd587d18b
57 changed files with 6487 additions and 516 deletions

View File

@ -9,11 +9,31 @@ INCLUDEPATH += .
INCLUDEPATH += ../common \
./server \
./db \
../YACReader
../YACReader
win32 {
INCLUDEPATH += ../dependencies/poppler/include
LIBS += -L../dependencies/poppler/lib -lpoppler-qt4
}
unix:!macx{
INCLUDEPATH += /usr/include/poppler/qt4
LIBS += -L/usr/lib -lpoppler-qt4
LIBS += -lGLU
}
macx{
INCLUDEPATH += "/Volumes/Mac OS X Lion/usr/X11/include"
INCLUDEPATH += /usr/local/include/poppler/qt4
LIBS += -L/usr/local/lib -lpoppler-qt4
}
CONFIG += release
CONFIG -= flat
QT += sql network opengl
# Input
HEADERS += comic_flow.h \
create_library_dialog.h \

View File

@ -218,7 +218,7 @@ void DataBaseManagement::exportComicsInfo(QString source, QString dest)
queryComicsInfo.exec();*/
QSqlQuery query("INSERT INTO dest.db_info (version) "
"VALUES ('5.0.0')",destDB);
"VALUES ('"VERSION"')",destDB);
//query.finish();
QSqlQuery exportData(destDB);
@ -536,6 +536,27 @@ int DataBaseManagement::compareVersions(const QString & v1, const QString v2)
return 0;
}
bool DataBaseManagement::updateToCurrentVersion(const QString & fullPath)
{
QSqlDatabase db = loadDatabaseFromFile(fullPath);
bool returnValue = false;
if(db.isValid() && db.isOpen())
{
QSqlQuery updateVersion(db);
updateVersion.prepare("UPDATE db_info SET "
"version = :version");
updateVersion.bindValue(":version",VERSION);
updateVersion.exec();
if(updateVersion.numRowsAffected() > 0)
returnValue = true;
}
db.close();
QSqlDatabase::removeDatabase(fullPath);
return returnValue;
}
//COMICS_INFO_EXPORTER
ComicsInfoExporter::ComicsInfoExporter()
:QThread()

View File

@ -53,6 +53,7 @@ public:
static QString checkValidDB(const QString & fullPath); //retorna "" si la DB es inv<6E>lida <20> la versi<73>n si es v<>lida.
static int compareVersions(const QString & v1, const QString v2); //retorna <0 si v1 < v2, 0 si v1 = v2 y >0 si v1 > v2
static bool updateToCurrentVersion(const QString & path);
};
#endif

View File

@ -20,6 +20,8 @@
<file>../images/flow1.png</file>
<file>../images/flow2.png</file>
<file>../images/flow3.png</file>
<file>../images/flow4.png</file>
<file>../images/flow5.png</file>
<file>../images/importLibrary.png</file>
<file>../images/exportLibrary.png</file>
<file>../images/open.png</file>
@ -42,6 +44,7 @@
<file>../images/iphoneConfig.png</file>
<file>../images/qrMessage.png</file>
<file>../images/onStartFlowSelection.png</file>
<file>../images/onStartFlowSelection_es.png</file>
<file>../images/useNewFlowButton.png</file>
<file>../images/useOldFlowButton.png</file>
</qresource>

View File

@ -12,7 +12,7 @@
using namespace std;
//QMutex mutex;
#include "poppler-qt4.h"
/*int numThreads = 0;
@ -25,7 +25,7 @@ QMutex mutex;
LibraryCreator::LibraryCreator()
:creation(false)
{
_nameFilter << "*.cbr" << "*.cbz" << "*.rar" << "*.zip" << "*.tar";
_nameFilter << "*.cbr" << "*.cbz" << "*.rar" << "*.zip" << "*.tar" << "*.pdf";
}
void LibraryCreator::createLibrary(const QString &source, const QString &target)
@ -393,74 +393,25 @@ ThumbnailCreator::ThumbnailCreator(QString fileSource, QString target="", int co
void ThumbnailCreator::create()
{
_7z = new QProcess();
QStringList attributes;
attributes << "l" << "-ssc-" << "-r" << _fileSource << "*.jpg" << "*.jpeg" << "*.png" << "*.gif" << "*.tiff" << "*.tif" << "*.bmp";
//connect(_7z,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(loadFirstImage(void)));
connect(_7z,SIGNAL(error(QProcess::ProcessError)),this,SIGNAL(openingError(QProcess::ProcessError)));
_7z->start(QCoreApplication::applicationDirPath()+"/utils/7z",attributes);
_7z->waitForFinished(60000);
QRegExp rx("[0-9]{4}-[0-9]{2}-[0-9]{2}[ ]+[0-9]{2}:[0-9]{2}:[0-9]{2}[ ]+.{5}[ ]+([0-9]+)[ ]+([0-9]+)[ ]+(.+)");
QString ba = QString::fromUtf8(_7z->readAllStandardOutput());
QList<QString> lines = ba.split('\n');
QString line;
_currentName = "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"; //TODO
QString name;
if(_coverPage == 1)
QFileInfo fi(_fileSource);
if(fi.suffix().compare("pdf",Qt::CaseInsensitive) == 0)
{
foreach(line,lines)
Poppler::Document * pdfComic = Poppler::Document::load(_fileSource);
if (!pdfComic)
{
if(rx.indexIn(line)!=-1)
{
name = rx.cap(3).trimmed();
if(naturalSortLessThanCI(name,_currentName))
_currentName = name;
_numPages++;
}
delete pdfComic;
pdfComic = 0;
QImage p;
p.load(":/images/notCover.png");
p.save(_target);
return;
}
}
else
{
QList<QString> names;
foreach(line,lines)
_numPages = pdfComic->numPages();
if(_numPages >= _coverPage)
{
if(rx.indexIn(line)!=-1)
{
name = rx. cap(3).trimmed();
names.append(name);
}
}
std::sort(names.begin(),names.end(),naturalSortLessThanCI);
_currentName = names[_coverPage-1];
}
delete _7z;
attributes.clear();
_currentName = QDir::fromNativeSeparators(_currentName).split('/').last(); //separator fixed.
#ifdef Q_WS_WIN
attributes << "e" << "-so" << "-r" << _fileSource << QString(_currentName.toLocal8Bit().constData()); //TODO platform dependency?? OEM 437
#else
attributes << "e" << "-so" << "-r" << _fileSource << _currentName; //TODO platform dependency?? OEM 437
#endif
_7z = new QProcess();
connect(_7z,SIGNAL(error(QProcess::ProcessError)),this,SIGNAL(openingError(QProcess::ProcessError)));
//connect(_7z,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(writeThumbnail(void)));
_7z->start(QCoreApplication::applicationDirPath()+"/utils/7z",attributes);
_7z->waitForFinished(60000);
QByteArray image = _7z->readAllStandardOutput();
QString error = _7z->readAllStandardError();
QImage p;
if(_target=="")
{
if(!_cover.loadFromData(image))
_cover.load(":/images/notCover.png");
}
else
{
if(p.loadFromData(image))
{
QImage p = pdfComic->page(_coverPage-1)->renderToImage(72,72); //TODO check if the the page is valid
_cover = QPixmap::fromImage(p);
QImage scaled;
if(p.width()>p.height()) //landscape??
scaled = p.scaledToWidth(640,Qt::SmoothTransformation);
@ -470,11 +421,97 @@ void ThumbnailCreator::create()
}
else
{
QImage p;
p.load(":/images/notCover.png");
p.save(_target);
}
}
delete _7z;
else
{
_7z = new QProcess();
QStringList attributes;
attributes << "l" << "-ssc-" << "-r" << _fileSource << "*.jpg" << "*.jpeg" << "*.png" << "*.gif" << "*.tiff" << "*.tif" << "*.bmp";
//connect(_7z,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(loadFirstImage(void)));
connect(_7z,SIGNAL(error(QProcess::ProcessError)),this,SIGNAL(openingError(QProcess::ProcessError)));
_7z->start(QCoreApplication::applicationDirPath()+"/utils/7z",attributes);
_7z->waitForFinished(60000);
QRegExp rx("[0-9]{4}-[0-9]{2}-[0-9]{2}[ ]+[0-9]{2}:[0-9]{2}:[0-9]{2}[ ]+.{5}[ ]+([0-9]+)[ ]+([0-9]+)[ ]+(.+)");
QString ba = QString::fromUtf8(_7z->readAllStandardOutput());
QList<QString> lines = ba.split('\n');
QString line;
_currentName = "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"; //TODO
QString name;
if(_coverPage == 1)
{
foreach(line,lines)
{
if(rx.indexIn(line)!=-1)
{
name = rx.cap(3).trimmed();
if(naturalSortLessThanCI(name,_currentName))
_currentName = name;
_numPages++;
}
}
}
else
{
QList<QString> names;
foreach(line,lines)
{
if(rx.indexIn(line)!=-1)
{
name = rx. cap(3).trimmed();
names.append(name);
}
}
std::sort(names.begin(),names.end(),naturalSortLessThanCI);
_currentName = names[_coverPage-1];
}
delete _7z;
attributes.clear();
_currentName = QDir::fromNativeSeparators(_currentName).split('/').last(); //separator fixed.
#ifdef Q_WS_WIN
attributes << "e" << "-so" << "-r" << _fileSource << QString(_currentName.toLocal8Bit().constData()); //TODO platform dependency?? OEM 437
#else
attributes << "e" << "-so" << "-r" << _fileSource << _currentName; //TODO platform dependency?? OEM 437
#endif
_7z = new QProcess();
connect(_7z,SIGNAL(error(QProcess::ProcessError)),this,SIGNAL(openingError(QProcess::ProcessError)));
//connect(_7z,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(writeThumbnail(void)));
_7z->start(QCoreApplication::applicationDirPath()+"/utils/7z",attributes);
_7z->waitForFinished(60000);
QByteArray image = _7z->readAllStandardOutput();
QString error = _7z->readAllStandardError();
QImage p;
if(_target=="")
{
if(!_cover.loadFromData(image))
_cover.load(":/images/notCover.png");
}
else
{
if(p.loadFromData(image))
{
QImage scaled;
if(p.width()>p.height()) //landscape??
scaled = p.scaledToWidth(640,Qt::SmoothTransformation);
else
scaled = p.scaledToWidth(480,Qt::SmoothTransformation);
scaled.save(_target,0,75);
}
else
{
p.load(":/images/notCover.png");
p.save(_target);
}
}
delete _7z;
}
}
/*void ThumbnailCreator::openingError(QProcess::ProcessError error)

View File

@ -81,7 +81,9 @@ void LibraryWindow::doLayout()
QMatrix m;
m.rotate(-90);
m.scale(-1,1);
comicFlow->setMarkImage(QImage(":/images/setRead.png").transformed(m,Qt::SmoothTransformation));
QImage image(":/images/setRead.png");
image.transformed(m,Qt::SmoothTransformation);
comicFlow->setMarkImage(image);
int heightDesktopResolution = QApplication::desktop()->screenGeometry().height();
int height,width;
height = heightDesktopResolution*0.39;
@ -210,7 +212,10 @@ void LibraryWindow::doDialogs()
addLibraryDialog = new AddLibraryDialog(this);
optionsDialog = new OptionsDialog(this);
optionsDialog->restoreOptions(settings);
#ifdef SERVER_RELEASE
serverConfigDialog = new ServerConfigDialog(this);
#endif
had = new HelpAboutDialog(this); //TODO load data.
QString sufix = QLocale::system().name();
@ -511,7 +516,10 @@ void LibraryWindow::createToolBars()
libraryToolBar->addAction(toggleFullScreenAction);
libraryToolBar->addWidget(new QToolBarStretch());
#ifdef SERVER_RELEASE
libraryToolBar->addAction(serverConfigAction);
#endif
libraryToolBar->addAction(optionsAction);
libraryToolBar->addAction(helpAboutAction);
@ -614,7 +622,9 @@ void LibraryWindow::createConnections()
connect(colapseAllNodesAction,SIGNAL(triggered()),foldersView,SLOT(collapseAll()));
connect(toggleFullScreenAction,SIGNAL(triggered()),this,SLOT(toggleFullScreen()));
connect(optionsAction, SIGNAL(triggered()),optionsDialog,SLOT(show()));
#ifdef SERVER_RELEASE
connect(serverConfigAction, SIGNAL(triggered()), serverConfigDialog, SLOT(show()));
#endif
connect(optionsDialog, SIGNAL(optionsChanged()),this,SLOT(reloadOptions()));
//ComicFlow
connect(comicFlow,SIGNAL(selected(unsigned int)),this,SLOT(openComic()));
@ -648,8 +658,28 @@ void LibraryWindow::loadLibrary(const QString & name)
QString dbVersion;
if(d.exists(path) && (dbVersion = DataBaseManagement::checkValidDB(path+"/library.ydb")) != "") //si existe en disco la biblioteca seleccionada, y es v<>lida..
{
int comparation;
if((comparation = DataBaseManagement::compareVersions(dbVersion,VERSION)) == 0) //en caso de que la versi<73>n se igual que la actual
int comparation = DataBaseManagement::compareVersions(dbVersion,VERSION);
bool updated = false;
if(comparation < 0)
{
int ret = QMessageBox::question(this,tr("Update needed"),tr("This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now?"),QMessageBox::Yes,QMessageBox::No);
if(ret == QMessageBox::Yes)
{
//TODO update to new version
updated = DataBaseManagement::updateToCurrentVersion(path+"/library.ydb");
if(!updated)
QMessageBox::critical(this,tr("Update failed"), tr("The current library can't be udpated. Check for write write permissions on: ") + path+"/library.ydb");
}
else
{
comicView->setModel(NULL);
foldersView->setModel(NULL);
comicFlow->clear();
disableAllActions();//TODO comprobar que se deben deshabilitar
}
}
if(comparation == 0 || updated) //en caso de que la versi<73>n se igual que la actual
{
index = 0;
sm->clear();
@ -677,24 +707,8 @@ void LibraryWindow::loadLibrary(const QString & name)
//includeComicsCheckBox->setCheckState(Qt::Unchecked);
foldersFilter->clear();
}
else
else if(comparation > 0)
{
if(comparation < 0)
{
int ret = QMessageBox::question(this,tr("Update needed"),tr("This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now?"));
if(ret == QMessageBox::Yes)
{
}
else
{
comicView->setModel(NULL);
foldersView->setModel(NULL);
comicFlow->clear();
disableAllActions();//TODO comprobar que se deben deshabilitar
}
}
else
{
int ret = QMessageBox::question(this,tr("Download new version"),tr("This library was created with a newer version of YACReaderLibrary. Download the new version now?"),QMessageBox::Yes,QMessageBox::No);
if(ret == QMessageBox::Yes)
QDesktopServices::openUrl(QUrl("http://www.yacreader.com"));
@ -703,8 +717,6 @@ void LibraryWindow::loadLibrary(const QString & name)
foldersView->setModel(NULL);
comicFlow->clear();
disableAllActions();//TODO comprobar que se deben deshabilitar
}
}
}
else

View File

@ -18,8 +18,10 @@ int main( int argc, char ** argv )
app.installTranslator(&translator);
app.setApplicationName("YACReaderLibrary");
#ifdef SERVER_RELEASE
s = new Startup();
s->start();
#endif
mw = new LibraryWindow();
mw->resize(800,480);

View File

@ -42,7 +42,7 @@ OptionsDialog::OptionsDialog(QWidget * parent)
//restoreOptions(settings); //load options
//resize(200,0);
setModal (true);
setWindowTitle("Options");
setWindowTitle(tr("Options"));
}

View File

@ -49,7 +49,7 @@ QString LogMessage::toString(const QString& msgFormat, const QString& timestampF
}
QString threadId;
threadId.setNum((unsigned int)QThread::currentThreadId());
threadId.setNum((quint64)QThread::currentThreadId()); //CAMBIADo unsigned int por quint64, evita error de compilaci<63>n en m<>quinas de 64bit
decorated.replace("{thread}",threadId);
// Fill in variables

View File

@ -29,6 +29,132 @@
<translation>Añadir una biblioteca existente</translation>
</message>
</context>
<context>
<name>Comic</name>
<message>
<location filename="../YACReader/comic.cpp" line="72"/>
<source>Not found</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../YACReader/comic.cpp" line="72"/>
<source>Comic not found</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../YACReader/comic.cpp" line="111"/>
<source>Bad PDF File</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../YACReader/comic.cpp" line="111"/>
<source>Invalid PDF file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../YACReader/comic.cpp" line="166"/>
<source>No images found</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../YACReader/comic.cpp" line="166"/>
<source>There are not images on the selected folder</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../YACReader/comic.cpp" line="208"/>
<source>File error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../YACReader/comic.cpp" line="208"/>
<source>File not found or not images in file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../YACReader/comic.cpp" line="262"/>
<source>7z not found</source>
<translation type="unfinished">7z no encontrado</translation>
</message>
<message>
<location filename="../YACReader/comic.cpp" line="262"/>
<source>7z wasn&apos;t found in your PATH.</source>
<translation type="unfinished">7z no ha sido encontrado en tu PATH.</translation>
</message>
<message>
<location filename="../YACReader/comic.cpp" line="265"/>
<source>7z crashed</source>
<translation type="unfinished">fallo en 7z</translation>
</message>
<message>
<location filename="../YACReader/comic.cpp" line="265"/>
<source>7z crashed.</source>
<translation type="unfinished">fallo en 7z.</translation>
</message>
<message>
<location filename="../YACReader/comic.cpp" line="268"/>
<source>7z reading</source>
<translation type="unfinished">Leyendo de 7z</translation>
</message>
<message>
<location filename="../YACReader/comic.cpp" line="268"/>
<source>problem reading from 7z</source>
<translation type="unfinished">Problema lenyendo de 7z</translation>
</message>
<message>
<location filename="../YACReader/comic.cpp" line="271"/>
<source>7z problem</source>
<translation type="unfinished">Problema en 7z</translation>
</message>
<message>
<location filename="../YACReader/comic.cpp" line="271"/>
<source>Unknown error 7z</source>
<translation type="unfinished">Error desconocido en 7z</translation>
</message>
</context>
<context>
<name>Comic2</name>
<message>
<location filename="../YACReader/comic.cpp" line="544"/>
<source>7z not found</source>
<translation type="unfinished">7z no encontrado</translation>
</message>
<message>
<location filename="../YACReader/comic.cpp" line="544"/>
<source>7z wasn&apos;t found in your PATH.</source>
<translation type="unfinished">7z no ha sido encontrado en tu PATH.</translation>
</message>
<message>
<location filename="../YACReader/comic.cpp" line="547"/>
<source>7z crashed</source>
<translation type="unfinished">fallo en 7z</translation>
</message>
<message>
<location filename="../YACReader/comic.cpp" line="547"/>
<source>7z crashed.</source>
<translation type="unfinished">fallo en 7z.</translation>
</message>
<message>
<location filename="../YACReader/comic.cpp" line="550"/>
<source>7z reading</source>
<translation type="unfinished">Leyendo de 7z</translation>
</message>
<message>
<location filename="../YACReader/comic.cpp" line="550"/>
<source>problem reading from 7z</source>
<translation type="unfinished">Problema lenyendo de 7z</translation>
</message>
<message>
<location filename="../YACReader/comic.cpp" line="553"/>
<source>7z problem</source>
<translation type="unfinished">Problema en 7z</translation>
</message>
<message>
<location filename="../YACReader/comic.cpp" line="553"/>
<source>Unknown error 7z</source>
<translation type="unfinished">Error desconocido en 7z</translation>
</message>
</context>
<context>
<name>CreateLibraryDialog</name>
<message>
@ -161,12 +287,12 @@
<context>
<name>HelpAboutDialog</name>
<message>
<location filename="../common/custom_widgets.cpp" line="32"/>
<location filename="../common/custom_widgets.cpp" line="37"/>
<source>About</source>
<translation>Acerca de</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="35"/>
<location filename="../common/custom_widgets.cpp" line="40"/>
<source>Help</source>
<translation>Ayuda</translation>
</message>
@ -252,322 +378,347 @@
<context>
<name>LibraryWindow</name>
<message>
<location filename="library_window.cpp" line="123"/>
<location filename="library_window.cpp" line="149"/>
<source>Select a library:</source>
<translation>Seleciona una biblioteca:</translation>
</message>
<message>
<location filename="library_window.cpp" line="135"/>
<location filename="library_window.cpp" line="161"/>
<source>Clear</source>
<translation>Borrar</translation>
</message>
<message>
<location filename="library_window.cpp" line="137"/>
<location filename="library_window.cpp" line="163"/>
<source>Search folders/comics</source>
<translation>Buscar directorios/cómics</translation>
</message>
<message>
<location filename="library_window.cpp" line="140"/>
<location filename="library_window.cpp" line="166"/>
<source>Include files (slower)</source>
<translation>Incluir archivos (lento)</translation>
</message>
<message>
<location filename="library_window.cpp" line="166"/>
<location filename="library_window.cpp" line="192"/>
<source>&lt;font color=&apos;white&apos;&gt; press &apos;F&apos; to close fullscreen mode &lt;/font&gt;</source>
<translation>&lt;font color=&apos;white&apos;&gt; presiona &apos;F&apos; para salir de pantalla completa &lt;/font&gt;</translation>
</message>
<message>
<location filename="library_window.cpp" line="45"/>
<location filename="library_window.cpp" line="49"/>
<source>YACReader Library</source>
<translation>YACReader Library</translation>
</message>
<message>
<location filename="library_window.cpp" line="223"/>
<location filename="library_window.cpp" line="256"/>
<source>Create a new library</source>
<translation>Crear una nueva biblioteca</translation>
</message>
<message>
<location filename="library_window.cpp" line="228"/>
<location filename="library_window.cpp" line="261"/>
<source>Open an existing library</source>
<translation>Abrir una biblioteca existente</translation>
</message>
<message>
<location filename="library_window.cpp" line="232"/>
<location filename="library_window.cpp" line="233"/>
<location filename="library_window.cpp" line="265"/>
<location filename="library_window.cpp" line="266"/>
<source>Export comics info</source>
<translation>Exportar información de los cómics</translation>
</message>
<message>
<location filename="library_window.cpp" line="236"/>
<location filename="library_window.cpp" line="237"/>
<location filename="library_window.cpp" line="269"/>
<location filename="library_window.cpp" line="270"/>
<source>Import comics info</source>
<translation>Importar información de cómics</translation>
</message>
<message>
<location filename="library_window.cpp" line="240"/>
<location filename="library_window.cpp" line="273"/>
<source>Pack covers</source>
<translation>Empaquetar portadas</translation>
</message>
<message>
<location filename="library_window.cpp" line="241"/>
<location filename="library_window.cpp" line="274"/>
<source>Pack the covers of the selected library</source>
<translation>Empaquetar las portadas de la biblioteca seleccionada</translation>
</message>
<message>
<location filename="library_window.cpp" line="244"/>
<location filename="library_window.cpp" line="277"/>
<source>Unpack covers</source>
<translation>Desempaquetar portadas</translation>
</message>
<message>
<location filename="library_window.cpp" line="245"/>
<location filename="library_window.cpp" line="278"/>
<source>Unpack a catalog</source>
<translation>Desempaquetar un catálogo</translation>
</message>
<message>
<location filename="library_window.cpp" line="249"/>
<location filename="library_window.cpp" line="282"/>
<source>Update current library</source>
<translation>Actualizar la biblioteca seleccionada</translation>
</message>
<message>
<location filename="library_window.cpp" line="254"/>
<location filename="library_window.cpp" line="287"/>
<source>Rename current library</source>
<translation>Renombrar la biblioteca seleccionada</translation>
</message>
<message>
<location filename="library_window.cpp" line="259"/>
<location filename="library_window.cpp" line="292"/>
<source>Delete current library from disk</source>
<translation>Borrar la biblioteca seleccionada del disco</translation>
</message>
<message>
<location filename="library_window.cpp" line="263"/>
<location filename="library_window.cpp" line="296"/>
<source>Remove current library from your collection</source>
<translation>Eliminar biblioteca de la colección</translation>
</message>
<message>
<location filename="library_window.cpp" line="267"/>
<location filename="library_window.cpp" line="299"/>
<source>Open current comic</source>
<translation>Abrir cómic actual</translation>
</message>
<message>
<location filename="library_window.cpp" line="300"/>
<source>Open current comic on YACReader</source>
<translation>Abrir el cómic actual en YACReader</translation>
</message>
<message>
<location filename="library_window.cpp" line="271"/>
<location filename="library_window.cpp" line="304"/>
<source>Set as read</source>
<translation>Marcar como leído</translation>
</message>
<message>
<location filename="library_window.cpp" line="272"/>
<location filename="library_window.cpp" line="305"/>
<source>Set comic as read</source>
<translation>Marcar cómic como leído</translation>
</message>
<message>
<location filename="library_window.cpp" line="275"/>
<location filename="library_window.cpp" line="308"/>
<source>Set as unread</source>
<translation>Marcar como no leído</translation>
</message>
<message>
<location filename="library_window.cpp" line="276"/>
<location filename="library_window.cpp" line="309"/>
<source>Set comic as unread</source>
<translation>Marcar cómic como no leído</translation>
</message>
<message>
<location filename="library_window.cpp" line="279"/>
<location filename="library_window.cpp" line="312"/>
<source>Set all as read</source>
<translation>Marcar todos como leídos</translation>
</message>
<message>
<location filename="library_window.cpp" line="280"/>
<location filename="library_window.cpp" line="313"/>
<source>Set all comics as read</source>
<translation>Marcar todos los cómics como leídos</translation>
</message>
<message>
<location filename="library_window.cpp" line="283"/>
<location filename="library_window.cpp" line="316"/>
<source>Set all as unread</source>
<translation>Marcar todos como no leídos</translation>
</message>
<message>
<location filename="library_window.cpp" line="284"/>
<location filename="library_window.cpp" line="317"/>
<source>Set all comics as unread</source>
<translation>Marcar todos los cómics como no leídos</translation>
</message>
<message>
<location filename="library_window.cpp" line="287"/>
<location filename="library_window.cpp" line="320"/>
<source>Show/Hide marks</source>
<translation>Mostrar/Ocultar marcas</translation>
</message>
<message>
<location filename="library_window.cpp" line="288"/>
<location filename="library_window.cpp" line="321"/>
<source>Show or hide readed marks</source>
<translation>Mostrar u ocultar marcas</translation>
</message>
<message>
<location filename="library_window.cpp" line="296"/>
<location filename="library_window.cpp" line="329"/>
<source>Show properties of current comic</source>
<translation>Mostrar las propiedades del cómic actual</translation>
</message>
<message>
<location filename="library_window.cpp" line="301"/>
<location filename="library_window.cpp" line="333"/>
<source>Fullscreen mode on/off</source>
<translation>Modo a pantalla completa on/off</translation>
</message>
<message>
<location filename="library_window.cpp" line="334"/>
<source>Fullscreen mode on/off (F)</source>
<translation>Activar/desactivar modo a pantalla completa (F)</translation>
</message>
<message>
<location filename="library_window.cpp" line="306"/>
<location filename="library_window.cpp" line="339"/>
<source>Help, About YACReader</source>
<translation>Ayuda, A cerca de... YACReader</translation>
</message>
<message>
<location filename="library_window.cpp" line="311"/>
<location filename="library_window.cpp" line="344"/>
<source>Select root node</source>
<translation>Seleccionar el nodo raíz</translation>
</message>
<message>
<location filename="library_window.cpp" line="315"/>
<location filename="library_window.cpp" line="348"/>
<source>Expand all nodes</source>
<translation>Expandir todos los nodos</translation>
</message>
<message>
<location filename="library_window.cpp" line="319"/>
<location filename="library_window.cpp" line="352"/>
<source>Colapse all nodes</source>
<translation>Contraer todos los nodos</translation>
</message>
<message>
<location filename="library_window.cpp" line="323"/>
<location filename="library_window.cpp" line="356"/>
<source>Show options dialog</source>
<translation>Mostrar opciones</translation>
</message>
<message>
<location filename="library_window.cpp" line="339"/>
<location filename="library_window.cpp" line="360"/>
<source>Show comics server options dialog</source>
<translation></translation>
</message>
<message>
<location filename="library_window.cpp" line="376"/>
<source>Open folder...</source>
<translation>Abrir carpeta...</translation>
</message>
<message>
<location filename="library_window.cpp" line="343"/>
<location filename="library_window.cpp" line="380"/>
<source>Open containing folder...</source>
<translation>Abrir carpeta contenedora...</translation>
</message>
<message>
<location filename="library_window.cpp" line="348"/>
<location filename="library_window.cpp" line="385"/>
<source>Select all comics</source>
<translation>Seleccionar todos los cómics</translation>
</message>
<message>
<location filename="library_window.cpp" line="352"/>
<location filename="library_window.cpp" line="389"/>
<source>Edit</source>
<translation>Editar</translation>
</message>
<message>
<location filename="library_window.cpp" line="356"/>
<location filename="library_window.cpp" line="393"/>
<source>Asign current order to comics</source>
<translation>Asignar el orden actual a los cómics</translation>
</message>
<message>
<location filename="library_window.cpp" line="360"/>
<location filename="library_window.cpp" line="397"/>
<source>Update cover</source>
<translation>Actualizar portada</translation>
</message>
<message>
<location filename="library_window.cpp" line="364"/>
<location filename="library_window.cpp" line="401"/>
<source>Hide comic flow</source>
<translation>Ocultar cómic flow</translation>
</message>
<message>
<location filename="library_window.cpp" line="429"/>
<location filename="library_window.cpp" line="472"/>
<source>Library</source>
<translation>Librería</translation>
</message>
<message>
<location filename="library_window.cpp" line="644"/>
<location filename="library_window.cpp" line="665"/>
<source>Update needed</source>
<translation>Se necesita actualizar</translation>
</message>
<message>
<location filename="library_window.cpp" line="644"/>
<location filename="library_window.cpp" line="665"/>
<source>This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now?</source>
<translation>Esta biblioteca fue creada con una versión anterior de YACReaderLibrary. Es necesario que se actualice. ¿Deseas hacerlo ahora?</translation>
</message>
<message>
<location filename="library_window.cpp" line="658"/>
<location filename="library_window.cpp" line="671"/>
<source>Update failed</source>
<translation>La actualización ha fallado</translation>
</message>
<message>
<location filename="library_window.cpp" line="671"/>
<source>The current library can&apos;t be udpated. Check for write write permissions on: </source>
<translation>La librería actual no ha podido ser actualizada. Verifica que posees permisos de escritura en: </translation>
</message>
<message>
<location filename="library_window.cpp" line="712"/>
<source>Download new version</source>
<translation>Descargar la nueva versión</translation>
</message>
<message>
<location filename="library_window.cpp" line="658"/>
<location filename="library_window.cpp" line="712"/>
<source>This library was created with a newer version of YACReaderLibrary. Download the new version now?</source>
<translation>Esta biblioteca fue creada con una versión más nueva de YACReaderLibrary. ¿Deseas descargar la nueva versión ahora?</translation>
</message>
<message>
<location filename="library_window.cpp" line="681"/>
<location filename="library_window.cpp" line="733"/>
<source>Library not available</source>
<translation>Biblioteca no disponible</translation>
</message>
<message>
<location filename="library_window.cpp" line="681"/>
<location filename="library_window.cpp" line="690"/>
<location filename="library_window.cpp" line="733"/>
<location filename="library_window.cpp" line="742"/>
<source>Library </source>
<translation>La biblioteca </translation>
</message>
<message>
<location filename="library_window.cpp" line="681"/>
<location filename="library_window.cpp" line="733"/>
<source> is no longer available. Do you want to remove it?</source>
<translation> ya no esta disponible. ¿Deseas borrarla?</translation>
</message>
<message>
<location filename="library_window.cpp" line="690"/>
<location filename="library_window.cpp" line="742"/>
<source>Old library or corrupted</source>
<translation>Biblioteca antigua o corrupta</translation>
</message>
<message>
<location filename="library_window.cpp" line="690"/>
<location filename="library_window.cpp" line="742"/>
<source> is corrupted or has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now?</source>
<translation> está corrupta o ha sido creada con una versión antigua de YACReaderLibrary, por lo que debe ser creada de nuevo. ¿Deseas volver a crearla ahora?</translation>
</message>
<message>
<location filename="library_window.cpp" line="931"/>
<location filename="library_window.cpp" line="983"/>
<source>Library not found</source>
<translation>Biblioteca no encontrada</translation>
</message>
<message>
<location filename="library_window.cpp" line="931"/>
<location filename="library_window.cpp" line="983"/>
<source>The selected folder doesn&apos;t contain any library.</source>
<translation>La carpeta seleccionada no contiene ninguna biblioteca.</translation>
</message>
<message>
<location filename="library_window.cpp" line="970"/>
<location filename="library_window.cpp" line="1022"/>
<source>Saving libraries file....</source>
<translation>Guardando bibliotecas...</translation>
</message>
<message>
<location filename="library_window.cpp" line="970"/>
<location filename="library_window.cpp" line="1022"/>
<source>There was a problem saving YACReaderLibrary libraries file. Please, check if you have enough permissions in the YACReader root folder.</source>
<translation>Hubo un problema al guardar las bibliotecas de YACReaderLibrary. Por favor, comprueba si tienes suficientes permisos en el directorio raíz de YACReader.</translation>
</message>
<message>
<location filename="library_window.cpp" line="996"/>
<location filename="library_window.cpp" line="1032"/>
<location filename="library_window.cpp" line="1048"/>
<location filename="library_window.cpp" line="1084"/>
<source>Are you sure?</source>
<translation>¿Estás seguro?</translation>
</message>
<message>
<location filename="library_window.cpp" line="996"/>
<location filename="library_window.cpp" line="1048"/>
<source>Do you want delete </source>
<translation>¿Deseas borrar </translation>
</message>
<message>
<location filename="library_window.cpp" line="1032"/>
<location filename="library_window.cpp" line="1084"/>
<source>Do you want remove </source>
<translation>¿Deseas eliminar </translation>
</message>
<message>
<location filename="library_window.cpp" line="1032"/>
<location filename="library_window.cpp" line="1084"/>
<source> library?
Files won&apos;t be erased from disk.</source>
<translation>? Los archivos no serán borrados del disco.</translation>
</message>
<message>
<location filename="library_window.cpp" line="1195"/>
<location filename="library_window.cpp" line="1249"/>
<source>Asign comics numbers</source>
<translation>Asignar números de cómic</translation>
</message>
<message>
<location filename="library_window.cpp" line="1196"/>
<location filename="library_window.cpp" line="1250"/>
<source>Asign numbers starting in:</source>
<translation>Asignar números empezando en:</translation>
</message>
@ -575,54 +726,37 @@ Files won&apos;t be erased from disk.</source>
<context>
<name>OptionsDialog</name>
<message>
<location filename="options_dialog.cpp" line="19"/>
<source>Save</source>
<translation>Guardar</translation>
<translation type="obsolete">Guardar</translation>
</message>
<message>
<location filename="options_dialog.cpp" line="20"/>
<source>Cancel</source>
<translation>Cancelar</translation>
<translation type="obsolete">Cancelar</translation>
</message>
<message>
<location filename="options_dialog.cpp" line="25"/>
<source>How to show covers:</source>
<translation>Cómo mostrar las portadas:</translation>
</message>
<message>
<location filename="options_dialog.cpp" line="27"/>
<source>CoverFlow look</source>
<translation></translation>
</message>
<message>
<location filename="options_dialog.cpp" line="28"/>
<source>Stripe look</source>
<translation></translation>
</message>
<message>
<location filename="options_dialog.cpp" line="29"/>
<source>Overlapped Stripe look</source>
<oldsource>Overlaped Stripe look</oldsource>
<translation></translation>
<translation type="obsolete">Cómo mostrar las portadas:</translation>
</message>
<message>
<source>Restart is needed</source>
<translation type="obsolete">Es necesario reiniciar</translation>
</message>
<message>
<location filename="options_dialog.cpp" line="79"/>
<source>Comics directory</source>
<translation>Directorio de cómics</translation>
<translation type="obsolete">Directorio de cómics</translation>
</message>
<message>
<location filename="options_dialog.cpp" line="91"/>
<source>Saving config file....</source>
<translation>Guardando archivo de configuración...</translation>
<translation type="obsolete">Guardando archivo de configuración...</translation>
</message>
<message>
<location filename="options_dialog.cpp" line="91"/>
<source>There was a problem saving YACReaderLibrary configuration. Please, check if you have enough permissions in the YACReader root folder.</source>
<translation>Hubo un problema al guardar la configuración de YACReaderLibrary. Por favor, comprueba si tienes suficientes permisos en el directorio raíz de YACReader.</translation>
<translation type="obsolete">Hubo un problema al guardar la configuración de YACReaderLibrary. Por favor, comprueba si tienes suficientes permisos en el directorio raíz de YACReader.</translation>
</message>
<message>
<location filename="options_dialog.cpp" line="45"/>
<source>Options</source>
<translation>Opciones</translation>
</message>
</context>
<context>
@ -706,7 +840,7 @@ Files won&apos;t be erased from disk.</source>
<message>
<location filename="properties_dialog.cpp" line="159"/>
<source>Writer(s):</source>
<translation type="unfinished">Guionista(s):</translation>
<translation>Guionista(s):</translation>
</message>
<message>
<location filename="properties_dialog.cpp" line="162"/>
@ -716,7 +850,7 @@ Files won&apos;t be erased from disk.</source>
<message>
<location filename="properties_dialog.cpp" line="170"/>
<source>Inker(s):</source>
<translation type="unfinished">Entintador(es):</translation>
<translation>Entintador(es):</translation>
</message>
<message>
<location filename="properties_dialog.cpp" line="173"/>
@ -725,8 +859,9 @@ Files won&apos;t be erased from disk.</source>
</message>
<message>
<location filename="properties_dialog.cpp" line="183"/>
<source>Letterer(es):</source>
<translation type="unfinished"></translation>
<source>Letterer(s):</source>
<oldsource>Letterer(es):</oldsource>
<translation>Rotulista(s):</translation>
</message>
<message>
<location filename="properties_dialog.cpp" line="186"/>
@ -824,6 +959,29 @@ Files won&apos;t be erased from disk.</source>
<translation>Renombrar la biblioteca seleccionada</translation>
</message>
</context>
<context>
<name>ServerConfigDialog</name>
<message>
<location filename="server_config_dialog.cpp" line="15"/>
<source>Generar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="server_config_dialog.cpp" line="25"/>
<source>IP</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="server_config_dialog.cpp" line="26"/>
<source>Port</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="server_config_dialog.cpp" line="131"/>
<source>QR generator error!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TableModel</name>
<message>
@ -898,13 +1056,13 @@ Files won&apos;t be erased from disk.</source>
<context>
<name>YACReaderFieldEdit</name>
<message>
<location filename="../common/custom_widgets.cpp" line="383"/>
<location filename="../common/custom_widgets.cpp" line="403"/>
<location filename="../common/custom_widgets.cpp" line="424"/>
<location filename="../common/custom_widgets.cpp" line="444"/>
<source>Click to overwrite</source>
<translation>Click para sobreescribir</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="385"/>
<location filename="../common/custom_widgets.cpp" line="426"/>
<source>Restore to default</source>
<translation>Restaurar valor por defecto</translation>
</message>
@ -912,17 +1070,171 @@ Files won&apos;t be erased from disk.</source>
<context>
<name>YACReaderFieldPlainTextEdit</name>
<message>
<location filename="../common/custom_widgets.cpp" line="421"/>
<location filename="../common/custom_widgets.cpp" line="432"/>
<location filename="../common/custom_widgets.cpp" line="457"/>
<location filename="../common/custom_widgets.cpp" line="463"/>
<location filename="../common/custom_widgets.cpp" line="465"/>
<location filename="../common/custom_widgets.cpp" line="476"/>
<location filename="../common/custom_widgets.cpp" line="501"/>
<location filename="../common/custom_widgets.cpp" line="507"/>
<source>Click to overwrite</source>
<translation>Click para sobreescribir</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="422"/>
<location filename="../common/custom_widgets.cpp" line="466"/>
<source>Restore to default</source>
<translation>Restaurar valor por defecto</translation>
</message>
</context>
<context>
<name>YACReaderFlowConfigWidget</name>
<message>
<location filename="../common/custom_widgets.cpp" line="1155"/>
<source>How to show covers:</source>
<translation>Cómo mostrar las portadas:</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="1157"/>
<source>CoverFlow look</source>
<translation>Tipo CoverFlow</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="1158"/>
<source>Stripe look</source>
<translation>Tipo tira</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="1159"/>
<source>Overlapped Stripe look</source>
<translation>Tipo tira solapada</translation>
</message>
</context>
<context>
<name>YACReaderGLFlowConfigWidget</name>
<message>
<location filename="../common/custom_widgets.cpp" line="939"/>
<source>Presets:</source>
<translation>Predeterminados:</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="941"/>
<source>Classic look</source>
<translation>Tipo clásico</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="944"/>
<source>Stripe look</source>
<translation>Tipo tira</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="947"/>
<source>Overlapped Stripe look</source>
<translation>Tipo tira solapada</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="950"/>
<source>Modern look</source>
<translation>Tipo moderno</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="953"/>
<source>Roulette look</source>
<translation>Tipo ruleta</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="1000"/>
<source>Custom:</source>
<translation>Personalizado:</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="1003"/>
<source>View angle</source>
<translation>Ángulo de vista</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="1009"/>
<source>Position</source>
<translation>Posición</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="1015"/>
<source>Cover gap</source>
<translation>Hueco entre portadas</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="1021"/>
<source>Central gap</source>
<translation>Hueco central</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="1027"/>
<source>Zoom</source>
<translation>Zoom</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="1033"/>
<source>Y offset</source>
<translation>Desplazamiento en Y</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="1039"/>
<source>Z offset</source>
<translation>Desplazamiento en Z</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="1045"/>
<source>Cover Angle</source>
<translation>Ángulo de las portadas </translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="1051"/>
<source>Visibility</source>
<translation>Visibilidad</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="1057"/>
<source>Light</source>
<translation>Luz</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="1063"/>
<source>Max angle</source>
<translation>Ángulo máximo</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="1093"/>
<source>Low Performance</source>
<translation>Rendimiento bajo</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="1095"/>
<source>High Performance</source>
<translation>Alto rendimiento</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="1106"/>
<source>Use VSync (improve the image quality in fullscreen mode, worse performance)</source>
<translation>Usar VSync (mejora la calidad de imagen en pantalla completa, peor rendimiento) </translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="1114"/>
<source>Performance:</source>
<translation>Rendimiento:</translation>
</message>
</context>
<context>
<name>YACReaderOptionsDialog</name>
<message>
<location filename="../common/custom_widgets.cpp" line="575"/>
<source>Save</source>
<translation>Guardar</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="576"/>
<source>Cancel</source>
<translation>Cancelar</translation>
</message>
<message>
<location filename="../common/custom_widgets.cpp" line="584"/>
<source>Use hardware acceleration (restart needed)</source>
<translation>Usar aceleración por hardware (necesario reiniciar)</translation>
</message>
</context>
</TS>