1
0
mirror of https://github.com/janeczku/calibre-web synced 2024-11-25 02:57:22 +00:00
This commit is contained in:
Radosław Kierznowski 2019-08-18 21:54:29 +02:00
commit c73698e8fd
20 changed files with 260 additions and 217 deletions

View File

@ -35,6 +35,13 @@ try:
from flask_login import __version__ as flask_loginVersion
except ImportError:
from flask_login.__about__ import __version__ as flask_loginVersion
try:
import unidecode
unidecode_version = _(u'installed')
except ImportError:
unidecode_version = _(u'not installed')
from . import services
about = flask.Blueprint('about', __name__)
@ -54,6 +61,9 @@ _VERSIONS = OrderedDict(
SQLite=sqlite3.sqlite_version,
iso639=isoLanguages.__version__,
pytz=pytz.__version__,
Unidecode = unidecode_version,
Flask_SimpleLDAP = _(u'installed') if bool(services.ldap) else _(u'not installed'),
Goodreads = _(u'installed') if bool(services.goodreads) else _(u'not installed'),
)
_VERSIONS.update(uploader.get_versions())

View File

@ -41,11 +41,13 @@ def extractCover(tmp_file_name, original_file_extension):
if use_comic_meta:
archive = ComicArchive(tmp_file_name)
cover_data = None
ext = os.path.splitext(archive.getPageName(0))
if len(ext) > 1:
extension = ext[1].lower()
if extension == '.jpg' or extension == '.jpeg':
cover_data = archive.getPage(0)
for index, name in enumerate(archive.getPageNameList()):
ext = os.path.splitext(name)
if len(ext) > 1:
extension = ext[1].lower()
if extension == '.jpg' or extension == '.jpeg':
cover_data = archive.getPage(index)
break
else:
if original_file_extension.upper() == '.CBZ':
cf = zipfile.ZipFile(tmp_file_name)
@ -53,7 +55,7 @@ def extractCover(tmp_file_name, original_file_extension):
ext = os.path.splitext(name)
if len(ext) > 1:
extension = ext[1].lower()
if extension == '.jpg':
if extension == '.jpg' or extension == '.jpeg':
cover_data = cf.read(name)
break
elif original_file_extension.upper() == '.CBT':
@ -62,7 +64,7 @@ def extractCover(tmp_file_name, original_file_extension):
ext = os.path.splitext(name)
if len(ext) > 1:
extension = ext[1].lower()
if extension == '.jpg':
if extension == '.jpg' or extension == '.jpeg':
cover_data = cf.extractfile(name).read()
break
prefix = os.path.dirname(tmp_file_name)
@ -87,16 +89,17 @@ def get_comic_info(tmp_file_path, original_file_name, original_file_extension):
else:
style = None
if style is not None:
loadedMetadata = archive.readMetadata(style)
# if style is not None:
loadedMetadata = archive.readMetadata(style)
lang = loadedMetadata.language
if len(lang) == 2:
loadedMetadata.language = isoLanguages.get(part1=lang).name
elif len(lang) == 3:
loadedMetadata.language = isoLanguages.get(part3=lang).name
else:
loadedMetadata.language = ""
lang = loadedMetadata.language
if lang:
if len(lang) == 2:
loadedMetadata.language = isoLanguages.get(part1=lang).name
elif len(lang) == 3:
loadedMetadata.language = isoLanguages.get(part3=lang).name
else:
loadedMetadata.language = ""
return BookMeta(
file_path=tmp_file_path,

View File

@ -785,4 +785,4 @@ def get_download_link(book_id, book_format):
############### Database Helper functions
def lcase(s):
return unidecode.unidecode(s.lower())
return unidecode.unidecode(s.lower()) if use_unidecode else s.lower()

View File

@ -95,13 +95,6 @@ def setup(log_file, log_level=None):
Configure the logging output.
May be called multiple times.
'''
# if debugging, start logging to stderr immediately
if os.environ.get('FLASK_DEBUG', None):
log_file = LOG_TO_STDERR
log_level = logging.DEBUG
log_file = _absolute_log_file(log_file, DEFAULT_LOG_FILE)
log_level = log_level or DEFAULT_LOG_LEVEL
logging.getLogger(__package__).setLevel(log_level)
@ -110,6 +103,8 @@ def setup(log_file, log_level=None):
# avoid spamming the log with debug messages from libraries
r.setLevel(log_level)
log_file = _absolute_log_file(log_file, DEFAULT_LOG_FILE)
previous_handler = r.handlers[0] if r.handlers else None
if previous_handler:
# if the log_file has not changed, don't create a new handler
@ -167,3 +162,7 @@ class StderrLogger(object):
self.buffer += message
except Exception:
self.log.debug("Logging Error")
# default configuration, before application settngs are applied
setup(LOG_TO_STDERR, logging.DEBUG if os.environ.get('FLASK_DEBUG') else DEFAULT_LOG_LEVEL)

View File

@ -56,6 +56,7 @@ def requires_basic_auth_if_no_ano(f):
@opds.route("/opds/")
@opds.route("/opds")
@requires_basic_auth_if_no_ano
def feed_index():
return render_xml_template('index.xml')
@ -288,7 +289,7 @@ def check_auth(username, password):
username=username.encode('windows-1252')
user = ub.session.query(ub.User).filter(func.lower(ub.User.nickname) ==
username.decode('utf-8').lower()).first()
return bool(user and check_password_hash(user.password, password))
return bool(user and check_password_hash(str(user.password), password))
def authenticate():

View File

@ -26,11 +26,13 @@ log = logger.create()
try: from . import goodreads
except ImportError as err:
log.warning("goodreads: %s", err)
log.debug("cannot import goodreads, showing authors-metadata will not work: %s", err)
goodreads = None
try: from . import simpleldap as ldap
except ImportError as err:
log.warning("simpleldap: %s", err)
log.debug("cannot import simpleldap, logging in with ldap will not work: %s", err)
ldap = None

View File

@ -268,7 +268,6 @@ def delete_shelf(shelf_id):
# @shelf.route("/shelfdown/<int:shelf_id>")
@shelf.route("/shelf/<int:shelf_id>", defaults={'shelf_type': 1})
@shelf.route("/shelf/<int:shelf_id>/<int:shelf_type>")
@login_required
def show_shelf(shelf_type, shelf_id):
if current_user.is_anonymous:
shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.is_public == 1, ub.Shelf.id == shelf_id).first()

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -52,7 +52,7 @@
<div class="navbar-collapse collapse">
{% if g.user.is_authenticated or g.allow_anonymous %}
<ul class="nav navbar-nav ">
<li><a href="{{url_for('web.advanced_search')}}"><span class="glyphicon glyphicon-search"></span><span class="hidden-sm"> {{_('Advanced Search')}}</span></a></li>
<li><a href="{{url_for('web.advanced_search')}}"><span class="glyphicon glyphicon-search"></span><span class="hidden-sm">{{_('Advanced Search')}}</span></a></li>
</ul>
{% endif %}
<ul class="nav navbar-nav navbar-right" id="main-nav">
@ -128,7 +128,7 @@
{% endif %}
{% endfor %}
{% if g.user.is_authenticated or allow_anonymous %}
{% if g.user.is_authenticated or g.allow_anonymous %}
<li class="nav-head hidden-xs public-shelves">{{_('Public Shelves')}}</li>
{% for shelf in g.public_shelfes %}
<li><a href="{{url_for('shelf.show_shelf', shelf_id=shelf.id)}}"><span class="glyphicon glyphicon-list public_shelf"></span>{{shelf.name|shortentitle(40)}}</a></li>

View File

@ -5,20 +5,30 @@
# FIRST AUTHOR OzzieIsaacs, 2016.
msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2019-07-26 17:19+0200\n"
"PO-Revision-Date: 2019-06-22 19:54+0200\n"
"POT-Creation-Date: 2019-08-06 18:35+0200\n"
"PO-Revision-Date: 2019-08-06 18:36+0200\n"
"Last-Translator: Ozzie Isaacs\n"
"Language: de\n"
"Language-Team: \n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.7.0\n"
"X-Generator: Poedit 2.2.3\n"
#: cps/about.py:70
#: cps/about.py:40
msgid "installed"
msgstr "Installiert"
#: cps/about.py:42 cps/uploader.py:213 cps/uploader.py:214 cps/uploader.py:218
#: cps/uploader.py:222 cps/uploader.py:226
msgid "not installed"
msgstr "Nicht installiert"
#: cps/about.py:76
msgid "Statistics"
msgstr "Statistiken"
@ -276,125 +286,133 @@ msgstr "Google Drive Setup is nicht komplett, bitte versuche Google Drive zu dea
msgid "Callback domain is not verified, please follow steps to verify domain in google developer console"
msgstr "Callback Domain ist nicht verifiziert, bitte Domain in der Google Developer Console verifizieren"
#: cps/helper.py:79
#: cps/helper.py:53
msgid "Installed"
msgstr ""
#: cps/helper.py:56
msgid "Not installed"
msgstr ""
#: cps/helper.py:81
#, python-format
msgid "%(format)s format not found for book id: %(book)d"
msgstr "%(format)s Format für Buch-ID %(book)d nicht gefunden "
#: cps/helper.py:91
#: cps/helper.py:93
#, python-format
msgid "%(format)s not found on Google Drive: %(fn)s"
msgstr "%(format)s von Buch %(fn)s nicht auf Google Drive gefunden"
#: cps/helper.py:98 cps/helper.py:206 cps/templates/detail.html:41
#: cps/helper.py:100 cps/helper.py:208 cps/templates/detail.html:41
#: cps/templates/detail.html:45
msgid "Send to Kindle"
msgstr "An Kindle senden"
#: cps/helper.py:99 cps/helper.py:117 cps/helper.py:208
#: cps/helper.py:101 cps/helper.py:119 cps/helper.py:210
msgid "This e-mail has been sent via Calibre-Web."
msgstr "Diese E-Mail wurde durch Calibre-Web versendet."
#: cps/helper.py:110
#: cps/helper.py:112
#, python-format
msgid "%(format)s not found: %(fn)s"
msgstr "%(format)s nicht gefunden: %(fn)s"
#: cps/helper.py:115
#: cps/helper.py:117
msgid "Calibre-Web test e-mail"
msgstr "Calibre-Web Test-E-Mail"
#: cps/helper.py:117
#: cps/helper.py:119
msgid "Test e-mail"
msgstr "Test-E-Mail"
#: cps/helper.py:132
#: cps/helper.py:134
msgid "Get Started with Calibre-Web"
msgstr "Loslegen mit Calibre-Web"
#: cps/helper.py:134
#: cps/helper.py:136
#, python-format
msgid "Registration e-mail for user: %(name)s"
msgstr "Registrierungs-E-Mail für Benutzer %(name)s"
#: cps/helper.py:148 cps/helper.py:150 cps/helper.py:152 cps/helper.py:160
#: cps/helper.py:162 cps/helper.py:164
#: cps/helper.py:150 cps/helper.py:152 cps/helper.py:154 cps/helper.py:162
#: cps/helper.py:164 cps/helper.py:166
#, python-format
msgid "Send %(format)s to Kindle"
msgstr "Sende %(format)s an Kindle"
#: cps/helper.py:168
#: cps/helper.py:170
#, python-format
msgid "Convert %(orig)s to %(format)s and send to Kindle"
msgstr "Konvertiere %(orig)s nach %(format)s und sende an Kindle"
#: cps/helper.py:208
#: cps/helper.py:210
#, python-format
msgid "E-mail: %(book)s"
msgstr "E-Mail: %(book)s"
#: cps/helper.py:210
#: cps/helper.py:212
msgid "The requested file could not be read. Maybe wrong permissions?"
msgstr "Die angeforderte Datei konnte nicht gelesen werden. Evtl. falsche Zugriffsrechte?"
#: cps/helper.py:317
#: cps/helper.py:319
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Umbenennen des Titels '%(src)s' zu '%(dest)s' schlug fehl: %(error)s"
#: cps/helper.py:327
#: cps/helper.py:329
#, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Umbenennen des Authors '%(src)s' zu '%(dest)s' schlug fehl: %(error)s"
#: cps/helper.py:341
#: cps/helper.py:343
#, python-format
msgid "Rename file in path '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Umbenennen der Datei im Pfad '%(src)s' nach '%(dest)s' ist fehlgeschlagen: %(error)s"
#: cps/helper.py:367 cps/helper.py:377 cps/helper.py:385
#: cps/helper.py:369 cps/helper.py:379 cps/helper.py:387
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "Datei %(file)s wurde nicht auf Google Drive gefunden"
#: cps/helper.py:406
#: cps/helper.py:408
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "Buchpfad %(path)s wurde nicht auf Google Drive gefunden"
#: cps/helper.py:623
#: cps/helper.py:625
msgid "Waiting"
msgstr "Wartend"
#: cps/helper.py:625
#: cps/helper.py:627
msgid "Failed"
msgstr "Fehlgeschlagen"
#: cps/helper.py:627
#: cps/helper.py:629
msgid "Started"
msgstr "Gestartet"
#: cps/helper.py:629
#: cps/helper.py:631
msgid "Finished"
msgstr "Beendet"
#: cps/helper.py:631
#: cps/helper.py:633
msgid "Unknown Status"
msgstr "Unbekannter Status"
#: cps/helper.py:636
#: cps/helper.py:638
msgid "E-mail: "
msgstr "E-Mail: "
#: cps/helper.py:638 cps/helper.py:642
#: cps/helper.py:640 cps/helper.py:644
msgid "Convert: "
msgstr "Konvertiere: "
#: cps/helper.py:640
#: cps/helper.py:642
msgid "Upload: "
msgstr "Upload: "
#: cps/helper.py:644
#: cps/helper.py:646
msgid "Unknown Task: "
msgstr "Unbekannte Aufgabe: "
@ -676,11 +694,6 @@ msgstr "Ein neues Update ist verfügbar. Klicke auf den Button unten, um auf Ver
msgid "Click on the button below to update to the latest stable version."
msgstr "Klicke auf den Button unten, um auf die letzte stabile Version zu aktualisieren."
#: cps/uploader.py:213 cps/uploader.py:214 cps/uploader.py:218
#: cps/uploader.py:222 cps/uploader.py:226
msgid "not installed"
msgstr "Nicht installiert"
#: cps/web.py:460
msgid "Recently Added Books"
msgstr "Kürzlich hinzugefügte Bücher"
@ -2301,4 +2314,3 @@ msgstr "Letzte Downloads"
#~ msgid "Google OAuth Client Secret"
#~ msgstr "Google OAuth Client-Secret"

View File

@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web (GPLV3)\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-07-26 16:41+0200\n"
"POT-Creation-Date: 2019-07-31 17:36+0200\n"
"PO-Revision-Date: 2019-06-17 22:37+0200\n"
"Last-Translator: Heimen Stoffels <vistausss@outlook.com>\n"
"Last-Translator: Marcel Maas <marcel.maas@outlook.com>\n"
"Language: nl\n"
"Language-Team: ed.driesen@telenet.be\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
@ -37,11 +37,11 @@ msgstr "Onbekend"
#: cps/admin.py:130
msgid "Admin page"
msgstr "Administratiepagina"
msgstr "Systeembeheer"
#: cps/admin.py:149 cps/templates/admin.html:102
msgid "UI Configuration"
msgstr "Uiterlijke instellingen"
msgstr "Uiterlijk aanpassen"
#: cps/admin.py:181 cps/admin.py:399
msgid "Calibre-Web configuration updated"
@ -71,7 +71,7 @@ msgstr "Er is een bestaand account met dit e-mailadres of deze gebruikersnaam aa
#: cps/admin.py:474
#, python-format
msgid "User '%(user)s' created"
msgstr "Gebruiker '%(user)s' is gecreëerd"
msgstr "Gebruiker '%(user)s' aangemaakt"
#: cps/admin.py:494
msgid "Edit e-mail server settings"
@ -80,16 +80,16 @@ msgstr "E-mailserverinstellingen bewerken"
#: cps/admin.py:520
#, python-format
msgid "Test e-mail successfully send to %(kindlemail)s"
msgstr "De test-e-mail is verstuurd naar %(kindlemail)s"
msgstr "Test-e-mail verstuurd naar %(kindlemail)s"
#: cps/admin.py:523
#, python-format
msgid "There was an error sending the Test e-mail: %(res)s"
msgstr "Er is een fout opgetreden bij het versturen van de test-e-mail: %(res)s"
msgstr "Fout opgetreden bij het versturen van de test-e-mail: %(res)s"
#: cps/admin.py:525 cps/web.py:1033
msgid "Please configure your kindle e-mail address first..."
msgstr "Stel eerst je kindle-mailadres in..."
msgstr "Stel je kindle-e-mailadres in..."
#: cps/admin.py:527
msgid "E-mail server settings updated"
@ -102,11 +102,11 @@ msgstr "Gebruiker '%(nick)s' is verwijderd"
#: cps/admin.py:559
msgid "No admin user remaining, can't delete user"
msgstr ""
msgstr "Kan laatste systeembeheerder niet verwijderen"
#: cps/admin.py:598 cps/web.py:1279
msgid "Found an existing account for this e-mail address."
msgstr "Er is een bestaand account met dit e-mailadres aangetroffen."
msgstr "Bestaand account met dit e-mailadres aangetroffen."
#: cps/admin.py:601 cps/admin.py:613
#, python-format
@ -116,7 +116,7 @@ msgstr "Gebruiker '%(nick)s' bewerken"
#: cps/admin.py:607
#, python-format
msgid "User '%(nick)s' updated"
msgstr "Gebruiker '%(nick)s' is bijgewerkt"
msgstr "Gebruiker '%(nick)s' bijgewerkt"
#: cps/admin.py:610
msgid "An unknown error occured."
@ -129,7 +129,7 @@ msgstr "Wachtwoord voor gebruiker %(user)s is hersteld"
#: cps/admin.py:632 cps/web.py:1075
msgid "An unknown error occurred. Please try again later."
msgstr "Er is een onbekende fout opgetreden. Probeer het later nog eens."
msgstr "Onbekende fout opgetreden. Probeer het later nog eens."
#: cps/admin.py:643
msgid "Logfile viewer"
@ -225,7 +225,7 @@ msgstr "onbekend"
#: cps/editbooks.py:447
msgid "Cover is not a jpg file, can't save"
msgstr ""
msgstr "Cover is geen jpg bestand, opslaan niet mogelijk"
#: cps/editbooks.py:490
#, python-format
@ -253,7 +253,7 @@ msgstr "Kan %(file)s niet verwijderen (niet gemachtigd)."
#: cps/editbooks.py:668
#, python-format
msgid "File %(file)s uploaded"
msgstr ""
msgstr "Bestand %(file)s geüpload"
#: cps/editbooks.py:697
msgid "Source or destination format for conversion missing"
@ -402,23 +402,23 @@ msgstr "Onbekende taak: "
#: cps/oauth_bb.py:75
#, python-format
msgid "Register with %(provider)s"
msgstr ""
msgstr "Aanmelden bij %(provider)s"
#: cps/oauth_bb.py:155
msgid "Failed to log in with GitHub."
msgstr ""
msgstr "Aanmelden bij GitHub mislukt."
#: cps/oauth_bb.py:160
msgid "Failed to fetch user info from GitHub."
msgstr ""
msgstr "Opvragen gebruikersinfo bij GitHub mislukt"
#: cps/oauth_bb.py:171
msgid "Failed to log in with Google."
msgstr ""
msgstr "Aanmelden bij Google mislukt."
#: cps/oauth_bb.py:176
msgid "Failed to fetch user info from Google."
msgstr ""
msgstr "Opvragen gebruikersinfo bij Google mislukt."
#: cps/oauth_bb.py:274
#, python-format
@ -454,7 +454,7 @@ msgstr "Sorry, je mag geen boeken toevoegen aan de boekenplank '%(shelfname)s'"
#: cps/shelf.py:61
msgid "You are not allowed to edit public shelves"
msgstr "Je mag openbare boekenplanken niet aanpassen"
msgstr "Je mag openbare boekenplanken niet bewerken"
#: cps/shelf.py:70
#, python-format
@ -508,7 +508,7 @@ msgstr "Er bestaat al een boekenplank met de naam '%(title)s'."
#: cps/shelf.py:211
#, python-format
msgid "Shelf %(title)s created"
msgstr "Boekenplank '%(title)s' is gecreëerd"
msgstr "Boekenplank '%(title)s' is aangemaakt"
#: cps/shelf.py:213 cps/shelf.py:241
msgid "There was an error"
@ -539,7 +539,7 @@ msgstr "Kan boekenplank niet openen: de boekenplank bestaat niet of is ontoegank
#: cps/shelf.py:330
#, python-format
msgid "Change order of Shelf: '%(name)s'"
msgstr "Volgorde aanpassen van boekenplank '%(name)s'"
msgstr "Volgorde bewerken van boekenplank '%(name)s'"
#: cps/ub.py:57
msgid "Recently Added"
@ -547,7 +547,7 @@ msgstr "Recent toegevoegd"
#: cps/ub.py:59
msgid "Show recent books"
msgstr "Recente boeken tonen"
msgstr "Recent toegevoegde boeken tonen"
#: cps/templates/index.xml:17 cps/ub.py:60
msgid "Hot Books"
@ -572,7 +572,7 @@ msgstr "Gelezen boeken"
#: cps/ub.py:69
msgid "Show read and unread"
msgstr "Gelezen/Ongelezen tonen"
msgstr "Gelezen/Ongelezen boeken tonen"
#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71
#: cps/web.py:975
@ -581,11 +581,11 @@ msgstr "Ongelezen boeken"
#: cps/ub.py:73
msgid "Show unread"
msgstr ""
msgstr "Ongelezen boeken tonen"
#: cps/ub.py:74
msgid "Discover"
msgstr "Verkennen"
msgstr "Willekeurige boeken"
#: cps/ub.py:76
msgid "Show random books"
@ -602,11 +602,11 @@ msgstr "Categoriekeuze tonen"
#: cps/templates/book_edit.html:71 cps/templates/search_form.html:53
#: cps/ub.py:80
msgid "Series"
msgstr "Serie"
msgstr "Boekenreeksen"
#: cps/ub.py:82
msgid "Show series selection"
msgstr "Seriekeuze tonen"
msgstr "Boekenreeksen keuze tonen"
#: cps/templates/index.xml:61 cps/ub.py:83
msgid "Authors"
@ -634,19 +634,19 @@ msgstr "Taalkeuze tonen"
#: cps/ub.py:94
msgid "Ratings"
msgstr ""
msgstr "Beoordelingen"
#: cps/ub.py:96
msgid "Show ratings selection"
msgstr ""
msgstr "Beoordelingen tonen"
#: cps/ub.py:97
msgid "File formats"
msgstr ""
msgstr "Bestandsformaten"
#: cps/ub.py:99
msgid "Show file formats selection"
msgstr ""
msgstr "Bestandsformaten tonen"
#: cps/updater.py:251 cps/updater.py:358 cps/updater.py:371
msgid "Unexpected data while reading update information"
@ -654,7 +654,7 @@ msgstr "Onverwachte gegevens tijdens het uitlezen van de update-informatie"
#: cps/updater.py:258 cps/updater.py:364
msgid "No update available. You already have the latest version installed"
msgstr "Geen update beschikbaar; je beschikt al over de nieuwste versie"
msgstr "Geen update beschikbaar. Je beschikt al over de nieuwste versie"
#: cps/updater.py:284
msgid "A new update is available. Click on the button below to update to the latest version."
@ -671,11 +671,11 @@ msgstr "Geen wijzigingslog beschikbaar"
#: cps/updater.py:404 cps/updater.py:413
#, python-format
msgid "A new update is available. Click on the button below to update to version: %(version)s"
msgstr "Er is een update beschikbaar. Klik op de knop hieronder om te updaten naar de nieuwste versie: %(version)s"
msgstr "Er is een update beschikbaar. Klik op de knop hieronder om te updaten naar versie: %(version)s"
#: cps/updater.py:423
msgid "Click on the button below to update to the latest stable version."
msgstr ""
msgstr "Druk op onderstaande knop om de laatste stabiele versie te installeren."
#: cps/uploader.py:213 cps/uploader.py:214 cps/uploader.py:218
#: cps/uploader.py:222 cps/uploader.py:226
@ -696,11 +696,11 @@ msgstr "Willekeurige boeken"
#: cps/web.py:522
msgid "Books"
msgstr ""
msgstr "Boeken"
#: cps/web.py:549
msgid "Hot Books (most downloaded)"
msgstr "Populaire boeken (vaakst gedownload)"
msgstr "Populaire boeken (meest gedownload)"
#: cps/web.py:560 cps/web.py:1300 cps/web.py:1388
msgid "Error opening eBook. File does not exist or file is not accessible:"
@ -709,7 +709,7 @@ msgstr "Kan e-boek niet openen. Het bestand bestaat niet of is niet toegankelijk
#: cps/web.py:573
#, python-format
msgid "Author: %(name)s"
msgstr ""
msgstr "Auteur: %(name)s"
#: cps/web.py:585
#, python-format
@ -719,17 +719,17 @@ msgstr "Uitgever: %(name)s"
#: cps/web.py:596
#, python-format
msgid "Series: %(serie)s"
msgstr "Serie: %(serie)s"
msgstr "Reeks: %(serie)s"
#: cps/web.py:607
#, python-format
msgid "Rating: %(rating)s stars"
msgstr ""
msgstr "Beoordeling: %(rating)s sterren"
#: cps/web.py:618
#, python-format
msgid "File format: %(format)s"
msgstr ""
msgstr "Bestandsformaat: %(format)s"
#: cps/web.py:630
#, python-format
@ -747,15 +747,15 @@ msgstr "Uitgeverslijst"
#: cps/templates/index.xml:82 cps/web.py:695
msgid "Series list"
msgstr "Serielijst"
msgstr "Boekenreeksen"
#: cps/web.py:709
msgid "Ratings list"
msgstr ""
msgstr "Beoordelingen"
#: cps/web.py:722
msgid "File formats list"
msgstr ""
msgstr "Alle bestandsformaten"
#: cps/web.py:750
msgid "Available languages"
@ -803,7 +803,7 @@ msgstr "Het boek is in de wachtrij geplaatst om te worden verstuurd aan %(kindle
#: cps/web.py:1031
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr "Er is een fout opgetreden bij het versturen van dit boek: %(res)s"
msgstr "Fout opgetreden bij het versturen van dit boek: %(res)s"
#: cps/web.py:1051 cps/web.py:1076 cps/web.py:1080 cps/web.py:1085
#: cps/web.py:1089
@ -829,11 +829,11 @@ msgstr ""
#: cps/web.py:1108 cps/web.py:1214
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr "je bent nu ingelogd als: '%(nickname)s'"
msgstr "je bent ingelogd als: '%(nickname)s'"
#: cps/web.py:1112
msgid "Could not login. LDAP server down, please contact your administrator"
msgstr ""
msgstr "Kan niet inloggen, LDAP server niet bereikbaar, contacteer de beheerder"
#: cps/web.py:1116 cps/web.py:1124
msgid "Wrong Username or Password"
@ -842,7 +842,7 @@ msgstr "Verkeerde gebruikersnaam of wachtwoord"
#: cps/web.py:1120
#, python-format
msgid "You are now logged in as: '%(nickname)s'"
msgstr ""
msgstr "Je bent ingelogd als: '%(nickname)s'"
#: cps/web.py:1128 cps/web.py:1150
msgid "login"
@ -886,7 +886,7 @@ msgstr "E-boek-conversie mislukt: %(error)s"
#: cps/worker.py:339
#, python-format
msgid "Kindlegen failed with Error %(error)s. Message: %(message)s"
msgstr "Kindlegen mislukt; fout: %(error)s. Bericht: %(message)s"
msgstr "KindleGen mislukt; fout: %(error)s. Bericht: %(message)s"
#: cps/templates/admin.html:6
msgid "User list"
@ -898,19 +898,19 @@ msgstr "Gebruikersnaam"
#: cps/templates/admin.html:10
msgid "E-mail"
msgstr "E-mailadres"
msgstr "e-mailadres"
#: cps/templates/admin.html:11
msgid "Kindle"
msgstr "Kindlle"
msgstr "Kindle-e-mailadres"
#: cps/templates/admin.html:12
msgid "DLS"
msgstr "DLS"
msgstr "Downloads"
#: cps/templates/admin.html:13 cps/templates/layout.html:76
msgid "Admin"
msgstr "Administratie"
msgstr "Beheer"
#: cps/templates/admin.html:14 cps/templates/detail.html:18
#: cps/templates/detail.html:27 cps/templates/shelf.html:6
@ -920,7 +920,7 @@ msgstr "Downloaden"
#: cps/templates/admin.html:15
msgid "View Ebooks"
msgstr ""
msgstr "Boeken lezen"
#: cps/templates/admin.html:16 cps/templates/layout.html:65
msgid "Upload"
@ -980,7 +980,7 @@ msgstr "Aantal boeken per pagina"
#: cps/templates/admin.html:85
msgid "Uploading"
msgstr "Bezig met uploaden"
msgstr "Uploaden toestaan"
#: cps/templates/admin.html:89
msgid "Anonymous browsing"
@ -996,11 +996,11 @@ msgstr "Inloggen op afstand"
#: cps/templates/admin.html:108
msgid "Administration"
msgstr "Administratie"
msgstr "Systeembeheer"
#: cps/templates/admin.html:109
msgid "View Logfiles"
msgstr ""
msgstr "Logboeken bekijken"
#: cps/templates/admin.html:110
msgid "Reconnect to Calibre DB"
@ -1055,7 +1055,7 @@ msgstr "Oké"
#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:12
#: cps/templates/user_edit.html:132
msgid "Back"
msgstr "Terug"
msgstr "Annuleren"
#: cps/templates/admin.html:166
msgid "Do you really want to stop Calibre-Web?"
@ -1203,7 +1203,7 @@ msgstr "Weet je het zeker?"
#: cps/templates/book_edit.html:190
msgid "Book will be deleted from Calibre database"
msgstr "Het boek wordt verwijderd uit de Calibre-databank"
msgstr "Het boek wordt verwijderd uit de Calibre-database"
#: cps/templates/book_edit.html:191
msgid "and from hard disk"
@ -1252,7 +1252,7 @@ msgstr "Bibliotheekinstellingen"
#: cps/templates/config_edit.html:19
msgid "Location of Calibre database"
msgstr "Locatie van de Calibre-databank"
msgstr "Locatie van de Calibre-database"
#: cps/templates/config_edit.html:25
msgid "Use Google Drive?"
@ -1324,7 +1324,7 @@ msgstr "Bèta (automatisch)"
#: cps/templates/config_edit.html:115
msgid "Logfile Configuration"
msgstr "Logbestand-instellingen"
msgstr "Logbestanden"
#: cps/templates/config_edit.html:122
msgid "Log Level"
@ -1344,7 +1344,7 @@ msgstr ""
#: cps/templates/config_edit.html:150
msgid "Feature Configuration"
msgstr "Mogelijkheden"
msgstr "Geavanceerde opties"
#: cps/templates/config_edit.html:158
msgid "Enable uploading"
@ -1364,7 +1364,7 @@ msgstr "Inloggen op afstand inschakelen ('magic link')"
#: cps/templates/config_edit.html:175
msgid "Use"
msgstr "Gebruiken"
msgstr "Gebruik"
#: cps/templates/config_edit.html:176
msgid "Obtain an API Key"
@ -1384,27 +1384,27 @@ msgstr ""
#: cps/templates/config_edit.html:193
msgid "Use standard Authentication"
msgstr ""
msgstr "Gebruik standaard authenticatie"
#: cps/templates/config_edit.html:195
msgid "Use LDAP Authentication"
msgstr ""
msgstr "Gebruik LDAP authenticatie"
#: cps/templates/config_edit.html:198
msgid "Use OAuth"
msgstr ""
msgstr "Gebruik OAuth"
#: cps/templates/config_edit.html:205
msgid "LDAP Server Host Name or IP Address"
msgstr ""
msgstr "LDAP Server hostnaam of IP-adres"
#: cps/templates/config_edit.html:209
msgid "LDAP Server Port"
msgstr ""
msgstr "LDAP Server Poort"
#: cps/templates/config_edit.html:213
msgid "LDAP schema (ldap or ldaps)"
msgstr ""
msgstr "LDAP schema (ldap of ldaps)"
#: cps/templates/config_edit.html:217
msgid "LDAP Admin username"
@ -1459,7 +1459,7 @@ msgstr ""
#: cps/templates/config_edit.html:282
msgid "External binaries"
msgstr "Externe bibliotheken"
msgstr "Externe programma's"
#: cps/templates/config_edit.html:290
msgid "No converter"
@ -1467,7 +1467,7 @@ msgstr "Geen conversieprogramma"
#: cps/templates/config_edit.html:292
msgid "Use Kindlegen"
msgstr "Kindlegen gebruiken"
msgstr "KindleGen"
#: cps/templates/config_edit.html:294
msgid "Use calibre's ebook converter"
@ -1479,7 +1479,7 @@ msgstr "Conversie-instellingen"
#: cps/templates/config_edit.html:302
msgid "Path to convertertool"
msgstr "Pad naar conversieprogramma"
msgstr "Locatie van conversieprogramma"
#: cps/templates/config_edit.html:308
msgid "Location of Unrar binary"
@ -1540,7 +1540,7 @@ msgstr "Standaardinstellingen voor nieuwe gebruikers"
#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:83
msgid "Admin user"
msgstr "Admin-gebruiker"
msgstr "Systeembeheerder"
#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:92
msgid "Allow Downloads"
@ -1548,7 +1548,7 @@ msgstr "Downloads toestaan"
#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:96
msgid "Allow book viewer"
msgstr ""
msgstr "Boeken lezen toestaan"
#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:100
msgid "Allow Uploads"
@ -1588,7 +1588,7 @@ msgstr "Lezen in webbrowser"
#: cps/templates/detail.html:72
msgid "Listen in browser"
msgstr ""
msgstr "Luisteren in webbrowser"
#: cps/templates/detail.html:117
msgid "Book"
@ -1612,11 +1612,11 @@ msgstr "Markeren als gelezen"
#: cps/templates/detail.html:201
msgid "Read"
msgstr "Lezen"
msgstr "Gelezen"
#: cps/templates/detail.html:211 cps/templates/listenmp3.html:54
msgid "Description:"
msgstr "Omschrijving:"
msgstr "Beschrijving:"
#: cps/templates/detail.html:224 cps/templates/search.html:14
msgid "Add to shelf"
@ -1632,7 +1632,7 @@ msgstr "SMTP-poort (meestal 25 voor normale SMTP, 465 voor SSL en 587 voor START
#: cps/templates/email_edit.html:19
msgid "Encryption"
msgstr "Versleuteling"
msgstr "Beveiliging"
#: cps/templates/email_edit.html:21
msgid "None"
@ -1693,7 +1693,7 @@ msgstr "Zoeken"
#: cps/templates/http_error.html:37
msgid "Create issue"
msgstr ""
msgstr "Probleem melden"
#: cps/templates/http_error.html:44
msgid "Back to home"
@ -1705,7 +1705,7 @@ msgstr "Verkennen (willekeurige boeken)"
#: cps/templates/index.html:64
msgid "Group by series"
msgstr ""
msgstr "Sorteren op reeks"
#: cps/templates/index.xml:6
msgid "Start"
@ -1745,7 +1745,7 @@ msgstr "Boeken gesorteerd op categorie"
#: cps/templates/index.xml:86
msgid "Books ordered by series"
msgstr "Boeken gesorteerd op serie"
msgstr "Boeken gesorteerd op reeks"
#: cps/templates/index.xml:89 cps/templates/layout.html:132
msgid "Public Shelves"
@ -1761,7 +1761,7 @@ msgstr "Jouw boekenplanken"
#: cps/templates/index.xml:101
msgid "User's own shelfs, only visible to the current user himself"
msgstr "Eigen boekenplanken, enkel zichtbaar voor de huidige gebruiker"
msgstr "Eigen boekenplanken, enkel zichtbaar voor huidige gebruiker"
#: cps/templates/layout.html:28
msgid "Home"
@ -1806,11 +1806,11 @@ msgstr "Verkennen"
#: cps/templates/layout.html:141
msgid "Create a Shelf"
msgstr "Creëer een boekenplank"
msgstr "Boekenplank aanmaken"
#: cps/templates/layout.html:142 cps/templates/stats.html:3
msgid "About"
msgstr "Over"
msgstr "Informatie"
#: cps/templates/layout.html:156
msgid "Previous"
@ -1822,7 +1822,7 @@ msgstr "Boekgegevens"
#: cps/templates/layout.html:217
msgid "Upload done, processing, please wait..."
msgstr "Uploaden voltooid; bezig met verwerken..."
msgstr "Uploaden voltooid, bezig met verwerken..."
#: cps/templates/layout.html:220
msgid "Error"
@ -1830,11 +1830,11 @@ msgstr "Fout"
#: cps/templates/listenmp3.html:66
msgid "Play / pause"
msgstr ""
msgstr "Afspelen / pauze"
#: cps/templates/listenmp3.html:98
msgid "volume"
msgstr ""
msgstr "volume"
#: cps/templates/login.html:8 cps/templates/login.html:9
#: cps/templates/register.html:7 cps/templates/user_edit.html:8
@ -1848,7 +1848,7 @@ msgstr "Wachtwoord"
#: cps/templates/login.html:17
msgid "Remember me"
msgstr "Onthouden"
msgstr "Mij onthouden"
#: cps/templates/login.html:22
msgid "Log in with magic link"
@ -1856,11 +1856,11 @@ msgstr "Inloggen met magische koppeling"
#: cps/templates/logviewer.html:5
msgid "Show Calibre-Web log"
msgstr ""
msgstr "Calibre-Web log inzien"
#: cps/templates/logviewer.html:8
msgid "Show access log"
msgstr ""
msgstr "Toegangslogboek"
#: cps/templates/osd.xml:5
msgid "Calibre-Web ebook catalog"
@ -1984,7 +1984,7 @@ msgstr "Kies een gebruikersnaam"
#: cps/templates/register.html:11 cps/templates/user_edit.html:13
msgid "E-mail address"
msgstr "E-mailadres"
msgstr "e-mailadres"
#: cps/templates/register.html:12
msgid "Your email address"
@ -2028,7 +2028,7 @@ msgstr "Labels uitsluiten"
#: cps/templates/search_form.html:63
msgid "Exclude Series"
msgstr "Series uitsluiten"
msgstr "Boekenreeksen uitsluiten"
#: cps/templates/search_form.html:84
msgid "Exclude Languages"
@ -2048,7 +2048,7 @@ msgstr "Deze boekenplank verwijderen"
#: cps/templates/shelf.html:11
msgid "Edit Shelf"
msgstr "Boekenplank aanpassen"
msgstr "Boekenplank bewerken"
#: cps/templates/shelf.html:12 cps/templates/shelf_order.html:11
msgid "Change order"
@ -2072,7 +2072,7 @@ msgstr "Verander de volgorde middels slepen-en-neerzetten"
#: cps/templates/stats.html:7
msgid "Calibre library statistics"
msgstr "Calibre-bibliotheekstatistieken"
msgstr "Calibre bibliotheekstatistieken"
#: cps/templates/stats.html:12
msgid "Books in this Library"
@ -2088,7 +2088,7 @@ msgstr "Categorieën in deze bibliotheek"
#: cps/templates/stats.html:24
msgid "Series in this Library"
msgstr "Series in deze bibliotheek"
msgstr "Boekenreeksen in deze bibliotheek"
#: cps/templates/stats.html:28
msgid "Linked libraries"
@ -2100,7 +2100,7 @@ msgstr "Programmabibliotheek"
#: cps/templates/stats.html:33
msgid "Installed Version"
msgstr "Geïnstalleerde versie"
msgstr "Versie"
#: cps/templates/tasks.html:7
msgid "Tasks list"
@ -2148,23 +2148,23 @@ msgstr "Kindle-e-mailadres"
#: cps/templates/user_edit.html:40
msgid "Show books with language"
msgstr "Boeken tonen met taal"
msgstr "Taal van boeken"
#: cps/templates/user_edit.html:42
msgid "Show all"
msgstr "Alle tonen"
msgstr "Alle talen"
#: cps/templates/user_edit.html:52
msgid "OAuth Settings"
msgstr ""
msgstr "OAuth Instellingen"
#: cps/templates/user_edit.html:54
msgid "Link"
msgstr ""
msgstr "Koppelen"
#: cps/templates/user_edit.html:56
msgid "Unlink"
msgstr ""
msgstr "Ontkoppelen"
#: cps/templates/user_edit.html:124
msgid "Delete this user"

View File

@ -224,11 +224,16 @@ def get_versions():
PILVersion = 'v' + PILversion
else:
PILVersion = _(u'not installed')
if comic.use_comic_meta:
ComicVersion = _(u'installed')
else:
ComicVersion = _(u'not installed')
return {'Image Magick': IVersion,
'PyPdf': PVersion,
'lxml':XVersion,
'Wand': WVersion,
'Pillow': PILVersion}
'Pillow': PILVersion,
'Comic_API': ComicVersion}
def upload(uploadfile):

View File

@ -133,7 +133,7 @@ def load_user_from_header(header_val):
except TypeError:
pass
user = ub.session.query(ub.User).filter(func.lower(ub.User.nickname) == basic_username.lower()).first()
if user and check_password_hash(user.password, basic_password):
if user and check_password_hash(str(user.password), basic_password):
return user
return
@ -1115,7 +1115,7 @@ def login():
log.info('LDAP Login failed for user "%s" IP-adress: %s', form['username'], ipAdress)
flash(_(u"Wrong Username or Password"), category="error")
else:
if user and check_password_hash(user.password, form['password']) and user.nickname != "Guest":
if user and check_password_hash(str(user.password), form['password']) and user.nickname != "Guest":
login_user(user, remember=True)
flash(_(u"You are now logged in as: '%(nickname)s'", nickname=user.nickname), category="success")
return redirect_back(url_for("web.index"))

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-07-26 16:41+0200\n"
"POT-Creation-Date: 2019-08-06 18:35+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,16 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.7.0\n"
#: cps/about.py:70
#: cps/about.py:40
msgid "installed"
msgstr ""
#: cps/about.py:42 cps/uploader.py:213 cps/uploader.py:214 cps/uploader.py:218
#: cps/uploader.py:222 cps/uploader.py:226
msgid "not installed"
msgstr ""
#: cps/about.py:76
msgid "Statistics"
msgstr ""
@ -275,125 +284,133 @@ msgstr ""
msgid "Callback domain is not verified, please follow steps to verify domain in google developer console"
msgstr ""
#: cps/helper.py:79
#: cps/helper.py:53
msgid "Installed"
msgstr ""
#: cps/helper.py:56
msgid "Not installed"
msgstr ""
#: cps/helper.py:81
#, python-format
msgid "%(format)s format not found for book id: %(book)d"
msgstr ""
#: cps/helper.py:91
#: cps/helper.py:93
#, python-format
msgid "%(format)s not found on Google Drive: %(fn)s"
msgstr ""
#: cps/helper.py:98 cps/helper.py:206 cps/templates/detail.html:41
#: cps/helper.py:100 cps/helper.py:208 cps/templates/detail.html:41
#: cps/templates/detail.html:45
msgid "Send to Kindle"
msgstr ""
#: cps/helper.py:99 cps/helper.py:117 cps/helper.py:208
#: cps/helper.py:101 cps/helper.py:119 cps/helper.py:210
msgid "This e-mail has been sent via Calibre-Web."
msgstr ""
#: cps/helper.py:110
#: cps/helper.py:112
#, python-format
msgid "%(format)s not found: %(fn)s"
msgstr ""
#: cps/helper.py:115
#: cps/helper.py:117
msgid "Calibre-Web test e-mail"
msgstr ""
#: cps/helper.py:117
#: cps/helper.py:119
msgid "Test e-mail"
msgstr ""
#: cps/helper.py:132
#: cps/helper.py:134
msgid "Get Started with Calibre-Web"
msgstr ""
#: cps/helper.py:134
#: cps/helper.py:136
#, python-format
msgid "Registration e-mail for user: %(name)s"
msgstr ""
#: cps/helper.py:148 cps/helper.py:150 cps/helper.py:152 cps/helper.py:160
#: cps/helper.py:162 cps/helper.py:164
#: cps/helper.py:150 cps/helper.py:152 cps/helper.py:154 cps/helper.py:162
#: cps/helper.py:164 cps/helper.py:166
#, python-format
msgid "Send %(format)s to Kindle"
msgstr ""
#: cps/helper.py:168
#: cps/helper.py:170
#, python-format
msgid "Convert %(orig)s to %(format)s and send to Kindle"
msgstr ""
#: cps/helper.py:208
#: cps/helper.py:210
#, python-format
msgid "E-mail: %(book)s"
msgstr ""
#: cps/helper.py:210
#: cps/helper.py:212
msgid "The requested file could not be read. Maybe wrong permissions?"
msgstr ""
#: cps/helper.py:317
#: cps/helper.py:319
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr ""
#: cps/helper.py:327
#: cps/helper.py:329
#, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr ""
#: cps/helper.py:341
#: cps/helper.py:343
#, python-format
msgid "Rename file in path '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr ""
#: cps/helper.py:367 cps/helper.py:377 cps/helper.py:385
#: cps/helper.py:369 cps/helper.py:379 cps/helper.py:387
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr ""
#: cps/helper.py:406
#: cps/helper.py:408
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr ""
#: cps/helper.py:623
#: cps/helper.py:625
msgid "Waiting"
msgstr ""
#: cps/helper.py:625
#: cps/helper.py:627
msgid "Failed"
msgstr ""
#: cps/helper.py:627
#: cps/helper.py:629
msgid "Started"
msgstr ""
#: cps/helper.py:629
#: cps/helper.py:631
msgid "Finished"
msgstr ""
#: cps/helper.py:631
#: cps/helper.py:633
msgid "Unknown Status"
msgstr ""
#: cps/helper.py:636
#: cps/helper.py:638
msgid "E-mail: "
msgstr ""
#: cps/helper.py:638 cps/helper.py:642
#: cps/helper.py:640 cps/helper.py:644
msgid "Convert: "
msgstr ""
#: cps/helper.py:640
#: cps/helper.py:642
msgid "Upload: "
msgstr ""
#: cps/helper.py:644
#: cps/helper.py:646
msgid "Unknown Task: "
msgstr ""
@ -675,11 +692,6 @@ msgstr ""
msgid "Click on the button below to update to the latest stable version."
msgstr ""
#: cps/uploader.py:213 cps/uploader.py:214 cps/uploader.py:218
#: cps/uploader.py:222 cps/uploader.py:226
msgid "not installed"
msgstr ""
#: cps/web.py:460
msgid "Recently Added Books"
msgstr ""