From 47625a616d3f02387be242e671d8668bfe402a4a Mon Sep 17 00:00:00 2001 From: AsukaVuuyn <1346007099@qq.com> Date: Fri, 20 Feb 2026 21:45:49 +0800 Subject: [PATCH 1/5] fix: support native UTF-8 downloaded filenames for browsers --- cps/helper.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cps/helper.py b/cps/helper.py index 8cd7b4518d..f85e6fa173 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -1091,8 +1091,13 @@ def get_download_link(book_id, book_format, client): file_name = book.title if len(book.authors) > 0: file_name = file_name + ' - ' + book.authors[0].name + original_name = file_name file_name = get_valid_filename(file_name, replace_whitespace=False, force_unidecode=True) - quoted_file_name = file_name if client == "kindle" else quote(file_name) + if client == "kindle": + quoted_file_name = file_name + else: + native_name = get_valid_filename(original_name, replace_whitespace=False, force_unidecode=False) + quoted_file_name = quote(native_name) headers = Headers() headers["Content-Type"] = mimetypes.types_map.get('.' + book_format, "application/octet-stream") headers["Content-Disposition"] = ('attachment; filename="{}.{}"; filename*=UTF-8\'\'{}.{}').format( From 6157f5027c979aa05f8d97a09f1388ceb3085ac5 Mon Sep 17 00:00:00 2001 From: jarynclouatre Date: Sun, 1 Mar 2026 00:34:56 -0600 Subject: [PATCH 2/5] Update search_metadata.py Fix TypeError when metadata provider returns None --- cps/search_metadata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cps/search_metadata.py b/cps/search_metadata.py index ae3c9faf91..da7ac83242 100644 --- a/cps/search_metadata.py +++ b/cps/search_metadata.py @@ -135,5 +135,5 @@ def metadata_search(): if active.get(c.__id__, True) } for future in concurrent.futures.as_completed(meta): - data.extend([asdict(x) for x in future.result() if x]) + data.extend([asdict(x) for x in (future.result() or []) if x]) return make_response(jsonify(data)) From 2d4ca23d0c609fda516dd35cb428597f51d21049 Mon Sep 17 00:00:00 2001 From: jarynclouatre Date: Sun, 1 Mar 2026 18:19:40 -0600 Subject: [PATCH 3/5] Kobo: include PriorityTimestamp in PUT /state response Kobo: include PriorityTimestamp in PUT /state response --- cps/kobo.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cps/kobo.py b/cps/kobo.py index aa043503b9..7aaa587e3b 100644 --- a/cps/kobo.py +++ b/cps/kobo.py @@ -811,6 +811,8 @@ def HandleStateRequest(book_uuid): ub.session.merge(kobo_reading_state) ub.session_commit() + update_results_response["LastModified"] = convert_to_kobo_timestamp_string(kobo_reading_state.last_modified) + update_results_response["PriorityTimestamp"] = convert_to_kobo_timestamp_string(kobo_reading_state.priority_timestamp) return jsonify({ "RequestResult": "Success", "UpdateResults": [update_results_response], From 1134f54be496e1388401aaa088b6351d86572b9f Mon Sep 17 00:00:00 2001 From: jarynclouatre Date: Sun, 1 Mar 2026 20:44:05 -0600 Subject: [PATCH 4/5] fix: series list view sorts by name instead of sort field In series_list(), the SQLite query correctly orders results by Series.sort, but a subsequent Python sorted() call (needed to re-order after appending the "None" category entry) was using Series.name as the sort key instead of Series.sort. This caused series titles with leading articles (A, An, The) to sort strictly alphabetically by the article rather than by the meaningful word, e.g. "A Collins-Burke Mystery" appeared under "A" instead of "C". Fix by using Series.sort (with a fallback to Series.name if sort is NULL) as the key in the Python re-sort, consistent with the intent of the existing DB query. Fixes #3583 --- cps/web.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cps/web.py b/cps/web.py index 961e1df7f0..99fb362a26 100644 --- a/cps/web.py +++ b/cps/web.py @@ -1026,7 +1026,7 @@ def series_list(): .count()) if no_series_count: entries.append([db.Category(_("None"), "-1"), no_series_count]) - entries = sorted(entries, key=lambda x: x[0].name.lower(), reverse=not order_no) + entries = sorted(entries, key=lambda x: (x[0].sort or x[0].name).lower(), reverse=not order_no) return render_title_template('list.html', entries=entries, folder='web.books_list', From efbdd0b6e3d2b0c603d5788044ca7447915d86cf Mon Sep 17 00:00:00 2001 From: mapi68 <41143572+mapi68@users.noreply.github.com> Date: Thu, 5 Mar 2026 06:44:48 +0100 Subject: [PATCH 5/5] Update italian messages.po --- cps/translations/it/LC_MESSAGES/messages.po | 447 ++++++++++++++------ 1 file changed, 319 insertions(+), 128 deletions(-) diff --git a/cps/translations/it/LC_MESSAGES/messages.po b/cps/translations/it/LC_MESSAGES/messages.po index 7c6b2bb66e..b24efb859b 100644 --- a/cps/translations/it/LC_MESSAGES/messages.po +++ b/cps/translations/it/LC_MESSAGES/messages.po @@ -8,15 +8,16 @@ msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n" -"PO-Revision-Date: 2026-01-04 02:22+0100\n" +"PO-Revision-Date: 2026-03-05 06:42+0100\n" "Last-Translator: Massimo Pissarello \n" -"Language: it\n" "Language-Team: Italian <>\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: it\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" +"Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Generated-By: Babel 2.13.1\n" +"X-Generator: Lokalize 25.12.3\n" #: cps/about.py:85 msgid "Statistics" @@ -39,8 +40,11 @@ msgid "Unknown command" msgstr "Comando sconosciuto" #: cps/admin.py:175 -msgid "Success! Books queued for Metadata Backup, please check Tasks for result" -msgstr "Tutto OK! Libri in coda per il backup dei metadati, controlla le attività per il risultato" +msgid "" +"Success! Books queued for Metadata Backup, please check Tasks for result" +msgstr "" +"Tutto OK! Libri in coda per il backup dei metadati, controlla le attività " +"per il risultato" #: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 #: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 @@ -64,7 +68,8 @@ msgstr "Configurazione dell'interfaccia utente" #: cps/web.py:753 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" -msgstr "La colonna personalizzata no.%(column)d non esiste nel database di Calibre" +msgstr "" +"La colonna personalizzata no.%(column)d non esiste nel database di Calibre" #: cps/admin.py:333 cps/templates/admin.html:51 msgid "Edit Users" @@ -103,7 +108,9 @@ msgstr "L'utente Guest (ospite) non può avere questo ruolo" #: cps/admin.py:500 cps/admin.py:2031 msgid "No admin user remaining, can't remove admin role" -msgstr "Non rimarrebbe nessun utente amministratore, non è possibile rimuovere il ruolo di amministratore" +msgstr "" +"Non rimarrebbe nessun utente amministratore, non è possibile rimuovere il " +"ruolo di amministratore" #: cps/admin.py:504 cps/admin.py:518 msgid "Value has to be true or false" @@ -123,7 +130,9 @@ msgstr "Visualizzazione non valida" #: cps/admin.py:523 msgid "Guest's Locale is determined automatically and can't be set" -msgstr "Le impostazioni locali dell'utente Guest (ospite) sono determinate automaticamente e non possono essere configurate" +msgstr "" +"Le impostazioni locali dell'utente Guest (ospite) sono determinate " +"automaticamente e non possono essere configurate" #: cps/admin.py:527 msgid "No Valid Locale Given" @@ -172,47 +181,77 @@ msgstr "Sei sicuro di voler eliminare questo scaffale?" #: cps/admin.py:625 msgid "Are you sure you want to change locales of selected user(s)?" -msgstr "Sei sicuro di voler cambiare le impostazioni internazionali degli utenti selezionati?" +msgstr "" +"Sei sicuro di voler cambiare le impostazioni internazionali degli utenti " +"selezionati?" #: cps/admin.py:627 -msgid "Are you sure you want to change visible book languages for selected user(s)?" -msgstr "Sei sicuro di voler cambiare le lingue visibili del libro per gli utenti selezionati?" +msgid "" +"Are you sure you want to change visible book languages for selected user(s)?" +msgstr "" +"Sei sicuro di voler cambiare le lingue visibili del libro per gli utenti " +"selezionati?" #: cps/admin.py:629 -msgid "Are you sure you want to change the selected role for the selected user(s)?" -msgstr "Sei sicuro di voler cambiare il ruolo selezionato per gli utenti selezionati?" +msgid "" +"Are you sure you want to change the selected role for the selected user(s)?" +msgstr "" +"Sei sicuro di voler cambiare il ruolo selezionato per gli utenti selezionati?" #: cps/admin.py:631 -msgid "Are you sure you want to change the archive status for the selected book(s)?" -msgstr "Sei sicuro di voler cambiare lo stato dell'archivio per i libri selezionati?" +msgid "" +"Are you sure you want to change the archive status for the selected book(s)?" +msgstr "" +"Sei sicuro di voler cambiare lo stato dell'archivio per i libri selezionati?" #: cps/admin.py:633 -msgid "Are you sure you want to change the read status for the selected book(s)?" -msgstr "Sei sicuro di voler cambiare lo stato di lettura per i libri selezionati?" +msgid "" +"Are you sure you want to change the read status for the selected book(s)?" +msgstr "" +"Sei sicuro di voler cambiare lo stato di lettura per i libri selezionati?" #: cps/admin.py:635 -msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" -msgstr "Sei sicuro di voler cambiare le restrizioni selezionate per gli utenti selezionati?" +msgid "" +"Are you sure you want to change the selected restrictions for the selected " +"user(s)?" +msgstr "" +"Sei sicuro di voler cambiare le restrizioni selezionate per gli utenti " +"selezionati?" #: cps/admin.py:637 -msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" -msgstr "Sei sicuro di voler cambiare le restrizioni di visibilità selezionate per gli utenti selezionati?" +msgid "" +"Are you sure you want to change the selected visibility restrictions for the " +"selected user(s)?" +msgstr "" +"Sei sicuro di voler cambiare le restrizioni di visibilità selezionate per " +"gli utenti selezionati?" #: cps/admin.py:640 -msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" -msgstr "Sei sicuro di voler cambiare il comportamento di sincronizzazione dello scaffale per gli utenti selezionati?" +msgid "" +"Are you sure you want to change shelf sync behavior for the selected user(s)?" +msgstr "" +"Sei sicuro di voler cambiare il comportamento di sincronizzazione dello " +"scaffale per gli utenti selezionati?" #: cps/admin.py:642 msgid "Are you sure you want to change Calibre library location?" msgstr "Sei sicuro di voler cambiare la posizione della biblioteca di Calibre?" #: cps/admin.py:644 -msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" -msgstr "Calibre-Web cercherà le copertine aggiornate e aggiornerà le miniature delle copertine, ma ci vorrà un po' di tempo." +msgid "" +"Calibre-Web will search for updated Covers and update Cover Thumbnails, this " +"may take a while?" +msgstr "" +"Calibre-Web cercherà le copertine aggiornate e aggiornerà le miniature delle " +"copertine, ma ci vorrà un po' di tempo." #: cps/admin.py:647 -msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" -msgstr "Sei sicuro di voler eliminare il database sincronizzato di Calibre-Web e forzare una sincronizzazione completa con il tuo lettore Kobo?" +msgid "" +"Are you sure you want delete Calibre-Web's sync database to force a full " +"sync with your Kobo Reader?" +msgstr "" +"Sei sicuro di voler eliminare il database sincronizzato di Calibre-Web e " +"forzare una sincronizzazione completa con il tuo lettore Kobo?" #: cps/admin.py:890 cps/admin.py:896 cps/admin.py:906 cps/admin.py:916 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 @@ -245,15 +284,21 @@ msgstr "client_secrets.json non è configurato per Web Application" #: cps/admin.py:1182 msgid "Logfile Location is not Valid, Please Enter Correct Path" -msgstr "La posizione del file di log non è valida, per favore indica il percorso corretto" +msgstr "" +"La posizione del file di log non è valida, per favore indica il percorso " +"corretto" #: cps/admin.py:1188 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" -msgstr "La posizione del file del log di accesso non è valida, indica il percorso corretto" +msgstr "" +"La posizione del file del log di accesso non è valida, indica il percorso " +"corretto" #: cps/admin.py:1222 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" -msgstr "Inserisci un provider LDAP, una porta, un DN e un identificatore oggetto utente" +msgstr "" +"Inserisci un provider LDAP, una porta, un DN e un identificatore oggetto " +"utente" #: cps/admin.py:1228 msgid "Please Enter a LDAP Service Account and Password" @@ -266,7 +311,8 @@ msgstr "Inserisci un account di servizio LDAP" #: cps/admin.py:1236 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" -msgstr "Il filtro oggetto gruppo LDAP deve avere un identificatore di formato \"%s\"" +msgstr "" +"Il filtro oggetto gruppo LDAP deve avere un identificatore di formato \"%s\"" #: cps/admin.py:1238 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" @@ -275,7 +321,8 @@ msgstr "Il filtro oggetto gruppo LDAP ha parentesi senza corrispondenza" #: cps/admin.py:1242 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" -msgstr "Il filtro oggetto utente LDAP deve avere un identificatore di formato \"%s\"" +msgstr "" +"Il filtro oggetto utente LDAP deve avere un identificatore di formato \"%s\"" #: cps/admin.py:1244 msgid "LDAP User Object Filter Has Unmatched Parenthesis" @@ -284,15 +331,20 @@ msgstr "Il filtro oggetto utente LDAP ha parentesi senza corrispondenza" #: cps/admin.py:1251 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" -msgstr "Il filtro utente membro LDAP deve avere un identificatore di formato \"%s\"" +msgstr "" +"Il filtro utente membro LDAP deve avere un identificatore di formato \"%s\"" #: cps/admin.py:1253 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "Il filtro utente membro LDAP ha parentesi senza corrispondenza" #: cps/admin.py:1260 -msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" -msgstr "Il certificato CA LDAP, il certificato o la posizione della chiave non sono validi. Inserisci il percorso corretto" +msgid "" +"LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter " +"Correct Path" +msgstr "" +"Il certificato CA LDAP, il certificato o la posizione della chiave non sono " +"validi. Inserisci il percorso corretto" #: cps/admin.py:1291 cps/templates/admin.html:53 msgid "Add New User" @@ -317,8 +369,11 @@ msgstr "Errore nel database: %(error)s." #: cps/admin.py:1349 #, python-format -msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" -msgstr "L'e-mail di prova è stato accodata correttamente per essere spedita a %(email)s, controlla il risultato in Attività" +msgid "" +"Test e-mail queued for sending to %(email)s, please check Tasks for result" +msgstr "" +"L'e-mail di prova è stato accodata correttamente per essere spedita a " +"%(email)s, controlla il risultato in Attività" #: cps/admin.py:1352 #, python-format @@ -426,7 +481,8 @@ msgstr "Errore generale" #: cps/admin.py:1556 msgid "Update file could not be saved in temp dir" -msgstr "Il file di aggiornamento non può essere salvato nella cartella temporanea" +msgstr "" +"Il file di aggiornamento non può essere salvato nella cartella temporanea" #: cps/admin.py:1557 msgid "Files could not be replaced during update" @@ -464,7 +520,8 @@ msgstr "Percorso dei libri non valido" #: cps/admin.py:1745 msgid "DB Location is not Valid, Please Enter Correct Path" -msgstr "La posizione del DB non è valida, per favore indica il percorso corretto" +msgstr "" +"La posizione del DB non è valida, per favore indica il percorso corretto" #: cps/admin.py:1773 msgid "DB is not Writeable" @@ -522,7 +579,9 @@ msgstr "Impossibile eliminare l'utente Guest (ospite)" #: cps/admin.py:2016 msgid "No admin user remaining, can't delete user" -msgstr "Non rimarrebbe nessun utente amministratore, non è possibile eliminare l'utente" +msgstr "" +"Non rimarrebbe nessun utente amministratore, non è possibile eliminare " +"l'utente" #: cps/admin.py:2071 cps/web.py:1493 msgid "Email can't be empty and has to be a valid Email" @@ -587,8 +646,11 @@ msgstr "Il valore non è presente nella richiesta" #: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 #: cps/editbooks.py:1146 cps/web.py:535 cps/web.py:1585 cps/web.py:1631 #: cps/web.py:1681 -msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" -msgstr "Il libro selezionato non è disponibile. Il file non esiste o non è accessibile" +msgid "" +"Oops! Selected book is unavailable. File does not exist or is not accessible" +msgstr "" +"Il libro selezionato non è disponibile. Il file non esiste o non è " +"accessibile" #: cps/editbooks.py:673 cps/editbooks.py:1503 msgid "User has no rights to upload cover" @@ -596,7 +658,9 @@ msgstr "L'utente non ha i permessi per caricare le copertine" #: cps/editbooks.py:694 cps/editbooks.py:938 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" -msgstr "Gli identificatori non fanno distinzione tra maiuscole e minuscole e sovrascrivono il vecchio identificatore" +msgstr "" +"Gli identificatori non fanno distinzione tra maiuscole e minuscole e " +"sovrascrivono il vecchio identificatore" #: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 #, python-format @@ -613,8 +677,12 @@ msgid "Error editing book: {}" msgstr "Errore nella modifica del libro: {}" #: cps/editbooks.py:856 -msgid "Uploaded book probably exists in the library, consider to change before upload new: " -msgstr "Probabilmente il libro caricato esiste già nella biblioteca, cambialo prima di caricarlo di nuovo:" +msgid "" +"Uploaded book probably exists in the library, consider to change before " +"upload new: " +msgstr "" +"Probabilmente il libro caricato esiste già nella biblioteca, cambialo prima " +"di caricarlo di nuovo:" #: cps/editbooks.py:950 cps/editbooks.py:1420 msgid "File type isn't allowed to be uploaded to this server" @@ -623,7 +691,8 @@ msgstr "Non è consentito caricare questo tipo di file su questo server" #: cps/editbooks.py:956 cps/editbooks.py:1431 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" -msgstr "Non è consentito caricare l'estensione del file '%(ext)s' su questo server" +msgstr "" +"Non è consentito caricare l'estensione del file '%(ext)s' su questo server" #: cps/editbooks.py:960 cps/editbooks.py:1436 msgid "File to be uploaded must have an extension" @@ -701,12 +770,20 @@ msgid "Please wait one minute before next login" msgstr "Attendi un minuto prima del prossimo accesso" #: cps/gdrive.py:58 -msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" -msgstr "Configurazione di Google Drive non completata, prova a disattivare e attivare nuovamente Google Drive" +msgid "" +"Google Drive setup not completed, try to deactivate and activate Google " +"Drive again" +msgstr "" +"Configurazione di Google Drive non completata, prova a disattivare e " +"attivare nuovamente Google Drive" #: cps/gdrive.py:96 -msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" -msgstr "Il dominio di callback non è stato verificato, segui i passaggi per verificare il dominio nella console per sviluppatori di Google" +msgid "" +"Callback domain is not verified, please follow steps to verify domain in " +"google developer console" +msgstr "" +"Il dominio di callback non è stato verificato, segui i passaggi per " +"verificare il dominio nella console per sviluppatori di Google" #: cps/helper.py:87 #, python-format @@ -774,8 +851,11 @@ msgstr "Impossibile impostare lo stato di lettura: {}" #: cps/helper.py:373 #, python-format -msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" -msgstr "Eliminazione della cartella di libri per il libro %(id)s non riuscita, il percorso ha sottocartelle: %(path)s" +msgid "" +"Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" +msgstr "" +"Eliminazione della cartella di libri per il libro %(id)s non riuscita, il " +"percorso ha sottocartelle: %(path)s" #: cps/helper.py:379 #, python-format @@ -784,18 +864,29 @@ msgstr "Eliminazione del libro %(id)s non riuscita: %(message)s" #: cps/helper.py:390 #, python-format -msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" -msgstr "Eliminazione del libro %(id)s solo dal database, percorso del libro nel database non valido: %(path)s" +msgid "" +"Deleting book %(id)s from database only, book path in database not valid: " +"%(path)s" +msgstr "" +"Eliminazione del libro %(id)s solo dal database, percorso del libro nel " +"database non valido: %(path)s" #: cps/helper.py:404 #, python-format -msgid "Moving book path of Book %(book_id)s to: '%(src)s' failed with error: %(error)s" -msgstr "Spostamento del percorso del libro %(book_id)s a: '%(src)s' non riuscito con errore: %(error)s" +msgid "" +"Moving book path of Book %(book_id)s to: '%(src)s' failed with error: " +"%(error)s" +msgstr "" +"Spostamento del percorso del libro %(book_id)s a: '%(src)s' non riuscito con " +"errore: %(error)s" #: cps/helper.py:443 #, python-format -msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" -msgstr "La modifica dell'autore da '%(src)s' a '%(dest)s' è terminata con l'errore: %(error)s" +msgid "" +"Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "" +"La modifica dell'autore da '%(src)s' a '%(dest)s' è terminata con l'errore: " +"%(error)s" #: cps/helper.py:513 cps/helper.py:522 #, python-format @@ -805,7 +896,9 @@ msgstr "Il file %(file) non è stato trovato su Google Drive" #: cps/helper.py:564 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" -msgstr "La modifica del titolo da '%(src)s' a '%(dest)s' è terminata con l'errore: %(error)s" +msgstr "" +"La modifica del titolo da '%(src)s' a '%(dest)s' è terminata con l'errore: " +"%(error)s" #: cps/helper.py:583 #, python-format @@ -829,8 +922,11 @@ msgid "Password doesn't comply with password validation rules" msgstr "La password non è conforme alle regole di convalida della password" #: cps/helper.py:833 -msgid "Python module 'advocate' is not installed but is needed for cover uploads" -msgstr "Il modulo Python \"advocate\" non è installato ma è necessario per il caricamento delle copertine" +msgid "" +"Python module 'advocate' is not installed but is needed for cover uploads" +msgstr "" +"Il modulo Python \"advocate\" non è installato ma è necessario per il " +"caricamento delle copertine" #: cps/helper.py:843 msgid "Error Downloading Cover" @@ -841,8 +937,12 @@ msgid "Cover Format Error" msgstr "Errore nel formato della copertina" #: cps/helper.py:849 -msgid "You are not allowed to access localhost or the local network for cover uploads" -msgstr "Non ti è consentito accedere all'host locale o alla rete locale per caricare le copertine" +msgid "" +"You are not allowed to access localhost or the local network for cover " +"uploads" +msgstr "" +"Non ti è consentito accedere all'host locale o alla rete locale per caricare " +"le copertine" #: cps/helper.py:859 msgid "Failed to create path for cover" @@ -850,11 +950,14 @@ msgstr "Impossibile creare il percorso per la copertina" #: cps/helper.py:875 msgid "Cover-file is not a valid image file, or could not be stored" -msgstr "Il file della copertina non è in un formato di immagine valido o non può essere salvato" +msgstr "" +"Il file della copertina non è in un formato di immagine valido o non può " +"essere salvato" #: cps/helper.py:886 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" -msgstr "Solo i file jpg/jpeg/png/webp/bmp sono supportati come file di copertina" +msgstr "" +"Solo i file jpg/jpeg/png/webp/bmp sono supportati come file di copertina" #: cps/helper.py:898 msgid "Invalid cover file content" @@ -907,8 +1010,12 @@ msgid "Queue all books for metadata backup" msgstr "Metti in coda tutti i libri per il backup dei metadati" #: cps/kobo_auth.py:92 -msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" -msgstr "Accedi a Calibre-Web da un host non locale per ottenere un api_endpoint valido per il dispositivo Kobo" +msgid "" +"Please access Calibre-Web from non localhost to get valid api_endpoint for " +"kobo device" +msgstr "" +"Accedi a Calibre-Web da un host non locale per ottenere un api_endpoint " +"valido per il dispositivo Kobo" #: cps/kobo_auth.py:118 msgid "Kobo Setup" @@ -931,7 +1038,8 @@ msgstr "Collegamento riuscito a %(oauth)s" #: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" -msgstr "Accesso non riuscito, non c'è nessun utente collegato all'account OAuth" +msgstr "" +"Accesso non riuscito, non c'è nessun utente collegato all'account OAuth" #: cps/oauth_bb.py:198 #, python-format @@ -1169,7 +1277,9 @@ msgstr "Stato di lettura = '%(status)s'" #: cps/search.py:366 msgid "Error on search for custom columns, please restart Calibre-Web" -msgstr "Errore nella ricerca delle colonne personalizzate. Per favore riavvia Calibre-Web" +msgstr "" +"Errore nella ricerca delle colonne personalizzate. Per favore riavvia " +"Calibre-Web" #: cps/search.py:385 cps/search.py:417 cps/templates/layout.html:57 msgid "Advanced Search" @@ -1181,7 +1291,8 @@ msgstr "Scaffale specificato non valido" #: cps/shelf.py:55 msgid "Sorry you are not allowed to add a book to that shelf" -msgstr "Spiacente, ma non sei autorizzato ad aggiungere libri a questo scaffale" +msgstr "" +"Spiacente, ma non sei autorizzato ad aggiungere libri a questo scaffale" #: cps/shelf.py:64 #, python-format @@ -1191,7 +1302,8 @@ msgstr "Il libro è gia presente nello scaffale: %(shelfname)s" #: cps/shelf.py:77 #, python-format msgid "%(book_id)s is a invalid Book Id. Could not be added to Shelf" -msgstr "%(book_id)s non è un valido ID libro. Impossibile aggiungerlo allo scaffale" +msgstr "" +"%(book_id)s non è un valido ID libro. Impossibile aggiungerlo allo scaffale" #: cps/shelf.py:97 #, python-format @@ -1200,22 +1312,22 @@ msgstr "Il libro è stato aggiunto allo scaffale: %(sname)s" #: cps/shelf.py:116 msgid "You are not allowed to remove a book from the shelf" -msgstr "" +msgstr "Non è consentito rimuovere un libro dallo scaffale" #: cps/shelf.py:129 #, python-format msgid "No Books are part of the shelf: %(name)s" -msgstr "" +msgstr "Nessun libro fa parte dello scaffale: %(nome)s" #: cps/shelf.py:140 #, python-format msgid "Books have been removed from shelf: %(sname)s" -msgstr "" +msgstr "I libri sono stati rimossi dallo scaffale: %(sname)s" #: cps/shelf.py:147 #, python-format msgid "Could not remove books from shelf: %(sname)s" -msgstr "" +msgstr "Impossibile rimuovere i libri dallo scaffale: %(sname)s" #: cps/shelf.py:162 msgid "You are not allowed to add a book to the shelf" @@ -1305,7 +1417,9 @@ msgstr "Scaffale: '%(name)s'" #: cps/shelf.py:531 msgid "Error opening shelf. Shelf does not exist or is not accessible" -msgstr "Errore nell'apertura dello scaffale. Lo scaffale non esiste o non è accessibile" +msgstr "" +"Errore nell'apertura dello scaffale. Lo scaffale non esiste o non è " +"accessibile" #: cps/tasks_status.py:47 cps/templates/layout.html:90 #: cps/templates/tasks.html:7 @@ -1349,8 +1463,12 @@ msgid "No update available. You already have the latest version installed" msgstr "Nessun aggiornamento disponibile. Hai già l'ultima versione installata" #: cps/updater.py:459 -msgid "A new update is available. Click on the button below to update to the latest version." -msgstr "È disponibile un nuovo aggiornamento. Fai clic sul pulsante in basso per aggiornare all'ultima versione" +msgid "" +"A new update is available. Click on the button below to update to the latest " +"version." +msgstr "" +"È disponibile un nuovo aggiornamento. Fai clic sul pulsante in basso per " +"aggiornare all'ultima versione" #: cps/updater.py:476 msgid "Could not fetch update information" @@ -1358,12 +1476,18 @@ msgstr "Impossibile recuperare le informazioni sull'aggiornamento" #: cps/updater.py:487 msgid "Click on the button below to update to the latest stable version." -msgstr "Fai clic sul pulsante in basso per eseguire l'aggiornamento all'ultima versione stabile." +msgstr "" +"Fai clic sul pulsante in basso per eseguire l'aggiornamento all'ultima " +"versione stabile." #: cps/updater.py:495 cps/updater.py:509 cps/updater.py:520 #, python-format -msgid "A new update is available. Click on the button below to update to version: %(version)s" -msgstr "È disponibile un nuovo aggiornamento. Fai clic sul pulsante in basso per aggiornare alla versione:%(version)s" +msgid "" +"A new update is available. Click on the button below to update to version: " +"%(version)s" +msgstr "" +"È disponibile un nuovo aggiornamento. Fai clic sul pulsante in basso per " +"aggiornare alla versione:%(version)s" #: cps/updater.py:538 msgid "No release information available" @@ -1452,8 +1576,10 @@ msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Per favore aggiorna il tuo profilo con un'e-mail eReader valida." #: cps/web.py:1300 cps/web.py:1351 -msgid "Oops! Email server is not configured, please contact your administrator." -msgstr "Il server e-mail non è configurato, per favore contatta l'amministratore" +msgid "" +"Oops! Email server is not configured, please contact your administrator." +msgstr "" +"Il server e-mail non è configurato, per favore contatta l'amministratore" #: cps/web.py:1337 msgid "Oops! Your Email is not allowed." @@ -1474,8 +1600,12 @@ msgstr "ora sei connesso come: '%(nickname)s'" #: cps/web.py:1424 #, python-format -msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" -msgstr "Accesso di riserva come: '%(nickname)s', il server LDAP non è raggiungibile o l'utente è sconosciuto" +msgid "" +"Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not " +"known" +msgstr "" +"Accesso di riserva come: '%(nickname)s', il server LDAP non è raggiungibile " +"o l'utente è sconosciuto" #: cps/web.py:1429 #, python-format @@ -2075,8 +2205,11 @@ msgid "Add Identifier" msgstr "Aggiungi identificatore" #: cps/templates/book_edit.html:133 -msgid "Fetch Cover from URL (JPEG - Image will be downloaded and stored in database)" -msgstr "Recupera la copertina dall'URL (JPEG: l'immagine verrà scaricata e archiviata nel database)" +msgid "" +"Fetch Cover from URL (JPEG - Image will be downloaded and stored in database)" +msgstr "" +"Recupera la copertina dall'URL (JPEG: l'immagine verrà scaricata e " +"archiviata nel database)" #: cps/templates/book_edit.html:137 msgid "Upload Cover from Local Disk" @@ -2323,7 +2456,8 @@ msgstr "Modifica i metadati" #: cps/templates/book_table.html:275 msgid "Edit the fields you want changed. Blank fields will be ignored:" -msgstr "Modifica i campi che desideri modificare. I campi vuoti saranno ignorati:" +msgstr "" +"Modifica i campi che desideri modificare. I campi vuoti saranno ignorati:" #: cps/templates/config_db.html:12 msgid "Location of Calibre Database" @@ -2355,7 +2489,8 @@ msgstr "Revoca" #: cps/templates/config_db.html:80 msgid "New db location is invalid, please enter valid path" -msgstr "La nuova posizione del database non è valida, inserisci un percorso valido" +msgstr "" +"La nuova posizione del database non è valida, inserisci un percorso valido" #: cps/templates/config_edit.html:18 msgid "Server Configuration" @@ -2367,11 +2502,15 @@ msgstr "Porta del server" #: cps/templates/config_edit.html:28 msgid "SSL certfile location (leave it empty for non-SSL Servers)" -msgstr "Posizione del file del certificato SSL (lascia vuoto per una configurazione del server senza SSL)" +msgstr "" +"Posizione del file del certificato SSL (lascia vuoto per una configurazione " +"del server senza SSL)" #: cps/templates/config_edit.html:35 msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" -msgstr "Posizione del file della chiave SSL (lascia vuoto per una configurazione del server senza SSL)" +msgstr "" +"Posizione del file della chiave SSL (lascia vuoto per una configurazione del " +"server senza SSL)" #: cps/templates/config_edit.html:43 msgid "Update Channel" @@ -2395,7 +2534,8 @@ msgstr "Configurazione del file di log" #: cps/templates/config_edit.html:77 msgid "Location and name of logfile (calibre-web.log for no entry)" -msgstr "Posizione e nome del file di log (se non specificato sarà calibre-web.log)" +msgstr "" +"Posizione e nome del file di log (se non specificato sarà calibre-web.log)" #: cps/templates/config_edit.html:82 msgid "Enable Access Log" @@ -2403,7 +2543,9 @@ msgstr "Abilita il log degli accessi" #: cps/templates/config_edit.html:85 msgid "Location and name of access logfile (access.log for no entry)" -msgstr "Posizione e nome del file di log degli accessi (se non specificato sarà access.log)" +msgstr "" +"Posizione e nome del file di log degli accessi (se non specificato sarà " +"access.log)" #: cps/templates/config_edit.html:96 msgid "Feature Configuration" @@ -2411,11 +2553,17 @@ msgstr "Configurazione funzionalità" #: cps/templates/config_edit.html:104 msgid "Convert non-English characters in title and author while saving to disk" -msgstr "Converti caratteri non inglesi nel titolo e nell'autore durante il salvataggio su disco" +msgstr "" +"Converti caratteri non inglesi nel titolo e nell'autore durante il " +"salvataggio su disco" #: cps/templates/config_edit.html:108 -msgid "Embed Metadata to Ebook File on Download/Conversion/e-mail (needs Calibre/Kepubify binaries)" -msgstr "Incorpora metadati nel file del libro al momento del download e della conversione per e-mail (sono necessari gli eseguibili Calibre/Kepubify)" +msgid "" +"Embed Metadata to Ebook File on Download/Conversion/e-mail (needs Calibre/" +"Kepubify binaries)" +msgstr "" +"Incorpora metadati nel file del libro al momento del download e della " +"conversione per e-mail (sono necessari gli eseguibili Calibre/Kepubify)" #: cps/templates/config_edit.html:112 msgid "Enable Uploads" @@ -2423,7 +2571,9 @@ msgstr "Abilita il caricamento" #: cps/templates/config_edit.html:112 msgid "(Please ensure that users also have upload permissions)" -msgstr "(assicurati che gli utenti dispongano anche delle autorizzazioni di caricamento)" +msgstr "" +"(assicurati che gli utenti dispongano anche delle autorizzazioni di " +"caricamento)" #: cps/templates/config_edit.html:116 msgid "Allowed Upload Fileformats" @@ -2510,16 +2660,24 @@ msgid "SSL" msgstr "SSL" #: cps/templates/config_edit.html:213 -msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" -msgstr "Percorso certificato CA LDAP (necessario solo per l'autenticazione del certificato client)" +msgid "" +"LDAP CACertificate Path (Only needed for Client Certificate Authentication)" +msgstr "" +"Percorso certificato CA LDAP (necessario solo per l'autenticazione del " +"certificato client)" #: cps/templates/config_edit.html:220 -msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" -msgstr "Percorso certificato LDAP (necessario solo per l'autenticazione del certificato client)" +msgid "" +"LDAP Certificate Path (Only needed for Client Certificate Authentication)" +msgstr "" +"Percorso certificato LDAP (necessario solo per l'autenticazione del " +"certificato client)" #: cps/templates/config_edit.html:227 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" -msgstr "Percorso del file di chiavi LDAP (necessario solo per l'autenticazione del certificato client)" +msgstr "" +"Percorso del file di chiavi LDAP (necessario solo per l'autenticazione del " +"certificato client)" #: cps/templates/config_edit.html:236 msgid "LDAP Authentication" @@ -2559,7 +2717,8 @@ msgstr "Il server LDAP è OpenLDAP?" #: cps/templates/config_edit.html:267 msgid "Following Settings are Needed For User Import" -msgstr "Per l'importazione degli utenti sono necessarie le seguenti impostazioni" +msgstr "" +"Per l'importazione degli utenti sono necessarie le seguenti impostazioni" #: cps/templates/config_edit.html:269 msgid "LDAP Group Object Filter" @@ -2642,7 +2801,9 @@ msgstr "Opzioni per il limitatore del Backend" #: cps/templates/config_edit.html:386 msgid "Check if file extensions matches file content on upload" -msgstr "Controlla se le estensioni dei file corrispondono al contenuto del file al momento del caricamento" +msgstr "" +"Controlla se le estensioni dei file corrispondono al contenuto del file al " +"momento del caricamento" #: cps/templates/config_edit.html:389 msgid "Session protection" @@ -2678,7 +2839,8 @@ msgstr "Obbliga caratteri maiuscoli" #: cps/templates/config_edit.html:418 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" -msgstr "Obbliga caratteri (necessario per caratteri cinesi, giapponesi e coreani)" +msgstr "" +"Obbliga caratteri (necessario per caratteri cinesi, giapponesi e coreani)" #: cps/templates/config_edit.html:422 msgid "Enforce special characters" @@ -2694,7 +2856,8 @@ msgstr "Numero di libri casuali da mostrare" #: cps/templates/config_view_edit.html:36 msgid "No. of Authors to Display Before Hiding (0=Disable Hiding)" -msgstr "Numero di autori da mostrare prima di nascondere (0=disabilita nascondere)" +msgstr "" +"Numero di autori da mostrare prima di nascondere (0=disabilita nascondere)" #: cps/templates/config_view_edit.html:40 cps/templates/readcbr.html:101 msgid "Theme" @@ -2818,8 +2981,12 @@ msgid "Add to archive" msgstr "Aggiungi all'archivio" #: cps/templates/detail.html:275 -msgid "Mark Book as archived or not, to hide it in Calibre-Web and delete it from Kobo Reader" -msgstr "Contrassegna il libro come archiviato o no per nasconderlo in Calibre-Web ed eliminarlo da Kobo Reader" +msgid "" +"Mark Book as archived or not, to hide it in Calibre-Web and delete it from " +"Kobo Reader" +msgstr "" +"Contrassegna il libro come archiviato o no per nasconderlo in Calibre-Web ed " +"eliminarlo da Kobo Reader" #: cps/templates/detail.html:301 cps/templates/listenmp3.html:190 #: cps/templates/search.html:16 @@ -2900,8 +3067,12 @@ msgid "Denied Domains (Blacklist)" msgstr "Domini non consentiti (lista nera)" #: cps/templates/generate_kobo_auth_url.html:6 -msgid "Open the .kobo/Kobo/Kobo eReader.conf file in a text editor and add (or edit):" -msgstr "Apri il file .kobo/Kobo/Kobo eReader.conf in un editor di testo e aggiungi (o modifica):" +msgid "" +"Open the .kobo/Kobo/Kobo eReader.conf file in a text editor and add (or " +"edit):" +msgstr "" +"Apri il file .kobo/Kobo/Kobo eReader.conf in un editor di testo e aggiungi " +"(o modifica):" #: cps/templates/generate_kobo_auth_url.html:11 msgid "Kobo Token:" @@ -2913,7 +3084,8 @@ msgstr "Elenco" #: cps/templates/http_error.html:34 msgid "Calibre-Web Instance is unconfigured, please contact your administrator" -msgstr "L'istanza Calibre-Web non è configurata, per favore contatta l'amministratore" +msgstr "" +"L'istanza Calibre-Web non è configurata, per favore contatta l'amministratore" #: cps/templates/http_error.html:44 msgid "Create Issue" @@ -3117,7 +3289,8 @@ msgstr "Seleziona le categorie consentite/negate per l'utente" #: cps/templates/modal_dialogs.html:9 msgid "Select Allowed/Denied Custom Column Values of User" -msgstr "Seleziona i valori personali consentiti/negati per le colonne dell'utente" +msgstr "" +"Seleziona i valori personali consentiti/negati per le colonne dell'utente" #: cps/templates/modal_dialogs.html:15 msgid "Enter Tag" @@ -3133,15 +3306,23 @@ msgstr "Questo formato di libro verrà definitivamente cancellato dal database" #: cps/templates/modal_dialogs.html:51 msgid "This book will be permanently erased from database and hard disk" -msgstr "Questo libro verrà cancellato definitivamente dal database e dal disco rigido" +msgstr "" +"Questo libro verrà cancellato definitivamente dal database e dal disco rigido" #: cps/templates/modal_dialogs.html:55 -msgid "Important Kobo Note: deleted books will remain on any paired Kobo device." -msgstr "Nota importante su Kobo: i libri eliminati rimarranno su qualsiasi dispositivo Kobo associato." +msgid "" +"Important Kobo Note: deleted books will remain on any paired Kobo device." +msgstr "" +"Nota importante su Kobo: i libri eliminati rimarranno su qualsiasi " +"dispositivo Kobo associato." #: cps/templates/modal_dialogs.html:56 -msgid "Books must first be archived and the device synced before a book can safely be deleted." -msgstr "I libri devono essere prima archiviati e il dispositivo sincronizzato prima che un libro possa essere eliminato in sicurezza." +msgid "" +"Books must first be archived and the device synced before a book can safely " +"be deleted." +msgstr "" +"I libri devono essere prima archiviati e il dispositivo sincronizzato prima " +"che un libro possa essere eliminato in sicurezza." #: cps/templates/modal_dialogs.html:75 msgid "Choose File Location" @@ -3437,7 +3618,7 @@ msgstr "Risultati per:" #: cps/templates/search.html:29 msgid "Remove from shelf" -msgstr "" +msgstr "Rimuovi dallo scaffale" #: cps/templates/search_form.html:21 msgid "Published Date From" @@ -3602,20 +3783,31 @@ msgid "Actions" msgstr "Azioni" #: cps/templates/tasks.html:41 -msgid "This task will be cancelled. Any progress made by this task will be saved." -msgstr "Questa attività sarà annullata. Tutti i progressi compiuti da questa attività saranno salvati." +msgid "" +"This task will be cancelled. Any progress made by this task will be saved." +msgstr "" +"Questa attività sarà annullata. Tutti i progressi compiuti da questa " +"attività saranno salvati." #: cps/templates/tasks.html:42 -msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." -msgstr "Se si tratta di un'attività pianificata, verrà eseguita nuovamente all'orario pianificato successivo." +msgid "" +"If this is a scheduled task, it will be re-ran during the next scheduled " +"time." +msgstr "" +"Se si tratta di un'attività pianificata, verrà eseguita nuovamente " +"all'orario pianificato successivo." #: cps/templates/user_edit.html:20 msgid "Reset user Password" msgstr "Reimposta la password dell'utente" #: cps/templates/user_edit.html:28 -msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" -msgstr "Invia all'indirizzo e-mail dell'eReader. Usa la virgola per separare le email per più eReader" +msgid "" +"Send to eReader Email Address. Use comma to separate emails for multiple " +"eReaders" +msgstr "" +"Invia all'indirizzo e-mail dell'eReader. Usa la virgola per separare le " +"email per più eReader" #: cps/templates/user_edit.html:43 msgid "Language of Books" @@ -3651,7 +3843,7 @@ msgstr "Aggiungi valori personali consentiti/negati nelle colonne" #: cps/templates/user_edit.html:137 msgid "Sync only books in selected shelves with Kobo" -msgstr "Sincronizza con Kobo unicamente i libri negli scaffali selezionati" +msgstr "Sincronizza con Kobo unicamene i libri negli scaffali selezionati" #: cps/templates/user_edit.html:147 cps/templates/user_table.html:169 msgid "Delete User" @@ -3744,4 +3936,3 @@ msgstr "Sincronizza gli scaffali selezionati con Kobo" #: cps/templates/user_table.html:156 msgid "Show Read/Unread Section" msgstr "Mostra sezione Libri letti e Libri da leggere" -