diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index f59e5943ed66c6b7173d9d1c99a4be1eec40f1e0..34d2c453bd6397cca9a0855a826775f3110d207a 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -27,12 +27,12 @@ A clear and concise description of what you expected to happen.
 If applicable, add screenshots to help explain your problem.
 
 **Environment (please complete the following information):**
- - OS: [e.g. Windows 10/raspian]
- - Python version [e.g. python2.7]
- - Calibre-Web version [e.g. 0.6.5 or master@16.02.20, 19:55 ]:
- - Docker container [ None/Technosoft2000/Linuxuser]:
- - Special Hardware [e.g. Rasperry Pi Zero]
- - Browser [e.g. chrome, safari]
+ - OS: [e.g. Windows 10/Raspberry Pi OS]
+ - Python version: [e.g. python2.7]
+ - Calibre-Web version: [e.g. 0.6.8 or 087c4c59 (git rev-parse --short HEAD)]:
+ - Docker container: [None/Technosoft2000/Linuxuser]:
+ - Special Hardware: [e.g. Rasperry Pi Zero]
+ - Browser: [e.g. Chrome 83.0.4103.97, Safari 13.3.7, Firefox 68.0.1 ESR]
 
 **Additional context**
-Add any other context about the problem here. [e.g. access via reverse proxy]
+Add any other context about the problem here. [e.g. access via reverse proxy, database background sync, special database location]
diff --git a/cps/admin.py b/cps/admin.py
index 84a94cba2d9803766b394694f849760121280b3c..4fe027a21ac2abb02a11d313644e4a0f03d343a0 100644
--- a/cps/admin.py
+++ b/cps/admin.py
@@ -34,7 +34,7 @@ from flask import Blueprint, flash, redirect, url_for, abort, request, make_resp
 from flask_login import login_required, current_user, logout_user
 from flask_babel import gettext as _
 from sqlalchemy import and_
-from sqlalchemy.exc import IntegrityError
+from sqlalchemy.exc import IntegrityError, OperationalError, InvalidRequestError
 from sqlalchemy.sql.expression import func
 
 from . import constants, logger, helper, services
@@ -613,80 +613,86 @@ def _configuration_update_helper():
     reboot_required = False
     db_change = False
     to_save = request.form.to_dict()
+    gdriveError = None
 
     to_save['config_calibre_dir'] = re.sub('[\\/]metadata\.db$', '', to_save['config_calibre_dir'], flags=re.IGNORECASE)
-    db_change |= _config_string(to_save, "config_calibre_dir")
+    try:
+        db_change |= _config_string(to_save, "config_calibre_dir")
+
+        # Google drive setup
+        gdriveError = _configuration_gdrive_helper(to_save)
+
+        reboot_required |= _config_int(to_save, "config_port")
+
+        reboot_required |= _config_string(to_save, "config_keyfile")
+        if config.config_keyfile and not os.path.isfile(config.config_keyfile):
+            return _configuration_result(_('Keyfile Location is not Valid, Please Enter Correct Path'), gdriveError)
+
+        reboot_required |= _config_string(to_save, "config_certfile")
+        if config.config_certfile and not os.path.isfile(config.config_certfile):
+            return _configuration_result(_('Certfile Location is not Valid, Please Enter Correct Path'), gdriveError)
+
+        _config_checkbox_int(to_save, "config_uploading")
+        _config_checkbox_int(to_save, "config_anonbrowse")
+        _config_checkbox_int(to_save, "config_public_reg")
+        _config_checkbox_int(to_save, "config_register_email")
+        reboot_required |= _config_checkbox_int(to_save, "config_kobo_sync")
+        _config_checkbox_int(to_save, "config_kobo_proxy")
+
+        _config_string(to_save, "config_upload_formats")
+        constants.EXTENSIONS_UPLOAD = [x.lstrip().rstrip() for x in config.config_upload_formats.split(',')]
+
+        _config_string(to_save, "config_calibre")
+        _config_string(to_save, "config_converterpath")
+        _config_string(to_save, "config_kepubifypath")
 
-    # Google drive setup
-    gdriveError = _configuration_gdrive_helper(to_save)
+        reboot_required |= _config_int(to_save, "config_login_type")
 
-    reboot_required |= _config_int(to_save, "config_port")
+        #LDAP configurator,
+        if config.config_login_type == constants.LOGIN_LDAP:
+            reboot, message = _configuration_ldap_helper(to_save, gdriveError)
+            if message:
+                return message
+            reboot_required |= reboot
 
-    reboot_required |= _config_string(to_save, "config_keyfile")
-    if config.config_keyfile and not os.path.isfile(config.config_keyfile):
-        return _configuration_result(_('Keyfile Location is not Valid, Please Enter Correct Path'), gdriveError)
+        # Remote login configuration
 
-    reboot_required |= _config_string(to_save, "config_certfile")
-    if config.config_certfile and not os.path.isfile(config.config_certfile):
-        return _configuration_result(_('Certfile Location is not Valid, Please Enter Correct Path'), gdriveError)
+        _config_checkbox(to_save, "config_remote_login")
+        if not config.config_remote_login:
+            ub.session.query(ub.RemoteAuthToken).filter(ub.RemoteAuthToken.token_type==0).delete()
 
-    _config_checkbox_int(to_save, "config_uploading")
-    _config_checkbox_int(to_save, "config_anonbrowse")
-    _config_checkbox_int(to_save, "config_public_reg")
-    _config_checkbox_int(to_save, "config_register_email")
-    reboot_required |= _config_checkbox_int(to_save, "config_kobo_sync")
-    _config_checkbox_int(to_save, "config_kobo_proxy")
+        # Goodreads configuration
+        _config_checkbox(to_save, "config_use_goodreads")
+        _config_string(to_save, "config_goodreads_api_key")
+        _config_string(to_save, "config_goodreads_api_secret")
+        if services.goodreads_support:
+            services.goodreads_support.connect(config.config_goodreads_api_key,
+                                               config.config_goodreads_api_secret,
+                                               config.config_use_goodreads)
 
-    _config_string(to_save, "config_upload_formats")
-    constants.EXTENSIONS_UPLOAD = [x.lstrip().rstrip() for x in config.config_upload_formats.split(',')]
+        _config_int(to_save, "config_updatechannel")
 
-    _config_string(to_save, "config_calibre")
-    _config_string(to_save, "config_converterpath")
-    _config_string(to_save, "config_kepubifypath")
+        # Reverse proxy login configuration
+        _config_checkbox(to_save, "config_allow_reverse_proxy_header_login")
+        _config_string(to_save, "config_reverse_proxy_login_header_name")
 
-    reboot_required |= _config_int(to_save, "config_login_type")
+        # OAuth configuration
+        if config.config_login_type == constants.LOGIN_OAUTH:
+            reboot_required |= _configuration_oauth_helper(to_save)
 
-    #LDAP configurator,
-    if config.config_login_type == constants.LOGIN_LDAP:
-        reboot, message = _configuration_ldap_helper(to_save, gdriveError)
+        reboot, message = _configuration_logfile_helper(to_save, gdriveError)
         if message:
             return message
         reboot_required |= reboot
-
-    # Remote login configuration
-    _config_checkbox(to_save, "config_remote_login")
-    if not config.config_remote_login:
-        ub.session.query(ub.RemoteAuthToken).filter(ub.RemoteAuthToken.token_type==0).delete()
-
-    # Goodreads configuration
-    _config_checkbox(to_save, "config_use_goodreads")
-    _config_string(to_save, "config_goodreads_api_key")
-    _config_string(to_save, "config_goodreads_api_secret")
-    if services.goodreads_support:
-        services.goodreads_support.connect(config.config_goodreads_api_key,
-                                           config.config_goodreads_api_secret,
-                                           config.config_use_goodreads)
-
-    _config_int(to_save, "config_updatechannel")
-
-    # Reverse proxy login configuration
-    _config_checkbox(to_save, "config_allow_reverse_proxy_header_login")
-    _config_string(to_save, "config_reverse_proxy_login_header_name")
-
-    # OAuth configuration
-    if config.config_login_type == constants.LOGIN_OAUTH:
-        reboot_required |= _configuration_oauth_helper(to_save)
-
-    reboot, message = _configuration_logfile_helper(to_save, gdriveError)
-    if message:
-        return message
-    reboot_required |= reboot
-    # Rarfile Content configuration
-    _config_string(to_save, "config_rarfile_location")
-    if "config_rarfile_location" in to_save:
-        unrar_status = helper.check_unrar(config.config_rarfile_location)
-        if unrar_status:
-            return _configuration_result(unrar_status, gdriveError)
+        # Rarfile Content configuration
+        _config_string(to_save, "config_rarfile_location")
+        if "config_rarfile_location" in to_save:
+            unrar_status = helper.check_unrar(config.config_rarfile_location)
+            if unrar_status:
+                return _configuration_result(unrar_status, gdriveError)
+    except (OperationalError, InvalidRequestError):
+        ub.session.rollback()
+        _configuration_result(_(u"Settings DB is not Writeable"), gdriveError)
 
     try:
         metadata_db = os.path.join(config.config_calibre_dir, "metadata.db")
@@ -719,7 +725,7 @@ def _configuration_result(error_flash=None, gdriveError=None):
         gdriveError = _(gdriveError)
     else:
         # if config.config_use_google_drive and\
-        if not gdrive_authenticate:
+        if not gdrive_authenticate and gdrive_support:
             gdrivefolders = gdriveutils.listRootFolders()
 
     show_back_button = current_user.is_authenticated
@@ -783,6 +789,9 @@ def _handle_new_user(to_save, content,languages, translations, kobo_support):
     except IntegrityError:
         ub.session.rollback()
         flash(_(u"Found an existing account for this e-mail address or nickname."), category="error")
+    except OperationalError:
+        ub.session.rollback()
+        flash(_(u"Settings DB is not Writeable"), category="error")
 
 
 def _handle_edit_user(to_save, content,languages, translations, kobo_support, downloads):
@@ -872,6 +881,9 @@ def _handle_edit_user(to_save, content,languages, translations, kobo_support, do
     except IntegrityError:
         ub.session.rollback()
         flash(_(u"An unknown error occured."), category="error")
+    except OperationalError:
+        ub.session.rollback()
+        flash(_(u"Settings DB is not Writeable"), category="error")
 
 
 @admi.route("/admin/user/new", methods=["GET", "POST"])
@@ -916,7 +928,12 @@ def update_mailsettings():
     _config_string(to_save, "mail_password")
     _config_string(to_save, "mail_from")
     _config_int(to_save, "mail_size", lambda y: int(y)*1024*1024)
-    config.save()
+    try:
+        config.save()
+    except (OperationalError, InvalidRequestError):
+        ub.session.rollback()
+        flash(_(u"Settings DB is not Writeable"), category="error")
+        return edit_mailsettings()
 
     if to_save.get("test"):
         if current_user.email:
diff --git a/cps/editbooks.py b/cps/editbooks.py
index 30cc918be10801296e0a48c20b6ae6b3cef16b46..91c795eabbf1d83a2155139350de7fdd8f7a5852 100644
--- a/cps/editbooks.py
+++ b/cps/editbooks.py
@@ -354,7 +354,8 @@ def edit_book_ratings(to_save, book):
 def edit_book_tags(tags, book):
     input_tags = tags.split(',')
     input_tags = list(map(lambda it: it.strip(), input_tags))
-    # if input_tags[0] !="": ??
+    # Remove duplicates
+    input_tags = helper.uniq(input_tags)
     return modify_database_object(input_tags, book.tags, db.Tags, calibre_db.session, 'tags')
 
 
@@ -368,8 +369,6 @@ def edit_book_series_index(series_index, book):
     # Add default series_index to book
     modif_date = False
     series_index = series_index or '1'
-    #if series_index == '':
-    #    series_index = '1'
     if book.series_index != series_index:
         book.series_index = series_index
         modif_date = True
@@ -403,6 +402,8 @@ def edit_book_languages(languages, book, upload=False):
         if input_l[0] != current_user.filter_language() and current_user.filter_language() != "all":
             input_l[0] = calibre_db.session.query(db.Languages). \
                 filter(db.Languages.lang_code == current_user.filter_language()).first()
+    # Remove duplicates
+    input_l = helper.uniq(input_l)
     return modify_database_object(input_l, book.languages, db.Languages, calibre_db.session, 'languages')
 
 
@@ -605,6 +606,8 @@ def edit_book(book_id):
         # handle author(s)
         input_authors = to_save["author_name"].split('&')
         input_authors = list(map(lambda it: it.strip().replace(',', '|'), input_authors))
+        # Remove duplicates in authors list
+        input_authors = helper.uniq(input_authors)
         # we have all author names now
         if input_authors == ['']:
             input_authors = [_(u'Unknown')]  # prevent empty Author
@@ -775,6 +778,9 @@ def upload():
                 input_authors = authr.split('&')
                 # handle_authors(input_authors)
                 input_authors = list(map(lambda it: it.strip().replace(',', '|'), input_authors))
+                # Remove duplicates in authors list
+                input_authors = helper.uniq(input_authors)
+
                 # we have all author names now
                 if input_authors == ['']:
                     input_authors = [_(u'Unknown')]  # prevent empty Author
diff --git a/cps/epub.py b/cps/epub.py
index 8b9880848119320d5a6a00574b268b167c4b0e78..f863db61c824f6187393a5423dec26e32cf0a5ae 100644
--- a/cps/epub.py
+++ b/cps/epub.py
@@ -122,9 +122,14 @@ def get_epub_info(tmp_file_path, original_file_name, original_file_extension):
                 markupTree = etree.fromstring(markup)
                 # no matter xhtml or html with no namespace
                 imgsrc = markupTree.xpath("//*[local-name() = 'img']/@src")
-                # imgsrc maybe startwith "../"" so fullpath join then relpath to cwd
-                filename = os.path.relpath(os.path.join(os.path.dirname(os.path.join(coverpath, coversection[0])), imgsrc[0]))
-                coverfile = extractCover(epubZip, filename, "", tmp_file_path)
+                # Alternative image source
+                if not len(imgsrc):
+                    imgsrc = markupTree.xpath("//attribute::*[contains(local-name(), 'href')]")
+                if len(imgsrc):
+                    # imgsrc maybe startwith "../"" so fullpath join then relpath to cwd
+                    filename = os.path.relpath(os.path.join(os.path.dirname(os.path.join(coverpath, coversection[0])),
+                                                            imgsrc[0]))
+                    coverfile = extractCover(epubZip, filename, "", tmp_file_path)
             else:
                 coverfile = extractCover(epubZip, coversection[0], coverpath, tmp_file_path)
 
diff --git a/cps/gdriveutils.py b/cps/gdriveutils.py
index d53044bd6b6aea0c81f1bde5bf241887fe9c66da..9ea0479d1699c40b4824195ea5ecb93c3af3faf1 100644
--- a/cps/gdriveutils.py
+++ b/cps/gdriveutils.py
@@ -27,12 +27,14 @@ from sqlalchemy import Column, UniqueConstraint
 from sqlalchemy import String, Integer
 from sqlalchemy.orm import sessionmaker, scoped_session
 from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy.exc import OperationalError, InvalidRequestError
 
 try:
     from pydrive.auth import GoogleAuth
     from pydrive.drive import GoogleDrive
     from pydrive.auth import RefreshError
     from apiclient import errors
+    from httplib2 import ServerNotFoundError
     gdrive_support = True
 except ImportError:
     gdrive_support = False
@@ -192,9 +194,13 @@ def getDrive(drive=None, gauth=None):
     return drive
 
 def listRootFolders():
-    drive = getDrive(Gdrive.Instance().drive)
-    folder = "'root' in parents and mimeType = 'application/vnd.google-apps.folder' and trashed = false"
-    fileList = drive.ListFile({'q': folder}).GetList()
+    try:
+        drive = getDrive(Gdrive.Instance().drive)
+        folder = "'root' in parents and mimeType = 'application/vnd.google-apps.folder' and trashed = false"
+        fileList = drive.ListFile({'q': folder}).GetList()
+    except ServerNotFoundError as e:
+        log.info("GDrive Error %s" % e)
+        fileList = []
     return fileList
 
 
@@ -474,8 +480,13 @@ def getChangeById (drive, change_id):
 
 # Deletes the local hashes database to force search for new folder names
 def deleteDatabaseOnChange():
-    session.query(GdriveId).delete()
-    session.commit()
+    try:
+        session.query(GdriveId).delete()
+        session.commit()
+    except (OperationalError, InvalidRequestError):
+        session.rollback()
+        log.info(u"GDrive DB is not Writeable")
+
 
 def updateGdriveCalibreFromLocal():
     copyToDrive(Gdrive.Instance().drive, config.config_calibre_dir, False, True)
diff --git a/cps/helper.py b/cps/helper.py
index b94634168f268cc5ecd4092aeffb05a57b6182fa..506613ebfe67bb8d84a20225164404ae48b8f699 100644
--- a/cps/helper.py
+++ b/cps/helper.py
@@ -468,6 +468,14 @@ def generate_random_password():
     passlen = 8
     return "".join(s[c % len(s)] for c in os.urandom(passlen))
 
+
+def uniq(input):
+  output = []
+  for x in input:
+    if x not in output:
+      output.append(x)
+  return output
+
 ################################## External interface
 
 
diff --git a/cps/services/simpleldap.py b/cps/services/simpleldap.py
index b6fd0ac262f2e523216efff24e13c035aa06ab28..0933a933668b6cbf2535672a51d6d276107ddb97 100644
--- a/cps/services/simpleldap.py
+++ b/cps/services/simpleldap.py
@@ -64,7 +64,6 @@ def init_app(app, config):
     app.config['LDAP_OPENLDAP'] = bool(config.config_ldap_openldap)
     app.config['LDAP_GROUP_OBJECT_FILTER'] = config.config_ldap_group_object_filter
     app.config['LDAP_GROUP_MEMBERS_FIELD'] = config.config_ldap_group_members_field
-    # app.config['LDAP_CUSTOM_OPTIONS'] = {'OPT_NETWORK_TIMEOUT': 10}
 
     _ldap.init_app(app)
 
diff --git a/cps/shelf.py b/cps/shelf.py
index 307689304cc50a9857219806ee42cf40a3fff30c..37cfc02aa52bde6e69e43cff0ae578a56f3e75f7 100644
--- a/cps/shelf.py
+++ b/cps/shelf.py
@@ -27,8 +27,9 @@ from flask import Blueprint, request, flash, redirect, url_for
 from flask_babel import gettext as _
 from flask_login import login_required, current_user
 from sqlalchemy.sql.expression import func
+from sqlalchemy.exc import OperationalError, InvalidRequestError
 
-from . import logger, ub, searched_ids, db, calibre_db
+from . import logger, ub, searched_ids, calibre_db
 from .web import render_title_template
 
 
@@ -91,8 +92,16 @@ def add_to_shelf(shelf_id, book_id):
 
     shelf.books.append(ub.BookShelf(shelf=shelf.id, book_id=book_id, order=maxOrder + 1))
     shelf.last_modified = datetime.utcnow()
-    ub.session.merge(shelf)
-    ub.session.commit()
+    try:
+        ub.session.merge(shelf)
+        ub.session.commit()
+    except (OperationalError, InvalidRequestError):
+        ub.session.rollback()
+        flash(_(u"Settings DB is not Writeable"), category="error")
+        if "HTTP_REFERER" in request.environ:
+            return redirect(request.environ["HTTP_REFERER"])
+        else:
+            return redirect(url_for('web.index'))
     if not xhr:
         flash(_(u"Book has been added to shelf: %(sname)s", sname=shelf.name), category="success")
         if "HTTP_REFERER" in request.environ:
@@ -143,9 +152,13 @@ def search_to_shelf(shelf_id):
             maxOrder = maxOrder + 1
             shelf.books.append(ub.BookShelf(shelf=shelf.id, book_id=book, order=maxOrder))
         shelf.last_modified = datetime.utcnow()
-        ub.session.merge(shelf)
-        ub.session.commit()
-        flash(_(u"Books have been added to shelf: %(sname)s", sname=shelf.name), category="success")
+        try:
+            ub.session.merge(shelf)
+            ub.session.commit()
+            flash(_(u"Books have been added to shelf: %(sname)s", sname=shelf.name), category="success")
+        except (OperationalError, InvalidRequestError):
+            ub.session.rollback()
+            flash(_(u"Settings DB is not Writeable"), category="error")
     else:
         flash(_(u"Could not add books to shelf: %(sname)s", sname=shelf.name), category="error")
     return redirect(url_for('web.index'))
@@ -180,10 +193,17 @@ def remove_from_shelf(shelf_id, book_id):
                 return redirect(url_for('web.index'))
             return "Book already removed from shelf", 410
 
-        ub.session.delete(book_shelf)
-        shelf.last_modified = datetime.utcnow()
-        ub.session.commit()
-
+        try:
+            ub.session.delete(book_shelf)
+            shelf.last_modified = datetime.utcnow()
+            ub.session.commit()
+        except (OperationalError, InvalidRequestError):
+            ub.session.rollback()
+            flash(_(u"Settings DB is not Writeable"), category="error")
+            if "HTTP_REFERER" in request.environ:
+                return redirect(request.environ["HTTP_REFERER"])
+            else:
+                return redirect(url_for('web.index'))
         if not xhr:
             flash(_(u"Book has been removed from shelf: %(sname)s", sname=shelf.name), category="success")
             if "HTTP_REFERER" in request.environ:
@@ -235,7 +255,11 @@ def create_shelf():
                 ub.session.commit()
                 flash(_(u"Shelf %(title)s created", title=to_save["title"]), category="success")
                 return redirect(url_for('shelf.show_shelf', shelf_id=shelf.id))
+            except (OperationalError, InvalidRequestError):
+                ub.session.rollback()
+                flash(_(u"Settings DB is not Writeable"), category="error")
             except Exception:
+                ub.session.rollback()
                 flash(_(u"There was an error"), category="error")
         return render_title_template('shelf_edit.html', shelf=shelf, title=_(u"Create a Shelf"), page="shelfcreate")
     else:
@@ -280,7 +304,11 @@ def edit_shelf(shelf_id):
             try:
                 ub.session.commit()
                 flash(_(u"Shelf %(title)s changed", title=to_save["title"]), category="success")
+            except (OperationalError, InvalidRequestError):
+                ub.session.rollback()
+                flash(_(u"Settings DB is not Writeable"), category="error")
             except Exception:
+                ub.session.rollback()
                 flash(_(u"There was an error"), category="error")
         return render_title_template('shelf_edit.html', shelf=shelf, title=_(u"Edit a shelf"), page="shelfedit")
     else:
@@ -298,11 +326,16 @@ def delete_shelf_helper(cur_shelf):
     log.info("successfully deleted %s", cur_shelf)
 
 
+
 @shelf.route("/shelf/delete/<int:shelf_id>")
 @login_required
 def delete_shelf(shelf_id):
     cur_shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.id == shelf_id).first()
-    delete_shelf_helper(cur_shelf)
+    try:
+        delete_shelf_helper(cur_shelf)
+    except (OperationalError, InvalidRequestError):
+        ub.session.rollback()
+        flash(_(u"Settings DB is not Writeable"), category="error")
     return redirect(url_for('web.index'))
 
 
@@ -327,8 +360,12 @@ def show_shelf(shelf_type, shelf_id):
                 cur_book = calibre_db.get_book(book.book_id)
                 if not cur_book:
                     log.info('Not existing book %s in %s deleted', book.book_id, shelf)
-                    ub.session.query(ub.BookShelf).filter(ub.BookShelf.book_id == book.book_id).delete()
-                    ub.session.commit()
+                    try:
+                        ub.session.query(ub.BookShelf).filter(ub.BookShelf.book_id == book.book_id).delete()
+                        ub.session.commit()
+                    except (OperationalError, InvalidRequestError):
+                        ub.session.rollback()
+                        flash(_(u"Settings DB is not Writeable"), category="error")
         return render_title_template(page, entries=result, title=_(u"Shelf: '%(name)s'", name=shelf.name),
                                      shelf=shelf, page="shelf")
     else:
@@ -348,7 +385,11 @@ def order_shelf(shelf_id):
             setattr(book, 'order', to_save[str(book.book_id)])
             counter += 1
             # if order diffrent from before -> shelf.last_modified = datetime.utcnow()
-        ub.session.commit()
+        try:
+            ub.session.commit()
+        except (OperationalError, InvalidRequestError):
+            ub.session.rollback()
+            flash(_(u"Settings DB is not Writeable"), category="error")
 
     shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.id == shelf_id).first()
     result = list()
diff --git a/cps/templates/generate_kobo_auth_url.html b/cps/templates/generate_kobo_auth_url.html
index 4711dd518df061e92d42cb6daf9aee832f2a910c..fb62424c4430591dfa5bfb7f3cb15eafd2ea3f0f 100644
--- a/cps/templates/generate_kobo_auth_url.html
+++ b/cps/templates/generate_kobo_auth_url.html
@@ -5,7 +5,7 @@
     {{_('Open the .kobo/Kobo eReader.conf file in a text editor and add (or edit):')}}</a>
   </p>
   <p>
-    {% if not warning %}'api_endpoint='{{kobo_auth_url}}{% else %}{{warning}}{% endif %}</a>
+    {% if not warning %}api_endpoint={{kobo_auth_url}}{% else %}{{warning}}{% endif %}</a>
   </p>
   <p>
 </div>
diff --git a/cps/translations/cs/LC_MESSAGES/messages.mo b/cps/translations/cs/LC_MESSAGES/messages.mo
index eed0c719e7d605391cdbd9f9eb44cfa20162c171..74bc33efabd204dc61f6d4379750c0e0ca906361 100644
Binary files a/cps/translations/cs/LC_MESSAGES/messages.mo and b/cps/translations/cs/LC_MESSAGES/messages.mo differ
diff --git a/cps/translations/cs/LC_MESSAGES/messages.po b/cps/translations/cs/LC_MESSAGES/messages.po
index 9928ff2bbb5fa0afba530795a9c1188cd953ce1d..6ef881ede2151397d2c07fec9e768c6fb16e904b 100644
--- a/cps/translations/cs/LC_MESSAGES/messages.po
+++ b/cps/translations/cs/LC_MESSAGES/messages.po
@@ -6,8 +6,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version:  Calibre-Web\n"
 "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
-"POT-Creation-Date: 2020-06-07 06:47+0200\n"
-"PO-Revision-Date: 2020-01-08 11:37+0000\n"
+"POT-Creation-Date: 2020-06-28 09:31+0200\n"
+"PO-Revision-Date: 2020-06-09 21:11+0100\n"
 "Last-Translator: Lukas Heroudek <lukas.heroudek@gmail.com>\n"
 "Language: cs_CZ\n"
 "Language-Team: \n"
@@ -45,9 +45,9 @@ msgstr "Úspěšně obnovené připojení"
 msgid "Unknown command"
 msgstr "Neznámý příkaz"
 
-#: cps/admin.py:116 cps/editbooks.py:563 cps/editbooks.py:573
-#: cps/editbooks.py:667 cps/editbooks.py:669 cps/editbooks.py:730
-#: cps/editbooks.py:743 cps/updater.py:509 cps/uploader.py:97
+#: cps/admin.py:116 cps/editbooks.py:564 cps/editbooks.py:576
+#: cps/editbooks.py:670 cps/editbooks.py:672 cps/editbooks.py:733
+#: cps/editbooks.py:749 cps/updater.py:509 cps/uploader.py:97
 #: cps/uploader.py:107
 msgid "Unknown"
 msgstr "Neznámý"
@@ -60,7 +60,7 @@ msgstr "Stránka správce"
 msgid "UI Configuration"
 msgstr "Konfigurace uživatelského rozhraní"
 
-#: cps/admin.py:189 cps/admin.py:706
+#: cps/admin.py:189 cps/admin.py:711
 msgid "Calibre-Web configuration updated"
 msgstr "Konfigurace Calibre-Web aktualizována"
 
@@ -76,213 +76,219 @@ msgstr "Povolit"
 
 #: cps/admin.py:510
 msgid "client_secrets.json Is Not Configured For Web Application"
-msgstr ""
+msgstr "client_secrets.json není nakonfigurováno pro webové aplikace"
 
 #: cps/admin.py:549
 msgid "Logfile Location is not Valid, Please Enter Correct Path"
-msgstr "Umístění zápisového souboru není platné. Určete prosím platnou polohu."
+msgstr "Umístění zápisového souboru není platné. Určete prosím platnou polohu"
 
 #: cps/admin.py:554
 msgid "Access Logfile Location is not Valid, Please Enter Correct Path"
-msgstr "Umístění zápisového souboru pro přístup není platné. Určete prosím platnou polohu."
+msgstr "Umístění zápisového souboru pro přístup není platné. Určete prosím platnou polohu"
 
 #: cps/admin.py:580
 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier"
-msgstr ""
+msgstr "Prosím zadejte LDAP poskytovatele, port, DN a Identifikátor objektu uživatele"
 
 #: cps/admin.py:593
 #, python-format
 msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier"
-msgstr ""
+msgstr "Filtr objektů skupiny LDAP musí mít jeden “%s” formátový identifikátor"
 
 #: cps/admin.py:596
 msgid "LDAP Group Object Filter Has Unmatched Parenthesis"
-msgstr ""
+msgstr "Filtr objektů skupiny LDAP má nesrovnatelnou závorku"
 
 #: cps/admin.py:600
 #, python-format
 msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier"
-msgstr ""
+msgstr "Filtr uživatelských objektů LDAP musí mít jeden “%s” formátový identifikátor"
 
 #: cps/admin.py:603
 msgid "LDAP User Object Filter Has Unmatched Parenthesis"
-msgstr ""
+msgstr "Filtr uživatelských objektů LDAP má nesrovnatelnou závorku"
 
 #: cps/admin.py:607
 msgid "LDAP Certificate Location is not Valid, Please Enter Correct Path"
-msgstr ""
+msgstr "Umístění certifikátu LDAP není platné, zadejte prosím správnou cestu"
 
-#: cps/admin.py:627
+#: cps/admin.py:628
 msgid "Keyfile Location is not Valid, Please Enter Correct Path"
-msgstr ""
+msgstr "Umístění souboru klíčů není platné, zadejte prosím správnou cestu"
 
-#: cps/admin.py:631
+#: cps/admin.py:632
 msgid "Certfile Location is not Valid, Please Enter Correct Path"
+msgstr "Umístění certifikátu není platné, zadejte prosím správnou cestu"
+
+#: cps/admin.py:694 cps/admin.py:793 cps/admin.py:885 cps/admin.py:934
+#: cps/shelf.py:100 cps/shelf.py:161 cps/shelf.py:202 cps/shelf.py:260
+#: cps/shelf.py:309 cps/shelf.py:338 cps/shelf.py:368 cps/shelf.py:392
+msgid "Settings DB is not Writeable"
 msgstr ""
 
-#: cps/admin.py:701
+#: cps/admin.py:706
 msgid "DB Location is not Valid, Please Enter Correct Path"
-msgstr "Poloha databáze není platná, opravte prosím polohu"
+msgstr "Umístění databáze není platné, opravte prosím cestu"
 
-#: cps/admin.py:703
+#: cps/admin.py:708
 msgid "DB is not Writeable"
-msgstr "Databáze není psatelná"
+msgstr "Databáze není zapisovatelná"
 
-#: cps/admin.py:736
+#: cps/admin.py:741
 msgid "Basic Configuration"
 msgstr "Základní konfigurace"
 
-#: cps/admin.py:751 cps/web.py:1337
+#: cps/admin.py:756 cps/web.py:1334
 msgid "Please fill out all fields!"
 msgstr "Vyplňte všechna pole!"
 
-#: cps/admin.py:754 cps/admin.py:766 cps/admin.py:772 cps/admin.py:892
+#: cps/admin.py:759 cps/admin.py:771 cps/admin.py:777 cps/admin.py:903
 msgid "Add new user"
 msgstr "Přidat nového uživatele"
 
-#: cps/admin.py:763 cps/web.py:1578
+#: cps/admin.py:768 cps/web.py:1575
 msgid "E-mail is not from valid domain"
 msgstr "E-mail není z platné domény"
 
-#: cps/admin.py:770 cps/admin.py:785
+#: cps/admin.py:775 cps/admin.py:790
 msgid "Found an existing account for this e-mail address or nickname."
 msgstr "Byl nalezen existující účet pro tuto e-mailovou adresu nebo přezdívku."
 
-#: cps/admin.py:781
+#: cps/admin.py:786
 #, python-format
 msgid "User '%(user)s' created"
 msgstr "Uživatel '%(user)s' vytvořen"
 
-#: cps/admin.py:794
+#: cps/admin.py:802
 #, python-format
 msgid "User '%(nick)s' deleted"
 msgstr "Uživatel '%(nick)s' smazán"
 
-#: cps/admin.py:797
+#: cps/admin.py:805
 msgid "No admin user remaining, can't delete user"
 msgstr "Nezbývá žádný správce, nemůžete jej odstranit"
 
-#: cps/admin.py:803
+#: cps/admin.py:811
 msgid "No admin user remaining, can't remove admin role"
-msgstr ""
+msgstr "Nezbývá žádný správce, nelze odebrat roli správce"
 
-#: cps/admin.py:839 cps/web.py:1621
+#: cps/admin.py:847 cps/web.py:1618
 msgid "Found an existing account for this e-mail address."
 msgstr "Byl nalezen existující účet pro tuto e-mailovou adresu."
 
-#: cps/admin.py:849 cps/admin.py:864 cps/admin.py:967 cps/web.py:1596
+#: cps/admin.py:857 cps/admin.py:872 cps/admin.py:983 cps/web.py:1593
 #, python-format
 msgid "Edit User %(nick)s"
 msgstr "Upravit uživatele %(nick)s"
 
-#: cps/admin.py:855 cps/web.py:1588
+#: cps/admin.py:863 cps/web.py:1585
 msgid "This username is already taken"
-msgstr "Toto uživatelské jméno je již použito"
+msgstr "Zadané uživatelské jméno je již použito"
 
-#: cps/admin.py:871
+#: cps/admin.py:879
 #, python-format
 msgid "User '%(nick)s' updated"
 msgstr "Uživatel '%(nick)s' aktualizován"
 
-#: cps/admin.py:874
+#: cps/admin.py:882
 msgid "An unknown error occured."
 msgstr "Došlo k neznámé chybě."
 
-#: cps/admin.py:901 cps/templates/admin.html:71
+#: cps/admin.py:912 cps/templates/admin.html:71
 msgid "Edit E-mail Server Settings"
 msgstr "Změnit SMTP nastavení"
 
-#: cps/admin.py:925
+#: cps/admin.py:941
 #, python-format
 msgid "Test e-mail successfully send to %(kindlemail)s"
 msgstr "Zkušební e-mail úspěšně odeslán na %(kindlemail)s"
 
-#: cps/admin.py:928
+#: cps/admin.py:944
 #, python-format
 msgid "There was an error sending the Test e-mail: %(res)s"
 msgstr "Při odesílání zkušebního e-mailu došlo k chybě: %(res)s"
 
-#: cps/admin.py:930
+#: cps/admin.py:946
 msgid "Please configure your e-mail address first..."
 msgstr "PrvnÄ› nastavte svou e-mailovou adresu..."
 
-#: cps/admin.py:932
+#: cps/admin.py:948
 msgid "E-mail server settings updated"
 msgstr "Nastavení e-mailového serveru aktualizováno"
 
-#: cps/admin.py:943
+#: cps/admin.py:959
 msgid "User not found"
 msgstr "Uživatel nenalezen"
 
-#: cps/admin.py:978
+#: cps/admin.py:994
 #, python-format
 msgid "Password for user %(user)s reset"
 msgstr "Heslo pro uživatele %(user)s resetováno"
 
-#: cps/admin.py:981 cps/web.py:1361 cps/web.py:1425
+#: cps/admin.py:997 cps/web.py:1358 cps/web.py:1422
 msgid "An unknown error occurred. Please try again later."
 msgstr "Neznámá chyba. Opakujte prosím později."
 
-#: cps/admin.py:984 cps/web.py:1299
+#: cps/admin.py:1000 cps/web.py:1296
 msgid "Please configure the SMTP mail settings first..."
 msgstr "Nejprve nakonfigurujte nastavení pošty SMTP..."
 
-#: cps/admin.py:996
+#: cps/admin.py:1012
 msgid "Logfile viewer"
 msgstr "Prohlížeč log souborů"
 
-#: cps/admin.py:1035
+#: cps/admin.py:1051
 msgid "Requesting update package"
 msgstr "Požadování balíčku aktualizace"
 
-#: cps/admin.py:1036
+#: cps/admin.py:1052
 msgid "Downloading update package"
 msgstr "Stahování balíčku aktualizace"
 
-#: cps/admin.py:1037
+#: cps/admin.py:1053
 msgid "Unzipping update package"
 msgstr "Rozbalování balíčku aktualizace"
 
-#: cps/admin.py:1038
+#: cps/admin.py:1054
 msgid "Replacing files"
 msgstr "Nahrazování souborů"
 
-#: cps/admin.py:1039
+#: cps/admin.py:1055
 msgid "Database connections are closed"
 msgstr "Databázová připojení jsou uzavřena"
 
-#: cps/admin.py:1040
+#: cps/admin.py:1056
 msgid "Stopping server"
 msgstr "Zastavuji server"
 
-#: cps/admin.py:1041
+#: cps/admin.py:1057
 msgid "Update finished, please press okay and reload page"
 msgstr "Aktualizace dokončena, klepněte na tlačítko OK a znovu načtěte stránku"
 
-#: cps/admin.py:1042 cps/admin.py:1043 cps/admin.py:1044 cps/admin.py:1045
-#: cps/admin.py:1046
+#: cps/admin.py:1058 cps/admin.py:1059 cps/admin.py:1060 cps/admin.py:1061
+#: cps/admin.py:1062
 msgid "Update failed:"
 msgstr "Aktualizace selhala:"
 
-#: cps/admin.py:1042 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
+#: cps/admin.py:1058 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
 msgid "HTTP Error"
 msgstr "HTTP chyba"
 
-#: cps/admin.py:1043 cps/updater.py:321 cps/updater.py:524
+#: cps/admin.py:1059 cps/updater.py:321 cps/updater.py:524
 msgid "Connection error"
 msgstr "Chyba připojení"
 
-#: cps/admin.py:1044 cps/updater.py:323 cps/updater.py:526
+#: cps/admin.py:1060 cps/updater.py:323 cps/updater.py:526
 msgid "Timeout while establishing connection"
 msgstr "Vypršel časový limit při navazování spojení"
 
-#: cps/admin.py:1045 cps/updater.py:325 cps/updater.py:528
+#: cps/admin.py:1061 cps/updater.py:325 cps/updater.py:528
 msgid "General error"
 msgstr "Všeobecná chyba"
 
-#: cps/admin.py:1046
+#: cps/admin.py:1062
 msgid "Update File Could Not be Saved in Temp Dir"
-msgstr ""
+msgstr "Aktualizační soubor nemohl být uložen do Temp Dir"
 
 #: cps/converter.py:32
 msgid "not configured"
@@ -294,14 +300,14 @@ msgstr "Chybí povolení k exekuci"
 
 #: cps/editbooks.py:242
 msgid "Book Format Successfully Deleted"
-msgstr "Formát knihy úspěšně vymazán"
+msgstr "Formát knihy úspěšně smazán"
 
 #: cps/editbooks.py:245
 msgid "Book Successfully Deleted"
-msgstr "Kniha úspěšně vymazána"
+msgstr "Kniha úspěšně smazána"
 
-#: cps/editbooks.py:254 cps/editbooks.py:548 cps/web.py:1644 cps/web.py:1685
-#: cps/web.py:1747
+#: cps/editbooks.py:254 cps/editbooks.py:549 cps/web.py:1641 cps/web.py:1682
+#: cps/web.py:1744
 msgid "Error opening eBook. File does not exist or file is not accessible"
 msgstr "Chyba otevírání eknihy. Soubor neexistuje nebo není přístupný"
 
@@ -309,82 +315,82 @@ msgstr "Chyba otevírání eknihy. Soubor neexistuje nebo není přístupný"
 msgid "edit metadata"
 msgstr "upravit metadata"
 
-#: cps/editbooks.py:361
+#: cps/editbooks.py:360
 #, python-format
 msgid "%(langname)s is not a valid language"
 msgstr "%(langname)s není platným jazykem"
 
-#: cps/editbooks.py:467 cps/editbooks.py:712
+#: cps/editbooks.py:468 cps/editbooks.py:715
 #, python-format
 msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
 msgstr "Soubor s příponou '%(ext)s' nelze odeslat na tento server"
 
-#: cps/editbooks.py:471 cps/editbooks.py:716
+#: cps/editbooks.py:472 cps/editbooks.py:719
 msgid "File to be uploaded must have an extension"
 msgstr "Soubor, který má být odeslán musí mít příponu"
 
-#: cps/editbooks.py:483 cps/editbooks.py:773
+#: cps/editbooks.py:484 cps/editbooks.py:779
 #, python-format
 msgid "Failed to create path %(path)s (Permission denied)."
 msgstr "Nepodařilo se vytvořit cestu %(path)s (oprávnění odepřeno)."
 
-#: cps/editbooks.py:488
+#: cps/editbooks.py:489
 #, python-format
 msgid "Failed to store file %(file)s."
 msgstr "Uložení souboru %(file)s se nezdařilo."
 
-#: cps/editbooks.py:506 cps/editbooks.py:864
+#: cps/editbooks.py:507 cps/editbooks.py:870
 #, python-format
 msgid "Database error: %(error)s."
-msgstr "Error databáze: %(error)s. "
+msgstr "Chyba databáze: %(error)s."
 
-#: cps/editbooks.py:510
+#: cps/editbooks.py:511
 #, python-format
 msgid "File format %(ext)s added to %(book)s"
 msgstr "Formát souboru %(ext)s přidán do %(book)s"
 
-#: cps/editbooks.py:653
+#: cps/editbooks.py:656
 msgid "Metadata successfully updated"
 msgstr "Metadata úspěšně aktualizována"
 
-#: cps/editbooks.py:662
+#: cps/editbooks.py:665
 msgid "Error editing book, please check logfile for details"
 msgstr "Chyba při úpravách knihy, zkontrolujte prosím log pro podrobnosti"
 
-#: cps/editbooks.py:724
+#: cps/editbooks.py:727
 #, python-format
 msgid "File %(filename)s could not saved to temp dir"
 msgstr "Soubor %(filename)s nemohl být uložen do dočasného adresáře"
 
-#: cps/editbooks.py:734
+#: cps/editbooks.py:737
 msgid "Uploaded book probably exists in the library, consider to change before upload new: "
 msgstr "Nahraná kniha pravděpodobně existuje v knihovně, zvažte prosím změnu před nahráním nové: "
 
-#: cps/editbooks.py:780
+#: cps/editbooks.py:786
 #, python-format
 msgid "Failed to Move File %(file)s: %(error)s"
-msgstr ""
+msgstr "Nepodařilo se přesunout soubor %(file)s: %(error)s"
 
-#: cps/editbooks.py:836
+#: cps/editbooks.py:842
 #, python-format
 msgid "Failed to Move Cover File %(file)s: %(error)s"
-msgstr ""
+msgstr "Nepodařilo se přesunout soubor obalu %(file)s: %(error)s"
 
-#: cps/editbooks.py:850
+#: cps/editbooks.py:856
 #, python-format
 msgid "File %(file)s uploaded"
 msgstr "Soubor %(file)s nahrán"
 
-#: cps/editbooks.py:876
+#: cps/editbooks.py:882
 msgid "Source or destination format for conversion missing"
 msgstr "Chybí zdrojový nebo cílový formát pro převod"
 
-#: cps/editbooks.py:884
+#: cps/editbooks.py:890
 #, python-format
 msgid "Book successfully queued for converting to %(book_format)s"
 msgstr "Kniha byla úspěšně zařazena do fronty pro převod do %(book_format)s"
 
-#: cps/editbooks.py:888
+#: cps/editbooks.py:894
 #, python-format
 msgid "There was an error converting this book: %(res)s"
 msgstr "Při převodu této knihy došlo k chybě: %(res)s"
@@ -461,17 +467,17 @@ msgstr "Požadovaný soubor nelze přečíst. Možná nesprávná oprávnění?"
 #: cps/helper.py:300
 #, python-format
 msgid "Deleting book %(id)s failed, path has subfolders: %(path)s"
-msgstr ""
+msgstr "Mazání knihy %(id)s selhalo, cesta má podsložky” %(path)s"
 
 #: cps/helper.py:310
 #, python-format
 msgid "Deleting book %(id)s failed: %(message)s"
-msgstr ""
+msgstr "Mazání knihy selhalo %(id)s failed: %(message)s"
 
 #: cps/helper.py:320
 #, python-format
 msgid "Deleting book %(id)s, book path not valid: %(path)s"
-msgstr ""
+msgstr "Mazání knihy %(id)s, cesta ke knize není platná %(path)s"
 
 #: cps/helper.py:355
 #, python-format
@@ -498,81 +504,81 @@ msgstr "Soubor %(file)s nenalezen na Google Drive"
 msgid "Book path %(path)s not found on Google Drive"
 msgstr "Cesta ke knize %(path)s nebyla nalezena na Google Drive"
 
-#: cps/helper.py:542
+#: cps/helper.py:550
 msgid "Error Downloading Cover"
-msgstr ""
+msgstr "Chyba stahování obalu"
 
-#: cps/helper.py:545
+#: cps/helper.py:553
 msgid "Cover Format Error"
-msgstr ""
+msgstr "Chyba formátu obalu"
 
-#: cps/helper.py:561
+#: cps/helper.py:569
 msgid "Failed to create path for cover"
-msgstr ""
+msgstr "Vytvoření cesty obalu selhalo"
 
-#: cps/helper.py:566
+#: cps/helper.py:574
 msgid "Cover-file is not a valid image file, or could not be stored"
-msgstr ""
+msgstr "Soubor obalu není platný, nebo nelze uložit"
 
-#: cps/helper.py:577
+#: cps/helper.py:585
 msgid "Only jpg/jpeg/png/webp files are supported as coverfile"
-msgstr ""
+msgstr "Pouze jpg/jpeg/png/webp jsou podporované soubory pro obal"
 
-#: cps/helper.py:591
+#: cps/helper.py:599
 msgid "Only jpg/jpeg files are supported as coverfile"
-msgstr ""
+msgstr "Pouze jpg/jpeg jsou podporované soubory pro obal"
 
-#: cps/helper.py:640
+#: cps/helper.py:648
 msgid "Unrar binary file not found"
-msgstr ""
+msgstr "Unrar binární soubor nenalezen"
 
-#: cps/helper.py:654
+#: cps/helper.py:662
 msgid "Error excecuting UnRar"
-msgstr ""
+msgstr "Chyba provádění UnRar"
 
-#: cps/helper.py:710
+#: cps/helper.py:718
 msgid "Waiting"
 msgstr "Čekám"
 
-#: cps/helper.py:712
+#: cps/helper.py:720
 msgid "Failed"
 msgstr "Selhalo"
 
-#: cps/helper.py:714
+#: cps/helper.py:722
 msgid "Started"
 msgstr "Spuštěno"
 
-#: cps/helper.py:716
+#: cps/helper.py:724
 msgid "Finished"
 msgstr "Dokončeno"
 
-#: cps/helper.py:718
+#: cps/helper.py:726
 msgid "Unknown Status"
 msgstr "Neznámý stav"
 
-#: cps/helper.py:723
+#: cps/helper.py:731
 msgid "E-mail: "
 msgstr "E-mail: "
 
-#: cps/helper.py:725 cps/helper.py:729
+#: cps/helper.py:733 cps/helper.py:737
 msgid "Convert: "
 msgstr "Převést:"
 
-#: cps/helper.py:727
+#: cps/helper.py:735
 msgid "Upload: "
 msgstr "Nahrát:"
 
-#: cps/helper.py:731
+#: cps/helper.py:739
 msgid "Unknown Task: "
 msgstr "Neznámá úloha:"
 
 #: cps/kobo_auth.py:130
 msgid "PLease access calibre-web from non localhost to get valid api_endpoint for kobo device"
-msgstr ""
+msgstr "Pro získání platného api_endpoint pro zařízení Kobo, přístupte na calibre-web bez localhost"
 
 #: cps/kobo_auth.py:133 cps/kobo_auth.py:153
 msgid "Kobo Setup"
-msgstr ""
+msgstr "Kobo nastavení"
 
 #: cps/oauth_bb.py:73
 #, python-format
@@ -581,271 +587,271 @@ msgstr "Registrovat s %(provider)s"
 
 #: cps/oauth_bb.py:154
 msgid "Failed to log in with GitHub."
-msgstr "Přihlášení pomocí GitHub selhalo"
+msgstr "Přihlášení pomocí GitHub selhalo."
 
 #: cps/oauth_bb.py:159
 msgid "Failed to fetch user info from GitHub."
-msgstr "Nepodařilo se načíst informace o uživateli z GitHub"
+msgstr "Nepodařilo se načíst informace o uživateli z GitHub."
 
 #: cps/oauth_bb.py:170
 msgid "Failed to log in with Google."
-msgstr "Přihlášení pomocí Google selhalo"
+msgstr "Přihlášení pomocí Google selhalo."
 
 #: cps/oauth_bb.py:175
 msgid "Failed to fetch user info from Google."
-msgstr "Nepodařilo se načíst informace o uživateli z Google"
+msgstr "Nepodařilo se načíst informace o uživateli z Google."
 
-#: cps/oauth_bb.py:225 cps/web.py:1397 cps/web.py:1537
+#: cps/oauth_bb.py:225 cps/web.py:1394 cps/web.py:1534
 #, python-format
 msgid "you are now logged in as: '%(nickname)s'"
-msgstr "nyní jste přihlášeni jako: '%(nickname)s'"
+msgstr "nyní jste přihlášen jako: '%(nickname)s'"
 
 #: cps/oauth_bb.py:235
 #, python-format
 msgid "Link to %(oauth)s Succeeded"
-msgstr ""
+msgstr "Připojení k %(oauth)s úspěšné"
 
 #: cps/oauth_bb.py:241
 msgid "Login failed, No User Linked With OAuth Account"
-msgstr ""
+msgstr "Přihlášení selhalo, žádný uživatel s OAuth účtem"
 
 #: cps/oauth_bb.py:283
 #, python-format
 msgid "Unlink to %(oauth)s Succeeded"
-msgstr ""
+msgstr "Odpojení od %(oauth)s úspěšné"
 
 #: cps/oauth_bb.py:287
 #, python-format
 msgid "Unlink to %(oauth)s Failed"
-msgstr ""
+msgstr "Odpojení od %(oauth)s selhalo"
 
 #: cps/oauth_bb.py:290
 #, python-format
 msgid "Not Linked to %(oauth)s."
-msgstr ""
+msgstr "Nepřipojeno k %(oauth)s."
 
 #: cps/oauth_bb.py:318
 msgid "GitHub Oauth error, please retry later."
-msgstr "GitHub Oauth chyba, prosím opakujte později"
+msgstr "GitHub Oauth chyba, prosím opakujte později."
 
 #: cps/oauth_bb.py:337
 msgid "Google Oauth error, please retry later."
-msgstr "Google Oauth chyba, prosím opakujte později"
+msgstr "Google Oauth chyba, prosím opakujte později."
 
-#: cps/shelf.py:66 cps/shelf.py:111
+#: cps/shelf.py:67 cps/shelf.py:120
 msgid "Invalid shelf specified"
 msgstr "Zadána neplatná police"
 
-#: cps/shelf.py:72
+#: cps/shelf.py:73
 #, python-format
 msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s"
 msgstr "Lituji, nejste oprávněni přidat knihu do police: %(shelfname)s"
 
-#: cps/shelf.py:82
+#: cps/shelf.py:83
 #, python-format
 msgid "Book is already part of the shelf: %(shelfname)s"
 msgstr "Kniha je již součástí police: %(shelfname)s"
 
-#: cps/shelf.py:97
+#: cps/shelf.py:106
 #, python-format
 msgid "Book has been added to shelf: %(sname)s"
 msgstr "Kniha byla přidána do police: %(sname)s"
 
-#: cps/shelf.py:115
+#: cps/shelf.py:124
 #, python-format
 msgid "You are not allowed to add a book to the the shelf: %(name)s"
 msgstr "Nejste oprávněni přidat knihu do police: %(name)s"
 
-#: cps/shelf.py:133
+#: cps/shelf.py:142
 #, python-format
 msgid "Books are already part of the shelf: %(name)s"
 msgstr "Knihy jsou již součástí police: %(name)s"
 
-#: cps/shelf.py:148
+#: cps/shelf.py:158
 #, python-format
 msgid "Books have been added to shelf: %(sname)s"
 msgstr "Knihy byly přidány do police: %(sname)s"
 
-#: cps/shelf.py:150
+#: cps/shelf.py:163
 #, python-format
 msgid "Could not add books to shelf: %(sname)s"
 msgstr "Nelze přidat knihy do police: %(sname)s"
 
-#: cps/shelf.py:188
+#: cps/shelf.py:208
 #, python-format
 msgid "Book has been removed from shelf: %(sname)s"
 msgstr "Kniha byla odebrána z police: %(sname)s"
 
-#: cps/shelf.py:196
+#: cps/shelf.py:216
 #, python-format
 msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
 msgstr "Lituji, nejste oprávněni odebrat knihu z této police: %(sname)s"
 
-#: cps/shelf.py:220 cps/shelf.py:260
+#: cps/shelf.py:240 cps/shelf.py:284
 #, python-format
 msgid "A public shelf with the name '%(title)s' already exists."
-msgstr ""
+msgstr "Veřejná police s názvem '%(title)s' již existuje."
 
-#: cps/shelf.py:229 cps/shelf.py:270
+#: cps/shelf.py:249 cps/shelf.py:294
 #, python-format
 msgid "A private shelf with the name '%(title)s' already exists."
-msgstr ""
+msgstr "Osobní police s názvem ‘%(title)s’ již existuje."
 
-#: cps/shelf.py:236
+#: cps/shelf.py:256
 #, python-format
 msgid "Shelf %(title)s created"
 msgstr "Police %(title)s vytvořena"
 
-#: cps/shelf.py:239 cps/shelf.py:284
+#: cps/shelf.py:263 cps/shelf.py:312
 msgid "There was an error"
 msgstr "Došlo k chybě"
 
-#: cps/shelf.py:240 cps/shelf.py:242 cps/templates/layout.html:144
+#: cps/shelf.py:264 cps/shelf.py:266 cps/templates/layout.html:144
 msgid "Create a Shelf"
-msgstr "vytvořit polici"
+msgstr "Vytvořit polici"
 
-#: cps/shelf.py:282
+#: cps/shelf.py:306
 #, python-format
 msgid "Shelf %(title)s changed"
 msgstr "Police %(title)s změněna"
 
-#: cps/shelf.py:285 cps/shelf.py:287
+#: cps/shelf.py:313 cps/shelf.py:315
 msgid "Edit a shelf"
 msgstr "Upravit polici"
 
-#: cps/shelf.py:332
+#: cps/shelf.py:369
 #, python-format
 msgid "Shelf: '%(name)s'"
 msgstr "Police: '%(name)s'"
 
-#: cps/shelf.py:335
+#: cps/shelf.py:372
 msgid "Error opening shelf. Shelf does not exist or is not accessible"
 msgstr "Chyba otevírání police. Police neexistuje nebo není přístupná"
 
-#: cps/shelf.py:368
+#: cps/shelf.py:409
 msgid "Hidden Book"
-msgstr ""
+msgstr "Skrytá kniha"
 
-#: cps/shelf.py:373
+#: cps/shelf.py:414
 #, python-format
 msgid "Change order of Shelf: '%(name)s'"
 msgstr "Změnit  pořadí Police: '%(name)s'"
 
-#: cps/ub.py:64
+#: cps/ub.py:65
 msgid "Recently Added"
 msgstr "Nedávno přidáné"
 
-#: cps/ub.py:66
+#: cps/ub.py:67
 msgid "Show recent books"
 msgstr "Zobrazit nedávné knihy"
 
-#: cps/templates/index.xml:17 cps/ub.py:67
+#: cps/templates/index.xml:17 cps/ub.py:68
 msgid "Hot Books"
 msgstr "Žhavé knihy"
 
-#: cps/ub.py:69
+#: cps/ub.py:70
 msgid "Show Hot Books"
-msgstr ""
+msgstr "Zobrazit žhavé knihy"
 
-#: cps/templates/index.xml:24 cps/ub.py:71 cps/web.py:655
+#: cps/templates/index.xml:24 cps/ub.py:72 cps/web.py:652
 msgid "Top Rated Books"
-msgstr ""
+msgstr "Nejlépe hodnocené knihy"
 
-#: cps/ub.py:73
+#: cps/ub.py:74
 msgid "Show Top Rated Books"
-msgstr ""
+msgstr "Zobrazit nejlépe hodnocené knihy"
 
-#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:74
-#: cps/web.py:1222
+#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:75
+#: cps/web.py:1219
 msgid "Read Books"
 msgstr "Přečtené knihy"
 
-#: cps/ub.py:76
+#: cps/ub.py:77
 msgid "Show read and unread"
 msgstr "Zobrazit prečtené a nepřečtené"
 
-#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:78
-#: cps/web.py:1225
+#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:79
+#: cps/web.py:1222
 msgid "Unread Books"
 msgstr "Nepřečtené knihy"
 
-#: cps/ub.py:80
+#: cps/ub.py:81
 msgid "Show unread"
 msgstr "Zobrazit nepřečtené"
 
-#: cps/ub.py:81
+#: cps/ub.py:82
 msgid "Discover"
 msgstr "Objevte"
 
-#: cps/ub.py:83
+#: cps/ub.py:84
 msgid "Show random books"
 msgstr "Zobrazit náhodné knihy"
 
-#: cps/templates/index.xml:75 cps/ub.py:84 cps/web.py:970
+#: cps/templates/index.xml:75 cps/ub.py:85 cps/web.py:967
 msgid "Categories"
 msgstr "Kategorie"
 
-#: cps/ub.py:86
+#: cps/ub.py:87
 msgid "Show category selection"
 msgstr "Zobrazit výběr kategorie"
 
 #: cps/templates/book_edit.html:84 cps/templates/index.xml:82
-#: cps/templates/search_form.html:53 cps/ub.py:87 cps/web.py:886 cps/web.py:896
+#: cps/templates/search_form.html:53 cps/ub.py:88 cps/web.py:883 cps/web.py:893
 msgid "Series"
 msgstr "Série"
 
-#: cps/ub.py:89
+#: cps/ub.py:90
 msgid "Show series selection"
-msgstr "Zobrazit  výběr sérií"
+msgstr "Zobrazit výběr sérií"
 
-#: cps/templates/index.xml:61 cps/ub.py:90
+#: cps/templates/index.xml:61 cps/ub.py:91
 msgid "Authors"
 msgstr "Autoři"
 
-#: cps/ub.py:92
+#: cps/ub.py:93
 msgid "Show author selection"
 msgstr "Zobrazit výběr autora"
 
-#: cps/templates/index.xml:68 cps/ub.py:94 cps/web.py:869
+#: cps/templates/index.xml:68 cps/ub.py:95 cps/web.py:866
 msgid "Publishers"
 msgstr "Vydavatelé"
 
-#: cps/ub.py:96
+#: cps/ub.py:97
 msgid "Show publisher selection"
 msgstr "Zobrazit výběr vydavatele"
 
-#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:97
-#: cps/web.py:953
+#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:98
+#: cps/web.py:950
 msgid "Languages"
 msgstr "Jazyky"
 
-#: cps/ub.py:100
+#: cps/ub.py:101
 msgid "Show language selection"
 msgstr "Zobrazit výběr jazyka"
 
-#: cps/templates/index.xml:96 cps/ub.py:101
+#: cps/templates/index.xml:96 cps/ub.py:102
 msgid "Ratings"
 msgstr "Hodnocení"
 
-#: cps/ub.py:103
+#: cps/ub.py:104
 msgid "Show ratings selection"
 msgstr "Zobrazit výběr hodnocení"
 
-#: cps/templates/index.xml:104 cps/ub.py:104
+#: cps/templates/index.xml:104 cps/ub.py:105
 msgid "File formats"
 msgstr "Formáty souborů"
 
-#: cps/ub.py:106
+#: cps/ub.py:107
 msgid "Show file formats selection"
 msgstr "Zobrazit výběr formátů"
 
-#: cps/ub.py:108 cps/web.py:1249
+#: cps/ub.py:109 cps/web.py:1246
 msgid "Archived Books"
-msgstr ""
+msgstr "Archivované knihy"
 
-#: cps/ub.py:110
+#: cps/ub.py:111
 msgid "Show archived books"
-msgstr ""
+msgstr "Zobrazit archivované knihy"
 
 #: cps/updater.py:294 cps/updater.py:305 cps/updater.py:406 cps/updater.py:420
 msgid "Unexpected data while reading update information"
@@ -876,227 +882,227 @@ msgstr "Nová aktualizace k dispozici. Klepnutím na tlačítko níže aktualizu
 msgid "Click on the button below to update to the latest stable version."
 msgstr "Klepnutím na tlačítko níže aktualizujte na nejnovější stabilní verzi."
 
-#: cps/web.py:322
+#: cps/web.py:319
 #, python-format
 msgid "Error: %(ldaperror)s"
-msgstr ""
+msgstr "Chyba: %(ldaperror)s"
 
-#: cps/web.py:326
+#: cps/web.py:323
 msgid "Error: No user returned in response of LDAP server"
-msgstr ""
+msgstr "Chyba: Žádná reakce od uživatele LDAP serveru"
 
-#: cps/web.py:374
+#: cps/web.py:371
 msgid "Failed to Create at Least One LDAP User"
-msgstr ""
+msgstr "Nepodařilo se vytvořit nejméně jednoho uživatele LDAP"
 
-#: cps/web.py:377
+#: cps/web.py:374
 msgid "At Least One LDAP User Not Found in Database"
-msgstr ""
+msgstr "Nejméně jeden uživatel LDAP nenalezen v databázi"
 
-#: cps/web.py:379
+#: cps/web.py:376
 msgid "User Successfully Imported"
-msgstr ""
+msgstr "Uživatel úspěšně importován"
 
-#: cps/web.py:625
+#: cps/web.py:622
 msgid "Recently Added Books"
 msgstr "Nedávno přidané knihy"
 
-#: cps/templates/index.html:5 cps/web.py:663
+#: cps/templates/index.html:5 cps/web.py:660
 msgid "Discover (Random Books)"
 msgstr "Objevte (Náhodné knihy)"
 
-#: cps/web.py:691
+#: cps/web.py:688
 msgid "Books"
 msgstr "Knihy"
 
-#: cps/web.py:718
+#: cps/web.py:715
 msgid "Hot Books (Most Downloaded)"
-msgstr ""
+msgstr "Žhavé knihy (Nejstahovanější)"
 
-#: cps/web.py:731
+#: cps/web.py:728
 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible"
-msgstr ""
+msgstr "Jejda! Vybraná kniha není k dispozici. Soubor neexistuje nebo není přístupný"
 
-#: cps/web.py:745
+#: cps/web.py:742
 #, python-format
 msgid "Author: %(name)s"
 msgstr "Autoři: %(name)s"
 
-#: cps/web.py:759
+#: cps/web.py:756
 #, python-format
 msgid "Publisher: %(name)s"
 msgstr "Vydavatel: %(name)s"
 
-#: cps/web.py:772
+#: cps/web.py:769
 #, python-format
 msgid "Series: %(serie)s"
 msgstr "Série: %(serie)s"
 
-#: cps/web.py:785
+#: cps/web.py:782
 #, python-format
 msgid "Rating: %(rating)s stars"
 msgstr "Hodnocení: %(rating)s stars"
 
-#: cps/web.py:798
+#: cps/web.py:795
 #, python-format
 msgid "File format: %(format)s"
 msgstr "Soubor formátů: %(format)s"
 
-#: cps/web.py:812
+#: cps/web.py:809
 #, python-format
 msgid "Category: %(name)s"
 msgstr "Kategorie: %(name)s"
 
-#: cps/web.py:831
+#: cps/web.py:828
 #, python-format
 msgid "Language: %(name)s"
 msgstr "Jazyky: %(name)s"
 
-#: cps/web.py:910
+#: cps/web.py:907
 msgid "Ratings list"
 msgstr "Seznam hodnocení"
 
-#: cps/web.py:925
+#: cps/web.py:922
 msgid "File formats list"
 msgstr "Seznam formátů"
 
-#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:984
+#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:981
 msgid "Tasks"
 msgstr "Úlohy"
 
 #: cps/templates/book_edit.html:235 cps/templates/feed.xml:33
 #: cps/templates/layout.html:45 cps/templates/layout.html:48
-#: cps/templates/search_form.html:174 cps/web.py:1010 cps/web.py:1015
+#: cps/templates/search_form.html:174 cps/web.py:1007 cps/web.py:1012
 msgid "Search"
 msgstr "Hledat"
 
-#: cps/web.py:1066
+#: cps/web.py:1063
 msgid "Published after "
 msgstr "Vydáno po "
 
-#: cps/web.py:1073
+#: cps/web.py:1070
 msgid "Published before "
 msgstr "Vydáno před "
 
-#: cps/web.py:1087
+#: cps/web.py:1084
 #, python-format
 msgid "Rating <= %(rating)s"
 msgstr "Hodnocení <= %(rating)s"
 
-#: cps/web.py:1089
+#: cps/web.py:1086
 #, python-format
 msgid "Rating >= %(rating)s"
 msgstr "Hodnocení >= %(rating)s"
 
-#: cps/web.py:1158 cps/web.py:1183
+#: cps/web.py:1155 cps/web.py:1180
 msgid "search"
 msgstr "hledat"
 
-#: cps/web.py:1213
+#: cps/web.py:1210
 #, python-format
 msgid "Custom Column No.%(column)d is not existing in calibre database"
-msgstr ""
+msgstr "Vlastní sloupec %(column)d neexistuje v databázi"
 
-#: cps/web.py:1304
+#: cps/web.py:1301
 #, python-format
 msgid "Book successfully queued for sending to %(kindlemail)s"
 msgstr "Kniha byla úspěšně zařazena do fronty pro odeslání na %(kindlemail)s"
 
-#: cps/web.py:1308
+#: cps/web.py:1305
 #, python-format
 msgid "Oops! There was an error sending this book: %(res)s"
 msgstr "Při odesílání této knihy došlo k chybě: %(res)s"
 
-#: cps/web.py:1310
+#: cps/web.py:1307
 msgid "Please update your profile with a valid Send to Kindle E-mail Address."
 msgstr "Nejprve nakonfigurujte vaši kindle e-mailovou adresu.."
 
-#: cps/web.py:1327
+#: cps/web.py:1324
 msgid "E-Mail server is not configured, please contact your administrator!"
 msgstr "E-mailový server není nakonfigurován, kontaktujte svého správce!"
 
-#: cps/web.py:1328 cps/web.py:1338 cps/web.py:1362 cps/web.py:1366
-#: cps/web.py:1371 cps/web.py:1375
+#: cps/web.py:1325 cps/web.py:1335 cps/web.py:1359 cps/web.py:1363
+#: cps/web.py:1368 cps/web.py:1372
 msgid "register"
 msgstr "registrovat"
 
-#: cps/web.py:1364
+#: cps/web.py:1361
 msgid "Your e-mail is not allowed to register"
 msgstr "Váš e-mail nemá povolení k registraci"
 
-#: cps/web.py:1367
+#: cps/web.py:1364
 msgid "Confirmation e-mail was send to your e-mail account."
 msgstr "Potvrzovací e-mail byl odeslán na váš účet."
 
-#: cps/web.py:1370
+#: cps/web.py:1367
 msgid "This username or e-mail address is already in use."
 msgstr "Toto uživatelské jméno nebo e-mailová adresa jsou již používány."
 
-#: cps/web.py:1387
+#: cps/web.py:1384
 msgid "Cannot activate LDAP authentication"
 msgstr "Nelze aktivovat ověření LDAP"
 
-#: cps/web.py:1404
+#: cps/web.py:1401
 #, python-format
 msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known"
-msgstr ""
+msgstr "Záložní přihlášení jako: ‘%(nickname)s’, server LDAP není dosažitelný nebo neznámý uživatel"
 
-#: cps/web.py:1410
+#: cps/web.py:1407
 #, python-format
 msgid "Could not login: %(message)s"
-msgstr ""
+msgstr "Nelze se přihlásit: %(message)s"
 
-#: cps/web.py:1414 cps/web.py:1438
+#: cps/web.py:1411 cps/web.py:1435
 msgid "Wrong Username or Password"
 msgstr "Špatné uživatelské jméno nebo heslo"
 
-#: cps/web.py:1421
+#: cps/web.py:1418
 msgid "New Password was send to your email address"
-msgstr "Nové heslo bylo zasláno na váši emailovou adresu"
+msgstr "Nové heslo bylo zasláno na vaši emailovou adresu"
 
-#: cps/web.py:1427
+#: cps/web.py:1424
 msgid "Please enter valid username to reset password"
 msgstr "Zadejte platné uživatelské jméno pro obnovení hesla"
 
-#: cps/web.py:1433
+#: cps/web.py:1430
 #, python-format
 msgid "You are now logged in as: '%(nickname)s'"
 msgstr "Nyní jste přihlášeni jako: '%(nickname)s'"
 
-#: cps/web.py:1442 cps/web.py:1469
+#: cps/web.py:1439 cps/web.py:1466
 msgid "login"
 msgstr "přihlásit se"
 
-#: cps/web.py:1481 cps/web.py:1515
+#: cps/web.py:1478 cps/web.py:1512
 msgid "Token not found"
 msgstr "Token nenalezen"
 
-#: cps/web.py:1490 cps/web.py:1523
+#: cps/web.py:1487 cps/web.py:1520
 msgid "Token has expired"
 msgstr "Token vypršel"
 
-#: cps/web.py:1499
+#: cps/web.py:1496
 msgid "Success! Please return to your device"
 msgstr "Úspěch! Vraťte se prosím do zařízení"
 
-#: cps/web.py:1580 cps/web.py:1625 cps/web.py:1631
+#: cps/web.py:1577 cps/web.py:1622 cps/web.py:1628
 #, python-format
 msgid "%(name)s's profile"
 msgstr "%(name)s profil"
 
-#: cps/web.py:1627
+#: cps/web.py:1624
 msgid "Profile updated"
 msgstr "Profil aktualizován"
 
-#: cps/web.py:1656 cps/web.py:1659 cps/web.py:1662 cps/web.py:1669
-#: cps/web.py:1674
+#: cps/web.py:1653 cps/web.py:1656 cps/web.py:1659 cps/web.py:1666
+#: cps/web.py:1671
 msgid "Read a Book"
 msgstr "Číst knihu"
 
 #: cps/worker.py:313
 #, python-format
 msgid "Calibre ebook-convert %(tool)s not found"
-msgstr ""
+msgstr "Calibre převaděč %(tool)s nenalezen"
 
 #: cps/worker.py:373
 #, python-format
@@ -1106,16 +1112,16 @@ msgstr "Převaděč eknih selhal: %(error)s"
 #: cps/worker.py:406
 #, python-format
 msgid "Kepubify-converter failed: %(error)s"
-msgstr ""
+msgstr "Kepubify-převaděč selhal: %(error)s"
 
 #: cps/worker.py:430
 #, python-format
 msgid "Converted file not found or more than one file in folder %(folder)s"
-msgstr ""
+msgstr "Převedený soubor nebyl nalezen nebo více než jeden soubor ve složce %(folder)s"
 
 #: cps/templates/admin.html:9
 msgid "Users"
-msgstr "Seznam uživatelů"
+msgstr "Uživatelé"
 
 #: cps/templates/admin.html:12 cps/templates/login.html:8
 #: cps/templates/login.html:9 cps/templates/register.html:8
@@ -1130,11 +1136,11 @@ msgstr "E-mail"
 
 #: cps/templates/admin.html:14 cps/templates/user_edit.html:27
 msgid "Send to Kindle E-mail Address"
-msgstr "Kindle"
+msgstr "Poslat do Kindle e-mailová adresa"
 
 #: cps/templates/admin.html:15
 msgid "Downloads"
-msgstr "Staženo"
+msgstr "Stáhnutí"
 
 #: cps/templates/admin.html:16 cps/templates/layout.html:77
 msgid "Admin"
@@ -1157,7 +1163,7 @@ msgstr "Stahovat"
 
 #: cps/templates/admin.html:20
 msgid "View Books"
-msgstr ""
+msgstr "Prohlížení knih"
 
 #: cps/templates/admin.html:21
 msgid "Edit"
@@ -1171,15 +1177,15 @@ msgstr "Smazat"
 
 #: cps/templates/admin.html:23
 msgid "Public Shelf"
-msgstr ""
+msgstr "Veřejná police"
 
 #: cps/templates/admin.html:44
 msgid "Add New User"
-msgstr ""
+msgstr "Přidat nového uživatele"
 
 #: cps/templates/admin.html:46 cps/templates/admin.html:47
 msgid "Import LDAP Users"
-msgstr ""
+msgstr "Importovat LDAP uživatele"
 
 #: cps/templates/admin.html:54
 msgid "E-mail Server Settings"
@@ -1195,7 +1201,7 @@ msgstr "SMTP port"
 
 #: cps/templates/admin.html:59 cps/templates/email_edit.html:19
 msgid "Encryption"
-msgstr "SSL"
+msgstr "Šifrování"
 
 #: cps/templates/admin.html:60 cps/templates/email_edit.html:27
 msgid "SMTP Login"
@@ -1239,7 +1245,7 @@ msgstr "Veřejná registrace"
 
 #: cps/templates/admin.html:110
 msgid "Magic Link Remote Login"
-msgstr "Vzdálené přihlášení"
+msgstr "Magic Link vzdálené přihlášení"
 
 #: cps/templates/admin.html:114
 msgid "Reverse Proxy Login"
@@ -1251,11 +1257,11 @@ msgstr "Název záhlaví reverzního prixy"
 
 #: cps/templates/admin.html:124
 msgid "Edit Basic Configuration"
-msgstr ""
+msgstr "Upravit základní konfiguraci"
 
 #: cps/templates/admin.html:125
 msgid "Edit UI Configuration"
-msgstr ""
+msgstr "Upravit konfiguraci uživatelského rozhraní"
 
 #: cps/templates/admin.html:131
 msgid "Administration"
@@ -1267,15 +1273,15 @@ msgstr "Zobrazit log"
 
 #: cps/templates/admin.html:133
 msgid "Reconnect Calibre Database"
-msgstr "Znovupřipojení ke Calibre DB"
+msgstr "Znovupřipojení ke Calibre databázi"
 
 #: cps/templates/admin.html:134
 msgid "Restart"
-msgstr "Restartovat Calibre-Web"
+msgstr "Restartovat"
 
 #: cps/templates/admin.html:135
 msgid "Shutdown"
-msgstr "Zastavit Calibre-Web"
+msgstr "Vypnout"
 
 #: cps/templates/admin.html:141
 msgid "Update"
@@ -1303,7 +1309,7 @@ msgstr "Provést aktualizaci"
 
 #: cps/templates/admin.html:171
 msgid "Are you sure you want to restart?"
-msgstr "Opravdu chcete restartovat Calibre-Web?"
+msgstr "Opravdu chcete restartovat?"
 
 #: cps/templates/admin.html:176 cps/templates/admin.html:190
 #: cps/templates/admin.html:210 cps/templates/shelf.html:72
@@ -1317,11 +1323,11 @@ msgstr "OK"
 #: cps/templates/shelf.html:73 cps/templates/shelf_edit.html:19
 #: cps/templates/user_edit.html:139
 msgid "Cancel"
-msgstr ""
+msgstr "Zrušit"
 
 #: cps/templates/admin.html:189
 msgid "Are you sure you want to shutdown?"
-msgstr "Opravdu chcete zastavit Calibre-Web?"
+msgstr "Opravdu chcete vypnout?"
 
 #: cps/templates/admin.html:201
 msgid "Updating, please do not reload this page"
@@ -1396,23 +1402,23 @@ msgstr "Popis"
 
 #: cps/templates/book_edit.html:66
 msgid "Identifiers"
-msgstr ""
+msgstr "Identifikátory"
 
 #: cps/templates/book_edit.html:70 cps/templates/book_edit.html:308
 msgid "Identifier Type"
-msgstr ""
+msgstr "Typy identifikátorů"
 
 #: cps/templates/book_edit.html:71 cps/templates/book_edit.html:309
 msgid "Identifier Value"
-msgstr ""
+msgstr "Hodnota identifikátorů"
 
 #: cps/templates/book_edit.html:72 cps/templates/book_edit.html:310
 msgid "Remove"
-msgstr ""
+msgstr "Odstranit"
 
 #: cps/templates/book_edit.html:76
 msgid "Add Identifier"
-msgstr ""
+msgstr "Přidat identifikátor"
 
 #: cps/templates/book_edit.html:80 cps/templates/search_form.html:33
 msgid "Tags"
@@ -1420,7 +1426,7 @@ msgstr "Štítky"
 
 #: cps/templates/book_edit.html:88
 msgid "Series ID"
-msgstr ""
+msgstr "ID série"
 
 #: cps/templates/book_edit.html:92
 msgid "Rating"
@@ -1463,7 +1469,7 @@ msgstr "Nahrát formát"
 
 #: cps/templates/book_edit.html:182
 msgid "View Book on Save"
-msgstr "zobrazit knihu po úpravě"
+msgstr "Zobrazit knihu po uložení"
 
 #: cps/templates/book_edit.html:185 cps/templates/book_edit.html:229
 msgid "Fetch Metadata"
@@ -1473,7 +1479,7 @@ msgstr "Získat metadata"
 #: cps/templates/config_view_edit.html:150 cps/templates/email_edit.html:45
 #: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:137
 msgid "Save"
-msgstr ""
+msgstr "Uložit"
 
 #: cps/templates/book_edit.html:200
 msgid "Are you really sure?"
@@ -1481,7 +1487,7 @@ msgstr "Jste si opravdu jisti?"
 
 #: cps/templates/book_edit.html:204
 msgid "This book will be permanently erased from database"
-msgstr "Kniha bude smazána z Calibre databáze"
+msgstr "Tato kniha bude trvale odstraněna z databáze"
 
 #: cps/templates/book_edit.html:205
 msgid "and hard disk"
@@ -1489,11 +1495,11 @@ msgstr "a z hard disku"
 
 #: cps/templates/book_edit.html:209
 msgid "Important Kobo Note: deleted books will remain on any paired Kobo device."
-msgstr ""
+msgstr "Důležitá Kobo poznámka: smazané knihy zůstanou na jakémkoli spárovaném zařízení Kobo."
 
 #: cps/templates/book_edit.html:210
 msgid "Books must first be archived and the device synced before a book can safely be deleted."
-msgstr ""
+msgstr "Knihy musí být nejprve archivovány a zařízení musí být synchronizováno, než bude kniha bezpečně smazána."
 
 #: cps/templates/book_edit.html:232
 msgid "Keyword"
@@ -1505,7 +1511,7 @@ msgstr "Hledat klíčové slovo"
 
 #: cps/templates/book_edit.html:239
 msgid "Click the cover to load metadata to the form"
-msgstr "Klepnutím na obal načtěte metadata do formuláře"
+msgstr "Kliknutím na obal načtěte metadata do formuláře"
 
 #: cps/templates/book_edit.html:254 cps/templates/book_edit.html:294
 msgid "Loading..."
@@ -1535,7 +1541,7 @@ msgstr "Konfigurace knihovny"
 
 #: cps/templates/config_edit.html:19
 msgid "Location of Calibre Database"
-msgstr ""
+msgstr "Umístění Calibre databáze"
 
 #: cps/templates/config_edit.html:28
 msgid "Use Google Drive?"
@@ -1587,7 +1593,7 @@ msgstr "Umístění souboru s klíčem SSL (ponechte prázdné pro servery jiné
 
 #: cps/templates/config_edit.html:108
 msgid "Update Channel"
-msgstr "Aktualizovat kanál"
+msgstr "Aktualizační kanál"
 
 #: cps/templates/config_edit.html:110
 msgid "Stable"
@@ -1623,7 +1629,7 @@ msgstr "Povolit nahrávání"
 
 #: cps/templates/config_edit.html:169
 msgid "Allowed Upload Fileformats"
-msgstr ""
+msgstr "Povolené nahrávání formátů souborů"
 
 #: cps/templates/config_edit.html:175
 msgid "Enable Anonymous Browsing"
@@ -1635,19 +1641,19 @@ msgstr "Povolit veřejnou registraci"
 
 #: cps/templates/config_edit.html:184
 msgid "Use E-Mail as Username"
-msgstr ""
+msgstr "Použít e-mail jako přezdívku"
 
 #: cps/templates/config_edit.html:189
 msgid "Enable Magic Link Remote Login"
-msgstr "Povolit vzdálené přihlášení (\\\"magic link\\\")"
+msgstr "Povolit Magic Link vzdálené přihlášení"
 
 #: cps/templates/config_edit.html:194
 msgid "Enable Kobo sync"
-msgstr ""
+msgstr "Povolit Kobo synchronizaci"
 
 #: cps/templates/config_edit.html:199
 msgid "Proxy unknown requests to Kobo Store"
-msgstr ""
+msgstr "Proxy neznámé požadavky na obchod Kobo"
 
 #: cps/templates/config_edit.html:206
 msgid "Use Goodreads"
@@ -1663,7 +1669,7 @@ msgstr "Goodreads API Klíč"
 
 #: cps/templates/config_edit.html:215
 msgid "Goodreads API Secret"
-msgstr "Goodreads API Secret"
+msgstr "Goodreads API tajemství"
 
 #: cps/templates/config_edit.html:222
 msgid "Allow Reverse Proxy Authentication"
@@ -1699,7 +1705,7 @@ msgstr "LDAP Server Port"
 
 #: cps/templates/config_edit.html:255
 msgid "LDAP Encryption"
-msgstr ""
+msgstr "LDAP Šifrování"
 
 #: cps/templates/config_edit.html:257 cps/templates/config_view_edit.html:61
 #: cps/templates/email_edit.html:21
@@ -1708,31 +1714,31 @@ msgstr "Žádné"
 
 #: cps/templates/config_edit.html:258
 msgid "TLS"
-msgstr ""
+msgstr "TLS"
 
 #: cps/templates/config_edit.html:259
 msgid "SSL"
-msgstr ""
+msgstr "SSL"
 
 #: cps/templates/config_edit.html:264
 msgid "LDAP Certificate Path"
-msgstr ""
+msgstr "Cesta certifikátu LDAP"
 
 #: cps/templates/config_edit.html:269
 msgid "LDAP Authentication"
-msgstr ""
+msgstr "LDAP Ověření"
 
 #: cps/templates/config_edit.html:271
 msgid "Anonymous"
-msgstr ""
+msgstr "Anonymní"
 
 #: cps/templates/config_edit.html:272
 msgid "Unauthenticated"
-msgstr ""
+msgstr "Neověřeno"
 
 #: cps/templates/config_edit.html:273
 msgid "Simple"
-msgstr ""
+msgstr "Jednoduché"
 
 #: cps/templates/config_edit.html:278
 msgid "LDAP Administrator Username"
@@ -1756,24 +1762,24 @@ msgstr "Server LDAP je OpenLDAP?"
 
 #: cps/templates/config_edit.html:300
 msgid "Following Settings are Needed For User Import"
-msgstr ""
+msgstr "Následující nastavení jsou potřeba pro import uživatele"
 
 #: cps/templates/config_edit.html:302
 msgid "LDAP Group Object Filter"
-msgstr ""
+msgstr "Filtr objektů skupiny LDAP"
 
 #: cps/templates/config_edit.html:306
 msgid "LDAP Group Name"
-msgstr ""
+msgstr "Jméno skupiny LDAP"
 
 #: cps/templates/config_edit.html:310
 msgid "LDAP Group Members Field"
-msgstr ""
+msgstr "Pole členů skupiny LDAP"
 
 #: cps/templates/config_edit.html:319
 #, python-format
 msgid "Obtain %(provider)s OAuth Credential"
-msgstr "Obtain %(provider)s OAuth Credential"
+msgstr "Získat %(provider)s OAuth pověření"
 
 #: cps/templates/config_edit.html:322
 #, python-format
@@ -1791,15 +1797,15 @@ msgstr "Externí binární soubory"
 
 #: cps/templates/config_edit.html:348
 msgid "Path to Calibre E-Book Converter"
-msgstr "Poloha Calibre E-Book Converteru"
+msgstr "Cesta k převaděči e-knih Calibre"
 
 #: cps/templates/config_edit.html:356
 msgid "Calibre E-Book Converter Settings"
-msgstr "Nastevní Calibre E-Book Converter"
+msgstr "Nastavení převaděče e-knih Calibre"
 
 #: cps/templates/config_edit.html:359
 msgid "Path to Kepubify E-Book Converter"
-msgstr "Poloha Kepubify E-Book Converter"
+msgstr "Cesta k převaděči e-knih Kepubify"
 
 #: cps/templates/config_edit.html:367
 msgid "Location of Unrar binary"
@@ -1824,7 +1830,7 @@ msgstr "Počet náhodných knih k zobrazení"
 
 #: cps/templates/config_view_edit.html:35
 msgid "No. of Authors to Display Before Hiding (0=Disable Hiding)"
-msgstr "Počet autorů k zobrazení před skrytím (0 = zakázat skrytí)"
+msgstr "Počet autorů k zobrazení před skrytím (0 = Zakázat skrytí)"
 
 #: cps/templates/config_view_edit.html:39 cps/templates/readcbr.html:112
 msgid "Theme"
@@ -1848,7 +1854,7 @@ msgstr "Propojit stav čtení/nepřečtení do sloupce Calibre"
 
 #: cps/templates/config_view_edit.html:59
 msgid "View Restrictions based on Calibre column"
-msgstr "Zobrazit omezení podle sloupku Calibre"
+msgstr "Zobrazit omezení podle Calibre sloupce"
 
 #: cps/templates/config_view_edit.html:68
 msgid "Regular Expression for Title Sorting"
@@ -1904,7 +1910,7 @@ msgstr "Přidat povolené/zakázané štítky"
 
 #: cps/templates/config_view_edit.html:145
 msgid "Add Allowed/Denied custom column values"
-msgstr ""
+msgstr "Přidat povolené/zakázané hodnoty vlastních sloupců"
 
 #: cps/templates/detail.html:59
 msgid "Read in Browser"
@@ -1982,7 +1988,7 @@ msgstr "SMTP heslo"
 
 #: cps/templates/email_edit.html:38
 msgid "Attachment Size Limit"
-msgstr "Limit velikosti souboru:"
+msgstr "Limit velikosti souboru"
 
 #: cps/templates/email_edit.html:46
 msgid "Save and Send Test E-mail"
@@ -2086,7 +2092,7 @@ msgstr "Knihy řazené podle hodnocení"
 
 #: cps/templates/index.xml:108
 msgid "Books ordered by file formats"
-msgstr "Knihy seřazené podle soboru formátů"
+msgstr "Knihy seřazené podle souboru formátů"
 
 #: cps/templates/index.xml:111 cps/templates/layout.html:135
 msgid "Shelves"
@@ -2111,7 +2117,7 @@ msgstr "Přepnout navigaci"
 
 #: cps/templates/layout.html:46
 msgid "Search Library"
-msgstr "Hledat ve knihovnÄ›"
+msgstr "Hledat v knihovnÄ›"
 
 #: cps/templates/layout.html:56
 msgid "Advanced Search"
@@ -2140,7 +2146,7 @@ msgstr "Nahrávání..."
 
 #: cps/templates/layout.html:118
 msgid "Please do not refresh the page"
-msgstr "prosím neobnovujte stránku"
+msgstr "Prosím neobnovujte stránku"
 
 #: cps/templates/layout.html:128
 msgid "Browse"
@@ -2152,7 +2158,7 @@ msgstr "Vaše police"
 
 #: cps/templates/layout.html:145 cps/templates/stats.html:3
 msgid "About"
-msgstr "O Calibre-Web"
+msgstr "O knihovnÄ›"
 
 #: cps/templates/layout.html:159
 msgid "Previous"
@@ -2176,11 +2182,11 @@ msgstr "Zapamatovat si"
 
 #: cps/templates/login.html:22
 msgid "Forgot Password?"
-msgstr "Zapomenuté heslo"
+msgstr "Zapomenuté heslo?"
 
 #: cps/templates/login.html:25
 msgid "Log in with Magic Link"
-msgstr "Přihlásit se pomocí magického odkazu"
+msgstr "Přihlásit se pomocí Magic Link"
 
 #: cps/templates/logviewer.html:6
 msgid "Show Calibre-Web Log: "
@@ -2192,7 +2198,7 @@ msgstr "Calibre-Web log: "
 
 #: cps/templates/logviewer.html:8
 msgid "Stream output, can't be displayed"
-msgstr ""
+msgstr "Streamový výstup, nelze zobrazit"
 
 #: cps/templates/logviewer.html:12
 msgid "Show Access Log: "
@@ -2200,19 +2206,19 @@ msgstr "Zobrazit log přístupu: "
 
 #: cps/templates/modal_restriction.html:6
 msgid "Select Allowed/Denied Tags"
-msgstr ""
+msgstr "Vybrat povolené/zakázané štítky"
 
 #: cps/templates/modal_restriction.html:7
 msgid "Select Allowed/Denied Custom Column Values"
-msgstr ""
+msgstr "Vybrat povolené/zakázané hodnoty vlastních sloupců"
 
 #: cps/templates/modal_restriction.html:8
 msgid "Select Allowed/Denied Tags of User"
-msgstr ""
+msgstr "Vybrat povolené/zakázané uživatelské štítky"
 
 #: cps/templates/modal_restriction.html:9
 msgid "Select Allowed/Denied Custom Column Values of User"
-msgstr ""
+msgstr "Vybrat povolené/zakázané hodnoty vlastních sloupců uživatele"
 
 #: cps/templates/modal_restriction.html:15
 msgid "Enter Tag"
@@ -2348,11 +2354,11 @@ msgstr "Vaše e-mailová adresa"
 
 #: cps/templates/remote_login.html:4
 msgid "Magic Link - Authorise New Device"
-msgstr "Kouzelný odkaz - Schválit nové zařízení"
+msgstr "Magic Link - Schválit nové zařízení"
 
 #: cps/templates/remote_login.html:6
 msgid "On another device, login and visit:"
-msgstr "Použijte své druhé zařízení, přihlaste se a navštivte"
+msgstr "Použijte své druhé zařízení, přihlaste se a navštivte:"
 
 #: cps/templates/remote_login.html:10
 msgid "Once verified, you will automatically be logged in on this device."
@@ -2360,11 +2366,11 @@ msgstr "Jakmile tak učiníte, budete automaticky přihlášeni na tomto zaříz
 
 #: cps/templates/remote_login.html:13
 msgid "This verification link will expire in 10 minutes."
-msgstr "Odkaz vyprší za 10 minut"
+msgstr "Tento ověřovací odkaz vyprší za 10 minut."
 
 #: cps/templates/search.html:5
 msgid "No Results Found"
-msgstr "Žádné výsledky pro:"
+msgstr "Nenalezeny žádné výsledky"
 
 #: cps/templates/search.html:6
 msgid "Search Term:"
@@ -2428,11 +2434,11 @@ msgstr "Jste si jisti, že chcete odstranit tuto polici?"
 
 #: cps/templates/shelf.html:70
 msgid "Shelf will be deleted for all users"
-msgstr "Police budou ztracena pro všechny a navždy!"
+msgstr "Police bude smazána pro všechny uživatele"
 
 #: cps/templates/shelf_edit.html:13
 msgid "Share with Everyone"
-msgstr "měla by být police veřejná?"
+msgstr "Sdílet se všemi"
 
 #: cps/templates/shelf_order.html:5
 msgid "Drag to Rearrange Order"
@@ -2440,7 +2446,7 @@ msgstr "Přetažením uspořádáte pořadí"
 
 #: cps/templates/stats.html:7
 msgid "Library Statistics"
-msgstr "Statistika knihovny Calibre"
+msgstr "Statistika knihovny"
 
 #: cps/templates/stats.html:12
 msgid "Books in this Library"
@@ -2528,15 +2534,15 @@ msgstr "Odpojit"
 
 #: cps/templates/user_edit.html:63
 msgid "Kobo Sync Token"
-msgstr "Kobo Sync TOken"
+msgstr "Kobo Sync token"
 
 #: cps/templates/user_edit.html:65
 msgid "Create/View"
-msgstr "Nové/Otevřít"
+msgstr "Vytvořit/Prohlížet"
 
 #: cps/templates/user_edit.html:86
 msgid "Add allowed/Denied Custom Column Values"
-msgstr ""
+msgstr "Přidat povolené/zakázané hodnoty vlastních sloupců"
 
 #: cps/templates/user_edit.html:131
 msgid "Delete User"
@@ -2552,5 +2558,5 @@ msgstr "Vygenerovat URL pro Kobo Auth"
 
 #: cps/templates/user_edit.html:178
 msgid "Do you really want to delete the Kobo Token?"
-msgstr "Chcete opravdu odstranit Kobo Token?"
+msgstr "Opravdu chcete odstranit Kobo token?"
 
diff --git a/cps/translations/de/LC_MESSAGES/messages.mo b/cps/translations/de/LC_MESSAGES/messages.mo
index 7d06c8baf57ce14de660edede5b04c1ba0e354f6..8cda8251b51733190c8e31fe9cacf0e4d1ee9541 100644
Binary files a/cps/translations/de/LC_MESSAGES/messages.mo and b/cps/translations/de/LC_MESSAGES/messages.mo differ
diff --git a/cps/translations/de/LC_MESSAGES/messages.po b/cps/translations/de/LC_MESSAGES/messages.po
index 536938e3c6dcf579bc8d7ce116c241fb1ee0b740..a1372adbf0f4532e2d0a8c79f09156d5099278a8 100644
--- a/cps/translations/de/LC_MESSAGES/messages.po
+++ b/cps/translations/de/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version:  Calibre-Web\n"
 "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
-"POT-Creation-Date: 2020-06-07 06:47+0200\n"
+"POT-Creation-Date: 2020-06-28 09:31+0200\n"
 "PO-Revision-Date: 2020-06-02 20:57+0200\n"
 "Last-Translator: Ozzie Isaacs\n"
 "Language: de\n"
@@ -46,9 +46,9 @@ msgstr "Erfolgreich neu verbunden"
 msgid "Unknown command"
 msgstr "Unbekannter Befehl"
 
-#: cps/admin.py:116 cps/editbooks.py:563 cps/editbooks.py:573
-#: cps/editbooks.py:667 cps/editbooks.py:669 cps/editbooks.py:730
-#: cps/editbooks.py:743 cps/updater.py:509 cps/uploader.py:97
+#: cps/admin.py:116 cps/editbooks.py:564 cps/editbooks.py:576
+#: cps/editbooks.py:670 cps/editbooks.py:672 cps/editbooks.py:733
+#: cps/editbooks.py:749 cps/updater.py:509 cps/uploader.py:97
 #: cps/uploader.py:107
 msgid "Unknown"
 msgstr "Unbekannt"
@@ -61,7 +61,7 @@ msgstr "Admin Seite"
 msgid "UI Configuration"
 msgstr "Benutzeroberflächenkonfiguration"
 
-#: cps/admin.py:189 cps/admin.py:706
+#: cps/admin.py:189 cps/admin.py:711
 msgid "Calibre-Web configuration updated"
 msgstr "Konfiguration von Calibre-Web wurde aktualisiert"
 
@@ -113,175 +113,181 @@ msgstr "LDAP Benutzer Objekt Filter hat ungleiche Anzahl von Klammern"
 msgid "LDAP Certificate Location is not Valid, Please Enter Correct Path"
 msgstr "LDAP Zertifikat Pfad ist ungültig, bitte einen gültigen Pfad angeben"
 
-#: cps/admin.py:627
+#: cps/admin.py:628
 msgid "Keyfile Location is not Valid, Please Enter Correct Path"
 msgstr "Schlüsseldatei ist ungültig, bitte einen gültigen Pfad angeben"
 
-#: cps/admin.py:631
+#: cps/admin.py:632
 msgid "Certfile Location is not Valid, Please Enter Correct Path"
 msgstr "Zertifikatsdatei ist ungültig, bitte einen gültigen Pfad angeben"
 
-#: cps/admin.py:701
+#: cps/admin.py:694 cps/admin.py:793 cps/admin.py:885 cps/admin.py:934
+#: cps/shelf.py:100 cps/shelf.py:161 cps/shelf.py:202 cps/shelf.py:260
+#: cps/shelf.py:309 cps/shelf.py:338 cps/shelf.py:368 cps/shelf.py:392
+msgid "Settings DB is not Writeable"
+msgstr ""
+
+#: cps/admin.py:706
 msgid "DB Location is not Valid, Please Enter Correct Path"
 msgstr "DB Pfad ist nicht gültig, bitte einen gültigen Pfad angeben"
 
-#: cps/admin.py:703
+#: cps/admin.py:708
 msgid "DB is not Writeable"
 msgstr "Datenbank ist nicht schreibbar"
 
-#: cps/admin.py:736
+#: cps/admin.py:741
 msgid "Basic Configuration"
 msgstr "Basiskonfiguration"
 
-#: cps/admin.py:751 cps/web.py:1337
+#: cps/admin.py:756 cps/web.py:1334
 msgid "Please fill out all fields!"
 msgstr "Bitte alle Felder ausfüllen!"
 
-#: cps/admin.py:754 cps/admin.py:766 cps/admin.py:772 cps/admin.py:892
+#: cps/admin.py:759 cps/admin.py:771 cps/admin.py:777 cps/admin.py:903
 msgid "Add new user"
 msgstr "Neuen Benutzer hinzufügen"
 
-#: cps/admin.py:763 cps/web.py:1578
+#: cps/admin.py:768 cps/web.py:1575
 msgid "E-mail is not from valid domain"
 msgstr "E-Mail bezieht sich nicht auf eine gültige Domain"
 
-#: cps/admin.py:770 cps/admin.py:785
+#: cps/admin.py:775 cps/admin.py:790
 msgid "Found an existing account for this e-mail address or nickname."
 msgstr "Es existiert bereits ein Account für diese E-Mailadresse oder diesen Benutzernamen."
 
-#: cps/admin.py:781
+#: cps/admin.py:786
 #, python-format
 msgid "User '%(user)s' created"
 msgstr "Benutzer '%(user)s' angelegt"
 
-#: cps/admin.py:794
+#: cps/admin.py:802
 #, python-format
 msgid "User '%(nick)s' deleted"
 msgstr "Benutzer '%(nick)s' gelöscht"
 
-#: cps/admin.py:797
+#: cps/admin.py:805
 msgid "No admin user remaining, can't delete user"
 msgstr "Benutzer kann nicht gelöscht werden, es wäre kein Admin Benutzer übrig"
 
-#: cps/admin.py:803
+#: cps/admin.py:811
 msgid "No admin user remaining, can't remove admin role"
 msgstr "Kein Admin Benutzer verblieben Admin Berechtigung kann nicht entfernt werden"
 
-#: cps/admin.py:839 cps/web.py:1621
+#: cps/admin.py:847 cps/web.py:1618
 msgid "Found an existing account for this e-mail address."
 msgstr "Es existiert bereits ein Benutzer für diese E-Mailadresse."
 
-#: cps/admin.py:849 cps/admin.py:864 cps/admin.py:967 cps/web.py:1596
+#: cps/admin.py:857 cps/admin.py:872 cps/admin.py:983 cps/web.py:1593
 #, python-format
 msgid "Edit User %(nick)s"
 msgstr "Benutzer %(nick)s bearbeiten"
 
-#: cps/admin.py:855 cps/web.py:1588
+#: cps/admin.py:863 cps/web.py:1585
 msgid "This username is already taken"
 msgstr "Benutzername ist schon vorhanden"
 
-#: cps/admin.py:871
+#: cps/admin.py:879
 #, python-format
 msgid "User '%(nick)s' updated"
 msgstr "Benutzer '%(nick)s' aktualisiert"
 
-#: cps/admin.py:874
+#: cps/admin.py:882
 msgid "An unknown error occured."
 msgstr "Es ist ein unbekannter Fehler aufgetreten."
 
-#: cps/admin.py:901 cps/templates/admin.html:71
+#: cps/admin.py:912 cps/templates/admin.html:71
 msgid "Edit E-mail Server Settings"
 msgstr "SMTP-Einstellungen ändern"
 
-#: cps/admin.py:925
+#: cps/admin.py:941
 #, python-format
 msgid "Test e-mail successfully send to %(kindlemail)s"
 msgstr "Test-E-Mail wurde erfolgreich an %(kindlemail)s versendet"
 
-#: cps/admin.py:928
+#: cps/admin.py:944
 #, python-format
 msgid "There was an error sending the Test e-mail: %(res)s"
 msgstr "Es trat ein Fehler beim Versenden der Test-E-Mail auf: %(res)s"
 
-#: cps/admin.py:930
+#: cps/admin.py:946
 msgid "Please configure your e-mail address first..."
 msgstr "Bitte zuerst E-Mail Adresse konfigurieren..."
 
-#: cps/admin.py:932
+#: cps/admin.py:948
 msgid "E-mail server settings updated"
 msgstr "Einstellungen des E-Mail-Servers aktualisiert"
 
-#: cps/admin.py:943
+#: cps/admin.py:959
 msgid "User not found"
 msgstr "Benutzer nicht gefunden"
 
-#: cps/admin.py:978
+#: cps/admin.py:994
 #, python-format
 msgid "Password for user %(user)s reset"
 msgstr "Passwort für Benutzer %(user)s wurde zurückgesetzt"
 
-#: cps/admin.py:981 cps/web.py:1361 cps/web.py:1425
+#: cps/admin.py:997 cps/web.py:1358 cps/web.py:1422
 msgid "An unknown error occurred. Please try again later."
 msgstr "Es ist ein unbekannter Fehler aufgetreten. Bitte später erneut versuchen."
 
-#: cps/admin.py:984 cps/web.py:1299
+#: cps/admin.py:1000 cps/web.py:1296
 msgid "Please configure the SMTP mail settings first..."
 msgstr "Bitte zuerst die SMTP-Einstellung konfigurieren ..."
 
-#: cps/admin.py:996
+#: cps/admin.py:1012
 msgid "Logfile viewer"
 msgstr "Logdatei Anzeige"
 
-#: cps/admin.py:1035
+#: cps/admin.py:1051
 msgid "Requesting update package"
 msgstr "Frage Update an"
 
-#: cps/admin.py:1036
+#: cps/admin.py:1052
 msgid "Downloading update package"
 msgstr "Lade Update herunter"
 
-#: cps/admin.py:1037
+#: cps/admin.py:1053
 msgid "Unzipping update package"
 msgstr "Entpacke Update"
 
-#: cps/admin.py:1038
+#: cps/admin.py:1054
 msgid "Replacing files"
 msgstr "Ersetze Dateien"
 
-#: cps/admin.py:1039
+#: cps/admin.py:1055
 msgid "Database connections are closed"
 msgstr "Schließe Datenbankverbindungen"
 
-#: cps/admin.py:1040
+#: cps/admin.py:1056
 msgid "Stopping server"
 msgstr "Stoppe Server"
 
-#: cps/admin.py:1041
+#: cps/admin.py:1057
 msgid "Update finished, please press okay and reload page"
 msgstr "Update abgeschlossen, bitte okay drücken und Seite neu laden"
 
-#: cps/admin.py:1042 cps/admin.py:1043 cps/admin.py:1044 cps/admin.py:1045
-#: cps/admin.py:1046
+#: cps/admin.py:1058 cps/admin.py:1059 cps/admin.py:1060 cps/admin.py:1061
+#: cps/admin.py:1062
 msgid "Update failed:"
 msgstr "Update fehlgeschlagen:"
 
-#: cps/admin.py:1042 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
+#: cps/admin.py:1058 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
 msgid "HTTP Error"
 msgstr "HTTP Fehler"
 
-#: cps/admin.py:1043 cps/updater.py:321 cps/updater.py:524
+#: cps/admin.py:1059 cps/updater.py:321 cps/updater.py:524
 msgid "Connection error"
 msgstr "Verbindungsfehler"
 
-#: cps/admin.py:1044 cps/updater.py:323 cps/updater.py:526
+#: cps/admin.py:1060 cps/updater.py:323 cps/updater.py:526
 msgid "Timeout while establishing connection"
 msgstr "Timeout beim Verbindungsaufbau"
 
-#: cps/admin.py:1045 cps/updater.py:325 cps/updater.py:528
+#: cps/admin.py:1061 cps/updater.py:325 cps/updater.py:528
 msgid "General error"
 msgstr "Allgemeiner Fehler"
 
-#: cps/admin.py:1046
+#: cps/admin.py:1062
 msgid "Update File Could Not be Saved in Temp Dir"
 msgstr "Updatedatei konnte nicht in Temporärem Ordner gespeichert werden"
 
@@ -301,8 +307,8 @@ msgstr "Buch Format erfolgreich gelöscht"
 msgid "Book Successfully Deleted"
 msgstr "Buch erfolgreich geschlöscht"
 
-#: cps/editbooks.py:254 cps/editbooks.py:548 cps/web.py:1644 cps/web.py:1685
-#: cps/web.py:1747
+#: cps/editbooks.py:254 cps/editbooks.py:549 cps/web.py:1641 cps/web.py:1682
+#: cps/web.py:1744
 msgid "Error opening eBook. File does not exist or file is not accessible"
 msgstr "Öffnen des Buchs fehlgeschlagen. Datei existiert nicht oder ist nicht zugänglich"
 
@@ -310,82 +316,82 @@ msgstr "Öffnen des Buchs fehlgeschlagen. Datei existiert nicht oder ist nicht z
 msgid "edit metadata"
 msgstr "Metadaten editieren"
 
-#: cps/editbooks.py:361
+#: cps/editbooks.py:360
 #, python-format
 msgid "%(langname)s is not a valid language"
 msgstr "%(langname)s ist keine gültige Sprache"
 
-#: cps/editbooks.py:467 cps/editbooks.py:712
+#: cps/editbooks.py:468 cps/editbooks.py:715
 #, python-format
 msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
 msgstr "Dateiendung '%(ext)s' kann nicht auf diesen Server hochgeladen werden"
 
-#: cps/editbooks.py:471 cps/editbooks.py:716
+#: cps/editbooks.py:472 cps/editbooks.py:719
 msgid "File to be uploaded must have an extension"
 msgstr "Dateien müssen eine Erweiterung haben, um hochgeladen zu werden"
 
-#: cps/editbooks.py:483 cps/editbooks.py:773
+#: cps/editbooks.py:484 cps/editbooks.py:779
 #, python-format
 msgid "Failed to create path %(path)s (Permission denied)."
 msgstr "Fehler beim Erzeugen des Pfads %(path)s (Zugriff verweigert)"
 
-#: cps/editbooks.py:488
+#: cps/editbooks.py:489
 #, python-format
 msgid "Failed to store file %(file)s."
 msgstr "Fehler beim Speichern der Datei %(file)s."
 
-#: cps/editbooks.py:506 cps/editbooks.py:864
+#: cps/editbooks.py:507 cps/editbooks.py:870
 #, python-format
 msgid "Database error: %(error)s."
 msgstr "Datenbankfehler: %(error)s."
 
-#: cps/editbooks.py:510
+#: cps/editbooks.py:511
 #, python-format
 msgid "File format %(ext)s added to %(book)s"
 msgstr "Dateiformat %(ext)s zu %(book)s hinzugefügt"
 
-#: cps/editbooks.py:653
+#: cps/editbooks.py:656
 msgid "Metadata successfully updated"
 msgstr "Metadaten wurden erfolgreich aktualisiert"
 
-#: cps/editbooks.py:662
+#: cps/editbooks.py:665
 msgid "Error editing book, please check logfile for details"
 msgstr "Fehler beim Editieren des Buchs, Details im Logfile"
 
-#: cps/editbooks.py:724
+#: cps/editbooks.py:727
 #, python-format
 msgid "File %(filename)s could not saved to temp dir"
 msgstr "Die Datei %(filename)s konnte nicht im temporären Ordner gespeichert werden"
 
-#: cps/editbooks.py:734
+#: cps/editbooks.py:737
 msgid "Uploaded book probably exists in the library, consider to change before upload new: "
 msgstr "Das hochgeladene Buch existiert evtl. schon in der Bibliothek: "
 
-#: cps/editbooks.py:780
+#: cps/editbooks.py:786
 #, python-format
 msgid "Failed to Move File %(file)s: %(error)s"
 msgstr "Fehler beim Verschieben der Datei %(file)s: %(error)s"
 
-#: cps/editbooks.py:836
+#: cps/editbooks.py:842
 #, python-format
 msgid "Failed to Move Cover File %(file)s: %(error)s"
 msgstr "Fehler beim Verschieben der Cover Datei %(file)s: %(error)s"
 
-#: cps/editbooks.py:850
+#: cps/editbooks.py:856
 #, python-format
 msgid "File %(file)s uploaded"
 msgstr "Datei %(file)s hochgeladen"
 
-#: cps/editbooks.py:876
+#: cps/editbooks.py:882
 msgid "Source or destination format for conversion missing"
 msgstr "Quell- oder Zielformat für Konvertierung fehlt"
 
-#: cps/editbooks.py:884
+#: cps/editbooks.py:890
 #, python-format
 msgid "Book successfully queued for converting to %(book_format)s"
 msgstr "Buch wurde erfolgreich für die Konvertierung nach %(book_format)s eingereiht"
 
-#: cps/editbooks.py:888
+#: cps/editbooks.py:894
 #, python-format
 msgid "There was an error converting this book: %(res)s"
 msgstr "Es trat ein Fehler beim Konvertieren des Buches auf: %(res)s"
@@ -499,71 +505,71 @@ msgstr "Datei %(file)s wurde nicht auf Google Drive gefunden"
 msgid "Book path %(path)s not found on Google Drive"
 msgstr "Buchpfad %(path)s wurde nicht auf Google Drive gefunden"
 
-#: cps/helper.py:542
+#: cps/helper.py:550
 msgid "Error Downloading Cover"
 msgstr "Fehler beim Herunterladen des Covers"
 
-#: cps/helper.py:545
+#: cps/helper.py:553
 msgid "Cover Format Error"
 msgstr "Coverdatei fehlerhaft"
 
-#: cps/helper.py:561
+#: cps/helper.py:569
 msgid "Failed to create path for cover"
 msgstr "Fehler beim Erzeugen des Ordners für die Coverdatei"
 
-#: cps/helper.py:566
+#: cps/helper.py:574
 msgid "Cover-file is not a valid image file, or could not be stored"
 msgstr "Cover Datei ist keine gültige Bilddatei, kann nicht gespeichert werden"
 
-#: cps/helper.py:577
+#: cps/helper.py:585
 msgid "Only jpg/jpeg/png/webp files are supported as coverfile"
 msgstr "Es werden nur jpg/jpeg/png/webp Dateien als Cover untertützt"
 
-#: cps/helper.py:591
+#: cps/helper.py:599
 msgid "Only jpg/jpeg files are supported as coverfile"
 msgstr "Es werden nur jpg/jpeg Dateien als Cover untertützt"
 
-#: cps/helper.py:640
+#: cps/helper.py:648
 msgid "Unrar binary file not found"
 msgstr "UnRar Programm nicht gefunden"
 
-#: cps/helper.py:654
+#: cps/helper.py:662
 msgid "Error excecuting UnRar"
 msgstr "Fehler beim ausführen von UnRar"
 
-#: cps/helper.py:710
+#: cps/helper.py:718
 msgid "Waiting"
 msgstr "Wartend"
 
-#: cps/helper.py:712
+#: cps/helper.py:720
 msgid "Failed"
 msgstr "Fehlgeschlagen"
 
-#: cps/helper.py:714
+#: cps/helper.py:722
 msgid "Started"
 msgstr "Gestartet"
 
-#: cps/helper.py:716
+#: cps/helper.py:724
 msgid "Finished"
 msgstr "Beendet"
 
-#: cps/helper.py:718
+#: cps/helper.py:726
 msgid "Unknown Status"
 msgstr "Unbekannter Status"
 
-#: cps/helper.py:723
+#: cps/helper.py:731
 msgid "E-mail: "
 msgstr "E-Mail: "
 
-#: cps/helper.py:725 cps/helper.py:729
+#: cps/helper.py:733 cps/helper.py:737
 msgid "Convert: "
 msgstr "Konvertiere: "
 
-#: cps/helper.py:727
+#: cps/helper.py:735
 msgid "Upload: "
 msgstr "Upload: "
 
-#: cps/helper.py:731
+#: cps/helper.py:739
 msgid "Unknown Task: "
 msgstr "Unbekannte Aufgabe: "
 
@@ -596,7 +602,7 @@ msgstr "Login mit Google fehlgeschlagen."
 msgid "Failed to fetch user info from Google."
 msgstr "Laden der Benutzerinformationen von Google fehlgeschlagen."
 
-#: cps/oauth_bb.py:225 cps/web.py:1397 cps/web.py:1537
+#: cps/oauth_bb.py:225 cps/web.py:1394 cps/web.py:1534
 #, python-format
 msgid "you are now logged in as: '%(nickname)s'"
 msgstr "Du bist nun eingeloggt als '%(nickname)s'"
@@ -633,218 +639,218 @@ msgstr "GitHub Oauth Fehler, bitte später erneut versuchen."
 msgid "Google Oauth error, please retry later."
 msgstr "Google Oauth Fehler, bitte später erneut versuchen."
 
-#: cps/shelf.py:66 cps/shelf.py:111
+#: cps/shelf.py:67 cps/shelf.py:120
 msgid "Invalid shelf specified"
 msgstr "Ungültiges Bücherregal angegeben"
 
-#: cps/shelf.py:72
+#: cps/shelf.py:73
 #, python-format
 msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s"
 msgstr "Du hast keine Berechtigung, ein Buch zu diesem Bücherregal hinzuzufügen: %(shelfname)s"
 
-#: cps/shelf.py:82
+#: cps/shelf.py:83
 #, python-format
 msgid "Book is already part of the shelf: %(shelfname)s"
 msgstr "Buch ist bereits Teil des Bücherregals %(shelfname)s"
 
-#: cps/shelf.py:97
+#: cps/shelf.py:106
 #, python-format
 msgid "Book has been added to shelf: %(sname)s"
 msgstr "Das Buch wurde dem Bücherregal %(sname)s hinzugefügt"
 
-#: cps/shelf.py:115
+#: cps/shelf.py:124
 #, python-format
 msgid "You are not allowed to add a book to the the shelf: %(name)s"
 msgstr "Dir ist es nicht erlaubt, ein Buch zum Bücherregal %(name)s  hinzuzufügen"
 
-#: cps/shelf.py:133
+#: cps/shelf.py:142
 #, python-format
 msgid "Books are already part of the shelf: %(name)s"
 msgstr "Bücher sind bereits Teil des Bücherregals %(name)s"
 
-#: cps/shelf.py:148
+#: cps/shelf.py:158
 #, python-format
 msgid "Books have been added to shelf: %(sname)s"
 msgstr "Bücher wurden zum Bücherregal %(sname)s hinzugefügt"
 
-#: cps/shelf.py:150
+#: cps/shelf.py:163
 #, python-format
 msgid "Could not add books to shelf: %(sname)s"
 msgstr "Bücher konnten nicht zum Bücherregal %(sname)s hinzugefügt werden"
 
-#: cps/shelf.py:188
+#: cps/shelf.py:208
 #, python-format
 msgid "Book has been removed from shelf: %(sname)s"
 msgstr "Das Buch wurde aus dem Bücherregal: %(sname)s entfernt"
 
-#: cps/shelf.py:196
+#: cps/shelf.py:216
 #, python-format
 msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
 msgstr "Dir ist es nicht erlaubt, Bücher aus dem Bücherregal %(sname)s zu entfernen"
 
-#: cps/shelf.py:220 cps/shelf.py:260
+#: cps/shelf.py:240 cps/shelf.py:284
 #, python-format
 msgid "A public shelf with the name '%(title)s' already exists."
 msgstr "Es existiert bereit ein öffentliches Bücherregal mit dem Name '%(title)s'."
 
-#: cps/shelf.py:229 cps/shelf.py:270
+#: cps/shelf.py:249 cps/shelf.py:294
 #, python-format
 msgid "A private shelf with the name '%(title)s' already exists."
 msgstr "Es existiert bereit ein privates Bücherregal mit dem Name '%(title)s'."
 
-#: cps/shelf.py:236
+#: cps/shelf.py:256
 #, python-format
 msgid "Shelf %(title)s created"
 msgstr "Bücherregal %(title)s erzeugt"
 
-#: cps/shelf.py:239 cps/shelf.py:284
+#: cps/shelf.py:263 cps/shelf.py:312
 msgid "There was an error"
 msgstr "Es trat ein Fehler auf"
 
-#: cps/shelf.py:240 cps/shelf.py:242 cps/templates/layout.html:144
+#: cps/shelf.py:264 cps/shelf.py:266 cps/templates/layout.html:144
 msgid "Create a Shelf"
 msgstr "Bücherregal erzeugen"
 
-#: cps/shelf.py:282
+#: cps/shelf.py:306
 #, python-format
 msgid "Shelf %(title)s changed"
 msgstr "Bücherregal %(title)s verändert"
 
-#: cps/shelf.py:285 cps/shelf.py:287
+#: cps/shelf.py:313 cps/shelf.py:315
 msgid "Edit a shelf"
 msgstr "Bücherregal editieren"
 
-#: cps/shelf.py:332
+#: cps/shelf.py:369
 #, python-format
 msgid "Shelf: '%(name)s'"
 msgstr "Bücherregal: '%(name)s'"
 
-#: cps/shelf.py:335
+#: cps/shelf.py:372
 msgid "Error opening shelf. Shelf does not exist or is not accessible"
 msgstr "Fehler beim Öffnen des Bücherregals. Bücherregal exisitert nicht oder ist nicht zugänglich"
 
-#: cps/shelf.py:368
+#: cps/shelf.py:409
 msgid "Hidden Book"
 msgstr "Verstecktes Buch"
 
-#: cps/shelf.py:373
+#: cps/shelf.py:414
 #, python-format
 msgid "Change order of Shelf: '%(name)s'"
 msgstr "Reihenfolge in Bücherregal '%(name)s' verändern"
 
-#: cps/ub.py:64
+#: cps/ub.py:65
 msgid "Recently Added"
 msgstr "Kürzlich hinzugefügt"
 
-#: cps/ub.py:66
+#: cps/ub.py:67
 msgid "Show recent books"
 msgstr "Zeige kürzlich hinzugefügte Bücher"
 
-#: cps/templates/index.xml:17 cps/ub.py:67
+#: cps/templates/index.xml:17 cps/ub.py:68
 msgid "Hot Books"
 msgstr "Beliebte Bücher"
 
-#: cps/ub.py:69
+#: cps/ub.py:70
 msgid "Show Hot Books"
 msgstr "Zeige beliebte Bücher"
 
-#: cps/templates/index.xml:24 cps/ub.py:71 cps/web.py:655
+#: cps/templates/index.xml:24 cps/ub.py:72 cps/web.py:652
 msgid "Top Rated Books"
 msgstr "Best bewertete Bücher"
 
-#: cps/ub.py:73
+#: cps/ub.py:74
 msgid "Show Top Rated Books"
 msgstr "Bestbewertete Bücher anzeigen"
 
-#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:74
-#: cps/web.py:1222
+#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:75
+#: cps/web.py:1219
 msgid "Read Books"
 msgstr "Gelesene Bücher"
 
-#: cps/ub.py:76
+#: cps/ub.py:77
 msgid "Show read and unread"
 msgstr "Zeige gelesene/ungelesene Bücher"
 
-#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:78
-#: cps/web.py:1225
+#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:79
+#: cps/web.py:1222
 msgid "Unread Books"
 msgstr "Ungelesene Bücher"
 
-#: cps/ub.py:80
+#: cps/ub.py:81
 msgid "Show unread"
 msgstr "Zeige Ungelesene"
 
-#: cps/ub.py:81
+#: cps/ub.py:82
 msgid "Discover"
 msgstr "Entdecke"
 
-#: cps/ub.py:83
+#: cps/ub.py:84
 msgid "Show random books"
 msgstr "Zeige zufällige Bücher"
 
-#: cps/templates/index.xml:75 cps/ub.py:84 cps/web.py:970
+#: cps/templates/index.xml:75 cps/ub.py:85 cps/web.py:967
 msgid "Categories"
 msgstr "Kategorien"
 
-#: cps/ub.py:86
+#: cps/ub.py:87
 msgid "Show category selection"
 msgstr "Zeige Kategorienauswahl"
 
 #: cps/templates/book_edit.html:84 cps/templates/index.xml:82
-#: cps/templates/search_form.html:53 cps/ub.py:87 cps/web.py:886 cps/web.py:896
+#: cps/templates/search_form.html:53 cps/ub.py:88 cps/web.py:883 cps/web.py:893
 msgid "Series"
 msgstr "Serien"
 
-#: cps/ub.py:89
+#: cps/ub.py:90
 msgid "Show series selection"
 msgstr "Zeige Serienauswahl"
 
-#: cps/templates/index.xml:61 cps/ub.py:90
+#: cps/templates/index.xml:61 cps/ub.py:91
 msgid "Authors"
 msgstr "Autoren"
 
-#: cps/ub.py:92
+#: cps/ub.py:93
 msgid "Show author selection"
 msgstr "Zeige Autorenauswahl"
 
-#: cps/templates/index.xml:68 cps/ub.py:94 cps/web.py:869
+#: cps/templates/index.xml:68 cps/ub.py:95 cps/web.py:866
 msgid "Publishers"
 msgstr "Verleger"
 
-#: cps/ub.py:96
+#: cps/ub.py:97
 msgid "Show publisher selection"
 msgstr "Zeige Verlegerauswahl"
 
-#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:97
-#: cps/web.py:953
+#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:98
+#: cps/web.py:950
 msgid "Languages"
 msgstr "Sprachen"
 
-#: cps/ub.py:100
+#: cps/ub.py:101
 msgid "Show language selection"
 msgstr "Zeige Sprachauswahl"
 
-#: cps/templates/index.xml:96 cps/ub.py:101
+#: cps/templates/index.xml:96 cps/ub.py:102
 msgid "Ratings"
 msgstr "Bewertungen"
 
-#: cps/ub.py:103
+#: cps/ub.py:104
 msgid "Show ratings selection"
 msgstr "Zeige Bewertungsauswahl"
 
-#: cps/templates/index.xml:104 cps/ub.py:104
+#: cps/templates/index.xml:104 cps/ub.py:105
 msgid "File formats"
 msgstr "Dateiformate"
 
-#: cps/ub.py:106
+#: cps/ub.py:107
 msgid "Show file formats selection"
 msgstr "Zeige Dateiformatauswahl"
 
-#: cps/ub.py:108 cps/web.py:1249
+#: cps/ub.py:109 cps/web.py:1246
 msgid "Archived Books"
 msgstr "Archivierte Bücher"
 
-#: cps/ub.py:110
+#: cps/ub.py:111
 msgid "Show archived books"
 msgstr "Zeige archivierte Bücher"
 
@@ -877,220 +883,220 @@ 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/web.py:322
+#: cps/web.py:319
 #, python-format
 msgid "Error: %(ldaperror)s"
 msgstr "Fehler: %(ldaperror)s"
 
-#: cps/web.py:326
+#: cps/web.py:323
 msgid "Error: No user returned in response of LDAP server"
 msgstr "Fehler: Keine Benutzerinformationen von LDAP Server empfangen"
 
-#: cps/web.py:374
+#: cps/web.py:371
 msgid "Failed to Create at Least One LDAP User"
 msgstr "Mindestens ein LDAP Benutzer konnte nicht erzeugt werden"
 
-#: cps/web.py:377
+#: cps/web.py:374
 msgid "At Least One LDAP User Not Found in Database"
 msgstr "Mindestens ein LDAP Benutzer wurde nicht in der Datenbank gefudnen"
 
-#: cps/web.py:379
+#: cps/web.py:376
 msgid "User Successfully Imported"
 msgstr "Benutzer erfolgreich hinzugefügt"
 
-#: cps/web.py:625
+#: cps/web.py:622
 msgid "Recently Added Books"
 msgstr "Kürzlich hinzugefügte Bücher"
 
-#: cps/templates/index.html:5 cps/web.py:663
+#: cps/templates/index.html:5 cps/web.py:660
 msgid "Discover (Random Books)"
 msgstr "Zufällige Bücher"
 
-#: cps/web.py:691
+#: cps/web.py:688
 msgid "Books"
 msgstr "Bücher"
 
-#: cps/web.py:718
+#: cps/web.py:715
 msgid "Hot Books (Most Downloaded)"
 msgstr "Beliebte Bücher (am meisten Downloads)"
 
-#: cps/web.py:731
+#: cps/web.py:728
 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible"
 msgstr "Öffnen des Buchs fehlgeschlagen. Datei existiert nicht oder ist nicht zugänglich"
 
-#: cps/web.py:745
+#: cps/web.py:742
 #, python-format
 msgid "Author: %(name)s"
 msgstr "Author: %(name)s"
 
-#: cps/web.py:759
+#: cps/web.py:756
 #, python-format
 msgid "Publisher: %(name)s"
 msgstr "Verleger: %(name)s"
 
-#: cps/web.py:772
+#: cps/web.py:769
 #, python-format
 msgid "Series: %(serie)s"
 msgstr "Serie: %(serie)s"
 
-#: cps/web.py:785
+#: cps/web.py:782
 #, python-format
 msgid "Rating: %(rating)s stars"
 msgstr "Bewertung: %(rating)s Sterne"
 
-#: cps/web.py:798
+#: cps/web.py:795
 #, python-format
 msgid "File format: %(format)s"
 msgstr "Dateiformat: %(format)s"
 
-#: cps/web.py:812
+#: cps/web.py:809
 #, python-format
 msgid "Category: %(name)s"
 msgstr "Kategorie: %(name)s"
 
-#: cps/web.py:831
+#: cps/web.py:828
 #, python-format
 msgid "Language: %(name)s"
 msgstr "Sprache: %(name)s"
 
-#: cps/web.py:910
+#: cps/web.py:907
 msgid "Ratings list"
 msgstr "Bewertungsliste"
 
-#: cps/web.py:925
+#: cps/web.py:922
 msgid "File formats list"
 msgstr "Liste der Dateiformate"
 
-#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:984
+#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:981
 msgid "Tasks"
 msgstr "Aufgaben"
 
 #: cps/templates/book_edit.html:235 cps/templates/feed.xml:33
 #: cps/templates/layout.html:45 cps/templates/layout.html:48
-#: cps/templates/search_form.html:174 cps/web.py:1010 cps/web.py:1015
+#: cps/templates/search_form.html:174 cps/web.py:1007 cps/web.py:1012
 msgid "Search"
 msgstr "Suche"
 
-#: cps/web.py:1066
+#: cps/web.py:1063
 msgid "Published after "
 msgstr "Herausgegeben nach dem "
 
-#: cps/web.py:1073
+#: cps/web.py:1070
 msgid "Published before "
 msgstr "Herausgegeben vor dem "
 
-#: cps/web.py:1087
+#: cps/web.py:1084
 #, python-format
 msgid "Rating <= %(rating)s"
 msgstr "Bewertung <= %(rating)s"
 
-#: cps/web.py:1089
+#: cps/web.py:1086
 #, python-format
 msgid "Rating >= %(rating)s"
 msgstr "Bewertung >= %(rating)s"
 
-#: cps/web.py:1158 cps/web.py:1183
+#: cps/web.py:1155 cps/web.py:1180
 msgid "search"
 msgstr "Suche"
 
-#: cps/web.py:1213
+#: cps/web.py:1210
 #, python-format
 msgid "Custom Column No.%(column)d is not existing in calibre database"
 msgstr "Benutzerdefinierte Spalte Nr. %(column)d ist nicht in Calibre Datenbank vorhanden"
 
-#: cps/web.py:1304
+#: cps/web.py:1301
 #, python-format
 msgid "Book successfully queued for sending to %(kindlemail)s"
 msgstr "Buch erfolgreich zum Senden an %(kindlemail)s eingereiht"
 
-#: cps/web.py:1308
+#: cps/web.py:1305
 #, python-format
 msgid "Oops! There was an error sending this book: %(res)s"
 msgstr "Beim Senden des Buchs trat ein Fehler auf: %(res)s"
 
-#: cps/web.py:1310
+#: cps/web.py:1307
 msgid "Please update your profile with a valid Send to Kindle E-mail Address."
 msgstr "Bitte zuerst die Kindle E-Mailadresse konfigurieren..."
 
-#: cps/web.py:1327
+#: cps/web.py:1324
 msgid "E-Mail server is not configured, please contact your administrator!"
 msgstr "Der E-Mail Server ist nicht konfigurierte, bitte den Administrator kontaktieren!"
 
-#: cps/web.py:1328 cps/web.py:1338 cps/web.py:1362 cps/web.py:1366
-#: cps/web.py:1371 cps/web.py:1375
+#: cps/web.py:1325 cps/web.py:1335 cps/web.py:1359 cps/web.py:1363
+#: cps/web.py:1368 cps/web.py:1372
 msgid "register"
 msgstr "Registieren"
 
-#: cps/web.py:1364
+#: cps/web.py:1361
 msgid "Your e-mail is not allowed to register"
 msgstr "Diese E-Mail ist nicht für die Registrierung zugelassen"
 
-#: cps/web.py:1367
+#: cps/web.py:1364
 msgid "Confirmation e-mail was send to your e-mail account."
 msgstr "Eine Bestätigungs-E-Mail wurde an deinen E-Mail Account versendet."
 
-#: cps/web.py:1370
+#: cps/web.py:1367
 msgid "This username or e-mail address is already in use."
 msgstr "Benutzername oder E-Mailadresse ist bereits in Verwendung."
 
-#: cps/web.py:1387
+#: cps/web.py:1384
 msgid "Cannot activate LDAP authentication"
 msgstr "LDAP-Authentifizierung kann nicht aktiviert werden"
 
-#: cps/web.py:1404
+#: cps/web.py:1401
 #, python-format
 msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known"
 msgstr "Rückfall Login als: '%(nickname)s', LDAP Server ist nicht erreichbar, oder der Nutzer ist unbekannt"
 
-#: cps/web.py:1410
+#: cps/web.py:1407
 #, python-format
 msgid "Could not login: %(message)s"
 msgstr "Login nicht erfolgreich: %(message)s"
 
-#: cps/web.py:1414 cps/web.py:1438
+#: cps/web.py:1411 cps/web.py:1435
 msgid "Wrong Username or Password"
 msgstr "Falscher Benutzername oder Passwort"
 
-#: cps/web.py:1421
+#: cps/web.py:1418
 msgid "New Password was send to your email address"
 msgstr "Das neue Passwort wurde an die E-Mail Adresse verschickt"
 
-#: cps/web.py:1427
+#: cps/web.py:1424
 msgid "Please enter valid username to reset password"
 msgstr "Bitte einen gültigen Benutzernamen zum Zurücksetzen des Passworts angeben"
 
-#: cps/web.py:1433
+#: cps/web.py:1430
 #, python-format
 msgid "You are now logged in as: '%(nickname)s'"
 msgstr "Eingeloggt als: '%(nickname)s'"
 
-#: cps/web.py:1442 cps/web.py:1469
+#: cps/web.py:1439 cps/web.py:1466
 msgid "login"
 msgstr "Login"
 
-#: cps/web.py:1481 cps/web.py:1515
+#: cps/web.py:1478 cps/web.py:1512
 msgid "Token not found"
 msgstr "Token wurde nicht gefunden"
 
-#: cps/web.py:1490 cps/web.py:1523
+#: cps/web.py:1487 cps/web.py:1520
 msgid "Token has expired"
 msgstr "Token ist abgelaufen"
 
-#: cps/web.py:1499
+#: cps/web.py:1496
 msgid "Success! Please return to your device"
 msgstr "Erfolg! Bitte zum Gerät zurückkehren"
 
-#: cps/web.py:1580 cps/web.py:1625 cps/web.py:1631
+#: cps/web.py:1577 cps/web.py:1622 cps/web.py:1628
 #, python-format
 msgid "%(name)s's profile"
 msgstr "%(name)s's Profil"
 
-#: cps/web.py:1627
+#: cps/web.py:1624
 msgid "Profile updated"
 msgstr "Profil aktualisiert"
 
-#: cps/web.py:1656 cps/web.py:1659 cps/web.py:1662 cps/web.py:1669
-#: cps/web.py:1674
+#: cps/web.py:1653 cps/web.py:1656 cps/web.py:1659 cps/web.py:1666
+#: cps/web.py:1671
 msgid "Read a Book"
 msgstr "Lese ein Buch"
 
diff --git a/cps/translations/es/LC_MESSAGES/messages.mo b/cps/translations/es/LC_MESSAGES/messages.mo
index 5fbec266b5ef046d40ca0a6e629dd0e24f44f776..0d5a915370cdcd41e58d1784d1f3d11516c74d1d 100644
Binary files a/cps/translations/es/LC_MESSAGES/messages.mo and b/cps/translations/es/LC_MESSAGES/messages.mo differ
diff --git a/cps/translations/es/LC_MESSAGES/messages.po b/cps/translations/es/LC_MESSAGES/messages.po
index 4c745a11060b950c5ae4f4387fdbc49a7c1670d2..99bac86e14d627f2cb889d3a0263ff0e410050e0 100644
--- a/cps/translations/es/LC_MESSAGES/messages.po
+++ b/cps/translations/es/LC_MESSAGES/messages.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version:  Calibre-Web\n"
 "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
-"POT-Creation-Date: 2020-06-07 06:47+0200\n"
+"POT-Creation-Date: 2020-06-28 09:31+0200\n"
 "PO-Revision-Date: 2020-05-25 17:22+0200\n"
 "Last-Translator: minakmostoles <xxx@xxx.com>\n"
 "Language: es\n"
@@ -49,9 +49,9 @@ msgstr "Reconexión correcta"
 msgid "Unknown command"
 msgstr "Comando desconocido"
 
-#: cps/admin.py:116 cps/editbooks.py:563 cps/editbooks.py:573
-#: cps/editbooks.py:667 cps/editbooks.py:669 cps/editbooks.py:730
-#: cps/editbooks.py:743 cps/updater.py:509 cps/uploader.py:97
+#: cps/admin.py:116 cps/editbooks.py:564 cps/editbooks.py:576
+#: cps/editbooks.py:670 cps/editbooks.py:672 cps/editbooks.py:733
+#: cps/editbooks.py:749 cps/updater.py:509 cps/uploader.py:97
 #: cps/uploader.py:107
 msgid "Unknown"
 msgstr "Desconocido"
@@ -64,7 +64,7 @@ msgstr "Página de administración"
 msgid "UI Configuration"
 msgstr "Configuración de la interfaz de usuario"
 
-#: cps/admin.py:189 cps/admin.py:706
+#: cps/admin.py:189 cps/admin.py:711
 msgid "Calibre-Web configuration updated"
 msgstr "Configuración de Calibre-Web actualizada"
 
@@ -116,175 +116,181 @@ msgstr "El LDAP Group Object Filter tiene un paréntesis diferente"
 msgid "LDAP Certificate Location is not Valid, Please Enter Correct Path"
 msgstr "La ruta del certificado LDAP no es válida. Por favor, introduzca la ruta correcta"
 
-#: cps/admin.py:627
+#: cps/admin.py:628
 msgid "Keyfile Location is not Valid, Please Enter Correct Path"
 msgstr "La ruta del Keyfile no es válida, por favor, introduzca la ruta correcta"
 
-#: cps/admin.py:631
+#: cps/admin.py:632
 msgid "Certfile Location is not Valid, Please Enter Correct Path"
 msgstr "La ruta de Certfile no es válida, por favor, introduzca la ruta correcta"
 
-#: cps/admin.py:701
+#: cps/admin.py:694 cps/admin.py:793 cps/admin.py:885 cps/admin.py:934
+#: cps/shelf.py:100 cps/shelf.py:161 cps/shelf.py:202 cps/shelf.py:260
+#: cps/shelf.py:309 cps/shelf.py:338 cps/shelf.py:368 cps/shelf.py:392
+msgid "Settings DB is not Writeable"
+msgstr ""
+
+#: cps/admin.py:706
 msgid "DB Location is not Valid, Please Enter Correct Path"
 msgstr "La ruta de la base de datos no es válida. Por favor, introduzca la ruta correcta"
 
-#: cps/admin.py:703
+#: cps/admin.py:708
 msgid "DB is not Writeable"
 msgstr ""
 
-#: cps/admin.py:736
+#: cps/admin.py:741
 msgid "Basic Configuration"
 msgstr "Configuración básica"
 
-#: cps/admin.py:751 cps/web.py:1337
+#: cps/admin.py:756 cps/web.py:1334
 msgid "Please fill out all fields!"
 msgstr "¡Por favor, completa todos los campos!"
 
-#: cps/admin.py:754 cps/admin.py:766 cps/admin.py:772 cps/admin.py:892
+#: cps/admin.py:759 cps/admin.py:771 cps/admin.py:777 cps/admin.py:903
 msgid "Add new user"
 msgstr "Añadir un nuevo usuario"
 
-#: cps/admin.py:763 cps/web.py:1578
+#: cps/admin.py:768 cps/web.py:1575
 msgid "E-mail is not from valid domain"
 msgstr "El correo electrónico no tiene un dominio válido"
 
-#: cps/admin.py:770 cps/admin.py:785
+#: cps/admin.py:775 cps/admin.py:790
 msgid "Found an existing account for this e-mail address or nickname."
 msgstr "Encontrada una cuenta existente para este correo electrónico o nombre de usuario."
 
-#: cps/admin.py:781
+#: cps/admin.py:786
 #, python-format
 msgid "User '%(user)s' created"
 msgstr "Usuario '%(user)s' creado"
 
-#: cps/admin.py:794
+#: cps/admin.py:802
 #, python-format
 msgid "User '%(nick)s' deleted"
 msgstr "Usuario '%(nick)s' borrado"
 
-#: cps/admin.py:797
+#: cps/admin.py:805
 msgid "No admin user remaining, can't delete user"
 msgstr "No queda ningún usuario administrador, no se puede eliminar al usuario"
 
-#: cps/admin.py:803
+#: cps/admin.py:811
 msgid "No admin user remaining, can't remove admin role"
 msgstr "No queda ningún usuario administrador, no se puede eliminar al usuario"
 
-#: cps/admin.py:839 cps/web.py:1621
+#: cps/admin.py:847 cps/web.py:1618
 msgid "Found an existing account for this e-mail address."
 msgstr "Encontrada una cuenta existente para esa dirección de correo electrónico."
 
-#: cps/admin.py:849 cps/admin.py:864 cps/admin.py:967 cps/web.py:1596
+#: cps/admin.py:857 cps/admin.py:872 cps/admin.py:983 cps/web.py:1593
 #, python-format
 msgid "Edit User %(nick)s"
 msgstr "Editar Usuario %(nick)s"
 
-#: cps/admin.py:855 cps/web.py:1588
+#: cps/admin.py:863 cps/web.py:1585
 msgid "This username is already taken"
 msgstr "Este nombre de usuario ya está en uso"
 
-#: cps/admin.py:871
+#: cps/admin.py:879
 #, python-format
 msgid "User '%(nick)s' updated"
 msgstr "Usuario '%(nick)s'  actualizado"
 
-#: cps/admin.py:874
+#: cps/admin.py:882
 msgid "An unknown error occured."
 msgstr "Ocurrió un error desconocido."
 
-#: cps/admin.py:901 cps/templates/admin.html:71
+#: cps/admin.py:912 cps/templates/admin.html:71
 msgid "Edit E-mail Server Settings"
 msgstr "Cambiar parámetros de correo"
 
-#: cps/admin.py:925
+#: cps/admin.py:941
 #, python-format
 msgid "Test e-mail successfully send to %(kindlemail)s"
 msgstr "Correo electrónico de prueba enviado con éxito a %(kindlemail)s"
 
-#: cps/admin.py:928
+#: cps/admin.py:944
 #, python-format
 msgid "There was an error sending the Test e-mail: %(res)s"
 msgstr "Ocurrió un error enviando el correo electrónico de prueba: %(res)s"
 
-#: cps/admin.py:930
+#: cps/admin.py:946
 msgid "Please configure your e-mail address first..."
 msgstr "Por favor, configure su correo electrónico primero..."
 
-#: cps/admin.py:932
+#: cps/admin.py:948
 msgid "E-mail server settings updated"
 msgstr "Actualizados los ajustes del servidor de correo electrónico"
 
-#: cps/admin.py:943
+#: cps/admin.py:959
 msgid "User not found"
 msgstr "Usuario no encontrado"
 
-#: cps/admin.py:978
+#: cps/admin.py:994
 #, python-format
 msgid "Password for user %(user)s reset"
 msgstr "Contraseña para el usuario %(user)s reinicializada"
 
-#: cps/admin.py:981 cps/web.py:1361 cps/web.py:1425
+#: cps/admin.py:997 cps/web.py:1358 cps/web.py:1422
 msgid "An unknown error occurred. Please try again later."
 msgstr "Ha ocurrido un error desconocido. Por favor vuelva a intentarlo más tarde."
 
-#: cps/admin.py:984 cps/web.py:1299
+#: cps/admin.py:1000 cps/web.py:1296
 msgid "Please configure the SMTP mail settings first..."
 msgstr "Configura primero los parámetros del servidor SMTP..."
 
-#: cps/admin.py:996
+#: cps/admin.py:1012
 msgid "Logfile viewer"
 msgstr "Visor del fichero de log"
 
-#: cps/admin.py:1035
+#: cps/admin.py:1051
 msgid "Requesting update package"
 msgstr "Solicitando paquete de actualización"
 
-#: cps/admin.py:1036
+#: cps/admin.py:1052
 msgid "Downloading update package"
 msgstr "Descargando paquete de actualización"
 
-#: cps/admin.py:1037
+#: cps/admin.py:1053
 msgid "Unzipping update package"
 msgstr "Descomprimiendo paquete de actualización"
 
-#: cps/admin.py:1038
+#: cps/admin.py:1054
 msgid "Replacing files"
 msgstr "Remplazando archivos"
 
-#: cps/admin.py:1039
+#: cps/admin.py:1055
 msgid "Database connections are closed"
 msgstr "Los conexiones con la base datos están cerradas"
 
-#: cps/admin.py:1040
+#: cps/admin.py:1056
 msgid "Stopping server"
 msgstr "Parando el servidor"
 
-#: cps/admin.py:1041
+#: cps/admin.py:1057
 msgid "Update finished, please press okay and reload page"
 msgstr "Actualización finalizada. Por favor, pulse OK y recargue la página"
 
-#: cps/admin.py:1042 cps/admin.py:1043 cps/admin.py:1044 cps/admin.py:1045
-#: cps/admin.py:1046
+#: cps/admin.py:1058 cps/admin.py:1059 cps/admin.py:1060 cps/admin.py:1061
+#: cps/admin.py:1062
 msgid "Update failed:"
 msgstr "Falló la actualización:"
 
-#: cps/admin.py:1042 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
+#: cps/admin.py:1058 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
 msgid "HTTP Error"
 msgstr "Error HTTP"
 
-#: cps/admin.py:1043 cps/updater.py:321 cps/updater.py:524
+#: cps/admin.py:1059 cps/updater.py:321 cps/updater.py:524
 msgid "Connection error"
 msgstr "Error de conexión"
 
-#: cps/admin.py:1044 cps/updater.py:323 cps/updater.py:526
+#: cps/admin.py:1060 cps/updater.py:323 cps/updater.py:526
 msgid "Timeout while establishing connection"
 msgstr "Tiempo agotado mientras se trataba de establecer la conexión"
 
-#: cps/admin.py:1045 cps/updater.py:325 cps/updater.py:528
+#: cps/admin.py:1061 cps/updater.py:325 cps/updater.py:528
 msgid "General error"
 msgstr "Error general"
 
-#: cps/admin.py:1046
+#: cps/admin.py:1062
 msgid "Update File Could Not be Saved in Temp Dir"
 msgstr "La actualización del archivo no pudo guardarse en el directorio temporal (Temp Dir)"
 
@@ -304,8 +310,8 @@ msgstr "Formato de libro borrado correctamente"
 msgid "Book Successfully Deleted"
 msgstr "Libro borrado correctamente"
 
-#: cps/editbooks.py:254 cps/editbooks.py:548 cps/web.py:1644 cps/web.py:1685
-#: cps/web.py:1747
+#: cps/editbooks.py:254 cps/editbooks.py:549 cps/web.py:1641 cps/web.py:1682
+#: cps/web.py:1744
 msgid "Error opening eBook. File does not exist or file is not accessible"
 msgstr "Error abriendo un eBook. El archivo no existe o no es accesible"
 
@@ -313,82 +319,82 @@ msgstr "Error abriendo un eBook. El archivo no existe o no es accesible"
 msgid "edit metadata"
 msgstr "editar metadatos"
 
-#: cps/editbooks.py:361
+#: cps/editbooks.py:360
 #, python-format
 msgid "%(langname)s is not a valid language"
 msgstr "%(langname)s no es un idioma válido"
 
-#: cps/editbooks.py:467 cps/editbooks.py:712
+#: cps/editbooks.py:468 cps/editbooks.py:715
 #, python-format
 msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
 msgstr "No se permite subir archivos con la extensión '%(ext)s' a este servidor"
 
-#: cps/editbooks.py:471 cps/editbooks.py:716
+#: cps/editbooks.py:472 cps/editbooks.py:719
 msgid "File to be uploaded must have an extension"
 msgstr "El archivo a subir debe tener una extensión"
 
-#: cps/editbooks.py:483 cps/editbooks.py:773
+#: cps/editbooks.py:484 cps/editbooks.py:779
 #, python-format
 msgid "Failed to create path %(path)s (Permission denied)."
 msgstr "Fallo al crear la ruta %(path)s (permiso denegado)"
 
-#: cps/editbooks.py:488
+#: cps/editbooks.py:489
 #, python-format
 msgid "Failed to store file %(file)s."
 msgstr "Fallo al guardar el archivo %(file)s."
 
-#: cps/editbooks.py:506 cps/editbooks.py:864
+#: cps/editbooks.py:507 cps/editbooks.py:870
 #, python-format
 msgid "Database error: %(error)s."
 msgstr ""
 
-#: cps/editbooks.py:510
+#: cps/editbooks.py:511
 #, python-format
 msgid "File format %(ext)s added to %(book)s"
 msgstr "Archivo con formato %(ext)s añadido a %(book)s"
 
-#: cps/editbooks.py:653
+#: cps/editbooks.py:656
 msgid "Metadata successfully updated"
 msgstr "Metadatos actualizados correctamente"
 
-#: cps/editbooks.py:662
+#: cps/editbooks.py:665
 msgid "Error editing book, please check logfile for details"
 msgstr "Error al editar el libro, por favor, compruebe el archivo de registro (logfile) para tener más detalles"
 
-#: cps/editbooks.py:724
+#: cps/editbooks.py:727
 #, python-format
 msgid "File %(filename)s could not saved to temp dir"
 msgstr "El archivo %(filename)s no pudo salvarse en el directorio temporal (Temp Dir)"
 
-#: cps/editbooks.py:734
+#: cps/editbooks.py:737
 msgid "Uploaded book probably exists in the library, consider to change before upload new: "
 msgstr "El libro cargado probablemente existe en la biblioteca, considera cambiarlo antes de subirlo de nuevo: "
 
-#: cps/editbooks.py:780
+#: cps/editbooks.py:786
 #, python-format
 msgid "Failed to Move File %(file)s: %(error)s"
 msgstr "Fallo al mover el archivo %(file)s: %(error)s"
 
-#: cps/editbooks.py:836
+#: cps/editbooks.py:842
 #, python-format
 msgid "Failed to Move Cover File %(file)s: %(error)s"
 msgstr "Fallo al mover el archivo de cubierta %(file)s: %(error)s"
 
-#: cps/editbooks.py:850
+#: cps/editbooks.py:856
 #, python-format
 msgid "File %(file)s uploaded"
 msgstr "El fichero %(file)s a sido subido"
 
-#: cps/editbooks.py:876
+#: cps/editbooks.py:882
 msgid "Source or destination format for conversion missing"
 msgstr "Falta la fuente o el formato de destino para la conversión"
 
-#: cps/editbooks.py:884
+#: cps/editbooks.py:890
 #, python-format
 msgid "Book successfully queued for converting to %(book_format)s"
 msgstr "Libro puesto a la cola para su conversión a %(book_format)s"
 
-#: cps/editbooks.py:888
+#: cps/editbooks.py:894
 #, python-format
 msgid "There was an error converting this book: %(res)s"
 msgstr "Ocurrió un error al convertir este libro: %(res)s"
@@ -502,71 +508,71 @@ msgstr "Fichero %(file)s no encontrado en Google Drive"
 msgid "Book path %(path)s not found on Google Drive"
 msgstr "La ruta %(path)s del libro no fue encontrada en Google Drive"
 
-#: cps/helper.py:542
+#: cps/helper.py:550
 msgid "Error Downloading Cover"
 msgstr ""
 
-#: cps/helper.py:545
+#: cps/helper.py:553
 msgid "Cover Format Error"
 msgstr ""
 
-#: cps/helper.py:561
+#: cps/helper.py:569
 msgid "Failed to create path for cover"
 msgstr "Error al crear una ruta para la cubierta"
 
-#: cps/helper.py:566
+#: cps/helper.py:574
 msgid "Cover-file is not a valid image file, or could not be stored"
 msgstr "El archivo de cubierta no es una imágen válida"
 
-#: cps/helper.py:577
+#: cps/helper.py:585
 msgid "Only jpg/jpeg/png/webp files are supported as coverfile"
 msgstr "Las cubiertas deben estar en formato jpg/jpeg/png/webp"
 
-#: cps/helper.py:591
+#: cps/helper.py:599
 msgid "Only jpg/jpeg files are supported as coverfile"
 msgstr "Siki kis archivos jpg/jpeg están soportados como cubierta"
 
-#: cps/helper.py:640
+#: cps/helper.py:648
 msgid "Unrar binary file not found"
 msgstr "No se ha encontrado el binario del comando UnRar"
 
-#: cps/helper.py:654
+#: cps/helper.py:662
 msgid "Error excecuting UnRar"
 msgstr "Error ejecutando UnRar"
 
-#: cps/helper.py:710
+#: cps/helper.py:718
 msgid "Waiting"
 msgstr "Esperando"
 
-#: cps/helper.py:712
+#: cps/helper.py:720
 msgid "Failed"
 msgstr "Fallido"
 
-#: cps/helper.py:714
+#: cps/helper.py:722
 msgid "Started"
 msgstr "Comenzado"
 
-#: cps/helper.py:716
+#: cps/helper.py:724
 msgid "Finished"
 msgstr "Finalizado"
 
-#: cps/helper.py:718
+#: cps/helper.py:726
 msgid "Unknown Status"
 msgstr "Estado desconocido"
 
-#: cps/helper.py:723
+#: cps/helper.py:731
 msgid "E-mail: "
 msgstr "E-mail: "
 
-#: cps/helper.py:725 cps/helper.py:729
+#: cps/helper.py:733 cps/helper.py:737
 msgid "Convert: "
 msgstr "Convertir: "
 
-#: cps/helper.py:727
+#: cps/helper.py:735
 msgid "Upload: "
 msgstr "Subir: "
 
-#: cps/helper.py:731
+#: cps/helper.py:739
 msgid "Unknown Task: "
 msgstr "Tarea desconocida:"
 
@@ -599,7 +605,7 @@ msgstr "Error al iniciar sesión con Google."
 msgid "Failed to fetch user info from Google."
 msgstr "Error al obtener información del usuario de Google."
 
-#: cps/oauth_bb.py:225 cps/web.py:1397 cps/web.py:1537
+#: cps/oauth_bb.py:225 cps/web.py:1394 cps/web.py:1534
 #, python-format
 msgid "you are now logged in as: '%(nickname)s'"
 msgstr "has iniciado sesión como : '%(nickname)s'"
@@ -636,218 +642,218 @@ msgstr "Error en GitHub Oauth, por favor, vuelva a intentarlo más tarde."
 msgid "Google Oauth error, please retry later."
 msgstr "Error en Google Oauth, por favor vuelva a intentarlo más tarde."
 
-#: cps/shelf.py:66 cps/shelf.py:111
+#: cps/shelf.py:67 cps/shelf.py:120
 msgid "Invalid shelf specified"
 msgstr "Estante especificado inválido"
 
-#: cps/shelf.py:72
+#: cps/shelf.py:73
 #, python-format
 msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s"
 msgstr "Lo sentimos, no tiene permisos para agregar un libro al estante: %(shelfname)s"
 
-#: cps/shelf.py:82
+#: cps/shelf.py:83
 #, python-format
 msgid "Book is already part of the shelf: %(shelfname)s"
 msgstr "El libro ya forma parte del estante: %(shelfname)s"
 
-#: cps/shelf.py:97
+#: cps/shelf.py:106
 #, python-format
 msgid "Book has been added to shelf: %(sname)s"
 msgstr "El libro fue agregado a el estante: %(sname)s"
 
-#: cps/shelf.py:115
+#: cps/shelf.py:124
 #, python-format
 msgid "You are not allowed to add a book to the the shelf: %(name)s"
 msgstr "No tiene permiso para añadir un libro a el estante: %(name)s"
 
-#: cps/shelf.py:133
+#: cps/shelf.py:142
 #, python-format
 msgid "Books are already part of the shelf: %(name)s"
 msgstr "Los libros ya forman parte del estante: %(name)s"
 
-#: cps/shelf.py:148
+#: cps/shelf.py:158
 #, python-format
 msgid "Books have been added to shelf: %(sname)s"
 msgstr "Los libros han sido añadidos al estante: %(sname)s"
 
-#: cps/shelf.py:150
+#: cps/shelf.py:163
 #, python-format
 msgid "Could not add books to shelf: %(sname)s"
 msgstr "No se pudieron agregar libros al estante: %(sname)s"
 
-#: cps/shelf.py:188
+#: cps/shelf.py:208
 #, python-format
 msgid "Book has been removed from shelf: %(sname)s"
 msgstr "El libro fue eliminado del estante: %(sname)s"
 
-#: cps/shelf.py:196
+#: cps/shelf.py:216
 #, python-format
 msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
 msgstr "Lo siento, no tiene permiso para eliminar un libro del estante: %(sname)s"
 
-#: cps/shelf.py:220 cps/shelf.py:260
+#: cps/shelf.py:240 cps/shelf.py:284
 #, python-format
 msgid "A public shelf with the name '%(title)s' already exists."
 msgstr "Ya existe un estante público con el nombre '%(title)s'."
 
-#: cps/shelf.py:229 cps/shelf.py:270
+#: cps/shelf.py:249 cps/shelf.py:294
 #, python-format
 msgid "A private shelf with the name '%(title)s' already exists."
 msgstr "Ya existe un estante privado con el nombre '%(title)s'."
 
-#: cps/shelf.py:236
+#: cps/shelf.py:256
 #, python-format
 msgid "Shelf %(title)s created"
 msgstr "Estante %(title)s creado"
 
-#: cps/shelf.py:239 cps/shelf.py:284
+#: cps/shelf.py:263 cps/shelf.py:312
 msgid "There was an error"
 msgstr "Ha sucedido un error"
 
-#: cps/shelf.py:240 cps/shelf.py:242 cps/templates/layout.html:144
+#: cps/shelf.py:264 cps/shelf.py:266 cps/templates/layout.html:144
 msgid "Create a Shelf"
 msgstr "Crear un estante"
 
-#: cps/shelf.py:282
+#: cps/shelf.py:306
 #, python-format
 msgid "Shelf %(title)s changed"
 msgstr "Estante %(title)s cambiado"
 
-#: cps/shelf.py:285 cps/shelf.py:287
+#: cps/shelf.py:313 cps/shelf.py:315
 msgid "Edit a shelf"
 msgstr "Editar un estante"
 
-#: cps/shelf.py:332
+#: cps/shelf.py:369
 #, python-format
 msgid "Shelf: '%(name)s'"
 msgstr "Estante: '%(name)s'"
 
-#: cps/shelf.py:335
+#: cps/shelf.py:372
 msgid "Error opening shelf. Shelf does not exist or is not accessible"
 msgstr "Error al abrir un estante. El estante no existe o no es accesible"
 
-#: cps/shelf.py:368
+#: cps/shelf.py:409
 msgid "Hidden Book"
 msgstr "Libro oculto"
 
-#: cps/shelf.py:373
+#: cps/shelf.py:414
 #, python-format
 msgid "Change order of Shelf: '%(name)s'"
 msgstr "Cambiar orden del estante: '%(name)s'"
 
-#: cps/ub.py:64
+#: cps/ub.py:65
 msgid "Recently Added"
 msgstr "Añadido recientemente"
 
-#: cps/ub.py:66
+#: cps/ub.py:67
 msgid "Show recent books"
 msgstr "Mostrar libros recientes"
 
-#: cps/templates/index.xml:17 cps/ub.py:67
+#: cps/templates/index.xml:17 cps/ub.py:68
 msgid "Hot Books"
 msgstr "Libros populares"
 
-#: cps/ub.py:69
+#: cps/ub.py:70
 msgid "Show Hot Books"
 msgstr "Mostrar libros populares"
 
-#: cps/templates/index.xml:24 cps/ub.py:71 cps/web.py:655
+#: cps/templates/index.xml:24 cps/ub.py:72 cps/web.py:652
 msgid "Top Rated Books"
 msgstr "Libros mejor valorados"
 
-#: cps/ub.py:73
+#: cps/ub.py:74
 msgid "Show Top Rated Books"
 msgstr "Mostrar libros mejor valorados"
 
-#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:74
-#: cps/web.py:1222
+#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:75
+#: cps/web.py:1219
 msgid "Read Books"
 msgstr "Libros leídos"
 
-#: cps/ub.py:76
+#: cps/ub.py:77
 msgid "Show read and unread"
 msgstr "Mostrar leídos y no leídos"
 
-#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:78
-#: cps/web.py:1225
+#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:79
+#: cps/web.py:1222
 msgid "Unread Books"
 msgstr "Libros no leídos"
 
-#: cps/ub.py:80
+#: cps/ub.py:81
 msgid "Show unread"
 msgstr "Mostrar no leído"
 
-#: cps/ub.py:81
+#: cps/ub.py:82
 msgid "Discover"
 msgstr "Descubrir"
 
-#: cps/ub.py:83
+#: cps/ub.py:84
 msgid "Show random books"
 msgstr "Mostrar libros al azar"
 
-#: cps/templates/index.xml:75 cps/ub.py:84 cps/web.py:970
+#: cps/templates/index.xml:75 cps/ub.py:85 cps/web.py:967
 msgid "Categories"
 msgstr "Categorías"
 
-#: cps/ub.py:86
+#: cps/ub.py:87
 msgid "Show category selection"
 msgstr "Mostrar selección de categorías"
 
 #: cps/templates/book_edit.html:84 cps/templates/index.xml:82
-#: cps/templates/search_form.html:53 cps/ub.py:87 cps/web.py:886 cps/web.py:896
+#: cps/templates/search_form.html:53 cps/ub.py:88 cps/web.py:883 cps/web.py:893
 msgid "Series"
 msgstr "Series"
 
-#: cps/ub.py:89
+#: cps/ub.py:90
 msgid "Show series selection"
 msgstr "Mostrar selección de series"
 
-#: cps/templates/index.xml:61 cps/ub.py:90
+#: cps/templates/index.xml:61 cps/ub.py:91
 msgid "Authors"
 msgstr "Autores"
 
-#: cps/ub.py:92
+#: cps/ub.py:93
 msgid "Show author selection"
 msgstr "Mostrar selección de autores"
 
-#: cps/templates/index.xml:68 cps/ub.py:94 cps/web.py:869
+#: cps/templates/index.xml:68 cps/ub.py:95 cps/web.py:866
 msgid "Publishers"
 msgstr "Editores"
 
-#: cps/ub.py:96
+#: cps/ub.py:97
 msgid "Show publisher selection"
 msgstr "Mostrar selección de editores"
 
-#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:97
-#: cps/web.py:953
+#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:98
+#: cps/web.py:950
 msgid "Languages"
 msgstr "Idiomas"
 
-#: cps/ub.py:100
+#: cps/ub.py:101
 msgid "Show language selection"
 msgstr "Mostrar selección de idiomas"
 
-#: cps/templates/index.xml:96 cps/ub.py:101
+#: cps/templates/index.xml:96 cps/ub.py:102
 msgid "Ratings"
 msgstr "Calificaciones"
 
-#: cps/ub.py:103
+#: cps/ub.py:104
 msgid "Show ratings selection"
 msgstr "Mostrar selección de calificaciones"
 
-#: cps/templates/index.xml:104 cps/ub.py:104
+#: cps/templates/index.xml:104 cps/ub.py:105
 msgid "File formats"
 msgstr "Formatos de archivo"
 
-#: cps/ub.py:106
+#: cps/ub.py:107
 msgid "Show file formats selection"
 msgstr "Mostrar selección de formatos de archivo"
 
-#: cps/ub.py:108 cps/web.py:1249
+#: cps/ub.py:109 cps/web.py:1246
 msgid "Archived Books"
 msgstr "Libros archivados"
 
-#: cps/ub.py:110
+#: cps/ub.py:111
 msgid "Show archived books"
 msgstr "Mostrar libros archivados"
 
@@ -880,220 +886,220 @@ msgstr "Hay una nueva actualización disponible. Haz clic en el botón de abajo
 msgid "Click on the button below to update to the latest stable version."
 msgstr "Haz clic en el botón de abajo para actualizar a la última versión estable."
 
-#: cps/web.py:322
+#: cps/web.py:319
 #, python-format
 msgid "Error: %(ldaperror)s"
 msgstr "Error: %(ldaperror)s"
 
-#: cps/web.py:326
+#: cps/web.py:323
 msgid "Error: No user returned in response of LDAP server"
 msgstr "Error: el servidor LDAP no ha devuelto ningún usuario"
 
-#: cps/web.py:374
+#: cps/web.py:371
 msgid "Failed to Create at Least One LDAP User"
 msgstr "Error al crear al menos un usuario LDAP"
 
-#: cps/web.py:377
+#: cps/web.py:374
 msgid "At Least One LDAP User Not Found in Database"
 msgstr "Al menos, un usuario LDAP no se ha encontrado en la base de datos"
 
-#: cps/web.py:379
+#: cps/web.py:376
 msgid "User Successfully Imported"
 msgstr "Usuario importado correctamente"
 
-#: cps/web.py:625
+#: cps/web.py:622
 msgid "Recently Added Books"
 msgstr "Libros añadidos recientemente"
 
-#: cps/templates/index.html:5 cps/web.py:663
+#: cps/templates/index.html:5 cps/web.py:660
 msgid "Discover (Random Books)"
 msgstr "Descubrir (Libros al azar)"
 
-#: cps/web.py:691
+#: cps/web.py:688
 msgid "Books"
 msgstr "Libros"
 
-#: cps/web.py:718
+#: cps/web.py:715
 msgid "Hot Books (Most Downloaded)"
 msgstr "Libros populares (los más descargados)"
 
-#: cps/web.py:731
+#: cps/web.py:728
 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible"
 msgstr "oh, oh, el libro seleccionado no está disponible. El archivo no existe o no es accesible"
 
-#: cps/web.py:745
+#: cps/web.py:742
 #, python-format
 msgid "Author: %(name)s"
 msgstr "Autor/es: %(name)s"
 
-#: cps/web.py:759
+#: cps/web.py:756
 #, python-format
 msgid "Publisher: %(name)s"
 msgstr "Editor/es: %(name)s"
 
-#: cps/web.py:772
+#: cps/web.py:769
 #, python-format
 msgid "Series: %(serie)s"
 msgstr "Series: %(serie)s"
 
-#: cps/web.py:785
+#: cps/web.py:782
 #, python-format
 msgid "Rating: %(rating)s stars"
 msgstr "Calificación: %(rating)s estrellas"
 
-#: cps/web.py:798
+#: cps/web.py:795
 #, python-format
 msgid "File format: %(format)s"
 msgstr "Formato del archivo: %(format)s"
 
-#: cps/web.py:812
+#: cps/web.py:809
 #, python-format
 msgid "Category: %(name)s"
 msgstr "Categoría : %(name)s"
 
-#: cps/web.py:831
+#: cps/web.py:828
 #, python-format
 msgid "Language: %(name)s"
 msgstr "Idioma: %(name)s"
 
-#: cps/web.py:910
+#: cps/web.py:907
 msgid "Ratings list"
 msgstr "Lista de calificaciones"
 
-#: cps/web.py:925
+#: cps/web.py:922
 msgid "File formats list"
 msgstr "Lista de formatos"
 
-#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:984
+#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:981
 msgid "Tasks"
 msgstr "Tareas"
 
 #: cps/templates/book_edit.html:235 cps/templates/feed.xml:33
 #: cps/templates/layout.html:45 cps/templates/layout.html:48
-#: cps/templates/search_form.html:174 cps/web.py:1010 cps/web.py:1015
+#: cps/templates/search_form.html:174 cps/web.py:1007 cps/web.py:1012
 msgid "Search"
 msgstr "Buscar"
 
-#: cps/web.py:1066
+#: cps/web.py:1063
 msgid "Published after "
 msgstr "Publicado después de "
 
-#: cps/web.py:1073
+#: cps/web.py:1070
 msgid "Published before "
 msgstr "Publicado antes de "
 
-#: cps/web.py:1087
+#: cps/web.py:1084
 #, python-format
 msgid "Rating <= %(rating)s"
 msgstr "Calificación <= %(rating)s"
 
-#: cps/web.py:1089
+#: cps/web.py:1086
 #, python-format
 msgid "Rating >= %(rating)s"
 msgstr "Calificación >= %(rating)s"
 
-#: cps/web.py:1158 cps/web.py:1183
+#: cps/web.py:1155 cps/web.py:1180
 msgid "search"
 msgstr "búsqueda"
 
-#: cps/web.py:1213
+#: cps/web.py:1210
 #, python-format
 msgid "Custom Column No.%(column)d is not existing in calibre database"
 msgstr ""
 
-#: cps/web.py:1304
+#: cps/web.py:1301
 #, python-format
 msgid "Book successfully queued for sending to %(kindlemail)s"
 msgstr "Libro puesto en la cola de envío a %(kindlemail)s"
 
-#: cps/web.py:1308
+#: cps/web.py:1305
 #, python-format
 msgid "Oops! There was an error sending this book: %(res)s"
 msgstr "Ha sucedido un error en el envío del libro: %(res)s"
 
-#: cps/web.py:1310
+#: cps/web.py:1307
 msgid "Please update your profile with a valid Send to Kindle E-mail Address."
 msgstr "Por favor actualiza tu perfil con la dirección de correo de su kindle..."
 
-#: cps/web.py:1327
+#: cps/web.py:1324
 msgid "E-Mail server is not configured, please contact your administrator!"
 msgstr "El servidor de E-Mail no está configurado, por favor, ¡avisa a tu administrador!"
 
-#: cps/web.py:1328 cps/web.py:1338 cps/web.py:1362 cps/web.py:1366
-#: cps/web.py:1371 cps/web.py:1375
+#: cps/web.py:1325 cps/web.py:1335 cps/web.py:1359 cps/web.py:1363
+#: cps/web.py:1368 cps/web.py:1372
 msgid "register"
 msgstr "registrarse"
 
-#: cps/web.py:1364
+#: cps/web.py:1361
 msgid "Your e-mail is not allowed to register"
 msgstr "Su correo electrónico no está permitido para registrarse"
 
-#: cps/web.py:1367
+#: cps/web.py:1364
 msgid "Confirmation e-mail was send to your e-mail account."
 msgstr "Se ha enviado un correo electrónico de verificación a su cuenta de correo."
 
-#: cps/web.py:1370
+#: cps/web.py:1367
 msgid "This username or e-mail address is already in use."
 msgstr "Este nombre de usuario o correo electrónico ya están en uso."
 
-#: cps/web.py:1387
+#: cps/web.py:1384
 msgid "Cannot activate LDAP authentication"
 msgstr "No se puede activar la autenticación LDAP"
 
-#: cps/web.py:1404
+#: cps/web.py:1401
 #, python-format
 msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known"
 msgstr "Fallback login como: '%(nickname)s', no se puede acceder al servidor LDAP o usuario desconocido"
 
-#: cps/web.py:1410
+#: cps/web.py:1407
 #, python-format
 msgid "Could not login: %(message)s"
 msgstr "No se pudo entrar: %(message)s"
 
-#: cps/web.py:1414 cps/web.py:1438
+#: cps/web.py:1411 cps/web.py:1435
 msgid "Wrong Username or Password"
 msgstr "Usuario o contraseña inválido"
 
-#: cps/web.py:1421
+#: cps/web.py:1418
 msgid "New Password was send to your email address"
 msgstr "Una nueva contraseña se ha enviado a su cuenta de correo electrónico"
 
-#: cps/web.py:1427
+#: cps/web.py:1424
 msgid "Please enter valid username to reset password"
 msgstr "Por favor, introduce un usuario válido para restablecer la contraseña"
 
-#: cps/web.py:1433
+#: cps/web.py:1430
 #, python-format
 msgid "You are now logged in as: '%(nickname)s'"
 msgstr "Ahora estás conectado como: '%(nickname)s'"
 
-#: cps/web.py:1442 cps/web.py:1469
+#: cps/web.py:1439 cps/web.py:1466
 msgid "login"
 msgstr "iniciar sesión"
 
-#: cps/web.py:1481 cps/web.py:1515
+#: cps/web.py:1478 cps/web.py:1512
 msgid "Token not found"
 msgstr "Token no encontrado"
 
-#: cps/web.py:1490 cps/web.py:1523
+#: cps/web.py:1487 cps/web.py:1520
 msgid "Token has expired"
 msgstr "El token ha expirado"
 
-#: cps/web.py:1499
+#: cps/web.py:1496
 msgid "Success! Please return to your device"
 msgstr "¡Correcto! Por favor regrese a su dispositivo"
 
-#: cps/web.py:1580 cps/web.py:1625 cps/web.py:1631
+#: cps/web.py:1577 cps/web.py:1622 cps/web.py:1628
 #, python-format
 msgid "%(name)s's profile"
 msgstr "Perfil de %(name)s"
 
-#: cps/web.py:1627
+#: cps/web.py:1624
 msgid "Profile updated"
 msgstr "Perfil actualizado"
 
-#: cps/web.py:1656 cps/web.py:1659 cps/web.py:1662 cps/web.py:1669
-#: cps/web.py:1674
+#: cps/web.py:1653 cps/web.py:1656 cps/web.py:1659 cps/web.py:1666
+#: cps/web.py:1671
 msgid "Read a Book"
 msgstr "Leer un libro"
 
diff --git a/cps/translations/fi/LC_MESSAGES/messages.mo b/cps/translations/fi/LC_MESSAGES/messages.mo
index 5a61b9d6871df7a6316672fb1d0f0235ccee5036..7df8c7c82f36f2584fcb3aefe0b048c317a50a67 100644
Binary files a/cps/translations/fi/LC_MESSAGES/messages.mo and b/cps/translations/fi/LC_MESSAGES/messages.mo differ
diff --git a/cps/translations/fi/LC_MESSAGES/messages.po b/cps/translations/fi/LC_MESSAGES/messages.po
index 2fe9cc587193a59b2a7dc1232504d78284b37da1..09b133f105d3d4f02755f3c51287ccb9128674ad 100644
--- a/cps/translations/fi/LC_MESSAGES/messages.po
+++ b/cps/translations/fi/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version:  Calibre-Web\n"
 "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
-"POT-Creation-Date: 2020-06-07 06:47+0200\n"
+"POT-Creation-Date: 2020-06-28 09:31+0200\n"
 "PO-Revision-Date: 2020-01-12 13:56+0100\n"
 "Last-Translator: Samuli Valavuo <svalavuo@gmail.com>\n"
 "Language: fi\n"
@@ -46,9 +46,9 @@ msgstr ""
 msgid "Unknown command"
 msgstr ""
 
-#: cps/admin.py:116 cps/editbooks.py:563 cps/editbooks.py:573
-#: cps/editbooks.py:667 cps/editbooks.py:669 cps/editbooks.py:730
-#: cps/editbooks.py:743 cps/updater.py:509 cps/uploader.py:97
+#: cps/admin.py:116 cps/editbooks.py:564 cps/editbooks.py:576
+#: cps/editbooks.py:670 cps/editbooks.py:672 cps/editbooks.py:733
+#: cps/editbooks.py:749 cps/updater.py:509 cps/uploader.py:97
 #: cps/uploader.py:107
 msgid "Unknown"
 msgstr "Tuntematon"
@@ -61,7 +61,7 @@ msgstr "Ylläpitosivu"
 msgid "UI Configuration"
 msgstr "Käyttöliittymän asetukset"
 
-#: cps/admin.py:189 cps/admin.py:706
+#: cps/admin.py:189 cps/admin.py:711
 msgid "Calibre-Web configuration updated"
 msgstr "Calibre-Web asetukset päivitetty"
 
@@ -113,175 +113,181 @@ msgstr ""
 msgid "LDAP Certificate Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:627
+#: cps/admin.py:628
 msgid "Keyfile Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:631
+#: cps/admin.py:632
 msgid "Certfile Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:701
+#: cps/admin.py:694 cps/admin.py:793 cps/admin.py:885 cps/admin.py:934
+#: cps/shelf.py:100 cps/shelf.py:161 cps/shelf.py:202 cps/shelf.py:260
+#: cps/shelf.py:309 cps/shelf.py:338 cps/shelf.py:368 cps/shelf.py:392
+msgid "Settings DB is not Writeable"
+msgstr ""
+
+#: cps/admin.py:706
 msgid "DB Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:703
+#: cps/admin.py:708
 msgid "DB is not Writeable"
 msgstr ""
 
-#: cps/admin.py:736
+#: cps/admin.py:741
 msgid "Basic Configuration"
 msgstr "Perusasetukset"
 
-#: cps/admin.py:751 cps/web.py:1337
+#: cps/admin.py:756 cps/web.py:1334
 msgid "Please fill out all fields!"
 msgstr "Ole hyvä ja täytä kaikki kentät!"
 
-#: cps/admin.py:754 cps/admin.py:766 cps/admin.py:772 cps/admin.py:892
+#: cps/admin.py:759 cps/admin.py:771 cps/admin.py:777 cps/admin.py:903
 msgid "Add new user"
 msgstr "Lisää uusi käyttäjä"
 
-#: cps/admin.py:763 cps/web.py:1578
+#: cps/admin.py:768 cps/web.py:1575
 msgid "E-mail is not from valid domain"
 msgstr "Sähköpostiosoite ei ole toimivasta domainista"
 
-#: cps/admin.py:770 cps/admin.py:785
+#: cps/admin.py:775 cps/admin.py:790
 msgid "Found an existing account for this e-mail address or nickname."
 msgstr "Tälle sähköpostiosoitteelle tai tunnukselle löytyi jo tili."
 
-#: cps/admin.py:781
+#: cps/admin.py:786
 #, python-format
 msgid "User '%(user)s' created"
 msgstr "Käyttäjä '%(user)s' lisätty"
 
-#: cps/admin.py:794
+#: cps/admin.py:802
 #, python-format
 msgid "User '%(nick)s' deleted"
 msgstr "Käyttäjä '%(nick)s' poistettu"
 
-#: cps/admin.py:797
+#: cps/admin.py:805
 msgid "No admin user remaining, can't delete user"
 msgstr "Pääkäyttäjiä ei jää jäljelle, käyttäjää ei voi poistaa"
 
-#: cps/admin.py:803
+#: cps/admin.py:811
 msgid "No admin user remaining, can't remove admin role"
 msgstr ""
 
-#: cps/admin.py:839 cps/web.py:1621
+#: cps/admin.py:847 cps/web.py:1618
 msgid "Found an existing account for this e-mail address."
 msgstr "Tälle sähköpostiosoitteelle läytyi jo käyttäjätunnus."
 
-#: cps/admin.py:849 cps/admin.py:864 cps/admin.py:967 cps/web.py:1596
+#: cps/admin.py:857 cps/admin.py:872 cps/admin.py:983 cps/web.py:1593
 #, python-format
 msgid "Edit User %(nick)s"
 msgstr "Muokkaa käyttäjää %(nick)s"
 
-#: cps/admin.py:855 cps/web.py:1588
+#: cps/admin.py:863 cps/web.py:1585
 msgid "This username is already taken"
 msgstr ""
 
-#: cps/admin.py:871
+#: cps/admin.py:879
 #, python-format
 msgid "User '%(nick)s' updated"
 msgstr "Käyttäjä '%(nick)s' päivitetty"
 
-#: cps/admin.py:874
+#: cps/admin.py:882
 msgid "An unknown error occured."
 msgstr "Tapahtui tuntematon virhe."
 
-#: cps/admin.py:901 cps/templates/admin.html:71
+#: cps/admin.py:912 cps/templates/admin.html:71
 msgid "Edit E-mail Server Settings"
 msgstr "Muuta SMTP asetuksia"
 
-#: cps/admin.py:925
+#: cps/admin.py:941
 #, python-format
 msgid "Test e-mail successfully send to %(kindlemail)s"
 msgstr "Testisähköposti lähetetty onnistuneesti osoitteeseen %(kindlemail)s"
 
-#: cps/admin.py:928
+#: cps/admin.py:944
 #, python-format
 msgid "There was an error sending the Test e-mail: %(res)s"
 msgstr "Testisähköpostin lähetyksessä tapahtui virhe: %(res)s"
 
-#: cps/admin.py:930
+#: cps/admin.py:946
 msgid "Please configure your e-mail address first..."
 msgstr ""
 
-#: cps/admin.py:932
+#: cps/admin.py:948
 msgid "E-mail server settings updated"
 msgstr "Sähköpostipalvelimen tiedot päivitetty"
 
-#: cps/admin.py:943
+#: cps/admin.py:959
 msgid "User not found"
 msgstr ""
 
-#: cps/admin.py:978
+#: cps/admin.py:994
 #, python-format
 msgid "Password for user %(user)s reset"
 msgstr "Käyttäjän %(user)s salasana palautettu"
 
-#: cps/admin.py:981 cps/web.py:1361 cps/web.py:1425
+#: cps/admin.py:997 cps/web.py:1358 cps/web.py:1422
 msgid "An unknown error occurred. Please try again later."
 msgstr "Tapahtui tuntematon virhe. Yritä myöhemmin uudelleen."
 
-#: cps/admin.py:984 cps/web.py:1299
+#: cps/admin.py:1000 cps/web.py:1296
 msgid "Please configure the SMTP mail settings first..."
 msgstr "Ole hyvä ja aseta SMTP postiasetukset ensin..."
 
-#: cps/admin.py:996
+#: cps/admin.py:1012
 msgid "Logfile viewer"
 msgstr "Lokitiedoston katselin"
 
-#: cps/admin.py:1035
+#: cps/admin.py:1051
 msgid "Requesting update package"
 msgstr "Haetaan päivitystiedostoa"
 
-#: cps/admin.py:1036
+#: cps/admin.py:1052
 msgid "Downloading update package"
 msgstr "Ladataan päivitystiedostoa"
 
-#: cps/admin.py:1037
+#: cps/admin.py:1053
 msgid "Unzipping update package"
 msgstr "Puretaan päivitystiedostoa"
 
-#: cps/admin.py:1038
+#: cps/admin.py:1054
 msgid "Replacing files"
 msgstr "Korvataan tiedostoja"
 
-#: cps/admin.py:1039
+#: cps/admin.py:1055
 msgid "Database connections are closed"
 msgstr "Tietokantayhteydet on katkaistu"
 
-#: cps/admin.py:1040
+#: cps/admin.py:1056
 msgid "Stopping server"
 msgstr "Sammutetaan palvelin"
 
-#: cps/admin.py:1041
+#: cps/admin.py:1057
 msgid "Update finished, please press okay and reload page"
 msgstr "Päivitys valmistui, ole hyvä ja paina OK ja lataa sivu uudelleen"
 
-#: cps/admin.py:1042 cps/admin.py:1043 cps/admin.py:1044 cps/admin.py:1045
-#: cps/admin.py:1046
+#: cps/admin.py:1058 cps/admin.py:1059 cps/admin.py:1060 cps/admin.py:1061
+#: cps/admin.py:1062
 msgid "Update failed:"
 msgstr "Päivitys epäonnistui:"
 
-#: cps/admin.py:1042 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
+#: cps/admin.py:1058 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
 msgid "HTTP Error"
 msgstr "HTTP virhe"
 
-#: cps/admin.py:1043 cps/updater.py:321 cps/updater.py:524
+#: cps/admin.py:1059 cps/updater.py:321 cps/updater.py:524
 msgid "Connection error"
 msgstr "Yhteysvirhe"
 
-#: cps/admin.py:1044 cps/updater.py:323 cps/updater.py:526
+#: cps/admin.py:1060 cps/updater.py:323 cps/updater.py:526
 msgid "Timeout while establishing connection"
 msgstr "Aikakatkaisu yhteyttä luotaessa"
 
-#: cps/admin.py:1045 cps/updater.py:325 cps/updater.py:528
+#: cps/admin.py:1061 cps/updater.py:325 cps/updater.py:528
 msgid "General error"
 msgstr "Yleinen virhe"
 
-#: cps/admin.py:1046
+#: cps/admin.py:1062
 msgid "Update File Could Not be Saved in Temp Dir"
 msgstr ""
 
@@ -301,8 +307,8 @@ msgstr ""
 msgid "Book Successfully Deleted"
 msgstr ""
 
-#: cps/editbooks.py:254 cps/editbooks.py:548 cps/web.py:1644 cps/web.py:1685
-#: cps/web.py:1747
+#: cps/editbooks.py:254 cps/editbooks.py:549 cps/web.py:1641 cps/web.py:1682
+#: cps/web.py:1744
 msgid "Error opening eBook. File does not exist or file is not accessible"
 msgstr "Virhe e-kirjaa avatessa. Tiedostoa ei löydy tai se ei ole saatavilla"
 
@@ -310,82 +316,82 @@ msgstr "Virhe e-kirjaa avatessa. Tiedostoa ei löydy tai se ei ole saatavilla"
 msgid "edit metadata"
 msgstr "muokkaa metadataa"
 
-#: cps/editbooks.py:361
+#: cps/editbooks.py:360
 #, python-format
 msgid "%(langname)s is not a valid language"
 msgstr "%(langname)s ei ole kelvollinen kieli"
 
-#: cps/editbooks.py:467 cps/editbooks.py:712
+#: cps/editbooks.py:468 cps/editbooks.py:715
 #, python-format
 msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
 msgstr "Tiedostopääte '%(ext)s' ei ole sallittujen palvelimelle ladattavien listalla"
 
-#: cps/editbooks.py:471 cps/editbooks.py:716
+#: cps/editbooks.py:472 cps/editbooks.py:719
 msgid "File to be uploaded must have an extension"
 msgstr "Ladattavalla tiedostolla on oltava tiedostopääte"
 
-#: cps/editbooks.py:483 cps/editbooks.py:773
+#: cps/editbooks.py:484 cps/editbooks.py:779
 #, python-format
 msgid "Failed to create path %(path)s (Permission denied)."
 msgstr "Polun %(path)s luonti epäonnistui (Ei oikeutta)."
 
-#: cps/editbooks.py:488
+#: cps/editbooks.py:489
 #, python-format
 msgid "Failed to store file %(file)s."
 msgstr "Tiedoston %(file)s tallennus epäonnistui."
 
-#: cps/editbooks.py:506 cps/editbooks.py:864
+#: cps/editbooks.py:507 cps/editbooks.py:870
 #, python-format
 msgid "Database error: %(error)s."
 msgstr ""
 
-#: cps/editbooks.py:510
+#: cps/editbooks.py:511
 #, python-format
 msgid "File format %(ext)s added to %(book)s"
 msgstr "Tiedostoformaatti %(ext)s lisätty %(book)s"
 
-#: cps/editbooks.py:653
+#: cps/editbooks.py:656
 msgid "Metadata successfully updated"
 msgstr "Metadata päivitetty onnistuneesti"
 
-#: cps/editbooks.py:662
+#: cps/editbooks.py:665
 msgid "Error editing book, please check logfile for details"
 msgstr "Kirjan editoinnissa tapahtui virhe, tarkista virheilmoitus lokista"
 
-#: cps/editbooks.py:724
+#: cps/editbooks.py:727
 #, python-format
 msgid "File %(filename)s could not saved to temp dir"
 msgstr ""
 
-#: cps/editbooks.py:734
+#: cps/editbooks.py:737
 msgid "Uploaded book probably exists in the library, consider to change before upload new: "
 msgstr ""
 
-#: cps/editbooks.py:780
+#: cps/editbooks.py:786
 #, python-format
 msgid "Failed to Move File %(file)s: %(error)s"
 msgstr ""
 
-#: cps/editbooks.py:836
+#: cps/editbooks.py:842
 #, python-format
 msgid "Failed to Move Cover File %(file)s: %(error)s"
 msgstr ""
 
-#: cps/editbooks.py:850
+#: cps/editbooks.py:856
 #, python-format
 msgid "File %(file)s uploaded"
 msgstr "Tiedosto %(file)s tallennettu"
 
-#: cps/editbooks.py:876
+#: cps/editbooks.py:882
 msgid "Source or destination format for conversion missing"
 msgstr "Lähteen tai kohteen tiedostomuoto puuttuu"
 
-#: cps/editbooks.py:884
+#: cps/editbooks.py:890
 #, python-format
 msgid "Book successfully queued for converting to %(book_format)s"
 msgstr "Kirja lisätty muutosjonoon muotoon %(book_format)s"
 
-#: cps/editbooks.py:888
+#: cps/editbooks.py:894
 #, python-format
 msgid "There was an error converting this book: %(res)s"
 msgstr "Kirjan muunnoksessa tapahtui virhe: %(res)s"
@@ -499,71 +505,71 @@ msgstr "Tiedostoa %(file)s ei löytynyt Google Drivesta"
 msgid "Book path %(path)s not found on Google Drive"
 msgstr "Kirjan polkua %(path)s ei löytynyt Google Drivesta"
 
-#: cps/helper.py:542
+#: cps/helper.py:550
 msgid "Error Downloading Cover"
 msgstr ""
 
-#: cps/helper.py:545
+#: cps/helper.py:553
 msgid "Cover Format Error"
 msgstr ""
 
-#: cps/helper.py:561
+#: cps/helper.py:569
 msgid "Failed to create path for cover"
 msgstr ""
 
-#: cps/helper.py:566
+#: cps/helper.py:574
 msgid "Cover-file is not a valid image file, or could not be stored"
 msgstr ""
 
-#: cps/helper.py:577
+#: cps/helper.py:585
 msgid "Only jpg/jpeg/png/webp files are supported as coverfile"
 msgstr ""
 
-#: cps/helper.py:591
+#: cps/helper.py:599
 msgid "Only jpg/jpeg files are supported as coverfile"
 msgstr ""
 
-#: cps/helper.py:640
+#: cps/helper.py:648
 msgid "Unrar binary file not found"
 msgstr ""
 
-#: cps/helper.py:654
+#: cps/helper.py:662
 msgid "Error excecuting UnRar"
 msgstr ""
 
-#: cps/helper.py:710
+#: cps/helper.py:718
 msgid "Waiting"
 msgstr "Odottaa"
 
-#: cps/helper.py:712
+#: cps/helper.py:720
 msgid "Failed"
 msgstr "Epäonnistui"
 
-#: cps/helper.py:714
+#: cps/helper.py:722
 msgid "Started"
 msgstr "Aloitettu"
 
-#: cps/helper.py:716
+#: cps/helper.py:724
 msgid "Finished"
 msgstr "Valmistui"
 
-#: cps/helper.py:718
+#: cps/helper.py:726
 msgid "Unknown Status"
 msgstr "Tuntematon tila"
 
-#: cps/helper.py:723
+#: cps/helper.py:731
 msgid "E-mail: "
 msgstr "Sähköposti: "
 
-#: cps/helper.py:725 cps/helper.py:729
+#: cps/helper.py:733 cps/helper.py:737
 msgid "Convert: "
 msgstr "Muunna: "
 
-#: cps/helper.py:727
+#: cps/helper.py:735
 msgid "Upload: "
 msgstr "Lähetä: "
 
-#: cps/helper.py:731
+#: cps/helper.py:739
 msgid "Unknown Task: "
 msgstr "Tuntematon tehtävä: "
 
@@ -596,7 +602,7 @@ msgstr "Googleen kirjautuminen epäonnistui."
 msgid "Failed to fetch user info from Google."
 msgstr "Käyttäjätietojen haku Googlesta epäonnistui."
 
-#: cps/oauth_bb.py:225 cps/web.py:1397 cps/web.py:1537
+#: cps/oauth_bb.py:225 cps/web.py:1394 cps/web.py:1534
 #, python-format
 msgid "you are now logged in as: '%(nickname)s'"
 msgstr "olet nyt kirjautunut tunnuksella: \"%(nickname)s\""
@@ -633,218 +639,218 @@ msgstr "GitHub Oauth virhe, yritä myöhemmin uudelleen."
 msgid "Google Oauth error, please retry later."
 msgstr "Google Oauth virhe, yritä myöhemmin uudelleen."
 
-#: cps/shelf.py:66 cps/shelf.py:111
+#: cps/shelf.py:67 cps/shelf.py:120
 msgid "Invalid shelf specified"
 msgstr "Virheellinen hylly valittu"
 
-#: cps/shelf.py:72
+#: cps/shelf.py:73
 #, python-format
 msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s"
 msgstr "Valitettavasti sinulla ei ole oikeutta lisätä kirjaa hyllyyn: %(shelfname)s"
 
-#: cps/shelf.py:82
+#: cps/shelf.py:83
 #, python-format
 msgid "Book is already part of the shelf: %(shelfname)s"
 msgstr "Kirja on jo hyllyssä: %(shelfname)s"
 
-#: cps/shelf.py:97
+#: cps/shelf.py:106
 #, python-format
 msgid "Book has been added to shelf: %(sname)s"
 msgstr "Kirja on lisätty hyllyyn: %(sname)s"
 
-#: cps/shelf.py:115
+#: cps/shelf.py:124
 #, python-format
 msgid "You are not allowed to add a book to the the shelf: %(name)s"
 msgstr "Sinulla ei ole oikeutta lisätä kirjaa hyllyyn: %(name)s"
 
-#: cps/shelf.py:133
+#: cps/shelf.py:142
 #, python-format
 msgid "Books are already part of the shelf: %(name)s"
 msgstr "Kirjat on jo osa hyllyssä: %(name)s"
 
-#: cps/shelf.py:148
+#: cps/shelf.py:158
 #, python-format
 msgid "Books have been added to shelf: %(sname)s"
 msgstr "Kirjat on lisätty hyllyyn: %(sname)s"
 
-#: cps/shelf.py:150
+#: cps/shelf.py:163
 #, python-format
 msgid "Could not add books to shelf: %(sname)s"
 msgstr "Kirjojen lisäys hyllyyn: %(sname)s epäonnistui"
 
-#: cps/shelf.py:188
+#: cps/shelf.py:208
 #, python-format
 msgid "Book has been removed from shelf: %(sname)s"
 msgstr "Kirja on poistettu hyllystä: %(sname)s"
 
-#: cps/shelf.py:196
+#: cps/shelf.py:216
 #, python-format
 msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
 msgstr "Valitettavsti sinulla ei ole oikeutta poistaa kirjaa hyllystä: %(sname)s"
 
-#: cps/shelf.py:220 cps/shelf.py:260
+#: cps/shelf.py:240 cps/shelf.py:284
 #, python-format
 msgid "A public shelf with the name '%(title)s' already exists."
 msgstr ""
 
-#: cps/shelf.py:229 cps/shelf.py:270
+#: cps/shelf.py:249 cps/shelf.py:294
 #, python-format
 msgid "A private shelf with the name '%(title)s' already exists."
 msgstr ""
 
-#: cps/shelf.py:236
+#: cps/shelf.py:256
 #, python-format
 msgid "Shelf %(title)s created"
 msgstr "Hylly %(title)s luotu"
 
-#: cps/shelf.py:239 cps/shelf.py:284
+#: cps/shelf.py:263 cps/shelf.py:312
 msgid "There was an error"
 msgstr "Tapahtui virhe"
 
-#: cps/shelf.py:240 cps/shelf.py:242 cps/templates/layout.html:144
+#: cps/shelf.py:264 cps/shelf.py:266 cps/templates/layout.html:144
 msgid "Create a Shelf"
 msgstr "luo hylly"
 
-#: cps/shelf.py:282
+#: cps/shelf.py:306
 #, python-format
 msgid "Shelf %(title)s changed"
 msgstr "Hylly %(title)s muutettu"
 
-#: cps/shelf.py:285 cps/shelf.py:287
+#: cps/shelf.py:313 cps/shelf.py:315
 msgid "Edit a shelf"
 msgstr "Muokkaa hyllyä"
 
-#: cps/shelf.py:332
+#: cps/shelf.py:369
 #, python-format
 msgid "Shelf: '%(name)s'"
 msgstr "Hylly: '%(name)s'"
 
-#: cps/shelf.py:335
+#: cps/shelf.py:372
 msgid "Error opening shelf. Shelf does not exist or is not accessible"
 msgstr "Virhe hyllyn avauksessa. Hyllyä ei ole tai se ei ole saatavilla"
 
-#: cps/shelf.py:368
+#: cps/shelf.py:409
 msgid "Hidden Book"
 msgstr ""
 
-#: cps/shelf.py:373
+#: cps/shelf.py:414
 #, python-format
 msgid "Change order of Shelf: '%(name)s'"
 msgstr "Muuta hyllyn: '%(name)s' järjestystä"
 
-#: cps/ub.py:64
+#: cps/ub.py:65
 msgid "Recently Added"
 msgstr "Viimeksi lisätty"
 
-#: cps/ub.py:66
+#: cps/ub.py:67
 msgid "Show recent books"
 msgstr "Näytä viimeisimmät kirjat"
 
-#: cps/templates/index.xml:17 cps/ub.py:67
+#: cps/templates/index.xml:17 cps/ub.py:68
 msgid "Hot Books"
 msgstr "Kuumat kirjat"
 
-#: cps/ub.py:69
+#: cps/ub.py:70
 msgid "Show Hot Books"
 msgstr "Näytä kuumat kirjat"
 
-#: cps/templates/index.xml:24 cps/ub.py:71 cps/web.py:655
+#: cps/templates/index.xml:24 cps/ub.py:72 cps/web.py:652
 msgid "Top Rated Books"
 msgstr "Parhaiten arvioidut kirjat"
 
-#: cps/ub.py:73
+#: cps/ub.py:74
 msgid "Show Top Rated Books"
 msgstr "Näytä parhaiten arvioidut kirjat"
 
-#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:74
-#: cps/web.py:1222
+#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:75
+#: cps/web.py:1219
 msgid "Read Books"
 msgstr "Luetut kirjat"
 
-#: cps/ub.py:76
+#: cps/ub.py:77
 msgid "Show read and unread"
 msgstr "Näytä luetut ja lukemattomat"
 
-#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:78
-#: cps/web.py:1225
+#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:79
+#: cps/web.py:1222
 msgid "Unread Books"
 msgstr "Lukemattomat kirjat"
 
-#: cps/ub.py:80
+#: cps/ub.py:81
 msgid "Show unread"
 msgstr "Näyt lukemattomat"
 
-#: cps/ub.py:81
+#: cps/ub.py:82
 msgid "Discover"
 msgstr "Löydä"
 
-#: cps/ub.py:83
+#: cps/ub.py:84
 msgid "Show random books"
 msgstr "Näytä satunnaisia kirjoja"
 
-#: cps/templates/index.xml:75 cps/ub.py:84 cps/web.py:970
+#: cps/templates/index.xml:75 cps/ub.py:85 cps/web.py:967
 msgid "Categories"
 msgstr "Kategoriat"
 
-#: cps/ub.py:86
+#: cps/ub.py:87
 msgid "Show category selection"
 msgstr "Näytä kategoriavalinta"
 
 #: cps/templates/book_edit.html:84 cps/templates/index.xml:82
-#: cps/templates/search_form.html:53 cps/ub.py:87 cps/web.py:886 cps/web.py:896
+#: cps/templates/search_form.html:53 cps/ub.py:88 cps/web.py:883 cps/web.py:893
 msgid "Series"
 msgstr "Sarjat"
 
-#: cps/ub.py:89
+#: cps/ub.py:90
 msgid "Show series selection"
 msgstr "Näytä sarjavalinta"
 
-#: cps/templates/index.xml:61 cps/ub.py:90
+#: cps/templates/index.xml:61 cps/ub.py:91
 msgid "Authors"
 msgstr "Kirjailijat"
 
-#: cps/ub.py:92
+#: cps/ub.py:93
 msgid "Show author selection"
 msgstr "Näytä kirjailijavalinta"
 
-#: cps/templates/index.xml:68 cps/ub.py:94 cps/web.py:869
+#: cps/templates/index.xml:68 cps/ub.py:95 cps/web.py:866
 msgid "Publishers"
 msgstr "Julkaisijat"
 
-#: cps/ub.py:96
+#: cps/ub.py:97
 msgid "Show publisher selection"
 msgstr "Näytä julkaisijavalinta"
 
-#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:97
-#: cps/web.py:953
+#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:98
+#: cps/web.py:950
 msgid "Languages"
 msgstr "Kielet"
 
-#: cps/ub.py:100
+#: cps/ub.py:101
 msgid "Show language selection"
 msgstr "Näytä keilivalinta"
 
-#: cps/templates/index.xml:96 cps/ub.py:101
+#: cps/templates/index.xml:96 cps/ub.py:102
 msgid "Ratings"
 msgstr "Arvostelut"
 
-#: cps/ub.py:103
+#: cps/ub.py:104
 msgid "Show ratings selection"
 msgstr "Näytä arvosteluvalinta"
 
-#: cps/templates/index.xml:104 cps/ub.py:104
+#: cps/templates/index.xml:104 cps/ub.py:105
 msgid "File formats"
 msgstr "Tiedotomuodot"
 
-#: cps/ub.py:106
+#: cps/ub.py:107
 msgid "Show file formats selection"
 msgstr "Näytä tiedostomuotovalinta"
 
-#: cps/ub.py:108 cps/web.py:1249
+#: cps/ub.py:109 cps/web.py:1246
 msgid "Archived Books"
 msgstr ""
 
-#: cps/ub.py:110
+#: cps/ub.py:111
 msgid "Show archived books"
 msgstr ""
 
@@ -877,220 +883,220 @@ msgstr "Uusi päivitys saatavilla. Paina alla olevaa nappia päivittääksesi ve
 msgid "Click on the button below to update to the latest stable version."
 msgstr "Paina alla olevaa nappia päivittääksesi uusimpaan vakaaseen versioon."
 
-#: cps/web.py:322
+#: cps/web.py:319
 #, python-format
 msgid "Error: %(ldaperror)s"
 msgstr ""
 
-#: cps/web.py:326
+#: cps/web.py:323
 msgid "Error: No user returned in response of LDAP server"
 msgstr ""
 
-#: cps/web.py:374
+#: cps/web.py:371
 msgid "Failed to Create at Least One LDAP User"
 msgstr ""
 
-#: cps/web.py:377
+#: cps/web.py:374
 msgid "At Least One LDAP User Not Found in Database"
 msgstr ""
 
-#: cps/web.py:379
+#: cps/web.py:376
 msgid "User Successfully Imported"
 msgstr ""
 
-#: cps/web.py:625
+#: cps/web.py:622
 msgid "Recently Added Books"
 msgstr "Viimeksi lisätyt kirjat"
 
-#: cps/templates/index.html:5 cps/web.py:663
+#: cps/templates/index.html:5 cps/web.py:660
 msgid "Discover (Random Books)"
 msgstr "Löydä (satunnaiset kirjat)"
 
-#: cps/web.py:691
+#: cps/web.py:688
 msgid "Books"
 msgstr "Kirjat"
 
-#: cps/web.py:718
+#: cps/web.py:715
 msgid "Hot Books (Most Downloaded)"
 msgstr "Kuumat kirjat (ladatuimmat)"
 
-#: cps/web.py:731
+#: cps/web.py:728
 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible"
 msgstr "Virhe eKirjan avaamisessa. Tiedostoa ei ole tai se ei ole saatavilla:"
 
-#: cps/web.py:745
+#: cps/web.py:742
 #, python-format
 msgid "Author: %(name)s"
 msgstr "Kirjailija: %(name)s"
 
-#: cps/web.py:759
+#: cps/web.py:756
 #, python-format
 msgid "Publisher: %(name)s"
 msgstr "Julkaisija: %(name)s"
 
-#: cps/web.py:772
+#: cps/web.py:769
 #, python-format
 msgid "Series: %(serie)s"
 msgstr "Sarja: %(serie)s"
 
-#: cps/web.py:785
+#: cps/web.py:782
 #, python-format
 msgid "Rating: %(rating)s stars"
 msgstr "Arvostelu: %(rating)s tähteä"
 
-#: cps/web.py:798
+#: cps/web.py:795
 #, python-format
 msgid "File format: %(format)s"
 msgstr "Tiedostomuoto: %(format)s"
 
-#: cps/web.py:812
+#: cps/web.py:809
 #, python-format
 msgid "Category: %(name)s"
 msgstr "Kategoria: %(name)s"
 
-#: cps/web.py:831
+#: cps/web.py:828
 #, python-format
 msgid "Language: %(name)s"
 msgstr "Kieli: %(name)s"
 
-#: cps/web.py:910
+#: cps/web.py:907
 msgid "Ratings list"
 msgstr "Arvostelulistaus"
 
-#: cps/web.py:925
+#: cps/web.py:922
 msgid "File formats list"
 msgstr "Tiedostomuotolistaus"
 
-#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:984
+#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:981
 msgid "Tasks"
 msgstr "Tehtävät"
 
 #: cps/templates/book_edit.html:235 cps/templates/feed.xml:33
 #: cps/templates/layout.html:45 cps/templates/layout.html:48
-#: cps/templates/search_form.html:174 cps/web.py:1010 cps/web.py:1015
+#: cps/templates/search_form.html:174 cps/web.py:1007 cps/web.py:1012
 msgid "Search"
 msgstr "Hae"
 
-#: cps/web.py:1066
+#: cps/web.py:1063
 msgid "Published after "
 msgstr "Julkaistu alkaen "
 
-#: cps/web.py:1073
+#: cps/web.py:1070
 msgid "Published before "
 msgstr "Julkaisut ennen "
 
-#: cps/web.py:1087
+#: cps/web.py:1084
 #, python-format
 msgid "Rating <= %(rating)s"
 msgstr "Arvostelu <= %(rating)s"
 
-#: cps/web.py:1089
+#: cps/web.py:1086
 #, python-format
 msgid "Rating >= %(rating)s"
 msgstr "Arvostelu >= %(rating)s"
 
-#: cps/web.py:1158 cps/web.py:1183
+#: cps/web.py:1155 cps/web.py:1180
 msgid "search"
 msgstr "hae"
 
-#: cps/web.py:1213
+#: cps/web.py:1210
 #, python-format
 msgid "Custom Column No.%(column)d is not existing in calibre database"
 msgstr ""
 
-#: cps/web.py:1304
+#: cps/web.py:1301
 #, python-format
 msgid "Book successfully queued for sending to %(kindlemail)s"
 msgstr "Kirja lisätty onnistuneeksi lähetettäväksi osoitteeseen %(kindlemail)s"
 
-#: cps/web.py:1308
+#: cps/web.py:1305
 #, python-format
 msgid "Oops! There was an error sending this book: %(res)s"
 msgstr "Kirjan: %(res)s lähettämisessa tapahtui virhe"
 
-#: cps/web.py:1310
+#: cps/web.py:1307
 msgid "Please update your profile with a valid Send to Kindle E-mail Address."
 msgstr "Ole hyvä ja aseta Kindle sähköpostiosoite ensin..."
 
-#: cps/web.py:1327
+#: cps/web.py:1324
 msgid "E-Mail server is not configured, please contact your administrator!"
 msgstr ""
 
-#: cps/web.py:1328 cps/web.py:1338 cps/web.py:1362 cps/web.py:1366
-#: cps/web.py:1371 cps/web.py:1375
+#: cps/web.py:1325 cps/web.py:1335 cps/web.py:1359 cps/web.py:1363
+#: cps/web.py:1368 cps/web.py:1372
 msgid "register"
 msgstr "rekisteröidy"
 
-#: cps/web.py:1364
+#: cps/web.py:1361
 msgid "Your e-mail is not allowed to register"
 msgstr "Sähköpostiosoitteellasi ei ole sallittua rekisteröityä"
 
-#: cps/web.py:1367
+#: cps/web.py:1364
 msgid "Confirmation e-mail was send to your e-mail account."
 msgstr "Vahvistusviesti on lähetetty sähköpostiosoitteeseesi."
 
-#: cps/web.py:1370
+#: cps/web.py:1367
 msgid "This username or e-mail address is already in use."
 msgstr "Käyttäjätunnus tai sähköpostiosoite on jo käytössä."
 
-#: cps/web.py:1387
+#: cps/web.py:1384
 msgid "Cannot activate LDAP authentication"
 msgstr "LDAP autnetikoinnin aktivointi ei onnistu"
 
-#: cps/web.py:1404
+#: cps/web.py:1401
 #, python-format
 msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known"
 msgstr ""
 
-#: cps/web.py:1410
+#: cps/web.py:1407
 #, python-format
 msgid "Could not login: %(message)s"
 msgstr ""
 
-#: cps/web.py:1414 cps/web.py:1438
+#: cps/web.py:1411 cps/web.py:1435
 msgid "Wrong Username or Password"
 msgstr "Väärä käyttäjätunnus tai salasana"
 
-#: cps/web.py:1421
+#: cps/web.py:1418
 msgid "New Password was send to your email address"
 msgstr ""
 
-#: cps/web.py:1427
+#: cps/web.py:1424
 msgid "Please enter valid username to reset password"
 msgstr ""
 
-#: cps/web.py:1433
+#: cps/web.py:1430
 #, python-format
 msgid "You are now logged in as: '%(nickname)s'"
 msgstr "olet kirjautunut tunnuksella: '%(nickname)s'"
 
-#: cps/web.py:1442 cps/web.py:1469
+#: cps/web.py:1439 cps/web.py:1466
 msgid "login"
 msgstr "kirjaudu"
 
-#: cps/web.py:1481 cps/web.py:1515
+#: cps/web.py:1478 cps/web.py:1512
 msgid "Token not found"
 msgstr "Valtuutusta ei löytynyt"
 
-#: cps/web.py:1490 cps/web.py:1523
+#: cps/web.py:1487 cps/web.py:1520
 msgid "Token has expired"
 msgstr "Valtuutus vanhentunut"
 
-#: cps/web.py:1499
+#: cps/web.py:1496
 msgid "Success! Please return to your device"
 msgstr "Onnistui! Ole hyvä ja palaa laitteellesi"
 
-#: cps/web.py:1580 cps/web.py:1625 cps/web.py:1631
+#: cps/web.py:1577 cps/web.py:1622 cps/web.py:1628
 #, python-format
 msgid "%(name)s's profile"
 msgstr "%(name)sn profiili"
 
-#: cps/web.py:1627
+#: cps/web.py:1624
 msgid "Profile updated"
 msgstr "Profiili päivitetty"
 
-#: cps/web.py:1656 cps/web.py:1659 cps/web.py:1662 cps/web.py:1669
-#: cps/web.py:1674
+#: cps/web.py:1653 cps/web.py:1656 cps/web.py:1659 cps/web.py:1666
+#: cps/web.py:1671
 msgid "Read a Book"
 msgstr "Lue kirja"
 
diff --git a/cps/translations/fr/LC_MESSAGES/messages.mo b/cps/translations/fr/LC_MESSAGES/messages.mo
index a60b8ff1bd535eceb2e298709ea563431aa39dbb..64560b3e4ce8726a0b95eb959f0806228f7dd263 100644
Binary files a/cps/translations/fr/LC_MESSAGES/messages.mo and b/cps/translations/fr/LC_MESSAGES/messages.mo differ
diff --git a/cps/translations/fr/LC_MESSAGES/messages.po b/cps/translations/fr/LC_MESSAGES/messages.po
index b5bd6e226f2e18ad32fb8e3d5a30e7a9dc274e57..6860cc5234826c02050940d23e503cbd9391f27b 100644
--- a/cps/translations/fr/LC_MESSAGES/messages.po
+++ b/cps/translations/fr/LC_MESSAGES/messages.po
@@ -21,7 +21,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version:  Calibre-Web\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-06-07 06:47+0200\n"
+"POT-Creation-Date: 2020-06-28 09:31+0200\n"
 "PO-Revision-Date: 2020-06-07 06:47+0200\n"
 "Last-Translator: Dekani <dekani1500@gmail.com>\n"
 "Language: fr\n"
@@ -60,9 +60,9 @@ msgstr "Reconnecté avec succès"
 msgid "Unknown command"
 msgstr "Commande inconnue"
 
-#: cps/admin.py:116 cps/editbooks.py:563 cps/editbooks.py:573
-#: cps/editbooks.py:667 cps/editbooks.py:669 cps/editbooks.py:730
-#: cps/editbooks.py:743 cps/updater.py:509 cps/uploader.py:97
+#: cps/admin.py:116 cps/editbooks.py:564 cps/editbooks.py:576
+#: cps/editbooks.py:670 cps/editbooks.py:672 cps/editbooks.py:733
+#: cps/editbooks.py:749 cps/updater.py:509 cps/uploader.py:97
 #: cps/uploader.py:107
 msgid "Unknown"
 msgstr "Inconnu"
@@ -75,7 +75,7 @@ msgstr "Page admin"
 msgid "UI Configuration"
 msgstr "Configuration de l’interface utilisateur"
 
-#: cps/admin.py:189 cps/admin.py:706
+#: cps/admin.py:189 cps/admin.py:711
 msgid "Calibre-Web configuration updated"
 msgstr "Configuration de Calibre-Web mise à jour"
 
@@ -127,175 +127,181 @@ msgstr "Le filtre objet de l'utilisateur LDAP a une parenthèse non gérée"
 msgid "LDAP Certificate Location is not Valid, Please Enter Correct Path"
 msgstr "L'emplacement du certificat LDAP est incorrect, veuillez saisir un chemin valide"
 
-#: cps/admin.py:627
+#: cps/admin.py:628
 msgid "Keyfile Location is not Valid, Please Enter Correct Path"
 msgstr "L'emplacement du fichier Keyfile est incorrect, veuillez saisir un chemin valide"
 
-#: cps/admin.py:631
+#: cps/admin.py:632
 msgid "Certfile Location is not Valid, Please Enter Correct Path"
 msgstr "L'emplacement du fichier Certfile est incorrect, veuillez saisir un chemin valide"
 
-#: cps/admin.py:701
+#: cps/admin.py:694 cps/admin.py:793 cps/admin.py:885 cps/admin.py:934
+#: cps/shelf.py:100 cps/shelf.py:161 cps/shelf.py:202 cps/shelf.py:260
+#: cps/shelf.py:309 cps/shelf.py:338 cps/shelf.py:368 cps/shelf.py:392
+msgid "Settings DB is not Writeable"
+msgstr ""
+
+#: cps/admin.py:706
 msgid "DB Location is not Valid, Please Enter Correct Path"
 msgstr "L'emplacement DB est incorrect, veuillez saisir un chemin valide"
 
-#: cps/admin.py:703
+#: cps/admin.py:708
 msgid "DB is not Writeable"
 msgstr "La DB n'est pas accessible en écriture"
 
-#: cps/admin.py:736
+#: cps/admin.py:741
 msgid "Basic Configuration"
 msgstr "Configuration principale"
 
-#: cps/admin.py:751 cps/web.py:1337
+#: cps/admin.py:756 cps/web.py:1334
 msgid "Please fill out all fields!"
 msgstr "Veuillez compléter tous les champs !"
 
-#: cps/admin.py:754 cps/admin.py:766 cps/admin.py:772 cps/admin.py:892
+#: cps/admin.py:759 cps/admin.py:771 cps/admin.py:777 cps/admin.py:903
 msgid "Add new user"
 msgstr "Ajouter un nouvel utilisateur"
 
-#: cps/admin.py:763 cps/web.py:1578
+#: cps/admin.py:768 cps/web.py:1575
 msgid "E-mail is not from valid domain"
 msgstr "Cette adresse de courriel n’appartient pas à un domaine valide"
 
-#: cps/admin.py:770 cps/admin.py:785
+#: cps/admin.py:775 cps/admin.py:790
 msgid "Found an existing account for this e-mail address or nickname."
 msgstr "Un compte existant a été trouvé pour cette adresse de courriel ou pour ce surnom."
 
-#: cps/admin.py:781
+#: cps/admin.py:786
 #, python-format
 msgid "User '%(user)s' created"
 msgstr "Utilisateur '%(user)s' créé"
 
-#: cps/admin.py:794
+#: cps/admin.py:802
 #, python-format
 msgid "User '%(nick)s' deleted"
 msgstr "Utilisateur '%(nick)s' supprimé"
 
-#: cps/admin.py:797
+#: cps/admin.py:805
 msgid "No admin user remaining, can't delete user"
 msgstr "Aucun utilisateur admin restant, impossible de supprimer l’utilisateur"
 
-#: cps/admin.py:803
+#: cps/admin.py:811
 msgid "No admin user remaining, can't remove admin role"
 msgstr "Aucun utilisateur admin restant, impossible de supprimer le rôle admin"
 
-#: cps/admin.py:839 cps/web.py:1621
+#: cps/admin.py:847 cps/web.py:1618
 msgid "Found an existing account for this e-mail address."
 msgstr "Un compte existant a été trouvé pour cette adresse de courriel."
 
-#: cps/admin.py:849 cps/admin.py:864 cps/admin.py:967 cps/web.py:1596
+#: cps/admin.py:857 cps/admin.py:872 cps/admin.py:983 cps/web.py:1593
 #, python-format
 msgid "Edit User %(nick)s"
 msgstr "Éditer l'utilisateur %(nick)s"
 
-#: cps/admin.py:855 cps/web.py:1588
+#: cps/admin.py:863 cps/web.py:1585
 msgid "This username is already taken"
 msgstr "Cet utilisateur est déjà pris"
 
-#: cps/admin.py:871
+#: cps/admin.py:879
 #, python-format
 msgid "User '%(nick)s' updated"
 msgstr "Utilisateur '%(nick)s'  mis à jour"
 
-#: cps/admin.py:874
+#: cps/admin.py:882
 msgid "An unknown error occured."
 msgstr "Oups ! Une erreur inconnue a eu lieu."
 
-#: cps/admin.py:901 cps/templates/admin.html:71
+#: cps/admin.py:912 cps/templates/admin.html:71
 msgid "Edit E-mail Server Settings"
 msgstr "Modifier les paramètres du serveur de courriels"
 
-#: cps/admin.py:925
+#: cps/admin.py:941
 #, python-format
 msgid "Test e-mail successfully send to %(kindlemail)s"
 msgstr "Courriel de test envoyé avec succès sur %(kindlemail)s"
 
-#: cps/admin.py:928
+#: cps/admin.py:944
 #, python-format
 msgid "There was an error sending the Test e-mail: %(res)s"
 msgstr "Il y a eu une erreur pendant l’envoi du courriel de test : %(res)s"
 
-#: cps/admin.py:930
+#: cps/admin.py:946
 msgid "Please configure your e-mail address first..."
 msgstr "Veuillez d'abord configurer votre adresse de courriel..."
 
-#: cps/admin.py:932
+#: cps/admin.py:948
 msgid "E-mail server settings updated"
 msgstr "Les paramètres du serveur de courriels ont été mis à jour"
 
-#: cps/admin.py:943
+#: cps/admin.py:959
 msgid "User not found"
 msgstr "L'utilisateur n'a pas été trouvé"
 
-#: cps/admin.py:978
+#: cps/admin.py:994
 #, python-format
 msgid "Password for user %(user)s reset"
 msgstr "Le mot de passe de l’utilisateur %(user)s a été réinitialisé"
 
-#: cps/admin.py:981 cps/web.py:1361 cps/web.py:1425
+#: cps/admin.py:997 cps/web.py:1358 cps/web.py:1422
 msgid "An unknown error occurred. Please try again later."
 msgstr "Une erreur inconnue est survenue. Veuillez réessayer plus tard."
 
-#: cps/admin.py:984 cps/web.py:1299
+#: cps/admin.py:1000 cps/web.py:1296
 msgid "Please configure the SMTP mail settings first..."
 msgstr "Veuillez configurer les paramètres SMTP au préalable..."
 
-#: cps/admin.py:996
+#: cps/admin.py:1012
 msgid "Logfile viewer"
 msgstr "Visualiseur de fichier journal"
 
-#: cps/admin.py:1035
+#: cps/admin.py:1051
 msgid "Requesting update package"
 msgstr "Demande de mise à jour"
 
-#: cps/admin.py:1036
+#: cps/admin.py:1052
 msgid "Downloading update package"
 msgstr "Téléchargement de la mise à jour"
 
-#: cps/admin.py:1037
+#: cps/admin.py:1053
 msgid "Unzipping update package"
 msgstr "Décompression de la mise à jour"
 
-#: cps/admin.py:1038
+#: cps/admin.py:1054
 msgid "Replacing files"
 msgstr "Remplacement des fichiers"
 
-#: cps/admin.py:1039
+#: cps/admin.py:1055
 msgid "Database connections are closed"
 msgstr "Les connexions à la base de données ont été fermées"
 
-#: cps/admin.py:1040
+#: cps/admin.py:1056
 msgid "Stopping server"
 msgstr "Arrêt du serveur"
 
-#: cps/admin.py:1041
+#: cps/admin.py:1057
 msgid "Update finished, please press okay and reload page"
 msgstr "Mise à jour terminée, merci d’appuyer sur okay et de rafraîchir la page"
 
-#: cps/admin.py:1042 cps/admin.py:1043 cps/admin.py:1044 cps/admin.py:1045
-#: cps/admin.py:1046
+#: cps/admin.py:1058 cps/admin.py:1059 cps/admin.py:1060 cps/admin.py:1061
+#: cps/admin.py:1062
 msgid "Update failed:"
 msgstr "La mise à jour a échoué :"
 
-#: cps/admin.py:1042 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
+#: cps/admin.py:1058 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
 msgid "HTTP Error"
 msgstr "Erreur HTTP"
 
-#: cps/admin.py:1043 cps/updater.py:321 cps/updater.py:524
+#: cps/admin.py:1059 cps/updater.py:321 cps/updater.py:524
 msgid "Connection error"
 msgstr "Erreur de connexion"
 
-#: cps/admin.py:1044 cps/updater.py:323 cps/updater.py:526
+#: cps/admin.py:1060 cps/updater.py:323 cps/updater.py:526
 msgid "Timeout while establishing connection"
 msgstr "Délai d'attente dépassé lors de l'établissement de connexion"
 
-#: cps/admin.py:1045 cps/updater.py:325 cps/updater.py:528
+#: cps/admin.py:1061 cps/updater.py:325 cps/updater.py:528
 msgid "General error"
 msgstr "Erreur générale"
 
-#: cps/admin.py:1046
+#: cps/admin.py:1062
 msgid "Update File Could Not be Saved in Temp Dir"
 msgstr "Le fichier de mise à jour ne peut pas être sauvegardé dans le répertoire temporaire"
 
@@ -315,8 +321,8 @@ msgstr "Le format du livre a été supprimé avec succès"
 msgid "Book Successfully Deleted"
 msgstr "Le livre a été supprimé avec succès"
 
-#: cps/editbooks.py:254 cps/editbooks.py:548 cps/web.py:1644 cps/web.py:1685
-#: cps/web.py:1747
+#: cps/editbooks.py:254 cps/editbooks.py:549 cps/web.py:1641 cps/web.py:1682
+#: cps/web.py:1744
 msgid "Error opening eBook. File does not exist or file is not accessible"
 msgstr "Erreur à l’ouverture du livre. Le fichier n’existe pas ou n’est pas accessible"
 
@@ -324,82 +330,82 @@ msgstr "Erreur à l’ouverture du livre. Le fichier n’existe pas ou n’est p
 msgid "edit metadata"
 msgstr "modifier les métadonnées"
 
-#: cps/editbooks.py:361
+#: cps/editbooks.py:360
 #, python-format
 msgid "%(langname)s is not a valid language"
 msgstr "%(langname)s n'est pas une langue valide"
 
-#: cps/editbooks.py:467 cps/editbooks.py:712
+#: cps/editbooks.py:468 cps/editbooks.py:715
 #, python-format
 msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
 msgstr "L’extension de fichier '%(ext)s' n’est pas autorisée pour être déposée sur ce serveur"
 
-#: cps/editbooks.py:471 cps/editbooks.py:716
+#: cps/editbooks.py:472 cps/editbooks.py:719
 msgid "File to be uploaded must have an extension"
 msgstr "Pour être déposé le fichier doit avoir une extension"
 
-#: cps/editbooks.py:483 cps/editbooks.py:773
+#: cps/editbooks.py:484 cps/editbooks.py:779
 #, python-format
 msgid "Failed to create path %(path)s (Permission denied)."
 msgstr "Impossible de créer le chemin %(path)s (Permission refusée)."
 
-#: cps/editbooks.py:488
+#: cps/editbooks.py:489
 #, python-format
 msgid "Failed to store file %(file)s."
 msgstr "Échec de la sauvegarde du fichier %(file)s."
 
-#: cps/editbooks.py:506 cps/editbooks.py:864
+#: cps/editbooks.py:507 cps/editbooks.py:870
 #, python-format
 msgid "Database error: %(error)s."
 msgstr "Erreur de la base de données: %(error)s."
 
-#: cps/editbooks.py:510
+#: cps/editbooks.py:511
 #, python-format
 msgid "File format %(ext)s added to %(book)s"
 msgstr "Le format de fichier %(ext)s a été ajouté à %(book)s"
 
-#: cps/editbooks.py:653
+#: cps/editbooks.py:656
 msgid "Metadata successfully updated"
 msgstr "Les métadonnées ont bien été mises à jour"
 
-#: cps/editbooks.py:662
+#: cps/editbooks.py:665
 msgid "Error editing book, please check logfile for details"
 msgstr "Erreur d’édition du livre, veuillez consulter le journal (log) pour plus de détails"
 
-#: cps/editbooks.py:724
+#: cps/editbooks.py:727
 #, python-format
 msgid "File %(filename)s could not saved to temp dir"
 msgstr "Le fichier %(filename)s ne peut pas être sauvegardé dans le répertoire temporaire"
 
-#: cps/editbooks.py:734
+#: cps/editbooks.py:737
 msgid "Uploaded book probably exists in the library, consider to change before upload new: "
 msgstr "Le fichier téléchargé existe probablement dans la librairie, veuillez le modifier avant de le télécharger de nouveau: "
 
-#: cps/editbooks.py:780
+#: cps/editbooks.py:786
 #, python-format
 msgid "Failed to Move File %(file)s: %(error)s"
 msgstr "Impossible de déplacer le fichier %(file)s: %(error)s"
 
-#: cps/editbooks.py:836
+#: cps/editbooks.py:842
 #, python-format
 msgid "Failed to Move Cover File %(file)s: %(error)s"
 msgstr "Impossible de déplacer le fichier de couverture %(file)s: %(error)s"
 
-#: cps/editbooks.py:850
+#: cps/editbooks.py:856
 #, python-format
 msgid "File %(file)s uploaded"
 msgstr "Le fichier %(file)s a été téléchargé"
 
-#: cps/editbooks.py:876
+#: cps/editbooks.py:882
 msgid "Source or destination format for conversion missing"
 msgstr "Le format de conversion de la source ou de la destination est manquant"
 
-#: cps/editbooks.py:884
+#: cps/editbooks.py:890
 #, python-format
 msgid "Book successfully queued for converting to %(book_format)s"
 msgstr "Le livre a été mis avec succès en file de traitement pour conversion vers %(book_format)s"
 
-#: cps/editbooks.py:888
+#: cps/editbooks.py:894
 #, python-format
 msgid "There was an error converting this book: %(res)s"
 msgstr "Une erreur est survenue au cours de la conversion du livre : %(res)s"
@@ -513,71 +519,71 @@ msgstr "Le fichier %(file)s n'a pas été trouvé dans Google Drive"
 msgid "Book path %(path)s not found on Google Drive"
 msgstr "Le chemin du livre %(path)s n'a pas été trouvé dans Google Drive"
 
-#: cps/helper.py:542
+#: cps/helper.py:550
 msgid "Error Downloading Cover"
 msgstr "Erreur lors du téléchargement de la couverture"
 
-#: cps/helper.py:545
+#: cps/helper.py:553
 msgid "Cover Format Error"
 msgstr "Erreur de format de couverture"
 
-#: cps/helper.py:561
+#: cps/helper.py:569
 msgid "Failed to create path for cover"
 msgstr "Impossible de créer le chemin pour la couverture"
 
-#: cps/helper.py:566
+#: cps/helper.py:574
 msgid "Cover-file is not a valid image file, or could not be stored"
 msgstr "Le fichier couverture n'est pas un fichier image valide, ou ne peut pas être stocké"
 
-#: cps/helper.py:577
+#: cps/helper.py:585
 msgid "Only jpg/jpeg/png/webp files are supported as coverfile"
 msgstr "Seuls les fichiers jpg/jpeg/png/webp sont supportés comme fichier de couverture"
 
-#: cps/helper.py:591
+#: cps/helper.py:599
 msgid "Only jpg/jpeg files are supported as coverfile"
 msgstr "Seuls les fichiers jpg/jpeg sont supportés comme fichier de couverture"
 
-#: cps/helper.py:640
+#: cps/helper.py:648
 msgid "Unrar binary file not found"
 msgstr "Fichier binaire Unrar non trouvé"
 
-#: cps/helper.py:654
+#: cps/helper.py:662
 msgid "Error excecuting UnRar"
 msgstr "Une erreur est survenue lors de l'exécution d'UnRar"
 
-#: cps/helper.py:710
+#: cps/helper.py:718
 msgid "Waiting"
 msgstr "En attente"
 
-#: cps/helper.py:712
+#: cps/helper.py:720
 msgid "Failed"
 msgstr "Echoué"
 
-#: cps/helper.py:714
+#: cps/helper.py:722
 msgid "Started"
 msgstr "Débuté"
 
-#: cps/helper.py:716
+#: cps/helper.py:724
 msgid "Finished"
 msgstr "Terminé"
 
-#: cps/helper.py:718
+#: cps/helper.py:726
 msgid "Unknown Status"
 msgstr "Statut inconnu"
 
-#: cps/helper.py:723
+#: cps/helper.py:731
 msgid "E-mail: "
 msgstr "Courriel : "
 
-#: cps/helper.py:725 cps/helper.py:729
+#: cps/helper.py:733 cps/helper.py:737
 msgid "Convert: "
 msgstr "Convertir vers : "
 
-#: cps/helper.py:727
+#: cps/helper.py:735
 msgid "Upload: "
 msgstr "Téléverser : "
 
-#: cps/helper.py:731
+#: cps/helper.py:739
 msgid "Unknown Task: "
 msgstr "Tâche inconnue : "
 
@@ -610,7 +616,7 @@ msgstr "Échec de la connexion avec Google."
 msgid "Failed to fetch user info from Google."
 msgstr "Impossible d’obtenir les informations d’utilisateur avec Google."
 
-#: cps/oauth_bb.py:225 cps/web.py:1397 cps/web.py:1537
+#: cps/oauth_bb.py:225 cps/web.py:1394 cps/web.py:1534
 #, python-format
 msgid "you are now logged in as: '%(nickname)s'"
 msgstr "vous êtes maintenant connecté comme : '%(nickname)s'"
@@ -647,218 +653,218 @@ msgstr "Erreur Oauth GitHub, veuillez réessayer plus tard."
 msgid "Google Oauth error, please retry later."
 msgstr "Erreur Oauth Google, veuillez réessayer plus tard."
 
-#: cps/shelf.py:66 cps/shelf.py:111
+#: cps/shelf.py:67 cps/shelf.py:120
 msgid "Invalid shelf specified"
 msgstr "L’étagère indiquée est invalide"
 
-#: cps/shelf.py:72
+#: cps/shelf.py:73
 #, python-format
 msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s"
 msgstr "Désolé, vous n’êtes pas autorisé à ajouter un livre dans l’étagère: %(shelfname)s"
 
-#: cps/shelf.py:82
+#: cps/shelf.py:83
 #, python-format
 msgid "Book is already part of the shelf: %(shelfname)s"
 msgstr "Ce livre est déjà sur l’étagère : %(shelfname)s"
 
-#: cps/shelf.py:97
+#: cps/shelf.py:106
 #, python-format
 msgid "Book has been added to shelf: %(sname)s"
 msgstr "Le livre a bien été ajouté à l'étagère : %(sname)s"
 
-#: cps/shelf.py:115
+#: cps/shelf.py:124
 #, python-format
 msgid "You are not allowed to add a book to the the shelf: %(name)s"
 msgstr "Vous n’êtes pas autorisé à ajouter un livre dans l’étagère : %(name)s"
 
-#: cps/shelf.py:133
+#: cps/shelf.py:142
 #, python-format
 msgid "Books are already part of the shelf: %(name)s"
 msgstr "Ces livres sont déjà sur l’étagère : %(name)s"
 
-#: cps/shelf.py:148
+#: cps/shelf.py:158
 #, python-format
 msgid "Books have been added to shelf: %(sname)s"
 msgstr "Les livres ont été ajoutés à l’étagère : %(sname)s"
 
-#: cps/shelf.py:150
+#: cps/shelf.py:163
 #, python-format
 msgid "Could not add books to shelf: %(sname)s"
 msgstr "Impossible d’ajouter les livres à l’étagère : %(sname)s"
 
-#: cps/shelf.py:188
+#: cps/shelf.py:208
 #, python-format
 msgid "Book has been removed from shelf: %(sname)s"
 msgstr "Le livre a été supprimé de l'étagère %(sname)s"
 
-#: cps/shelf.py:196
+#: cps/shelf.py:216
 #, python-format
 msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
 msgstr "Désolé, vous n’êtes pas autorisé à enlever un livre de cette étagère : %(sname)s"
 
-#: cps/shelf.py:220 cps/shelf.py:260
+#: cps/shelf.py:240 cps/shelf.py:284
 #, python-format
 msgid "A public shelf with the name '%(title)s' already exists."
 msgstr "Une étagère publique avec le nom '%(title)s' existe déjà."
 
-#: cps/shelf.py:229 cps/shelf.py:270
+#: cps/shelf.py:249 cps/shelf.py:294
 #, python-format
 msgid "A private shelf with the name '%(title)s' already exists."
 msgstr "Une étagère privée avec le nom '%(title)s' existe déjà."
 
-#: cps/shelf.py:236
+#: cps/shelf.py:256
 #, python-format
 msgid "Shelf %(title)s created"
 msgstr "Étagère %(title)s créée"
 
-#: cps/shelf.py:239 cps/shelf.py:284
+#: cps/shelf.py:263 cps/shelf.py:312
 msgid "There was an error"
 msgstr "Il y a eu une erreur"
 
-#: cps/shelf.py:240 cps/shelf.py:242 cps/templates/layout.html:144
+#: cps/shelf.py:264 cps/shelf.py:266 cps/templates/layout.html:144
 msgid "Create a Shelf"
 msgstr "Créer une étagère"
 
-#: cps/shelf.py:282
+#: cps/shelf.py:306
 #, python-format
 msgid "Shelf %(title)s changed"
 msgstr "L’étagère %(title)s a été modifiée"
 
-#: cps/shelf.py:285 cps/shelf.py:287
+#: cps/shelf.py:313 cps/shelf.py:315
 msgid "Edit a shelf"
 msgstr "Modifier une étagère"
 
-#: cps/shelf.py:332
+#: cps/shelf.py:369
 #, python-format
 msgid "Shelf: '%(name)s'"
 msgstr "Étagère : '%(name)s'"
 
-#: cps/shelf.py:335
+#: cps/shelf.py:372
 msgid "Error opening shelf. Shelf does not exist or is not accessible"
 msgstr "Erreur à l’ouverture de l’étagère. Elle n’existe plus ou n’est plus accessible"
 
-#: cps/shelf.py:368
+#: cps/shelf.py:409
 msgid "Hidden Book"
 msgstr "Livre caché"
 
-#: cps/shelf.py:373
+#: cps/shelf.py:414
 #, python-format
 msgid "Change order of Shelf: '%(name)s'"
 msgstr "Modifier l’arrangement de l’étagère : ‘%(name)s’"
 
-#: cps/ub.py:64
+#: cps/ub.py:65
 msgid "Recently Added"
 msgstr "Ajouts récents"
 
-#: cps/ub.py:66
+#: cps/ub.py:67
 msgid "Show recent books"
 msgstr "Afficher les livres récents"
 
-#: cps/templates/index.xml:17 cps/ub.py:67
+#: cps/templates/index.xml:17 cps/ub.py:68
 msgid "Hot Books"
 msgstr "Livres populaires"
 
-#: cps/ub.py:69
+#: cps/ub.py:70
 msgid "Show Hot Books"
 msgstr "Montrer les livres populaires"
 
-#: cps/templates/index.xml:24 cps/ub.py:71 cps/web.py:655
+#: cps/templates/index.xml:24 cps/ub.py:72 cps/web.py:652
 msgid "Top Rated Books"
 msgstr "Livres les mieux notés"
 
-#: cps/ub.py:73
+#: cps/ub.py:74
 msgid "Show Top Rated Books"
 msgstr "Montrer les livres les mieux notés"
 
-#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:74
-#: cps/web.py:1222
+#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:75
+#: cps/web.py:1219
 msgid "Read Books"
 msgstr "Livres lus"
 
-#: cps/ub.py:76
+#: cps/ub.py:77
 msgid "Show read and unread"
 msgstr "Montrer lus et non-lus"
 
-#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:78
-#: cps/web.py:1225
+#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:79
+#: cps/web.py:1222
 msgid "Unread Books"
 msgstr "Livres non-lus"
 
-#: cps/ub.py:80
+#: cps/ub.py:81
 msgid "Show unread"
 msgstr "Afficher non-lus"
 
-#: cps/ub.py:81
+#: cps/ub.py:82
 msgid "Discover"
 msgstr "Découvrir"
 
-#: cps/ub.py:83
+#: cps/ub.py:84
 msgid "Show random books"
 msgstr "Montrer des livres au hasard"
 
-#: cps/templates/index.xml:75 cps/ub.py:84 cps/web.py:970
+#: cps/templates/index.xml:75 cps/ub.py:85 cps/web.py:967
 msgid "Categories"
 msgstr "Catégories"
 
-#: cps/ub.py:86
+#: cps/ub.py:87
 msgid "Show category selection"
 msgstr "Montrer la sélection par catégories"
 
 #: cps/templates/book_edit.html:84 cps/templates/index.xml:82
-#: cps/templates/search_form.html:53 cps/ub.py:87 cps/web.py:886 cps/web.py:896
+#: cps/templates/search_form.html:53 cps/ub.py:88 cps/web.py:883 cps/web.py:893
 msgid "Series"
 msgstr "Séries"
 
-#: cps/ub.py:89
+#: cps/ub.py:90
 msgid "Show series selection"
 msgstr "Montrer la sélection par séries"
 
-#: cps/templates/index.xml:61 cps/ub.py:90
+#: cps/templates/index.xml:61 cps/ub.py:91
 msgid "Authors"
 msgstr "Auteurs"
 
-#: cps/ub.py:92
+#: cps/ub.py:93
 msgid "Show author selection"
 msgstr "Montrer la sélection par auteur"
 
-#: cps/templates/index.xml:68 cps/ub.py:94 cps/web.py:869
+#: cps/templates/index.xml:68 cps/ub.py:95 cps/web.py:866
 msgid "Publishers"
 msgstr "Éditeurs"
 
-#: cps/ub.py:96
+#: cps/ub.py:97
 msgid "Show publisher selection"
 msgstr "Montrer la sélection par éditeur"
 
-#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:97
-#: cps/web.py:953
+#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:98
+#: cps/web.py:950
 msgid "Languages"
 msgstr "Langues"
 
-#: cps/ub.py:100
+#: cps/ub.py:101
 msgid "Show language selection"
 msgstr "Montrer la sélection par langue"
 
-#: cps/templates/index.xml:96 cps/ub.py:101
+#: cps/templates/index.xml:96 cps/ub.py:102
 msgid "Ratings"
 msgstr "Notes"
 
-#: cps/ub.py:103
+#: cps/ub.py:104
 msgid "Show ratings selection"
 msgstr "Afficher la sélection des évaluations"
 
-#: cps/templates/index.xml:104 cps/ub.py:104
+#: cps/templates/index.xml:104 cps/ub.py:105
 msgid "File formats"
 msgstr "Formats de fichier"
 
-#: cps/ub.py:106
+#: cps/ub.py:107
 msgid "Show file formats selection"
 msgstr "Afficher la sélection des formats de fichiers"
 
-#: cps/ub.py:108 cps/web.py:1249
+#: cps/ub.py:109 cps/web.py:1246
 msgid "Archived Books"
 msgstr "Livres archivés"
 
-#: cps/ub.py:110
+#: cps/ub.py:111
 msgid "Show archived books"
 msgstr "Afficher les livres archivés"
 
@@ -891,220 +897,220 @@ msgstr "Une nouvelle mise à jour est disponible. Cliquez sur le bouton ci-desso
 msgid "Click on the button below to update to the latest stable version."
 msgstr "Téléchargez la dernière version en cliquant sur le bouton ci-dessous."
 
-#: cps/web.py:322
+#: cps/web.py:319
 #, python-format
 msgid "Error: %(ldaperror)s"
 msgstr "Erreur : %(ldaperror)s"
 
-#: cps/web.py:326
+#: cps/web.py:323
 msgid "Error: No user returned in response of LDAP server"
 msgstr "Erreur : Aucun utilisateur renvoyé dans la réponse LDAP du serveur"
 
-#: cps/web.py:374
+#: cps/web.py:371
 msgid "Failed to Create at Least One LDAP User"
 msgstr "Impossible de créer au moins un utilisateur LDAP"
 
-#: cps/web.py:377
+#: cps/web.py:374
 msgid "At Least One LDAP User Not Found in Database"
 msgstr "Au moins un utilisateur LDAP n'a pas été trouvé dans la base de données"
 
-#: cps/web.py:379
+#: cps/web.py:376
 msgid "User Successfully Imported"
 msgstr "L'utilisateur a été importé avec succès"
 
-#: cps/web.py:625
+#: cps/web.py:622
 msgid "Recently Added Books"
 msgstr "Ajouts récents de livres"
 
-#: cps/templates/index.html:5 cps/web.py:663
+#: cps/templates/index.html:5 cps/web.py:660
 msgid "Discover (Random Books)"
 msgstr "Découvrir (Livres au hasard)"
 
-#: cps/web.py:691
+#: cps/web.py:688
 msgid "Books"
 msgstr "Livres"
 
-#: cps/web.py:718
+#: cps/web.py:715
 msgid "Hot Books (Most Downloaded)"
 msgstr "Livres populaires (les plus téléchargés)"
 
-#: cps/web.py:731
+#: cps/web.py:728
 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible"
 msgstr "Erreur d'ouverture du livre numérique. Le fichier n'existe pas ou n'est pas accessible"
 
-#: cps/web.py:745
+#: cps/web.py:742
 #, python-format
 msgid "Author: %(name)s"
 msgstr "Auteur : %(name)s"
 
-#: cps/web.py:759
+#: cps/web.py:756
 #, python-format
 msgid "Publisher: %(name)s"
 msgstr "Éditeur : '%(name)s'"
 
-#: cps/web.py:772
+#: cps/web.py:769
 #, python-format
 msgid "Series: %(serie)s"
 msgstr "Séries : %(serie)s"
 
-#: cps/web.py:785
+#: cps/web.py:782
 #, python-format
 msgid "Rating: %(rating)s stars"
 msgstr "Évaluation : %(rating)s étoiles"
 
-#: cps/web.py:798
+#: cps/web.py:795
 #, python-format
 msgid "File format: %(format)s"
 msgstr "Format de fichier : %(format)s"
 
-#: cps/web.py:812
+#: cps/web.py:809
 #, python-format
 msgid "Category: %(name)s"
 msgstr "Catégorie : %(name)s"
 
-#: cps/web.py:831
+#: cps/web.py:828
 #, python-format
 msgid "Language: %(name)s"
 msgstr "Langue : %(name)s"
 
-#: cps/web.py:910
+#: cps/web.py:907
 msgid "Ratings list"
 msgstr "Liste des évaluations"
 
-#: cps/web.py:925
+#: cps/web.py:922
 msgid "File formats list"
 msgstr "Liste de formats de fichiers"
 
-#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:984
+#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:981
 msgid "Tasks"
 msgstr "Tâches"
 
 #: cps/templates/book_edit.html:235 cps/templates/feed.xml:33
 #: cps/templates/layout.html:45 cps/templates/layout.html:48
-#: cps/templates/search_form.html:174 cps/web.py:1010 cps/web.py:1015
+#: cps/templates/search_form.html:174 cps/web.py:1007 cps/web.py:1012
 msgid "Search"
 msgstr "Chercher"
 
-#: cps/web.py:1066
+#: cps/web.py:1063
 msgid "Published after "
 msgstr "Publié après le "
 
-#: cps/web.py:1073
+#: cps/web.py:1070
 msgid "Published before "
 msgstr "Publié avant le "
 
-#: cps/web.py:1087
+#: cps/web.py:1084
 #, python-format
 msgid "Rating <= %(rating)s"
 msgstr "Évaluation <= %(rating)s"
 
-#: cps/web.py:1089
+#: cps/web.py:1086
 #, python-format
 msgid "Rating >= %(rating)s"
 msgstr "Évaluation >= %(rating)s"
 
-#: cps/web.py:1158 cps/web.py:1183
+#: cps/web.py:1155 cps/web.py:1180
 msgid "search"
 msgstr "recherche"
 
-#: cps/web.py:1213
+#: cps/web.py:1210
 #, python-format
 msgid "Custom Column No.%(column)d is not existing in calibre database"
 msgstr "La colonne personnalisée No.%(column)d n'existe pas dans la base de données calibre"
 
-#: cps/web.py:1304
+#: cps/web.py:1301
 #, python-format
 msgid "Book successfully queued for sending to %(kindlemail)s"
 msgstr "Le livre a été mis en file de traitement avec succès pour un envoi vers %(kindlemail)s"
 
-#: cps/web.py:1308
+#: cps/web.py:1305
 #, python-format
 msgid "Oops! 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:1310
+#: cps/web.py:1307
 msgid "Please update your profile with a valid Send to Kindle E-mail Address."
 msgstr "Veuillez mettre à jour votre profil avec une adresse de courriel Kindle valide."
 
-#: cps/web.py:1327
+#: cps/web.py:1324
 msgid "E-Mail server is not configured, please contact your administrator!"
 msgstr "Le serveur de courriel n'est pas configuré, veuillez contacter votre administrateur!"
 
-#: cps/web.py:1328 cps/web.py:1338 cps/web.py:1362 cps/web.py:1366
-#: cps/web.py:1371 cps/web.py:1375
+#: cps/web.py:1325 cps/web.py:1335 cps/web.py:1359 cps/web.py:1363
+#: cps/web.py:1368 cps/web.py:1372
 msgid "register"
 msgstr "s’enregistrer"
 
-#: cps/web.py:1364
+#: cps/web.py:1361
 msgid "Your e-mail is not allowed to register"
 msgstr "Votre adresse de courriel n’est pas autorisé pour une inscription"
 
-#: cps/web.py:1367
+#: cps/web.py:1364
 msgid "Confirmation e-mail was send to your e-mail account."
 msgstr "Le courriel de confirmation a été envoyé à votre adresse."
 
-#: cps/web.py:1370
+#: cps/web.py:1367
 msgid "This username or e-mail address is already in use."
 msgstr "Ce nom d’utilisateur ou cette adresse de courriel sont déjà utilisés."
 
-#: cps/web.py:1387
+#: cps/web.py:1384
 msgid "Cannot activate LDAP authentication"
 msgstr "Impossible d’activer l’authentification LDAP"
 
-#: cps/web.py:1404
+#: cps/web.py:1401
 #, python-format
 msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known"
 msgstr "Connexion de secours comme: '%(nickname)s', le serveur LDAP est indisponible, ou l'utilisateur est inconnu"
 
-#: cps/web.py:1410
+#: cps/web.py:1407
 #, python-format
 msgid "Could not login: %(message)s"
 msgstr "Impossible de se connecter: %(message)s"
 
-#: cps/web.py:1414 cps/web.py:1438
+#: cps/web.py:1411 cps/web.py:1435
 msgid "Wrong Username or Password"
 msgstr "Mauvais nom d'utilisateur ou mot de passe"
 
-#: cps/web.py:1421
+#: cps/web.py:1418
 msgid "New Password was send to your email address"
 msgstr "Le nouveau mot de passe a été envoyé vers votre adresse de courriel"
 
-#: cps/web.py:1427
+#: cps/web.py:1424
 msgid "Please enter valid username to reset password"
 msgstr "Veuillez entrer un nom d'utilisateur valide pour réinitialiser le mot de passe"
 
-#: cps/web.py:1433
+#: cps/web.py:1430
 #, python-format
 msgid "You are now logged in as: '%(nickname)s'"
 msgstr "Vous êtes maintenant connecté en tant que : ‘%(nickname)s’"
 
-#: cps/web.py:1442 cps/web.py:1469
+#: cps/web.py:1439 cps/web.py:1466
 msgid "login"
 msgstr "connexion"
 
-#: cps/web.py:1481 cps/web.py:1515
+#: cps/web.py:1478 cps/web.py:1512
 msgid "Token not found"
 msgstr "Jeton non trouvé"
 
-#: cps/web.py:1490 cps/web.py:1523
+#: cps/web.py:1487 cps/web.py:1520
 msgid "Token has expired"
 msgstr "Jeton expiré"
 
-#: cps/web.py:1499
+#: cps/web.py:1496
 msgid "Success! Please return to your device"
 msgstr "Réussite! Merci de vous tourner vers votre appareil"
 
-#: cps/web.py:1580 cps/web.py:1625 cps/web.py:1631
+#: cps/web.py:1577 cps/web.py:1622 cps/web.py:1628
 #, python-format
 msgid "%(name)s's profile"
 msgstr "Profil de %(name)s"
 
-#: cps/web.py:1627
+#: cps/web.py:1624
 msgid "Profile updated"
 msgstr "Profil mis à jour"
 
-#: cps/web.py:1656 cps/web.py:1659 cps/web.py:1662 cps/web.py:1669
-#: cps/web.py:1674
+#: cps/web.py:1653 cps/web.py:1656 cps/web.py:1659 cps/web.py:1666
+#: cps/web.py:1671
 msgid "Read a Book"
 msgstr "Lire un livre"
 
diff --git a/cps/translations/hu/LC_MESSAGES/messages.mo b/cps/translations/hu/LC_MESSAGES/messages.mo
index 88958bc32cadb301db9eef1a19341c56950f7d7b..99031abe11a75a4d7f0dba2316c6c5b61ef4a53e 100644
Binary files a/cps/translations/hu/LC_MESSAGES/messages.mo and b/cps/translations/hu/LC_MESSAGES/messages.mo differ
diff --git a/cps/translations/hu/LC_MESSAGES/messages.po b/cps/translations/hu/LC_MESSAGES/messages.po
index a12df9d3c404ece277f04f133efef59d7580f814..0b0f71b413ddece477c715f3eb2154fd727f430d 100644
--- a/cps/translations/hu/LC_MESSAGES/messages.po
+++ b/cps/translations/hu/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-06-07 06:47+0200\n"
+"POT-Creation-Date: 2020-06-28 09:31+0200\n"
 "PO-Revision-Date: 2019-04-06 23:36+0200\n"
 "Last-Translator: \n"
 "Language: hu\n"
@@ -46,9 +46,9 @@ msgstr ""
 msgid "Unknown command"
 msgstr ""
 
-#: cps/admin.py:116 cps/editbooks.py:563 cps/editbooks.py:573
-#: cps/editbooks.py:667 cps/editbooks.py:669 cps/editbooks.py:730
-#: cps/editbooks.py:743 cps/updater.py:509 cps/uploader.py:97
+#: cps/admin.py:116 cps/editbooks.py:564 cps/editbooks.py:576
+#: cps/editbooks.py:670 cps/editbooks.py:672 cps/editbooks.py:733
+#: cps/editbooks.py:749 cps/updater.py:509 cps/uploader.py:97
 #: cps/uploader.py:107
 msgid "Unknown"
 msgstr "Ismeretlen"
@@ -61,7 +61,7 @@ msgstr "Rendszergazda oldala"
 msgid "UI Configuration"
 msgstr "Felhasználói felület beállításai"
 
-#: cps/admin.py:189 cps/admin.py:706
+#: cps/admin.py:189 cps/admin.py:711
 msgid "Calibre-Web configuration updated"
 msgstr "A Calibre-Web konfigurációja frissítve."
 
@@ -113,175 +113,181 @@ msgstr ""
 msgid "LDAP Certificate Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:627
+#: cps/admin.py:628
 msgid "Keyfile Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:631
+#: cps/admin.py:632
 msgid "Certfile Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:701
+#: cps/admin.py:694 cps/admin.py:793 cps/admin.py:885 cps/admin.py:934
+#: cps/shelf.py:100 cps/shelf.py:161 cps/shelf.py:202 cps/shelf.py:260
+#: cps/shelf.py:309 cps/shelf.py:338 cps/shelf.py:368 cps/shelf.py:392
+msgid "Settings DB is not Writeable"
+msgstr ""
+
+#: cps/admin.py:706
 msgid "DB Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:703
+#: cps/admin.py:708
 msgid "DB is not Writeable"
 msgstr ""
 
-#: cps/admin.py:736
+#: cps/admin.py:741
 msgid "Basic Configuration"
 msgstr "Alapvető beállítások"
 
-#: cps/admin.py:751 cps/web.py:1337
+#: cps/admin.py:756 cps/web.py:1334
 msgid "Please fill out all fields!"
 msgstr "Az összes mezőt ki kell tölteni!"
 
-#: cps/admin.py:754 cps/admin.py:766 cps/admin.py:772 cps/admin.py:892
+#: cps/admin.py:759 cps/admin.py:771 cps/admin.py:777 cps/admin.py:903
 msgid "Add new user"
 msgstr "Új felhasználó hozzáadása"
 
-#: cps/admin.py:763 cps/web.py:1578
+#: cps/admin.py:768 cps/web.py:1575
 msgid "E-mail is not from valid domain"
 msgstr "Az e-mail tartománya nem érvényes."
 
-#: cps/admin.py:770 cps/admin.py:785
+#: cps/admin.py:775 cps/admin.py:790
 msgid "Found an existing account for this e-mail address or nickname."
 msgstr "Már létezik felhasználó ehhez az e-mail címhez vagy felhasználói névhez."
 
-#: cps/admin.py:781
+#: cps/admin.py:786
 #, python-format
 msgid "User '%(user)s' created"
 msgstr "A következő felhasználó létrehozva: %(user)s"
 
-#: cps/admin.py:794
+#: cps/admin.py:802
 #, python-format
 msgid "User '%(nick)s' deleted"
 msgstr "A felhasználó törölve: %(nick)s"
 
-#: cps/admin.py:797
+#: cps/admin.py:805
 msgid "No admin user remaining, can't delete user"
 msgstr ""
 
-#: cps/admin.py:803
+#: cps/admin.py:811
 msgid "No admin user remaining, can't remove admin role"
 msgstr ""
 
-#: cps/admin.py:839 cps/web.py:1621
+#: cps/admin.py:847 cps/web.py:1618
 msgid "Found an existing account for this e-mail address."
 msgstr "Már létezik felhasználó ehhez az e-mail címhez."
 
-#: cps/admin.py:849 cps/admin.py:864 cps/admin.py:967 cps/web.py:1596
+#: cps/admin.py:857 cps/admin.py:872 cps/admin.py:983 cps/web.py:1593
 #, python-format
 msgid "Edit User %(nick)s"
 msgstr " A felhasználó szerkesztése: %(nick)s"
 
-#: cps/admin.py:855 cps/web.py:1588
+#: cps/admin.py:863 cps/web.py:1585
 msgid "This username is already taken"
 msgstr ""
 
-#: cps/admin.py:871
+#: cps/admin.py:879
 #, python-format
 msgid "User '%(nick)s' updated"
 msgstr "A felhasználó frissítve: %(nick)s"
 
-#: cps/admin.py:874
+#: cps/admin.py:882
 msgid "An unknown error occured."
 msgstr "Ismeretlen hiba történt."
 
-#: cps/admin.py:901 cps/templates/admin.html:71
+#: cps/admin.py:912 cps/templates/admin.html:71
 msgid "Edit E-mail Server Settings"
 msgstr "SMTP beállítások változtatása"
 
-#: cps/admin.py:925
+#: cps/admin.py:941
 #, python-format
 msgid "Test e-mail successfully send to %(kindlemail)s"
 msgstr "A teszt levél sikeresen elküldve ide: %(kindlemail)s"
 
-#: cps/admin.py:928
+#: cps/admin.py:944
 #, python-format
 msgid "There was an error sending the Test e-mail: %(res)s"
 msgstr "Hiba történt a teszt levél küldése során: %(res)s"
 
-#: cps/admin.py:930
+#: cps/admin.py:946
 msgid "Please configure your e-mail address first..."
 msgstr ""
 
-#: cps/admin.py:932
+#: cps/admin.py:948
 msgid "E-mail server settings updated"
 msgstr "Az e-mail kiszolgáló beállításai frissítve."
 
-#: cps/admin.py:943
+#: cps/admin.py:959
 msgid "User not found"
 msgstr ""
 
-#: cps/admin.py:978
+#: cps/admin.py:994
 #, python-format
 msgid "Password for user %(user)s reset"
 msgstr "A(z) %(user)s felhasználó jelszavának alaphelyzetbe állítása"
 
-#: cps/admin.py:981 cps/web.py:1361 cps/web.py:1425
+#: cps/admin.py:997 cps/web.py:1358 cps/web.py:1422
 msgid "An unknown error occurred. Please try again later."
 msgstr "Ismeretlen hiba történt. Próbáld újra később!"
 
-#: cps/admin.py:984 cps/web.py:1299
+#: cps/admin.py:1000 cps/web.py:1296
 msgid "Please configure the SMTP mail settings first..."
 msgstr "Először be kell állítani az SMTP levelező beállításokat..."
 
-#: cps/admin.py:996
+#: cps/admin.py:1012
 msgid "Logfile viewer"
 msgstr ""
 
-#: cps/admin.py:1035
+#: cps/admin.py:1051
 msgid "Requesting update package"
 msgstr "Frissítési csomag kérése"
 
-#: cps/admin.py:1036
+#: cps/admin.py:1052
 msgid "Downloading update package"
 msgstr "Frissítési csomag letöltése"
 
-#: cps/admin.py:1037
+#: cps/admin.py:1053
 msgid "Unzipping update package"
 msgstr "Frissítési csomag kitömörítése"
 
-#: cps/admin.py:1038
+#: cps/admin.py:1054
 msgid "Replacing files"
 msgstr "Fájlok cserélése"
 
-#: cps/admin.py:1039
+#: cps/admin.py:1055
 msgid "Database connections are closed"
 msgstr "Adatbázis kapcsolatok lezárva"
 
-#: cps/admin.py:1040
+#: cps/admin.py:1056
 msgid "Stopping server"
 msgstr "Szerver leállítása"
 
-#: cps/admin.py:1041
+#: cps/admin.py:1057
 msgid "Update finished, please press okay and reload page"
 msgstr "A frissítés települt, kattints az OK-ra és újra tölt az oldal"
 
-#: cps/admin.py:1042 cps/admin.py:1043 cps/admin.py:1044 cps/admin.py:1045
-#: cps/admin.py:1046
+#: cps/admin.py:1058 cps/admin.py:1059 cps/admin.py:1060 cps/admin.py:1061
+#: cps/admin.py:1062
 msgid "Update failed:"
 msgstr "A frissítés nem sikerült:"
 
-#: cps/admin.py:1042 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
+#: cps/admin.py:1058 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
 msgid "HTTP Error"
 msgstr "HTTP hiba"
 
-#: cps/admin.py:1043 cps/updater.py:321 cps/updater.py:524
+#: cps/admin.py:1059 cps/updater.py:321 cps/updater.py:524
 msgid "Connection error"
 msgstr "Kapcsolódási hiba"
 
-#: cps/admin.py:1044 cps/updater.py:323 cps/updater.py:526
+#: cps/admin.py:1060 cps/updater.py:323 cps/updater.py:526
 msgid "Timeout while establishing connection"
 msgstr "Időtúllépés a kapcsolódás során"
 
-#: cps/admin.py:1045 cps/updater.py:325 cps/updater.py:528
+#: cps/admin.py:1061 cps/updater.py:325 cps/updater.py:528
 msgid "General error"
 msgstr "Általános hiba"
 
-#: cps/admin.py:1046
+#: cps/admin.py:1062
 msgid "Update File Could Not be Saved in Temp Dir"
 msgstr ""
 
@@ -301,8 +307,8 @@ msgstr ""
 msgid "Book Successfully Deleted"
 msgstr ""
 
-#: cps/editbooks.py:254 cps/editbooks.py:548 cps/web.py:1644 cps/web.py:1685
-#: cps/web.py:1747
+#: cps/editbooks.py:254 cps/editbooks.py:549 cps/web.py:1641 cps/web.py:1682
+#: cps/web.py:1744
 msgid "Error opening eBook. File does not exist or file is not accessible"
 msgstr "Hiba az ekönyv megnyitásakor. A fájl nem létezik vagy nem elérhető."
 
@@ -310,82 +316,82 @@ msgstr "Hiba az ekönyv megnyitásakor. A fájl nem létezik vagy nem elérhető
 msgid "edit metadata"
 msgstr "Metaadatok szerkesztése"
 
-#: cps/editbooks.py:361
+#: cps/editbooks.py:360
 #, python-format
 msgid "%(langname)s is not a valid language"
 msgstr "A(z) %(langname)s nem érvényes nyelv"
 
-#: cps/editbooks.py:467 cps/editbooks.py:712
+#: cps/editbooks.py:468 cps/editbooks.py:715
 #, python-format
 msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
 msgstr "A(z) \"%(ext)s\" kiterjesztésű fájlok feltöltése nincs engedélyezve ezen a szerveren."
 
-#: cps/editbooks.py:471 cps/editbooks.py:716
+#: cps/editbooks.py:472 cps/editbooks.py:719
 msgid "File to be uploaded must have an extension"
 msgstr "A feltöltendő fájlnak kiterjesztéssel kell rendelkeznie!"
 
-#: cps/editbooks.py:483 cps/editbooks.py:773
+#: cps/editbooks.py:484 cps/editbooks.py:779
 #, python-format
 msgid "Failed to create path %(path)s (Permission denied)."
 msgstr "Nem sikerült létrehozni az elérési utat (engedély megtagadva): %(path)s."
 
-#: cps/editbooks.py:488
+#: cps/editbooks.py:489
 #, python-format
 msgid "Failed to store file %(file)s."
 msgstr "Nem sikerült elmenteni a %(file)s fájlt."
 
-#: cps/editbooks.py:506 cps/editbooks.py:864
+#: cps/editbooks.py:507 cps/editbooks.py:870
 #, python-format
 msgid "Database error: %(error)s."
 msgstr ""
 
-#: cps/editbooks.py:510
+#: cps/editbooks.py:511
 #, python-format
 msgid "File format %(ext)s added to %(book)s"
 msgstr "A(z) %(ext)s fájlformátum hozzáadva a könyvhez: %(book)s."
 
-#: cps/editbooks.py:653
+#: cps/editbooks.py:656
 msgid "Metadata successfully updated"
 msgstr "A metaadatok sikeresen frissültek"
 
-#: cps/editbooks.py:662
+#: cps/editbooks.py:665
 msgid "Error editing book, please check logfile for details"
 msgstr "Hiba a könyv szerkesztése során, további részletek a naplófájlban."
 
-#: cps/editbooks.py:724
+#: cps/editbooks.py:727
 #, python-format
 msgid "File %(filename)s could not saved to temp dir"
 msgstr ""
 
-#: cps/editbooks.py:734
+#: cps/editbooks.py:737
 msgid "Uploaded book probably exists in the library, consider to change before upload new: "
 msgstr ""
 
-#: cps/editbooks.py:780
+#: cps/editbooks.py:786
 #, python-format
 msgid "Failed to Move File %(file)s: %(error)s"
 msgstr ""
 
-#: cps/editbooks.py:836
+#: cps/editbooks.py:842
 #, python-format
 msgid "Failed to Move Cover File %(file)s: %(error)s"
 msgstr ""
 
-#: cps/editbooks.py:850
+#: cps/editbooks.py:856
 #, python-format
 msgid "File %(file)s uploaded"
 msgstr ""
 
-#: cps/editbooks.py:876
+#: cps/editbooks.py:882
 msgid "Source or destination format for conversion missing"
 msgstr "Az átalakításhoz hiányzik a forrás- vagy a célformátum!"
 
-#: cps/editbooks.py:884
+#: cps/editbooks.py:890
 #, python-format
 msgid "Book successfully queued for converting to %(book_format)s"
 msgstr "A könyv sikeresen átalakításra lett jelölve a következő formátumra: %(book_format)s"
 
-#: cps/editbooks.py:888
+#: cps/editbooks.py:894
 #, python-format
 msgid "There was an error converting this book: %(res)s"
 msgstr "Hiba történt a könyv átalakításakor: %(res)s"
@@ -499,71 +505,71 @@ msgstr "A \"%(file)s\" fájl nem található a Google Drive-on"
 msgid "Book path %(path)s not found on Google Drive"
 msgstr "A könyv elérési útja (\"%(path)s\") nem található a Google Drive-on"
 
-#: cps/helper.py:542
+#: cps/helper.py:550
 msgid "Error Downloading Cover"
 msgstr ""
 
-#: cps/helper.py:545
+#: cps/helper.py:553
 msgid "Cover Format Error"
 msgstr ""
 
-#: cps/helper.py:561
+#: cps/helper.py:569
 msgid "Failed to create path for cover"
 msgstr ""
 
-#: cps/helper.py:566
+#: cps/helper.py:574
 msgid "Cover-file is not a valid image file, or could not be stored"
 msgstr ""
 
-#: cps/helper.py:577
+#: cps/helper.py:585
 msgid "Only jpg/jpeg/png/webp files are supported as coverfile"
 msgstr ""
 
-#: cps/helper.py:591
+#: cps/helper.py:599
 msgid "Only jpg/jpeg files are supported as coverfile"
 msgstr ""
 
-#: cps/helper.py:640
+#: cps/helper.py:648
 msgid "Unrar binary file not found"
 msgstr ""
 
-#: cps/helper.py:654
+#: cps/helper.py:662
 msgid "Error excecuting UnRar"
 msgstr ""
 
-#: cps/helper.py:710
+#: cps/helper.py:718
 msgid "Waiting"
 msgstr "Várakozás"
 
-#: cps/helper.py:712
+#: cps/helper.py:720
 msgid "Failed"
 msgstr "Nem sikerült"
 
-#: cps/helper.py:714
+#: cps/helper.py:722
 msgid "Started"
 msgstr "Elindítva"
 
-#: cps/helper.py:716
+#: cps/helper.py:724
 msgid "Finished"
 msgstr "Végrehajtva"
 
-#: cps/helper.py:718
+#: cps/helper.py:726
 msgid "Unknown Status"
 msgstr "Ismeretlen állapot"
 
-#: cps/helper.py:723
+#: cps/helper.py:731
 msgid "E-mail: "
 msgstr "E-mail cím: "
 
-#: cps/helper.py:725 cps/helper.py:729
+#: cps/helper.py:733 cps/helper.py:737
 msgid "Convert: "
 msgstr "Konvertálás:"
 
-#: cps/helper.py:727
+#: cps/helper.py:735
 msgid "Upload: "
 msgstr "Feltöltés:"
 
-#: cps/helper.py:731
+#: cps/helper.py:739
 msgid "Unknown Task: "
 msgstr "Ismeretlen feladat:"
 
@@ -596,7 +602,7 @@ msgstr ""
 msgid "Failed to fetch user info from Google."
 msgstr ""
 
-#: cps/oauth_bb.py:225 cps/web.py:1397 cps/web.py:1537
+#: cps/oauth_bb.py:225 cps/web.py:1394 cps/web.py:1534
 #, python-format
 msgid "you are now logged in as: '%(nickname)s'"
 msgstr "Be vagy jelentkezve mint: %(nickname)s"
@@ -633,218 +639,218 @@ msgstr ""
 msgid "Google Oauth error, please retry later."
 msgstr ""
 
-#: cps/shelf.py:66 cps/shelf.py:111
+#: cps/shelf.py:67 cps/shelf.py:120
 msgid "Invalid shelf specified"
 msgstr "A megadott polc érvénytelen!"
 
-#: cps/shelf.py:72
+#: cps/shelf.py:73
 #, python-format
 msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s"
 msgstr "Elnézést, nem vagy jogosult hozzáadni a könyvet a következő polcra: %(shelfname)s"
 
-#: cps/shelf.py:82
+#: cps/shelf.py:83
 #, python-format
 msgid "Book is already part of the shelf: %(shelfname)s"
 msgstr "A könyv már a következő polcon van: %(shelfname)s"
 
-#: cps/shelf.py:97
+#: cps/shelf.py:106
 #, python-format
 msgid "Book has been added to shelf: %(sname)s"
 msgstr "A könyv hozzá lett adva a következő polchoz: %(sname)s"
 
-#: cps/shelf.py:115
+#: cps/shelf.py:124
 #, python-format
 msgid "You are not allowed to add a book to the the shelf: %(name)s"
 msgstr "Nincs jogosultságod könyvet tenni a következő polcra: %(name)s."
 
-#: cps/shelf.py:133
+#: cps/shelf.py:142
 #, python-format
 msgid "Books are already part of the shelf: %(name)s"
 msgstr "A könyvek már a következő polcon vannak: %(name)s"
 
-#: cps/shelf.py:148
+#: cps/shelf.py:158
 #, python-format
 msgid "Books have been added to shelf: %(sname)s"
 msgstr "A könyvek hozzá lettek adva a következő polchoz: %(sname)s"
 
-#: cps/shelf.py:150
+#: cps/shelf.py:163
 #, python-format
 msgid "Could not add books to shelf: %(sname)s"
 msgstr "Nem sikerült hozzáadni a könyveket a polchoz: %(sname)s"
 
-#: cps/shelf.py:188
+#: cps/shelf.py:208
 #, python-format
 msgid "Book has been removed from shelf: %(sname)s"
 msgstr "A könyv el lett távolítva a polcról: %(sname)s"
 
-#: cps/shelf.py:196
+#: cps/shelf.py:216
 #, python-format
 msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
 msgstr "Sajnálom, nincs jogosultságot eltávolítani könyvet erről a polcról: %(sname)s"
 
-#: cps/shelf.py:220 cps/shelf.py:260
+#: cps/shelf.py:240 cps/shelf.py:284
 #, python-format
 msgid "A public shelf with the name '%(title)s' already exists."
 msgstr ""
 
-#: cps/shelf.py:229 cps/shelf.py:270
+#: cps/shelf.py:249 cps/shelf.py:294
 #, python-format
 msgid "A private shelf with the name '%(title)s' already exists."
 msgstr ""
 
-#: cps/shelf.py:236
+#: cps/shelf.py:256
 #, python-format
 msgid "Shelf %(title)s created"
 msgstr "A következő polc létre lett hozva: %(title)s"
 
-#: cps/shelf.py:239 cps/shelf.py:284
+#: cps/shelf.py:263 cps/shelf.py:312
 msgid "There was an error"
 msgstr "Hiba történt"
 
-#: cps/shelf.py:240 cps/shelf.py:242 cps/templates/layout.html:144
+#: cps/shelf.py:264 cps/shelf.py:266 cps/templates/layout.html:144
 msgid "Create a Shelf"
 msgstr "Polc készítése"
 
-#: cps/shelf.py:282
+#: cps/shelf.py:306
 #, python-format
 msgid "Shelf %(title)s changed"
 msgstr "A következő polc megváltoztatva: %(title)s"
 
-#: cps/shelf.py:285 cps/shelf.py:287
+#: cps/shelf.py:313 cps/shelf.py:315
 msgid "Edit a shelf"
 msgstr "Polc szerkesztése"
 
-#: cps/shelf.py:332
+#: cps/shelf.py:369
 #, python-format
 msgid "Shelf: '%(name)s'"
 msgstr "Polc: '%(name)s'"
 
-#: cps/shelf.py:335
+#: cps/shelf.py:372
 msgid "Error opening shelf. Shelf does not exist or is not accessible"
 msgstr "Hiba a polc megnyitásakor. A polc nem létezik vagy nem elérhető."
 
-#: cps/shelf.py:368
+#: cps/shelf.py:409
 msgid "Hidden Book"
 msgstr ""
 
-#: cps/shelf.py:373
+#: cps/shelf.py:414
 #, python-format
 msgid "Change order of Shelf: '%(name)s'"
 msgstr "A következő polc átrendezése: %(name)s"
 
-#: cps/ub.py:64
+#: cps/ub.py:65
 msgid "Recently Added"
 msgstr "Legutóbb hozzáadott"
 
-#: cps/ub.py:66
+#: cps/ub.py:67
 msgid "Show recent books"
 msgstr "Legutóbbi könyvek mutatása"
 
-#: cps/templates/index.xml:17 cps/ub.py:67
+#: cps/templates/index.xml:17 cps/ub.py:68
 msgid "Hot Books"
 msgstr "Kelendő könyvek"
 
-#: cps/ub.py:69
+#: cps/ub.py:70
 msgid "Show Hot Books"
 msgstr "Kelendő könyvek mutatása"
 
-#: cps/templates/index.xml:24 cps/ub.py:71 cps/web.py:655
+#: cps/templates/index.xml:24 cps/ub.py:72 cps/web.py:652
 msgid "Top Rated Books"
 msgstr "Legjobb könyvek"
 
-#: cps/ub.py:73
+#: cps/ub.py:74
 msgid "Show Top Rated Books"
 msgstr "Legjobbra értékelt könyvek mutatása"
 
-#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:74
-#: cps/web.py:1222
+#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:75
+#: cps/web.py:1219
 msgid "Read Books"
 msgstr "Olvasott könyvek"
 
-#: cps/ub.py:76
+#: cps/ub.py:77
 msgid "Show read and unread"
 msgstr "Mutassa az olvasva/olvasatlan állapotot"
 
-#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:78
-#: cps/web.py:1225
+#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:79
+#: cps/web.py:1222
 msgid "Unread Books"
 msgstr "Olvasatlan könyvek"
 
-#: cps/ub.py:80
+#: cps/ub.py:81
 msgid "Show unread"
 msgstr ""
 
-#: cps/ub.py:81
+#: cps/ub.py:82
 msgid "Discover"
 msgstr "Felfedezés"
 
-#: cps/ub.py:83
+#: cps/ub.py:84
 msgid "Show random books"
 msgstr "Könyvek találomra mutatása"
 
-#: cps/templates/index.xml:75 cps/ub.py:84 cps/web.py:970
+#: cps/templates/index.xml:75 cps/ub.py:85 cps/web.py:967
 msgid "Categories"
 msgstr "Címkék"
 
-#: cps/ub.py:86
+#: cps/ub.py:87
 msgid "Show category selection"
 msgstr "Címke választó mutatása"
 
 #: cps/templates/book_edit.html:84 cps/templates/index.xml:82
-#: cps/templates/search_form.html:53 cps/ub.py:87 cps/web.py:886 cps/web.py:896
+#: cps/templates/search_form.html:53 cps/ub.py:88 cps/web.py:883 cps/web.py:893
 msgid "Series"
 msgstr "Sorozatok"
 
-#: cps/ub.py:89
+#: cps/ub.py:90
 msgid "Show series selection"
 msgstr "Sorozat választó mutatása"
 
-#: cps/templates/index.xml:61 cps/ub.py:90
+#: cps/templates/index.xml:61 cps/ub.py:91
 msgid "Authors"
 msgstr "Szerzők"
 
-#: cps/ub.py:92
+#: cps/ub.py:93
 msgid "Show author selection"
 msgstr "Szerző választó mutatása"
 
-#: cps/templates/index.xml:68 cps/ub.py:94 cps/web.py:869
+#: cps/templates/index.xml:68 cps/ub.py:95 cps/web.py:866
 msgid "Publishers"
 msgstr "Kiadók"
 
-#: cps/ub.py:96
+#: cps/ub.py:97
 msgid "Show publisher selection"
 msgstr "Kiadó választó mutatása"
 
-#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:97
-#: cps/web.py:953
+#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:98
+#: cps/web.py:950
 msgid "Languages"
 msgstr "Nyelvek"
 
-#: cps/ub.py:100
+#: cps/ub.py:101
 msgid "Show language selection"
 msgstr "Nyelv választó mutatása"
 
-#: cps/templates/index.xml:96 cps/ub.py:101
+#: cps/templates/index.xml:96 cps/ub.py:102
 msgid "Ratings"
 msgstr ""
 
-#: cps/ub.py:103
+#: cps/ub.py:104
 msgid "Show ratings selection"
 msgstr ""
 
-#: cps/templates/index.xml:104 cps/ub.py:104
+#: cps/templates/index.xml:104 cps/ub.py:105
 msgid "File formats"
 msgstr ""
 
-#: cps/ub.py:106
+#: cps/ub.py:107
 msgid "Show file formats selection"
 msgstr ""
 
-#: cps/ub.py:108 cps/web.py:1249
+#: cps/ub.py:109 cps/web.py:1246
 msgid "Archived Books"
 msgstr ""
 
-#: cps/ub.py:110
+#: cps/ub.py:111
 msgid "Show archived books"
 msgstr ""
 
@@ -877,220 +883,220 @@ msgstr "Új frissítés érhető el. Kattints az alábbi gombra a frissítéshez
 msgid "Click on the button below to update to the latest stable version."
 msgstr ""
 
-#: cps/web.py:322
+#: cps/web.py:319
 #, python-format
 msgid "Error: %(ldaperror)s"
 msgstr ""
 
-#: cps/web.py:326
+#: cps/web.py:323
 msgid "Error: No user returned in response of LDAP server"
 msgstr ""
 
-#: cps/web.py:374
+#: cps/web.py:371
 msgid "Failed to Create at Least One LDAP User"
 msgstr ""
 
-#: cps/web.py:377
+#: cps/web.py:374
 msgid "At Least One LDAP User Not Found in Database"
 msgstr ""
 
-#: cps/web.py:379
+#: cps/web.py:376
 msgid "User Successfully Imported"
 msgstr ""
 
-#: cps/web.py:625
+#: cps/web.py:622
 msgid "Recently Added Books"
 msgstr "Legutóbb hozzáadott könyvek"
 
-#: cps/templates/index.html:5 cps/web.py:663
+#: cps/templates/index.html:5 cps/web.py:660
 msgid "Discover (Random Books)"
 msgstr "Felfedezés (könyvek találomra)"
 
-#: cps/web.py:691
+#: cps/web.py:688
 msgid "Books"
 msgstr ""
 
-#: cps/web.py:718
+#: cps/web.py:715
 msgid "Hot Books (Most Downloaded)"
 msgstr "Kelendő könyvek (legtöbbet letöltöttek)"
 
-#: cps/web.py:731
+#: cps/web.py:728
 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible"
 msgstr "Hiba történt az e-könyv megnyitásakor. A fájl nem létezik vagy nem érhető el:"
 
-#: cps/web.py:745
+#: cps/web.py:742
 #, python-format
 msgid "Author: %(name)s"
 msgstr ""
 
-#: cps/web.py:759
+#: cps/web.py:756
 #, python-format
 msgid "Publisher: %(name)s"
 msgstr "Kiadó: %(name)s"
 
-#: cps/web.py:772
+#: cps/web.py:769
 #, python-format
 msgid "Series: %(serie)s"
 msgstr "Sorozat: %(serie)s"
 
-#: cps/web.py:785
+#: cps/web.py:782
 #, python-format
 msgid "Rating: %(rating)s stars"
 msgstr ""
 
-#: cps/web.py:798
+#: cps/web.py:795
 #, python-format
 msgid "File format: %(format)s"
 msgstr ""
 
-#: cps/web.py:812
+#: cps/web.py:809
 #, python-format
 msgid "Category: %(name)s"
 msgstr "Címke: %(name)s"
 
-#: cps/web.py:831
+#: cps/web.py:828
 #, python-format
 msgid "Language: %(name)s"
 msgstr "Nyelv: %(name)s"
 
-#: cps/web.py:910
+#: cps/web.py:907
 msgid "Ratings list"
 msgstr ""
 
-#: cps/web.py:925
+#: cps/web.py:922
 msgid "File formats list"
 msgstr ""
 
-#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:984
+#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:981
 msgid "Tasks"
 msgstr "Feladatok"
 
 #: cps/templates/book_edit.html:235 cps/templates/feed.xml:33
 #: cps/templates/layout.html:45 cps/templates/layout.html:48
-#: cps/templates/search_form.html:174 cps/web.py:1010 cps/web.py:1015
+#: cps/templates/search_form.html:174 cps/web.py:1007 cps/web.py:1012
 msgid "Search"
 msgstr "Keresés"
 
-#: cps/web.py:1066
+#: cps/web.py:1063
 msgid "Published after "
 msgstr "Kiadva ezután: "
 
-#: cps/web.py:1073
+#: cps/web.py:1070
 msgid "Published before "
 msgstr "Kiadva ezelőtt: "
 
-#: cps/web.py:1087
+#: cps/web.py:1084
 #, python-format
 msgid "Rating <= %(rating)s"
 msgstr "Értékelés <= %(rating)s"
 
-#: cps/web.py:1089
+#: cps/web.py:1086
 #, python-format
 msgid "Rating >= %(rating)s"
 msgstr "Értékelés <= %(rating)s"
 
-#: cps/web.py:1158 cps/web.py:1183
+#: cps/web.py:1155 cps/web.py:1180
 msgid "search"
 msgstr "keresés"
 
-#: cps/web.py:1213
+#: cps/web.py:1210
 #, python-format
 msgid "Custom Column No.%(column)d is not existing in calibre database"
 msgstr ""
 
-#: cps/web.py:1304
+#: cps/web.py:1301
 #, python-format
 msgid "Book successfully queued for sending to %(kindlemail)s"
 msgstr "A könyv sikeresen küldésre lett jelölve a következő címre: %(kindlemail)s"
 
-#: cps/web.py:1308
+#: cps/web.py:1305
 #, python-format
 msgid "Oops! There was an error sending this book: %(res)s"
 msgstr "Hiba történt a könyv küldésekor: %(res)s"
 
-#: cps/web.py:1310
+#: cps/web.py:1307
 msgid "Please update your profile with a valid Send to Kindle E-mail Address."
 msgstr "Először be kell állítani a kindle e-mail címet..."
 
-#: cps/web.py:1327
+#: cps/web.py:1324
 msgid "E-Mail server is not configured, please contact your administrator!"
 msgstr ""
 
-#: cps/web.py:1328 cps/web.py:1338 cps/web.py:1362 cps/web.py:1366
-#: cps/web.py:1371 cps/web.py:1375
+#: cps/web.py:1325 cps/web.py:1335 cps/web.py:1359 cps/web.py:1363
+#: cps/web.py:1368 cps/web.py:1372
 msgid "register"
 msgstr "regisztrálás"
 
-#: cps/web.py:1364
+#: cps/web.py:1361
 msgid "Your e-mail is not allowed to register"
 msgstr "Nem engedélyezett a megadott e-mail cím bejegyzése"
 
-#: cps/web.py:1367
+#: cps/web.py:1364
 msgid "Confirmation e-mail was send to your e-mail account."
 msgstr "Jóváhagyó levél elküldve az email címedre."
 
-#: cps/web.py:1370
+#: cps/web.py:1367
 msgid "This username or e-mail address is already in use."
 msgstr "Ez a felhasználónév vagy e-mail cím már használatban van."
 
-#: cps/web.py:1387
+#: cps/web.py:1384
 msgid "Cannot activate LDAP authentication"
 msgstr ""
 
-#: cps/web.py:1404
+#: cps/web.py:1401
 #, python-format
 msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known"
 msgstr ""
 
-#: cps/web.py:1410
+#: cps/web.py:1407
 #, python-format
 msgid "Could not login: %(message)s"
 msgstr ""
 
-#: cps/web.py:1414 cps/web.py:1438
+#: cps/web.py:1411 cps/web.py:1435
 msgid "Wrong Username or Password"
 msgstr "Rossz felhasználó név vagy jelszó!"
 
-#: cps/web.py:1421
+#: cps/web.py:1418
 msgid "New Password was send to your email address"
 msgstr ""
 
-#: cps/web.py:1427
+#: cps/web.py:1424
 msgid "Please enter valid username to reset password"
 msgstr ""
 
-#: cps/web.py:1433
+#: cps/web.py:1430
 #, python-format
 msgid "You are now logged in as: '%(nickname)s'"
 msgstr ""
 
-#: cps/web.py:1442 cps/web.py:1469
+#: cps/web.py:1439 cps/web.py:1466
 msgid "login"
 msgstr "belépés"
 
-#: cps/web.py:1481 cps/web.py:1515
+#: cps/web.py:1478 cps/web.py:1512
 msgid "Token not found"
 msgstr "A token nem található."
 
-#: cps/web.py:1490 cps/web.py:1523
+#: cps/web.py:1487 cps/web.py:1520
 msgid "Token has expired"
 msgstr "A token érvényessége lejárt."
 
-#: cps/web.py:1499
+#: cps/web.py:1496
 msgid "Success! Please return to your device"
 msgstr "Sikerült! Újra használható az eszköz."
 
-#: cps/web.py:1580 cps/web.py:1625 cps/web.py:1631
+#: cps/web.py:1577 cps/web.py:1622 cps/web.py:1628
 #, python-format
 msgid "%(name)s's profile"
 msgstr "%(name)s profilja"
 
-#: cps/web.py:1627
+#: cps/web.py:1624
 msgid "Profile updated"
 msgstr "A profil frissítve."
 
-#: cps/web.py:1656 cps/web.py:1659 cps/web.py:1662 cps/web.py:1669
-#: cps/web.py:1674
+#: cps/web.py:1653 cps/web.py:1656 cps/web.py:1659 cps/web.py:1666
+#: cps/web.py:1671
 msgid "Read a Book"
 msgstr "Egy olvasott könyv"
 
diff --git a/cps/translations/it/LC_MESSAGES/messages.mo b/cps/translations/it/LC_MESSAGES/messages.mo
index afb7afafdba03822665de50446d7f1d69373961a..d9b1d59401a26127b3c67cde049d42fa446d7912 100644
Binary files a/cps/translations/it/LC_MESSAGES/messages.mo and b/cps/translations/it/LC_MESSAGES/messages.mo differ
diff --git a/cps/translations/it/LC_MESSAGES/messages.po b/cps/translations/it/LC_MESSAGES/messages.po
index 14493c377461ec31575ba60c5b47513ce0d71883..8c544937b2843da8870e37157e7ff5bee35791bf 100644
--- a/cps/translations/it/LC_MESSAGES/messages.po
+++ b/cps/translations/it/LC_MESSAGES/messages.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version:  Calibre-Web\n"
 "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
-"POT-Creation-Date: 2020-06-07 06:47+0200\n"
+"POT-Creation-Date: 2020-06-28 09:31+0200\n"
 "PO-Revision-Date: 2017-04-04 15:09+0200\n"
 "Last-Translator: ElQuimm <quimm@webtaste.com>\n"
 "Language: it\n"
@@ -45,9 +45,9 @@ msgstr "Ricollegato con successo"
 msgid "Unknown command"
 msgstr "Comando sconosciuto"
 
-#: cps/admin.py:116 cps/editbooks.py:563 cps/editbooks.py:573
-#: cps/editbooks.py:667 cps/editbooks.py:669 cps/editbooks.py:730
-#: cps/editbooks.py:743 cps/updater.py:509 cps/uploader.py:97
+#: cps/admin.py:116 cps/editbooks.py:564 cps/editbooks.py:576
+#: cps/editbooks.py:670 cps/editbooks.py:672 cps/editbooks.py:733
+#: cps/editbooks.py:749 cps/updater.py:509 cps/uploader.py:97
 #: cps/uploader.py:107
 msgid "Unknown"
 msgstr "Sconosciuto"
@@ -60,7 +60,7 @@ msgstr "Pagina di amministrazione"
 msgid "UI Configuration"
 msgstr "Configurazione dell'interfaccia utente"
 
-#: cps/admin.py:189 cps/admin.py:706
+#: cps/admin.py:189 cps/admin.py:711
 msgid "Calibre-Web configuration updated"
 msgstr "La configurazione di Calibre-Web è stata aggiornata"
 
@@ -112,175 +112,181 @@ msgstr "LDAP User Object Filter contiene una parentesi senza la corrispettiva"
 msgid "LDAP Certificate Location is not Valid, Please Enter Correct Path"
 msgstr "La posizione del certificato LDAP non è valida, per favore indica il percorso corretto"
 
-#: cps/admin.py:627
+#: cps/admin.py:628
 msgid "Keyfile Location is not Valid, Please Enter Correct Path"
 msgstr "La posizione del Keyfile non è valida, per favore indica il percorso corretto"
 
-#: cps/admin.py:631
+#: cps/admin.py:632
 msgid "Certfile Location is not Valid, Please Enter Correct Path"
 msgstr "La posizione del Certfile non è valida, per favore indica il percorso corretto"
 
-#: cps/admin.py:701
+#: cps/admin.py:694 cps/admin.py:793 cps/admin.py:885 cps/admin.py:934
+#: cps/shelf.py:100 cps/shelf.py:161 cps/shelf.py:202 cps/shelf.py:260
+#: cps/shelf.py:309 cps/shelf.py:338 cps/shelf.py:368 cps/shelf.py:392
+msgid "Settings DB is not Writeable"
+msgstr ""
+
+#: cps/admin.py:706
 msgid "DB Location is not Valid, Please Enter Correct Path"
 msgstr "La posizione del DB non è valida, per favore indica il percorso corretto"
 
-#: cps/admin.py:703
+#: cps/admin.py:708
 msgid "DB is not Writeable"
 msgstr "Il DB non è scrivibile"
 
-#: cps/admin.py:736
+#: cps/admin.py:741
 msgid "Basic Configuration"
 msgstr "Configurazione di base"
 
-#: cps/admin.py:751 cps/web.py:1337
+#: cps/admin.py:756 cps/web.py:1334
 msgid "Please fill out all fields!"
 msgstr "Per favore compila tutti i campi!"
 
-#: cps/admin.py:754 cps/admin.py:766 cps/admin.py:772 cps/admin.py:892
+#: cps/admin.py:759 cps/admin.py:771 cps/admin.py:777 cps/admin.py:903
 msgid "Add new user"
 msgstr "Aggiungi un nuovo utente"
 
-#: cps/admin.py:763 cps/web.py:1578
+#: cps/admin.py:768 cps/web.py:1575
 msgid "E-mail is not from valid domain"
 msgstr "L'e-mail non proviene da un dominio valido"
 
-#: cps/admin.py:770 cps/admin.py:785
+#: cps/admin.py:775 cps/admin.py:790
 msgid "Found an existing account for this e-mail address or nickname."
 msgstr "Trovato un account esistente con questo e-mail o nome di utente"
 
-#: cps/admin.py:781
+#: cps/admin.py:786
 #, python-format
 msgid "User '%(user)s' created"
 msgstr "Creato l'utente '%(user)s'"
 
-#: cps/admin.py:794
+#: cps/admin.py:802
 #, python-format
 msgid "User '%(nick)s' deleted"
 msgstr "Utente '%(nick)s' eliminato"
 
-#: cps/admin.py:797
+#: cps/admin.py:805
 msgid "No admin user remaining, can't delete user"
 msgstr "Non rimarrebbe nessun utente amministratore, non posso eliminare l'utente"
 
-#: cps/admin.py:803
+#: cps/admin.py:811
 msgid "No admin user remaining, can't remove admin role"
 msgstr "Non rimarrebbe nessun utente amministratore, non posso rimuovere il ruolo di amministratore"
 
-#: cps/admin.py:839 cps/web.py:1621
+#: cps/admin.py:847 cps/web.py:1618
 msgid "Found an existing account for this e-mail address."
 msgstr "Ho trovato un account creato in precedenza con questo e-mail."
 
-#: cps/admin.py:849 cps/admin.py:864 cps/admin.py:967 cps/web.py:1596
+#: cps/admin.py:857 cps/admin.py:872 cps/admin.py:983 cps/web.py:1593
 #, python-format
 msgid "Edit User %(nick)s"
 msgstr "Modifica l'utente %(nick)s"
 
-#: cps/admin.py:855 cps/web.py:1588
+#: cps/admin.py:863 cps/web.py:1585
 msgid "This username is already taken"
 msgstr "Questo nome di utente è già utilizzato"
 
-#: cps/admin.py:871
+#: cps/admin.py:879
 #, python-format
 msgid "User '%(nick)s' updated"
 msgstr "Utente '%(nick)s' aggiornato"
 
-#: cps/admin.py:874
+#: cps/admin.py:882
 msgid "An unknown error occured."
 msgstr "Si è verificato un errore imprevisto."
 
-#: cps/admin.py:901 cps/templates/admin.html:71
+#: cps/admin.py:912 cps/templates/admin.html:71
 msgid "Edit E-mail Server Settings"
 msgstr "Modifica le impostazioni SMTP"
 
-#: cps/admin.py:925
+#: cps/admin.py:941
 #, python-format
 msgid "Test e-mail successfully send to %(kindlemail)s"
 msgstr "E-mail di test inviato con successo a %(kindlemail)s"
 
-#: cps/admin.py:928
+#: cps/admin.py:944
 #, python-format
 msgid "There was an error sending the Test e-mail: %(res)s"
 msgstr "Si è verificato un errore nell'invio dell'e-mail di test: %(res)s"
 
-#: cps/admin.py:930
+#: cps/admin.py:946
 msgid "Please configure your e-mail address first..."
 msgstr "Per favore prima configura il tuo indirizzo e-mail..."
 
-#: cps/admin.py:932
+#: cps/admin.py:948
 msgid "E-mail server settings updated"
 msgstr "Configurazione del server e-mail aggiornata"
 
-#: cps/admin.py:943
+#: cps/admin.py:959
 msgid "User not found"
 msgstr "Utente non trovato"
 
-#: cps/admin.py:978
+#: cps/admin.py:994
 #, python-format
 msgid "Password for user %(user)s reset"
 msgstr "La password dell'utente %(user)s è stata resettata"
 
-#: cps/admin.py:981 cps/web.py:1361 cps/web.py:1425
+#: cps/admin.py:997 cps/web.py:1358 cps/web.py:1422
 msgid "An unknown error occurred. Please try again later."
 msgstr "Si è verificato un errore sconosciuto: per favore riprova."
 
-#: cps/admin.py:984 cps/web.py:1299
+#: cps/admin.py:1000 cps/web.py:1296
 msgid "Please configure the SMTP mail settings first..."
 msgstr "Configura dapprima le impostazioni del server SMTP..."
 
-#: cps/admin.py:996
+#: cps/admin.py:1012
 msgid "Logfile viewer"
 msgstr "Visualizzatore del Logfile"
 
-#: cps/admin.py:1035
+#: cps/admin.py:1051
 msgid "Requesting update package"
 msgstr "Richiedo il pacchetto di aggiornamento"
 
-#: cps/admin.py:1036
+#: cps/admin.py:1052
 msgid "Downloading update package"
 msgstr "Scarico il pacchetto di aggiornamento"
 
-#: cps/admin.py:1037
+#: cps/admin.py:1053
 msgid "Unzipping update package"
 msgstr "Decomprimo il pacchetto di aggiornamento"
 
-#: cps/admin.py:1038
+#: cps/admin.py:1054
 msgid "Replacing files"
 msgstr "Sostituisco i file"
 
-#: cps/admin.py:1039
+#: cps/admin.py:1055
 msgid "Database connections are closed"
 msgstr "Le connessioni al database sono chiuse"
 
-#: cps/admin.py:1040
+#: cps/admin.py:1056
 msgid "Stopping server"
 msgstr "Arresto il server"
 
-#: cps/admin.py:1041
+#: cps/admin.py:1057
 msgid "Update finished, please press okay and reload page"
 msgstr "Aggiornamento completato, per favore premi ok e ricarica la pagina"
 
-#: cps/admin.py:1042 cps/admin.py:1043 cps/admin.py:1044 cps/admin.py:1045
-#: cps/admin.py:1046
+#: cps/admin.py:1058 cps/admin.py:1059 cps/admin.py:1060 cps/admin.py:1061
+#: cps/admin.py:1062
 msgid "Update failed:"
 msgstr "Aggiornamento non riuscito:"
 
-#: cps/admin.py:1042 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
+#: cps/admin.py:1058 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
 msgid "HTTP Error"
 msgstr "Errore HTTP"
 
-#: cps/admin.py:1043 cps/updater.py:321 cps/updater.py:524
+#: cps/admin.py:1059 cps/updater.py:321 cps/updater.py:524
 msgid "Connection error"
 msgstr "Errore di connessione"
 
-#: cps/admin.py:1044 cps/updater.py:323 cps/updater.py:526
+#: cps/admin.py:1060 cps/updater.py:323 cps/updater.py:526
 msgid "Timeout while establishing connection"
 msgstr "Tempo scaduto nello stabilire la connessione"
 
-#: cps/admin.py:1045 cps/updater.py:325 cps/updater.py:528
+#: cps/admin.py:1061 cps/updater.py:325 cps/updater.py:528
 msgid "General error"
 msgstr "Errore generale"
 
-#: cps/admin.py:1046
+#: cps/admin.py:1062
 msgid "Update File Could Not be Saved in Temp Dir"
 msgstr "Il file di aggiornamento non può essere salvato nella cartella temporanea"
 
@@ -300,8 +306,8 @@ msgstr "Il formato del libro è stato eliminato con successo"
 msgid "Book Successfully Deleted"
 msgstr "Il libro é stato eliminato con successo"
 
-#: cps/editbooks.py:254 cps/editbooks.py:548 cps/web.py:1644 cps/web.py:1685
-#: cps/web.py:1747
+#: cps/editbooks.py:254 cps/editbooks.py:549 cps/web.py:1641 cps/web.py:1682
+#: cps/web.py:1744
 msgid "Error opening eBook. File does not exist or file is not accessible"
 msgstr "Errore durante l'apertura del libro. Il file non esiste o il file non è accessibile"
 
@@ -309,82 +315,82 @@ msgstr "Errore durante l'apertura del libro. Il file non esiste o il file non è
 msgid "edit metadata"
 msgstr "Modifica i metadati"
 
-#: cps/editbooks.py:361
+#: cps/editbooks.py:360
 #, python-format
 msgid "%(langname)s is not a valid language"
 msgstr "%(langname)s non è una lingua valida"
 
-#: cps/editbooks.py:467 cps/editbooks.py:712
+#: cps/editbooks.py:468 cps/editbooks.py:715
 #, python-format
 msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
 msgstr "Non è consentito caricare file con l'estensione '%(ext)s' su questo server"
 
-#: cps/editbooks.py:471 cps/editbooks.py:716
+#: cps/editbooks.py:472 cps/editbooks.py:719
 msgid "File to be uploaded must have an extension"
 msgstr "Il file da caricare deve avere un'estensione"
 
-#: cps/editbooks.py:483 cps/editbooks.py:773
+#: cps/editbooks.py:484 cps/editbooks.py:779
 #, python-format
 msgid "Failed to create path %(path)s (Permission denied)."
 msgstr "Impossibile creare la cartella %(path)s (autorizzazione negata)."
 
-#: cps/editbooks.py:488
+#: cps/editbooks.py:489
 #, python-format
 msgid "Failed to store file %(file)s."
 msgstr "Il salvataggio del file %(file)s non è riuscito."
 
-#: cps/editbooks.py:506 cps/editbooks.py:864
+#: cps/editbooks.py:507 cps/editbooks.py:870
 #, python-format
 msgid "Database error: %(error)s."
 msgstr "Errore nel database: %(error)s."
 
-#: cps/editbooks.py:510
+#: cps/editbooks.py:511
 #, python-format
 msgid "File format %(ext)s added to %(book)s"
 msgstr "Ho aggiunto il formato %(ext)s al libro %(book)s"
 
-#: cps/editbooks.py:653
+#: cps/editbooks.py:656
 msgid "Metadata successfully updated"
 msgstr "I metadati sono stati aggiornati con successo"
 
-#: cps/editbooks.py:662
+#: cps/editbooks.py:665
 msgid "Error editing book, please check logfile for details"
 msgstr "Errore nella modifica del libro. Per favore verifica i dettagli nel file di registro (logfile)"
 
-#: cps/editbooks.py:724
+#: cps/editbooks.py:727
 #, python-format
 msgid "File %(filename)s could not saved to temp dir"
 msgstr "Il file %(filename)s non può essere salvato nella cartella temporanea"
 
-#: cps/editbooks.py:734
+#: cps/editbooks.py:737
 msgid "Uploaded book probably exists in the library, consider to change before upload new: "
 msgstr "Probabilmnete il libro caricato esiste già nella libreria; considera di cambiare prima di sottoporlo nuovamente: "
 
-#: cps/editbooks.py:780
+#: cps/editbooks.py:786
 #, python-format
 msgid "Failed to Move File %(file)s: %(error)s"
 msgstr "Impossibile spostare il file %(file)s: %(error)s"
 
-#: cps/editbooks.py:836
+#: cps/editbooks.py:842
 #, python-format
 msgid "Failed to Move Cover File %(file)s: %(error)s"
 msgstr "Impossibile spostare il file della copertina %(file)s: %(error)s"
 
-#: cps/editbooks.py:850
+#: cps/editbooks.py:856
 #, python-format
 msgid "File %(file)s uploaded"
 msgstr "Il file %(file)s è stato caricato"
 
-#: cps/editbooks.py:876
+#: cps/editbooks.py:882
 msgid "Source or destination format for conversion missing"
 msgstr "Mancano o il formato sorgente o quello di destinazione, necessari alla conversione"
 
-#: cps/editbooks.py:884
+#: cps/editbooks.py:890
 #, python-format
 msgid "Book successfully queued for converting to %(book_format)s"
 msgstr "Libro accodato con successo per essere convertito in %(book_format)s"
 
-#: cps/editbooks.py:888
+#: cps/editbooks.py:894
 #, python-format
 msgid "There was an error converting this book: %(res)s"
 msgstr "Si è verificato un errore durante la conversione del libro: %(res)s"
@@ -498,71 +504,71 @@ msgstr "File %(file)s non trovato su Google Drive"
 msgid "Book path %(path)s not found on Google Drive"
 msgstr "Non ho trovato la cartella %(path)s del libro su Google Drive"
 
-#: cps/helper.py:542
+#: cps/helper.py:550
 msgid "Error Downloading Cover"
 msgstr "Errore nello scaricare la copertina"
 
-#: cps/helper.py:545
+#: cps/helper.py:553
 msgid "Cover Format Error"
 msgstr ""
 
-#: cps/helper.py:561
+#: cps/helper.py:569
 msgid "Failed to create path for cover"
 msgstr "Errore nel creare la cartella per la copertina"
 
-#: cps/helper.py:566
+#: cps/helper.py:574
 msgid "Cover-file is not a valid image file, or could not be stored"
 msgstr "Il file della copertina non è in un formato immagine valido o non può essere salvato"
 
-#: cps/helper.py:577
+#: cps/helper.py:585
 msgid "Only jpg/jpeg/png/webp files are supported as coverfile"
 msgstr "Solamente i file nei formati jpg/jpeg/png/webp sono supportati per le copertine"
 
-#: cps/helper.py:591
+#: cps/helper.py:599
 msgid "Only jpg/jpeg files are supported as coverfile"
 msgstr "Solamente i file nei formati jpg/jpeg sono supportati per le copertine"
 
-#: cps/helper.py:640
+#: cps/helper.py:648
 msgid "Unrar binary file not found"
 msgstr "Non ho trovato il file binario di UnRar"
 
-#: cps/helper.py:654
+#: cps/helper.py:662
 msgid "Error excecuting UnRar"
 msgstr "Errore nell'eseguire UnRar"
 
-#: cps/helper.py:710
+#: cps/helper.py:718
 msgid "Waiting"
 msgstr "Attendi"
 
-#: cps/helper.py:712
+#: cps/helper.py:720
 msgid "Failed"
 msgstr "Non riuscito"
 
-#: cps/helper.py:714
+#: cps/helper.py:722
 msgid "Started"
 msgstr "Avviato"
 
-#: cps/helper.py:716
+#: cps/helper.py:724
 msgid "Finished"
 msgstr "Terminato"
 
-#: cps/helper.py:718
+#: cps/helper.py:726
 msgid "Unknown Status"
 msgstr "Stato sconosciuto"
 
-#: cps/helper.py:723
+#: cps/helper.py:731
 msgid "E-mail: "
 msgstr "E-mail: "
 
-#: cps/helper.py:725 cps/helper.py:729
+#: cps/helper.py:733 cps/helper.py:737
 msgid "Convert: "
 msgstr "Conversione: "
 
-#: cps/helper.py:727
+#: cps/helper.py:735
 msgid "Upload: "
 msgstr "Upload: "
 
-#: cps/helper.py:731
+#: cps/helper.py:739
 msgid "Unknown Task: "
 msgstr "Processo sconosciuto: "
 
@@ -595,7 +601,7 @@ msgstr "L'accesso con Google non è riuscito."
 msgid "Failed to fetch user info from Google."
 msgstr "Il recupero delle informazioni dell'utente da Google non è riuscito."
 
-#: cps/oauth_bb.py:225 cps/web.py:1397 cps/web.py:1537
+#: cps/oauth_bb.py:225 cps/web.py:1394 cps/web.py:1534
 #, python-format
 msgid "you are now logged in as: '%(nickname)s'"
 msgstr "ora sei connesso come: '%(nickname)s'"
@@ -632,218 +638,218 @@ msgstr "GitHub errore Oauth, per favore riprova più tardi."
 msgid "Google Oauth error, please retry later."
 msgstr "Google errore Oauth, per favore riprova più tardi."
 
-#: cps/shelf.py:66 cps/shelf.py:111
+#: cps/shelf.py:67 cps/shelf.py:120
 msgid "Invalid shelf specified"
 msgstr "Lo scaffale specificato non è valido"
 
-#: cps/shelf.py:72
+#: cps/shelf.py:73
 #, python-format
 msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s"
 msgstr "Mi spiace, ma non sei autorizzato ad aggiungere libri allo scaffale: %(shelfname)s"
 
-#: cps/shelf.py:82
+#: cps/shelf.py:83
 #, python-format
 msgid "Book is already part of the shelf: %(shelfname)s"
 msgstr "Il libro è gia presente nello scaffale: %(shelfname)s"
 
-#: cps/shelf.py:97
+#: cps/shelf.py:106
 #, python-format
 msgid "Book has been added to shelf: %(sname)s"
 msgstr "Il libro è stato aggiunto allo scaffale: %(sname)s"
 
-#: cps/shelf.py:115
+#: cps/shelf.py:124
 #, python-format
 msgid "You are not allowed to add a book to the the shelf: %(name)s"
 msgstr "Non sei autorizzato ad aggiungere libri allo scaffale: %(name)s"
 
-#: cps/shelf.py:133
+#: cps/shelf.py:142
 #, python-format
 msgid "Books are already part of the shelf: %(name)s"
 msgstr "I libri sono già presenti nello scaffale: %(name)s"
 
-#: cps/shelf.py:148
+#: cps/shelf.py:158
 #, python-format
 msgid "Books have been added to shelf: %(sname)s"
 msgstr "I libri sono stati aggiunti allo scaffale: %(sname)s"
 
-#: cps/shelf.py:150
+#: cps/shelf.py:163
 #, python-format
 msgid "Could not add books to shelf: %(sname)s"
 msgstr "Non posso aggiungere libri allo scaffale: %(sname)s"
 
-#: cps/shelf.py:188
+#: cps/shelf.py:208
 #, python-format
 msgid "Book has been removed from shelf: %(sname)s"
 msgstr "Il libro è stato rimosso dallo scaffale: %(sname)s"
 
-#: cps/shelf.py:196
+#: cps/shelf.py:216
 #, python-format
 msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
 msgstr "Spiacente, ma non sei autorizzato a togliere libri dallo scaffale: %(sname)s"
 
-#: cps/shelf.py:220 cps/shelf.py:260
+#: cps/shelf.py:240 cps/shelf.py:284
 #, python-format
 msgid "A public shelf with the name '%(title)s' already exists."
 msgstr "Uno scaffale pubblico denominato '%(title)s' esiste già."
 
-#: cps/shelf.py:229 cps/shelf.py:270
+#: cps/shelf.py:249 cps/shelf.py:294
 #, python-format
 msgid "A private shelf with the name '%(title)s' already exists."
 msgstr "Uno scaffale privato denominato '%(title)s' esiste già."
 
-#: cps/shelf.py:236
+#: cps/shelf.py:256
 #, python-format
 msgid "Shelf %(title)s created"
 msgstr "Lo scaffale %(title)s è stato creato"
 
-#: cps/shelf.py:239 cps/shelf.py:284
+#: cps/shelf.py:263 cps/shelf.py:312
 msgid "There was an error"
 msgstr "C'era un errore"
 
-#: cps/shelf.py:240 cps/shelf.py:242 cps/templates/layout.html:144
+#: cps/shelf.py:264 cps/shelf.py:266 cps/templates/layout.html:144
 msgid "Create a Shelf"
 msgstr "Crea uno scaffale"
 
-#: cps/shelf.py:282
+#: cps/shelf.py:306
 #, python-format
 msgid "Shelf %(title)s changed"
 msgstr "Lo scaffale %(title)s è stato modificato"
 
-#: cps/shelf.py:285 cps/shelf.py:287
+#: cps/shelf.py:313 cps/shelf.py:315
 msgid "Edit a shelf"
 msgstr "Modifica uno scaffale"
 
-#: cps/shelf.py:332
+#: cps/shelf.py:369
 #, python-format
 msgid "Shelf: '%(name)s'"
 msgstr "Scaffale: '%(name)s'"
 
-#: cps/shelf.py:335
+#: cps/shelf.py:372
 msgid "Error opening shelf. Shelf does not exist or is not accessible"
 msgstr "Errore durante l'apertura dello scaffale. Lo scaffale non esiste o non è accessibile"
 
-#: cps/shelf.py:368
+#: cps/shelf.py:409
 msgid "Hidden Book"
 msgstr "Libro nascosto"
 
-#: cps/shelf.py:373
+#: cps/shelf.py:414
 #, python-format
 msgid "Change order of Shelf: '%(name)s'"
 msgstr "Modifica l'ordine dello scaffale: '%(name)s'"
 
-#: cps/ub.py:64
+#: cps/ub.py:65
 msgid "Recently Added"
 msgstr "Aggiunti recentemente"
 
-#: cps/ub.py:66
+#: cps/ub.py:67
 msgid "Show recent books"
 msgstr "Mostra l'opzione per la selezione dei libri più recenti"
 
-#: cps/templates/index.xml:17 cps/ub.py:67
+#: cps/templates/index.xml:17 cps/ub.py:68
 msgid "Hot Books"
 msgstr "Libri popolari"
 
-#: cps/ub.py:69
+#: cps/ub.py:70
 msgid "Show Hot Books"
 msgstr "Mostra l'opzione per la selezione dei libri più popolari"
 
-#: cps/templates/index.xml:24 cps/ub.py:71 cps/web.py:655
+#: cps/templates/index.xml:24 cps/ub.py:72 cps/web.py:652
 msgid "Top Rated Books"
 msgstr "Libri meglio valutati"
 
-#: cps/ub.py:73
+#: cps/ub.py:74
 msgid "Show Top Rated Books"
 msgstr "Mostra l'opzione per la selezione dei libri meglio valutati"
 
-#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:74
-#: cps/web.py:1222
+#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:75
+#: cps/web.py:1219
 msgid "Read Books"
 msgstr "Libri da leggere"
 
-#: cps/ub.py:76
+#: cps/ub.py:77
 msgid "Show read and unread"
 msgstr "Mostra l'opzione per la selezione letto e non letto"
 
-#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:78
-#: cps/web.py:1225
+#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:79
+#: cps/web.py:1222
 msgid "Unread Books"
 msgstr "Libri non letti"
 
-#: cps/ub.py:80
+#: cps/ub.py:81
 msgid "Show unread"
 msgstr "Mostra l'opzione per la selezione dei libri non letti"
 
-#: cps/ub.py:81
+#: cps/ub.py:82
 msgid "Discover"
 msgstr "Per scoprire"
 
-#: cps/ub.py:83
+#: cps/ub.py:84
 msgid "Show random books"
 msgstr "Mostra l'opzione per presentare libri aleatoriamente"
 
-#: cps/templates/index.xml:75 cps/ub.py:84 cps/web.py:970
+#: cps/templates/index.xml:75 cps/ub.py:85 cps/web.py:967
 msgid "Categories"
 msgstr "Categorie"
 
-#: cps/ub.py:86
+#: cps/ub.py:87
 msgid "Show category selection"
 msgstr "Mostra l'opzione per la selezione delle categorie"
 
 #: cps/templates/book_edit.html:84 cps/templates/index.xml:82
-#: cps/templates/search_form.html:53 cps/ub.py:87 cps/web.py:886 cps/web.py:896
+#: cps/templates/search_form.html:53 cps/ub.py:88 cps/web.py:883 cps/web.py:893
 msgid "Series"
 msgstr "Serie"
 
-#: cps/ub.py:89
+#: cps/ub.py:90
 msgid "Show series selection"
 msgstr "Mostra l'opzione per la selezione delle serie"
 
-#: cps/templates/index.xml:61 cps/ub.py:90
+#: cps/templates/index.xml:61 cps/ub.py:91
 msgid "Authors"
 msgstr "Autori"
 
-#: cps/ub.py:92
+#: cps/ub.py:93
 msgid "Show author selection"
 msgstr "Mostra l'opzione per la selezione degli autori"
 
-#: cps/templates/index.xml:68 cps/ub.py:94 cps/web.py:869
+#: cps/templates/index.xml:68 cps/ub.py:95 cps/web.py:866
 msgid "Publishers"
 msgstr "Editori"
 
-#: cps/ub.py:96
+#: cps/ub.py:97
 msgid "Show publisher selection"
 msgstr "Mostra l'opzione per la selezione degli editori"
 
-#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:97
-#: cps/web.py:953
+#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:98
+#: cps/web.py:950
 msgid "Languages"
 msgstr "Lingue"
 
-#: cps/ub.py:100
+#: cps/ub.py:101
 msgid "Show language selection"
 msgstr "Mostra l'opzione per la selezione delle lingue"
 
-#: cps/templates/index.xml:96 cps/ub.py:101
+#: cps/templates/index.xml:96 cps/ub.py:102
 msgid "Ratings"
 msgstr "Valutazioni"
 
-#: cps/ub.py:103
+#: cps/ub.py:104
 msgid "Show ratings selection"
 msgstr "Mostra l'opzione per la selezione della valutazione"
 
-#: cps/templates/index.xml:104 cps/ub.py:104
+#: cps/templates/index.xml:104 cps/ub.py:105
 msgid "File formats"
 msgstr "Formati file"
 
-#: cps/ub.py:106
+#: cps/ub.py:107
 msgid "Show file formats selection"
 msgstr "Mostra la selezione del formato dei file"
 
-#: cps/ub.py:108 cps/web.py:1249
+#: cps/ub.py:109 cps/web.py:1246
 msgid "Archived Books"
 msgstr "Libri archiviati"
 
-#: cps/ub.py:110
+#: cps/ub.py:111
 msgid "Show archived books"
 msgstr "Mostra l'opzione per la selezione dei libri archiviati"
 
@@ -876,220 +882,220 @@ msgstr "Nuovo aggiornamento disponibile. Clicca sul pulsante sottostante per agg
 msgid "Click on the button below to update to the latest stable version."
 msgstr "Clicca sul pulsante per aggiornare all'ultima versione stabile."
 
-#: cps/web.py:322
+#: cps/web.py:319
 #, python-format
 msgid "Error: %(ldaperror)s"
 msgstr "Errore: %(ldaperror)s"
 
-#: cps/web.py:326
+#: cps/web.py:323
 msgid "Error: No user returned in response of LDAP server"
 msgstr "Errore: nessun utente restituito in risposta dal server LDAP"
 
-#: cps/web.py:374
+#: cps/web.py:371
 msgid "Failed to Create at Least One LDAP User"
 msgstr "Fallita la creazione di almeno un utente LDAP"
 
-#: cps/web.py:377
+#: cps/web.py:374
 msgid "At Least One LDAP User Not Found in Database"
 msgstr "Almeno un utente LDAP non è stato trovato nel database"
 
-#: cps/web.py:379
+#: cps/web.py:376
 msgid "User Successfully Imported"
 msgstr "Utente importato con successo"
 
-#: cps/web.py:625
+#: cps/web.py:622
 msgid "Recently Added Books"
 msgstr "Libri aggiunti di recente"
 
-#: cps/templates/index.html:5 cps/web.py:663
+#: cps/templates/index.html:5 cps/web.py:660
 msgid "Discover (Random Books)"
 msgstr "Scopri (libri casuali)"
 
-#: cps/web.py:691
+#: cps/web.py:688
 msgid "Books"
 msgstr "Libri"
 
-#: cps/web.py:718
+#: cps/web.py:715
 msgid "Hot Books (Most Downloaded)"
 msgstr "I libri più richiesti"
 
-#: cps/web.py:731
+#: cps/web.py:728
 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible"
 msgstr "Errore durante l'apertura del libro selezionato. Il file non esiste o il file non è accessibile"
 
-#: cps/web.py:745
+#: cps/web.py:742
 #, python-format
 msgid "Author: %(name)s"
 msgstr "Autore: %(name)s"
 
-#: cps/web.py:759
+#: cps/web.py:756
 #, python-format
 msgid "Publisher: %(name)s"
 msgstr "Editore: %(name)s"
 
-#: cps/web.py:772
+#: cps/web.py:769
 #, python-format
 msgid "Series: %(serie)s"
 msgstr "Serie: %(serie)s"
 
-#: cps/web.py:785
+#: cps/web.py:782
 #, python-format
 msgid "Rating: %(rating)s stars"
 msgstr "Valutazione: %(rating)s stelle"
 
-#: cps/web.py:798
+#: cps/web.py:795
 #, python-format
 msgid "File format: %(format)s"
 msgstr "Formato del file: %(format)s"
 
-#: cps/web.py:812
+#: cps/web.py:809
 #, python-format
 msgid "Category: %(name)s"
 msgstr "Categoria: %(name)s"
 
-#: cps/web.py:831
+#: cps/web.py:828
 #, python-format
 msgid "Language: %(name)s"
 msgstr "Lingua: %(name)s"
 
-#: cps/web.py:910
+#: cps/web.py:907
 msgid "Ratings list"
 msgstr "Elenco delle valutazioni"
 
-#: cps/web.py:925
+#: cps/web.py:922
 msgid "File formats list"
 msgstr "Elenco dei formati"
 
-#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:984
+#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:981
 msgid "Tasks"
 msgstr "Compito"
 
 #: cps/templates/book_edit.html:235 cps/templates/feed.xml:33
 #: cps/templates/layout.html:45 cps/templates/layout.html:48
-#: cps/templates/search_form.html:174 cps/web.py:1010 cps/web.py:1015
+#: cps/templates/search_form.html:174 cps/web.py:1007 cps/web.py:1012
 msgid "Search"
 msgstr "Cerca"
 
-#: cps/web.py:1066
+#: cps/web.py:1063
 msgid "Published after "
 msgstr "Pubblicato dopo "
 
-#: cps/web.py:1073
+#: cps/web.py:1070
 msgid "Published before "
 msgstr "Pubblicato prima "
 
-#: cps/web.py:1087
+#: cps/web.py:1084
 #, python-format
 msgid "Rating <= %(rating)s"
 msgstr "Valutazione <= %(rating)s"
 
-#: cps/web.py:1089
+#: cps/web.py:1086
 #, python-format
 msgid "Rating >= %(rating)s"
 msgstr "Valutazione >= %(rating)s"
 
-#: cps/web.py:1158 cps/web.py:1183
+#: cps/web.py:1155 cps/web.py:1180
 msgid "search"
 msgstr "ricerca"
 
-#: cps/web.py:1213
+#: cps/web.py:1210
 #, python-format
 msgid "Custom Column No.%(column)d is not existing in calibre database"
 msgstr "La colonna personale no.%(column)d non esiste nel database di Calibre"
 
-#: cps/web.py:1304
+#: cps/web.py:1301
 #, python-format
 msgid "Book successfully queued for sending to %(kindlemail)s"
 msgstr "Libro accodato con successo per essere spedito a %(kindlemail)s"
 
-#: cps/web.py:1308
+#: cps/web.py:1305
 #, python-format
 msgid "Oops! There was an error sending this book: %(res)s"
 msgstr "Si è verificato un errore durante l'invio di questo libro: %(res)s"
 
-#: cps/web.py:1310
+#: cps/web.py:1307
 msgid "Please update your profile with a valid Send to Kindle E-mail Address."
 msgstr "Per favore aggiorna il tuo profilo con un indirizzo e-mail Kindle a cui inviare i libri."
 
-#: cps/web.py:1327
+#: cps/web.py:1324
 msgid "E-Mail server is not configured, please contact your administrator!"
 msgstr "Il server e-mail non è configurato, per favore contatta l'amministratore"
 
-#: cps/web.py:1328 cps/web.py:1338 cps/web.py:1362 cps/web.py:1366
-#: cps/web.py:1371 cps/web.py:1375
+#: cps/web.py:1325 cps/web.py:1335 cps/web.py:1359 cps/web.py:1363
+#: cps/web.py:1368 cps/web.py:1372
 msgid "register"
 msgstr "registra"
 
-#: cps/web.py:1364
+#: cps/web.py:1361
 msgid "Your e-mail is not allowed to register"
 msgstr "Il tuo e-mail non è autorizzato alla registrazione"
 
-#: cps/web.py:1367
+#: cps/web.py:1364
 msgid "Confirmation e-mail was send to your e-mail account."
 msgstr "Un e-mail di conferma è stato inviato al tuo indirizzo."
 
-#: cps/web.py:1370
+#: cps/web.py:1367
 msgid "This username or e-mail address is already in use."
 msgstr "Questo nome di utente o questo e-mail sono già utilizzati."
 
-#: cps/web.py:1387
+#: cps/web.py:1384
 msgid "Cannot activate LDAP authentication"
 msgstr "Non posso attivare l'autenticazione LDAP"
 
-#: cps/web.py:1404
+#: cps/web.py:1401
 #, python-format
 msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known"
 msgstr "Login come: '%(nickname)s', il server LDAP non è raggiungibile o l'utente è sconosciuto"
 
-#: cps/web.py:1410
+#: cps/web.py:1407
 #, python-format
 msgid "Could not login: %(message)s"
 msgstr "Non posso accedere: %(message)s"
 
-#: cps/web.py:1414 cps/web.py:1438
+#: cps/web.py:1411 cps/web.py:1435
 msgid "Wrong Username or Password"
 msgstr "Nome utente o password errati"
 
-#: cps/web.py:1421
+#: cps/web.py:1418
 msgid "New Password was send to your email address"
 msgstr "Una nuova password è stata inviata al tuo recapito e-mail"
 
-#: cps/web.py:1427
+#: cps/web.py:1424
 msgid "Please enter valid username to reset password"
 msgstr "Per favore digita un nome di utente valido per resettare la password"
 
-#: cps/web.py:1433
+#: cps/web.py:1430
 #, python-format
 msgid "You are now logged in as: '%(nickname)s'"
 msgstr "Ora sei connesso come '%(nickname)s'"
 
-#: cps/web.py:1442 cps/web.py:1469
+#: cps/web.py:1439 cps/web.py:1466
 msgid "login"
 msgstr "accedi"
 
-#: cps/web.py:1481 cps/web.py:1515
+#: cps/web.py:1478 cps/web.py:1512
 msgid "Token not found"
 msgstr "Token non trovato"
 
-#: cps/web.py:1490 cps/web.py:1523
+#: cps/web.py:1487 cps/web.py:1520
 msgid "Token has expired"
 msgstr "Il token è scaduto"
 
-#: cps/web.py:1499
+#: cps/web.py:1496
 msgid "Success! Please return to your device"
 msgstr "Riuscito! Torna al tuo dispositivo"
 
-#: cps/web.py:1580 cps/web.py:1625 cps/web.py:1631
+#: cps/web.py:1577 cps/web.py:1622 cps/web.py:1628
 #, python-format
 msgid "%(name)s's profile"
 msgstr "Profilo di %(name)s"
 
-#: cps/web.py:1627
+#: cps/web.py:1624
 msgid "Profile updated"
 msgstr "Profilo aggiornato"
 
-#: cps/web.py:1656 cps/web.py:1659 cps/web.py:1662 cps/web.py:1669
-#: cps/web.py:1674
+#: cps/web.py:1653 cps/web.py:1656 cps/web.py:1659 cps/web.py:1666
+#: cps/web.py:1671
 msgid "Read a Book"
 msgstr "Leggi un libro"
 
diff --git a/cps/translations/ja/LC_MESSAGES/messages.mo b/cps/translations/ja/LC_MESSAGES/messages.mo
index 93735fd728c0e4a0f97adbe4bb06e042f1e793ad..636d38e03771d873a1fababea47e6cbed1b4a00e 100644
Binary files a/cps/translations/ja/LC_MESSAGES/messages.mo and b/cps/translations/ja/LC_MESSAGES/messages.mo differ
diff --git a/cps/translations/ja/LC_MESSAGES/messages.po b/cps/translations/ja/LC_MESSAGES/messages.po
index a9c8bfd83720fb357a2a21d4c781a5acf34bcdaa..4ae537dc11d735c1e438d31821060777e648d280 100644
--- a/cps/translations/ja/LC_MESSAGES/messages.po
+++ b/cps/translations/ja/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version:  Calibre-Web\n"
 "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
-"POT-Creation-Date: 2020-06-07 06:47+0200\n"
+"POT-Creation-Date: 2020-06-28 09:31+0200\n"
 "PO-Revision-Date: 2018-02-07 02:20-0500\n"
 "Last-Translator: white <space_white@yahoo.com>\n"
 "Language: ja\n"
@@ -46,9 +46,9 @@ msgstr ""
 msgid "Unknown command"
 msgstr ""
 
-#: cps/admin.py:116 cps/editbooks.py:563 cps/editbooks.py:573
-#: cps/editbooks.py:667 cps/editbooks.py:669 cps/editbooks.py:730
-#: cps/editbooks.py:743 cps/updater.py:509 cps/uploader.py:97
+#: cps/admin.py:116 cps/editbooks.py:564 cps/editbooks.py:576
+#: cps/editbooks.py:670 cps/editbooks.py:672 cps/editbooks.py:733
+#: cps/editbooks.py:749 cps/updater.py:509 cps/uploader.py:97
 #: cps/uploader.py:107
 msgid "Unknown"
 msgstr "不明"
@@ -61,7 +61,7 @@ msgstr "管理者ページ"
 msgid "UI Configuration"
 msgstr "UI設定"
 
-#: cps/admin.py:189 cps/admin.py:706
+#: cps/admin.py:189 cps/admin.py:711
 msgid "Calibre-Web configuration updated"
 msgstr "Calibre-Web の設定を更新しました"
 
@@ -113,175 +113,181 @@ msgstr ""
 msgid "LDAP Certificate Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:627
+#: cps/admin.py:628
 msgid "Keyfile Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:631
+#: cps/admin.py:632
 msgid "Certfile Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:701
+#: cps/admin.py:694 cps/admin.py:793 cps/admin.py:885 cps/admin.py:934
+#: cps/shelf.py:100 cps/shelf.py:161 cps/shelf.py:202 cps/shelf.py:260
+#: cps/shelf.py:309 cps/shelf.py:338 cps/shelf.py:368 cps/shelf.py:392
+msgid "Settings DB is not Writeable"
+msgstr ""
+
+#: cps/admin.py:706
 msgid "DB Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:703
+#: cps/admin.py:708
 msgid "DB is not Writeable"
 msgstr ""
 
-#: cps/admin.py:736
+#: cps/admin.py:741
 msgid "Basic Configuration"
 msgstr "基本設定"
 
-#: cps/admin.py:751 cps/web.py:1337
+#: cps/admin.py:756 cps/web.py:1334
 msgid "Please fill out all fields!"
 msgstr "全ての項目を入力してください"
 
-#: cps/admin.py:754 cps/admin.py:766 cps/admin.py:772 cps/admin.py:892
+#: cps/admin.py:759 cps/admin.py:771 cps/admin.py:777 cps/admin.py:903
 msgid "Add new user"
 msgstr "新規ユーザ追加"
 
-#: cps/admin.py:763 cps/web.py:1578
+#: cps/admin.py:768 cps/web.py:1575
 msgid "E-mail is not from valid domain"
 msgstr "このメールは有効なドメインからのものではありません"
 
-#: cps/admin.py:770 cps/admin.py:785
+#: cps/admin.py:775 cps/admin.py:790
 msgid "Found an existing account for this e-mail address or nickname."
 msgstr "このメールアドレスかニックネームで登録されたアカウントが見つかりました"
 
-#: cps/admin.py:781
+#: cps/admin.py:786
 #, python-format
 msgid "User '%(user)s' created"
 msgstr "ユーザ '%(user)s' を作成しました"
 
-#: cps/admin.py:794
+#: cps/admin.py:802
 #, python-format
 msgid "User '%(nick)s' deleted"
 msgstr "ユーザ '%(nick)s' を削除しました"
 
-#: cps/admin.py:797
+#: cps/admin.py:805
 msgid "No admin user remaining, can't delete user"
 msgstr ""
 
-#: cps/admin.py:803
+#: cps/admin.py:811
 msgid "No admin user remaining, can't remove admin role"
 msgstr ""
 
-#: cps/admin.py:839 cps/web.py:1621
+#: cps/admin.py:847 cps/web.py:1618
 msgid "Found an existing account for this e-mail address."
 msgstr "このメールアドレスで登録されたアカウントがあります"
 
-#: cps/admin.py:849 cps/admin.py:864 cps/admin.py:967 cps/web.py:1596
+#: cps/admin.py:857 cps/admin.py:872 cps/admin.py:983 cps/web.py:1593
 #, python-format
 msgid "Edit User %(nick)s"
 msgstr "%(nick)s を編集"
 
-#: cps/admin.py:855 cps/web.py:1588
+#: cps/admin.py:863 cps/web.py:1585
 msgid "This username is already taken"
 msgstr ""
 
-#: cps/admin.py:871
+#: cps/admin.py:879
 #, python-format
 msgid "User '%(nick)s' updated"
 msgstr "ユーザ '%(nick)s' を更新しました"
 
-#: cps/admin.py:874
+#: cps/admin.py:882
 msgid "An unknown error occured."
 msgstr "不明なエラーが発生しました。"
 
-#: cps/admin.py:901 cps/templates/admin.html:71
+#: cps/admin.py:912 cps/templates/admin.html:71
 msgid "Edit E-mail Server Settings"
 msgstr "SMTP設定を変更"
 
-#: cps/admin.py:925
+#: cps/admin.py:941
 #, python-format
 msgid "Test e-mail successfully send to %(kindlemail)s"
 msgstr "テストメールが %(kindlemail)s に送信されました"
 
-#: cps/admin.py:928
+#: cps/admin.py:944
 #, python-format
 msgid "There was an error sending the Test e-mail: %(res)s"
 msgstr "テストメールを %(res)s に送信中にエラーが発生しました"
 
-#: cps/admin.py:930
+#: cps/admin.py:946
 msgid "Please configure your e-mail address first..."
 msgstr ""
 
-#: cps/admin.py:932
+#: cps/admin.py:948
 msgid "E-mail server settings updated"
 msgstr "メールサーバの設定を更新しました"
 
-#: cps/admin.py:943
+#: cps/admin.py:959
 msgid "User not found"
 msgstr ""
 
-#: cps/admin.py:978
+#: cps/admin.py:994
 #, python-format
 msgid "Password for user %(user)s reset"
 msgstr "%(user)s 用のパスワードをリセット"
 
-#: cps/admin.py:981 cps/web.py:1361 cps/web.py:1425
+#: cps/admin.py:997 cps/web.py:1358 cps/web.py:1422
 msgid "An unknown error occurred. Please try again later."
 msgstr "不明なエラーが発生しました。あとで再試行してください。"
 
-#: cps/admin.py:984 cps/web.py:1299
+#: cps/admin.py:1000 cps/web.py:1296
 msgid "Please configure the SMTP mail settings first..."
 msgstr "初めにSMTPメールの設定をしてください"
 
-#: cps/admin.py:996
+#: cps/admin.py:1012
 msgid "Logfile viewer"
 msgstr ""
 
-#: cps/admin.py:1035
+#: cps/admin.py:1051
 msgid "Requesting update package"
 msgstr "更新データを要求中"
 
-#: cps/admin.py:1036
+#: cps/admin.py:1052
 msgid "Downloading update package"
 msgstr "更新データをダウンロード中"
 
-#: cps/admin.py:1037
+#: cps/admin.py:1053
 msgid "Unzipping update package"
 msgstr "更新データを展開中"
 
-#: cps/admin.py:1038
+#: cps/admin.py:1054
 msgid "Replacing files"
 msgstr "ファイルを置換中"
 
-#: cps/admin.py:1039
+#: cps/admin.py:1055
 msgid "Database connections are closed"
 msgstr "データベースの接続を切断完了"
 
-#: cps/admin.py:1040
+#: cps/admin.py:1056
 msgid "Stopping server"
 msgstr "サーバ停止中"
 
-#: cps/admin.py:1041
+#: cps/admin.py:1057
 msgid "Update finished, please press okay and reload page"
 msgstr "アップデート完了、OKを押してページをリロードしてください"
 
-#: cps/admin.py:1042 cps/admin.py:1043 cps/admin.py:1044 cps/admin.py:1045
-#: cps/admin.py:1046
+#: cps/admin.py:1058 cps/admin.py:1059 cps/admin.py:1060 cps/admin.py:1061
+#: cps/admin.py:1062
 msgid "Update failed:"
 msgstr "アップデート失敗:"
 
-#: cps/admin.py:1042 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
+#: cps/admin.py:1058 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
 msgid "HTTP Error"
 msgstr "HTTPエラー"
 
-#: cps/admin.py:1043 cps/updater.py:321 cps/updater.py:524
+#: cps/admin.py:1059 cps/updater.py:321 cps/updater.py:524
 msgid "Connection error"
 msgstr "接続エラー"
 
-#: cps/admin.py:1044 cps/updater.py:323 cps/updater.py:526
+#: cps/admin.py:1060 cps/updater.py:323 cps/updater.py:526
 msgid "Timeout while establishing connection"
 msgstr "接続を確立中にタイムアウトしました"
 
-#: cps/admin.py:1045 cps/updater.py:325 cps/updater.py:528
+#: cps/admin.py:1061 cps/updater.py:325 cps/updater.py:528
 msgid "General error"
 msgstr "エラー発生"
 
-#: cps/admin.py:1046
+#: cps/admin.py:1062
 msgid "Update File Could Not be Saved in Temp Dir"
 msgstr ""
 
@@ -301,8 +307,8 @@ msgstr ""
 msgid "Book Successfully Deleted"
 msgstr ""
 
-#: cps/editbooks.py:254 cps/editbooks.py:548 cps/web.py:1644 cps/web.py:1685
-#: cps/web.py:1747
+#: cps/editbooks.py:254 cps/editbooks.py:549 cps/web.py:1641 cps/web.py:1682
+#: cps/web.py:1744
 msgid "Error opening eBook. File does not exist or file is not accessible"
 msgstr "電子書籍を開けません。ファイルが存在しないかアクセスできません"
 
@@ -310,82 +316,82 @@ msgstr "電子書籍を開けません。ファイルが存在しないかアク
 msgid "edit metadata"
 msgstr "メタデータを編集"
 
-#: cps/editbooks.py:361
+#: cps/editbooks.py:360
 #, python-format
 msgid "%(langname)s is not a valid language"
 msgstr "%(langname)s は有効な言語ではありません"
 
-#: cps/editbooks.py:467 cps/editbooks.py:712
+#: cps/editbooks.py:468 cps/editbooks.py:715
 #, python-format
 msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
 msgstr "ファイル拡張子 '%(ext)s' をこのサーバにアップロードすることは許可されていません"
 
-#: cps/editbooks.py:471 cps/editbooks.py:716
+#: cps/editbooks.py:472 cps/editbooks.py:719
 msgid "File to be uploaded must have an extension"
 msgstr "アップロードするファイルには拡張子が必要です"
 
-#: cps/editbooks.py:483 cps/editbooks.py:773
+#: cps/editbooks.py:484 cps/editbooks.py:779
 #, python-format
 msgid "Failed to create path %(path)s (Permission denied)."
 msgstr "%(path)s の作成に失敗しました (Permission denied)。"
 
-#: cps/editbooks.py:488
+#: cps/editbooks.py:489
 #, python-format
 msgid "Failed to store file %(file)s."
 msgstr "%(file)s を保存できません。"
 
-#: cps/editbooks.py:506 cps/editbooks.py:864
+#: cps/editbooks.py:507 cps/editbooks.py:870
 #, python-format
 msgid "Database error: %(error)s."
 msgstr ""
 
-#: cps/editbooks.py:510
+#: cps/editbooks.py:511
 #, python-format
 msgid "File format %(ext)s added to %(book)s"
 msgstr "ファイル形式 %(ext)s が %(book)s に追加されました"
 
-#: cps/editbooks.py:653
+#: cps/editbooks.py:656
 msgid "Metadata successfully updated"
 msgstr "メタデータを更新しました"
 
-#: cps/editbooks.py:662
+#: cps/editbooks.py:665
 msgid "Error editing book, please check logfile for details"
 msgstr "本の編集でエラーが発生しました。詳細はログファイルを確認してください"
 
-#: cps/editbooks.py:724
+#: cps/editbooks.py:727
 #, python-format
 msgid "File %(filename)s could not saved to temp dir"
 msgstr ""
 
-#: cps/editbooks.py:734
+#: cps/editbooks.py:737
 msgid "Uploaded book probably exists in the library, consider to change before upload new: "
 msgstr ""
 
-#: cps/editbooks.py:780
+#: cps/editbooks.py:786
 #, python-format
 msgid "Failed to Move File %(file)s: %(error)s"
 msgstr ""
 
-#: cps/editbooks.py:836
+#: cps/editbooks.py:842
 #, python-format
 msgid "Failed to Move Cover File %(file)s: %(error)s"
 msgstr ""
 
-#: cps/editbooks.py:850
+#: cps/editbooks.py:856
 #, python-format
 msgid "File %(file)s uploaded"
 msgstr ""
 
-#: cps/editbooks.py:876
+#: cps/editbooks.py:882
 msgid "Source or destination format for conversion missing"
 msgstr "変換元の形式または変換後の形式が指定されていません"
 
-#: cps/editbooks.py:884
+#: cps/editbooks.py:890
 #, python-format
 msgid "Book successfully queued for converting to %(book_format)s"
 msgstr "本の %(book_format)s への変換がキューに追加されました"
 
-#: cps/editbooks.py:888
+#: cps/editbooks.py:894
 #, python-format
 msgid "There was an error converting this book: %(res)s"
 msgstr "この本の変換中にエラーが発生しました: %(res)s"
@@ -499,71 +505,71 @@ msgstr "ファイル %(file)s はGoogleドライブ上にありません"
 msgid "Book path %(path)s not found on Google Drive"
 msgstr "本のパス %(path)s はGoogleドライブ上にありません"
 
-#: cps/helper.py:542
+#: cps/helper.py:550
 msgid "Error Downloading Cover"
 msgstr ""
 
-#: cps/helper.py:545
+#: cps/helper.py:553
 msgid "Cover Format Error"
 msgstr ""
 
-#: cps/helper.py:561
+#: cps/helper.py:569
 msgid "Failed to create path for cover"
 msgstr ""
 
-#: cps/helper.py:566
+#: cps/helper.py:574
 msgid "Cover-file is not a valid image file, or could not be stored"
 msgstr ""
 
-#: cps/helper.py:577
+#: cps/helper.py:585
 msgid "Only jpg/jpeg/png/webp files are supported as coverfile"
 msgstr ""
 
-#: cps/helper.py:591
+#: cps/helper.py:599
 msgid "Only jpg/jpeg files are supported as coverfile"
 msgstr ""
 
-#: cps/helper.py:640
+#: cps/helper.py:648
 msgid "Unrar binary file not found"
 msgstr ""
 
-#: cps/helper.py:654
+#: cps/helper.py:662
 msgid "Error excecuting UnRar"
 msgstr ""
 
-#: cps/helper.py:710
+#: cps/helper.py:718
 msgid "Waiting"
 msgstr "待機中"
 
-#: cps/helper.py:712
+#: cps/helper.py:720
 msgid "Failed"
 msgstr "失敗"
 
-#: cps/helper.py:714
+#: cps/helper.py:722
 msgid "Started"
 msgstr "é–‹å§‹"
 
-#: cps/helper.py:716
+#: cps/helper.py:724
 msgid "Finished"
 msgstr "終了"
 
-#: cps/helper.py:718
+#: cps/helper.py:726
 msgid "Unknown Status"
 msgstr "不明"
 
-#: cps/helper.py:723
+#: cps/helper.py:731
 msgid "E-mail: "
 msgstr "メール: "
 
-#: cps/helper.py:725 cps/helper.py:729
+#: cps/helper.py:733 cps/helper.py:737
 msgid "Convert: "
 msgstr "変換: "
 
-#: cps/helper.py:727
+#: cps/helper.py:735
 msgid "Upload: "
 msgstr "アップロード: "
 
-#: cps/helper.py:731
+#: cps/helper.py:739
 msgid "Unknown Task: "
 msgstr "不明なタスク: "
 
@@ -596,7 +602,7 @@ msgstr ""
 msgid "Failed to fetch user info from Google."
 msgstr ""
 
-#: cps/oauth_bb.py:225 cps/web.py:1397 cps/web.py:1537
+#: cps/oauth_bb.py:225 cps/web.py:1394 cps/web.py:1534
 #, python-format
 msgid "you are now logged in as: '%(nickname)s'"
 msgstr "%(nickname)s としてログイン中"
@@ -633,218 +639,218 @@ msgstr ""
 msgid "Google Oauth error, please retry later."
 msgstr ""
 
-#: cps/shelf.py:66 cps/shelf.py:111
+#: cps/shelf.py:67 cps/shelf.py:120
 msgid "Invalid shelf specified"
 msgstr "指定された本棚は無効です"
 
-#: cps/shelf.py:72
+#: cps/shelf.py:73
 #, python-format
 msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s"
 msgstr "申し訳ありませんが、あなたは %(shelfname)s に本を追加することが許可されていません"
 
-#: cps/shelf.py:82
+#: cps/shelf.py:83
 #, python-format
 msgid "Book is already part of the shelf: %(shelfname)s"
 msgstr "この本は %(shelfname)s にすでに追加されています"
 
-#: cps/shelf.py:97
+#: cps/shelf.py:106
 #, python-format
 msgid "Book has been added to shelf: %(sname)s"
 msgstr "本を %(sname)s に追加しました"
 
-#: cps/shelf.py:115
+#: cps/shelf.py:124
 #, python-format
 msgid "You are not allowed to add a book to the the shelf: %(name)s"
 msgstr "%(name)s に本を追加することが許可されていません"
 
-#: cps/shelf.py:133
+#: cps/shelf.py:142
 #, python-format
 msgid "Books are already part of the shelf: %(name)s"
 msgstr "これらの本は %(name)s にすでに追加されています"
 
-#: cps/shelf.py:148
+#: cps/shelf.py:158
 #, python-format
 msgid "Books have been added to shelf: %(sname)s"
 msgstr "本が %(sname)s に追加されました"
 
-#: cps/shelf.py:150
+#: cps/shelf.py:163
 #, python-format
 msgid "Could not add books to shelf: %(sname)s"
 msgstr "%(sname)s に本を追加できません"
 
-#: cps/shelf.py:188
+#: cps/shelf.py:208
 #, python-format
 msgid "Book has been removed from shelf: %(sname)s"
 msgstr "本が %(sname)s から削除されました"
 
-#: cps/shelf.py:196
+#: cps/shelf.py:216
 #, python-format
 msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
 msgstr "申し訳ありませんが、%(sname)s から本を削除することが許可されていません"
 
-#: cps/shelf.py:220 cps/shelf.py:260
+#: cps/shelf.py:240 cps/shelf.py:284
 #, python-format
 msgid "A public shelf with the name '%(title)s' already exists."
 msgstr ""
 
-#: cps/shelf.py:229 cps/shelf.py:270
+#: cps/shelf.py:249 cps/shelf.py:294
 #, python-format
 msgid "A private shelf with the name '%(title)s' already exists."
 msgstr ""
 
-#: cps/shelf.py:236
+#: cps/shelf.py:256
 #, python-format
 msgid "Shelf %(title)s created"
 msgstr "%(title)s を作成しました"
 
-#: cps/shelf.py:239 cps/shelf.py:284
+#: cps/shelf.py:263 cps/shelf.py:312
 msgid "There was an error"
 msgstr "エラーが発生しました"
 
-#: cps/shelf.py:240 cps/shelf.py:242 cps/templates/layout.html:144
+#: cps/shelf.py:264 cps/shelf.py:266 cps/templates/layout.html:144
 msgid "Create a Shelf"
 msgstr "本棚を作成する"
 
-#: cps/shelf.py:282
+#: cps/shelf.py:306
 #, python-format
 msgid "Shelf %(title)s changed"
 msgstr "%(title)s を変更しました"
 
-#: cps/shelf.py:285 cps/shelf.py:287
+#: cps/shelf.py:313 cps/shelf.py:315
 msgid "Edit a shelf"
 msgstr "本棚を編集する"
 
-#: cps/shelf.py:332
+#: cps/shelf.py:369
 #, python-format
 msgid "Shelf: '%(name)s'"
 msgstr "本棚: '%(name)s'"
 
-#: cps/shelf.py:335
+#: cps/shelf.py:372
 msgid "Error opening shelf. Shelf does not exist or is not accessible"
 msgstr "本棚を開けません。この本棚は存在しないかアクセスできません"
 
-#: cps/shelf.py:368
+#: cps/shelf.py:409
 msgid "Hidden Book"
 msgstr ""
 
-#: cps/shelf.py:373
+#: cps/shelf.py:414
 #, python-format
 msgid "Change order of Shelf: '%(name)s'"
 msgstr "'%(name)s' 内の本の順番を変更する"
 
-#: cps/ub.py:64
+#: cps/ub.py:65
 msgid "Recently Added"
 msgstr "最近追加した本"
 
-#: cps/ub.py:66
+#: cps/ub.py:67
 msgid "Show recent books"
 msgstr "最近追加された本を表示"
 
-#: cps/templates/index.xml:17 cps/ub.py:67
+#: cps/templates/index.xml:17 cps/ub.py:68
 msgid "Hot Books"
 msgstr "人気の本"
 
-#: cps/ub.py:69
+#: cps/ub.py:70
 msgid "Show Hot Books"
 msgstr ""
 
-#: cps/templates/index.xml:24 cps/ub.py:71 cps/web.py:655
+#: cps/templates/index.xml:24 cps/ub.py:72 cps/web.py:652
 msgid "Top Rated Books"
 msgstr ""
 
-#: cps/ub.py:73
+#: cps/ub.py:74
 msgid "Show Top Rated Books"
 msgstr ""
 
-#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:74
-#: cps/web.py:1222
+#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:75
+#: cps/web.py:1219
 msgid "Read Books"
 msgstr "読んだ本"
 
-#: cps/ub.py:76
+#: cps/ub.py:77
 msgid "Show read and unread"
 msgstr "既読の本と未読の本を表示"
 
-#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:78
-#: cps/web.py:1225
+#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:79
+#: cps/web.py:1222
 msgid "Unread Books"
 msgstr "未読の本"
 
-#: cps/ub.py:80
+#: cps/ub.py:81
 msgid "Show unread"
 msgstr ""
 
-#: cps/ub.py:81
+#: cps/ub.py:82
 msgid "Discover"
 msgstr "見つける"
 
-#: cps/ub.py:83
+#: cps/ub.py:84
 msgid "Show random books"
 msgstr "ランダムで本を表示"
 
-#: cps/templates/index.xml:75 cps/ub.py:84 cps/web.py:970
+#: cps/templates/index.xml:75 cps/ub.py:85 cps/web.py:967
 msgid "Categories"
 msgstr "カテゴリ"
 
-#: cps/ub.py:86
+#: cps/ub.py:87
 msgid "Show category selection"
 msgstr "カテゴリ選択を表示"
 
 #: cps/templates/book_edit.html:84 cps/templates/index.xml:82
-#: cps/templates/search_form.html:53 cps/ub.py:87 cps/web.py:886 cps/web.py:896
+#: cps/templates/search_form.html:53 cps/ub.py:88 cps/web.py:883 cps/web.py:893
 msgid "Series"
 msgstr "シリーズ"
 
-#: cps/ub.py:89
+#: cps/ub.py:90
 msgid "Show series selection"
 msgstr "シリーズ選択を表示"
 
-#: cps/templates/index.xml:61 cps/ub.py:90
+#: cps/templates/index.xml:61 cps/ub.py:91
 msgid "Authors"
 msgstr "著者"
 
-#: cps/ub.py:92
+#: cps/ub.py:93
 msgid "Show author selection"
 msgstr "著者選択を表示"
 
-#: cps/templates/index.xml:68 cps/ub.py:94 cps/web.py:869
+#: cps/templates/index.xml:68 cps/ub.py:95 cps/web.py:866
 msgid "Publishers"
 msgstr "出版社"
 
-#: cps/ub.py:96
+#: cps/ub.py:97
 msgid "Show publisher selection"
 msgstr "出版社選択を表示"
 
-#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:97
-#: cps/web.py:953
+#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:98
+#: cps/web.py:950
 msgid "Languages"
 msgstr "言語"
 
-#: cps/ub.py:100
+#: cps/ub.py:101
 msgid "Show language selection"
 msgstr "言語選択を表示"
 
-#: cps/templates/index.xml:96 cps/ub.py:101
+#: cps/templates/index.xml:96 cps/ub.py:102
 msgid "Ratings"
 msgstr ""
 
-#: cps/ub.py:103
+#: cps/ub.py:104
 msgid "Show ratings selection"
 msgstr ""
 
-#: cps/templates/index.xml:104 cps/ub.py:104
+#: cps/templates/index.xml:104 cps/ub.py:105
 msgid "File formats"
 msgstr ""
 
-#: cps/ub.py:106
+#: cps/ub.py:107
 msgid "Show file formats selection"
 msgstr ""
 
-#: cps/ub.py:108 cps/web.py:1249
+#: cps/ub.py:109 cps/web.py:1246
 msgid "Archived Books"
 msgstr ""
 
-#: cps/ub.py:110
+#: cps/ub.py:111
 msgid "Show archived books"
 msgstr ""
 
@@ -877,220 +883,220 @@ msgstr "アップデートが利用可能です。下のボタンをクリック
 msgid "Click on the button below to update to the latest stable version."
 msgstr ""
 
-#: cps/web.py:322
+#: cps/web.py:319
 #, python-format
 msgid "Error: %(ldaperror)s"
 msgstr ""
 
-#: cps/web.py:326
+#: cps/web.py:323
 msgid "Error: No user returned in response of LDAP server"
 msgstr ""
 
-#: cps/web.py:374
+#: cps/web.py:371
 msgid "Failed to Create at Least One LDAP User"
 msgstr ""
 
-#: cps/web.py:377
+#: cps/web.py:374
 msgid "At Least One LDAP User Not Found in Database"
 msgstr ""
 
-#: cps/web.py:379
+#: cps/web.py:376
 msgid "User Successfully Imported"
 msgstr ""
 
-#: cps/web.py:625
+#: cps/web.py:622
 msgid "Recently Added Books"
 msgstr "最近追加された本"
 
-#: cps/templates/index.html:5 cps/web.py:663
+#: cps/templates/index.html:5 cps/web.py:660
 msgid "Discover (Random Books)"
 msgstr "本を見つける (ランダムで表示)"
 
-#: cps/web.py:691
+#: cps/web.py:688
 msgid "Books"
 msgstr ""
 
-#: cps/web.py:718
+#: cps/web.py:715
 msgid "Hot Books (Most Downloaded)"
 msgstr ""
 
-#: cps/web.py:731
+#: cps/web.py:728
 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible"
 msgstr ""
 
-#: cps/web.py:745
+#: cps/web.py:742
 #, python-format
 msgid "Author: %(name)s"
 msgstr ""
 
-#: cps/web.py:759
+#: cps/web.py:756
 #, python-format
 msgid "Publisher: %(name)s"
 msgstr "出版社: %(name)s"
 
-#: cps/web.py:772
+#: cps/web.py:769
 #, python-format
 msgid "Series: %(serie)s"
 msgstr "シリーズ: %(serie)s"
 
-#: cps/web.py:785
+#: cps/web.py:782
 #, python-format
 msgid "Rating: %(rating)s stars"
 msgstr ""
 
-#: cps/web.py:798
+#: cps/web.py:795
 #, python-format
 msgid "File format: %(format)s"
 msgstr ""
 
-#: cps/web.py:812
+#: cps/web.py:809
 #, python-format
 msgid "Category: %(name)s"
 msgstr "カテゴリ: %(name)s"
 
-#: cps/web.py:831
+#: cps/web.py:828
 #, python-format
 msgid "Language: %(name)s"
 msgstr "言語: %(name)s"
 
-#: cps/web.py:910
+#: cps/web.py:907
 msgid "Ratings list"
 msgstr ""
 
-#: cps/web.py:925
+#: cps/web.py:922
 msgid "File formats list"
 msgstr ""
 
-#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:984
+#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:981
 msgid "Tasks"
 msgstr "タスク"
 
 #: cps/templates/book_edit.html:235 cps/templates/feed.xml:33
 #: cps/templates/layout.html:45 cps/templates/layout.html:48
-#: cps/templates/search_form.html:174 cps/web.py:1010 cps/web.py:1015
+#: cps/templates/search_form.html:174 cps/web.py:1007 cps/web.py:1012
 msgid "Search"
 msgstr "検索"
 
-#: cps/web.py:1066
+#: cps/web.py:1063
 msgid "Published after "
 msgstr "これ以降に出版 "
 
-#: cps/web.py:1073
+#: cps/web.py:1070
 msgid "Published before "
 msgstr "これ以前に出版 "
 
-#: cps/web.py:1087
+#: cps/web.py:1084
 #, python-format
 msgid "Rating <= %(rating)s"
 msgstr "評価 <= %(rating)s"
 
-#: cps/web.py:1089
+#: cps/web.py:1086
 #, python-format
 msgid "Rating >= %(rating)s"
 msgstr "評価 >= %(rating)s"
 
-#: cps/web.py:1158 cps/web.py:1183
+#: cps/web.py:1155 cps/web.py:1180
 msgid "search"
 msgstr "検索"
 
-#: cps/web.py:1213
+#: cps/web.py:1210
 #, python-format
 msgid "Custom Column No.%(column)d is not existing in calibre database"
 msgstr ""
 
-#: cps/web.py:1304
+#: cps/web.py:1301
 #, python-format
 msgid "Book successfully queued for sending to %(kindlemail)s"
 msgstr "本の %(kindlemail)s への送信がキューに追加されました"
 
-#: cps/web.py:1308
+#: cps/web.py:1305
 #, python-format
 msgid "Oops! There was an error sending this book: %(res)s"
 msgstr "%(res)s を送信中にエラーが発生しました"
 
-#: cps/web.py:1310
+#: cps/web.py:1307
 msgid "Please update your profile with a valid Send to Kindle E-mail Address."
 msgstr "初めにKindleのメールアドレスを設定してください"
 
-#: cps/web.py:1327
+#: cps/web.py:1324
 msgid "E-Mail server is not configured, please contact your administrator!"
 msgstr ""
 
-#: cps/web.py:1328 cps/web.py:1338 cps/web.py:1362 cps/web.py:1366
-#: cps/web.py:1371 cps/web.py:1375
+#: cps/web.py:1325 cps/web.py:1335 cps/web.py:1359 cps/web.py:1363
+#: cps/web.py:1368 cps/web.py:1372
 msgid "register"
 msgstr "登録"
 
-#: cps/web.py:1364
+#: cps/web.py:1361
 msgid "Your e-mail is not allowed to register"
 msgstr "このメールアドレスは登録が許可されていません"
 
-#: cps/web.py:1367
+#: cps/web.py:1364
 msgid "Confirmation e-mail was send to your e-mail account."
 msgstr "確認メールがこのメールアドレスに送信されました。"
 
-#: cps/web.py:1370
+#: cps/web.py:1367
 msgid "This username or e-mail address is already in use."
 msgstr "このユーザ名またはメールアドレスはすでに使われています。"
 
-#: cps/web.py:1387
+#: cps/web.py:1384
 msgid "Cannot activate LDAP authentication"
 msgstr ""
 
-#: cps/web.py:1404
+#: cps/web.py:1401
 #, python-format
 msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known"
 msgstr ""
 
-#: cps/web.py:1410
+#: cps/web.py:1407
 #, python-format
 msgid "Could not login: %(message)s"
 msgstr ""
 
-#: cps/web.py:1414 cps/web.py:1438
+#: cps/web.py:1411 cps/web.py:1435
 msgid "Wrong Username or Password"
 msgstr "ユーザ名またはパスワードが違います"
 
-#: cps/web.py:1421
+#: cps/web.py:1418
 msgid "New Password was send to your email address"
 msgstr ""
 
-#: cps/web.py:1427
+#: cps/web.py:1424
 msgid "Please enter valid username to reset password"
 msgstr ""
 
-#: cps/web.py:1433
+#: cps/web.py:1430
 #, python-format
 msgid "You are now logged in as: '%(nickname)s'"
 msgstr ""
 
-#: cps/web.py:1442 cps/web.py:1469
+#: cps/web.py:1439 cps/web.py:1466
 msgid "login"
 msgstr "ログイン"
 
-#: cps/web.py:1481 cps/web.py:1515
+#: cps/web.py:1478 cps/web.py:1512
 msgid "Token not found"
 msgstr "トークンが見つかりません"
 
-#: cps/web.py:1490 cps/web.py:1523
+#: cps/web.py:1487 cps/web.py:1520
 msgid "Token has expired"
 msgstr "トークンが無効です"
 
-#: cps/web.py:1499
+#: cps/web.py:1496
 msgid "Success! Please return to your device"
 msgstr "成功です!端末に戻ってください"
 
-#: cps/web.py:1580 cps/web.py:1625 cps/web.py:1631
+#: cps/web.py:1577 cps/web.py:1622 cps/web.py:1628
 #, python-format
 msgid "%(name)s's profile"
 msgstr "%(name)s のプロフィール"
 
-#: cps/web.py:1627
+#: cps/web.py:1624
 msgid "Profile updated"
 msgstr "プロフィールを更新しました"
 
-#: cps/web.py:1656 cps/web.py:1659 cps/web.py:1662 cps/web.py:1669
-#: cps/web.py:1674
+#: cps/web.py:1653 cps/web.py:1656 cps/web.py:1659 cps/web.py:1666
+#: cps/web.py:1671
 msgid "Read a Book"
 msgstr "本を読む"
 
diff --git a/cps/translations/km/LC_MESSAGES/messages.mo b/cps/translations/km/LC_MESSAGES/messages.mo
index 9f7892336950d316a0b80d3c3359123c1e2651fb..2db61a469712795fa51eef9148633536d529aa8f 100644
Binary files a/cps/translations/km/LC_MESSAGES/messages.mo and b/cps/translations/km/LC_MESSAGES/messages.mo differ
diff --git a/cps/translations/km/LC_MESSAGES/messages.po b/cps/translations/km/LC_MESSAGES/messages.po
index c1a2b074b84347c512fad92e3aff144d6505e772..10d2d6af4c3a56fdf692976f2f7de1520ac94127 100644
--- a/cps/translations/km/LC_MESSAGES/messages.po
+++ b/cps/translations/km/LC_MESSAGES/messages.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version:  Calibre-Web\n"
 "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
-"POT-Creation-Date: 2020-06-07 06:47+0200\n"
+"POT-Creation-Date: 2020-06-28 09:31+0200\n"
 "PO-Revision-Date: 2018-08-27 17:06+0700\n"
 "Last-Translator: \n"
 "Language: km_KH\n"
@@ -47,9 +47,9 @@ msgstr ""
 msgid "Unknown command"
 msgstr ""
 
-#: cps/admin.py:116 cps/editbooks.py:563 cps/editbooks.py:573
-#: cps/editbooks.py:667 cps/editbooks.py:669 cps/editbooks.py:730
-#: cps/editbooks.py:743 cps/updater.py:509 cps/uploader.py:97
+#: cps/admin.py:116 cps/editbooks.py:564 cps/editbooks.py:576
+#: cps/editbooks.py:670 cps/editbooks.py:672 cps/editbooks.py:733
+#: cps/editbooks.py:749 cps/updater.py:509 cps/uploader.py:97
 #: cps/uploader.py:107
 msgid "Unknown"
 msgstr "មិនដឹង"
@@ -62,7 +62,7 @@ msgstr "ទំព័ររដ្ឋបាល"
 msgid "UI Configuration"
 msgstr "ការកំណត់ផ្ទាំងប្រើប្រាស់"
 
-#: cps/admin.py:189 cps/admin.py:706
+#: cps/admin.py:189 cps/admin.py:711
 msgid "Calibre-Web configuration updated"
 msgstr ""
 
@@ -114,175 +114,181 @@ msgstr ""
 msgid "LDAP Certificate Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:627
+#: cps/admin.py:628
 msgid "Keyfile Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:631
+#: cps/admin.py:632
 msgid "Certfile Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:701
+#: cps/admin.py:694 cps/admin.py:793 cps/admin.py:885 cps/admin.py:934
+#: cps/shelf.py:100 cps/shelf.py:161 cps/shelf.py:202 cps/shelf.py:260
+#: cps/shelf.py:309 cps/shelf.py:338 cps/shelf.py:368 cps/shelf.py:392
+msgid "Settings DB is not Writeable"
+msgstr ""
+
+#: cps/admin.py:706
 msgid "DB Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:703
+#: cps/admin.py:708
 msgid "DB is not Writeable"
 msgstr ""
 
-#: cps/admin.py:736
+#: cps/admin.py:741
 msgid "Basic Configuration"
 msgstr "ការកំណត់សាមញ្ញ"
 
-#: cps/admin.py:751 cps/web.py:1337
+#: cps/admin.py:756 cps/web.py:1334
 msgid "Please fill out all fields!"
 msgstr "សូមបំពេញចន្លោះទាំងអស់!"
 
-#: cps/admin.py:754 cps/admin.py:766 cps/admin.py:772 cps/admin.py:892
+#: cps/admin.py:759 cps/admin.py:771 cps/admin.py:777 cps/admin.py:903
 msgid "Add new user"
 msgstr "បន្ថែមអ្នកប្រើប្រាស់ថ្មី"
 
-#: cps/admin.py:763 cps/web.py:1578
+#: cps/admin.py:768 cps/web.py:1575
 msgid "E-mail is not from valid domain"
 msgstr ""
 
-#: cps/admin.py:770 cps/admin.py:785
+#: cps/admin.py:775 cps/admin.py:790
 msgid "Found an existing account for this e-mail address or nickname."
 msgstr ""
 
-#: cps/admin.py:781
+#: cps/admin.py:786
 #, python-format
 msgid "User '%(user)s' created"
 msgstr "បានបង្កើតអ្នកប្រើប្រាស់ ‘%(user)s’"
 
-#: cps/admin.py:794
+#: cps/admin.py:802
 #, python-format
 msgid "User '%(nick)s' deleted"
 msgstr "អ្នកប្រើប្រាស់ ‘%(nick)s’ ត្រូវបានលុប"
 
-#: cps/admin.py:797
+#: cps/admin.py:805
 msgid "No admin user remaining, can't delete user"
 msgstr ""
 
-#: cps/admin.py:803
+#: cps/admin.py:811
 msgid "No admin user remaining, can't remove admin role"
 msgstr ""
 
-#: cps/admin.py:839 cps/web.py:1621
+#: cps/admin.py:847 cps/web.py:1618
 msgid "Found an existing account for this e-mail address."
 msgstr ""
 
-#: cps/admin.py:849 cps/admin.py:864 cps/admin.py:967 cps/web.py:1596
+#: cps/admin.py:857 cps/admin.py:872 cps/admin.py:983 cps/web.py:1593
 #, python-format
 msgid "Edit User %(nick)s"
 msgstr "កែប្រែអ្នកប្រើប្រាស់ %(nick)s"
 
-#: cps/admin.py:855 cps/web.py:1588
+#: cps/admin.py:863 cps/web.py:1585
 msgid "This username is already taken"
 msgstr ""
 
-#: cps/admin.py:871
+#: cps/admin.py:879
 #, python-format
 msgid "User '%(nick)s' updated"
 msgstr "អ្នកប្រើប្រាស់ ‘%(nick)s’ ត្រូវបានកែប្រែ"
 
-#: cps/admin.py:874
+#: cps/admin.py:882
 msgid "An unknown error occured."
 msgstr "បញ្ហាដែលមិនដឹងបានកើតឡើង។"
 
-#: cps/admin.py:901 cps/templates/admin.html:71
+#: cps/admin.py:912 cps/templates/admin.html:71
 msgid "Edit E-mail Server Settings"
 msgstr "ប្តូរការកំណត់ SMTP"
 
-#: cps/admin.py:925
+#: cps/admin.py:941
 #, python-format
 msgid "Test e-mail successfully send to %(kindlemail)s"
 msgstr ""
 
-#: cps/admin.py:928
+#: cps/admin.py:944
 #, python-format
 msgid "There was an error sending the Test e-mail: %(res)s"
 msgstr ""
 
-#: cps/admin.py:930
+#: cps/admin.py:946
 msgid "Please configure your e-mail address first..."
 msgstr ""
 
-#: cps/admin.py:932
+#: cps/admin.py:948
 msgid "E-mail server settings updated"
 msgstr ""
 
-#: cps/admin.py:943
+#: cps/admin.py:959
 msgid "User not found"
 msgstr ""
 
-#: cps/admin.py:978
+#: cps/admin.py:994
 #, python-format
 msgid "Password for user %(user)s reset"
 msgstr ""
 
-#: cps/admin.py:981 cps/web.py:1361 cps/web.py:1425
+#: cps/admin.py:997 cps/web.py:1358 cps/web.py:1422
 msgid "An unknown error occurred. Please try again later."
 msgstr ""
 
-#: cps/admin.py:984 cps/web.py:1299
+#: cps/admin.py:1000 cps/web.py:1296
 msgid "Please configure the SMTP mail settings first..."
 msgstr "សូមកំណត់អ៊ីមែល SMTP ជាមុនសិន"
 
-#: cps/admin.py:996
+#: cps/admin.py:1012
 msgid "Logfile viewer"
 msgstr ""
 
-#: cps/admin.py:1035
+#: cps/admin.py:1051
 msgid "Requesting update package"
 msgstr "កំពុងស្នើសុំឯកសារបច្ចុប្បន្នភាព"
 
-#: cps/admin.py:1036
+#: cps/admin.py:1052
 msgid "Downloading update package"
 msgstr "កំពុងទាញយកឯកសារបច្ចុប្បន្នភាព"
 
-#: cps/admin.py:1037
+#: cps/admin.py:1053
 msgid "Unzipping update package"
 msgstr "កំពុងពន្លាឯកសារបច្ចុប្បន្នភាព"
 
-#: cps/admin.py:1038
+#: cps/admin.py:1054
 msgid "Replacing files"
 msgstr ""
 
-#: cps/admin.py:1039
+#: cps/admin.py:1055
 msgid "Database connections are closed"
 msgstr "ទំនាក់ទំនងទៅមូលដ្ឋានទិន្នន័យត្រូវបានផ្តាច់"
 
-#: cps/admin.py:1040
+#: cps/admin.py:1056
 msgid "Stopping server"
 msgstr ""
 
-#: cps/admin.py:1041
+#: cps/admin.py:1057
 msgid "Update finished, please press okay and reload page"
 msgstr "ការធ្វើបច្ចុប្បន្នភាពបានបញ្ចប់ សូមចុច okay រួចបើកទំព័រជាថ្មី"
 
-#: cps/admin.py:1042 cps/admin.py:1043 cps/admin.py:1044 cps/admin.py:1045
-#: cps/admin.py:1046
+#: cps/admin.py:1058 cps/admin.py:1059 cps/admin.py:1060 cps/admin.py:1061
+#: cps/admin.py:1062
 msgid "Update failed:"
 msgstr ""
 
-#: cps/admin.py:1042 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
+#: cps/admin.py:1058 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
 msgid "HTTP Error"
 msgstr ""
 
-#: cps/admin.py:1043 cps/updater.py:321 cps/updater.py:524
+#: cps/admin.py:1059 cps/updater.py:321 cps/updater.py:524
 msgid "Connection error"
 msgstr ""
 
-#: cps/admin.py:1044 cps/updater.py:323 cps/updater.py:526
+#: cps/admin.py:1060 cps/updater.py:323 cps/updater.py:526
 msgid "Timeout while establishing connection"
 msgstr ""
 
-#: cps/admin.py:1045 cps/updater.py:325 cps/updater.py:528
+#: cps/admin.py:1061 cps/updater.py:325 cps/updater.py:528
 msgid "General error"
 msgstr ""
 
-#: cps/admin.py:1046
+#: cps/admin.py:1062
 msgid "Update File Could Not be Saved in Temp Dir"
 msgstr ""
 
@@ -302,8 +308,8 @@ msgstr ""
 msgid "Book Successfully Deleted"
 msgstr ""
 
-#: cps/editbooks.py:254 cps/editbooks.py:548 cps/web.py:1644 cps/web.py:1685
-#: cps/web.py:1747
+#: cps/editbooks.py:254 cps/editbooks.py:549 cps/web.py:1641 cps/web.py:1682
+#: cps/web.py:1744
 msgid "Error opening eBook. File does not exist or file is not accessible"
 msgstr "មានបញ្ហាពេលបើកឯកសារ eBook ។ ពុំមានឯកសារ ឬឯកសារនេះមិនអាចបើកបាន"
 
@@ -311,82 +317,82 @@ msgstr "មានបញ្ហាពេលបើកឯកសារ eBook ។ ព
 msgid "edit metadata"
 msgstr "កែប្រែទិន្នន័យមេតា"
 
-#: cps/editbooks.py:361
+#: cps/editbooks.py:360
 #, python-format
 msgid "%(langname)s is not a valid language"
 msgstr ""
 
-#: cps/editbooks.py:467 cps/editbooks.py:712
+#: cps/editbooks.py:468 cps/editbooks.py:715
 #, python-format
 msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
 msgstr "ឯកសារប្រភេទ '%(ext)s' មិនត្រូវបានអនុញ្ញាតឲអាប់ឡូដទៅម៉ាស៊ីន server នេះទេ"
 
-#: cps/editbooks.py:471 cps/editbooks.py:716
+#: cps/editbooks.py:472 cps/editbooks.py:719
 msgid "File to be uploaded must have an extension"
 msgstr "ឯកសារដែលត្រូវអាប់ឡូដត្រូវមានកន្ទុយឯកសារ"
 
-#: cps/editbooks.py:483 cps/editbooks.py:773
+#: cps/editbooks.py:484 cps/editbooks.py:779
 #, python-format
 msgid "Failed to create path %(path)s (Permission denied)."
 msgstr "មិនអាចបង្កើតទីតាំង %(path)s (ពុំមានសិទ្ធិ)។"
 
-#: cps/editbooks.py:488
+#: cps/editbooks.py:489
 #, python-format
 msgid "Failed to store file %(file)s."
 msgstr "មិនអាចរក្សាទុកឯកសារ %(file)s ។"
 
-#: cps/editbooks.py:506 cps/editbooks.py:864
+#: cps/editbooks.py:507 cps/editbooks.py:870
 #, python-format
 msgid "Database error: %(error)s."
 msgstr ""
 
-#: cps/editbooks.py:510
+#: cps/editbooks.py:511
 #, python-format
 msgid "File format %(ext)s added to %(book)s"
 msgstr "ឯកសារទម្រង់ %(ext)s ត្រូវបានបន្ថែមទៅ %(book)s"
 
-#: cps/editbooks.py:653
+#: cps/editbooks.py:656
 msgid "Metadata successfully updated"
 msgstr ""
 
-#: cps/editbooks.py:662
+#: cps/editbooks.py:665
 msgid "Error editing book, please check logfile for details"
 msgstr "មានបញ្ហាពេលកែប្រែសៀវភៅ សូមពិនិត្យមើល logfile សម្រាប់ព័ត៌មានបន្ថែម"
 
-#: cps/editbooks.py:724
+#: cps/editbooks.py:727
 #, python-format
 msgid "File %(filename)s could not saved to temp dir"
 msgstr ""
 
-#: cps/editbooks.py:734
+#: cps/editbooks.py:737
 msgid "Uploaded book probably exists in the library, consider to change before upload new: "
 msgstr ""
 
-#: cps/editbooks.py:780
+#: cps/editbooks.py:786
 #, python-format
 msgid "Failed to Move File %(file)s: %(error)s"
 msgstr ""
 
-#: cps/editbooks.py:836
+#: cps/editbooks.py:842
 #, python-format
 msgid "Failed to Move Cover File %(file)s: %(error)s"
 msgstr ""
 
-#: cps/editbooks.py:850
+#: cps/editbooks.py:856
 #, python-format
 msgid "File %(file)s uploaded"
 msgstr ""
 
-#: cps/editbooks.py:876
+#: cps/editbooks.py:882
 msgid "Source or destination format for conversion missing"
 msgstr ""
 
-#: cps/editbooks.py:884
+#: cps/editbooks.py:890
 #, python-format
 msgid "Book successfully queued for converting to %(book_format)s"
 msgstr ""
 
-#: cps/editbooks.py:888
+#: cps/editbooks.py:894
 #, python-format
 msgid "There was an error converting this book: %(res)s"
 msgstr ""
@@ -500,71 +506,71 @@ msgstr "ឯកសារ %(file)s រកមិនឃើញក្នុង Google
 msgid "Book path %(path)s not found on Google Drive"
 msgstr "ទីតាំងសៀវភៅ %(path)s រកមិនឃើញក្នុង Google Drive"
 
-#: cps/helper.py:542
+#: cps/helper.py:550
 msgid "Error Downloading Cover"
 msgstr ""
 
-#: cps/helper.py:545
+#: cps/helper.py:553
 msgid "Cover Format Error"
 msgstr ""
 
-#: cps/helper.py:561
+#: cps/helper.py:569
 msgid "Failed to create path for cover"
 msgstr ""
 
-#: cps/helper.py:566
+#: cps/helper.py:574
 msgid "Cover-file is not a valid image file, or could not be stored"
 msgstr ""
 
-#: cps/helper.py:577
+#: cps/helper.py:585
 msgid "Only jpg/jpeg/png/webp files are supported as coverfile"
 msgstr ""
 
-#: cps/helper.py:591
+#: cps/helper.py:599
 msgid "Only jpg/jpeg files are supported as coverfile"
 msgstr ""
 
-#: cps/helper.py:640
+#: cps/helper.py:648
 msgid "Unrar binary file not found"
 msgstr ""
 
-#: cps/helper.py:654
+#: cps/helper.py:662
 msgid "Error excecuting UnRar"
 msgstr ""
 
-#: cps/helper.py:710
+#: cps/helper.py:718
 msgid "Waiting"
 msgstr "កំពុងរង់ចាំ"
 
-#: cps/helper.py:712
+#: cps/helper.py:720
 msgid "Failed"
 msgstr "បានបរាជ័យ"
 
-#: cps/helper.py:714
+#: cps/helper.py:722
 msgid "Started"
 msgstr "បានចាប់ផ្តើម"
 
-#: cps/helper.py:716
+#: cps/helper.py:724
 msgid "Finished"
 msgstr "បានបញ្ចប់"
 
-#: cps/helper.py:718
+#: cps/helper.py:726
 msgid "Unknown Status"
 msgstr ""
 
-#: cps/helper.py:723
+#: cps/helper.py:731
 msgid "E-mail: "
 msgstr ""
 
-#: cps/helper.py:725 cps/helper.py:729
+#: cps/helper.py:733 cps/helper.py:737
 msgid "Convert: "
 msgstr ""
 
-#: cps/helper.py:727
+#: cps/helper.py:735
 msgid "Upload: "
 msgstr ""
 
-#: cps/helper.py:731
+#: cps/helper.py:739
 msgid "Unknown Task: "
 msgstr ""
 
@@ -597,7 +603,7 @@ msgstr ""
 msgid "Failed to fetch user info from Google."
 msgstr ""
 
-#: cps/oauth_bb.py:225 cps/web.py:1397 cps/web.py:1537
+#: cps/oauth_bb.py:225 cps/web.py:1394 cps/web.py:1534
 #, python-format
 msgid "you are now logged in as: '%(nickname)s'"
 msgstr "ឥឡូវអ្នកបានចូលដោយមានឈ្មោះថា៖ ‘%(nickname)s’"
@@ -634,218 +640,218 @@ msgstr ""
 msgid "Google Oauth error, please retry later."
 msgstr ""
 
-#: cps/shelf.py:66 cps/shelf.py:111
+#: cps/shelf.py:67 cps/shelf.py:120
 msgid "Invalid shelf specified"
 msgstr ""
 
-#: cps/shelf.py:72
+#: cps/shelf.py:73
 #, python-format
 msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s"
 msgstr ""
 
-#: cps/shelf.py:82
+#: cps/shelf.py:83
 #, python-format
 msgid "Book is already part of the shelf: %(shelfname)s"
 msgstr ""
 
-#: cps/shelf.py:97
+#: cps/shelf.py:106
 #, python-format
 msgid "Book has been added to shelf: %(sname)s"
 msgstr "សៀវភៅត្រូវបានបន្ថែមទៅធ្នើ៖ %(sname)s"
 
-#: cps/shelf.py:115
+#: cps/shelf.py:124
 #, python-format
 msgid "You are not allowed to add a book to the the shelf: %(name)s"
 msgstr ""
 
-#: cps/shelf.py:133
+#: cps/shelf.py:142
 #, python-format
 msgid "Books are already part of the shelf: %(name)s"
 msgstr ""
 
-#: cps/shelf.py:148
+#: cps/shelf.py:158
 #, python-format
 msgid "Books have been added to shelf: %(sname)s"
 msgstr ""
 
-#: cps/shelf.py:150
+#: cps/shelf.py:163
 #, python-format
 msgid "Could not add books to shelf: %(sname)s"
 msgstr ""
 
-#: cps/shelf.py:188
+#: cps/shelf.py:208
 #, python-format
 msgid "Book has been removed from shelf: %(sname)s"
 msgstr "សៀវភៅត្រូវបានដកចេញពីធ្នើ៖ %(sname)s"
 
-#: cps/shelf.py:196
+#: cps/shelf.py:216
 #, python-format
 msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
 msgstr "សូមអភ័យទោស អ្នកមិនមានសិទ្ធិដកសៀវភៅចេញពីធ្នើនេះទេ៖ %(sname)s"
 
-#: cps/shelf.py:220 cps/shelf.py:260
+#: cps/shelf.py:240 cps/shelf.py:284
 #, python-format
 msgid "A public shelf with the name '%(title)s' already exists."
 msgstr ""
 
-#: cps/shelf.py:229 cps/shelf.py:270
+#: cps/shelf.py:249 cps/shelf.py:294
 #, python-format
 msgid "A private shelf with the name '%(title)s' already exists."
 msgstr ""
 
-#: cps/shelf.py:236
+#: cps/shelf.py:256
 #, python-format
 msgid "Shelf %(title)s created"
 msgstr "ធ្នើឈ្មោះ %(title)s ត្រូវបានបង្កើត"
 
-#: cps/shelf.py:239 cps/shelf.py:284
+#: cps/shelf.py:263 cps/shelf.py:312
 msgid "There was an error"
 msgstr "មានបញ្ហា"
 
-#: cps/shelf.py:240 cps/shelf.py:242 cps/templates/layout.html:144
+#: cps/shelf.py:264 cps/shelf.py:266 cps/templates/layout.html:144
 msgid "Create a Shelf"
 msgstr "បង្កើតធ្នើ"
 
-#: cps/shelf.py:282
+#: cps/shelf.py:306
 #, python-format
 msgid "Shelf %(title)s changed"
 msgstr "ធ្នើឈ្មោះ %(title)s ត្រូវបានប្តូរ"
 
-#: cps/shelf.py:285 cps/shelf.py:287
+#: cps/shelf.py:313 cps/shelf.py:315
 msgid "Edit a shelf"
 msgstr "កែប្រែធ្នើ"
 
-#: cps/shelf.py:332
+#: cps/shelf.py:369
 #, python-format
 msgid "Shelf: '%(name)s'"
 msgstr "ធ្នើ៖ ‘%(name)s’"
 
-#: cps/shelf.py:335
+#: cps/shelf.py:372
 msgid "Error opening shelf. Shelf does not exist or is not accessible"
 msgstr "មានបញ្ហាពេលបើកធ្នើ។ ពុំមានធ្នើ ឬមិនអាចបើកបាន"
 
-#: cps/shelf.py:368
+#: cps/shelf.py:409
 msgid "Hidden Book"
 msgstr ""
 
-#: cps/shelf.py:373
+#: cps/shelf.py:414
 #, python-format
 msgid "Change order of Shelf: '%(name)s'"
 msgstr "ប្តូរលំដាប់ធ្នើ៖ ‘%(name)s’"
 
-#: cps/ub.py:64
+#: cps/ub.py:65
 msgid "Recently Added"
 msgstr "ទើបបន្ថែមថ្មីៗ"
 
-#: cps/ub.py:66
+#: cps/ub.py:67
 msgid "Show recent books"
 msgstr "បង្ហាញសៀវភៅមកថ្មី"
 
-#: cps/templates/index.xml:17 cps/ub.py:67
+#: cps/templates/index.xml:17 cps/ub.py:68
 msgid "Hot Books"
 msgstr "សៀវភៅដែលមានប្រជាប្រិយភាព"
 
-#: cps/ub.py:69
+#: cps/ub.py:70
 msgid "Show Hot Books"
 msgstr "បង្ហាញសៀវភៅដែលមានប្រជាប្រិយភាព"
 
-#: cps/templates/index.xml:24 cps/ub.py:71 cps/web.py:655
+#: cps/templates/index.xml:24 cps/ub.py:72 cps/web.py:652
 msgid "Top Rated Books"
 msgstr "សៀវភៅដែលមានការវាយតម្លៃល្អជាងគេ"
 
-#: cps/ub.py:73
+#: cps/ub.py:74
 msgid "Show Top Rated Books"
 msgstr "បង្ហាញសៀវភៅដែលមានការវាយតម្លៃល្អជាងគេ"
 
-#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:74
-#: cps/web.py:1222
+#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:75
+#: cps/web.py:1219
 msgid "Read Books"
 msgstr "សៀវភៅដែលបានអានរួច"
 
-#: cps/ub.py:76
+#: cps/ub.py:77
 msgid "Show read and unread"
 msgstr "បង្ហាញអានរួច និងមិនទាន់អាន"
 
-#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:78
-#: cps/web.py:1225
+#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:79
+#: cps/web.py:1222
 msgid "Unread Books"
 msgstr "សៀវភៅដែលមិនទាន់បានអាន"
 
-#: cps/ub.py:80
+#: cps/ub.py:81
 msgid "Show unread"
 msgstr ""
 
-#: cps/ub.py:81
+#: cps/ub.py:82
 msgid "Discover"
 msgstr "ស្រាវជ្រាវ"
 
-#: cps/ub.py:83
+#: cps/ub.py:84
 msgid "Show random books"
 msgstr "បង្ហាញសៀវភៅចៃដន្យ"
 
-#: cps/templates/index.xml:75 cps/ub.py:84 cps/web.py:970
+#: cps/templates/index.xml:75 cps/ub.py:85 cps/web.py:967
 msgid "Categories"
 msgstr "ប្រភេទនានា"
 
-#: cps/ub.py:86
+#: cps/ub.py:87
 msgid "Show category selection"
 msgstr "បង្ហាញជម្រើសប្រភេទ"
 
 #: cps/templates/book_edit.html:84 cps/templates/index.xml:82
-#: cps/templates/search_form.html:53 cps/ub.py:87 cps/web.py:886 cps/web.py:896
+#: cps/templates/search_form.html:53 cps/ub.py:88 cps/web.py:883 cps/web.py:893
 msgid "Series"
 msgstr "ស៊េរី"
 
-#: cps/ub.py:89
+#: cps/ub.py:90
 msgid "Show series selection"
 msgstr "បង្ហាញជម្រើសស៊េរី"
 
-#: cps/templates/index.xml:61 cps/ub.py:90
+#: cps/templates/index.xml:61 cps/ub.py:91
 msgid "Authors"
 msgstr "អ្នកនិពន្ធ"
 
-#: cps/ub.py:92
+#: cps/ub.py:93
 msgid "Show author selection"
 msgstr "បង្ហាញជម្រើសអ្នកនិពន្ធ"
 
-#: cps/templates/index.xml:68 cps/ub.py:94 cps/web.py:869
+#: cps/templates/index.xml:68 cps/ub.py:95 cps/web.py:866
 msgid "Publishers"
 msgstr ""
 
-#: cps/ub.py:96
+#: cps/ub.py:97
 msgid "Show publisher selection"
 msgstr ""
 
-#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:97
-#: cps/web.py:953
+#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:98
+#: cps/web.py:950
 msgid "Languages"
 msgstr "ភាសានានា"
 
-#: cps/ub.py:100
+#: cps/ub.py:101
 msgid "Show language selection"
 msgstr "បង្ហាញផ្នែកភាសា"
 
-#: cps/templates/index.xml:96 cps/ub.py:101
+#: cps/templates/index.xml:96 cps/ub.py:102
 msgid "Ratings"
 msgstr ""
 
-#: cps/ub.py:103
+#: cps/ub.py:104
 msgid "Show ratings selection"
 msgstr ""
 
-#: cps/templates/index.xml:104 cps/ub.py:104
+#: cps/templates/index.xml:104 cps/ub.py:105
 msgid "File formats"
 msgstr ""
 
-#: cps/ub.py:106
+#: cps/ub.py:107
 msgid "Show file formats selection"
 msgstr ""
 
-#: cps/ub.py:108 cps/web.py:1249
+#: cps/ub.py:109 cps/web.py:1246
 msgid "Archived Books"
 msgstr ""
 
-#: cps/ub.py:110
+#: cps/ub.py:111
 msgid "Show archived books"
 msgstr ""
 
@@ -878,220 +884,220 @@ msgstr ""
 msgid "Click on the button below to update to the latest stable version."
 msgstr ""
 
-#: cps/web.py:322
+#: cps/web.py:319
 #, python-format
 msgid "Error: %(ldaperror)s"
 msgstr ""
 
-#: cps/web.py:326
+#: cps/web.py:323
 msgid "Error: No user returned in response of LDAP server"
 msgstr ""
 
-#: cps/web.py:374
+#: cps/web.py:371
 msgid "Failed to Create at Least One LDAP User"
 msgstr ""
 
-#: cps/web.py:377
+#: cps/web.py:374
 msgid "At Least One LDAP User Not Found in Database"
 msgstr ""
 
-#: cps/web.py:379
+#: cps/web.py:376
 msgid "User Successfully Imported"
 msgstr ""
 
-#: cps/web.py:625
+#: cps/web.py:622
 msgid "Recently Added Books"
 msgstr "សៀវភៅដែលទើបបានបន្ថែម"
 
-#: cps/templates/index.html:5 cps/web.py:663
+#: cps/templates/index.html:5 cps/web.py:660
 msgid "Discover (Random Books)"
 msgstr "ស្រាវជ្រាវ (សៀវភៅចៃដន្យ)"
 
-#: cps/web.py:691
+#: cps/web.py:688
 msgid "Books"
 msgstr ""
 
-#: cps/web.py:718
+#: cps/web.py:715
 msgid "Hot Books (Most Downloaded)"
 msgstr "សៀវភៅដែលត្រូវបានទាញយកច្រើនជាងគេ"
 
-#: cps/web.py:731
+#: cps/web.py:728
 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible"
 msgstr ""
 
-#: cps/web.py:745
+#: cps/web.py:742
 #, python-format
 msgid "Author: %(name)s"
 msgstr ""
 
-#: cps/web.py:759
+#: cps/web.py:756
 #, python-format
 msgid "Publisher: %(name)s"
 msgstr ""
 
-#: cps/web.py:772
+#: cps/web.py:769
 #, python-format
 msgid "Series: %(serie)s"
 msgstr "ស៊េរី៖ %(serie)s"
 
-#: cps/web.py:785
+#: cps/web.py:782
 #, python-format
 msgid "Rating: %(rating)s stars"
 msgstr ""
 
-#: cps/web.py:798
+#: cps/web.py:795
 #, python-format
 msgid "File format: %(format)s"
 msgstr ""
 
-#: cps/web.py:812
+#: cps/web.py:809
 #, python-format
 msgid "Category: %(name)s"
 msgstr "ប្រភេទ៖ %(name)s"
 
-#: cps/web.py:831
+#: cps/web.py:828
 #, python-format
 msgid "Language: %(name)s"
 msgstr "ភាសា៖ %(name)s"
 
-#: cps/web.py:910
+#: cps/web.py:907
 msgid "Ratings list"
 msgstr ""
 
-#: cps/web.py:925
+#: cps/web.py:922
 msgid "File formats list"
 msgstr ""
 
-#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:984
+#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:981
 msgid "Tasks"
 msgstr "កិច្ចការនានា"
 
 #: cps/templates/book_edit.html:235 cps/templates/feed.xml:33
 #: cps/templates/layout.html:45 cps/templates/layout.html:48
-#: cps/templates/search_form.html:174 cps/web.py:1010 cps/web.py:1015
+#: cps/templates/search_form.html:174 cps/web.py:1007 cps/web.py:1012
 msgid "Search"
 msgstr "ស្វែងរក"
 
-#: cps/web.py:1066
+#: cps/web.py:1063
 msgid "Published after "
 msgstr "បានបោះពុម្ភក្រោយ  "
 
-#: cps/web.py:1073
+#: cps/web.py:1070
 msgid "Published before "
 msgstr "បានបោះពុម្ភមុន  "
 
-#: cps/web.py:1087
+#: cps/web.py:1084
 #, python-format
 msgid "Rating <= %(rating)s"
 msgstr "ការវាយតម្លៃ <= %(rating)s"
 
-#: cps/web.py:1089
+#: cps/web.py:1086
 #, python-format
 msgid "Rating >= %(rating)s"
 msgstr "ការវាយតម្លៃ >= %(rating)s"
 
-#: cps/web.py:1158 cps/web.py:1183
+#: cps/web.py:1155 cps/web.py:1180
 msgid "search"
 msgstr "ស្វែងរក"
 
-#: cps/web.py:1213
+#: cps/web.py:1210
 #, python-format
 msgid "Custom Column No.%(column)d is not existing in calibre database"
 msgstr ""
 
-#: cps/web.py:1304
+#: cps/web.py:1301
 #, python-format
 msgid "Book successfully queued for sending to %(kindlemail)s"
 msgstr "សៀវភៅបានចូលជួរសម្រាប់ផ្ញើទៅ %(kindlemail)s ដោយជោគជ័យ"
 
-#: cps/web.py:1308
+#: cps/web.py:1305
 #, python-format
 msgid "Oops! There was an error sending this book: %(res)s"
 msgstr "មានបញ្ហានៅពេលផ្ញើសៀវភៅនេះ៖ %(res)s"
 
-#: cps/web.py:1310
+#: cps/web.py:1307
 msgid "Please update your profile with a valid Send to Kindle E-mail Address."
 msgstr ""
 
-#: cps/web.py:1327
+#: cps/web.py:1324
 msgid "E-Mail server is not configured, please contact your administrator!"
 msgstr ""
 
-#: cps/web.py:1328 cps/web.py:1338 cps/web.py:1362 cps/web.py:1366
-#: cps/web.py:1371 cps/web.py:1375
+#: cps/web.py:1325 cps/web.py:1335 cps/web.py:1359 cps/web.py:1363
+#: cps/web.py:1368 cps/web.py:1372
 msgid "register"
 msgstr "ចុះឈ្មោះ"
 
-#: cps/web.py:1364
+#: cps/web.py:1361
 msgid "Your e-mail is not allowed to register"
 msgstr ""
 
-#: cps/web.py:1367
+#: cps/web.py:1364
 msgid "Confirmation e-mail was send to your e-mail account."
 msgstr ""
 
-#: cps/web.py:1370
+#: cps/web.py:1367
 msgid "This username or e-mail address is already in use."
 msgstr ""
 
-#: cps/web.py:1387
+#: cps/web.py:1384
 msgid "Cannot activate LDAP authentication"
 msgstr ""
 
-#: cps/web.py:1404
+#: cps/web.py:1401
 #, python-format
 msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known"
 msgstr ""
 
-#: cps/web.py:1410
+#: cps/web.py:1407
 #, python-format
 msgid "Could not login: %(message)s"
 msgstr ""
 
-#: cps/web.py:1414 cps/web.py:1438
+#: cps/web.py:1411 cps/web.py:1435
 msgid "Wrong Username or Password"
 msgstr "ខុសឈ្មោះអ្នកប្រើប្រាស់ ឬលេខសម្ងាត់"
 
-#: cps/web.py:1421
+#: cps/web.py:1418
 msgid "New Password was send to your email address"
 msgstr ""
 
-#: cps/web.py:1427
+#: cps/web.py:1424
 msgid "Please enter valid username to reset password"
 msgstr ""
 
-#: cps/web.py:1433
+#: cps/web.py:1430
 #, python-format
 msgid "You are now logged in as: '%(nickname)s'"
 msgstr ""
 
-#: cps/web.py:1442 cps/web.py:1469
+#: cps/web.py:1439 cps/web.py:1466
 msgid "login"
 msgstr "ចូលប្រើ"
 
-#: cps/web.py:1481 cps/web.py:1515
+#: cps/web.py:1478 cps/web.py:1512
 msgid "Token not found"
 msgstr "រកមិនឃើញវត្ថុតាង"
 
-#: cps/web.py:1490 cps/web.py:1523
+#: cps/web.py:1487 cps/web.py:1520
 msgid "Token has expired"
 msgstr "វត្ថុតាងហួសពេលកំណត់"
 
-#: cps/web.py:1499
+#: cps/web.py:1496
 msgid "Success! Please return to your device"
 msgstr "ជោគជ័យ! សូមវិលមកឧបករណ៍អ្នកវិញ"
 
-#: cps/web.py:1580 cps/web.py:1625 cps/web.py:1631
+#: cps/web.py:1577 cps/web.py:1622 cps/web.py:1628
 #, python-format
 msgid "%(name)s's profile"
 msgstr "ព័ត៌មានសង្ខេបរបស់ %(name)s"
 
-#: cps/web.py:1627
+#: cps/web.py:1624
 msgid "Profile updated"
 msgstr "ព័ត៌មានសង្ខេបបានកែប្រែ"
 
-#: cps/web.py:1656 cps/web.py:1659 cps/web.py:1662 cps/web.py:1669
-#: cps/web.py:1674
+#: cps/web.py:1653 cps/web.py:1656 cps/web.py:1659 cps/web.py:1666
+#: cps/web.py:1671
 msgid "Read a Book"
 msgstr "អានសៀវភៅ"
 
diff --git a/cps/translations/nl/LC_MESSAGES/messages.mo b/cps/translations/nl/LC_MESSAGES/messages.mo
index 9c73f73d59108fa2f801621a2769a37ea49e4915..b1c4a55bfef34026bcff415239cd418fbf996b9f 100644
Binary files a/cps/translations/nl/LC_MESSAGES/messages.mo and b/cps/translations/nl/LC_MESSAGES/messages.mo differ
diff --git a/cps/translations/nl/LC_MESSAGES/messages.po b/cps/translations/nl/LC_MESSAGES/messages.po
index c5482537cbfaa117e45635c5c04bb2df8c101710..4ce11eb28f07b5d3a118caee185e09121fa04c0a 100644
--- a/cps/translations/nl/LC_MESSAGES/messages.po
+++ b/cps/translations/nl/LC_MESSAGES/messages.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Calibre-Web (GPLV3)\n"
 "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
-"POT-Creation-Date: 2020-06-07 06:47+0200\n"
+"POT-Creation-Date: 2020-06-28 09:31+0200\n"
 "PO-Revision-Date: 2020-05-10 21:00+0200\n"
 "Last-Translator: Marcel Maas <marcel.maas@outlook.com>\n"
 "Language: nl\n"
@@ -47,9 +47,9 @@ msgstr "Opnieuw verbinden gelukt"
 msgid "Unknown command"
 msgstr "Onbekende opdracht"
 
-#: cps/admin.py:116 cps/editbooks.py:563 cps/editbooks.py:573
-#: cps/editbooks.py:667 cps/editbooks.py:669 cps/editbooks.py:730
-#: cps/editbooks.py:743 cps/updater.py:509 cps/uploader.py:97
+#: cps/admin.py:116 cps/editbooks.py:564 cps/editbooks.py:576
+#: cps/editbooks.py:670 cps/editbooks.py:672 cps/editbooks.py:733
+#: cps/editbooks.py:749 cps/updater.py:509 cps/uploader.py:97
 #: cps/uploader.py:107
 msgid "Unknown"
 msgstr "Onbekend"
@@ -62,7 +62,7 @@ msgstr "Systeembeheer"
 msgid "UI Configuration"
 msgstr "Uiterlijk aanpassen"
 
-#: cps/admin.py:189 cps/admin.py:706
+#: cps/admin.py:189 cps/admin.py:711
 msgid "Calibre-Web configuration updated"
 msgstr "Calibre-Web-configuratie bijgewerkt"
 
@@ -114,175 +114,181 @@ msgstr ""
 msgid "LDAP Certificate Location is not Valid, Please Enter Correct Path"
 msgstr "LDAP certificaatlocatie is onjuist, voer een geldige locatie in"
 
-#: cps/admin.py:627
+#: cps/admin.py:628
 msgid "Keyfile Location is not Valid, Please Enter Correct Path"
 msgstr "SSL-sleutellocatie is niet geldig, voer een geldige locatie in"
 
-#: cps/admin.py:631
+#: cps/admin.py:632
 msgid "Certfile Location is not Valid, Please Enter Correct Path"
 msgstr "SSL-certificaatlocatie is niet geldig, voer een geldige locatie in"
 
-#: cps/admin.py:701
+#: cps/admin.py:694 cps/admin.py:793 cps/admin.py:885 cps/admin.py:934
+#: cps/shelf.py:100 cps/shelf.py:161 cps/shelf.py:202 cps/shelf.py:260
+#: cps/shelf.py:309 cps/shelf.py:338 cps/shelf.py:368 cps/shelf.py:392
+msgid "Settings DB is not Writeable"
+msgstr ""
+
+#: cps/admin.py:706
 msgid "DB Location is not Valid, Please Enter Correct Path"
 msgstr "Database niet gevonden, voer de juiste locatie in"
 
-#: cps/admin.py:703
+#: cps/admin.py:708
 msgid "DB is not Writeable"
 msgstr ""
 
-#: cps/admin.py:736
+#: cps/admin.py:741
 msgid "Basic Configuration"
 msgstr "Basis configuratie"
 
-#: cps/admin.py:751 cps/web.py:1337
+#: cps/admin.py:756 cps/web.py:1334
 msgid "Please fill out all fields!"
 msgstr "Vul alle velden in!"
 
-#: cps/admin.py:754 cps/admin.py:766 cps/admin.py:772 cps/admin.py:892
+#: cps/admin.py:759 cps/admin.py:771 cps/admin.py:777 cps/admin.py:903
 msgid "Add new user"
 msgstr "Gebruiker toevoegen"
 
-#: cps/admin.py:763 cps/web.py:1578
+#: cps/admin.py:768 cps/web.py:1575
 msgid "E-mail is not from valid domain"
 msgstr "Het e-mailadres bevat geen geldige domeinnaam"
 
-#: cps/admin.py:770 cps/admin.py:785
+#: cps/admin.py:775 cps/admin.py:790
 msgid "Found an existing account for this e-mail address or nickname."
 msgstr "Bestaand account met dit e-mailadres of deze gebruikersnaam aangetroffen."
 
-#: cps/admin.py:781
+#: cps/admin.py:786
 #, python-format
 msgid "User '%(user)s' created"
 msgstr "Gebruiker '%(user)s' aangemaakt"
 
-#: cps/admin.py:794
+#: cps/admin.py:802
 #, python-format
 msgid "User '%(nick)s' deleted"
 msgstr "Gebruiker '%(nick)s' verwijderd"
 
-#: cps/admin.py:797
+#: cps/admin.py:805
 msgid "No admin user remaining, can't delete user"
 msgstr "Kan laatste systeembeheerder niet verwijderen"
 
-#: cps/admin.py:803
+#: cps/admin.py:811
 msgid "No admin user remaining, can't remove admin role"
 msgstr "Kan systeembeheerder rol niet verwijderen van de laatste systeembeheerder"
 
-#: cps/admin.py:839 cps/web.py:1621
+#: cps/admin.py:847 cps/web.py:1618
 msgid "Found an existing account for this e-mail address."
 msgstr "Bestaand account met dit e-mailadres aangetroffen."
 
-#: cps/admin.py:849 cps/admin.py:864 cps/admin.py:967 cps/web.py:1596
+#: cps/admin.py:857 cps/admin.py:872 cps/admin.py:983 cps/web.py:1593
 #, python-format
 msgid "Edit User %(nick)s"
 msgstr "Gebruiker '%(nick)s' bewerken"
 
-#: cps/admin.py:855 cps/web.py:1588
+#: cps/admin.py:863 cps/web.py:1585
 msgid "This username is already taken"
 msgstr "Deze gebruikersnaam is al in gebruik"
 
-#: cps/admin.py:871
+#: cps/admin.py:879
 #, python-format
 msgid "User '%(nick)s' updated"
 msgstr "Gebruiker '%(nick)s' bijgewerkt"
 
-#: cps/admin.py:874
+#: cps/admin.py:882
 msgid "An unknown error occured."
 msgstr "Er is een onbekende fout opgetreden."
 
-#: cps/admin.py:901 cps/templates/admin.html:71
+#: cps/admin.py:912 cps/templates/admin.html:71
 msgid "Edit E-mail Server Settings"
 msgstr "SMTP-instellingen bewerken"
 
-#: cps/admin.py:925
+#: cps/admin.py:941
 #, python-format
 msgid "Test e-mail successfully send to %(kindlemail)s"
 msgstr "Test-e-mail verstuurd naar %(kindlemail)s"
 
-#: cps/admin.py:928
+#: cps/admin.py:944
 #, python-format
 msgid "There was an error sending the Test e-mail: %(res)s"
 msgstr "Fout opgetreden bij het versturen van de test-e-mail: %(res)s"
 
-#: cps/admin.py:930
+#: cps/admin.py:946
 msgid "Please configure your e-mail address first..."
 msgstr "Gelieve eerst je e-mail adres configureren..."
 
-#: cps/admin.py:932
+#: cps/admin.py:948
 msgid "E-mail server settings updated"
 msgstr "E-mailserver-instellingen bijgewerkt"
 
-#: cps/admin.py:943
+#: cps/admin.py:959
 msgid "User not found"
 msgstr "Gebruiker niet gevonden"
 
-#: cps/admin.py:978
+#: cps/admin.py:994
 #, python-format
 msgid "Password for user %(user)s reset"
 msgstr "Wachtwoord voor gebruiker %(user)s is hersteld"
 
-#: cps/admin.py:981 cps/web.py:1361 cps/web.py:1425
+#: cps/admin.py:997 cps/web.py:1358 cps/web.py:1422
 msgid "An unknown error occurred. Please try again later."
 msgstr "Onbekende fout opgetreden. Probeer het later nog eens."
 
-#: cps/admin.py:984 cps/web.py:1299
+#: cps/admin.py:1000 cps/web.py:1296
 msgid "Please configure the SMTP mail settings first..."
 msgstr "Stel eerst SMTP-mail in..."
 
-#: cps/admin.py:996
+#: cps/admin.py:1012
 msgid "Logfile viewer"
 msgstr "Logbestand lezer"
 
-#: cps/admin.py:1035
+#: cps/admin.py:1051
 msgid "Requesting update package"
 msgstr "Update opvragen"
 
-#: cps/admin.py:1036
+#: cps/admin.py:1052
 msgid "Downloading update package"
 msgstr "Update downloaden"
 
-#: cps/admin.py:1037
+#: cps/admin.py:1053
 msgid "Unzipping update package"
 msgstr "Update uitpakken"
 
-#: cps/admin.py:1038
+#: cps/admin.py:1054
 msgid "Replacing files"
 msgstr "Update toepassen"
 
-#: cps/admin.py:1039
+#: cps/admin.py:1055
 msgid "Database connections are closed"
 msgstr "Databaseverbindingen zijn gesloten"
 
-#: cps/admin.py:1040
+#: cps/admin.py:1056
 msgid "Stopping server"
 msgstr "Bezig met stoppen van Calibre-Web"
 
-#: cps/admin.py:1041
+#: cps/admin.py:1057
 msgid "Update finished, please press okay and reload page"
 msgstr "Update voltooid, klik op 'Oké' en vernieuw de pagina"
 
-#: cps/admin.py:1042 cps/admin.py:1043 cps/admin.py:1044 cps/admin.py:1045
-#: cps/admin.py:1046
+#: cps/admin.py:1058 cps/admin.py:1059 cps/admin.py:1060 cps/admin.py:1061
+#: cps/admin.py:1062
 msgid "Update failed:"
 msgstr "Update mislukt:"
 
-#: cps/admin.py:1042 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
+#: cps/admin.py:1058 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
 msgid "HTTP Error"
 msgstr "HTTP-fout"
 
-#: cps/admin.py:1043 cps/updater.py:321 cps/updater.py:524
+#: cps/admin.py:1059 cps/updater.py:321 cps/updater.py:524
 msgid "Connection error"
 msgstr "Verbindingsfout"
 
-#: cps/admin.py:1044 cps/updater.py:323 cps/updater.py:526
+#: cps/admin.py:1060 cps/updater.py:323 cps/updater.py:526
 msgid "Timeout while establishing connection"
 msgstr "Time-out tijdens maken van verbinding"
 
-#: cps/admin.py:1045 cps/updater.py:325 cps/updater.py:528
+#: cps/admin.py:1061 cps/updater.py:325 cps/updater.py:528
 msgid "General error"
 msgstr "Algemene fout"
 
-#: cps/admin.py:1046
+#: cps/admin.py:1062
 msgid "Update File Could Not be Saved in Temp Dir"
 msgstr "Geüpload bestand kon niet opgeslagen worden in de tijdelijke map"
 
@@ -302,8 +308,8 @@ msgstr "Het boekformaat is verwijderd"
 msgid "Book Successfully Deleted"
 msgstr "Het boek is verwijderd"
 
-#: cps/editbooks.py:254 cps/editbooks.py:548 cps/web.py:1644 cps/web.py:1685
-#: cps/web.py:1747
+#: cps/editbooks.py:254 cps/editbooks.py:549 cps/web.py:1641 cps/web.py:1682
+#: cps/web.py:1744
 msgid "Error opening eBook. File does not exist or file is not accessible"
 msgstr "Kan e-boek niet openen: het bestand bestaat niet of is ontoegankelijk"
 
@@ -311,82 +317,82 @@ msgstr "Kan e-boek niet openen: het bestand bestaat niet of is ontoegankelijk"
 msgid "edit metadata"
 msgstr "metagegevens bewerken"
 
-#: cps/editbooks.py:361
+#: cps/editbooks.py:360
 #, python-format
 msgid "%(langname)s is not a valid language"
 msgstr "%(langname)s is geen geldige taal"
 
-#: cps/editbooks.py:467 cps/editbooks.py:712
+#: cps/editbooks.py:468 cps/editbooks.py:715
 #, python-format
 msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
 msgstr "De bestandsextensie '%(ext)s' is niet toegestaan op deze server"
 
-#: cps/editbooks.py:471 cps/editbooks.py:716
+#: cps/editbooks.py:472 cps/editbooks.py:719
 msgid "File to be uploaded must have an extension"
 msgstr "Het te uploaden bestand moet voorzien zijn van een extensie"
 
-#: cps/editbooks.py:483 cps/editbooks.py:773
+#: cps/editbooks.py:484 cps/editbooks.py:779
 #, python-format
 msgid "Failed to create path %(path)s (Permission denied)."
 msgstr "Kan de locatie '%(path)s' niet aanmaken (niet gemachtigd)."
 
-#: cps/editbooks.py:488
+#: cps/editbooks.py:489
 #, python-format
 msgid "Failed to store file %(file)s."
 msgstr "Kan %(file)s niet opslaan."
 
-#: cps/editbooks.py:506 cps/editbooks.py:864
+#: cps/editbooks.py:507 cps/editbooks.py:870
 #, python-format
 msgid "Database error: %(error)s."
 msgstr ""
 
-#: cps/editbooks.py:510
+#: cps/editbooks.py:511
 #, python-format
 msgid "File format %(ext)s added to %(book)s"
 msgstr "Bestandsformaat %(ext)s toegevoegd aan %(book)s"
 
-#: cps/editbooks.py:653
+#: cps/editbooks.py:656
 msgid "Metadata successfully updated"
 msgstr "De metagegevens zijn bijgewerkt"
 
-#: cps/editbooks.py:662
+#: cps/editbooks.py:665
 msgid "Error editing book, please check logfile for details"
 msgstr "Kan het boek niet bewerken, controleer het logbestand"
 
-#: cps/editbooks.py:724
+#: cps/editbooks.py:727
 #, python-format
 msgid "File %(filename)s could not saved to temp dir"
 msgstr "Bestand %(filename)s kon niet opgeslagen worden in de tijdelijke map"
 
-#: cps/editbooks.py:734
+#: cps/editbooks.py:737
 msgid "Uploaded book probably exists in the library, consider to change before upload new: "
 msgstr "Geüpload boek staat mogelijk al in de bibliotheek, controleer alvorens door te gaan: "
 
-#: cps/editbooks.py:780
+#: cps/editbooks.py:786
 #, python-format
 msgid "Failed to Move File %(file)s: %(error)s"
 msgstr "Bestand %(file)s niet verplaatst: %(error)s"
 
-#: cps/editbooks.py:836
+#: cps/editbooks.py:842
 #, python-format
 msgid "Failed to Move Cover File %(file)s: %(error)s"
 msgstr "Omslag %(file)s niet verplaatst: %(error)s"
 
-#: cps/editbooks.py:850
+#: cps/editbooks.py:856
 #, python-format
 msgid "File %(file)s uploaded"
 msgstr "Bestand %(file)s geüpload"
 
-#: cps/editbooks.py:876
+#: cps/editbooks.py:882
 msgid "Source or destination format for conversion missing"
 msgstr "Bron- of doelformaat ontbreekt voor conversie"
 
-#: cps/editbooks.py:884
+#: cps/editbooks.py:890
 #, python-format
 msgid "Book successfully queued for converting to %(book_format)s"
 msgstr "Het boek is in de wachtrij geplaatst voor conversie naar %(book_format)s"
 
-#: cps/editbooks.py:888
+#: cps/editbooks.py:894
 #, python-format
 msgid "There was an error converting this book: %(res)s"
 msgstr "Er is een fout opgetreden bij het converteren van dit boek: %(res)s"
@@ -500,71 +506,71 @@ msgstr "Bestand '%(file)s' niet aangetroffen op Google Drive"
 msgid "Book path %(path)s not found on Google Drive"
 msgstr "Boeken locatie '%(path)s' niet aangetroffen op Google Drive"
 
-#: cps/helper.py:542
+#: cps/helper.py:550
 msgid "Error Downloading Cover"
 msgstr ""
 
-#: cps/helper.py:545
+#: cps/helper.py:553
 msgid "Cover Format Error"
 msgstr ""
 
-#: cps/helper.py:561
+#: cps/helper.py:569
 msgid "Failed to create path for cover"
 msgstr "Locatie aanmaken voor omslag mislukt"
 
-#: cps/helper.py:566
+#: cps/helper.py:574
 msgid "Cover-file is not a valid image file, or could not be stored"
 msgstr "Omslag-bestand is geen afbeelding of kon niet opgeslagen worden"
 
-#: cps/helper.py:577
+#: cps/helper.py:585
 msgid "Only jpg/jpeg/png/webp files are supported as coverfile"
 msgstr "Alleen jpg/jpeg/png/webp bestanden zijn toegestaan als omslag"
 
-#: cps/helper.py:591
+#: cps/helper.py:599
 msgid "Only jpg/jpeg files are supported as coverfile"
 msgstr "Alleen jpg/jpeg bestanden zijn toegestaan als omslag"
 
-#: cps/helper.py:640
+#: cps/helper.py:648
 msgid "Unrar binary file not found"
 msgstr "Unrar executable niet gevonden"
 
-#: cps/helper.py:654
+#: cps/helper.py:662
 msgid "Error excecuting UnRar"
 msgstr "Fout bij het uitvoeren van Unrar"
 
-#: cps/helper.py:710
+#: cps/helper.py:718
 msgid "Waiting"
 msgstr "Wachten"
 
-#: cps/helper.py:712
+#: cps/helper.py:720
 msgid "Failed"
 msgstr "Mislukt"
 
-#: cps/helper.py:714
+#: cps/helper.py:722
 msgid "Started"
 msgstr "Gestart"
 
-#: cps/helper.py:716
+#: cps/helper.py:724
 msgid "Finished"
 msgstr "Voltooid"
 
-#: cps/helper.py:718
+#: cps/helper.py:726
 msgid "Unknown Status"
 msgstr "Onbekende status"
 
-#: cps/helper.py:723
+#: cps/helper.py:731
 msgid "E-mail: "
 msgstr "E-mailadres: "
 
-#: cps/helper.py:725 cps/helper.py:729
+#: cps/helper.py:733 cps/helper.py:737
 msgid "Convert: "
 msgstr "Converteren: "
 
-#: cps/helper.py:727
+#: cps/helper.py:735
 msgid "Upload: "
 msgstr "Uploaden: "
 
-#: cps/helper.py:731
+#: cps/helper.py:739
 msgid "Unknown Task: "
 msgstr "Onbekende taak: "
 
@@ -597,7 +603,7 @@ msgstr "Inloggen bij Google mislukt."
 msgid "Failed to fetch user info from Google."
 msgstr "Opvragen gebruikersinfo bij Google mislukt."
 
-#: cps/oauth_bb.py:225 cps/web.py:1397 cps/web.py:1537
+#: cps/oauth_bb.py:225 cps/web.py:1394 cps/web.py:1534
 #, python-format
 msgid "you are now logged in as: '%(nickname)s'"
 msgstr "je bent ingelogd als: '%(nickname)s'"
@@ -634,218 +640,218 @@ msgstr "GitHub OAuth fout, probeer het later nog eens."
 msgid "Google Oauth error, please retry later."
 msgstr "Google OAuth fout, probeer het later nog eens."
 
-#: cps/shelf.py:66 cps/shelf.py:111
+#: cps/shelf.py:67 cps/shelf.py:120
 msgid "Invalid shelf specified"
 msgstr "Ongeldige boekenplank opgegeven"
 
-#: cps/shelf.py:72
+#: cps/shelf.py:73
 #, python-format
 msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s"
 msgstr "Sorry, je mag geen boeken toevoegen aan boekenplank: %(shelfname)s"
 
-#: cps/shelf.py:82
+#: cps/shelf.py:83
 #, python-format
 msgid "Book is already part of the shelf: %(shelfname)s"
 msgstr "Dit boek maakt al deel uit van boekenplank: %(shelfname)s"
 
-#: cps/shelf.py:97
+#: cps/shelf.py:106
 #, python-format
 msgid "Book has been added to shelf: %(sname)s"
 msgstr "Het boek is toegevoegd aan boekenplank: %(sname)s"
 
-#: cps/shelf.py:115
+#: cps/shelf.py:124
 #, python-format
 msgid "You are not allowed to add a book to the the shelf: %(name)s"
 msgstr "Je bent niet gemachtigd om boeken toe te voegen aan boekenplank: %(name)s"
 
-#: cps/shelf.py:133
+#: cps/shelf.py:142
 #, python-format
 msgid "Books are already part of the shelf: %(name)s"
 msgstr "Deze boeken maken al deel uit van boekenplank: %(name)s"
 
-#: cps/shelf.py:148
+#: cps/shelf.py:158
 #, python-format
 msgid "Books have been added to shelf: %(sname)s"
 msgstr "De boeken zijn toegevoegd aan boekenplank: %(sname)s"
 
-#: cps/shelf.py:150
+#: cps/shelf.py:163
 #, python-format
 msgid "Could not add books to shelf: %(sname)s"
 msgstr "Kan boeken niet toevoegen aan boekenplank: %(sname)s"
 
-#: cps/shelf.py:188
+#: cps/shelf.py:208
 #, python-format
 msgid "Book has been removed from shelf: %(sname)s"
 msgstr "Het boek is verwijderd van boekenplank: %(sname)s"
 
-#: cps/shelf.py:196
+#: cps/shelf.py:216
 #, python-format
 msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
 msgstr "Je bent niet gemachtigd om boeken te verwijderen van boekenplank: %(sname)s"
 
-#: cps/shelf.py:220 cps/shelf.py:260
+#: cps/shelf.py:240 cps/shelf.py:284
 #, python-format
 msgid "A public shelf with the name '%(title)s' already exists."
 msgstr "Een openbare boekenplank met de naam '%(title)s' bestaat al."
 
-#: cps/shelf.py:229 cps/shelf.py:270
+#: cps/shelf.py:249 cps/shelf.py:294
 #, python-format
 msgid "A private shelf with the name '%(title)s' already exists."
 msgstr "Een persoonlijke boekenplank met de naam '%(title)s' bestaat al."
 
-#: cps/shelf.py:236
+#: cps/shelf.py:256
 #, python-format
 msgid "Shelf %(title)s created"
 msgstr "Boekenplank '%(title)s' aangemaakt"
 
-#: cps/shelf.py:239 cps/shelf.py:284
+#: cps/shelf.py:263 cps/shelf.py:312
 msgid "There was an error"
 msgstr "Er is een fout opgetreden"
 
-#: cps/shelf.py:240 cps/shelf.py:242 cps/templates/layout.html:144
+#: cps/shelf.py:264 cps/shelf.py:266 cps/templates/layout.html:144
 msgid "Create a Shelf"
 msgstr "Boekenplank maken"
 
-#: cps/shelf.py:282
+#: cps/shelf.py:306
 #, python-format
 msgid "Shelf %(title)s changed"
 msgstr "Boekenplank '%(title)s' is aangepast"
 
-#: cps/shelf.py:285 cps/shelf.py:287
+#: cps/shelf.py:313 cps/shelf.py:315
 msgid "Edit a shelf"
 msgstr "Pas een boekenplank aan"
 
-#: cps/shelf.py:332
+#: cps/shelf.py:369
 #, python-format
 msgid "Shelf: '%(name)s'"
 msgstr "Boekenplank: '%(name)s'"
 
-#: cps/shelf.py:335
+#: cps/shelf.py:372
 msgid "Error opening shelf. Shelf does not exist or is not accessible"
 msgstr "Kan boekenplank niet openen: de boekenplank bestaat niet of is ontoegankelijk"
 
-#: cps/shelf.py:368
+#: cps/shelf.py:409
 msgid "Hidden Book"
 msgstr "Verborgen boek"
 
-#: cps/shelf.py:373
+#: cps/shelf.py:414
 #, python-format
 msgid "Change order of Shelf: '%(name)s'"
 msgstr "Volgorde bewerken van boekenplank: '%(name)s'"
 
-#: cps/ub.py:64
+#: cps/ub.py:65
 msgid "Recently Added"
 msgstr "Recent toegevoegd"
 
-#: cps/ub.py:66
+#: cps/ub.py:67
 msgid "Show recent books"
 msgstr "Recent toegevoegde boeken tonen"
 
-#: cps/templates/index.xml:17 cps/ub.py:67
+#: cps/templates/index.xml:17 cps/ub.py:68
 msgid "Hot Books"
 msgstr "Populaire boeken"
 
-#: cps/ub.py:69
+#: cps/ub.py:70
 msgid "Show Hot Books"
 msgstr "Populaire boeken tonen"
 
-#: cps/templates/index.xml:24 cps/ub.py:71 cps/web.py:655
+#: cps/templates/index.xml:24 cps/ub.py:72 cps/web.py:652
 msgid "Top Rated Books"
 msgstr "Best beoordeelde boeken"
 
-#: cps/ub.py:73
+#: cps/ub.py:74
 msgid "Show Top Rated Books"
 msgstr "Best beoordeelde boeken tonen"
 
-#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:74
-#: cps/web.py:1222
+#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:75
+#: cps/web.py:1219
 msgid "Read Books"
 msgstr "Gelezen boeken"
 
-#: cps/ub.py:76
+#: cps/ub.py:77
 msgid "Show read and unread"
 msgstr "Gelezen/Ongelezen boeken tonen"
 
-#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:78
-#: cps/web.py:1225
+#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:79
+#: cps/web.py:1222
 msgid "Unread Books"
 msgstr "Ongelezen boeken"
 
-#: cps/ub.py:80
+#: cps/ub.py:81
 msgid "Show unread"
 msgstr "Ongelezen boeken tonen"
 
-#: cps/ub.py:81
+#: cps/ub.py:82
 msgid "Discover"
 msgstr "Willekeurige boeken"
 
-#: cps/ub.py:83
+#: cps/ub.py:84
 msgid "Show random books"
 msgstr "Willekeurige boeken tonen"
 
-#: cps/templates/index.xml:75 cps/ub.py:84 cps/web.py:970
+#: cps/templates/index.xml:75 cps/ub.py:85 cps/web.py:967
 msgid "Categories"
 msgstr "Categorieën"
 
-#: cps/ub.py:86
+#: cps/ub.py:87
 msgid "Show category selection"
 msgstr "Categoriekeuze tonen"
 
 #: cps/templates/book_edit.html:84 cps/templates/index.xml:82
-#: cps/templates/search_form.html:53 cps/ub.py:87 cps/web.py:886 cps/web.py:896
+#: cps/templates/search_form.html:53 cps/ub.py:88 cps/web.py:883 cps/web.py:893
 msgid "Series"
 msgstr "Boekenreeksen"
 
-#: cps/ub.py:89
+#: cps/ub.py:90
 msgid "Show series selection"
 msgstr "Boekenreeksenkeuze tonen"
 
-#: cps/templates/index.xml:61 cps/ub.py:90
+#: cps/templates/index.xml:61 cps/ub.py:91
 msgid "Authors"
 msgstr "Auteurs"
 
-#: cps/ub.py:92
+#: cps/ub.py:93
 msgid "Show author selection"
 msgstr "Auteurkeuze tonen"
 
-#: cps/templates/index.xml:68 cps/ub.py:94 cps/web.py:869
+#: cps/templates/index.xml:68 cps/ub.py:95 cps/web.py:866
 msgid "Publishers"
 msgstr "Uitgevers"
 
-#: cps/ub.py:96
+#: cps/ub.py:97
 msgid "Show publisher selection"
 msgstr "Uitgeverskeuze tonen"
 
-#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:97
-#: cps/web.py:953
+#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:98
+#: cps/web.py:950
 msgid "Languages"
 msgstr "Talen"
 
-#: cps/ub.py:100
+#: cps/ub.py:101
 msgid "Show language selection"
 msgstr "Taalkeuze tonen"
 
-#: cps/templates/index.xml:96 cps/ub.py:101
+#: cps/templates/index.xml:96 cps/ub.py:102
 msgid "Ratings"
 msgstr "Beoordelingen"
 
-#: cps/ub.py:103
+#: cps/ub.py:104
 msgid "Show ratings selection"
 msgstr "Beoordelingen tonen"
 
-#: cps/templates/index.xml:104 cps/ub.py:104
+#: cps/templates/index.xml:104 cps/ub.py:105
 msgid "File formats"
 msgstr "Bestandsformaten"
 
-#: cps/ub.py:106
+#: cps/ub.py:107
 msgid "Show file formats selection"
 msgstr "Bestandsformaten tonen"
 
-#: cps/ub.py:108 cps/web.py:1249
+#: cps/ub.py:109 cps/web.py:1246
 msgid "Archived Books"
 msgstr "Gearchiveerde boeken"
 
-#: cps/ub.py:110
+#: cps/ub.py:111
 msgid "Show archived books"
 msgstr "Gearchiveerde boeken tonen"
 
@@ -878,220 +884,220 @@ msgstr "Er is een update beschikbaar. Klik op de knop hieronder om te updaten na
 msgid "Click on the button below to update to the latest stable version."
 msgstr "Klik op onderstaande knop om de laatste stabiele versie te installeren."
 
-#: cps/web.py:322
+#: cps/web.py:319
 #, python-format
 msgid "Error: %(ldaperror)s"
 msgstr "Fout: %(ldaperror)s"
 
-#: cps/web.py:326
+#: cps/web.py:323
 msgid "Error: No user returned in response of LDAP server"
 msgstr "Fout: No user returned in response of LDAP server"
 
-#: cps/web.py:374
+#: cps/web.py:371
 msgid "Failed to Create at Least One LDAP User"
 msgstr ""
 
-#: cps/web.py:377
+#: cps/web.py:374
 msgid "At Least One LDAP User Not Found in Database"
 msgstr ""
 
-#: cps/web.py:379
+#: cps/web.py:376
 msgid "User Successfully Imported"
 msgstr "Gebruiker is geïmporteerd"
 
-#: cps/web.py:625
+#: cps/web.py:622
 msgid "Recently Added Books"
 msgstr "Recent toegevoegde boeken"
 
-#: cps/templates/index.html:5 cps/web.py:663
+#: cps/templates/index.html:5 cps/web.py:660
 msgid "Discover (Random Books)"
 msgstr "Verkennen (willekeurige boeken)"
 
-#: cps/web.py:691
+#: cps/web.py:688
 msgid "Books"
 msgstr "Boeken"
 
-#: cps/web.py:718
+#: cps/web.py:715
 msgid "Hot Books (Most Downloaded)"
 msgstr "Populaire boeken (meest gedownload)"
 
-#: cps/web.py:731
+#: cps/web.py:728
 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible"
 msgstr "Oeps! Geselecteerd boek is niet beschikbaar. Bestand bestaat niet of is niet toegankelijk"
 
-#: cps/web.py:745
+#: cps/web.py:742
 #, python-format
 msgid "Author: %(name)s"
 msgstr "Auteur: %(name)s"
 
-#: cps/web.py:759
+#: cps/web.py:756
 #, python-format
 msgid "Publisher: %(name)s"
 msgstr "Uitgever: %(name)s"
 
-#: cps/web.py:772
+#: cps/web.py:769
 #, python-format
 msgid "Series: %(serie)s"
 msgstr "Reeks: %(serie)s"
 
-#: cps/web.py:785
+#: cps/web.py:782
 #, python-format
 msgid "Rating: %(rating)s stars"
 msgstr "Beoordeling: %(rating)s sterren"
 
-#: cps/web.py:798
+#: cps/web.py:795
 #, python-format
 msgid "File format: %(format)s"
 msgstr "Bestandsformaat: %(format)s"
 
-#: cps/web.py:812
+#: cps/web.py:809
 #, python-format
 msgid "Category: %(name)s"
 msgstr "Categorie: %(name)s"
 
-#: cps/web.py:831
+#: cps/web.py:828
 #, python-format
 msgid "Language: %(name)s"
 msgstr "Taal: %(name)s"
 
-#: cps/web.py:910
+#: cps/web.py:907
 msgid "Ratings list"
 msgstr "Beoordelingen"
 
-#: cps/web.py:925
+#: cps/web.py:922
 msgid "File formats list"
 msgstr "Alle bestandsformaten"
 
-#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:984
+#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:981
 msgid "Tasks"
 msgstr "Taken"
 
 #: cps/templates/book_edit.html:235 cps/templates/feed.xml:33
 #: cps/templates/layout.html:45 cps/templates/layout.html:48
-#: cps/templates/search_form.html:174 cps/web.py:1010 cps/web.py:1015
+#: cps/templates/search_form.html:174 cps/web.py:1007 cps/web.py:1012
 msgid "Search"
 msgstr "Zoeken"
 
-#: cps/web.py:1066
+#: cps/web.py:1063
 msgid "Published after "
 msgstr "Gepubliceerd na "
 
-#: cps/web.py:1073
+#: cps/web.py:1070
 msgid "Published before "
 msgstr "Gepubliceerd vóór "
 
-#: cps/web.py:1087
+#: cps/web.py:1084
 #, python-format
 msgid "Rating <= %(rating)s"
 msgstr "Beoordeling <= %(rating)s"
 
-#: cps/web.py:1089
+#: cps/web.py:1086
 #, python-format
 msgid "Rating >= %(rating)s"
 msgstr "Beoordeling >= %(rating)s"
 
-#: cps/web.py:1158 cps/web.py:1183
+#: cps/web.py:1155 cps/web.py:1180
 msgid "search"
 msgstr "zoeken"
 
-#: cps/web.py:1213
+#: cps/web.py:1210
 #, python-format
 msgid "Custom Column No.%(column)d is not existing in calibre database"
 msgstr ""
 
-#: cps/web.py:1304
+#: cps/web.py:1301
 #, python-format
 msgid "Book successfully queued for sending to %(kindlemail)s"
 msgstr "Het boek is in de wachtrij geplaatst om te worden verstuurd aan %(kindlemail)s"
 
-#: cps/web.py:1308
+#: cps/web.py:1305
 #, python-format
 msgid "Oops! There was an error sending this book: %(res)s"
 msgstr "Fout opgetreden bij het versturen van dit boek: %(res)s"
 
-#: cps/web.py:1310
+#: cps/web.py:1307
 msgid "Please update your profile with a valid Send to Kindle E-mail Address."
 msgstr "Stel je kindle-e-mailadres in..."
 
-#: cps/web.py:1327
+#: cps/web.py:1324
 msgid "E-Mail server is not configured, please contact your administrator!"
 msgstr "E-mailserver is niet geconfigureerd, neem contact op met de beheerder!"
 
-#: cps/web.py:1328 cps/web.py:1338 cps/web.py:1362 cps/web.py:1366
-#: cps/web.py:1371 cps/web.py:1375
+#: cps/web.py:1325 cps/web.py:1335 cps/web.py:1359 cps/web.py:1363
+#: cps/web.py:1368 cps/web.py:1372
 msgid "register"
 msgstr "registreren"
 
-#: cps/web.py:1364
+#: cps/web.py:1361
 msgid "Your e-mail is not allowed to register"
 msgstr "Dit e-mailadres mag niet worden gebruikt voor registratie"
 
-#: cps/web.py:1367
+#: cps/web.py:1364
 msgid "Confirmation e-mail was send to your e-mail account."
 msgstr "Er is een bevestigings-e-mail verstuurd naar je e-mailadres."
 
-#: cps/web.py:1370
+#: cps/web.py:1367
 msgid "This username or e-mail address is already in use."
 msgstr "Gebruikersnaam of e-mailadres is al in gebruik."
 
-#: cps/web.py:1387
+#: cps/web.py:1384
 msgid "Cannot activate LDAP authentication"
 msgstr "Kan de LDAP authenticatie niet activeren"
 
-#: cps/web.py:1404
+#: cps/web.py:1401
 #, python-format
 msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known"
 msgstr ""
 
-#: cps/web.py:1410
+#: cps/web.py:1407
 #, python-format
 msgid "Could not login: %(message)s"
 msgstr "Inloggen mislukt: %(message)s"
 
-#: cps/web.py:1414 cps/web.py:1438
+#: cps/web.py:1411 cps/web.py:1435
 msgid "Wrong Username or Password"
 msgstr "Verkeerde gebruikersnaam of wachtwoord"
 
-#: cps/web.py:1421
+#: cps/web.py:1418
 msgid "New Password was send to your email address"
 msgstr "Een nieuw wachtwoord is verzonden naar je e-mailadres"
 
-#: cps/web.py:1427
+#: cps/web.py:1424
 msgid "Please enter valid username to reset password"
 msgstr "Geef een geldige gebruikersnaam op om je wachtwoord te herstellen"
 
-#: cps/web.py:1433
+#: cps/web.py:1430
 #, python-format
 msgid "You are now logged in as: '%(nickname)s'"
 msgstr "Je bent ingelogd als: '%(nickname)s'"
 
-#: cps/web.py:1442 cps/web.py:1469
+#: cps/web.py:1439 cps/web.py:1466
 msgid "login"
 msgstr "inloggen"
 
-#: cps/web.py:1481 cps/web.py:1515
+#: cps/web.py:1478 cps/web.py:1512
 msgid "Token not found"
 msgstr "Toegangssleutel niet gevonden"
 
-#: cps/web.py:1490 cps/web.py:1523
+#: cps/web.py:1487 cps/web.py:1520
 msgid "Token has expired"
 msgstr "Toegangssleutel is verlopen"
 
-#: cps/web.py:1499
+#: cps/web.py:1496
 msgid "Success! Please return to your device"
 msgstr "Gelukt! Ga terug naar je apparaat"
 
-#: cps/web.py:1580 cps/web.py:1625 cps/web.py:1631
+#: cps/web.py:1577 cps/web.py:1622 cps/web.py:1628
 #, python-format
 msgid "%(name)s's profile"
 msgstr "%(name)s's profiel"
 
-#: cps/web.py:1627
+#: cps/web.py:1624
 msgid "Profile updated"
 msgstr "Profiel bijgewerkt"
 
-#: cps/web.py:1656 cps/web.py:1659 cps/web.py:1662 cps/web.py:1669
-#: cps/web.py:1674
+#: cps/web.py:1653 cps/web.py:1656 cps/web.py:1659 cps/web.py:1666
+#: cps/web.py:1671
 msgid "Read a Book"
 msgstr "Lees een boek"
 
diff --git a/cps/translations/pl/LC_MESSAGES/messages.mo b/cps/translations/pl/LC_MESSAGES/messages.mo
index 3c05f2a7f82747e80d4408520517c9a6e85ca508..6f3c5f96207ae14e47a12775fcd77ef0f3711545 100644
Binary files a/cps/translations/pl/LC_MESSAGES/messages.mo and b/cps/translations/pl/LC_MESSAGES/messages.mo differ
diff --git a/cps/translations/pl/LC_MESSAGES/messages.po b/cps/translations/pl/LC_MESSAGES/messages.po
index 2b9179806cba241f44e60902dee70d687ecb2381..e6dc6b4559b72be2a97cac6a48e7583204a18e23 100644
--- a/cps/translations/pl/LC_MESSAGES/messages.po
+++ b/cps/translations/pl/LC_MESSAGES/messages.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Calibre Web - polski (POT: 2019-08-06 18:35)\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-06-07 06:47+0200\n"
+"POT-Creation-Date: 2020-06-28 09:31+0200\n"
 "PO-Revision-Date: 2020-03-31 21:50+0200\n"
 "Last-Translator: Jerzy PiÄ…tek <jerzy.piatek@gmail.com>\n"
 "Language: pl\n"
@@ -48,9 +48,9 @@ msgid "Unknown command"
 msgstr ""
 
 # ???
-#: cps/admin.py:116 cps/editbooks.py:563 cps/editbooks.py:573
-#: cps/editbooks.py:667 cps/editbooks.py:669 cps/editbooks.py:730
-#: cps/editbooks.py:743 cps/updater.py:509 cps/uploader.py:97
+#: cps/admin.py:116 cps/editbooks.py:564 cps/editbooks.py:576
+#: cps/editbooks.py:670 cps/editbooks.py:672 cps/editbooks.py:733
+#: cps/editbooks.py:749 cps/updater.py:509 cps/uploader.py:97
 #: cps/uploader.py:107
 msgid "Unknown"
 msgstr "Nieznany"
@@ -63,7 +63,7 @@ msgstr "Panel administratora"
 msgid "UI Configuration"
 msgstr "Konfiguracja Interfejsu"
 
-#: cps/admin.py:189 cps/admin.py:706
+#: cps/admin.py:189 cps/admin.py:711
 msgid "Calibre-Web configuration updated"
 msgstr "Konfiguracja Calibre-Web została zaktualizowana"
 
@@ -115,177 +115,183 @@ msgstr ""
 msgid "LDAP Certificate Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:627
+#: cps/admin.py:628
 msgid "Keyfile Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:631
+#: cps/admin.py:632
 msgid "Certfile Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:701
+#: cps/admin.py:694 cps/admin.py:793 cps/admin.py:885 cps/admin.py:934
+#: cps/shelf.py:100 cps/shelf.py:161 cps/shelf.py:202 cps/shelf.py:260
+#: cps/shelf.py:309 cps/shelf.py:338 cps/shelf.py:368 cps/shelf.py:392
+msgid "Settings DB is not Writeable"
+msgstr ""
+
+#: cps/admin.py:706
 msgid "DB Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:703
+#: cps/admin.py:708
 msgid "DB is not Writeable"
 msgstr ""
 
-#: cps/admin.py:736
+#: cps/admin.py:741
 msgid "Basic Configuration"
 msgstr "Konfiguracja podstawowa"
 
-#: cps/admin.py:751 cps/web.py:1337
+#: cps/admin.py:756 cps/web.py:1334
 msgid "Please fill out all fields!"
 msgstr "Proszę wypełnić wszystkie pola!"
 
-#: cps/admin.py:754 cps/admin.py:766 cps/admin.py:772 cps/admin.py:892
+#: cps/admin.py:759 cps/admin.py:771 cps/admin.py:777 cps/admin.py:903
 msgid "Add new user"
 msgstr "Dodaj nowego użytkownika"
 
-#: cps/admin.py:763 cps/web.py:1578
+#: cps/admin.py:768 cps/web.py:1575
 msgid "E-mail is not from valid domain"
 msgstr "E-mail nie pochodzi z prawidłowej domeny"
 
-#: cps/admin.py:770 cps/admin.py:785
+#: cps/admin.py:775 cps/admin.py:790
 msgid "Found an existing account for this e-mail address or nickname."
 msgstr "Znaleziono istniejÄ…ce konto dla tego adresu e-mail lub pseudonimu."
 
-#: cps/admin.py:781
+#: cps/admin.py:786
 #, python-format
 msgid "User '%(user)s' created"
 msgstr "Użytkownik '%(user)s' został utworzony"
 
-#: cps/admin.py:794
+#: cps/admin.py:802
 #, python-format
 msgid "User '%(nick)s' deleted"
 msgstr "Użytkownik '%(nick)s' został usunięty"
 
-#: cps/admin.py:797
+#: cps/admin.py:805
 msgid "No admin user remaining, can't delete user"
 msgstr "Nie można usunąć użytkownika. Brak na serwerze innego konta z prawami administratora"
 
-#: cps/admin.py:803
+#: cps/admin.py:811
 msgid "No admin user remaining, can't remove admin role"
 msgstr ""
 
-#: cps/admin.py:839 cps/web.py:1621
+#: cps/admin.py:847 cps/web.py:1618
 msgid "Found an existing account for this e-mail address."
 msgstr "Znaleziono istniejÄ…ce konto dla tego adresu e-mail."
 
-#: cps/admin.py:849 cps/admin.py:864 cps/admin.py:967 cps/web.py:1596
+#: cps/admin.py:857 cps/admin.py:872 cps/admin.py:983 cps/web.py:1593
 #, python-format
 msgid "Edit User %(nick)s"
 msgstr "Edytuj użytkownika %(nick)s"
 
-#: cps/admin.py:855 cps/web.py:1588
+#: cps/admin.py:863 cps/web.py:1585
 msgid "This username is already taken"
 msgstr "Nazwa użytkownika jest już zajęta"
 
-#: cps/admin.py:871
+#: cps/admin.py:879
 #, python-format
 msgid "User '%(nick)s' updated"
 msgstr "Użytkownik '%(nick)s' został zaktualizowany"
 
-#: cps/admin.py:874
+#: cps/admin.py:882
 msgid "An unknown error occured."
 msgstr "Wystąpił nieznany błąd."
 
-#: cps/admin.py:901 cps/templates/admin.html:71
+#: cps/admin.py:912 cps/templates/admin.html:71
 msgid "Edit E-mail Server Settings"
 msgstr "Zmień ustawienia SMTP"
 
-#: cps/admin.py:925
+#: cps/admin.py:941
 #, python-format
 msgid "Test e-mail successfully send to %(kindlemail)s"
 msgstr "Testowy e-mail pomyślnie przesłany do %(kindlemail)s"
 
-#: cps/admin.py:928
+#: cps/admin.py:944
 #, python-format
 msgid "There was an error sending the Test e-mail: %(res)s"
 msgstr "Wystąpił błąd podczas wysyłania e-maila testowego: %(res)s"
 
-#: cps/admin.py:930
+#: cps/admin.py:946
 msgid "Please configure your e-mail address first..."
 msgstr "Najpierw skonfiguruj swój adres e-mail..."
 
-#: cps/admin.py:932
+#: cps/admin.py:948
 msgid "E-mail server settings updated"
 msgstr "Zaktualizowano ustawienia serwera poczty e-mail"
 
-#: cps/admin.py:943
+#: cps/admin.py:959
 msgid "User not found"
 msgstr ""
 
 # ???
-#: cps/admin.py:978
+#: cps/admin.py:994
 #, python-format
 msgid "Password for user %(user)s reset"
 msgstr "Zrestartowano hasło użytkownika %(user)s"
 
-#: cps/admin.py:981 cps/web.py:1361 cps/web.py:1425
+#: cps/admin.py:997 cps/web.py:1358 cps/web.py:1422
 msgid "An unknown error occurred. Please try again later."
 msgstr "Wystąpił nieznany błąd. Spróbuj ponownie później."
 
-#: cps/admin.py:984 cps/web.py:1299
+#: cps/admin.py:1000 cps/web.py:1296
 msgid "Please configure the SMTP mail settings first..."
 msgstr "Proszę najpierw skonfigurować ustawienia SMTP poczty e-mail..."
 
-#: cps/admin.py:996
+#: cps/admin.py:1012
 msgid "Logfile viewer"
 msgstr "PrzeglÄ…danie dziennika"
 
-#: cps/admin.py:1035
+#: cps/admin.py:1051
 msgid "Requesting update package"
 msgstr "Żądanie o pakiet aktualizacji"
 
-#: cps/admin.py:1036
+#: cps/admin.py:1052
 msgid "Downloading update package"
 msgstr "Pobieranie pakietu aktualizacji"
 
-#: cps/admin.py:1037
+#: cps/admin.py:1053
 msgid "Unzipping update package"
 msgstr "Rozpakowywanie pakietu aktualizacji"
 
 # ???
-#: cps/admin.py:1038
+#: cps/admin.py:1054
 msgid "Replacing files"
 msgstr "Zastępowanie plików"
 
-#: cps/admin.py:1039
+#: cps/admin.py:1055
 msgid "Database connections are closed"
 msgstr "Połączenia z bazą danych zostały zakończone"
 
-#: cps/admin.py:1040
+#: cps/admin.py:1056
 msgid "Stopping server"
 msgstr "Zatrzymywanie serwera"
 
-#: cps/admin.py:1041
+#: cps/admin.py:1057
 msgid "Update finished, please press okay and reload page"
 msgstr "Aktualizacja zakończona, proszę nacisnąć OK i odświeżyć stronę"
 
-#: cps/admin.py:1042 cps/admin.py:1043 cps/admin.py:1044 cps/admin.py:1045
-#: cps/admin.py:1046
+#: cps/admin.py:1058 cps/admin.py:1059 cps/admin.py:1060 cps/admin.py:1061
+#: cps/admin.py:1062
 msgid "Update failed:"
 msgstr "Aktualizacja nieudana:"
 
-#: cps/admin.py:1042 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
+#: cps/admin.py:1058 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
 msgid "HTTP Error"
 msgstr "Błąd HTTP"
 
-#: cps/admin.py:1043 cps/updater.py:321 cps/updater.py:524
+#: cps/admin.py:1059 cps/updater.py:321 cps/updater.py:524
 msgid "Connection error"
 msgstr "Błąd połączenia"
 
-#: cps/admin.py:1044 cps/updater.py:323 cps/updater.py:526
+#: cps/admin.py:1060 cps/updater.py:323 cps/updater.py:526
 msgid "Timeout while establishing connection"
 msgstr "Przekroczono limit czasu podczas nawiązywania połączenia"
 
-#: cps/admin.py:1045 cps/updater.py:325 cps/updater.py:528
+#: cps/admin.py:1061 cps/updater.py:325 cps/updater.py:528
 msgid "General error"
 msgstr "Błąd ogólny"
 
-#: cps/admin.py:1046
+#: cps/admin.py:1062
 msgid "Update File Could Not be Saved in Temp Dir"
 msgstr ""
 
@@ -305,8 +311,8 @@ msgstr ""
 msgid "Book Successfully Deleted"
 msgstr ""
 
-#: cps/editbooks.py:254 cps/editbooks.py:548 cps/web.py:1644 cps/web.py:1685
-#: cps/web.py:1747
+#: cps/editbooks.py:254 cps/editbooks.py:549 cps/web.py:1641 cps/web.py:1682
+#: cps/web.py:1744
 msgid "Error opening eBook. File does not exist or file is not accessible"
 msgstr "Błąd podczas otwierania e-booka. Plik nie istnieje lub jest niedostępny"
 
@@ -314,82 +320,82 @@ msgstr "Błąd podczas otwierania e-booka. Plik nie istnieje lub jest niedostęp
 msgid "edit metadata"
 msgstr "edytuj metadane"
 
-#: cps/editbooks.py:361
+#: cps/editbooks.py:360
 #, python-format
 msgid "%(langname)s is not a valid language"
 msgstr "%(langname)s nie jest prawidłowym językiem"
 
-#: cps/editbooks.py:467 cps/editbooks.py:712
+#: cps/editbooks.py:468 cps/editbooks.py:715
 #, python-format
 msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
 msgstr "Rozszerzenie pliku '%(ext)s' nie jest dozwolone do wysłania na ten serwer"
 
-#: cps/editbooks.py:471 cps/editbooks.py:716
+#: cps/editbooks.py:472 cps/editbooks.py:719
 msgid "File to be uploaded must have an extension"
 msgstr "Plik do wysłania musi mieć rozszerzenie"
 
-#: cps/editbooks.py:483 cps/editbooks.py:773
+#: cps/editbooks.py:484 cps/editbooks.py:779
 #, python-format
 msgid "Failed to create path %(path)s (Permission denied)."
 msgstr "Nie udało się utworzyć łącza %(path)s (Odmowa dostępu)."
 
-#: cps/editbooks.py:488
+#: cps/editbooks.py:489
 #, python-format
 msgid "Failed to store file %(file)s."
 msgstr "Nie można zapisać pliku %(file)s."
 
-#: cps/editbooks.py:506 cps/editbooks.py:864
+#: cps/editbooks.py:507 cps/editbooks.py:870
 #, python-format
 msgid "Database error: %(error)s."
 msgstr ""
 
-#: cps/editbooks.py:510
+#: cps/editbooks.py:511
 #, python-format
 msgid "File format %(ext)s added to %(book)s"
 msgstr "Format pliku %(ext)s dodany do %(book)s"
 
-#: cps/editbooks.py:653
+#: cps/editbooks.py:656
 msgid "Metadata successfully updated"
 msgstr "Metadane zostały pomyślnie zaktualizowane"
 
-#: cps/editbooks.py:662
+#: cps/editbooks.py:665
 msgid "Error editing book, please check logfile for details"
 msgstr "Błąd podczas edycji książki, sprawdź plik dziennika, aby uzyskać szczegółowe informacje"
 
-#: cps/editbooks.py:724
+#: cps/editbooks.py:727
 #, python-format
 msgid "File %(filename)s could not saved to temp dir"
 msgstr "Nie można zapisać pliku %(filename)s w katalogu tymczasowym"
 
-#: cps/editbooks.py:734
+#: cps/editbooks.py:737
 msgid "Uploaded book probably exists in the library, consider to change before upload new: "
 msgstr "Wysłana książka prawdopodobnie istnieje w bibliotece, rozważ zmianę przed przesłaniem nowej: "
 
-#: cps/editbooks.py:780
+#: cps/editbooks.py:786
 #, python-format
 msgid "Failed to Move File %(file)s: %(error)s"
 msgstr ""
 
-#: cps/editbooks.py:836
+#: cps/editbooks.py:842
 #, python-format
 msgid "Failed to Move Cover File %(file)s: %(error)s"
 msgstr ""
 
-#: cps/editbooks.py:850
+#: cps/editbooks.py:856
 #, python-format
 msgid "File %(file)s uploaded"
 msgstr "Wysłano plik %(file)s"
 
-#: cps/editbooks.py:876
+#: cps/editbooks.py:882
 msgid "Source or destination format for conversion missing"
 msgstr "Brak formatu źródłowego lub docelowego do konwersji"
 
-#: cps/editbooks.py:884
+#: cps/editbooks.py:890
 #, python-format
 msgid "Book successfully queued for converting to %(book_format)s"
 msgstr "Książka została pomyślnie umieszczona w zadaniach do konwersji %(book_format)s"
 
-#: cps/editbooks.py:888
+#: cps/editbooks.py:894
 #, python-format
 msgid "There was an error converting this book: %(res)s"
 msgstr "Podczas konwersji książki wystąpił błąd: %(res)s"
@@ -505,71 +511,71 @@ msgstr "Nie znaleziono pliku %(file)s na Google Drive"
 msgid "Book path %(path)s not found on Google Drive"
 msgstr "Nie znaleziono ścieżki do książki %(path)s na Google Drive"
 
-#: cps/helper.py:542
+#: cps/helper.py:550
 msgid "Error Downloading Cover"
 msgstr ""
 
-#: cps/helper.py:545
+#: cps/helper.py:553
 msgid "Cover Format Error"
 msgstr ""
 
-#: cps/helper.py:561
+#: cps/helper.py:569
 msgid "Failed to create path for cover"
 msgstr "Nie udało się utworzyć ścieżki dla okładki"
 
-#: cps/helper.py:566
+#: cps/helper.py:574
 msgid "Cover-file is not a valid image file, or could not be stored"
 msgstr ""
 
-#: cps/helper.py:577
+#: cps/helper.py:585
 msgid "Only jpg/jpeg/png/webp files are supported as coverfile"
 msgstr "Jako plik okładki dopuszczalne są jedynie pliki jpg/jpeg/png/webp"
 
-#: cps/helper.py:591
+#: cps/helper.py:599
 msgid "Only jpg/jpeg files are supported as coverfile"
 msgstr "Jako plik okładki dopuszczalne są jedynie pliki jpg/jpeg"
 
-#: cps/helper.py:640
+#: cps/helper.py:648
 msgid "Unrar binary file not found"
 msgstr ""
 
-#: cps/helper.py:654
+#: cps/helper.py:662
 msgid "Error excecuting UnRar"
 msgstr ""
 
-#: cps/helper.py:710
+#: cps/helper.py:718
 msgid "Waiting"
 msgstr "Oczekiwanie"
 
-#: cps/helper.py:712
+#: cps/helper.py:720
 msgid "Failed"
 msgstr "Nieudane"
 
-#: cps/helper.py:714
+#: cps/helper.py:722
 msgid "Started"
 msgstr "Rozpoczynanie"
 
-#: cps/helper.py:716
+#: cps/helper.py:724
 msgid "Finished"
 msgstr "Zakończone"
 
-#: cps/helper.py:718
+#: cps/helper.py:726
 msgid "Unknown Status"
 msgstr "Ststus nieznany"
 
-#: cps/helper.py:723
+#: cps/helper.py:731
 msgid "E-mail: "
 msgstr "E-mail: "
 
-#: cps/helper.py:725 cps/helper.py:729
+#: cps/helper.py:733 cps/helper.py:737
 msgid "Convert: "
 msgstr "Konwertowanie: "
 
-#: cps/helper.py:727
+#: cps/helper.py:735
 msgid "Upload: "
 msgstr "Wyślij: "
 
-#: cps/helper.py:731
+#: cps/helper.py:739
 msgid "Unknown Task: "
 msgstr "Nieznane zadanie: "
 
@@ -603,7 +609,7 @@ msgstr "Nie udało się zalogować do Google."
 msgid "Failed to fetch user info from Google."
 msgstr "Nie udało się pobrać informacji o użytkowniku z Google."
 
-#: cps/oauth_bb.py:225 cps/web.py:1397 cps/web.py:1537
+#: cps/oauth_bb.py:225 cps/web.py:1394 cps/web.py:1534
 #, python-format
 msgid "you are now logged in as: '%(nickname)s'"
 msgstr "zalogowałeś się jako: '%(nickname)s'"
@@ -640,218 +646,218 @@ msgstr "Błąd GitHub Oauth, proszę spróbować później."
 msgid "Google Oauth error, please retry later."
 msgstr "Błąd Google Oauth, proszę spróbować później."
 
-#: cps/shelf.py:66 cps/shelf.py:111
+#: cps/shelf.py:67 cps/shelf.py:120
 msgid "Invalid shelf specified"
 msgstr "Podano niewłaściwą półkę"
 
-#: cps/shelf.py:72
+#: cps/shelf.py:73
 #, python-format
 msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s"
 msgstr "Niestety, nie posiadasz uprawnień do dodania książki do półki: %(shelfname)s"
 
-#: cps/shelf.py:82
+#: cps/shelf.py:83
 #, python-format
 msgid "Book is already part of the shelf: %(shelfname)s"
 msgstr "Książka jest już dodana do półki: %(shelfname)s"
 
-#: cps/shelf.py:97
+#: cps/shelf.py:106
 #, python-format
 msgid "Book has been added to shelf: %(sname)s"
 msgstr "Książka została dodana do półki: %(sname)s"
 
-#: cps/shelf.py:115
+#: cps/shelf.py:124
 #, python-format
 msgid "You are not allowed to add a book to the the shelf: %(name)s"
 msgstr "Nie masz uprawnień do dodania ksiażki do półki: %(name)s"
 
-#: cps/shelf.py:133
+#: cps/shelf.py:142
 #, python-format
 msgid "Books are already part of the shelf: %(name)s"
 msgstr "Książki są już dodane do półki: %(name)s"
 
-#: cps/shelf.py:148
+#: cps/shelf.py:158
 #, python-format
 msgid "Books have been added to shelf: %(sname)s"
 msgstr "Książki zostały dodane do półki %(sname)s"
 
-#: cps/shelf.py:150
+#: cps/shelf.py:163
 #, python-format
 msgid "Could not add books to shelf: %(sname)s"
 msgstr "Nie można dodać książek do półki: %(sname)s"
 
-#: cps/shelf.py:188
+#: cps/shelf.py:208
 #, python-format
 msgid "Book has been removed from shelf: %(sname)s"
 msgstr "Książka została usunięta z półki: %(sname)s"
 
-#: cps/shelf.py:196
+#: cps/shelf.py:216
 #, python-format
 msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
 msgstr "Niestety nie możesz usunąć książki z tej półki %(sname)s"
 
-#: cps/shelf.py:220 cps/shelf.py:260
+#: cps/shelf.py:240 cps/shelf.py:284
 #, python-format
 msgid "A public shelf with the name '%(title)s' already exists."
 msgstr ""
 
-#: cps/shelf.py:229 cps/shelf.py:270
+#: cps/shelf.py:249 cps/shelf.py:294
 #, python-format
 msgid "A private shelf with the name '%(title)s' already exists."
 msgstr ""
 
-#: cps/shelf.py:236
+#: cps/shelf.py:256
 #, python-format
 msgid "Shelf %(title)s created"
 msgstr "Półka %(title)s została utworzona"
 
-#: cps/shelf.py:239 cps/shelf.py:284
+#: cps/shelf.py:263 cps/shelf.py:312
 msgid "There was an error"
 msgstr "Wystąpił błąd"
 
-#: cps/shelf.py:240 cps/shelf.py:242 cps/templates/layout.html:144
+#: cps/shelf.py:264 cps/shelf.py:266 cps/templates/layout.html:144
 msgid "Create a Shelf"
 msgstr "utwórz półkę"
 
-#: cps/shelf.py:282
+#: cps/shelf.py:306
 #, python-format
 msgid "Shelf %(title)s changed"
 msgstr "Półka %(title)s została zmieniona"
 
-#: cps/shelf.py:285 cps/shelf.py:287
+#: cps/shelf.py:313 cps/shelf.py:315
 msgid "Edit a shelf"
 msgstr "Edytuj półkę"
 
-#: cps/shelf.py:332
+#: cps/shelf.py:369
 #, python-format
 msgid "Shelf: '%(name)s'"
 msgstr "Półka: „%(name)s”"
 
-#: cps/shelf.py:335
+#: cps/shelf.py:372
 msgid "Error opening shelf. Shelf does not exist or is not accessible"
 msgstr "Błąd otwierania półki. Półka nie istnieje lub jest niedostępna"
 
-#: cps/shelf.py:368
+#: cps/shelf.py:409
 msgid "Hidden Book"
 msgstr "Ukryta książka"
 
-#: cps/shelf.py:373
+#: cps/shelf.py:414
 #, python-format
 msgid "Change order of Shelf: '%(name)s'"
 msgstr "Zmieniono kolejność półki: '%(name)s'"
 
-#: cps/ub.py:64
+#: cps/ub.py:65
 msgid "Recently Added"
 msgstr "Ostatnio dodane"
 
-#: cps/ub.py:66
+#: cps/ub.py:67
 msgid "Show recent books"
 msgstr "Pokaż menu ostatnio dodanych książek"
 
-#: cps/templates/index.xml:17 cps/ub.py:67
+#: cps/templates/index.xml:17 cps/ub.py:68
 msgid "Hot Books"
 msgstr "Najpopularniejsze"
 
-#: cps/ub.py:69
+#: cps/ub.py:70
 msgid "Show Hot Books"
 msgstr "Pokaż menu najpopularniejszych książek"
 
-#: cps/templates/index.xml:24 cps/ub.py:71 cps/web.py:655
+#: cps/templates/index.xml:24 cps/ub.py:72 cps/web.py:652
 msgid "Top Rated Books"
 msgstr "Najwyżej ocenione"
 
-#: cps/ub.py:73
+#: cps/ub.py:74
 msgid "Show Top Rated Books"
 msgstr "Pokaż menu najwyżej ocenionych książek"
 
-#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:74
-#: cps/web.py:1222
+#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:75
+#: cps/web.py:1219
 msgid "Read Books"
 msgstr "Przeczytane"
 
-#: cps/ub.py:76
+#: cps/ub.py:77
 msgid "Show read and unread"
 msgstr "Pokaż menu przeczytane i nieprzeczytane"
 
-#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:78
-#: cps/web.py:1225
+#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:79
+#: cps/web.py:1222
 msgid "Unread Books"
 msgstr "Nieprzeczytane"
 
-#: cps/ub.py:80
+#: cps/ub.py:81
 msgid "Show unread"
 msgstr "Pokaż nieprzeczytane"
 
-#: cps/ub.py:81
+#: cps/ub.py:82
 msgid "Discover"
 msgstr "Odkrywaj"
 
-#: cps/ub.py:83
+#: cps/ub.py:84
 msgid "Show random books"
 msgstr "Pokaż menu losowych książek"
 
-#: cps/templates/index.xml:75 cps/ub.py:84 cps/web.py:970
+#: cps/templates/index.xml:75 cps/ub.py:85 cps/web.py:967
 msgid "Categories"
 msgstr "Kategorie"
 
-#: cps/ub.py:86
+#: cps/ub.py:87
 msgid "Show category selection"
 msgstr "Pokaż menu wyboru kategorii"
 
 #: cps/templates/book_edit.html:84 cps/templates/index.xml:82
-#: cps/templates/search_form.html:53 cps/ub.py:87 cps/web.py:886 cps/web.py:896
+#: cps/templates/search_form.html:53 cps/ub.py:88 cps/web.py:883 cps/web.py:893
 msgid "Series"
 msgstr "Cykle"
 
-#: cps/ub.py:89
+#: cps/ub.py:90
 msgid "Show series selection"
 msgstr "Pokaż menu wyboru cyklu"
 
-#: cps/templates/index.xml:61 cps/ub.py:90
+#: cps/templates/index.xml:61 cps/ub.py:91
 msgid "Authors"
 msgstr "Autorzy"
 
-#: cps/ub.py:92
+#: cps/ub.py:93
 msgid "Show author selection"
 msgstr "Pokaż menu wyboru autora"
 
-#: cps/templates/index.xml:68 cps/ub.py:94 cps/web.py:869
+#: cps/templates/index.xml:68 cps/ub.py:95 cps/web.py:866
 msgid "Publishers"
 msgstr "Wydawcy"
 
-#: cps/ub.py:96
+#: cps/ub.py:97
 msgid "Show publisher selection"
 msgstr "Pokaż menu wyboru wydawcy"
 
-#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:97
-#: cps/web.py:953
+#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:98
+#: cps/web.py:950
 msgid "Languages"
 msgstr "Języki"
 
-#: cps/ub.py:100
+#: cps/ub.py:101
 msgid "Show language selection"
 msgstr "Pokaż menu wyboru języka"
 
-#: cps/templates/index.xml:96 cps/ub.py:101
+#: cps/templates/index.xml:96 cps/ub.py:102
 msgid "Ratings"
 msgstr "Oceny"
 
-#: cps/ub.py:103
+#: cps/ub.py:104
 msgid "Show ratings selection"
 msgstr "Pokaż menu listy ocen"
 
-#: cps/templates/index.xml:104 cps/ub.py:104
+#: cps/templates/index.xml:104 cps/ub.py:105
 msgid "File formats"
 msgstr "Formaty plików"
 
-#: cps/ub.py:106
+#: cps/ub.py:107
 msgid "Show file formats selection"
 msgstr "Pokaż menu formatu plików"
 
-#: cps/ub.py:108 cps/web.py:1249
+#: cps/ub.py:109 cps/web.py:1246
 msgid "Archived Books"
 msgstr ""
 
-#: cps/ub.py:110
+#: cps/ub.py:111
 msgid "Show archived books"
 msgstr ""
 
@@ -884,220 +890,220 @@ msgstr "Dostępna jest nowa aktualizacja. Kliknij przycisk poniżej, aby zaktual
 msgid "Click on the button below to update to the latest stable version."
 msgstr "Kliknij przycisk poniżej, aby zaktualizować do najnowszej stabilnej wersji."
 
-#: cps/web.py:322
+#: cps/web.py:319
 #, python-format
 msgid "Error: %(ldaperror)s"
 msgstr ""
 
-#: cps/web.py:326
+#: cps/web.py:323
 msgid "Error: No user returned in response of LDAP server"
 msgstr ""
 
-#: cps/web.py:374
+#: cps/web.py:371
 msgid "Failed to Create at Least One LDAP User"
 msgstr ""
 
-#: cps/web.py:377
+#: cps/web.py:374
 msgid "At Least One LDAP User Not Found in Database"
 msgstr ""
 
-#: cps/web.py:379
+#: cps/web.py:376
 msgid "User Successfully Imported"
 msgstr ""
 
-#: cps/web.py:625
+#: cps/web.py:622
 msgid "Recently Added Books"
 msgstr "Ostatnio dodane książki"
 
-#: cps/templates/index.html:5 cps/web.py:663
+#: cps/templates/index.html:5 cps/web.py:660
 msgid "Discover (Random Books)"
 msgstr "Odkrywaj (losowe książki)"
 
-#: cps/web.py:691
+#: cps/web.py:688
 msgid "Books"
 msgstr "Książki"
 
-#: cps/web.py:718
+#: cps/web.py:715
 msgid "Hot Books (Most Downloaded)"
 msgstr "Najpopularniejsze książki (najczęściej pobierane)"
 
-#: cps/web.py:731
+#: cps/web.py:728
 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible"
 msgstr "Błąd otwierania e-booka. Plik nie istnieje lub jest niedostępny"
 
-#: cps/web.py:745
+#: cps/web.py:742
 #, python-format
 msgid "Author: %(name)s"
 msgstr "Autor: %(name)s"
 
-#: cps/web.py:759
+#: cps/web.py:756
 #, python-format
 msgid "Publisher: %(name)s"
 msgstr "Wydawca: %(name)s"
 
-#: cps/web.py:772
+#: cps/web.py:769
 #, python-format
 msgid "Series: %(serie)s"
 msgstr "Cykl: %(serie)s"
 
-#: cps/web.py:785
+#: cps/web.py:782
 #, python-format
 msgid "Rating: %(rating)s stars"
 msgstr "Ocena: %(rating)s gwiazdek"
 
-#: cps/web.py:798
+#: cps/web.py:795
 #, python-format
 msgid "File format: %(format)s"
 msgstr "Format pliku: %(format)s"
 
-#: cps/web.py:812
+#: cps/web.py:809
 #, python-format
 msgid "Category: %(name)s"
 msgstr "Kategoria: %(name)s"
 
-#: cps/web.py:831
+#: cps/web.py:828
 #, python-format
 msgid "Language: %(name)s"
 msgstr "Język: %(name)s"
 
-#: cps/web.py:910
+#: cps/web.py:907
 msgid "Ratings list"
 msgstr "Lista z ocenami"
 
-#: cps/web.py:925
+#: cps/web.py:922
 msgid "File formats list"
 msgstr "Lista formatów"
 
-#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:984
+#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:981
 msgid "Tasks"
 msgstr "Zadania"
 
 #: cps/templates/book_edit.html:235 cps/templates/feed.xml:33
 #: cps/templates/layout.html:45 cps/templates/layout.html:48
-#: cps/templates/search_form.html:174 cps/web.py:1010 cps/web.py:1015
+#: cps/templates/search_form.html:174 cps/web.py:1007 cps/web.py:1012
 msgid "Search"
 msgstr "Szukaj"
 
-#: cps/web.py:1066
+#: cps/web.py:1063
 msgid "Published after "
 msgstr "Opublikowane po "
 
-#: cps/web.py:1073
+#: cps/web.py:1070
 msgid "Published before "
 msgstr "Opublikowane przed "
 
-#: cps/web.py:1087
+#: cps/web.py:1084
 #, python-format
 msgid "Rating <= %(rating)s"
 msgstr "Ocena <= %(rating)s"
 
-#: cps/web.py:1089
+#: cps/web.py:1086
 #, python-format
 msgid "Rating >= %(rating)s"
 msgstr "Ocena >= %(rating)s"
 
-#: cps/web.py:1158 cps/web.py:1183
+#: cps/web.py:1155 cps/web.py:1180
 msgid "search"
 msgstr "szukaj"
 
-#: cps/web.py:1213
+#: cps/web.py:1210
 #, python-format
 msgid "Custom Column No.%(column)d is not existing in calibre database"
 msgstr ""
 
-#: cps/web.py:1304
+#: cps/web.py:1301
 #, python-format
 msgid "Book successfully queued for sending to %(kindlemail)s"
 msgstr "Książka została umieszczona w kolejce do wysłania do %(kindlemail)s"
 
-#: cps/web.py:1308
+#: cps/web.py:1305
 #, python-format
 msgid "Oops! 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:1310
+#: cps/web.py:1307
 msgid "Please update your profile with a valid Send to Kindle E-mail Address."
 msgstr "Najpierw skonfiguruj adres e-mail Kindle..."
 
-#: cps/web.py:1327
+#: cps/web.py:1324
 msgid "E-Mail server is not configured, please contact your administrator!"
 msgstr "Serwer e-mail nie jest skonfigurowany, skontaktuj siÄ™ z administratorem!"
 
-#: cps/web.py:1328 cps/web.py:1338 cps/web.py:1362 cps/web.py:1366
-#: cps/web.py:1371 cps/web.py:1375
+#: cps/web.py:1325 cps/web.py:1335 cps/web.py:1359 cps/web.py:1363
+#: cps/web.py:1368 cps/web.py:1372
 msgid "register"
 msgstr "rejestracja"
 
-#: cps/web.py:1364
+#: cps/web.py:1361
 msgid "Your e-mail is not allowed to register"
 msgstr "Twój e-mail nie może się zarejestrować"
 
-#: cps/web.py:1367
+#: cps/web.py:1364
 msgid "Confirmation e-mail was send to your e-mail account."
 msgstr "Wiadomość e-mail z potwierdzeniem została wysłana na Twoje konto e-mail."
 
-#: cps/web.py:1370
+#: cps/web.py:1367
 msgid "This username or e-mail address is already in use."
 msgstr "Ta nazwa użytkownika lub adres e-mail jest już używany."
 
-#: cps/web.py:1387
+#: cps/web.py:1384
 msgid "Cannot activate LDAP authentication"
 msgstr "Nie można aktywować uwierzytelniania LDAP"
 
-#: cps/web.py:1404
+#: cps/web.py:1401
 #, python-format
 msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known"
 msgstr ""
 
-#: cps/web.py:1410
+#: cps/web.py:1407
 #, python-format
 msgid "Could not login: %(message)s"
 msgstr ""
 
-#: cps/web.py:1414 cps/web.py:1438
+#: cps/web.py:1411 cps/web.py:1435
 msgid "Wrong Username or Password"
 msgstr "Błędna nazwa użytkownika lub hasło"
 
-#: cps/web.py:1421
+#: cps/web.py:1418
 msgid "New Password was send to your email address"
 msgstr "Nowe hasło zostało wysłane na Twój adres e-mail"
 
-#: cps/web.py:1427
+#: cps/web.py:1424
 msgid "Please enter valid username to reset password"
 msgstr "Wprowadź prawidłową nazwę użytkownika, aby zresetować hasło"
 
-#: cps/web.py:1433
+#: cps/web.py:1430
 #, python-format
 msgid "You are now logged in as: '%(nickname)s'"
 msgstr "JesteÅ› teraz zalogowany jako: '%(nickname)s'"
 
-#: cps/web.py:1442 cps/web.py:1469
+#: cps/web.py:1439 cps/web.py:1466
 msgid "login"
 msgstr "logowanie"
 
-#: cps/web.py:1481 cps/web.py:1515
+#: cps/web.py:1478 cps/web.py:1512
 msgid "Token not found"
 msgstr "Nie znaleziono tokenu"
 
-#: cps/web.py:1490 cps/web.py:1523
+#: cps/web.py:1487 cps/web.py:1520
 msgid "Token has expired"
 msgstr "Token wygasł"
 
-#: cps/web.py:1499
+#: cps/web.py:1496
 msgid "Success! Please return to your device"
 msgstr "Powodzenie! Wróć do swojego urządzenia"
 
-#: cps/web.py:1580 cps/web.py:1625 cps/web.py:1631
+#: cps/web.py:1577 cps/web.py:1622 cps/web.py:1628
 #, python-format
 msgid "%(name)s's profile"
 msgstr "Profil użytkownika %(name)s"
 
-#: cps/web.py:1627
+#: cps/web.py:1624
 msgid "Profile updated"
 msgstr "Zaktualizowano profil"
 
-#: cps/web.py:1656 cps/web.py:1659 cps/web.py:1662 cps/web.py:1669
-#: cps/web.py:1674
+#: cps/web.py:1653 cps/web.py:1656 cps/web.py:1659 cps/web.py:1666
+#: cps/web.py:1671
 msgid "Read a Book"
 msgstr "Czytaj książkę"
 
diff --git a/cps/translations/ru/LC_MESSAGES/messages.mo b/cps/translations/ru/LC_MESSAGES/messages.mo
index 8a7658f2e21fca5f48431b93fcb424f49c4011f5..47a7b23cff33d664e265588f780049975c404545 100644
Binary files a/cps/translations/ru/LC_MESSAGES/messages.mo and b/cps/translations/ru/LC_MESSAGES/messages.mo differ
diff --git a/cps/translations/ru/LC_MESSAGES/messages.po b/cps/translations/ru/LC_MESSAGES/messages.po
index 60e636ccc6a12d93659e6b1ea12b3e8f61b0db40..8b265dab38ca8d2e7bbe63bffa1cb25039fa00ba 100644
--- a/cps/translations/ru/LC_MESSAGES/messages.po
+++ b/cps/translations/ru/LC_MESSAGES/messages.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version:  Calibre-Web\n"
 "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
-"POT-Creation-Date: 2020-06-07 06:47+0200\n"
+"POT-Creation-Date: 2020-06-28 09:31+0200\n"
 "PO-Revision-Date: 2020-04-29 01:20+0400\n"
 "Last-Translator: ZIZA\n"
 "Language: ru\n"
@@ -47,9 +47,9 @@ msgstr "Успешно переподключено"
 msgid "Unknown command"
 msgstr "Неизвестная команда"
 
-#: cps/admin.py:116 cps/editbooks.py:563 cps/editbooks.py:573
-#: cps/editbooks.py:667 cps/editbooks.py:669 cps/editbooks.py:730
-#: cps/editbooks.py:743 cps/updater.py:509 cps/uploader.py:97
+#: cps/admin.py:116 cps/editbooks.py:564 cps/editbooks.py:576
+#: cps/editbooks.py:670 cps/editbooks.py:672 cps/editbooks.py:733
+#: cps/editbooks.py:749 cps/updater.py:509 cps/uploader.py:97
 #: cps/uploader.py:107
 msgid "Unknown"
 msgstr "Неизвестно"
@@ -62,7 +62,7 @@ msgstr "Администрирование"
 msgid "UI Configuration"
 msgstr "Настройка интерфейса"
 
-#: cps/admin.py:189 cps/admin.py:706
+#: cps/admin.py:189 cps/admin.py:711
 msgid "Calibre-Web configuration updated"
 msgstr "Конфигурация Calibre-Web обновлена"
 
@@ -114,175 +114,181 @@ msgstr "Фильтр объектов пользователя LDAP имеет 
 msgid "LDAP Certificate Location is not Valid, Please Enter Correct Path"
 msgstr "Неверное расположение сертификата LDAP, пожалуйста, введите правильный путь"
 
-#: cps/admin.py:627
+#: cps/admin.py:628
 msgid "Keyfile Location is not Valid, Please Enter Correct Path"
 msgstr "Расположение ключевого файла неверно, пожалуйста, введите правильный путь"
 
-#: cps/admin.py:631
+#: cps/admin.py:632
 msgid "Certfile Location is not Valid, Please Enter Correct Path"
 msgstr "Расположение Certfile не является действительным, пожалуйста, введите правильный путь"
 
-#: cps/admin.py:701
+#: cps/admin.py:694 cps/admin.py:793 cps/admin.py:885 cps/admin.py:934
+#: cps/shelf.py:100 cps/shelf.py:161 cps/shelf.py:202 cps/shelf.py:260
+#: cps/shelf.py:309 cps/shelf.py:338 cps/shelf.py:368 cps/shelf.py:392
+msgid "Settings DB is not Writeable"
+msgstr ""
+
+#: cps/admin.py:706
 msgid "DB Location is not Valid, Please Enter Correct Path"
 msgstr "Расположение Базы Данных неверно, пожалуйста, введите правильный путь."
 
-#: cps/admin.py:703
+#: cps/admin.py:708
 msgid "DB is not Writeable"
 msgstr ""
 
-#: cps/admin.py:736
+#: cps/admin.py:741
 msgid "Basic Configuration"
 msgstr "Настройки сервера"
 
-#: cps/admin.py:751 cps/web.py:1337
+#: cps/admin.py:756 cps/web.py:1334
 msgid "Please fill out all fields!"
 msgstr "Пожалуйста, заполните все поля!"
 
-#: cps/admin.py:754 cps/admin.py:766 cps/admin.py:772 cps/admin.py:892
+#: cps/admin.py:759 cps/admin.py:771 cps/admin.py:777 cps/admin.py:903
 msgid "Add new user"
 msgstr "Добавить пользователя"
 
-#: cps/admin.py:763 cps/web.py:1578
+#: cps/admin.py:768 cps/web.py:1575
 msgid "E-mail is not from valid domain"
 msgstr "E-mail не из существующей доменной зоны"
 
-#: cps/admin.py:770 cps/admin.py:785
+#: cps/admin.py:775 cps/admin.py:790
 msgid "Found an existing account for this e-mail address or nickname."
 msgstr "Для этого адреса электронной почты или логина уже есть учётная запись."
 
-#: cps/admin.py:781
+#: cps/admin.py:786
 #, python-format
 msgid "User '%(user)s' created"
 msgstr "Пользователь '%(user)s' добавлен"
 
-#: cps/admin.py:794
+#: cps/admin.py:802
 #, python-format
 msgid "User '%(nick)s' deleted"
 msgstr "Пользователь '%(nick)s' удалён"
 
-#: cps/admin.py:797
+#: cps/admin.py:805
 msgid "No admin user remaining, can't delete user"
 msgstr "Это последний администратор, невозможно удалить пользователя"
 
-#: cps/admin.py:803
+#: cps/admin.py:811
 msgid "No admin user remaining, can't remove admin role"
 msgstr ""
 
-#: cps/admin.py:839 cps/web.py:1621
+#: cps/admin.py:847 cps/web.py:1618
 msgid "Found an existing account for this e-mail address."
 msgstr "Этот адрес электронной почты уже зарегистрирован."
 
-#: cps/admin.py:849 cps/admin.py:864 cps/admin.py:967 cps/web.py:1596
+#: cps/admin.py:857 cps/admin.py:872 cps/admin.py:983 cps/web.py:1593
 #, python-format
 msgid "Edit User %(nick)s"
 msgstr "Изменить пользователя %(nick)s"
 
-#: cps/admin.py:855 cps/web.py:1588
+#: cps/admin.py:863 cps/web.py:1585
 msgid "This username is already taken"
 msgstr "Это имя пользователя уже занято"
 
-#: cps/admin.py:871
+#: cps/admin.py:879
 #, python-format
 msgid "User '%(nick)s' updated"
 msgstr "Пользователь '%(nick)s' обновлён"
 
-#: cps/admin.py:874
+#: cps/admin.py:882
 msgid "An unknown error occured."
 msgstr "Произошла неизвестная ошибка."
 
-#: cps/admin.py:901 cps/templates/admin.html:71
+#: cps/admin.py:912 cps/templates/admin.html:71
 msgid "Edit E-mail Server Settings"
 msgstr "Изменить настройки SMTP"
 
-#: cps/admin.py:925
+#: cps/admin.py:941
 #, python-format
 msgid "Test e-mail successfully send to %(kindlemail)s"
 msgstr "Тестовое письмо успешно отправлено на %(kindlemail)s"
 
-#: cps/admin.py:928
+#: cps/admin.py:944
 #, python-format
 msgid "There was an error sending the Test e-mail: %(res)s"
 msgstr "Произошла ошибка при отправке тестового письма на: %(res)s"
 
-#: cps/admin.py:930
+#: cps/admin.py:946
 msgid "Please configure your e-mail address first..."
 msgstr "Пожалуйста, сначала настройте свой адрес электронной почты ..."
 
-#: cps/admin.py:932
+#: cps/admin.py:948
 msgid "E-mail server settings updated"
 msgstr "Настройки E-mail сервера обновлены"
 
-#: cps/admin.py:943
+#: cps/admin.py:959
 msgid "User not found"
 msgstr ""
 
-#: cps/admin.py:978
+#: cps/admin.py:994
 #, python-format
 msgid "Password for user %(user)s reset"
 msgstr "Пароль для пользователя %(user)s сброшен"
 
-#: cps/admin.py:981 cps/web.py:1361 cps/web.py:1425
+#: cps/admin.py:997 cps/web.py:1358 cps/web.py:1422
 msgid "An unknown error occurred. Please try again later."
 msgstr "Неизвестная ошибка. Попробуйте позже."
 
-#: cps/admin.py:984 cps/web.py:1299
+#: cps/admin.py:1000 cps/web.py:1296
 msgid "Please configure the SMTP mail settings first..."
 msgstr "Пожалуйста, сперва настройте параметры SMTP....."
 
-#: cps/admin.py:996
+#: cps/admin.py:1012
 msgid "Logfile viewer"
 msgstr "Просмотр лога"
 
-#: cps/admin.py:1035
+#: cps/admin.py:1051
 msgid "Requesting update package"
 msgstr "Проверка обновлений"
 
-#: cps/admin.py:1036
+#: cps/admin.py:1052
 msgid "Downloading update package"
 msgstr "Загрузка обновлений"
 
-#: cps/admin.py:1037
+#: cps/admin.py:1053
 msgid "Unzipping update package"
 msgstr "Распаковка обновлений"
 
-#: cps/admin.py:1038
+#: cps/admin.py:1054
 msgid "Replacing files"
 msgstr "Замена файлов"
 
-#: cps/admin.py:1039
+#: cps/admin.py:1055
 msgid "Database connections are closed"
 msgstr "Соединения с базой данных закрыты"
 
-#: cps/admin.py:1040
+#: cps/admin.py:1056
 msgid "Stopping server"
 msgstr "Остановка сервера"
 
-#: cps/admin.py:1041
+#: cps/admin.py:1057
 msgid "Update finished, please press okay and reload page"
 msgstr "Обновления установлены, нажмите ок и перезагрузите страницу"
 
-#: cps/admin.py:1042 cps/admin.py:1043 cps/admin.py:1044 cps/admin.py:1045
-#: cps/admin.py:1046
+#: cps/admin.py:1058 cps/admin.py:1059 cps/admin.py:1060 cps/admin.py:1061
+#: cps/admin.py:1062
 msgid "Update failed:"
 msgstr "Ошибка обновления:"
 
-#: cps/admin.py:1042 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
+#: cps/admin.py:1058 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
 msgid "HTTP Error"
 msgstr "Ошибка HTTP"
 
-#: cps/admin.py:1043 cps/updater.py:321 cps/updater.py:524
+#: cps/admin.py:1059 cps/updater.py:321 cps/updater.py:524
 msgid "Connection error"
 msgstr "Ошибка соединения"
 
-#: cps/admin.py:1044 cps/updater.py:323 cps/updater.py:526
+#: cps/admin.py:1060 cps/updater.py:323 cps/updater.py:526
 msgid "Timeout while establishing connection"
 msgstr "Тайм-аут при установлении соединения"
 
-#: cps/admin.py:1045 cps/updater.py:325 cps/updater.py:528
+#: cps/admin.py:1061 cps/updater.py:325 cps/updater.py:528
 msgid "General error"
 msgstr "Общая ошибка"
 
-#: cps/admin.py:1046
+#: cps/admin.py:1062
 msgid "Update File Could Not be Saved in Temp Dir"
 msgstr "Не удалось сохранить файл обновления во временной папке."
 
@@ -302,8 +308,8 @@ msgstr ""
 msgid "Book Successfully Deleted"
 msgstr ""
 
-#: cps/editbooks.py:254 cps/editbooks.py:548 cps/web.py:1644 cps/web.py:1685
-#: cps/web.py:1747
+#: cps/editbooks.py:254 cps/editbooks.py:549 cps/web.py:1641 cps/web.py:1682
+#: cps/web.py:1744
 msgid "Error opening eBook. File does not exist or file is not accessible"
 msgstr "Ошибка при открытии eBook. Файл не существует или файл недоступен"
 
@@ -311,82 +317,82 @@ msgstr "Ошибка при открытии eBook. Файл не существ
 msgid "edit metadata"
 msgstr "изменить метаданные"
 
-#: cps/editbooks.py:361
+#: cps/editbooks.py:360
 #, python-format
 msgid "%(langname)s is not a valid language"
 msgstr "%(langname)s не допустимый язык"
 
-#: cps/editbooks.py:467 cps/editbooks.py:712
+#: cps/editbooks.py:468 cps/editbooks.py:715
 #, python-format
 msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
 msgstr "Запрещена загрузка файлов с расширением '%(ext)s'"
 
-#: cps/editbooks.py:471 cps/editbooks.py:716
+#: cps/editbooks.py:472 cps/editbooks.py:719
 msgid "File to be uploaded must have an extension"
 msgstr "Загружаемый файл должен иметь расширение"
 
-#: cps/editbooks.py:483 cps/editbooks.py:773
+#: cps/editbooks.py:484 cps/editbooks.py:779
 #, python-format
 msgid "Failed to create path %(path)s (Permission denied)."
 msgstr "Ошибка при создании пути %(path)s (Доступ запрещён)."
 
-#: cps/editbooks.py:488
+#: cps/editbooks.py:489
 #, python-format
 msgid "Failed to store file %(file)s."
 msgstr "Не удалось сохранить файл %(file)s."
 
-#: cps/editbooks.py:506 cps/editbooks.py:864
+#: cps/editbooks.py:507 cps/editbooks.py:870
 #, python-format
 msgid "Database error: %(error)s."
 msgstr ""
 
-#: cps/editbooks.py:510
+#: cps/editbooks.py:511
 #, python-format
 msgid "File format %(ext)s added to %(book)s"
 msgstr "Формат файла %(ext)s добавлен в %(book)s"
 
-#: cps/editbooks.py:653
+#: cps/editbooks.py:656
 msgid "Metadata successfully updated"
 msgstr "Метаданные обновлены"
 
-#: cps/editbooks.py:662
+#: cps/editbooks.py:665
 msgid "Error editing book, please check logfile for details"
 msgstr "Ошибка редактирования книги. Пожалуйста, проверьте лог-файл для дополнительной информации"
 
-#: cps/editbooks.py:724
+#: cps/editbooks.py:727
 #, python-format
 msgid "File %(filename)s could not saved to temp dir"
 msgstr "Файл %(filename)s не удалось сохранить во временную папку"
 
-#: cps/editbooks.py:734
+#: cps/editbooks.py:737
 msgid "Uploaded book probably exists in the library, consider to change before upload new: "
 msgstr "Загруженная книга, вероятно, существует в библиотеке, перед тем как загрузить новую, рассмотрите возможность изменения: "
 
-#: cps/editbooks.py:780
+#: cps/editbooks.py:786
 #, python-format
 msgid "Failed to Move File %(file)s: %(error)s"
 msgstr ""
 
-#: cps/editbooks.py:836
+#: cps/editbooks.py:842
 #, python-format
 msgid "Failed to Move Cover File %(file)s: %(error)s"
 msgstr ""
 
-#: cps/editbooks.py:850
+#: cps/editbooks.py:856
 #, python-format
 msgid "File %(file)s uploaded"
 msgstr "Файл %(file)s загружен"
 
-#: cps/editbooks.py:876
+#: cps/editbooks.py:882
 msgid "Source or destination format for conversion missing"
 msgstr "Исходный или целевой формат для конвертирования отсутствует"
 
-#: cps/editbooks.py:884
+#: cps/editbooks.py:890
 #, python-format
 msgid "Book successfully queued for converting to %(book_format)s"
 msgstr "Книга успешно поставлена в очередь для конвертирования в %(book_format)s"
 
-#: cps/editbooks.py:888
+#: cps/editbooks.py:894
 #, python-format
 msgid "There was an error converting this book: %(res)s"
 msgstr "Произошла ошибка при конвертирования этой книги: %(res)s"
@@ -500,71 +506,71 @@ msgstr "Файл %(file)s не найден на Google Drive"
 msgid "Book path %(path)s not found on Google Drive"
 msgstr "Путь книги %(path)s не найден на Google Drive"
 
-#: cps/helper.py:542
+#: cps/helper.py:550
 msgid "Error Downloading Cover"
 msgstr ""
 
-#: cps/helper.py:545
+#: cps/helper.py:553
 msgid "Cover Format Error"
 msgstr ""
 
-#: cps/helper.py:561
+#: cps/helper.py:569
 msgid "Failed to create path for cover"
 msgstr "Не удалось создать путь для обложки."
 
-#: cps/helper.py:566
+#: cps/helper.py:574
 msgid "Cover-file is not a valid image file, or could not be stored"
 msgstr ""
 
-#: cps/helper.py:577
+#: cps/helper.py:585
 msgid "Only jpg/jpeg/png/webp files are supported as coverfile"
 msgstr "Только файлы jpg / jpeg / png / webp поддерживаются в качестве файла обложки"
 
-#: cps/helper.py:591
+#: cps/helper.py:599
 msgid "Only jpg/jpeg files are supported as coverfile"
 msgstr "Только файлы в формате jpg / jpeg поддерживаются как файл обложки"
 
-#: cps/helper.py:640
+#: cps/helper.py:648
 msgid "Unrar binary file not found"
 msgstr ""
 
-#: cps/helper.py:654
+#: cps/helper.py:662
 msgid "Error excecuting UnRar"
 msgstr ""
 
-#: cps/helper.py:710
+#: cps/helper.py:718
 msgid "Waiting"
 msgstr "Ожидание"
 
-#: cps/helper.py:712
+#: cps/helper.py:720
 msgid "Failed"
 msgstr "Неудачно"
 
-#: cps/helper.py:714
+#: cps/helper.py:722
 msgid "Started"
 msgstr "Начало"
 
-#: cps/helper.py:716
+#: cps/helper.py:724
 msgid "Finished"
 msgstr "Завершено"
 
-#: cps/helper.py:718
+#: cps/helper.py:726
 msgid "Unknown Status"
 msgstr "Неизвестный статус"
 
-#: cps/helper.py:723
+#: cps/helper.py:731
 msgid "E-mail: "
 msgstr "E-mail: "
 
-#: cps/helper.py:725 cps/helper.py:729
+#: cps/helper.py:733 cps/helper.py:737
 msgid "Convert: "
 msgstr "Конвертировать: "
 
-#: cps/helper.py:727
+#: cps/helper.py:735
 msgid "Upload: "
 msgstr "Загрузить: "
 
-#: cps/helper.py:731
+#: cps/helper.py:739
 msgid "Unknown Task: "
 msgstr "Неизвестная задача: "
 
@@ -597,7 +603,7 @@ msgstr "Не удалось войти в систему с помощью Googl
 msgid "Failed to fetch user info from Google."
 msgstr "Не удалось получить информацию о пользователе из Google."
 
-#: cps/oauth_bb.py:225 cps/web.py:1397 cps/web.py:1537
+#: cps/oauth_bb.py:225 cps/web.py:1394 cps/web.py:1534
 #, python-format
 msgid "you are now logged in as: '%(nickname)s'"
 msgstr "вы вошли как пользователь '%(nickname)s'"
@@ -634,218 +640,218 @@ msgstr "Ошибка GitHub Oauth, пожалуйста попробуйте п
 msgid "Google Oauth error, please retry later."
 msgstr "Ошибка Google Oauth, пожалуйста попробуйте позже."
 
-#: cps/shelf.py:66 cps/shelf.py:111
+#: cps/shelf.py:67 cps/shelf.py:120
 msgid "Invalid shelf specified"
 msgstr "Указана неверная полка"
 
-#: cps/shelf.py:72
+#: cps/shelf.py:73
 #, python-format
 msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s"
 msgstr "Извините, но вам не разрешено добавлять книги на полку: %(shelfname)s"
 
-#: cps/shelf.py:82
+#: cps/shelf.py:83
 #, python-format
 msgid "Book is already part of the shelf: %(shelfname)s"
 msgstr "Книги уже размещены на полке: %(shelfname)s"
 
-#: cps/shelf.py:97
+#: cps/shelf.py:106
 #, python-format
 msgid "Book has been added to shelf: %(sname)s"
 msgstr "Книга добавлена на книжную полку: %(sname)s"
 
-#: cps/shelf.py:115
+#: cps/shelf.py:124
 #, python-format
 msgid "You are not allowed to add a book to the the shelf: %(name)s"
 msgstr "Вам не разрешено добавлять книгу на полку: %(name)s"
 
-#: cps/shelf.py:133
+#: cps/shelf.py:142
 #, python-format
 msgid "Books are already part of the shelf: %(name)s"
 msgstr "Книги уже размещены на полке: %(name)s"
 
-#: cps/shelf.py:148
+#: cps/shelf.py:158
 #, python-format
 msgid "Books have been added to shelf: %(sname)s"
 msgstr "Книги добавлены на полку: %(sname)s"
 
-#: cps/shelf.py:150
+#: cps/shelf.py:163
 #, python-format
 msgid "Could not add books to shelf: %(sname)s"
 msgstr "Не удалось добавить книги на полку: %(sname)s"
 
-#: cps/shelf.py:188
+#: cps/shelf.py:208
 #, python-format
 msgid "Book has been removed from shelf: %(sname)s"
 msgstr "Книга удалена с полки: %(sname)s"
 
-#: cps/shelf.py:196
+#: cps/shelf.py:216
 #, python-format
 msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
 msgstr "Извините, вы не можете удалить книгу с полки: %(sname)s"
 
-#: cps/shelf.py:220 cps/shelf.py:260
+#: cps/shelf.py:240 cps/shelf.py:284
 #, python-format
 msgid "A public shelf with the name '%(title)s' already exists."
 msgstr "Публичная полка с названием '%(title)s' уже существует."
 
-#: cps/shelf.py:229 cps/shelf.py:270
+#: cps/shelf.py:249 cps/shelf.py:294
 #, python-format
 msgid "A private shelf with the name '%(title)s' already exists."
 msgstr "Приватная полка с названием '%(title)s' уже существует."
 
-#: cps/shelf.py:236
+#: cps/shelf.py:256
 #, python-format
 msgid "Shelf %(title)s created"
 msgstr "Создана полка %(title)s"
 
-#: cps/shelf.py:239 cps/shelf.py:284
+#: cps/shelf.py:263 cps/shelf.py:312
 msgid "There was an error"
 msgstr "Произошла ошибка"
 
-#: cps/shelf.py:240 cps/shelf.py:242 cps/templates/layout.html:144
+#: cps/shelf.py:264 cps/shelf.py:266 cps/templates/layout.html:144
 msgid "Create a Shelf"
 msgstr "Создать полку"
 
-#: cps/shelf.py:282
+#: cps/shelf.py:306
 #, python-format
 msgid "Shelf %(title)s changed"
 msgstr "Колка %(title)s изменена"
 
-#: cps/shelf.py:285 cps/shelf.py:287
+#: cps/shelf.py:313 cps/shelf.py:315
 msgid "Edit a shelf"
 msgstr "Изменить полку"
 
-#: cps/shelf.py:332
+#: cps/shelf.py:369
 #, python-format
 msgid "Shelf: '%(name)s'"
 msgstr "Полка: '%(name)s'"
 
-#: cps/shelf.py:335
+#: cps/shelf.py:372
 msgid "Error opening shelf. Shelf does not exist or is not accessible"
 msgstr "Ошибка открытия Полки. Полка не существует или недоступна"
 
-#: cps/shelf.py:368
+#: cps/shelf.py:409
 msgid "Hidden Book"
 msgstr "Скрытая книга"
 
-#: cps/shelf.py:373
+#: cps/shelf.py:414
 #, python-format
 msgid "Change order of Shelf: '%(name)s'"
 msgstr "Изменить расположение полки '%(name)s'"
 
-#: cps/ub.py:64
+#: cps/ub.py:65
 msgid "Recently Added"
 msgstr "Недавно Добавленные"
 
-#: cps/ub.py:66
+#: cps/ub.py:67
 msgid "Show recent books"
 msgstr "Показывать недавние книги"
 
-#: cps/templates/index.xml:17 cps/ub.py:67
+#: cps/templates/index.xml:17 cps/ub.py:68
 msgid "Hot Books"
 msgstr "Популярные Книги"
 
-#: cps/ub.py:69
+#: cps/ub.py:70
 msgid "Show Hot Books"
 msgstr "Показывать популярные книги"
 
-#: cps/templates/index.xml:24 cps/ub.py:71 cps/web.py:655
+#: cps/templates/index.xml:24 cps/ub.py:72 cps/web.py:652
 msgid "Top Rated Books"
 msgstr "Книги с наилучшим рейтингом"
 
-#: cps/ub.py:73
+#: cps/ub.py:74
 msgid "Show Top Rated Books"
 msgstr "Показывать книги с наивысшим рейтингом"
 
-#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:74
-#: cps/web.py:1222
+#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:75
+#: cps/web.py:1219
 msgid "Read Books"
 msgstr "Прочитанные Книги"
 
-#: cps/ub.py:76
+#: cps/ub.py:77
 msgid "Show read and unread"
 msgstr "Показывать прочитанные и непрочитанные"
 
-#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:78
-#: cps/web.py:1225
+#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:79
+#: cps/web.py:1222
 msgid "Unread Books"
 msgstr "Непрочитанные Книги"
 
-#: cps/ub.py:80
+#: cps/ub.py:81
 msgid "Show unread"
 msgstr "Показать непрочитанное"
 
-#: cps/ub.py:81
+#: cps/ub.py:82
 msgid "Discover"
 msgstr "Обзор"
 
-#: cps/ub.py:83
+#: cps/ub.py:84
 msgid "Show random books"
 msgstr "Показывать случайные книги"
 
-#: cps/templates/index.xml:75 cps/ub.py:84 cps/web.py:970
+#: cps/templates/index.xml:75 cps/ub.py:85 cps/web.py:967
 msgid "Categories"
 msgstr "Категории"
 
-#: cps/ub.py:86
+#: cps/ub.py:87
 msgid "Show category selection"
 msgstr "Показывать выбор категории"
 
 #: cps/templates/book_edit.html:84 cps/templates/index.xml:82
-#: cps/templates/search_form.html:53 cps/ub.py:87 cps/web.py:886 cps/web.py:896
+#: cps/templates/search_form.html:53 cps/ub.py:88 cps/web.py:883 cps/web.py:893
 msgid "Series"
 msgstr "Серии"
 
-#: cps/ub.py:89
+#: cps/ub.py:90
 msgid "Show series selection"
 msgstr "Показывать выбор серии"
 
-#: cps/templates/index.xml:61 cps/ub.py:90
+#: cps/templates/index.xml:61 cps/ub.py:91
 msgid "Authors"
 msgstr "Авторы"
 
-#: cps/ub.py:92
+#: cps/ub.py:93
 msgid "Show author selection"
 msgstr "Показывать выбор автора"
 
-#: cps/templates/index.xml:68 cps/ub.py:94 cps/web.py:869
+#: cps/templates/index.xml:68 cps/ub.py:95 cps/web.py:866
 msgid "Publishers"
 msgstr "Издатели"
 
-#: cps/ub.py:96
+#: cps/ub.py:97
 msgid "Show publisher selection"
 msgstr "Показать выбор издателя"
 
-#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:97
-#: cps/web.py:953
+#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:98
+#: cps/web.py:950
 msgid "Languages"
 msgstr "Языки"
 
-#: cps/ub.py:100
+#: cps/ub.py:101
 msgid "Show language selection"
 msgstr "Показывать выбор языка"
 
-#: cps/templates/index.xml:96 cps/ub.py:101
+#: cps/templates/index.xml:96 cps/ub.py:102
 msgid "Ratings"
 msgstr "Рейтинги"
 
-#: cps/ub.py:103
+#: cps/ub.py:104
 msgid "Show ratings selection"
 msgstr "Показать выбор рейтинга"
 
-#: cps/templates/index.xml:104 cps/ub.py:104
+#: cps/templates/index.xml:104 cps/ub.py:105
 msgid "File formats"
 msgstr "Форматы файлов"
 
-#: cps/ub.py:106
+#: cps/ub.py:107
 msgid "Show file formats selection"
 msgstr "Показать выбор форматов файлов"
 
-#: cps/ub.py:108 cps/web.py:1249
+#: cps/ub.py:109 cps/web.py:1246
 msgid "Archived Books"
 msgstr ""
 
-#: cps/ub.py:110
+#: cps/ub.py:111
 msgid "Show archived books"
 msgstr ""
 
@@ -878,220 +884,220 @@ msgstr "Новое обновление доступно. Нажмите на к
 msgid "Click on the button below to update to the latest stable version."
 msgstr "Нажмите на кнопку ниже для обновления до последней стабильной версии."
 
-#: cps/web.py:322
+#: cps/web.py:319
 #, python-format
 msgid "Error: %(ldaperror)s"
 msgstr "Ошибка: %(ldaperror)s"
 
-#: cps/web.py:326
+#: cps/web.py:323
 msgid "Error: No user returned in response of LDAP server"
 msgstr "Ошибка: ни одного пользователя не найдено в ответ на запрос сервер LDAP"
 
-#: cps/web.py:374
+#: cps/web.py:371
 msgid "Failed to Create at Least One LDAP User"
 msgstr "Не удалось создать хотя бы одного пользователя LDAP"
 
-#: cps/web.py:377
+#: cps/web.py:374
 msgid "At Least One LDAP User Not Found in Database"
 msgstr "По крайней мере, один пользователь LDAP не найден в базе данных"
 
-#: cps/web.py:379
+#: cps/web.py:376
 msgid "User Successfully Imported"
 msgstr "Пользователь успешно импортирован"
 
-#: cps/web.py:625
+#: cps/web.py:622
 msgid "Recently Added Books"
 msgstr "Недавно Добавленные Книги"
 
-#: cps/templates/index.html:5 cps/web.py:663
+#: cps/templates/index.html:5 cps/web.py:660
 msgid "Discover (Random Books)"
 msgstr "Обзор (Случайные Книги)"
 
-#: cps/web.py:691
+#: cps/web.py:688
 msgid "Books"
 msgstr "Книги"
 
-#: cps/web.py:718
+#: cps/web.py:715
 msgid "Hot Books (Most Downloaded)"
 msgstr "Популярные книги (часто загружаемые)"
 
-#: cps/web.py:731
+#: cps/web.py:728
 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible"
 msgstr "Невозможно открыть книгу. Файл не существует или недоступен"
 
-#: cps/web.py:745
+#: cps/web.py:742
 #, python-format
 msgid "Author: %(name)s"
 msgstr "Автор: %(name)s"
 
-#: cps/web.py:759
+#: cps/web.py:756
 #, python-format
 msgid "Publisher: %(name)s"
 msgstr "Издатель: %(name)s"
 
-#: cps/web.py:772
+#: cps/web.py:769
 #, python-format
 msgid "Series: %(serie)s"
 msgstr "Серии: %(serie)s"
 
-#: cps/web.py:785
+#: cps/web.py:782
 #, python-format
 msgid "Rating: %(rating)s stars"
 msgstr "Оценка: %(rating)s звезды(а)"
 
-#: cps/web.py:798
+#: cps/web.py:795
 #, python-format
 msgid "File format: %(format)s"
 msgstr "Формат файла: %(format)s"
 
-#: cps/web.py:812
+#: cps/web.py:809
 #, python-format
 msgid "Category: %(name)s"
 msgstr "Категория: %(name)s"
 
-#: cps/web.py:831
+#: cps/web.py:828
 #, python-format
 msgid "Language: %(name)s"
 msgstr "Язык: %(name)s"
 
-#: cps/web.py:910
+#: cps/web.py:907
 msgid "Ratings list"
 msgstr "Список рейтингов"
 
-#: cps/web.py:925
+#: cps/web.py:922
 msgid "File formats list"
 msgstr "Список форматов файлов"
 
-#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:984
+#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:981
 msgid "Tasks"
 msgstr "Задания"
 
 #: cps/templates/book_edit.html:235 cps/templates/feed.xml:33
 #: cps/templates/layout.html:45 cps/templates/layout.html:48
-#: cps/templates/search_form.html:174 cps/web.py:1010 cps/web.py:1015
+#: cps/templates/search_form.html:174 cps/web.py:1007 cps/web.py:1012
 msgid "Search"
 msgstr "Поиск"
 
-#: cps/web.py:1066
+#: cps/web.py:1063
 msgid "Published after "
 msgstr "Опубликовано после "
 
-#: cps/web.py:1073
+#: cps/web.py:1070
 msgid "Published before "
 msgstr "Опубликовано до "
 
-#: cps/web.py:1087
+#: cps/web.py:1084
 #, python-format
 msgid "Rating <= %(rating)s"
 msgstr "Рейтинг <= %(rating)s"
 
-#: cps/web.py:1089
+#: cps/web.py:1086
 #, python-format
 msgid "Rating >= %(rating)s"
 msgstr "Рейтинг >= %(rating)s"
 
-#: cps/web.py:1158 cps/web.py:1183
+#: cps/web.py:1155 cps/web.py:1180
 msgid "search"
 msgstr "поиск"
 
-#: cps/web.py:1213
+#: cps/web.py:1210
 #, python-format
 msgid "Custom Column No.%(column)d is not existing in calibre database"
 msgstr ""
 
-#: cps/web.py:1304
+#: cps/web.py:1301
 #, python-format
 msgid "Book successfully queued for sending to %(kindlemail)s"
 msgstr "Книга успешно поставлена в очередь для отправки на %(kindlemail)s"
 
-#: cps/web.py:1308
+#: cps/web.py:1305
 #, python-format
 msgid "Oops! There was an error sending this book: %(res)s"
 msgstr "При отправке этой книги произошла ошибка: %(res)s"
 
-#: cps/web.py:1310
+#: cps/web.py:1307
 msgid "Please update your profile with a valid Send to Kindle E-mail Address."
 msgstr "Пожалуйста, сначала настройте e-mail на вашем kindle..."
 
-#: cps/web.py:1327
+#: cps/web.py:1324
 msgid "E-Mail server is not configured, please contact your administrator!"
 msgstr "Сервер электронной почты не настроен, обратитесь к администратору !"
 
-#: cps/web.py:1328 cps/web.py:1338 cps/web.py:1362 cps/web.py:1366
-#: cps/web.py:1371 cps/web.py:1375
+#: cps/web.py:1325 cps/web.py:1335 cps/web.py:1359 cps/web.py:1363
+#: cps/web.py:1368 cps/web.py:1372
 msgid "register"
 msgstr "регистрация"
 
-#: cps/web.py:1364
+#: cps/web.py:1361
 msgid "Your e-mail is not allowed to register"
 msgstr "Ваш e-mail не подходит для регистрации"
 
-#: cps/web.py:1367
+#: cps/web.py:1364
 msgid "Confirmation e-mail was send to your e-mail account."
 msgstr "Письмо с подтверждением отправлено вам на e-mail."
 
-#: cps/web.py:1370
+#: cps/web.py:1367
 msgid "This username or e-mail address is already in use."
 msgstr "Этот никнейм или e-mail уже используются."
 
-#: cps/web.py:1387
+#: cps/web.py:1384
 msgid "Cannot activate LDAP authentication"
 msgstr "Не удается активировать LDAP аутентификацию"
 
-#: cps/web.py:1404
+#: cps/web.py:1401
 #, python-format
 msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known"
 msgstr "Резервный вход в систему как: '%(nickname)s', LDAP-сервер недоступен или пользователь не известен"
 
-#: cps/web.py:1410
+#: cps/web.py:1407
 #, python-format
 msgid "Could not login: %(message)s"
 msgstr "Не удалось войти: %(message)s"
 
-#: cps/web.py:1414 cps/web.py:1438
+#: cps/web.py:1411 cps/web.py:1435
 msgid "Wrong Username or Password"
 msgstr "Ошибка в имени пользователя или пароле"
 
-#: cps/web.py:1421
+#: cps/web.py:1418
 msgid "New Password was send to your email address"
 msgstr "Новый пароль был отправлен на ваш адрес электронной почты"
 
-#: cps/web.py:1427
+#: cps/web.py:1424
 msgid "Please enter valid username to reset password"
 msgstr "Пожалуйста, введите действительное имя пользователя для сброса пароля"
 
-#: cps/web.py:1433
+#: cps/web.py:1430
 #, python-format
 msgid "You are now logged in as: '%(nickname)s'"
 msgstr "Вы вошли как: '%(nickname)s'"
 
-#: cps/web.py:1442 cps/web.py:1469
+#: cps/web.py:1439 cps/web.py:1466
 msgid "login"
 msgstr "войти"
 
-#: cps/web.py:1481 cps/web.py:1515
+#: cps/web.py:1478 cps/web.py:1512
 msgid "Token not found"
 msgstr "Ключ не найден"
 
-#: cps/web.py:1490 cps/web.py:1523
+#: cps/web.py:1487 cps/web.py:1520
 msgid "Token has expired"
 msgstr "Ключ просрочен"
 
-#: cps/web.py:1499
+#: cps/web.py:1496
 msgid "Success! Please return to your device"
 msgstr "Успешно! Пожалуйста, проверьте свое устройство"
 
-#: cps/web.py:1580 cps/web.py:1625 cps/web.py:1631
+#: cps/web.py:1577 cps/web.py:1622 cps/web.py:1628
 #, python-format
 msgid "%(name)s's profile"
 msgstr "Профиль %(name)s's"
 
-#: cps/web.py:1627
+#: cps/web.py:1624
 msgid "Profile updated"
 msgstr "Профиль обновлён"
 
-#: cps/web.py:1656 cps/web.py:1659 cps/web.py:1662 cps/web.py:1669
-#: cps/web.py:1674
+#: cps/web.py:1653 cps/web.py:1656 cps/web.py:1659 cps/web.py:1666
+#: cps/web.py:1671
 msgid "Read a Book"
 msgstr "Читать Книгу"
 
diff --git a/cps/translations/sv/LC_MESSAGES/messages.mo b/cps/translations/sv/LC_MESSAGES/messages.mo
index b1297f76e8d83ffeb4b42e94df72bb44e8cc290a..d65c43d7b9940502747af03e3b4c79a9b58e06ad 100644
Binary files a/cps/translations/sv/LC_MESSAGES/messages.mo and b/cps/translations/sv/LC_MESSAGES/messages.mo differ
diff --git a/cps/translations/sv/LC_MESSAGES/messages.po b/cps/translations/sv/LC_MESSAGES/messages.po
index eb877b759106a03195ab40f70049326aafd04c58..b41fd9294298b549735cd5203f30eb4b6b724041 100644
--- a/cps/translations/sv/LC_MESSAGES/messages.po
+++ b/cps/translations/sv/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version:  Calibre-Web\n"
 "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
-"POT-Creation-Date: 2020-06-07 06:47+0200\n"
+"POT-Creation-Date: 2020-06-28 09:31+0200\n"
 "PO-Revision-Date: 2020-03-14 09:30+0100\n"
 "Last-Translator: Jonatan Nyberg <jonatan.nyberg.karl@gmail.com>\n"
 "Language: sv\n"
@@ -46,9 +46,9 @@ msgstr ""
 msgid "Unknown command"
 msgstr ""
 
-#: cps/admin.py:116 cps/editbooks.py:563 cps/editbooks.py:573
-#: cps/editbooks.py:667 cps/editbooks.py:669 cps/editbooks.py:730
-#: cps/editbooks.py:743 cps/updater.py:509 cps/uploader.py:97
+#: cps/admin.py:116 cps/editbooks.py:564 cps/editbooks.py:576
+#: cps/editbooks.py:670 cps/editbooks.py:672 cps/editbooks.py:733
+#: cps/editbooks.py:749 cps/updater.py:509 cps/uploader.py:97
 #: cps/uploader.py:107
 msgid "Unknown"
 msgstr "Okänd"
@@ -61,7 +61,7 @@ msgstr "Administrationssida"
 msgid "UI Configuration"
 msgstr "Användargränssnitt konfiguration"
 
-#: cps/admin.py:189 cps/admin.py:706
+#: cps/admin.py:189 cps/admin.py:711
 msgid "Calibre-Web configuration updated"
 msgstr "Calibre-Web konfiguration uppdaterad"
 
@@ -113,175 +113,181 @@ msgstr ""
 msgid "LDAP Certificate Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:627
+#: cps/admin.py:628
 msgid "Keyfile Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:631
+#: cps/admin.py:632
 msgid "Certfile Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:701
+#: cps/admin.py:694 cps/admin.py:793 cps/admin.py:885 cps/admin.py:934
+#: cps/shelf.py:100 cps/shelf.py:161 cps/shelf.py:202 cps/shelf.py:260
+#: cps/shelf.py:309 cps/shelf.py:338 cps/shelf.py:368 cps/shelf.py:392
+msgid "Settings DB is not Writeable"
+msgstr ""
+
+#: cps/admin.py:706
 msgid "DB Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:703
+#: cps/admin.py:708
 msgid "DB is not Writeable"
 msgstr ""
 
-#: cps/admin.py:736
+#: cps/admin.py:741
 msgid "Basic Configuration"
 msgstr "Grundläggande konfiguration"
 
-#: cps/admin.py:751 cps/web.py:1337
+#: cps/admin.py:756 cps/web.py:1334
 msgid "Please fill out all fields!"
 msgstr "Fyll i alla fält!"
 
-#: cps/admin.py:754 cps/admin.py:766 cps/admin.py:772 cps/admin.py:892
+#: cps/admin.py:759 cps/admin.py:771 cps/admin.py:777 cps/admin.py:903
 msgid "Add new user"
 msgstr "Lägg till ny användare"
 
-#: cps/admin.py:763 cps/web.py:1578
+#: cps/admin.py:768 cps/web.py:1575
 msgid "E-mail is not from valid domain"
 msgstr "E-posten är inte från giltig domän"
 
-#: cps/admin.py:770 cps/admin.py:785
+#: cps/admin.py:775 cps/admin.py:790
 msgid "Found an existing account for this e-mail address or nickname."
 msgstr "Hittade ett befintligt konto för den här e-postadressen eller smeknamnet."
 
-#: cps/admin.py:781
+#: cps/admin.py:786
 #, python-format
 msgid "User '%(user)s' created"
 msgstr "Användaren '%(user)s' skapad"
 
-#: cps/admin.py:794
+#: cps/admin.py:802
 #, python-format
 msgid "User '%(nick)s' deleted"
 msgstr "Användaren '%(nick)s' borttagen"
 
-#: cps/admin.py:797
+#: cps/admin.py:805
 msgid "No admin user remaining, can't delete user"
 msgstr "Ingen adminstratörsanvändare kvar, kan inte ta bort användaren"
 
-#: cps/admin.py:803
+#: cps/admin.py:811
 msgid "No admin user remaining, can't remove admin role"
 msgstr ""
 
-#: cps/admin.py:839 cps/web.py:1621
+#: cps/admin.py:847 cps/web.py:1618
 msgid "Found an existing account for this e-mail address."
 msgstr "Hittade ett befintligt konto för den här e-postadressen."
 
-#: cps/admin.py:849 cps/admin.py:864 cps/admin.py:967 cps/web.py:1596
+#: cps/admin.py:857 cps/admin.py:872 cps/admin.py:983 cps/web.py:1593
 #, python-format
 msgid "Edit User %(nick)s"
 msgstr "Redigera användaren %(nick)s"
 
-#: cps/admin.py:855 cps/web.py:1588
+#: cps/admin.py:863 cps/web.py:1585
 msgid "This username is already taken"
 msgstr "Detta användarnamn är redan taget"
 
-#: cps/admin.py:871
+#: cps/admin.py:879
 #, python-format
 msgid "User '%(nick)s' updated"
 msgstr "Användaren '%(nick)s' uppdaterad"
 
-#: cps/admin.py:874
+#: cps/admin.py:882
 msgid "An unknown error occured."
 msgstr "Ett okänt fel uppstod."
 
-#: cps/admin.py:901 cps/templates/admin.html:71
+#: cps/admin.py:912 cps/templates/admin.html:71
 msgid "Edit E-mail Server Settings"
 msgstr "Ändra SMTP-inställningar"
 
-#: cps/admin.py:925
+#: cps/admin.py:941
 #, python-format
 msgid "Test e-mail successfully send to %(kindlemail)s"
 msgstr "Test-e-post skicka till %(kindlemail)s"
 
-#: cps/admin.py:928
+#: cps/admin.py:944
 #, python-format
 msgid "There was an error sending the Test e-mail: %(res)s"
 msgstr "Det gick inte att skicka Testmeddelandet: %(res)s"
 
-#: cps/admin.py:930
+#: cps/admin.py:946
 msgid "Please configure your e-mail address first..."
 msgstr "Vänligen konfigurera din e-postadress först..."
 
-#: cps/admin.py:932
+#: cps/admin.py:948
 msgid "E-mail server settings updated"
 msgstr "E-postserverinställningar uppdaterade"
 
-#: cps/admin.py:943
+#: cps/admin.py:959
 msgid "User not found"
 msgstr ""
 
-#: cps/admin.py:978
+#: cps/admin.py:994
 #, python-format
 msgid "Password for user %(user)s reset"
 msgstr "Lösenord för användaren %(user)s återställd"
 
-#: cps/admin.py:981 cps/web.py:1361 cps/web.py:1425
+#: cps/admin.py:997 cps/web.py:1358 cps/web.py:1422
 msgid "An unknown error occurred. Please try again later."
 msgstr "Ett okänt fel uppstod. Försök igen senare."
 
-#: cps/admin.py:984 cps/web.py:1299
+#: cps/admin.py:1000 cps/web.py:1296
 msgid "Please configure the SMTP mail settings first..."
 msgstr "Konfigurera SMTP-postinställningarna först..."
 
-#: cps/admin.py:996
+#: cps/admin.py:1012
 msgid "Logfile viewer"
 msgstr "Visaren för loggfil"
 
-#: cps/admin.py:1035
+#: cps/admin.py:1051
 msgid "Requesting update package"
 msgstr "Begär uppdateringspaketet"
 
-#: cps/admin.py:1036
+#: cps/admin.py:1052
 msgid "Downloading update package"
 msgstr "Hämtar uppdateringspaketet"
 
-#: cps/admin.py:1037
+#: cps/admin.py:1053
 msgid "Unzipping update package"
 msgstr "Packar upp uppdateringspaketet"
 
-#: cps/admin.py:1038
+#: cps/admin.py:1054
 msgid "Replacing files"
 msgstr "Ersätta filer"
 
-#: cps/admin.py:1039
+#: cps/admin.py:1055
 msgid "Database connections are closed"
 msgstr "Databasanslutningarna är stängda"
 
-#: cps/admin.py:1040
+#: cps/admin.py:1056
 msgid "Stopping server"
 msgstr "Stoppar server"
 
-#: cps/admin.py:1041
+#: cps/admin.py:1057
 msgid "Update finished, please press okay and reload page"
 msgstr "Uppdatering klar, tryck på okej och uppdatera sidan"
 
-#: cps/admin.py:1042 cps/admin.py:1043 cps/admin.py:1044 cps/admin.py:1045
-#: cps/admin.py:1046
+#: cps/admin.py:1058 cps/admin.py:1059 cps/admin.py:1060 cps/admin.py:1061
+#: cps/admin.py:1062
 msgid "Update failed:"
 msgstr "Uppdateringen misslyckades:"
 
-#: cps/admin.py:1042 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
+#: cps/admin.py:1058 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
 msgid "HTTP Error"
 msgstr "HTTP-fel"
 
-#: cps/admin.py:1043 cps/updater.py:321 cps/updater.py:524
+#: cps/admin.py:1059 cps/updater.py:321 cps/updater.py:524
 msgid "Connection error"
 msgstr "Anslutningsfel"
 
-#: cps/admin.py:1044 cps/updater.py:323 cps/updater.py:526
+#: cps/admin.py:1060 cps/updater.py:323 cps/updater.py:526
 msgid "Timeout while establishing connection"
 msgstr "Tiden ute när du etablerade anslutning"
 
-#: cps/admin.py:1045 cps/updater.py:325 cps/updater.py:528
+#: cps/admin.py:1061 cps/updater.py:325 cps/updater.py:528
 msgid "General error"
 msgstr "Allmänt fel"
 
-#: cps/admin.py:1046
+#: cps/admin.py:1062
 msgid "Update File Could Not be Saved in Temp Dir"
 msgstr ""
 
@@ -301,8 +307,8 @@ msgstr ""
 msgid "Book Successfully Deleted"
 msgstr ""
 
-#: cps/editbooks.py:254 cps/editbooks.py:548 cps/web.py:1644 cps/web.py:1685
-#: cps/web.py:1747
+#: cps/editbooks.py:254 cps/editbooks.py:549 cps/web.py:1641 cps/web.py:1682
+#: cps/web.py:1744
 msgid "Error opening eBook. File does not exist or file is not accessible"
 msgstr "Det gick inte att öppna e-boken. Filen finns inte eller filen är inte tillgänglig"
 
@@ -310,82 +316,82 @@ msgstr "Det gick inte att öppna e-boken. Filen finns inte eller filen är inte
 msgid "edit metadata"
 msgstr "redigera metadata"
 
-#: cps/editbooks.py:361
+#: cps/editbooks.py:360
 #, python-format
 msgid "%(langname)s is not a valid language"
 msgstr "%(langname)s är inte ett giltigt språk"
 
-#: cps/editbooks.py:467 cps/editbooks.py:712
+#: cps/editbooks.py:468 cps/editbooks.py:715
 #, python-format
 msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
 msgstr "Filändelsen '%(ext)s' får inte laddas upp till den här servern"
 
-#: cps/editbooks.py:471 cps/editbooks.py:716
+#: cps/editbooks.py:472 cps/editbooks.py:719
 msgid "File to be uploaded must have an extension"
 msgstr "Filen som ska laddas upp måste ha en ändelse"
 
-#: cps/editbooks.py:483 cps/editbooks.py:773
+#: cps/editbooks.py:484 cps/editbooks.py:779
 #, python-format
 msgid "Failed to create path %(path)s (Permission denied)."
 msgstr "Det gick inte att skapa sökväg %(path)s (behörighet nekad)."
 
-#: cps/editbooks.py:488
+#: cps/editbooks.py:489
 #, python-format
 msgid "Failed to store file %(file)s."
 msgstr "Det gick inte att lagra filen %(file)s."
 
-#: cps/editbooks.py:506 cps/editbooks.py:864
+#: cps/editbooks.py:507 cps/editbooks.py:870
 #, python-format
 msgid "Database error: %(error)s."
 msgstr ""
 
-#: cps/editbooks.py:510
+#: cps/editbooks.py:511
 #, python-format
 msgid "File format %(ext)s added to %(book)s"
 msgstr "Filformatet %(ext)s lades till %(book)s"
 
-#: cps/editbooks.py:653
+#: cps/editbooks.py:656
 msgid "Metadata successfully updated"
 msgstr "Metadata uppdaterades"
 
-#: cps/editbooks.py:662
+#: cps/editbooks.py:665
 msgid "Error editing book, please check logfile for details"
 msgstr "Det gick inte att redigera boken, kontrollera loggfilen för mer information"
 
-#: cps/editbooks.py:724
+#: cps/editbooks.py:727
 #, python-format
 msgid "File %(filename)s could not saved to temp dir"
 msgstr "Filen %(filename)s kunde inte sparas i temp dir"
 
-#: cps/editbooks.py:734
+#: cps/editbooks.py:737
 msgid "Uploaded book probably exists in the library, consider to change before upload new: "
 msgstr "Uppladdad bok finns förmodligen i biblioteket, överväg att ändra innan du laddar upp nya: "
 
-#: cps/editbooks.py:780
+#: cps/editbooks.py:786
 #, python-format
 msgid "Failed to Move File %(file)s: %(error)s"
 msgstr ""
 
-#: cps/editbooks.py:836
+#: cps/editbooks.py:842
 #, python-format
 msgid "Failed to Move Cover File %(file)s: %(error)s"
 msgstr ""
 
-#: cps/editbooks.py:850
+#: cps/editbooks.py:856
 #, python-format
 msgid "File %(file)s uploaded"
 msgstr "Filen %(file)s uppladdad"
 
-#: cps/editbooks.py:876
+#: cps/editbooks.py:882
 msgid "Source or destination format for conversion missing"
 msgstr "Källa eller målformat för konvertering saknas"
 
-#: cps/editbooks.py:884
+#: cps/editbooks.py:890
 #, python-format
 msgid "Book successfully queued for converting to %(book_format)s"
 msgstr "Boken är i kö för konvertering till %(book_format)s"
 
-#: cps/editbooks.py:888
+#: cps/editbooks.py:894
 #, python-format
 msgid "There was an error converting this book: %(res)s"
 msgstr "Det gick inte att konvertera den här boken: %(res)s"
@@ -499,71 +505,71 @@ msgstr "Filen %(file)s hittades inte på Google Drive"
 msgid "Book path %(path)s not found on Google Drive"
 msgstr "Boksökvägen %(path)s hittades inte på Google Drive"
 
-#: cps/helper.py:542
+#: cps/helper.py:550
 msgid "Error Downloading Cover"
 msgstr ""
 
-#: cps/helper.py:545
+#: cps/helper.py:553
 msgid "Cover Format Error"
 msgstr ""
 
-#: cps/helper.py:561
+#: cps/helper.py:569
 msgid "Failed to create path for cover"
 msgstr "Det gick inte att skapa sökväg för omslag"
 
-#: cps/helper.py:566
+#: cps/helper.py:574
 msgid "Cover-file is not a valid image file, or could not be stored"
 msgstr ""
 
-#: cps/helper.py:577
+#: cps/helper.py:585
 msgid "Only jpg/jpeg/png/webp files are supported as coverfile"
 msgstr "Endast jpg/jpeg/png/webp-filer stöds som omslagsfil"
 
-#: cps/helper.py:591
+#: cps/helper.py:599
 msgid "Only jpg/jpeg files are supported as coverfile"
 msgstr "Endast jpg/jpeg-filer stöds som omslagsfil"
 
-#: cps/helper.py:640
+#: cps/helper.py:648
 msgid "Unrar binary file not found"
 msgstr ""
 
-#: cps/helper.py:654
+#: cps/helper.py:662
 msgid "Error excecuting UnRar"
 msgstr ""
 
-#: cps/helper.py:710
+#: cps/helper.py:718
 msgid "Waiting"
 msgstr "Väntar"
 
-#: cps/helper.py:712
+#: cps/helper.py:720
 msgid "Failed"
 msgstr "Misslyckades"
 
-#: cps/helper.py:714
+#: cps/helper.py:722
 msgid "Started"
 msgstr "Startad"
 
-#: cps/helper.py:716
+#: cps/helper.py:724
 msgid "Finished"
 msgstr "Klar"
 
-#: cps/helper.py:718
+#: cps/helper.py:726
 msgid "Unknown Status"
 msgstr "Okänd status"
 
-#: cps/helper.py:723
+#: cps/helper.py:731
 msgid "E-mail: "
 msgstr "E-post: "
 
-#: cps/helper.py:725 cps/helper.py:729
+#: cps/helper.py:733 cps/helper.py:737
 msgid "Convert: "
 msgstr "Konvertera: "
 
-#: cps/helper.py:727
+#: cps/helper.py:735
 msgid "Upload: "
 msgstr "Överför: "
 
-#: cps/helper.py:731
+#: cps/helper.py:739
 msgid "Unknown Task: "
 msgstr "Okänd uppgift: "
 
@@ -596,7 +602,7 @@ msgstr "Det gick inte att logga in med Google."
 msgid "Failed to fetch user info from Google."
 msgstr "Det gick inte att hämta användarinformation från Google."
 
-#: cps/oauth_bb.py:225 cps/web.py:1397 cps/web.py:1537
+#: cps/oauth_bb.py:225 cps/web.py:1394 cps/web.py:1534
 #, python-format
 msgid "you are now logged in as: '%(nickname)s'"
 msgstr "du är nu inloggad som: \"%(nickname)s\""
@@ -633,218 +639,218 @@ msgstr "GitHub Oauth-fel, försök igen senare."
 msgid "Google Oauth error, please retry later."
 msgstr "Google Oauth-fel, försök igen senare."
 
-#: cps/shelf.py:66 cps/shelf.py:111
+#: cps/shelf.py:67 cps/shelf.py:120
 msgid "Invalid shelf specified"
 msgstr "Ogiltig hylla specificerad"
 
-#: cps/shelf.py:72
+#: cps/shelf.py:73
 #, python-format
 msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s"
 msgstr "Tyvärr får du inte lägga till en bok på hyllan: %(shelfname)s"
 
-#: cps/shelf.py:82
+#: cps/shelf.py:83
 #, python-format
 msgid "Book is already part of the shelf: %(shelfname)s"
 msgstr "Boken är redan en del av hyllan: %(shelfname)s"
 
-#: cps/shelf.py:97
+#: cps/shelf.py:106
 #, python-format
 msgid "Book has been added to shelf: %(sname)s"
 msgstr "Boken har lagts till i hyllan: %(sname)s"
 
-#: cps/shelf.py:115
+#: cps/shelf.py:124
 #, python-format
 msgid "You are not allowed to add a book to the the shelf: %(name)s"
 msgstr "Du får inte lägga till en bok i hyllan: %(name)s"
 
-#: cps/shelf.py:133
+#: cps/shelf.py:142
 #, python-format
 msgid "Books are already part of the shelf: %(name)s"
 msgstr "Böcker är redan en del av hyllan: %(name)s"
 
-#: cps/shelf.py:148
+#: cps/shelf.py:158
 #, python-format
 msgid "Books have been added to shelf: %(sname)s"
 msgstr "Böcker har lagts till hyllan: %(sname)s"
 
-#: cps/shelf.py:150
+#: cps/shelf.py:163
 #, python-format
 msgid "Could not add books to shelf: %(sname)s"
 msgstr "Kunde inte lägga till böcker till hyllan: %(sname)s"
 
-#: cps/shelf.py:188
+#: cps/shelf.py:208
 #, python-format
 msgid "Book has been removed from shelf: %(sname)s"
 msgstr "Boken har tagits bort från hyllan: %(sname)s"
 
-#: cps/shelf.py:196
+#: cps/shelf.py:216
 #, python-format
 msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
 msgstr "Tyvärr har du inte rätt att ta bort en bok från den här hyllan: %(sname)s"
 
-#: cps/shelf.py:220 cps/shelf.py:260
+#: cps/shelf.py:240 cps/shelf.py:284
 #, python-format
 msgid "A public shelf with the name '%(title)s' already exists."
 msgstr ""
 
-#: cps/shelf.py:229 cps/shelf.py:270
+#: cps/shelf.py:249 cps/shelf.py:294
 #, python-format
 msgid "A private shelf with the name '%(title)s' already exists."
 msgstr ""
 
-#: cps/shelf.py:236
+#: cps/shelf.py:256
 #, python-format
 msgid "Shelf %(title)s created"
 msgstr "Hyllan %(title)s skapad"
 
-#: cps/shelf.py:239 cps/shelf.py:284
+#: cps/shelf.py:263 cps/shelf.py:312
 msgid "There was an error"
 msgstr "Det fanns ett fel"
 
-#: cps/shelf.py:240 cps/shelf.py:242 cps/templates/layout.html:144
+#: cps/shelf.py:264 cps/shelf.py:266 cps/templates/layout.html:144
 msgid "Create a Shelf"
 msgstr "skapa en hylla"
 
-#: cps/shelf.py:282
+#: cps/shelf.py:306
 #, python-format
 msgid "Shelf %(title)s changed"
 msgstr "Hyllan %(title)s ändrad"
 
-#: cps/shelf.py:285 cps/shelf.py:287
+#: cps/shelf.py:313 cps/shelf.py:315
 msgid "Edit a shelf"
 msgstr "Redigera en hylla"
 
-#: cps/shelf.py:332
+#: cps/shelf.py:369
 #, python-format
 msgid "Shelf: '%(name)s'"
 msgstr "Hylla: '%(name)s'"
 
-#: cps/shelf.py:335
+#: cps/shelf.py:372
 msgid "Error opening shelf. Shelf does not exist or is not accessible"
 msgstr "Fel vid öppning av hyllan. Hylla finns inte eller är inte tillgänglig"
 
-#: cps/shelf.py:368
+#: cps/shelf.py:409
 msgid "Hidden Book"
 msgstr "Dold bok"
 
-#: cps/shelf.py:373
+#: cps/shelf.py:414
 #, python-format
 msgid "Change order of Shelf: '%(name)s'"
 msgstr "Ändra ordning på hyllan: '%(name)s'"
 
-#: cps/ub.py:64
+#: cps/ub.py:65
 msgid "Recently Added"
 msgstr "Nyligen tillagda"
 
-#: cps/ub.py:66
+#: cps/ub.py:67
 msgid "Show recent books"
 msgstr "Visa senaste böcker"
 
-#: cps/templates/index.xml:17 cps/ub.py:67
+#: cps/templates/index.xml:17 cps/ub.py:68
 msgid "Hot Books"
 msgstr "Heta böcker"
 
-#: cps/ub.py:69
+#: cps/ub.py:70
 msgid "Show Hot Books"
 msgstr "Visa heta böcker"
 
-#: cps/templates/index.xml:24 cps/ub.py:71 cps/web.py:655
+#: cps/templates/index.xml:24 cps/ub.py:72 cps/web.py:652
 msgid "Top Rated Books"
 msgstr "Bäst rankade böcker"
 
-#: cps/ub.py:73
+#: cps/ub.py:74
 msgid "Show Top Rated Books"
 msgstr "Visa böcker med bästa betyg"
 
-#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:74
-#: cps/web.py:1222
+#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:75
+#: cps/web.py:1219
 msgid "Read Books"
 msgstr "Lästa böcker"
 
-#: cps/ub.py:76
+#: cps/ub.py:77
 msgid "Show read and unread"
 msgstr "Visa lästa och olästa"
 
-#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:78
-#: cps/web.py:1225
+#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:79
+#: cps/web.py:1222
 msgid "Unread Books"
 msgstr "Olästa böcker"
 
-#: cps/ub.py:80
+#: cps/ub.py:81
 msgid "Show unread"
 msgstr "Visa olästa"
 
-#: cps/ub.py:81
+#: cps/ub.py:82
 msgid "Discover"
 msgstr "Upptäck"
 
-#: cps/ub.py:83
+#: cps/ub.py:84
 msgid "Show random books"
 msgstr "Visa slumpmässiga böcker"
 
-#: cps/templates/index.xml:75 cps/ub.py:84 cps/web.py:970
+#: cps/templates/index.xml:75 cps/ub.py:85 cps/web.py:967
 msgid "Categories"
 msgstr "Kategorier"
 
-#: cps/ub.py:86
+#: cps/ub.py:87
 msgid "Show category selection"
 msgstr "Visa kategorival"
 
 #: cps/templates/book_edit.html:84 cps/templates/index.xml:82
-#: cps/templates/search_form.html:53 cps/ub.py:87 cps/web.py:886 cps/web.py:896
+#: cps/templates/search_form.html:53 cps/ub.py:88 cps/web.py:883 cps/web.py:893
 msgid "Series"
 msgstr "Serier"
 
-#: cps/ub.py:89
+#: cps/ub.py:90
 msgid "Show series selection"
 msgstr "Visa serieval"
 
-#: cps/templates/index.xml:61 cps/ub.py:90
+#: cps/templates/index.xml:61 cps/ub.py:91
 msgid "Authors"
 msgstr "Författare"
 
-#: cps/ub.py:92
+#: cps/ub.py:93
 msgid "Show author selection"
 msgstr "Visa författarval"
 
-#: cps/templates/index.xml:68 cps/ub.py:94 cps/web.py:869
+#: cps/templates/index.xml:68 cps/ub.py:95 cps/web.py:866
 msgid "Publishers"
 msgstr "Förlag"
 
-#: cps/ub.py:96
+#: cps/ub.py:97
 msgid "Show publisher selection"
 msgstr "Visa urval av förlag"
 
-#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:97
-#: cps/web.py:953
+#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:98
+#: cps/web.py:950
 msgid "Languages"
 msgstr "Språk"
 
-#: cps/ub.py:100
+#: cps/ub.py:101
 msgid "Show language selection"
 msgstr "Visa språkval"
 
-#: cps/templates/index.xml:96 cps/ub.py:101
+#: cps/templates/index.xml:96 cps/ub.py:102
 msgid "Ratings"
 msgstr "Betyg"
 
-#: cps/ub.py:103
+#: cps/ub.py:104
 msgid "Show ratings selection"
 msgstr "Visa val av betyg"
 
-#: cps/templates/index.xml:104 cps/ub.py:104
+#: cps/templates/index.xml:104 cps/ub.py:105
 msgid "File formats"
 msgstr "Filformat"
 
-#: cps/ub.py:106
+#: cps/ub.py:107
 msgid "Show file formats selection"
 msgstr "Visa val av filformat"
 
-#: cps/ub.py:108 cps/web.py:1249
+#: cps/ub.py:109 cps/web.py:1246
 msgid "Archived Books"
 msgstr ""
 
-#: cps/ub.py:110
+#: cps/ub.py:111
 msgid "Show archived books"
 msgstr ""
 
@@ -877,220 +883,220 @@ msgstr "En ny uppdatering är tillgänglig. Klicka på knappen nedan för att up
 msgid "Click on the button below to update to the latest stable version."
 msgstr "Klicka på knappen nedan för att uppdatera till den senaste stabila versionen."
 
-#: cps/web.py:322
+#: cps/web.py:319
 #, python-format
 msgid "Error: %(ldaperror)s"
 msgstr ""
 
-#: cps/web.py:326
+#: cps/web.py:323
 msgid "Error: No user returned in response of LDAP server"
 msgstr ""
 
-#: cps/web.py:374
+#: cps/web.py:371
 msgid "Failed to Create at Least One LDAP User"
 msgstr ""
 
-#: cps/web.py:377
+#: cps/web.py:374
 msgid "At Least One LDAP User Not Found in Database"
 msgstr ""
 
-#: cps/web.py:379
+#: cps/web.py:376
 msgid "User Successfully Imported"
 msgstr ""
 
-#: cps/web.py:625
+#: cps/web.py:622
 msgid "Recently Added Books"
 msgstr "Nyligen tillagda böcker"
 
-#: cps/templates/index.html:5 cps/web.py:663
+#: cps/templates/index.html:5 cps/web.py:660
 msgid "Discover (Random Books)"
 msgstr "Upptäck (slumpmässiga böcker)"
 
-#: cps/web.py:691
+#: cps/web.py:688
 msgid "Books"
 msgstr "Böcker"
 
-#: cps/web.py:718
+#: cps/web.py:715
 msgid "Hot Books (Most Downloaded)"
 msgstr "Heta böcker (mest hämtade)"
 
-#: cps/web.py:731
+#: cps/web.py:728
 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible"
 msgstr "Hoppsan! Vald boktitel är inte tillgänglig. Filen finns inte eller är inte tillgänglig"
 
-#: cps/web.py:745
+#: cps/web.py:742
 #, python-format
 msgid "Author: %(name)s"
 msgstr "Författare: %(name)s"
 
-#: cps/web.py:759
+#: cps/web.py:756
 #, python-format
 msgid "Publisher: %(name)s"
 msgstr "Förlag: %(name)s"
 
-#: cps/web.py:772
+#: cps/web.py:769
 #, python-format
 msgid "Series: %(serie)s"
 msgstr "Serier: %(serie)s"
 
-#: cps/web.py:785
+#: cps/web.py:782
 #, python-format
 msgid "Rating: %(rating)s stars"
 msgstr "Betyg: %(rating)s stars"
 
-#: cps/web.py:798
+#: cps/web.py:795
 #, python-format
 msgid "File format: %(format)s"
 msgstr "Filformat: %(format)s"
 
-#: cps/web.py:812
+#: cps/web.py:809
 #, python-format
 msgid "Category: %(name)s"
 msgstr "Kategori: %(name)s"
 
-#: cps/web.py:831
+#: cps/web.py:828
 #, python-format
 msgid "Language: %(name)s"
 msgstr "Språk: %(name)s"
 
-#: cps/web.py:910
+#: cps/web.py:907
 msgid "Ratings list"
 msgstr "Betygslista"
 
-#: cps/web.py:925
+#: cps/web.py:922
 msgid "File formats list"
 msgstr "Lista över filformat"
 
-#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:984
+#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:981
 msgid "Tasks"
 msgstr "Uppgifter"
 
 #: cps/templates/book_edit.html:235 cps/templates/feed.xml:33
 #: cps/templates/layout.html:45 cps/templates/layout.html:48
-#: cps/templates/search_form.html:174 cps/web.py:1010 cps/web.py:1015
+#: cps/templates/search_form.html:174 cps/web.py:1007 cps/web.py:1012
 msgid "Search"
 msgstr "Sök"
 
-#: cps/web.py:1066
+#: cps/web.py:1063
 msgid "Published after "
 msgstr "Publicerad efter "
 
-#: cps/web.py:1073
+#: cps/web.py:1070
 msgid "Published before "
 msgstr "Publicerad före "
 
-#: cps/web.py:1087
+#: cps/web.py:1084
 #, python-format
 msgid "Rating <= %(rating)s"
 msgstr "Betyg <= %(rating)s"
 
-#: cps/web.py:1089
+#: cps/web.py:1086
 #, python-format
 msgid "Rating >= %(rating)s"
 msgstr "Betyg >= %(rating)s"
 
-#: cps/web.py:1158 cps/web.py:1183
+#: cps/web.py:1155 cps/web.py:1180
 msgid "search"
 msgstr "sök"
 
-#: cps/web.py:1213
+#: cps/web.py:1210
 #, python-format
 msgid "Custom Column No.%(column)d is not existing in calibre database"
 msgstr ""
 
-#: cps/web.py:1304
+#: cps/web.py:1301
 #, python-format
 msgid "Book successfully queued for sending to %(kindlemail)s"
 msgstr "Boken är i kö för att skicka till %(kindlemail)s"
 
-#: cps/web.py:1308
+#: cps/web.py:1305
 #, python-format
 msgid "Oops! There was an error sending this book: %(res)s"
 msgstr "Det gick inte att skicka den här boken: %(res)s"
 
-#: cps/web.py:1310
+#: cps/web.py:1307
 msgid "Please update your profile with a valid Send to Kindle E-mail Address."
 msgstr "Konfigurera din kindle-e-postadress först..."
 
-#: cps/web.py:1327
+#: cps/web.py:1324
 msgid "E-Mail server is not configured, please contact your administrator!"
 msgstr "E-postservern är inte konfigurerad, kontakta din administratör!"
 
-#: cps/web.py:1328 cps/web.py:1338 cps/web.py:1362 cps/web.py:1366
-#: cps/web.py:1371 cps/web.py:1375
+#: cps/web.py:1325 cps/web.py:1335 cps/web.py:1359 cps/web.py:1363
+#: cps/web.py:1368 cps/web.py:1372
 msgid "register"
 msgstr "registrera"
 
-#: cps/web.py:1364
+#: cps/web.py:1361
 msgid "Your e-mail is not allowed to register"
 msgstr "Din e-post är inte tillåten att registrera"
 
-#: cps/web.py:1367
+#: cps/web.py:1364
 msgid "Confirmation e-mail was send to your e-mail account."
 msgstr "Bekräftelsemail skickades till ditt e-postkonto."
 
-#: cps/web.py:1370
+#: cps/web.py:1367
 msgid "This username or e-mail address is already in use."
 msgstr "Det här användarnamnet eller e-postadressen är redan i bruk."
 
-#: cps/web.py:1387
+#: cps/web.py:1384
 msgid "Cannot activate LDAP authentication"
 msgstr "Det går inte att aktivera LDAP-autentisering"
 
-#: cps/web.py:1404
+#: cps/web.py:1401
 #, python-format
 msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known"
 msgstr ""
 
-#: cps/web.py:1410
+#: cps/web.py:1407
 #, python-format
 msgid "Could not login: %(message)s"
 msgstr ""
 
-#: cps/web.py:1414 cps/web.py:1438
+#: cps/web.py:1411 cps/web.py:1435
 msgid "Wrong Username or Password"
 msgstr "Fel användarnamn eller lösenord"
 
-#: cps/web.py:1421
+#: cps/web.py:1418
 msgid "New Password was send to your email address"
 msgstr "Nytt lösenord skickades till din e-postadress"
 
-#: cps/web.py:1427
+#: cps/web.py:1424
 msgid "Please enter valid username to reset password"
 msgstr "Ange giltigt användarnamn för att återställa lösenordet"
 
-#: cps/web.py:1433
+#: cps/web.py:1430
 #, python-format
 msgid "You are now logged in as: '%(nickname)s'"
 msgstr "Du är nu inloggad som: \"%(nickname)s\""
 
-#: cps/web.py:1442 cps/web.py:1469
+#: cps/web.py:1439 cps/web.py:1466
 msgid "login"
 msgstr "logga in"
 
-#: cps/web.py:1481 cps/web.py:1515
+#: cps/web.py:1478 cps/web.py:1512
 msgid "Token not found"
 msgstr "Token hittades inte"
 
-#: cps/web.py:1490 cps/web.py:1523
+#: cps/web.py:1487 cps/web.py:1520
 msgid "Token has expired"
 msgstr "Token har löpt ut"
 
-#: cps/web.py:1499
+#: cps/web.py:1496
 msgid "Success! Please return to your device"
 msgstr "Lyckades! Vänligen återvänd till din enhet"
 
-#: cps/web.py:1580 cps/web.py:1625 cps/web.py:1631
+#: cps/web.py:1577 cps/web.py:1622 cps/web.py:1628
 #, python-format
 msgid "%(name)s's profile"
 msgstr "%(name)ss profil"
 
-#: cps/web.py:1627
+#: cps/web.py:1624
 msgid "Profile updated"
 msgstr "Profilen uppdaterad"
 
-#: cps/web.py:1656 cps/web.py:1659 cps/web.py:1662 cps/web.py:1669
-#: cps/web.py:1674
+#: cps/web.py:1653 cps/web.py:1656 cps/web.py:1659 cps/web.py:1666
+#: cps/web.py:1671
 msgid "Read a Book"
 msgstr "Läs en bok"
 
diff --git a/cps/translations/tr/LC_MESSAGES/messages.mo b/cps/translations/tr/LC_MESSAGES/messages.mo
index b097b46ba2deafcd522bb8e6e719877d0af8b876..433bf447275f26db472f3f4f1a887d55861a153e 100644
Binary files a/cps/translations/tr/LC_MESSAGES/messages.mo and b/cps/translations/tr/LC_MESSAGES/messages.mo differ
diff --git a/cps/translations/tr/LC_MESSAGES/messages.po b/cps/translations/tr/LC_MESSAGES/messages.po
index a5c068111930be6713c64b44cba2c92b190c71a7..b6ee89065beaa1746af321a8a6dff964c345ac91 100644
--- a/cps/translations/tr/LC_MESSAGES/messages.po
+++ b/cps/translations/tr/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version:  Calibre-Web\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-06-07 06:47+0200\n"
+"POT-Creation-Date: 2020-06-28 09:31+0200\n"
 "PO-Revision-Date: 2020-04-23 22:47+0300\n"
 "Last-Translator: iz <iz7iz7iz@protonmail.ch>\n"
 "Language: tr\n"
@@ -46,9 +46,9 @@ msgstr ""
 msgid "Unknown command"
 msgstr ""
 
-#: cps/admin.py:116 cps/editbooks.py:563 cps/editbooks.py:573
-#: cps/editbooks.py:667 cps/editbooks.py:669 cps/editbooks.py:730
-#: cps/editbooks.py:743 cps/updater.py:509 cps/uploader.py:97
+#: cps/admin.py:116 cps/editbooks.py:564 cps/editbooks.py:576
+#: cps/editbooks.py:670 cps/editbooks.py:672 cps/editbooks.py:733
+#: cps/editbooks.py:749 cps/updater.py:509 cps/uploader.py:97
 #: cps/uploader.py:107
 msgid "Unknown"
 msgstr "Bilinmeyen"
@@ -61,7 +61,7 @@ msgstr "Yönetim sayfası"
 msgid "UI Configuration"
 msgstr "Arayüz Ayarları"
 
-#: cps/admin.py:189 cps/admin.py:706
+#: cps/admin.py:189 cps/admin.py:711
 msgid "Calibre-Web configuration updated"
 msgstr "Calibre-Web yapılandırması güncellendi"
 
@@ -113,175 +113,181 @@ msgstr ""
 msgid "LDAP Certificate Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:627
+#: cps/admin.py:628
 msgid "Keyfile Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:631
+#: cps/admin.py:632
 msgid "Certfile Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:701
+#: cps/admin.py:694 cps/admin.py:793 cps/admin.py:885 cps/admin.py:934
+#: cps/shelf.py:100 cps/shelf.py:161 cps/shelf.py:202 cps/shelf.py:260
+#: cps/shelf.py:309 cps/shelf.py:338 cps/shelf.py:368 cps/shelf.py:392
+msgid "Settings DB is not Writeable"
+msgstr ""
+
+#: cps/admin.py:706
 msgid "DB Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:703
+#: cps/admin.py:708
 msgid "DB is not Writeable"
 msgstr ""
 
-#: cps/admin.py:736
+#: cps/admin.py:741
 msgid "Basic Configuration"
 msgstr "Temel Ayarlar"
 
-#: cps/admin.py:751 cps/web.py:1337
+#: cps/admin.py:756 cps/web.py:1334
 msgid "Please fill out all fields!"
 msgstr "Lütfen tüm alanları doldurun!"
 
-#: cps/admin.py:754 cps/admin.py:766 cps/admin.py:772 cps/admin.py:892
+#: cps/admin.py:759 cps/admin.py:771 cps/admin.py:777 cps/admin.py:903
 msgid "Add new user"
 msgstr "Yeni kullanıcı ekle"
 
-#: cps/admin.py:763 cps/web.py:1578
+#: cps/admin.py:768 cps/web.py:1575
 msgid "E-mail is not from valid domain"
 msgstr "E-posta izin verilen bir servisten deÄŸil"
 
-#: cps/admin.py:770 cps/admin.py:785
+#: cps/admin.py:775 cps/admin.py:790
 msgid "Found an existing account for this e-mail address or nickname."
 msgstr "Bu e-posta adresi veya kullanıcı adı için zaten bir hesap var."
 
-#: cps/admin.py:781
+#: cps/admin.py:786
 #, python-format
 msgid "User '%(user)s' created"
 msgstr "'%(user)s' kullanıcısı oluşturuldu"
 
-#: cps/admin.py:794
+#: cps/admin.py:802
 #, python-format
 msgid "User '%(nick)s' deleted"
 msgstr "Kullanıcı '%(nick)s' silindi"
 
-#: cps/admin.py:797
+#: cps/admin.py:805
 msgid "No admin user remaining, can't delete user"
 msgstr "Başka yönetici kullanıcı olmadığından silinemedi"
 
-#: cps/admin.py:803
+#: cps/admin.py:811
 msgid "No admin user remaining, can't remove admin role"
 msgstr ""
 
-#: cps/admin.py:839 cps/web.py:1621
+#: cps/admin.py:847 cps/web.py:1618
 msgid "Found an existing account for this e-mail address."
 msgstr "Bu e-posta adresi için bir hesap mevcut."
 
-#: cps/admin.py:849 cps/admin.py:864 cps/admin.py:967 cps/web.py:1596
+#: cps/admin.py:857 cps/admin.py:872 cps/admin.py:983 cps/web.py:1593
 #, python-format
 msgid "Edit User %(nick)s"
 msgstr "%(nick)s kullanıcısını düzenle"
 
-#: cps/admin.py:855 cps/web.py:1588
+#: cps/admin.py:863 cps/web.py:1585
 msgid "This username is already taken"
 msgstr "Bu kullanıcı adı zaten alındı"
 
-#: cps/admin.py:871
+#: cps/admin.py:879
 #, python-format
 msgid "User '%(nick)s' updated"
 msgstr "'%(nick)s' kullanıcısı güncellendi"
 
-#: cps/admin.py:874
+#: cps/admin.py:882
 msgid "An unknown error occured."
 msgstr "Bilinmeyen bir hata oluÅŸtu."
 
-#: cps/admin.py:901 cps/templates/admin.html:71
+#: cps/admin.py:912 cps/templates/admin.html:71
 msgid "Edit E-mail Server Settings"
 msgstr ""
 
-#: cps/admin.py:925
+#: cps/admin.py:941
 #, python-format
 msgid "Test e-mail successfully send to %(kindlemail)s"
 msgstr "Deneme e-postası başarıyla %(kindlemail)s adresine gönderildi"
 
-#: cps/admin.py:928
+#: cps/admin.py:944
 #, python-format
 msgid "There was an error sending the Test e-mail: %(res)s"
 msgstr "Deneme e-postası gönderilirken bir hata oluştu: %(res)s"
 
-#: cps/admin.py:930
+#: cps/admin.py:946
 msgid "Please configure your e-mail address first..."
 msgstr "Lütfen önce e-posta adresinizi ayarlayın..."
 
-#: cps/admin.py:932
+#: cps/admin.py:948
 msgid "E-mail server settings updated"
 msgstr "E-posta sunucusu ayarları güncellendi"
 
-#: cps/admin.py:943
+#: cps/admin.py:959
 msgid "User not found"
 msgstr ""
 
-#: cps/admin.py:978
+#: cps/admin.py:994
 #, python-format
 msgid "Password for user %(user)s reset"
 msgstr "%(user)s kullanıcısının şifresi sıfırlandı"
 
-#: cps/admin.py:981 cps/web.py:1361 cps/web.py:1425
+#: cps/admin.py:997 cps/web.py:1358 cps/web.py:1422
 msgid "An unknown error occurred. Please try again later."
 msgstr "Bilinmeyen bir hata oluştu. Lütfen daha sonra tekrar deneyiniz."
 
-#: cps/admin.py:984 cps/web.py:1299
+#: cps/admin.py:1000 cps/web.py:1296
 msgid "Please configure the SMTP mail settings first..."
 msgstr "Lütfen önce SMTP e-posta ayarlarını ayarlayın..."
 
-#: cps/admin.py:996
+#: cps/admin.py:1012
 msgid "Logfile viewer"
 msgstr "Log dosyası görüntüleyici"
 
-#: cps/admin.py:1035
+#: cps/admin.py:1051
 msgid "Requesting update package"
 msgstr "Güncelleme paketi isteniyor"
 
-#: cps/admin.py:1036
+#: cps/admin.py:1052
 msgid "Downloading update package"
 msgstr "Güncelleme paketi indiriliyor"
 
-#: cps/admin.py:1037
+#: cps/admin.py:1053
 msgid "Unzipping update package"
 msgstr "Güncelleme paketi ayıklanıyor"
 
-#: cps/admin.py:1038
+#: cps/admin.py:1054
 msgid "Replacing files"
 msgstr "Dosyalar deÄŸiÅŸtiriliyor"
 
-#: cps/admin.py:1039
+#: cps/admin.py:1055
 msgid "Database connections are closed"
 msgstr "Veritabanı bağlantıları kapalı"
 
-#: cps/admin.py:1040
+#: cps/admin.py:1056
 msgid "Stopping server"
 msgstr "Sunucu durduruyor"
 
-#: cps/admin.py:1041
+#: cps/admin.py:1057
 msgid "Update finished, please press okay and reload page"
 msgstr "Güncelleme tamamlandı, sayfayı yenilemek için lütfen Tamam'a tıklayınız"
 
-#: cps/admin.py:1042 cps/admin.py:1043 cps/admin.py:1044 cps/admin.py:1045
-#: cps/admin.py:1046
+#: cps/admin.py:1058 cps/admin.py:1059 cps/admin.py:1060 cps/admin.py:1061
+#: cps/admin.py:1062
 msgid "Update failed:"
 msgstr "Güncelleme başarısız:"
 
-#: cps/admin.py:1042 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
+#: cps/admin.py:1058 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
 msgid "HTTP Error"
 msgstr "HTTP Hatası"
 
-#: cps/admin.py:1043 cps/updater.py:321 cps/updater.py:524
+#: cps/admin.py:1059 cps/updater.py:321 cps/updater.py:524
 msgid "Connection error"
 msgstr "Bağlantı hatası"
 
-#: cps/admin.py:1044 cps/updater.py:323 cps/updater.py:526
+#: cps/admin.py:1060 cps/updater.py:323 cps/updater.py:526
 msgid "Timeout while establishing connection"
 msgstr "Bağlantı kurulmaya çalışırken zaman aşımına uğradı"
 
-#: cps/admin.py:1045 cps/updater.py:325 cps/updater.py:528
+#: cps/admin.py:1061 cps/updater.py:325 cps/updater.py:528
 msgid "General error"
 msgstr "Genel hata"
 
-#: cps/admin.py:1046
+#: cps/admin.py:1062
 msgid "Update File Could Not be Saved in Temp Dir"
 msgstr ""
 
@@ -301,8 +307,8 @@ msgstr ""
 msgid "Book Successfully Deleted"
 msgstr ""
 
-#: cps/editbooks.py:254 cps/editbooks.py:548 cps/web.py:1644 cps/web.py:1685
-#: cps/web.py:1747
+#: cps/editbooks.py:254 cps/editbooks.py:549 cps/web.py:1641 cps/web.py:1682
+#: cps/web.py:1744
 msgid "Error opening eBook. File does not exist or file is not accessible"
 msgstr "eKitap açılırken hata oluştu. Dosya mevcut değil veya erişilemiyor"
 
@@ -310,82 +316,82 @@ msgstr "eKitap açılırken hata oluştu. Dosya mevcut değil veya erişilemiyor
 msgid "edit metadata"
 msgstr "metaveri düzenle"
 
-#: cps/editbooks.py:361
+#: cps/editbooks.py:360
 #, python-format
 msgid "%(langname)s is not a valid language"
 msgstr "%(langname)s geçerli bir dil değil"
 
-#: cps/editbooks.py:467 cps/editbooks.py:712
+#: cps/editbooks.py:468 cps/editbooks.py:715
 #, python-format
 msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
 msgstr "'%(ext)s' uzantılı dosyaların bu sunucuya yüklenmesine izin verilmiyor"
 
-#: cps/editbooks.py:471 cps/editbooks.py:716
+#: cps/editbooks.py:472 cps/editbooks.py:719
 msgid "File to be uploaded must have an extension"
 msgstr "Yüklenecek dosyanın mutlaka bir uzantısı olması gerekli"
 
-#: cps/editbooks.py:483 cps/editbooks.py:773
+#: cps/editbooks.py:484 cps/editbooks.py:779
 #, python-format
 msgid "Failed to create path %(path)s (Permission denied)."
 msgstr "%(path)s dizini oluşturulamadı. (İzin reddedildi)"
 
-#: cps/editbooks.py:488
+#: cps/editbooks.py:489
 #, python-format
 msgid "Failed to store file %(file)s."
 msgstr "%(file)s dosyası kaydedilemedi."
 
-#: cps/editbooks.py:506 cps/editbooks.py:864
+#: cps/editbooks.py:507 cps/editbooks.py:870
 #, python-format
 msgid "Database error: %(error)s."
 msgstr ""
 
-#: cps/editbooks.py:510
+#: cps/editbooks.py:511
 #, python-format
 msgid "File format %(ext)s added to %(book)s"
 msgstr "%(book)s kitabına %(ext)s dosya biçimi eklendi"
 
-#: cps/editbooks.py:653
+#: cps/editbooks.py:656
 msgid "Metadata successfully updated"
 msgstr "Metaveri başarıyla güncellendi"
 
-#: cps/editbooks.py:662
+#: cps/editbooks.py:665
 msgid "Error editing book, please check logfile for details"
 msgstr "eKitap düzenlenirken hata oluştu, detaylar için lütfen log dosyasını kontrol edin"
 
-#: cps/editbooks.py:724
+#: cps/editbooks.py:727
 #, python-format
 msgid "File %(filename)s could not saved to temp dir"
 msgstr "%(filename)s dosyası geçici dizine kaydedilemedi"
 
-#: cps/editbooks.py:734
+#: cps/editbooks.py:737
 msgid "Uploaded book probably exists in the library, consider to change before upload new: "
 msgstr "Yüklenen eKitap muhtemelen kitaplıkta zaten var. Yenisini yüklemeden değiştirmeyi düşünün: "
 
-#: cps/editbooks.py:780
+#: cps/editbooks.py:786
 #, python-format
 msgid "Failed to Move File %(file)s: %(error)s"
 msgstr ""
 
-#: cps/editbooks.py:836
+#: cps/editbooks.py:842
 #, python-format
 msgid "Failed to Move Cover File %(file)s: %(error)s"
 msgstr ""
 
-#: cps/editbooks.py:850
+#: cps/editbooks.py:856
 #, python-format
 msgid "File %(file)s uploaded"
 msgstr "%(file)s dosyası yüklendi"
 
-#: cps/editbooks.py:876
+#: cps/editbooks.py:882
 msgid "Source or destination format for conversion missing"
 msgstr "Dönüştürme için kaynak ya da hedef biçimi eksik"
 
-#: cps/editbooks.py:884
+#: cps/editbooks.py:890
 #, python-format
 msgid "Book successfully queued for converting to %(book_format)s"
 msgstr "eKitap %(book_format)s formatlarına dönüştürülmek üzere başarıyla sıraya alındı"
 
-#: cps/editbooks.py:888
+#: cps/editbooks.py:894
 #, python-format
 msgid "There was an error converting this book: %(res)s"
 msgstr "Bu eKitabı dönüştürürken bir hata oluştu: %(res)s"
@@ -499,71 +505,71 @@ msgstr "%(file)s dosyası Google Drive'da bulunamadı"
 msgid "Book path %(path)s not found on Google Drive"
 msgstr "eKitap yolu %(path)s Google Drive'da bulunamadı"
 
-#: cps/helper.py:542
+#: cps/helper.py:550
 msgid "Error Downloading Cover"
 msgstr ""
 
-#: cps/helper.py:545
+#: cps/helper.py:553
 msgid "Cover Format Error"
 msgstr ""
 
-#: cps/helper.py:561
+#: cps/helper.py:569
 msgid "Failed to create path for cover"
 msgstr ""
 
-#: cps/helper.py:566
+#: cps/helper.py:574
 msgid "Cover-file is not a valid image file, or could not be stored"
 msgstr ""
 
-#: cps/helper.py:577
+#: cps/helper.py:585
 msgid "Only jpg/jpeg/png/webp files are supported as coverfile"
 msgstr ""
 
-#: cps/helper.py:591
+#: cps/helper.py:599
 msgid "Only jpg/jpeg files are supported as coverfile"
 msgstr ""
 
-#: cps/helper.py:640
+#: cps/helper.py:648
 msgid "Unrar binary file not found"
 msgstr ""
 
-#: cps/helper.py:654
+#: cps/helper.py:662
 msgid "Error excecuting UnRar"
 msgstr ""
 
-#: cps/helper.py:710
+#: cps/helper.py:718
 msgid "Waiting"
 msgstr "Bekleniyor"
 
-#: cps/helper.py:712
+#: cps/helper.py:720
 msgid "Failed"
 msgstr "Başarısız"
 
-#: cps/helper.py:714
+#: cps/helper.py:722
 msgid "Started"
 msgstr "Başladı"
 
-#: cps/helper.py:716
+#: cps/helper.py:724
 msgid "Finished"
 msgstr "Bitti"
 
-#: cps/helper.py:718
+#: cps/helper.py:726
 msgid "Unknown Status"
 msgstr "Bilinmeyen Durum"
 
-#: cps/helper.py:723
+#: cps/helper.py:731
 msgid "E-mail: "
 msgstr "e-Posta: "
 
-#: cps/helper.py:725 cps/helper.py:729
+#: cps/helper.py:733 cps/helper.py:737
 msgid "Convert: "
 msgstr "Dönüştür: "
 
-#: cps/helper.py:727
+#: cps/helper.py:735
 msgid "Upload: "
 msgstr "Yükle: "
 
-#: cps/helper.py:731
+#: cps/helper.py:739
 msgid "Unknown Task: "
 msgstr "Bilinmeyen Görev: "
 
@@ -596,7 +602,7 @@ msgstr "Google ile giriş yapılamadı."
 msgid "Failed to fetch user info from Google."
 msgstr "Google'dan kullanıcı bilgileri alınamadı."
 
-#: cps/oauth_bb.py:225 cps/web.py:1397 cps/web.py:1537
+#: cps/oauth_bb.py:225 cps/web.py:1394 cps/web.py:1534
 #, python-format
 msgid "you are now logged in as: '%(nickname)s'"
 msgstr "giriş yaptınız: '%(nickname)s'"
@@ -633,218 +639,218 @@ msgstr "GitHub Oauth hatası, lütfen tekrar deneyin."
 msgid "Google Oauth error, please retry later."
 msgstr "Google Oauth hatası, lütfen tekrar deneyin."
 
-#: cps/shelf.py:66 cps/shelf.py:111
+#: cps/shelf.py:67 cps/shelf.py:120
 msgid "Invalid shelf specified"
 msgstr "Geçersiz kitaplık seçildi"
 
-#: cps/shelf.py:72
+#: cps/shelf.py:73
 #, python-format
 msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s"
 msgstr "Maalesef bu kitaplığa eKitap eklemenize izin verilmiyor: %(shelfname)s"
 
-#: cps/shelf.py:82
+#: cps/shelf.py:83
 #, python-format
 msgid "Book is already part of the shelf: %(shelfname)s"
 msgstr "eKitap zaten bu kitaplıkta bulunuyor: %(shelfname)s"
 
-#: cps/shelf.py:97
+#: cps/shelf.py:106
 #, python-format
 msgid "Book has been added to shelf: %(sname)s"
 msgstr "eKitap kitaplığa eklendi: %(sname)s"
 
-#: cps/shelf.py:115
+#: cps/shelf.py:124
 #, python-format
 msgid "You are not allowed to add a book to the the shelf: %(name)s"
 msgstr "Bu kitaplığa eKitap eklemenize izin verilmiyor: %(name)s"
 
-#: cps/shelf.py:133
+#: cps/shelf.py:142
 #, python-format
 msgid "Books are already part of the shelf: %(name)s"
 msgstr "eKitaplar zaten bu kitaplıkta bulunuyor: %(name)s"
 
-#: cps/shelf.py:148
+#: cps/shelf.py:158
 #, python-format
 msgid "Books have been added to shelf: %(sname)s"
 msgstr "eKitaplar kitaplığa eklendi: %(sname)s"
 
-#: cps/shelf.py:150
+#: cps/shelf.py:163
 #, python-format
 msgid "Could not add books to shelf: %(sname)s"
 msgstr "eKitaplar kitaplığa eklenemedi: %(sname)s"
 
-#: cps/shelf.py:188
+#: cps/shelf.py:208
 #, python-format
 msgid "Book has been removed from shelf: %(sname)s"
 msgstr "eKitap kitaplıktan silindi: %(sname)s"
 
-#: cps/shelf.py:196
+#: cps/shelf.py:216
 #, python-format
 msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
 msgstr "Maalesef bu kitaplıktan eKitap silmenize izin verilmiyor: %(sname)s"
 
-#: cps/shelf.py:220 cps/shelf.py:260
+#: cps/shelf.py:240 cps/shelf.py:284
 #, python-format
 msgid "A public shelf with the name '%(title)s' already exists."
 msgstr ""
 
-#: cps/shelf.py:229 cps/shelf.py:270
+#: cps/shelf.py:249 cps/shelf.py:294
 #, python-format
 msgid "A private shelf with the name '%(title)s' already exists."
 msgstr ""
 
-#: cps/shelf.py:236
+#: cps/shelf.py:256
 #, python-format
 msgid "Shelf %(title)s created"
 msgstr "%(title)s kitaplığı oluşturuldu."
 
-#: cps/shelf.py:239 cps/shelf.py:284
+#: cps/shelf.py:263 cps/shelf.py:312
 msgid "There was an error"
 msgstr "Bir hata oluÅŸtu"
 
-#: cps/shelf.py:240 cps/shelf.py:242 cps/templates/layout.html:144
+#: cps/shelf.py:264 cps/shelf.py:266 cps/templates/layout.html:144
 msgid "Create a Shelf"
 msgstr "Kitaplık oluştur"
 
-#: cps/shelf.py:282
+#: cps/shelf.py:306
 #, python-format
 msgid "Shelf %(title)s changed"
 msgstr "%(title)s kitaplığı değiştirildi"
 
-#: cps/shelf.py:285 cps/shelf.py:287
+#: cps/shelf.py:313 cps/shelf.py:315
 msgid "Edit a shelf"
 msgstr "Kitaplığı düzenle"
 
-#: cps/shelf.py:332
+#: cps/shelf.py:369
 #, python-format
 msgid "Shelf: '%(name)s'"
 msgstr "Kitaplık: '%(name)s'"
 
-#: cps/shelf.py:335
+#: cps/shelf.py:372
 msgid "Error opening shelf. Shelf does not exist or is not accessible"
 msgstr "Kitaplık açılırken hata oluştu. Kitaplık mevcut değil ya da erişilebilir değil"
 
-#: cps/shelf.py:368
+#: cps/shelf.py:409
 msgid "Hidden Book"
 msgstr ""
 
-#: cps/shelf.py:373
+#: cps/shelf.py:414
 #, python-format
 msgid "Change order of Shelf: '%(name)s'"
 msgstr "Kitaplık sıralamasını değiştir: '%(name)s'"
 
-#: cps/ub.py:64
+#: cps/ub.py:65
 msgid "Recently Added"
 msgstr "Yeni"
 
-#: cps/ub.py:66
+#: cps/ub.py:67
 msgid "Show recent books"
 msgstr "Son eKitapları göster"
 
-#: cps/templates/index.xml:17 cps/ub.py:67
+#: cps/templates/index.xml:17 cps/ub.py:68
 msgid "Hot Books"
 msgstr "Popüler"
 
-#: cps/ub.py:69
+#: cps/ub.py:70
 msgid "Show Hot Books"
 msgstr ""
 
-#: cps/templates/index.xml:24 cps/ub.py:71 cps/web.py:655
+#: cps/templates/index.xml:24 cps/ub.py:72 cps/web.py:652
 msgid "Top Rated Books"
 msgstr ""
 
-#: cps/ub.py:73
+#: cps/ub.py:74
 msgid "Show Top Rated Books"
 msgstr ""
 
-#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:74
-#: cps/web.py:1222
+#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:75
+#: cps/web.py:1219
 msgid "Read Books"
 msgstr "Okunanlar"
 
-#: cps/ub.py:76
+#: cps/ub.py:77
 msgid "Show read and unread"
 msgstr "Okunan ve okunmayanları göster"
 
-#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:78
-#: cps/web.py:1225
+#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:79
+#: cps/web.py:1222
 msgid "Unread Books"
 msgstr "Okunmamışlar"
 
-#: cps/ub.py:80
+#: cps/ub.py:81
 msgid "Show unread"
 msgstr "Okunmamışları göster"
 
-#: cps/ub.py:81
+#: cps/ub.py:82
 msgid "Discover"
 msgstr "KeÅŸfet"
 
-#: cps/ub.py:83
+#: cps/ub.py:84
 msgid "Show random books"
 msgstr "Rastgele eKitap göster"
 
-#: cps/templates/index.xml:75 cps/ub.py:84 cps/web.py:970
+#: cps/templates/index.xml:75 cps/ub.py:85 cps/web.py:967
 msgid "Categories"
 msgstr "Kategoriler"
 
-#: cps/ub.py:86
+#: cps/ub.py:87
 msgid "Show category selection"
 msgstr "Kategori seçimini göster"
 
 #: cps/templates/book_edit.html:84 cps/templates/index.xml:82
-#: cps/templates/search_form.html:53 cps/ub.py:87 cps/web.py:886 cps/web.py:896
+#: cps/templates/search_form.html:53 cps/ub.py:88 cps/web.py:883 cps/web.py:893
 msgid "Series"
 msgstr "Seriler"
 
-#: cps/ub.py:89
+#: cps/ub.py:90
 msgid "Show series selection"
 msgstr "Seri seçimini göster"
 
-#: cps/templates/index.xml:61 cps/ub.py:90
+#: cps/templates/index.xml:61 cps/ub.py:91
 msgid "Authors"
 msgstr "Yazarlar"
 
-#: cps/ub.py:92
+#: cps/ub.py:93
 msgid "Show author selection"
 msgstr "Yazar seçimini göster"
 
-#: cps/templates/index.xml:68 cps/ub.py:94 cps/web.py:869
+#: cps/templates/index.xml:68 cps/ub.py:95 cps/web.py:866
 msgid "Publishers"
 msgstr "Yayıncılar"
 
-#: cps/ub.py:96
+#: cps/ub.py:97
 msgid "Show publisher selection"
 msgstr "Yayıncı seçimini göster"
 
-#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:97
-#: cps/web.py:953
+#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:98
+#: cps/web.py:950
 msgid "Languages"
 msgstr "Diller"
 
-#: cps/ub.py:100
+#: cps/ub.py:101
 msgid "Show language selection"
 msgstr "Dil seçimini göster"
 
-#: cps/templates/index.xml:96 cps/ub.py:101
+#: cps/templates/index.xml:96 cps/ub.py:102
 msgid "Ratings"
 msgstr "DeÄŸerlendirmeler"
 
-#: cps/ub.py:103
+#: cps/ub.py:104
 msgid "Show ratings selection"
 msgstr "Değerlendirme seçimini göster"
 
-#: cps/templates/index.xml:104 cps/ub.py:104
+#: cps/templates/index.xml:104 cps/ub.py:105
 msgid "File formats"
 msgstr "Biçimler"
 
-#: cps/ub.py:106
+#: cps/ub.py:107
 msgid "Show file formats selection"
 msgstr "Dosya biçimi seçimini göster"
 
-#: cps/ub.py:108 cps/web.py:1249
+#: cps/ub.py:109 cps/web.py:1246
 msgid "Archived Books"
 msgstr ""
 
-#: cps/ub.py:110
+#: cps/ub.py:111
 msgid "Show archived books"
 msgstr ""
 
@@ -877,220 +883,220 @@ msgstr "Yeni bir güncelleme mevcut. Son sürüme güncellemek için aşağıdak
 msgid "Click on the button below to update to the latest stable version."
 msgstr "Son kararlı sürüme güncellemek için aşağıdaki düğmeye tıklayın."
 
-#: cps/web.py:322
+#: cps/web.py:319
 #, python-format
 msgid "Error: %(ldaperror)s"
 msgstr ""
 
-#: cps/web.py:326
+#: cps/web.py:323
 msgid "Error: No user returned in response of LDAP server"
 msgstr ""
 
-#: cps/web.py:374
+#: cps/web.py:371
 msgid "Failed to Create at Least One LDAP User"
 msgstr ""
 
-#: cps/web.py:377
+#: cps/web.py:374
 msgid "At Least One LDAP User Not Found in Database"
 msgstr ""
 
-#: cps/web.py:379
+#: cps/web.py:376
 msgid "User Successfully Imported"
 msgstr ""
 
-#: cps/web.py:625
+#: cps/web.py:622
 msgid "Recently Added Books"
 msgstr "Yeni Eklenen eKitaplar"
 
-#: cps/templates/index.html:5 cps/web.py:663
+#: cps/templates/index.html:5 cps/web.py:660
 msgid "Discover (Random Books)"
 msgstr "KeÅŸfet (Rastgele)"
 
-#: cps/web.py:691
+#: cps/web.py:688
 msgid "Books"
 msgstr "eKitaplar"
 
-#: cps/web.py:718
+#: cps/web.py:715
 msgid "Hot Books (Most Downloaded)"
 msgstr ""
 
-#: cps/web.py:731
+#: cps/web.py:728
 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible"
 msgstr ""
 
-#: cps/web.py:745
+#: cps/web.py:742
 #, python-format
 msgid "Author: %(name)s"
 msgstr "Yazar: %(name)s"
 
-#: cps/web.py:759
+#: cps/web.py:756
 #, python-format
 msgid "Publisher: %(name)s"
 msgstr "Yayınevi: %(name)s"
 
-#: cps/web.py:772
+#: cps/web.py:769
 #, python-format
 msgid "Series: %(serie)s"
 msgstr "Seri: %(serie)s"
 
-#: cps/web.py:785
+#: cps/web.py:782
 #, python-format
 msgid "Rating: %(rating)s stars"
 msgstr "Değerlendirme: %(rating)s yıldız"
 
-#: cps/web.py:798
+#: cps/web.py:795
 #, python-format
 msgid "File format: %(format)s"
 msgstr "Biçim: %(format)s"
 
-#: cps/web.py:812
+#: cps/web.py:809
 #, python-format
 msgid "Category: %(name)s"
 msgstr "Kategori: %(name)s"
 
-#: cps/web.py:831
+#: cps/web.py:828
 #, python-format
 msgid "Language: %(name)s"
 msgstr "Dil: %(name)s"
 
-#: cps/web.py:910
+#: cps/web.py:907
 msgid "Ratings list"
 msgstr "DeÄŸerlendirme listesi"
 
-#: cps/web.py:925
+#: cps/web.py:922
 msgid "File formats list"
 msgstr "Biçim listesi"
 
-#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:984
+#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:981
 msgid "Tasks"
 msgstr "Görevler"
 
 #: cps/templates/book_edit.html:235 cps/templates/feed.xml:33
 #: cps/templates/layout.html:45 cps/templates/layout.html:48
-#: cps/templates/search_form.html:174 cps/web.py:1010 cps/web.py:1015
+#: cps/templates/search_form.html:174 cps/web.py:1007 cps/web.py:1012
 msgid "Search"
 msgstr "Ara"
 
-#: cps/web.py:1066
+#: cps/web.py:1063
 msgid "Published after "
 msgstr "Yayınlanma (sonra)"
 
-#: cps/web.py:1073
+#: cps/web.py:1070
 msgid "Published before "
 msgstr "Yayınlanma (önce)"
 
-#: cps/web.py:1087
+#: cps/web.py:1084
 #, python-format
 msgid "Rating <= %(rating)s"
 msgstr "DeÄŸerlendirme <= %(rating)s"
 
-#: cps/web.py:1089
+#: cps/web.py:1086
 #, python-format
 msgid "Rating >= %(rating)s"
 msgstr "DeÄŸerlendirme >= %(rating)s"
 
-#: cps/web.py:1158 cps/web.py:1183
+#: cps/web.py:1155 cps/web.py:1180
 msgid "search"
 msgstr "ara"
 
-#: cps/web.py:1213
+#: cps/web.py:1210
 #, python-format
 msgid "Custom Column No.%(column)d is not existing in calibre database"
 msgstr ""
 
-#: cps/web.py:1304
+#: cps/web.py:1301
 #, python-format
 msgid "Book successfully queued for sending to %(kindlemail)s"
 msgstr "%(kindlemail)s'a gönderilmek üzere başarıyla sıraya alındı"
 
-#: cps/web.py:1308
+#: cps/web.py:1305
 #, python-format
 msgid "Oops! There was an error sending this book: %(res)s"
 msgstr ""
 
-#: cps/web.py:1310
+#: cps/web.py:1307
 msgid "Please update your profile with a valid Send to Kindle E-mail Address."
 msgstr ""
 
-#: cps/web.py:1327
+#: cps/web.py:1324
 msgid "E-Mail server is not configured, please contact your administrator!"
 msgstr "E-Posta sunucusu ayarlanmadı, lütfen yöneticinizle iletişime geçin!"
 
-#: cps/web.py:1328 cps/web.py:1338 cps/web.py:1362 cps/web.py:1366
-#: cps/web.py:1371 cps/web.py:1375
+#: cps/web.py:1325 cps/web.py:1335 cps/web.py:1359 cps/web.py:1363
+#: cps/web.py:1368 cps/web.py:1372
 msgid "register"
 msgstr "kaydol"
 
-#: cps/web.py:1364
+#: cps/web.py:1361
 msgid "Your e-mail is not allowed to register"
 msgstr "E-posta adresinizle kaydolunmasına izin verilmiyor"
 
-#: cps/web.py:1367
+#: cps/web.py:1364
 msgid "Confirmation e-mail was send to your e-mail account."
 msgstr "Onay e-Postası hesabınıza gönderildi."
 
-#: cps/web.py:1370
+#: cps/web.py:1367
 msgid "This username or e-mail address is already in use."
 msgstr "Kullanıcı adı ya da e-Posta adresi zaten kullanımda."
 
-#: cps/web.py:1387
+#: cps/web.py:1384
 msgid "Cannot activate LDAP authentication"
 msgstr "LDAP Kimlik Doğrulaması etkinleştirilemiyor"
 
-#: cps/web.py:1404
+#: cps/web.py:1401
 #, python-format
 msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known"
 msgstr ""
 
-#: cps/web.py:1410
+#: cps/web.py:1407
 #, python-format
 msgid "Could not login: %(message)s"
 msgstr ""
 
-#: cps/web.py:1414 cps/web.py:1438
+#: cps/web.py:1411 cps/web.py:1435
 msgid "Wrong Username or Password"
 msgstr "Yanlış Kullanıcı adı ya da Şifre"
 
-#: cps/web.py:1421
+#: cps/web.py:1418
 msgid "New Password was send to your email address"
 msgstr "Yeni şifre e-Posta adresinize gönderildi"
 
-#: cps/web.py:1427
+#: cps/web.py:1424
 msgid "Please enter valid username to reset password"
 msgstr "Şifrenizi sıfırlayabilmek için lütfen geçerli bir kullanıcı adı giriniz"
 
-#: cps/web.py:1433
+#: cps/web.py:1430
 #, python-format
 msgid "You are now logged in as: '%(nickname)s'"
 msgstr "Giriş yaptınız: '%(nickname)s'"
 
-#: cps/web.py:1442 cps/web.py:1469
+#: cps/web.py:1439 cps/web.py:1466
 msgid "login"
 msgstr "giriÅŸ"
 
-#: cps/web.py:1481 cps/web.py:1515
+#: cps/web.py:1478 cps/web.py:1512
 msgid "Token not found"
 msgstr "Token bulunamadı"
 
-#: cps/web.py:1490 cps/web.py:1523
+#: cps/web.py:1487 cps/web.py:1520
 msgid "Token has expired"
 msgstr "Token süresi doldu"
 
-#: cps/web.py:1499
+#: cps/web.py:1496
 msgid "Success! Please return to your device"
 msgstr "Başarılı! Lütfen cihazınıza dönün"
 
-#: cps/web.py:1580 cps/web.py:1625 cps/web.py:1631
+#: cps/web.py:1577 cps/web.py:1622 cps/web.py:1628
 #, python-format
 msgid "%(name)s's profile"
 msgstr "%(name)s Profili"
 
-#: cps/web.py:1627
+#: cps/web.py:1624
 msgid "Profile updated"
 msgstr "Profil güncellendi"
 
-#: cps/web.py:1656 cps/web.py:1659 cps/web.py:1662 cps/web.py:1669
-#: cps/web.py:1674
+#: cps/web.py:1653 cps/web.py:1656 cps/web.py:1659 cps/web.py:1666
+#: cps/web.py:1671
 msgid "Read a Book"
 msgstr "Kitap Oku"
 
diff --git a/cps/translations/uk/LC_MESSAGES/messages.mo b/cps/translations/uk/LC_MESSAGES/messages.mo
index 81ee7eeebbea2602d8390c472a559a05718fff53..cb7a81c92c9aefdb372b1f3686ab4274bcf7d99f 100644
Binary files a/cps/translations/uk/LC_MESSAGES/messages.mo and b/cps/translations/uk/LC_MESSAGES/messages.mo differ
diff --git a/cps/translations/uk/LC_MESSAGES/messages.po b/cps/translations/uk/LC_MESSAGES/messages.po
index 933343ef15483e4820b0354998bbe295cf83973e..41c448b22d8ae9bea716062a73980bb56b95ebe8 100644
--- a/cps/translations/uk/LC_MESSAGES/messages.po
+++ b/cps/translations/uk/LC_MESSAGES/messages.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version:  Calibre-web\n"
 "Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n"
-"POT-Creation-Date: 2020-06-07 06:47+0200\n"
+"POT-Creation-Date: 2020-06-28 09:31+0200\n"
 "PO-Revision-Date: 2017-04-30 00:47+0300\n"
 "Last-Translator: ABIS Team <biblio.if.abis@gmail.com>\n"
 "Language: uk\n"
@@ -45,9 +45,9 @@ msgstr ""
 msgid "Unknown command"
 msgstr ""
 
-#: cps/admin.py:116 cps/editbooks.py:563 cps/editbooks.py:573
-#: cps/editbooks.py:667 cps/editbooks.py:669 cps/editbooks.py:730
-#: cps/editbooks.py:743 cps/updater.py:509 cps/uploader.py:97
+#: cps/admin.py:116 cps/editbooks.py:564 cps/editbooks.py:576
+#: cps/editbooks.py:670 cps/editbooks.py:672 cps/editbooks.py:733
+#: cps/editbooks.py:749 cps/updater.py:509 cps/uploader.py:97
 #: cps/uploader.py:107
 msgid "Unknown"
 msgstr "Невідомий"
@@ -60,7 +60,7 @@ msgstr "Сторінка адміністратора"
 msgid "UI Configuration"
 msgstr "Конфігурація інтерфейсу"
 
-#: cps/admin.py:189 cps/admin.py:706
+#: cps/admin.py:189 cps/admin.py:711
 msgid "Calibre-Web configuration updated"
 msgstr ""
 
@@ -112,175 +112,181 @@ msgstr ""
 msgid "LDAP Certificate Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:627
+#: cps/admin.py:628
 msgid "Keyfile Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:631
+#: cps/admin.py:632
 msgid "Certfile Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:701
+#: cps/admin.py:694 cps/admin.py:793 cps/admin.py:885 cps/admin.py:934
+#: cps/shelf.py:100 cps/shelf.py:161 cps/shelf.py:202 cps/shelf.py:260
+#: cps/shelf.py:309 cps/shelf.py:338 cps/shelf.py:368 cps/shelf.py:392
+msgid "Settings DB is not Writeable"
+msgstr ""
+
+#: cps/admin.py:706
 msgid "DB Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:703
+#: cps/admin.py:708
 msgid "DB is not Writeable"
 msgstr ""
 
-#: cps/admin.py:736
+#: cps/admin.py:741
 msgid "Basic Configuration"
 msgstr "Настройки сервера"
 
-#: cps/admin.py:751 cps/web.py:1337
+#: cps/admin.py:756 cps/web.py:1334
 msgid "Please fill out all fields!"
 msgstr "Будь-ласка, заповніть всі поля!"
 
-#: cps/admin.py:754 cps/admin.py:766 cps/admin.py:772 cps/admin.py:892
+#: cps/admin.py:759 cps/admin.py:771 cps/admin.py:777 cps/admin.py:903
 msgid "Add new user"
 msgstr "Додати користувача"
 
-#: cps/admin.py:763 cps/web.py:1578
+#: cps/admin.py:768 cps/web.py:1575
 msgid "E-mail is not from valid domain"
 msgstr ""
 
-#: cps/admin.py:770 cps/admin.py:785
+#: cps/admin.py:775 cps/admin.py:790
 msgid "Found an existing account for this e-mail address or nickname."
 msgstr ""
 
-#: cps/admin.py:781
+#: cps/admin.py:786
 #, python-format
 msgid "User '%(user)s' created"
 msgstr "Користувач '%(user)s' додан"
 
-#: cps/admin.py:794
+#: cps/admin.py:802
 #, python-format
 msgid "User '%(nick)s' deleted"
 msgstr "Користувача '%(nick)s' видалено"
 
-#: cps/admin.py:797
+#: cps/admin.py:805
 msgid "No admin user remaining, can't delete user"
 msgstr ""
 
-#: cps/admin.py:803
+#: cps/admin.py:811
 msgid "No admin user remaining, can't remove admin role"
 msgstr ""
 
-#: cps/admin.py:839 cps/web.py:1621
+#: cps/admin.py:847 cps/web.py:1618
 msgid "Found an existing account for this e-mail address."
 msgstr ""
 
-#: cps/admin.py:849 cps/admin.py:864 cps/admin.py:967 cps/web.py:1596
+#: cps/admin.py:857 cps/admin.py:872 cps/admin.py:983 cps/web.py:1593
 #, python-format
 msgid "Edit User %(nick)s"
 msgstr "Змінити користувача %(nick)s"
 
-#: cps/admin.py:855 cps/web.py:1588
+#: cps/admin.py:863 cps/web.py:1585
 msgid "This username is already taken"
 msgstr ""
 
-#: cps/admin.py:871
+#: cps/admin.py:879
 #, python-format
 msgid "User '%(nick)s' updated"
 msgstr "Користувача '%(nick)s' оновлено"
 
-#: cps/admin.py:874
+#: cps/admin.py:882
 msgid "An unknown error occured."
 msgstr "Сталась невідома помилка"
 
-#: cps/admin.py:901 cps/templates/admin.html:71
+#: cps/admin.py:912 cps/templates/admin.html:71
 msgid "Edit E-mail Server Settings"
 msgstr "Змінити налаштування SMTP"
 
-#: cps/admin.py:925
+#: cps/admin.py:941
 #, python-format
 msgid "Test e-mail successfully send to %(kindlemail)s"
 msgstr ""
 
-#: cps/admin.py:928
+#: cps/admin.py:944
 #, python-format
 msgid "There was an error sending the Test e-mail: %(res)s"
 msgstr ""
 
-#: cps/admin.py:930
+#: cps/admin.py:946
 msgid "Please configure your e-mail address first..."
 msgstr ""
 
-#: cps/admin.py:932
+#: cps/admin.py:948
 msgid "E-mail server settings updated"
 msgstr ""
 
-#: cps/admin.py:943
+#: cps/admin.py:959
 msgid "User not found"
 msgstr ""
 
-#: cps/admin.py:978
+#: cps/admin.py:994
 #, python-format
 msgid "Password for user %(user)s reset"
 msgstr ""
 
-#: cps/admin.py:981 cps/web.py:1361 cps/web.py:1425
+#: cps/admin.py:997 cps/web.py:1358 cps/web.py:1422
 msgid "An unknown error occurred. Please try again later."
 msgstr ""
 
-#: cps/admin.py:984 cps/web.py:1299
+#: cps/admin.py:1000 cps/web.py:1296
 msgid "Please configure the SMTP mail settings first..."
 msgstr "Будь-ласка, спочатку сконфігуруйте параметри SMTP"
 
-#: cps/admin.py:996
+#: cps/admin.py:1012
 msgid "Logfile viewer"
 msgstr ""
 
-#: cps/admin.py:1035
+#: cps/admin.py:1051
 msgid "Requesting update package"
 msgstr "Перевірка оновлень"
 
-#: cps/admin.py:1036
+#: cps/admin.py:1052
 msgid "Downloading update package"
 msgstr "Завантаження оновлень"
 
-#: cps/admin.py:1037
+#: cps/admin.py:1053
 msgid "Unzipping update package"
 msgstr "Розпакування оновлення"
 
-#: cps/admin.py:1038
+#: cps/admin.py:1054
 msgid "Replacing files"
 msgstr ""
 
-#: cps/admin.py:1039
+#: cps/admin.py:1055
 msgid "Database connections are closed"
 msgstr "З'єднання з базою даних закрите"
 
-#: cps/admin.py:1040
+#: cps/admin.py:1056
 msgid "Stopping server"
 msgstr ""
 
-#: cps/admin.py:1041
+#: cps/admin.py:1057
 msgid "Update finished, please press okay and reload page"
 msgstr "Оновлення встановлені, натисніть ok і перезавантажте сторінку"
 
-#: cps/admin.py:1042 cps/admin.py:1043 cps/admin.py:1044 cps/admin.py:1045
-#: cps/admin.py:1046
+#: cps/admin.py:1058 cps/admin.py:1059 cps/admin.py:1060 cps/admin.py:1061
+#: cps/admin.py:1062
 msgid "Update failed:"
 msgstr ""
 
-#: cps/admin.py:1042 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
+#: cps/admin.py:1058 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
 msgid "HTTP Error"
 msgstr ""
 
-#: cps/admin.py:1043 cps/updater.py:321 cps/updater.py:524
+#: cps/admin.py:1059 cps/updater.py:321 cps/updater.py:524
 msgid "Connection error"
 msgstr ""
 
-#: cps/admin.py:1044 cps/updater.py:323 cps/updater.py:526
+#: cps/admin.py:1060 cps/updater.py:323 cps/updater.py:526
 msgid "Timeout while establishing connection"
 msgstr ""
 
-#: cps/admin.py:1045 cps/updater.py:325 cps/updater.py:528
+#: cps/admin.py:1061 cps/updater.py:325 cps/updater.py:528
 msgid "General error"
 msgstr ""
 
-#: cps/admin.py:1046
+#: cps/admin.py:1062
 msgid "Update File Could Not be Saved in Temp Dir"
 msgstr ""
 
@@ -300,8 +306,8 @@ msgstr ""
 msgid "Book Successfully Deleted"
 msgstr ""
 
-#: cps/editbooks.py:254 cps/editbooks.py:548 cps/web.py:1644 cps/web.py:1685
-#: cps/web.py:1747
+#: cps/editbooks.py:254 cps/editbooks.py:549 cps/web.py:1641 cps/web.py:1682
+#: cps/web.py:1744
 msgid "Error opening eBook. File does not exist or file is not accessible"
 msgstr "Сталась помилка при відкриванні eBook. Файл не існує або відсутній доступ до нього"
 
@@ -309,82 +315,82 @@ msgstr "Сталась помилка при відкриванні eBook. Фа
 msgid "edit metadata"
 msgstr "змінити метадані"
 
-#: cps/editbooks.py:361
+#: cps/editbooks.py:360
 #, python-format
 msgid "%(langname)s is not a valid language"
 msgstr ""
 
-#: cps/editbooks.py:467 cps/editbooks.py:712
+#: cps/editbooks.py:468 cps/editbooks.py:715
 #, python-format
 msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
 msgstr ""
 
-#: cps/editbooks.py:471 cps/editbooks.py:716
+#: cps/editbooks.py:472 cps/editbooks.py:719
 msgid "File to be uploaded must have an extension"
 msgstr "Завантажувальний файл повинен мати розширення"
 
-#: cps/editbooks.py:483 cps/editbooks.py:773
+#: cps/editbooks.py:484 cps/editbooks.py:779
 #, python-format
 msgid "Failed to create path %(path)s (Permission denied)."
 msgstr ""
 
-#: cps/editbooks.py:488
+#: cps/editbooks.py:489
 #, python-format
 msgid "Failed to store file %(file)s."
 msgstr ""
 
-#: cps/editbooks.py:506 cps/editbooks.py:864
+#: cps/editbooks.py:507 cps/editbooks.py:870
 #, python-format
 msgid "Database error: %(error)s."
 msgstr ""
 
-#: cps/editbooks.py:510
+#: cps/editbooks.py:511
 #, python-format
 msgid "File format %(ext)s added to %(book)s"
 msgstr ""
 
-#: cps/editbooks.py:653
+#: cps/editbooks.py:656
 msgid "Metadata successfully updated"
 msgstr ""
 
-#: cps/editbooks.py:662
+#: cps/editbooks.py:665
 msgid "Error editing book, please check logfile for details"
 msgstr "Сталась помилка при редагуванні книги. Будь-ласка, перевірте лог-файл для деталей"
 
-#: cps/editbooks.py:724
+#: cps/editbooks.py:727
 #, python-format
 msgid "File %(filename)s could not saved to temp dir"
 msgstr ""
 
-#: cps/editbooks.py:734
+#: cps/editbooks.py:737
 msgid "Uploaded book probably exists in the library, consider to change before upload new: "
 msgstr ""
 
-#: cps/editbooks.py:780
+#: cps/editbooks.py:786
 #, python-format
 msgid "Failed to Move File %(file)s: %(error)s"
 msgstr ""
 
-#: cps/editbooks.py:836
+#: cps/editbooks.py:842
 #, python-format
 msgid "Failed to Move Cover File %(file)s: %(error)s"
 msgstr ""
 
-#: cps/editbooks.py:850
+#: cps/editbooks.py:856
 #, python-format
 msgid "File %(file)s uploaded"
 msgstr ""
 
-#: cps/editbooks.py:876
+#: cps/editbooks.py:882
 msgid "Source or destination format for conversion missing"
 msgstr ""
 
-#: cps/editbooks.py:884
+#: cps/editbooks.py:890
 #, python-format
 msgid "Book successfully queued for converting to %(book_format)s"
 msgstr ""
 
-#: cps/editbooks.py:888
+#: cps/editbooks.py:894
 #, python-format
 msgid "There was an error converting this book: %(res)s"
 msgstr ""
@@ -498,71 +504,71 @@ msgstr ""
 msgid "Book path %(path)s not found on Google Drive"
 msgstr ""
 
-#: cps/helper.py:542
+#: cps/helper.py:550
 msgid "Error Downloading Cover"
 msgstr ""
 
-#: cps/helper.py:545
+#: cps/helper.py:553
 msgid "Cover Format Error"
 msgstr ""
 
-#: cps/helper.py:561
+#: cps/helper.py:569
 msgid "Failed to create path for cover"
 msgstr ""
 
-#: cps/helper.py:566
+#: cps/helper.py:574
 msgid "Cover-file is not a valid image file, or could not be stored"
 msgstr ""
 
-#: cps/helper.py:577
+#: cps/helper.py:585
 msgid "Only jpg/jpeg/png/webp files are supported as coverfile"
 msgstr ""
 
-#: cps/helper.py:591
+#: cps/helper.py:599
 msgid "Only jpg/jpeg files are supported as coverfile"
 msgstr ""
 
-#: cps/helper.py:640
+#: cps/helper.py:648
 msgid "Unrar binary file not found"
 msgstr ""
 
-#: cps/helper.py:654
+#: cps/helper.py:662
 msgid "Error excecuting UnRar"
 msgstr ""
 
-#: cps/helper.py:710
+#: cps/helper.py:718
 msgid "Waiting"
 msgstr ""
 
-#: cps/helper.py:712
+#: cps/helper.py:720
 msgid "Failed"
 msgstr ""
 
-#: cps/helper.py:714
+#: cps/helper.py:722
 msgid "Started"
 msgstr ""
 
-#: cps/helper.py:716
+#: cps/helper.py:724
 msgid "Finished"
 msgstr ""
 
-#: cps/helper.py:718
+#: cps/helper.py:726
 msgid "Unknown Status"
 msgstr ""
 
-#: cps/helper.py:723
+#: cps/helper.py:731
 msgid "E-mail: "
 msgstr ""
 
-#: cps/helper.py:725 cps/helper.py:729
+#: cps/helper.py:733 cps/helper.py:737
 msgid "Convert: "
 msgstr ""
 
-#: cps/helper.py:727
+#: cps/helper.py:735
 msgid "Upload: "
 msgstr ""
 
-#: cps/helper.py:731
+#: cps/helper.py:739
 msgid "Unknown Task: "
 msgstr ""
 
@@ -595,7 +601,7 @@ msgstr ""
 msgid "Failed to fetch user info from Google."
 msgstr ""
 
-#: cps/oauth_bb.py:225 cps/web.py:1397 cps/web.py:1537
+#: cps/oauth_bb.py:225 cps/web.py:1394 cps/web.py:1534
 #, python-format
 msgid "you are now logged in as: '%(nickname)s'"
 msgstr "Ви увійшли як користувач: '%(nickname)s'"
@@ -632,218 +638,218 @@ msgstr ""
 msgid "Google Oauth error, please retry later."
 msgstr ""
 
-#: cps/shelf.py:66 cps/shelf.py:111
+#: cps/shelf.py:67 cps/shelf.py:120
 msgid "Invalid shelf specified"
 msgstr ""
 
-#: cps/shelf.py:72
+#: cps/shelf.py:73
 #, python-format
 msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s"
 msgstr ""
 
-#: cps/shelf.py:82
+#: cps/shelf.py:83
 #, python-format
 msgid "Book is already part of the shelf: %(shelfname)s"
 msgstr ""
 
-#: cps/shelf.py:97
+#: cps/shelf.py:106
 #, python-format
 msgid "Book has been added to shelf: %(sname)s"
 msgstr "Книга додана на книжкову полицю: %(sname)s"
 
-#: cps/shelf.py:115
+#: cps/shelf.py:124
 #, python-format
 msgid "You are not allowed to add a book to the the shelf: %(name)s"
 msgstr ""
 
-#: cps/shelf.py:133
+#: cps/shelf.py:142
 #, python-format
 msgid "Books are already part of the shelf: %(name)s"
 msgstr ""
 
-#: cps/shelf.py:148
+#: cps/shelf.py:158
 #, python-format
 msgid "Books have been added to shelf: %(sname)s"
 msgstr ""
 
-#: cps/shelf.py:150
+#: cps/shelf.py:163
 #, python-format
 msgid "Could not add books to shelf: %(sname)s"
 msgstr ""
 
-#: cps/shelf.py:188
+#: cps/shelf.py:208
 #, python-format
 msgid "Book has been removed from shelf: %(sname)s"
 msgstr "Книга видалена з книжкової полиці: %(sname)s"
 
-#: cps/shelf.py:196
+#: cps/shelf.py:216
 #, python-format
 msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
 msgstr "Вибачте, але у вас немає дозволу для видалення книги з цієї полиці"
 
-#: cps/shelf.py:220 cps/shelf.py:260
+#: cps/shelf.py:240 cps/shelf.py:284
 #, python-format
 msgid "A public shelf with the name '%(title)s' already exists."
 msgstr ""
 
-#: cps/shelf.py:229 cps/shelf.py:270
+#: cps/shelf.py:249 cps/shelf.py:294
 #, python-format
 msgid "A private shelf with the name '%(title)s' already exists."
 msgstr ""
 
-#: cps/shelf.py:236
+#: cps/shelf.py:256
 #, python-format
 msgid "Shelf %(title)s created"
 msgstr "Створена книжкова полиця %(title)s"
 
-#: cps/shelf.py:239 cps/shelf.py:284
+#: cps/shelf.py:263 cps/shelf.py:312
 msgid "There was an error"
 msgstr "Сталась помилка"
 
-#: cps/shelf.py:240 cps/shelf.py:242 cps/templates/layout.html:144
+#: cps/shelf.py:264 cps/shelf.py:266 cps/templates/layout.html:144
 msgid "Create a Shelf"
 msgstr "створити книжкову полицю"
 
-#: cps/shelf.py:282
+#: cps/shelf.py:306
 #, python-format
 msgid "Shelf %(title)s changed"
 msgstr "Книжкова полиця %(title)s змінена"
 
-#: cps/shelf.py:285 cps/shelf.py:287
+#: cps/shelf.py:313 cps/shelf.py:315
 msgid "Edit a shelf"
 msgstr "Змінити книжкову полицю"
 
-#: cps/shelf.py:332
+#: cps/shelf.py:369
 #, python-format
 msgid "Shelf: '%(name)s'"
 msgstr "Книжкова полиця: '%(name)s'"
 
-#: cps/shelf.py:335
+#: cps/shelf.py:372
 msgid "Error opening shelf. Shelf does not exist or is not accessible"
 msgstr "Помилка при відкриванні полиці. Полиця не існує або до неї відсутній доступ"
 
-#: cps/shelf.py:368
+#: cps/shelf.py:409
 msgid "Hidden Book"
 msgstr ""
 
-#: cps/shelf.py:373
+#: cps/shelf.py:414
 #, python-format
 msgid "Change order of Shelf: '%(name)s'"
 msgstr "Змінити розташування книжкової полиці '%(name)s'"
 
-#: cps/ub.py:64
+#: cps/ub.py:65
 msgid "Recently Added"
 msgstr "Останні додані"
 
-#: cps/ub.py:66
+#: cps/ub.py:67
 msgid "Show recent books"
 msgstr "Показувати останні книги"
 
-#: cps/templates/index.xml:17 cps/ub.py:67
+#: cps/templates/index.xml:17 cps/ub.py:68
 msgid "Hot Books"
 msgstr "Популярні книги"
 
-#: cps/ub.py:69
+#: cps/ub.py:70
 msgid "Show Hot Books"
 msgstr "Показувати популярні книги"
 
-#: cps/templates/index.xml:24 cps/ub.py:71 cps/web.py:655
+#: cps/templates/index.xml:24 cps/ub.py:72 cps/web.py:652
 msgid "Top Rated Books"
 msgstr "Книги з найкращим рейтингом"
 
-#: cps/ub.py:73
+#: cps/ub.py:74
 msgid "Show Top Rated Books"
 msgstr "Показувати книги з найвищим рейтингом"
 
-#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:74
-#: cps/web.py:1222
+#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:75
+#: cps/web.py:1219
 msgid "Read Books"
 msgstr "Прочитані книги"
 
-#: cps/ub.py:76
+#: cps/ub.py:77
 msgid "Show read and unread"
 msgstr "Показувати прочитані та непрочитані книги"
 
-#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:78
-#: cps/web.py:1225
+#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:79
+#: cps/web.py:1222
 msgid "Unread Books"
 msgstr "Непрочитані книги"
 
-#: cps/ub.py:80
+#: cps/ub.py:81
 msgid "Show unread"
 msgstr ""
 
-#: cps/ub.py:81
+#: cps/ub.py:82
 msgid "Discover"
 msgstr "Огляд"
 
-#: cps/ub.py:83
+#: cps/ub.py:84
 msgid "Show random books"
 msgstr "Показувати випадкові книги"
 
-#: cps/templates/index.xml:75 cps/ub.py:84 cps/web.py:970
+#: cps/templates/index.xml:75 cps/ub.py:85 cps/web.py:967
 msgid "Categories"
 msgstr "Категорії"
 
-#: cps/ub.py:86
+#: cps/ub.py:87
 msgid "Show category selection"
 msgstr "Показувати вибір категорії"
 
 #: cps/templates/book_edit.html:84 cps/templates/index.xml:82
-#: cps/templates/search_form.html:53 cps/ub.py:87 cps/web.py:886 cps/web.py:896
+#: cps/templates/search_form.html:53 cps/ub.py:88 cps/web.py:883 cps/web.py:893
 msgid "Series"
 msgstr "Серії"
 
-#: cps/ub.py:89
+#: cps/ub.py:90
 msgid "Show series selection"
 msgstr "Показувати вибір серії"
 
-#: cps/templates/index.xml:61 cps/ub.py:90
+#: cps/templates/index.xml:61 cps/ub.py:91
 msgid "Authors"
 msgstr "Автори"
 
-#: cps/ub.py:92
+#: cps/ub.py:93
 msgid "Show author selection"
 msgstr "Показувати вибір автора"
 
-#: cps/templates/index.xml:68 cps/ub.py:94 cps/web.py:869
+#: cps/templates/index.xml:68 cps/ub.py:95 cps/web.py:866
 msgid "Publishers"
 msgstr ""
 
-#: cps/ub.py:96
+#: cps/ub.py:97
 msgid "Show publisher selection"
 msgstr ""
 
-#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:97
-#: cps/web.py:953
+#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:98
+#: cps/web.py:950
 msgid "Languages"
 msgstr "Мови"
 
-#: cps/ub.py:100
+#: cps/ub.py:101
 msgid "Show language selection"
 msgstr "Показувати вибір мови"
 
-#: cps/templates/index.xml:96 cps/ub.py:101
+#: cps/templates/index.xml:96 cps/ub.py:102
 msgid "Ratings"
 msgstr ""
 
-#: cps/ub.py:103
+#: cps/ub.py:104
 msgid "Show ratings selection"
 msgstr ""
 
-#: cps/templates/index.xml:104 cps/ub.py:104
+#: cps/templates/index.xml:104 cps/ub.py:105
 msgid "File formats"
 msgstr ""
 
-#: cps/ub.py:106
+#: cps/ub.py:107
 msgid "Show file formats selection"
 msgstr ""
 
-#: cps/ub.py:108 cps/web.py:1249
+#: cps/ub.py:109 cps/web.py:1246
 msgid "Archived Books"
 msgstr ""
 
-#: cps/ub.py:110
+#: cps/ub.py:111
 msgid "Show archived books"
 msgstr ""
 
@@ -876,220 +882,220 @@ msgstr ""
 msgid "Click on the button below to update to the latest stable version."
 msgstr ""
 
-#: cps/web.py:322
+#: cps/web.py:319
 #, python-format
 msgid "Error: %(ldaperror)s"
 msgstr ""
 
-#: cps/web.py:326
+#: cps/web.py:323
 msgid "Error: No user returned in response of LDAP server"
 msgstr ""
 
-#: cps/web.py:374
+#: cps/web.py:371
 msgid "Failed to Create at Least One LDAP User"
 msgstr ""
 
-#: cps/web.py:377
+#: cps/web.py:374
 msgid "At Least One LDAP User Not Found in Database"
 msgstr ""
 
-#: cps/web.py:379
+#: cps/web.py:376
 msgid "User Successfully Imported"
 msgstr ""
 
-#: cps/web.py:625
+#: cps/web.py:622
 msgid "Recently Added Books"
 msgstr "Нещодавно додані книги"
 
-#: cps/templates/index.html:5 cps/web.py:663
+#: cps/templates/index.html:5 cps/web.py:660
 msgid "Discover (Random Books)"
 msgstr "Огляд (випадкові книги)"
 
-#: cps/web.py:691
+#: cps/web.py:688
 msgid "Books"
 msgstr ""
 
-#: cps/web.py:718
+#: cps/web.py:715
 msgid "Hot Books (Most Downloaded)"
 msgstr "Популярні книги (найбільш завантажувані)"
 
-#: cps/web.py:731
+#: cps/web.py:728
 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible"
 msgstr "Неможливо відкрити книгу. Файл не існує або немає доступу."
 
-#: cps/web.py:745
+#: cps/web.py:742
 #, python-format
 msgid "Author: %(name)s"
 msgstr ""
 
-#: cps/web.py:759
+#: cps/web.py:756
 #, python-format
 msgid "Publisher: %(name)s"
 msgstr ""
 
-#: cps/web.py:772
+#: cps/web.py:769
 #, python-format
 msgid "Series: %(serie)s"
 msgstr "Серії: %(serie)s"
 
-#: cps/web.py:785
+#: cps/web.py:782
 #, python-format
 msgid "Rating: %(rating)s stars"
 msgstr ""
 
-#: cps/web.py:798
+#: cps/web.py:795
 #, python-format
 msgid "File format: %(format)s"
 msgstr ""
 
-#: cps/web.py:812
+#: cps/web.py:809
 #, python-format
 msgid "Category: %(name)s"
 msgstr "Категорія: %(name)s"
 
-#: cps/web.py:831
+#: cps/web.py:828
 #, python-format
 msgid "Language: %(name)s"
 msgstr "Мова: %(name)s"
 
-#: cps/web.py:910
+#: cps/web.py:907
 msgid "Ratings list"
 msgstr ""
 
-#: cps/web.py:925
+#: cps/web.py:922
 msgid "File formats list"
 msgstr ""
 
-#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:984
+#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:981
 msgid "Tasks"
 msgstr ""
 
 #: cps/templates/book_edit.html:235 cps/templates/feed.xml:33
 #: cps/templates/layout.html:45 cps/templates/layout.html:48
-#: cps/templates/search_form.html:174 cps/web.py:1010 cps/web.py:1015
+#: cps/templates/search_form.html:174 cps/web.py:1007 cps/web.py:1012
 msgid "Search"
 msgstr "Пошук"
 
-#: cps/web.py:1066
+#: cps/web.py:1063
 msgid "Published after "
 msgstr ""
 
-#: cps/web.py:1073
+#: cps/web.py:1070
 msgid "Published before "
 msgstr "Опубліковано до"
 
-#: cps/web.py:1087
+#: cps/web.py:1084
 #, python-format
 msgid "Rating <= %(rating)s"
 msgstr ""
 
-#: cps/web.py:1089
+#: cps/web.py:1086
 #, python-format
 msgid "Rating >= %(rating)s"
 msgstr ""
 
-#: cps/web.py:1158 cps/web.py:1183
+#: cps/web.py:1155 cps/web.py:1180
 msgid "search"
 msgstr "пошук"
 
-#: cps/web.py:1213
+#: cps/web.py:1210
 #, python-format
 msgid "Custom Column No.%(column)d is not existing in calibre database"
 msgstr ""
 
-#: cps/web.py:1304
+#: cps/web.py:1301
 #, python-format
 msgid "Book successfully queued for sending to %(kindlemail)s"
 msgstr ""
 
-#: cps/web.py:1308
+#: cps/web.py:1305
 #, python-format
 msgid "Oops! There was an error sending this book: %(res)s"
 msgstr "Помилка при відправці книги: %(res)s"
 
-#: cps/web.py:1310
+#: cps/web.py:1307
 msgid "Please update your profile with a valid Send to Kindle E-mail Address."
 msgstr ""
 
-#: cps/web.py:1327
+#: cps/web.py:1324
 msgid "E-Mail server is not configured, please contact your administrator!"
 msgstr ""
 
-#: cps/web.py:1328 cps/web.py:1338 cps/web.py:1362 cps/web.py:1366
-#: cps/web.py:1371 cps/web.py:1375
+#: cps/web.py:1325 cps/web.py:1335 cps/web.py:1359 cps/web.py:1363
+#: cps/web.py:1368 cps/web.py:1372
 msgid "register"
 msgstr "зареєструватись"
 
-#: cps/web.py:1364
+#: cps/web.py:1361
 msgid "Your e-mail is not allowed to register"
 msgstr ""
 
-#: cps/web.py:1367
+#: cps/web.py:1364
 msgid "Confirmation e-mail was send to your e-mail account."
 msgstr ""
 
-#: cps/web.py:1370
+#: cps/web.py:1367
 msgid "This username or e-mail address is already in use."
 msgstr ""
 
-#: cps/web.py:1387
+#: cps/web.py:1384
 msgid "Cannot activate LDAP authentication"
 msgstr ""
 
-#: cps/web.py:1404
+#: cps/web.py:1401
 #, python-format
 msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known"
 msgstr ""
 
-#: cps/web.py:1410
+#: cps/web.py:1407
 #, python-format
 msgid "Could not login: %(message)s"
 msgstr ""
 
-#: cps/web.py:1414 cps/web.py:1438
+#: cps/web.py:1411 cps/web.py:1435
 msgid "Wrong Username or Password"
 msgstr "Помилка в імені користувача або паролі"
 
-#: cps/web.py:1421
+#: cps/web.py:1418
 msgid "New Password was send to your email address"
 msgstr ""
 
-#: cps/web.py:1427
+#: cps/web.py:1424
 msgid "Please enter valid username to reset password"
 msgstr ""
 
-#: cps/web.py:1433
+#: cps/web.py:1430
 #, python-format
 msgid "You are now logged in as: '%(nickname)s'"
 msgstr ""
 
-#: cps/web.py:1442 cps/web.py:1469
+#: cps/web.py:1439 cps/web.py:1466
 msgid "login"
 msgstr "увійти"
 
-#: cps/web.py:1481 cps/web.py:1515
+#: cps/web.py:1478 cps/web.py:1512
 msgid "Token not found"
 msgstr "Токен не знайдено"
 
-#: cps/web.py:1490 cps/web.py:1523
+#: cps/web.py:1487 cps/web.py:1520
 msgid "Token has expired"
 msgstr "Час дії токено вичерпано"
 
-#: cps/web.py:1499
+#: cps/web.py:1496
 msgid "Success! Please return to your device"
 msgstr "Вдалося! Будь-ласка, поверніться до вашого пристрою"
 
-#: cps/web.py:1580 cps/web.py:1625 cps/web.py:1631
+#: cps/web.py:1577 cps/web.py:1622 cps/web.py:1628
 #, python-format
 msgid "%(name)s's profile"
 msgstr "Профіль %(name)s"
 
-#: cps/web.py:1627
+#: cps/web.py:1624
 msgid "Profile updated"
 msgstr "Профіль оновлено"
 
-#: cps/web.py:1656 cps/web.py:1659 cps/web.py:1662 cps/web.py:1669
-#: cps/web.py:1674
+#: cps/web.py:1653 cps/web.py:1656 cps/web.py:1659 cps/web.py:1666
+#: cps/web.py:1671
 msgid "Read a Book"
 msgstr "Читати книгу"
 
diff --git a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo
index da7ed62e78c640c9b547192976997847cecb591c..3c7de46662faa3494dcc9727f99728616fe87569 100644
Binary files a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo and b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo differ
diff --git a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po
index 16091a5448c72afefb3d07ded47a541335d9639e..76b99287255ca21be60d4f4d8f26e2c2ea9dd118 100644
--- a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po
+++ b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po
@@ -6,11 +6,11 @@
 msgid ""
 msgstr ""
 "Project-Id-Version:  Calibre-Web\n"
-"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
-"POT-Creation-Date: 2020-06-07 06:47+0200\n"
-"PO-Revision-Date: 2017-01-06 17:00+0000\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2020-06-28 09:31+0200\n"
+"PO-Revision-Date: 2020-06-20 19:06+0800\n"
 "Last-Translator: dalin <dalin.lin@gmail.com>\n"
-"Language: zh_Hans_CN\n"
+"Language: zh_CN\n"
 "Language-Team: zh_Hans_CN <LL@li.org>\n"
 "Plural-Forms: nplurals=1; plural=0\n"
 "MIME-Version: 1.0\n"
@@ -40,15 +40,15 @@ msgstr "正在关闭服务器,请关闭窗口"
 
 #: cps/admin.py:103
 msgid "Reconnect successful"
-msgstr ""
+msgstr "重新连接成功"
 
 #: cps/admin.py:106
 msgid "Unknown command"
-msgstr ""
+msgstr "未知命令"
 
-#: cps/admin.py:116 cps/editbooks.py:563 cps/editbooks.py:573
-#: cps/editbooks.py:667 cps/editbooks.py:669 cps/editbooks.py:730
-#: cps/editbooks.py:743 cps/updater.py:509 cps/uploader.py:97
+#: cps/admin.py:116 cps/editbooks.py:564 cps/editbooks.py:576
+#: cps/editbooks.py:670 cps/editbooks.py:672 cps/editbooks.py:733
+#: cps/editbooks.py:749 cps/updater.py:509 cps/uploader.py:97
 #: cps/uploader.py:107
 msgid "Unknown"
 msgstr "未知"
@@ -61,248 +61,254 @@ msgstr "管理页"
 msgid "UI Configuration"
 msgstr "UI配置"
 
-#: cps/admin.py:189 cps/admin.py:706
+#: cps/admin.py:189 cps/admin.py:711
 msgid "Calibre-Web configuration updated"
 msgstr "Calibre-Web配置已更新"
 
 #: cps/admin.py:434 cps/admin.py:440 cps/admin.py:451 cps/admin.py:462
 #: cps/templates/modal_restriction.html:29
 msgid "Deny"
-msgstr "限制"
+msgstr "隐藏"
 
 #: cps/admin.py:436 cps/admin.py:442 cps/admin.py:453 cps/admin.py:464
 #: cps/templates/modal_restriction.html:28
 msgid "Allow"
-msgstr "允许"
+msgstr "显示"
 
 #: cps/admin.py:510
 msgid "client_secrets.json Is Not Configured For Web Application"
-msgstr ""
+msgstr "client_secrets.json 未为 Web 应用程序配置"
 
 #: cps/admin.py:549
 msgid "Logfile Location is not Valid, Please Enter Correct Path"
-msgstr ""
+msgstr "日志文件路径无效,请输入正确的路径"
 
 #: cps/admin.py:554
 msgid "Access Logfile Location is not Valid, Please Enter Correct Path"
-msgstr ""
+msgstr "访问日志路径无效,请输入正确的路径"
 
 #: cps/admin.py:580
 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier"
-msgstr ""
+msgstr "请输入LDAP主机、端口、DN和用户对象标识符"
 
 #: cps/admin.py:593
 #, python-format
 msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier"
-msgstr ""
+msgstr "LDAP组对象过滤器需要一个具有“%s”格式标识符"
 
 #: cps/admin.py:596
 msgid "LDAP Group Object Filter Has Unmatched Parenthesis"
-msgstr ""
+msgstr "LDAP组对象过滤器的括号不匹配"
 
 #: cps/admin.py:600
 #, python-format
 msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier"
-msgstr ""
+msgstr "LDAP用户对象过滤器需要一个具有“%s”格式标识符"
 
 #: cps/admin.py:603
 msgid "LDAP User Object Filter Has Unmatched Parenthesis"
-msgstr ""
+msgstr "LDAP用户对象过滤器的括号不匹配"
 
 #: cps/admin.py:607
 msgid "LDAP Certificate Location is not Valid, Please Enter Correct Path"
-msgstr ""
+msgstr "LDAP证书路径无效,请输入正确的路径"
 
-#: cps/admin.py:627
+#: cps/admin.py:628
 msgid "Keyfile Location is not Valid, Please Enter Correct Path"
-msgstr ""
+msgstr "密钥文件路径无效,请输入正确的路径"
 
-#: cps/admin.py:631
+#: cps/admin.py:632
 msgid "Certfile Location is not Valid, Please Enter Correct Path"
+msgstr "证书文件路径无效,请输入正确的路径"
+
+#: cps/admin.py:694 cps/admin.py:793 cps/admin.py:885 cps/admin.py:934
+#: cps/shelf.py:100 cps/shelf.py:161 cps/shelf.py:202 cps/shelf.py:260
+#: cps/shelf.py:309 cps/shelf.py:338 cps/shelf.py:368 cps/shelf.py:392
+msgid "Settings DB is not Writeable"
 msgstr ""
 
-#: cps/admin.py:701
+#: cps/admin.py:706
 msgid "DB Location is not Valid, Please Enter Correct Path"
-msgstr ""
+msgstr "数据库路径无效,请输入正确的路径"
 
-#: cps/admin.py:703
+#: cps/admin.py:708
 msgid "DB is not Writeable"
-msgstr ""
+msgstr "数据库不可写入"
 
-#: cps/admin.py:736
+#: cps/admin.py:741
 msgid "Basic Configuration"
 msgstr "基本配置"
 
-#: cps/admin.py:751 cps/web.py:1337
+#: cps/admin.py:756 cps/web.py:1334
 msgid "Please fill out all fields!"
-msgstr "请填写所有字段"
+msgstr "请填写所有字段!"
 
-#: cps/admin.py:754 cps/admin.py:766 cps/admin.py:772 cps/admin.py:892
+#: cps/admin.py:759 cps/admin.py:771 cps/admin.py:777 cps/admin.py:903
 msgid "Add new user"
 msgstr "添加新用户"
 
-#: cps/admin.py:763 cps/web.py:1578
+#: cps/admin.py:768 cps/web.py:1575
 msgid "E-mail is not from valid domain"
-msgstr "邮箱不在有效域中'"
+msgstr "邮箱不在有效域中"
 
-#: cps/admin.py:770 cps/admin.py:785
+#: cps/admin.py:775 cps/admin.py:790
 msgid "Found an existing account for this e-mail address or nickname."
-msgstr "此邮箱或昵称的账号已经存在。"
+msgstr "此邮箱或用户名的账号已经存在。"
 
-#: cps/admin.py:781
+#: cps/admin.py:786
 #, python-format
 msgid "User '%(user)s' created"
-msgstr "用户 '%(user)s' 已被创建"
+msgstr "用户“%(user)s”已创建"
 
-#: cps/admin.py:794
+#: cps/admin.py:802
 #, python-format
 msgid "User '%(nick)s' deleted"
-msgstr "用户 '%(nick)s' 已被删除"
+msgstr "用户“%(nick)s”已删除"
 
-#: cps/admin.py:797
+#: cps/admin.py:805
 msgid "No admin user remaining, can't delete user"
-msgstr "admin账户不存在,无法删除用户"
+msgstr "管理员账户不存在,无法删除用户"
 
-#: cps/admin.py:803
+#: cps/admin.py:811
 msgid "No admin user remaining, can't remove admin role"
-msgstr ""
+msgstr "理员账户不存在,无法删除管理员角色"
 
-#: cps/admin.py:839 cps/web.py:1621
+#: cps/admin.py:847 cps/web.py:1618
 msgid "Found an existing account for this e-mail address."
-msgstr "找到一个已有账号使用这个邮箱。"
+msgstr "此邮箱的账号已经存在。"
 
-#: cps/admin.py:849 cps/admin.py:864 cps/admin.py:967 cps/web.py:1596
+#: cps/admin.py:857 cps/admin.py:872 cps/admin.py:983 cps/web.py:1593
 #, python-format
 msgid "Edit User %(nick)s"
 msgstr "编辑用户 %(nick)s"
 
-#: cps/admin.py:855 cps/web.py:1588
+#: cps/admin.py:863 cps/web.py:1585
 msgid "This username is already taken"
 msgstr "此用户名已被使用"
 
-#: cps/admin.py:871
+#: cps/admin.py:879
 #, python-format
 msgid "User '%(nick)s' updated"
-msgstr "用户 '%(nick)s' 已被更新"
+msgstr "用户“%(nick)s”已更新"
 
-#: cps/admin.py:874
+#: cps/admin.py:882
 msgid "An unknown error occured."
 msgstr "发生未知错误。"
 
-#: cps/admin.py:901 cps/templates/admin.html:71
+#: cps/admin.py:912 cps/templates/admin.html:71
 msgid "Edit E-mail Server Settings"
-msgstr "修改SMTP设置"
+msgstr "编辑邮件服务器设置"
 
-#: cps/admin.py:925
+#: cps/admin.py:941
 #, python-format
 msgid "Test e-mail successfully send to %(kindlemail)s"
 msgstr "测试邮件已经被成功发到 %(kindlemail)s"
 
-#: cps/admin.py:928
+#: cps/admin.py:944
 #, python-format
 msgid "There was an error sending the Test e-mail: %(res)s"
-msgstr "发送测试邮件出错了: %(res)s"
+msgstr "发送测试邮件时出错:%(res)s"
 
-#: cps/admin.py:930
+#: cps/admin.py:946
 msgid "Please configure your e-mail address first..."
-msgstr "请先配置有效的邮箱地址..."
+msgstr "请先配置您的邮箱地址..."
 
-#: cps/admin.py:932
+#: cps/admin.py:948
 msgid "E-mail server settings updated"
-msgstr "已更新邮件服务器设置"
+msgstr "邮件服务器设置已更新"
 
-#: cps/admin.py:943
+#: cps/admin.py:959
 msgid "User not found"
-msgstr ""
+msgstr "找不到用户"
 
-#: cps/admin.py:978
+#: cps/admin.py:994
 #, python-format
 msgid "Password for user %(user)s reset"
 msgstr "用户 %(user)s 的密码已重置"
 
-#: cps/admin.py:981 cps/web.py:1361 cps/web.py:1425
+#: cps/admin.py:997 cps/web.py:1358 cps/web.py:1422
 msgid "An unknown error occurred. Please try again later."
 msgstr "发生一个未知错误,请稍后再试。"
 
-#: cps/admin.py:984 cps/web.py:1299
+#: cps/admin.py:1000 cps/web.py:1296
 msgid "Please configure the SMTP mail settings first..."
-msgstr "请先配置SMTP邮箱..."
+msgstr "请先配置SMTP邮箱设置..."
 
-#: cps/admin.py:996
+#: cps/admin.py:1012
 msgid "Logfile viewer"
 msgstr "日志文件查看器"
 
-#: cps/admin.py:1035
+#: cps/admin.py:1051
 msgid "Requesting update package"
 msgstr "正在请求更新包"
 
-#: cps/admin.py:1036
+#: cps/admin.py:1052
 msgid "Downloading update package"
 msgstr "正在下载更新包"
 
-#: cps/admin.py:1037
+#: cps/admin.py:1053
 msgid "Unzipping update package"
 msgstr "正在解压更新包"
 
-#: cps/admin.py:1038
+#: cps/admin.py:1054
 msgid "Replacing files"
 msgstr "正在替换文件"
 
-#: cps/admin.py:1039
+#: cps/admin.py:1055
 msgid "Database connections are closed"
 msgstr "数据库连接已关闭"
 
-#: cps/admin.py:1040
+#: cps/admin.py:1056
 msgid "Stopping server"
 msgstr "正在停止服务器"
 
-#: cps/admin.py:1041
+#: cps/admin.py:1057
 msgid "Update finished, please press okay and reload page"
-msgstr "更新完成,请按确定并刷新页面"
+msgstr "更新完成,请点击确定并刷新页面"
 
-#: cps/admin.py:1042 cps/admin.py:1043 cps/admin.py:1044 cps/admin.py:1045
-#: cps/admin.py:1046
+#: cps/admin.py:1058 cps/admin.py:1059 cps/admin.py:1060 cps/admin.py:1061
+#: cps/admin.py:1062
 msgid "Update failed:"
 msgstr "更新失败:"
 
-#: cps/admin.py:1042 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
+#: cps/admin.py:1058 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
 msgid "HTTP Error"
 msgstr "HTTP错误"
 
-#: cps/admin.py:1043 cps/updater.py:321 cps/updater.py:524
+#: cps/admin.py:1059 cps/updater.py:321 cps/updater.py:524
 msgid "Connection error"
 msgstr "连接错误"
 
-#: cps/admin.py:1044 cps/updater.py:323 cps/updater.py:526
+#: cps/admin.py:1060 cps/updater.py:323 cps/updater.py:526
 msgid "Timeout while establishing connection"
 msgstr "建立连接超时"
 
-#: cps/admin.py:1045 cps/updater.py:325 cps/updater.py:528
+#: cps/admin.py:1061 cps/updater.py:325 cps/updater.py:528
 msgid "General error"
 msgstr "一般错误"
 
-#: cps/admin.py:1046
+#: cps/admin.py:1062
 msgid "Update File Could Not be Saved in Temp Dir"
-msgstr ""
+msgstr "更新文件无法保存在临时目录中"
 
 #: cps/converter.py:32
 msgid "not configured"
-msgstr "配置为空"
+msgstr "未配置"
 
 #: cps/converter.py:34
 msgid "Execution permissions missing"
-msgstr ""
+msgstr "缺少执行权限"
 
 #: cps/editbooks.py:242
 msgid "Book Format Successfully Deleted"
-msgstr ""
+msgstr "书籍格式已成功删除"
 
 #: cps/editbooks.py:245
 msgid "Book Successfully Deleted"
-msgstr ""
+msgstr "书籍已成功删除"
 
-#: cps/editbooks.py:254 cps/editbooks.py:548 cps/web.py:1644 cps/web.py:1685
-#: cps/web.py:1747
+#: cps/editbooks.py:254 cps/editbooks.py:549 cps/web.py:1641 cps/web.py:1682
+#: cps/web.py:1744
 msgid "Error opening eBook. File does not exist or file is not accessible"
 msgstr "打开电子书出错。文件不存在或不可访问"
 
@@ -310,89 +316,89 @@ msgstr "打开电子书出错。文件不存在或不可访问"
 msgid "edit metadata"
 msgstr "编辑元数据"
 
-#: cps/editbooks.py:361
+#: cps/editbooks.py:360
 #, python-format
 msgid "%(langname)s is not a valid language"
 msgstr "%(langname)s 不是一种有效语言"
 
-#: cps/editbooks.py:467 cps/editbooks.py:712
+#: cps/editbooks.py:468 cps/editbooks.py:715
 #, python-format
 msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
-msgstr "不能上传后缀为 '%(ext)s' 的文件到此服务器"
+msgstr "不能上传文件扩展名为“%(ext)s”的文件到此服务器"
 
-#: cps/editbooks.py:471 cps/editbooks.py:716
+#: cps/editbooks.py:472 cps/editbooks.py:719
 msgid "File to be uploaded must have an extension"
-msgstr "要上传的文件必须有一个后缀"
+msgstr "要上传的文件必须具有扩展名"
 
-#: cps/editbooks.py:483 cps/editbooks.py:773
+#: cps/editbooks.py:484 cps/editbooks.py:779
 #, python-format
 msgid "Failed to create path %(path)s (Permission denied)."
 msgstr "创建路径 %(path)s 失败(权限拒绝)。"
 
-#: cps/editbooks.py:488
+#: cps/editbooks.py:489
 #, python-format
 msgid "Failed to store file %(file)s."
 msgstr "保存文件 %(file)s 失败。"
 
-#: cps/editbooks.py:506 cps/editbooks.py:864
+#: cps/editbooks.py:507 cps/editbooks.py:870
 #, python-format
 msgid "Database error: %(error)s."
-msgstr ""
+msgstr "数据库错误:%(error)s。"
 
-#: cps/editbooks.py:510
+#: cps/editbooks.py:511
 #, python-format
 msgid "File format %(ext)s added to %(book)s"
 msgstr "已添加 %(ext)s 格式到 %(book)s"
 
-#: cps/editbooks.py:653
+#: cps/editbooks.py:656
 msgid "Metadata successfully updated"
 msgstr "已成功更新元数据"
 
-#: cps/editbooks.py:662
+#: cps/editbooks.py:665
 msgid "Error editing book, please check logfile for details"
-msgstr "编辑书籍出错,详情请检查日志文件"
+msgstr "编辑书籍出错,请检查日志文件以获取详细信息"
 
-#: cps/editbooks.py:724
+#: cps/editbooks.py:727
 #, python-format
 msgid "File %(filename)s could not saved to temp dir"
 msgstr "文件 %(filename)s 无法保存到临时目录"
 
-#: cps/editbooks.py:734
+#: cps/editbooks.py:737
 msgid "Uploaded book probably exists in the library, consider to change before upload new: "
-msgstr "上传的书籍可能已经存在,建议修改后重新上传:"
+msgstr "上传的书籍可能已经存在,建议修改后重新上传: "
 
-#: cps/editbooks.py:780
+#: cps/editbooks.py:786
 #, python-format
 msgid "Failed to Move File %(file)s: %(error)s"
-msgstr ""
+msgstr "移动文件失败 %(file)s:%(error)s"
 
-#: cps/editbooks.py:836
+#: cps/editbooks.py:842
 #, python-format
 msgid "Failed to Move Cover File %(file)s: %(error)s"
-msgstr ""
+msgstr "移动封面文件失败 %(file)s:%(error)s"
 
-#: cps/editbooks.py:850
+#: cps/editbooks.py:856
 #, python-format
 msgid "File %(file)s uploaded"
 msgstr "文件 %(file)s 已上传"
 
-#: cps/editbooks.py:876
+#: cps/editbooks.py:882
 msgid "Source or destination format for conversion missing"
 msgstr "转换的源或目的格式缺失"
 
-#: cps/editbooks.py:884
+#: cps/editbooks.py:890
 #, python-format
 msgid "Book successfully queued for converting to %(book_format)s"
-msgstr "书籍已经被成功加入 %(book_format)s 的转换队列"
+msgstr "书籍已经被成功加入到 %(book_format)s 格式转换队列"
 
-#: cps/editbooks.py:888
+#: cps/editbooks.py:894
 #, python-format
 msgid "There was an error converting this book: %(res)s"
-msgstr "转换此书时出现错误: %(res)s"
+msgstr "转换此书籍时出现错误: %(res)s"
 
 #: cps/gdrive.py:61
 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
-msgstr "Google Drive 没有完成,试试重新关闭Google Drive再开启"
+msgstr "Google Drive 设置未完成,请尝试停用并再次激活Google云端硬盘"
 
 #: cps/gdrive.py:103
 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console"
@@ -401,7 +407,7 @@ msgstr "回调域名尚未被校验,请在google开发者控制台按步骤校
 #: cps/helper.py:79
 #, python-format
 msgid "%(format)s format not found for book id: %(book)d"
-msgstr "找不到id为 %(book)d 的书的 %(format)s 格式"
+msgstr "找不到id为 %(book)d 的书籍的 %(format)s 格式"
 
 #: cps/helper.py:91
 #, python-format
@@ -415,12 +421,12 @@ msgstr "发送到Kindle"
 
 #: cps/helper.py:99 cps/helper.py:117 cps/helper.py:228
 msgid "This e-mail has been sent via Calibre-Web."
-msgstr "此邮件已经通过Calibre-Web发送"
+msgstr "此邮件已经通过Calibre-Web发送。"
 
 #: cps/helper.py:110
 #, python-format
 msgid "%(format)s not found: %(fn)s"
-msgstr "找不到 %(format)s: %(fn)s"
+msgstr "找不到 %(format)s:%(fn)s"
 
 #: cps/helper.py:115
 msgid "Calibre-Web test e-mail"
@@ -437,7 +443,7 @@ msgstr "开启Calibre-Web之旅"
 #: cps/helper.py:134
 #, python-format
 msgid "Registration e-mail for user: %(name)s"
-msgstr "用户 %(name)s 的注册邮箱"
+msgstr "用户注册电子邮件:%(name)s"
 
 #: cps/helper.py:151 cps/helper.py:155 cps/helper.py:159 cps/helper.py:168
 #: cps/helper.py:172 cps/helper.py:176
@@ -453,41 +459,41 @@ msgstr "转换 %(orig)s 到 %(format)s 并发送到Kindle"
 #: cps/helper.py:228
 #, python-format
 msgid "E-mail: %(book)s"
-msgstr ""
+msgstr "邮件:%(book)s"
 
 #: cps/helper.py:230
 msgid "The requested file could not be read. Maybe wrong permissions?"
-msgstr "无法读取请求的文件。 可能有错误的权限设置?"
+msgstr "无法读取请求的文件。可能有错误的权限设置?"
 
 #: cps/helper.py:300
 #, python-format
 msgid "Deleting book %(id)s failed, path has subfolders: %(path)s"
-msgstr ""
+msgstr "删除书籍 %(id)s失败,路径包含子文件夹:%(path)s"
 
 #: cps/helper.py:310
 #, python-format
 msgid "Deleting book %(id)s failed: %(message)s"
-msgstr ""
+msgstr "删除书籍 %(id)s失败:%(message)s"
 
 #: cps/helper.py:320
 #, python-format
 msgid "Deleting book %(id)s, book path not valid: %(path)s"
-msgstr ""
+msgstr "删除书籍 %(id)s失败,书籍路径无效:%(path)s"
 
 #: cps/helper.py:355
 #, python-format
 msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
-msgstr "将标题从'%(src)s'改为'%(dest)s'时失败,出错信息: %(error)s"
+msgstr "将标题从“%(src)s”改为“%(dest)s”时失败,出错信息:%(error)s"
 
 #: cps/helper.py:365
 #, python-format
 msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
-msgstr "将作者从'%(src)s'改为'%(dest)s'时失败,出错信息: %(error)s"
+msgstr "将作者从“%(src)s”改为“%(dest)s”时失败,出错信息:%(error)s"
 
 #: cps/helper.py:379
 #, python-format
 msgid "Rename file in path '%(src)s' to '%(dest)s' failed with error: %(error)s"
-msgstr "从 '%(src)s' 重命名为 '%(dest)s' 失败,报错信息: %(error)s"
+msgstr "从“%(src)s”重命名为“%(dest)s”失败,出错信息:%(error)s"
 
 #: cps/helper.py:405 cps/helper.py:415 cps/helper.py:423
 #, python-format
@@ -499,81 +505,81 @@ msgstr "Google Drive上找不到文件 %(file)s"
 msgid "Book path %(path)s not found on Google Drive"
 msgstr "Google Drive上找不到书籍路径 %(path)s"
 
-#: cps/helper.py:542
+#: cps/helper.py:550
 msgid "Error Downloading Cover"
-msgstr ""
+msgstr "下载封面时出错"
 
-#: cps/helper.py:545
+#: cps/helper.py:553
 msgid "Cover Format Error"
-msgstr ""
+msgstr "封面格式出错"
 
-#: cps/helper.py:561
+#: cps/helper.py:569
 msgid "Failed to create path for cover"
-msgstr ""
+msgstr "创建封面路径失败"
 
-#: cps/helper.py:566
+#: cps/helper.py:574
 msgid "Cover-file is not a valid image file, or could not be stored"
-msgstr ""
+msgstr "封面文件不是有效的图片文件,或者无法存储"
 
-#: cps/helper.py:577
+#: cps/helper.py:585
 msgid "Only jpg/jpeg/png/webp files are supported as coverfile"
-msgstr ""
+msgstr "仅将jpg、jpeg、png、webp文件作为封面文件"
 
-#: cps/helper.py:591
+#: cps/helper.py:599
 msgid "Only jpg/jpeg files are supported as coverfile"
-msgstr ""
+msgstr "仅将jpg、jpeg文件作为封面文件"
 
-#: cps/helper.py:640
+#: cps/helper.py:648
 msgid "Unrar binary file not found"
-msgstr ""
+msgstr "找不到Unrar执行文件"
 
-#: cps/helper.py:654
+#: cps/helper.py:662
 msgid "Error excecuting UnRar"
-msgstr ""
+msgstr "执行UnRar时出错"
 
-#: cps/helper.py:710
+#: cps/helper.py:718
 msgid "Waiting"
 msgstr "等待中"
 
-#: cps/helper.py:712
+#: cps/helper.py:720
 msgid "Failed"
 msgstr "失败"
 
-#: cps/helper.py:714
+#: cps/helper.py:722
 msgid "Started"
 msgstr "已开始"
 
-#: cps/helper.py:716
+#: cps/helper.py:724
 msgid "Finished"
 msgstr "已完成"
 
-#: cps/helper.py:718
+#: cps/helper.py:726
 msgid "Unknown Status"
 msgstr "未知状态"
 
-#: cps/helper.py:723
+#: cps/helper.py:731
 msgid "E-mail: "
-msgstr ""
+msgstr "邮件: "
 
-#: cps/helper.py:725 cps/helper.py:729
+#: cps/helper.py:733 cps/helper.py:737
 msgid "Convert: "
-msgstr "转换:"
+msgstr "转换: "
 
-#: cps/helper.py:727
+#: cps/helper.py:735
 msgid "Upload: "
-msgstr "上传:"
+msgstr "上传: "
 
-#: cps/helper.py:731
+#: cps/helper.py:739
 msgid "Unknown Task: "
-msgstr "未知任务:"
+msgstr "未知任务: "
 
 #: cps/kobo_auth.py:130
 msgid "PLease access calibre-web from non localhost to get valid api_endpoint for kobo device"
-msgstr "请不要使用localhost访问calibre-web,以便kobo设备能获取有效的api_endpoint"
+msgstr "请不要使用localhost访问Calibre-Web,以便Kobo设备能获取有效的api_endpoint"
 
 #: cps/kobo_auth.py:133 cps/kobo_auth.py:153
 msgid "Kobo Setup"
-msgstr ""
+msgstr "Kobo 设置"
 
 #: cps/oauth_bb.py:73
 #, python-format
@@ -596,34 +602,34 @@ msgstr "使用Google登录失败。"
 msgid "Failed to fetch user info from Google."
 msgstr "从Google获取用户信息失败。"
 
-#: cps/oauth_bb.py:225 cps/web.py:1397 cps/web.py:1537
+#: cps/oauth_bb.py:225 cps/web.py:1394 cps/web.py:1534
 #, python-format
 msgid "you are now logged in as: '%(nickname)s'"
-msgstr "您现在已以'%(nickname)s'身份登录"
+msgstr "您现在已以“%(nickname)s”身份登录"
 
 #: cps/oauth_bb.py:235
 #, python-format
 msgid "Link to %(oauth)s Succeeded"
-msgstr ""
+msgstr "链接到%(oauth)s成功"
 
 #: cps/oauth_bb.py:241
 msgid "Login failed, No User Linked With OAuth Account"
-msgstr ""
+msgstr "登录失败,没有用户与OAuth帐户关联"
 
 #: cps/oauth_bb.py:283
 #, python-format
 msgid "Unlink to %(oauth)s Succeeded"
-msgstr ""
+msgstr "取消链接到%(oauth)s成功"
 
 #: cps/oauth_bb.py:287
 #, python-format
 msgid "Unlink to %(oauth)s Failed"
-msgstr ""
+msgstr "取消链接到%(oauth)s失败"
 
 #: cps/oauth_bb.py:290
 #, python-format
 msgid "Not Linked to %(oauth)s."
-msgstr ""
+msgstr "未链接到%(oauth)s。"
 
 #: cps/oauth_bb.py:318
 msgid "GitHub Oauth error, please retry later."
@@ -633,232 +639,232 @@ msgstr "GitHub Oauth 错误,请重试。"
 msgid "Google Oauth error, please retry later."
 msgstr "Google Oauth 错误,请重试。"
 
-#: cps/shelf.py:66 cps/shelf.py:111
+#: cps/shelf.py:67 cps/shelf.py:120
 msgid "Invalid shelf specified"
 msgstr "指定的书架无效"
 
-#: cps/shelf.py:72
+#: cps/shelf.py:73
 #, python-format
 msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s"
 msgstr "对不起,您没有添加书籍到书架 %(shelfname)s 的权限"
 
-#: cps/shelf.py:82
+#: cps/shelf.py:83
 #, python-format
 msgid "Book is already part of the shelf: %(shelfname)s"
-msgstr "此书已经是书架 %(shelfname)s 的一部分"
+msgstr "此书籍已经是书架 %(shelfname)s 的一部分"
 
-#: cps/shelf.py:97
+#: cps/shelf.py:106
 #, python-format
 msgid "Book has been added to shelf: %(sname)s"
-msgstr "此书已被添加到书架: %(sname)s"
+msgstr "此书籍已被添加到书架:%(sname)s"
 
-#: cps/shelf.py:115
+#: cps/shelf.py:124
 #, python-format
 msgid "You are not allowed to add a book to the the shelf: %(name)s"
 msgstr "您没有添加书籍到书架 %(name)s 的权限"
 
-#: cps/shelf.py:133
+#: cps/shelf.py:142
 #, python-format
 msgid "Books are already part of the shelf: %(name)s"
 msgstr "书籍已经在书架 %(name)s 中了"
 
-#: cps/shelf.py:148
+#: cps/shelf.py:158
 #, python-format
 msgid "Books have been added to shelf: %(sname)s"
-msgstr "书籍已经被添加到书架 %(sname)s 中'"
+msgstr "书籍已经被添加到书架 %(sname)s 中"
 
-#: cps/shelf.py:150
+#: cps/shelf.py:163
 #, python-format
 msgid "Could not add books to shelf: %(sname)s"
-msgstr "无法添加书籍到书架: %(sname)s"
+msgstr "无法添加书籍到书架:%(sname)s"
 
-#: cps/shelf.py:188
+#: cps/shelf.py:208
 #, python-format
 msgid "Book has been removed from shelf: %(sname)s"
 msgstr "此书已从书架 %(sname)s 中删除"
 
-#: cps/shelf.py:196
+#: cps/shelf.py:216
 #, python-format
 msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
 msgstr "对不起,您没有从书架 %(sname)s 中删除书籍的权限"
 
-#: cps/shelf.py:220 cps/shelf.py:260
+#: cps/shelf.py:240 cps/shelf.py:284
 #, python-format
 msgid "A public shelf with the name '%(title)s' already exists."
-msgstr ""
+msgstr "公共书架:%(title)s已经存在已经存在。"
 
-#: cps/shelf.py:229 cps/shelf.py:270
+#: cps/shelf.py:249 cps/shelf.py:294
 #, python-format
 msgid "A private shelf with the name '%(title)s' already exists."
-msgstr ""
+msgstr "私有书架:%(title)s已经存在已经存在。"
 
-#: cps/shelf.py:236
+#: cps/shelf.py:256
 #, python-format
 msgid "Shelf %(title)s created"
-msgstr "书架 %(title)s 已被创建"
+msgstr "书架 %(title)s 已创建"
 
-#: cps/shelf.py:239 cps/shelf.py:284
+#: cps/shelf.py:263 cps/shelf.py:312
 msgid "There was an error"
 msgstr "发生错误"
 
-#: cps/shelf.py:240 cps/shelf.py:242 cps/templates/layout.html:144
+#: cps/shelf.py:264 cps/shelf.py:266 cps/templates/layout.html:144
 msgid "Create a Shelf"
 msgstr "创建书架"
 
-#: cps/shelf.py:282
+#: cps/shelf.py:306
 #, python-format
 msgid "Shelf %(title)s changed"
-msgstr "书架 %(title)s 已被修改"
+msgstr "书架 %(title)s 已修改"
 
-#: cps/shelf.py:285 cps/shelf.py:287
+#: cps/shelf.py:313 cps/shelf.py:315
 msgid "Edit a shelf"
 msgstr "编辑书架"
 
-#: cps/shelf.py:332
+#: cps/shelf.py:369
 #, python-format
 msgid "Shelf: '%(name)s'"
-msgstr "书架: '%(name)s'"
+msgstr "书架:%(name)s"
 
-#: cps/shelf.py:335
+#: cps/shelf.py:372
 msgid "Error opening shelf. Shelf does not exist or is not accessible"
 msgstr "打开书架出错。书架不存在或不可访问"
 
-#: cps/shelf.py:368
+#: cps/shelf.py:409
 msgid "Hidden Book"
 msgstr "隐藏书籍"
 
-#: cps/shelf.py:373
+#: cps/shelf.py:414
 #, python-format
 msgid "Change order of Shelf: '%(name)s'"
-msgstr "修改书架 '%(name)s' 顺序"
+msgstr "修改书架 %(name)s 顺序"
 
-#: cps/ub.py:64
+#: cps/ub.py:65
 msgid "Recently Added"
 msgstr "最近添加"
 
-#: cps/ub.py:66
+#: cps/ub.py:67
 msgid "Show recent books"
 msgstr "显示最近书籍"
 
-#: cps/templates/index.xml:17 cps/ub.py:67
+#: cps/templates/index.xml:17 cps/ub.py:68
 msgid "Hot Books"
 msgstr "热门书籍"
 
-#: cps/ub.py:69
+#: cps/ub.py:70
 msgid "Show Hot Books"
 msgstr "显示热门书籍"
 
-#: cps/templates/index.xml:24 cps/ub.py:71 cps/web.py:655
+#: cps/templates/index.xml:24 cps/ub.py:72 cps/web.py:652
 msgid "Top Rated Books"
 msgstr "最高评分书籍"
 
-#: cps/ub.py:73
+#: cps/ub.py:74
 msgid "Show Top Rated Books"
 msgstr "显示最高评分书籍"
 
-#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:74
-#: cps/web.py:1222
+#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:75
+#: cps/web.py:1219
 msgid "Read Books"
 msgstr "已读书籍"
 
-#: cps/ub.py:76
+#: cps/ub.py:77
 msgid "Show read and unread"
-msgstr "显示已读和未读"
+msgstr "显示阅读状态"
 
-#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:78
-#: cps/web.py:1225
+#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:79
+#: cps/web.py:1222
 msgid "Unread Books"
 msgstr "未读书籍"
 
-#: cps/ub.py:80
+#: cps/ub.py:81
 msgid "Show unread"
 msgstr "显示未读"
 
-#: cps/ub.py:81
+#: cps/ub.py:82
 msgid "Discover"
 msgstr "发现"
 
-#: cps/ub.py:83
+#: cps/ub.py:84
 msgid "Show random books"
 msgstr "显示随机书籍"
 
-#: cps/templates/index.xml:75 cps/ub.py:84 cps/web.py:970
+#: cps/templates/index.xml:75 cps/ub.py:85 cps/web.py:967
 msgid "Categories"
 msgstr "分类"
 
-#: cps/ub.py:86
+#: cps/ub.py:87
 msgid "Show category selection"
 msgstr "显示分类选择"
 
 #: cps/templates/book_edit.html:84 cps/templates/index.xml:82
-#: cps/templates/search_form.html:53 cps/ub.py:87 cps/web.py:886 cps/web.py:896
+#: cps/templates/search_form.html:53 cps/ub.py:88 cps/web.py:883 cps/web.py:893
 msgid "Series"
 msgstr "丛书"
 
-#: cps/ub.py:89
+#: cps/ub.py:90
 msgid "Show series selection"
 msgstr "显示丛书选择"
 
-#: cps/templates/index.xml:61 cps/ub.py:90
+#: cps/templates/index.xml:61 cps/ub.py:91
 msgid "Authors"
 msgstr "作者"
 
-#: cps/ub.py:92
+#: cps/ub.py:93
 msgid "Show author selection"
 msgstr "显示作者选择"
 
-#: cps/templates/index.xml:68 cps/ub.py:94 cps/web.py:869
+#: cps/templates/index.xml:68 cps/ub.py:95 cps/web.py:866
 msgid "Publishers"
 msgstr "出版社"
 
-#: cps/ub.py:96
+#: cps/ub.py:97
 msgid "Show publisher selection"
 msgstr "显示出版社选择"
 
-#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:97
-#: cps/web.py:953
+#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:98
+#: cps/web.py:950
 msgid "Languages"
 msgstr "语言"
 
-#: cps/ub.py:100
+#: cps/ub.py:101
 msgid "Show language selection"
 msgstr "显示语言选择"
 
-#: cps/templates/index.xml:96 cps/ub.py:101
+#: cps/templates/index.xml:96 cps/ub.py:102
 msgid "Ratings"
 msgstr "评分"
 
-#: cps/ub.py:103
+#: cps/ub.py:104
 msgid "Show ratings selection"
 msgstr "显示评分选择"
 
-#: cps/templates/index.xml:104 cps/ub.py:104
+#: cps/templates/index.xml:104 cps/ub.py:105
 msgid "File formats"
 msgstr "文件格式"
 
-#: cps/ub.py:106
+#: cps/ub.py:107
 msgid "Show file formats selection"
 msgstr "显示文件格式选择"
 
-#: cps/ub.py:108 cps/web.py:1249
+#: cps/ub.py:109 cps/web.py:1246
 msgid "Archived Books"
-msgstr ""
+msgstr "归档书籍"
 
-#: cps/ub.py:110
+#: cps/ub.py:111
 msgid "Show archived books"
-msgstr ""
+msgstr "显示归档书籍"
 
 #: cps/updater.py:294 cps/updater.py:305 cps/updater.py:406 cps/updater.py:420
 msgid "Unexpected data while reading update information"
-msgstr "读取更新信息时出现异常数据"
+msgstr "读取更新信息时出现意外数据"
 
 #: cps/updater.py:301 cps/updater.py:412
 msgid "No update available. You already have the latest version installed"
-msgstr "没有可用更新。您已经安装了最新版本"
+msgstr "无可用更新。您已经安装了最新版本"
 
 #: cps/updater.py:333
 msgid "A new update is available. Click on the button below to update to the latest version."
-msgstr "有一个更新可用。点击正文按钮更新到最新版本。"
+msgstr "有新的更新。单击下面的按钮以更新到最新版本。"
 
 #: cps/updater.py:385
 msgid "Could not fetch update information"
@@ -866,238 +872,238 @@ msgstr "无法获取更新信息"
 
 #: cps/updater.py:399
 msgid "No release information available"
-msgstr "没有可用发布信息"
+msgstr "无可用发布信息"
 
 #: cps/updater.py:456 cps/updater.py:467 cps/updater.py:486
 #, python-format
 msgid "A new update is available. Click on the button below to update to version: %(version)s"
-msgstr "一个新的更新可用。点击下面按钮更新到版本: %(version)s"
+msgstr "有新的更新。单击下面的按钮以更新到版本: %(version)s"
 
 #: cps/updater.py:477
 msgid "Click on the button below to update to the latest stable version."
 msgstr "点击下面按钮更新到最新稳定版本。"
 
-#: cps/web.py:322
+#: cps/web.py:319
 #, python-format
 msgid "Error: %(ldaperror)s"
-msgstr ""
+msgstr "错误:%(ldaperror)s"
 
-#: cps/web.py:326
+#: cps/web.py:323
 msgid "Error: No user returned in response of LDAP server"
-msgstr ""
+msgstr "错误:在LDAP服务器的响应中没有返回用户"
 
-#: cps/web.py:374
+#: cps/web.py:371
 msgid "Failed to Create at Least One LDAP User"
-msgstr ""
+msgstr "创建至少一个LDAP用户失败"
 
-#: cps/web.py:377
+#: cps/web.py:374
 msgid "At Least One LDAP User Not Found in Database"
-msgstr ""
+msgstr "数据库中没有找到至少一个LDAP用户"
 
-#: cps/web.py:379
+#: cps/web.py:376
 msgid "User Successfully Imported"
-msgstr ""
+msgstr "用户成功导入"
 
-#: cps/web.py:625
+#: cps/web.py:622
 msgid "Recently Added Books"
 msgstr "最近添加的书籍"
 
-#: cps/templates/index.html:5 cps/web.py:663
+#: cps/templates/index.html:5 cps/web.py:660
 msgid "Discover (Random Books)"
 msgstr "发现(随机书籍)"
 
-#: cps/web.py:691
+#: cps/web.py:688
 msgid "Books"
-msgstr ""
+msgstr "书籍"
 
-#: cps/web.py:718
+#: cps/web.py:715
 msgid "Hot Books (Most Downloaded)"
 msgstr "热门书籍(最多下载)"
 
-#: cps/web.py:731
+#: cps/web.py:728
 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible"
-msgstr "无法打开电子书。 文件不存在或者文件不可访问:"
+msgstr "糟糕!选择书名无法打开。文件不存在或者文件不可访问"
 
-#: cps/web.py:745
+#: cps/web.py:742
 #, python-format
 msgid "Author: %(name)s"
-msgstr "作者: %(name)s"
+msgstr "作者:%(name)s"
 
-#: cps/web.py:759
+#: cps/web.py:756
 #, python-format
 msgid "Publisher: %(name)s"
-msgstr "出版社: %(name)s"
+msgstr "出版社:%(name)s"
 
-#: cps/web.py:772
+#: cps/web.py:769
 #, python-format
 msgid "Series: %(serie)s"
-msgstr "丛书: %(serie)s"
+msgstr "丛书:%(serie)s"
 
-#: cps/web.py:785
+#: cps/web.py:782
 #, python-format
 msgid "Rating: %(rating)s stars"
-msgstr "评分: %(rating)s 星"
+msgstr "评分:%(rating)s 星"
 
-#: cps/web.py:798
+#: cps/web.py:795
 #, python-format
 msgid "File format: %(format)s"
-msgstr "文件格式: %(format)s"
+msgstr "文件格式:%(format)s"
 
-#: cps/web.py:812
+#: cps/web.py:809
 #, python-format
 msgid "Category: %(name)s"
-msgstr "分类: %(name)s"
+msgstr "分类:%(name)s"
 
-#: cps/web.py:831
+#: cps/web.py:828
 #, python-format
 msgid "Language: %(name)s"
-msgstr "语言: %(name)s"
+msgstr "语言:%(name)s"
 
-#: cps/web.py:910
+#: cps/web.py:907
 msgid "Ratings list"
 msgstr "评分列表"
 
-#: cps/web.py:925
+#: cps/web.py:922
 msgid "File formats list"
 msgstr "文件格式列表"
 
-#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:984
+#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:981
 msgid "Tasks"
-msgstr "任务"
+msgstr "任务列表"
 
 #: cps/templates/book_edit.html:235 cps/templates/feed.xml:33
 #: cps/templates/layout.html:45 cps/templates/layout.html:48
-#: cps/templates/search_form.html:174 cps/web.py:1010 cps/web.py:1015
+#: cps/templates/search_form.html:174 cps/web.py:1007 cps/web.py:1012
 msgid "Search"
 msgstr "搜索"
 
-#: cps/web.py:1066
+#: cps/web.py:1063
 msgid "Published after "
-msgstr "出版时晚于 "
+msgstr "出版时间晚于 "
 
-#: cps/web.py:1073
+#: cps/web.py:1070
 msgid "Published before "
-msgstr "出版时早于 "
+msgstr "出版时间早于 "
 
-#: cps/web.py:1087
+#: cps/web.py:1084
 #, python-format
 msgid "Rating <= %(rating)s"
 msgstr "评分 <= %(rating)s"
 
-#: cps/web.py:1089
+#: cps/web.py:1086
 #, python-format
 msgid "Rating >= %(rating)s"
 msgstr "评分 >= %(rating)s"
 
-#: cps/web.py:1158 cps/web.py:1183
+#: cps/web.py:1155 cps/web.py:1180
 msgid "search"
 msgstr "搜索"
 
-#: cps/web.py:1213
+#: cps/web.py:1210
 #, python-format
 msgid "Custom Column No.%(column)d is not existing in calibre database"
-msgstr ""
+msgstr "自定义列号:%(column)d在Calibre数据库中不存在"
 
-#: cps/web.py:1304
+#: cps/web.py:1301
 #, python-format
 msgid "Book successfully queued for sending to %(kindlemail)s"
-msgstr "书籍已经被成功加入 %(kindlemail)s 的发送队列"
+msgstr "书籍已经成功加入 %(kindlemail)s 的发送队列"
 
-#: cps/web.py:1308
+#: cps/web.py:1305
 #, python-format
 msgid "Oops! There was an error sending this book: %(res)s"
-msgstr "发送这本书的时候出现错误: %(res)s"
+msgstr "糟糕!发送这本书籍的时候出现错误:%(res)s"
 
-#: cps/web.py:1310
+#: cps/web.py:1307
 msgid "Please update your profile with a valid Send to Kindle E-mail Address."
-msgstr "请先配置您的kindle邮箱..."
+msgstr "请先配置您的kindle邮箱。"
 
-#: cps/web.py:1327
+#: cps/web.py:1324
 msgid "E-Mail server is not configured, please contact your administrator!"
-msgstr "邮件服务未配置,请联系网站管理员"
+msgstr "邮件服务未配置,请联系网站管理员!"
 
-#: cps/web.py:1328 cps/web.py:1338 cps/web.py:1362 cps/web.py:1366
-#: cps/web.py:1371 cps/web.py:1375
+#: cps/web.py:1325 cps/web.py:1335 cps/web.py:1359 cps/web.py:1363
+#: cps/web.py:1368 cps/web.py:1372
 msgid "register"
 msgstr "注册"
 
-#: cps/web.py:1364
+#: cps/web.py:1361
 msgid "Your e-mail is not allowed to register"
-msgstr "您的邮箱不能用来注册"
+msgstr "您的电子邮件不允许注册"
 
-#: cps/web.py:1367
+#: cps/web.py:1364
 msgid "Confirmation e-mail was send to your e-mail account."
 msgstr "确认邮件已经发送到您的邮箱。"
 
-#: cps/web.py:1370
+#: cps/web.py:1367
 msgid "This username or e-mail address is already in use."
-msgstr "这个用户名或者邮箱已经被使用。"
+msgstr "这个用户名或者邮箱已被使用。"
 
-#: cps/web.py:1387
+#: cps/web.py:1384
 msgid "Cannot activate LDAP authentication"
 msgstr "无法激活LDAP认证"
 
-#: cps/web.py:1404
+#: cps/web.py:1401
 #, python-format
 msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known"
-msgstr ""
+msgstr "后备登录“%(nickname)s”:无法访问LDAP服务器,或用户未知"
 
-#: cps/web.py:1410
+#: cps/web.py:1407
 #, python-format
 msgid "Could not login: %(message)s"
-msgstr ""
+msgstr "无法登录:%(message)s"
 
-#: cps/web.py:1414 cps/web.py:1438
+#: cps/web.py:1411 cps/web.py:1435
 msgid "Wrong Username or Password"
 msgstr "用户名或密码错误"
 
-#: cps/web.py:1421
+#: cps/web.py:1418
 msgid "New Password was send to your email address"
 msgstr "新密码已发送到您的邮箱"
 
-#: cps/web.py:1427
+#: cps/web.py:1424
 msgid "Please enter valid username to reset password"
 msgstr "请输入有效的用户名进行密码重置"
 
-#: cps/web.py:1433
+#: cps/web.py:1430
 #, python-format
 msgid "You are now logged in as: '%(nickname)s'"
-msgstr "您已以 '%(nickname)s' 登录"
+msgstr "您现在已以“%(nickname)s”登录"
 
-#: cps/web.py:1442 cps/web.py:1469
+#: cps/web.py:1439 cps/web.py:1466
 msgid "login"
 msgstr "登录"
 
-#: cps/web.py:1481 cps/web.py:1515
+#: cps/web.py:1478 cps/web.py:1512
 msgid "Token not found"
 msgstr "找不到Token"
 
-#: cps/web.py:1490 cps/web.py:1523
+#: cps/web.py:1487 cps/web.py:1520
 msgid "Token has expired"
 msgstr "Token已过期"
 
-#: cps/web.py:1499
+#: cps/web.py:1496
 msgid "Success! Please return to your device"
 msgstr "成功!请返回您的设备"
 
-#: cps/web.py:1580 cps/web.py:1625 cps/web.py:1631
+#: cps/web.py:1577 cps/web.py:1622 cps/web.py:1628
 #, python-format
 msgid "%(name)s's profile"
-msgstr "%(name)s 的资料"
+msgstr "%(name)s 的用户配置"
 
-#: cps/web.py:1627
+#: cps/web.py:1624
 msgid "Profile updated"
 msgstr "资料已更新"
 
-#: cps/web.py:1656 cps/web.py:1659 cps/web.py:1662 cps/web.py:1669
-#: cps/web.py:1674
+#: cps/web.py:1653 cps/web.py:1656 cps/web.py:1659 cps/web.py:1666
+#: cps/web.py:1671
 msgid "Read a Book"
 msgstr "阅读一本书"
 
 #: cps/worker.py:313
 #, python-format
 msgid "Calibre ebook-convert %(tool)s not found"
-msgstr ""
+msgstr "Calibre 电子书转换器%(tool)s没有发现"
 
 #: cps/worker.py:373
 #, python-format
@@ -1107,12 +1113,12 @@ msgstr "电子书转换器失败: %(error)s"
 #: cps/worker.py:406
 #, python-format
 msgid "Kepubify-converter failed: %(error)s"
-msgstr ""
+msgstr "Kepubify 转换失败:%(error)s"
 
 #: cps/worker.py:430
 #, python-format
 msgid "Converted file not found or more than one file in folder %(folder)s"
-msgstr ""
+msgstr "找不到转换后的文件或文件夹%(folder)s中有多个文件"
 
 #: cps/templates/admin.html:9
 msgid "Users"
@@ -1122,65 +1128,65 @@ msgstr "用户列表"
 #: cps/templates/login.html:9 cps/templates/register.html:8
 #: cps/templates/user_edit.html:9
 msgid "Username"
-msgstr "昵称"
+msgstr "用户名"
 
 #: cps/templates/admin.html:13 cps/templates/register.html:13
 #: cps/templates/user_edit.html:14
 msgid "E-mail Address"
-msgstr "邮箱"
+msgstr "邮箱地址"
 
 #: cps/templates/admin.html:14 cps/templates/user_edit.html:27
 msgid "Send to Kindle E-mail Address"
-msgstr "Send to Kindle邮箱"
+msgstr "接收书籍的Kindle邮箱地址"
 
 #: cps/templates/admin.html:15
 msgid "Downloads"
-msgstr "下载量"
+msgstr "下载次数"
 
 #: cps/templates/admin.html:16 cps/templates/layout.html:77
 msgid "Admin"
-msgstr "管理"
+msgstr "管理权限"
 
 #: cps/templates/admin.html:17 cps/templates/login.html:12
 #: cps/templates/login.html:13 cps/templates/user_edit.html:22
 msgid "Password"
-msgstr "密码"
+msgstr "有无密码"
 
 #: cps/templates/admin.html:18 cps/templates/layout.html:66
 msgid "Upload"
-msgstr "上传"
+msgstr "上传书籍"
 
 #: cps/templates/admin.html:19 cps/templates/detail.html:18
 #: cps/templates/detail.html:27 cps/templates/shelf.html:6
 #: cps/templates/shelfdown.html:62
 msgid "Download"
-msgstr "下载"
+msgstr "下载书籍"
 
 #: cps/templates/admin.html:20
 msgid "View Books"
-msgstr "查看电子书"
+msgstr "查看书籍"
 
 #: cps/templates/admin.html:21
 msgid "Edit"
-msgstr "编辑"
+msgstr "编辑书籍"
 
 #: cps/templates/admin.html:22 cps/templates/book_edit.html:16
 #: cps/templates/book_edit.html:216 cps/templates/email_edit.html:100
 #: cps/templates/user_edit.html:66 cps/templates/user_edit.html:179
 msgid "Delete"
-msgstr "删除"
+msgstr "删除数据"
 
 #: cps/templates/admin.html:23
 msgid "Public Shelf"
-msgstr ""
+msgstr "公共书架"
 
 #: cps/templates/admin.html:44
 msgid "Add New User"
-msgstr "新建用户"
+msgstr "添加新用户"
 
 #: cps/templates/admin.html:46 cps/templates/admin.html:47
 msgid "Import LDAP Users"
-msgstr ""
+msgstr "导入LDAP用户"
 
 #: cps/templates/admin.html:54
 msgid "E-mail Server Settings"
@@ -1188,7 +1194,7 @@ msgstr "SMTP邮件服务器设置"
 
 #: cps/templates/admin.html:57 cps/templates/email_edit.html:11
 msgid "SMTP Hostname"
-msgstr "SMTP地址"
+msgstr "SMTP主机名"
 
 #: cps/templates/admin.html:58 cps/templates/email_edit.html:15
 msgid "SMTP Port"
@@ -1204,7 +1210,7 @@ msgstr "SMTP用户名"
 
 #: cps/templates/admin.html:61 cps/templates/email_edit.html:35
 msgid "From E-mail"
-msgstr "来自邮箱"
+msgstr "发件人邮箱"
 
 #: cps/templates/admin.html:77
 msgid "Configuration"
@@ -1212,7 +1218,7 @@ msgstr "配置"
 
 #: cps/templates/admin.html:80
 msgid "Calibre Database Directory"
-msgstr "Calibre DB目录"
+msgstr "Calibre 数据库路径"
 
 #: cps/templates/admin.html:84 cps/templates/config_edit.html:129
 msgid "Log Level"
@@ -1240,7 +1246,7 @@ msgstr "开放注册"
 
 #: cps/templates/admin.html:110
 msgid "Magic Link Remote Login"
-msgstr "远程登录"
+msgstr "魔法链接远程登录"
 
 #: cps/templates/admin.html:114
 msgid "Reverse Proxy Login"
@@ -1248,15 +1254,15 @@ msgstr "反向代理登录"
 
 #: cps/templates/admin.html:119
 msgid "Reverse proxy header name"
-msgstr "反向代理header name"
+msgstr "反向代理头部名称"
 
 #: cps/templates/admin.html:124
 msgid "Edit Basic Configuration"
-msgstr "修改基本配置"
+msgstr "编辑基本配置"
 
 #: cps/templates/admin.html:125
 msgid "Edit UI Configuration"
-msgstr "修改界面配置"
+msgstr "编辑界面配置"
 
 #: cps/templates/admin.html:131
 msgid "Administration"
@@ -1272,11 +1278,11 @@ msgstr "重新连接到Calibre数据库"
 
 #: cps/templates/admin.html:134
 msgid "Restart"
-msgstr "重启 Calibre-Web"
+msgstr "重启"
 
 #: cps/templates/admin.html:135
 msgid "Shutdown"
-msgstr "停止 Calibre-Web"
+msgstr "停止"
 
 #: cps/templates/admin.html:141
 msgid "Update"
@@ -1304,7 +1310,7 @@ msgstr "执行更新"
 
 #: cps/templates/admin.html:171
 msgid "Are you sure you want to restart?"
-msgstr "您确定要重启 Calibre-Web 吗?"
+msgstr "您确定要重启吗?"
 
 #: cps/templates/admin.html:176 cps/templates/admin.html:190
 #: cps/templates/admin.html:210 cps/templates/shelf.html:72
@@ -1322,7 +1328,7 @@ msgstr "取消"
 
 #: cps/templates/admin.html:189
 msgid "Are you sure you want to shutdown?"
-msgstr "您确定要关闭 Calibre-Web 吗?"
+msgstr "您确定要关闭吗?"
 
 #: cps/templates/admin.html:201
 msgid "Updating, please do not reload this page"
@@ -1330,11 +1336,11 @@ msgstr "正在更新,请不要刷新页面"
 
 #: cps/templates/author.html:15
 msgid "via"
-msgstr ""
+msgstr "通过"
 
 #: cps/templates/author.html:23
 msgid "In Library"
-msgstr ""
+msgstr "在书库"
 
 #: cps/templates/author.html:34 cps/templates/book_table.html:14
 #: cps/templates/grid.html:14 cps/templates/list.html:14
@@ -1347,11 +1353,11 @@ msgstr "全部"
 #: cps/templates/index.html:89 cps/templates/search.html:64
 #: cps/templates/shelf.html:36
 msgid "reduce"
-msgstr ""
+msgstr "减少"
 
 #: cps/templates/author.html:94
 msgid "More by"
-msgstr ""
+msgstr "更多"
 
 #: cps/templates/book_edit.html:10
 msgid "Delete Book"
@@ -1367,7 +1373,7 @@ msgstr "转换书籍格式:"
 
 #: cps/templates/book_edit.html:28
 msgid "Convert from:"
-msgstr "从格式转换:"
+msgstr "转换从:"
 
 #: cps/templates/book_edit.html:30 cps/templates/book_edit.html:37
 msgid "select an option"
@@ -1397,23 +1403,23 @@ msgstr "简介"
 
 #: cps/templates/book_edit.html:66
 msgid "Identifiers"
-msgstr ""
+msgstr "书号"
 
 #: cps/templates/book_edit.html:70 cps/templates/book_edit.html:308
 msgid "Identifier Type"
-msgstr ""
+msgstr "书号类型"
 
 #: cps/templates/book_edit.html:71 cps/templates/book_edit.html:309
 msgid "Identifier Value"
-msgstr ""
+msgstr "书号编号"
 
 #: cps/templates/book_edit.html:72 cps/templates/book_edit.html:310
 msgid "Remove"
-msgstr ""
+msgstr "移除"
 
 #: cps/templates/book_edit.html:76
 msgid "Add Identifier"
-msgstr ""
+msgstr "添加书号"
 
 #: cps/templates/book_edit.html:80 cps/templates/search_form.html:33
 msgid "Tags"
@@ -1421,7 +1427,7 @@ msgstr "标签"
 
 #: cps/templates/book_edit.html:88
 msgid "Series ID"
-msgstr ""
+msgstr "丛书编号"
 
 #: cps/templates/book_edit.html:92
 msgid "Rating"
@@ -1429,7 +1435,7 @@ msgstr "评分"
 
 #: cps/templates/book_edit.html:96
 msgid "Fetch Cover from URL (JPEG - Image will be downloaded and stored in database)"
-msgstr "封面URL(jpg,封面会被下载被保存在数据库中,然后字段会被重新清空)"
+msgstr "从URL获取封面(JPEG - 图片将下载并存储在数据库中)"
 
 #: cps/templates/book_edit.html:100
 msgid "Upload Cover from Local Disk"
@@ -1456,7 +1462,7 @@ msgstr "确认"
 
 #: cps/templates/book_edit.html:127 cps/templates/search_form.html:138
 msgid "No"
-msgstr "æ— "
+msgstr "没有"
 
 #: cps/templates/book_edit.html:173
 msgid "Upload Format"
@@ -1464,7 +1470,7 @@ msgstr "上传格式"
 
 #: cps/templates/book_edit.html:182
 msgid "View Book on Save"
-msgstr "编辑后查看书籍"
+msgstr "查看保存书籍"
 
 #: cps/templates/book_edit.html:185 cps/templates/book_edit.html:229
 msgid "Fetch Metadata"
@@ -1482,7 +1488,7 @@ msgstr "您真的确认?"
 
 #: cps/templates/book_edit.html:204
 msgid "This book will be permanently erased from database"
-msgstr "书籍会从Calibre数据库中删除"
+msgstr "此书籍将从数据库中永久删除"
 
 #: cps/templates/book_edit.html:205
 msgid "and hard disk"
@@ -1490,11 +1496,11 @@ msgstr ",包括从硬盘中"
 
 #: cps/templates/book_edit.html:209
 msgid "Important Kobo Note: deleted books will remain on any paired Kobo device."
-msgstr ""
+msgstr "Kobo 重要说明:被删除的书籍将保留在任何配对的 Kobo 设备上。"
 
 #: cps/templates/book_edit.html:210
 msgid "Books must first be archived and the device synced before a book can safely be deleted."
-msgstr ""
+msgstr "必须先将书籍存档并同步设备,然后才能安全地删除书籍。"
 
 #: cps/templates/book_edit.html:232
 msgid "Keyword"
@@ -1502,11 +1508,11 @@ msgstr "关键字"
 
 #: cps/templates/book_edit.html:233
 msgid " Search keyword "
-msgstr "搜索关键字"
+msgstr " 搜索关键字 "
 
 #: cps/templates/book_edit.html:239
 msgid "Click the cover to load metadata to the form"
-msgstr "点击封面加载元数据到表单"
+msgstr "单击封面将元数据加载到表单"
 
 #: cps/templates/book_edit.html:254 cps/templates/book_edit.html:294
 msgid "Loading..."
@@ -1520,15 +1526,15 @@ msgstr "关闭"
 
 #: cps/templates/book_edit.html:286 cps/templates/book_edit.html:300
 msgid "Source"
-msgstr "来源"
+msgstr "源"
 
 #: cps/templates/book_edit.html:295
 msgid "Search error!"
-msgstr "搜索错误"
+msgstr "搜索错误!"
 
 #: cps/templates/book_edit.html:296
 msgid "No Result(s) found! Please try another keyword."
-msgstr "找不到结果。请尝试另一个关键字"
+msgstr "无搜索结果!请尝试另一个关键字。"
 
 #: cps/templates/config_edit.html:12
 msgid "Library Configuration"
@@ -1536,7 +1542,7 @@ msgstr "书库配置"
 
 #: cps/templates/config_edit.html:19
 msgid "Location of Calibre Database"
-msgstr "Calibre 数据库位置"
+msgstr "Calibre 数据库路径"
 
 #: cps/templates/config_edit.html:28
 msgid "Use Google Drive?"
@@ -1560,11 +1566,11 @@ msgstr "登录后请完成Google Drive设置"
 
 #: cps/templates/config_edit.html:52
 msgid "Google Drive Calibre folder"
-msgstr "Google Drive Calibre 目录"
+msgstr "Google Drive Calibre 路径"
 
 #: cps/templates/config_edit.html:60
 msgid "Metadata Watch Channel ID"
-msgstr "元数据监视频道ID"
+msgstr "元数据监视通道ID"
 
 #: cps/templates/config_edit.html:63
 msgid "Revoke"
@@ -1580,15 +1586,15 @@ msgstr "服务器端口"
 
 #: cps/templates/config_edit.html:93
 msgid "SSL certfile location (leave it empty for non-SSL Servers)"
-msgstr "SSL 证书文件位置(非SSL服务器请留空)"
+msgstr "SSL 证书文件路径(非SSL服务器请留空)"
 
 #: cps/templates/config_edit.html:100
 msgid "SSL Keyfile location (leave it empty for non-SSL Servers)"
-msgstr "SSL Key文件位置(非SSL服务器请留空)"
+msgstr "SSL 密钥文件路径(非SSL服务器请留空)"
 
 #: cps/templates/config_edit.html:108
 msgid "Update Channel"
-msgstr ""
+msgstr "更新通道"
 
 #: cps/templates/config_edit.html:110
 msgid "Stable"
@@ -1596,7 +1602,7 @@ msgstr "稳定版"
 
 #: cps/templates/config_edit.html:111
 msgid "Nightly"
-msgstr ""
+msgstr "夜间版"
 
 #: cps/templates/config_edit.html:122
 msgid "Logfile Configuration"
@@ -1604,7 +1610,7 @@ msgstr "日志文件配置"
 
 #: cps/templates/config_edit.html:138
 msgid "Location and name of logfile (calibre-web.log for no entry)"
-msgstr "日志文件位置和名称(默认为calibre-web.log)"
+msgstr "日志文件路径和名称(默认为calibre-web.log)"
 
 #: cps/templates/config_edit.html:143
 msgid "Enable Access Log"
@@ -1612,11 +1618,11 @@ msgstr "启用访问日志"
 
 #: cps/templates/config_edit.html:146
 msgid "Location and name of access logfile (access.log for no entry)"
-msgstr "访问日志位置和名称(默认为access.log)"
+msgstr "访问日志路径和名称(默认为access.log)"
 
 #: cps/templates/config_edit.html:157
 msgid "Feature Configuration"
-msgstr "特性配置"
+msgstr "功能配置"
 
 #: cps/templates/config_edit.html:165
 msgid "Enable Uploads"
@@ -1624,7 +1630,7 @@ msgstr "启用上传"
 
 #: cps/templates/config_edit.html:169
 msgid "Allowed Upload Fileformats"
-msgstr ""
+msgstr "允许上传的文件格式"
 
 #: cps/templates/config_edit.html:175
 msgid "Enable Anonymous Browsing"
@@ -1636,11 +1642,11 @@ msgstr "启用注册"
 
 #: cps/templates/config_edit.html:184
 msgid "Use E-Mail as Username"
-msgstr ""
+msgstr "使用邮箱或用户名"
 
 #: cps/templates/config_edit.html:189
 msgid "Enable Magic Link Remote Login"
-msgstr "启用远程登录 ('魔法链接')"
+msgstr "启用魔法链接远程登录"
 
 #: cps/templates/config_edit.html:194
 msgid "Enable Kobo sync"
@@ -1648,7 +1654,7 @@ msgstr "启用Kobo同步"
 
 #: cps/templates/config_edit.html:199
 msgid "Proxy unknown requests to Kobo Store"
-msgstr ""
+msgstr "代理未知请求到Kobo商店"
 
 #: cps/templates/config_edit.html:206
 msgid "Use Goodreads"
@@ -1656,15 +1662,15 @@ msgstr "使用Goodreads"
 
 #: cps/templates/config_edit.html:207
 msgid "Create an API Key"
-msgstr "获取API Key"
+msgstr "创建API Key"
 
 #: cps/templates/config_edit.html:211
 msgid "Goodreads API Key"
-msgstr ""
+msgstr "Goodreads API Key"
 
 #: cps/templates/config_edit.html:215
 msgid "Goodreads API Secret"
-msgstr ""
+msgstr "Goodreads API Secret"
 
 #: cps/templates/config_edit.html:222
 msgid "Allow Reverse Proxy Authentication"
@@ -1672,7 +1678,7 @@ msgstr "允许反向代理认证方式"
 
 #: cps/templates/config_edit.html:226
 msgid "Reverse Proxy Header Name"
-msgstr "反向代理Header Name"
+msgstr "反向代理头部名称"
 
 #: cps/templates/config_edit.html:233
 msgid "Login type"
@@ -1688,11 +1694,11 @@ msgstr "使用LDAP认证"
 
 #: cps/templates/config_edit.html:240
 msgid "Use OAuth"
-msgstr "使用OAuth"
+msgstr "使用OAuth认证"
 
 #: cps/templates/config_edit.html:247
 msgid "LDAP Server Host Name or IP Address"
-msgstr "LDAP服务器名称或IP地址"
+msgstr "LDAP服务器主机名或IP地址"
 
 #: cps/templates/config_edit.html:251
 msgid "LDAP Server Port"
@@ -1700,7 +1706,7 @@ msgstr "LDAP服务器端口"
 
 #: cps/templates/config_edit.html:255
 msgid "LDAP Encryption"
-msgstr ""
+msgstr "LDAP 加密"
 
 #: cps/templates/config_edit.html:257 cps/templates/config_view_edit.html:61
 #: cps/templates/email_edit.html:21
@@ -1709,31 +1715,31 @@ msgstr "æ— "
 
 #: cps/templates/config_edit.html:258
 msgid "TLS"
-msgstr ""
+msgstr "TLS协议"
 
 #: cps/templates/config_edit.html:259
 msgid "SSL"
-msgstr ""
+msgstr "SSL协议"
 
 #: cps/templates/config_edit.html:264
 msgid "LDAP Certificate Path"
-msgstr ""
+msgstr "LDAP 证书路径"
 
 #: cps/templates/config_edit.html:269
 msgid "LDAP Authentication"
-msgstr ""
+msgstr "LDAP 验证方式"
 
 #: cps/templates/config_edit.html:271
 msgid "Anonymous"
-msgstr ""
+msgstr "匿名"
 
 #: cps/templates/config_edit.html:272
 msgid "Unauthenticated"
-msgstr ""
+msgstr "无验证"
 
 #: cps/templates/config_edit.html:273
 msgid "Simple"
-msgstr ""
+msgstr "简单"
 
 #: cps/templates/config_edit.html:278
 msgid "LDAP Administrator Username"
@@ -1745,66 +1751,66 @@ msgstr "LDAP管理员密码"
 
 #: cps/templates/config_edit.html:289
 msgid "LDAP Distinguished Name (DN)"
-msgstr ""
+msgstr "LDAP专有名称(DN)"
 
 #: cps/templates/config_edit.html:293
 msgid "LDAP User Object Filter"
-msgstr ""
+msgstr "LDAP用户对象过滤器"
 
 #: cps/templates/config_edit.html:298
 msgid "LDAP Server is OpenLDAP?"
-msgstr ""
+msgstr "LDAP服务器是 OpenLDAP?"
 
 #: cps/templates/config_edit.html:300
 msgid "Following Settings are Needed For User Import"
-msgstr ""
+msgstr "用户导入需要以下设置"
 
 #: cps/templates/config_edit.html:302
 msgid "LDAP Group Object Filter"
-msgstr ""
+msgstr "LDAP组对象过滤器"
 
 #: cps/templates/config_edit.html:306
 msgid "LDAP Group Name"
-msgstr ""
+msgstr "LDAP组名"
 
 #: cps/templates/config_edit.html:310
 msgid "LDAP Group Members Field"
-msgstr ""
+msgstr "LDAP组成员字段"
 
 #: cps/templates/config_edit.html:319
 #, python-format
 msgid "Obtain %(provider)s OAuth Credential"
-msgstr "获取 %(provider)s OAuth Credential"
+msgstr "获取 %(provider)s OAuth凭证"
 
 #: cps/templates/config_edit.html:322
 #, python-format
 msgid "%(provider)s OAuth Client Id"
-msgstr ""
+msgstr "%(provider)s OAuth Client Secret"
 
 #: cps/templates/config_edit.html:326
 #, python-format
 msgid "%(provider)s OAuth Client Secret"
-msgstr ""
+msgstr "%(provider)s OAuth Client Secret"
 
 #: cps/templates/config_edit.html:342
 msgid "External binaries"
-msgstr "外部二进制"
+msgstr "扩展程序配置"
 
 #: cps/templates/config_edit.html:348
 msgid "Path to Calibre E-Book Converter"
-msgstr ""
+msgstr "Calibre 电子书转换器路径"
 
 #: cps/templates/config_edit.html:356
 msgid "Calibre E-Book Converter Settings"
-msgstr ""
+msgstr "Calibre 电子书转换器设置"
 
 #: cps/templates/config_edit.html:359
 msgid "Path to Kepubify E-Book Converter"
-msgstr ""
+msgstr "KEpubify 电子书转换器路径"
 
 #: cps/templates/config_edit.html:367
 msgid "Location of Unrar binary"
-msgstr "Unrar二进制位置"
+msgstr "Unrar程序路径"
 
 #: cps/templates/config_edit.html:390 cps/templates/layout.html:85
 #: cps/templates/login.html:4 cps/templates/login.html:20
@@ -1817,7 +1823,7 @@ msgstr "查看配置"
 
 #: cps/templates/config_view_edit.html:23 cps/templates/shelf_edit.html:7
 msgid "Title"
-msgstr "标题"
+msgstr "名称"
 
 #: cps/templates/config_view_edit.html:31
 msgid "No. of Random Books to Display"
@@ -1825,7 +1831,7 @@ msgstr "随机书籍显示数量"
 
 #: cps/templates/config_view_edit.html:35
 msgid "No. of Authors to Display Before Hiding (0=Disable Hiding)"
-msgstr "作者数量显示上限(0=不隐藏)"
+msgstr "主页中书籍作者的最大显示数量(0=不隐藏)"
 
 #: cps/templates/config_view_edit.html:39 cps/templates/readcbr.html:112
 msgid "Theme"
@@ -1837,47 +1843,47 @@ msgstr "标准主题"
 
 #: cps/templates/config_view_edit.html:42
 msgid "caliBlur! Dark Theme"
-msgstr ""
+msgstr "黑暗主题"
 
 #: cps/templates/config_view_edit.html:46
 msgid "Regular Expression for Ignoring Columns"
-msgstr "忽略列的正则表达式"
+msgstr "可忽略的自定义栏目(正则表达式)"
 
 #: cps/templates/config_view_edit.html:50
 msgid "Link Read/Unread Status to Calibre Column"
-msgstr "链接 已读/未读 状态到Calibre栏"
+msgstr "选择自定义栏目作为阅读状态"
 
 #: cps/templates/config_view_edit.html:59
 msgid "View Restrictions based on Calibre column"
-msgstr "根据Calibre column设定查看限制"
+msgstr "选择自定义栏目作为书籍可见性"
 
 #: cps/templates/config_view_edit.html:68
 msgid "Regular Expression for Title Sorting"
-msgstr "标题排序的正则表达式"
+msgstr "按规则提取书名后排序(正则表达式)"
 
 #: cps/templates/config_view_edit.html:80
 msgid "Default Settings for New Users"
-msgstr "新用户默认设置"
+msgstr "新用户默认权限设置"
 
 #: cps/templates/config_view_edit.html:88 cps/templates/user_edit.html:94
 msgid "Admin User"
-msgstr "管理用户"
+msgstr "管理员用户"
 
 #: cps/templates/config_view_edit.html:92 cps/templates/user_edit.html:99
 msgid "Allow Downloads"
-msgstr "允许下载"
+msgstr "允许下载书籍"
 
 #: cps/templates/config_view_edit.html:96 cps/templates/user_edit.html:103
 msgid "Allow eBook Viewer"
-msgstr "允许eBook Viewer"
+msgstr "允许在线阅读"
 
 #: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:107
 msgid "Allow Uploads"
-msgstr "允许上传"
+msgstr "允许上传书籍"
 
 #: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:111
 msgid "Allow Edit"
-msgstr "允许编辑"
+msgstr "允许编辑书籍"
 
 #: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:115
 msgid "Allow Delete Books"
@@ -1893,23 +1899,23 @@ msgstr "允许编辑公共书架"
 
 #: cps/templates/config_view_edit.html:126
 msgid "Default Visibilities for New Users"
-msgstr "新用户的默认显示权限"
+msgstr "新用户默认显示权限"
 
 #: cps/templates/config_view_edit.html:142 cps/templates/user_edit.html:82
 msgid "Show Random Books in Detail View"
-msgstr "在详情页显示随机书籍"
+msgstr "在主页显示随机书籍"
 
 #: cps/templates/config_view_edit.html:144 cps/templates/user_edit.html:85
 msgid "Add Allowed/Denied Tags"
-msgstr "添加(允许/禁止)标签"
+msgstr "添加显示或隐藏书籍的标签值"
 
 #: cps/templates/config_view_edit.html:145
 msgid "Add Allowed/Denied custom column values"
-msgstr "添加(允许/禁止)自定义栏值"
+msgstr "添加显示或隐藏书籍的自定义栏目值"
 
 #: cps/templates/detail.html:59
 msgid "Read in Browser"
-msgstr "在线浏览"
+msgstr "在线阅读"
 
 #: cps/templates/detail.html:72
 msgid "Listen in Browser"
@@ -1917,15 +1923,15 @@ msgstr "在线听书"
 
 #: cps/templates/detail.html:117
 msgid "Book"
-msgstr ""
+msgstr "丛书编号"
 
 #: cps/templates/detail.html:117
 msgid "of"
-msgstr ""
+msgstr "在"
 
 #: cps/templates/detail.html:165
 msgid "Published"
-msgstr "出版"
+msgstr "出版日期"
 
 #: cps/templates/detail.html:200
 msgid "Mark As Unread"
@@ -1941,15 +1947,15 @@ msgstr "已读"
 
 #: cps/templates/detail.html:209
 msgid "Restore from archive"
-msgstr ""
+msgstr "从档案还原"
 
 #: cps/templates/detail.html:209
 msgid "Add to archive"
-msgstr ""
+msgstr "添加到归档"
 
 #: cps/templates/detail.html:210
 msgid "Archived"
-msgstr ""
+msgstr "å½’æ¡£"
 
 #: cps/templates/detail.html:221
 msgid "Description:"
@@ -1963,7 +1969,7 @@ msgstr "添加到书架"
 #: cps/templates/feed.xml:79 cps/templates/layout.html:137
 #: cps/templates/layout.html:141 cps/templates/search.html:20
 msgid "(Public)"
-msgstr ""
+msgstr "(公共)"
 
 #: cps/templates/detail.html:276
 msgid "Edit Metadata"
@@ -1971,11 +1977,11 @@ msgstr "编辑元数据"
 
 #: cps/templates/email_edit.html:22
 msgid "STARTTLS"
-msgstr ""
+msgstr "STARTTLS协议"
 
 #: cps/templates/email_edit.html:23
 msgid "SSL/TLS"
-msgstr ""
+msgstr "SSL/TLS协议"
 
 #: cps/templates/email_edit.html:31
 msgid "SMTP Password"
@@ -1983,7 +1989,7 @@ msgstr "SMTP密码"
 
 #: cps/templates/email_edit.html:38
 msgid "Attachment Size Limit"
-msgstr ""
+msgstr "附件大小限制"
 
 #: cps/templates/email_edit.html:46
 msgid "Save and Send Test E-mail"
@@ -1991,7 +1997,7 @@ msgstr "保存设置并发送测试邮件"
 
 #: cps/templates/email_edit.html:51
 msgid "Allowed Domains (Whitelist)"
-msgstr "允许注册的域名"
+msgstr "允许注册的域名(白名单)"
 
 #: cps/templates/email_edit.html:54 cps/templates/email_edit.html:80
 msgid "Add Domain"
@@ -2007,11 +2013,11 @@ msgstr "输入域名"
 
 #: cps/templates/email_edit.html:68
 msgid "Denied Domains (Blacklist)"
-msgstr "禁用的域名(黑名单)"
+msgstr "禁止注册的域名(黑名单)"
 
 #: cps/templates/email_edit.html:99
 msgid "Are you sure you want to delete this domain?"
-msgstr "您确定要删除这条域名规则吗?"
+msgstr "您确定要删除此域名吗?"
 
 #: cps/templates/feed.xml:21 cps/templates/layout.html:174
 msgid "Next"
@@ -2019,11 +2025,11 @@ msgstr "下一个"
 
 #: cps/templates/generate_kobo_auth_url.html:5
 msgid "Open the .kobo/Kobo eReader.conf file in a text editor and add (or edit):"
-msgstr "在文本编辑器中打开.kobo/Kobo eReader.conf,增加(修改为):"
+msgstr "在文本编辑器中打开.kobo/Kobo eReader.conf,添加(或编辑):"
 
 #: cps/templates/http_error.html:38
 msgid "Create Issue"
-msgstr "创建issue"
+msgstr "创建问题"
 
 #: cps/templates/http_error.html:45
 msgid "Return to Home"
@@ -2031,7 +2037,7 @@ msgstr "回到首页"
 
 #: cps/templates/index.html:64
 msgid "Group by series"
-msgstr "根据系列分组"
+msgstr "根据丛书分组"
 
 #: cps/templates/index.xml:6
 msgid "Start"
@@ -2039,11 +2045,11 @@ msgstr "开始"
 
 #: cps/templates/index.xml:21
 msgid "Popular publications from this catalog based on Downloads."
-msgstr "基于下载数的热门书籍"
+msgstr "基于下载数的热门书籍。"
 
 #: cps/templates/index.xml:28
 msgid "Popular publications from this catalog based on Rating."
-msgstr "基于评分的热门书籍"
+msgstr "基于评分的热门书籍。"
 
 #: cps/templates/index.xml:31
 msgid "Recently added Books"
@@ -2067,7 +2073,7 @@ msgstr "书籍按作者排序"
 
 #: cps/templates/index.xml:72
 msgid "Books ordered by publisher"
-msgstr "书籍按出版社排版"
+msgstr "书籍按出版社排序"
 
 #: cps/templates/index.xml:79
 msgid "Books ordered by category"
@@ -2079,23 +2085,23 @@ msgstr "书籍按丛书排序"
 
 #: cps/templates/index.xml:93
 msgid "Books ordered by Languages"
-msgstr "根据语言排序书籍"
+msgstr "书籍按语言排序"
 
 #: cps/templates/index.xml:100
 msgid "Books ordered by Rating"
-msgstr ""
+msgstr "书籍按评分排序"
 
 #: cps/templates/index.xml:108
 msgid "Books ordered by file formats"
-msgstr "根据文件类型排序书籍"
+msgstr "书籍按文件格式排序"
 
 #: cps/templates/index.xml:111 cps/templates/layout.html:135
 msgid "Shelves"
-msgstr ""
+msgstr "书架列表"
 
 #: cps/templates/index.xml:115
 msgid "Books organized in shelves"
-msgstr ""
+msgstr "书架上的书"
 
 #: cps/templates/layout.html:29
 msgid "Home"
@@ -2137,7 +2143,7 @@ msgstr "注册"
 
 #: cps/templates/layout.html:117 cps/templates/layout.html:221
 msgid "Uploading..."
-msgstr "上传中..."
+msgstr "正在上传..."
 
 #: cps/templates/layout.html:118
 msgid "Please do not refresh the page"
@@ -2145,7 +2151,7 @@ msgstr "请不要刷新页面"
 
 #: cps/templates/layout.html:128
 msgid "Browse"
-msgstr "浏览"
+msgstr "按条件浏览"
 
 #: cps/templates/layout.html:139
 msgid "Your Shelves"
@@ -2185,35 +2191,35 @@ msgstr "通过魔法链接登录"
 
 #: cps/templates/logviewer.html:6
 msgid "Show Calibre-Web Log: "
-msgstr "显示Calibre-Web Log"
+msgstr "显示Calibre-Web日志: "
 
 #: cps/templates/logviewer.html:8
 msgid "Calibre-Web Log: "
-msgstr ""
+msgstr "Calibre-Web 日志: "
 
 #: cps/templates/logviewer.html:8
 msgid "Stream output, can't be displayed"
-msgstr ""
+msgstr "输出流,无法显示"
 
 #: cps/templates/logviewer.html:12
 msgid "Show Access Log: "
-msgstr "显示Access Log: "
+msgstr "显示访问日志: "
 
 #: cps/templates/modal_restriction.html:6
 msgid "Select Allowed/Denied Tags"
-msgstr "选择(允许/禁止)标签"
+msgstr "选择标签值显示或隐藏书籍"
 
 #: cps/templates/modal_restriction.html:7
 msgid "Select Allowed/Denied Custom Column Values"
-msgstr "选择(允许/禁止)自定义栏值"
+msgstr "选择自定义栏目值显示或隐藏本用户书籍"
 
 #: cps/templates/modal_restriction.html:8
 msgid "Select Allowed/Denied Tags of User"
-msgstr "选择(允许/禁止)用户标签"
+msgstr "选择标签值显示或隐藏书籍"
 
 #: cps/templates/modal_restriction.html:9
 msgid "Select Allowed/Denied Custom Column Values of User"
-msgstr "选择(允许/禁止)用户自定义栏值"
+msgstr "选择自定义栏目值显示或隐藏本用户书籍"
 
 #: cps/templates/modal_restriction.html:15
 msgid "Enter Tag"
@@ -2221,15 +2227,15 @@ msgstr "输入标签"
 
 #: cps/templates/modal_restriction.html:24
 msgid "Add View Restriction"
-msgstr "输入查看限制"
+msgstr "添加显示或隐藏书籍的值"
 
 #: cps/templates/osd.xml:5
 msgid "Calibre-Web eBook Catalog"
-msgstr "Caliebre-Web电子书目录"
+msgstr "Caliebre-Web电子书路径"
 
 #: cps/templates/read.html:74
 msgid "Reflow text when sidebars are open."
-msgstr "侧栏打开时重排文本"
+msgstr "打开侧栏时重排文本。"
 
 #: cps/templates/readcbr.html:88
 msgid "Keyboard Shortcuts"
@@ -2333,11 +2339,11 @@ msgstr "PDF阅读器"
 
 #: cps/templates/readtxt.html:6
 msgid "Basic txt Reader"
-msgstr "简单txt阅读器"
+msgstr "基础文本阅读器"
 
 #: cps/templates/register.html:4
 msgid "Register New Account"
-msgstr "注册新用户"
+msgstr "注册新账号"
 
 #: cps/templates/register.html:9
 msgid "Choose a username"
@@ -2353,7 +2359,7 @@ msgstr "魔法链接 - 授权新设备"
 
 #: cps/templates/remote_login.html:6
 msgid "On another device, login and visit:"
-msgstr "在另一个设备上,登录并访问:"
+msgstr "在另一个设备上,登录并访问:"
 
 #: cps/templates/remote_login.html:10
 msgid "Once verified, you will automatically be logged in on this device."
@@ -2365,7 +2371,7 @@ msgstr "此验证链接将在10分钟后失效。"
 
 #: cps/templates/search.html:5
 msgid "No Results Found"
-msgstr "搜索无结果"
+msgstr "无搜索结果"
 
 #: cps/templates/search.html:6
 msgid "Search Term:"
@@ -2373,7 +2379,7 @@ msgstr "搜索项:"
 
 #: cps/templates/search.html:8
 msgid "Results for:"
-msgstr "结果:"
+msgstr "结果:"
 
 #: cps/templates/search_form.html:19
 msgid "Published Date From"
@@ -2397,11 +2403,11 @@ msgstr "排除语言"
 
 #: cps/templates/search_form.html:95
 msgid "Extensions"
-msgstr "后缀名"
+msgstr "扩展名"
 
 #: cps/templates/search_form.html:105
 msgid "Exclude Extensions"
-msgstr "排除后缀名"
+msgstr "排除扩展名"
 
 #: cps/templates/search_form.html:117
 msgid "Rating Above"
@@ -2421,19 +2427,19 @@ msgstr "编辑书架"
 
 #: cps/templates/shelf.html:12 cps/templates/shelf_order.html:31
 msgid "Change order"
-msgstr "修改顺序"
+msgstr "修改排序"
 
 #: cps/templates/shelf.html:67
 msgid "Are you sure you want to delete this shelf?"
-msgstr "您真的想要删除这个书架吗?"
+msgstr "您确定要删除此书架吗?"
 
 #: cps/templates/shelf.html:70
 msgid "Shelf will be deleted for all users"
-msgstr "书架将会永远丢失!"
+msgstr "书架将会重所有用户中删除"
 
 #: cps/templates/shelf_edit.html:13
 msgid "Share with Everyone"
-msgstr "要公开此书架吗?"
+msgstr "书架将被公开"
 
 #: cps/templates/shelf_order.html:5
 msgid "Drag to Rearrange Order"
@@ -2441,31 +2447,31 @@ msgstr "拖拽以重新排序"
 
 #: cps/templates/stats.html:7
 msgid "Library Statistics"
-msgstr "Calibre书库统计"
+msgstr "书库统计"
 
 #: cps/templates/stats.html:12
 msgid "Books in this Library"
-msgstr "本书在此书库"
+msgstr "本书籍在此书库中"
 
 #: cps/templates/stats.html:16
 msgid "Authors in this Library"
-msgstr "个作者在此书库"
+msgstr "位作者在此书库中"
 
 #: cps/templates/stats.html:20
 msgid "Categories in this Library"
-msgstr "个分类在此书库"
+msgstr "种分类在此书库中"
 
 #: cps/templates/stats.html:24
 msgid "Series in this Library"
-msgstr "个丛书在此书库"
+msgstr "套丛书在此书库中"
 
 #: cps/templates/stats.html:28
 msgid "Linked Libraries"
-msgstr "链接库"
+msgstr "外部依赖程序"
 
 #: cps/templates/stats.html:32
 msgid "Program Library"
-msgstr "程序库"
+msgstr "程序名称"
 
 #: cps/templates/stats.html:33
 msgid "Installed Version"
@@ -2473,19 +2479,19 @@ msgstr "已安装版本"
 
 #: cps/templates/tasks.html:12
 msgid "User"
-msgstr "用户"
+msgstr "用户名称"
 
 #: cps/templates/tasks.html:14
 msgid "Task"
-msgstr "任务"
+msgstr "任务信息"
 
 #: cps/templates/tasks.html:15
 msgid "Status"
-msgstr "状态"
+msgstr "任务状态"
 
 #: cps/templates/tasks.html:16
 msgid "Progress"
-msgstr "进展"
+msgstr "任务进度"
 
 #: cps/templates/tasks.html:17
 msgid "Run Time"
@@ -2529,15 +2535,15 @@ msgstr "取消链接"
 
 #: cps/templates/user_edit.html:63
 msgid "Kobo Sync Token"
-msgstr ""
+msgstr "Kobo 同步 Token"
 
 #: cps/templates/user_edit.html:65
 msgid "Create/View"
-msgstr "新建/查看"
+msgstr "新建或查看"
 
 #: cps/templates/user_edit.html:86
 msgid "Add allowed/Denied Custom Column Values"
-msgstr "添加(允许/禁止)自定义栏值"
+msgstr "添加显示或隐藏书籍的自定义栏目值"
 
 #: cps/templates/user_edit.html:131
 msgid "Delete User"
@@ -2549,7 +2555,7 @@ msgstr "最近下载"
 
 #: cps/templates/user_edit.html:162
 msgid "Generate Kobo Auth URL"
-msgstr "生成Kobo Auth URL"
+msgstr "生成Kobo Auth 地址"
 
 #: cps/templates/user_edit.html:178
 msgid "Do you really want to delete the Kobo Token?"
diff --git a/cps/ub.py b/cps/ub.py
index d994b408a5480461be5562dee6e459a06f11e726..9e053bd541f16635263d2e97c803714113827396 100644
--- a/cps/ub.py
+++ b/cps/ub.py
@@ -19,6 +19,7 @@
 
 from __future__ import division, print_function, unicode_literals
 import os
+import sys
 import datetime
 import itertools
 import uuid
@@ -611,9 +612,13 @@ def migrate_Database(session):
         session.commit()
 
     # Remove login capability of user Guest
-    conn = engine.connect()
-    conn.execute("UPDATE user SET password='' where nickname = 'Guest' and password !=''")
-    session.commit()
+    try:
+        conn = engine.connect()
+        conn.execute("UPDATE user SET password='' where nickname = 'Guest' and password !=''")
+        session.commit()
+    except exc.OperationalError:
+        print('Settings database is not writeable. Exiting...')
+        sys.exit(1)
 
 
 def clean_database(session):
diff --git a/cps/web.py b/cps/web.py
index 0e0578eadd1bf674e12351b9cd8b5ca8bc68ac23..f74c87d0cea0f3bf4d1907d71885fd44481ddad9 100644
--- a/cps/web.py
+++ b/cps/web.py
@@ -446,7 +446,7 @@ def toggle_read(book_id):
                 new_cc = cc_class(value=1, book=book_id)
                 calibre_db.session.add(new_cc)
                 calibre_db.session.commit()
-        except KeyError:
+        except (KeyError, AttributeError):
             log.error(u"Custom Column No.%d is not exisiting in calibre database", config.config_read_column)
         except OperationalError as e:
             calibre_db.session.rollback()
@@ -1252,7 +1252,7 @@ def render_read_books(page, are_read, as_xml=False, order=None, *args, **kwargs)
                                                                     db_filter,
                                                                     order,
                                                                     db.cc_classes[config.config_read_column])
-        except KeyError:
+        except (KeyError, AttributeError):
             log.error("Custom Column No.%d is not existing in calibre database", config.config_read_column)
             if not as_xml:
                 flash(_("Custom Column No.%(column)d is not existing in calibre database",
@@ -1482,7 +1482,7 @@ def login():
                     log.info('Login failed for user "%s" IP-adress: %s', form['username'], ipAdress)
                     flash(_(u"Wrong Username or Password"), category="error")
 
-    next_url = url_for('web.index')
+    next_url = request.args.get('next', default=url_for("web.index"), type=str)
     return render_title_template('login.html',
                                  title=_(u"login"),
                                  next_url=next_url,
@@ -1759,7 +1759,7 @@ def show_book(book_id):
                 try:
                     matching_have_read_book = getattr(entries, 'custom_column_' + str(config.config_read_column))
                     have_read = len(matching_have_read_book) > 0 and matching_have_read_book[0].value
-                except KeyError:
+                except (KeyError, AttributeError):
                     log.error("Custom Column No.%d is not existing in calibre database", config.config_read_column)
                     have_read = None
 
diff --git a/messages.pot b/messages.pot
index c8120f61d170adfea5295986e009412f9eb7c4fb..8b630b6c7c04717433212170987da84a5cf7210e 100644
--- a/messages.pot
+++ b/messages.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-06-07 06:47+0200\n"
+"POT-Creation-Date: 2020-06-28 09:31+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"
@@ -45,9 +45,9 @@ msgstr ""
 msgid "Unknown command"
 msgstr ""
 
-#: cps/admin.py:116 cps/editbooks.py:563 cps/editbooks.py:573
-#: cps/editbooks.py:667 cps/editbooks.py:669 cps/editbooks.py:730
-#: cps/editbooks.py:743 cps/updater.py:509 cps/uploader.py:97
+#: cps/admin.py:116 cps/editbooks.py:564 cps/editbooks.py:576
+#: cps/editbooks.py:670 cps/editbooks.py:672 cps/editbooks.py:733
+#: cps/editbooks.py:749 cps/updater.py:509 cps/uploader.py:97
 #: cps/uploader.py:107
 msgid "Unknown"
 msgstr ""
@@ -60,7 +60,7 @@ msgstr ""
 msgid "UI Configuration"
 msgstr ""
 
-#: cps/admin.py:189 cps/admin.py:706
+#: cps/admin.py:189 cps/admin.py:711
 msgid "Calibre-Web configuration updated"
 msgstr ""
 
@@ -112,175 +112,181 @@ msgstr ""
 msgid "LDAP Certificate Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:627
+#: cps/admin.py:628
 msgid "Keyfile Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:631
+#: cps/admin.py:632
 msgid "Certfile Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:701
+#: cps/admin.py:694 cps/admin.py:793 cps/admin.py:885 cps/admin.py:934
+#: cps/shelf.py:100 cps/shelf.py:161 cps/shelf.py:202 cps/shelf.py:260
+#: cps/shelf.py:309 cps/shelf.py:338 cps/shelf.py:368 cps/shelf.py:392
+msgid "Settings DB is not Writeable"
+msgstr ""
+
+#: cps/admin.py:706
 msgid "DB Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:703
+#: cps/admin.py:708
 msgid "DB is not Writeable"
 msgstr ""
 
-#: cps/admin.py:736
+#: cps/admin.py:741
 msgid "Basic Configuration"
 msgstr ""
 
-#: cps/admin.py:751 cps/web.py:1337
+#: cps/admin.py:756 cps/web.py:1334
 msgid "Please fill out all fields!"
 msgstr ""
 
-#: cps/admin.py:754 cps/admin.py:766 cps/admin.py:772 cps/admin.py:892
+#: cps/admin.py:759 cps/admin.py:771 cps/admin.py:777 cps/admin.py:903
 msgid "Add new user"
 msgstr ""
 
-#: cps/admin.py:763 cps/web.py:1578
+#: cps/admin.py:768 cps/web.py:1575
 msgid "E-mail is not from valid domain"
 msgstr ""
 
-#: cps/admin.py:770 cps/admin.py:785
+#: cps/admin.py:775 cps/admin.py:790
 msgid "Found an existing account for this e-mail address or nickname."
 msgstr ""
 
-#: cps/admin.py:781
+#: cps/admin.py:786
 #, python-format
 msgid "User '%(user)s' created"
 msgstr ""
 
-#: cps/admin.py:794
+#: cps/admin.py:802
 #, python-format
 msgid "User '%(nick)s' deleted"
 msgstr ""
 
-#: cps/admin.py:797
+#: cps/admin.py:805
 msgid "No admin user remaining, can't delete user"
 msgstr ""
 
-#: cps/admin.py:803
+#: cps/admin.py:811
 msgid "No admin user remaining, can't remove admin role"
 msgstr ""
 
-#: cps/admin.py:839 cps/web.py:1621
+#: cps/admin.py:847 cps/web.py:1618
 msgid "Found an existing account for this e-mail address."
 msgstr ""
 
-#: cps/admin.py:849 cps/admin.py:864 cps/admin.py:967 cps/web.py:1596
+#: cps/admin.py:857 cps/admin.py:872 cps/admin.py:983 cps/web.py:1593
 #, python-format
 msgid "Edit User %(nick)s"
 msgstr ""
 
-#: cps/admin.py:855 cps/web.py:1588
+#: cps/admin.py:863 cps/web.py:1585
 msgid "This username is already taken"
 msgstr ""
 
-#: cps/admin.py:871
+#: cps/admin.py:879
 #, python-format
 msgid "User '%(nick)s' updated"
 msgstr ""
 
-#: cps/admin.py:874
+#: cps/admin.py:882
 msgid "An unknown error occured."
 msgstr ""
 
-#: cps/admin.py:901 cps/templates/admin.html:71
+#: cps/admin.py:912 cps/templates/admin.html:71
 msgid "Edit E-mail Server Settings"
 msgstr ""
 
-#: cps/admin.py:925
+#: cps/admin.py:941
 #, python-format
 msgid "Test e-mail successfully send to %(kindlemail)s"
 msgstr ""
 
-#: cps/admin.py:928
+#: cps/admin.py:944
 #, python-format
 msgid "There was an error sending the Test e-mail: %(res)s"
 msgstr ""
 
-#: cps/admin.py:930
+#: cps/admin.py:946
 msgid "Please configure your e-mail address first..."
 msgstr ""
 
-#: cps/admin.py:932
+#: cps/admin.py:948
 msgid "E-mail server settings updated"
 msgstr ""
 
-#: cps/admin.py:943
+#: cps/admin.py:959
 msgid "User not found"
 msgstr ""
 
-#: cps/admin.py:978
+#: cps/admin.py:994
 #, python-format
 msgid "Password for user %(user)s reset"
 msgstr ""
 
-#: cps/admin.py:981 cps/web.py:1361 cps/web.py:1425
+#: cps/admin.py:997 cps/web.py:1358 cps/web.py:1422
 msgid "An unknown error occurred. Please try again later."
 msgstr ""
 
-#: cps/admin.py:984 cps/web.py:1299
+#: cps/admin.py:1000 cps/web.py:1296
 msgid "Please configure the SMTP mail settings first..."
 msgstr ""
 
-#: cps/admin.py:996
+#: cps/admin.py:1012
 msgid "Logfile viewer"
 msgstr ""
 
-#: cps/admin.py:1035
+#: cps/admin.py:1051
 msgid "Requesting update package"
 msgstr ""
 
-#: cps/admin.py:1036
+#: cps/admin.py:1052
 msgid "Downloading update package"
 msgstr ""
 
-#: cps/admin.py:1037
+#: cps/admin.py:1053
 msgid "Unzipping update package"
 msgstr ""
 
-#: cps/admin.py:1038
+#: cps/admin.py:1054
 msgid "Replacing files"
 msgstr ""
 
-#: cps/admin.py:1039
+#: cps/admin.py:1055
 msgid "Database connections are closed"
 msgstr ""
 
-#: cps/admin.py:1040
+#: cps/admin.py:1056
 msgid "Stopping server"
 msgstr ""
 
-#: cps/admin.py:1041
+#: cps/admin.py:1057
 msgid "Update finished, please press okay and reload page"
 msgstr ""
 
-#: cps/admin.py:1042 cps/admin.py:1043 cps/admin.py:1044 cps/admin.py:1045
-#: cps/admin.py:1046
+#: cps/admin.py:1058 cps/admin.py:1059 cps/admin.py:1060 cps/admin.py:1061
+#: cps/admin.py:1062
 msgid "Update failed:"
 msgstr ""
 
-#: cps/admin.py:1042 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
+#: cps/admin.py:1058 cps/updater.py:319 cps/updater.py:520 cps/updater.py:522
 msgid "HTTP Error"
 msgstr ""
 
-#: cps/admin.py:1043 cps/updater.py:321 cps/updater.py:524
+#: cps/admin.py:1059 cps/updater.py:321 cps/updater.py:524
 msgid "Connection error"
 msgstr ""
 
-#: cps/admin.py:1044 cps/updater.py:323 cps/updater.py:526
+#: cps/admin.py:1060 cps/updater.py:323 cps/updater.py:526
 msgid "Timeout while establishing connection"
 msgstr ""
 
-#: cps/admin.py:1045 cps/updater.py:325 cps/updater.py:528
+#: cps/admin.py:1061 cps/updater.py:325 cps/updater.py:528
 msgid "General error"
 msgstr ""
 
-#: cps/admin.py:1046
+#: cps/admin.py:1062
 msgid "Update File Could Not be Saved in Temp Dir"
 msgstr ""
 
@@ -300,8 +306,8 @@ msgstr ""
 msgid "Book Successfully Deleted"
 msgstr ""
 
-#: cps/editbooks.py:254 cps/editbooks.py:548 cps/web.py:1644 cps/web.py:1685
-#: cps/web.py:1747
+#: cps/editbooks.py:254 cps/editbooks.py:549 cps/web.py:1641 cps/web.py:1682
+#: cps/web.py:1744
 msgid "Error opening eBook. File does not exist or file is not accessible"
 msgstr ""
 
@@ -309,82 +315,82 @@ msgstr ""
 msgid "edit metadata"
 msgstr ""
 
-#: cps/editbooks.py:361
+#: cps/editbooks.py:360
 #, python-format
 msgid "%(langname)s is not a valid language"
 msgstr ""
 
-#: cps/editbooks.py:467 cps/editbooks.py:712
+#: cps/editbooks.py:468 cps/editbooks.py:715
 #, python-format
 msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
 msgstr ""
 
-#: cps/editbooks.py:471 cps/editbooks.py:716
+#: cps/editbooks.py:472 cps/editbooks.py:719
 msgid "File to be uploaded must have an extension"
 msgstr ""
 
-#: cps/editbooks.py:483 cps/editbooks.py:773
+#: cps/editbooks.py:484 cps/editbooks.py:779
 #, python-format
 msgid "Failed to create path %(path)s (Permission denied)."
 msgstr ""
 
-#: cps/editbooks.py:488
+#: cps/editbooks.py:489
 #, python-format
 msgid "Failed to store file %(file)s."
 msgstr ""
 
-#: cps/editbooks.py:506 cps/editbooks.py:864
+#: cps/editbooks.py:507 cps/editbooks.py:870
 #, python-format
 msgid "Database error: %(error)s."
 msgstr ""
 
-#: cps/editbooks.py:510
+#: cps/editbooks.py:511
 #, python-format
 msgid "File format %(ext)s added to %(book)s"
 msgstr ""
 
-#: cps/editbooks.py:653
+#: cps/editbooks.py:656
 msgid "Metadata successfully updated"
 msgstr ""
 
-#: cps/editbooks.py:662
+#: cps/editbooks.py:665
 msgid "Error editing book, please check logfile for details"
 msgstr ""
 
-#: cps/editbooks.py:724
+#: cps/editbooks.py:727
 #, python-format
 msgid "File %(filename)s could not saved to temp dir"
 msgstr ""
 
-#: cps/editbooks.py:734
+#: cps/editbooks.py:737
 msgid "Uploaded book probably exists in the library, consider to change before upload new: "
 msgstr ""
 
-#: cps/editbooks.py:780
+#: cps/editbooks.py:786
 #, python-format
 msgid "Failed to Move File %(file)s: %(error)s"
 msgstr ""
 
-#: cps/editbooks.py:836
+#: cps/editbooks.py:842
 #, python-format
 msgid "Failed to Move Cover File %(file)s: %(error)s"
 msgstr ""
 
-#: cps/editbooks.py:850
+#: cps/editbooks.py:856
 #, python-format
 msgid "File %(file)s uploaded"
 msgstr ""
 
-#: cps/editbooks.py:876
+#: cps/editbooks.py:882
 msgid "Source or destination format for conversion missing"
 msgstr ""
 
-#: cps/editbooks.py:884
+#: cps/editbooks.py:890
 #, python-format
 msgid "Book successfully queued for converting to %(book_format)s"
 msgstr ""
 
-#: cps/editbooks.py:888
+#: cps/editbooks.py:894
 #, python-format
 msgid "There was an error converting this book: %(res)s"
 msgstr ""
@@ -498,71 +504,71 @@ msgstr ""
 msgid "Book path %(path)s not found on Google Drive"
 msgstr ""
 
-#: cps/helper.py:542
+#: cps/helper.py:550
 msgid "Error Downloading Cover"
 msgstr ""
 
-#: cps/helper.py:545
+#: cps/helper.py:553
 msgid "Cover Format Error"
 msgstr ""
 
-#: cps/helper.py:561
+#: cps/helper.py:569
 msgid "Failed to create path for cover"
 msgstr ""
 
-#: cps/helper.py:566
+#: cps/helper.py:574
 msgid "Cover-file is not a valid image file, or could not be stored"
 msgstr ""
 
-#: cps/helper.py:577
+#: cps/helper.py:585
 msgid "Only jpg/jpeg/png/webp files are supported as coverfile"
 msgstr ""
 
-#: cps/helper.py:591
+#: cps/helper.py:599
 msgid "Only jpg/jpeg files are supported as coverfile"
 msgstr ""
 
-#: cps/helper.py:640
+#: cps/helper.py:648
 msgid "Unrar binary file not found"
 msgstr ""
 
-#: cps/helper.py:654
+#: cps/helper.py:662
 msgid "Error excecuting UnRar"
 msgstr ""
 
-#: cps/helper.py:710
+#: cps/helper.py:718
 msgid "Waiting"
 msgstr ""
 
-#: cps/helper.py:712
+#: cps/helper.py:720
 msgid "Failed"
 msgstr ""
 
-#: cps/helper.py:714
+#: cps/helper.py:722
 msgid "Started"
 msgstr ""
 
-#: cps/helper.py:716
+#: cps/helper.py:724
 msgid "Finished"
 msgstr ""
 
-#: cps/helper.py:718
+#: cps/helper.py:726
 msgid "Unknown Status"
 msgstr ""
 
-#: cps/helper.py:723
+#: cps/helper.py:731
 msgid "E-mail: "
 msgstr ""
 
-#: cps/helper.py:725 cps/helper.py:729
+#: cps/helper.py:733 cps/helper.py:737
 msgid "Convert: "
 msgstr ""
 
-#: cps/helper.py:727
+#: cps/helper.py:735
 msgid "Upload: "
 msgstr ""
 
-#: cps/helper.py:731
+#: cps/helper.py:739
 msgid "Unknown Task: "
 msgstr ""
 
@@ -595,7 +601,7 @@ msgstr ""
 msgid "Failed to fetch user info from Google."
 msgstr ""
 
-#: cps/oauth_bb.py:225 cps/web.py:1397 cps/web.py:1537
+#: cps/oauth_bb.py:225 cps/web.py:1394 cps/web.py:1534
 #, python-format
 msgid "you are now logged in as: '%(nickname)s'"
 msgstr ""
@@ -632,218 +638,218 @@ msgstr ""
 msgid "Google Oauth error, please retry later."
 msgstr ""
 
-#: cps/shelf.py:66 cps/shelf.py:111
+#: cps/shelf.py:67 cps/shelf.py:120
 msgid "Invalid shelf specified"
 msgstr ""
 
-#: cps/shelf.py:72
+#: cps/shelf.py:73
 #, python-format
 msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s"
 msgstr ""
 
-#: cps/shelf.py:82
+#: cps/shelf.py:83
 #, python-format
 msgid "Book is already part of the shelf: %(shelfname)s"
 msgstr ""
 
-#: cps/shelf.py:97
+#: cps/shelf.py:106
 #, python-format
 msgid "Book has been added to shelf: %(sname)s"
 msgstr ""
 
-#: cps/shelf.py:115
+#: cps/shelf.py:124
 #, python-format
 msgid "You are not allowed to add a book to the the shelf: %(name)s"
 msgstr ""
 
-#: cps/shelf.py:133
+#: cps/shelf.py:142
 #, python-format
 msgid "Books are already part of the shelf: %(name)s"
 msgstr ""
 
-#: cps/shelf.py:148
+#: cps/shelf.py:158
 #, python-format
 msgid "Books have been added to shelf: %(sname)s"
 msgstr ""
 
-#: cps/shelf.py:150
+#: cps/shelf.py:163
 #, python-format
 msgid "Could not add books to shelf: %(sname)s"
 msgstr ""
 
-#: cps/shelf.py:188
+#: cps/shelf.py:208
 #, python-format
 msgid "Book has been removed from shelf: %(sname)s"
 msgstr ""
 
-#: cps/shelf.py:196
+#: cps/shelf.py:216
 #, python-format
 msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
 msgstr ""
 
-#: cps/shelf.py:220 cps/shelf.py:260
+#: cps/shelf.py:240 cps/shelf.py:284
 #, python-format
 msgid "A public shelf with the name '%(title)s' already exists."
 msgstr ""
 
-#: cps/shelf.py:229 cps/shelf.py:270
+#: cps/shelf.py:249 cps/shelf.py:294
 #, python-format
 msgid "A private shelf with the name '%(title)s' already exists."
 msgstr ""
 
-#: cps/shelf.py:236
+#: cps/shelf.py:256
 #, python-format
 msgid "Shelf %(title)s created"
 msgstr ""
 
-#: cps/shelf.py:239 cps/shelf.py:284
+#: cps/shelf.py:263 cps/shelf.py:312
 msgid "There was an error"
 msgstr ""
 
-#: cps/shelf.py:240 cps/shelf.py:242 cps/templates/layout.html:144
+#: cps/shelf.py:264 cps/shelf.py:266 cps/templates/layout.html:144
 msgid "Create a Shelf"
 msgstr ""
 
-#: cps/shelf.py:282
+#: cps/shelf.py:306
 #, python-format
 msgid "Shelf %(title)s changed"
 msgstr ""
 
-#: cps/shelf.py:285 cps/shelf.py:287
+#: cps/shelf.py:313 cps/shelf.py:315
 msgid "Edit a shelf"
 msgstr ""
 
-#: cps/shelf.py:332
+#: cps/shelf.py:369
 #, python-format
 msgid "Shelf: '%(name)s'"
 msgstr ""
 
-#: cps/shelf.py:335
+#: cps/shelf.py:372
 msgid "Error opening shelf. Shelf does not exist or is not accessible"
 msgstr ""
 
-#: cps/shelf.py:368
+#: cps/shelf.py:409
 msgid "Hidden Book"
 msgstr ""
 
-#: cps/shelf.py:373
+#: cps/shelf.py:414
 #, python-format
 msgid "Change order of Shelf: '%(name)s'"
 msgstr ""
 
-#: cps/ub.py:64
+#: cps/ub.py:65
 msgid "Recently Added"
 msgstr ""
 
-#: cps/ub.py:66
+#: cps/ub.py:67
 msgid "Show recent books"
 msgstr ""
 
-#: cps/templates/index.xml:17 cps/ub.py:67
+#: cps/templates/index.xml:17 cps/ub.py:68
 msgid "Hot Books"
 msgstr ""
 
-#: cps/ub.py:69
+#: cps/ub.py:70
 msgid "Show Hot Books"
 msgstr ""
 
-#: cps/templates/index.xml:24 cps/ub.py:71 cps/web.py:655
+#: cps/templates/index.xml:24 cps/ub.py:72 cps/web.py:652
 msgid "Top Rated Books"
 msgstr ""
 
-#: cps/ub.py:73
+#: cps/ub.py:74
 msgid "Show Top Rated Books"
 msgstr ""
 
-#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:74
-#: cps/web.py:1222
+#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:75
+#: cps/web.py:1219
 msgid "Read Books"
 msgstr ""
 
-#: cps/ub.py:76
+#: cps/ub.py:77
 msgid "Show read and unread"
 msgstr ""
 
-#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:78
-#: cps/web.py:1225
+#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:79
+#: cps/web.py:1222
 msgid "Unread Books"
 msgstr ""
 
-#: cps/ub.py:80
+#: cps/ub.py:81
 msgid "Show unread"
 msgstr ""
 
-#: cps/ub.py:81
+#: cps/ub.py:82
 msgid "Discover"
 msgstr ""
 
-#: cps/ub.py:83
+#: cps/ub.py:84
 msgid "Show random books"
 msgstr ""
 
-#: cps/templates/index.xml:75 cps/ub.py:84 cps/web.py:970
+#: cps/templates/index.xml:75 cps/ub.py:85 cps/web.py:967
 msgid "Categories"
 msgstr ""
 
-#: cps/ub.py:86
+#: cps/ub.py:87
 msgid "Show category selection"
 msgstr ""
 
 #: cps/templates/book_edit.html:84 cps/templates/index.xml:82
-#: cps/templates/search_form.html:53 cps/ub.py:87 cps/web.py:886 cps/web.py:896
+#: cps/templates/search_form.html:53 cps/ub.py:88 cps/web.py:883 cps/web.py:893
 msgid "Series"
 msgstr ""
 
-#: cps/ub.py:89
+#: cps/ub.py:90
 msgid "Show series selection"
 msgstr ""
 
-#: cps/templates/index.xml:61 cps/ub.py:90
+#: cps/templates/index.xml:61 cps/ub.py:91
 msgid "Authors"
 msgstr ""
 
-#: cps/ub.py:92
+#: cps/ub.py:93
 msgid "Show author selection"
 msgstr ""
 
-#: cps/templates/index.xml:68 cps/ub.py:94 cps/web.py:869
+#: cps/templates/index.xml:68 cps/ub.py:95 cps/web.py:866
 msgid "Publishers"
 msgstr ""
 
-#: cps/ub.py:96
+#: cps/ub.py:97
 msgid "Show publisher selection"
 msgstr ""
 
-#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:97
-#: cps/web.py:953
+#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:98
+#: cps/web.py:950
 msgid "Languages"
 msgstr ""
 
-#: cps/ub.py:100
+#: cps/ub.py:101
 msgid "Show language selection"
 msgstr ""
 
-#: cps/templates/index.xml:96 cps/ub.py:101
+#: cps/templates/index.xml:96 cps/ub.py:102
 msgid "Ratings"
 msgstr ""
 
-#: cps/ub.py:103
+#: cps/ub.py:104
 msgid "Show ratings selection"
 msgstr ""
 
-#: cps/templates/index.xml:104 cps/ub.py:104
+#: cps/templates/index.xml:104 cps/ub.py:105
 msgid "File formats"
 msgstr ""
 
-#: cps/ub.py:106
+#: cps/ub.py:107
 msgid "Show file formats selection"
 msgstr ""
 
-#: cps/ub.py:108 cps/web.py:1249
+#: cps/ub.py:109 cps/web.py:1246
 msgid "Archived Books"
 msgstr ""
 
-#: cps/ub.py:110
+#: cps/ub.py:111
 msgid "Show archived books"
 msgstr ""
 
@@ -876,220 +882,220 @@ msgstr ""
 msgid "Click on the button below to update to the latest stable version."
 msgstr ""
 
-#: cps/web.py:322
+#: cps/web.py:319
 #, python-format
 msgid "Error: %(ldaperror)s"
 msgstr ""
 
-#: cps/web.py:326
+#: cps/web.py:323
 msgid "Error: No user returned in response of LDAP server"
 msgstr ""
 
-#: cps/web.py:374
+#: cps/web.py:371
 msgid "Failed to Create at Least One LDAP User"
 msgstr ""
 
-#: cps/web.py:377
+#: cps/web.py:374
 msgid "At Least One LDAP User Not Found in Database"
 msgstr ""
 
-#: cps/web.py:379
+#: cps/web.py:376
 msgid "User Successfully Imported"
 msgstr ""
 
-#: cps/web.py:625
+#: cps/web.py:622
 msgid "Recently Added Books"
 msgstr ""
 
-#: cps/templates/index.html:5 cps/web.py:663
+#: cps/templates/index.html:5 cps/web.py:660
 msgid "Discover (Random Books)"
 msgstr ""
 
-#: cps/web.py:691
+#: cps/web.py:688
 msgid "Books"
 msgstr ""
 
-#: cps/web.py:718
+#: cps/web.py:715
 msgid "Hot Books (Most Downloaded)"
 msgstr ""
 
-#: cps/web.py:731
+#: cps/web.py:728
 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible"
 msgstr ""
 
-#: cps/web.py:745
+#: cps/web.py:742
 #, python-format
 msgid "Author: %(name)s"
 msgstr ""
 
-#: cps/web.py:759
+#: cps/web.py:756
 #, python-format
 msgid "Publisher: %(name)s"
 msgstr ""
 
-#: cps/web.py:772
+#: cps/web.py:769
 #, python-format
 msgid "Series: %(serie)s"
 msgstr ""
 
-#: cps/web.py:785
+#: cps/web.py:782
 #, python-format
 msgid "Rating: %(rating)s stars"
 msgstr ""
 
-#: cps/web.py:798
+#: cps/web.py:795
 #, python-format
 msgid "File format: %(format)s"
 msgstr ""
 
-#: cps/web.py:812
+#: cps/web.py:809
 #, python-format
 msgid "Category: %(name)s"
 msgstr ""
 
-#: cps/web.py:831
+#: cps/web.py:828
 #, python-format
 msgid "Language: %(name)s"
 msgstr ""
 
-#: cps/web.py:910
+#: cps/web.py:907
 msgid "Ratings list"
 msgstr ""
 
-#: cps/web.py:925
+#: cps/web.py:922
 msgid "File formats list"
 msgstr ""
 
-#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:984
+#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:981
 msgid "Tasks"
 msgstr ""
 
 #: cps/templates/book_edit.html:235 cps/templates/feed.xml:33
 #: cps/templates/layout.html:45 cps/templates/layout.html:48
-#: cps/templates/search_form.html:174 cps/web.py:1010 cps/web.py:1015
+#: cps/templates/search_form.html:174 cps/web.py:1007 cps/web.py:1012
 msgid "Search"
 msgstr ""
 
-#: cps/web.py:1066
+#: cps/web.py:1063
 msgid "Published after "
 msgstr ""
 
-#: cps/web.py:1073
+#: cps/web.py:1070
 msgid "Published before "
 msgstr ""
 
-#: cps/web.py:1087
+#: cps/web.py:1084
 #, python-format
 msgid "Rating <= %(rating)s"
 msgstr ""
 
-#: cps/web.py:1089
+#: cps/web.py:1086
 #, python-format
 msgid "Rating >= %(rating)s"
 msgstr ""
 
-#: cps/web.py:1158 cps/web.py:1183
+#: cps/web.py:1155 cps/web.py:1180
 msgid "search"
 msgstr ""
 
-#: cps/web.py:1213
+#: cps/web.py:1210
 #, python-format
 msgid "Custom Column No.%(column)d is not existing in calibre database"
 msgstr ""
 
-#: cps/web.py:1304
+#: cps/web.py:1301
 #, python-format
 msgid "Book successfully queued for sending to %(kindlemail)s"
 msgstr ""
 
-#: cps/web.py:1308
+#: cps/web.py:1305
 #, python-format
 msgid "Oops! There was an error sending this book: %(res)s"
 msgstr ""
 
-#: cps/web.py:1310
+#: cps/web.py:1307
 msgid "Please update your profile with a valid Send to Kindle E-mail Address."
 msgstr ""
 
-#: cps/web.py:1327
+#: cps/web.py:1324
 msgid "E-Mail server is not configured, please contact your administrator!"
 msgstr ""
 
-#: cps/web.py:1328 cps/web.py:1338 cps/web.py:1362 cps/web.py:1366
-#: cps/web.py:1371 cps/web.py:1375
+#: cps/web.py:1325 cps/web.py:1335 cps/web.py:1359 cps/web.py:1363
+#: cps/web.py:1368 cps/web.py:1372
 msgid "register"
 msgstr ""
 
-#: cps/web.py:1364
+#: cps/web.py:1361
 msgid "Your e-mail is not allowed to register"
 msgstr ""
 
-#: cps/web.py:1367
+#: cps/web.py:1364
 msgid "Confirmation e-mail was send to your e-mail account."
 msgstr ""
 
-#: cps/web.py:1370
+#: cps/web.py:1367
 msgid "This username or e-mail address is already in use."
 msgstr ""
 
-#: cps/web.py:1387
+#: cps/web.py:1384
 msgid "Cannot activate LDAP authentication"
 msgstr ""
 
-#: cps/web.py:1404
+#: cps/web.py:1401
 #, python-format
 msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known"
 msgstr ""
 
-#: cps/web.py:1410
+#: cps/web.py:1407
 #, python-format
 msgid "Could not login: %(message)s"
 msgstr ""
 
-#: cps/web.py:1414 cps/web.py:1438
+#: cps/web.py:1411 cps/web.py:1435
 msgid "Wrong Username or Password"
 msgstr ""
 
-#: cps/web.py:1421
+#: cps/web.py:1418
 msgid "New Password was send to your email address"
 msgstr ""
 
-#: cps/web.py:1427
+#: cps/web.py:1424
 msgid "Please enter valid username to reset password"
 msgstr ""
 
-#: cps/web.py:1433
+#: cps/web.py:1430
 #, python-format
 msgid "You are now logged in as: '%(nickname)s'"
 msgstr ""
 
-#: cps/web.py:1442 cps/web.py:1469
+#: cps/web.py:1439 cps/web.py:1466
 msgid "login"
 msgstr ""
 
-#: cps/web.py:1481 cps/web.py:1515
+#: cps/web.py:1478 cps/web.py:1512
 msgid "Token not found"
 msgstr ""
 
-#: cps/web.py:1490 cps/web.py:1523
+#: cps/web.py:1487 cps/web.py:1520
 msgid "Token has expired"
 msgstr ""
 
-#: cps/web.py:1499
+#: cps/web.py:1496
 msgid "Success! Please return to your device"
 msgstr ""
 
-#: cps/web.py:1580 cps/web.py:1625 cps/web.py:1631
+#: cps/web.py:1577 cps/web.py:1622 cps/web.py:1628
 #, python-format
 msgid "%(name)s's profile"
 msgstr ""
 
-#: cps/web.py:1627
+#: cps/web.py:1624
 msgid "Profile updated"
 msgstr ""
 
-#: cps/web.py:1656 cps/web.py:1659 cps/web.py:1662 cps/web.py:1669
-#: cps/web.py:1674
+#: cps/web.py:1653 cps/web.py:1656 cps/web.py:1659 cps/web.py:1666
+#: cps/web.py:1671
 msgid "Read a Book"
 msgstr ""
 
diff --git a/optional-requirements.txt b/optional-requirements.txt
index 5cef4a05e7b81f02d1e065e0bd5e625a54976cbb..6537a0773a010d2580f5094b8956d87ed81bcd5f 100644
--- a/optional-requirements.txt
+++ b/optional-requirements.txt
@@ -1,6 +1,6 @@
 # GDrive Integration
 google-api-python-client==1.7.11,<1.8.0
-#gevent>=1.2.1,<20.6.0
+gevent>=1.2.1,<20.6.0
 greenlet>=0.4.12,<0.5.0
 httplib2>=0.9.2,<0.18.0
 oauth2client>=4.0.0,<4.1.4