From 19c75d6790959debafbe9cf4bba146fe0c6b72e4 Mon Sep 17 00:00:00 2001
From: xlivevil <xlivevil@aliyun.com>
Date: Thu, 29 Jul 2021 14:00:02 +0800
Subject: [PATCH] Update Simplified Chinese translation

---
 .../zh_Hans_CN/LC_MESSAGES/messages.mo        | Bin 43486 -> 45631 bytes
 .../zh_Hans_CN/LC_MESSAGES/messages.po        | 616 ++++++++++--------
 messages.pot                                  | 514 ++++++++-------
 3 files changed, 618 insertions(+), 512 deletions(-)

diff --git a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo
index aac38c86effc25fa3c7de794b511ef6548b023b8..5c245f812d3e88e361db29de2211e2084debf77f 100644
GIT binary patch
delta 13282
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

delta 11214
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

diff --git a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po
index f1563d09..62571b67 100644
--- a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po
+++ b/cps/translations/zh_Hans_CN/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: 2021-06-29 18:30+0200\n"
+"POT-Creation-Date: 2021-07-29 13:45+0800\n"
 "PO-Revision-Date: 2020-09-27 22:18+0800\n"
 "Last-Translator: dalin <dalin.lin@gmail.com>\n"
 "Language: zh_CN\n"
@@ -16,7 +16,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.9.0\n"
+"Generated-By: Babel 2.9.1\n"
 
 #: cps/about.py:43 cps/about.py:59
 msgid "installed"
@@ -30,282 +30,294 @@ msgstr "未安装"
 msgid "Statistics"
 msgstr "统计"
 
-#: cps/admin.py:142
+#: cps/admin.py:141
 msgid "Server restarted, please reload page"
 msgstr "服务器已重启,请刷新页面"
 
-#: cps/admin.py:144
+#: cps/admin.py:143
 msgid "Performing shutdown of server, please close window"
 msgstr "正在关闭服务器,请关闭窗口"
 
-#: cps/admin.py:152
+#: cps/admin.py:151
 msgid "Reconnect successful"
 msgstr "重新连接成功"
 
-#: cps/admin.py:155
+#: cps/admin.py:154
 msgid "Unknown command"
 msgstr "未知命令"
 
-#: cps/admin.py:165 cps/editbooks.py:687 cps/editbooks.py:701
+#: cps/admin.py:164 cps/editbooks.py:687 cps/editbooks.py:701
 #: cps/editbooks.py:840 cps/editbooks.py:842 cps/editbooks.py:869
 #: cps/editbooks.py:885 cps/updater.py:555 cps/uploader.py:94
 #: cps/uploader.py:104
 msgid "Unknown"
 msgstr "未知"
 
-#: cps/admin.py:186
+#: cps/admin.py:185
 msgid "Admin page"
 msgstr "管理页"
 
-#: cps/admin.py:205
+#: cps/admin.py:204
 msgid "Basic Configuration"
 msgstr "基本配置"
 
-#: cps/admin.py:238
+#: cps/admin.py:237
 msgid "UI Configuration"
 msgstr "界面配置"
 
-#: cps/admin.py:271 cps/templates/admin.html:46
+#: cps/admin.py:270 cps/templates/admin.html:46
 #, fuzzy
 msgid "Edit Users"
 msgstr "管理员用户"
 
-#: cps/admin.py:312 cps/opds.py:110 cps/opds.py:199 cps/opds.py:276
+#: cps/admin.py:311 cps/opds.py:110 cps/opds.py:199 cps/opds.py:276
 #: cps/opds.py:328 cps/templates/grid.html:14 cps/templates/list.html:14
 msgid "All"
 msgstr "全部"
 
-#: cps/admin.py:337 cps/admin.py:1550
+#: cps/admin.py:336 cps/admin.py:1557
 msgid "User not found"
 msgstr "找不到用户"
 
-#: cps/admin.py:351
+#: cps/admin.py:350
 msgid "{} users deleted successfully"
 msgstr "成功删除 {} 个用户"
 
-#: cps/admin.py:373 cps/templates/user_edit.html:44
+#: cps/admin.py:372 cps/templates/user_edit.html:44
 #: cps/templates/user_table.html:80
 msgid "Show All"
 msgstr "显示全部"
 
-#: cps/admin.py:394 cps/admin.py:400
+#: cps/admin.py:393 cps/admin.py:399
 msgid "Malformed request"
-msgstr ""
+msgstr "格式错误的请求"
 
-#: cps/admin.py:412 cps/admin.py:1432
+#: cps/admin.py:411 cps/admin.py:1439
 msgid "Guest Name can't be changed"
 msgstr "访客名称无法更改"
 
-#: cps/admin.py:424
+#: cps/admin.py:423
 msgid "Guest can't have this role"
 msgstr "游客无法拥有此角色"
 
-#: cps/admin.py:436 cps/admin.py:1395
+#: cps/admin.py:435 cps/admin.py:1402
 msgid "No admin user remaining, can't remove admin role"
 msgstr "理员账户不存在,无法删除管理员角色"
 
-#: cps/admin.py:440 cps/admin.py:454
+#: cps/admin.py:439 cps/admin.py:453
 msgid "Value has to be true or false"
-msgstr ""
+msgstr "值必须是 true 或 false"
 
-#: cps/admin.py:442
+#: cps/admin.py:441
 msgid "Invalid role"
-msgstr ""
+msgstr "无效角色"
 
-#: cps/admin.py:446
+#: cps/admin.py:445
 msgid "Guest can't have this view"
 msgstr "游客无法拥有此视图"
 
-#: cps/admin.py:456
+#: cps/admin.py:455
 msgid "Invalid view"
-msgstr ""
+msgstr "无效视图"
 
-#: cps/admin.py:459
+#: cps/admin.py:458
 msgid "Guest's Locale is determined automatically and can't be set"
 msgstr "游客的本地化是自动侦测而无法设置的"
 
-#: cps/admin.py:463
+#: cps/admin.py:462
 msgid "No Valid Locale Given"
-msgstr ""
+msgstr "无可用本地化"
 
-#: cps/admin.py:474
+#: cps/admin.py:473
 msgid "No Valid Book Language Given"
-msgstr ""
+msgstr "无有效书籍语言"
 
-#: cps/admin.py:476
+#: cps/admin.py:475
 msgid "Parameter not found"
-msgstr ""
+msgstr "参数未找到"
 
-#: cps/admin.py:531
+#: cps/admin.py:530
 msgid "Invalid Read Column"
-msgstr ""
+msgstr "无效的阅读列"
 
-#: cps/admin.py:537
+#: cps/admin.py:536
 msgid "Invalid Restricted Column"
-msgstr ""
+msgstr "无效的限制列"
 
-#: cps/admin.py:556 cps/admin.py:1288
+#: cps/admin.py:555 cps/admin.py:1287
 msgid "Calibre-Web configuration updated"
 msgstr "Calibre-Web配置已更新"
 
-#: cps/admin.py:568
+#: cps/admin.py:567
 msgid "Do you really want to delete the Kobo Token?"
 msgstr "您确定删除Kobo Token吗?"
 
-#: cps/admin.py:570
+#: cps/admin.py:569
 msgid "Do you really want to delete this domain?"
 msgstr "您确定要删除此域吗?"
 
-#: cps/admin.py:572
+#: cps/admin.py:571
 msgid "Do you really want to delete this user?"
 msgstr "您确定要删除此用户吗?"
 
-#: cps/admin.py:574 cps/templates/shelf.html:90
+#: cps/admin.py:573 cps/templates/shelf.html:90
 msgid "Are you sure you want to delete this shelf?"
 msgstr "您确定要删除此书架吗?"
 
-#: cps/admin.py:576
+#: cps/admin.py:575
 msgid "Are you sure you want to change locales of selected user(s)?"
 msgstr "您确定要修改选定用户的本地化设置吗?"
 
-#: cps/admin.py:578
-msgid "Are you sure you want to change visible book languages for selected user(s)?"
+#: cps/admin.py:577
+msgid ""
+"Are you sure you want to change visible book languages for selected "
+"user(s)?"
 msgstr "您确定要修改选定用户的可见书籍语言吗?"
 
-#: cps/admin.py:580
-msgid "Are you sure you want to change the selected role for the selected user(s)?"
+#: cps/admin.py:579
+msgid ""
+"Are you sure you want to change the selected role for the selected "
+"user(s)?"
 msgstr "您确定要修改选定用户的选定角色吗?"
 
-#: cps/admin.py:582
-msgid "Are you sure you want to change the selected restrictions for the selected user(s)?"
+#: cps/admin.py:581
+msgid ""
+"Are you sure you want to change the selected restrictions for the "
+"selected user(s)?"
 msgstr "您确定要修改选定用户的选定限制吗?"
 
-#: cps/admin.py:584
-msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?"
+#: cps/admin.py:583
+msgid ""
+"Are you sure you want to change the selected visibility restrictions for "
+"the selected user(s)?"
 msgstr "您确定要修改选定用户的选定可视化限制吗?"
 
-#: cps/admin.py:586
+#: cps/admin.py:585
 #, fuzzy
-msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?"
+msgid ""
+"Are you sure you want to change shelf sync behavior for the selected "
+"user(s)?"
 msgstr "您确定要修改选定用户的选定角色吗?"
 
-#: cps/admin.py:588
+#: cps/admin.py:587
 #, fuzzy
 msgid "Are you sure you want to change Calibre library location?"
 msgstr "您确定要关闭吗?"
 
-#: cps/admin.py:737
+#: cps/admin.py:736
 msgid "Tag not found"
-msgstr ""
+msgstr "标签未找到"
 
-#: cps/admin.py:749
+#: cps/admin.py:748
 msgid "Invalid Action"
-msgstr ""
+msgstr "无效的动作"
 
-#: cps/admin.py:854 cps/admin.py:860 cps/admin.py:870 cps/admin.py:880
+#: cps/admin.py:853 cps/admin.py:859 cps/admin.py:869 cps/admin.py:879
 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:40
 #: cps/templates/user_table.html:57
 msgid "Deny"
 msgstr "拒绝"
 
-#: cps/admin.py:856 cps/admin.py:862 cps/admin.py:872 cps/admin.py:882
+#: cps/admin.py:855 cps/admin.py:861 cps/admin.py:871 cps/admin.py:881
 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:43
 #: cps/templates/user_table.html:60
 msgid "Allow"
 msgstr "允许"
 
-#: cps/admin.py:1011
+#: cps/admin.py:1010
 msgid "client_secrets.json Is Not Configured For Web Application"
 msgstr "client_secrets.json 未为 Web 应用程序配置"
 
-#: cps/admin.py:1056
+#: cps/admin.py:1055
 msgid "Logfile Location is not Valid, Please Enter Correct Path"
 msgstr "日志文件路径无效,请输入正确的路径"
 
-#: cps/admin.py:1062
+#: cps/admin.py:1061
 msgid "Access Logfile Location is not Valid, Please Enter Correct Path"
 msgstr "访问日志路径无效,请输入正确的路径"
 
-#: cps/admin.py:1092
+#: cps/admin.py:1091
 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier"
 msgstr "请输入LDAP主机、端口、DN和用户对象标识符"
 
-#: cps/admin.py:1098
+#: cps/admin.py:1097
 #, fuzzy
 msgid "Please Enter a LDAP Service Account and Password"
 msgstr "请输入有效的用户名进行密码重置"
 
-#: cps/admin.py:1101
+#: cps/admin.py:1100
 msgid "Please Enter a LDAP Service Account"
 msgstr ""
 
-#: cps/admin.py:1106
+#: cps/admin.py:1105
 #, python-format
 msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier"
 msgstr "LDAP组对象过滤器需要一个具有“%s”格式标识符"
 
-#: cps/admin.py:1108
+#: cps/admin.py:1107
 msgid "LDAP Group Object Filter Has Unmatched Parenthesis"
 msgstr "LDAP组对象过滤器的括号不匹配"
 
-#: cps/admin.py:1112
+#: cps/admin.py:1111
 #, python-format
 msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier"
 msgstr "LDAP用户对象过滤器需要一个具有“%s”格式标识符"
 
-#: cps/admin.py:1114
+#: cps/admin.py:1113
 msgid "LDAP User Object Filter Has Unmatched Parenthesis"
 msgstr "LDAP用户对象过滤器的括号不匹配"
 
-#: cps/admin.py:1121
+#: cps/admin.py:1120
 #, python-format
 msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier"
 msgstr ""
 
-#: cps/admin.py:1123
+#: cps/admin.py:1122
 msgid "LDAP Member User Filter Has Unmatched Parenthesis"
 msgstr ""
 
