Allow deleting books (fixes #119)

pull/181/head
OzzieIsaacs 7 years ago
parent daaee5b67e
commit cd0d450829

@ -25,6 +25,7 @@ Session = sessionmaker()
Session.configure(bind=engine)
session = scoped_session(Session)
class GdriveId(Base):
__tablename__ = 'gdrive_ids'
@ -36,6 +37,7 @@ class GdriveId(Base):
def __repr__(self):
return str(self.path)
class PermissionAdded(Base):
__tablename__ = 'permissions_added'
@ -45,6 +47,7 @@ class PermissionAdded(Base):
def __repr__(self):
return str(self.gdrive_id)
def migrate():
if not engine.dialect.has_table(engine.connect(), "permissions_added"):
PermissionAdded.__table__.create(bind = engine)
@ -69,6 +72,7 @@ if not os.path.exists(dbpath):
migrate()
def getDrive(gauth=None):
if not gauth:
gauth = GoogleAuth(settings_file='settings.yaml')
@ -83,6 +87,7 @@ def getDrive(gauth=None):
# Save the current credentials to a file
return GoogleDrive(gauth)
def getEbooksFolder(drive=None):
if not drive:
drive = getDrive()
@ -93,6 +98,7 @@ def getEbooksFolder(drive=None):
fileList = drive.ListFile({'q': ebooksFolder}).GetList()
return fileList[0]
def getEbooksFolderId(drive=None):
storedPathName = session.query(GdriveId).filter(GdriveId.path == '/').first()
if storedPathName:
@ -105,6 +111,7 @@ def getEbooksFolderId(drive=None):
session.commit()
return
def getFolderInFolder(parentId, folderName, drive=None):
if not drive:
drive = getDrive()
@ -114,6 +121,7 @@ def getFolderInFolder(parentId, folderName, drive=None):
fileList = drive.ListFile({'q': folder}).GetList()
return fileList[0]
def getFile(pathId, fileName, drive=None):
if not drive:
drive = getDrive()
@ -124,6 +132,7 @@ def getFile(pathId, fileName, drive=None):
fileList = drive.ListFile({'q': metaDataFile}).GetList()
return fileList[0]
def getFolderId(path, drive=None):
if not drive:
drive = getDrive()
@ -171,6 +180,7 @@ def getFileFromEbooksFolder(drive, path, fileName):
return getFile(folderId, fileName, drive)
def copyDriveFileRemote(drive, origin_file_id, copy_title):
if not drive:
drive = getDrive()
@ -185,6 +195,7 @@ def copyDriveFileRemote(drive, origin_file_id, copy_title):
print ('An error occurred: %s' % error)
return None
def downloadFile(drive, path, filename, output):
if not drive:
drive = getDrive()
@ -193,6 +204,7 @@ def downloadFile(drive, path, filename, output):
f = getFileFromEbooksFolder(drive, path, filename)
f.GetContentFile(output)
def backupCalibreDbAndOptionalDownload(drive, f=None):
if not drive:
drive = getDrive()
@ -240,6 +252,7 @@ def copyToDrive(drive, uploadFile, createRoot, replaceFiles,
driveFile.SetContentFile(os.path.join(prevDir, uploadFile))
driveFile.Upload()
def uploadFileToEbooksFolder(drive, destFile, f):
if not drive:
drive = getDrive()
@ -296,6 +309,7 @@ def watchChange(drive, channel_id, channel_type, channel_address,
body['expiration'] = expiration
return drive.auth.service.changes().watch(body=body).execute()
def watchFile(drive, file_id, channel_id, channel_type, channel_address,
channel_token=None, expiration=None):
"""Watch for any changes to a specific file.
@ -329,6 +343,7 @@ def watchFile(drive, file_id, channel_id, channel_type, channel_address,
body['expiration'] = expiration
return drive.auth.service.files().watch(fileId=file_id, body=body).execute()
def stopChannel(drive, channel_id, resource_id):
"""Stop watching to a specific channel.
Args:
@ -349,6 +364,7 @@ def stopChannel(drive, channel_id, resource_id):
}
return drive.auth.service.channels().stop(body=body).execute()
def getChangeById (drive, change_id):
if not drive:
drive = getDrive()

@ -38,6 +38,7 @@ span.glyphicon.glyphicon-tags {padding-right: 5px;color: #999;vertical-align: te
}
.navbar-default .navbar-toggle .icon-bar {background-color: #000;}
.navbar-default .navbar-toggle {border-color: #000;}
.cover { margin-bottom: 10px;}
.btn-file {position: relative; overflow: hidden;}
.btn-file input[type=file] {position: absolute; top: 0; right: 0; min-width: 100%; min-height: 100%; font-size: 100px; text-align: right; filter: alpha(opacity=0); opacity: 0; outline: none; background: white; cursor: inherit; display: block;}

@ -1,6 +1,8 @@
{% extends "layout.html" %}
{% block body %}
{% if book %}
<form role="form" action="{{ url_for('edit_book', book_id=book.id) }}" method="post">
<div class="col-sm-3 col-lg-3 col-xs-12">
<div class="cover">
{% if book.has_cover %}
@ -9,9 +11,13 @@
<img src="{{ url_for('static', filename='generic_cover.jpg') }}" />
{% endif %}
</div>
{% if g.user.role_delete_books() %}
<div class="text-center">
<button type="button" class="btn btn-danger" id="delete" data-toggle="modal" data-target="#deleteModal">{{_("Delete Book")}}</button>
</div>
<div class="col-sm-8">
<form role="form" action="{{ url_for('edit_book', book_id=book.id) }}" method="post">
{% endif %}
</div>
<div class="col-sm-9 col-xs-12">
<div class="form-group">
<label for="book_title">{{_('Book Title')}}</label>
<input type="text" class="form-control" name="book_title" id="book_title" value="{{book.title}}">
@ -107,9 +113,31 @@
<a href="#" id="get_meta" class="btn btn-default" data-toggle="modal" data-target="#metaModal">{{_('Get metadata')}}</a>
<button type="submit" class="btn btn-default">{{_('Submit')}}</button>
<a href="{{ url_for('show_book', book_id=book.id) }}" class="btn btn-default">{{_('Back')}}</a>
</div>
</form>
{% endif %}
{% if g.user.role_delete_books() %}
<div class="modal fade" id="deleteModal" role="dialog" aria-labelledby="metaDeleteLabel">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header bg-danger text-center">
<span>{{_('Are really you sure?')}}</span>
</div>
<div class="modal-body text-center" id="meta-info">
<span>{{_('Book will be deleted from Calibre database')}}</span>
<span>{{_('and from hard disk')}}</span>
</div>
<div class="modal-footer">
<a href="{{ url_for('delete_book', book_id=book.id) }}" class="btn btn-danger">{{_('Delete')}}</a>
<button type="button" class="btn btn-default" data-dismiss="modal">{{_('Back')}}</button>
</div>
</div>
</div>
</div>
{% endif %}
<div class="modal fade" id="metaModal" tabindex="-1" role="dialog" aria-labelledby="metaModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">

@ -110,6 +110,10 @@
<input type="checkbox" name="edit_role" id="edit_role" {% if content.role_edit() %}checked{% endif %}>
<label for="edit_role">{{_('Allow Edit')}}</label>
</div>
<div class="form-group">
<input type="checkbox" name="delete_role" id="delete_role" {% if content.role_delete_books() %}checked{% endif %}>
<label for="delete_role">{{_('Allow Delete books')}}</label>
</div>
<div class="form-group">
<input type="checkbox" name="passwd_role" id="passwd_role" {% if content.role_passwd() %}checked{% endif %}>
<label for="passwd_role">{{_('Allow Changing Password')}}</label>

@ -98,6 +98,10 @@
<div class="form-group">
<input type="checkbox" name="edit_role" id="edit_role" {% if content.role_edit() %}checked{% endif %}>
<label for="edit_role">{{_('Allow Edit')}}</label>
</div>
<div class="form-group">
<input type="checkbox" name="delete_role" id="delete_role" {% if content.role_delete_books() %}checked{% endif %}>
<label for="delete_role">{{_('Allow Delete books')}}</label>
</div>
{% if not content.role_anonymous() %}
<div class="form-group">

@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n"
"POT-Creation-Date: 2017-04-14 09:38+0200\n"
"POT-Creation-Date: 2017-04-14 20:25+0200\n"
"PO-Revision-Date: 2016-07-12 19:54+0200\n"
"Last-Translator: Ozzie Isaacs\n"
"Language: de\n"
@ -32,7 +32,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.3.4\n"
#: cps/book_formats.py:113 cps/book_formats.py:117 cps/web.py:1235
#: cps/book_formats.py:113 cps/book_formats.py:117 cps/web.py:1258
msgid "not installed"
msgstr "Nicht installiert"
@ -63,329 +63,333 @@ msgstr ""
msgid "Could not convert epub to mobi"
msgstr "Konnte .epub nicht nach .mobi konvertieren"
#: cps/ub.py:471
#: cps/ub.py:481
msgid "Guest"
msgstr "Gast"
#: cps/web.py:894
#: cps/web.py:917
msgid "Requesting update package"
msgstr "Frage Update Paket an"
#: cps/web.py:895
#: cps/web.py:918
msgid "Downloading update package"
msgstr "Lade Update Paket herunter"
#: cps/web.py:896
#: cps/web.py:919
msgid "Unzipping update package"
msgstr "Entpacke Update Paket"
#: cps/web.py:897
#: cps/web.py:920
msgid "Files are replaced"
msgstr "Ersetze Dateien"
#: cps/web.py:898
#: cps/web.py:921
msgid "Database connections are closed"
msgstr "Schließe Datenbankverbindungen"
#: cps/web.py:899
#: cps/web.py:922
msgid "Server is stopped"
msgstr "Stoppe Server"
#: cps/web.py:900
#: cps/web.py:923
msgid "Update finished, please press okay and reload page"
msgstr "Update abgeschlossen, bitte okay drücken und Seite neu laden"
#: cps/web.py:974
#: cps/web.py:997
msgid "Latest Books"
msgstr "Letzte Bücher"
#: cps/web.py:1005
#: cps/web.py:1028
msgid "Hot Books (most downloaded)"
msgstr "Beliebte Bücher (die meisten Downloads)"
#: cps/web.py:1015
#: cps/web.py:1038
msgid "Best rated books"
msgstr "Best bewertete Bücher"
#: cps/templates/index.xml:36 cps/web.py:1024
#: cps/templates/index.xml:36 cps/web.py:1047
msgid "Random Books"
msgstr "Zufällige Bücher"
#: cps/web.py:1037
#: cps/web.py:1060
msgid "Author list"
msgstr "Autorenliste"
#: cps/web.py:1048
#: cps/web.py:1072
#, python-format
msgid "Author: %(name)s"
msgstr "Autor: %(name)s"
#: cps/web.py:1050 cps/web.py:1078 cps/web.py:1212 cps/web.py:1614
#: cps/web.py:2578
#: cps/web.py:1074 cps/web.py:1102 cps/web.py:1235 cps/web.py:1672
#: cps/web.py:2655
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr ""
"Buch öffnen fehlgeschlagen. Datei existiert nicht, oder ist nicht "
"zugänglich."
#: cps/templates/index.xml:71 cps/web.py:1064
#: cps/templates/index.xml:71 cps/web.py:1088
msgid "Series list"
msgstr "Liste Serien"
#: cps/web.py:1076
#: cps/web.py:1100
#, python-format
msgid "Series: %(serie)s"
msgstr "Serie: %(serie)s"
#: cps/web.py:1109
#: cps/web.py:1133
msgid "Available languages"
msgstr "Verfügbare Sprachen"
#: cps/web.py:1124
#: cps/web.py:1148
#, python-format
msgid "Language: %(name)s"
msgstr "Sprache: %(name)s"
#: cps/templates/index.xml:64 cps/web.py:1137
#: cps/templates/index.xml:64 cps/web.py:1161
msgid "Category list"
msgstr "Kategorieliste"
#: cps/web.py:1149
#: cps/web.py:1173
#, python-format
msgid "Category: %(name)s"
msgstr "Kategorie: %(name)s"
#: cps/web.py:1257
#: cps/web.py:1280
msgid "Statistics"
msgstr "Statistiken"
#: cps/web.py:1365
#: cps/web.py:1415
msgid "Server restarted, please reload page"
msgstr "Server neu gestartet,bitte Seite neu laden"
#: cps/web.py:1367
#: cps/web.py:1417
msgid "Performing shutdown of server, please close window"
msgstr "Server wird runtergefahren, bitte Fenster schließen"
#: cps/web.py:1382
#: cps/web.py:1433
msgid "Update done"
msgstr "Update durchgeführt"
#: cps/web.py:1460 cps/web.py:1473
#: cps/web.py:1511 cps/web.py:1524
msgid "search"
msgstr "Suche"
#: cps/web.py:1590 cps/web.py:1597 cps/web.py:1604 cps/web.py:1611
#: cps/web.py:1648 cps/web.py:1655 cps/web.py:1662 cps/web.py:1669
msgid "Read a Book"
msgstr "Lese ein Buch"
#: cps/web.py:1664 cps/web.py:2144
#: cps/web.py:1725 cps/web.py:2207
msgid "Please fill out all fields!"
msgstr "Bitte alle Felder ausfüllen!"
#: cps/web.py:1665 cps/web.py:1681 cps/web.py:1686 cps/web.py:1688
#: cps/web.py:1726 cps/web.py:1742 cps/web.py:1747 cps/web.py:1749
msgid "register"
msgstr "Registieren"
#: cps/web.py:1680
#: cps/web.py:1741
msgid "An unknown error occured. Please try again later."
msgstr "Es ist ein unbekannter Fehler aufgetreten. Bitte später erneut versuchen."
#: cps/web.py:1685
#: cps/web.py:1746
msgid "This username or email address is already in use."
msgstr "Der Benutzername oder die E-Mailadresse ist in bereits in Benutzung."
#: cps/web.py:1703
#: cps/web.py:1764
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr "Du bist nun eingeloggt als '%(nickname)s'"
#: cps/web.py:1708
#: cps/web.py:1769
msgid "Wrong Username or Password"
msgstr "Falscher Benutzername oder Passwort"
#: cps/web.py:1710
#: cps/web.py:1771
msgid "login"
msgstr "Login"
#: cps/web.py:1727
#: cps/web.py:1788
msgid "Please configure the SMTP mail settings first..."
msgstr "Bitte zuerst die SMTP Mail Einstellung konfigurieren ..."
#: cps/web.py:1731
#: cps/web.py:1792
#, python-format
msgid "Book successfully send to %(kindlemail)s"
msgstr "Buch erfolgreich versandt an %(kindlemail)s"
#: cps/web.py:1735
#: cps/web.py:1796
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr "Beim Senden des Buchs trat ein Fehler auf: %(res)s"
#: cps/web.py:1737 cps/web.py:2226
#: cps/web.py:1798 cps/web.py:2291
msgid "Please configure your kindle email address first..."
msgstr "Bitte die Kindle E-Mail Adresse zuuerst konfigurieren..."
#: cps/web.py:1762
#: cps/web.py:1823
#, python-format
msgid "Book has been added to shelf: %(sname)s"
msgstr "Das Buch wurde dem Bücherregal: %(sname)s hinzugefügt"
#: cps/web.py:1782
#: cps/web.py:1843
#, python-format
msgid "Book has been removed from shelf: %(sname)s"
msgstr "Das Buch wurde aus dem Bücherregal: %(sname)s entfernt"
#: cps/web.py:1800 cps/web.py:1824
#: cps/web.py:1861 cps/web.py:1885
#, python-format
msgid "A shelf with the name '%(title)s' already exists."
msgstr "Es existiert bereits ein Bücheregal mit dem Titel '%(title)s'"
#: cps/web.py:1805
#: cps/web.py:1866
#, python-format
msgid "Shelf %(title)s created"
msgstr "Bücherregal %(title)s erzeugt"
#: cps/web.py:1807 cps/web.py:1835
#: cps/web.py:1868 cps/web.py:1896
msgid "There was an error"
msgstr "Es trat ein Fehler auf"
#: cps/web.py:1808 cps/web.py:1810
#: cps/web.py:1869 cps/web.py:1871
msgid "create a shelf"
msgstr "Bücherregal erzeugen"
#: cps/web.py:1833
#: cps/web.py:1894
#, python-format
msgid "Shelf %(title)s changed"
msgstr "Bücherregal %(title)s verändert"
#: cps/web.py:1836 cps/web.py:1838
#: cps/web.py:1897 cps/web.py:1899
msgid "Edit a shelf"
msgstr "Bücherregal editieren"
#: cps/web.py:1858
#: cps/web.py:1919
#, python-format
msgid "successfully deleted shelf %(name)s"
msgstr "Bücherregal %(name)s erfolgreich gelöscht"
#: cps/web.py:1880
#: cps/web.py:1941
#, python-format
msgid "Shelf: '%(name)s'"
msgstr "Bücherregal: '%(name)s'"
#: cps/web.py:1911
#: cps/web.py:1972
#, python-format
msgid "Change order of Shelf: '%(name)s'"
msgstr "Reihenfolge in Bücherregal '%(name)s' verändern"
#: cps/web.py:1975
#: cps/web.py:2036
msgid "Found an existing account for this email address."
msgstr "Es existiert ein Benutzerkonto für diese E-Mailadresse"
#: cps/web.py:1977 cps/web.py:1981
#: cps/web.py:2038 cps/web.py:2042
#, python-format
msgid "%(name)s's profile"
msgstr "%(name)s's Profil"
#: cps/web.py:1978
#: cps/web.py:2039
msgid "Profile updated"
msgstr "Profil aktualisiert"
#: cps/web.py:1992
#: cps/web.py:2053
msgid "Admin page"
msgstr "Admin Seite"
#: cps/web.py:2098
#: cps/web.py:2161
msgid "Calibre-web configuration updated"
msgstr "Calibre-web Konfiguration wurde aktualisiert"
#: cps/web.py:2105 cps/web.py:2111 cps/web.py:2125
#: cps/web.py:2168 cps/web.py:2174 cps/web.py:2188
msgid "Basic Configuration"
msgstr "Basis Konfiguration"
#: cps/web.py:2109
#: cps/web.py:2172
msgid "DB location is not valid, please enter correct path"
msgstr "DB Speicherort ist ungültig, bitte Pfad korrigieren"
#: cps/templates/admin.html:34 cps/web.py:2146 cps/web.py:2196
#: cps/templates/admin.html:34 cps/web.py:2209 cps/web.py:2261
msgid "Add new user"
msgstr "Neuen Benutzer hinzufügen"
#: cps/web.py:2188
#: cps/web.py:2253
#, python-format
msgid "User '%(user)s' created"
msgstr "Benutzer '%(user)s' angelegt"
#: cps/web.py:2192
#: cps/web.py:2257
msgid "Found an existing account for this email address or nickname."
msgstr ""
"Es existiert ein Benutzerkonto für diese Emailadresse oder den "
"Benutzernamen."
#: cps/web.py:2214
#: cps/web.py:2279
msgid "Mail settings updated"
msgstr "E-Mail Einstellungen aktualisiert"
#: cps/web.py:2221
#: cps/web.py:2286
#, python-format
msgid "Test E-Mail successfully send to %(kindlemail)s"
msgstr "Test E-Mail erfolgreich an %(kindlemail)s versendet"
#: cps/web.py:2224
#: cps/web.py:2289
#, python-format
msgid "There was an error sending the Test E-Mail: %(res)s"
msgstr "Fehler beim versenden der Test E-Mail: %(res)s"
#: cps/web.py:2228
#: cps/web.py:2293
msgid "E-Mail settings updated"
msgstr "E-Mail Einstellungen wurde aktualisiert"
#: cps/web.py:2229
#: cps/web.py:2294
msgid "Edit mail settings"
msgstr "E-Mail Einstellungen editieren"
#: cps/web.py:2257
#: cps/web.py:2322
#, python-format
msgid "User '%(nick)s' deleted"
msgstr "Benutzer '%(nick)s' gelöscht"
#: cps/web.py:2348
#: cps/web.py:2418
#, python-format
msgid "User '%(nick)s' updated"
msgstr "Benutzer '%(nick)s' aktualisiert"
#: cps/web.py:2351
#: cps/web.py:2421
msgid "An unknown error occured."
msgstr "Es ist ein unbekanter Fehler aufgetreten"
#: cps/web.py:2354
#: cps/web.py:2424
#, python-format
msgid "Edit User %(nick)s"
msgstr "Benutzer %(nick)s bearbeiten"
#: cps/web.py:2573 cps/web.py:2576 cps/web.py:2688
#: cps/web.py:2459 cps/web.py:2463
msgid "unknown"
msgstr "Unbekannt"
#: cps/web.py:2650 cps/web.py:2653 cps/web.py:2763
msgid "edit metadata"
msgstr "Metadaten editieren"
#: cps/web.py:2597
#: cps/web.py:2674
#, python-format
msgid "File extension \"%s\" is not allowed to be uploaded to this server"
msgstr "Die Dateiendung \"%s\" kann nicht auf diesen Server hochgeladen werden"
#: cps/web.py:2603
#: cps/web.py:2680
msgid "File to be uploaded must have an extension"
msgstr "Datei müssen eine Erweiterung haben, um hochgeladen zu werden"
#: cps/web.py:2620
#: cps/web.py:2697
#, python-format
msgid "Failed to create path %s (Permission denied)."
msgstr "Fehler beim Erzeugen des Pfads %s (Zugriff verweigert)"
#: cps/web.py:2625
#: cps/web.py:2702
#, python-format
msgid "Failed to store file %s (Permission denied)."
msgstr "Fehler beim speichern der Datei %s (Zugriff verweigert)"
#: cps/web.py:2630
#: cps/web.py:2707
#, python-format
msgid "Failed to delete file %s (Permission denied)."
msgstr "Fehler beim Löschen von Datei %s (Zugriff verweigert)"
@ -536,10 +540,10 @@ msgid "Ok"
msgstr "Ok"
#: cps/templates/admin.html:103 cps/templates/admin.html:117
#: cps/templates/book_edit.html:109 cps/templates/config_edit.html:123
#: cps/templates/email_edit.html:36 cps/templates/shelf.html:53
#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:12
#: cps/templates/user_edit.html:124
#: cps/templates/book_edit.html:115 cps/templates/book_edit.html:134
#: cps/templates/config_edit.html:127 cps/templates/email_edit.html:36
#: cps/templates/shelf.html:53 cps/templates/shelf_edit.html:19
#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:128
msgid "Back"
msgstr "Zurück"
@ -551,104 +555,124 @@ msgstr "Calibre-web wirklich stoppen"
msgid "Updating, please do not reload page"
msgstr "Updatevorgang, bitte Seite nicht neu laden"
#: cps/templates/book_edit.html:16 cps/templates/search_form.html:6
#: cps/templates/book_edit.html:16
msgid "Delete Book"
msgstr "Buch löschen"
#: cps/templates/book_edit.html:22 cps/templates/search_form.html:6
msgid "Book Title"
msgstr "Buchtitel"
#: cps/templates/book_edit.html:20 cps/templates/book_edit.html:145
#: cps/templates/book_edit.html:26 cps/templates/book_edit.html:173
#: cps/templates/search_form.html:10
msgid "Author"
msgstr "Autor"
#: cps/templates/book_edit.html:24 cps/templates/book_edit.html:147
#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:175
msgid "Description"
msgstr "Beschreibung"
#: cps/templates/book_edit.html:28 cps/templates/search_form.html:17
#: cps/templates/book_edit.html:34 cps/templates/search_form.html:17
msgid "Tags"
msgstr "Tags"
#: cps/templates/book_edit.html:33 cps/templates/layout.html:142
#: cps/templates/book_edit.html:39 cps/templates/layout.html:142
#: cps/templates/search_form.html:37
msgid "Series"
msgstr "Serien"
#: cps/templates/book_edit.html:37
#: cps/templates/book_edit.html:43
msgid "Series id"
msgstr "Serien ID"
#: cps/templates/book_edit.html:41
#: cps/templates/book_edit.html:47
msgid "Rating"
msgstr "Bewertung"
#: cps/templates/book_edit.html:45
#: cps/templates/book_edit.html:51
msgid "Cover URL (jpg)"
msgstr "Cover URL (jpg)"
#: cps/templates/book_edit.html:50 cps/templates/user_edit.html:27
#: cps/templates/book_edit.html:56 cps/templates/user_edit.html:27
msgid "Language"
msgstr "Sprache"
#: cps/templates/book_edit.html:61
#: cps/templates/book_edit.html:67
msgid "Yes"
msgstr "Ja"
#: cps/templates/book_edit.html:62
#: cps/templates/book_edit.html:68
msgid "No"
msgstr "Nein"
#: cps/templates/book_edit.html:104
#: cps/templates/book_edit.html:110
msgid "view book after edit"
msgstr "Buch nach Bearbeitung ansehen"
#: cps/templates/book_edit.html:107 cps/templates/book_edit.html:118
#: cps/templates/book_edit.html:113 cps/templates/book_edit.html:146
msgid "Get metadata"
msgstr "Metadaten laden"
#: cps/templates/book_edit.html:108 cps/templates/config_edit.html:121
#: cps/templates/book_edit.html:114 cps/templates/config_edit.html:125
#: cps/templates/login.html:19 cps/templates/search_form.html:79
#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:122
#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:126
msgid "Submit"
msgstr "Abschicken"
#: cps/templates/book_edit.html:121
#: cps/templates/book_edit.html:125
msgid "Are really you sure?"
msgstr "Sicher?"
#: cps/templates/book_edit.html:128
msgid "Book will be deleted from Calibre database"
msgstr "Das Buch wird aus der Calibre Datenbank"
#: cps/templates/book_edit.html:129
msgid "and from hard disk"
msgstr "und der Festplatte gelöscht"
#: cps/templates/book_edit.html:133
msgid "Delete"
msgstr "Löschen"
#: cps/templates/book_edit.html:149
msgid "Keyword"
msgstr "Suchbegriff"
#: cps/templates/book_edit.html:122
#: cps/templates/book_edit.html:150
msgid " Search keyword "
msgstr "Suchbegriff"
#: cps/templates/book_edit.html:124 cps/templates/layout.html:60
#: cps/templates/book_edit.html:152 cps/templates/layout.html:60
msgid "Go!"
msgstr "Los!"
#: cps/templates/book_edit.html:125
#: cps/templates/book_edit.html:153
msgid "Click the cover to load metadata to the form"
msgstr "Klicke auf das Bild um die Metadaten zu übertragen"
#: cps/templates/book_edit.html:129 cps/templates/book_edit.html:142
#: cps/templates/book_edit.html:157 cps/templates/book_edit.html:170
msgid "Loading..."
msgstr "Lade..."
#: cps/templates/book_edit.html:132
#: cps/templates/book_edit.html:160
msgid "Close"
msgstr "Schließen"
#: cps/templates/book_edit.html:143
#: cps/templates/book_edit.html:171
msgid "Search error!"
msgstr "Fehler bei Suche!"
#: cps/templates/book_edit.html:144
#: cps/templates/book_edit.html:172
msgid "No Result! Please try anonther keyword."
msgstr "Kein Ergebniss! Bitte anderen Begriff versuchen"
#: cps/templates/book_edit.html:146 cps/templates/detail.html:76
#: cps/templates/book_edit.html:174 cps/templates/detail.html:76
#: cps/templates/search_form.html:14
msgid "Publisher"
msgstr "Herausgeber"
#: cps/templates/book_edit.html:148
#: cps/templates/book_edit.html:176
msgid "Source"
msgstr "Quelle"
@ -732,15 +756,19 @@ msgstr "Uploads erlauben"
msgid "Allow Edit"
msgstr "Bearbeiten erlauben"
#: cps/templates/config_edit.html:115 cps/templates/user_edit.html:105
#: cps/templates/config_edit.html:115 cps/templates/user_edit.html:104
msgid "Allow Delete books"
msgstr "Bücher löschen erlauben"
#: cps/templates/config_edit.html:119 cps/templates/user_edit.html:109
msgid "Allow Changing Password"
msgstr "Passwort ändern erlauben"
#: cps/templates/config_edit.html:119 cps/templates/user_edit.html:109
#: cps/templates/config_edit.html:123 cps/templates/user_edit.html:113
msgid "Allow Editing Public Shelfs"
msgstr ""
msgstr "Öffentliche Bücherregale editieren erlauben"
#: cps/templates/config_edit.html:126 cps/templates/layout.html:93
#: cps/templates/config_edit.html:130 cps/templates/layout.html:93
#: cps/templates/login.html:4
msgid "Login"
msgstr "Login"
@ -1021,11 +1049,11 @@ msgstr "Reihenfolge ändern"
#: cps/templates/shelf.html:47
msgid "Do you really want to delete the shelf?"
msgstr ""
msgstr "Wirklich das Bücherregal löschen?"
#: cps/templates/shelf.html:50
msgid "Shelf will be lost for everybody and forever!"
msgstr ""
msgstr "Das Bücherregal wird für alle und für immer gelöscht"
#: cps/templates/shelf_edit.html:13
msgid "should the shelf be public?"
@ -1115,11 +1143,11 @@ msgstr "Zeige Gelesen/Ungelesen Auswahl"
msgid "Show random books in detail view"
msgstr "Zeige zufällige Bücher in der Detailansicht"
#: cps/templates/user_edit.html:116
#: cps/templates/user_edit.html:120
msgid "Delete this user"
msgstr "Benutzer löschen"
#: cps/templates/user_edit.html:131
#: cps/templates/user_edit.html:135
msgid "Recent Downloads"
msgstr "Letzte Downloads"

@ -14,7 +14,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n"
"POT-Creation-Date: 2017-04-14 09:38+0200\n"
"POT-Creation-Date: 2017-04-14 20:25+0200\n"
"PO-Revision-Date: 2017-04-04 15:09+0200\n"
"Last-Translator: Juan F. Villa <juan.villa@paisdelconocimiento.org>\n"
"Language: es\n"
@ -25,7 +25,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.3.4\n"
#: cps/book_formats.py:113 cps/book_formats.py:117 cps/web.py:1235
#: cps/book_formats.py:113 cps/book_formats.py:117 cps/web.py:1258
msgid "not installed"
msgstr "No instalado"
@ -54,327 +54,331 @@ msgstr "Formato no compatible para enviar por correo electronico"
msgid "Could not convert epub to mobi"
msgstr "No fue posible convertir de epub a mobi"
#: cps/ub.py:471
#: cps/ub.py:481
msgid "Guest"
msgstr "Invitado"
#: cps/web.py:894
#: cps/web.py:917
msgid "Requesting update package"
msgstr "Solicitando paquete de actualización"
#: cps/web.py:895
#: cps/web.py:918
msgid "Downloading update package"
msgstr "Descargando paquete de actualización"
#: cps/web.py:896
#: cps/web.py:919
msgid "Unzipping update package"
msgstr "Descomprimiendo paquete de actualización"
#: cps/web.py:897
#: cps/web.py:920
msgid "Files are replaced"
msgstr "Ficheros sustituidos"
#: cps/web.py:898
#: cps/web.py:921
msgid "Database connections are closed"
msgstr "Los conexiones de base datos están cerradas"
#: cps/web.py:899
#: cps/web.py:922
msgid "Server is stopped"
msgstr "El servidor está detenido"
#: cps/web.py:900
#: cps/web.py:923
msgid "Update finished, please press okay and reload page"
msgstr "Actualización finalizada. Por favor, pulse OK y recargue la página"
#: cps/web.py:974
#: cps/web.py:997
msgid "Latest Books"
msgstr "Libros recientes"
#: cps/web.py:1005
#: cps/web.py:1028
msgid "Hot Books (most downloaded)"
msgstr "Libros populares (los mas descargados)"
#: cps/web.py:1015
#: cps/web.py:1038
msgid "Best rated books"
msgstr "Libros mejor valorados"
#: cps/templates/index.xml:36 cps/web.py:1024
#: cps/templates/index.xml:36 cps/web.py:1047
msgid "Random Books"
msgstr "Libros al azar"
#: cps/web.py:1037
#: cps/web.py:1060
msgid "Author list"
msgstr "Lista de autores"
#: cps/web.py:1048
#: cps/web.py:1072
#, python-format
msgid "Author: %(name)s"
msgstr "Autor:%(name)s"
#: cps/web.py:1050 cps/web.py:1078 cps/web.py:1212 cps/web.py:1614
#: cps/web.py:2578
#: cps/web.py:1074 cps/web.py:1102 cps/web.py:1235 cps/web.py:1672
#: cps/web.py:2655
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr "Error en la apertura del eBook. El archivo no existe o no es accesible:"
#: cps/templates/index.xml:71 cps/web.py:1064
#: cps/templates/index.xml:71 cps/web.py:1088
msgid "Series list"
msgstr "Lista de series"
#: cps/web.py:1076
#: cps/web.py:1100
#, python-format
msgid "Series: %(serie)s"
msgstr "Series : %(serie)s"
#: cps/web.py:1109
#: cps/web.py:1133
msgid "Available languages"
msgstr "Lenguajes disponibles"
#: cps/web.py:1124
#: cps/web.py:1148
#, python-format
msgid "Language: %(name)s"
msgstr "Lenguaje: %(name)s"
#: cps/templates/index.xml:64 cps/web.py:1137
#: cps/templates/index.xml:64 cps/web.py:1161
msgid "Category list"
msgstr "Lista de categorias"
#: cps/web.py:1149
#: cps/web.py:1173
#, python-format
msgid "Category: %(name)s"
msgstr "Categoría : %(name)s"
#: cps/web.py:1257
#: cps/web.py:1280
msgid "Statistics"
msgstr "Estadisticas"
#: cps/web.py:1365
#: cps/web.py:1415
msgid "Server restarted, please reload page"
msgstr "Servidor reiniciado. Por favor, recargue la página"
#: cps/web.py:1367
#: cps/web.py:1417
msgid "Performing shutdown of server, please close window"
msgstr "Servidor en proceso de apagado. Por favor, cierre la ventana."
#: cps/web.py:1382
#: cps/web.py:1433
msgid "Update done"
msgstr "Actualización realizada"
#: cps/web.py:1460 cps/web.py:1473
#: cps/web.py:1511 cps/web.py:1524
msgid "search"
msgstr "búsqueda"
#: cps/web.py:1590 cps/web.py:1597 cps/web.py:1604 cps/web.py:1611
#: cps/web.py:1648 cps/web.py:1655 cps/web.py:1662 cps/web.py:1669
msgid "Read a Book"
msgstr "Leer un libro"
#: cps/web.py:1664 cps/web.py:2144
#: cps/web.py:1725 cps/web.py:2207
msgid "Please fill out all fields!"
msgstr "¡Por favor completar todos los campos!"
#: cps/web.py:1665 cps/web.py:1681 cps/web.py:1686 cps/web.py:1688
#: cps/web.py:1726 cps/web.py:1742 cps/web.py:1747 cps/web.py:1749
msgid "register"
msgstr "registrarse"
#: cps/web.py:1680
#: cps/web.py:1741
msgid "An unknown error occured. Please try again later."
msgstr "Error desconocido. Por favor, inténtelo de nuevo mas tarde."
#: cps/web.py:1685
#: cps/web.py:1746
msgid "This username or email address is already in use."
msgstr "Usuario o dirección de correo en uso."
#: cps/web.py:1703
#: cps/web.py:1764
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr "Sesion iniciada como : '%(nickname)s'"
#: cps/web.py:1708
#: cps/web.py:1769
msgid "Wrong Username or Password"
msgstr "Usuario o contraseña invalido"
#: cps/web.py:1710
#: cps/web.py:1771
msgid "login"
msgstr "Iniciar sesión"
#: cps/web.py:1727
#: cps/web.py:1788
msgid "Please configure the SMTP mail settings first..."
msgstr "Configurar primero los parametros SMTP por favor..."
#: cps/web.py:1731
#: cps/web.py:1792
#, python-format
msgid "Book successfully send to %(kindlemail)s"
msgstr "Envio de Libro a %(kindlemail)s correctamente"
#: cps/web.py:1735
#: cps/web.py:1796
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr "Ha sucedido un error en el envio del Libro: %(res)s"
#: cps/web.py:1737 cps/web.py:2226
#: cps/web.py:1798 cps/web.py:2291
msgid "Please configure your kindle email address first..."
msgstr "Configurar primero la dirección de correo Kindle por favor..."
#: cps/web.py:1762
#: cps/web.py:1823
#, python-format
msgid "Book has been added to shelf: %(sname)s"
msgstr "El libro fue agregado a el estante: %(sname)s"
#: cps/web.py:1782
#: cps/web.py:1843
#, python-format
msgid "Book has been removed from shelf: %(sname)s"
msgstr "El libro fue removido del estante: %(sname)s"
#: cps/web.py:1800 cps/web.py:1824
#: cps/web.py:1861 cps/web.py:1885
#, python-format
msgid "A shelf with the name '%(title)s' already exists."
msgstr "Une étagère de ce nom '%(title)s' existe déjà."
#: cps/web.py:1805
#: cps/web.py:1866
#, python-format
msgid "Shelf %(title)s created"
msgstr "Estante %(title)s creado"
#: cps/web.py:1807 cps/web.py:1835
#: cps/web.py:1868 cps/web.py:1896
msgid "There was an error"
msgstr "Ha sucedido un error"
#: cps/web.py:1808 cps/web.py:1810
#: cps/web.py:1869 cps/web.py:1871
msgid "create a shelf"
msgstr "crear un estante"
#: cps/web.py:1833
#: cps/web.py:1894
#, python-format
msgid "Shelf %(title)s changed"
msgstr "Estante %(title)s cambiado"
#: cps/web.py:1836 cps/web.py:1838
#: cps/web.py:1897 cps/web.py:1899
msgid "Edit a shelf"
msgstr "Editar un estante"
#: cps/web.py:1858
#: cps/web.py:1919
#, python-format
msgid "successfully deleted shelf %(name)s"
msgstr "Estante %(name)s fue borrado correctamente"
#: cps/web.py:1880
#: cps/web.py:1941
#, python-format
msgid "Shelf: '%(name)s'"
msgstr "Estante: '%(name)s'"
#: cps/web.py:1911
#: cps/web.py:1972
#, python-format
msgid "Change order of Shelf: '%(name)s'"
msgstr "Cambiar orden del estante: '%(name)s'"
#: cps/web.py:1975
#: cps/web.py:2036
msgid "Found an existing account for this email address."
msgstr "Existe una cuenta vinculada a esta dirección de correo."
#: cps/web.py:1977 cps/web.py:1981
#: cps/web.py:2038 cps/web.py:2042
#, python-format
msgid "%(name)s's profile"
msgstr "Perfil de %(name)s"
#: cps/web.py:1978
#: cps/web.py:2039
msgid "Profile updated"
msgstr "Perfil actualizado"
#: cps/web.py:1992
#: cps/web.py:2053
msgid "Admin page"
msgstr "Página de administración"
#: cps/web.py:2098
#: cps/web.py:2161
msgid "Calibre-web configuration updated"
msgstr "Configuración de Calibre-web actualizada"
#: cps/web.py:2105 cps/web.py:2111 cps/web.py:2125
#: cps/web.py:2168 cps/web.py:2174 cps/web.py:2188
msgid "Basic Configuration"
msgstr "Configuración básica"
#: cps/web.py:2109
#: cps/web.py:2172
msgid "DB location is not valid, please enter correct path"
msgstr "Localicación de la BD inválida. Por favor, introduzca la ruta correcta."
#: cps/templates/admin.html:34 cps/web.py:2146 cps/web.py:2196
#: cps/templates/admin.html:34 cps/web.py:2209 cps/web.py:2261
msgid "Add new user"
msgstr "Agregar un nuevo usuario"
#: cps/web.py:2188
#: cps/web.py:2253
#, python-format
msgid "User '%(user)s' created"
msgstr "Usuario '%(user)s' creado"
#: cps/web.py:2192
#: cps/web.py:2257
msgid "Found an existing account for this email address or nickname."
msgstr ""
"Se ha encontrado una cuenta vinculada a esta dirección de correo o nombre"
" de usuario."
#: cps/web.py:2214
#: cps/web.py:2279
msgid "Mail settings updated"
msgstr "Parámetros de correo actualizados"
#: cps/web.py:2221
#: cps/web.py:2286
#, python-format
msgid "Test E-Mail successfully send to %(kindlemail)s"
msgstr "Exito al realizar envio de prueba a %(kindlemail)s"
#: cps/web.py:2224
#: cps/web.py:2289
#, python-format
msgid "There was an error sending the Test E-Mail: %(res)s"
msgstr "Error al realizar envio de prueba a E-Mail: %(res)s"
#: cps/web.py:2228
#: cps/web.py:2293
msgid "E-Mail settings updated"
msgstr "Ajustes de correo electrónico actualizados"
#: cps/web.py:2229
#: cps/web.py:2294
msgid "Edit mail settings"
msgstr "Editar parametros de correo"
#: cps/web.py:2257
#: cps/web.py:2322
#, python-format
msgid "User '%(nick)s' deleted"
msgstr "Usuario '%(nick)s' borrado"
#: cps/web.py:2348
#: cps/web.py:2418
#, python-format
msgid "User '%(nick)s' updated"
msgstr "Usuario '%(nick)s' actualizado"
#: cps/web.py:2351
#: cps/web.py:2421
msgid "An unknown error occured."
msgstr "Error inesperado."
#: cps/web.py:2354
#: cps/web.py:2424
#, python-format
msgid "Edit User %(nick)s"
msgstr "Editar Usuario %(nick)s"
#: cps/web.py:2573 cps/web.py:2576 cps/web.py:2688
#: cps/web.py:2459 cps/web.py:2463
msgid "unknown"
msgstr ""
#: cps/web.py:2650 cps/web.py:2653 cps/web.py:2763
msgid "edit metadata"
msgstr "editar metainformación"
#: cps/web.py:2597
#: cps/web.py:2674
#, python-format
msgid "File extension \"%s\" is not allowed to be uploaded to this server"
msgstr "No se permite subir archivos con la extensión \"%s\" a este servidor"
#: cps/web.py:2603
#: cps/web.py:2680
msgid "File to be uploaded must have an extension"
msgstr "El archivo a subir debe tener una extensión"
#: cps/web.py:2620
#: cps/web.py:2697
#, python-format
msgid "Failed to create path %s (Permission denied)."
msgstr "Fallo al crear la ruta %s (permiso negado)"
#: cps/web.py:2625
#: cps/web.py:2702
#, python-format
msgid "Failed to store file %s (Permission denied)."
msgstr "Fallo al almacenar el archivo %s (permiso negado)"
#: cps/web.py:2630
#: cps/web.py:2707
#, python-format
msgid "Failed to delete file %s (Permission denied)."
msgstr "Fallo al borrar el archivo %s (permiso negado)"
@ -525,10 +529,10 @@ msgid "Ok"
msgstr "Ok"
#: cps/templates/admin.html:103 cps/templates/admin.html:117
#: cps/templates/book_edit.html:109 cps/templates/config_edit.html:123
#: cps/templates/email_edit.html:36 cps/templates/shelf.html:53
#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:12
#: cps/templates/user_edit.html:124
#: cps/templates/book_edit.html:115 cps/templates/book_edit.html:134
#: cps/templates/config_edit.html:127 cps/templates/email_edit.html:36
#: cps/templates/shelf.html:53 cps/templates/shelf_edit.html:19
#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:128
msgid "Back"
msgstr "Regresar"
@ -540,104 +544,124 @@ msgstr "¿Seguro que quiere detener Calibre-web?"
msgid "Updating, please do not reload page"
msgstr "Actualizando. Por favor, no recargue la página."
#: cps/templates/book_edit.html:16 cps/templates/search_form.html:6
#: cps/templates/book_edit.html:16
msgid "Delete Book"
msgstr ""
#: cps/templates/book_edit.html:22 cps/templates/search_form.html:6
msgid "Book Title"
msgstr "Titulo del Libro"
#: cps/templates/book_edit.html:20 cps/templates/book_edit.html:145
#: cps/templates/book_edit.html:26 cps/templates/book_edit.html:173
#: cps/templates/search_form.html:10
msgid "Author"
msgstr "Autor"
#: cps/templates/book_edit.html:24 cps/templates/book_edit.html:147
#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:175
msgid "Description"
msgstr "Descripcion"
#: cps/templates/book_edit.html:28 cps/templates/search_form.html:17
#: cps/templates/book_edit.html:34 cps/templates/search_form.html:17
msgid "Tags"
msgstr "Etiqueta"
#: cps/templates/book_edit.html:33 cps/templates/layout.html:142
#: cps/templates/book_edit.html:39 cps/templates/layout.html:142
#: cps/templates/search_form.html:37
msgid "Series"
msgstr "Series"
#: cps/templates/book_edit.html:37
#: cps/templates/book_edit.html:43
msgid "Series id"
msgstr "Id de la serie"
#: cps/templates/book_edit.html:41
#: cps/templates/book_edit.html:47
msgid "Rating"
msgstr "Puntaje"
#: cps/templates/book_edit.html:45
#: cps/templates/book_edit.html:51
msgid "Cover URL (jpg)"
msgstr "URL de la Cubierta (jpg)"
#: cps/templates/book_edit.html:50 cps/templates/user_edit.html:27
#: cps/templates/book_edit.html:56 cps/templates/user_edit.html:27
msgid "Language"
msgstr "Lenguaje"
#: cps/templates/book_edit.html:61
#: cps/templates/book_edit.html:67
msgid "Yes"
msgstr "Si"
#: cps/templates/book_edit.html:62
#: cps/templates/book_edit.html:68
msgid "No"
msgstr "No"
#: cps/templates/book_edit.html:104
#: cps/templates/book_edit.html:110
msgid "view book after edit"
msgstr "Ver libro tras la edicion"
#: cps/templates/book_edit.html:107 cps/templates/book_edit.html:118
#: cps/templates/book_edit.html:113 cps/templates/book_edit.html:146
msgid "Get metadata"
msgstr "Obtener metainformación"
#: cps/templates/book_edit.html:108 cps/templates/config_edit.html:121
#: cps/templates/book_edit.html:114 cps/templates/config_edit.html:125
#: cps/templates/login.html:19 cps/templates/search_form.html:79
#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:122
#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:126
msgid "Submit"
msgstr "Enviar"
#: cps/templates/book_edit.html:121
#: cps/templates/book_edit.html:125
msgid "Are really you sure?"
msgstr ""
#: cps/templates/book_edit.html:128
msgid "Book will be deleted from Calibre database"
msgstr ""
#: cps/templates/book_edit.html:129
msgid "and from hard disk"
msgstr ""
#: cps/templates/book_edit.html:133
msgid "Delete"
msgstr ""
#: cps/templates/book_edit.html:149
msgid "Keyword"
msgstr "Palabra clave"
#: cps/templates/book_edit.html:122
#: cps/templates/book_edit.html:150
msgid " Search keyword "
msgstr "Buscar palabras clave"
#: cps/templates/book_edit.html:124 cps/templates/layout.html:60
#: cps/templates/book_edit.html:152 cps/templates/layout.html:60
msgid "Go!"
msgstr "¡Vamos!"
#: cps/templates/book_edit.html:125
#: cps/templates/book_edit.html:153
msgid "Click the cover to load metadata to the form"
msgstr "Haga clic en la portada para cargar la metainformación en el formulario"
#: cps/templates/book_edit.html:129 cps/templates/book_edit.html:142
#: cps/templates/book_edit.html:157 cps/templates/book_edit.html:170
msgid "Loading..."
msgstr "Cargando..."
#: cps/templates/book_edit.html:132
#: cps/templates/book_edit.html:160
msgid "Close"
msgstr "Cerrar"
#: cps/templates/book_edit.html:143
#: cps/templates/book_edit.html:171
msgid "Search error!"
msgstr "¡Error en la búsqueda!"
#: cps/templates/book_edit.html:144
#: cps/templates/book_edit.html:172
msgid "No Result! Please try anonther keyword."
msgstr "¡Sin resultados! Por favor, pruebe otra palabra clave."
#: cps/templates/book_edit.html:146 cps/templates/detail.html:76
#: cps/templates/book_edit.html:174 cps/templates/detail.html:76
#: cps/templates/search_form.html:14
msgid "Publisher"
msgstr "Editor"
#: cps/templates/book_edit.html:148
#: cps/templates/book_edit.html:176
msgid "Source"
msgstr "Origen"
@ -721,15 +745,19 @@ msgstr "Permitir subidas de archivos"
msgid "Allow Edit"
msgstr "Permitir editar"
#: cps/templates/config_edit.html:115 cps/templates/user_edit.html:105
#: cps/templates/config_edit.html:115 cps/templates/user_edit.html:104
msgid "Allow Delete books"
msgstr ""
#: cps/templates/config_edit.html:119 cps/templates/user_edit.html:109
msgid "Allow Changing Password"
msgstr "Permitir cambiar la clave"
#: cps/templates/config_edit.html:119 cps/templates/user_edit.html:109
#: cps/templates/config_edit.html:123 cps/templates/user_edit.html:113
msgid "Allow Editing Public Shelfs"
msgstr ""
#: cps/templates/config_edit.html:126 cps/templates/layout.html:93
#: cps/templates/config_edit.html:130 cps/templates/layout.html:93
#: cps/templates/login.html:4
msgid "Login"
msgstr "Inicio de Sesion"
@ -1104,11 +1132,11 @@ msgstr "Mostrar leídos y no leídos"
msgid "Show random books in detail view"
msgstr "Mostrar libro aleatorios con vista detallada"
#: cps/templates/user_edit.html:116
#: cps/templates/user_edit.html:120
msgid "Delete this user"
msgstr "Borrar este usuario"
#: cps/templates/user_edit.html:131
#: cps/templates/user_edit.html:135
msgid "Recent Downloads"
msgstr "Descargas Recientes"

@ -20,7 +20,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n"
"POT-Creation-Date: 2017-04-14 09:38+0200\n"
"POT-Creation-Date: 2017-04-14 20:25+0200\n"
"PO-Revision-Date: 2016-11-13 18:35+0100\n"
"Last-Translator: Nicolas Roudninski <nicoroud@gmail.com>\n"
"Language: fr\n"
@ -31,7 +31,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.3.4\n"
#: cps/book_formats.py:113 cps/book_formats.py:117 cps/web.py:1235
#: cps/book_formats.py:113 cps/book_formats.py:117 cps/web.py:1258
msgid "not installed"
msgstr ""
@ -60,327 +60,331 @@ msgstr "Impossible de trouver un format adapté à envoyer par courriel"
msgid "Could not convert epub to mobi"
msgstr "Impossible de convertir epub vers mobi"
#: cps/ub.py:471
#: cps/ub.py:481
msgid "Guest"
msgstr ""
#: cps/web.py:894
#: cps/web.py:917
msgid "Requesting update package"
msgstr ""
#: cps/web.py:895
#: cps/web.py:918
msgid "Downloading update package"
msgstr ""
#: cps/web.py:896
#: cps/web.py:919
msgid "Unzipping update package"
msgstr ""
#: cps/web.py:897
#: cps/web.py:920
msgid "Files are replaced"
msgstr ""
#: cps/web.py:898
#: cps/web.py:921
msgid "Database connections are closed"
msgstr ""
#: cps/web.py:899
#: cps/web.py:922
msgid "Server is stopped"
msgstr ""
#: cps/web.py:900
#: cps/web.py:923
msgid "Update finished, please press okay and reload page"
msgstr ""
#: cps/web.py:974
#: cps/web.py:997
msgid "Latest Books"
msgstr "Derniers livres"
#: cps/web.py:1005
#: cps/web.py:1028
msgid "Hot Books (most downloaded)"
msgstr "Livres populaires (les plus téléchargés)"
#: cps/web.py:1015
#: cps/web.py:1038
msgid "Best rated books"
msgstr ""
#: cps/templates/index.xml:36 cps/web.py:1024
#: cps/templates/index.xml:36 cps/web.py:1047
msgid "Random Books"
msgstr "Livres au hasard"
#: cps/web.py:1037
#: cps/web.py:1060
msgid "Author list"
msgstr "Liste des auteurs"
#: cps/web.py:1048
#: cps/web.py:1072
#, python-format
msgid "Author: %(name)s"
msgstr ""
#: cps/web.py:1050 cps/web.py:1078 cps/web.py:1212 cps/web.py:1614
#: cps/web.py:2578
#: cps/web.py:1074 cps/web.py:1102 cps/web.py:1235 cps/web.py:1672
#: cps/web.py:2655
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr ""
"Erreur d'ouverture du livre numérique. Le fichier n'existe pas ou n'est "
"pas accessible :"
#: cps/templates/index.xml:71 cps/web.py:1064
#: cps/templates/index.xml:71 cps/web.py:1088
msgid "Series list"
msgstr "Liste des séries"
#: cps/web.py:1076
#: cps/web.py:1100
#, python-format
msgid "Series: %(serie)s"
msgstr "Séries : %(serie)s"
#: cps/web.py:1109
#: cps/web.py:1133
msgid "Available languages"
msgstr "Langues disponibles"
#: cps/web.py:1124
#: cps/web.py:1148
#, python-format
msgid "Language: %(name)s"
msgstr "Langue : %(name)s"
#: cps/templates/index.xml:64 cps/web.py:1137
#: cps/templates/index.xml:64 cps/web.py:1161
msgid "Category list"
msgstr "Liste des catégories"
#: cps/web.py:1149
#: cps/web.py:1173
#, python-format
msgid "Category: %(name)s"
msgstr "Catégorie : %(name)s"
#: cps/web.py:1257
#: cps/web.py:1280
msgid "Statistics"
msgstr "Statistiques"
#: cps/web.py:1365
#: cps/web.py:1415
msgid "Server restarted, please reload page"
msgstr ""
#: cps/web.py:1367
#: cps/web.py:1417
msgid "Performing shutdown of server, please close window"
msgstr ""
#: cps/web.py:1382
#: cps/web.py:1433
msgid "Update done"
msgstr ""
#: cps/web.py:1460 cps/web.py:1473
#: cps/web.py:1511 cps/web.py:1524
msgid "search"
msgstr ""
#: cps/web.py:1590 cps/web.py:1597 cps/web.py:1604 cps/web.py:1611
#: cps/web.py:1648 cps/web.py:1655 cps/web.py:1662 cps/web.py:1669
msgid "Read a Book"
msgstr "Lire un livre"
#: cps/web.py:1664 cps/web.py:2144
#: cps/web.py:1725 cps/web.py:2207
msgid "Please fill out all fields!"
msgstr "SVP, complétez tous les champs !"
#: cps/web.py:1665 cps/web.py:1681 cps/web.py:1686 cps/web.py:1688
#: cps/web.py:1726 cps/web.py:1742 cps/web.py:1747 cps/web.py:1749
msgid "register"
msgstr "S'enregistrer"
#: cps/web.py:1680
#: cps/web.py:1741
msgid "An unknown error occured. Please try again later."
msgstr "Une erreur a eu lieu. Merci de réessayez plus tard."
#: cps/web.py:1685
#: cps/web.py:1746
msgid "This username or email address is already in use."
msgstr "Ce nom d'utilisateur ou cette adresse de courriel est déjà utilisée."
#: cps/web.py:1703
#: cps/web.py:1764
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr "Vous êtes maintenant connecté sous : '%(nickname)s'"
#: cps/web.py:1708
#: cps/web.py:1769
msgid "Wrong Username or Password"
msgstr "Mauvais nom d'utilisateur ou mot de passe"
#: cps/web.py:1710
#: cps/web.py:1771
msgid "login"
msgstr "Connexion"
#: cps/web.py:1727
#: cps/web.py:1788
msgid "Please configure the SMTP mail settings first..."
msgstr "Veillez configurer les paramètres smtp d'abord..."
#: cps/web.py:1731
#: cps/web.py:1792
#, python-format
msgid "Book successfully send to %(kindlemail)s"
msgstr "Livres envoyés à %(kindlemail)s avec succès"
#: cps/web.py:1735
#: cps/web.py:1796
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr "Il y a eu une erreur en envoyant ce livre : %(res)s"
#: cps/web.py:1737 cps/web.py:2226
#: cps/web.py:1798 cps/web.py:2291
msgid "Please configure your kindle email address first..."
msgstr "Veuillez configurer votre adresse kindle d'abord..."
#: cps/web.py:1762
#: cps/web.py:1823
#, python-format
msgid "Book has been added to shelf: %(sname)s"
msgstr "Le livre a bien été ajouté à l'étagère : %(sname)s"
#: cps/web.py:1782
#: cps/web.py:1843
#, python-format
msgid "Book has been removed from shelf: %(sname)s"
msgstr "Le livre a été supprimé de l'étagère %(sname)s"
#: cps/web.py:1800 cps/web.py:1824
#: cps/web.py:1861 cps/web.py:1885
#, python-format
msgid "A shelf with the name '%(title)s' already exists."
msgstr "Une étagère de ce nom '%(title)s' existe déjà."
#: cps/web.py:1805
#: cps/web.py:1866
#, python-format
msgid "Shelf %(title)s created"
msgstr "Étagère %(title)s créée"
#: cps/web.py:1807 cps/web.py:1835
#: cps/web.py:1868 cps/web.py:1896
msgid "There was an error"
msgstr "Il y a eu une erreur"
#: cps/web.py:1808 cps/web.py:1810
#: cps/web.py:1869 cps/web.py:1871
msgid "create a shelf"
msgstr "Créer une étagère"
#: cps/web.py:1833
#: cps/web.py:1894
#, python-format
msgid "Shelf %(title)s changed"
msgstr ""
#: cps/web.py:1836 cps/web.py:1838
#: cps/web.py:1897 cps/web.py:1899
msgid "Edit a shelf"
msgstr ""
#: cps/web.py:1858
#: cps/web.py:1919
#, python-format
msgid "successfully deleted shelf %(name)s"
msgstr "L'étagère %(name)s a été supprimé avec succès"
#: cps/web.py:1880
#: cps/web.py:1941
#, python-format
msgid "Shelf: '%(name)s'"
msgstr "Étagère : '%(name)s'"
#: cps/web.py:1911
#: cps/web.py:1972
#, python-format
msgid "Change order of Shelf: '%(name)s'"
msgstr ""
#: cps/web.py:1975
#: cps/web.py:2036
msgid "Found an existing account for this email address."
msgstr "Un compte avec cette adresse de courriel existe déjà."
#: cps/web.py:1977 cps/web.py:1981
#: cps/web.py:2038 cps/web.py:2042
#, python-format
msgid "%(name)s's profile"
msgstr "Profil de %(name)s"
#: cps/web.py:1978
#: cps/web.py:2039
msgid "Profile updated"
msgstr "Profil mis à jour"
#: cps/web.py:1992
#: cps/web.py:2053
msgid "Admin page"
msgstr ""
#: cps/web.py:2098
#: cps/web.py:2161
msgid "Calibre-web configuration updated"
msgstr ""
#: cps/web.py:2105 cps/web.py:2111 cps/web.py:2125
#: cps/web.py:2168 cps/web.py:2174 cps/web.py:2188
msgid "Basic Configuration"
msgstr ""
#: cps/web.py:2109
#: cps/web.py:2172
msgid "DB location is not valid, please enter correct path"
msgstr ""
#: cps/templates/admin.html:34 cps/web.py:2146 cps/web.py:2196
#: cps/templates/admin.html:34 cps/web.py:2209 cps/web.py:2261
msgid "Add new user"
msgstr "Ajouter un nouvel utilisateur"
#: cps/web.py:2188
#: cps/web.py:2253
#, python-format
msgid "User '%(user)s' created"
msgstr "Utilisateur '%(user)s' créé"
#: cps/web.py:2192
#: cps/web.py:2257
msgid "Found an existing account for this email address or nickname."
msgstr "Un compte avec cette adresse de courriel ou ce surnom existe déjà."
#: cps/web.py:2214
#: cps/web.py:2279
msgid "Mail settings updated"
msgstr "Paramètres de courriel mis à jour"
#: cps/web.py:2221
#: cps/web.py:2286
#, python-format
msgid "Test E-Mail successfully send to %(kindlemail)s"
msgstr ""
#: cps/web.py:2224
#: cps/web.py:2289
#, python-format
msgid "There was an error sending the Test E-Mail: %(res)s"
msgstr ""
#: cps/web.py:2228
#: cps/web.py:2293
msgid "E-Mail settings updated"
msgstr ""
#: cps/web.py:2229
#: cps/web.py:2294
msgid "Edit mail settings"
msgstr "Éditer les paramètres de courriel"
#: cps/web.py:2257
#: cps/web.py:2322
#, python-format
msgid "User '%(nick)s' deleted"
msgstr "Utilisateur '%(nick)s' supprimé"
#: cps/web.py:2348
#: cps/web.py:2418
#, python-format
msgid "User '%(nick)s' updated"
msgstr "Utilisateur '%(nick)s' mis à jour"
#: cps/web.py:2351
#: cps/web.py:2421
msgid "An unknown error occured."
msgstr "Oups ! Une erreur inconnue a eu lieu."
#: cps/web.py:2354
#: cps/web.py:2424
#, python-format
msgid "Edit User %(nick)s"
msgstr "Éditer l'utilisateur %(nick)s"
#: cps/web.py:2573 cps/web.py:2576 cps/web.py:2688
#: cps/web.py:2459 cps/web.py:2463
msgid "unknown"
msgstr ""
#: cps/web.py:2650 cps/web.py:2653 cps/web.py:2763
msgid "edit metadata"
msgstr ""
#: cps/web.py:2597
#: cps/web.py:2674
#, python-format
msgid "File extension \"%s\" is not allowed to be uploaded to this server"
msgstr ""
#: cps/web.py:2603
#: cps/web.py:2680
msgid "File to be uploaded must have an extension"
msgstr ""
#: cps/web.py:2620
#: cps/web.py:2697
#, python-format
msgid "Failed to create path %s (Permission denied)."
msgstr "Impossible de créer le chemin %s (permission refusée)"
#: cps/web.py:2625
#: cps/web.py:2702
#, python-format
msgid "Failed to store file %s (Permission denied)."
msgstr "Impossible d'enregistrer le fichier %s (permission refusée)"
#: cps/web.py:2630
#: cps/web.py:2707
#, python-format
msgid "Failed to delete file %s (Permission denied)."
msgstr "Impossible de supprimer le fichier %s (permission refusée)"
@ -531,10 +535,10 @@ msgid "Ok"
msgstr ""
#: cps/templates/admin.html:103 cps/templates/admin.html:117
#: cps/templates/book_edit.html:109 cps/templates/config_edit.html:123
#: cps/templates/email_edit.html:36 cps/templates/shelf.html:53
#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:12
#: cps/templates/user_edit.html:124
#: cps/templates/book_edit.html:115 cps/templates/book_edit.html:134
#: cps/templates/config_edit.html:127 cps/templates/email_edit.html:36
#: cps/templates/shelf.html:53 cps/templates/shelf_edit.html:19
#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:128
msgid "Back"
msgstr "Retour"
@ -546,104 +550,124 @@ msgstr ""
msgid "Updating, please do not reload page"
msgstr ""
#: cps/templates/book_edit.html:16 cps/templates/search_form.html:6
#: cps/templates/book_edit.html:16
msgid "Delete Book"
msgstr ""
#: cps/templates/book_edit.html:22 cps/templates/search_form.html:6
msgid "Book Title"
msgstr "Titre du livre"
#: cps/templates/book_edit.html:20 cps/templates/book_edit.html:145
#: cps/templates/book_edit.html:26 cps/templates/book_edit.html:173
#: cps/templates/search_form.html:10
msgid "Author"
msgstr "Auteur"
#: cps/templates/book_edit.html:24 cps/templates/book_edit.html:147
#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:175
msgid "Description"
msgstr "Description"
#: cps/templates/book_edit.html:28 cps/templates/search_form.html:17
#: cps/templates/book_edit.html:34 cps/templates/search_form.html:17
msgid "Tags"
msgstr "Étiquette"
#: cps/templates/book_edit.html:33 cps/templates/layout.html:142
#: cps/templates/book_edit.html:39 cps/templates/layout.html:142
#: cps/templates/search_form.html:37
msgid "Series"
msgstr "Séries"
#: cps/templates/book_edit.html:37
#: cps/templates/book_edit.html:43
msgid "Series id"
msgstr "Id de série"
#: cps/templates/book_edit.html:41
#: cps/templates/book_edit.html:47
msgid "Rating"
msgstr "Évaluation"
#: cps/templates/book_edit.html:45
#: cps/templates/book_edit.html:51
msgid "Cover URL (jpg)"
msgstr "Adresse de la couverture (jpg)"
#: cps/templates/book_edit.html:50 cps/templates/user_edit.html:27
#: cps/templates/book_edit.html:56 cps/templates/user_edit.html:27
msgid "Language"
msgstr "Langue"
#: cps/templates/book_edit.html:61
#: cps/templates/book_edit.html:67
msgid "Yes"
msgstr "Oui"
#: cps/templates/book_edit.html:62
#: cps/templates/book_edit.html:68
msgid "No"
msgstr "Non"
#: cps/templates/book_edit.html:104
#: cps/templates/book_edit.html:110
msgid "view book after edit"
msgstr "Voir le livre après l'édition"
#: cps/templates/book_edit.html:107 cps/templates/book_edit.html:118
#: cps/templates/book_edit.html:113 cps/templates/book_edit.html:146
msgid "Get metadata"
msgstr ""
#: cps/templates/book_edit.html:108 cps/templates/config_edit.html:121
#: cps/templates/book_edit.html:114 cps/templates/config_edit.html:125
#: cps/templates/login.html:19 cps/templates/search_form.html:79
#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:122
#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:126
msgid "Submit"
msgstr "Soumettre"
#: cps/templates/book_edit.html:121
#: cps/templates/book_edit.html:125
msgid "Are really you sure?"
msgstr ""
#: cps/templates/book_edit.html:128
msgid "Book will be deleted from Calibre database"
msgstr ""
#: cps/templates/book_edit.html:129
msgid "and from hard disk"
msgstr ""
#: cps/templates/book_edit.html:133
msgid "Delete"
msgstr ""
#: cps/templates/book_edit.html:149
msgid "Keyword"
msgstr ""
#: cps/templates/book_edit.html:122
#: cps/templates/book_edit.html:150
msgid " Search keyword "
msgstr ""
#: cps/templates/book_edit.html:124 cps/templates/layout.html:60
#: cps/templates/book_edit.html:152 cps/templates/layout.html:60
msgid "Go!"
msgstr "Allez !"
#: cps/templates/book_edit.html:125
#: cps/templates/book_edit.html:153
msgid "Click the cover to load metadata to the form"
msgstr ""
#: cps/templates/book_edit.html:129 cps/templates/book_edit.html:142
#: cps/templates/book_edit.html:157 cps/templates/book_edit.html:170
msgid "Loading..."
msgstr ""
#: cps/templates/book_edit.html:132
#: cps/templates/book_edit.html:160
msgid "Close"
msgstr ""
#: cps/templates/book_edit.html:143
#: cps/templates/book_edit.html:171
msgid "Search error!"
msgstr ""
#: cps/templates/book_edit.html:144
#: cps/templates/book_edit.html:172
msgid "No Result! Please try anonther keyword."
msgstr ""
#: cps/templates/book_edit.html:146 cps/templates/detail.html:76
#: cps/templates/book_edit.html:174 cps/templates/detail.html:76
#: cps/templates/search_form.html:14
msgid "Publisher"
msgstr ""
#: cps/templates/book_edit.html:148
#: cps/templates/book_edit.html:176
msgid "Source"
msgstr ""
@ -727,15 +751,19 @@ msgstr "Permettre les téléversements"
msgid "Allow Edit"
msgstr "Permettre l'édition"
#: cps/templates/config_edit.html:115 cps/templates/user_edit.html:105
#: cps/templates/config_edit.html:115 cps/templates/user_edit.html:104
msgid "Allow Delete books"
msgstr ""
#: cps/templates/config_edit.html:119 cps/templates/user_edit.html:109
msgid "Allow Changing Password"
msgstr "Permettre le changement de mot de passe"
#: cps/templates/config_edit.html:119 cps/templates/user_edit.html:109
#: cps/templates/config_edit.html:123 cps/templates/user_edit.html:113
msgid "Allow Editing Public Shelfs"
msgstr ""
#: cps/templates/config_edit.html:126 cps/templates/layout.html:93
#: cps/templates/config_edit.html:130 cps/templates/layout.html:93
#: cps/templates/login.html:4
msgid "Login"
msgstr "Connexion"
@ -1108,11 +1136,11 @@ msgstr ""
msgid "Show random books in detail view"
msgstr ""
#: cps/templates/user_edit.html:116
#: cps/templates/user_edit.html:120
msgid "Delete this user"
msgstr "Supprimer cet utilisateur"
#: cps/templates/user_edit.html:131
#: cps/templates/user_edit.html:135
msgid "Recent Downloads"
msgstr "Téléchargements récents"

@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre Web - polski (POT: 2017-04-11 22:51)\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2017-04-14 09:38+0200\n"
"POT-Creation-Date: 2017-04-14 20:25+0200\n"
"PO-Revision-Date: 2017-04-11 22:51+0200\n"
"Last-Translator: Radosław Kierznowski <radek.kierznowski@outlook.com>\n"
"Language: pl\n"
@ -24,7 +24,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.3.4\n"
#: cps/book_formats.py:113 cps/book_formats.py:117 cps/web.py:1235
#: cps/book_formats.py:113 cps/book_formats.py:117 cps/web.py:1258
msgid "not installed"
msgstr "nie zainstalowane"
@ -55,325 +55,329 @@ msgstr ""
msgid "Could not convert epub to mobi"
msgstr "Nie można konwertować epub do mobi"
#: cps/ub.py:471
#: cps/ub.py:481
msgid "Guest"
msgstr "Gość"
#: cps/web.py:894
#: cps/web.py:917
msgid "Requesting update package"
msgstr "Żądanie o pakiet aktualizacji"
#: cps/web.py:895
#: cps/web.py:918
msgid "Downloading update package"
msgstr "Pobieranie pakietu aktualizacji"
#: cps/web.py:896
#: cps/web.py:919
msgid "Unzipping update package"
msgstr "Rozpakowywanie pakietu aktualizacji"
#: cps/web.py:897
#: cps/web.py:920
msgid "Files are replaced"
msgstr "Pliki zostały zastąpione"
#: cps/web.py:898
#: cps/web.py:921
msgid "Database connections are closed"
msgstr "Połączenia z bazą danych zostały zakończone"
#: cps/web.py:899
#: cps/web.py:922
msgid "Server is stopped"
msgstr "Serwer jest zatrzymany"
#: cps/web.py:900
#: cps/web.py:923
msgid "Update finished, please press okay and reload page"
msgstr "Aktualizacja zakończona, proszę nacisnąć OK i odświeżyć stronę"
#: cps/web.py:974
#: cps/web.py:997
msgid "Latest Books"
msgstr "Ostatnie książki"
#: cps/web.py:1005
#: cps/web.py:1028
msgid "Hot Books (most downloaded)"
msgstr "Najpopularniejsze książki (najczęściej pobierane)"
#: cps/web.py:1015
#: cps/web.py:1038
msgid "Best rated books"
msgstr "Najlepiej oceniane książki"
#: cps/templates/index.xml:36 cps/web.py:1024
#: cps/templates/index.xml:36 cps/web.py:1047
msgid "Random Books"
msgstr "Losowe książki"
#: cps/web.py:1037
#: cps/web.py:1060
msgid "Author list"
msgstr "Lista autorów"
#: cps/web.py:1048
#: cps/web.py:1072
#, python-format
msgid "Author: %(name)s"
msgstr "Autor: %(name)s"
#: cps/web.py:1050 cps/web.py:1078 cps/web.py:1212 cps/web.py:1614
#: cps/web.py:2578
#: cps/web.py:1074 cps/web.py:1102 cps/web.py:1235 cps/web.py:1672
#: cps/web.py:2655
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr "Błąd otwierania e-booka. Plik nie istnieje lub plik nie jest dostępny:"
#: cps/templates/index.xml:71 cps/web.py:1064
#: cps/templates/index.xml:71 cps/web.py:1088
msgid "Series list"
msgstr "Lista serii"
#: cps/web.py:1076
#: cps/web.py:1100
#, python-format
msgid "Series: %(serie)s"
msgstr "Seria: %(serie)s"
#: cps/web.py:1109
#: cps/web.py:1133
msgid "Available languages"
msgstr "Dostępne języki"
#: cps/web.py:1124
#: cps/web.py:1148
#, python-format
msgid "Language: %(name)s"
msgstr "Język: %(name)s"
#: cps/templates/index.xml:64 cps/web.py:1137
#: cps/templates/index.xml:64 cps/web.py:1161
msgid "Category list"
msgstr "Lista kategorii"
#: cps/web.py:1149
#: cps/web.py:1173
#, python-format
msgid "Category: %(name)s"
msgstr "Kategoria: %(name)s"
#: cps/web.py:1257
#: cps/web.py:1280
msgid "Statistics"
msgstr "Statystyki"
#: cps/web.py:1365
#: cps/web.py:1415
msgid "Server restarted, please reload page"
msgstr "Serwer uruchomiony ponownie, proszę odświeżyć stronę"
#: cps/web.py:1367
#: cps/web.py:1417
msgid "Performing shutdown of server, please close window"
msgstr "Wykonano wyłączenie serwera, proszę zamknąć okno"
#: cps/web.py:1382
#: cps/web.py:1433
msgid "Update done"
msgstr "Aktualizacja zakończona"
#: cps/web.py:1460 cps/web.py:1473
#: cps/web.py:1511 cps/web.py:1524
msgid "search"
msgstr "szukaj"
#: cps/web.py:1590 cps/web.py:1597 cps/web.py:1604 cps/web.py:1611
#: cps/web.py:1648 cps/web.py:1655 cps/web.py:1662 cps/web.py:1669
msgid "Read a Book"
msgstr "Czytaj książkę"
#: cps/web.py:1664 cps/web.py:2144
#: cps/web.py:1725 cps/web.py:2207
msgid "Please fill out all fields!"
msgstr "Proszę wypełnić wszystkie pola!"
#: cps/web.py:1665 cps/web.py:1681 cps/web.py:1686 cps/web.py:1688
#: cps/web.py:1726 cps/web.py:1742 cps/web.py:1747 cps/web.py:1749
msgid "register"
msgstr "rejestracja"
#: cps/web.py:1680
#: cps/web.py:1741
msgid "An unknown error occured. Please try again later."
msgstr "Wystąpił nieznany błąd. Spróbuj ponownie później."
#: cps/web.py:1685
#: cps/web.py:1746
msgid "This username or email address is already in use."
msgstr "Nazwa użytkownika lub adres e-mail jest już w użyciu."
#: cps/web.py:1703
#: cps/web.py:1764
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr "Zalogowałeś się jako: '%(nickname)s'"
#: cps/web.py:1708
#: cps/web.py:1769
msgid "Wrong Username or Password"
msgstr "Błędna nazwa użytkownika lub hasło"
#: cps/web.py:1710
#: cps/web.py:1771
msgid "login"
msgstr "logowanie"
#: cps/web.py:1727
#: cps/web.py:1788
msgid "Please configure the SMTP mail settings first..."
msgstr "Proszę najpierw skonfigurować ustawienia SMTP poczty e-mail..."
#: cps/web.py:1731
#: cps/web.py:1792
#, python-format
msgid "Book successfully send to %(kindlemail)s"
msgstr "Książka została pomyślnie wysłana do %(kindlemail)s"
#: cps/web.py:1735
#: cps/web.py:1796
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr "Wystąpił błąd podczas wysyłania tej książki: %(res)s"
#: cps/web.py:1737 cps/web.py:2226
#: cps/web.py:1798 cps/web.py:2291
msgid "Please configure your kindle email address first..."
msgstr "Proszę najpierw skonfigurować adres e-mail swojego kindla..."
#: cps/web.py:1762
#: cps/web.py:1823
#, python-format
msgid "Book has been added to shelf: %(sname)s"
msgstr "Książka została dodana do półki: %(sname)s"
#: cps/web.py:1782
#: cps/web.py:1843
#, python-format
msgid "Book has been removed from shelf: %(sname)s"
msgstr "Książka została usunięta z półki: %(sname)s"
#: cps/web.py:1800 cps/web.py:1824
#: cps/web.py:1861 cps/web.py:1885
#, python-format
msgid "A shelf with the name '%(title)s' already exists."
msgstr "Półka o nazwie '%(title)s' już istnieje."
#: cps/web.py:1805
#: cps/web.py:1866
#, python-format
msgid "Shelf %(title)s created"
msgstr "Półka %(title)s została utworzona"
#: cps/web.py:1807 cps/web.py:1835
#: cps/web.py:1868 cps/web.py:1896
msgid "There was an error"
msgstr "Wystąpił błąd"
#: cps/web.py:1808 cps/web.py:1810
#: cps/web.py:1869 cps/web.py:1871
msgid "create a shelf"
msgstr "utwórz półkę"
#: cps/web.py:1833
#: cps/web.py:1894
#, python-format
msgid "Shelf %(title)s changed"
msgstr "Półka %(title)s została zmieniona"
#: cps/web.py:1836 cps/web.py:1838
#: cps/web.py:1897 cps/web.py:1899
msgid "Edit a shelf"
msgstr "Edytuj półkę"
#: cps/web.py:1858
#: cps/web.py:1919
#, python-format
msgid "successfully deleted shelf %(name)s"
msgstr "pomyślnie usunięto półkę %(name)s"
#: cps/web.py:1880
#: cps/web.py:1941
#, python-format
msgid "Shelf: '%(name)s'"
msgstr "Półka: '%(name)s'"
#: cps/web.py:1911
#: cps/web.py:1972
#, python-format
msgid "Change order of Shelf: '%(name)s'"
msgstr "Zmieniono kolejność półki: '%(name)s'"
#: cps/web.py:1975
#: cps/web.py:2036
msgid "Found an existing account for this email address."
msgstr "Znaleziono istniejące konto dla tego adresu e-mail."
#: cps/web.py:1977 cps/web.py:1981
#: cps/web.py:2038 cps/web.py:2042
#, python-format
msgid "%(name)s's profile"
msgstr "Profil użytkownika %(name)s"
#: cps/web.py:1978
#: cps/web.py:2039
msgid "Profile updated"
msgstr "Zaktualizowano profil"
#: cps/web.py:1992
#: cps/web.py:2053
msgid "Admin page"
msgstr "Portal administracyjny"
#: cps/web.py:2098
#: cps/web.py:2161
msgid "Calibre-web configuration updated"
msgstr "Konfiguracja Calibre-web została zaktualizowana"
#: cps/web.py:2105 cps/web.py:2111 cps/web.py:2125
#: cps/web.py:2168 cps/web.py:2174 cps/web.py:2188
msgid "Basic Configuration"
msgstr "Podstawowa konfiguracja"
#: cps/web.py:2109
#: cps/web.py:2172
msgid "DB location is not valid, please enter correct path"
msgstr "Lokalizacja bazy danych jest nieprawidłowa, wpisz poprawną ścieżkę"
#: cps/templates/admin.html:34 cps/web.py:2146 cps/web.py:2196
#: cps/templates/admin.html:34 cps/web.py:2209 cps/web.py:2261
msgid "Add new user"
msgstr "Dodaj nowego użytkownika"
#: cps/web.py:2188
#: cps/web.py:2253
#, python-format
msgid "User '%(user)s' created"
msgstr "Użytkownik '%(user)s' został utworzony"
#: cps/web.py:2192
#: cps/web.py:2257
msgid "Found an existing account for this email address or nickname."
msgstr "Znaleziono istniejące konto dla tego adresu e-mail lub nazwy użytkownika."
#: cps/web.py:2214
#: cps/web.py:2279
msgid "Mail settings updated"
msgstr "Zaktualizowano ustawienia poczty e-mail"
#: cps/web.py:2221
#: cps/web.py:2286
#, python-format
msgid "Test E-Mail successfully send to %(kindlemail)s"
msgstr "Testowy e-mail został pomyślnie wysłany do %(kindlemail)s"
#: cps/web.py:2224
#: cps/web.py:2289
#, python-format
msgid "There was an error sending the Test E-Mail: %(res)s"
msgstr "Wystąpił błąd podczas wysyłania testowej wiadomości e-mail: %(res)s"
#: cps/web.py:2228
#: cps/web.py:2293
msgid "E-Mail settings updated"
msgstr "Zaktualizowano ustawienia e-mail"
#: cps/web.py:2229
#: cps/web.py:2294
msgid "Edit mail settings"
msgstr "Edytuj ustawienia poczty e-mail"
#: cps/web.py:2257
#: cps/web.py:2322
#, python-format
msgid "User '%(nick)s' deleted"
msgstr "Użytkownik '%(nick)s' został usunięty"
#: cps/web.py:2348
#: cps/web.py:2418
#, python-format
msgid "User '%(nick)s' updated"
msgstr "Użytkownik '%(nick)s' został zaktualizowany"
#: cps/web.py:2351
#: cps/web.py:2421
msgid "An unknown error occured."
msgstr "Wystąpił nieznany błąd."
#: cps/web.py:2354
#: cps/web.py:2424
#, python-format
msgid "Edit User %(nick)s"
msgstr "Edytuj użytkownika %(nick)s"
#: cps/web.py:2573 cps/web.py:2576 cps/web.py:2688
#: cps/web.py:2459 cps/web.py:2463
msgid "unknown"
msgstr ""
#: cps/web.py:2650 cps/web.py:2653 cps/web.py:2763
msgid "edit metadata"
msgstr "edytuj metadane"
#: cps/web.py:2597
#: cps/web.py:2674
#, python-format
msgid "File extension \"%s\" is not allowed to be uploaded to this server"
msgstr "Rozszerzenie pliku \"%s\" nie jest dozwolone do przesłania na ten serwer"
#: cps/web.py:2603
#: cps/web.py:2680
msgid "File to be uploaded must have an extension"
msgstr "Plik do przesłania musi mieć rozszerzenie"
#: cps/web.py:2620
#: cps/web.py:2697
#, python-format
msgid "Failed to create path %s (Permission denied)."
msgstr "Nie udało się utworzyć łącza %s (Odmowa dostępu)."
#: cps/web.py:2625
#: cps/web.py:2702
#, python-format
msgid "Failed to store file %s (Permission denied)."
msgstr "Nie można przechowywać pliku %s (Odmowa dostępu)."
#: cps/web.py:2630
#: cps/web.py:2707
#, python-format
msgid "Failed to delete file %s (Permission denied)."
msgstr "Nie udało się usunąć pliku %s (Odmowa dostępu)."
@ -524,10 +528,10 @@ msgid "Ok"
msgstr "OK"
#: cps/templates/admin.html:103 cps/templates/admin.html:117
#: cps/templates/book_edit.html:109 cps/templates/config_edit.html:123
#: cps/templates/email_edit.html:36 cps/templates/shelf.html:53
#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:12
#: cps/templates/user_edit.html:124
#: cps/templates/book_edit.html:115 cps/templates/book_edit.html:134
#: cps/templates/config_edit.html:127 cps/templates/email_edit.html:36
#: cps/templates/shelf.html:53 cps/templates/shelf_edit.html:19
#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:128
msgid "Back"
msgstr "Wróć"
@ -539,104 +543,124 @@ msgstr "Na pewno chcesz zatrzymać Calibre Web?"
msgid "Updating, please do not reload page"
msgstr "Aktualizowanie, proszę nie odświeżać strony"
#: cps/templates/book_edit.html:16 cps/templates/search_form.html:6
#: cps/templates/book_edit.html:16
msgid "Delete Book"
msgstr ""
#: cps/templates/book_edit.html:22 cps/templates/search_form.html:6
msgid "Book Title"
msgstr "Tytuł książki"
#: cps/templates/book_edit.html:20 cps/templates/book_edit.html:145
#: cps/templates/book_edit.html:26 cps/templates/book_edit.html:173
#: cps/templates/search_form.html:10
msgid "Author"
msgstr "Autor"
#: cps/templates/book_edit.html:24 cps/templates/book_edit.html:147
#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:175
msgid "Description"
msgstr "Opis"
#: cps/templates/book_edit.html:28 cps/templates/search_form.html:17
#: cps/templates/book_edit.html:34 cps/templates/search_form.html:17
msgid "Tags"
msgstr "Tagi"
#: cps/templates/book_edit.html:33 cps/templates/layout.html:142
#: cps/templates/book_edit.html:39 cps/templates/layout.html:142
#: cps/templates/search_form.html:37
msgid "Series"
msgstr "Seria"
#: cps/templates/book_edit.html:37
#: cps/templates/book_edit.html:43
msgid "Series id"
msgstr "ID serii"
#: cps/templates/book_edit.html:41
#: cps/templates/book_edit.html:47
msgid "Rating"
msgstr "Ocena"
#: cps/templates/book_edit.html:45
#: cps/templates/book_edit.html:51
msgid "Cover URL (jpg)"
msgstr "Adres URL okładki (jpg)"
#: cps/templates/book_edit.html:50 cps/templates/user_edit.html:27
#: cps/templates/book_edit.html:56 cps/templates/user_edit.html:27
msgid "Language"
msgstr "Język"
#: cps/templates/book_edit.html:61
#: cps/templates/book_edit.html:67
msgid "Yes"
msgstr "Tak"
#: cps/templates/book_edit.html:62
#: cps/templates/book_edit.html:68
msgid "No"
msgstr "Nie"
#: cps/templates/book_edit.html:104
#: cps/templates/book_edit.html:110
msgid "view book after edit"
msgstr "wyświetl książkę po edycji"
#: cps/templates/book_edit.html:107 cps/templates/book_edit.html:118
#: cps/templates/book_edit.html:113 cps/templates/book_edit.html:146
msgid "Get metadata"
msgstr "Uzyskaj metadane"
#: cps/templates/book_edit.html:108 cps/templates/config_edit.html:121
#: cps/templates/book_edit.html:114 cps/templates/config_edit.html:125
#: cps/templates/login.html:19 cps/templates/search_form.html:79
#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:122
#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:126
msgid "Submit"
msgstr "Wyślij"
#: cps/templates/book_edit.html:121
#: cps/templates/book_edit.html:125
msgid "Are really you sure?"
msgstr ""
#: cps/templates/book_edit.html:128
msgid "Book will be deleted from Calibre database"
msgstr ""
#: cps/templates/book_edit.html:129
msgid "and from hard disk"
msgstr ""
#: cps/templates/book_edit.html:133
msgid "Delete"
msgstr ""
#: cps/templates/book_edit.html:149
msgid "Keyword"
msgstr "Słowo kluczowe"
#: cps/templates/book_edit.html:122
#: cps/templates/book_edit.html:150
msgid " Search keyword "
msgstr " Szukaj słowa kluczowego "
#: cps/templates/book_edit.html:124 cps/templates/layout.html:60
#: cps/templates/book_edit.html:152 cps/templates/layout.html:60
msgid "Go!"
msgstr "Idź!"
#: cps/templates/book_edit.html:125
#: cps/templates/book_edit.html:153
msgid "Click the cover to load metadata to the form"
msgstr "Kliknij okładkę, aby załadować metadane do formularza"
#: cps/templates/book_edit.html:129 cps/templates/book_edit.html:142
#: cps/templates/book_edit.html:157 cps/templates/book_edit.html:170
msgid "Loading..."
msgstr "Ładowanie..."
#: cps/templates/book_edit.html:132
#: cps/templates/book_edit.html:160
msgid "Close"
msgstr "Zamknij"
#: cps/templates/book_edit.html:143
#: cps/templates/book_edit.html:171
msgid "Search error!"
msgstr "Błąd wyszukiwania!"
#: cps/templates/book_edit.html:144
#: cps/templates/book_edit.html:172
msgid "No Result! Please try anonther keyword."
msgstr "Brak wyników! Spróbuj innego słowa kluczowego."
#: cps/templates/book_edit.html:146 cps/templates/detail.html:76
#: cps/templates/book_edit.html:174 cps/templates/detail.html:76
#: cps/templates/search_form.html:14
msgid "Publisher"
msgstr "Wydawca"
#: cps/templates/book_edit.html:148
#: cps/templates/book_edit.html:176
msgid "Source"
msgstr "Źródło"
@ -721,15 +745,19 @@ msgstr "Zezwalaj na wysyłanie"
msgid "Allow Edit"
msgstr "Zezwalaj na edycję"
#: cps/templates/config_edit.html:115 cps/templates/user_edit.html:105
#: cps/templates/config_edit.html:115 cps/templates/user_edit.html:104
msgid "Allow Delete books"
msgstr ""
#: cps/templates/config_edit.html:119 cps/templates/user_edit.html:109
msgid "Allow Changing Password"
msgstr "Zezwalaj na zmianę hasła"
#: cps/templates/config_edit.html:119 cps/templates/user_edit.html:109
#: cps/templates/config_edit.html:123 cps/templates/user_edit.html:113
msgid "Allow Editing Public Shelfs"
msgstr ""
#: cps/templates/config_edit.html:126 cps/templates/layout.html:93
#: cps/templates/config_edit.html:130 cps/templates/layout.html:93
#: cps/templates/login.html:4
msgid "Login"
msgstr "Zaloguj się"
@ -1105,11 +1133,11 @@ msgstr "Pokaż przeczytane i nieprzeczytane"
msgid "Show random books in detail view"
msgstr "Pokaz losowe książki w widoku szczegółowym"
#: cps/templates/user_edit.html:116
#: cps/templates/user_edit.html:120
msgid "Delete this user"
msgstr "Usuń tego użytkownika"
#: cps/templates/user_edit.html:131
#: cps/templates/user_edit.html:135
msgid "Recent Downloads"
msgstr "Ostatnio pobierane"

@ -15,7 +15,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n"
"POT-Creation-Date: 2017-04-14 09:38+0200\n"
"POT-Creation-Date: 2017-04-14 20:25+0200\n"
"PO-Revision-Date: 2017-01-06 17:00+0000\n"
"Last-Translator: dalin <dalin.lin@gmail.com>\n"
"Language: zh_Hans_CN\n"
@ -26,7 +26,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.3.4\n"
#: cps/book_formats.py:113 cps/book_formats.py:117 cps/web.py:1235
#: cps/book_formats.py:113 cps/book_formats.py:117 cps/web.py:1258
msgid "not installed"
msgstr "未安装"
@ -55,325 +55,329 @@ msgstr "无法找到适合邮件发送的格式"
msgid "Could not convert epub to mobi"
msgstr "无法转换epub到mobi"
#: cps/ub.py:471
#: cps/ub.py:481
msgid "Guest"
msgstr "游客"
#: cps/web.py:894
#: cps/web.py:917
msgid "Requesting update package"
msgstr "正在请求更新包"
#: cps/web.py:895
#: cps/web.py:918
msgid "Downloading update package"
msgstr "正在下载更新包"
#: cps/web.py:896
#: cps/web.py:919
msgid "Unzipping update package"
msgstr "正在解压更新包"
#: cps/web.py:897
#: cps/web.py:920
msgid "Files are replaced"
msgstr "文件已替换"
#: cps/web.py:898
#: cps/web.py:921
msgid "Database connections are closed"
msgstr "数据库连接已关闭"
#: cps/web.py:899
#: cps/web.py:922
msgid "Server is stopped"
msgstr "服务器已停止"
#: cps/web.py:900
#: cps/web.py:923
msgid "Update finished, please press okay and reload page"
msgstr "更新完成,请按确定并刷新页面"
#: cps/web.py:974
#: cps/web.py:997
msgid "Latest Books"
msgstr "最新书籍"
#: cps/web.py:1005
#: cps/web.py:1028
msgid "Hot Books (most downloaded)"
msgstr "热门书籍(最多下载)"
#: cps/web.py:1015
#: cps/web.py:1038
msgid "Best rated books"
msgstr "最高评分书籍"
#: cps/templates/index.xml:36 cps/web.py:1024
#: cps/templates/index.xml:36 cps/web.py:1047
msgid "Random Books"
msgstr "随机书籍"
#: cps/web.py:1037
#: cps/web.py:1060
msgid "Author list"
msgstr "作者列表"
#: cps/web.py:1048
#: cps/web.py:1072
#, python-forma, python-format
msgid "Author: %(name)s"
msgstr "作者: %(name)s"
#: cps/web.py:1050 cps/web.py:1078 cps/web.py:1212 cps/web.py:1614
#: cps/web.py:2578
#: cps/web.py:1074 cps/web.py:1102 cps/web.py:1235 cps/web.py:1672
#: cps/web.py:2655
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr "无法打开电子书。 文件不存在或者文件不可访问:"
#: cps/templates/index.xml:71 cps/web.py:1064
#: cps/templates/index.xml:71 cps/web.py:1088
msgid "Series list"
msgstr "丛书列表"
#: cps/web.py:1076
#: cps/web.py:1100
#, python-format
msgid "Series: %(serie)s"
msgstr "丛书: %(serie)s"
#: cps/web.py:1109
#: cps/web.py:1133
msgid "Available languages"
msgstr "可用语言"
#: cps/web.py:1124
#: cps/web.py:1148
#, python-format
msgid "Language: %(name)s"
msgstr "语言: %(name)s"
#: cps/templates/index.xml:64 cps/web.py:1137
#: cps/templates/index.xml:64 cps/web.py:1161
msgid "Category list"
msgstr "分类列表"
#: cps/web.py:1149
#: cps/web.py:1173
#, python-format
msgid "Category: %(name)s"
msgstr "分类: %(name)s"
#: cps/web.py:1257
#: cps/web.py:1280
msgid "Statistics"
msgstr "统计"
#: cps/web.py:1365
#: cps/web.py:1415
msgid "Server restarted, please reload page"
msgstr "服务器已重启,请刷新页面"
#: cps/web.py:1367
#: cps/web.py:1417
msgid "Performing shutdown of server, please close window"
msgstr "正在关闭服务器,请关闭窗口"
#: cps/web.py:1382
#: cps/web.py:1433
msgid "Update done"
msgstr "更新完成"
#: cps/web.py:1460 cps/web.py:1473
#: cps/web.py:1511 cps/web.py:1524
msgid "search"
msgstr "搜索"
#: cps/web.py:1590 cps/web.py:1597 cps/web.py:1604 cps/web.py:1611
#: cps/web.py:1648 cps/web.py:1655 cps/web.py:1662 cps/web.py:1669
msgid "Read a Book"
msgstr "阅读一本书"
#: cps/web.py:1664 cps/web.py:2144
#: cps/web.py:1725 cps/web.py:2207
msgid "Please fill out all fields!"
msgstr "请填写所有字段"
#: cps/web.py:1665 cps/web.py:1681 cps/web.py:1686 cps/web.py:1688
#: cps/web.py:1726 cps/web.py:1742 cps/web.py:1747 cps/web.py:1749
msgid "register"
msgstr "注册"
#: cps/web.py:1680
#: cps/web.py:1741
msgid "An unknown error occured. Please try again later."
msgstr "发生一个未知错误。请稍后再试。"
#: cps/web.py:1685
#: cps/web.py:1746
msgid "This username or email address is already in use."
msgstr "此用户名或邮箱已被使用。"
#: cps/web.py:1703
#: cps/web.py:1764
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr "您现在已以'%(nickname)s'身份登录"
#: cps/web.py:1708
#: cps/web.py:1769
msgid "Wrong Username or Password"
msgstr "用户名或密码错误"
#: cps/web.py:1710
#: cps/web.py:1771
msgid "login"
msgstr "登录"
#: cps/web.py:1727
#: cps/web.py:1788
msgid "Please configure the SMTP mail settings first..."
msgstr "请先配置SMTP邮箱..."
#: cps/web.py:1731
#: cps/web.py:1792
#, python-format
msgid "Book successfully send to %(kindlemail)s"
msgstr "此书已被成功发给 %(kindlemail)s"
#: cps/web.py:1735
#: cps/web.py:1796
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr "发送这本书的时候出现错误: %(res)s"
#: cps/web.py:1737 cps/web.py:2226
#: cps/web.py:1798 cps/web.py:2291
msgid "Please configure your kindle email address first..."
msgstr "请先配置您的kindle电子邮箱地址..."
#: cps/web.py:1762
#: cps/web.py:1823
#, python-format
msgid "Book has been added to shelf: %(sname)s"
msgstr "此书已被添加到书架: %(sname)s"
#: cps/web.py:1782
#: cps/web.py:1843
#, python-format
msgid "Book has been removed from shelf: %(sname)s"
msgstr "此书已从书架 %(sname)s 中删除"
#: cps/web.py:1800 cps/web.py:1824
#: cps/web.py:1861 cps/web.py:1885
#, python-format
msgid "A shelf with the name '%(title)s' already exists."
msgstr "已存在书架 '%(title)s'。"
#: cps/web.py:1805
#: cps/web.py:1866
#, python-format
msgid "Shelf %(title)s created"
msgstr "书架 %(title)s 已被创建"
#: cps/web.py:1807 cps/web.py:1835
#: cps/web.py:1868 cps/web.py:1896
msgid "There was an error"
msgstr "发生错误"
#: cps/web.py:1808 cps/web.py:1810
#: cps/web.py:1869 cps/web.py:1871
msgid "create a shelf"
msgstr "创建书架"
#: cps/web.py:1833
#: cps/web.py:1894
#, python-format
msgid "Shelf %(title)s changed"
msgstr "书架 %(title)s 已被修改"
#: cps/web.py:1836 cps/web.py:1838
#: cps/web.py:1897 cps/web.py:1899
msgid "Edit a shelf"
msgstr "编辑书架"
#: cps/web.py:1858
#: cps/web.py:1919
#, python-format
msgid "successfully deleted shelf %(name)s"
msgstr "成功删除书架 %(name)s"
#: cps/web.py:1880
#: cps/web.py:1941
#, python-format
msgid "Shelf: '%(name)s'"
msgstr "书架: '%(name)s'"
#: cps/web.py:1911
#: cps/web.py:1972
#, python-format
msgid "Change order of Shelf: '%(name)s'"
msgstr "修改书架 '%(name)s' 顺序"
#: cps/web.py:1975
#: cps/web.py:2036
msgid "Found an existing account for this email address."
msgstr "找到已使用此邮箱的账号。"
#: cps/web.py:1977 cps/web.py:1981
#: cps/web.py:2038 cps/web.py:2042
#, python-format
msgid "%(name)s's profile"
msgstr "%(name)s 的资料"
#: cps/web.py:1978
#: cps/web.py:2039
msgid "Profile updated"
msgstr "资料已更新"
#: cps/web.py:1992
#: cps/web.py:2053
msgid "Admin page"
msgstr "管理页"
#: cps/web.py:2098
#: cps/web.py:2161
msgid "Calibre-web configuration updated"
msgstr "Calibre-web配置已更新"
#: cps/web.py:2105 cps/web.py:2111 cps/web.py:2125
#: cps/web.py:2168 cps/web.py:2174 cps/web.py:2188
msgid "Basic Configuration"
msgstr "基本配置"
#: cps/web.py:2109
#: cps/web.py:2172
msgid "DB location is not valid, please enter correct path"
msgstr "DB位置无效请输入正确路径"
#: cps/templates/admin.html:34 cps/web.py:2146 cps/web.py:2196
#: cps/templates/admin.html:34 cps/web.py:2209 cps/web.py:2261
msgid "Add new user"
msgstr "添加新用户"
#: cps/web.py:2188
#: cps/web.py:2253
#, python-format
msgid "User '%(user)s' created"
msgstr "用户 '%(user)s' 已被创建"
#: cps/web.py:2192
#: cps/web.py:2257
msgid "Found an existing account for this email address or nickname."
msgstr "已存在使用此邮箱或昵称的账号。"
#: cps/web.py:2214
#: cps/web.py:2279
msgid "Mail settings updated"
msgstr "邮箱设置已更新"
#: cps/web.py:2221
#: cps/web.py:2286
#, python-format
msgid "Test E-Mail successfully send to %(kindlemail)s"
msgstr "测试邮件已成功发送到 %(kindlemail)s"
#: cps/web.py:2224
#: cps/web.py:2289
#, python-format
msgid "There was an error sending the Test E-Mail: %(res)s"
msgstr "发送测试邮件时发生错误: %(res)s"
#: cps/web.py:2228
#: cps/web.py:2293
msgid "E-Mail settings updated"
msgstr "E-Mail 设置已更新"
#: cps/web.py:2229
#: cps/web.py:2294
msgid "Edit mail settings"
msgstr "编辑邮箱设置"
#: cps/web.py:2257
#: cps/web.py:2322
#, python-format
msgid "User '%(nick)s' deleted"
msgstr "用户 '%(nick)s' 已被删除"
#: cps/web.py:2348
#: cps/web.py:2418
#, python-format
msgid "User '%(nick)s' updated"
msgstr "用户 '%(nick)s' 已被更新"
#: cps/web.py:2351
#: cps/web.py:2421
msgid "An unknown error occured."
msgstr "发生未知错误。"
#: cps/web.py:2354
#: cps/web.py:2424
#, python-format
msgid "Edit User %(nick)s"
msgstr "编辑用户 %(nick)s"
#: cps/web.py:2573 cps/web.py:2576 cps/web.py:2688
#: cps/web.py:2459 cps/web.py:2463
msgid "unknown"
msgstr ""
#: cps/web.py:2650 cps/web.py:2653 cps/web.py:2763
msgid "edit metadata"
msgstr "编辑元数据"
#: cps/web.py:2597
#: cps/web.py:2674
#, python-format
msgid "File extension \"%s\" is not allowed to be uploaded to this server"
msgstr "不能上传后缀为 \"%s\" 的文件到此服务器"
#: cps/web.py:2603
#: cps/web.py:2680
msgid "File to be uploaded must have an extension"
msgstr "要上传的文件必须有一个后缀"
#: cps/web.py:2620
#: cps/web.py:2697
#, python-format
msgid "Failed to create path %s (Permission denied)."
msgstr "创建路径 %s 失败(权限拒绝)。"
#: cps/web.py:2625
#: cps/web.py:2702
#, python-format
msgid "Failed to store file %s (Permission denied)."
msgstr "存储文件 %s 失败(权限拒绝)。"
#: cps/web.py:2630
#: cps/web.py:2707
#, python-format
msgid "Failed to delete file %s (Permission denied)."
msgstr "删除文件 %s 失败(权限拒绝)。"
@ -524,10 +528,10 @@ msgid "Ok"
msgstr "确定"
#: cps/templates/admin.html:103 cps/templates/admin.html:117
#: cps/templates/book_edit.html:109 cps/templates/config_edit.html:123
#: cps/templates/email_edit.html:36 cps/templates/shelf.html:53
#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:12
#: cps/templates/user_edit.html:124
#: cps/templates/book_edit.html:115 cps/templates/book_edit.html:134
#: cps/templates/config_edit.html:127 cps/templates/email_edit.html:36
#: cps/templates/shelf.html:53 cps/templates/shelf_edit.html:19
#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:128
msgid "Back"
msgstr "后退"
@ -539,104 +543,124 @@ msgstr "您确定要关闭 Calibre-web 吗?"
msgid "Updating, please do not reload page"
msgstr "正在更新,请不要刷新页面"
#: cps/templates/book_edit.html:16 cps/templates/search_form.html:6
#: cps/templates/book_edit.html:16
msgid "Delete Book"
msgstr ""
#: cps/templates/book_edit.html:22 cps/templates/search_form.html:6
msgid "Book Title"
msgstr "书名"
#: cps/templates/book_edit.html:20 cps/templates/book_edit.html:145
#: cps/templates/book_edit.html:26 cps/templates/book_edit.html:173
#: cps/templates/search_form.html:10
msgid "Author"
msgstr "作者"
#: cps/templates/book_edit.html:24 cps/templates/book_edit.html:147
#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:175
msgid "Description"
msgstr "简介"
#: cps/templates/book_edit.html:28 cps/templates/search_form.html:17
#: cps/templates/book_edit.html:34 cps/templates/search_form.html:17
msgid "Tags"
msgstr "标签"
#: cps/templates/book_edit.html:33 cps/templates/layout.html:142
#: cps/templates/book_edit.html:39 cps/templates/layout.html:142
#: cps/templates/search_form.html:37
msgid "Series"
msgstr "丛书"
#: cps/templates/book_edit.html:37
#: cps/templates/book_edit.html:43
msgid "Series id"
msgstr "丛书ID"
#: cps/templates/book_edit.html:41
#: cps/templates/book_edit.html:47
msgid "Rating"
msgstr "评分"
#: cps/templates/book_edit.html:45
#: cps/templates/book_edit.html:51
msgid "Cover URL (jpg)"
msgstr "封面URL (jpg)"
#: cps/templates/book_edit.html:50 cps/templates/user_edit.html:27
#: cps/templates/book_edit.html:56 cps/templates/user_edit.html:27
msgid "Language"
msgstr "语言"
#: cps/templates/book_edit.html:61
#: cps/templates/book_edit.html:67
msgid "Yes"
msgstr "确认"
#: cps/templates/book_edit.html:62
#: cps/templates/book_edit.html:68
msgid "No"
msgstr ""
#: cps/templates/book_edit.html:104
#: cps/templates/book_edit.html:110
msgid "view book after edit"
msgstr "编辑后查看书籍"
#: cps/templates/book_edit.html:107 cps/templates/book_edit.html:118
#: cps/templates/book_edit.html:113 cps/templates/book_edit.html:146
msgid "Get metadata"
msgstr "获取元数据"
#: cps/templates/book_edit.html:108 cps/templates/config_edit.html:121
#: cps/templates/book_edit.html:114 cps/templates/config_edit.html:125
#: cps/templates/login.html:19 cps/templates/search_form.html:79
#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:122
#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:126
msgid "Submit"
msgstr "提交"
#: cps/templates/book_edit.html:121
#: cps/templates/book_edit.html:125
msgid "Are really you sure?"
msgstr ""
#: cps/templates/book_edit.html:128
msgid "Book will be deleted from Calibre database"
msgstr ""
#: cps/templates/book_edit.html:129
msgid "and from hard disk"
msgstr ""
#: cps/templates/book_edit.html:133
msgid "Delete"
msgstr ""
#: cps/templates/book_edit.html:149
msgid "Keyword"
msgstr "关键字"
#: cps/templates/book_edit.html:122
#: cps/templates/book_edit.html:150
msgid " Search keyword "
msgstr "搜索关键字"
#: cps/templates/book_edit.html:124 cps/templates/layout.html:60
#: cps/templates/book_edit.html:152 cps/templates/layout.html:60
msgid "Go!"
msgstr "走起!"
#: cps/templates/book_edit.html:125
#: cps/templates/book_edit.html:153
msgid "Click the cover to load metadata to the form"
msgstr "点击封面加载元数据到表单"
#: cps/templates/book_edit.html:129 cps/templates/book_edit.html:142
#: cps/templates/book_edit.html:157 cps/templates/book_edit.html:170
msgid "Loading..."
msgstr "加载中..."
#: cps/templates/book_edit.html:132
#: cps/templates/book_edit.html:160
msgid "Close"
msgstr "关闭"
#: cps/templates/book_edit.html:143
#: cps/templates/book_edit.html:171
msgid "Search error!"
msgstr "搜索错误"
#: cps/templates/book_edit.html:144
#: cps/templates/book_edit.html:172
msgid "No Result! Please try anonther keyword."
msgstr "没有结果!请尝试别的关键字."
#: cps/templates/book_edit.html:146 cps/templates/detail.html:76
#: cps/templates/book_edit.html:174 cps/templates/detail.html:76
#: cps/templates/search_form.html:14
msgid "Publisher"
msgstr "出版社"
#: cps/templates/book_edit.html:148
#: cps/templates/book_edit.html:176
msgid "Source"
msgstr "来源"
@ -720,15 +744,19 @@ msgstr "允许上传"
msgid "Allow Edit"
msgstr "允许编辑"
#: cps/templates/config_edit.html:115 cps/templates/user_edit.html:105
#: cps/templates/config_edit.html:115 cps/templates/user_edit.html:104
msgid "Allow Delete books"
msgstr ""
#: cps/templates/config_edit.html:119 cps/templates/user_edit.html:109
msgid "Allow Changing Password"
msgstr "允许修改密码"
#: cps/templates/config_edit.html:119 cps/templates/user_edit.html:109
#: cps/templates/config_edit.html:123 cps/templates/user_edit.html:113
msgid "Allow Editing Public Shelfs"
msgstr ""
#: cps/templates/config_edit.html:126 cps/templates/layout.html:93
#: cps/templates/config_edit.html:130 cps/templates/layout.html:93
#: cps/templates/login.html:4
msgid "Login"
msgstr "登录"
@ -1101,11 +1129,11 @@ msgstr "显示已读和未读"
msgid "Show random books in detail view"
msgstr "在详情页显示随机书籍"
#: cps/templates/user_edit.html:116
#: cps/templates/user_edit.html:120
msgid "Delete this user"
msgstr "删除此用户"
#: cps/templates/user_edit.html:131
#: cps/templates/user_edit.html:135
msgid "Recent Downloads"
msgstr "最近下载"

@ -25,6 +25,8 @@ ROLE_EDIT = 8
ROLE_PASSWD = 16
ROLE_ANONYMOUS = 32
ROLE_EDIT_SHELFS = 64
ROLE_DELETE_BOOKS = 128
DETAIL_RANDOM = 1
SIDEBAR_LANGUAGE = 2
@ -90,6 +92,9 @@ class UserBase:
else:
return False
def role_delete_books(self):
return bool((self.role is not None)and(self.role & ROLE_DELETE_BOOKS == ROLE_DELETE_BOOKS))
@classmethod
def is_active(self):
return True
@ -336,6 +341,11 @@ class Config:
else:
return False
def role_delete_books(self):
return bool((self.config_default_role is not None) and
(self.config_default_role & ROLE_DELETE_BOOKS == ROLE_DELETE_BOOKS))
def get_Log_Level(self):
ret_value=""
if self.config_log_level == logging.INFO:
@ -484,7 +494,7 @@ def create_anonymous_user():
def create_admin_user():
user = User()
user.nickname = "admin"
user.role = ROLE_USER + ROLE_ADMIN + ROLE_DOWNLOAD + ROLE_UPLOAD + ROLE_EDIT + ROLE_PASSWD
user.role = ROLE_USER + ROLE_ADMIN + ROLE_DOWNLOAD + ROLE_UPLOAD + ROLE_EDIT + ROLE_DELETE_BOOKS + ROLE_PASSWD
user.sidebar_view = DETAIL_RANDOM + SIDEBAR_LANGUAGE + SIDEBAR_SERIES + SIDEBAR_CATEGORY + SIDEBAR_HOT + \
SIDEBAR_RANDOM + SIDEBAR_AUTHOR + SIDEBAR_BEST_RATED + SIDEBAR_READ_AND_UNREAD

@ -139,11 +139,13 @@ class Gauth:
def __init__(self):
self.auth = GoogleAuth(settings_file='settings.yaml')
@Singleton
class Gdrive:
def __init__(self):
self.drive = gdriveutils.getDrive(Gauth.Instance().auth)
class ReverseProxied(object):
"""Wrap the application in this middleware and configure the
front-end server to add these headers, to let you quietly bind
@ -235,6 +237,7 @@ if config.config_log_level == logging.DEBUG :
def is_gdrive_ready():
return os.path.exists('settings.yaml') and os.path.exists('gdrive_credentials')
@babel.localeselector
def get_locale():
# if a user is logged in, use the locale from the user settings
@ -274,16 +277,19 @@ def load_user_from_header(header_val):
return user
return
def check_auth(username, password):
user = ub.session.query(ub.User).filter(ub.User.nickname == username).first()
return bool(user and check_password_hash(user.password, password))
def authenticate():
return Response(
'Could not verify your access level for that URL.\n'
'You have to login with proper credentials', 401,
{'WWW-Authenticate': 'Basic realm="Login Required"'})
def updateGdriveCalibreFromLocal():
gdriveutils.backupCalibreDbAndOptionalDownload(Gdrive.Instance().drive)
gdriveutils.copyToDrive(Gdrive.Instance().drive, config.config_calibre_dir, False, True)
@ -291,6 +297,7 @@ def updateGdriveCalibreFromLocal():
if os.path.isdir(os.path.join(config.config_calibre_dir, x)):
shutil.rmtree(os.path.join(config.config_calibre_dir, x))
def requires_basic_auth_if_no_ano(f):
@wraps(f)
def decorated(*args, **kwargs):
@ -383,12 +390,14 @@ def mimetype_filter(val):
s = 'application/octet-stream'
return s
@app.template_filter('formatdate')
def formatdate(val):
conformed_timestamp = re.sub(r"[:]|([-](?!((\d{2}[:]\d{2})|(\d{4}))$))", '', val)
formatdate = datetime.datetime.strptime(conformed_timestamp[:15], "%Y%m%d %H%M%S")
return format_date(formatdate, format='medium', locale=get_locale())
@app.template_filter('strftime')
def timestamptodate(date, fmt=None):
date = datetime.datetime.fromtimestamp(
@ -401,6 +410,7 @@ def timestamptodate(date, fmt=None):
time_format = '%d %m %Y - %H:%S'
return native.strftime(time_format)
def admin_required(f):
"""
Checks if current_user.role == 1
@ -484,8 +494,12 @@ def modify_database_object(input_elements, db_book_object, db_object, db_session
del_elements = []
for c_elements in db_book_object:
found = False
if db_type == 'custom':
type_elements=c_elements.value
else:
type_elements=c_elements.name
for inp_element in input_elements:
if inp_element == c_elements.name:
if inp_element == type_elements:
found = True
break
# if the element was not found in the new list, add it to remove list
@ -496,7 +510,11 @@ def modify_database_object(input_elements, db_book_object, db_object, db_session
for inp_element in input_elements:
found = False
for c_elements in db_book_object:
if inp_element == c_elements.name:
if db_type == 'custom':
type_elements = c_elements.value
else:
type_elements = c_elements.name
if inp_element == type_elements:
found = True
break
if not found:
@ -511,6 +529,8 @@ def modify_database_object(input_elements, db_book_object, db_object, db_session
if len(add_elements) > 0:
if db_type == 'languages':
db_filter = db_object.lang_code
elif db_type == 'custom':
db_filter = db_object.value
else:
db_filter = db_object.name
for add_element in add_elements:
@ -520,9 +540,10 @@ def modify_database_object(input_elements, db_book_object, db_object, db_session
if new_element is None:
if db_type == 'author':
new_element = db_object(add_element, add_element, "")
else:
if db_type == 'series':
elif db_type == 'series':
new_element = db_object(add_element, add_element)
elif db_type == 'custom':
new_element = db_object(value=add_element)
else: # db_type should be tag, or languages
new_element = db_object(add_element)
db_session.add(new_element)
@ -530,7 +551,6 @@ def modify_database_object(input_elements, db_book_object, db_object, db_session
# add element to book
db_book_object.append(new_element)
def render_title_template(*args, **kwargs):
return render_template(instance=config.config_calibre_web_title, *args, **kwargs)
@ -642,6 +662,7 @@ def feed_best_rated():
response.headers["Content-Type"] = "application/xml"
return response
@app.route("/opds/hot")
@requires_basic_auth_if_no_ano
def feed_hot():
@ -781,6 +802,7 @@ def partial(total_byte_len, part_size_limit):
s.append([p, last])
return s
def do_gdrive_download(df, headers):
total_size = int(df.metadata.get('fileSize'))
download_url = df.metadata.get('downloadUrl')
@ -796,6 +818,7 @@ def do_gdrive_download(df, headers):
return
return Response(stream_with_context(stream()), headers=headers)
@app.route("/opds/download/<book_id>/<book_format>/")
@requires_basic_auth_if_no_ano
@download_required
@ -861,6 +884,7 @@ def get_tags_json():
json_dumps = json.dumps([dict(name=r.name) for r in entries])
return json_dumps
@app.route("/get_update_status", methods=['GET'])
@login_required_if_no_ano
def get_update_status():
@ -880,6 +904,7 @@ def get_update_status():
status['status'] = False
return json.dumps(status)
@app.route("/get_updater_status", methods=['GET', 'POST'])
@login_required
@admin_required
@ -1165,6 +1190,7 @@ def toggle_read(book_id):
ub.session.commit()
return ""
@app.route("/book/<int:book_id>")
@login_required_if_no_ano
def show_book(book_id):
@ -1196,8 +1222,6 @@ def show_book(book_id):
for entry in shelfs:
book_in_shelfs.append(entry.shelf)
#return render_title_template('detail.html', entry=entries, cc=cc,
# title=entries.title, books_shelfs=book_in_shelfs)
if not current_user.is_anonymous():
matching_have_read_book = ub.session.query(ub.ReadBook).filter(ub.and_(ub.ReadBook.user_id == int(current_user.id),
ub.ReadBook.book_id == book_id)).all()
@ -1255,6 +1279,29 @@ def stats():
return render_title_template('stats.html', bookcounter=counter, authorcounter=authors, versions=versions,
categorycounter=categorys, seriecounter=series, title=_(u"Statistics"))
@app.route("/delete/<int:book_id>/")
@login_required
def delete_book(book_id):
if current_user.role_delete_books():
book = db.session.query(db.Books).filter(db.Books.id == book_id).first()
if book:
# check if only this book links to:
# author, language, series, tags,
modify_database_object([u''], book.authors, db.Authors, db.session, 'author')
modify_database_object([u''], book.tags, db.Tags, db.session, 'tags')
modify_database_object([u''], book.series, db.Series, db.session, 'series')
modify_database_object([u''], book.languages, db.Languages, db.session, 'languages')
modify_database_object([u''], book.publishers, db.Publishers, db.session, 'series')
# custom colums open
ub.session.query(db.Books).filter(db.Books.id == book_id).delete()
#return redirect(url_for('index'))
else:
app.logger.info('Book with id "'+book_id+'" could not be deleted')
# book not found
return redirect(url_for('index'))
@app.route("/gdrive/authenticate")
@login_required
@admin_required
@ -1262,6 +1309,7 @@ def authenticate_google_drive():
authUrl = Gauth.Instance().auth.GetAuthUrl()
return redirect(authUrl)
@app.route("/gdrive/callback")
def google_drive_callback():
auth_code = request.args.get('code')
@ -1270,6 +1318,7 @@ def google_drive_callback():
f.write(credentials.to_json())
return redirect(url_for('configuration'))
@app.route("/gdrive/watch/subscribe")
@login_required
@admin_required
@ -1291,6 +1340,7 @@ def watch_gdrive():
return redirect(url_for('configuration'))
@app.route("/gdrive/watch/revoke")
@login_required
@admin_required
@ -1308,6 +1358,7 @@ def revoke_watch_gdrive():
config.loadSettings()
return redirect(url_for('configuration'))
@app.route("/gdrive/watch/callback", methods=['GET', 'POST'])
def on_received_watch_confirmation():
app.logger.info(request.headers)
@ -1373,6 +1424,7 @@ def shutdown():
return json.dumps({})
abort(404)
@app.route("/update")
@login_required
@admin_required
@ -1487,6 +1539,7 @@ def get_cover_via_gdrive(cover_path):
gdriveutils.session.commit()
return df.metadata.get('webContentLink')
@app.route("/cover/<path:cover_path>")
@login_required_if_no_ano
def get_cover(cover_path):
@ -1508,6 +1561,7 @@ def feed_get_cover(book_id):
else:
return send_from_directory(os.path.join(config.config_calibre_dir, book.path), "cover.jpg")
def render_read_books(page, are_read, as_xml=False):
readBooks = ub.session.query(ub.ReadBook).filter(ub.ReadBook.user_id == int(current_user.id)).filter(ub.ReadBook.is_read == True).all()
readBookIds = [x.book_id for x in readBooks]
@ -1528,6 +1582,7 @@ def render_read_books(page, are_read, as_xml=False):
return render_title_template('index.html', random=random, entries=entries, pagination=pagination,
title=_(name, name=name))
@app.route("/opds/readbooks/")
@login_required_if_no_ano
def feed_read_books():
@ -1536,12 +1591,14 @@ def feed_read_books():
off = 0
return render_read_books(int(off) / (int(config.config_books_per_page)) + 1, True, True)
@app.route("/readbooks/", defaults={'page': 1})
@app.route("/readbooks/<int:page>'")
@login_required_if_no_ano
def read_books(page):
return render_read_books(page, True)
@app.route("/opds/unreadbooks/")
@login_required_if_no_ano
def feed_unread_books():
@ -1550,12 +1607,14 @@ def feed_unread_books():
off = 0
return render_read_books(int(off) / (int(config.config_books_per_page)) + 1, False, True)
@app.route("/unreadbooks/", defaults={'page': 1})
@app.route("/unreadbooks/<int:page>'")
@login_required_if_no_ano
def unread_books(page):
return render_read_books(page, False)
@app.route("/read/<int:book_id>/<book_format>")
@login_required_if_no_ano
def read_book(book_id, book_format):
@ -1613,6 +1672,7 @@ def read_book(book_id, book_format):
flash(_(u"Error opening eBook. File does not exist or file is not accessible:"), category="error")
return redirect(url_for("index"))
@app.route("/download/<int:book_id>/<book_format>")
@login_required_if_no_ano
@download_required
@ -1644,12 +1704,14 @@ def get_download_link(book_id, book_format):
else:
abort(404)
@app.route("/download/<int:book_id>/<book_format>/<anyname>")
@login_required_if_no_ano
@download_required
def get_download_link_ext(book_id, book_format, anyname):
return get_download_link(book_id, book_format)
@app.route('/register', methods=['GET', 'POST'])
def register():
if not config.config_public_reg:
@ -2016,7 +2078,7 @@ def configuration_helper(origin):
if content.config_calibre_dir != to_save["config_calibre_dir"]:
content.config_calibre_dir = to_save["config_calibre_dir"]
db_change = True
##Google drive setup
# Google drive setup
create_new_yaml = False
if "config_google_drive_client_id" in to_save:
if content.config_google_drive_client_id != to_save["config_google_drive_client_id"]:
@ -2082,6 +2144,8 @@ def configuration_helper(origin):
content.config_default_role = content.config_default_role + ub.ROLE_UPLOAD
if "edit_role" in to_save:
content.config_default_role = content.config_default_role + ub.ROLE_EDIT
if "delete_role" in to_save:
content.config_default_role = content.config_default_role + ub.ROLE_DELETE_BOOKS
if "passwd_role" in to_save:
content.config_default_role = content.config_default_role + ub.ROLE_PASSWD
if "passwd_role" in to_save:
@ -2176,6 +2240,8 @@ def new_user():
if "upload_role" in to_save:
content.role = content.role + ub.ROLE_UPLOAD
if "edit_role" in to_save:
content.role = content.role + ub.ROLE_DELETE_BOOKS
if "delete_role" in to_save:
content.role = content.role + ub.ROLE_EDIT
if "passwd_role" in to_save:
content.role = content.role + ub.ROLE_PASSWD
@ -2279,6 +2345,11 @@ def edit_user(user_id):
elif "edit_role" not in to_save and content.role_edit():
content.role = content.role - ub.ROLE_EDIT
if "delete_role" in to_save and not content.role_delete_books():
content.role = content.role + ub.ROLE_DELETE_BOOKS
elif "delete_role" not in to_save and content.role_delete_books():
content.role = content.role - ub.ROLE_DELETE_BOOKS
if "passwd_role" in to_save and not content.role_passwd():
content.role = content.role + ub.ROLE_PASSWD
elif "passwd_role" not in to_save and content.role_passwd():
@ -2384,8 +2455,14 @@ def edit_book(book_id):
input_authors = to_save["author_name"].split('&')
input_authors = map(lambda it: it.strip(), input_authors)
# we have all author names now
if input_authors == ['']:
input_authors = [_(u'unknown')] # prevent empty Author
if book.authors:
author0_before_edit = book.authors[0].name
else:
author0_before_edit = db.Authors(_(u'unknown'),'',0)
modify_database_object(input_authors, book.authors, db.Authors, db.session, 'author')
if book.authors:
if author0_before_edit != book.authors[0].name:
edited_books_id.add(book.id)
book.author_sort = helper.get_sorted_author(input_authors[0])
@ -2510,7 +2587,8 @@ def edit_book(book_id):
else:
input_tags = to_save[cc_string].split(',')
input_tags = map(lambda it: it.strip(), input_tags)
input_tags = [x for x in input_tags if x != '']
modify_database_object(input_tags, getattr(book, cc_string),db.cc_classes[c.id], db.session, 'custom')
'''input_tags = [x for x in input_tags if x != '']
# we have all author names now
# 1. search for tags to remove
del_tags = []
@ -2552,7 +2630,7 @@ def edit_book(book_id):
new_tag = db.session.query(db.cc_classes[c.id]).filter(
db.cc_classes[c.id].value == add_tag).first()
# add tag to book
getattr(book, cc_string).append(new_tag)
getattr(book, cc_string).append(new_tag)'''
db.session.commit()
author_names = []
@ -2669,10 +2747,8 @@ def upload():
db.session.flush() # flush content get db_book.id avalible
# add comment
upload_comment = Markup(meta.description).unescape()
db_comment = None
if upload_comment != "":
db_comment = db.Comments(upload_comment, db_book.id)
db.session.add(db_comment)
db.session.add(db.Comments(upload_comment, db_book.id))
db.session.commit()
if db_language is not None: # display Full name instead of iso639.part3
db_book.languages[0].language_name = _(meta.languages)
@ -2691,6 +2767,7 @@ def upload():
else:
return redirect(url_for("index"))
def start_gevent():
from gevent.wsgi import WSGIServer
global gevent_server

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2017-04-14 09:38+0200\n"
"POT-Creation-Date: 2017-04-14 20:25+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -17,7 +17,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.3.4\n"
#: cps/book_formats.py:113 cps/book_formats.py:117 cps/web.py:1235
#: cps/book_formats.py:113 cps/book_formats.py:117 cps/web.py:1258
msgid "not installed"
msgstr ""
@ -46,325 +46,329 @@ msgstr ""
msgid "Could not convert epub to mobi"
msgstr ""
#: cps/ub.py:471
#: cps/ub.py:481
msgid "Guest"
msgstr ""
#: cps/web.py:894
#: cps/web.py:917
msgid "Requesting update package"
msgstr ""
#: cps/web.py:895
#: cps/web.py:918
msgid "Downloading update package"
msgstr ""
#: cps/web.py:896
#: cps/web.py:919
msgid "Unzipping update package"
msgstr ""
#: cps/web.py:897
#: cps/web.py:920
msgid "Files are replaced"
msgstr ""
#: cps/web.py:898
#: cps/web.py:921
msgid "Database connections are closed"
msgstr ""
#: cps/web.py:899
#: cps/web.py:922
msgid "Server is stopped"
msgstr ""
#: cps/web.py:900
#: cps/web.py:923
msgid "Update finished, please press okay and reload page"
msgstr ""
#: cps/web.py:974
#: cps/web.py:997
msgid "Latest Books"
msgstr ""
#: cps/web.py:1005
#: cps/web.py:1028
msgid "Hot Books (most downloaded)"
msgstr ""
#: cps/web.py:1015
#: cps/web.py:1038
msgid "Best rated books"
msgstr ""
#: cps/templates/index.xml:36 cps/web.py:1024
#: cps/templates/index.xml:36 cps/web.py:1047
msgid "Random Books"
msgstr ""
#: cps/web.py:1037
#: cps/web.py:1060
msgid "Author list"
msgstr ""
#: cps/web.py:1048
#: cps/web.py:1072
#, python-format
msgid "Author: %(name)s"
msgstr ""
#: cps/web.py:1050 cps/web.py:1078 cps/web.py:1212 cps/web.py:1614
#: cps/web.py:2578
#: cps/web.py:1074 cps/web.py:1102 cps/web.py:1235 cps/web.py:1672
#: cps/web.py:2655
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr ""
#: cps/templates/index.xml:71 cps/web.py:1064
#: cps/templates/index.xml:71 cps/web.py:1088
msgid "Series list"
msgstr ""
#: cps/web.py:1076
#: cps/web.py:1100
#, python-format
msgid "Series: %(serie)s"
msgstr ""
#: cps/web.py:1109
#: cps/web.py:1133
msgid "Available languages"
msgstr ""
#: cps/web.py:1124
#: cps/web.py:1148
#, python-format
msgid "Language: %(name)s"
msgstr ""
#: cps/templates/index.xml:64 cps/web.py:1137
#: cps/templates/index.xml:64 cps/web.py:1161
msgid "Category list"
msgstr ""
#: cps/web.py:1149
#: cps/web.py:1173
#, python-format
msgid "Category: %(name)s"
msgstr ""
#: cps/web.py:1257
#: cps/web.py:1280
msgid "Statistics"
msgstr ""
#: cps/web.py:1365
#: cps/web.py:1415
msgid "Server restarted, please reload page"
msgstr ""
#: cps/web.py:1367
#: cps/web.py:1417
msgid "Performing shutdown of server, please close window"
msgstr ""
#: cps/web.py:1382
#: cps/web.py:1433
msgid "Update done"
msgstr ""
#: cps/web.py:1460 cps/web.py:1473
#: cps/web.py:1511 cps/web.py:1524
msgid "search"
msgstr ""
#: cps/web.py:1590 cps/web.py:1597 cps/web.py:1604 cps/web.py:1611
#: cps/web.py:1648 cps/web.py:1655 cps/web.py:1662 cps/web.py:1669
msgid "Read a Book"
msgstr ""
#: cps/web.py:1664 cps/web.py:2144
#: cps/web.py:1725 cps/web.py:2207
msgid "Please fill out all fields!"
msgstr ""
#: cps/web.py:1665 cps/web.py:1681 cps/web.py:1686 cps/web.py:1688
#: cps/web.py:1726 cps/web.py:1742 cps/web.py:1747 cps/web.py:1749
msgid "register"
msgstr ""
#: cps/web.py:1680
#: cps/web.py:1741
msgid "An unknown error occured. Please try again later."
msgstr ""
#: cps/web.py:1685
#: cps/web.py:1746
msgid "This username or email address is already in use."
msgstr ""
#: cps/web.py:1703
#: cps/web.py:1764
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr ""
#: cps/web.py:1708
#: cps/web.py:1769
msgid "Wrong Username or Password"
msgstr ""
#: cps/web.py:1710
#: cps/web.py:1771
msgid "login"
msgstr ""
#: cps/web.py:1727
#: cps/web.py:1788
msgid "Please configure the SMTP mail settings first..."
msgstr ""
#: cps/web.py:1731
#: cps/web.py:1792
#, python-format
msgid "Book successfully send to %(kindlemail)s"
msgstr ""
#: cps/web.py:1735
#: cps/web.py:1796
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr ""
#: cps/web.py:1737 cps/web.py:2226
#: cps/web.py:1798 cps/web.py:2291
msgid "Please configure your kindle email address first..."
msgstr ""
#: cps/web.py:1762
#: cps/web.py:1823
#, python-format
msgid "Book has been added to shelf: %(sname)s"
msgstr ""
#: cps/web.py:1782
#: cps/web.py:1843
#, python-format
msgid "Book has been removed from shelf: %(sname)s"
msgstr ""
#: cps/web.py:1800 cps/web.py:1824
#: cps/web.py:1861 cps/web.py:1885
#, python-format
msgid "A shelf with the name '%(title)s' already exists."
msgstr ""
#: cps/web.py:1805
#: cps/web.py:1866
#, python-format
msgid "Shelf %(title)s created"
msgstr ""
#: cps/web.py:1807 cps/web.py:1835
#: cps/web.py:1868 cps/web.py:1896
msgid "There was an error"
msgstr ""
#: cps/web.py:1808 cps/web.py:1810
#: cps/web.py:1869 cps/web.py:1871
msgid "create a shelf"
msgstr ""
#: cps/web.py:1833
#: cps/web.py:1894
#, python-format
msgid "Shelf %(title)s changed"
msgstr ""
#: cps/web.py:1836 cps/web.py:1838
#: cps/web.py:1897 cps/web.py:1899
msgid "Edit a shelf"
msgstr ""
#: cps/web.py:1858
#: cps/web.py:1919
#, python-format
msgid "successfully deleted shelf %(name)s"
msgstr ""
#: cps/web.py:1880
#: cps/web.py:1941
#, python-format
msgid "Shelf: '%(name)s'"
msgstr ""
#: cps/web.py:1911
#: cps/web.py:1972
#, python-format
msgid "Change order of Shelf: '%(name)s'"
msgstr ""
#: cps/web.py:1975
#: cps/web.py:2036
msgid "Found an existing account for this email address."
msgstr ""
#: cps/web.py:1977 cps/web.py:1981
#: cps/web.py:2038 cps/web.py:2042
#, python-format
msgid "%(name)s's profile"
msgstr ""
#: cps/web.py:1978
#: cps/web.py:2039
msgid "Profile updated"
msgstr ""
#: cps/web.py:1992
#: cps/web.py:2053
msgid "Admin page"
msgstr ""
#: cps/web.py:2098
#: cps/web.py:2161
msgid "Calibre-web configuration updated"
msgstr ""
#: cps/web.py:2105 cps/web.py:2111 cps/web.py:2125
#: cps/web.py:2168 cps/web.py:2174 cps/web.py:2188
msgid "Basic Configuration"
msgstr ""
#: cps/web.py:2109
#: cps/web.py:2172
msgid "DB location is not valid, please enter correct path"
msgstr ""
#: cps/templates/admin.html:34 cps/web.py:2146 cps/web.py:2196
#: cps/templates/admin.html:34 cps/web.py:2209 cps/web.py:2261
msgid "Add new user"
msgstr ""
#: cps/web.py:2188
#: cps/web.py:2253
#, python-format
msgid "User '%(user)s' created"
msgstr ""
#: cps/web.py:2192
#: cps/web.py:2257
msgid "Found an existing account for this email address or nickname."
msgstr ""
#: cps/web.py:2214
#: cps/web.py:2279
msgid "Mail settings updated"
msgstr ""
#: cps/web.py:2221
#: cps/web.py:2286
#, python-format
msgid "Test E-Mail successfully send to %(kindlemail)s"
msgstr ""
#: cps/web.py:2224
#: cps/web.py:2289
#, python-format
msgid "There was an error sending the Test E-Mail: %(res)s"
msgstr ""
#: cps/web.py:2228
#: cps/web.py:2293
msgid "E-Mail settings updated"
msgstr ""
#: cps/web.py:2229
#: cps/web.py:2294
msgid "Edit mail settings"
msgstr ""
#: cps/web.py:2257
#: cps/web.py:2322
#, python-format
msgid "User '%(nick)s' deleted"
msgstr ""
#: cps/web.py:2348
#: cps/web.py:2418
#, python-format
msgid "User '%(nick)s' updated"
msgstr ""
#: cps/web.py:2351
#: cps/web.py:2421
msgid "An unknown error occured."
msgstr ""
#: cps/web.py:2354
#: cps/web.py:2424
#, python-format
msgid "Edit User %(nick)s"
msgstr ""
#: cps/web.py:2573 cps/web.py:2576 cps/web.py:2688
#: cps/web.py:2459 cps/web.py:2463
msgid "unknown"
msgstr ""
#: cps/web.py:2650 cps/web.py:2653 cps/web.py:2763
msgid "edit metadata"
msgstr ""
#: cps/web.py:2597
#: cps/web.py:2674
#, python-format
msgid "File extension \"%s\" is not allowed to be uploaded to this server"
msgstr ""
#: cps/web.py:2603
#: cps/web.py:2680
msgid "File to be uploaded must have an extension"
msgstr ""
#: cps/web.py:2620
#: cps/web.py:2697
#, python-format
msgid "Failed to create path %s (Permission denied)."
msgstr ""
#: cps/web.py:2625
#: cps/web.py:2702
#, python-format
msgid "Failed to store file %s (Permission denied)."
msgstr ""
#: cps/web.py:2630
#: cps/web.py:2707
#, python-format
msgid "Failed to delete file %s (Permission denied)."
msgstr ""
@ -515,10 +519,10 @@ msgid "Ok"
msgstr ""
#: cps/templates/admin.html:103 cps/templates/admin.html:117
#: cps/templates/book_edit.html:109 cps/templates/config_edit.html:123
#: cps/templates/email_edit.html:36 cps/templates/shelf.html:53
#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:12
#: cps/templates/user_edit.html:124
#: cps/templates/book_edit.html:115 cps/templates/book_edit.html:134
#: cps/templates/config_edit.html:127 cps/templates/email_edit.html:36
#: cps/templates/shelf.html:53 cps/templates/shelf_edit.html:19
#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:128
msgid "Back"
msgstr ""
@ -530,104 +534,124 @@ msgstr ""
msgid "Updating, please do not reload page"
msgstr ""
#: cps/templates/book_edit.html:16 cps/templates/search_form.html:6
#: cps/templates/book_edit.html:16
msgid "Delete Book"
msgstr ""
#: cps/templates/book_edit.html:22 cps/templates/search_form.html:6
msgid "Book Title"
msgstr ""
#: cps/templates/book_edit.html:20 cps/templates/book_edit.html:145
#: cps/templates/book_edit.html:26 cps/templates/book_edit.html:173
#: cps/templates/search_form.html:10
msgid "Author"
msgstr ""
#: cps/templates/book_edit.html:24 cps/templates/book_edit.html:147
#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:175
msgid "Description"
msgstr ""
#: cps/templates/book_edit.html:28 cps/templates/search_form.html:17
#: cps/templates/book_edit.html:34 cps/templates/search_form.html:17
msgid "Tags"
msgstr ""
#: cps/templates/book_edit.html:33 cps/templates/layout.html:142
#: cps/templates/book_edit.html:39 cps/templates/layout.html:142
#: cps/templates/search_form.html:37
msgid "Series"
msgstr ""
#: cps/templates/book_edit.html:37
#: cps/templates/book_edit.html:43
msgid "Series id"
msgstr ""
#: cps/templates/book_edit.html:41
#: cps/templates/book_edit.html:47
msgid "Rating"
msgstr ""
#: cps/templates/book_edit.html:45
#: cps/templates/book_edit.html:51
msgid "Cover URL (jpg)"
msgstr ""
#: cps/templates/book_edit.html:50 cps/templates/user_edit.html:27
#: cps/templates/book_edit.html:56 cps/templates/user_edit.html:27
msgid "Language"
msgstr ""
#: cps/templates/book_edit.html:61
#: cps/templates/book_edit.html:67
msgid "Yes"
msgstr ""
#: cps/templates/book_edit.html:62
#: cps/templates/book_edit.html:68
msgid "No"
msgstr ""
#: cps/templates/book_edit.html:104
#: cps/templates/book_edit.html:110
msgid "view book after edit"
msgstr ""
#: cps/templates/book_edit.html:107 cps/templates/book_edit.html:118
#: cps/templates/book_edit.html:113 cps/templates/book_edit.html:146
msgid "Get metadata"
msgstr ""
#: cps/templates/book_edit.html:108 cps/templates/config_edit.html:121
#: cps/templates/book_edit.html:114 cps/templates/config_edit.html:125
#: cps/templates/login.html:19 cps/templates/search_form.html:79
#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:122
#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:126
msgid "Submit"
msgstr ""
#: cps/templates/book_edit.html:121
#: cps/templates/book_edit.html:125
msgid "Are really you sure?"
msgstr ""
#: cps/templates/book_edit.html:128
msgid "Book will be deleted from Calibre database"
msgstr ""
#: cps/templates/book_edit.html:129
msgid "and from hard disk"
msgstr ""
#: cps/templates/book_edit.html:133
msgid "Delete"
msgstr ""
#: cps/templates/book_edit.html:149
msgid "Keyword"
msgstr ""
#: cps/templates/book_edit.html:122
#: cps/templates/book_edit.html:150
msgid " Search keyword "
msgstr ""
#: cps/templates/book_edit.html:124 cps/templates/layout.html:60
#: cps/templates/book_edit.html:152 cps/templates/layout.html:60
msgid "Go!"
msgstr ""
#: cps/templates/book_edit.html:125
#: cps/templates/book_edit.html:153
msgid "Click the cover to load metadata to the form"
msgstr ""
#: cps/templates/book_edit.html:129 cps/templates/book_edit.html:142
#: cps/templates/book_edit.html:157 cps/templates/book_edit.html:170
msgid "Loading..."
msgstr ""
#: cps/templates/book_edit.html:132
#: cps/templates/book_edit.html:160
msgid "Close"
msgstr ""
#: cps/templates/book_edit.html:143
#: cps/templates/book_edit.html:171
msgid "Search error!"
msgstr ""
#: cps/templates/book_edit.html:144
#: cps/templates/book_edit.html:172
msgid "No Result! Please try anonther keyword."
msgstr ""
#: cps/templates/book_edit.html:146 cps/templates/detail.html:76
#: cps/templates/book_edit.html:174 cps/templates/detail.html:76
#: cps/templates/search_form.html:14
msgid "Publisher"
msgstr ""
#: cps/templates/book_edit.html:148
#: cps/templates/book_edit.html:176
msgid "Source"
msgstr ""
@ -711,15 +735,19 @@ msgstr ""
msgid "Allow Edit"
msgstr ""
#: cps/templates/config_edit.html:115 cps/templates/user_edit.html:105
msgid "Allow Changing Password"
#: cps/templates/config_edit.html:115 cps/templates/user_edit.html:104
msgid "Allow Delete books"
msgstr ""
#: cps/templates/config_edit.html:119 cps/templates/user_edit.html:109
msgid "Allow Changing Password"
msgstr ""
#: cps/templates/config_edit.html:123 cps/templates/user_edit.html:113
msgid "Allow Editing Public Shelfs"
msgstr ""
#: cps/templates/config_edit.html:126 cps/templates/layout.html:93
#: cps/templates/config_edit.html:130 cps/templates/layout.html:93
#: cps/templates/login.html:4
msgid "Login"
msgstr ""
@ -1092,11 +1120,11 @@ msgstr ""
msgid "Show random books in detail view"
msgstr ""
#: cps/templates/user_edit.html:116
#: cps/templates/user_edit.html:120
msgid "Delete this user"
msgstr ""
#: cps/templates/user_edit.html:131
#: cps/templates/user_edit.html:135
msgid "Recent Downloads"
msgstr ""

Loading…
Cancel
Save