Update pdf upload
Translation of uploadprogress dialog
pull/836/head
Ozzieisaacs 6 years ago
parent 17b7333992
commit f6fbe2e135

@ -101,7 +101,7 @@ def default_meta(tmp_file_path, original_file_name, original_file_extension):
def pdf_meta(tmp_file_path, original_file_name, original_file_extension): def pdf_meta(tmp_file_path, original_file_name, original_file_extension):
if use_pdf_meta: if use_pdf_meta:
pdf = PdfFileReader(open(tmp_file_path, 'rb')) pdf = PdfFileReader(open(tmp_file_path, 'rb'), strict=False)
doc_info = pdf.getDocumentInfo() doc_info = pdf.getDocumentInfo()
else: else:
doc_info = None doc_info = None

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

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

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

@ -18,7 +18,7 @@
{% if entry.data|length %} {% if entry.data|length %}
<div class="btn-group" role="group"> <div class="btn-group" role="group">
{% if entry.data|length < 2 %} {% if entry.data|length < 2 %}
<button type="button" class="btn btn-primary"> <button id="Download" type="button" class="btn btn-primary">
{{_('Download')}} : {{_('Download')}} :
</button> </button>
{% for format in entry.data %} {% for format in entry.data %}
@ -42,7 +42,7 @@
{% endif %} {% endif %}
{% if g.user.kindle_mail and g.user.is_authenticated and kindle_list %} {% if g.user.kindle_mail and g.user.is_authenticated and kindle_list %}
{% if kindle_list.__len__() == 1 %} {% if kindle_list.__len__() == 1 %}
<a href="{{url_for('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('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 %} {% else %}
<div class="btn-group" role="group"> <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"> <button id="sendbtn2" type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
@ -182,7 +182,7 @@
<p> <p>
<form id="have_read_form" action="{{ url_for('toggle_read', book_id=entry.id)}}" method="POST"> <form id="have_read_form" action="{{ url_for('toggle_read', book_id=entry.id)}}" method="POST">
<label class="block-label"> <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> <span>{{_('Read')}}</span>
</label> </label>
</form> </form>

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

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-Web\n" "Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/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" "PO-Revision-Date: 2019-01-20 19:36+0100\n"
"Last-Translator: Ozzie Isaacs\n" "Last-Translator: Ozzie Isaacs\n"
"Language: de\n" "Language: de\n"
@ -18,8 +18,8 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\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:152 cps/book_formats.py:153 cps/book_formats.py:157
#: cps/book_formats.py:154 cps/converter.py:29 cps/converter.py:45 #: cps/book_formats.py:161 cps/converter.py:29 cps/converter.py:45
msgid "not installed" msgid "not installed"
msgstr "Nicht installiert" msgstr "Nicht installiert"
@ -31,132 +31,132 @@ msgstr "Ausführungsberechtigung nicht vorhanden"
msgid "not configured" msgid "not configured"
msgstr "Nicht konfiguriert" msgstr "Nicht konfiguriert"
#: cps/helper.py:77 #: cps/helper.py:72
#, python-format #, python-format
msgid "%(format)s format not found for book id: %(book)d" msgid "%(format)s format not found for book id: %(book)d"
msgstr "%(format)s Format nicht gefunden bei Buch ID %(book)d" msgstr "%(format)s Format nicht gefunden bei Buch ID %(book)d"
#: cps/helper.py:89 #: cps/helper.py:84
#, python-format #, python-format
msgid "%(format)s not found on Google Drive: %(fn)s" msgid "%(format)s not found on Google Drive: %(fn)s"
msgstr "%(format)s von Buch %(fn)s nicht auf Google Drive gefunden" 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" msgid "Send to Kindle"
msgstr "An Kindle senden" 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." msgid "This e-mail has been sent via Calibre-Web."
msgstr "Diese E-Mail wurde durch Calibre-Web versendet." msgstr "Diese E-Mail wurde durch Calibre-Web versendet."
#: cps/helper.py:108 #: cps/helper.py:103
#, python-format #, python-format
msgid "%(format)s not found: %(fn)s" msgid "%(format)s not found: %(fn)s"
msgstr "%(format)s nicht gefunden: %(fn)s" msgstr "%(format)s nicht gefunden: %(fn)s"
#: cps/helper.py:113 #: cps/helper.py:108
msgid "Calibre-Web test e-mail" msgid "Calibre-Web test e-mail"
msgstr "Calibre-Web Test E-Mail" msgstr "Calibre-Web Test E-Mail"
#: cps/helper.py:114 #: cps/helper.py:109
msgid "Test e-mail" msgid "Test e-mail"
msgstr "Test E-Mail" msgstr "Test E-Mail"
#: cps/helper.py:130 #: cps/helper.py:125
msgid "Get Started with Calibre-Web" msgid "Get Started with Calibre-Web"
msgstr "Loslegen mit Calibre-Web" msgstr "Loslegen mit Calibre-Web"
#: cps/helper.py:131 #: cps/helper.py:126
#, python-format #, python-format
msgid "Registration e-mail for user: %(name)s" msgid "Registration e-mail for user: %(name)s"
msgstr "Registrierungs E-Mail für Benutzer %(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:139 cps/helper.py:141 cps/helper.py:143 cps/helper.py:145
#: cps/helper.py:156 cps/helper.py:158 cps/helper.py:160 cps/helper.py:162 #: cps/helper.py:151 cps/helper.py:153 cps/helper.py:155 cps/helper.py:157
#, python-format #, python-format
msgid "Send %(format)s to Kindle" msgid "Send %(format)s to Kindle"
msgstr "Sende %(format)s an 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 #, python-format
msgid "Convert %(orig)s to %(format)s and send to Kindle" msgid "Convert %(orig)s to %(format)s and send to Kindle"
msgstr "Konvertiere %(orig)s nach %(format)s und sende an Kindle" msgstr "Konvertiere %(orig)s nach %(format)s und sende an Kindle"
#: cps/helper.py:205 #: cps/helper.py:200
#, python-format #, python-format
msgid "E-mail: %(book)s" msgid "E-mail: %(book)s"
msgstr "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?" msgid "The requested file could not be read. Maybe wrong permissions?"
msgstr "Die angeforderte Datei konnte nicht gelesen werden. Evtl. falsche Zugriffsrechte?" msgstr "Die angeforderte Datei konnte nicht gelesen werden. Evtl. falsche Zugriffsrechte?"
#: cps/helper.py:313 #: cps/helper.py:308
#, python-format #, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" 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" msgstr "Umbenennen des Titelpfades '%(src)s' nach '%(dest)s' schlug fehl: %(error)s"
#: cps/helper.py:323 #: cps/helper.py:318
#, python-format #, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" 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" msgstr "Umbenennen des Authorpfades '%(src)s' nach '%(dest)s' schlug fehl: %(error)s"
#: cps/helper.py:337 #: cps/helper.py:332
#, python-format #, python-format
msgid "Rename file in path '%(src)s' to '%(dest)s' failed with error: %(error)s" 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" 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 #, python-format
msgid "File %(file)s not found on Google Drive" msgid "File %(file)s not found on Google Drive"
msgstr "Datei %(file)s wurde nicht auf Google Drive gefunden" msgstr "Datei %(file)s wurde nicht auf Google Drive gefunden"
#: cps/helper.py:402 #: cps/helper.py:397
#, python-format #, python-format
msgid "Book path %(path)s not found on Google Drive" msgid "Book path %(path)s not found on Google Drive"
msgstr "Buchpfad %(path)s wurde nicht auf Google Drive gefunden" msgstr "Buchpfad %(path)s wurde nicht auf Google Drive gefunden"
#: cps/helper.py:510 #: cps/helper.py:505
msgid "Error excecuting UnRar" msgid "Error excecuting UnRar"
msgstr "Fehler bei der Ausführung von UnRar" msgstr "Fehler bei der Ausführung von UnRar"
#: cps/helper.py:512 #: cps/helper.py:507
msgid "Unrar binary file not found" msgid "Unrar binary file not found"
msgstr "UnRar Datei nicht gefunden" msgstr "UnRar Datei nicht gefunden"
#: cps/helper.py:543 #: cps/helper.py:538
msgid "Waiting" msgid "Waiting"
msgstr "Wartend" msgstr "Wartend"
#: cps/helper.py:545 #: cps/helper.py:540
msgid "Failed" msgid "Failed"
msgstr "Fehlgeschlagen" msgstr "Fehlgeschlagen"
#: cps/helper.py:547 #: cps/helper.py:542
msgid "Started" msgid "Started"
msgstr "Gestartet" msgstr "Gestartet"
#: cps/helper.py:549 #: cps/helper.py:544
msgid "Finished" msgid "Finished"
msgstr "Beendet" msgstr "Beendet"
#: cps/helper.py:551 #: cps/helper.py:546
msgid "Unknown Status" msgid "Unknown Status"
msgstr "Unbekannter Status" msgstr "Unbekannter Status"
#: cps/helper.py:556 #: cps/helper.py:551
msgid "E-mail: " msgid "E-mail: "
msgstr "E-Mail: " msgstr "E-Mail: "
#: cps/helper.py:558 cps/helper.py:562 #: cps/helper.py:553 cps/helper.py:557
msgid "Convert: " msgid "Convert: "
msgstr "Konvertiere: " msgstr "Konvertiere: "
#: cps/helper.py:560 #: cps/helper.py:555
msgid "Upload: " msgid "Upload: "
msgstr "Upload: " msgstr "Upload: "
#: cps/helper.py:564 #: cps/helper.py:559
msgid "Unknown Task: " msgid "Unknown Task: "
msgstr "Unbekannte Aufgabe: " 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" 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" 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" msgid "Unknown"
msgstr "Unbekannt" msgstr "Unbekannt"
@ -269,7 +269,7 @@ msgstr "Best bewertete Bücher"
msgid "Random Books" msgid "Random Books"
msgstr "Zufällige Bücher" 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:" 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:" msgstr "Buch öffnen fehlgeschlagen. Datei existiert nicht, oder ist nicht zugänglich:"
@ -309,7 +309,7 @@ msgstr "Kategorieliste"
msgid "Category: %(name)s" msgid "Category: %(name)s"
msgstr "Kategorie: %(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" msgid "Tasks"
msgstr "Aufgaben" msgstr "Aufgaben"
@ -319,7 +319,7 @@ msgstr "Statistiken"
#: cps/web.py:1730 #: cps/web.py:1730
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "" msgstr "Google Drive setup is nicht komplett, bitte versuche Google Drive zu deaktivieren und aktiviere es anschließend wieder"
#: cps/web.py:1775 #: cps/web.py:1775
msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgid "Callback domain is not verified, please follow steps to verify domain in google developer console"
@ -356,395 +356,395 @@ msgid "search"
msgstr "Suche" msgstr "Suche"
#: cps/templates/index.xml:47 cps/templates/index.xml:51 #: 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" msgid "Read Books"
msgstr "Gelesene Bücher" msgstr "Gelesene Bücher"
#: cps/templates/index.xml:55 cps/templates/index.xml:59 #: 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" msgid "Unread Books"
msgstr "Ungelesene Bücher" 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" msgid "Read a Book"
msgstr "Lese ein Buch" 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!" msgid "Please fill out all fields!"
msgstr "Bitte alle Felder ausfüllen!" 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:2222 cps/web.py:2244 cps/web.py:2248 cps/web.py:2253
#: cps/web.py:2254 #: cps/web.py:2255
msgid "register" msgid "register"
msgstr "Registieren" 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." msgid "An unknown error occurred. Please try again later."
msgstr "Es ist ein unbekannter Fehler aufgetreten. Bitte später erneut versuchen." 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" msgid "Your e-mail is not allowed to register"
msgstr "Diese E-Mail ist nicht für die Registrierung zugelassen" 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." msgid "Confirmation e-mail was send to your e-mail account."
msgstr "Eine Bestätigungs E-Mail wurde an den E-Mail Account versendet." 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." msgid "This username or e-mail address is already in use."
msgstr "Benutzername oder E-Mailadresse ist bereits in Verwendung." 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 #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"
msgstr "Du bist nun eingeloggt als '%(nickname)s'" msgstr "Du bist nun eingeloggt als '%(nickname)s'"
#: cps/web.py:2273 #: cps/web.py:2274
msgid "Wrong Username or Password" msgid "Wrong Username or Password"
msgstr "Falscher Benutzername oder Passwort" msgstr "Falscher Benutzername oder Passwort"
#: cps/web.py:2279 cps/web.py:2300 #: cps/web.py:2280 cps/web.py:2301
msgid "login" msgid "login"
msgstr "Login" msgstr "Login"
#: cps/web.py:2312 cps/web.py:2343 #: cps/web.py:2313 cps/web.py:2344
msgid "Token not found" msgid "Token not found"
msgstr "Token wurde nicht gefunden" 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" msgid "Token has expired"
msgstr "Das Token ist abgelaufen" msgstr "Das Token ist abgelaufen"
#: cps/web.py:2328 #: cps/web.py:2329
msgid "Success! Please return to your device" msgid "Success! Please return to your device"
msgstr "Erfolg! Bitte zum Gerät zurückkehren" msgstr "Erfolg! Bitte zum Gerät zurückkehren"
#: cps/web.py:2378 #: cps/web.py:2379
msgid "Please configure the SMTP mail settings first..." msgid "Please configure the SMTP mail settings first..."
msgstr "Bitte zuerst die SMTP Mail Einstellung konfigurieren ..." msgstr "Bitte zuerst die SMTP Mail Einstellung konfigurieren ..."
#: cps/web.py:2383 #: cps/web.py:2384
#, python-format #, python-format
msgid "Book successfully queued for sending to %(kindlemail)s" msgid "Book successfully queued for sending to %(kindlemail)s"
msgstr "Buch erfolgreich zum Senden an %(kindlemail)s eingereiht" msgstr "Buch erfolgreich zum Senden an %(kindlemail)s eingereiht"
#: cps/web.py:2387 #: cps/web.py:2388
#, python-format #, python-format
msgid "There was an error sending this book: %(res)s" msgid "There was an error sending this book: %(res)s"
msgstr "Beim Senden des Buchs trat ein Fehler auf: %(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..." msgid "Please configure your kindle e-mail address first..."
msgstr "Bitte zuerst die Kindle E-Mailadresse konfigurieren..." 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" msgid "Invalid shelf specified"
msgstr "Ungültiges Bücherregal angegeben" msgstr "Ungültiges Bücherregal angegeben"
#: cps/web.py:2407 #: cps/web.py:2408
#, python-format #, python-format
msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s"
msgstr "Keine Erlaubnis ein Buch zum Bücherregale %(shelfname)s hinzuzufügen vorhanden" 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" msgid "You are not allowed to edit public shelves"
msgstr "Keine Erlaubnis öffentliche Bücherregale zu editieren vorhanden" msgstr "Keine Erlaubnis öffentliche Bücherregale zu editieren vorhanden"
#: cps/web.py:2424 #: cps/web.py:2425
#, python-format #, python-format
msgid "Book is already part of the shelf: %(shelfname)s" msgid "Book is already part of the shelf: %(shelfname)s"
msgstr "Buch ist bereits Teil des Bücherregals %(shelfname)s" msgstr "Buch ist bereits Teil des Bücherregals %(shelfname)s"
#: cps/web.py:2438 #: cps/web.py:2439
#, python-format #, python-format
msgid "Book has been added to shelf: %(sname)s" msgid "Book has been added to shelf: %(sname)s"
msgstr "Das Buch wurde dem Bücherregal: %(sname)s hinzugefügt" msgstr "Das Buch wurde dem Bücherregal: %(sname)s hinzugefügt"
#: cps/web.py:2457 #: cps/web.py:2458
#, python-format #, python-format
msgid "You are not allowed to add a book to the the shelf: %(name)s" 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" 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" msgid "User is not allowed to edit public shelves"
msgstr "Benutzer hat keine Erlaubnis öffentliche Bücherregale zu editieren" msgstr "Benutzer hat keine Erlaubnis öffentliche Bücherregale zu editieren"
#: cps/web.py:2480 #: cps/web.py:2481
#, python-format #, python-format
msgid "Books are already part of the shelf: %(name)s" msgid "Books are already part of the shelf: %(name)s"
msgstr "Bücher sind bereits Teil des Bücherregals %(name)s" msgstr "Bücher sind bereits Teil des Bücherregals %(name)s"
#: cps/web.py:2494 #: cps/web.py:2495
#, python-format #, python-format
msgid "Books have been added to shelf: %(sname)s" msgid "Books have been added to shelf: %(sname)s"
msgstr "Bücher wurden zum Bücherregal %(sname)s hinzugefügt" msgstr "Bücher wurden zum Bücherregal %(sname)s hinzugefügt"
#: cps/web.py:2496 #: cps/web.py:2497
#, python-format #, python-format
msgid "Could not add books to shelf: %(sname)s" msgid "Could not add books to shelf: %(sname)s"
msgstr "Bücher konnten nicht zum Bücherregal %(sname)s hinzugefügt werden" msgstr "Bücher konnten nicht zum Bücherregal %(sname)s hinzugefügt werden"
#: cps/web.py:2533 #: cps/web.py:2534
#, python-format #, python-format
msgid "Book has been removed from shelf: %(sname)s" msgid "Book has been removed from shelf: %(sname)s"
msgstr "Das Buch wurde aus dem Bücherregal: %(sname)s entfernt" msgstr "Das Buch wurde aus dem Bücherregal: %(sname)s entfernt"
#: cps/web.py:2539 #: cps/web.py:2540
#, python-format #, python-format
msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" 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" 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 #, python-format
msgid "A shelf with the name '%(title)s' already exists." msgid "A shelf with the name '%(title)s' already exists."
msgstr "Es existiert bereits ein Bücheregal mit dem Titel '%(title)s'." msgstr "Es existiert bereits ein Bücheregal mit dem Titel '%(title)s'."
#: cps/web.py:2565 #: cps/web.py:2566
#, python-format #, python-format
msgid "Shelf %(title)s created" msgid "Shelf %(title)s created"
msgstr "Bücherregal %(title)s erzeugt" 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" msgid "There was an error"
msgstr "Es trat ein Fehler auf" 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" msgid "create a shelf"
msgstr "Bücherregal erzeugen" msgstr "Bücherregal erzeugen"
#: cps/web.py:2593 #: cps/web.py:2594
#, python-format #, python-format
msgid "Shelf %(title)s changed" msgid "Shelf %(title)s changed"
msgstr "Bücherregal %(title)s verändert" 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" msgid "Edit a shelf"
msgstr "Bücherregal editieren" msgstr "Bücherregal editieren"
#: cps/web.py:2619 #: cps/web.py:2620
#, python-format #, python-format
msgid "successfully deleted shelf %(name)s" msgid "successfully deleted shelf %(name)s"
msgstr "Bücherregal %(name)s erfolgreich gelöscht" msgstr "Bücherregal %(name)s erfolgreich gelöscht"
#: cps/web.py:2646 #: cps/web.py:2647
#, python-format #, python-format
msgid "Shelf: '%(name)s'" msgid "Shelf: '%(name)s'"
msgstr "Bücherregal: '%(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" 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" msgstr "Fehler beim Öffnen. Bücherregel exisitert nicht oder ist nicht zugänglich"
#: cps/web.py:2680 #: cps/web.py:2681
#, python-format #, python-format
msgid "Change order of Shelf: '%(name)s'" msgid "Change order of Shelf: '%(name)s'"
msgstr "Reihenfolge in Bücherregal '%(name)s' verändern" 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" msgid "E-mail is not from valid domain"
msgstr "E-Mail ist nicht Teil einer gültigen 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 #, python-format
msgid "%(name)s's profile" msgid "%(name)s's profile"
msgstr "%(name)s's Profil" msgstr "%(name)s's Profil"
#: cps/web.py:2751 #: cps/web.py:2752
msgid "Found an existing account for this e-mail address." msgid "Found an existing account for this e-mail address."
msgstr "Es existiert bereits ein Benutzer für diese E-Mailadresse." msgstr "Es existiert bereits ein Benutzer für diese E-Mailadresse."
#: cps/web.py:2754 #: cps/web.py:2755
msgid "Profile updated" msgid "Profile updated"
msgstr "Profil aktualisiert" msgstr "Profil aktualisiert"
#: cps/web.py:2785 #: cps/web.py:2786
msgid "Admin page" msgid "Admin page"
msgstr "Admin Seite" msgstr "Admin Seite"
#: cps/web.py:2867 cps/web.py:3047 #: cps/web.py:2868 cps/web.py:3048
msgid "Calibre-Web configuration updated" msgid "Calibre-Web configuration updated"
msgstr "Calibre-Web Konfiguration wurde aktualisiert" 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" msgid "UI Configuration"
msgstr "Konfiguration Benutzeroberfläche" msgstr "Konfiguration Benutzeroberfläche"
#: cps/web.py:2899 #: cps/web.py:2900
msgid "Import of optional Google Drive requirements missing" msgid "Import of optional Google Drive requirements missing"
msgstr "Optionale Abhängigkeiten für Google Drive fehlen" 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" msgid "client_secrets.json is missing or not readable"
msgstr "client_secrets.json nicht vorhanden, oder nicht lesbar" 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" msgid "client_secrets.json is not configured for web application"
msgstr "client_secrets.json nicht als Webapplication konfiguriert" 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/templates/admin.html:99 cps/web.py:2940 cps/web.py:2966 cps/web.py:2978
#: cps/web.py:3022 cps/web.py:3037 cps/web.py:3056 cps/web.py:3064 #: cps/web.py:3023 cps/web.py:3038 cps/web.py:3057 cps/web.py:3065
#: cps/web.py:3080 #: cps/web.py:3081
msgid "Basic Configuration" msgid "Basic Configuration"
msgstr "Basis Konfiguration" msgstr "Basis Konfiguration"
#: cps/web.py:2962 #: cps/web.py:2963
msgid "Keyfile location is not valid, please enter correct path" msgid "Keyfile location is not valid, please enter correct path"
msgstr "SSL-Keydatei Speicherort ist ungültig, bitte gültigen Pfad angeben" 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" msgid "Certfile location is not valid, please enter correct path"
msgstr "SSL-Certdatei Speicherort ist ungültig, bitte gültigen Pfad angeben" 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" msgid "Logfile location is not valid, please enter correct path"
msgstr "Speicherort Logdatei ist ungültig, bitte Pfad korrigieren" 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" msgid "DB location is not valid, please enter correct path"
msgstr "DB Speicherort ist ungültig, bitte Pfad korrigieren" 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" msgid "Add new user"
msgstr "Neuen Benutzer hinzufügen" msgstr "Neuen Benutzer hinzufügen"
#: cps/web.py:3152 #: cps/web.py:3153
#, python-format #, python-format
msgid "User '%(user)s' created" msgid "User '%(user)s' created"
msgstr "Benutzer '%(user)s' angelegt" 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." 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." msgstr "Es existiert bereits ein Account für diese E-Mailadresse oder Benutzernamen."
#: cps/web.py:3186 #: cps/web.py:3187
#, python-format #, python-format
msgid "Test e-mail successfully send to %(kindlemail)s" msgid "Test e-mail successfully send to %(kindlemail)s"
msgstr "Test E-Mail wurde erfolgreich an %(kindlemail)s versendet" msgstr "Test E-Mail wurde erfolgreich an %(kindlemail)s versendet"
#: cps/web.py:3189 #: cps/web.py:3190
#, python-format #, python-format
msgid "There was an error sending the Test e-mail: %(res)s" 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" 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" msgid "E-mail server settings updated"
msgstr "E-Mail Server Einstellungen aktualisiert" msgstr "E-Mail Server Einstellungen aktualisiert"
#: cps/web.py:3194 #: cps/web.py:3195
msgid "Edit e-mail server settings" msgid "Edit e-mail server settings"
msgstr "E-Mail Server Einstellungen bearbeiten" msgstr "E-Mail Server Einstellungen bearbeiten"
#: cps/web.py:3219 #: cps/web.py:3220
#, python-format #, python-format
msgid "User '%(nick)s' deleted" msgid "User '%(nick)s' deleted"
msgstr "Benutzer '%(nick)s' gelöscht" msgstr "Benutzer '%(nick)s' gelöscht"
#: cps/web.py:3332 #: cps/web.py:3333
#, python-format #, python-format
msgid "User '%(nick)s' updated" msgid "User '%(nick)s' updated"
msgstr "Benutzer '%(nick)s' aktualisiert" msgstr "Benutzer '%(nick)s' aktualisiert"
#: cps/web.py:3335 #: cps/web.py:3336
msgid "An unknown error occured." msgid "An unknown error occured."
msgstr "Es ist ein unbekannter Fehler aufgetreten." msgstr "Es ist ein unbekannter Fehler aufgetreten."
#: cps/web.py:3337 #: cps/web.py:3338
#, python-format #, python-format
msgid "Edit User %(nick)s" msgid "Edit User %(nick)s"
msgstr "Benutzer %(nick)s bearbeiten" msgstr "Benutzer %(nick)s bearbeiten"
#: cps/web.py:3354 #: cps/web.py:3355
#, python-format #, python-format
msgid "Password for user %(user)s reset" msgid "Password for user %(user)s reset"
msgstr "Passwort für Benutzer %(user)s wurde zurückgesetzt" 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" 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" 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" msgid "edit metadata"
msgstr "Metadaten editieren" msgstr "Metadaten editieren"
#: cps/web.py:3489 cps/web.py:3736 #: cps/web.py:3490 cps/web.py:3737
#, python-format #, python-format
msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" 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" 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" msgid "File to be uploaded must have an extension"
msgstr "Dateien müssen eine Erweiterung haben, um hochgeladen zu werden" 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 #, python-format
msgid "Failed to create path %(path)s (Permission denied)." msgid "Failed to create path %(path)s (Permission denied)."
msgstr "Fehler beim Erzeugen des Pfads %(path)s (Zugriff verweigert)" msgstr "Fehler beim Erzeugen des Pfads %(path)s (Zugriff verweigert)"
#: cps/web.py:3510 #: cps/web.py:3511
#, python-format #, python-format
msgid "Failed to store file %(file)s." msgid "Failed to store file %(file)s."
msgstr "Fehler beim speichern der Datei %(file)s." msgstr "Fehler beim speichern der Datei %(file)s."
#: cps/web.py:3527 #: cps/web.py:3528
#, python-format #, python-format
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "Dateiformat %(ext)s zu %(book)s hinzugefügt" msgstr "Dateiformat %(ext)s zu %(book)s hinzugefügt"
#: cps/web.py:3545 #: cps/web.py:3546
#, python-format #, python-format
msgid "Failed to create path for cover %(path)s (Permission denied)." 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)" msgstr "Fehler beim Erzeugen des Pfads für das Cover %(path)s (Zugriff verweigert)"
#: cps/web.py:3553 #: cps/web.py:3554
#, python-format #, python-format
msgid "Failed to store cover-file %(cover)s." msgid "Failed to store cover-file %(cover)s."
msgstr "Fehler beim Speichern des Covers %(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" msgid "Cover-file is not a valid image file"
msgstr "Cover-Datei ist keine gültige Bilddatei" 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" msgid "unknown"
msgstr "Unbekannt" msgstr "Unbekannt"
#: cps/web.py:3627 #: cps/web.py:3628
msgid "Cover is not a jpg file, can't save" msgid "Cover is not a jpg file, can't save"
msgstr "Cover ist keine JPG Datei, konnte nicht gespeichert werden" msgstr "Cover ist keine JPG Datei, konnte nicht gespeichert werden"
#: cps/web.py:3675 #: cps/web.py:3676
#, python-format #, python-format
msgid "%(langname)s is not a valid language" msgid "%(langname)s is not a valid language"
msgstr "%(langname)s ist keine gültige Sprache" msgstr "%(langname)s ist keine gültige Sprache"
#: cps/web.py:3706 #: cps/web.py:3707
msgid "Metadata successfully updated" msgid "Metadata successfully updated"
msgstr "Metadaten wurden erfolgreich aktualisiert" msgstr "Metadaten wurden erfolgreich aktualisiert"
#: cps/web.py:3715 #: cps/web.py:3716
msgid "Error editing book, please check logfile for details" msgid "Error editing book, please check logfile for details"
msgstr "Fehler beim Editieren des Buchs, Details im Logfile" msgstr "Fehler beim Editieren des Buchs, Details im Logfile"
#: cps/web.py:3765 #: cps/web.py:3766
#, python-format #, python-format
msgid "Failed to store file %(file)s (Permission denied)." msgid "Failed to store file %(file)s (Permission denied)."
msgstr "Fehler beim speichern der Datei %(file)s (Zugriff verweigert)" msgstr "Fehler beim speichern der Datei %(file)s (Zugriff verweigert)"
#: cps/web.py:3770 #: cps/web.py:3771
#, python-format #, python-format
msgid "Failed to delete file %(file)s (Permission denied)." msgid "Failed to delete file %(file)s (Permission denied)."
msgstr "Fehler beim Löschen von Datei %(file)s (Zugriff verweigert)" 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" msgid "Source or destination format for conversion missing"
msgstr "Quell- oder Zielformat für Konvertierung fehlt" msgstr "Quell- oder Zielformat für Konvertierung fehlt"
#: cps/web.py:3898 #: cps/web.py:3893
#, python-format #, python-format
msgid "Book successfully queued for converting to %(book_format)s" 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" 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 #, python-format
msgid "There was an error converting this book: %(res)s" msgid "There was an error converting this book: %(res)s"
msgstr "Es trat ein Fehlker beim Konvertieren des Buches auf: %(res)s" msgstr "Es trat ein Fehlker beim Konvertieren des Buches auf: %(res)s"
@ -779,7 +779,7 @@ msgstr "Kindle"
msgid "DLS" msgid "DLS"
msgstr "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" msgid "Admin"
msgstr "Admin" msgstr "Admin"
@ -788,7 +788,7 @@ msgstr "Admin"
msgid "Download" msgid "Download"
msgstr "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" msgid "Upload"
msgstr "Hochladen" msgstr "Hochladen"
@ -989,7 +989,7 @@ msgstr "Beschreibung"
msgid "Tags" msgid "Tags"
msgstr "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 #: cps/templates/search_form.html:53
msgid "Series" msgid "Series"
msgstr "Serien" msgstr "Serien"
@ -1071,7 +1071,7 @@ msgstr "Suchbegriff"
msgid " Search keyword " msgid " Search keyword "
msgstr " Suchbegriff " 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!" msgid "Go!"
msgstr "Los!" msgstr "Los!"
@ -1083,7 +1083,7 @@ msgstr "Klicke auf das Bild um die Metadaten zu übertragen"
msgid "Loading..." msgid "Loading..."
msgstr "Lade..." 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" msgid "Close"
msgstr "Schließen" msgstr "Schließen"
@ -1121,7 +1121,7 @@ msgstr "Google Drive authentifizieren"
#: cps/templates/config_edit.html:40 #: cps/templates/config_edit.html:40
msgid "Please hit submit to continue with setup" 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 #: cps/templates/config_edit.html:43
msgid "Please finish Google Drive setup after login" msgid "Please finish Google Drive setup after login"
@ -1251,7 +1251,7 @@ msgstr "Pfad zu Konvertertool"
msgid "Location of Unrar binary" msgid "Location of Unrar binary"
msgstr "Pfad zum UnRar Programm" 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 #: cps/templates/login.html:4
msgid "Login" msgid "Login"
msgstr "Login" msgstr "Login"
@ -1260,8 +1260,8 @@ msgstr "Login"
msgid "View Configuration" msgid "View Configuration"
msgstr "Ansichtskonfiguration" msgstr "Ansichtskonfiguration"
#: cps/templates/config_view_edit.html:19 cps/templates/layout.html:133 #: cps/templates/config_view_edit.html:19 cps/templates/layout.html:134
#: cps/templates/layout.html:134 cps/templates/shelf_edit.html:7 #: cps/templates/layout.html:135 cps/templates/shelf_edit.html:7
msgid "Title" msgid "Title"
msgstr "Titel" msgstr "Titel"
@ -1473,12 +1473,12 @@ msgstr "Hinzufügen"
msgid "Do you really want to delete this domain rule?" msgid "Do you really want to delete this domain rule?"
msgstr "Soll diese Domain Regel wirklich gelöscht werden?" 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" msgid "Next"
msgstr "Nächste" msgstr "Nächste"
#: cps/templates/feed.xml:33 cps/templates/index.xml:11 #: 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" msgid "Search"
msgstr "Suche" msgstr "Suche"
@ -1494,7 +1494,7 @@ msgstr "Entdecke (Zufälliges Buch)"
msgid "Start" msgid "Start"
msgstr "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" msgid "Hot Books"
msgstr "Beliebte Bücher" msgstr "Beliebte Bücher"
@ -1502,7 +1502,7 @@ msgstr "Beliebte Bücher"
msgid "Popular publications from this catalog based on Downloads." msgid "Popular publications from this catalog based on Downloads."
msgstr "Beliebte Publikationen aus dieser Bibliothek basierend auf Downloadzahlen." 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" msgid "Best rated Books"
msgstr "Best bewertete Bücher" msgstr "Best bewertete Bücher"
@ -1522,7 +1522,7 @@ msgstr "Die neuesten Bücher"
msgid "Show Random Books" msgid "Show Random Books"
msgstr "Zeige zufällige Bücher" 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" msgid "Authors"
msgstr "Autoren" msgstr "Autoren"
@ -1530,7 +1530,7 @@ msgstr "Autoren"
msgid "Books ordered by Author" msgid "Books ordered by Author"
msgstr "Bücher nach Autoren sortiert" 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" msgid "Publishers"
msgstr "Verleger" msgstr "Verleger"
@ -1546,7 +1546,7 @@ msgstr "Bücher nach Kategorien sortiert"
msgid "Books ordered by series" msgid "Books ordered by series"
msgstr "Bücher nach Reihen geordnet" 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" msgid "Public Shelves"
msgstr "Öffentliche Bücherregale" msgstr "Öffentliche Bücherregale"
@ -1554,7 +1554,7 @@ msgstr "Öffentliche Bücherregale"
msgid "Books organized in public shelfs, visible to everyone" msgid "Books organized in public shelfs, visible to everyone"
msgstr "Bücher organisiert in öffentlichem Bücherregal, sichtbar für jedermann" 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" msgid "Your Shelves"
msgstr "Deine Bücherregale" msgstr "Deine Bücherregale"
@ -1562,91 +1562,95 @@ msgstr "Deine Bücherregale"
msgid "User's own shelfs, only visible to the current user himself" 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" 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" msgid "Toggle navigation"
msgstr "Nagivation umschalten" msgstr "Nagivation umschalten"
#: cps/templates/layout.html:54 #: cps/templates/layout.html:55
msgid "Advanced Search" msgid "Advanced Search"
msgstr "Erweiterte Suche" msgstr "Erweiterte Suche"
#: cps/templates/layout.html:78 #: cps/templates/layout.html:79
msgid "Logout" msgid "Logout"
msgstr "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" msgid "Register"
msgstr "Registrieren" msgstr "Registrieren"
#: cps/templates/layout.html:108 #: cps/templates/layout.html:110
msgid "Uploading..." msgid "Uploading..."
msgstr "Hochladen..." msgstr "Hochladen..."
#: cps/templates/layout.html:109 #: cps/templates/layout.html:111
msgid "please don't refresh the page" msgid "please don't refresh the page"
msgstr "Bitte die Seite nicht neu laden" msgstr "Bitte die Seite nicht neu laden"
#: cps/templates/layout.html:120 #: cps/templates/layout.html:121
msgid "Browse" msgid "Browse"
msgstr "Browsen" msgstr "Browsen"
#: cps/templates/layout.html:122 #: cps/templates/layout.html:123
msgid "Recently Added" msgid "Recently Added"
msgstr "Kürzlich hinzugefügt" msgstr "Kürzlich hinzugefügt"
#: cps/templates/layout.html:127 #: cps/templates/layout.html:128
msgid "Sorted Books" msgid "Sorted Books"
msgstr "Bücher Sortiert" msgstr "Bücher Sortiert"
#: cps/templates/layout.html:131 cps/templates/layout.html:132 #: cps/templates/layout.html:132 cps/templates/layout.html:133
#: cps/templates/layout.html:133 cps/templates/layout.html:134 #: cps/templates/layout.html:134 cps/templates/layout.html:135
msgid "Sort By" msgid "Sort By"
msgstr "Sortiert nach" msgstr "Sortiert nach"
#: cps/templates/layout.html:131 #: cps/templates/layout.html:132
msgid "Newest" msgid "Newest"
msgstr "Neueste" msgstr "Neueste"
#: cps/templates/layout.html:132 #: cps/templates/layout.html:133
msgid "Oldest" msgid "Oldest"
msgstr "Älteste" msgstr "Älteste"
#: cps/templates/layout.html:133 #: cps/templates/layout.html:134
msgid "Ascending" msgid "Ascending"
msgstr "Aufsteigend" msgstr "Aufsteigend"
#: cps/templates/layout.html:134 #: cps/templates/layout.html:135
msgid "Descending" msgid "Descending"
msgstr "Absteigend" msgstr "Absteigend"
#: cps/templates/layout.html:151 #: cps/templates/layout.html:152
msgid "Discover" msgid "Discover"
msgstr "Entdecke" msgstr "Entdecke"
#: cps/templates/layout.html:154 #: cps/templates/layout.html:155
msgid "Categories" msgid "Categories"
msgstr "Kategorien" 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" msgid "Languages"
msgstr "Sprachen" msgstr "Sprachen"
#: cps/templates/layout.html:178 #: cps/templates/layout.html:179
msgid "Create a Shelf" msgid "Create a Shelf"
msgstr "Bücherregal erzeugen" 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" msgid "About"
msgstr "Über" msgstr "Über"
#: cps/templates/layout.html:193 #: cps/templates/layout.html:194
msgid "Previous" msgid "Previous"
msgstr "Vorheriger" msgstr "Vorheriger"
#: cps/templates/layout.html:220 #: cps/templates/layout.html:221
msgid "Book Details" msgid "Book Details"
msgstr "Buchdetails" 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/login.html:8 cps/templates/login.html:9
#: cps/templates/register.html:7 cps/templates/user_edit.html:8 #: cps/templates/register.html:7 cps/templates/user_edit.html:8
msgid "Username" msgid "Username"
@ -1669,12 +1673,12 @@ msgstr "Einloggen mit magischem Link"
msgid "Calibre-Web ebook catalog" msgid "Calibre-Web ebook catalog"
msgstr "Calibre-Web E-Book Katalog" 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 #: cps/templates/readcbr.html:103
msgid "Settings" msgid "Settings"
msgstr "Einstellungen" msgstr "Einstellungen"
#: cps/templates/read.html:72 #: cps/templates/read.html:74
msgid "Reflow text when sidebars are open." msgid "Reflow text when sidebars are open."
msgstr "Text umbrechen wenn Seitenleiste geöffnet ist." msgstr "Text umbrechen wenn Seitenleiste geöffnet ist."
@ -1962,42 +1966,3 @@ msgstr "Benutzer löschen"
msgid "Recent Downloads" msgid "Recent Downloads"
msgstr "Letzte 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: "

@ -2027,7 +2027,7 @@ def advanced_search():
series=series, title=_(u"search"), cc=cc, page="advsearch") series=series, title=_(u"search"), cc=cc, page="advsearch")
@app.route("/cover/<book_id>") @app.route("/cover/<int:book_id>")
@login_required_if_no_ano @login_required_if_no_ano
def get_cover(book_id): def get_cover(book_id):
book = db.session.query(db.Books).filter(db.Books.id == book_id).first() book = db.session.query(db.Books).filter(db.Books.id == book_id).first()
@ -3851,7 +3851,7 @@ def upload():
gdriveutils.updateGdriveCalibreFromLocal() gdriveutils.updateGdriveCalibreFromLocal()
if error: if error:
flash(error, category="error") flash(error, category="error")
uploadText=(u"File %s" % book.title) uploadText=_(u"File %(title)s", title=book.title)
helper.global_WorkerThread.add_upload(current_user.nickname, helper.global_WorkerThread.add_upload(current_user.nickname,
"<a href=\"" + url_for('show_book', book_id=book.id) + "\">" + uploadText + "</a>") "<a href=\"" + url_for('show_book', book_id=book.id) + "\">" + uploadText + "</a>")

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

Loading…
Cancel
Save