-#: cps/admin.py:1130
-msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path"
+#: cps/admin.py:1129
+msgid ""
+"LDAP CACertificate, Certificate or Key Location is not Valid, Please "
+"Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:1172 cps/admin.py:1273 cps/admin.py:1365 cps/admin.py:1459
-#: cps/admin.py:1525 cps/shelf.py:103 cps/shelf.py:163 cps/shelf.py:206
-#: cps/shelf.py:270 cps/shelf.py:331 cps/shelf.py:366 cps/shelf.py:437
+#: cps/admin.py:1171 cps/admin.py:1272 cps/admin.py:1365 cps/admin.py:1466
+#: cps/admin.py:1532 cps/shelf.py:102 cps/shelf.py:162 cps/shelf.py:205
+#: cps/shelf.py:272 cps/shelf.py:333 cps/shelf.py:368 cps/shelf.py:443
 msgid "Settings DB is not Writeable"
 msgstr "设置数据库不可写入"
 
-#: cps/admin.py:1183
+#: cps/admin.py:1182
 msgid "DB Location is not Valid, Please Enter Correct Path"
 msgstr "数据库路径无效,请输入正确的路径"
 
-#: cps/admin.py:1188
+#: cps/admin.py:1187
 msgid "DB is not Writeable"
 msgstr "数据库不可写入"
 
-#: cps/admin.py:1201
+#: cps/admin.py:1200
 msgid "Keyfile Location is not Valid, Please Enter Correct Path"
 msgstr "密钥文件路径无效,请输入正确的路径"
 
-#: cps/admin.py:1205
+#: cps/admin.py:1204
 msgid "Certfile Location is not Valid, Please Enter Correct Path"
 msgstr "证书文件路径无效,请输入正确的路径"
 
-#: cps/admin.py:1317
+#: cps/admin.py:1316
 #, fuzzy
 msgid "Database Configuration"
 msgstr "功能配置"
 
-#: cps/admin.py:1333 cps/web.py:1459
+#: cps/admin.py:1332 cps/web.py:1469
 msgid "Please fill out all fields!"
 msgstr "请填写所有字段!"
 
-#: cps/admin.py:1341
+#: cps/admin.py:1340
 msgid "E-mail is not from valid domain"
 msgstr "邮箱不在有效域中"
 
-#: cps/admin.py:1345 cps/admin.py:1478
+#: cps/admin.py:1344 cps/admin.py:1485
 msgid "Add new user"
 msgstr "添加新用户"
 
@@ -319,144 +331,144 @@ msgstr "用户“%(user)s”已创建"
 msgid "Found an existing account for this e-mail address or name."
 msgstr "此邮箱或用户名的账号已经存在。"
 
-#: cps/admin.py:1374
+#: cps/admin.py:1381
 #, python-format
 msgid "User '%(nick)s' deleted"
 msgstr "用户“%(nick)s”已删除"
 
-#: cps/admin.py:1376 cps/admin.py:1377
+#: cps/admin.py:1383 cps/admin.py:1384
 msgid "Can't delete Guest User"
 msgstr "无法删除游客用户"
 
-#: cps/admin.py:1380
+#: cps/admin.py:1387
 msgid "No admin user remaining, can't delete user"
 msgstr "管理员账户不存在,无法删除用户"
 
-#: cps/admin.py:1447 cps/admin.py:1568
+#: cps/admin.py:1454 cps/admin.py:1575
 #, python-format
 msgid "Edit User %(nick)s"
 msgstr "编辑用户 %(nick)s"
 
-#: cps/admin.py:1451
+#: cps/admin.py:1458
 #, python-format
 msgid "User '%(nick)s' updated"
 msgstr "用户“%(nick)s”已更新"
 
-#: cps/admin.py:1455 cps/admin.py:1583 cps/web.py:1484 cps/web.py:1545
+#: cps/admin.py:1462 cps/admin.py:1590 cps/web.py:1494 cps/web.py:1555
 msgid "An unknown error occurred. Please try again later."
 msgstr "发生一个未知错误,请稍后再试。"
 
-#: cps/admin.py:1487 cps/templates/admin.html:94
+#: cps/admin.py:1494 cps/templates/admin.html:94
 msgid "Edit E-mail Server Settings"
 msgstr "编辑邮件服务器设置"
 
-#: cps/admin.py:1506
+#: cps/admin.py:1513
 #, fuzzy
 msgid "Gmail Account Verification Successful"
 msgstr "G-Mail账号校验成功"
 
-#: cps/admin.py:1532
+#: cps/admin.py:1539
 #, python-format
 msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result"
-msgstr ""
+msgstr "发送给%(email)s的测试邮件已进入队列。请检查任务结果"
 
-#: cps/admin.py:1535
+#: cps/admin.py:1542
 #, python-format
 msgid "There was an error sending the Test e-mail: %(res)s"
 msgstr "发送测试邮件时出错:%(res)s"
 
-#: cps/admin.py:1537
+#: cps/admin.py:1544
 msgid "Please configure your e-mail address first..."
 msgstr "请先配置您的邮箱地址..."
 
-#: cps/admin.py:1539
+#: cps/admin.py:1546
 msgid "E-mail server settings updated"
 msgstr "邮件服务器设置已更新"
 
-#: cps/admin.py:1580
+#: cps/admin.py:1587
 #, python-format
 msgid "Password for user %(user)s reset"
 msgstr "用户 %(user)s 的密码已重置"
 
-#: cps/admin.py:1586 cps/web.py:1424
+#: cps/admin.py:1593 cps/web.py:1434
 msgid "Please configure the SMTP mail settings first..."
 msgstr "请先配置SMTP邮箱设置..."
 
-#: cps/admin.py:1597
+#: cps/admin.py:1604
 msgid "Logfile viewer"
 msgstr "日志文件查看器"
 
-#: cps/admin.py:1663
+#: cps/admin.py:1670
 msgid "Requesting update package"
 msgstr "正在请求更新包"
 
-#: cps/admin.py:1664
+#: cps/admin.py:1671
 msgid "Downloading update package"
 msgstr "正在下载更新包"
 
-#: cps/admin.py:1665
+#: cps/admin.py:1672
 msgid "Unzipping update package"
 msgstr "正在解压更新包"
 
-#: cps/admin.py:1666
+#: cps/admin.py:1673
 msgid "Replacing files"
 msgstr "正在替换文件"
 
-#: cps/admin.py:1667
+#: cps/admin.py:1674
 msgid "Database connections are closed"
 msgstr "数据库连接已关闭"
 
-#: cps/admin.py:1668
+#: cps/admin.py:1675
 msgid "Stopping server"
 msgstr "正在停止服务器"
 
-#: cps/admin.py:1669
+#: cps/admin.py:1676
 msgid "Update finished, please press okay and reload page"
 msgstr "更新完成,请点击确定并刷新页面"
 
-#: cps/admin.py:1670 cps/admin.py:1671 cps/admin.py:1672 cps/admin.py:1673
-#: cps/admin.py:1674
+#: cps/admin.py:1677 cps/admin.py:1678 cps/admin.py:1679 cps/admin.py:1680
+#: cps/admin.py:1681
 msgid "Update failed:"
 msgstr "更新失败:"
 
-#: cps/admin.py:1670 cps/updater.py:356 cps/updater.py:566 cps/updater.py:568
+#: cps/admin.py:1677 cps/updater.py:356 cps/updater.py:566 cps/updater.py:568
 msgid "HTTP Error"
 msgstr "HTTP错误"
 
-#: cps/admin.py:1671 cps/updater.py:358 cps/updater.py:570
+#: cps/admin.py:1678 cps/updater.py:358 cps/updater.py:570
 msgid "Connection error"
 msgstr "连接错误"
 
-#: cps/admin.py:1672 cps/updater.py:360 cps/updater.py:572
+#: cps/admin.py:1679 cps/updater.py:360 cps/updater.py:572
 msgid "Timeout while establishing connection"
 msgstr "建立连接超时"
 
-#: cps/admin.py:1673 cps/updater.py:362 cps/updater.py:574
+#: cps/admin.py:1680 cps/updater.py:362 cps/updater.py:574
 msgid "General error"
 msgstr "一般错误"
 
-#: cps/admin.py:1674
+#: cps/admin.py:1681
 msgid "Update File Could Not be Saved in Temp Dir"
 msgstr "更新文件无法保存在临时目录中"
 
-#: cps/admin.py:1735
+#: cps/admin.py:1742
 msgid "Failed to Create at Least One LDAP User"
 msgstr "创建至少一个LDAP用户失败"
 
-#: cps/admin.py:1748
+#: cps/admin.py:1755
 #, python-format
 msgid "Error: %(ldaperror)s"
 msgstr "错误:%(ldaperror)s"
 
-#: cps/admin.py:1752
+#: cps/admin.py:1759
 msgid "Error: No user returned in response of LDAP server"
 msgstr "错误:在LDAP服务器的响应中没有返回用户"
 
-#: cps/admin.py:1785
+#: cps/admin.py:1792
 msgid "At Least One LDAP User Not Found in Database"
 msgstr "数据库中没有找到至少一个LDAP用户"
 
-#: cps/admin.py:1787
+#: cps/admin.py:1794
 msgid "{} User Successfully Imported"
 msgstr "{} 用户被成功导入"
 
@@ -468,7 +480,7 @@ msgstr "未配置"
 msgid "Execution permissions missing"
 msgstr "缺少执行权限"
 
-#: cps/db.py:651 cps/web.py:642 cps/web.py:1138
+#: cps/db.py:651 cps/web.py:647 cps/web.py:1146
 #, python-format
 msgid "Custom Column No.%(column)d is not existing in calibre database"
 msgstr "自定义列号:%(column)d在Calibre数据库中不存在"
@@ -481,9 +493,11 @@ msgstr "书籍格式已成功删除"
 msgid "Book Successfully Deleted"
 msgstr "书籍已成功删除"
 
-#: cps/editbooks.py:370 cps/editbooks.py:743 cps/web.py:509 cps/web.py:1671
-#: cps/web.py:1707 cps/web.py:1778
-msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible"
+#: cps/editbooks.py:370 cps/editbooks.py:743 cps/web.py:512 cps/web.py:1686
+#: cps/web.py:1727 cps/web.py:1798
+msgid ""
+"Oops! Selected book title is unavailable. File does not exist or is not "
+"accessible"
 msgstr "糟糕!选择书名无法打开。文件不存在或者文件不可访问"
 
 #: cps/editbooks.py:404
@@ -493,7 +507,7 @@ msgstr "编辑元数据"
 #: cps/editbooks.py:452
 #, python-format
 msgid "%(seriesindex)s is not a valid number, skipping"
-msgstr ""
+msgstr "%(seriesindex)s 不是一个有效的数值,忽略"
 
 #: cps/editbooks.py:485
 #, python-format
@@ -519,7 +533,7 @@ msgstr "创建路径 %(path)s 失败(权限拒绝)。"
 msgid "Failed to store file %(file)s."
 msgstr "保存文件 %(file)s 失败。"
 
-#: cps/editbooks.py:653 cps/editbooks.py:1046 cps/web.py:1632
+#: cps/editbooks.py:653 cps/editbooks.py:1046 cps/web.py:1647
 #, python-format
 msgid "Database error: %(error)s."
 msgstr "数据库错误:%(error)s。"
@@ -542,7 +556,9 @@ msgid "Error editing book, please check logfile for details"
 msgstr "编辑书籍出错,请检查日志文件以获取详细信息"
 
 #: cps/editbooks.py:873
-msgid "Uploaded book probably exists in the library, consider to change before upload new: "
+msgid ""
+"Uploaded book probably exists in the library, consider to change before "
+"upload new: "
 msgstr "上传的书籍可能已经存在,建议修改后重新上传: "
 
 #: cps/editbooks.py:967
@@ -575,11 +591,15 @@ msgid "There was an error converting this book: %(res)s"
 msgstr "转换此书籍时出现错误: %(res)s"
 
 #: cps/gdrive.py:60
-msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
+msgid ""
+"Google Drive setup not completed, try to deactivate and activate Google "
+"Drive again"
 msgstr "Google Drive 设置未完成,请尝试停用并再次激活Google云端硬盘"
 
 #: cps/gdrive.py:97
-msgid "Callback domain is not verified, please follow steps to verify domain in google developer console"
+msgid ""
+"Callback domain is not verified, please follow steps to verify domain in "
+"google developer console"
 msgstr "回调域名尚未被校验,请在google开发者控制台按步骤校验域名"
 
 #: cps/helper.py:80
@@ -652,69 +672,73 @@ msgstr "删除书的文件夹%(id)s失败,路径有子文件夹:%(path)s"
 msgid "Deleting book %(id)s failed: %(message)s"
 msgstr "删除书籍 %(id)s失败:%(message)s"
 
-#: cps/helper.py:334
-#, python-format
-msgid "Deleting book %(id)s, book path not valid: %(path)s"
-msgstr "删除书籍 %(id)s失败,书籍路径无效:%(path)s"
+#: cps/helper.py:335
+#, fuzzy, python-format
+msgid ""
+"Deleting book %(id)s from database only, book path in database not valid:"
+" %(path)s"
+msgstr ""
+"仅从数据库中删除书籍 %(id)s,书籍路径在数据库中无效:"
+" %(path)s"
 
