Commit 6ec9bc9e authored by Ozzieisaacs's avatar Ozzieisaacs

Bugfix Publisher (upper/lower case, remove publisher, publisher visibility on new users)

404 messages on non existing categorys, languages, series
Updated Testresult
parents e080c740 a798dc94
......@@ -142,6 +142,17 @@ var languages = new Bloodhound({
}
});
var publishers = new Bloodhound({
name: "publisher",
datumTokenizer: function datumTokenizer(datum) {
return [datum.name];
},
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: getPath() + "/get_publishers_json?q=%QUERY"
}
});
function sourceSplit(query, cb, split, source) {
var bhAdapter = source.ttAdapter();
......@@ -224,6 +235,20 @@ promiseLanguages.done(function() {
);
});
var promisePublishers = publishers.initialize();
promisePublishers.done(function() {
$("#publisher").typeahead(
{
highlight: true, minLength: 0,
hint: true
}, {
name: "publishers",
displayKey: "name",
source: publishers.ttAdapter()
}
);
});
$("#search").on("change input.typeahead:selected", function() {
var form = $("form").serialize();
$.getJSON( getPath() + "/get_matching_tags", form, function( data ) {
......
......@@ -101,7 +101,7 @@
</div>
<div class="form-group">
<label for="publisher">{{_('Publisher')}}</label>
<input type="text" class="form-control typeahead" name="publisher" id="publisher" value="{% if book.publishers|length > 0 %}{{book.publishers[0].name}}{% endif %}" disabled>
<input type="text" class="form-control typeahead" name="publisher" id="publisher" value="{% if book.publishers|length > 0 %}{{book.publishers[0].name}}{% endif %}">
</div>
<div class="form-group">
<label for="languages">{{_('Language')}}</label>
......
......@@ -143,6 +143,10 @@
<input type="checkbox" name="show_author" id="show_author" {% if content.show_author() %}checked{% endif %}>
<label for="show_author">{{_('Show author selection')}}</label>
</div>
<div class="form-group">
<input type="checkbox" name="show_publisher" id="show_publisher" {% if content.show_publisher() %}checked{% endif %}>
<label for="show_publisher">{{_('Show publisher selection')}}</label>
</div>
<div class="form-group">
<input type="checkbox" name="show_read_and_unread" id="show_read_and_unread" {% if content.show_read_and_unread() %}checked{% endif %}>
<label for="show_read_and_unread">{{_('Show read and unread')}}</label>
......
......@@ -120,13 +120,17 @@
</div>
{% endif %}
{% if entry.publishers|length > 0 %}
<div class="publishers">
<p>
<span>{{_('Publisher')}}:{% for publisher in entry.publishers %} {{publisher.name}}{% if not loop.last %},{% endif %}{% endfor %}</span>
</p>
<p>
<span>{{_('Publisher')}}:
<a href="{{url_for('publisher', book_id=entry.publishers[0].id ) }}">{{entry.publishers[0].name}}</a>
</span>
</p>
</div>
{% endif %}
{% if entry.pubdate[:10] != '0101-01-01' %}
<p>{{_('Publishing date')}}: {{entry.pubdate|formatdate}} </p>
{% endif %}
......
......@@ -43,6 +43,9 @@
<author>
<name>{{entry.authors[0].name}}</name>
</author>
<publisher>
<name>{{entry.publishers[0].name}}</name>
</publisher>
<dcterms:language>{{entry.language}}</dcterms:language>
{% for tag in entry.tags %}
<category scheme="http://www.bisg.org/standards/bisac_subject/index.html"
......
......@@ -39,7 +39,7 @@
<updated>{{ current_time }}</updated>
<content type="text">{{_('Show Random Books')}}</content>
</entry>
{% if not current_user.is_anonymous %}
{% if not current_user.is_anonymous %}
<entry>
<title>{{_('Read Books')}}</title>
<link rel="subsection" href="{{url_for('feed_read_books')}}" type="application/atom+xml;profile=opds-catalog"/>
......@@ -47,7 +47,7 @@
<updated>{{ current_time }}</updated>
<content type="text">{{_('Read Books')}}</content>
</entry>
{% endif %}
{% endif %}
<entry>
<title>{{_('Unread Books')}}</title>
<link rel="subsection" href="{{url_for('feed_unread_books')}}" type="application/atom+xml;profile=opds-catalog"/>
......@@ -61,35 +61,42 @@
<id>{{url_for('feed_authorindex')}}</id>
<updated>{{ current_time }}</updated>
<content type="text">{{_('Books ordered by Author')}}</content>
</entry>
<entry>
</entry>
<entry>
<title>{{_('Publishers')}}</title>
<link rel="subsection" href="{{url_for('feed_publisherindex')}}" type="application/atom+xml;profile=opds-catalog"/>
<id>{{url_for('feed_publisherindex')}}</id>
<updated>{{ current_time }}</updated>
<content type="text">{{_('Books ordered by publisher')}}</content>
</entry>
<entry>
<title>{{_('Category list')}}</title>
<link rel="subsection" href="{{url_for('feed_categoryindex')}}" type="application/atom+xml;profile=opds-catalog"/>
<id>{{url_for('feed_categoryindex')}}</id>
<updated>{{ current_time }}</updated>
<content type="text">{{_('Books ordered by category')}}</content>
</entry>
<entry>
</entry>
<entry>
<title>{{_('Series list')}}</title>
<link rel="subsection" href="{{url_for('feed_seriesindex')}}" type="application/atom+xml;profile=opds-catalog"/>
<id>{{url_for('feed_seriesindex')}}</id>
<updated>{{ current_time }}</updated>
<content type="text">{{_('Books ordered by series')}}</content>
</entry>
<entry>
</entry>
<entry>
<title>{{_('Public Shelves')}}</title>
<link rel="subsection" href="{{url_for('feed_shelfindex', public="public")}}" type="application/atom+xml;profile=opds-catalog"/>
<id>{{url_for('feed_shelfindex', public="public")}}</id>
<updated>{{ current_time }}</updated>
<content type="text">{{_('Books organized in public shelfs, visible to everyone')}}</content>
</entry>
{% if not current_user.is_anonymous %}
<entry>
</entry>
{% if not current_user.is_anonymous %}
<entry>
<title>{{_('Your Shelves')}}</title>
<link rel="subsection" href="{{url_for('feed_shelfindex')}}" type="application/atom+xml;profile=opds-catalog"/>
<id>{{url_for('feed_shelfindex')}}</id>
<updated>{{ current_time }}</updated>
<content type="text">{{_("User's own shelfs, only visible to the current user himself")}}</content>
</entry>
{% endif %}
</entry>
{% endif %}
</feed>
......@@ -159,6 +159,9 @@
{% if g.user.show_author() %}
<li id="nav_author" {% if page == 'author' %}class="active"{% endif %}><a href="{{url_for('author_list')}}"><span class="glyphicon glyphicon-user"></span>{{_('Authors')}}</a></li>
{%endif%}
{% if g.user.show_publisher() %}
<li id="nav_publisher" {% if page == 'publisher' %}class="active"{% endif %}><a href="{{url_for('publisher_list')}}"><span class="glyphicon glyphicon-text-size"></span>{{_('Publishers')}}</a></li>
{%endif%}
{% if g.user.filter_language() == 'all' and g.user.show_language() %}
<li id="nav_lang" {% if page == 'language' %}class="active"{% endif %}><a href="{{url_for('language_overview')}}"><span class="glyphicon glyphicon-flag"></span>{{_('Languages')}} </a></li>
{%endif%}
......
......@@ -89,6 +89,10 @@
<input type="checkbox" name="show_author" id="show_author" {% if content.show_author() %}checked{% endif %}>
<label for="show_author">{{_('Show author selection')}}</label>
</div>
<div class="form-group">
<input type="checkbox" name="show_publisher" id="show_publisher" {% if content.show_publisher() %}checked{% endif %}>
<label for="show_publisher">{{_('Show publisher selection')}}</label>
</div>
<div class="form-group">
<input type="checkbox" name="show_read_and_unread" id="show_read_and_unread" {% if content.show_read_and_unread() %}checked{% endif %}>
<label for="show_read_and_unread">{{_('Show read and unread')}}</label>
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -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: 2018-09-14 21:11+0200\n"
"POT-Creation-Date: 2018-10-28 21:32+0100\n"
"PO-Revision-Date: 2017-04-30 00:47+0300\n"
"Last-Translator: Pavel Korovin <p@tristero.se>\n"
"Language: ru\n"
......@@ -16,10 +16,10 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.5.1\n"
"Generated-By: Babel 2.6.0\n"
#: cps/book_formats.py:128 cps/book_formats.py:132 cps/book_formats.py:136
#: cps/converter.py:11 cps/converter.py:27
#: cps/book_formats.py:129 cps/book_formats.py:130 cps/book_formats.py:134
#: cps/book_formats.py:138 cps/converter.py:11 cps/converter.py:27
msgid "not installed"
msgstr "не установлено"
......@@ -27,6 +27,10 @@ msgstr "не установлено"
msgid "Excecution permissions missing"
msgstr "Отсутствуют разрешения на выполнение"
#: cps/converter.py:48
msgid "not configured"
msgstr ""
#: cps/helper.py:57
#, python-format
msgid "%(format)s format not found for book id: %(book)d"
......@@ -114,560 +118,587 @@ msgstr "Ошибка извлечения UnRar"
msgid "Unrar binary file not found"
msgstr "Unrar двочиный файл не найден"
#: cps/web.py:1112 cps/web.py:2778
#: cps/web.py:1171 cps/web.py:2889
msgid "Unknown"
msgstr "Неизвестно"
#: cps/web.py:1121 cps/web.py:1152
#: cps/web.py:1180 cps/web.py:1211
msgid "HTTP Error"
msgstr "Ошибка HTTP"
#: cps/web.py:1123 cps/web.py:1154
#: cps/web.py:1182 cps/web.py:1213
msgid "Connection error"
msgstr "Ошибка соединения"
#: cps/web.py:1125 cps/web.py:1156
#: cps/web.py:1184 cps/web.py:1215
msgid "Timeout while establishing connection"
msgstr "Таймаут при установлении соединения"
#: cps/web.py:1127 cps/web.py:1158
#: cps/web.py:1186 cps/web.py:1217
msgid "General error"
msgstr "Общая ошибка"
#: cps/web.py:1133
#: cps/web.py:1192
msgid "Unexpected data while reading update information"
msgstr "Некорректные данные при чтении информации об обновлении"
#: cps/web.py:1140
#: cps/web.py:1199
msgid "No update available. You already have the latest version installed"
msgstr "Обновление недоступно. Вы используете самую последнюю версию"
#: cps/web.py:1165
#: cps/web.py:1224
msgid "A new update is available. Click on the button below to update to the latest version."
msgstr "Доступно обновление. Нажмите на кнопку, что бы обновиться до последней версии."
#: cps/web.py:1215
#: cps/web.py:1274
msgid "Could not fetch update information"
msgstr "Не удалось получить информацию об обновлении"
#: cps/web.py:1230
#: cps/web.py:1289
msgid "Requesting update package"
msgstr "Проверка обновлений"
#: cps/web.py:1231
#: cps/web.py:1290
msgid "Downloading update package"
msgstr "Загрузка обновлений"
#: cps/web.py:1232
#: cps/web.py:1291
msgid "Unzipping update package"
msgstr "Распаковка обновлений"
#: cps/web.py:1233
#: cps/web.py:1292
msgid "Files are replaced"
msgstr "Файлы заменены"
#: cps/web.py:1234
#: cps/web.py:1293
msgid "Database connections are closed"
msgstr "Соеднинения с базой данных закрыты"
#: cps/web.py:1235
#: cps/web.py:1294
msgid "Server is stopped"
msgstr "Сервер остановлен"
#: cps/web.py:1236
#: cps/web.py:1295
msgid "Update finished, please press okay and reload page"
msgstr "Обновления установлены, нажмите okay и перезагрузите страницу"
#: cps/web.py:1256
#: cps/web.py:1315
msgid "Recently Added Books"
msgstr "Недавно Добавленные Книги"
#: cps/web.py:1266
#: cps/web.py:1325
msgid "Newest Books"
msgstr "Новые Книги"
#: cps/web.py:1278
#: cps/web.py:1337
msgid "Oldest Books"
msgstr "Старые Книги"
#: cps/web.py:1290
#: cps/web.py:1349
msgid "Books (A-Z)"
msgstr "Книги (А-Я)"
#: cps/web.py:1301
#: cps/web.py:1360
msgid "Books (Z-A)"
msgstr "Книги (Я-А)"
#: cps/web.py:1330
#: cps/web.py:1389
msgid "Hot Books (most downloaded)"
msgstr "Популярные книги (часто загружаемые)"
#: cps/web.py:1343
#: cps/web.py:1402
msgid "Best rated books"
msgstr "Книги с наивысшим рейтингом"
#: cps/templates/index.xml:36 cps/web.py:1355
#: cps/templates/index.xml:36 cps/web.py:1415
msgid "Random Books"
msgstr "Случайный выбор"
#: cps/web.py:1370
#: cps/web.py:1430
msgid "Author list"
msgstr "Авторы"
#: cps/web.py:1382 cps/web.py:1445 cps/web.py:1600 cps/web.py:2152
#: cps/web.py:1442 cps/web.py:1533 cps/web.py:1695 cps/web.py:2253
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr "Невозможно открыть книгу. Файл не существует или недоступен."
#: cps/templates/index.xml:73 cps/web.py:1429
#: cps/web.py:1470
msgid "Publisher list"
msgstr ""
#: cps/web.py:1484
#, python-format
msgid "Publisher: %(name)s"
msgstr ""
#: cps/templates/index.xml:80 cps/web.py:1516
msgid "Series list"
msgstr "Серии"
#: cps/web.py:1443
#: cps/web.py:1531
#, python-format
msgid "Series: %(serie)s"
msgstr "Серии: %(serie)s"
#: cps/web.py:1470
#: cps/web.py:1560
msgid "Available languages"
msgstr "Доступные языки"
#: cps/web.py:1487
#: cps/web.py:1580
#, python-format
msgid "Language: %(name)s"
msgstr "Язык: %(name)s"
#: cps/templates/index.xml:66 cps/web.py:1498
#: cps/templates/index.xml:73 cps/web.py:1591
msgid "Category list"
msgstr "Категории"
#: cps/web.py:1512
#: cps/web.py:1605
#, python-format
msgid "Category: %(name)s"
msgstr "Категория: %(name)s"
#: cps/templates/layout.html:71 cps/web.py:1651
#: cps/templates/layout.html:71 cps/web.py:1746
msgid "Tasks"
msgstr "Задания"
#: cps/web.py:1681
#: cps/web.py:1780
msgid "Statistics"
msgstr "Статистика"
#: cps/web.py:1786
#: cps/web.py:1887
msgid "Callback domain is not verified, please follow steps to verify domain in google developer console"
msgstr "Не удалось проверить домен обратного вызова, пожалуйста, выполните шаги для проверки домена в консоли разработчика Google."
#: cps/web.py:1861
#: cps/web.py:1962
msgid "Server restarted, please reload page"
msgstr "Сервер перезагружен, пожалуйста, перезагрузите страницу"
#: cps/web.py:1864
#: cps/web.py:1965
msgid "Performing shutdown of server, please close window"
msgstr "Производится остановка сервера, пожалуйста, закройте окно"
#: cps/web.py:1883
#: cps/web.py:1984
msgid "Update done"
msgstr "Обновление закончено"
#: cps/web.py:1953
#: cps/web.py:2054
msgid "Published after "
msgstr "Опубликовано до "
#: cps/web.py:1960
#: cps/web.py:2061
msgid "Published before "
msgstr "Опубликовано после "
#: cps/web.py:1974
#: cps/web.py:2075
#, python-format
msgid "Rating <= %(rating)s"
msgstr "Рейтинг <= %(rating)s"
#: cps/web.py:1976
#: cps/web.py:2077
#, python-format
msgid "Rating >= %(rating)s"
msgstr "Рейтинг >= %(rating)s"
#: cps/web.py:2035 cps/web.py:2044
#: cps/web.py:2136 cps/web.py:2145
msgid "search"
msgstr "поиск"
#: cps/templates/index.xml:44 cps/templates/index.xml:48
#: cps/templates/layout.html:146 cps/web.py:2111
#: cps/templates/layout.html:146 cps/web.py:2212
msgid "Read Books"
msgstr "Прочитанные Книги"
#: cps/templates/index.xml:52 cps/templates/index.xml:56
#: cps/templates/layout.html:148 cps/web.py:2114
#: cps/templates/layout.html:148 cps/web.py:2215
msgid "Unread Books"
msgstr "Непрочитанные Книги"
#: cps/web.py:2162 cps/web.py:2164 cps/web.py:2166 cps/web.py:2178
#: cps/web.py:2263 cps/web.py:2265 cps/web.py:2267 cps/web.py:2279
msgid "Read a Book"
msgstr "Читать Книгу"
#: cps/web.py:2244 cps/web.py:3129
#: cps/web.py:2345 cps/web.py:3248
msgid "Please fill out all fields!"
msgstr "Пожалуйста, заполните все поля!"
#: cps/web.py:2245 cps/web.py:2266 cps/web.py:2270 cps/web.py:2275
#: cps/web.py:2277
#: cps/web.py:2346 cps/web.py:2367 cps/web.py:2371 cps/web.py:2376
#: cps/web.py:2378
msgid "register"
msgstr "регистрация"
#: cps/web.py:2265 cps/web.py:3345
#: cps/web.py:2366 cps/web.py:3464
msgid "An unknown error occurred. Please try again later."
msgstr "Неизвестная ошибка. Попробуйте позже."
#: cps/web.py:2268
#: cps/web.py:2369
msgid "Your e-mail is not allowed to register"
msgstr "Ваш e-mail не подходит для регистрации"
#: cps/web.py:2271
#: cps/web.py:2372
msgid "Confirmation e-mail was send to your e-mail account."
msgstr "Письмо с подтверждением отправлено вам на e-mail"
#: cps/web.py:2274
#: cps/web.py:2375
msgid "This username or e-mail address is already in use."
msgstr "Этот никнейм или e-mail уже используются"
#: cps/web.py:2291 cps/web.py:2387
#: cps/web.py:2392 cps/web.py:2488
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr "Вы вошли как пользователь '%(nickname)s'"
#: cps/web.py:2296
#: cps/web.py:2397
msgid "Wrong Username or Password"
msgstr "Ошибка в имени пользователя или пароле"
#: cps/web.py:2302 cps/web.py:2323
#: cps/web.py:2403 cps/web.py:2424
msgid "login"
msgstr "войти"
#: cps/web.py:2335 cps/web.py:2366
#: cps/web.py:2436 cps/web.py:2467
msgid "Token not found"
msgstr "Ключ не найден"
#: cps/web.py:2343 cps/web.py:2374
#: cps/web.py:2444 cps/web.py:2475
msgid "Token has expired"
msgstr "Ключ просрочен"
#: cps/web.py:2351
#: cps/web.py:2452
msgid "Success! Please return to your device"
msgstr "Успешно! Пожалуйста, проверьте свое устройство"
#: cps/web.py:2401
#: cps/web.py:2502
msgid "Please configure the SMTP mail settings first..."
msgstr "Пожалуйста, сначала сконфигурируйте параметры SMTP"
#: cps/web.py:2405
#: cps/web.py:2506
#, python-format
msgid "Book successfully queued for sending to %(kindlemail)s"
msgstr "Книга успешно поставлена в очередь для отправки на %(kindlemail)s"
#: cps/web.py:2409
#: cps/web.py:2510
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr "Ошибка при отправке книги: %(res)s"
#: cps/web.py:2411 cps/web.py:3183
#: cps/web.py:2512 cps/web.py:3302
msgid "Please configure your kindle e-mail address first..."
msgstr "Пожалуйста, сначала настройте e-mail на вашем kindle..."
#: cps/web.py:2455
#: cps/web.py:2523 cps/web.py:2575
msgid "Invalid shelf specified"
msgstr "Указана неверная полка"
#: cps/web.py:2530
#, python-format
msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s"
msgstr ""
#: cps/web.py:2538
msgid "You are not allowed to edit public shelves"
msgstr ""
#: cps/web.py:2547
#, python-format
msgid "Book is already part of the shelf: %(shelfname)s"
msgstr ""
#: cps/web.py:2561
#, python-format
msgid "Book has been added to shelf: %(sname)s"
msgstr "Книга добавлена на книжную полку: %(sname)s"
#: cps/web.py:2466
msgid "Invalid shelf specified"
msgstr "Указана неверная полка"
#: cps/web.py:2471
#: cps/web.py:2580
#, python-format
msgid "You are not allowed to add a book to the the shelf: %(name)s"
msgstr "Вам не разрешено добавлять книгу на полку: %(name)s"
#: cps/web.py:2476
#: cps/web.py:2585
msgid "User is not allowed to edit public shelves"
msgstr "Пользователь не может редактировать общедоступные полки"
#: cps/web.py:2494
#: cps/web.py:2603
#, python-format
msgid "Books are already part of the shelf: %(name)s"
msgstr "Книги уже размещены на полке: %(name)s"
#: cps/web.py:2508
#: cps/web.py:2617
#, python-format
msgid "Books have been added to shelf: %(sname)s"
msgstr "Книги добавлены в полку: %(sname)s"
#: cps/web.py:2510
#: cps/web.py:2619
#, python-format
msgid "Could not add books to shelf: %(sname)s"
msgstr "Не удалось добавить книги на полку: %(sname)s"
#: cps/web.py:2547
#: cps/web.py:2656
#, python-format
msgid "Book has been removed from shelf: %(sname)s"
msgstr "Книга удалена с полки: %(sname)s"
#: cps/web.py:2553
#: cps/web.py:2662
#, python-format
msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
msgstr "Извините, вы не можете удалить книгу с полки: %(sname)s"
#: cps/web.py:2573 cps/web.py:2597
#: cps/web.py:2682 cps/web.py:2706
#, python-format
msgid "A shelf with the name '%(title)s' already exists."
msgstr "Полка с названием '%(title)s' уже существует."
#: cps/web.py:2578
#: cps/web.py:2687
#, python-format
msgid "Shelf %(title)s created"
msgstr "Создана полка %(title)s"
#: cps/web.py:2580 cps/web.py:2608
#: cps/web.py:2689 cps/web.py:2717
msgid "There was an error"
msgstr "Произошла ошибка"
#: cps/web.py:2581 cps/web.py:2583
#: cps/web.py:2690 cps/web.py:2692
msgid "create a shelf"
msgstr "создать полку"
#: cps/web.py:2606
#: cps/web.py:2715
#, python-format
msgid "Shelf %(title)s changed"
msgstr "Колка %(title)s изменена"
#: cps/web.py:2609 cps/web.py:2611
#: cps/web.py:2718 cps/web.py:2720
msgid "Edit a shelf"
msgstr "Изменить полку"
#: cps/web.py:2632
#: cps/web.py:2741
#, python-format
msgid "successfully deleted shelf %(name)s"
msgstr "удачно удалена полка %(name)s"
#: cps/web.py:2659
#: cps/web.py:2768
#, python-format
msgid "Shelf: '%(name)s'"
msgstr "Полка: '%(name)s'"
#: cps/web.py:2662
#: cps/web.py:2771
msgid "Error opening shelf. Shelf does not exist or is not accessible"
msgstr "Ошибка открытия Полки. Полка не существует или недоступна"
#: cps/web.py:2693
#: cps/web.py:2802
#, python-format
msgid "Change order of Shelf: '%(name)s'"
msgstr "Изменить расположение полки '%(name)s'"
#: cps/web.py:2722 cps/web.py:3135
#: cps/web.py:2831 cps/web.py:3254
msgid "E-mail is not from valid domain"
msgstr "E-mail не из существующей доменной зоны"
#: cps/web.py:2724 cps/web.py:2765 cps/web.py:2768
#: cps/web.py:2833 cps/web.py:2876 cps/web.py:2879
#, python-format
msgid "%(name)s's profile"
msgstr "Профиль %(name)s"
#: cps/web.py:2763
#: cps/web.py:2874
msgid "Found an existing account for this e-mail address."
msgstr "Этот адрес электронной почты уже зарегистрирован."
#: cps/web.py:2766
#: cps/web.py:2877
msgid "Profile updated"
msgstr "Профиль обновлён"
#: cps/web.py:2794
#: cps/web.py:2905
msgid "Admin page"
msgstr "Администрирование"
#: cps/web.py:2872 cps/web.py:3045
#: cps/web.py:2985 cps/web.py:3159
msgid "Calibre-Web configuration updated"
msgstr "Конфигурация Calibre-Web обновлена"
#: cps/templates/admin.html:100 cps/web.py:2885
#: cps/templates/admin.html:100 cps/web.py:2998
msgid "UI Configuration"
msgstr "Настройка интерфейса"
#: cps/web.py:2903
#: cps/web.py:3016
msgid "Import of optional Google Drive requirements missing"
msgstr "Импорт дополнительных требований к Google Диску отсутствует"
#: cps/web.py:2906
#: cps/web.py:3019
msgid "client_secrets.json is missing or not readable"
msgstr "client_secrets.json отсутствует или его невозможно прочесть"
#: cps/web.py:2911 cps/web.py:2938
#: cps/web.py:3024 cps/web.py:3051
msgid "client_secrets.json is not configured for web application"
msgstr "client_secrets.json не настроен для веб-приложения"
#: cps/templates/admin.html:99 cps/web.py:2941 cps/web.py:2967 cps/web.py:2979
#: cps/web.py:3021 cps/web.py:3036 cps/web.py:3053 cps/web.py:3060
#: cps/web.py:3077
#: cps/templates/admin.html:99 cps/web.py:3054 cps/web.py:3080 cps/web.py:3092
#: cps/web.py:3135 cps/web.py:3150 cps/web.py:3167 cps/web.py:3174
#: cps/web.py:3189
msgid "Basic Configuration"
msgstr "Настройки сервера"
#: cps/web.py:2964
#: cps/web.py:3077
msgid "Keyfile location is not valid, please enter correct path"
msgstr "Неверное расположение файла-ключа, введите правильный путь"
#: cps/web.py:2976
#: cps/web.py:3089
msgid "Certfile location is not valid, please enter correct path"
msgstr "Неверное расположение сертификата, введите правильный путь"
#: cps/web.py:3018
#: cps/web.py:3132
msgid "Logfile location is not valid, please enter correct path"
msgstr "Неверное расположение лог-файла, введите правильный путь"
#: cps/web.py:3057
#: cps/web.py:3171
msgid "DB location is not valid, please enter correct path"
msgstr "Неверное расположение базы данных, введите правильный путь"
#: cps/templates/admin.html:33 cps/web.py:3131 cps/web.py:3137 cps/web.py:3153
#: cps/templates/admin.html:33 cps/web.py:3250 cps/web.py:3256 cps/web.py:3272
msgid "Add new user"
msgstr "Добавить пользователя"
#: cps/web.py:3143
#: cps/web.py:3262
#, python-format
msgid "User '%(user)s' created"
msgstr "Пользователь '%(user)s' добавлен"
#: cps/web.py:3147
#: cps/web.py:3266
msgid "Found an existing account for this e-mail address or nickname."
msgstr "Для этого адреса электронной почты или логина уже есть аккаунт."
#: cps/web.py:3171 cps/web.py:3185
#: cps/web.py:3290 cps/web.py:3304
msgid "E-mail server settings updated"
msgstr "Настройки E-mail сервера обновлены"
#: cps/web.py:3178
#: cps/web.py:3297
#, python-format
msgid "Test e-mail successfully send to %(kindlemail)s"
msgstr "Тестовое письмо успешно отправлено на %(kindlemail)s"
#: cps/web.py:3181
#: cps/web.py:3300
#, python-format
msgid "There was an error sending the Test e-mail: %(res)s"
msgstr "Произошла ошибка при отправке тестового письма на: %(res)s"
#: cps/web.py:3186
#: cps/web.py:3305
msgid "Edit e-mail server settings"
msgstr "Изменить настройки e-mail сервера"
#: cps/web.py:3211
#: cps/web.py:3330
#, python-format
msgid "User '%(nick)s' deleted"
msgstr "Пользователь '%(nick)s' удалён"
#: cps/web.py:3320
#: cps/web.py:3439
#, python-format
msgid "User '%(nick)s' updated"
msgstr "Пользователь '%(nick)s' обновлён"
#: cps/web.py:3323
#: cps/web.py:3442
msgid "An unknown error occured."
msgstr "Произошла неизвестная ошибка."
#: cps/web.py:3325
#: cps/web.py:3444
#, python-format
msgid "Edit User %(nick)s"
msgstr "Изменить пользователя %(nick)s"
#: cps/web.py:3342
#: cps/web.py:3461
#, python-format
msgid "Password for user %(user)s reset"
msgstr "Пароль для пользователя %(user)s сброшен"
#: cps/web.py:3362
#: cps/web.py:3475 cps/web.py:3676
msgid "Error opening eBook. File does not exist or file is not accessible"
msgstr "Ошибка при открытии eBook. Файл не существует или файл недоступен"
#: cps/web.py:3390 cps/web.py:3667 cps/web.py:3672 cps/web.py:3827
#: cps/web.py:3500 cps/web.py:3959
msgid "edit metadata"
msgstr "изменить метаданные"
#: cps/web.py:3401 cps/web.py:3697
#: cps/web.py:3593 cps/web.py:3829
#, python-format
msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
msgstr "Запрещена загрузка файлов с расширением '%(ext)s'"
#: cps/web.py:3405 cps/web.py:3701
#: cps/web.py:3597 cps/web.py:3833
msgid "File to be uploaded must have an extension"
msgstr "Загружаемый файл должен иметь расширение"
#: cps/web.py:3417 cps/web.py:3721
#: cps/web.py:3609 cps/web.py:3853
#, python-format
msgid "Failed to create path %(path)s (Permission denied)."
msgstr "Ошибка при создании пути %(path)s (Доступ запрещён)."
#: cps/web.py:3422
#: cps/web.py:3614
#, python-format
msgid "Failed to store file %(file)s."
msgstr "Не удалось сохранить файл %(file)s."
#: cps/web.py:3438
#: cps/web.py:3630
#, python-format
msgid "File format %(ext)s added to %(book)s"
msgstr "Формат файла %(ext)s добавлен в %(book)s"
#: cps/web.py:3455
#: cps/web.py:3648
#, python-format
msgid "Failed to create path for cover %(path)s (Permission denied)."
msgstr "Не удалось создать путь для обложки %(path)s (Доступ запрещён)."
#: cps/web.py:3462
#: cps/web.py:3655
#, python-format
msgid "Failed to store cover-file %(cover)s."
msgstr "Не удалось сохранить файл обложки %(cover)s."
#: cps/web.py:3465
#: cps/web.py:3658
msgid "Cover-file is not a valid image file"
msgstr "Файл обложки не соответствует изображению"
#: cps/web.py:3482 cps/web.py:3486
#: cps/web.py:3688 cps/web.py:3697 cps/web.py:3701
msgid "unknown"
msgstr "неизвестно"
#: cps/web.py:3508
#: cps/web.py:3720
msgid "Cover is not a jpg file, can't save"
msgstr "Обложка не jpg файл, невозможно сохранить"
#: cps/web.py:3554
#: cps/web.py:3768
#, python-format
msgid "%(langname)s is not a valid language"
msgstr "%(langname)s не допустимый язык"
#: cps/web.py:3676
#: cps/web.py:3799
msgid "Metadata successfully updated"
msgstr ""
#: cps/web.py:3808
msgid "Error editing book, please check logfile for details"
msgstr "Ошибка редактирования книги. Пожалуйста, проверьте лог-файл для дополнительной информации"
#: cps/web.py:3726
#: cps/web.py:3858
#, python-format
msgid "Failed to store file %(file)s (Permission denied)."
msgstr "Ошибка записи файла %(file)s (Доступ запрещён)."
#: cps/web.py:3731
#: cps/web.py:3863
#, python-format
msgid "Failed to delete file %(file)s (Permission denied)."
msgstr "Ошибка удаления файла %(file)s (Доступ запрещён)."
#: cps/web.py:3813
#: cps/web.py:3945
#, python-format
msgid "File %(file)s uploaded"
msgstr "Файл %(file)s загружен"
#: cps/web.py:3843
#: cps/web.py:3975
msgid "Source or destination format for conversion missing"
msgstr "Исходный или целевой формат для конвертирования отсутствует"
#: cps/web.py:3853
#: cps/web.py:3985
#, python-format
msgid "Book successfully queued for converting to %(book_format)s"
msgstr "Книга успешно поставлена в очередь для конвертирования в %(book_format)s"
#: cps/web.py:3857
#: cps/web.py:3989
#, python-format
msgid "There was an error converting this book: %(res)s"
msgstr "Произошла ошибка при конвертирования этой книги: %(res)s"
......@@ -853,16 +884,16 @@ msgid "Do you really want to restart Calibre-Web?"
msgstr "Вы действительно хотите перезагрузить Calibre-Web?"
#: cps/templates/admin.html:150 cps/templates/admin.html:164
#: cps/templates/admin.html:184 cps/templates/shelf.html:59
#: cps/templates/admin.html:184 cps/templates/shelf.html:61
msgid "Ok"
msgstr "Ok"
#: cps/templates/admin.html:151 cps/templates/admin.html:165
#: cps/templates/book_edit.html:178 cps/templates/book_edit.html:200
#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:164
#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:168
#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:75
#: cps/templates/shelf.html:60 cps/templates/shelf_edit.html:19
#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:153
#: cps/templates/shelf.html:62 cps/templates/shelf_edit.html:19
#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:155
msgid "Back"
msgstr "Назад"
......@@ -958,17 +989,17 @@ msgstr "URL обложки(jpg, обложка загружается и сох
msgid "Upload Cover from local drive"
msgstr "Загрузить обложку с диска"
#: cps/templates/book_edit.html:96 cps/templates/detail.html:131
#: cps/templates/book_edit.html:96 cps/templates/detail.html:135
msgid "Publishing date"
msgstr "Опубликовано"
#: cps/templates/book_edit.html:103 cps/templates/book_edit.html:261
#: cps/templates/book_edit.html:278 cps/templates/detail.html:126
#: cps/templates/book_edit.html:278 cps/templates/detail.html:127
#: cps/templates/search_form.html:14
msgid "Publisher"
msgstr "Издатель"
#: cps/templates/book_edit.html:107 cps/templates/user_edit.html:33
#: cps/templates/book_edit.html:107 cps/templates/user_edit.html:31
msgid "Language"
msgstr "Язык"
......@@ -993,9 +1024,9 @@ msgid "Get metadata"
msgstr "Получить метаданные"
#: cps/templates/book_edit.html:177 cps/templates/config_edit.html:210
#: cps/templates/config_view_edit.html:163 cps/templates/login.html:20
#: cps/templates/config_view_edit.html:167 cps/templates/login.html:20
#: cps/templates/search_form.html:153 cps/templates/shelf_edit.html:17
#: cps/templates/user_edit.html:151
#: cps/templates/user_edit.html:153
msgid "Submit"
msgstr "Отправить"
......@@ -1031,7 +1062,7 @@ msgstr "Нажмите на обложку, чтобы получить мета
msgid "Loading..."
msgstr "Загрузка..."
#: cps/templates/book_edit.html:239 cps/templates/layout.html:221
#: cps/templates/book_edit.html:239 cps/templates/layout.html:224
msgid "Close"
msgstr "Закрыть"
......@@ -1213,31 +1244,31 @@ msgstr "Теги для Зрелого Контента"
msgid "Default settings for new users"
msgstr "Настройки по умолчанию для новых пользователей"
#: cps/templates/config_view_edit.html:70 cps/templates/user_edit.html:108
#: cps/templates/config_view_edit.html:70 cps/templates/user_edit.html:110
msgid "Admin user"
msgstr "Управление сервером"
#: cps/templates/config_view_edit.html:74 cps/templates/user_edit.html:117
#: cps/templates/config_view_edit.html:74 cps/templates/user_edit.html:119
msgid "Allow Downloads"
msgstr "Разрешить скачивание с сервера"
#: cps/templates/config_view_edit.html:78 cps/templates/user_edit.html:121
#: cps/templates/config_view_edit.html:78 cps/templates/user_edit.html:123
msgid "Allow Uploads"
msgstr "Разрешить загрузку на сервер"
#: cps/templates/config_view_edit.html:82 cps/templates/user_edit.html:125
#: cps/templates/config_view_edit.html:82 cps/templates/user_edit.html:127
msgid "Allow Edit"
msgstr "Разрешить редактирование книг"
#: cps/templates/config_view_edit.html:86 cps/templates/user_edit.html:129
#: cps/templates/config_view_edit.html:86 cps/templates/user_edit.html:131
msgid "Allow Delete books"
msgstr "Разрешить удаление книг"
#: cps/templates/config_view_edit.html:90 cps/templates/user_edit.html:134
#: cps/templates/config_view_edit.html:90 cps/templates/user_edit.html:136
msgid "Allow Changing Password"
msgstr "Разрешить смену пароля"
#: cps/templates/config_view_edit.html:94 cps/templates/user_edit.html:138
#: cps/templates/config_view_edit.html:94 cps/templates/user_edit.html:140
msgid "Allow Editing Public Shelfs"
msgstr "Разрешить редактирование публичных книжных полок"
......@@ -1245,51 +1276,55 @@ msgstr "Разрешить редактирование публичных кн
msgid "Default visibilities for new users"
msgstr "Видимость для новых пользователей(по умолчанию)"
#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:60
#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:58
msgid "Show random books"
msgstr "Показывать случайные книги"
#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:64
#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:62
msgid "Show recent books"
msgstr "Показывать недавние книги"
#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:68
#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:66
msgid "Show sorted books"
msgstr "Показывать отсортированные книги"
#: cps/templates/config_view_edit.html:124 cps/templates/user_edit.html:72
#: cps/templates/config_view_edit.html:124 cps/templates/user_edit.html:70
msgid "Show hot books"
msgstr "Показывать популярные книги"
#: cps/templates/config_view_edit.html:128 cps/templates/user_edit.html:76
#: cps/templates/config_view_edit.html:128 cps/templates/user_edit.html:74
msgid "Show best rated books"
msgstr "Показывать книги с наивысшим рейтингом"
#: cps/templates/config_view_edit.html:132 cps/templates/user_edit.html:80
#: cps/templates/config_view_edit.html:132 cps/templates/user_edit.html:78
msgid "Show language selection"
msgstr "Показывать выбор языка"
#: cps/templates/config_view_edit.html:136 cps/templates/user_edit.html:84
#: cps/templates/config_view_edit.html:136 cps/templates/user_edit.html:82
msgid "Show series selection"
msgstr "Показывать выбор серии"
#: cps/templates/config_view_edit.html:140 cps/templates/user_edit.html:88
#: cps/templates/config_view_edit.html:140 cps/templates/user_edit.html:86
msgid "Show category selection"
msgstr "Показывать выбор категории"
#: cps/templates/config_view_edit.html:144 cps/templates/user_edit.html:92
#: cps/templates/config_view_edit.html:144 cps/templates/user_edit.html:90
msgid "Show author selection"
msgstr "Показывать выбор автора"
#: cps/templates/config_view_edit.html:148 cps/templates/user_edit.html:96
#: cps/templates/config_view_edit.html:148 cps/templates/user_edit.html:94
msgid "Show publisher selection"
msgstr ""
#: cps/templates/config_view_edit.html:152 cps/templates/user_edit.html:98
msgid "Show read and unread"
msgstr "Показывать прочитанные и непрочитанные"
#: cps/templates/config_view_edit.html:152 cps/templates/user_edit.html:100
#: cps/templates/config_view_edit.html:156 cps/templates/user_edit.html:102
msgid "Show random books in detail view"
msgstr "Показывать случайные книги при просмотре деталей"
#: cps/templates/config_view_edit.html:156 cps/templates/user_edit.html:113
#: cps/templates/config_view_edit.html:160 cps/templates/user_edit.html:115
msgid "Show mature content"
msgstr "Показывать взрослый контент"
......@@ -1309,19 +1344,19 @@ msgstr "из"
msgid "language"
msgstr "Язык"
#: cps/templates/detail.html:168
#: cps/templates/detail.html:172
msgid "Read"
msgstr "Прочитано"
#: cps/templates/detail.html:177
#: cps/templates/detail.html:182
msgid "Description:"
msgstr "Описание:"
#: cps/templates/detail.html:189 cps/templates/search.html:14
#: cps/templates/detail.html:195 cps/templates/search.html:14
msgid "Add to shelf"
msgstr "Добавить на книжную полку"
#: cps/templates/detail.html:251
#: cps/templates/detail.html:257
msgid "Edit metadata"
msgstr "Редактировать метаданные"
......@@ -1381,7 +1416,7 @@ msgstr "Добавить"
msgid "Do you really want to delete this domain rule?"
msgstr "Вы действительно желаете удалить это правило домена?"
#: cps/templates/feed.xml:21 cps/templates/layout.html:205
#: cps/templates/feed.xml:21 cps/templates/layout.html:208
msgid "Next"
msgstr "Дальше"
......@@ -1434,27 +1469,35 @@ msgstr "Авторы"
msgid "Books ordered by Author"
msgstr "Книги, отсортированные по Автору"
#: cps/templates/index.xml:66 cps/templates/layout.html:163
msgid "Publishers"
msgstr ""
#: cps/templates/index.xml:70
msgid "Books ordered by publisher"
msgstr ""
#: cps/templates/index.xml:77
msgid "Books ordered by category"
msgstr "Книги, отсортированные по категории"
#: cps/templates/index.xml:77
#: cps/templates/index.xml:84
msgid "Books ordered by series"
msgstr "Книги, отсортированные по серии"
#: cps/templates/index.xml:80 cps/templates/layout.html:166
#: cps/templates/index.xml:87 cps/templates/layout.html:169
msgid "Public Shelves"
msgstr "Общие полки"
#: cps/templates/index.xml:84
#: cps/templates/index.xml:91
msgid "Books organized in public shelfs, visible to everyone"
msgstr "Книги размещены на полках, и доступны всем"
#: cps/templates/index.xml:88 cps/templates/layout.html:170
#: cps/templates/index.xml:95 cps/templates/layout.html:173
msgid "Your Shelves"
msgstr "Ваши полки"
#: cps/templates/index.xml:92
#: cps/templates/index.xml:99
msgid "User's own shelfs, only visible to the current user himself"
msgstr "Пользовательские полки, видимые только самому пользователю"
......@@ -1470,7 +1513,7 @@ msgstr "Расширенный поиск"
msgid "Logout"
msgstr "Выход"
#: cps/templates/layout.html:83 cps/templates/register.html:18
#: cps/templates/layout.html:83 cps/templates/register.html:14
msgid "Register"
msgstr "Зарегистрироваться"
......@@ -1523,23 +1566,23 @@ msgstr "Обзор"
msgid "Categories"
msgstr "Категории"
#: cps/templates/layout.html:163 cps/templates/search_form.html:74
#: cps/templates/layout.html:166 cps/templates/search_form.html:74
msgid "Languages"
msgstr "Языки"
#: cps/templates/layout.html:175
#: cps/templates/layout.html:178
msgid "Create a Shelf"
msgstr "Создать книжную полку"
#: cps/templates/layout.html:176 cps/templates/stats.html:3
#: cps/templates/layout.html:179 cps/templates/stats.html:3
msgid "About"
msgstr "О программе"
#: cps/templates/layout.html:190
#: cps/templates/layout.html:193
msgid "Previous"
msgstr "Предыдущий"
#: cps/templates/layout.html:217
#: cps/templates/layout.html:220
msgid "Book Details"
msgstr "Подробнее о книге"
......@@ -1549,7 +1592,7 @@ msgid "Username"
msgstr "Имя пользователя"
#: cps/templates/login.html:12 cps/templates/login.html:13
#: cps/templates/register.html:11 cps/templates/user_edit.html:21
#: cps/templates/user_edit.html:21
msgid "Password"
msgstr "Пароль"
......@@ -1614,7 +1657,7 @@ msgstr "Повернуть Влево"
msgid "Flip Image"
msgstr "Перевернуть изображение"
#: cps/templates/readcbr.html:108 cps/templates/user_edit.html:41
#: cps/templates/readcbr.html:108 cps/templates/user_edit.html:39
msgid "Theme"
msgstr "Тема"
......@@ -1678,15 +1721,11 @@ msgstr "Зарегистрировать новую учётную запись"
msgid "Choose a username"
msgstr "Выберите имя пользователя"
#: cps/templates/register.html:12
msgid "Choose a password"
msgstr "Выберите пароль"
#: cps/templates/register.html:15 cps/templates/user_edit.html:13
#: cps/templates/register.html:11 cps/templates/user_edit.html:13
msgid "E-mail address"
msgstr "E-mail адрес"
#: cps/templates/register.html:16
#: cps/templates/register.html:12
msgid "Your email address"
msgstr "Ваш email-адрес"
......@@ -1754,11 +1793,11 @@ msgstr "Изменить Полку"
msgid "Change order"
msgstr "Изменить порядок"
#: cps/templates/shelf.html:54
#: cps/templates/shelf.html:56
msgid "Do you really want to delete the shelf?"
msgstr "Вы действительно хотите удалить эту книжную полку?"
#: cps/templates/shelf.html:57
#: cps/templates/shelf.html:59
msgid "Shelf will be lost for everybody and forever!"
msgstr "Книжная полка будет безвозвратно удалена для всех"
......@@ -1842,31 +1881,31 @@ msgstr "Скрыть все задачи"
msgid "Reset user Password"
msgstr "Сбросить пароль пользователя"
#: cps/templates/user_edit.html:29
#: cps/templates/user_edit.html:27
msgid "Kindle E-Mail"
msgstr "Адрес почты Kindle"
#: cps/templates/user_edit.html:43
#: cps/templates/user_edit.html:41
msgid "Standard Theme"
msgstr "Стандартная тема"
#: cps/templates/user_edit.html:44
#: cps/templates/user_edit.html:42
msgid "caliBlur! Dark Theme (Beta)"
msgstr "caliBlur! Темная тема (Бета)"
#: cps/templates/user_edit.html:49
#: cps/templates/user_edit.html:47
msgid "Show books with language"
msgstr "Показать книги на языках"
#: cps/templates/user_edit.html:51
#: cps/templates/user_edit.html:49
msgid "Show all"
msgstr "Показать все"
#: cps/templates/user_edit.html:145
#: cps/templates/user_edit.html:147
msgid "Delete this user"
msgstr "Удалить этого пользователя"
#: cps/templates/user_edit.html:160
#: cps/templates/user_edit.html:162
msgid "Recent Downloads"
msgstr "Недавние скачивания"
......@@ -1879,3 +1918,6 @@ msgstr "Недавние скачивания"
#~ msgid "Newest commit timestamp"
#~ msgstr "Новая метка фиксации"
#~ msgid "Choose a password"
#~ msgstr "Выберите пароль"
......@@ -41,6 +41,7 @@ SIDEBAR_READ_AND_UNREAD = 256
SIDEBAR_RECENT = 512
SIDEBAR_SORTED = 1024
MATURE_CONTENT = 2048
SIDEBAR_PUBLISHER = 4096
DEFAULT_PASS = "admin123"
DEFAULT_PORT = int(os.environ.get("CALIBRE_PORT", 8083))
......@@ -136,6 +137,9 @@ class UserBase:
def show_author(self):
return bool((self.sidebar_view is not None)and(self.sidebar_view & SIDEBAR_AUTHOR == SIDEBAR_AUTHOR))
def show_publisher(self):
return bool((self.sidebar_view is not None)and(self.sidebar_view & SIDEBAR_PUBLISHER == SIDEBAR_PUBLISHER))
def show_best_rated_books(self):
return bool((self.sidebar_view is not None)and(self.sidebar_view & SIDEBAR_BEST_RATED == SIDEBAR_BEST_RATED))
......@@ -297,7 +301,7 @@ class Settings(Base):
config_anonbrowse = Column(SmallInteger, default=0)
config_public_reg = Column(SmallInteger, default=0)
config_default_role = Column(SmallInteger, default=0)
config_default_show = Column(SmallInteger, default=2047)
config_default_show = Column(SmallInteger, default=6143)
config_columns_to_ignore = Column(String)
config_use_google_drive = Column(Boolean)
config_google_drive_folder = Column(String)
......@@ -485,6 +489,10 @@ class Config:
return bool((self.config_default_show is not None) and
(self.config_default_show & SIDEBAR_AUTHOR == SIDEBAR_AUTHOR))
def show_publisher(self):
return bool((self.config_default_show is not None) and
(self.config_default_show & SIDEBAR_PUBLISHER == SIDEBAR_PUBLISHER))
def show_best_rated_books(self):
return bool((self.config_default_show is not None) and
(self.config_default_show & SIDEBAR_BEST_RATED == SIDEBAR_BEST_RATED))
......@@ -740,7 +748,7 @@ def create_admin_user():
user.role = ROLE_USER + ROLE_ADMIN + ROLE_DOWNLOAD + ROLE_UPLOAD + ROLE_EDIT + ROLE_DELETE_BOOKS + ROLE_PASSWD
user.sidebar_view = DETAIL_RANDOM + SIDEBAR_LANGUAGE + SIDEBAR_SERIES + SIDEBAR_CATEGORY + SIDEBAR_HOT + \
SIDEBAR_RANDOM + SIDEBAR_AUTHOR + SIDEBAR_BEST_RATED + SIDEBAR_READ_AND_UNREAD + SIDEBAR_RECENT + \
SIDEBAR_SORTED + MATURE_CONTENT
SIDEBAR_SORTED + MATURE_CONTENT + SIDEBAR_PUBLISHER
user.password = generate_password_hash(DEFAULT_PASS)
......
......@@ -529,6 +529,10 @@ def fill_indexpage(page, database, db_filter, order, *join):
# Modifies different Database objects, first check if elements have to be added to database, than check
# if elements have to be deleted, because they are no longer used
def modify_database_object(input_elements, db_book_object, db_object, db_session, db_type):
# passing input_elements not as a list may lead to undesired results
if not isinstance(input_elements, list):
raise TypeError(str(input_elements) + " should be passed as a list")
input_elements = [x for x in input_elements if x != '']
# we have all input element (authors, series, tags) names now
# 1. search for elements to remove
......@@ -542,13 +546,13 @@ def modify_database_object(input_elements, db_book_object, db_object, db_session
else:
type_elements = c_elements.name
for inp_element in input_elements:
if inp_element == type_elements:
if inp_element.lower() == type_elements.lower():
found = True
break
# if the element was not found in the new list, add it to remove list
if not found:
del_elements.append(c_elements)
# 2. search for elements that need to be added
# 2. search for elements that need to be added
add_elements = []
for inp_element in input_elements:
found = False
......@@ -580,20 +584,46 @@ def modify_database_object(input_elements, db_book_object, db_object, db_session
db_filter = db_object.name
for add_element in add_elements:
# check if a element with that name exists
new_element = db_session.query(db_object).filter(db_filter == add_element).first()
db_element = db_session.query(db_object).filter(db_filter == add_element).first()
# if no element is found add it
if new_element is None:
if db_type == 'author':
new_element = db_object(add_element, add_element.replace('|', ','), "")
elif db_type == 'series':
new_element = db_object(add_element, add_element)
elif db_type == 'custom':
new_element = db_object(value=add_element)
else: # db_type should be tag, language or publisher
new_element = db_object(add_element)
# if new_element is None:
if db_type == 'author':
new_element = db_object(add_element, add_element.replace('|', ','), "")
elif db_type == 'series':
new_element = db_object(add_element, add_element)
elif db_type == 'custom':
new_element = db_object(value=add_element)
elif db_type == 'publisher':
new_element = db_object(add_element, None)
else: # db_type should be tag or language
new_element = db_object(add_element)
if db_element is None:
db_session.add(new_element)
# add element to book
db_book_object.append(new_element)
db_book_object.append(new_element)
else:
if db_type == 'custom' and db_element.value != add_element:
new_element.value = add_element
# new_element = db_element
elif db_type == 'language' and db_element.lang_code != add_element:
db_element.lang_code = add_element
# new_element = db_element
elif db_type == 'series' and db_element.name != add_element:
db_element.name = add_element # = add_element # new_element = db_object(add_element, add_element)
db_element.sort = add_element
# new_element = db_element
elif db_type == 'author' and db_element.name != add_element:
db_element.name = add_element
db_element.sort = add_element.replace('|', ',')
# new_element = db_element
if db_type == 'publisher' and db_element.name != add_element:
db_element.name = add_element
db_element.sort = None
# new_element = db_element
elif db_element.name != add_element:
db_element.name = add_element
# new_element = db_element
# add element to book
db_book_object.append(db_element)
# read search results from calibre-database and return it (function is used for feed and simple search
......@@ -745,6 +775,26 @@ def feed_author(book_id):
return render_xml_template('feed.xml', entries=entries, pagination=pagination)
@app.route("/opds/publisher")
@requires_basic_auth_if_no_ano
def feed_publisherindex():
off = request.args.get("offset") or 0
entries = db.session.query(db.Publishers).join(db.books_publishers_link).join(db.Books).filter(common_filters())\
.group_by('books_publishers_link.publisher').order_by(db.Publishers.sort).limit(config.config_books_per_page).offset(off)
pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page,
len(db.session.query(db.Publishers).all()))
return render_xml_template('feed.xml', listelements=entries, folder='feed_publisher', pagination=pagination)
@app.route("/opds/publisher/<int:book_id>")
@requires_basic_auth_if_no_ano
def feed_publisher(book_id):
off = request.args.get("offset") or 0
entries, __, pagination = fill_indexpage((int(off) / (int(config.config_books_per_page)) + 1),
db.Books, db.Books.publishers.any(db.Publishers.id == book_id), [db.Books.timestamp.desc()])
return render_xml_template('feed.xml', entries=entries, pagination=pagination)
@app.route("/opds/category")
@requires_basic_auth_if_no_ano
def feed_categoryindex():
......@@ -1027,7 +1077,17 @@ def get_authors_json():
json_dumps = json.dumps([dict(name=r.name.replace('|',',')) for r in entries])
return json_dumps
@app.route("/get_publishers_json", methods=['GET', 'POST'])
@login_required_if_no_ano
def get_publishers_json():
if request.method == "GET":
query = request.args.get('q')
entries = db.session.query(db.Publishers).filter(db.Publishers.name.ilike("%" + query + "%")).all()
json_dumps = json.dumps([dict(name=r.name.replace('|',',')) for r in entries])
return json_dumps
@app.route("/get_tags_json", methods=['GET', 'POST'])
@login_required_if_no_ano
def get_tags_json():
......@@ -1340,7 +1400,8 @@ def best_rated_books(page):
[db.Books.timestamp.desc()])
return render_title_template('index.html', random=random, entries=entries, pagination=pagination,
title=_(u"Best rated books"), page="rated")
abort(404)
else:
abort(404)
@app.route("/discover", defaults={'page': 1})
......@@ -1398,6 +1459,33 @@ def author(book_id, page):
title=name, author=author_info, other_books=other_books, page="author")
@app.route("/publisher")
@login_required_if_no_ano
def publisher_list():
if current_user.show_publisher():
entries = db.session.query(db.Publishers, func.count('books_publishers_link.book').label('count'))\
.join(db.books_publishers_link).join(db.Books).filter(common_filters())\
.group_by('books_publishers_link.publisher').order_by(db.Publishers.sort).all()
return render_title_template('list.html', entries=entries, folder='publisher',
title=_(u"Publisher list"), page="publisherlist")
else:
abort(404)
@app.route("/publisher/<int:book_id>", defaults={'page': 1})
@app.route('/publisher/<int:book_id>/<int:page>')
@login_required_if_no_ano
def publisher(book_id, page):
publisher = db.session.query(db.Publishers).filter(db.Publishers.id == book_id).first()
if publisher:
entries, random, pagination = fill_indexpage(page, db.Books, db.Books.publishers.any(db.Publishers.id == book_id),
(db.Series.name, db.Books.series_index), db.books_series_link, db.Series)
return render_title_template('index.html', random=random, entries=entries, pagination=pagination,
title=_(u"Publisher: %(name)s", name=publisher.name), page="publisher")
else:
abort(404)
def get_unique_other_books(library_books, author_books):
# Get all identifiers (ISBN, Goodreads, etc) and filter author's books by that list so we show fewer duplicates
# Note: Not all images will be shown, even though they're available on Goodreads.com.
......@@ -1434,15 +1522,18 @@ def series_list():
@app.route("/series/<int:book_id>/<int:page>'")
@login_required_if_no_ano
def series(book_id, page):
entries, random, pagination = fill_indexpage(page, db.Books, db.Books.series.any(db.Series.id == book_id),
name = db.session.query(db.Series).filter(db.Series.id == book_id).first()
if name:
entries, random, pagination = fill_indexpage(page, db.Books, db.Books.series.any(db.Series.id == book_id),
[db.Books.series_index])
name = db.session.query(db.Series).filter(db.Series.id == book_id).first().name
if entries:
return render_title_template('index.html', random=random, pagination=pagination, entries=entries,
title=_(u"Series: %(serie)s", serie=name), page="series")
if entries:
return render_title_template('index.html', random=random, pagination=pagination, entries=entries,
title=_(u"Series: %(serie)s", serie=name.name), page="series")
else:
flash(_(u"Error opening eBook. File does not exist or file is not accessible:"), category="error")
return redirect(url_for("index"))
else:
flash(_(u"Error opening eBook. File does not exist or file is not accessible:"), category="error")
return redirect(url_for("index"))
abort(404)
@app.route("/language")
......@@ -1475,15 +1566,18 @@ def language_overview():
@app.route('/language/<name>/page/<int:page>')
@login_required_if_no_ano
def language(name, page):
entries, random, pagination = fill_indexpage(page, db.Books, db.Books.languages.any(db.Languages.lang_code == name),
[db.Books.timestamp.desc()])
try:
cur_l = LC.parse(name)
name = cur_l.get_language_name(get_locale())
lang_name = cur_l.get_language_name(get_locale())
except UnknownLocaleError:
name = _(isoLanguages.get(part3=name).name)
try:
lang_name = _(isoLanguages.get(part3=name).name)
except KeyError:
abort(404)
entries, random, pagination = fill_indexpage(page, db.Books, db.Books.languages.any(db.Languages.lang_code == name),
[db.Books.timestamp.desc()])
return render_title_template('index.html', random=random, entries=entries, pagination=pagination,
title=_(u"Language: %(name)s", name=name), page="language")
title=_(u"Language: %(name)s", name=lang_name), page="language")
@app.route("/category")
......@@ -1503,12 +1597,14 @@ def category_list():
@app.route('/category/<int:book_id>/<int:page>')
@login_required_if_no_ano
def category(book_id, page):
entries, random, pagination = fill_indexpage(page, db.Books, db.Books.tags.any(db.Tags.id == book_id),
(db.Series.name, db.Books.series_index),db.books_series_link,db.Series)
name = db.session.query(db.Tags).filter(db.Tags.id == book_id).first().name
return render_title_template('index.html', random=random, entries=entries, pagination=pagination,
title=_(u"Category: %(name)s", name=name), page="category")
name = db.session.query(db.Tags).filter(db.Tags.id == book_id).first()
if name:
entries, random, pagination = fill_indexpage(page, db.Books, db.Books.tags.any(db.Tags.id == book_id),
(db.Series.name, db.Books.series_index),db.books_series_link,db.Series)
return render_title_template('index.html', random=random, entries=entries, pagination=pagination,
title=_(u"Category: %(name)s", name=name.name), page="category")
else:
abort(404)
@app.route("/ajax/toggleread/<int:book_id>", methods=['POST'])
......@@ -2761,6 +2857,8 @@ def profile():
content.sidebar_view += ub.SIDEBAR_BEST_RATED
if "show_author" in to_save:
content.sidebar_view += ub.SIDEBAR_AUTHOR
if "show_publisher" in to_save:
content.sidebar_view += ub.SIDEBAR_PUBLISHER
if "show_read_and_unread" in to_save:
content.sidebar_view += ub.SIDEBAR_READ_AND_UNREAD
if "show_detail_random" in to_save:
......@@ -2871,6 +2969,8 @@ def view_configuration():
content.config_default_show = content.config_default_show + ub.SIDEBAR_RANDOM
if "show_author" in to_save:
content.config_default_show = content.config_default_show + ub.SIDEBAR_AUTHOR
if "show_publisher" in to_save:
content.config_default_show = content.config_default_show + ub.SIDEBAR_PUBLISHER
if "show_best_rated" in to_save:
content.config_default_show = content.config_default_show + ub.SIDEBAR_BEST_RATED
if "show_read_and_unread" in to_save:
......@@ -3120,6 +3220,8 @@ def new_user():
content.sidebar_view += ub.SIDEBAR_BEST_RATED
if "show_author" in to_save:
content.sidebar_view += ub.SIDEBAR_AUTHOR
if "show_publisher" in to_save:
content.sidebar_view += ub.SIDEBAR_PUBLISHER
if "show_detail_random" in to_save:
content.sidebar_view += ub.DETAIL_RANDOM
if "show_sorted" in to_save:
......@@ -3643,11 +3745,14 @@ def edit_book(book_id):
book.pubdate = db.Books.DEFAULT_PUBDATE
else:
book.pubdate = db.Books.DEFAULT_PUBDATE
'''if len(book.publishers):
if to_save["publisher"] != book.publishers[0].name:
modify_database_object(to_save["publisher"], book.publishers, db.Publishers, db.session, 'series')
else:
modify_database_object(to_save["publisher"], book.publishers, db.Publishers, db.session, 'series')'''
if to_save["publisher"]:
publisher = to_save["publisher"].rstrip().strip()
if len(book.publishers) == 0 or (len(book.publishers) > 0 and publisher != book.publishers[0].name):
modify_database_object([publisher], book.publishers, db.Publishers, db.session, 'publisher')
elif len(book.publishers):
modify_database_object([], book.publishers, db.Publishers, db.session, 'publisher')
# handle book languages
input_languages = to_save["languages"].split(',')
......
......@@ -8,14 +8,14 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2018-10-15 20:28+0200\n"
"POT-Creation-Date: 2018-10-28 21:32+0100\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.5.1\n"
"Generated-By: Babel 2.6.0\n"
#: cps/book_formats.py:129 cps/book_formats.py:130 cps/book_formats.py:134
#: cps/book_formats.py:138 cps/converter.py:11 cps/converter.py:27
......@@ -117,578 +117,587 @@ msgstr ""
msgid "Unrar binary file not found"
msgstr ""
#: cps/web.py:1111 cps/web.py:2791
#: cps/web.py:1171 cps/web.py:2889
msgid "Unknown"
msgstr ""
#: cps/web.py:1120 cps/web.py:1151
#: cps/web.py:1180 cps/web.py:1211
msgid "HTTP Error"
msgstr ""
#: cps/web.py:1122 cps/web.py:1153
#: cps/web.py:1182 cps/web.py:1213
msgid "Connection error"
msgstr ""
#: cps/web.py:1124 cps/web.py:1155
#: cps/web.py:1184 cps/web.py:1215
msgid "Timeout while establishing connection"
msgstr ""
#: cps/web.py:1126 cps/web.py:1157
#: cps/web.py:1186 cps/web.py:1217
msgid "General error"
msgstr ""
#: cps/web.py:1132
#: cps/web.py:1192
msgid "Unexpected data while reading update information"
msgstr ""
#: cps/web.py:1139
#: cps/web.py:1199
msgid "No update available. You already have the latest version installed"
msgstr ""
#: cps/web.py:1164
#: cps/web.py:1224
msgid "A new update is available. Click on the button below to update to the latest version."
msgstr ""
#: cps/web.py:1214
#: cps/web.py:1274
msgid "Could not fetch update information"
msgstr ""
#: cps/web.py:1229
#: cps/web.py:1289
msgid "Requesting update package"
msgstr ""
#: cps/web.py:1230
#: cps/web.py:1290
msgid "Downloading update package"
msgstr ""
#: cps/web.py:1231
#: cps/web.py:1291
msgid "Unzipping update package"
msgstr ""
#: cps/web.py:1232
#: cps/web.py:1292
msgid "Files are replaced"
msgstr ""
#: cps/web.py:1233
#: cps/web.py:1293
msgid "Database connections are closed"
msgstr ""
#: cps/web.py:1234
#: cps/web.py:1294
msgid "Server is stopped"
msgstr ""
#: cps/web.py:1235
#: cps/web.py:1295
msgid "Update finished, please press okay and reload page"
msgstr ""
#: cps/web.py:1255
#: cps/web.py:1315
msgid "Recently Added Books"
msgstr ""
#: cps/web.py:1265
#: cps/web.py:1325
msgid "Newest Books"
msgstr ""
#: cps/web.py:1277
#: cps/web.py:1337
msgid "Oldest Books"
msgstr ""
#: cps/web.py:1289
#: cps/web.py:1349
msgid "Books (A-Z)"
msgstr ""
#: cps/web.py:1300
#: cps/web.py:1360
msgid "Books (Z-A)"
msgstr ""
#: cps/web.py:1329
#: cps/web.py:1389
msgid "Hot Books (most downloaded)"
msgstr ""
#: cps/web.py:1342
#: cps/web.py:1402
msgid "Best rated books"
msgstr ""
#: cps/templates/index.xml:36 cps/web.py:1354
#: cps/templates/index.xml:36 cps/web.py:1415
msgid "Random Books"
msgstr ""
#: cps/web.py:1369
#: cps/web.py:1430
msgid "Author list"
msgstr ""
#: cps/web.py:1381 cps/web.py:1444 cps/web.py:1599 cps/web.py:2157
#: cps/web.py:1442 cps/web.py:1533 cps/web.py:1695 cps/web.py:2253
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr ""
#: cps/templates/index.xml:73 cps/web.py:1428
#: cps/web.py:1470
msgid "Publisher list"
msgstr ""
#: cps/web.py:1484
#, python-format
msgid "Publisher: %(name)s"
msgstr ""
#: cps/templates/index.xml:80 cps/web.py:1516
msgid "Series list"
msgstr ""
#: cps/web.py:1442
#: cps/web.py:1531
#, python-format
msgid "Series: %(serie)s"
msgstr ""
#: cps/web.py:1469
#: cps/web.py:1560
msgid "Available languages"
msgstr ""
#: cps/web.py:1486
#: cps/web.py:1580
#, python-format
msgid "Language: %(name)s"
msgstr ""
#: cps/templates/index.xml:66 cps/web.py:1497
#: cps/templates/index.xml:73 cps/web.py:1591
msgid "Category list"
msgstr ""
#: cps/web.py:1511
#: cps/web.py:1605
#, python-format
msgid "Category: %(name)s"
msgstr ""
#: cps/templates/layout.html:71 cps/web.py:1650
#: cps/templates/layout.html:71 cps/web.py:1746
msgid "Tasks"
msgstr ""
#: cps/web.py:1684
#: cps/web.py:1780
msgid "Statistics"
msgstr ""
#: cps/web.py:1791
#: cps/web.py:1887
msgid "Callback domain is not verified, please follow steps to verify domain in google developer console"
msgstr ""
#: cps/web.py:1866
#: cps/web.py:1962
msgid "Server restarted, please reload page"
msgstr ""
#: cps/web.py:1869
#: cps/web.py:1965
msgid "Performing shutdown of server, please close window"
msgstr ""
#: cps/web.py:1888
#: cps/web.py:1984
msgid "Update done"
msgstr ""
#: cps/web.py:1958
#: cps/web.py:2054
msgid "Published after "
msgstr ""
#: cps/web.py:1965
#: cps/web.py:2061
msgid "Published before "
msgstr ""
#: cps/web.py:1979
#: cps/web.py:2075
#, python-format
msgid "Rating <= %(rating)s"
msgstr ""
#: cps/web.py:1981
#: cps/web.py:2077
#, python-format
msgid "Rating >= %(rating)s"
msgstr ""
#: cps/web.py:2040 cps/web.py:2049
#: cps/web.py:2136 cps/web.py:2145
msgid "search"
msgstr ""
#: cps/templates/index.xml:44 cps/templates/index.xml:48
#: cps/templates/layout.html:146 cps/web.py:2116
#: cps/templates/layout.html:146 cps/web.py:2212
msgid "Read Books"
msgstr ""
#: cps/templates/index.xml:52 cps/templates/index.xml:56
#: cps/templates/layout.html:148 cps/web.py:2119
#: cps/templates/layout.html:148 cps/web.py:2215
msgid "Unread Books"
msgstr ""
#: cps/web.py:2167 cps/web.py:2169 cps/web.py:2171 cps/web.py:2183
#: cps/web.py:2263 cps/web.py:2265 cps/web.py:2267 cps/web.py:2279
msgid "Read a Book"
msgstr ""
#: cps/web.py:2249 cps/web.py:3146
#: cps/web.py:2345 cps/web.py:3248
msgid "Please fill out all fields!"
msgstr ""
#: cps/web.py:2250 cps/web.py:2271 cps/web.py:2275 cps/web.py:2280
#: cps/web.py:2282
#: cps/web.py:2346 cps/web.py:2367 cps/web.py:2371 cps/web.py:2376
#: cps/web.py:2378
msgid "register"
msgstr ""
#: cps/web.py:2270 cps/web.py:3362
#: cps/web.py:2366 cps/web.py:3464
msgid "An unknown error occurred. Please try again later."
msgstr ""
#: cps/web.py:2273
#: cps/web.py:2369
msgid "Your e-mail is not allowed to register"
msgstr ""
#: cps/web.py:2276
#: cps/web.py:2372
msgid "Confirmation e-mail was send to your e-mail account."
msgstr ""
#: cps/web.py:2279
#: cps/web.py:2375
msgid "This username or e-mail address is already in use."
msgstr ""
#: cps/web.py:2296 cps/web.py:2392
#: cps/web.py:2392 cps/web.py:2488
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr ""
#: cps/web.py:2301
#: cps/web.py:2397
msgid "Wrong Username or Password"
msgstr ""
#: cps/web.py:2307 cps/web.py:2328
#: cps/web.py:2403 cps/web.py:2424
msgid "login"
msgstr ""
#: cps/web.py:2340 cps/web.py:2371
#: cps/web.py:2436 cps/web.py:2467
msgid "Token not found"
msgstr ""
#: cps/web.py:2348 cps/web.py:2379
#: cps/web.py:2444 cps/web.py:2475
msgid "Token has expired"
msgstr ""
#: cps/web.py:2356
#: cps/web.py:2452
msgid "Success! Please return to your device"
msgstr ""
#: cps/web.py:2406
#: cps/web.py:2502
msgid "Please configure the SMTP mail settings first..."
msgstr ""
#: cps/web.py:2410
#: cps/web.py:2506
#, python-format
msgid "Book successfully queued for sending to %(kindlemail)s"
msgstr ""
#: cps/web.py:2414
#: cps/web.py:2510
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr ""
#: cps/web.py:2416 cps/web.py:3200
#: cps/web.py:2512 cps/web.py:3302
msgid "Please configure your kindle e-mail address first..."
msgstr ""
#: cps/web.py:2427 cps/web.py:2479
#: cps/web.py:2523 cps/web.py:2575
msgid "Invalid shelf specified"
msgstr ""
#: cps/web.py:2434
#: cps/web.py:2530
#, python-format
msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s"
msgstr ""
#: cps/web.py:2442
#: cps/web.py:2538
msgid "You are not allowed to edit public shelves"
msgstr ""
#: cps/web.py:2451
#: cps/web.py:2547
#, python-format
msgid "Book is already part of the shelf: %(shelfname)s"
msgstr ""
#: cps/web.py:2465
#: cps/web.py:2561
#, python-format
msgid "Book has been added to shelf: %(sname)s"
msgstr ""
#: cps/web.py:2484
#: cps/web.py:2580
#, python-format
msgid "You are not allowed to add a book to the the shelf: %(name)s"
msgstr ""
#: cps/web.py:2489
#: cps/web.py:2585
msgid "User is not allowed to edit public shelves"
msgstr ""
#: cps/web.py:2507
#: cps/web.py:2603
#, python-format
msgid "Books are already part of the shelf: %(name)s"
msgstr ""
#: cps/web.py:2521
#: cps/web.py:2617
#, python-format
msgid "Books have been added to shelf: %(sname)s"
msgstr ""
#: cps/web.py:2523
#: cps/web.py:2619
#, python-format
msgid "Could not add books to shelf: %(sname)s"
msgstr ""
#: cps/web.py:2560
#: cps/web.py:2656
#, python-format
msgid "Book has been removed from shelf: %(sname)s"
msgstr ""
#: cps/web.py:2566
#: cps/web.py:2662
#, python-format
msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
msgstr ""
#: cps/web.py:2586 cps/web.py:2610
#: cps/web.py:2682 cps/web.py:2706
#, python-format
msgid "A shelf with the name '%(title)s' already exists."
msgstr ""
#: cps/web.py:2591
#: cps/web.py:2687
#, python-format
msgid "Shelf %(title)s created"
msgstr ""
#: cps/web.py:2593 cps/web.py:2621
#: cps/web.py:2689 cps/web.py:2717
msgid "There was an error"
msgstr ""
#: cps/web.py:2594 cps/web.py:2596
#: cps/web.py:2690 cps/web.py:2692
msgid "create a shelf"
msgstr ""
#: cps/web.py:2619
#: cps/web.py:2715
#, python-format
msgid "Shelf %(title)s changed"
msgstr ""
#: cps/web.py:2622 cps/web.py:2624
#: cps/web.py:2718 cps/web.py:2720
msgid "Edit a shelf"
msgstr ""
#: cps/web.py:2645
#: cps/web.py:2741
#, python-format
msgid "successfully deleted shelf %(name)s"
msgstr ""
#: cps/web.py:2672
#: cps/web.py:2768
#, python-format
msgid "Shelf: '%(name)s'"
msgstr ""
#: cps/web.py:2675
#: cps/web.py:2771
msgid "Error opening shelf. Shelf does not exist or is not accessible"
msgstr ""
#: cps/web.py:2706
#: cps/web.py:2802
#, python-format
msgid "Change order of Shelf: '%(name)s'"
msgstr ""
#: cps/web.py:2735 cps/web.py:3152
#: cps/web.py:2831 cps/web.py:3254
msgid "E-mail is not from valid domain"
msgstr ""
#: cps/web.py:2737 cps/web.py:2778 cps/web.py:2781
#: cps/web.py:2833 cps/web.py:2876 cps/web.py:2879
#, python-format
msgid "%(name)s's profile"
msgstr ""
#: cps/web.py:2776
#: cps/web.py:2874
msgid "Found an existing account for this e-mail address."
msgstr ""
#: cps/web.py:2779
#: cps/web.py:2877
msgid "Profile updated"
msgstr ""
#: cps/web.py:2807
#: cps/web.py:2905
msgid "Admin page"
msgstr ""
#: cps/web.py:2885 cps/web.py:3059
#: cps/web.py:2985 cps/web.py:3159
msgid "Calibre-Web configuration updated"
msgstr ""
#: cps/templates/admin.html:100 cps/web.py:2898
#: cps/templates/admin.html:100 cps/web.py:2998
msgid "UI Configuration"
msgstr ""
#: cps/web.py:2916
#: cps/web.py:3016
msgid "Import of optional Google Drive requirements missing"
msgstr ""
#: cps/web.py:2919
#: cps/web.py:3019
msgid "client_secrets.json is missing or not readable"
msgstr ""
#: cps/web.py:2924 cps/web.py:2951
#: cps/web.py:3024 cps/web.py:3051
msgid "client_secrets.json is not configured for web application"
msgstr ""
#: cps/templates/admin.html:99 cps/web.py:2954 cps/web.py:2980 cps/web.py:2992
#: cps/web.py:3035 cps/web.py:3050 cps/web.py:3067 cps/web.py:3074
#: cps/web.py:3089
#: cps/templates/admin.html:99 cps/web.py:3054 cps/web.py:3080 cps/web.py:3092
#: cps/web.py:3135 cps/web.py:3150 cps/web.py:3167 cps/web.py:3174
#: cps/web.py:3189
msgid "Basic Configuration"
msgstr ""
#: cps/web.py:2977
#: cps/web.py:3077
msgid "Keyfile location is not valid, please enter correct path"
msgstr ""
#: cps/web.py:2989
#: cps/web.py:3089
msgid "Certfile location is not valid, please enter correct path"
msgstr ""
#: cps/web.py:3032
#: cps/web.py:3132
msgid "Logfile location is not valid, please enter correct path"
msgstr ""
#: cps/web.py:3071
#: cps/web.py:3171
msgid "DB location is not valid, please enter correct path"
msgstr ""
#: cps/templates/admin.html:33 cps/web.py:3148 cps/web.py:3154 cps/web.py:3170
#: cps/templates/admin.html:33 cps/web.py:3250 cps/web.py:3256 cps/web.py:3272
msgid "Add new user"
msgstr ""
#: cps/web.py:3160
#: cps/web.py:3262
#, python-format
msgid "User '%(user)s' created"
msgstr ""
#: cps/web.py:3164
#: cps/web.py:3266
msgid "Found an existing account for this e-mail address or nickname."
msgstr ""
#: cps/web.py:3188 cps/web.py:3202
#: cps/web.py:3290 cps/web.py:3304
msgid "E-mail server settings updated"
msgstr ""
#: cps/web.py:3195
#: cps/web.py:3297
#, python-format
msgid "Test e-mail successfully send to %(kindlemail)s"
msgstr ""
#: cps/web.py:3198
#: cps/web.py:3300
#, python-format
msgid "There was an error sending the Test e-mail: %(res)s"
msgstr ""
#: cps/web.py:3203
#: cps/web.py:3305
msgid "Edit e-mail server settings"
msgstr ""
#: cps/web.py:3228
#: cps/web.py:3330
#, python-format
msgid "User '%(nick)s' deleted"
msgstr ""
#: cps/web.py:3337
#: cps/web.py:3439
#, python-format
msgid "User '%(nick)s' updated"
msgstr ""
#: cps/web.py:3340
#: cps/web.py:3442
msgid "An unknown error occured."
msgstr ""
#: cps/web.py:3342
#: cps/web.py:3444
#, python-format
msgid "Edit User %(nick)s"
msgstr ""
#: cps/web.py:3359
#: cps/web.py:3461
#, python-format
msgid "Password for user %(user)s reset"
msgstr ""
#: cps/web.py:3373 cps/web.py:3574
#: cps/web.py:3475 cps/web.py:3676
msgid "Error opening eBook. File does not exist or file is not accessible"
msgstr ""
#: cps/web.py:3398 cps/web.py:3854
#: cps/web.py:3500 cps/web.py:3959
msgid "edit metadata"
msgstr ""
#: cps/web.py:3491 cps/web.py:3724
#: cps/web.py:3593 cps/web.py:3829
#, python-format
msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
msgstr ""
#: cps/web.py:3495 cps/web.py:3728
#: cps/web.py:3597 cps/web.py:3833
msgid "File to be uploaded must have an extension"
msgstr ""
#: cps/web.py:3507 cps/web.py:3748
#: cps/web.py:3609 cps/web.py:3853
#, python-format
msgid "Failed to create path %(path)s (Permission denied)."
msgstr ""
#: cps/web.py:3512
#: cps/web.py:3614
#, python-format
msgid "Failed to store file %(file)s."
msgstr ""
#: cps/web.py:3528
#: cps/web.py:3630
#, python-format
msgid "File format %(ext)s added to %(book)s"
msgstr ""
#: cps/web.py:3546
#: cps/web.py:3648
#, python-format
msgid "Failed to create path for cover %(path)s (Permission denied)."
msgstr ""
#: cps/web.py:3553
#: cps/web.py:3655
#, python-format
msgid "Failed to store cover-file %(cover)s."
msgstr ""
#: cps/web.py:3556
#: cps/web.py:3658
msgid "Cover-file is not a valid image file"
msgstr ""
#: cps/web.py:3586 cps/web.py:3595 cps/web.py:3599
#: cps/web.py:3688 cps/web.py:3697 cps/web.py:3701
msgid "unknown"
msgstr ""
#: cps/web.py:3618
#: cps/web.py:3720
msgid "Cover is not a jpg file, can't save"
msgstr ""
#: cps/web.py:3663
#: cps/web.py:3768
#, python-format
msgid "%(langname)s is not a valid language"
msgstr ""
#: cps/web.py:3694
#: cps/web.py:3799
msgid "Metadata successfully updated"
msgstr ""
#: cps/web.py:3703
#: cps/web.py:3808
msgid "Error editing book, please check logfile for details"
msgstr ""
#: cps/web.py:3753
#: cps/web.py:3858
#, python-format
msgid "Failed to store file %(file)s (Permission denied)."
msgstr ""
#: cps/web.py:3758
#: cps/web.py:3863
#, python-format
msgid "Failed to delete file %(file)s (Permission denied)."
msgstr ""
#: cps/web.py:3840
#: cps/web.py:3945
#, python-format
msgid "File %(file)s uploaded"
msgstr ""
#: cps/web.py:3870
#: cps/web.py:3975
msgid "Source or destination format for conversion missing"
msgstr ""
#: cps/web.py:3880
#: cps/web.py:3985
#, python-format
msgid "Book successfully queued for converting to %(book_format)s"
msgstr ""
#: cps/web.py:3884
#: cps/web.py:3989
#, python-format
msgid "There was an error converting this book: %(res)s"
msgstr ""
......@@ -880,10 +889,10 @@ msgstr ""
#: cps/templates/admin.html:151 cps/templates/admin.html:165
#: cps/templates/book_edit.html:178 cps/templates/book_edit.html:200
#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:164
#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:168
#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:75
#: cps/templates/shelf.html:62 cps/templates/shelf_edit.html:19
#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:151
#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:155
msgid "Back"
msgstr ""
......@@ -979,12 +988,12 @@ msgstr ""
msgid "Upload Cover from local drive"
msgstr ""
#: cps/templates/book_edit.html:96 cps/templates/detail.html:131
#: cps/templates/book_edit.html:96 cps/templates/detail.html:135
msgid "Publishing date"
msgstr ""
#: cps/templates/book_edit.html:103 cps/templates/book_edit.html:261
#: cps/templates/book_edit.html:278 cps/templates/detail.html:126
#: cps/templates/book_edit.html:278 cps/templates/detail.html:127
#: cps/templates/search_form.html:14
msgid "Publisher"
msgstr ""
......@@ -1014,9 +1023,9 @@ msgid "Get metadata"
msgstr ""
#: cps/templates/book_edit.html:177 cps/templates/config_edit.html:210
#: cps/templates/config_view_edit.html:163 cps/templates/login.html:20
#: cps/templates/config_view_edit.html:167 cps/templates/login.html:20
#: cps/templates/search_form.html:153 cps/templates/shelf_edit.html:17
#: cps/templates/user_edit.html:149
#: cps/templates/user_edit.html:153
msgid "Submit"
msgstr ""
......@@ -1052,7 +1061,7 @@ msgstr ""
msgid "Loading..."
msgstr ""
#: cps/templates/book_edit.html:239 cps/templates/layout.html:221
#: cps/templates/book_edit.html:239 cps/templates/layout.html:224
msgid "Close"
msgstr ""
......@@ -1234,31 +1243,31 @@ msgstr ""
msgid "Default settings for new users"
msgstr ""
#: cps/templates/config_view_edit.html:70 cps/templates/user_edit.html:106
#: cps/templates/config_view_edit.html:70 cps/templates/user_edit.html:110
msgid "Admin user"
msgstr ""
#: cps/templates/config_view_edit.html:74 cps/templates/user_edit.html:115
#: cps/templates/config_view_edit.html:74 cps/templates/user_edit.html:119
msgid "Allow Downloads"
msgstr ""
#: cps/templates/config_view_edit.html:78 cps/templates/user_edit.html:119
#: cps/templates/config_view_edit.html:78 cps/templates/user_edit.html:123
msgid "Allow Uploads"
msgstr ""
#: cps/templates/config_view_edit.html:82 cps/templates/user_edit.html:123
#: cps/templates/config_view_edit.html:82 cps/templates/user_edit.html:127
msgid "Allow Edit"
msgstr ""
#: cps/templates/config_view_edit.html:86 cps/templates/user_edit.html:127
#: cps/templates/config_view_edit.html:86 cps/templates/user_edit.html:131
msgid "Allow Delete books"
msgstr ""
#: cps/templates/config_view_edit.html:90 cps/templates/user_edit.html:132
#: cps/templates/config_view_edit.html:90 cps/templates/user_edit.html:136
msgid "Allow Changing Password"
msgstr ""
#: cps/templates/config_view_edit.html:94 cps/templates/user_edit.html:136
#: cps/templates/config_view_edit.html:94 cps/templates/user_edit.html:140
msgid "Allow Editing Public Shelfs"
msgstr ""
......@@ -1303,14 +1312,18 @@ msgid "Show author selection"
msgstr ""
#: cps/templates/config_view_edit.html:148 cps/templates/user_edit.html:94
msgid "Show read and unread"
msgid "Show publisher selection"
msgstr ""
#: cps/templates/config_view_edit.html:152 cps/templates/user_edit.html:98
msgid "Show read and unread"
msgstr ""
#: cps/templates/config_view_edit.html:156 cps/templates/user_edit.html:102
msgid "Show random books in detail view"
msgstr ""
#: cps/templates/config_view_edit.html:156 cps/templates/user_edit.html:111
#: cps/templates/config_view_edit.html:160 cps/templates/user_edit.html:115
msgid "Show mature content"
msgstr ""
......@@ -1330,19 +1343,19 @@ msgstr ""
msgid "language"
msgstr ""
#: cps/templates/detail.html:168
#: cps/templates/detail.html:172
msgid "Read"
msgstr ""
#: cps/templates/detail.html:178
#: cps/templates/detail.html:182
msgid "Description:"
msgstr ""
#: cps/templates/detail.html:191 cps/templates/search.html:14
#: cps/templates/detail.html:195 cps/templates/search.html:14
msgid "Add to shelf"
msgstr ""
#: cps/templates/detail.html:253
#: cps/templates/detail.html:257
msgid "Edit metadata"
msgstr ""
......@@ -1402,7 +1415,7 @@ msgstr ""
msgid "Do you really want to delete this domain rule?"
msgstr ""
#: cps/templates/feed.xml:21 cps/templates/layout.html:205
#: cps/templates/feed.xml:21 cps/templates/layout.html:208
msgid "Next"
msgstr ""
......@@ -1455,27 +1468,35 @@ msgstr ""
msgid "Books ordered by Author"
msgstr ""
#: cps/templates/index.xml:66 cps/templates/layout.html:163
msgid "Publishers"
msgstr ""
#: cps/templates/index.xml:70
msgid "Books ordered by category"
msgid "Books ordered by publisher"
msgstr ""
#: cps/templates/index.xml:77
msgid "Books ordered by category"
msgstr ""
#: cps/templates/index.xml:84
msgid "Books ordered by series"
msgstr ""
#: cps/templates/index.xml:80 cps/templates/layout.html:166
#: cps/templates/index.xml:87 cps/templates/layout.html:169
msgid "Public Shelves"
msgstr ""
#: cps/templates/index.xml:84
#: cps/templates/index.xml:91
msgid "Books organized in public shelfs, visible to everyone"
msgstr ""
#: cps/templates/index.xml:88 cps/templates/layout.html:170
#: cps/templates/index.xml:95 cps/templates/layout.html:173
msgid "Your Shelves"
msgstr ""
#: cps/templates/index.xml:92
#: cps/templates/index.xml:99
msgid "User's own shelfs, only visible to the current user himself"
msgstr ""
......@@ -1544,23 +1565,23 @@ msgstr ""
msgid "Categories"
msgstr ""
#: cps/templates/layout.html:163 cps/templates/search_form.html:74
#: cps/templates/layout.html:166 cps/templates/search_form.html:74
msgid "Languages"
msgstr ""
#: cps/templates/layout.html:175
#: cps/templates/layout.html:178
msgid "Create a Shelf"
msgstr ""
#: cps/templates/layout.html:176 cps/templates/stats.html:3
#: cps/templates/layout.html:179 cps/templates/stats.html:3
msgid "About"
msgstr ""
#: cps/templates/layout.html:190
#: cps/templates/layout.html:193
msgid "Previous"
msgstr ""
#: cps/templates/layout.html:217
#: cps/templates/layout.html:220
msgid "Book Details"
msgstr ""
......@@ -1879,11 +1900,11 @@ msgstr ""
msgid "Show all"
msgstr ""
#: cps/templates/user_edit.html:143
#: cps/templates/user_edit.html:147
msgid "Delete this user"
msgstr ""
#: cps/templates/user_edit.html:158
#: cps/templates/user_edit.html:162
msgid "Recent Downloads"
msgstr ""
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment