Merge branch 'master' into Develop

# Conflicts:
#	cps/book_formats.py
#	cps/static/js/libs/bootstrap.min.js
#	cps/templates/detail.html
#	cps/templates/layout.html
#	cps/web.py

Improvement updater (up to 100 releases are loaded at once)
Fix oauth pathes
Fix oauth without registering
pull/829/head
Ozzieisaacs 6 years ago
commit cc3088c52f

@ -225,7 +225,10 @@ def get_valid_filename(value, replace_whitespace=True):
value = value[:128]
if not value:
raise ValueError("Filename cannot be empty")
return value
if sys.version_info.major == 3:
return value
else:
return value.decode('utf-8')
def get_sorted_author(value):

@ -223,7 +223,11 @@ if ub.oauth_support:
except Exception as e:
app.logger.exception(e)
ub.session.rollback()
return redirect(url_for('web.register'))
if config.config_public_reg:
return redirect(url_for('web.register'))
else:
flash(_('Public registration is not enabled'), category="error")
redirect(url_for(redirect_url))
except NoResultFound:
return redirect(url_for(redirect_url))
@ -265,7 +269,7 @@ if ub.oauth_support:
except NoResultFound:
app.logger.warning("oauth %s for user %d not fount" % (provider, current_user.id))
flash(_("Not linked to %(oauth)s.", oauth=oauth_check[provider]), category="error")
return redirect(url_for('profile'))
return redirect(url_for('web.profile'))
# notify on OAuth provider error

File diff suppressed because one or more lines are too long