-#: cps/helper.py:389
+#: cps/helper.py:390
 #, python-format
 msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
 msgstr "将标题从“%(src)s”改为“%(dest)s”时失败,出错信息:%(error)s"
 
-#: cps/helper.py:404
+#: cps/helper.py:405
 #, python-format
 msgid "Rename file in path '%(src)s' to '%(dest)s' failed with error: %(error)s"
 msgstr "从“%(src)s”重命名为“%(dest)s”失败,出错信息:%(error)s"
 
-#: cps/helper.py:429 cps/helper.py:439 cps/helper.py:447
+#: cps/helper.py:430 cps/helper.py:440 cps/helper.py:448
 #, python-format
 msgid "File %(file)s not found on Google Drive"
 msgstr "Google Drive上找不到文件 %(file)s"
 
-#: cps/helper.py:468
+#: cps/helper.py:469
 #, python-format
 msgid "Book path %(path)s not found on Google Drive"
 msgstr "Google Drive上找不到书籍路径 %(path)s"
 
-#: cps/helper.py:511 cps/web.py:1627
+#: cps/helper.py:512 cps/web.py:1642
 #, fuzzy
 msgid "Found an existing account for this e-mail address"
 msgstr "此邮箱的账号已经存在。"
 
-#: cps/helper.py:519
+#: cps/helper.py:520
 msgid "This username is already taken"
 msgstr "此用户名已被使用"
 
-#: cps/helper.py:529
+#: cps/helper.py:530
 msgid "Invalid e-mail address format"
 msgstr "无效的邮件地址格式"
 
-#: cps/helper.py:602
+#: cps/helper.py:603
 msgid "Error Downloading Cover"
 msgstr "下载封面时出错"
 
-#: cps/helper.py:605
+#: cps/helper.py:606
 msgid "Cover Format Error"
 msgstr "封面格式出错"
 
-#: cps/helper.py:615
+#: cps/helper.py:616
 msgid "Failed to create path for cover"
 msgstr "创建封面路径失败"
 
-#: cps/helper.py:631
+#: cps/helper.py:632
 msgid "Cover-file is not a valid image file, or could not be stored"
 msgstr "封面文件不是有效的图片文件,或者无法存储"
 
-#: cps/helper.py:642
+#: cps/helper.py:643
 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
 msgstr "封面文件只支持jpg/jpeg/png/webp/bmp文件"
 
-#: cps/helper.py:655
+#: cps/helper.py:656
 msgid "Only jpg/jpeg files are supported as coverfile"
 msgstr "仅将jpg、jpeg文件作为封面文件"
 
-#: cps/helper.py:707
+#: cps/helper.py:708
 msgid "Unrar binary file not found"
 msgstr "找不到Unrar执行文件"
 
@@ -743,7 +767,9 @@ msgid "Unknown Status"
 msgstr "未知状态"
 
 #: cps/kobo_auth.py:131
-msgid "PLease access calibre-web from non localhost to get valid api_endpoint for kobo device"
+msgid ""
+"PLease access calibre-web from non localhost to get valid api_endpoint "
+"for kobo device"
 msgstr "请不要使用localhost访问Calibre-Web,以便Kobo设备能获取有效的api_endpoint"
 
 #: cps/kobo_auth.py:134 cps/kobo_auth.py:162
@@ -755,7 +781,7 @@ msgstr "Kobo 设置"
 msgid "Register with %(provider)s"
 msgstr "使用 %(provider)s 注册"
 
-#: cps/oauth_bb.py:139 cps/remotelogin.py:133 cps/web.py:1517
+#: cps/oauth_bb.py:139 cps/remotelogin.py:133 cps/web.py:1527
 #, python-format
 msgid "you are now logged in as: '%(nickname)s'"
 msgstr "您现在已以“%(nickname)s”身份登录"
@@ -821,7 +847,7 @@ msgid "{} Stars"
 msgstr "{} 星"
 
 #: cps/remotelogin.py:65 cps/templates/layout.html:85
-#: cps/templates/login.html:4 cps/templates/login.html:20 cps/web.py:1564
+#: cps/templates/login.html:4 cps/templates/login.html:20 cps/web.py:1574
 msgid "Login"
 msgstr "登录"
 
@@ -837,7 +863,7 @@ msgstr "Token已过期"
 msgid "Success! Please return to your device"
 msgstr "成功!请返回您的设备"
 
-#: cps/render_template.py:39 cps/web.py:415
+#: cps/render_template.py:39 cps/web.py:418
 msgid "Books"
 msgstr "书籍"
 
@@ -862,7 +888,7 @@ msgstr "下载历史"
 msgid "Show Downloaded Books"
 msgstr "显示下载过的书籍"
 
-#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:425
+#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:428
 msgid "Top Rated Books"
 msgstr "最高评分书籍"
 
@@ -871,7 +897,7 @@ msgid "Show Top Rated Books"
 msgstr "显示最高评分书籍"
 
 #: cps/render_template.py:59 cps/templates/index.xml:54
-#: cps/templates/index.xml:58 cps/web.py:651
+#: cps/templates/index.xml:58 cps/web.py:656
 msgid "Read Books"
 msgstr "已读书籍"
 
@@ -880,7 +906,7 @@ msgid "Show read and unread"
 msgstr "显示阅读状态"
 
 #: cps/render_template.py:63 cps/templates/index.xml:61
-#: cps/templates/index.xml:65 cps/web.py:654
+#: cps/templates/index.xml:65 cps/web.py:659
 msgid "Unread Books"
 msgstr "未读书籍"
 
@@ -898,7 +924,7 @@ msgid "Show Random Books"
 msgstr "显示随机书籍"
 
 #: cps/render_template.py:69 cps/templates/book_table.html:54
-#: cps/templates/index.xml:83 cps/web.py:1025
+#: cps/templates/index.xml:83 cps/web.py:1033
 msgid "Categories"
 msgstr "分类"
 
@@ -908,7 +934,7 @@ msgstr "显示分类选择"
 
 #: cps/render_template.py:72 cps/templates/book_edit.html:88
 #: cps/templates/book_table.html:55 cps/templates/index.xml:90
-#: cps/templates/search_form.html:68 cps/web.py:922 cps/web.py:932
+#: cps/templates/search_form.html:68 cps/web.py:930 cps/web.py:940
 msgid "Series"
 msgstr "丛书"
 
@@ -926,7 +952,7 @@ msgid "Show author selection"
 msgstr "显示作者选择"
 
 #: cps/render_template.py:79 cps/templates/book_table.html:59
-#: cps/templates/index.xml:76 cps/web.py:899
+#: cps/templates/index.xml:76 cps/web.py:907
 msgid "Publishers"
 msgstr "出版社"
 
@@ -936,7 +962,7 @@ msgstr "显示出版社选择"
 
 #: cps/render_template.py:82 cps/templates/book_table.html:57
 #: cps/templates/index.xml:97 cps/templates/search_form.html:106
-#: cps/web.py:1002
+#: cps/web.py:1010
 msgid "Languages"
 msgstr "语言"
 
@@ -960,7 +986,7 @@ msgstr "文件格式"
 msgid "Show file formats selection"
 msgstr "显示文件格式选择"
 
-#: cps/render_template.py:93 cps/web.py:678
+#: cps/render_template.py:93 cps/web.py:683
 msgid "Archived Books"
 msgstr "归档书籍"
 
@@ -968,7 +994,7 @@ msgstr "归档书籍"
 msgid "Show archived books"
 msgstr "显示归档书籍"
 
-#: cps/render_template.py:97 cps/web.py:752
+#: cps/render_template.py:97 cps/web.py:758
 msgid "Books List"
 msgstr "书籍列表"
 
@@ -976,98 +1002,103 @@ msgstr "书籍列表"
 msgid "Show Books List"
 msgstr "显示书籍列表"
 
-#: cps/shelf.py:69 cps/shelf.py:124
+#: cps/shelf.py:69 cps/shelf.py:123
 msgid "Invalid shelf specified"
 msgstr "指定的书架无效"
 
 #: cps/shelf.py:75
-#, python-format
-msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s"
+#, fuzzy, python-format
+msgid "Sorry you are not allowed to add a book to that shelf"
 msgstr "对不起,您没有添加书籍到书架 %(shelfname)s 的权限"
 
-#: cps/shelf.py:85
+#: cps/shelf.py:84
 #, python-format
 msgid "Book is already part of the shelf: %(shelfname)s"
 msgstr "此书籍已经是书架 %(shelfname)s 的一部分"
 
-#: cps/shelf.py:110
+#: cps/shelf.py:109
 #, python-format
 msgid "Book has been added to shelf: %(sname)s"
 msgstr "此书籍已被添加到书架:%(sname)s"
 
-#: cps/shelf.py:129
+#: cps/shelf.py:128
 #, python-format
 msgid "You are not allowed to add a book to the the shelf: %(name)s"
 msgstr "您没有添加书籍到书架 %(name)s 的权限"
 
-#: cps/shelf.py:147
+#: cps/shelf.py:146
 #, python-format
 msgid "Books are already part of the shelf: %(name)s"
 msgstr "书籍已经在书架 %(name)s 中了"
 
-#: cps/shelf.py:159
+#: cps/shelf.py:158
 #, python-format
 msgid "Books have been added to shelf: %(sname)s"
 msgstr "书籍已经被添加到书架 %(sname)s 中"
 
-#: cps/shelf.py:166
+#: cps/shelf.py:165
 #, python-format
 msgid "Could not add books to shelf: %(sname)s"
 msgstr "无法添加书籍到书架:%(sname)s"
 
-#: cps/shelf.py:212
+#: cps/shelf.py:211
 #, python-format
 msgid "Book has been removed from shelf: %(sname)s"
 msgstr "此书已从书架 %(sname)s 中删除"
 
-#: cps/shelf.py:221
+#: cps/shelf.py:220
 #, python-format
 msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
 msgstr "对不起,您没有从书架 %(sname)s 中删除书籍的权限"
 
-#: cps/shelf.py:231 cps/templates/layout.html:141
+#: cps/shelf.py:230 cps/templates/layout.html:141
 msgid "Create a Shelf"
 msgstr "创建书架"
 
 #: cps/shelf.py:238
+#, fuzzy, python-format
+msgid "Sorry you are not allowed to edit this shelf"
+msgstr "对不起,您没有编辑书架的权限"
+
+#: cps/shelf.py:240
 msgid "Edit a shelf"
 msgstr "编辑书架"
 
-#: cps/shelf.py:257
+#: cps/shelf.py:259
 #, python-format
 msgid "Shelf %(title)s created"
 msgstr "书架 %(title)s 已创建"
 
-#: cps/shelf.py:260
+#: cps/shelf.py:262
 #, python-format
 msgid "Shelf %(title)s changed"
 msgstr "书架 %(title)s 已修改"
 
-#: cps/shelf.py:274
+#: cps/shelf.py:276
 msgid "There was an error"
 msgstr "发生错误"
 
-#: cps/shelf.py:296
+#: cps/shelf.py:298
 #, python-format
 msgid "A public shelf with the name '%(title)s' already exists."
 msgstr "公共书架:%(title)s已经存在已经存在。"
 
-#: cps/shelf.py:307
+#: cps/shelf.py:309
 #, python-format
 msgid "A private shelf with the name '%(title)s' already exists."
 msgstr "私有书架:%(title)s已经存在已经存在。"
 
-#: cps/shelf.py:376
+#: cps/shelf.py:378
 #, python-format
 msgid "Change order of Shelf: '%(name)s'"
 msgstr "修改书架 %(name)s 顺序"
 
-#: cps/shelf.py:442
+#: cps/shelf.py:448
 #, python-format
 msgid "Shelf: '%(name)s'"
 msgstr "书架:%(name)s"
 
-#: cps/shelf.py:446
+#: cps/shelf.py:452
 msgid "Error opening shelf. Shelf does not exist or is not accessible"
 msgstr "打开书架出错。书架不存在或不可访问"
 
@@ -1080,7 +1111,9 @@ msgid "No update available. You already have the latest version installed"
 msgstr "无可用更新。您已经安装了最新版本"
 
 #: cps/updater.py:399
-msgid "A new update is available. Click on the button below to update to the latest version."
+msgid ""
+"A new update is available. Click on the button below to update to the "
+"latest version."
 msgstr "有新的更新。单击下面的按钮以更新到最新版本。"
 
 #: cps/updater.py:417
@@ -1093,192 +1126,191 @@ msgstr "点击下面按钮更新到最新稳定版本。"
 
 #: cps/updater.py:436 cps/updater.py:450 cps/updater.py:461
 #, python-format
-msgid "A new update is available. Click on the button below to update to version: %(version)s"
+msgid ""
+"A new update is available. Click on the button below to update to "
+"version: %(version)s"
 msgstr "有新的更新。单击下面的按钮以更新到版本: %(version)s"
 
 #: cps/updater.py:478
 msgid "No release information available"
 msgstr "无可用发布信息"
 
-#: cps/templates/index.html:5 cps/web.py:435
+#: cps/templates/index.html:5 cps/web.py:438
 msgid "Discover (Random Books)"
 msgstr "发现(随机书籍)"
 
-#: cps/web.py:461
+#: cps/web.py:464
 msgid "Hot Books (Most Downloaded)"
 msgstr "热门书籍(最多下载)"
 
-#: cps/web.py:494
+#: cps/web.py:497
 #, python-format
 msgid "Downloaded books by %(user)s"
 msgstr "%(user)s 下载过的书籍"
 
-#: cps/web.py:523
+#: cps/web.py:528
 #, python-format
 msgid "Author: %(name)s"
 msgstr "作者:%(name)s"
 
-#: cps/web.py:538
+#: cps/web.py:543
 #, python-format
 msgid "Publisher: %(name)s"
 msgstr "出版社:%(name)s"
 
-#: cps/web.py:551
+#: cps/web.py:556
 #, python-format
 msgid "Series: %(serie)s"
 msgstr "丛书:%(serie)s"
 
-#: cps/web.py:564
+#: cps/web.py:569
 #, python-format
 msgid "Rating: %(rating)s stars"
 msgstr "评分:%(rating)s 星"
 
-#: cps/web.py:577
+#: cps/web.py:582
 #, python-format
 msgid "File format: %(format)s"
 msgstr "文件格式:%(format)s"
 
-#: cps/web.py:593
+#: cps/web.py:598
 #, python-format
 msgid "Category: %(name)s"
 msgstr "分类:%(name)s"
 
-#: cps/web.py:612
+#: cps/web.py:617
 #, python-format
 msgid "Language: %(name)s"
 msgstr "语言:%(name)s"
 
-#: cps/templates/layout.html:56 cps/web.py:712 cps/web.py:1352
+#: cps/templates/layout.html:56 cps/web.py:717 cps/web.py:1362
 msgid "Advanced Search"
 msgstr "高级搜索"
 
 #: cps/templates/book_edit.html:237 cps/templates/feed.xml:33
 #: cps/templates/index.xml:11 cps/templates/layout.html:45
 #: cps/templates/layout.html:48 cps/templates/search_form.html:225
-#: cps/web.py:724 cps/web.py:1060
+#: cps/web.py:730 cps/web.py:1068
 msgid "Search"
 msgstr "搜索"
 
-#: cps/templates/admin.html:16 cps/web.py:877
+#: cps/templates/admin.html:16 cps/web.py:885
 msgid "Downloads"
 msgstr "下载次数"
 
-#: cps/web.py:953
+#: cps/web.py:961
 msgid "Ratings list"
 msgstr "评分列表"
 
-#: cps/web.py:974
+#: cps/web.py:982
 msgid "File formats list"
 msgstr "文件格式列表"
 
-#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:1039
+#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:1047
 msgid "Tasks"
 msgstr "任务列表"
 
-#: cps/web.py:1198
+#: cps/web.py:1206
 msgid "Published after "
 msgstr "出版时间晚于 "
 
-#: cps/web.py:1205
+#: cps/web.py:1213
 msgid "Published before "
 msgstr "出版时间早于 "
 
-#: cps/web.py:1227
+#: cps/web.py:1235
 #, python-format
 msgid "Rating <= %(rating)s"
 msgstr "评分 <= %(rating)s"
 
-#: cps/web.py:1229
+#: cps/web.py:1237
 #, python-format
 msgid "Rating >= %(rating)s"
 msgstr "评分 >= %(rating)s"
 
-#: cps/web.py:1231
+#: cps/web.py:1239
 #, python-format
 msgid "Read Status = %(status)s"
-msgstr ""
+msgstr "阅读状态 = %(status)s"
 
-#: cps/web.py:1334
+#: cps/web.py:1344
 msgid "Error on search for custom columns, please restart Calibre-Web"
-msgstr ""
+msgstr "搜索自定义列时出错,请重启 Calibre-Web"
 
-#: cps/web.py:1429
+#: cps/web.py:1439
 #, python-format
 msgid "Book successfully queued for sending to %(kindlemail)s"
 msgstr "书籍已经成功加入 %(kindlemail)s 的发送队列"
 
-#: cps/web.py:1433
+#: cps/web.py:1443
 #, python-format
 msgid "Oops! There was an error sending this book: %(res)s"
 msgstr "糟糕!发送这本书籍的时候出现错误:%(res)s"
 
-#: cps/web.py:1435
+#: cps/web.py:1445
 msgid "Please update your profile with a valid Send to Kindle E-mail Address."
 msgstr "请先配置您的kindle邮箱。"
 
-#: cps/web.py:1452
+#: cps/web.py:1462
 msgid "E-Mail server is not configured, please contact your administrator!"
 msgstr "邮件服务未配置,请联系网站管理员!"
 
-#: cps/templates/layout.html:86 cps/templates/register.html:16 cps/web.py:1453
-#: cps/web.py:1460 cps/web.py:1466 cps/web.py:1485 cps/web.py:1489
-#: cps/web.py:1495
+#: cps/templates/layout.html:86 cps/templates/register.html:16 cps/web.py:1463
+#: cps/web.py:1470 cps/web.py:1476 cps/web.py:1495 cps/web.py:1499
+#: cps/web.py:1505
 msgid "Register"
 msgstr "注册"
 
-#: cps/web.py:1487
+#: cps/web.py:1497
 msgid "Your e-mail is not allowed to register"
 msgstr "您的电子邮件不允许注册"
 
-#: cps/web.py:1490
+#: cps/web.py:1500
 msgid "Confirmation e-mail was send to your e-mail account."
 msgstr "确认邮件已经发送到您的邮箱。"
 
-#: cps/web.py:1507
+#: cps/web.py:1517
 msgid "Cannot activate LDAP authentication"
 msgstr "无法激活LDAP认证"
 
-#: cps/web.py:1524
+#: cps/web.py:1534
 #, python-format
-msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known"
+msgid ""
+"Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not"
+" known"
 msgstr "后备登录“%(nickname)s”:无法访问LDAP服务器,或用户未知"
 
-#: cps/web.py:1530
+#: cps/web.py:1540
 #, python-format
 msgid "Could not login: %(message)s"
 msgstr "无法登录:%(message)s"
 
-#: cps/web.py:1534 cps/web.py:1558
+#: cps/web.py:1544 cps/web.py:1568
 msgid "Wrong Username or Password"
 msgstr "用户名或密码错误"
 
-#: cps/web.py:1541
+#: cps/web.py:1551
 msgid "New Password was send to your email address"
 msgstr "新密码已发送到您的邮箱"
 
-#: cps/web.py:1547
+#: cps/web.py:1557
 msgid "Please enter valid username to reset password"
 msgstr "请输入有效的用户名进行密码重置"
 
-#: cps/web.py:1553
+#: cps/web.py:1563
 #, python-format
 msgid "You are now logged in as: '%(nickname)s'"
 msgstr "您现在已以“%(nickname)s”登录"
 
-#: cps/web.py:1609 cps/web.py:1656
+#: cps/web.py:1622 cps/web.py:1671
 #, python-format
 msgid "%(name)s's profile"
 msgstr "%(name)s 的用户配置"
 
-#: cps/web.py:1623
+#: cps/web.py:1638
 msgid "Profile updated"
 msgstr "资料已更新"
 
-#: cps/web.py:1683 cps/web.py:1686 cps/web.py:1689 cps/web.py:1692
-#: cps/web.py:1699 cps/web.py:1704
-msgid "Read a Book"
-msgstr "阅读一本书"
-
 #: cps/services/gmail.py:41
 msgid "Found no valid gmail.json file with OAuth information"
 msgstr ""
@@ -1412,7 +1444,7 @@ msgstr "发件人邮箱"
 
 #: cps/templates/admin.html:84
 msgid "E-Mail Service"
-msgstr ""
+msgstr "电子邮件服务"
 
 #: cps/templates/admin.html:85
 msgid "Gmail via Oauth2"
@@ -1543,7 +1575,7 @@ msgstr "确定"
 #: cps/templates/config_view_edit.html:151 cps/templates/modal_dialogs.html:64
 #: cps/templates/modal_dialogs.html:99 cps/templates/modal_dialogs.html:117
 #: cps/templates/modal_dialogs.html:135 cps/templates/shelf.html:96
-#: cps/templates/shelf_edit.html:26 cps/templates/user_edit.html:137
+#: cps/templates/shelf_edit.html:26 cps/templates/user_edit.html:136
 msgid "Cancel"
 msgstr "取消"
 
@@ -1680,7 +1712,9 @@ msgid "Rating"
 msgstr "评分"
 
 #: cps/templates/book_edit.html:102
-msgid "Fetch Cover from URL (JPEG - Image will be downloaded and stored in database)"
+msgid ""
+"Fetch Cover from URL (JPEG - Image will be downloaded and stored in "
+"database)"
 msgstr "从URL获取封面(JPEG - 图片将下载并存储在数据库中)"
 
 #: cps/templates/book_edit.html:106
@@ -1727,7 +1761,7 @@ msgstr "获取元数据"
 #: cps/templates/book_edit.html:214 cps/templates/config_db.html:52
 #: cps/templates/config_edit.html:349 cps/templates/config_view_edit.html:150
 #: cps/templates/email_edit.html:64 cps/templates/shelf_edit.html:24
-#: cps/templates/shelf_order.html:40 cps/templates/user_edit.html:135
+#: cps/templates/shelf_order.html:40 cps/templates/user_edit.html:134
 msgid "Save"
 msgstr "保存"
 
@@ -1777,11 +1811,11 @@ msgstr "合并选中的书籍"
 
 #: cps/templates/book_table.html:25 cps/templates/user_table.html:122
 msgid "Remove Selections"
-msgstr "删除选中的书籍"
+msgstr "删除所选项"
 
 #: cps/templates/book_table.html:28
 msgid "Exchange author and title"
-msgstr ""
+msgstr "交换作者和标题"
 
 #: cps/templates/book_table.html:34
 msgid "Update Title Sort automatically"
@@ -2035,7 +2069,9 @@ msgid "SSL"
 msgstr "SSL协议"
 
 #: cps/templates/config_edit.html:201
-msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)"
+msgid ""
+"LDAP CACertificate Path (Only needed for Client Certificate "
+"Authentication)"
 msgstr ""
 
 #: cps/templates/config_edit.html:208
@@ -2193,35 +2229,35 @@ msgstr "按规则提取书名后排序(正则表达式)"
 msgid "Default Settings for New Users"
 msgstr "新用户默认权限设置"
 
-#: cps/templates/config_view_edit.html:87 cps/templates/user_edit.html:93
+#: cps/templates/config_view_edit.html:87 cps/templates/user_edit.html:92
 msgid "Admin User"
 msgstr "管理员用户"
 
-#: cps/templates/config_view_edit.html:91 cps/templates/user_edit.html:98
+#: cps/templates/config_view_edit.html:91 cps/templates/user_edit.html:97
 msgid "Allow Downloads"
 msgstr "允许下载书籍"
 
-#: cps/templates/config_view_edit.html:95 cps/templates/user_edit.html:102
+#: cps/templates/config_view_edit.html:95 cps/templates/user_edit.html:101
 msgid "Allow eBook Viewer"
 msgstr "允许在线阅读"
 
-#: cps/templates/config_view_edit.html:99 cps/templates/user_edit.html:106
+#: cps/templates/config_view_edit.html:99 cps/templates/user_edit.html:105
 msgid "Allow Uploads"
 msgstr "允许上传书籍"
 
-#: cps/templates/config_view_edit.html:103 cps/templates/user_edit.html:110
+#: cps/templates/config_view_edit.html:103 cps/templates/user_edit.html:109
 msgid "Allow Edit"
 msgstr "允许编辑书籍"
 
-#: cps/templates/config_view_edit.html:107 cps/templates/user_edit.html:114
+#: cps/templates/config_view_edit.html:107 cps/templates/user_edit.html:113
 msgid "Allow Delete Books"
 msgstr "允许删除书籍"
 
-#: cps/templates/config_view_edit.html:111 cps/templates/user_edit.html:119
+#: cps/templates/config_view_edit.html:111 cps/templates/user_edit.html:118
 msgid "Allow Changing Password"
 msgstr "允许修改密码"
 
-#: cps/templates/config_view_edit.html:115 cps/templates/user_edit.html:123
+#: cps/templates/config_view_edit.html:115 cps/templates/user_edit.html:122
 msgid "Allow Editing Public Shelves"
 msgstr "允许编辑公共书架"
 
@@ -2229,12 +2265,12 @@ msgstr "允许编辑公共书架"
 msgid "Default Visibilities for New Users"
 msgstr "新用户默认显示权限"
 
-#: cps/templates/config_view_edit.html:141 cps/templates/user_edit.html:81
+#: cps/templates/config_view_edit.html:141 cps/templates/user_edit.html:80
 #: cps/templates/user_table.html:152
 msgid "Show Random Books in Detail View"
 msgstr "在主页显示随机书籍"
 
-#: cps/templates/config_view_edit.html:143 cps/templates/user_edit.html:84
+#: cps/templates/config_view_edit.html:143 cps/templates/user_edit.html:83
 msgid "Add Allowed/Denied Tags"
 msgstr "添加显示或隐藏书籍的标签值"
 
@@ -2314,11 +2350,11 @@ msgstr "使用标准电子邮件账号"
 
 #: cps/templates/email_edit.html:15
 msgid "Gmail Account with OAuth2 Verification"
-msgstr ""
+msgstr "使用Gmail账号"
 
 #: cps/templates/email_edit.html:21
 msgid "Setup Gmail Account as E-Mail Server"
-msgstr ""
+msgstr "设置Gmail账号作为电子邮件服务"
 
 #: cps/templates/email_edit.html:23
 msgid "Revoke Gmail Access"
@@ -2393,25 +2429,25 @@ msgstr "回到首页"
 
 #: cps/templates/http_error.html:50
 msgid "Logout User"
-msgstr ""
+msgstr "登出账号"
 
 #: cps/templates/index.html:72 cps/templates/search.html:33
 #: cps/templates/shelf.html:20
 msgid "Sort authors in alphabetical order"
-msgstr ""
+msgstr "按作者字母顺序排序"
 
 #: cps/templates/index.html:73 cps/templates/search.html:34
 #: cps/templates/shelf.html:21
 msgid "Sort authors in reverse alphabetical order"
-msgstr ""
+msgstr "按作者逆字母顺序排序"
 
 #: cps/templates/index.html:77
 msgid "Sort ascending according to series index"
-msgstr ""
+msgstr "按丛书编号排序"
 
 #: cps/templates/index.html:78
 msgid "Sort descending according to series index"
-msgstr ""
+msgstr "按丛书编号逆排序"
 
 #: cps/templates/index.xml:6
 msgid "Start"
@@ -2569,11 +2605,11 @@ msgstr "显示访问日志: "
 
 #: cps/templates/logviewer.html:18
 msgid "Download Calibre-Web Log"
-msgstr ""
+msgstr "下载Calibre-Web日志"
 
 #: cps/templates/logviewer.html:21
 msgid "Download Access Log"
-msgstr ""
+msgstr "下载访问日志"
 
 #: cps/templates/modal_dialogs.html:6
 msgid "Select Allowed/Denied Tags"
@@ -2616,7 +2652,9 @@ msgid "Important Kobo Note: deleted books will remain on any paired Kobo device.
 msgstr "Kobo 重要说明:被删除的书籍将保留在任何配对的 Kobo 设备上。"
 
 #: cps/templates/modal_dialogs.html:57
-msgid "Books must first be archived and the device synced before a book can safely be deleted."
+msgid ""
+"Books must first be archived and the device synced before a book can "
+"safely be deleted."
 msgstr "必须先将书籍存档并同步设备,然后才能安全地删除书籍。"
 
 #: cps/templates/modal_dialogs.html:76
@@ -2652,10 +2690,20 @@ msgstr "丛书编号"
 msgid "Calibre-Web eBook Catalog"
 msgstr "Caliebre-Web电子书路径"
 
+#: cps/templates/read.html:6
+#, fuzzy
+msgid "epub Reader"
+msgstr "epub阅读器"
+
 #: cps/templates/read.html:74
 msgid "Reflow text when sidebars are open."
 msgstr "打开侧栏时重排文本。"
 
+#: cps/templates/readcbr.html:7
+#, fuzzy
+msgid "Comic Reader"
+msgstr "Comic阅读器"
+
 #: cps/templates/readcbr.html:89
 msgid "Keyboard Shortcuts"
 msgstr "快捷键"
@@ -2754,31 +2802,38 @@ msgstr "从右到左"
 
 #: cps/templates/readcbr.html:165
 msgid "Reset to Top"
-msgstr ""
+msgstr "重置为顶部"
 
 #: cps/templates/readcbr.html:166
 msgid "Remember Position"
-msgstr ""
+msgstr "记住位置"
 
 #: cps/templates/readcbr.html:171
 msgid "Scrollbar"
-msgstr ""
+msgstr "工具栏"
 
 #: cps/templates/readcbr.html:174
 msgid "Show"
-msgstr ""
+msgstr "显示"
 
 #: cps/templates/readcbr.html:175
 msgid "Hide"
-msgstr ""
+msgstr "隐藏"
+
+#: cps/templates/readdjvu.html:10
+#, fuzzy
+msgid "DJVU Reader"
+msgstr "DJVU阅读器"
 
 #: cps/templates/readpdf.html:29
-msgid "PDF reader"
+#, fuzzy
+msgid "PDF Reader"
 msgstr "PDF阅读器"
 
 #: cps/templates/readtxt.html:6
-msgid "Basic txt Reader"
-msgstr "基础文本阅读器"
+#, fuzzy
+msgid "txt Reader"
+msgstr "txt阅读器"
 
 #: cps/templates/register.html:4
 msgid "Register New Account"
@@ -2882,19 +2937,19 @@ msgstr "编辑书架属性"
 
 #: cps/templates/shelf.html:13
 msgid "Arrange books manually"
-msgstr ""
+msgstr "手动排列书籍排列顺序"
 
 #: cps/templates/shelf.html:14
 msgid "Disable Change order"
-msgstr ""
+msgstr "禁止改变顺序"
 
 #: cps/templates/shelf.html:14
 msgid "Enable Change order"
-msgstr ""
+msgstr "允许改变顺序"
 
 #: cps/templates/shelf.html:93
 msgid "Shelf will be deleted for all users"
-msgstr "书架将会重所有用户中删除"
+msgstr "书架将会从所有用户中删除"
 
 #: cps/templates/shelf_edit.html:13
 msgid "Share with Everyone"
@@ -2902,7 +2957,7 @@ msgstr "书架将被公开"
 
 #: cps/templates/shelf_edit.html:20
 msgid "Sync this shelf with Kobo device"
-msgstr ""
+msgstr "同步这个书架到 Kobo device"
 
 #: cps/templates/shelf_order.html:5
 msgid "Drag to Rearrange Order"
@@ -3004,15 +3059,15 @@ msgstr "Kobo 同步 Token"
 msgid "Create/View"
 msgstr "新建或查看"
 
-#: cps/templates/user_edit.html:85
+#: cps/templates/user_edit.html:84
 msgid "Add allowed/Denied Custom Column Values"
 msgstr "添加显示或隐藏书籍的自定义栏目值"
 
-#: cps/templates/user_edit.html:130
+#: cps/templates/user_edit.html:129
 msgid "Sync only books in selected shelves with Kobo"
-msgstr ""
+msgstr "仅同步所选书架中的书籍到 Kobo"
 
-#: cps/templates/user_edit.html:140 cps/templates/user_table.html:167
+#: cps/templates/user_edit.html:139 cps/templates/user_table.html:167
 msgid "Delete User"
 msgstr "删除此用户"
 
@@ -3050,7 +3105,7 @@ msgstr "本地化"
 
 #: cps/templates/user_table.html:136
 msgid "Visible Book Languages"
-msgstr ""
+msgstr "可见数据语言"
 
 #: cps/templates/user_table.html:137
 msgid "Edit Allowed Tags"
@@ -3094,7 +3149,7 @@ msgstr "修改密码"
 
 #: cps/templates/user_table.html:145
 msgid "View"
-msgstr ""
+msgstr "查看书籍"
 
 #: cps/templates/user_table.html:148
 #, fuzzy
@@ -3103,7 +3158,7 @@ msgstr "编辑公共书架"
 
 #: cps/templates/user_table.html:150
 msgid "Sync Selected Shelves with Kobo"
-msgstr ""
+msgstr "同步所选书架到 Kobo"
 
 #: cps/templates/user_table.html:154
 msgid "Show read/unread selection"
@@ -3113,3 +3168,8 @@ msgstr "显示已读/未读选择"
 msgid "Show random books"
 msgstr "显示随机书籍"
 
+#~ msgid "Read a Book"
+#~ msgstr "阅读一本书"
+
+#~ msgid "Basic txt Reader"
+#~ msgstr "基础文本阅读器"
diff --git a/messages.pot b/messages.pot
index b33020b1..ad01b68d 100644
--- a/messages.pot
+++ b/messages.pot
@@ -8,14 +8,14 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2021-06-29 18:30+0200\n"
+"POT-Creation-Date: 2021-07-29 13:45+0800\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"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.9.0\n"
+"Generated-By: Babel 2.9.1\n"
 
 #: cps/about.py:43 cps/about.py:59
 msgid "installed"
@@ -29,277 +29,289 @@ msgstr ""
 msgid "Statistics"
 msgstr ""
 
-#: cps/admin.py:142
+#: cps/admin.py:141
 msgid "Server restarted, please reload page"
 msgstr ""
 
-#: cps/admin.py:144
+#: cps/admin.py:143
 msgid "Performing shutdown of server, please close window"
 msgstr ""
 
-#: cps/admin.py:152
+#: cps/admin.py:151
 msgid "Reconnect successful"
 msgstr ""
 
-#: cps/admin.py:155
+#: cps/admin.py:154
 msgid "Unknown command"
 msgstr ""
 
-#: cps/admin.py:165 cps/editbooks.py:687 cps/editbooks.py:701
+#: cps/admin.py:164 cps/editbooks.py:687 cps/editbooks.py:701
 #: cps/editbooks.py:840 cps/editbooks.py:842 cps/editbooks.py:869
 #: cps/editbooks.py:885 cps/updater.py:555 cps/uploader.py:94
 #: cps/uploader.py:104
 msgid "Unknown"
 msgstr ""
 
-#: cps/admin.py:186
+#: cps/admin.py:185
 msgid "Admin page"
 msgstr ""
 
-#: cps/admin.py:205
+#: cps/admin.py:204
 msgid "Basic Configuration"
 msgstr ""
 
-#: cps/admin.py:238
+#: cps/admin.py:237
 msgid "UI Configuration"
 msgstr ""
 
-#: cps/admin.py:271 cps/templates/admin.html:46
+#: cps/admin.py:270 cps/templates/admin.html:46
 msgid "Edit Users"
 msgstr ""
 
-#: cps/admin.py:312 cps/opds.py:110 cps/opds.py:199 cps/opds.py:276
+#: cps/admin.py:311 cps/opds.py:110 cps/opds.py:199 cps/opds.py:276
 #: cps/opds.py:328 cps/templates/grid.html:14 cps/templates/list.html:14
 msgid "All"
 msgstr ""
 
-#: cps/admin.py:337 cps/admin.py:1550
+#: cps/admin.py:336 cps/admin.py:1557
 msgid "User not found"
 msgstr ""
 
-#: cps/admin.py:351
+#: cps/admin.py:350
 msgid "{} users deleted successfully"
 msgstr ""
 
-#: cps/admin.py:373 cps/templates/user_edit.html:44
+#: cps/admin.py:372 cps/templates/user_edit.html:44
 #: cps/templates/user_table.html:80
 msgid "Show All"
 msgstr ""
 
-#: cps/admin.py:394 cps/admin.py:400
+#: cps/admin.py:393 cps/admin.py:399
 msgid "Malformed request"
 msgstr ""
 
-#: cps/admin.py:412 cps/admin.py:1432
+#: cps/admin.py:411 cps/admin.py:1439
 msgid "Guest Name can't be changed"
 msgstr ""
 
-#: cps/admin.py:424
+#: cps/admin.py:423
 msgid "Guest can't have this role"
 msgstr ""
 
-#: cps/admin.py:436 cps/admin.py:1395
+#: cps/admin.py:435 cps/admin.py:1402
 msgid "No admin user remaining, can't remove admin role"
 msgstr ""
 
-#: cps/admin.py:440 cps/admin.py:454
+#: cps/admin.py:439 cps/admin.py:453
 msgid "Value has to be true or false"
 msgstr ""
 
-#: cps/admin.py:442
+#: cps/admin.py:441
 msgid "Invalid role"
 msgstr ""
 
-#: cps/admin.py:446
+#: cps/admin.py:445
 msgid "Guest can't have this view"
 msgstr ""
 
-#: cps/admin.py:456
+#: cps/admin.py:455
 msgid "Invalid view"
 msgstr ""
 
-#: cps/admin.py:459
+#: cps/admin.py:458
 msgid "Guest's Locale is determined automatically and can't be set"
 msgstr ""
 
-#: cps/admin.py:463
+#: cps/admin.py:462
 msgid "No Valid Locale Given"
 msgstr ""
 
-#: cps/admin.py:474
+#: cps/admin.py:473
 msgid "No Valid Book Language Given"
 msgstr ""
 
-#: cps/admin.py:476
+#: cps/admin.py:475
 msgid "Parameter not found"
 msgstr ""
 
-#: cps/admin.py:531
+#: cps/admin.py:530
 msgid "Invalid Read Column"
 msgstr ""
 
-#: cps/admin.py:537
+#: cps/admin.py:536
 msgid "Invalid Restricted Column"
 msgstr ""
 
-#: cps/admin.py:556 cps/admin.py:1288
+#: cps/admin.py:555 cps/admin.py:1287
 msgid "Calibre-Web configuration updated"
 msgstr ""
 
-#: cps/admin.py:568
+#: cps/admin.py:567
 msgid "Do you really want to delete the Kobo Token?"
 msgstr ""
 
-#: cps/admin.py:570
+#: cps/admin.py:569
 msgid "Do you really want to delete this domain?"
 msgstr ""
 
-#: cps/admin.py:572
+#: cps/admin.py:571
 msgid "Do you really want to delete this user?"
 msgstr ""
 
-#: cps/admin.py:574 cps/templates/shelf.html:90
+#: cps/admin.py:573 cps/templates/shelf.html:90
 msgid "Are you sure you want to delete this shelf?"
 msgstr ""
 
-#: cps/admin.py:576
+#: cps/admin.py:575
 msgid "Are you sure you want to change locales of selected user(s)?"
 msgstr ""
 
-#: cps/admin.py:578
-msgid "Are you sure you want to change visible book languages for selected user(s)?"
+#: cps/admin.py:577
+msgid ""
+"Are you sure you want to change visible book languages for selected "
+"user(s)?"
 msgstr ""
 
-#: cps/admin.py:580
-msgid "Are you sure you want to change the selected role for the selected user(s)?"
+#: cps/admin.py:579
+msgid ""
+"Are you sure you want to change the selected role for the selected "
+"user(s)?"
 msgstr ""
 
-#: cps/admin.py:582
-msgid "Are you sure you want to change the selected restrictions for the selected user(s)?"
+#: cps/admin.py:581
+msgid ""
+"Are you sure you want to change the selected restrictions for the "
+"selected user(s)?"
 msgstr ""
 
-#: cps/admin.py:584
-msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?"
+#: cps/admin.py:583
+msgid ""
+"Are you sure you want to change the selected visibility restrictions for "
+"the selected user(s)?"
 msgstr ""
 
-#: cps/admin.py:586
-msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?"
+#: cps/admin.py:585
+msgid ""
+"Are you sure you want to change shelf sync behavior for the selected "
+"user(s)?"
 msgstr ""
 
-#: cps/admin.py:588
+#: cps/admin.py:587
 msgid "Are you sure you want to change Calibre library location?"
 msgstr ""
 
-#: cps/admin.py:737
+#: cps/admin.py:736
 msgid "Tag not found"
 msgstr ""
 
-#: cps/admin.py:749
+#: cps/admin.py:748
 msgid "Invalid Action"
 msgstr ""
 
-#: cps/admin.py:854 cps/admin.py:860 cps/admin.py:870 cps/admin.py:880
+#: cps/admin.py:853 cps/admin.py:859 cps/admin.py:869 cps/admin.py:879
 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:40
 #: cps/templates/user_table.html:57
 msgid "Deny"
 msgstr ""
 
-#: cps/admin.py:856 cps/admin.py:862 cps/admin.py:872 cps/admin.py:882
+#: cps/admin.py:855 cps/admin.py:861 cps/admin.py:871 cps/admin.py:881
 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:43
 #: cps/templates/user_table.html:60
 msgid "Allow"
 msgstr ""
 
-#: cps/admin.py:1011
+#: cps/admin.py:1010
 msgid "client_secrets.json Is Not Configured For Web Application"
 msgstr ""
 
-#: cps/admin.py:1056
+#: cps/admin.py:1055
 msgid "Logfile Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:1062
+#: cps/admin.py:1061
 msgid "Access Logfile Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:1092
+#: cps/admin.py:1091
 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier"
 msgstr ""
 
-#: cps/admin.py:1098
+#: cps/admin.py:1097
 msgid "Please Enter a LDAP Service Account and Password"
 msgstr ""
 
-#: cps/admin.py:1101
+#: cps/admin.py:1100
 msgid "Please Enter a LDAP Service Account"
 msgstr ""
 
-#: cps/admin.py:1106
+#: cps/admin.py:1105
 #, python-format
 msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier"
 msgstr ""
 
-#: cps/admin.py:1108
+#: cps/admin.py:1107
 msgid "LDAP Group Object Filter Has Unmatched Parenthesis"
 msgstr ""
 
-#: cps/admin.py:1112
+#: cps/admin.py:1111
 #, python-format
 msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier"
 msgstr ""
 
-#: cps/admin.py:1114
+#: cps/admin.py:1113
 msgid "LDAP User Object Filter Has Unmatched Parenthesis"
 msgstr ""
 
-#: cps/admin.py:1121
+#: cps/admin.py:1120
 #, python-format
 msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier"
 msgstr ""
 
-#: cps/admin.py:1123
+#: cps/admin.py:1122
 msgid "LDAP Member User Filter Has Unmatched Parenthesis"
 msgstr ""
 
-#: cps/admin.py:1130
-msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path"
+#: cps/admin.py:1129
+msgid ""
+"LDAP CACertificate, Certificate or Key Location is not Valid, Please "
+"Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:1172 cps/admin.py:1273 cps/admin.py:1365 cps/admin.py:1459
-#: cps/admin.py:1525 cps/shelf.py:103 cps/shelf.py:163 cps/shelf.py:206
-#: cps/shelf.py:270 cps/shelf.py:331 cps/shelf.py:366 cps/shelf.py:437
+#: cps/admin.py:1171 cps/admin.py:1272 cps/admin.py:1365 cps/admin.py:1466
+#: cps/admin.py:1532 cps/shelf.py:102 cps/shelf.py:162 cps/shelf.py:205
+#: cps/shelf.py:272 cps/shelf.py:333 cps/shelf.py:368 cps/shelf.py:443
 msgid "Settings DB is not Writeable"
 msgstr ""
 
-#: cps/admin.py:1183
+#: cps/admin.py:1182
 msgid "DB Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:1188
+#: cps/admin.py:1187
 msgid "DB is not Writeable"
 msgstr ""
 
-#: cps/admin.py:1201
+#: cps/admin.py:1200
 msgid "Keyfile Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:1205
+#: cps/admin.py:1204
 msgid "Certfile Location is not Valid, Please Enter Correct Path"
 msgstr ""
 
-#: cps/admin.py:1317
+#: cps/admin.py:1316
 msgid "Database Configuration"
 msgstr ""
 
-#: cps/admin.py:1333 cps/web.py:1459
+#: cps/admin.py:1332 cps/web.py:1469
 msgid "Please fill out all fields!"
 msgstr ""
 
-#: cps/admin.py:1341
+#: cps/admin.py:1340
 msgid "E-mail is not from valid domain"
 msgstr ""
 
-#: cps/admin.py:1345 cps/admin.py:1478
+#: cps/admin.py:1344 cps/admin.py:1485
 msgid "Add new user"
 msgstr ""
 
@@ -312,143 +324,143 @@ msgstr ""
 msgid "Found an existing account for this e-mail address or name."
 msgstr ""
 
-#: cps/admin.py:1374
+#: cps/admin.py:1381
 #, python-format
 msgid "User '%(nick)s' deleted"
 msgstr ""
 
-#: cps/admin.py:1376 cps/admin.py:1377
+#: cps/admin.py:1383 cps/admin.py:1384
 msgid "Can't delete Guest User"
 msgstr ""
 
-#: cps/admin.py:1380
+#: cps/admin.py:1387
 msgid "No admin user remaining, can't delete user"
 msgstr ""
 
-#: cps/admin.py:1447 cps/admin.py:1568
+#: cps/admin.py:1454 cps/admin.py:1575
 #, python-format
 msgid "Edit User %(nick)s"
 msgstr ""
 
-#: cps/admin.py:1451
+#: cps/admin.py:1458
 #, python-format
 msgid "User '%(nick)s' updated"
 msgstr ""
 
-#: cps/admin.py:1455 cps/admin.py:1583 cps/web.py:1484 cps/web.py:1545
+#: cps/admin.py:1462 cps/admin.py:1590 cps/web.py:1494 cps/web.py:1555
 msgid "An unknown error occurred. Please try again later."
 msgstr ""
 
-#: cps/admin.py:1487 cps/templates/admin.html:94
+#: cps/admin.py:1494 cps/templates/admin.html:94
 msgid "Edit E-mail Server Settings"
 msgstr ""
 
-#: cps/admin.py:1506
+#: cps/admin.py:1513
 msgid "Gmail Account Verification Successful"
 msgstr ""
 
-#: cps/admin.py:1532
+#: cps/admin.py:1539
 #, python-format
 msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result"
 msgstr ""
 
-#: cps/admin.py:1535
+#: cps/admin.py:1542
 #, python-format
 msgid "There was an error sending the Test e-mail: %(res)s"
 msgstr ""
 
-#: cps/admin.py:1537
+#: cps/admin.py:1544
 msgid "Please configure your e-mail address first..."
 msgstr ""
 
-#: cps/admin.py:1539
+#: cps/admin.py:1546
 msgid "E-mail server settings updated"
 msgstr ""
 
-#: cps/admin.py:1580
+#: cps/admin.py:1587
 #, python-format
 msgid "Password for user %(user)s reset"
 msgstr ""
 
-#: cps/admin.py:1586 cps/web.py:1424
+#: cps/admin.py:1593 cps/web.py:1434
 msgid "Please configure the SMTP mail settings first..."
 msgstr ""
 
-#: cps/admin.py:1597
+#: cps/admin.py:1604
 msgid "Logfile viewer"
 msgstr ""
 
-#: cps/admin.py:1663
+#: cps/admin.py:1670
 msgid "Requesting update package"
 msgstr ""
 
-#: cps/admin.py:1664
+#: cps/admin.py:1671
 msgid "Downloading update package"
 msgstr ""
 
-#: cps/admin.py:1665
+#: cps/admin.py:1672
 msgid "Unzipping update package"
 msgstr ""
 
-#: cps/admin.py:1666
+#: cps/admin.py:1673
 msgid "Replacing files"
 msgstr ""
 
-#: cps/admin.py:1667
+#: cps/admin.py:1674
 msgid "Database connections are closed"
 msgstr ""
 
-#: cps/admin.py:1668
+#: cps/admin.py:1675
 msgid "Stopping server"
 msgstr ""
 
-#: cps/admin.py:1669
+#: cps/admin.py:1676
 msgid "Update finished, please press okay and reload page"
 msgstr ""
 
-#: cps/admin.py:1670 cps/admin.py:1671 cps/admin.py:1672 cps/admin.py:1673
-#: cps/admin.py:1674
+#: cps/admin.py:1677 cps/admin.py:1678 cps/admin.py:1679 cps/admin.py:1680
+#: cps/admin.py:1681
 msgid "Update failed:"
 msgstr ""
 
-#: cps/admin.py:1670 cps/updater.py:356 cps/updater.py:566 cps/updater.py:568
+#: cps/admin.py:1677 cps/updater.py:356 cps/updater.py:566 cps/updater.py:568
 msgid "HTTP Error"
 msgstr ""
 
-#: cps/admin.py:1671 cps/updater.py:358 cps/updater.py:570
+#: cps/admin.py:1678 cps/updater.py:358 cps/updater.py:570
 msgid "Connection error"
 msgstr ""
 
-#: cps/admin.py:1672 cps/updater.py:360 cps/updater.py:572
+#: cps/admin.py:1679 cps/updater.py:360 cps/updater.py:572
 msgid "Timeout while establishing connection"
 msgstr ""
 
-#: cps/admin.py:1673 cps/updater.py:362 cps/updater.py:574
+#: cps/admin.py:1680 cps/updater.py:362 cps/updater.py:574
 msgid "General error"
 msgstr ""
 
-#: cps/admin.py:1674
+#: cps/admin.py:1681
 msgid "Update File Could Not be Saved in Temp Dir"
 msgstr ""
 
-#: cps/admin.py:1735
+#: cps/admin.py:1742
 msgid "Failed to Create at Least One LDAP User"
 msgstr ""
 
-#: cps/admin.py:1748
+#: cps/admin.py:1755
 #, python-format
 msgid "Error: %(ldaperror)s"
 msgstr ""
 
-#: cps/admin.py:1752
+#: cps/admin.py:1759
 msgid "Error: No user returned in response of LDAP server"
 msgstr ""
 
-#: cps/admin.py:1785
+#: cps/admin.py:1792
 msgid "At Least One LDAP User Not Found in Database"
 msgstr ""
 
-#: cps/admin.py:1787
+#: cps/admin.py:1794
 msgid "{} User Successfully Imported"
 msgstr ""
 
@@ -460,7 +472,7 @@ msgstr ""
 msgid "Execution permissions missing"
 msgstr ""
 
-#: cps/db.py:651 cps/web.py:642 cps/web.py:1138
+#: cps/db.py:651 cps/web.py:647 cps/web.py:1146
 #, python-format
 msgid "Custom Column No.%(column)d is not existing in calibre database"
 msgstr ""
@@ -473,9 +485,11 @@ msgstr ""
 msgid "Book Successfully Deleted"
 msgstr ""
 