@ -108,7 +108,7 @@ if ( $( 'body.book' ).length > 0 ) {
.replace(/^(?=\n)$|^\s*|\s*$|\n\n+/gm,"").split(/\n/);
}
else {
newdesc = description.toString();
newdesc = description.text();
}
doc = nlp ( newdesc.toString() );
sentences = doc.map((m)=> m.out( 'text' ));
@ -490,19 +490,19 @@ if ( $( 'body.shelf' ).length > 0 ) {
.addClass( 'order-shelf-btn' );
$( '.delete-shelf-btn' ).attr({
'data-toggle-two': 'tooltip',
'title': 'Delete Shelf',
'title': $( '.delete-shelf-btn' ).text(), // 'Delete Shelf'
'data-placement': 'bottom' })
.addClass('delete-btn-tooltip');
$( '.edit-shelf-btn' ).attr({
'data-toggle-two': 'tooltip',
'title': 'Edit Shelf',
'title': $( '.edit-shelf-btn' ).text(), // 'Edit Shelf'
'data-placement': 'bottom' })
.addClass('edit-btn-tooltip');
$( '.order-shelf-btn' ).attr({
'data-toggle-two': 'tooltip',
'title': 'Reorder Shelf',
'title': $( '.order-shelf-btn' ).text(), //'Reorder Shelf'
'data-placement': 'bottom' })
.addClass('order-btn-tooltip');
}
@ -510,32 +510,32 @@ if ( $( 'body.shelf' ).length > 0 ) {
// Rest of Tooltips
$( '.home-btn > a' ).attr({
'data-toggle': 'tooltip',
'title': 'Home',
'title': $(document.body).attr('data-text'), // Home
'data-placement': 'bottom' })
.addClass('home-btn-tooltip');
$( '.plexBack > a' ).attr({
'data-toggle': 'tooltip',
'title': 'Back',
'title': $(document.body).attr('data-textback'), // Back
'data-placement': 'bottom' })
.addClass('back-btn-tooltip');
$( '#top_tasks' ).attr({
'data-toggle': 'tooltip',
'title': $( '#top_tasks' ).text(), //'Tasks',
'title': $( '#top_tasks' ).text(), // 'Tasks'
'data-placement': 'bottom',
'data-viewport': '#main-nav' })
.addClass('tasks-btn-tooltip');
$( '#top_admin' ).attr({
'data-toggle': 'tooltip',
'title': 'Settings',
'title': $( '#top_admin' ).attr('data-text'), // Settings
'data-placement': 'bottom',
'data-viewport': '#main-nav' })
.addClass('admin-btn-tooltip');
$( '.profileDrop' ).attr({
'title': 'Account',
'title': $( '#top_user' ).attr('data-text'), //Account
'data-placement': 'bottom',
'data-toggle-two': 'tooltip',
'data-viewport': '#main-nav' })
@ -543,78 +543,78 @@ $( '.profileDrop' ).attr({
$( '#btn-upload' ).attr({
'data-toggle': 'tooltip',
'title': $( '#btn-upload' ).parent().text() , // 'Upload',
'title': $( '#btn-upload' ).parent().text() , // 'Upload'
'data-placement': 'bottom',
'data-viewport': '#main-nav' })
.addClass('upload-btn-tooltip');
$( '#add-to-shelf' ).attr({
'data-toggle-two': 'tooltip',
'title': $( '#add-to-shelf' ).text() , // 'Add to Shelf',
'title': $( '#add-to-shelf' ).text() , // 'Add to Shelf'
'data-placement': 'bottom',
'data-viewport': '.btn-toolbar' })
.addClass('addtoshelf-btn-tooltip');
$( '#have_read_cb' ).attr({
'data-toggle': 'tooltip',
'title': 'Mark As Read',
'title': $( '#have_read_cb').attr('data-unchecked'),
'data-placement': 'bottom',
'data-viewport': '.btn-toolbar' })
.addClass('readunread-btn-tooltip');
$( '#have_read_cb:checked' ).attr({
'data-toggle': 'tooltip',
'title': 'Mark As Unread',
'title': $( '#have_read_cb').attr('data-checked'),
'data-placement': 'bottom',
'data-viewport': '.btn-toolbar' })
.addClass('readunread-btn-tooltip');
$( 'button#delete' ).attr({
'data-toggle-two': 'tooltip',
'title': $( 'button#delete' ).text(), //'Delete',
'title': $( 'button#delete' ).text(), //'Delete'
'data-placement': 'bottom',
'data-viewport': '.btn-toolbar' })
.addClass('delete-book-btn-tooltip');
$( '#have_read_cb' ).click(function() {
if ( $( '#have_read_cb:checked' ).length > 0 ) {
$( this ).attr('data-original-title', 'Mark as Unread');
$( this ).attr('data-original-title', $('#have_read_cb').attr('data-checked'));
} else {
$( this).attr('data-original-title', 'Mark as Read');
$( this).attr('data-original-title', $('#have_read_cb').attr('data-unchecked'));
}
});
$( '.btn-group[aria-label="Edit/Delete book"] a' ).attr({
'data-toggle': 'tooltip',
'title': $( '#edit_book' ).text(), // 'Edit',
'title': $( '#edit_book' ).text(), // 'Edit'
'data-placement': 'bottom',
'data-viewport': '.btn-toolbar' })
.addClass('edit-btn-tooltip');
$( '#sendbtn' ).attr({
'data-toggle': 'tooltip',
'title': 'Send to Kindle',
'title': $( '#sendbtn' ).attr('data-text'),
'data-placement': 'bottom',
'data-viewport': '.btn-toolbar' })
.addClass('send-btn-tooltip');
$( '#sendbtn2' ).attr({
'data-toggle-two': 'tooltip',
'title': 'Send to Kindle',
'title': $( '#sendbtn2' ).text(), // 'Send to Kindle',
'data-placement': 'bottom',
'data-viewport': '.btn-toolbar' })
.addClass('send-btn-tooltip');
$( '#read-in-browser' ).attr({
'data-toggle-two': 'tooltip',
'title': 'Read',
'title': $( '#read-in-browser' ).text(),
'data-placement': 'bottom',
'data-viewport': '.btn-toolbar'})
.addClass('send-btn-tooltip');
$( '#btnGroupDrop1' ).attr({
'data-toggle-two': 'tooltip',
'title': 'Download',
'title': $( '#btnGroupDrop1' ).text(),
'data-placement': 'bottom',
'data-viewport': '.btn-toolbar' });

File diff suppressed because one or more lines are too long

@ -6,41 +6,41 @@
* Version 1.0.0
* Licensed under the MIT license.
*/
(function($){
(function($) {
"use strict";
$.support.xhrFileUpload = !!(window.FileReader && window.ProgressEvent);
$.support.xhrFormData = !!window.FormData;
if(!$.support.xhrFileUpload || !$.support.xhrFormData){
if (!$.support.xhrFileUpload || !$.support.xhrFormData) {
// skip decorating form
return;
}
var template = '<div class="modal fade" id="file-progress-modal">\
<div class="modal-dialog">\
<div class="modal-content">\
<div class="modal-header">\
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>\
<h4 class="modal-title">Uploading</h4>\
</div>\
<div class="modal-body">\
<div class="modal-message"></div>\
<div class="progress">\
<div class="progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="0" aria-valuemin="0"\
aria-valuemax="100" style="width: 0%;min-width: 2em;">\
0%\
</div>\
</div>\
</div>\
<div class="modal-footer" style="display:none">\
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>\
</div>\
</div>\
</div>\
</div>';
var UploadProgress = function(element, options){
var template = "<div class=\"modal fade\" id=\"file-progress-modal\">" +
"<div class=\"modal-dialog\">" +
" <div class=\"modal-content\">" +
" <div class=\"modal-header\">" +
" <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button>" +
" <h4 class=\"modal-title\">Uploading</h4>" +
" </div>" +
" <div class=\"modal-body\">" +
" <div class=\"modal-message\"></div>" +
" <div class=\"progress\">" +
" <div class=\"progress-bar progress-bar-striped active\" role=\"progressbar\" aria-valuenow=\"0\" aria-valuemin=\"0\"" +
" aria-valuemax=\"100\" style=\"width: 0%;min-width: 2em;\">" +
" 0%" +
" </div>" +
" </div>" +
" </div>" +
" <div class=\"modal-footer\" style=\"display:none\">" +
" <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>" +
" </div>" +
" </div>" +
" </div>" +
"</div>";
var UploadProgress = function(element, options) {
this.options = options;
this.$element = $(element);
};
@ -49,22 +49,25 @@
constructor: function() {
this.$form = this.$element;
this.$form.on('submit', $.proxy(this.submit, this));
this.$form.on("submit", $.proxy(this.submit, this));
this.$modal = $(this.options.template);
this.$modal_message = this.$modal.find('.modal-message');
this.$modal_title = this.$modal.find('.modal-title');
this.$modal_footer = this.$modal.find('.modal-footer');
this.$modal_bar = this.$modal.find('.progress-bar');
this.$modalTitle = this.$modal.find(".modal-title");
this.$modalFooter = this.$modal.find(".modal-footer");
this.$modalBar = this.$modal.find(".progress-bar");
this.$modal.on('hidden.bs.modal', $.proxy(this.reset, this));
// Translate texts
this.$modalTitle.text(this.options.modalTitle)
this.$modalFooter.children("button").text(this.options.modalFooter)
this.$modal.on("hidden.bs.modal", $.proxy(this.reset, this));
},
reset: function(){
this.$modal_title = this.$modal_title.text('Uploading');
this.$modal_footer.hide();
this.$modal_bar.addClass('progress-bar-success');
this.$modal_bar.removeClass('progress-bar-danger');
if(this.xhr){
reset: function() {
this.$modalTitle.text(this.options.modalTitle)
this.$modalFooter.hide();
this.$modalBar.addClass("progress-bar-success");
this.$modalBar.removeClass("progress-bar-danger");
if (this.xhr) {
this.xhr.abort();
}
},
@ -73,7 +76,7 @@
e.preventDefault();
this.$modal.modal({
backdrop: 'static',
backdrop: "static",
keyboard: false
});
@ -81,35 +84,33 @@
var xhr = new XMLHttpRequest();
this.xhr = xhr;
xhr.addEventListener('load', $.proxy(this.success, this, xhr));
xhr.addEventListener('error', $.proxy(this.error, this, xhr));
//xhr.addEventListener('abort', function(){});
xhr.addEventListener("load", $.proxy(this.success, this, xhr));
xhr.addEventListener("error", $.proxy(this.error, this, xhr));
xhr.upload.addEventListener('progress', $.proxy(this.progress, this));
xhr.upload.addEventListener("progress", $.proxy(this.progress, this));
var form = this.$form;
xhr.open(form.attr('method'), form.attr("action"));
xhr.setRequestHeader('X-REQUESTED-WITH', 'XMLHttpRequest');
xhr.open(form.attr("method"), form.attr("action"));
xhr.setRequestHeader("X-REQUESTED-WITH", "XMLHttpRequest");
var data = new FormData(form.get(0));
xhr.send(data);
},
success: function(xhr) {
if(xhr.status == 0 || xhr.status >= 400){
if (xhr.status === 0 || xhr.status >= 400) {
// HTTP 500 ends up here!?!
return this.error(xhr);
}
this.set_progress(100);
var url;
var content_type = xhr.getResponseHeader('Content-Type');
var contentType = xhr.getResponseHeader("Content-Type");
// make it possible to return the redirect URL in
// a JSON response
if(content_type.indexOf('application/json') !== -1){
if (contentType.indexOf("application/json") !== -1) {
var response = $.parseJSON(xhr.responseText);
console.log(response);
url = response.location;
}
else{
@ -120,39 +121,41 @@
// handle form error
// we replace the form with the returned one
error: function(xhr){
this.$modal_title.text('Upload failed');
this.$modal_bar.removeClass('progress-bar-success');
this.$modal_bar.addClass('progress-bar-danger');
this.$modal_footer.show();
error: function(xhr) {
this.$modalTitle.text(this.options.modalTitleFailed);
var content_type = xhr.getResponseHeader('Content-Type');
this.$modalBar.removeClass("progress-bar-success");
this.$modalBar.addClass("progress-bar-danger");
this.$modalFooter.show();
var contentType = xhr.getResponseHeader("Content-Type");
// Replace the contents of the form, with the returned html
if(xhr.status === 422){
var new_html = $.parseHTML(xhr.responseText);
this.replace_form(new_html);
this.$modal.modal('hide');
if (xhr.status === 422) {
var newHtml = $.parseHTML(xhr.responseText);
this.replace_form(newHtml);
this.$modal.modal("hide");
}
// Write the error response to the document.
else{
var response_text = xhr.responseText;
if(content_type.indexOf('text/plain') !== -1){
response_text = '<pre>' + response_text + '</pre>';
var responseText = xhr.responseText;
// Handle no response error
if (contentType) {
if (contentType.indexOf("text/plain") !== -1) {
responseText = "<pre>" + responseText + "</pre>";
}
document.write(xhr.responseText);
}
document.write(xhr.responseText);
}
},
set_progress: function(percent){
var txt = percent + '%';
var txt = percent + "%";
if (percent == 100) {
txt = this.options.uploaded_msg;
txt = this.options.uploadedMsg;
}
this.$modal_bar.attr('aria-valuenow', percent);
this.$modal_bar.text(txt);
this.$modal_bar.css('width', percent + '%');
this.$modalBar.attr("aria-valuenow", percent);
this.$modalBar.text(txt);
this.$modalBar.css("width", percent + "%");
},
progress: function(/*ProgressEvent*/e){
@ -163,24 +166,23 @@
// replace_form replaces the contents of the current form
// with the form in the html argument.
// We use the id of the current form to find the new form in the html
replace_form: function(html){
var new_form;
var form_id = this.$form.attr('id');
if(form_id !== undefined){
new_form = $(html).find('#' + form_id);
replace_form: function(html) {
var newForm;
var formId = this.$form.attr("id");
if(formId !== undefined){
newForm = $(html).find("#" + formId);
}
else{
new_form = $(html).find('form');
newForm = $(html).find("form");
}
// add the filestyle again
new_form.find(':file').filestyle({buttonBefore: true});
this.$form.html(new_form.children());
newForm.find(":file").filestyle({buttonBefore: true});
this.$form.html(newForm.children());
}
};
$.fn.uploadprogress = function(options, value){
return this.each(function(){
return this.each(function() {
var _options = $.extend({}, $.fn.uploadprogress.defaults, options);
var file_progress = new UploadProgress(this, _options);
file_progress.constructor();
@ -189,9 +191,11 @@
$.fn.uploadprogress.defaults = {
template: template,
uploaded_msg: "Upload done, processing, please wait..."
uploadedMsg: "Upload done, processing, please wait...",
modalTitle: "Uploading",
modalFooter: "Close",
modalTitleFailed: "Upload failed"
//redirect_url: ...
// need to customize stuff? Add here, and change code accordingly.
};

@ -18,7 +18,7 @@
{% if entry.data|length %}
<div class="btn-group" role="group">
{% if entry.data|length < 2 %}
<button type="button" class="btn btn-primary">
<button id="Download" type="button" class="btn btn-primary">
{{_('Download')}} :
</button>
{% for format in entry.data %}
@ -42,7 +42,7 @@
{% endif %}
{% if g.user.kindle_mail and g.user.is_authenticated and kindle_list %}
{% if kindle_list.__len__() == 1 %}
<a href="{{url_for('web.send_to_kindle', book_id=entry.id, book_format=kindle_list[0]['format'], convert=kindle_list[0]['convert'])}}" id="sendbtn" class="btn btn-primary" role="button"><span class="glyphicon glyphicon-send"></span> {{kindle_list[0]['text']}}</a>
<a href="{{url_for('web.send_to_kindle', book_id=entry.id, book_format=kindle_list[0]['format'], convert=kindle_list[0]['convert'])}}" id="sendbtn" data-text="{{_('Send to Kindle')}}" class="btn btn-primary" role="button"><span class="glyphicon glyphicon-send"></span> {{kindle_list[0]['text']}}</a>
{% else %}
<div class="btn-group" role="group">
<button id="sendbtn2" type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
@ -206,7 +206,7 @@
<p>
<form id="have_read_form" action="{{ url_for('web.toggle_read', book_id=entry.id)}}" method="POST">
<label class="block-label">
<input id="have_read_cb" type="checkbox" {% if have_read %}checked{% endif %} >
<input id="have_read_cb" data-checked="{{_('Mark As Unread')}}" data-unchecked="{{_('Mark As Read')}}" type="checkbox" {% if have_read %}checked{% endif %} >
<span>{{_('Read')}}</span>
</label>
</form>

@ -25,7 +25,7 @@
{% block header %}{% endblock %}
</head>
<body class="{{ page }}">
<body class="{{ page }}" data-text="{{_('Home')}}" data-textback="{{_('Back')}}">
<!-- Static navbar -->
<div class="navbar navbar-default navbar-static-top" role="navigation">
<div class="container-fluid">
@ -69,14 +69,14 @@
{% endif %}
{% endif %}
{% if not g.user.is_anonymous %}
<li><a id="top_tasks" href="{{url_for('web.get_tasks_status')}}"><span class="glyphicon glyphicon-tasks"></span><span class="hidden-sm"> {{_('Tasks')}}</span></a></li>
<li><a id="top_tasks" href="{{url_for('web.get_tasks_status')}}"><span class="glyphicon glyphicon-tasks"></span><span class="hidden-sm">{{_('Tasks')}}</span></a></li>
{% endif %}
{% if g.user.role_admin() %}
<li><a id="top_admin" href="{{url_for('admin.admin')}}"><span class="glyphicon glyphicon-dashboard"></span><span class="hidden-sm"> {{_('Admin')}}</span></a></li>
<li><a id="top_admin" data-text="{{_('Settings')}}" href="{{url_for('admin.admin')}}"><span class="glyphicon glyphicon-dashboard"></span><span class="hidden-sm">{{_('Admin')}}</span></a></li>
{% endif %}
<li><a id="top_user" href="{{url_for('web.profile')}}"><span class="glyphicon glyphicon-user"></span><span class="hidden-sm"> {{g.user.nickname}}</span></a></li>
<li><a id="top_user" data-text="{{_('Account')}}" href="{{url_for('web.profile')}}"><span class="glyphicon glyphicon-user"></span><span class="hidden-sm">{{g.user.nickname}}</span></a></li>
{% if not g.user.is_anonymous %}
<li><a id="logout" href="{{url_for('web.logout')}}"><span class="glyphicon glyphicon-log-out"></span><span class="hidden-sm"> {{_('Logout')}}</span></a></li>
<li><a id="logout" href="{{url_for('web.logout')}}"><span class="glyphicon glyphicon-log-out"></span><span class="hidden-sm">{{_('Logout')}}</span></a></li>
{% endif %}
{% endif %}
{% if g.allow_registration and not g.user.is_authenticated %}
@ -104,6 +104,14 @@
</div>
{%endif%}
{% endfor %}
{% if g.current_theme == 1 %}
<div id="loader" hidden="true">
<center>
<h3>{{_('Uploading...')}}</h3>
<span>{{_("please don't refresh the page")}}</span>.
</center>
</div>
{%endif%}
<div class="container-fluid">
<div class="row-fluid">
{% if g.user.is_authenticated or g.user.is_anonymous %}
@ -242,7 +250,13 @@
{% endif %}
<script type="text/javascript">
$(function() {
$("#form-upload").uploadprogress({redirect_url: '{{ url_for('web.index')}}'});
$("#form-upload").uploadprogress({
redirect_url: "{{ url_for('web.index')}}",
uploadedMsg: "{{_('Upload done, processing, please wait...')}}",
modalTitle: "{{_('Uploading...')}}",
modalFooter: "{{_('Close')}}",
modalTitleFailed: "{{_('Error')}}"
});
$("#btn-upload").change(function() {
$("#form-upload").submit();
});

@ -51,9 +51,9 @@
{% for oauth, name in registered_oauth.iteritems() %}
<label for="config_{{ oauth }}_oauth" style="margin-left: 15px">{{ name }}</label>
{% if oauth not in oauth_status %}
<a href="/{{ oauth }}" target="_blank" style="margin-left: 5px">Link</a>
<a href="/cw/github" target="_blank" style="margin-left: 5px">Link</a> <!-- ToDo: Not really working-->
{% else %}
<a href="/unlink/{{ oauth }}" style="margin-left: 5px">Unlink</a>
<a href="{{ url_for('oauth.github_login_unlink') }}" style="margin-left: 5px">{{_('Unlink')}}</a> <!-- ToDo: Google not working-->
{% endif %}
<br/>
{% endfor %}

@ -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: 2019-02-03 16:21+0100\n"
"POT-Creation-Date: 2019-02-20 20:23+0100\n"
"PO-Revision-Date: 2019-01-20 19:36+0100\n"
"Last-Translator: Ozzie Isaacs\n"
"Language: de\n"
@ -18,8 +18,8 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n"
#: cps/book_formats.py:145 cps/book_formats.py:146 cps/book_formats.py:150
#: cps/book_formats.py:154 cps/converter.py:29 cps/converter.py:45
#: cps/book_formats.py:152 cps/book_formats.py:153 cps/book_formats.py:157
#: cps/book_formats.py:161 cps/converter.py:29 cps/converter.py:45
msgid "not installed"
msgstr "Nicht installiert"
@ -31,132 +31,132 @@ msgstr "Ausführungsberechtigung nicht vorhanden"
msgid "not configured"
msgstr "Nicht konfiguriert"
#: cps/helper.py:77
#: cps/helper.py:72
#, python-format
msgid "%(format)s format not found for book id: %(book)d"
msgstr "%(format)s Format nicht gefunden bei Buch ID %(book)d"
#: cps/helper.py:89
#: cps/helper.py:84
#, python-format
msgid "%(format)s not found on Google Drive: %(fn)s"
msgstr "%(format)s von Buch %(fn)s nicht auf Google Drive gefunden"
#: cps/helper.py:96 cps/helper.py:204 cps/templates/detail.html:49
#: cps/helper.py:91 cps/helper.py:199 cps/templates/detail.html:49
msgid "Send to Kindle"
msgstr "An Kindle senden"
#: cps/helper.py:97 cps/helper.py:115 cps/helper.py:206
#: cps/helper.py:92 cps/helper.py:110 cps/helper.py:201
msgid "This e-mail has been sent via Calibre-Web."
msgstr "Diese E-Mail wurde durch Calibre-Web versendet."
#: cps/helper.py:108
#: cps/helper.py:103
#, python-format
msgid "%(format)s not found: %(fn)s"
msgstr "%(format)s nicht gefunden: %(fn)s"
#: cps/helper.py:113
#: cps/helper.py:108
msgid "Calibre-Web test e-mail"
msgstr "Calibre-Web Test E-Mail"
#: cps/helper.py:114
#: cps/helper.py:109
msgid "Test e-mail"
msgstr "Test E-Mail"
#: cps/helper.py:130
#: cps/helper.py:125
msgid "Get Started with Calibre-Web"
msgstr "Loslegen mit Calibre-Web"
#: cps/helper.py:131
#: cps/helper.py:126
#, python-format
msgid "Registration e-mail for user: %(name)s"
msgstr "Registrierungs E-Mail für Benutzer %(name)s"
#: cps/helper.py:144 cps/helper.py:146 cps/helper.py:148 cps/helper.py:150
#: cps/helper.py:156 cps/helper.py:158 cps/helper.py:160 cps/helper.py:162
#: cps/helper.py:139 cps/helper.py:141 cps/helper.py:143 cps/helper.py:145
#: cps/helper.py:151 cps/helper.py:153 cps/helper.py:155 cps/helper.py:157
#, python-format
msgid "Send %(format)s to Kindle"
msgstr "Sende %(format)s an Kindle"
#: cps/helper.py:166 cps/helper.py:170
#: cps/helper.py:161 cps/helper.py:165
#, python-format
msgid "Convert %(orig)s to %(format)s and send to Kindle"
msgstr "Konvertiere %(orig)s nach %(format)s und sende an Kindle"
#: cps/helper.py:205
#: cps/helper.py:200
#, python-format
msgid "E-mail: %(book)s"
msgstr "E-Mail: %(book)s"
#: cps/helper.py:208
#: cps/helper.py:203
msgid "The requested file could not be read. Maybe wrong permissions?"
msgstr "Die angeforderte Datei konnte nicht gelesen werden. Evtl. falsche Zugriffsrechte?"
#: cps/helper.py:313
#: cps/helper.py:308
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Umbenennen des Titelpfades '%(src)s' nach '%(dest)s' schlug fehl: %(error)s"
#: cps/helper.py:323
#: cps/helper.py:318
#, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Umbenennen des Authorpfades '%(src)s' nach '%(dest)s' schlug fehl: %(error)s"
#: cps/helper.py:337
#: cps/helper.py:332
#, python-format
msgid "Rename file in path '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Umbenennen der Datei im Pfad '%(src)s' nach '%(dest)s' ist fehlgeschlagen: %(error)s"
#: cps/helper.py:362 cps/helper.py:371
#: cps/helper.py:358 cps/helper.py:368 cps/helper.py:376
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "Datei %(file)s wurde nicht auf Google Drive gefunden"
#: cps/helper.py:402
#: cps/helper.py:397
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "Buchpfad %(path)s wurde nicht auf Google Drive gefunden"
#: cps/helper.py:510
#: cps/helper.py:505
msgid "Error excecuting UnRar"
msgstr "Fehler bei der Ausführung von UnRar"
#: cps/helper.py:512
#: cps/helper.py:507
msgid "Unrar binary file not found"
msgstr "UnRar Datei nicht gefunden"
#: cps/helper.py:543
#: cps/helper.py:538
msgid "Waiting"
msgstr "Wartend"
#: cps/helper.py:545
#: cps/helper.py:540
msgid "Failed"
msgstr "Fehlgeschlagen"
#: cps/helper.py:547
#: cps/helper.py:542
msgid "Started"
msgstr "Gestartet"
#: cps/helper.py:549
#: cps/helper.py:544
msgid "Finished"
msgstr "Beendet"
#: cps/helper.py:551
#: cps/helper.py:546
msgid "Unknown Status"
msgstr "Unbekannter Status"
#: cps/helper.py:556
#: cps/helper.py:551
msgid "E-mail: "
msgstr "E-Mail: "
#: cps/helper.py:558 cps/helper.py:562
#: cps/helper.py:553 cps/helper.py:557
msgid "Convert: "
msgstr "Konvertiere: "
#: cps/helper.py:560
#: cps/helper.py:555
msgid "Upload: "
msgstr "Upload: "
#: cps/helper.py:564
#: cps/helper.py:559
msgid "Unknown Task: "
msgstr "Unbekannte Aufgabe: "
@ -201,7 +201,7 @@ msgstr "Keine Release Informationen verfügbar"
msgid "A new update is available. Click on the button below to update to version: %(version)s"
msgstr "Ein neues Update ist verfügbar. Klicke auf den Button unten, um auf Version: %(version)s zu aktualisieren"
#: cps/updater.py:491 cps/web.py:2766
#: cps/updater.py:491 cps/web.py:2767
msgid "Unknown"
msgstr "Unbekannt"
@ -269,7 +269,7 @@ msgstr "Best bewertete Bücher"
msgid "Random Books"
msgstr "Zufällige Bücher"
#: cps/web.py:1337 cps/web.py:1592 cps/web.py:2135
#: cps/web.py:1337 cps/web.py:1592 cps/web.py:2136
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr "Buch öffnen fehlgeschlagen. Datei existiert nicht, oder ist nicht zugänglich:"
@ -309,7 +309,7 @@ msgstr "Kategorieliste"
msgid "Category: %(name)s"
msgstr "Kategorie: %(name)s"
#: cps/templates/layout.html:71 cps/web.py:1628
#: cps/templates/layout.html:72 cps/web.py:1628
msgid "Tasks"
msgstr "Aufgaben"
@ -319,7 +319,7 @@ msgstr "Statistiken"
#: cps/web.py:1730
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr ""
msgstr "Google Drive setup is nicht komplett, bitte versuche Google Drive zu deaktivieren und aktiviere es anschließend wieder"
#: cps/web.py:1775
msgid "Callback domain is not verified, please follow steps to verify domain in google developer console"
@ -356,395 +356,395 @@ msgid "search"
msgstr "Suche"
#: cps/templates/index.xml:47 cps/templates/index.xml:51
#: cps/templates/layout.html:146 cps/web.py:2094
#: cps/templates/layout.html:147 cps/web.py:2095
msgid "Read Books"
msgstr "Gelesene Bücher"
#: cps/templates/index.xml:55 cps/templates/index.xml:59
#: cps/templates/layout.html:148 cps/web.py:2097
#: cps/templates/layout.html:149 cps/web.py:2098
msgid "Unread Books"
msgstr "Ungelesene Bücher"
#: cps/web.py:2145 cps/web.py:2147 cps/web.py:2149 cps/web.py:2161
#: cps/web.py:2146 cps/web.py:2148 cps/web.py:2150 cps/web.py:2162
msgid "Read a Book"
msgstr "Lese ein Buch"
#: cps/web.py:2220 cps/web.py:3138
#: cps/web.py:2221 cps/web.py:3139
msgid "Please fill out all fields!"
msgstr "Bitte alle Felder ausfüllen!"
#: cps/web.py:2221 cps/web.py:2243 cps/web.py:2247 cps/web.py:2252
#: cps/web.py:2254
#: cps/web.py:2222 cps/web.py:2244 cps/web.py:2248 cps/web.py:2253
#: cps/web.py:2255
msgid "register"
msgstr "Registieren"
#: cps/web.py:2242 cps/web.py:3357
#: cps/web.py:2243 cps/web.py:3358
msgid "An unknown error occurred. Please try again later."
msgstr "Es ist ein unbekannter Fehler aufgetreten. Bitte später erneut versuchen."
#: cps/web.py:2245
#: cps/web.py:2246
msgid "Your e-mail is not allowed to register"
msgstr "Diese E-Mail ist nicht für die Registrierung zugelassen"
#: cps/web.py:2248
#: cps/web.py:2249
msgid "Confirmation e-mail was send to your e-mail account."
msgstr "Eine Bestätigungs E-Mail wurde an den E-Mail Account versendet."
#: cps/web.py:2251
#: cps/web.py:2252
msgid "This username or e-mail address is already in use."
msgstr "Benutzername oder E-Mailadresse ist bereits in Verwendung."
#: cps/web.py:2268 cps/web.py:2364
#: cps/web.py:2269 cps/web.py:2365
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr "Du bist nun eingeloggt als '%(nickname)s'"
#: cps/web.py:2273
#: cps/web.py:2274
msgid "Wrong Username or Password"
msgstr "Falscher Benutzername oder Passwort"
#: cps/web.py:2279 cps/web.py:2300
#: cps/web.py:2280 cps/web.py:2301
msgid "login"
msgstr "Login"
#: cps/web.py:2312 cps/web.py:2343
#: cps/web.py:2313 cps/web.py:2344
msgid "Token not found"
msgstr "Token wurde nicht gefunden"
#: cps/web.py:2320 cps/web.py:2351
#: cps/web.py:2321 cps/web.py:2352
msgid "Token has expired"
msgstr "Das Token ist abgelaufen"
#: cps/web.py:2328
#: cps/web.py:2329
msgid "Success! Please return to your device"
msgstr "Erfolg! Bitte zum Gerät zurückkehren"
#: cps/web.py:2378
#: cps/web.py:2379
msgid "Please configure the SMTP mail settings first..."
msgstr "Bitte zuerst die SMTP Mail Einstellung konfigurieren ..."
#: cps/web.py:2383
#: cps/web.py:2384
#, python-format
msgid "Book successfully queued for sending to %(kindlemail)s"
msgstr "Buch erfolgreich zum Senden an %(kindlemail)s eingereiht"
#: cps/web.py:2387
#: cps/web.py:2388
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr "Beim Senden des Buchs trat ein Fehler auf: %(res)s"
#: cps/web.py:2389 cps/web.py:3191
#: cps/web.py:2390 cps/web.py:3192
msgid "Please configure your kindle e-mail address first..."
msgstr "Bitte zuerst die Kindle E-Mailadresse konfigurieren..."
#: cps/web.py:2400 cps/web.py:2452
#: cps/web.py:2401 cps/web.py:2453
msgid "Invalid shelf specified"
msgstr "Ungültiges Bücherregal angegeben"
#: cps/web.py:2407
#: cps/web.py:2408
#, python-format
msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s"
msgstr "Keine Erlaubnis ein Buch zum Bücherregale %(shelfname)s hinzuzufügen vorhanden"
#: cps/web.py:2415
#: cps/web.py:2416
msgid "You are not allowed to edit public shelves"
msgstr "Keine Erlaubnis öffentliche Bücherregale zu editieren vorhanden"
#: cps/web.py:2424
#: cps/web.py:2425
#, python-format
msgid "Book is already part of the shelf: %(shelfname)s"
msgstr "Buch ist bereits Teil des Bücherregals %(shelfname)s"
#: cps/web.py:2438
#: cps/web.py:2439
#, python-format
msgid "Book has been added to shelf: %(sname)s"
msgstr "Das Buch wurde dem Bücherregal: %(sname)s hinzugefügt"
#: cps/web.py:2457
#: cps/web.py:2458
#, python-format
msgid "You are not allowed to add a book to the the shelf: %(name)s"
msgstr "Keine Erlaubnis ein Buch zum Bücherregal %(name)s hinzuzufügen"
#: cps/web.py:2462
#: cps/web.py:2463
msgid "User is not allowed to edit public shelves"
msgstr "Benutzer hat keine Erlaubnis öffentliche Bücherregale zu editieren"
#: cps/web.py:2480
#: cps/web.py:2481
#, python-format
msgid "Books are already part of the shelf: %(name)s"
msgstr "Bücher sind bereits Teil des Bücherregals %(name)s"
#: cps/web.py:2494
#: cps/web.py:2495
#, python-format
msgid "Books have been added to shelf: %(sname)s"
msgstr "Bücher wurden zum Bücherregal %(sname)s hinzugefügt"
#: cps/web.py:2496
#: cps/web.py:2497
#, python-format
msgid "Could not add books to shelf: %(sname)s"
msgstr "Bücher konnten nicht zum Bücherregal %(sname)s hinzugefügt werden"
#: cps/web.py:2533
#: cps/web.py:2534
#, python-format
msgid "Book has been removed from shelf: %(sname)s"
msgstr "Das Buch wurde aus dem Bücherregal: %(sname)s entfernt"
#: cps/web.py:2539
#: cps/web.py:2540
#, python-format
msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
msgstr "Keine Erlaubnis das Buch aus dem Bücherregal %(sname)s zu entfernen"
#: cps/web.py:2560 cps/web.py:2584
#: cps/web.py:2561 cps/web.py:2585
#, python-format
msgid "A shelf with the name '%(title)s' already exists."
msgstr "Es existiert bereits ein Bücheregal mit dem Titel '%(title)s'."
#: cps/web.py:2565
#: cps/web.py:2566
#, python-format
msgid "Shelf %(title)s created"
msgstr "Bücherregal %(title)s erzeugt"
#: cps/web.py:2567 cps/web.py:2595
#: cps/web.py:2568 cps/web.py:2596
msgid "There was an error"
msgstr "Es trat ein Fehler auf"
#: cps/web.py:2568 cps/web.py:2570
#: cps/web.py:2569 cps/web.py:2571
msgid "create a shelf"
msgstr "Bücherregal erzeugen"
#: cps/web.py:2593
#: cps/web.py:2594
#, python-format
msgid "Shelf %(title)s changed"
msgstr "Bücherregal %(title)s verändert"
#: cps/web.py:2596 cps/web.py:2598
#: cps/web.py:2597 cps/web.py:2599
msgid "Edit a shelf"
msgstr "Bücherregal editieren"
#: cps/web.py:2619
#: cps/web.py:2620
#, python-format
msgid "successfully deleted shelf %(name)s"
msgstr "Bücherregal %(name)s erfolgreich gelöscht"
#: cps/web.py:2646
#: cps/web.py:2647
#, python-format
msgid "Shelf: '%(name)s'"
msgstr "Bücherregal: '%(name)s'"
#: cps/web.py:2649
#: cps/web.py:2650
msgid "Error opening shelf. Shelf does not exist or is not accessible"
msgstr "Fehler beim Öffnen. Bücherregel exisitert nicht oder ist nicht zugänglich"
#: cps/web.py:2680
#: cps/web.py:2681
#, python-format
msgid "Change order of Shelf: '%(name)s'"
msgstr "Reihenfolge in Bücherregal '%(name)s' verändern"
#: cps/web.py:2709 cps/web.py:3144
#: cps/web.py:2710 cps/web.py:3145
msgid "E-mail is not from valid domain"
msgstr "E-Mail ist nicht Teil einer gültigen Domain"
#: cps/web.py:2711 cps/web.py:2753 cps/web.py:2756
#: cps/web.py:2712 cps/web.py:2754 cps/web.py:2757
#, python-format
msgid "%(name)s's profile"
msgstr "%(name)s's Profil"
#: cps/web.py:2751
#: cps/web.py:2752
msgid "Found an existing account for this e-mail address."
msgstr "Es existiert bereits ein Benutzer für diese E-Mailadresse."
#: cps/web.py:2754
#: cps/web.py:2755
msgid "Profile updated"
msgstr "Profil aktualisiert"
#: cps/web.py:2785
#: cps/web.py:2786
msgid "Admin page"
msgstr "Admin Seite"
#: cps/web.py:2867 cps/web.py:3047
#: cps/web.py:2868 cps/web.py:3048
msgid "Calibre-Web configuration updated"
msgstr "Calibre-Web Konfiguration wurde aktualisiert"
#: cps/templates/admin.html:100 cps/web.py:2881
#: cps/templates/admin.html:100 cps/web.py:2882
msgid "UI Configuration"
msgstr "Konfiguration Benutzeroberfläche"
#: cps/web.py:2899
#: cps/web.py:2900
msgid "Import of optional Google Drive requirements missing"
msgstr "Optionale Abhängigkeiten für Google Drive fehlen"
#: cps/web.py:2902
#: cps/web.py:2903
msgid "client_secrets.json is missing or not readable"
msgstr "client_secrets.json nicht vorhanden, oder nicht lesbar"
#: cps/web.py:2907 cps/web.py:2936
#: cps/web.py:2908 cps/web.py:2937
msgid "client_secrets.json is not configured for web application"
msgstr "client_secrets.json nicht als Webapplication konfiguriert"
#: cps/templates/admin.html:99 cps/web.py:2939 cps/web.py:2965 cps/web.py:2977
#: cps/web.py:3022 cps/web.py:3037 cps/web.py:3056 cps/web.py:3064
#: cps/web.py:3080
#: cps/templates/admin.html:99 cps/web.py:2940 cps/web.py:2966 cps/web.py:2978
#: cps/web.py:3023 cps/web.py:3038 cps/web.py:3057 cps/web.py:3065
#: cps/web.py:3081
msgid "Basic Configuration"
msgstr "Basis Konfiguration"
#: cps/web.py:2962
#: cps/web.py:2963
msgid "Keyfile location is not valid, please enter correct path"
msgstr "SSL-Keydatei Speicherort ist ungültig, bitte gültigen Pfad angeben"
#: cps/web.py:2974
#: cps/web.py:2975
msgid "Certfile location is not valid, please enter correct path"
msgstr "SSL-Certdatei Speicherort ist ungültig, bitte gültigen Pfad angeben"
#: cps/web.py:3019
#: cps/web.py:3020
msgid "Logfile location is not valid, please enter correct path"
msgstr "Speicherort Logdatei ist ungültig, bitte Pfad korrigieren"
#: cps/web.py:3060
#: cps/web.py:3061
msgid "DB location is not valid, please enter correct path"
msgstr "DB Speicherort ist ungültig, bitte Pfad korrigieren"
#: cps/templates/admin.html:33 cps/web.py:3140 cps/web.py:3146 cps/web.py:3162
#: cps/templates/admin.html:33 cps/web.py:3141 cps/web.py:3147 cps/web.py:3163
msgid "Add new user"
msgstr "Neuen Benutzer hinzufügen"
#: cps/web.py:3152
#: cps/web.py:3153
#, python-format
msgid "User '%(user)s' created"
msgstr "Benutzer '%(user)s' angelegt"
#: cps/web.py:3156
#: cps/web.py:3157
msgid "Found an existing account for this e-mail address or nickname."
msgstr "Es existiert bereits ein Account für diese E-Mailadresse oder Benutzernamen."
#: cps/web.py:3186
#: cps/web.py:3187
#, python-format
msgid "Test e-mail successfully send to %(kindlemail)s"
msgstr "Test E-Mail wurde erfolgreich an %(kindlemail)s versendet"
#: cps/web.py:3189
#: cps/web.py:3190
#, python-format
msgid "There was an error sending the Test e-mail: %(res)s"
msgstr "Es trat ein Fehler beim Versenden der Test E-Mail auf: %(res)s"
#: cps/web.py:3193
#: cps/web.py:3194
msgid "E-mail server settings updated"
msgstr "E-Mail Server Einstellungen aktualisiert"
#: cps/web.py:3194
#: cps/web.py:3195
msgid "Edit e-mail server settings"
msgstr "E-Mail Server Einstellungen bearbeiten"
#: cps/web.py:3219
#: cps/web.py:3220
#, python-format
msgid "User '%(nick)s' deleted"
msgstr "Benutzer '%(nick)s' gelöscht"
#: cps/web.py:3332
#: cps/web.py:3333
#, python-format
msgid "User '%(nick)s' updated"
msgstr "Benutzer '%(nick)s' aktualisiert"
#: cps/web.py:3335
#: cps/web.py:3336
msgid "An unknown error occured."
msgstr "Es ist ein unbekannter Fehler aufgetreten."
#: cps/web.py:3337
#: cps/web.py:3338
#, python-format
msgid "Edit User %(nick)s"
msgstr "Benutzer %(nick)s bearbeiten"
#: cps/web.py:3354
#: cps/web.py:3355
#, python-format
msgid "Password for user %(user)s reset"
msgstr "Passwort für Benutzer %(user)s wurde zurückgesetzt"
#: cps/web.py:3368 cps/web.py:3574
#: cps/web.py:3369 cps/web.py:3575
msgid "Error opening eBook. File does not exist or file is not accessible"
msgstr "Buch öffnen fehlgeschlagen. Datei existiert nicht, oder ist nicht zugänglich"
#: cps/web.py:3396 cps/web.py:3868
#: cps/web.py:3397
msgid "edit metadata"
msgstr "Metadaten editieren"
#: cps/web.py:3489 cps/web.py:3736
#: cps/web.py:3490 cps/web.py:3737
#, python-format
msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
msgstr "Dateiendung '%(ext)s' kann nicht auf diesen Server hochgeladen werden"
#: cps/web.py:3493 cps/web.py:3740
#: cps/web.py:3494 cps/web.py:3741
msgid "File to be uploaded must have an extension"
msgstr "Dateien müssen eine Erweiterung haben, um hochgeladen zu werden"
#: cps/web.py:3505 cps/web.py:3760
#: cps/web.py:3506 cps/web.py:3761
#, python-format
msgid "Failed to create path %(path)s (Permission denied)."
msgstr "Fehler beim Erzeugen des Pfads %(path)s (Zugriff verweigert)"
#: cps/web.py:3510
#: cps/web.py:3511
#, python-format
msgid "Failed to store file %(file)s."
msgstr "Fehler beim speichern der Datei %(file)s."
#: cps/web.py:3527
#: cps/web.py:3528
#, python-format
msgid "File format %(ext)s added to %(book)s"
msgstr "Dateiformat %(ext)s zu %(book)s hinzugefügt"
#: cps/web.py:3545
#: cps/web.py:3546
#, python-format
msgid "Failed to create path for cover %(path)s (Permission denied)."
msgstr "Fehler beim Erzeugen des Pfads für das Cover %(path)s (Zugriff verweigert)"
#: cps/web.py:3553
#: cps/web.py:3554
#, python-format
msgid "Failed to store cover-file %(cover)s."
msgstr "Fehler beim Speichern des Covers %(cover)s."
#: cps/web.py:3556
#: cps/web.py:3557
msgid "Cover-file is not a valid image file"
msgstr "Cover-Datei ist keine gültige Bilddatei"
#: cps/web.py:3586 cps/web.py:3595
#: cps/web.py:3587 cps/web.py:3596
msgid "unknown"
msgstr "Unbekannt"
#: cps/web.py:3627
#: cps/web.py:3628
msgid "Cover is not a jpg file, can't save"
msgstr "Cover ist keine JPG Datei, konnte nicht gespeichert werden"
#: cps/web.py:3675
#: cps/web.py:3676
#, python-format
msgid "%(langname)s is not a valid language"
msgstr "%(langname)s ist keine gültige Sprache"
#: cps/web.py:3706
#: cps/web.py:3707
msgid "Metadata successfully updated"
msgstr "Metadaten wurden erfolgreich aktualisiert"
#: cps/web.py:3715
#: cps/web.py:3716
msgid "Error editing book, please check logfile for details"
msgstr "Fehler beim Editieren des Buchs, Details im Logfile"
#: cps/web.py:3765
#: cps/web.py:3766
#, python-format
msgid "Failed to store file %(file)s (Permission denied)."
msgstr "Fehler beim speichern der Datei %(file)s (Zugriff verweigert)"
#: cps/web.py:3770
#: cps/web.py:3771
#, python-format
msgid "Failed to delete file %(file)s (Permission denied)."
msgstr "Fehler beim Löschen von Datei %(file)s (Zugriff verweigert)"
#: cps/web.py:3888
#: cps/web.py:3883
msgid "Source or destination format for conversion missing"
msgstr "Quell- oder Zielformat für Konvertierung fehlt"
#: cps/web.py:3898
#: cps/web.py:3893
#, python-format
msgid "Book successfully queued for converting to %(book_format)s"
msgstr "Buch wurde erfolgreich für die Konvertierung in das %(book_format)s Format eingereiht"
#: cps/web.py:3902
#: cps/web.py:3897
#, python-format
msgid "There was an error converting this book: %(res)s"
msgstr "Es trat ein Fehlker beim Konvertieren des Buches auf: %(res)s"
@ -779,7 +779,7 @@ msgstr "Kindle"
msgid "DLS"
msgstr "DLS"
#: cps/templates/admin.html:13 cps/templates/layout.html:74
#: cps/templates/admin.html:13 cps/templates/layout.html:75
msgid "Admin"
msgstr "Admin"
@ -788,7 +788,7 @@ msgstr "Admin"
msgid "Download"
msgstr "Download"
#: cps/templates/admin.html:15 cps/templates/layout.html:64
#: cps/templates/admin.html:15 cps/templates/layout.html:65
msgid "Upload"
msgstr "Hochladen"
@ -989,7 +989,7 @@ msgstr "Beschreibung"
msgid "Tags"
msgstr "Tags"
#: cps/templates/book_edit.html:75 cps/templates/layout.html:157
#: cps/templates/book_edit.html:75 cps/templates/layout.html:158
#: cps/templates/search_form.html:53
msgid "Series"
msgstr "Serien"
@ -1071,7 +1071,7 @@ msgstr "Suchbegriff"
msgid " Search keyword "
msgstr " Suchbegriff "
#: cps/templates/book_edit.html:218 cps/templates/layout.html:46
#: cps/templates/book_edit.html:218 cps/templates/layout.html:47
msgid "Go!"
msgstr "Los!"
@ -1083,7 +1083,7 @@ msgstr "Klicke auf das Bild um die Metadaten zu übertragen"
msgid "Loading..."
msgstr "Lade..."
#: cps/templates/book_edit.html:239 cps/templates/layout.html:224
#: cps/templates/book_edit.html:239 cps/templates/layout.html:225
msgid "Close"
msgstr "Schließen"
@ -1121,7 +1121,7 @@ msgstr "Google Drive authentifizieren"
#: cps/templates/config_edit.html:40
msgid "Please hit submit to continue with setup"
msgstr ""
msgstr "Bitte wähle Abschicken um mit dem Setup fortzufahren "
#: cps/templates/config_edit.html:43
msgid "Please finish Google Drive setup after login"
@ -1251,7 +1251,7 @@ msgstr "Pfad zu Konvertertool"
msgid "Location of Unrar binary"
msgstr "Pfad zum UnRar Programm"
#: cps/templates/config_edit.html:229 cps/templates/layout.html:82
#: cps/templates/config_edit.html:229 cps/templates/layout.html:83
#: cps/templates/login.html:4
msgid "Login"
msgstr "Login"
@ -1260,8 +1260,8 @@ msgstr "Login"
msgid "View Configuration"
msgstr "Ansichtskonfiguration"
#: cps/templates/config_view_edit.html:19 cps/templates/layout.html:133
#: cps/templates/layout.html:134 cps/templates/shelf_edit.html:7
#: cps/templates/config_view_edit.html:19 cps/templates/layout.html:134
#: cps/templates/layout.html:135 cps/templates/shelf_edit.html:7
msgid "Title"
msgstr "Titel"
@ -1473,12 +1473,12 @@ msgstr "Hinzufügen"
msgid "Do you really want to delete this domain rule?"
msgstr "Soll diese Domain Regel wirklich gelöscht werden?"
#: cps/templates/feed.xml:21 cps/templates/layout.html:208
#: cps/templates/feed.xml:21 cps/templates/layout.html:209
msgid "Next"
msgstr "Nächste"
#: cps/templates/feed.xml:33 cps/templates/index.xml:11
#: cps/templates/layout.html:43 cps/templates/layout.html:44
#: cps/templates/layout.html:44 cps/templates/layout.html:45
msgid "Search"
msgstr "Suche"
@ -1494,7 +1494,7 @@ msgstr "Entdecke (Zufälliges Buch)"
msgid "Start"
msgstr "Start"
#: cps/templates/index.xml:18 cps/templates/layout.html:139
#: cps/templates/index.xml:18 cps/templates/layout.html:140
msgid "Hot Books"
msgstr "Beliebte Bücher"
@ -1502,7 +1502,7 @@ msgstr "Beliebte Bücher"
msgid "Popular publications from this catalog based on Downloads."
msgstr "Beliebte Publikationen aus dieser Bibliothek basierend auf Downloadzahlen."
#: cps/templates/index.xml:25 cps/templates/layout.html:142
#: cps/templates/index.xml:25 cps/templates/layout.html:143
msgid "Best rated Books"
msgstr "Best bewertete Bücher"
@ -1522,7 +1522,7 @@ msgstr "Die neuesten Bücher"
msgid "Show Random Books"
msgstr "Zeige zufällige Bücher"
#: cps/templates/index.xml:62 cps/templates/layout.html:160
#: cps/templates/index.xml:62 cps/templates/layout.html:161
msgid "Authors"
msgstr "Autoren"
@ -1530,7 +1530,7 @@ msgstr "Autoren"
msgid "Books ordered by Author"
msgstr "Bücher nach Autoren sortiert"
#: cps/templates/index.xml:69 cps/templates/layout.html:163
#: cps/templates/index.xml:69 cps/templates/layout.html:164
msgid "Publishers"
msgstr "Verleger"
@ -1546,7 +1546,7 @@ msgstr "Bücher nach Kategorien sortiert"
msgid "Books ordered by series"
msgstr "Bücher nach Reihen geordnet"
#: cps/templates/index.xml:90 cps/templates/layout.html:169
#: cps/templates/index.xml:90 cps/templates/layout.html:170
msgid "Public Shelves"
msgstr "Öffentliche Bücherregale"
@ -1554,7 +1554,7 @@ msgstr "Öffentliche Bücherregale"
msgid "Books organized in public shelfs, visible to everyone"
msgstr "Bücher organisiert in öffentlichem Bücherregal, sichtbar für jedermann"
#: cps/templates/index.xml:98 cps/templates/layout.html:173
#: cps/templates/index.xml:98 cps/templates/layout.html:174
msgid "Your Shelves"
msgstr "Deine Bücherregale"
@ -1562,91 +1562,95 @@ msgstr "Deine Bücherregale"
msgid "User's own shelfs, only visible to the current user himself"
msgstr "Persönliches Bücherregal des Benutzers, nur sichtbar für den aktuellen Benutzer"
#: cps/templates/layout.html:33
#: cps/templates/layout.html:34
msgid "Toggle navigation"
msgstr "Nagivation umschalten"
#: cps/templates/layout.html:54
#: cps/templates/layout.html:55
msgid "Advanced Search"
msgstr "Erweiterte Suche"
#: cps/templates/layout.html:78
#: cps/templates/layout.html:79
msgid "Logout"
msgstr "Logout"
#: cps/templates/layout.html:83 cps/templates/register.html:14
#: cps/templates/layout.html:84 cps/templates/register.html:14
msgid "Register"
msgstr "Registrieren"
#: cps/templates/layout.html:108
#: cps/templates/layout.html:110
msgid "Uploading..."
msgstr "Hochladen..."
#: cps/templates/layout.html:109
#: cps/templates/layout.html:111
msgid "please don't refresh the page"
msgstr "Bitte die Seite nicht neu laden"
#: cps/templates/layout.html:120
#: cps/templates/layout.html:121
msgid "Browse"
msgstr "Browsen"
#: cps/templates/layout.html:122
#: cps/templates/layout.html:123
msgid "Recently Added"
msgstr "Kürzlich hinzugefügt"
#: cps/templates/layout.html:127
#: cps/templates/layout.html:128
msgid "Sorted Books"
msgstr "Bücher Sortiert"
#: cps/templates/layout.html:131 cps/templates/layout.html:132
#: cps/templates/layout.html:133 cps/templates/layout.html:134
#: cps/templates/layout.html:132 cps/templates/layout.html:133
#: cps/templates/layout.html:134 cps/templates/layout.html:135
msgid "Sort By"
msgstr "Sortiert nach"
#: cps/templates/layout.html:131
#: cps/templates/layout.html:132
msgid "Newest"
msgstr "Neueste"
#: cps/templates/layout.html:132
#: cps/templates/layout.html:133
msgid "Oldest"
msgstr "Älteste"
#: cps/templates/layout.html:133
#: cps/templates/layout.html:134
msgid "Ascending"
msgstr "Aufsteigend"
#: cps/templates/layout.html:134
#: cps/templates/layout.html:135
msgid "Descending"
msgstr "Absteigend"
#: cps/templates/layout.html:151
#: cps/templates/layout.html:152
msgid "Discover"
msgstr "Entdecke"
#: cps/templates/layout.html:154
#: cps/templates/layout.html:155
msgid "Categories"
msgstr "Kategorien"
#: cps/templates/layout.html:166 cps/templates/search_form.html:74
#: cps/templates/layout.html:167 cps/templates/search_form.html:74
msgid "Languages"
msgstr "Sprachen"
#: cps/templates/layout.html:178
#: cps/templates/layout.html:179
msgid "Create a Shelf"
msgstr "Bücherregal erzeugen"
#: cps/templates/layout.html:179 cps/templates/stats.html:3
#: cps/templates/layout.html:180 cps/templates/stats.html:3
msgid "About"
msgstr "Über"
#: cps/templates/layout.html:193
#: cps/templates/layout.html:194
msgid "Previous"
msgstr "Vorheriger"
#: cps/templates/layout.html:220
#: cps/templates/layout.html:221
msgid "Book Details"
msgstr "Buchdetails"
#: cps/templates/layout.html:255
msgid "Upload done, processing, please wait..."
msgstr "Hochladen beendet, verarbeite Daten, bitte warten..."
#: cps/templates/login.html:8 cps/templates/login.html:9
#: cps/templates/register.html:7 cps/templates/user_edit.html:8
msgid "Username"
@ -1669,12 +1673,12 @@ msgstr "Einloggen mit magischem Link"
msgid "Calibre-Web ebook catalog"
msgstr "Calibre-Web E-Book Katalog"
#: cps/templates/read.html:69 cps/templates/readcbr.html:79
#: cps/templates/read.html:71 cps/templates/readcbr.html:79
#: cps/templates/readcbr.html:103
msgid "Settings"
msgstr "Einstellungen"
#: cps/templates/read.html:72
#: cps/templates/read.html:74
msgid "Reflow text when sidebars are open."
msgstr "Text umbrechen wenn Seitenleiste geöffnet ist."
@ -1962,42 +1966,3 @@ msgstr "Benutzer löschen"
msgid "Recent Downloads"
msgstr "Letzte Downloads"
#~ msgid "Current commit timestamp"
#~ msgstr "Aktuelles Commit Datum"
#~ msgid "Newest commit timestamp"
#~ msgstr "Neuestes Commit Datum"
#~ msgid "Convert: %(book)s"
#~ msgstr "Konvertiere: %(book)s"
#~ msgid "Convert to %(format)s: %(book)s"
#~ msgstr "Konvertiere %(book)s in %(format)s: "
#~ msgid "Files are replaced"
#~ msgstr "Ersetze Dateien"
#~ msgid "Server is stopped"
#~ msgstr "Stoppe Server"
#~ msgid "Convertertool %(converter)s not found"
#~ msgstr "Konvertertool %(converter)s nicht gefunden"
#~ msgid "Choose a password"
#~ msgstr "Wähle ein Passwort"
#~ msgid "Could not find any formats suitable for sending by e-mail"
#~ msgstr "Es konnten keine passenden Formate für das Versenden per E-Mail gefunden werden"
#~ msgid "Author list"
#~ msgstr "Autorenliste"
#~ msgid "File %(file)s uploaded"
#~ msgstr "Datei %(file)s hochgeladen"
#~ msgid "Update done"
#~ msgstr "Update durchgeführt"
#~ msgid "A new update is available. Click on the button below to update to version: "
#~ msgstr "Ein neues Update ist verfügbar. Klicke auf den Button unten, um auf Version: "

@ -401,7 +401,7 @@ class Updater(threading.Thread):
if request_method == "GET":
parents = []
# repository_url = 'https://api.github.com/repos/flatpak/flatpak/releases' # test URL
repository_url = 'https://api.github.com/repos/janeczku/calibre-web/releases'
repository_url = 'https://api.github.com/repos/janeczku/calibre-web/releases?per_page=100'
status, commit = self._load_remote_data(repository_url)
if status['message'] != '':
return json.dumps(status)

@ -1078,7 +1078,7 @@ def advanced_search():
series=series, title=_(u"search"), cc=cc, page="advsearch")
@web.route("/cover/<book_id>")
@web.route("/cover/<int:book_id>")
@login_required_if_no_ano
def get_cover(book_id):
book = db.session.query(db.Books).filter(db.Books.id == book_id).first()
@ -1252,7 +1252,7 @@ def register():
if not config.config_public_reg:
abort(404)
if current_user is not None and current_user.is_authenticated:
return redirect(url_for('index'))
return redirect(url_for('web.index'))
if request.method == "POST":
to_save = request.form.to_dict()
@ -1290,7 +1290,7 @@ def register():
to_save["email"])
return render_title_template('register.html', title=_(u"register"), page="register")
flash(_(u"Confirmation e-mail was send to your e-mail account."), category="success")
return redirect(url_for('login'))
return redirect(url_for('web.login'))
else:
flash(_(u"This username or e-mail address is already in use."), category="error")
return render_title_template('register.html', title=_(u"register"), page="register")

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-02-03 16:21+0100\n"
"POT-Creation-Date: 2019-02-20 20:23+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"
@ -17,8 +17,8 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n"
#: cps/book_formats.py:145 cps/book_formats.py:146 cps/book_formats.py:150
#: cps/book_formats.py:154 cps/converter.py:29 cps/converter.py:45
#: cps/book_formats.py:152 cps/book_formats.py:153 cps/book_formats.py:157
#: cps/book_formats.py:161 cps/converter.py:29 cps/converter.py:45
msgid "not installed"
msgstr ""
@ -30,132 +30,132 @@ msgstr ""
msgid "not configured"
msgstr ""
#: cps/helper.py:77
#: cps/helper.py:72
#, python-format
msgid "%(format)s format not found for book id: %(book)d"
msgstr ""
#: cps/helper.py:89
#: cps/helper.py:84
#, python-format
msgid "%(format)s not found on Google Drive: %(fn)s"
msgstr ""
#: cps/helper.py:96 cps/helper.py:204 cps/templates/detail.html:49
#: cps/helper.py:91 cps/helper.py:199 cps/templates/detail.html:49
msgid "Send to Kindle"
msgstr ""
#: cps/helper.py:97 cps/helper.py:115 cps/helper.py:206
#: cps/helper.py:92 cps/helper.py:110 cps/helper.py:201
msgid "This e-mail has been sent via Calibre-Web."
msgstr ""
#: cps/helper.py:108
#: cps/helper.py:103
#, python-format
msgid "%(format)s not found: %(fn)s"
msgstr ""
#: cps/helper.py:113
#: cps/helper.py:108
msgid "Calibre-Web test e-mail"
msgstr ""
#: cps/helper.py:114
#: cps/helper.py:109
msgid "Test e-mail"
msgstr ""
#: cps/helper.py:130
#: cps/helper.py:125
msgid "Get Started with Calibre-Web"
msgstr ""
#: cps/helper.py:131
#: cps/helper.py:126
#, python-format
msgid "Registration e-mail for user: %(name)s"
msgstr ""
#: cps/helper.py:144 cps/helper.py:146 cps/helper.py:148 cps/helper.py:150
#: cps/helper.py:156 cps/helper.py:158 cps/helper.py:160 cps/helper.py:162
#: cps/helper.py:139 cps/helper.py:141 cps/helper.py:143 cps/helper.py:145
#: cps/helper.py:151 cps/helper.py:153 cps/helper.py:155 cps/helper.py:157
#, python-format
msgid "Send %(format)s to Kindle"
msgstr ""
#: cps/helper.py:166 cps/helper.py:170
#: cps/helper.py:161 cps/helper.py:165
#, python-format
msgid "Convert %(orig)s to %(format)s and send to Kindle"
msgstr ""
#: cps/helper.py:205
#: cps/helper.py:200
#, python-format
msgid "E-mail: %(book)s"
msgstr ""
#: cps/helper.py:208
#: cps/helper.py:203
msgid "The requested file could not be read. Maybe wrong permissions?"
msgstr ""
#: cps/helper.py:313
#: cps/helper.py:308
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr ""
#: cps/helper.py:323
#: cps/helper.py:318
#, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr ""
#: cps/helper.py:337
#: cps/helper.py:332
#, python-format
msgid "Rename file in path '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr ""
#: cps/helper.py:362 cps/helper.py:371
#: cps/helper.py:358 cps/helper.py:368 cps/helper.py:376
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr ""
#: cps/helper.py:402
#: cps/helper.py:397
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr ""
#: cps/helper.py:510
#: cps/helper.py:505
msgid "Error excecuting UnRar"
msgstr ""
#: cps/helper.py:512
#: cps/helper.py:507
msgid "Unrar binary file not found"
msgstr ""
#: cps/helper.py:543
#: cps/helper.py:538
msgid "Waiting"
msgstr ""
#: cps/helper.py:545
#: cps/helper.py:540
msgid "Failed"
msgstr ""
#: cps/helper.py:547
#: cps/helper.py:542
msgid "Started"
msgstr ""
#: cps/helper.py:549
#: cps/helper.py:544
msgid "Finished"
msgstr ""
#: cps/helper.py:551
#: cps/helper.py:546
msgid "Unknown Status"
msgstr ""
#: cps/helper.py:556
#: cps/helper.py:551
msgid "E-mail: "
msgstr ""
#: cps/helper.py:558 cps/helper.py:562
#: cps/helper.py:553 cps/helper.py:557
msgid "Convert: "
msgstr ""
#: cps/helper.py:560
#: cps/helper.py:555
msgid "Upload: "
msgstr ""
#: cps/helper.py:564
#: cps/helper.py:559
msgid "Unknown Task: "
msgstr ""
@ -200,7 +200,7 @@ msgstr ""
msgid "A new update is available. Click on the button below to update to version: %(version)s"
msgstr ""
#: cps/updater.py:491 cps/web.py:2766
#: cps/updater.py:491 cps/web.py:2767
msgid "Unknown"
msgstr ""
@ -268,7 +268,7 @@ msgstr ""
msgid "Random Books"
msgstr ""
#: cps/web.py:1337 cps/web.py:1592 cps/web.py:2135
#: cps/web.py:1337 cps/web.py:1592 cps/web.py:2136
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr ""
@ -308,7 +308,7 @@ msgstr ""
msgid "Category: %(name)s"
msgstr ""
#: cps/templates/layout.html:71 cps/web.py:1628
#: cps/templates/layout.html:72 cps/web.py:1628
msgid "Tasks"
msgstr ""
@ -355,395 +355,395 @@ msgid "search"
msgstr ""
#: cps/templates/index.xml:47 cps/templates/index.xml:51
#: cps/templates/layout.html:146 cps/web.py:2094
#: cps/templates/layout.html:147 cps/web.py:2095
msgid "Read Books"
msgstr ""
#: cps/templates/index.xml:55 cps/templates/index.xml:59
#: cps/templates/layout.html:148 cps/web.py:2097
#: cps/templates/layout.html:149 cps/web.py:2098
msgid "Unread Books"
msgstr ""
#: cps/web.py:2145 cps/web.py:2147 cps/web.py:2149 cps/web.py:2161
#: cps/web.py:2146 cps/web.py:2148 cps/web.py:2150 cps/web.py:2162
msgid "Read a Book"
msgstr ""
#: cps/web.py:2220 cps/web.py:3138
#: cps/web.py:2221 cps/web.py:3139
msgid "Please fill out all fields!"
msgstr ""
#: cps/web.py:2221 cps/web.py:2243 cps/web.py:2247 cps/web.py:2252
#: cps/web.py:2254
#: cps/web.py:2222 cps/web.py:2244 cps/web.py:2248 cps/web.py:2253
#: cps/web.py:2255
msgid "register"
msgstr ""
#: cps/web.py:2242 cps/web.py:3357
#: cps/web.py:2243 cps/web.py:3358
msgid "An unknown error occurred. Please try again later."
msgstr ""
#: cps/web.py:2245
#: cps/web.py:2246
msgid "Your e-mail is not allowed to register"
msgstr ""
#: cps/web.py:2248
#: cps/web.py:2249
msgid "Confirmation e-mail was send to your e-mail account."
msgstr ""
#: cps/web.py:2251
#: cps/web.py:2252
msgid "This username or e-mail address is already in use."
msgstr ""
#: cps/web.py:2268 cps/web.py:2364
#: cps/web.py:2269 cps/web.py:2365
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr ""
#: cps/web.py:2273
#: cps/web.py:2274
msgid "Wrong Username or Password"
msgstr ""
#: cps/web.py:2279 cps/web.py:2300
#: cps/web.py:2280 cps/web.py:2301
msgid "login"
msgstr ""
#: cps/web.py:2312 cps/web.py:2343
#: cps/web.py:2313 cps/web.py:2344
msgid "Token not found"
msgstr ""
#: cps/web.py:2320 cps/web.py:2351
#: cps/web.py:2321 cps/web.py:2352
msgid "Token has expired"
msgstr ""
#: cps/web.py:2328
#: cps/web.py:2329
msgid "Success! Please return to your device"
msgstr ""
#: cps/web.py:2378
#: cps/web.py:2379
msgid "Please configure the SMTP mail settings first..."
msgstr ""
#: cps/web.py:2383
#: cps/web.py:2384
#, python-format
msgid "Book successfully queued for sending to %(kindlemail)s"
msgstr ""
#: cps/web.py:2387
#: cps/web.py:2388
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr ""
#: cps/web.py:2389 cps/web.py:3191
#: cps/web.py:2390 cps/web.py:3192
msgid "Please configure your kindle e-mail address first..."
msgstr ""
#: cps/web.py:2400 cps/web.py:2452
#: cps/web.py:2401 cps/web.py:2453
msgid "Invalid shelf specified"
msgstr ""
#: cps/web.py:2407
#: cps/web.py:2408
#, python-format
msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s"
msgstr ""
#: cps/web.py:2415
#: cps/web.py:2416
msgid "You are not allowed to edit public shelves"
msgstr ""
#: cps/web.py:2424
#: cps/web.py:2425
#, python-format
msgid "Book is already part of the shelf: %(shelfname)s"
msgstr ""
#: cps/web.py:2438
#: cps/web.py:2439
#, python-format
msgid "Book has been added to shelf: %(sname)s"
msgstr ""
#: cps/web.py:2457
#: cps/web.py:2458
#, python-format
msgid "You are not allowed to add a book to the the shelf: %(name)s"
msgstr ""
#: cps/web.py:2462
#: cps/web.py:2463
msgid "User is not allowed to edit public shelves"
msgstr ""
#: cps/web.py:2480
#: cps/web.py:2481
#, python-format
msgid "Books are already part of the shelf: %(name)s"
msgstr ""
#: cps/web.py:2494
#: cps/web.py:2495
#, python-format
msgid "Books have been added to shelf: %(sname)s"
msgstr ""
#: cps/web.py:2496
#: cps/web.py:2497
#, python-format
msgid "Could not add books to shelf: %(sname)s"
msgstr ""
#: cps/web.py:2533
#: cps/web.py:2534
#, python-format
msgid "Book has been removed from shelf: %(sname)s"
msgstr ""
#: cps/web.py:2539
#: cps/web.py:2540
#, python-format
msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
msgstr ""
#: cps/web.py:2560 cps/web.py:2584
#: cps/web.py:2561 cps/web.py:2585
#, python-format
msgid "A shelf with the name '%(title)s' already exists."
msgstr ""
#: cps/web.py:2565
#: cps/web.py:2566
#, python-format
msgid "Shelf %(title)s created"
msgstr ""
#: cps/web.py:2567 cps/web.py:2595
#: cps/web.py:2568 cps/web.py:2596
msgid "There was an error"
msgstr ""
#: cps/web.py:2568 cps/web.py:2570
#: cps/web.py:2569 cps/web.py:2571
msgid "create a shelf"
msgstr ""
#: cps/web.py:2593
#: cps/web.py:2594
#, python-format
msgid "Shelf %(title)s changed"
msgstr ""
#: cps/web.py:2596 cps/web.py:2598
#: cps/web.py:2597 cps/web.py:2599
msgid "Edit a shelf"
msgstr ""
#: cps/web.py:2619
#: cps/web.py:2620
#, python-format
msgid "successfully deleted shelf %(name)s"
msgstr ""
#: cps/web.py:2646
#: cps/web.py:2647
#, python-format
msgid "Shelf: '%(name)s'"
msgstr ""
#: cps/web.py:2649
#: cps/web.py:2650
msgid "Error opening shelf. Shelf does not exist or is not accessible"
msgstr ""
#: cps/web.py:2680
#: cps/web.py:2681
#, python-format
msgid "Change order of Shelf: '%(name)s'"
msgstr ""
#: cps/web.py:2709 cps/web.py:3144
#: cps/web.py:2710 cps/web.py:3145
msgid "E-mail is not from valid domain"
msgstr ""
#: cps/web.py:2711 cps/web.py:2753 cps/web.py:2756
#: cps/web.py:2712 cps/web.py:2754 cps/web.py:2757
#, python-format
msgid "%(name)s's profile"
msgstr ""
#: cps/web.py:2751
#: cps/web.py:2752
msgid "Found an existing account for this e-mail address."
msgstr ""
#: cps/web.py:2754
#: cps/web.py:2755
msgid "Profile updated"
msgstr ""
#: cps/web.py:2785
#: cps/web.py:2786
msgid "Admin page"
msgstr ""
#: cps/web.py:2867 cps/web.py:3047
#: cps/web.py:2868 cps/web.py:3048
msgid "Calibre-Web configuration updated"
msgstr ""
#: cps/templates/admin.html:100 cps/web.py:2881
#: cps/templates/admin.html:100 cps/web.py:2882
msgid "UI Configuration"
msgstr ""
#: cps/web.py:2899
#: cps/web.py:2900
msgid "Import of optional Google Drive requirements missing"
msgstr ""
#: cps/web.py:2902
#: cps/web.py:2903
msgid "client_secrets.json is missing or not readable"
msgstr ""
#: cps/web.py:2907 cps/web.py:2936
#: cps/web.py:2908 cps/web.py:2937
msgid "client_secrets.json is not configured for web application"
msgstr ""
#: cps/templates/admin.html:99 cps/web.py:2939 cps/web.py:2965 cps/web.py:2977
#: cps/web.py:3022 cps/web.py:3037 cps/web.py:3056 cps/web.py:3064
#: cps/web.py:3080
#: cps/templates/admin.html:99 cps/web.py:2940 cps/web.py:2966 cps/web.py:2978
#: cps/web.py:3023 cps/web.py:3038 cps/web.py:3057 cps/web.py:3065
#: cps/web.py:3081
msgid "Basic Configuration"
msgstr ""
#: cps/web.py:2962
#: cps/web.py:2963
msgid "Keyfile location is not valid, please enter correct path"
msgstr ""
#: cps/web.py:2974
#: cps/web.py:2975
msgid "Certfile location is not valid, please enter correct path"
msgstr ""
#: cps/web.py:3019
#: cps/web.py:3020
msgid "Logfile location is not valid, please enter correct path"
msgstr ""
#: cps/web.py:3060
#: cps/web.py:3061
msgid "DB location is not valid, please enter correct path"
msgstr ""
#: cps/templates/admin.html:33 cps/web.py:3140 cps/web.py:3146 cps/web.py:3162
#: cps/templates/admin.html:33 cps/web.py:3141 cps/web.py:3147 cps/web.py:3163
msgid "Add new user"
msgstr ""
#: cps/web.py:3152
#: cps/web.py:3153
#, python-format
msgid "User '%(user)s' created"
msgstr ""
#: cps/web.py:3156
#: cps/web.py:3157
msgid "Found an existing account for this e-mail address or nickname."
msgstr ""
#: cps/web.py:3186
#: cps/web.py:3187
#, python-format
msgid "Test e-mail successfully send to %(kindlemail)s"
msgstr ""
#: cps/web.py:3189
#: cps/web.py:3190
#, python-format
msgid "There was an error sending the Test e-mail: %(res)s"
msgstr ""
#: cps/web.py:3193
#: cps/web.py:3194
msgid "E-mail server settings updated"
msgstr ""
#: cps/web.py:3194
#: cps/web.py:3195
msgid "Edit e-mail server settings"
msgstr ""
#: cps/web.py:3219
#: cps/web.py:3220
#, python-format
msgid "User '%(nick)s' deleted"
msgstr ""
#: cps/web.py:3332
#: cps/web.py:3333
#, python-format
msgid "User '%(nick)s' updated"
msgstr ""
#: cps/web.py:3335
#: cps/web.py:3336
msgid "An unknown error occured."
msgstr ""
#: cps/web.py:3337
#: cps/web.py:3338
#, python-format
msgid "Edit User %(nick)s"
msgstr ""
#: cps/web.py:3354
#: cps/web.py:3355
#, python-format
msgid "Password for user %(user)s reset"
msgstr ""
#: cps/web.py:3368 cps/web.py:3574
#: cps/web.py:3369 cps/web.py:3575
msgid "Error opening eBook. File does not exist or file is not accessible"
msgstr ""
#: cps/web.py:3396 cps/web.py:3868
#: cps/web.py:3397
msgid "edit metadata"
msgstr ""
#: cps/web.py:3489 cps/web.py:3736
#: cps/web.py:3490 cps/web.py:3737
#, python-format
msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
msgstr ""
#: cps/web.py:3493 cps/web.py:3740
#: cps/web.py:3494 cps/web.py:3741
msgid "File to be uploaded must have an extension"
msgstr ""
#: cps/web.py:3505 cps/web.py:3760
#: cps/web.py:3506 cps/web.py:3761
#, python-format
msgid "Failed to create path %(path)s (Permission denied)."
msgstr ""
#: cps/web.py:3510
#: cps/web.py:3511
#, python-format
msgid "Failed to store file %(file)s."
msgstr ""
#: cps/web.py:3527
#: cps/web.py:3528
#, python-format
msgid "File format %(ext)s added to %(book)s"
msgstr ""
#: cps/web.py:3545
#: cps/web.py:3546
#, python-format
msgid "Failed to create path for cover %(path)s (Permission denied)."
msgstr ""
#: cps/web.py:3553
#: cps/web.py:3554
#, python-format
msgid "Failed to store cover-file %(cover)s."
msgstr ""
#: cps/web.py:3556
#: cps/web.py:3557
msgid "Cover-file is not a valid image file"
msgstr ""
#: cps/web.py:3586 cps/web.py:3595
#: cps/web.py:3587 cps/web.py:3596
msgid "unknown"
msgstr ""
#: cps/web.py:3627
#: cps/web.py:3628
msgid "Cover is not a jpg file, can't save"
msgstr ""
#: cps/web.py:3675
#: cps/web.py:3676
#, python-format
msgid "%(langname)s is not a valid language"
msgstr ""
#: cps/web.py:3706
#: cps/web.py:3707
msgid "Metadata successfully updated"
msgstr ""
#: cps/web.py:3715
#: cps/web.py:3716
msgid "Error editing book, please check logfile for details"
msgstr ""
#: cps/web.py:3765
#: cps/web.py:3766
#, python-format
msgid "Failed to store file %(file)s (Permission denied)."
msgstr ""
#: cps/web.py:3770
#: cps/web.py:3771
#, python-format
msgid "Failed to delete file %(file)s (Permission denied)."
msgstr ""
#: cps/web.py:3888
#: cps/web.py:3883
msgid "Source or destination format for conversion missing"
msgstr ""
#: cps/web.py:3898
#: cps/web.py:3893
#, python-format
msgid "Book successfully queued for converting to %(book_format)s"
msgstr ""
#: cps/web.py:3902
#: cps/web.py:3897
#, python-format
msgid "There was an error converting this book: %(res)s"
msgstr ""
@ -778,7 +778,7 @@ msgstr ""
msgid "DLS"
msgstr ""
#: cps/templates/admin.html:13 cps/templates/layout.html:74
#: cps/templates/admin.html:13 cps/templates/layout.html:75
msgid "Admin"
msgstr ""
@ -787,7 +787,7 @@ msgstr ""
msgid "Download"
msgstr ""
#: cps/templates/admin.html:15 cps/templates/layout.html:64
#: cps/templates/admin.html:15 cps/templates/layout.html:65
msgid "Upload"
msgstr ""
@ -988,7 +988,7 @@ msgstr ""
msgid "Tags"
msgstr ""
#: cps/templates/book_edit.html:75 cps/templates/layout.html:157
#: cps/templates/book_edit.html:75 cps/templates/layout.html:158
#: cps/templates/search_form.html:53
msgid "Series"
msgstr ""
@ -1070,7 +1070,7 @@ msgstr ""
msgid " Search keyword "
msgstr ""
#: cps/templates/book_edit.html:218 cps/templates/layout.html:46
#: cps/templates/book_edit.html:218 cps/templates/layout.html:47
msgid "Go!"
msgstr ""
@ -1082,7 +1082,7 @@ msgstr ""
msgid "Loading..."
msgstr ""
#: cps/templates/book_edit.html:239 cps/templates/layout.html:224
#: cps/templates/book_edit.html:239 cps/templates/layout.html:225
msgid "Close"
msgstr ""
@ -1250,7 +1250,7 @@ msgstr ""
msgid "Location of Unrar binary"
msgstr ""
#: cps/templates/config_edit.html:229 cps/templates/layout.html:82
#: cps/templates/config_edit.html:229 cps/templates/layout.html:83
#: cps/templates/login.html:4
msgid "Login"
msgstr ""
@ -1259,8 +1259,8 @@ msgstr ""
msgid "View Configuration"
msgstr ""
#: cps/templates/config_view_edit.html:19 cps/templates/layout.html:133
#: cps/templates/layout.html:134 cps/templates/shelf_edit.html:7
#: cps/templates/config_view_edit.html:19 cps/templates/layout.html:134
#: cps/templates/layout.html:135 cps/templates/shelf_edit.html:7
msgid "Title"
msgstr ""
@ -1472,12 +1472,12 @@ msgstr ""
msgid "Do you really want to delete this domain rule?"
msgstr ""
#: cps/templates/feed.xml:21 cps/templates/layout.html:208
#: cps/templates/feed.xml:21 cps/templates/layout.html:209
msgid "Next"
msgstr ""
#: cps/templates/feed.xml:33 cps/templates/index.xml:11
#: cps/templates/layout.html:43 cps/templates/layout.html:44
#: cps/templates/layout.html:44 cps/templates/layout.html:45
msgid "Search"
msgstr ""
@ -1493,7 +1493,7 @@ msgstr ""
msgid "Start"
msgstr ""
#: cps/templates/index.xml:18 cps/templates/layout.html:139
#: cps/templates/index.xml:18 cps/templates/layout.html:140
msgid "Hot Books"
msgstr ""
@ -1501,7 +1501,7 @@ msgstr ""
msgid "Popular publications from this catalog based on Downloads."
msgstr ""
#: cps/templates/index.xml:25 cps/templates/layout.html:142
#: cps/templates/index.xml:25 cps/templates/layout.html:143
msgid "Best rated Books"
msgstr ""
@ -1521,7 +1521,7 @@ msgstr ""
msgid "Show Random Books"
msgstr ""
#: cps/templates/index.xml:62 cps/templates/layout.html:160
#: cps/templates/index.xml:62 cps/templates/layout.html:161
msgid "Authors"
msgstr ""
@ -1529,7 +1529,7 @@ msgstr ""
msgid "Books ordered by Author"
msgstr ""
#: cps/templates/index.xml:69 cps/templates/layout.html:163
#: cps/templates/index.xml:69 cps/templates/layout.html:164
msgid "Publishers"
msgstr ""
@ -1545,7 +1545,7 @@ msgstr ""
msgid "Books ordered by series"
msgstr ""
#: cps/templates/index.xml:90 cps/templates/layout.html:169
#: cps/templates/index.xml:90 cps/templates/layout.html:170
msgid "Public Shelves"
msgstr ""
@ -1553,7 +1553,7 @@ msgstr ""
msgid "Books organized in public shelfs, visible to everyone"
msgstr ""
#: cps/templates/index.xml:98 cps/templates/layout.html:173
#: cps/templates/index.xml:98 cps/templates/layout.html:174
msgid "Your Shelves"
msgstr ""
@ -1561,91 +1561,95 @@ msgstr ""
msgid "User's own shelfs, only visible to the current user himself"
msgstr ""
#: cps/templates/layout.html:33
#: cps/templates/layout.html:34
msgid "Toggle navigation"
msgstr ""
#: cps/templates/layout.html:54
#: cps/templates/layout.html:55
msgid "Advanced Search"
msgstr ""
#: cps/templates/layout.html:78
#: cps/templates/layout.html:79
msgid "Logout"
msgstr ""
#: cps/templates/layout.html:83 cps/templates/register.html:14
#: cps/templates/layout.html:84 cps/templates/register.html:14
msgid "Register"
msgstr ""
#: cps/templates/layout.html:108
#: cps/templates/layout.html:110
msgid "Uploading..."
msgstr ""
#: cps/templates/layout.html:109
#: cps/templates/layout.html:111
msgid "please don't refresh the page"
msgstr ""
#: cps/templates/layout.html:120
#: cps/templates/layout.html:121
msgid "Browse"
msgstr ""
#: cps/templates/layout.html:122
#: cps/templates/layout.html:123
msgid "Recently Added"
msgstr ""
#: cps/templates/layout.html:127
#: cps/templates/layout.html:128
msgid "Sorted Books"
msgstr ""
#: cps/templates/layout.html:131 cps/templates/layout.html:132
#: cps/templates/layout.html:133 cps/templates/layout.html:134
#: cps/templates/layout.html:132 cps/templates/layout.html:133
#: cps/templates/layout.html:134 cps/templates/layout.html:135
msgid "Sort By"
msgstr ""
#: cps/templates/layout.html:131
#: cps/templates/layout.html:132
msgid "Newest"
msgstr ""
#: cps/templates/layout.html:132
#: cps/templates/layout.html:133
msgid "Oldest"
msgstr ""
#: cps/templates/layout.html:133
#: cps/templates/layout.html:134
msgid "Ascending"
msgstr ""
#: cps/templates/layout.html:134
#: cps/templates/layout.html:135
msgid "Descending"
msgstr ""
#: cps/templates/layout.html:151
#: cps/templates/layout.html:152
msgid "Discover"
msgstr ""
#: cps/templates/layout.html:154
#: cps/templates/layout.html:155
msgid "Categories"
msgstr ""
#: cps/templates/layout.html:166 cps/templates/search_form.html:74
#: cps/templates/layout.html:167 cps/templates/search_form.html:74
msgid "Languages"
msgstr ""
#: cps/templates/layout.html:178
#: cps/templates/layout.html:179
msgid "Create a Shelf"
msgstr ""
#: cps/templates/layout.html:179 cps/templates/stats.html:3
#: cps/templates/layout.html:180 cps/templates/stats.html:3
msgid "About"
msgstr ""
#: cps/templates/layout.html:193
#: cps/templates/layout.html:194
msgid "Previous"
msgstr ""
#: cps/templates/layout.html:220
#: cps/templates/layout.html:221
msgid "Book Details"
msgstr ""
#: cps/templates/layout.html:255
msgid "Upload done, processing, please wait..."
msgstr ""
#: cps/templates/login.html:8 cps/templates/login.html:9
#: cps/templates/register.html:7 cps/templates/user_edit.html:8
msgid "Username"
@ -1668,12 +1672,12 @@ msgstr ""
msgid "Calibre-Web ebook catalog"
msgstr ""
#: cps/templates/read.html:69 cps/templates/readcbr.html:79
#: cps/templates/read.html:71 cps/templates/readcbr.html:79
#: cps/templates/readcbr.html:103
msgid "Settings"
msgstr ""
#: cps/templates/read.html:72
#: cps/templates/read.html:74
msgid "Reflow text when sidebars are open."
msgstr ""

Loading…
Cancel
Save