-#: cps/editbooks.py:370 cps/editbooks.py:743 cps/web.py:509 cps/web.py:1671
-#: cps/web.py:1707 cps/web.py:1778
-msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible"
+#: cps/editbooks.py:370 cps/editbooks.py:743 cps/web.py:512 cps/web.py:1686
+#: cps/web.py:1727 cps/web.py:1798
+msgid ""
+"Oops! Selected book title is unavailable. File does not exist or is not "
+"accessible"
 msgstr ""
 
 #: cps/editbooks.py:404
@@ -511,7 +525,7 @@ msgstr ""
 msgid "Failed to store file %(file)s."
 msgstr ""
 
-#: cps/editbooks.py:653 cps/editbooks.py:1046 cps/web.py:1632
+#: cps/editbooks.py:653 cps/editbooks.py:1046 cps/web.py:1647
 #, python-format
 msgid "Database error: %(error)s."
 msgstr ""
@@ -534,7 +548,9 @@ msgid "Error editing book, please check logfile for details"
 msgstr ""
 
 #: cps/editbooks.py:873
-msgid "Uploaded book probably exists in the library, consider to change before upload new: "
+msgid ""
+"Uploaded book probably exists in the library, consider to change before "
+"upload new: "
 msgstr ""
 
 #: cps/editbooks.py:967
@@ -567,11 +583,15 @@ msgid "There was an error converting this book: %(res)s"
 msgstr ""
 
 #: cps/gdrive.py:60
-msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
+msgid ""
+"Google Drive setup not completed, try to deactivate and activate Google "
+"Drive again"
 msgstr ""
 
 #: cps/gdrive.py:97
-msgid "Callback domain is not verified, please follow steps to verify domain in google developer console"
+msgid ""
+"Callback domain is not verified, please follow steps to verify domain in "
+"google developer console"
 msgstr ""
 
 #: cps/helper.py:80
@@ -644,68 +664,70 @@ msgstr ""
 msgid "Deleting book %(id)s failed: %(message)s"
 msgstr ""
 
-#: cps/helper.py:334
+#: cps/helper.py:335
 #, python-format
-msgid "Deleting book %(id)s, book path not valid: %(path)s"
+msgid ""
+"Deleting book %(id)s from database only, book path in database not valid:"
+" %(path)s"
 msgstr ""
 
-#: cps/helper.py:389
+#: cps/helper.py:390
 #, python-format
 msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
 msgstr ""
 
-#: cps/helper.py:404
+#: cps/helper.py:405
 #, python-format
 msgid "Rename file in path '%(src)s' to '%(dest)s' failed with error: %(error)s"
 msgstr ""
 
-#: cps/helper.py:429 cps/helper.py:439 cps/helper.py:447
+#: cps/helper.py:430 cps/helper.py:440 cps/helper.py:448
 #, python-format
 msgid "File %(file)s not found on Google Drive"
 msgstr ""
 
-#: cps/helper.py:468
+#: cps/helper.py:469
 #, python-format
 msgid "Book path %(path)s not found on Google Drive"
 msgstr ""
 
-#: cps/helper.py:511 cps/web.py:1627
+#: cps/helper.py:512 cps/web.py:1642
 msgid "Found an existing account for this e-mail address"
 msgstr ""
 
-#: cps/helper.py:519
+#: cps/helper.py:520
 msgid "This username is already taken"
 msgstr ""
 
-#: cps/helper.py:529
+#: cps/helper.py:530
 msgid "Invalid e-mail address format"
 msgstr ""
 
-#: cps/helper.py:602
+#: cps/helper.py:603
 msgid "Error Downloading Cover"
 msgstr ""
 
-#: cps/helper.py:605
+#: cps/helper.py:606
 msgid "Cover Format Error"
 msgstr ""
 
-#: cps/helper.py:615
+#: cps/helper.py:616
 msgid "Failed to create path for cover"
 msgstr ""
 
-#: cps/helper.py:631
+#: cps/helper.py:632
 msgid "Cover-file is not a valid image file, or could not be stored"
 msgstr ""
 
-#: cps/helper.py:642
+#: cps/helper.py:643
 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
 msgstr ""
 
-#: cps/helper.py:655
+#: cps/helper.py:656
 msgid "Only jpg/jpeg files are supported as coverfile"
 msgstr ""
 
-#: cps/helper.py:707
+#: cps/helper.py:708
 msgid "Unrar binary file not found"
 msgstr ""
 
@@ -734,7 +756,9 @@ msgid "Unknown Status"
 msgstr ""
 
 #: cps/kobo_auth.py:131
-msgid "PLease access calibre-web from non localhost to get valid api_endpoint for kobo device"
+msgid ""
+"PLease access calibre-web from non localhost to get valid api_endpoint "
+"for kobo device"
 msgstr ""
 
 #: cps/kobo_auth.py:134 cps/kobo_auth.py:162
@@ -746,7 +770,7 @@ msgstr ""
 msgid "Register with %(provider)s"
 msgstr ""
 
-#: cps/oauth_bb.py:139 cps/remotelogin.py:133 cps/web.py:1517
+#: cps/oauth_bb.py:139 cps/remotelogin.py:133 cps/web.py:1527
 #, python-format
 msgid "you are now logged in as: '%(nickname)s'"
 msgstr ""
@@ -812,7 +836,7 @@ msgid "{} Stars"
 msgstr ""
 
 #: cps/remotelogin.py:65 cps/templates/layout.html:85
-#: cps/templates/login.html:4 cps/templates/login.html:20 cps/web.py:1564
+#: cps/templates/login.html:4 cps/templates/login.html:20 cps/web.py:1574
 msgid "Login"
 msgstr ""
 
@@ -828,7 +852,7 @@ msgstr ""
 msgid "Success! Please return to your device"
 msgstr ""
 
-#: cps/render_template.py:39 cps/web.py:415
+#: cps/render_template.py:39 cps/web.py:418
 msgid "Books"
 msgstr ""
 
@@ -853,7 +877,7 @@ msgstr ""
 msgid "Show Downloaded Books"
 msgstr ""
 
-#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:425
+#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:428
 msgid "Top Rated Books"
 msgstr ""
 
@@ -862,7 +886,7 @@ msgid "Show Top Rated Books"
 msgstr ""
 
 #: cps/render_template.py:59 cps/templates/index.xml:54
-#: cps/templates/index.xml:58 cps/web.py:651
+#: cps/templates/index.xml:58 cps/web.py:656
 msgid "Read Books"
 msgstr ""
 
@@ -871,7 +895,7 @@ msgid "Show read and unread"
 msgstr ""
 
 #: cps/render_template.py:63 cps/templates/index.xml:61
-#: cps/templates/index.xml:65 cps/web.py:654
+#: cps/templates/index.xml:65 cps/web.py:659
 msgid "Unread Books"
 msgstr ""
 
@@ -889,7 +913,7 @@ msgid "Show Random Books"
 msgstr ""
 
 #: cps/render_template.py:69 cps/templates/book_table.html:54
-#: cps/templates/index.xml:83 cps/web.py:1025
+#: cps/templates/index.xml:83 cps/web.py:1033
 msgid "Categories"
 msgstr ""
 
@@ -899,7 +923,7 @@ msgstr ""
 
 #: cps/render_template.py:72 cps/templates/book_edit.html:88
 #: cps/templates/book_table.html:55 cps/templates/index.xml:90
-#: cps/templates/search_form.html:68 cps/web.py:922 cps/web.py:932
+#: cps/templates/search_form.html:68 cps/web.py:930 cps/web.py:940
 msgid "Series"
 msgstr ""
 
@@ -917,7 +941,7 @@ msgid "Show author selection"
 msgstr ""
 
 #: cps/render_template.py:79 cps/templates/book_table.html:59
-#: cps/templates/index.xml:76 cps/web.py:899
+#: cps/templates/index.xml:76 cps/web.py:907
 msgid "Publishers"
 msgstr ""
 
@@ -927,7 +951,7 @@ msgstr ""
 
 #: cps/render_template.py:82 cps/templates/book_table.html:57
 #: cps/templates/index.xml:97 cps/templates/search_form.html:106
-#: cps/web.py:1002
+#: cps/web.py:1010
 msgid "Languages"
 msgstr ""
 
@@ -951,7 +975,7 @@ msgstr ""
 msgid "Show file formats selection"
 msgstr ""
 
-#: cps/render_template.py:93 cps/web.py:678
+#: cps/render_template.py:93 cps/web.py:683
 msgid "Archived Books"
 msgstr ""
 
@@ -959,7 +983,7 @@ msgstr ""
 msgid "Show archived books"
 msgstr ""
 
-#: cps/render_template.py:97 cps/web.py:752
+#: cps/render_template.py:97 cps/web.py:758
 msgid "Books List"
 msgstr ""
 
@@ -967,98 +991,101 @@ msgstr ""
 msgid "Show Books List"
 msgstr ""
 
-#: cps/shelf.py:69 cps/shelf.py:124
+#: cps/shelf.py:69 cps/shelf.py:123
 msgid "Invalid shelf specified"
 msgstr ""
 
 #: cps/shelf.py:75
-#, python-format
-msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s"
+msgid "Sorry you are not allowed to add a book to that shelf"
 msgstr ""
 
-#: cps/shelf.py:85
+#: cps/shelf.py:84
 #, python-format
 msgid "Book is already part of the shelf: %(shelfname)s"
 msgstr ""
 
-#: cps/shelf.py:110
+#: cps/shelf.py:109
 #, python-format
 msgid "Book has been added to shelf: %(sname)s"
 msgstr ""
 
-#: cps/shelf.py:129
+#: cps/shelf.py:128
 #, python-format
 msgid "You are not allowed to add a book to the the shelf: %(name)s"
 msgstr ""
 
-#: cps/shelf.py:147
+#: cps/shelf.py:146
 #, python-format
 msgid "Books are already part of the shelf: %(name)s"
 msgstr ""
 
-#: cps/shelf.py:159
+#: cps/shelf.py:158
 #, python-format
 msgid "Books have been added to shelf: %(sname)s"
 msgstr ""
 
-#: cps/shelf.py:166
+#: cps/shelf.py:165
 #, python-format
 msgid "Could not add books to shelf: %(sname)s"
 msgstr ""
 
-#: cps/shelf.py:212
+#: cps/shelf.py:211
 #, python-format
 msgid "Book has been removed from shelf: %(sname)s"
 msgstr ""
 
-#: cps/shelf.py:221
+#: cps/shelf.py:220
 #, python-format
 msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
 msgstr ""
 
-#: cps/shelf.py:231 cps/templates/layout.html:141
+#: cps/shelf.py:230 cps/templates/layout.html:141
 msgid "Create a Shelf"
 msgstr ""
 
 #: cps/shelf.py:238
+msgid "Sorry you are not allowed to edit this shelf"
+msgstr ""
+
+#: cps/shelf.py:240
 msgid "Edit a shelf"
 msgstr ""
 
-#: cps/shelf.py:257
+#: cps/shelf.py:259
 #, python-format
 msgid "Shelf %(title)s created"
 msgstr ""
 
-#: cps/shelf.py:260
+#: cps/shelf.py:262
 #, python-format
 msgid "Shelf %(title)s changed"
 msgstr ""
 
-#: cps/shelf.py:274
+#: cps/shelf.py:276
 msgid "There was an error"
 msgstr ""
 
-#: cps/shelf.py:296
+#: cps/shelf.py:298
 #, python-format
 msgid "A public shelf with the name '%(title)s' already exists."
 msgstr ""
 
-#: cps/shelf.py:307
+#: cps/shelf.py:309
 #, python-format
 msgid "A private shelf with the name '%(title)s' already exists."
 msgstr ""
 
-#: cps/shelf.py:376
+#: cps/shelf.py:378
 #, python-format
 msgid "Change order of Shelf: '%(name)s'"
 msgstr ""
 
-#: cps/shelf.py:442
+#: cps/shelf.py:448
 #, python-format
 msgid "Shelf: '%(name)s'"
 msgstr ""
 
-#: cps/shelf.py:446
+#: cps/shelf.py:452
 msgid "Error opening shelf. Shelf does not exist or is not accessible"
 msgstr ""
 
@@ -1071,7 +1098,9 @@ msgid "No update available. You already have the latest version installed"
 msgstr ""
 
 #: cps/updater.py:399
-msgid "A new update is available. Click on the button below to update to the latest version."
+msgid ""
+"A new update is available. Click on the button below to update to the "
+"latest version."
 msgstr ""
 
 #: cps/updater.py:417
@@ -1084,192 +1113,191 @@ msgstr ""
 
 #: cps/updater.py:436 cps/updater.py:450 cps/updater.py:461
 #, python-format
-msgid "A new update is available. Click on the button below to update to version: %(version)s"
+msgid ""
+"A new update is available. Click on the button below to update to "
+"version: %(version)s"
 msgstr ""
 
 #: cps/updater.py:478
 msgid "No release information available"
 msgstr ""
 
-#: cps/templates/index.html:5 cps/web.py:435
+#: cps/templates/index.html:5 cps/web.py:438
 msgid "Discover (Random Books)"
 msgstr ""
 
-#: cps/web.py:461
+#: cps/web.py:464
 msgid "Hot Books (Most Downloaded)"
 msgstr ""
 
-#: cps/web.py:494
+#: cps/web.py:497
 #, python-format
 msgid "Downloaded books by %(user)s"
 msgstr ""
 
-#: cps/web.py:523
+#: cps/web.py:528
 #, python-format
 msgid "Author: %(name)s"
 msgstr ""
 
-#: cps/web.py:538
+#: cps/web.py:543
 #, python-format
 msgid "Publisher: %(name)s"
 msgstr ""
 
-#: cps/web.py:551
+#: cps/web.py:556
 #, python-format
 msgid "Series: %(serie)s"
 msgstr ""
 
-#: cps/web.py:564
+#: cps/web.py:569
 #, python-format
 msgid "Rating: %(rating)s stars"
 msgstr ""
 
-#: cps/web.py:577
+#: cps/web.py:582
 #, python-format
 msgid "File format: %(format)s"
 msgstr ""
 
-#: cps/web.py:593
+#: cps/web.py:598
 #, python-format
 msgid "Category: %(name)s"
 msgstr ""
 
-#: cps/web.py:612
+#: cps/web.py:617
 #, python-format
 msgid "Language: %(name)s"
 msgstr ""
 
-#: cps/templates/layout.html:56 cps/web.py:712 cps/web.py:1352
+#: cps/templates/layout.html:56 cps/web.py:717 cps/web.py:1362
 msgid "Advanced Search"
 msgstr ""
 
 #: cps/templates/book_edit.html:237 cps/templates/feed.xml:33
 #: cps/templates/index.xml:11 cps/templates/layout.html:45
 #: cps/templates/layout.html:48 cps/templates/search_form.html:225
-#: cps/web.py:724 cps/web.py:1060
+#: cps/web.py:730 cps/web.py:1068
 msgid "Search"
 msgstr ""
 
-#: cps/templates/admin.html:16 cps/web.py:877
+#: cps/templates/admin.html:16 cps/web.py:885
 msgid "Downloads"
 msgstr ""
 
-#: cps/web.py:953
+#: cps/web.py:961
 msgid "Ratings list"
 msgstr ""
 
-#: cps/web.py:974
+#: cps/web.py:982
 msgid "File formats list"
 msgstr ""
 
-#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:1039
+#: cps/templates/layout.html:74 cps/templates/tasks.html:7 cps/web.py:1047
 msgid "Tasks"
 msgstr ""
 
-#: cps/web.py:1198
+#: cps/web.py:1206
 msgid "Published after "
 msgstr ""
 
-#: cps/web.py:1205
+#: cps/web.py:1213
 msgid "Published before "
 msgstr ""
 
-#: cps/web.py:1227
+#: cps/web.py:1235
 #, python-format
 msgid "Rating <= %(rating)s"
 msgstr ""
 
-#: cps/web.py:1229
+#: cps/web.py:1237
 #, python-format
 msgid "Rating >= %(rating)s"
 msgstr ""
 
-#: cps/web.py:1231
+#: cps/web.py:1239
 #, python-format
 msgid "Read Status = %(status)s"
 msgstr ""
 
-#: cps/web.py:1334
+#: cps/web.py:1344
 msgid "Error on search for custom columns, please restart Calibre-Web"
 msgstr ""
 
-#: cps/web.py:1429
+#: cps/web.py:1439
 #, python-format
 msgid "Book successfully queued for sending to %(kindlemail)s"
 msgstr ""
 
-#: cps/web.py:1433
+#: cps/web.py:1443
 #, python-format
 msgid "Oops! There was an error sending this book: %(res)s"
 msgstr ""
 
-#: cps/web.py:1435
+#: cps/web.py:1445
 msgid "Please update your profile with a valid Send to Kindle E-mail Address."
 msgstr ""
 
-#: cps/web.py:1452
+#: cps/web.py:1462
 msgid "E-Mail server is not configured, please contact your administrator!"
 msgstr ""
 
-#: cps/templates/layout.html:86 cps/templates/register.html:16 cps/web.py:1453
-#: cps/web.py:1460 cps/web.py:1466 cps/web.py:1485 cps/web.py:1489
-#: cps/web.py:1495
+#: cps/templates/layout.html:86 cps/templates/register.html:16 cps/web.py:1463
+#: cps/web.py:1470 cps/web.py:1476 cps/web.py:1495 cps/web.py:1499
+#: cps/web.py:1505
 msgid "Register"
 msgstr ""
 
-#: cps/web.py:1487
+#: cps/web.py:1497
 msgid "Your e-mail is not allowed to register"
 msgstr ""
 
-#: cps/web.py:1490
+#: cps/web.py:1500
 msgid "Confirmation e-mail was send to your e-mail account."
 msgstr ""
 
-#: cps/web.py:1507
+#: cps/web.py:1517
 msgid "Cannot activate LDAP authentication"
 msgstr ""
 
-#: cps/web.py:1524
+#: cps/web.py:1534
 #, python-format
-msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known"
+msgid ""
+"Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not"
+" known"
 msgstr ""
 
-#: cps/web.py:1530
+#: cps/web.py:1540
 #, python-format
 msgid "Could not login: %(message)s"
 msgstr ""
 
-#: cps/web.py:1534 cps/web.py:1558
+#: cps/web.py:1544 cps/web.py:1568
 msgid "Wrong Username or Password"
 msgstr ""
 
-#: cps/web.py:1541
+#: cps/web.py:1551
 msgid "New Password was send to your email address"
 msgstr ""
 
-#: cps/web.py:1547
+#: cps/web.py:1557
 msgid "Please enter valid username to reset password"
 msgstr ""
 
-#: cps/web.py:1553
+#: cps/web.py:1563
 #, python-format
 msgid "You are now logged in as: '%(nickname)s'"
 msgstr ""
 
-#: cps/web.py:1609 cps/web.py:1656
+#: cps/web.py:1622 cps/web.py:1671
 #, python-format
 msgid "%(name)s's profile"
 msgstr ""
 
-#: cps/web.py:1623
+#: cps/web.py:1638
 msgid "Profile updated"
 msgstr ""
 
-#: cps/web.py:1683 cps/web.py:1686 cps/web.py:1689 cps/web.py:1692
-#: cps/web.py:1699 cps/web.py:1704
-msgid "Read a Book"
-msgstr ""
-
 #: cps/services/gmail.py:41
 msgid "Found no valid gmail.json file with OAuth information"
 msgstr ""
@@ -1533,7 +1561,7 @@ msgstr ""
 #: cps/templates/config_view_edit.html:151 cps/templates/modal_dialogs.html:64
 #: cps/templates/modal_dialogs.html:99 cps/templates/modal_dialogs.html:117
 #: cps/templates/modal_dialogs.html:135 cps/templates/shelf.html:96
-#: cps/templates/shelf_edit.html:26 cps/templates/user_edit.html:137
+#: cps/templates/shelf_edit.html:26 cps/templates/user_edit.html:136
 msgid "Cancel"
 msgstr ""
 
@@ -1670,7 +1698,9 @@ msgid "Rating"
 msgstr ""
 
 #: cps/templates/book_edit.html:102
-msgid "Fetch Cover from URL (JPEG - Image will be downloaded and stored in database)"
+msgid ""
+"Fetch Cover from URL (JPEG - Image will be downloaded and stored in "
+"database)"
 msgstr ""
 
 #: cps/templates/book_edit.html:106
@@ -1717,7 +1747,7 @@ msgstr ""
 #: cps/templates/book_edit.html:214 cps/templates/config_db.html:52
 #: cps/templates/config_edit.html:349 cps/templates/config_view_edit.html:150
 #: cps/templates/email_edit.html:64 cps/templates/shelf_edit.html:24
-#: cps/templates/shelf_order.html:40 cps/templates/user_edit.html:135
+#: cps/templates/shelf_order.html:40 cps/templates/user_edit.html:134
 msgid "Save"
 msgstr ""
 
@@ -2024,7 +2054,9 @@ msgid "SSL"
 msgstr ""
 
 #: cps/templates/config_edit.html:201
-msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)"
+msgid ""
+"LDAP CACertificate Path (Only needed for Client Certificate "
+"Authentication)"
 msgstr ""
 
 #: cps/templates/config_edit.html:208
@@ -2182,35 +2214,35 @@ msgstr ""
 msgid "Default Settings for New Users"
 msgstr ""
 
-#: cps/templates/config_view_edit.html:87 cps/templates/user_edit.html:93
+#: cps/templates/config_view_edit.html:87 cps/templates/user_edit.html:92
 msgid "Admin User"
 msgstr ""
 
-#: cps/templates/config_view_edit.html:91 cps/templates/user_edit.html:98
+#: cps/templates/config_view_edit.html:91 cps/templates/user_edit.html:97
 msgid "Allow Downloads"
 msgstr ""
 
-#: cps/templates/config_view_edit.html:95 cps/templates/user_edit.html:102
+#: cps/templates/config_view_edit.html:95 cps/templates/user_edit.html:101
 msgid "Allow eBook Viewer"
 msgstr ""
 
-#: cps/templates/config_view_edit.html:99 cps/templates/user_edit.html:106
+#: cps/templates/config_view_edit.html:99 cps/templates/user_edit.html:105
 msgid "Allow Uploads"
 msgstr ""
 
-#: cps/templates/config_view_edit.html:103 cps/templates/user_edit.html:110
+#: cps/templates/config_view_edit.html:103 cps/templates/user_edit.html:109
 msgid "Allow Edit"
 msgstr ""
 
-#: cps/templates/config_view_edit.html:107 cps/templates/user_edit.html:114
+#: cps/templates/config_view_edit.html:107 cps/templates/user_edit.html:113
 msgid "Allow Delete Books"
 msgstr ""
 
-#: cps/templates/config_view_edit.html:111 cps/templates/user_edit.html:119
+#: cps/templates/config_view_edit.html:111 cps/templates/user_edit.html:118
 msgid "Allow Changing Password"
 msgstr ""
 
-#: cps/templates/config_view_edit.html:115 cps/templates/user_edit.html:123
+#: cps/templates/config_view_edit.html:115 cps/templates/user_edit.html:122
 msgid "Allow Editing Public Shelves"
 msgstr ""
 
@@ -2218,12 +2250,12 @@ msgstr ""
 msgid "Default Visibilities for New Users"
 msgstr ""
 
-#: cps/templates/config_view_edit.html:141 cps/templates/user_edit.html:81
+#: cps/templates/config_view_edit.html:141 cps/templates/user_edit.html:80
 #: cps/templates/user_table.html:152
 msgid "Show Random Books in Detail View"
 msgstr ""
 
-#: cps/templates/config_view_edit.html:143 cps/templates/user_edit.html:84
+#: cps/templates/config_view_edit.html:143 cps/templates/user_edit.html:83
 msgid "Add Allowed/Denied Tags"
 msgstr ""
 
@@ -2604,7 +2636,9 @@ msgid "Important Kobo Note: deleted books will remain on any paired Kobo device.
 msgstr ""
 
 #: cps/templates/modal_dialogs.html:57
-msgid "Books must first be archived and the device synced before a book can safely be deleted."
+msgid ""
+"Books must first be archived and the device synced before a book can "
+"safely be deleted."
 msgstr ""
 
 #: cps/templates/modal_dialogs.html:76
@@ -2639,10 +2673,18 @@ msgstr ""
 msgid "Calibre-Web eBook Catalog"
 msgstr ""
 
+#: cps/templates/read.html:6
+msgid "epub Reader"
+msgstr ""
+
 #: cps/templates/read.html:74
 msgid "Reflow text when sidebars are open."
 msgstr ""
 
+#: cps/templates/readcbr.html:7
+msgid "Comic Reader"
+msgstr ""
+
 #: cps/templates/readcbr.html:89
 msgid "Keyboard Shortcuts"
 msgstr ""
@@ -2759,12 +2801,16 @@ msgstr ""
 msgid "Hide"
 msgstr ""
 
+#: cps/templates/readdjvu.html:10
+msgid "DJVU Reader"
+msgstr ""
+
 #: cps/templates/readpdf.html:29
-msgid "PDF reader"
+msgid "PDF Reader"
 msgstr ""
 
 #: cps/templates/readtxt.html:6
-msgid "Basic txt Reader"
+msgid "txt Reader"
 msgstr ""
 
 #: cps/templates/register.html:4
@@ -2991,15 +3037,15 @@ msgstr ""
 msgid "Create/View"
 msgstr ""
 
-#: cps/templates/user_edit.html:85
+#: cps/templates/user_edit.html:84
 msgid "Add allowed/Denied Custom Column Values"
 msgstr ""
 
-#: cps/templates/user_edit.html:130
+#: cps/templates/user_edit.html:129
 msgid "Sync only books in selected shelves with Kobo"
 msgstr ""
 
-#: cps/templates/user_edit.html:140 cps/templates/user_table.html:167
+#: cps/templates/user_edit.html:139 cps/templates/user_table.html:167
 msgid "Delete User"
 msgstr ""
 
-- 
2.18.1