From 204cd504a9b0b8c345704d1917379620b6af117b Mon Sep 17 00:00:00 2001 From: OzzieIsaacs Date: Sat, 2 Jun 2018 10:59:34 +0200 Subject: [PATCH] - Completly new setup of GDrive (every data is taken from client_secret.json file) - If cover on Google Drive is missing, the generic cover will be used - Better error handling during configuration of google drive (missing hook callback verification, missing files) - less errors on console during use of Gdrive, more log file output in case of error - removed standalone flask development mode - removed gdrive template file and vendor setup script --- cps.py | 34 +- cps/gdriveutils.py | 45 +- cps/static/img/.gitignore | 0 cps/templates/config_edit.html | 56 ++- cps/translations/de/LC_MESSAGES/messages.mo | Bin 305094 -> 305850 bytes cps/translations/de/LC_MESSAGES/messages.po | 396 ++++++++++-------- cps/translations/es/LC_MESSAGES/messages.po | 392 +++++++++-------- cps/translations/fr/LC_MESSAGES/messages.po | 276 ++++++------ cps/translations/it/LC_MESSAGES/messages.po | 392 +++++++++-------- cps/translations/ja/LC_MESSAGES/messages.po | 392 +++++++++-------- cps/translations/nl/LC_MESSAGES/messages.po | 392 +++++++++-------- cps/translations/pl/LC_MESSAGES/messages.po | 392 +++++++++-------- cps/translations/ru/LC_MESSAGES/messages.po | 390 +++++++++-------- .../zh_Hans_CN/LC_MESSAGES/messages.po | 390 +++++++++-------- cps/ub.py | 18 +- cps/web.py | 120 ++++-- gdrive_template.yaml | 14 - getVendor.sh | 3 - messages.pot | 388 +++++++++-------- optional-requirements.txt | 9 +- readme.md | 22 +- requirements.txt | 2 +- 22 files changed, 2217 insertions(+), 1906 deletions(-) delete mode 100644 cps/static/img/.gitignore delete mode 100644 gdrive_template.yaml delete mode 100644 getVendor.sh diff --git a/cps.py b/cps.py index 32e61b39..8e0ae6d2 100755 --- a/cps.py +++ b/cps.py @@ -21,27 +21,23 @@ except ImportError: gevent_present = False if __name__ == '__main__': - if web.ub.DEVELOPMENT: - web.app.run(port=web.ub.config.config_port, debug=True) + if gevent_present: + web.app.logger.info('Attempting to start gevent') + web.start_gevent() else: - if gevent_present: - web.app.logger.info('Attempting to start gevent') - web.start_gevent() + web.app.logger.info('Starting Tornado webserver') + # Max Buffersize set to 200MB + if web.ub.config.get_config_certfile() and web.ub.config.get_config_keyfile(): + ssl={"certfile": web.ub.config.get_config_certfile(), + "keyfile": web.ub.config.get_config_keyfile()} else: - web.app.logger.info('Falling back to Tornado') - # Max Buffersize set to 200MB - if web.ub.config.get_config_certfile() and web.ub.config.get_config_keyfile(): - ssl={"certfile": web.ub.config.get_config_certfile(), - "keyfile": web.ub.config.get_config_keyfile()} - else: - ssl=None - http_server = HTTPServer(WSGIContainer(web.app), - max_buffer_size = 209700000, - ssl_options=ssl) - http_server.listen(web.ub.config.config_port) - IOLoop.instance().start() - IOLoop.instance().close(True) - + ssl=None + http_server = HTTPServer(WSGIContainer(web.app), + max_buffer_size = 209700000, + ssl_options=ssl) + http_server.listen(web.ub.config.config_port) + IOLoop.instance().start() + IOLoop.instance().close(True) if web.helper.global_task == 0: web.app.logger.info("Performing restart of Calibre-web") diff --git a/cps/gdriveutils.py b/cps/gdriveutils.py index f2665ba6..bab80bdc 100644 --- a/cps/gdriveutils.py +++ b/cps/gdriveutils.py @@ -68,7 +68,6 @@ if not os.path.exists(cli.gdpath): Base.metadata.create_all(engine) except Exception: raise - migrate() @@ -80,7 +79,10 @@ def getDrive(drive=None, gauth=None): gauth.LoadCredentialsFile("gdrive_credentials") if gauth.access_token_expired: # Refresh them if expired - gauth.Refresh() + try: + gauth.Refresh() + except: + web.app.logger.error("GDrive gdrive_credentials file not present, reauthenticate in config section") else: # Initialize the saved creds gauth.Authorize() @@ -90,12 +92,24 @@ def getDrive(drive=None, gauth=None): drive.auth.Refresh() return drive +def listRootFolders(drive=None): + drive = getDrive(drive) + folder = "'root' in parents and mimeType = 'application/vnd.google-apps.folder' and trashed = false" + fileList = drive.ListFile({'q': folder}).GetList() + return fileList + def getEbooksFolder(drive=None): - drive = getDrive(drive) - ebooksFolder = "title = '%s' and 'root' in parents and mimeType = 'application/vnd.google-apps.folder' and trashed = false" % config.config_google_drive_folder + return getFolderInFolder('root',config.config_google_drive_folder,drive) - fileList = drive.ListFile({'q': ebooksFolder}).GetList() + +def getFolderInFolder(parentId, folderName,drive=None): + drive = getDrive(drive) + query="" + if folderName: + query = "title = '%s' and " % folderName.replace("'", "\\'") + folder = query + "'%s' in parents and mimeType = 'application/vnd.google-apps.folder' and trashed = false" % parentId + fileList = drive.ListFile({'q': folder}).GetList() return fileList[0] @@ -105,20 +119,17 @@ def getEbooksFolderId(drive=None): return storedPathName.gdrive_id else: gDriveId = GdriveId() - gDriveId.gdrive_id = getEbooksFolder(drive)['id'] + try: + gDriveId.gdrive_id = getEbooksFolder(drive)['id'] + except: + pass + # ToDo Path not exisiting gDriveId.path = '/' session.merge(gDriveId) session.commit() return -def getFolderInFolder(parentId, folderName, drive=None): - drive = getDrive(drive) - folder = "title = '%s' and '%s' in parents and mimeType = 'application/vnd.google-apps.folder' and trashed = false" % (folderName.replace("'", "\\'"), parentId) - fileList = drive.ListFile({'q': folder}).GetList() - return fileList[0] - - def getFile(pathId, fileName, drive=None): drive = getDrive(drive) metaDataFile = "'%s' in parents and trashed = false and title = '%s'" % (pathId, fileName.replace("'", "\\'")) @@ -190,11 +201,8 @@ def downloadFile(drive, path, filename, output): def backupCalibreDbAndOptionalDownload(drive, f=None): drive = getDrive(drive) metaDataFile = "'%s' in parents and title = 'metadata.db' and trashed = false" % getEbooksFolderId() - fileList = drive.ListFile({'q': metaDataFile}).GetList() - databaseFile = fileList[0] - if f: databaseFile.GetContentFile(f) @@ -343,3 +351,8 @@ def getChangeById (drive, change_id): except (errors.HttpError, error): web.app.logger.exception(error) return None + +# Deletes the local hashes database to force search for new folder names +def deleteDatabaseOnChange(): + session.query(GdriveId).delete() + session.commit() diff --git a/cps/static/img/.gitignore b/cps/static/img/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/cps/templates/config_edit.html b/cps/templates/config_edit.html index 5c0d8a36..0928ed4d 100644 --- a/cps/templates/config_edit.html +++ b/cps/templates/config_edit.html @@ -7,47 +7,43 @@ - {% if gdrive %}
-
- - -
-
- - -
-
- - -
-
- - -
- {% if show_authenticate_google_drive %} -
- Authenticate Google Drive + {% if gdriveError %} +
+
{% else %} - {% if content.config_google_drive_watch_changes_response %} - -
- - - Revoke - + {% if show_authenticate_google_drive %} + + {% else %} +
+ + +
+ {% if content.config_google_drive_watch_changes_response %} + + {% else %} - Enable watch of metadata.db + Enable watch of metadata.db {% endif %} -
{% endif %} + {% endif %}
- {% endif %}
diff --git a/cps/translations/de/LC_MESSAGES/messages.mo b/cps/translations/de/LC_MESSAGES/messages.mo index c9f1914ccbb1dd59044f3eede4f2c86c313d8bf3..7a43ffacb5f60ec57ba69451e51b0d3e1bf746eb 100644 GIT binary patch delta 130549 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 delta 129794 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 X^0aZ4>r9??f0f1aCOlB3`9}W->wh8k diff --git a/cps/translations/de/LC_MESSAGES/messages.po b/cps/translations/de/LC_MESSAGES/messages.po index ffe67ddd..516a5e8f 100644 --- a/cps/translations/de/LC_MESSAGES/messages.po +++ b/cps/translations/de/LC_MESSAGES/messages.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n" -"POT-Creation-Date: 2018-04-02 09:35+0200\n" +"POT-Creation-Date: 2018-06-02 10:45+0200\n" "PO-Revision-Date: 2016-07-12 19:54+0200\n" "Last-Translator: Ozzie Isaacs\n" "Language: de\n" @@ -36,59 +36,59 @@ msgstr "" msgid "not installed" msgstr "Nicht installiert" -#: cps/helper.py:78 +#: cps/helper.py:79 #, python-format msgid "kindlegen binary %(kindlepath)s not found" msgstr "Kindlegen Programm %(kindlepath)s nicht gefunden" -#: cps/helper.py:84 +#: cps/helper.py:85 #, python-format msgid "epub format not found for book id: %(book)d" msgstr "epub Format für Bücher-ID %(book)d nicht gefunden" -#: cps/helper.py:94 +#: cps/helper.py:95 msgid "kindlegen failed, no execution permissions" msgstr "Kindlegen Aufruf fehlgeschlagen, keine Ausführungsberechtigung" -#: cps/helper.py:109 +#: cps/helper.py:110 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Kindlegen Aufruf mit Fehler %(error)s. Text: %(message)s fehlgeschlagen " -#: cps/helper.py:188 +#: cps/helper.py:189 #, python-format msgid "Failed to send mail: %s" msgstr "E-Mail: %s konnte nicht gesendet werden" -#: cps/helper.py:195 +#: cps/helper.py:196 msgid "Calibre-web test email" msgstr "Calibre-web Test E-Mail" -#: cps/helper.py:196 cps/helper.py:208 +#: cps/helper.py:197 cps/helper.py:209 msgid "This email has been sent via calibre web." msgstr "Die E-Mail wurde via calibre-web versendet" -#: cps/helper.py:205 cps/templates/detail.html:44 +#: cps/helper.py:206 cps/templates/detail.html:44 msgid "Send to Kindle" msgstr "An Kindle senden" -#: cps/helper.py:225 cps/helper.py:239 +#: cps/helper.py:226 cps/helper.py:240 msgid "Could not find any formats suitable for sending by email" msgstr "" "Konnte keine Formate finden welche für das versenden per E-Mail geeignet " "sind" -#: cps/helper.py:340 +#: cps/helper.py:341 #, python-format msgid "Rename title from: \"%s\" to \"%s\" failed with error: %s" msgstr "Umbenennen des Titelpfades \"%s\" nach \"%s\" schlug fehl: %s" -#: cps/helper.py:349 +#: cps/helper.py:350 #, python-format msgid "Rename author from: \"%s\" to \"%s\" failed with error: %s" msgstr "Umbenennen des Authorpfades \"%s\" nach \"%s\" schlug fehl: %s" -#: cps/ub.py:684 +#: cps/ub.py:694 msgid "Guest" msgstr "Gast" @@ -156,7 +156,7 @@ msgstr "Zufällige Bücher" msgid "Author list" msgstr "Autorenliste" -#: cps/web.py:1220 cps/web.py:1278 cps/web.py:1408 cps/web.py:1903 +#: cps/web.py:1220 cps/web.py:1278 cps/web.py:1408 cps/web.py:1917 msgid "Error opening eBook. File does not exist or file is not accessible:" msgstr "" "Buch öffnen fehlgeschlagen. Datei existiert nicht, oder ist nicht " @@ -197,310 +197,334 @@ msgstr "Ausführungsberechtigung nicht vorhanden" msgid "Statistics" msgstr "Statistiken" -#: cps/web.py:1641 +#: cps/web.py:1573 +msgid "" +"Callback domain is not verified, please follow steps to verify domain in " +"google developer console" +msgstr "" +"Callback Domain ist nicht verifiziert, bitte Domain in der Google " +"Developer Console verifizieren" + +#: cps/web.py:1651 msgid "Server restarted, please reload page" msgstr "Server neu gestartet,bitte Seite neu laden" -#: cps/web.py:1643 +#: cps/web.py:1653 msgid "Performing shutdown of server, please close window" msgstr "Server wird runtergefahren, bitte Fenster schließen" -#: cps/web.py:1659 +#: cps/web.py:1669 msgid "Update done" msgstr "Update durchgeführt" -#: cps/web.py:1716 +#: cps/web.py:1726 #, python-format msgid "Published after %s" msgstr "Herausgegeben nach dem %s" -#: cps/web.py:1721 +#: cps/web.py:1731 msgid "Published before " msgstr "Herausgegeben vor dem %s" -#: cps/web.py:1767 cps/web.py:1780 +#: cps/web.py:1777 cps/web.py:1790 msgid "search" msgstr "Suche" +#: cps/web.py:1816 +msgid "not found on GDrive" +msgstr "nicht in Gdrive gefunden" + #: cps/templates/index.xml:39 cps/templates/index.xml:42 -#: cps/templates/layout.html:141 cps/web.py:1858 +#: cps/templates/layout.html:143 cps/web.py:1872 msgid "Read Books" msgstr "Gelesene Bücher" #: cps/templates/index.xml:46 cps/templates/index.xml:49 -#: cps/templates/layout.html:143 cps/web.py:1861 +#: cps/templates/layout.html:145 cps/web.py:1875 msgid "Unread Books" msgstr "Ungelesene Bücher" -#: cps/web.py:1936 cps/web.py:1938 cps/web.py:1940 cps/web.py:1949 +#: cps/web.py:1950 cps/web.py:1952 cps/web.py:1954 cps/web.py:1963 msgid "Read a Book" msgstr "Lese ein Buch" -#: cps/web.py:2001 cps/web.py:2718 +#: cps/web.py:2015 cps/web.py:2751 msgid "Please fill out all fields!" msgstr "Bitte alle Felder ausfüllen!" -#: cps/web.py:2002 cps/web.py:2019 cps/web.py:2024 cps/web.py:2026 +#: cps/web.py:2016 cps/web.py:2033 cps/web.py:2038 cps/web.py:2040 msgid "register" msgstr "Registieren" -#: cps/web.py:2018 +#: cps/web.py:2032 msgid "An unknown error occured. Please try again later." msgstr "Es ist ein unbekannter Fehler aufgetreten. Bitte später erneut versuchen." -#: cps/web.py:2023 +#: cps/web.py:2037 msgid "This username or email address is already in use." msgstr "Der Benutzername oder die E-Mailadresse ist in bereits in Benutzung." -#: cps/web.py:2042 cps/web.py:2138 +#: cps/web.py:2056 cps/web.py:2152 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "Du bist nun eingeloggt als '%(nickname)s'" -#: cps/web.py:2047 +#: cps/web.py:2061 msgid "Wrong Username or Password" msgstr "Falscher Benutzername oder Passwort" -#: cps/web.py:2053 cps/web.py:2074 +#: cps/web.py:2067 cps/web.py:2088 msgid "login" msgstr "Login" -#: cps/web.py:2086 cps/web.py:2117 +#: cps/web.py:2100 cps/web.py:2131 msgid "Token not found" msgstr "Token wurde nicht gefunden" -#: cps/web.py:2094 cps/web.py:2125 +#: cps/web.py:2108 cps/web.py:2139 msgid "Token has expired" msgstr "Das Token ist abgelaufen" -#: cps/web.py:2102 +#: cps/web.py:2116 msgid "Success! Please return to your device" msgstr "Erfolg! Bitte zum Gerät zurückkehren" -#: cps/web.py:2152 +#: cps/web.py:2166 msgid "Please configure the SMTP mail settings first..." msgstr "Bitte zuerst die SMTP Mail Einstellung konfigurieren ..." -#: cps/web.py:2156 +#: cps/web.py:2170 #, python-format msgid "Book successfully send to %(kindlemail)s" msgstr "Buch erfolgreich versandt an %(kindlemail)s" -#: cps/web.py:2160 +#: cps/web.py:2174 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "Beim Senden des Buchs trat ein Fehler auf: %(res)s" -#: cps/web.py:2162 cps/web.py:2805 +#: cps/web.py:2176 cps/web.py:2839 msgid "Please configure your kindle email address first..." msgstr "Bitte die Kindle E-Mail Adresse zuuerst konfigurieren..." -#: cps/web.py:2206 +#: cps/web.py:2220 #, python-format msgid "Book has been added to shelf: %(sname)s" msgstr "Das Buch wurde dem Bücherregal: %(sname)s hinzugefügt" -#: cps/web.py:2244 +#: cps/web.py:2258 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "Das Buch wurde aus dem Bücherregal: %(sname)s entfernt" -#: cps/web.py:2250 +#: cps/web.py:2264 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "Keine Erlaubnis das Buch aus dem Bücherregal %(sname)s zu entfernen" -#: cps/web.py:2270 cps/web.py:2294 +#: cps/web.py:2284 cps/web.py:2308 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "Es existiert bereits ein Bücheregal mit dem Titel '%(title)s'" -#: cps/web.py:2275 +#: cps/web.py:2289 #, python-format msgid "Shelf %(title)s created" msgstr "Bücherregal %(title)s erzeugt" -#: cps/web.py:2277 cps/web.py:2305 +#: cps/web.py:2291 cps/web.py:2319 msgid "There was an error" msgstr "Es trat ein Fehler auf" -#: cps/web.py:2278 cps/web.py:2280 +#: cps/web.py:2292 cps/web.py:2294 msgid "create a shelf" msgstr "Bücherregal erzeugen" -#: cps/web.py:2303 +#: cps/web.py:2317 #, python-format msgid "Shelf %(title)s changed" msgstr "Bücherregal %(title)s verändert" -#: cps/web.py:2306 cps/web.py:2308 +#: cps/web.py:2320 cps/web.py:2322 msgid "Edit a shelf" msgstr "Bücherregal editieren" -#: cps/web.py:2329 +#: cps/web.py:2343 #, python-format msgid "successfully deleted shelf %(name)s" msgstr "Bücherregal %(name)s erfolgreich gelöscht" -#: cps/web.py:2351 +#: cps/web.py:2365 #, python-format msgid "Shelf: '%(name)s'" msgstr "Bücherregal: '%(name)s'" -#: cps/web.py:2354 +#: cps/web.py:2368 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Fehler beim Öffnen. Bücherregel exisitert nicht oder ist nicht zugänglich" -#: cps/web.py:2385 +#: cps/web.py:2399 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Reihenfolge in Bücherregal '%(name)s' verändern" -#: cps/web.py:2454 +#: cps/web.py:2469 msgid "Found an existing account for this email address." msgstr "Es existiert ein Benutzerkonto für diese E-Mailadresse" -#: cps/web.py:2456 cps/web.py:2460 +#: cps/web.py:2471 cps/web.py:2475 #, python-format msgid "%(name)s's profile" msgstr "%(name)s's Profil" -#: cps/web.py:2457 +#: cps/web.py:2472 msgid "Profile updated" msgstr "Profil aktualisiert" -#: cps/web.py:2469 +#: cps/web.py:2484 msgid "Unknown" msgstr "Unbekannt" -#: cps/web.py:2482 +#: cps/web.py:2497 msgid "Admin page" msgstr "Admin Seite" -#: cps/web.py:2553 -msgid "Keyfile location is not valid, please enter correct path" -msgstr "SSL-Keydatei Speicherort ist ungültig, bitte gültigen Pfad angeben" +#: cps/web.py:2520 +msgid "Import of optional GDrive requirements missing" +msgstr "Optionale Abhängigkeiten für GDrive fehlen" + +#: cps/web.py:2523 +msgid "client_secret.json is missing or not readable" +msgstr "client_secret.json Datei fehlt oder ist nicht lesbar" -#: cps/web.py:2556 cps/web.py:2567 cps/web.py:2660 cps/web.py:2679 -#: cps/web.py:2685 cps/web.py:2699 +#: cps/web.py:2528 cps/web.py:2553 +msgid "client_secret.json is not configured for web application" +msgstr "client_secret.json ist nicht für Webapplikation konfiguriert" + +#: cps/web.py:2556 cps/web.py:2582 cps/web.py:2593 cps/web.py:2686 +#: cps/web.py:2706 cps/web.py:2713 cps/web.py:2732 msgid "Basic Configuration" msgstr "Basis Konfiguration" -#: cps/web.py:2564 +#: cps/web.py:2579 +msgid "Keyfile location is not valid, please enter correct path" +msgstr "SSL-Keydatei Speicherort ist ungültig, bitte gültigen Pfad angeben" + +#: cps/web.py:2590 msgid "Certfile location is not valid, please enter correct path" msgstr "SSL-Certdatei Speicherort ist ungültig, bitte gültigen Pfad angeben" -#: cps/web.py:2657 +#: cps/web.py:2683 msgid "Logfile location is not valid, please enter correct path" msgstr "Speicherort Logdatei ist ungültig, bitte Pfad korrigieren" -#: cps/web.py:2672 +#: cps/web.py:2698 msgid "Calibre-web configuration updated" msgstr "Calibre-web Konfiguration wurde aktualisiert" -#: cps/web.py:2683 +#: cps/web.py:2710 msgid "DB location is not valid, please enter correct path" msgstr "DB Speicherort ist ungültig, bitte Pfad korrigieren" -#: cps/templates/admin.html:34 cps/web.py:2720 cps/web.py:2775 +#: cps/templates/admin.html:34 cps/web.py:2753 cps/web.py:2809 msgid "Add new user" msgstr "Neuen Benutzer hinzufügen" -#: cps/web.py:2765 +#: cps/web.py:2799 #, python-format msgid "User '%(user)s' created" msgstr "Benutzer '%(user)s' angelegt" -#: cps/web.py:2769 +#: cps/web.py:2803 msgid "Found an existing account for this email address or nickname." msgstr "" "Es existiert ein Benutzerkonto für diese Emailadresse oder den " "Benutzernamen." -#: cps/web.py:2793 +#: cps/web.py:2827 msgid "Mail settings updated" msgstr "E-Mail Einstellungen aktualisiert" -#: cps/web.py:2800 +#: cps/web.py:2834 #, python-format msgid "Test E-Mail successfully send to %(kindlemail)s" msgstr "Test E-Mail erfolgreich an %(kindlemail)s versendet" -#: cps/web.py:2803 +#: cps/web.py:2837 #, python-format msgid "There was an error sending the Test E-Mail: %(res)s" msgstr "Fehler beim versenden der Test E-Mail: %(res)s" -#: cps/web.py:2807 +#: cps/web.py:2841 msgid "E-Mail settings updated" msgstr "E-Mail Einstellungen wurden aktualisiert" -#: cps/web.py:2808 +#: cps/web.py:2842 msgid "Edit mail settings" msgstr "E-Mail Einstellungen editieren" -#: cps/web.py:2837 +#: cps/web.py:2871 #, python-format msgid "User '%(nick)s' deleted" msgstr "Benutzer '%(nick)s' gelöscht" -#: cps/web.py:2945 +#: cps/web.py:2980 #, python-format msgid "User '%(nick)s' updated" msgstr "Benutzer '%(nick)s' aktualisiert" -#: cps/web.py:2948 +#: cps/web.py:2983 msgid "An unknown error occured." msgstr "Es ist ein unbekanter Fehler aufgetreten" -#: cps/web.py:2951 +#: cps/web.py:2986 #, python-format msgid "Edit User %(nick)s" msgstr "Benutzer %(nick)s bearbeiten" -#: cps/web.py:2967 +#: cps/web.py:3002 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "" "Buch öffnen fehlgeschlagen. Datei existiert nicht, oder ist nicht " "zugänglich" -#: cps/web.py:2982 cps/web.py:3193 cps/web.py:3198 cps/web.py:3344 +#: cps/web.py:3017 cps/web.py:3228 cps/web.py:3233 cps/web.py:3379 msgid "edit metadata" msgstr "Metadaten editieren" -#: cps/web.py:2992 cps/web.py:3238 +#: cps/web.py:3027 cps/web.py:3273 #, python-format msgid "File extension \"%s\" is not allowed to be uploaded to this server" msgstr "Die Dateiendung \"%s\" kann nicht auf diesen Server hochgeladen werden" -#: cps/web.py:3003 +#: cps/web.py:3038 #, python-format msgid "Failed to store file %s." msgstr "Fehler beim speichern der Datei %s." -#: cps/web.py:3025 cps/web.py:3029 +#: cps/web.py:3060 cps/web.py:3064 msgid "unknown" msgstr "Unbekannt" -#: cps/web.py:3052 +#: cps/web.py:3087 msgid "Cover is not a jpg file, can't save" msgstr "Cover ist keine JPG Datei, konnte nicht gespeichert werden" -#: cps/web.py:3244 +#: cps/web.py:3279 msgid "File to be uploaded must have an extension" msgstr "Datei müssen eine Erweiterung haben, um hochgeladen zu werden" -#: cps/web.py:3263 +#: cps/web.py:3298 #, python-format msgid "Failed to create path %s (Permission denied)." msgstr "Fehler beim Erzeugen des Pfads %s (Zugriff verweigert)" -#: cps/web.py:3268 +#: cps/web.py:3303 #, python-format msgid "Failed to store file %s (Permission denied)." msgstr "Fehler beim speichern der Datei %s (Zugriff verweigert)" -#: cps/web.py:3273 +#: cps/web.py:3308 #, python-format msgid "Failed to delete file %s (Permission denied)." msgstr "Fehler beim Löschen von Datei %s (Zugriff verweigert)" @@ -525,7 +549,7 @@ msgstr "Kindle" msgid "DLS" msgstr "DLS" -#: cps/templates/admin.html:12 cps/templates/layout.html:69 +#: cps/templates/admin.html:12 cps/templates/layout.html:71 msgid "Admin" msgstr "Admin" @@ -534,7 +558,7 @@ msgstr "Admin" msgid "Download" msgstr "Download" -#: cps/templates/admin.html:14 cps/templates/layout.html:62 +#: cps/templates/admin.html:14 cps/templates/layout.html:64 msgid "Upload" msgstr "Hochladen" @@ -586,7 +610,7 @@ msgstr "Konfiguration" msgid "Calibre DB dir" msgstr "Calibre DB Pfad" -#: cps/templates/admin.html:61 cps/templates/config_edit.html:91 +#: cps/templates/admin.html:61 cps/templates/config_edit.html:87 msgid "Log Level" msgstr "Log Level" @@ -594,7 +618,7 @@ msgstr "Log Level" msgid "Port" msgstr "Port" -#: cps/templates/admin.html:63 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:63 cps/templates/config_edit.html:64 msgid "Books per page" msgstr "Bücher pro Seite" @@ -657,9 +681,9 @@ msgstr "Ok" #: cps/templates/admin.html:105 cps/templates/admin.html:119 #: cps/templates/book_edit.html:135 cps/templates/book_edit.html:157 -#: cps/templates/config_edit.html:223 cps/templates/email_edit.html:36 +#: cps/templates/config_edit.html:219 cps/templates/email_edit.html:36 #: cps/templates/shelf.html:60 cps/templates/shelf_edit.html:19 -#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:139 +#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:147 msgid "Back" msgstr "Zurück" @@ -705,7 +729,7 @@ msgstr "Beschreibung" msgid "Tags" msgstr "Tags" -#: cps/templates/book_edit.html:39 cps/templates/layout.html:152 +#: cps/templates/book_edit.html:39 cps/templates/layout.html:154 #: cps/templates/search_form.html:54 msgid "Series" msgstr "Serien" @@ -754,9 +778,9 @@ msgstr "Buch nach Bearbeitung ansehen" msgid "Get metadata" msgstr "Metadaten laden" -#: cps/templates/book_edit.html:134 cps/templates/config_edit.html:221 +#: cps/templates/book_edit.html:134 cps/templates/config_edit.html:217 #: cps/templates/login.html:20 cps/templates/search_form.html:96 -#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:145 msgid "Submit" msgstr "Abschicken" @@ -784,7 +808,7 @@ msgstr "Suchbegriff" msgid " Search keyword " msgstr "Suchbegriff" -#: cps/templates/book_edit.html:175 cps/templates/layout.html:44 +#: cps/templates/book_edit.html:175 cps/templates/layout.html:46 msgid "Go!" msgstr "Los!" @@ -796,7 +820,7 @@ msgstr "Klicke auf das Bild um die Metadaten zu übertragen" msgid "Loading..." msgstr "Lade..." -#: cps/templates/book_edit.html:196 cps/templates/layout.html:216 +#: cps/templates/book_edit.html:196 cps/templates/layout.html:218 msgid "Close" msgstr "Schließen" @@ -821,184 +845,180 @@ msgstr "Kein Ergebniss! Bitte anderen Begriff versuchen" msgid "Location of Calibre database" msgstr "Speicherort der Calibre Datenbank" -#: cps/templates/config_edit.html:13 +#: cps/templates/config_edit.html:12 msgid "Use google drive?" msgstr "Google Drive benutzen" -#: cps/templates/config_edit.html:17 -msgid "Client id" -msgstr "Benutzer Id" - -#: cps/templates/config_edit.html:21 -msgid "Client secret" -msgstr "Benutzer Secret" - -#: cps/templates/config_edit.html:25 -msgid "Calibre Base URL" -msgstr "Calibnre Basis URL" +#: cps/templates/config_edit.html:18 +msgid "Google drive config problem" +msgstr "Google Drive Konfigurationsproblem" -#: cps/templates/config_edit.html:29 +#: cps/templates/config_edit.html:28 msgid "Google drive Calibre folder" msgstr "Google Drive Calibre Ordner" -#: cps/templates/config_edit.html:38 +#: cps/templates/config_edit.html:36 msgid "Metadata Watch Channel ID" msgstr "Matadata Überwachungs-ID" -#: cps/templates/config_edit.html:52 +#: cps/templates/config_edit.html:39 +msgid "Revoke" +msgstr "Widerrufen" + +#: cps/templates/config_edit.html:48 msgid "Server Port" msgstr "Server Port" -#: cps/templates/config_edit.html:56 +#: cps/templates/config_edit.html:52 msgid "SSL certfile location (leave it empty for non-SSL Servers)" msgstr "SSL Certdatei Speicherort (leerlassen für nicht SSL Server)" -#: cps/templates/config_edit.html:60 +#: cps/templates/config_edit.html:56 msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "SSL Keydatei Speicherort (leerlassen für nicht SSL Server)" -#: cps/templates/config_edit.html:64 cps/templates/layout.html:128 -#: cps/templates/layout.html:129 cps/templates/shelf_edit.html:7 +#: cps/templates/config_edit.html:60 cps/templates/layout.html:130 +#: cps/templates/layout.html:131 cps/templates/shelf_edit.html:7 msgid "Title" msgstr "Titel" -#: cps/templates/config_edit.html:72 +#: cps/templates/config_edit.html:68 msgid "No. of random books to show" msgstr "Anzahl Anzeige zufällige Bücher" -#: cps/templates/config_edit.html:76 +#: cps/templates/config_edit.html:72 msgid "Regular expression for ignoring columns" msgstr "Regulärer Ausdruck um Spalten zu ignorien" -#: cps/templates/config_edit.html:80 +#: cps/templates/config_edit.html:76 msgid "Regular expression for title sorting" msgstr "Regulärer Ausdruck für Titelsortierung" -#: cps/templates/config_edit.html:84 +#: cps/templates/config_edit.html:80 msgid "Tags for Mature Content" msgstr "Kategorien für Erwachsenencontent" -#: cps/templates/config_edit.html:100 +#: cps/templates/config_edit.html:96 msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "Pfad und Name der Logdatei (calibre-web.log bei keinem Eintrag)" -#: cps/templates/config_edit.html:106 +#: cps/templates/config_edit.html:102 msgid "Enable uploading" msgstr "Hochladen aktivieren" -#: cps/templates/config_edit.html:110 +#: cps/templates/config_edit.html:106 msgid "Enable anonymous browsing" msgstr "Anonymes Browsen aktivieren" -#: cps/templates/config_edit.html:114 +#: cps/templates/config_edit.html:110 msgid "Enable public registration" msgstr "Öffentliche Registrierung aktivieren" -#: cps/templates/config_edit.html:118 +#: cps/templates/config_edit.html:114 msgid "Enable remote login (\"magic link\")" msgstr "Remote login aktivieren (\"Magischer Link\")" -#: cps/templates/config_edit.html:123 +#: cps/templates/config_edit.html:119 msgid "Use" msgstr "Benutze" -#: cps/templates/config_edit.html:124 +#: cps/templates/config_edit.html:120 msgid "Obtain an API Key" msgstr "Einen API Schlüssel erhalten" -#: cps/templates/config_edit.html:128 +#: cps/templates/config_edit.html:124 msgid "Goodreads API Key" msgstr "Öffentlicher Goodreads API Schlüssel" -#: cps/templates/config_edit.html:132 +#: cps/templates/config_edit.html:128 msgid "Goodreads API Secret" msgstr "eheimer Goodreads API Schlüssel" -#: cps/templates/config_edit.html:137 +#: cps/templates/config_edit.html:133 msgid "Default Settings for new users" msgstr "Default Einstellungen für neue Benutzer" -#: cps/templates/config_edit.html:140 cps/templates/user_edit.html:94 +#: cps/templates/config_edit.html:136 cps/templates/user_edit.html:102 msgid "Admin user" msgstr "Admin Benutzer" -#: cps/templates/config_edit.html:144 cps/templates/user_edit.html:103 +#: cps/templates/config_edit.html:140 cps/templates/user_edit.html:111 msgid "Allow Downloads" msgstr "Downloads erlauben" -#: cps/templates/config_edit.html:148 cps/templates/user_edit.html:107 +#: cps/templates/config_edit.html:144 cps/templates/user_edit.html:115 msgid "Allow Uploads" msgstr "Uploads erlauben" -#: cps/templates/config_edit.html:152 cps/templates/user_edit.html:111 +#: cps/templates/config_edit.html:148 cps/templates/user_edit.html:119 msgid "Allow Edit" msgstr "Bearbeiten erlauben" -#: cps/templates/config_edit.html:156 cps/templates/user_edit.html:115 +#: cps/templates/config_edit.html:152 cps/templates/user_edit.html:123 msgid "Allow Delete books" msgstr "Bücher löschen erlauben" -#: cps/templates/config_edit.html:160 cps/templates/user_edit.html:120 +#: cps/templates/config_edit.html:156 cps/templates/user_edit.html:128 msgid "Allow Changing Password" msgstr "Passwort ändern erlauben" -#: cps/templates/config_edit.html:164 cps/templates/user_edit.html:124 +#: cps/templates/config_edit.html:160 cps/templates/user_edit.html:132 msgid "Allow Editing Public Shelfs" msgstr "Öffentliche Bücherregale editieren erlauben" -#: cps/templates/config_edit.html:168 +#: cps/templates/config_edit.html:164 msgid "Default visiblities for new users" msgstr "Default Sichtbarkeiten für neue Benutzer" -#: cps/templates/config_edit.html:172 cps/templates/user_edit.html:46 +#: cps/templates/config_edit.html:168 cps/templates/user_edit.html:54 msgid "Show random books" msgstr "Zeige Zufällige Bücher" -#: cps/templates/config_edit.html:176 cps/templates/user_edit.html:50 +#: cps/templates/config_edit.html:172 cps/templates/user_edit.html:58 msgid "Show recent books" msgstr "Zeige kürzlich hinzugefügte Bücher" -#: cps/templates/config_edit.html:180 cps/templates/user_edit.html:54 +#: cps/templates/config_edit.html:176 cps/templates/user_edit.html:62 msgid "Show sorted books" msgstr "Zeige Bücher sortiert" -#: cps/templates/config_edit.html:184 cps/templates/user_edit.html:58 +#: cps/templates/config_edit.html:180 cps/templates/user_edit.html:66 msgid "Show hot books" msgstr "Zeige Auswahl Beliebte Bücher" -#: cps/templates/config_edit.html:188 cps/templates/user_edit.html:62 +#: cps/templates/config_edit.html:184 cps/templates/user_edit.html:70 msgid "Show best rated books" msgstr "Zeige am besten bewertete Bücher" -#: cps/templates/config_edit.html:192 cps/templates/user_edit.html:66 +#: cps/templates/config_edit.html:188 cps/templates/user_edit.html:74 msgid "Show language selection" msgstr "Zeige Sprachauswahl" -#: cps/templates/config_edit.html:196 cps/templates/user_edit.html:70 +#: cps/templates/config_edit.html:192 cps/templates/user_edit.html:78 msgid "Show series selection" msgstr "Zeige Serienauswahl" -#: cps/templates/config_edit.html:200 cps/templates/user_edit.html:74 +#: cps/templates/config_edit.html:196 cps/templates/user_edit.html:82 msgid "Show category selection" msgstr "Zeige Kategorienauswahl" -#: cps/templates/config_edit.html:204 cps/templates/user_edit.html:78 +#: cps/templates/config_edit.html:200 cps/templates/user_edit.html:86 msgid "Show author selection" msgstr "Zeige Autorenauswahl" -#: cps/templates/config_edit.html:208 cps/templates/user_edit.html:82 +#: cps/templates/config_edit.html:204 cps/templates/user_edit.html:90 msgid "Show read and unread" msgstr "Zeige Gelesen/Ungelesen Auswahl" -#: cps/templates/config_edit.html:212 cps/templates/user_edit.html:86 +#: cps/templates/config_edit.html:208 cps/templates/user_edit.html:94 msgid "Show random books in detail view" msgstr "Zeige zufällige Bücher in der Detailansicht" -#: cps/templates/config_edit.html:216 cps/templates/user_edit.html:99 +#: cps/templates/config_edit.html:212 cps/templates/user_edit.html:107 msgid "Show mature content" msgstr "Erwachsenencontent anzeigen" -#: cps/templates/config_edit.html:226 cps/templates/layout.html:77 +#: cps/templates/config_edit.html:222 cps/templates/layout.html:79 #: cps/templates/login.html:4 msgid "Login" msgstr "Login" @@ -1069,12 +1089,12 @@ msgstr "Einstellungen speichern" msgid "Save settings and send Test E-Mail" msgstr "Einstellungen speichern und Test E-Mail versenden" -#: cps/templates/feed.xml:20 cps/templates/layout.html:200 +#: cps/templates/feed.xml:20 cps/templates/layout.html:202 msgid "Next" msgstr "Nächste" #: cps/templates/feed.xml:29 cps/templates/index.xml:7 -#: cps/templates/layout.html:41 cps/templates/layout.html:42 +#: cps/templates/layout.html:43 cps/templates/layout.html:44 msgid "Search" msgstr "Suche" @@ -1086,7 +1106,7 @@ msgstr "Entdecke (Zufälliges Buch)" msgid "Start" msgstr "Start" -#: cps/templates/index.xml:14 cps/templates/layout.html:134 +#: cps/templates/index.xml:14 cps/templates/layout.html:136 msgid "Hot Books" msgstr "Beliebte Bücher" @@ -1094,7 +1114,7 @@ msgstr "Beliebte Bücher" msgid "Popular publications from this catalog based on Downloads." msgstr "Beliebte Publikationen aus dieser Bibliothek basierend auf Downloadzahlen" -#: cps/templates/index.xml:20 cps/templates/layout.html:137 +#: cps/templates/index.xml:20 cps/templates/layout.html:139 msgid "Best rated Books" msgstr "Best bewertete Bücher" @@ -1114,7 +1134,7 @@ msgstr "Die neuesten Bücher" msgid "Show Random Books" msgstr "Zeige zufällige Bücher" -#: cps/templates/index.xml:52 cps/templates/layout.html:155 +#: cps/templates/index.xml:52 cps/templates/layout.html:157 msgid "Authors" msgstr "Autoren" @@ -1130,7 +1150,7 @@ msgstr "Bücher nach Kategorien sortiert" msgid "Books ordered by series" msgstr "Bücher nach Reihen geordnet" -#: cps/templates/index.xml:70 cps/templates/layout.html:161 +#: cps/templates/index.xml:70 cps/templates/layout.html:163 msgid "Public Shelves" msgstr "Öffentliche Bücherregale" @@ -1138,7 +1158,7 @@ msgstr "Öffentliche Bücherregale" msgid "Books organized in public shelfs, visible to everyone" msgstr "Bücher organisiert in öffentlichem Bücherregal, sichtbar für jedermann" -#: cps/templates/index.xml:77 cps/templates/layout.html:165 +#: cps/templates/index.xml:77 cps/templates/layout.html:167 msgid "Your Shelves" msgstr "Deine Bücherregale" @@ -1148,88 +1168,88 @@ msgstr "" "Persönliches Bücherregal des Benutzers, nur sichtbar für den aktuellen " "Benutzer" -#: cps/templates/layout.html:31 +#: cps/templates/layout.html:33 msgid "Toggle navigation" msgstr "Nagivation umschalten" -#: cps/templates/layout.html:52 +#: cps/templates/layout.html:54 msgid "Advanced Search" msgstr "Erweiterte Suche" -#: cps/templates/layout.html:73 +#: cps/templates/layout.html:75 msgid "Logout" msgstr "Logout" -#: cps/templates/layout.html:78 cps/templates/register.html:18 +#: cps/templates/layout.html:80 cps/templates/register.html:18 msgid "Register" msgstr "Registrieren" -#: cps/templates/layout.html:103 +#: cps/templates/layout.html:105 msgid "Uploading..." msgstr "Hochladen..." -#: cps/templates/layout.html:104 +#: cps/templates/layout.html:106 msgid "please don't refresh the page" msgstr "Bitte die Seite nicht neu laden" -#: cps/templates/layout.html:115 +#: cps/templates/layout.html:117 msgid "Browse" msgstr "Browsen" -#: cps/templates/layout.html:117 +#: cps/templates/layout.html:119 msgid "Recently Added" msgstr "Kürzlich hinzugefügt" -#: cps/templates/layout.html:122 +#: cps/templates/layout.html:124 msgid "Sorted Books" msgstr "Bücher Sortiert" -#: cps/templates/layout.html:126 cps/templates/layout.html:127 #: cps/templates/layout.html:128 cps/templates/layout.html:129 +#: cps/templates/layout.html:130 cps/templates/layout.html:131 msgid "Sort By" msgstr "Sortiert nach" -#: cps/templates/layout.html:126 +#: cps/templates/layout.html:128 msgid "Newest" msgstr "Neueste" -#: cps/templates/layout.html:127 +#: cps/templates/layout.html:129 msgid "Oldest" msgstr "Älteste" -#: cps/templates/layout.html:128 +#: cps/templates/layout.html:130 msgid "Ascending" msgstr "Aufsteigend" -#: cps/templates/layout.html:129 +#: cps/templates/layout.html:131 msgid "Descending" msgstr "Absteigend" -#: cps/templates/layout.html:146 +#: cps/templates/layout.html:148 msgid "Discover" msgstr "Entdecke" -#: cps/templates/layout.html:149 +#: cps/templates/layout.html:151 msgid "Categories" msgstr "Kategorien" -#: cps/templates/layout.html:158 cps/templates/search_form.html:75 +#: cps/templates/layout.html:160 cps/templates/search_form.html:75 msgid "Languages" msgstr "Sprachen" -#: cps/templates/layout.html:170 +#: cps/templates/layout.html:172 msgid "Create a Shelf" msgstr "Bücherregal erzeugen" -#: cps/templates/layout.html:171 cps/templates/stats.html:3 +#: cps/templates/layout.html:173 cps/templates/stats.html:3 msgid "About" msgstr "Über" -#: cps/templates/layout.html:185 +#: cps/templates/layout.html:187 msgid "Previous" msgstr "Voerheriger" -#: cps/templates/layout.html:212 +#: cps/templates/layout.html:214 msgid "Book Details" msgstr "Buchdetails" @@ -1400,18 +1420,30 @@ msgid "Kindle E-Mail" msgstr "Kindle E-Mail" #: cps/templates/user_edit.html:35 +msgid "Theme" +msgstr "Theme" + +#: cps/templates/user_edit.html:37 +msgid "Standard Theme" +msgstr "Standard Theme" + +#: cps/templates/user_edit.html:38 +msgid "caliBlur! Dark Theme (Beta)" +msgstr "caliBlur! Dunkles Theme (Beta)" + +#: cps/templates/user_edit.html:43 msgid "Show books with language" msgstr "Zeige nur Bücher mit dieser Sprache" -#: cps/templates/user_edit.html:37 +#: cps/templates/user_edit.html:45 msgid "Show all" msgstr "Zeige alle" -#: cps/templates/user_edit.html:131 +#: cps/templates/user_edit.html:139 msgid "Delete this user" msgstr "Benutzer löschen" -#: cps/templates/user_edit.html:146 +#: cps/templates/user_edit.html:154 msgid "Recent Downloads" msgstr "Letzte Downloads" diff --git a/cps/translations/es/LC_MESSAGES/messages.po b/cps/translations/es/LC_MESSAGES/messages.po index 116140a4..8e24f367 100644 --- a/cps/translations/es/LC_MESSAGES/messages.po +++ b/cps/translations/es/LC_MESSAGES/messages.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n" -"POT-Creation-Date: 2018-04-01 19:27+0200\n" +"POT-Creation-Date: 2018-06-02 10:45+0200\n" "PO-Revision-Date: 2017-04-04 15:09+0200\n" "Last-Translator: Juan F. Villa \n" "Language: es\n" @@ -29,57 +29,57 @@ msgstr "" msgid "not installed" msgstr "No instalado" -#: cps/helper.py:78 +#: cps/helper.py:79 #, python-format msgid "kindlegen binary %(kindlepath)s not found" msgstr "" -#: cps/helper.py:84 +#: cps/helper.py:85 #, python-format msgid "epub format not found for book id: %(book)d" msgstr "" -#: cps/helper.py:94 +#: cps/helper.py:95 msgid "kindlegen failed, no execution permissions" msgstr "" -#: cps/helper.py:109 +#: cps/helper.py:110 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "" -#: cps/helper.py:188 +#: cps/helper.py:189 #, python-format msgid "Failed to send mail: %s" msgstr "Fallo al enviar el correo : %s" -#: cps/helper.py:195 +#: cps/helper.py:196 msgid "Calibre-web test email" msgstr "Prueba de Correo Calibre-web" -#: cps/helper.py:196 cps/helper.py:208 +#: cps/helper.py:197 cps/helper.py:209 msgid "This email has been sent via calibre web." msgstr "Este mensaje ha sido enviado via Calibre Web." -#: cps/helper.py:205 cps/templates/detail.html:44 +#: cps/helper.py:206 cps/templates/detail.html:44 msgid "Send to Kindle" msgstr "Enviar a Kindle" -#: cps/helper.py:225 cps/helper.py:239 +#: cps/helper.py:226 cps/helper.py:240 msgid "Could not find any formats suitable for sending by email" msgstr "Formato no compatible para enviar por correo electronico" -#: cps/helper.py:340 +#: cps/helper.py:341 #, python-format msgid "Rename title from: \"%s\" to \"%s\" failed with error: %s" msgstr "" -#: cps/helper.py:349 +#: cps/helper.py:350 #, python-format msgid "Rename author from: \"%s\" to \"%s\" failed with error: %s" msgstr "" -#: cps/ub.py:684 +#: cps/ub.py:694 msgid "Guest" msgstr "Invitado" @@ -147,7 +147,7 @@ msgstr "Libros al azar" msgid "Author list" msgstr "Lista de autores" -#: cps/web.py:1220 cps/web.py:1278 cps/web.py:1408 cps/web.py:1903 +#: cps/web.py:1220 cps/web.py:1278 cps/web.py:1408 cps/web.py:1917 msgid "Error opening eBook. File does not exist or file is not accessible:" msgstr "Error en la apertura del eBook. El archivo no existe o no es accesible:" @@ -186,308 +186,330 @@ msgstr "" msgid "Statistics" msgstr "Estadisticas" -#: cps/web.py:1641 +#: cps/web.py:1573 +msgid "" +"Callback domain is not verified, please follow steps to verify domain in " +"google developer console" +msgstr "" + +#: cps/web.py:1651 msgid "Server restarted, please reload page" msgstr "Servidor reiniciado. Por favor, recargue la página" -#: cps/web.py:1643 +#: cps/web.py:1653 msgid "Performing shutdown of server, please close window" msgstr "Servidor en proceso de apagado. Por favor, cierre la ventana." -#: cps/web.py:1659 +#: cps/web.py:1669 msgid "Update done" msgstr "Actualización realizada" -#: cps/web.py:1716 +#: cps/web.py:1726 #, python-format msgid "Published after %s" msgstr "" -#: cps/web.py:1721 +#: cps/web.py:1731 msgid "Published before " msgstr "" -#: cps/web.py:1767 cps/web.py:1780 +#: cps/web.py:1777 cps/web.py:1790 msgid "search" msgstr "búsqueda" +#: cps/web.py:1816 +msgid "not found on GDrive" +msgstr "" + #: cps/templates/index.xml:39 cps/templates/index.xml:42 -#: cps/templates/layout.html:141 cps/web.py:1858 +#: cps/templates/layout.html:143 cps/web.py:1872 msgid "Read Books" msgstr "Libros leídos" #: cps/templates/index.xml:46 cps/templates/index.xml:49 -#: cps/templates/layout.html:143 cps/web.py:1861 +#: cps/templates/layout.html:145 cps/web.py:1875 msgid "Unread Books" msgstr "Libros no leídos" -#: cps/web.py:1936 cps/web.py:1938 cps/web.py:1940 cps/web.py:1949 +#: cps/web.py:1950 cps/web.py:1952 cps/web.py:1954 cps/web.py:1963 msgid "Read a Book" msgstr "Leer un libro" -#: cps/web.py:2001 cps/web.py:2718 +#: cps/web.py:2015 cps/web.py:2751 msgid "Please fill out all fields!" msgstr "¡Por favor completar todos los campos!" -#: cps/web.py:2002 cps/web.py:2019 cps/web.py:2024 cps/web.py:2026 +#: cps/web.py:2016 cps/web.py:2033 cps/web.py:2038 cps/web.py:2040 msgid "register" msgstr "registrarse" -#: cps/web.py:2018 +#: cps/web.py:2032 msgid "An unknown error occured. Please try again later." msgstr "Error desconocido. Por favor, inténtelo de nuevo mas tarde." -#: cps/web.py:2023 +#: cps/web.py:2037 msgid "This username or email address is already in use." msgstr "Usuario o dirección de correo en uso." -#: cps/web.py:2042 cps/web.py:2138 +#: cps/web.py:2056 cps/web.py:2152 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "Sesion iniciada como : '%(nickname)s'" -#: cps/web.py:2047 +#: cps/web.py:2061 msgid "Wrong Username or Password" msgstr "Usuario o contraseña invalido" -#: cps/web.py:2053 cps/web.py:2074 +#: cps/web.py:2067 cps/web.py:2088 msgid "login" msgstr "Iniciar sesión" -#: cps/web.py:2086 cps/web.py:2117 +#: cps/web.py:2100 cps/web.py:2131 msgid "Token not found" msgstr "" -#: cps/web.py:2094 cps/web.py:2125 +#: cps/web.py:2108 cps/web.py:2139 msgid "Token has expired" msgstr "" -#: cps/web.py:2102 +#: cps/web.py:2116 msgid "Success! Please return to your device" msgstr "" -#: cps/web.py:2152 +#: cps/web.py:2166 msgid "Please configure the SMTP mail settings first..." msgstr "Configurar primero los parametros SMTP por favor..." -#: cps/web.py:2156 +#: cps/web.py:2170 #, python-format msgid "Book successfully send to %(kindlemail)s" msgstr "Envio de Libro a %(kindlemail)s correctamente" -#: cps/web.py:2160 +#: cps/web.py:2174 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "Ha sucedido un error en el envio del Libro: %(res)s" -#: cps/web.py:2162 cps/web.py:2805 +#: cps/web.py:2176 cps/web.py:2839 msgid "Please configure your kindle email address first..." msgstr "Configurar primero la dirección de correo Kindle por favor..." -#: cps/web.py:2206 +#: cps/web.py:2220 #, python-format msgid "Book has been added to shelf: %(sname)s" msgstr "El libro fue agregado a el estante: %(sname)s" -#: cps/web.py:2244 +#: cps/web.py:2258 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "El libro fue removido del estante: %(sname)s" -#: cps/web.py:2250 +#: cps/web.py:2264 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "" -#: cps/web.py:2270 cps/web.py:2294 +#: cps/web.py:2284 cps/web.py:2308 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "Une étagère de ce nom '%(title)s' existe déjà." -#: cps/web.py:2275 +#: cps/web.py:2289 #, python-format msgid "Shelf %(title)s created" msgstr "Estante %(title)s creado" -#: cps/web.py:2277 cps/web.py:2305 +#: cps/web.py:2291 cps/web.py:2319 msgid "There was an error" msgstr "Ha sucedido un error" -#: cps/web.py:2278 cps/web.py:2280 +#: cps/web.py:2292 cps/web.py:2294 msgid "create a shelf" msgstr "crear un estante" -#: cps/web.py:2303 +#: cps/web.py:2317 #, python-format msgid "Shelf %(title)s changed" msgstr "Estante %(title)s cambiado" -#: cps/web.py:2306 cps/web.py:2308 +#: cps/web.py:2320 cps/web.py:2322 msgid "Edit a shelf" msgstr "Editar un estante" -#: cps/web.py:2329 +#: cps/web.py:2343 #, python-format msgid "successfully deleted shelf %(name)s" msgstr "Estante %(name)s fue borrado correctamente" -#: cps/web.py:2351 +#: cps/web.py:2365 #, python-format msgid "Shelf: '%(name)s'" msgstr "Estante: '%(name)s'" -#: cps/web.py:2354 +#: cps/web.py:2368 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "" -#: cps/web.py:2385 +#: cps/web.py:2399 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Cambiar orden del estante: '%(name)s'" -#: cps/web.py:2454 +#: cps/web.py:2469 msgid "Found an existing account for this email address." msgstr "Existe una cuenta vinculada a esta dirección de correo." -#: cps/web.py:2456 cps/web.py:2460 +#: cps/web.py:2471 cps/web.py:2475 #, python-format msgid "%(name)s's profile" msgstr "Perfil de %(name)s" -#: cps/web.py:2457 +#: cps/web.py:2472 msgid "Profile updated" msgstr "Perfil actualizado" -#: cps/web.py:2469 +#: cps/web.py:2484 msgid "Unknown" msgstr "" -#: cps/web.py:2482 +#: cps/web.py:2497 msgid "Admin page" msgstr "Página de administración" -#: cps/web.py:2553 -msgid "Keyfile location is not valid, please enter correct path" +#: cps/web.py:2520 +msgid "Import of optional GDrive requirements missing" msgstr "" -#: cps/web.py:2556 cps/web.py:2567 cps/web.py:2660 cps/web.py:2679 -#: cps/web.py:2685 cps/web.py:2699 +#: cps/web.py:2523 +msgid "client_secret.json is missing or not readable" +msgstr "" + +#: cps/web.py:2528 cps/web.py:2553 +msgid "client_secret.json is not configured for web application" +msgstr "" + +#: cps/web.py:2556 cps/web.py:2582 cps/web.py:2593 cps/web.py:2686 +#: cps/web.py:2706 cps/web.py:2713 cps/web.py:2732 msgid "Basic Configuration" msgstr "Configuración básica" -#: cps/web.py:2564 +#: cps/web.py:2579 +msgid "Keyfile location is not valid, please enter correct path" +msgstr "" + +#: cps/web.py:2590 msgid "Certfile location is not valid, please enter correct path" msgstr "" -#: cps/web.py:2657 +#: cps/web.py:2683 msgid "Logfile location is not valid, please enter correct path" msgstr "" -#: cps/web.py:2672 +#: cps/web.py:2698 msgid "Calibre-web configuration updated" msgstr "Configuración de Calibre-web actualizada" -#: cps/web.py:2683 +#: cps/web.py:2710 msgid "DB location is not valid, please enter correct path" msgstr "Localicación de la BD inválida. Por favor, introduzca la ruta correcta." -#: cps/templates/admin.html:34 cps/web.py:2720 cps/web.py:2775 +#: cps/templates/admin.html:34 cps/web.py:2753 cps/web.py:2809 msgid "Add new user" msgstr "Agregar un nuevo usuario" -#: cps/web.py:2765 +#: cps/web.py:2799 #, python-format msgid "User '%(user)s' created" msgstr "Usuario '%(user)s' creado" -#: cps/web.py:2769 +#: cps/web.py:2803 msgid "Found an existing account for this email address or nickname." msgstr "" "Se ha encontrado una cuenta vinculada a esta dirección de correo o nombre" " de usuario." -#: cps/web.py:2793 +#: cps/web.py:2827 msgid "Mail settings updated" msgstr "Parámetros de correo actualizados" -#: cps/web.py:2800 +#: cps/web.py:2834 #, python-format msgid "Test E-Mail successfully send to %(kindlemail)s" msgstr "Exito al realizar envio de prueba a %(kindlemail)s" -#: cps/web.py:2803 +#: cps/web.py:2837 #, python-format msgid "There was an error sending the Test E-Mail: %(res)s" msgstr "Error al realizar envio de prueba a E-Mail: %(res)s" -#: cps/web.py:2807 +#: cps/web.py:2841 msgid "E-Mail settings updated" msgstr "Ajustes de correo electrónico actualizados" -#: cps/web.py:2808 +#: cps/web.py:2842 msgid "Edit mail settings" msgstr "Editar parametros de correo" -#: cps/web.py:2837 +#: cps/web.py:2871 #, python-format msgid "User '%(nick)s' deleted" msgstr "Usuario '%(nick)s' borrado" -#: cps/web.py:2945 +#: cps/web.py:2980 #, python-format msgid "User '%(nick)s' updated" msgstr "Usuario '%(nick)s' actualizado" -#: cps/web.py:2948 +#: cps/web.py:2983 msgid "An unknown error occured." msgstr "Error inesperado." -#: cps/web.py:2951 +#: cps/web.py:2986 #, python-format msgid "Edit User %(nick)s" msgstr "Editar Usuario %(nick)s" -#: cps/web.py:2967 +#: cps/web.py:3002 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "" -#: cps/web.py:2982 cps/web.py:3193 cps/web.py:3198 cps/web.py:3344 +#: cps/web.py:3017 cps/web.py:3228 cps/web.py:3233 cps/web.py:3379 msgid "edit metadata" msgstr "editar metainformación" -#: cps/web.py:2992 cps/web.py:3238 +#: cps/web.py:3027 cps/web.py:3273 #, python-format msgid "File extension \"%s\" is not allowed to be uploaded to this server" msgstr "No se permite subir archivos con la extensión \"%s\" a este servidor" -#: cps/web.py:3003 +#: cps/web.py:3038 #, python-format msgid "Failed to store file %s." msgstr "" -#: cps/web.py:3025 cps/web.py:3029 +#: cps/web.py:3060 cps/web.py:3064 msgid "unknown" msgstr "" -#: cps/web.py:3052 +#: cps/web.py:3087 msgid "Cover is not a jpg file, can't save" msgstr "" -#: cps/web.py:3244 +#: cps/web.py:3279 msgid "File to be uploaded must have an extension" msgstr "El archivo a subir debe tener una extensión" -#: cps/web.py:3263 +#: cps/web.py:3298 #, python-format msgid "Failed to create path %s (Permission denied)." msgstr "Fallo al crear la ruta %s (permiso negado)" -#: cps/web.py:3268 +#: cps/web.py:3303 #, python-format msgid "Failed to store file %s (Permission denied)." msgstr "Fallo al almacenar el archivo %s (permiso negado)" -#: cps/web.py:3273 +#: cps/web.py:3308 #, python-format msgid "Failed to delete file %s (Permission denied)." msgstr "Fallo al borrar el archivo %s (permiso negado)" @@ -512,7 +534,7 @@ msgstr "Kindle" msgid "DLS" msgstr "DLS" -#: cps/templates/admin.html:12 cps/templates/layout.html:69 +#: cps/templates/admin.html:12 cps/templates/layout.html:71 msgid "Admin" msgstr "Administración" @@ -521,7 +543,7 @@ msgstr "Administración" msgid "Download" msgstr "Descarga" -#: cps/templates/admin.html:14 cps/templates/layout.html:62 +#: cps/templates/admin.html:14 cps/templates/layout.html:64 msgid "Upload" msgstr "Subir archivo" @@ -573,7 +595,7 @@ msgstr "Configuración" msgid "Calibre DB dir" msgstr "Dir DB Calibre" -#: cps/templates/admin.html:61 cps/templates/config_edit.html:91 +#: cps/templates/admin.html:61 cps/templates/config_edit.html:87 msgid "Log Level" msgstr "Nivel de registro" @@ -581,7 +603,7 @@ msgstr "Nivel de registro" msgid "Port" msgstr "Puerto" -#: cps/templates/admin.html:63 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:63 cps/templates/config_edit.html:64 msgid "Books per page" msgstr "Libros por página" @@ -644,9 +666,9 @@ msgstr "Ok" #: cps/templates/admin.html:105 cps/templates/admin.html:119 #: cps/templates/book_edit.html:135 cps/templates/book_edit.html:157 -#: cps/templates/config_edit.html:223 cps/templates/email_edit.html:36 +#: cps/templates/config_edit.html:219 cps/templates/email_edit.html:36 #: cps/templates/shelf.html:60 cps/templates/shelf_edit.html:19 -#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:139 +#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:147 msgid "Back" msgstr "Regresar" @@ -692,7 +714,7 @@ msgstr "Descripcion" msgid "Tags" msgstr "Etiqueta" -#: cps/templates/book_edit.html:39 cps/templates/layout.html:152 +#: cps/templates/book_edit.html:39 cps/templates/layout.html:154 #: cps/templates/search_form.html:54 msgid "Series" msgstr "Series" @@ -739,9 +761,9 @@ msgstr "Ver libro tras la edicion" msgid "Get metadata" msgstr "Obtener metainformación" -#: cps/templates/book_edit.html:134 cps/templates/config_edit.html:221 +#: cps/templates/book_edit.html:134 cps/templates/config_edit.html:217 #: cps/templates/login.html:20 cps/templates/search_form.html:96 -#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:145 msgid "Submit" msgstr "Enviar" @@ -769,7 +791,7 @@ msgstr "Palabra clave" msgid " Search keyword " msgstr "Buscar palabras clave" -#: cps/templates/book_edit.html:175 cps/templates/layout.html:44 +#: cps/templates/book_edit.html:175 cps/templates/layout.html:46 msgid "Go!" msgstr "¡Vamos!" @@ -781,7 +803,7 @@ msgstr "Haga clic en la portada para cargar la metainformación en el formulario msgid "Loading..." msgstr "Cargando..." -#: cps/templates/book_edit.html:196 cps/templates/layout.html:216 +#: cps/templates/book_edit.html:196 cps/templates/layout.html:218 msgid "Close" msgstr "Cerrar" @@ -806,184 +828,180 @@ msgstr "¡Sin resultados! Por favor, pruebe otra palabra clave." msgid "Location of Calibre database" msgstr "Ubicación de la base de datos Calibre" -#: cps/templates/config_edit.html:13 +#: cps/templates/config_edit.html:12 msgid "Use google drive?" msgstr "¿Utiliza google drive?" -#: cps/templates/config_edit.html:17 -msgid "Client id" -msgstr "Id cliente" - -#: cps/templates/config_edit.html:21 -msgid "Client secret" -msgstr "Contraseña cliente" - -#: cps/templates/config_edit.html:25 -msgid "Calibre Base URL" -msgstr "URL Base de Calibre" +#: cps/templates/config_edit.html:18 +msgid "Google drive config problem" +msgstr "" -#: cps/templates/config_edit.html:29 +#: cps/templates/config_edit.html:28 msgid "Google drive Calibre folder" msgstr "Carpeta Calibre de Google drive" -#: cps/templates/config_edit.html:38 +#: cps/templates/config_edit.html:36 msgid "Metadata Watch Channel ID" msgstr "Metadata Watch Channel ID" -#: cps/templates/config_edit.html:52 +#: cps/templates/config_edit.html:39 +msgid "Revoke" +msgstr "" + +#: cps/templates/config_edit.html:48 msgid "Server Port" msgstr "Puerto del servidor" -#: cps/templates/config_edit.html:56 +#: cps/templates/config_edit.html:52 msgid "SSL certfile location (leave it empty for non-SSL Servers)" msgstr "" -#: cps/templates/config_edit.html:60 +#: cps/templates/config_edit.html:56 msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "" -#: cps/templates/config_edit.html:64 cps/templates/layout.html:128 -#: cps/templates/layout.html:129 cps/templates/shelf_edit.html:7 +#: cps/templates/config_edit.html:60 cps/templates/layout.html:130 +#: cps/templates/layout.html:131 cps/templates/shelf_edit.html:7 msgid "Title" msgstr "Titulo" -#: cps/templates/config_edit.html:72 +#: cps/templates/config_edit.html:68 msgid "No. of random books to show" msgstr "Número de libros aletorios a mostrar" -#: cps/templates/config_edit.html:76 +#: cps/templates/config_edit.html:72 msgid "Regular expression for ignoring columns" msgstr "Expresión regular para ignorar columnas" -#: cps/templates/config_edit.html:80 +#: cps/templates/config_edit.html:76 msgid "Regular expression for title sorting" msgstr "Expresión regular para ordenar títulos" -#: cps/templates/config_edit.html:84 +#: cps/templates/config_edit.html:80 msgid "Tags for Mature Content" msgstr "" -#: cps/templates/config_edit.html:100 +#: cps/templates/config_edit.html:96 msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "" -#: cps/templates/config_edit.html:106 +#: cps/templates/config_edit.html:102 msgid "Enable uploading" msgstr "Permitir subida" -#: cps/templates/config_edit.html:110 +#: cps/templates/config_edit.html:106 msgid "Enable anonymous browsing" msgstr "Permitir navegación anónima" -#: cps/templates/config_edit.html:114 +#: cps/templates/config_edit.html:110 msgid "Enable public registration" msgstr "Permitir registro público" -#: cps/templates/config_edit.html:118 +#: cps/templates/config_edit.html:114 msgid "Enable remote login (\"magic link\")" msgstr "" -#: cps/templates/config_edit.html:123 +#: cps/templates/config_edit.html:119 msgid "Use" msgstr "" -#: cps/templates/config_edit.html:124 +#: cps/templates/config_edit.html:120 msgid "Obtain an API Key" msgstr "" -#: cps/templates/config_edit.html:128 +#: cps/templates/config_edit.html:124 msgid "Goodreads API Key" msgstr "" -#: cps/templates/config_edit.html:132 +#: cps/templates/config_edit.html:128 msgid "Goodreads API Secret" msgstr "" -#: cps/templates/config_edit.html:137 +#: cps/templates/config_edit.html:133 msgid "Default Settings for new users" msgstr "Ajustes por defecto para nuevos usuarios" -#: cps/templates/config_edit.html:140 cps/templates/user_edit.html:94 +#: cps/templates/config_edit.html:136 cps/templates/user_edit.html:102 msgid "Admin user" msgstr "Usuario Administrador" -#: cps/templates/config_edit.html:144 cps/templates/user_edit.html:103 +#: cps/templates/config_edit.html:140 cps/templates/user_edit.html:111 msgid "Allow Downloads" msgstr "Permitir descargas" -#: cps/templates/config_edit.html:148 cps/templates/user_edit.html:107 +#: cps/templates/config_edit.html:144 cps/templates/user_edit.html:115 msgid "Allow Uploads" msgstr "Permitir subidas de archivos" -#: cps/templates/config_edit.html:152 cps/templates/user_edit.html:111 +#: cps/templates/config_edit.html:148 cps/templates/user_edit.html:119 msgid "Allow Edit" msgstr "Permitir editar" -#: cps/templates/config_edit.html:156 cps/templates/user_edit.html:115 +#: cps/templates/config_edit.html:152 cps/templates/user_edit.html:123 msgid "Allow Delete books" msgstr "" -#: cps/templates/config_edit.html:160 cps/templates/user_edit.html:120 +#: cps/templates/config_edit.html:156 cps/templates/user_edit.html:128 msgid "Allow Changing Password" msgstr "Permitir cambiar la clave" -#: cps/templates/config_edit.html:164 cps/templates/user_edit.html:124 +#: cps/templates/config_edit.html:160 cps/templates/user_edit.html:132 msgid "Allow Editing Public Shelfs" msgstr "" -#: cps/templates/config_edit.html:168 +#: cps/templates/config_edit.html:164 msgid "Default visiblities for new users" msgstr "" -#: cps/templates/config_edit.html:172 cps/templates/user_edit.html:46 +#: cps/templates/config_edit.html:168 cps/templates/user_edit.html:54 msgid "Show random books" msgstr "Mostrar libros al azar" -#: cps/templates/config_edit.html:176 cps/templates/user_edit.html:50 +#: cps/templates/config_edit.html:172 cps/templates/user_edit.html:58 msgid "Show recent books" msgstr "" -#: cps/templates/config_edit.html:180 cps/templates/user_edit.html:54 +#: cps/templates/config_edit.html:176 cps/templates/user_edit.html:62 msgid "Show sorted books" msgstr "" -#: cps/templates/config_edit.html:184 cps/templates/user_edit.html:58 +#: cps/templates/config_edit.html:180 cps/templates/user_edit.html:66 msgid "Show hot books" msgstr "Mostrar libros populares" -#: cps/templates/config_edit.html:188 cps/templates/user_edit.html:62 +#: cps/templates/config_edit.html:184 cps/templates/user_edit.html:70 msgid "Show best rated books" msgstr "Mostrar libros mejor valorados" -#: cps/templates/config_edit.html:192 cps/templates/user_edit.html:66 +#: cps/templates/config_edit.html:188 cps/templates/user_edit.html:74 msgid "Show language selection" msgstr "Mostrar lenguaje seleccionado" -#: cps/templates/config_edit.html:196 cps/templates/user_edit.html:70 +#: cps/templates/config_edit.html:192 cps/templates/user_edit.html:78 msgid "Show series selection" msgstr "Mostrar series seleccionadas" -#: cps/templates/config_edit.html:200 cps/templates/user_edit.html:74 +#: cps/templates/config_edit.html:196 cps/templates/user_edit.html:82 msgid "Show category selection" msgstr "Mostrar categorias elegidas" -#: cps/templates/config_edit.html:204 cps/templates/user_edit.html:78 +#: cps/templates/config_edit.html:200 cps/templates/user_edit.html:86 msgid "Show author selection" msgstr "Mostrar selección de autores" -#: cps/templates/config_edit.html:208 cps/templates/user_edit.html:82 +#: cps/templates/config_edit.html:204 cps/templates/user_edit.html:90 msgid "Show read and unread" msgstr "Mostrar leídos y no leídos" -#: cps/templates/config_edit.html:212 cps/templates/user_edit.html:86 +#: cps/templates/config_edit.html:208 cps/templates/user_edit.html:94 msgid "Show random books in detail view" msgstr "Mostrar libro aleatorios con vista detallada" -#: cps/templates/config_edit.html:216 cps/templates/user_edit.html:99 +#: cps/templates/config_edit.html:212 cps/templates/user_edit.html:107 msgid "Show mature content" msgstr "" -#: cps/templates/config_edit.html:226 cps/templates/layout.html:77 +#: cps/templates/config_edit.html:222 cps/templates/layout.html:79 #: cps/templates/login.html:4 msgid "Login" msgstr "Inicio de Sesion" @@ -1054,12 +1072,12 @@ msgstr "Guardar cambios" msgid "Save settings and send Test E-Mail" msgstr "Guardar cambios y enviar un correo de prueba" -#: cps/templates/feed.xml:20 cps/templates/layout.html:200 +#: cps/templates/feed.xml:20 cps/templates/layout.html:202 msgid "Next" msgstr "Siguiente" #: cps/templates/feed.xml:29 cps/templates/index.xml:7 -#: cps/templates/layout.html:41 cps/templates/layout.html:42 +#: cps/templates/layout.html:43 cps/templates/layout.html:44 msgid "Search" msgstr "Buscar" @@ -1071,7 +1089,7 @@ msgstr "Descubrir (Libros al azar)" msgid "Start" msgstr "Iniciar" -#: cps/templates/index.xml:14 cps/templates/layout.html:134 +#: cps/templates/index.xml:14 cps/templates/layout.html:136 msgid "Hot Books" msgstr "Libros Populares" @@ -1079,7 +1097,7 @@ msgstr "Libros Populares" msgid "Popular publications from this catalog based on Downloads." msgstr "Publicaciones mas populares para este catálogo basadas en las descargas." -#: cps/templates/index.xml:20 cps/templates/layout.html:137 +#: cps/templates/index.xml:20 cps/templates/layout.html:139 msgid "Best rated Books" msgstr "Libros mejor valorados" @@ -1099,7 +1117,7 @@ msgstr "Libros recientes" msgid "Show Random Books" msgstr "Mostrar libros al azar" -#: cps/templates/index.xml:52 cps/templates/layout.html:155 +#: cps/templates/index.xml:52 cps/templates/layout.html:157 msgid "Authors" msgstr "Autores" @@ -1115,7 +1133,7 @@ msgstr "Libros ordenados por Categorias" msgid "Books ordered by series" msgstr "Libros ordenados por Series" -#: cps/templates/index.xml:70 cps/templates/layout.html:161 +#: cps/templates/index.xml:70 cps/templates/layout.html:163 msgid "Public Shelves" msgstr "Estantes públicos" @@ -1123,7 +1141,7 @@ msgstr "Estantes públicos" msgid "Books organized in public shelfs, visible to everyone" msgstr "" -#: cps/templates/index.xml:77 cps/templates/layout.html:165 +#: cps/templates/index.xml:77 cps/templates/layout.html:167 msgid "Your Shelves" msgstr "Sus estantes" @@ -1131,88 +1149,88 @@ msgstr "Sus estantes" msgid "User's own shelfs, only visible to the current user himself" msgstr "" -#: cps/templates/layout.html:31 +#: cps/templates/layout.html:33 msgid "Toggle navigation" msgstr "Alternar navegación" -#: cps/templates/layout.html:52 +#: cps/templates/layout.html:54 msgid "Advanced Search" msgstr "Busqueda avanzada" -#: cps/templates/layout.html:73 +#: cps/templates/layout.html:75 msgid "Logout" msgstr "Cerrar sesión" -#: cps/templates/layout.html:78 cps/templates/register.html:18 +#: cps/templates/layout.html:80 cps/templates/register.html:18 msgid "Register" msgstr "Registro" -#: cps/templates/layout.html:103 +#: cps/templates/layout.html:105 msgid "Uploading..." msgstr "" -#: cps/templates/layout.html:104 +#: cps/templates/layout.html:106 msgid "please don't refresh the page" msgstr "" -#: cps/templates/layout.html:115 +#: cps/templates/layout.html:117 msgid "Browse" msgstr "Explorar" -#: cps/templates/layout.html:117 +#: cps/templates/layout.html:119 msgid "Recently Added" msgstr "" -#: cps/templates/layout.html:122 +#: cps/templates/layout.html:124 msgid "Sorted Books" msgstr "" -#: cps/templates/layout.html:126 cps/templates/layout.html:127 #: cps/templates/layout.html:128 cps/templates/layout.html:129 +#: cps/templates/layout.html:130 cps/templates/layout.html:131 msgid "Sort By" msgstr "" -#: cps/templates/layout.html:126 +#: cps/templates/layout.html:128 msgid "Newest" msgstr "" -#: cps/templates/layout.html:127 +#: cps/templates/layout.html:129 msgid "Oldest" msgstr "" -#: cps/templates/layout.html:128 +#: cps/templates/layout.html:130 msgid "Ascending" msgstr "" -#: cps/templates/layout.html:129 +#: cps/templates/layout.html:131 msgid "Descending" msgstr "" -#: cps/templates/layout.html:146 +#: cps/templates/layout.html:148 msgid "Discover" msgstr "Descubrir" -#: cps/templates/layout.html:149 +#: cps/templates/layout.html:151 msgid "Categories" msgstr "Categoria" -#: cps/templates/layout.html:158 cps/templates/search_form.html:75 +#: cps/templates/layout.html:160 cps/templates/search_form.html:75 msgid "Languages" msgstr "Lenguaje" -#: cps/templates/layout.html:170 +#: cps/templates/layout.html:172 msgid "Create a Shelf" msgstr "Crear un estante" -#: cps/templates/layout.html:171 cps/templates/stats.html:3 +#: cps/templates/layout.html:173 cps/templates/stats.html:3 msgid "About" msgstr "Acerca de" -#: cps/templates/layout.html:185 +#: cps/templates/layout.html:187 msgid "Previous" msgstr "" -#: cps/templates/layout.html:212 +#: cps/templates/layout.html:214 msgid "Book Details" msgstr "" @@ -1383,18 +1401,30 @@ msgid "Kindle E-Mail" msgstr "Correo del Kindle" #: cps/templates/user_edit.html:35 +msgid "Theme" +msgstr "" + +#: cps/templates/user_edit.html:37 +msgid "Standard Theme" +msgstr "" + +#: cps/templates/user_edit.html:38 +msgid "caliBlur! Dark Theme (Beta)" +msgstr "" + +#: cps/templates/user_edit.html:43 msgid "Show books with language" msgstr "Mostrar lenguaje de los libros" -#: cps/templates/user_edit.html:37 +#: cps/templates/user_edit.html:45 msgid "Show all" msgstr "Mostrar Todo" -#: cps/templates/user_edit.html:131 +#: cps/templates/user_edit.html:139 msgid "Delete this user" msgstr "Borrar este usuario" -#: cps/templates/user_edit.html:146 +#: cps/templates/user_edit.html:154 msgid "Recent Downloads" msgstr "Descargas Recientes" diff --git a/cps/translations/fr/LC_MESSAGES/messages.po b/cps/translations/fr/LC_MESSAGES/messages.po index dfae85e0..2536698f 100644 --- a/cps/translations/fr/LC_MESSAGES/messages.po +++ b/cps/translations/fr/LC_MESSAGES/messages.po @@ -20,7 +20,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n" -"POT-Creation-Date: 2018-04-13 21:13+0200\n" +"POT-Creation-Date: 2018-06-02 10:45+0200\n" "PO-Revision-Date: 2017-10-26 22:42+0200\n" "Last-Translator: Nicolas Roudninski \n" "Language: fr\n" @@ -153,7 +153,7 @@ msgstr "Livres au hasard" msgid "Author list" msgstr "Liste des auteurs" -#: cps/web.py:1220 cps/web.py:1278 cps/web.py:1408 cps/web.py:1903 +#: cps/web.py:1220 cps/web.py:1278 cps/web.py:1408 cps/web.py:1917 msgid "Error opening eBook. File does not exist or file is not accessible:" msgstr "" "Erreur d'ouverture du livre numérique. Le fichier n'existe pas ou n'est " @@ -194,308 +194,330 @@ msgstr "" msgid "Statistics" msgstr "Statistiques" -#: cps/web.py:1641 +#: cps/web.py:1573 +msgid "" +"Callback domain is not verified, please follow steps to verify domain in " +"google developer console" +msgstr "" + +#: cps/web.py:1651 msgid "Server restarted, please reload page" msgstr "Serveur redémarré, merci de rafraîchir la page" -#: cps/web.py:1643 +#: cps/web.py:1653 msgid "Performing shutdown of server, please close window" msgstr "" -#: cps/web.py:1659 +#: cps/web.py:1669 msgid "Update done" msgstr "Mise à jour effectuée" -#: cps/web.py:1716 +#: cps/web.py:1726 #, python-format msgid "Published after %s" msgstr "" -#: cps/web.py:1721 +#: cps/web.py:1731 msgid "Published before " msgstr "" -#: cps/web.py:1767 cps/web.py:1780 +#: cps/web.py:1777 cps/web.py:1790 msgid "search" msgstr "recherche" +#: cps/web.py:1816 +msgid "not found on GDrive" +msgstr "" + #: cps/templates/index.xml:39 cps/templates/index.xml:42 -#: cps/templates/layout.html:143 cps/web.py:1858 +#: cps/templates/layout.html:143 cps/web.py:1872 msgid "Read Books" msgstr "Livres lus" #: cps/templates/index.xml:46 cps/templates/index.xml:49 -#: cps/templates/layout.html:145 cps/web.py:1861 +#: cps/templates/layout.html:145 cps/web.py:1875 msgid "Unread Books" msgstr "Livres non-lus" -#: cps/web.py:1936 cps/web.py:1938 cps/web.py:1940 cps/web.py:1949 +#: cps/web.py:1950 cps/web.py:1952 cps/web.py:1954 cps/web.py:1963 msgid "Read a Book" msgstr "Lire un livre" -#: cps/web.py:2001 cps/web.py:2719 +#: cps/web.py:2015 cps/web.py:2751 msgid "Please fill out all fields!" msgstr "SVP, complétez tous les champs !" -#: cps/web.py:2002 cps/web.py:2019 cps/web.py:2024 cps/web.py:2026 +#: cps/web.py:2016 cps/web.py:2033 cps/web.py:2038 cps/web.py:2040 msgid "register" msgstr "s’enregistrer" -#: cps/web.py:2018 +#: cps/web.py:2032 msgid "An unknown error occured. Please try again later." msgstr "Une erreur a eu lieu. Merci de réessayez plus tard." -#: cps/web.py:2023 +#: cps/web.py:2037 msgid "This username or email address is already in use." msgstr "Ce nom d'utilisateur ou cette adresse de courriel est déjà utilisée." -#: cps/web.py:2042 cps/web.py:2138 +#: cps/web.py:2056 cps/web.py:2152 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "Vous êtes maintenant connecté sous : '%(nickname)s'" -#: cps/web.py:2047 +#: cps/web.py:2061 msgid "Wrong Username or Password" msgstr "Mauvais nom d'utilisateur ou mot de passe" -#: cps/web.py:2053 cps/web.py:2074 +#: cps/web.py:2067 cps/web.py:2088 msgid "login" msgstr "connexion" -#: cps/web.py:2086 cps/web.py:2117 +#: cps/web.py:2100 cps/web.py:2131 msgid "Token not found" msgstr "Jeton non trouvé" -#: cps/web.py:2094 cps/web.py:2125 +#: cps/web.py:2108 cps/web.py:2139 msgid "Token has expired" msgstr "Jeton expiré" -#: cps/web.py:2102 +#: cps/web.py:2116 msgid "Success! Please return to your device" msgstr "Réussite! Merci de vous tourner vers votre appareil" -#: cps/web.py:2152 +#: cps/web.py:2166 msgid "Please configure the SMTP mail settings first..." msgstr "Veillez configurer les paramètres smtp d'abord..." -#: cps/web.py:2156 +#: cps/web.py:2170 #, python-format msgid "Book successfully send to %(kindlemail)s" msgstr "Livres envoyés à %(kindlemail)s avec succès" -#: cps/web.py:2160 +#: cps/web.py:2174 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "Il y a eu une erreur en envoyant ce livre : %(res)s" -#: cps/web.py:2162 cps/web.py:2807 +#: cps/web.py:2176 cps/web.py:2839 msgid "Please configure your kindle email address first..." msgstr "Veuillez configurer votre adresse kindle d'abord..." -#: cps/web.py:2206 +#: cps/web.py:2220 #, python-format msgid "Book has been added to shelf: %(sname)s" msgstr "Le livre a bien été ajouté à l'étagère : %(sname)s" -#: cps/web.py:2244 +#: cps/web.py:2258 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "Le livre a été supprimé de l'étagère %(sname)s" -#: cps/web.py:2250 +#: cps/web.py:2264 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "" -#: cps/web.py:2270 cps/web.py:2294 +#: cps/web.py:2284 cps/web.py:2308 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "Une étagère de ce nom '%(title)s' existe déjà." -#: cps/web.py:2275 +#: cps/web.py:2289 #, python-format msgid "Shelf %(title)s created" msgstr "Étagère %(title)s créée" -#: cps/web.py:2277 cps/web.py:2305 +#: cps/web.py:2291 cps/web.py:2319 msgid "There was an error" msgstr "Il y a eu une erreur" -#: cps/web.py:2278 cps/web.py:2280 +#: cps/web.py:2292 cps/web.py:2294 msgid "create a shelf" msgstr "créer une étagère" -#: cps/web.py:2303 +#: cps/web.py:2317 #, python-format msgid "Shelf %(title)s changed" msgstr "" -#: cps/web.py:2306 cps/web.py:2308 +#: cps/web.py:2320 cps/web.py:2322 msgid "Edit a shelf" msgstr "Modifier une étagère" -#: cps/web.py:2329 +#: cps/web.py:2343 #, python-format msgid "successfully deleted shelf %(name)s" msgstr "l’étagère %(name)s a été supprimé avec succès" -#: cps/web.py:2351 +#: cps/web.py:2365 #, python-format msgid "Shelf: '%(name)s'" msgstr "Étagère : '%(name)s'" -#: cps/web.py:2354 +#: cps/web.py:2368 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "" -#: cps/web.py:2385 +#: cps/web.py:2399 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "" -#: cps/web.py:2455 +#: cps/web.py:2469 msgid "Found an existing account for this email address." msgstr "Un compte avec cette adresse de courriel existe déjà." -#: cps/web.py:2457 cps/web.py:2461 +#: cps/web.py:2471 cps/web.py:2475 #, python-format msgid "%(name)s's profile" msgstr "Profil de %(name)s" -#: cps/web.py:2458 +#: cps/web.py:2472 msgid "Profile updated" msgstr "Profil mis à jour" -#: cps/web.py:2470 +#: cps/web.py:2484 msgid "Unknown" msgstr "" -#: cps/web.py:2483 +#: cps/web.py:2497 msgid "Admin page" msgstr "Page administrateur" -#: cps/web.py:2554 -msgid "Keyfile location is not valid, please enter correct path" +#: cps/web.py:2520 +msgid "Import of optional GDrive requirements missing" +msgstr "" + +#: cps/web.py:2523 +msgid "client_secret.json is missing or not readable" +msgstr "" + +#: cps/web.py:2528 cps/web.py:2553 +msgid "client_secret.json is not configured for web application" msgstr "" -#: cps/web.py:2557 cps/web.py:2568 cps/web.py:2661 cps/web.py:2680 -#: cps/web.py:2686 cps/web.py:2700 +#: cps/web.py:2556 cps/web.py:2582 cps/web.py:2593 cps/web.py:2686 +#: cps/web.py:2706 cps/web.py:2713 cps/web.py:2732 msgid "Basic Configuration" msgstr "Configuration basique" -#: cps/web.py:2565 +#: cps/web.py:2579 +msgid "Keyfile location is not valid, please enter correct path" +msgstr "" + +#: cps/web.py:2590 msgid "Certfile location is not valid, please enter correct path" msgstr "" -#: cps/web.py:2658 +#: cps/web.py:2683 msgid "Logfile location is not valid, please enter correct path" msgstr "" -#: cps/web.py:2673 +#: cps/web.py:2698 msgid "Calibre-web configuration updated" msgstr "Configuration de Calibre-web mise à jour" -#: cps/web.py:2684 +#: cps/web.py:2710 msgid "DB location is not valid, please enter correct path" msgstr "" -#: cps/templates/admin.html:34 cps/web.py:2721 cps/web.py:2777 +#: cps/templates/admin.html:34 cps/web.py:2753 cps/web.py:2809 msgid "Add new user" msgstr "Ajouter un nouvel utilisateur" -#: cps/web.py:2767 +#: cps/web.py:2799 #, python-format msgid "User '%(user)s' created" msgstr "Utilisateur '%(user)s' créé" -#: cps/web.py:2771 +#: cps/web.py:2803 msgid "Found an existing account for this email address or nickname." msgstr "Un compte avec cette adresse de courriel ou ce surnom existe déjà." -#: cps/web.py:2795 +#: cps/web.py:2827 msgid "Mail settings updated" msgstr "Paramètres de courriel mis à jour" -#: cps/web.py:2802 +#: cps/web.py:2834 #, python-format msgid "Test E-Mail successfully send to %(kindlemail)s" msgstr "" -#: cps/web.py:2805 +#: cps/web.py:2837 #, python-format msgid "There was an error sending the Test E-Mail: %(res)s" msgstr "" -#: cps/web.py:2809 +#: cps/web.py:2841 msgid "E-Mail settings updated" msgstr "Préférences e-mail mises à jour" -#: cps/web.py:2810 +#: cps/web.py:2842 msgid "Edit mail settings" msgstr "Éditer les paramètres de courriel" -#: cps/web.py:2839 +#: cps/web.py:2871 #, python-format msgid "User '%(nick)s' deleted" msgstr "Utilisateur '%(nick)s' supprimé" -#: cps/web.py:2948 +#: cps/web.py:2980 #, python-format msgid "User '%(nick)s' updated" msgstr "Utilisateur '%(nick)s' mis à jour" -#: cps/web.py:2951 +#: cps/web.py:2983 msgid "An unknown error occured." msgstr "Oups ! Une erreur inconnue a eu lieu." -#: cps/web.py:2954 +#: cps/web.py:2986 #, python-format msgid "Edit User %(nick)s" msgstr "Éditer l'utilisateur %(nick)s" -#: cps/web.py:2970 +#: cps/web.py:3002 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "" "Erreur à l’ouverture du livre. Le fichier n’existe pas ou n’est pas " "accessible" -#: cps/web.py:2985 cps/web.py:3196 cps/web.py:3201 cps/web.py:3347 +#: cps/web.py:3017 cps/web.py:3228 cps/web.py:3233 cps/web.py:3379 msgid "edit metadata" msgstr "modifier les métadonnées" -#: cps/web.py:2995 cps/web.py:3241 +#: cps/web.py:3027 cps/web.py:3273 #, python-format msgid "File extension \"%s\" is not allowed to be uploaded to this server" msgstr "" -#: cps/web.py:3006 +#: cps/web.py:3038 #, python-format msgid "Failed to store file %s." msgstr "" -#: cps/web.py:3028 cps/web.py:3032 +#: cps/web.py:3060 cps/web.py:3064 msgid "unknown" msgstr "inconnu" -#: cps/web.py:3055 +#: cps/web.py:3087 msgid "Cover is not a jpg file, can't save" msgstr "" -#: cps/web.py:3247 +#: cps/web.py:3279 msgid "File to be uploaded must have an extension" msgstr "Pour être téléverser le fichier doit avoir une extension" -#: cps/web.py:3266 +#: cps/web.py:3298 #, python-format msgid "Failed to create path %s (Permission denied)." msgstr "Impossible de créer le chemin %s (permission refusée)" -#: cps/web.py:3271 +#: cps/web.py:3303 #, python-format msgid "Failed to store file %s (Permission denied)." msgstr "Impossible d'enregistrer le fichier %s (permission refusée)" -#: cps/web.py:3276 +#: cps/web.py:3308 #, python-format msgid "Failed to delete file %s (Permission denied)." msgstr "Impossible de supprimer le fichier %s (permission refusée)" @@ -581,7 +603,7 @@ msgstr "Configuration" msgid "Calibre DB dir" msgstr "" -#: cps/templates/admin.html:61 cps/templates/config_edit.html:91 +#: cps/templates/admin.html:61 cps/templates/config_edit.html:87 msgid "Log Level" msgstr "" @@ -589,7 +611,7 @@ msgstr "" msgid "Port" msgstr "Port" -#: cps/templates/admin.html:63 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:63 cps/templates/config_edit.html:64 msgid "Books per page" msgstr "Livres par page" @@ -652,7 +674,7 @@ msgstr "D’accord" #: cps/templates/admin.html:105 cps/templates/admin.html:119 #: cps/templates/book_edit.html:135 cps/templates/book_edit.html:157 -#: cps/templates/config_edit.html:223 cps/templates/email_edit.html:36 +#: cps/templates/config_edit.html:219 cps/templates/email_edit.html:36 #: cps/templates/shelf.html:60 cps/templates/shelf_edit.html:19 #: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:147 msgid "Back" @@ -747,7 +769,7 @@ msgstr "voir le livre après l'édition" msgid "Get metadata" msgstr "Obtenir les métadonnées" -#: cps/templates/book_edit.html:134 cps/templates/config_edit.html:221 +#: cps/templates/book_edit.html:134 cps/templates/config_edit.html:217 #: cps/templates/login.html:20 cps/templates/search_form.html:96 #: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:145 msgid "Submit" @@ -814,184 +836,180 @@ msgstr "Aucun résultat, Merci d’essayer un autre mot-clé." msgid "Location of Calibre database" msgstr "Localisation de la base de donnée Calibre" -#: cps/templates/config_edit.html:13 +#: cps/templates/config_edit.html:12 msgid "Use google drive?" msgstr "Utiliser Google drive?" -#: cps/templates/config_edit.html:17 -msgid "Client id" -msgstr "" - -#: cps/templates/config_edit.html:21 -msgid "Client secret" +#: cps/templates/config_edit.html:18 +msgid "Google drive config problem" msgstr "" -#: cps/templates/config_edit.html:25 -msgid "Calibre Base URL" -msgstr "" - -#: cps/templates/config_edit.html:29 +#: cps/templates/config_edit.html:28 msgid "Google drive Calibre folder" msgstr "Dossier Calibre de Google Drive" -#: cps/templates/config_edit.html:38 +#: cps/templates/config_edit.html:36 msgid "Metadata Watch Channel ID" msgstr "" -#: cps/templates/config_edit.html:52 +#: cps/templates/config_edit.html:39 +msgid "Revoke" +msgstr "" + +#: cps/templates/config_edit.html:48 msgid "Server Port" msgstr "" -#: cps/templates/config_edit.html:56 +#: cps/templates/config_edit.html:52 msgid "SSL certfile location (leave it empty for non-SSL Servers)" msgstr "" -#: cps/templates/config_edit.html:60 +#: cps/templates/config_edit.html:56 msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "" -#: cps/templates/config_edit.html:64 cps/templates/layout.html:130 +#: cps/templates/config_edit.html:60 cps/templates/layout.html:130 #: cps/templates/layout.html:131 cps/templates/shelf_edit.html:7 msgid "Title" msgstr "Titre" -#: cps/templates/config_edit.html:72 +#: cps/templates/config_edit.html:68 msgid "No. of random books to show" msgstr "" -#: cps/templates/config_edit.html:76 +#: cps/templates/config_edit.html:72 msgid "Regular expression for ignoring columns" msgstr "" -#: cps/templates/config_edit.html:80 +#: cps/templates/config_edit.html:76 msgid "Regular expression for title sorting" msgstr "" -#: cps/templates/config_edit.html:84 +#: cps/templates/config_edit.html:80 msgid "Tags for Mature Content" msgstr "Mots clés pour contenue pour adulte" -#: cps/templates/config_edit.html:100 +#: cps/templates/config_edit.html:96 msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "" -#: cps/templates/config_edit.html:106 +#: cps/templates/config_edit.html:102 msgid "Enable uploading" msgstr "Autoriser le téléversement" -#: cps/templates/config_edit.html:110 +#: cps/templates/config_edit.html:106 msgid "Enable anonymous browsing" msgstr "Autoriser la navigation anonyme" -#: cps/templates/config_edit.html:114 +#: cps/templates/config_edit.html:110 msgid "Enable public registration" msgstr "Autoriser l’inscription publique" -#: cps/templates/config_edit.html:118 +#: cps/templates/config_edit.html:114 msgid "Enable remote login (\"magic link\")" msgstr "" -#: cps/templates/config_edit.html:123 +#: cps/templates/config_edit.html:119 msgid "Use" msgstr "Utiliser" -#: cps/templates/config_edit.html:124 +#: cps/templates/config_edit.html:120 msgid "Obtain an API Key" msgstr "Obtenir la clé API" -#: cps/templates/config_edit.html:128 +#: cps/templates/config_edit.html:124 msgid "Goodreads API Key" msgstr "" -#: cps/templates/config_edit.html:132 +#: cps/templates/config_edit.html:128 msgid "Goodreads API Secret" msgstr "" -#: cps/templates/config_edit.html:137 +#: cps/templates/config_edit.html:133 msgid "Default Settings for new users" msgstr "Réglages par défaut pour les nouveaux utilisateurs" -#: cps/templates/config_edit.html:140 cps/templates/user_edit.html:102 +#: cps/templates/config_edit.html:136 cps/templates/user_edit.html:102 msgid "Admin user" msgstr "Utilisateur admin" -#: cps/templates/config_edit.html:144 cps/templates/user_edit.html:111 +#: cps/templates/config_edit.html:140 cps/templates/user_edit.html:111 msgid "Allow Downloads" msgstr "Permettre les téléchargements" -#: cps/templates/config_edit.html:148 cps/templates/user_edit.html:115 +#: cps/templates/config_edit.html:144 cps/templates/user_edit.html:115 msgid "Allow Uploads" msgstr "Permettre les téléversements" -#: cps/templates/config_edit.html:152 cps/templates/user_edit.html:119 +#: cps/templates/config_edit.html:148 cps/templates/user_edit.html:119 msgid "Allow Edit" msgstr "Permettre l'édition" -#: cps/templates/config_edit.html:156 cps/templates/user_edit.html:123 +#: cps/templates/config_edit.html:152 cps/templates/user_edit.html:123 msgid "Allow Delete books" msgstr "Autoriser la suppression des livres" -#: cps/templates/config_edit.html:160 cps/templates/user_edit.html:128 +#: cps/templates/config_edit.html:156 cps/templates/user_edit.html:128 msgid "Allow Changing Password" msgstr "Permettre le changement de mot de passe" -#: cps/templates/config_edit.html:164 cps/templates/user_edit.html:132 +#: cps/templates/config_edit.html:160 cps/templates/user_edit.html:132 msgid "Allow Editing Public Shelfs" msgstr "Autoriser la modification d’étagères publiques" -#: cps/templates/config_edit.html:168 +#: cps/templates/config_edit.html:164 msgid "Default visiblities for new users" msgstr "" -#: cps/templates/config_edit.html:172 cps/templates/user_edit.html:54 +#: cps/templates/config_edit.html:168 cps/templates/user_edit.html:54 msgid "Show random books" msgstr "Montrer des livres au hasard" -#: cps/templates/config_edit.html:176 cps/templates/user_edit.html:58 +#: cps/templates/config_edit.html:172 cps/templates/user_edit.html:58 msgid "Show recent books" msgstr "" -#: cps/templates/config_edit.html:180 cps/templates/user_edit.html:62 +#: cps/templates/config_edit.html:176 cps/templates/user_edit.html:62 msgid "Show sorted books" msgstr "" -#: cps/templates/config_edit.html:184 cps/templates/user_edit.html:66 +#: cps/templates/config_edit.html:180 cps/templates/user_edit.html:66 msgid "Show hot books" msgstr "Montrer les livres populaires" -#: cps/templates/config_edit.html:188 cps/templates/user_edit.html:70 +#: cps/templates/config_edit.html:184 cps/templates/user_edit.html:70 msgid "Show best rated books" msgstr "Montrer les livres les mieux notés" -#: cps/templates/config_edit.html:192 cps/templates/user_edit.html:74 +#: cps/templates/config_edit.html:188 cps/templates/user_edit.html:74 msgid "Show language selection" msgstr "Montrer la sélection par langue" -#: cps/templates/config_edit.html:196 cps/templates/user_edit.html:78 +#: cps/templates/config_edit.html:192 cps/templates/user_edit.html:78 msgid "Show series selection" msgstr "Montrer la sélection par séries" -#: cps/templates/config_edit.html:200 cps/templates/user_edit.html:82 +#: cps/templates/config_edit.html:196 cps/templates/user_edit.html:82 msgid "Show category selection" msgstr "Montrer la sélection par catégories" -#: cps/templates/config_edit.html:204 cps/templates/user_edit.html:86 +#: cps/templates/config_edit.html:200 cps/templates/user_edit.html:86 msgid "Show author selection" msgstr "Montrer la sélection par auteur" -#: cps/templates/config_edit.html:208 cps/templates/user_edit.html:90 +#: cps/templates/config_edit.html:204 cps/templates/user_edit.html:90 msgid "Show read and unread" msgstr "Montrer lu et non-lu" -#: cps/templates/config_edit.html:212 cps/templates/user_edit.html:94 +#: cps/templates/config_edit.html:208 cps/templates/user_edit.html:94 msgid "Show random books in detail view" msgstr "Montrer aléatoirement des livres dans la vue détaillée" -#: cps/templates/config_edit.html:216 cps/templates/user_edit.html:107 +#: cps/templates/config_edit.html:212 cps/templates/user_edit.html:107 msgid "Show mature content" msgstr "Montrer le contenu pour adulte" -#: cps/templates/config_edit.html:226 cps/templates/layout.html:79 +#: cps/templates/config_edit.html:222 cps/templates/layout.html:79 #: cps/templates/login.html:4 msgid "Login" msgstr "Connexion" diff --git a/cps/translations/it/LC_MESSAGES/messages.po b/cps/translations/it/LC_MESSAGES/messages.po index c26e52b0..3b3fbab0 100644 --- a/cps/translations/it/LC_MESSAGES/messages.po +++ b/cps/translations/it/LC_MESSAGES/messages.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n" -"POT-Creation-Date: 2018-04-01 19:27+0200\n" +"POT-Creation-Date: 2018-06-02 10:45+0200\n" "PO-Revision-Date: 2017-04-04 15:09+0200\n" "Last-Translator: Marco Picone \n" "Language: it\n" @@ -29,57 +29,57 @@ msgstr "" msgid "not installed" msgstr "non installato" -#: cps/helper.py:78 +#: cps/helper.py:79 #, python-format msgid "kindlegen binary %(kindlepath)s not found" msgstr "Non trovato" -#: cps/helper.py:84 +#: cps/helper.py:85 #, python-format msgid "epub format not found for book id: %(book)d" msgstr "formato epub non trovato" -#: cps/helper.py:94 +#: cps/helper.py:95 msgid "kindlegen failed, no execution permissions" msgstr "non ci sono permessi" -#: cps/helper.py:109 +#: cps/helper.py:110 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "errore" -#: cps/helper.py:188 +#: cps/helper.py:189 #, python-format msgid "Failed to send mail: %s" msgstr "Impossibile inviare email: %s" -#: cps/helper.py:195 +#: cps/helper.py:196 msgid "Calibre-web test email" msgstr "test email Calibre-web" -#: cps/helper.py:196 cps/helper.py:208 +#: cps/helper.py:197 cps/helper.py:209 msgid "This email has been sent via calibre web." msgstr "L'email è stata inviata tramite Calibre Web." -#: cps/helper.py:205 cps/templates/detail.html:44 +#: cps/helper.py:206 cps/templates/detail.html:44 msgid "Send to Kindle" msgstr "Invia a Kindle" -#: cps/helper.py:225 cps/helper.py:239 +#: cps/helper.py:226 cps/helper.py:240 msgid "Could not find any formats suitable for sending by email" msgstr "Impossibile trovare i formati adatti per l'invio tramite email" -#: cps/helper.py:340 +#: cps/helper.py:341 #, python-format msgid "Rename title from: \"%s\" to \"%s\" failed with error: %s" msgstr "" -#: cps/helper.py:349 +#: cps/helper.py:350 #, python-format msgid "Rename author from: \"%s\" to \"%s\" failed with error: %s" msgstr "" -#: cps/ub.py:684 +#: cps/ub.py:694 msgid "Guest" msgstr "ospite" @@ -147,7 +147,7 @@ msgstr "Libri casuali" msgid "Author list" msgstr "Elenco degli autori" -#: cps/web.py:1220 cps/web.py:1278 cps/web.py:1408 cps/web.py:1903 +#: cps/web.py:1220 cps/web.py:1278 cps/web.py:1408 cps/web.py:1917 msgid "Error opening eBook. File does not exist or file is not accessible:" msgstr "" "Errore durante l'apertura di eBook. Il file non esiste o il file non è " @@ -188,312 +188,334 @@ msgstr "Mancano autorizzazioni di esecuzione" msgid "Statistics" msgstr "Statistica" -#: cps/web.py:1641 +#: cps/web.py:1573 +msgid "" +"Callback domain is not verified, please follow steps to verify domain in " +"google developer console" +msgstr "" + +#: cps/web.py:1651 msgid "Server restarted, please reload page" msgstr "Server riavviato, ricarica pagina" -#: cps/web.py:1643 +#: cps/web.py:1653 msgid "Performing shutdown of server, please close window" msgstr "Eseguire l'arresto del server, chiudi la finestra." -#: cps/web.py:1659 +#: cps/web.py:1669 msgid "Update done" msgstr "Aggiornamento fatto" -#: cps/web.py:1716 +#: cps/web.py:1726 #, python-format msgid "Published after %s" msgstr "" -#: cps/web.py:1721 +#: cps/web.py:1731 msgid "Published before " msgstr "" -#: cps/web.py:1767 cps/web.py:1780 +#: cps/web.py:1777 cps/web.py:1790 msgid "search" msgstr "ricerca" +#: cps/web.py:1816 +msgid "not found on GDrive" +msgstr "" + #: cps/templates/index.xml:39 cps/templates/index.xml:42 -#: cps/templates/layout.html:141 cps/web.py:1858 +#: cps/templates/layout.html:143 cps/web.py:1872 msgid "Read Books" msgstr "Leggere libri" #: cps/templates/index.xml:46 cps/templates/index.xml:49 -#: cps/templates/layout.html:143 cps/web.py:1861 +#: cps/templates/layout.html:145 cps/web.py:1875 msgid "Unread Books" msgstr "Libri non letti" -#: cps/web.py:1936 cps/web.py:1938 cps/web.py:1940 cps/web.py:1949 +#: cps/web.py:1950 cps/web.py:1952 cps/web.py:1954 cps/web.py:1963 msgid "Read a Book" msgstr "Leggere un libro" -#: cps/web.py:2001 cps/web.py:2718 +#: cps/web.py:2015 cps/web.py:2751 msgid "Please fill out all fields!" msgstr "Compila tutti i campi" -#: cps/web.py:2002 cps/web.py:2019 cps/web.py:2024 cps/web.py:2026 +#: cps/web.py:2016 cps/web.py:2033 cps/web.py:2038 cps/web.py:2040 msgid "register" msgstr "Registrare" -#: cps/web.py:2018 +#: cps/web.py:2032 msgid "An unknown error occured. Please try again later." msgstr "Si è verificato un errore sconosciuto. Per favore riprova più tardi." -#: cps/web.py:2023 +#: cps/web.py:2037 msgid "This username or email address is already in use." msgstr "Questo nome utente o indirizzo email è già in uso." -#: cps/web.py:2042 cps/web.py:2138 +#: cps/web.py:2056 cps/web.py:2152 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "ora sei connesso come : '%(nickname)s'" -#: cps/web.py:2047 +#: cps/web.py:2061 msgid "Wrong Username or Password" msgstr "Nome utente o password errata" -#: cps/web.py:2053 cps/web.py:2074 +#: cps/web.py:2067 cps/web.py:2088 msgid "login" msgstr "Accesso" -#: cps/web.py:2086 cps/web.py:2117 +#: cps/web.py:2100 cps/web.py:2131 msgid "Token not found" msgstr "Token non trovato" -#: cps/web.py:2094 cps/web.py:2125 +#: cps/web.py:2108 cps/web.py:2139 msgid "Token has expired" msgstr "Il token è scaduto" -#: cps/web.py:2102 +#: cps/web.py:2116 msgid "Success! Please return to your device" msgstr "Successo! Torna al tuo dispositivo" -#: cps/web.py:2152 +#: cps/web.py:2166 msgid "Please configure the SMTP mail settings first..." msgstr "Configurare prima le impostazioni della posta SMTP..." -#: cps/web.py:2156 +#: cps/web.py:2170 #, python-format msgid "Book successfully send to %(kindlemail)s" msgstr "Libro inviare con successo %(kindlemail)s correttamente" -#: cps/web.py:2160 +#: cps/web.py:2174 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "Si è verificato un errore durante l'invio di questo libro: %(res)s" -#: cps/web.py:2162 cps/web.py:2805 +#: cps/web.py:2176 cps/web.py:2839 msgid "Please configure your kindle email address first..." msgstr "Si prega di configurare innanzitutto il tuo indirizzo email..." -#: cps/web.py:2206 +#: cps/web.py:2220 #, python-format msgid "Book has been added to shelf: %(sname)s" msgstr "Il libro è stato aggiunto alla mensola: %(sname)s" -#: cps/web.py:2244 +#: cps/web.py:2258 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "Il libro è stato rimosso dalla mensola: %(sname)s" -#: cps/web.py:2250 +#: cps/web.py:2264 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "" -#: cps/web.py:2270 cps/web.py:2294 +#: cps/web.py:2284 cps/web.py:2308 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "Uno scaffale con il nome '%(title)s' esiste già." -#: cps/web.py:2275 +#: cps/web.py:2289 #, python-format msgid "Shelf %(title)s created" msgstr "Mensola %(title)s creato" -#: cps/web.py:2277 cps/web.py:2305 +#: cps/web.py:2291 cps/web.py:2319 msgid "There was an error" msgstr "c'era un errore" -#: cps/web.py:2278 cps/web.py:2280 +#: cps/web.py:2292 cps/web.py:2294 msgid "create a shelf" msgstr "creare uno scaffale" -#: cps/web.py:2303 +#: cps/web.py:2317 #, python-format msgid "Shelf %(title)s changed" msgstr "Mensola %(title)s cambiato" -#: cps/web.py:2306 cps/web.py:2308 +#: cps/web.py:2320 cps/web.py:2322 msgid "Edit a shelf" msgstr "Modifica un ripiano" -#: cps/web.py:2329 +#: cps/web.py:2343 #, python-format msgid "successfully deleted shelf %(name)s" msgstr "cancellato con successo il ripiano %(name)s" -#: cps/web.py:2351 +#: cps/web.py:2365 #, python-format msgid "Shelf: '%(name)s'" msgstr "Mensola: '%(name)s'" -#: cps/web.py:2354 +#: cps/web.py:2368 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "" "Errore durante l'apertura dello scaffale. La mensola non esiste o non è " "accessibile" -#: cps/web.py:2385 +#: cps/web.py:2399 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Modificare l'ordine della mensola: '%(name)s'" -#: cps/web.py:2454 +#: cps/web.py:2469 msgid "Found an existing account for this email address." msgstr "Trovato un account esistente per questo indirizzo email." -#: cps/web.py:2456 cps/web.py:2460 +#: cps/web.py:2471 cps/web.py:2475 #, python-format msgid "%(name)s's profile" msgstr "Profilo di %(name)s" -#: cps/web.py:2457 +#: cps/web.py:2472 msgid "Profile updated" msgstr "Profilo aggiornato" -#: cps/web.py:2469 +#: cps/web.py:2484 msgid "Unknown" msgstr "" -#: cps/web.py:2482 +#: cps/web.py:2497 msgid "Admin page" msgstr "Pagina di amministrazione" -#: cps/web.py:2553 -msgid "Keyfile location is not valid, please enter correct path" +#: cps/web.py:2520 +msgid "Import of optional GDrive requirements missing" msgstr "" -#: cps/web.py:2556 cps/web.py:2567 cps/web.py:2660 cps/web.py:2679 -#: cps/web.py:2685 cps/web.py:2699 +#: cps/web.py:2523 +msgid "client_secret.json is missing or not readable" +msgstr "" + +#: cps/web.py:2528 cps/web.py:2553 +msgid "client_secret.json is not configured for web application" +msgstr "" + +#: cps/web.py:2556 cps/web.py:2582 cps/web.py:2593 cps/web.py:2686 +#: cps/web.py:2706 cps/web.py:2713 cps/web.py:2732 msgid "Basic Configuration" msgstr "Configurazione di base" -#: cps/web.py:2564 +#: cps/web.py:2579 +msgid "Keyfile location is not valid, please enter correct path" +msgstr "" + +#: cps/web.py:2590 msgid "Certfile location is not valid, please enter correct path" msgstr "" -#: cps/web.py:2657 +#: cps/web.py:2683 msgid "Logfile location is not valid, please enter correct path" msgstr "" -#: cps/web.py:2672 +#: cps/web.py:2698 msgid "Calibre-web configuration updated" msgstr "Aggiornamento della configurazione del calibro-web" -#: cps/web.py:2683 +#: cps/web.py:2710 msgid "DB location is not valid, please enter correct path" msgstr "Posizione DB non valida. Inserisci il percorso corretto." -#: cps/templates/admin.html:34 cps/web.py:2720 cps/web.py:2775 +#: cps/templates/admin.html:34 cps/web.py:2753 cps/web.py:2809 msgid "Add new user" msgstr "Aggiungi un nuovo utente" -#: cps/web.py:2765 +#: cps/web.py:2799 #, python-format msgid "User '%(user)s' created" msgstr "utente '%(user)s' creato" -#: cps/web.py:2769 +#: cps/web.py:2803 msgid "Found an existing account for this email address or nickname." msgstr "" "È stato trovato un account collegato a questo indirizzo e-mail o nome " "utente." -#: cps/web.py:2793 +#: cps/web.py:2827 msgid "Mail settings updated" msgstr "Parametri di posta aggiornati" -#: cps/web.py:2800 +#: cps/web.py:2834 #, python-format msgid "Test E-Mail successfully send to %(kindlemail)s" msgstr "Successo quando invii il test a %(kindlemail)s" -#: cps/web.py:2803 +#: cps/web.py:2837 #, python-format msgid "There was an error sending the Test E-Mail: %(res)s" msgstr "Impossibile inviare il test a E-Mail: %(res)s" -#: cps/web.py:2807 +#: cps/web.py:2841 msgid "E-Mail settings updated" msgstr "Impostazioni email aggiornate" -#: cps/web.py:2808 +#: cps/web.py:2842 msgid "Edit mail settings" msgstr "Modificare i parametri della posta" -#: cps/web.py:2837 +#: cps/web.py:2871 #, python-format msgid "User '%(nick)s' deleted" msgstr "utente '%(nick)s' cancellati" -#: cps/web.py:2945 +#: cps/web.py:2980 #, python-format msgid "User '%(nick)s' updated" msgstr "utente '%(nick)s' aggiornato" -#: cps/web.py:2948 +#: cps/web.py:2983 msgid "An unknown error occured." msgstr "Errore imprevisto." -#: cps/web.py:2951 +#: cps/web.py:2986 #, python-format msgid "Edit User %(nick)s" msgstr "Modifica utente %(nick)s" -#: cps/web.py:2967 +#: cps/web.py:3002 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "" "Errore durante l'apertura di eBook. Il file non esiste o il file non è " "accessibile" -#: cps/web.py:2982 cps/web.py:3193 cps/web.py:3198 cps/web.py:3344 +#: cps/web.py:3017 cps/web.py:3228 cps/web.py:3233 cps/web.py:3379 msgid "edit metadata" msgstr "modificare la metainformazione" -#: cps/web.py:2992 cps/web.py:3238 +#: cps/web.py:3027 cps/web.py:3273 #, python-format msgid "File extension \"%s\" is not allowed to be uploaded to this server" msgstr "Non è consentito caricare i file con l'estensione \"%s\" a questo server" -#: cps/web.py:3003 +#: cps/web.py:3038 #, python-format msgid "Failed to store file %s." msgstr "" -#: cps/web.py:3025 cps/web.py:3029 +#: cps/web.py:3060 cps/web.py:3064 msgid "unknown" msgstr "Sconosciuto" -#: cps/web.py:3052 +#: cps/web.py:3087 msgid "Cover is not a jpg file, can't save" msgstr "" -#: cps/web.py:3244 +#: cps/web.py:3279 msgid "File to be uploaded must have an extension" msgstr "Il file da caricare deve avere un'estensione" -#: cps/web.py:3263 +#: cps/web.py:3298 #, python-format msgid "Failed to create path %s (Permission denied)." msgstr "Impossibile creare il percorso %s (autorizzazione negata)" -#: cps/web.py:3268 +#: cps/web.py:3303 #, python-format msgid "Failed to store file %s (Permission denied)." msgstr "Impossibile archiviare il file %s (autorizzazione negata)" -#: cps/web.py:3273 +#: cps/web.py:3308 #, python-format msgid "Failed to delete file %s (Permission denied)." msgstr "Impossibile eliminare il file %s (autorizzazione negata)" @@ -518,7 +540,7 @@ msgstr "Kindle" msgid "DLS" msgstr "DLS" -#: cps/templates/admin.html:12 cps/templates/layout.html:69 +#: cps/templates/admin.html:12 cps/templates/layout.html:71 msgid "Admin" msgstr "Admin" @@ -527,7 +549,7 @@ msgstr "Admin" msgid "Download" msgstr "Download" -#: cps/templates/admin.html:14 cps/templates/layout.html:62 +#: cps/templates/admin.html:14 cps/templates/layout.html:64 msgid "Upload" msgstr "Upload" @@ -579,7 +601,7 @@ msgstr "Configurazione" msgid "Calibre DB dir" msgstr "Calibre DB dir" -#: cps/templates/admin.html:61 cps/templates/config_edit.html:91 +#: cps/templates/admin.html:61 cps/templates/config_edit.html:87 msgid "Log Level" msgstr "Livello del registro" @@ -587,7 +609,7 @@ msgstr "Livello del registro" msgid "Port" msgstr "Port" -#: cps/templates/admin.html:63 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:63 cps/templates/config_edit.html:64 msgid "Books per page" msgstr "Libri per pagina" @@ -650,9 +672,9 @@ msgstr "Ok" #: cps/templates/admin.html:105 cps/templates/admin.html:119 #: cps/templates/book_edit.html:135 cps/templates/book_edit.html:157 -#: cps/templates/config_edit.html:223 cps/templates/email_edit.html:36 +#: cps/templates/config_edit.html:219 cps/templates/email_edit.html:36 #: cps/templates/shelf.html:60 cps/templates/shelf_edit.html:19 -#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:139 +#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:147 msgid "Back" msgstr "Indietro" @@ -698,7 +720,7 @@ msgstr "Descrizione" msgid "Tags" msgstr "Tags" -#: cps/templates/book_edit.html:39 cps/templates/layout.html:152 +#: cps/templates/book_edit.html:39 cps/templates/layout.html:154 #: cps/templates/search_form.html:54 msgid "Series" msgstr "Serie" @@ -745,9 +767,9 @@ msgstr "visualizzare il libro dopo la modifica" msgid "Get metadata" msgstr "Ottieni metadati" -#: cps/templates/book_edit.html:134 cps/templates/config_edit.html:221 +#: cps/templates/book_edit.html:134 cps/templates/config_edit.html:217 #: cps/templates/login.html:20 cps/templates/search_form.html:96 -#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:145 msgid "Submit" msgstr "Sottoscrivi" @@ -775,7 +797,7 @@ msgstr "Parola chiave" msgid " Search keyword " msgstr "Cerca parola chiave" -#: cps/templates/book_edit.html:175 cps/templates/layout.html:44 +#: cps/templates/book_edit.html:175 cps/templates/layout.html:46 msgid "Go!" msgstr "Partire" @@ -787,7 +809,7 @@ msgstr "Fai clic sul coperchio per caricare i metadati nel modulo" msgid "Loading..." msgstr "Caricamento in corso..." -#: cps/templates/book_edit.html:196 cps/templates/layout.html:216 +#: cps/templates/book_edit.html:196 cps/templates/layout.html:218 msgid "Close" msgstr "Chiuso" @@ -812,184 +834,180 @@ msgstr "Nessun risultato! Prova un'altra parola chiave." msgid "Location of Calibre database" msgstr "Posizione del database Calibre" -#: cps/templates/config_edit.html:13 +#: cps/templates/config_edit.html:12 msgid "Use google drive?" msgstr "Usa Google Drive?" -#: cps/templates/config_edit.html:17 -msgid "Client id" -msgstr "Client id" - -#: cps/templates/config_edit.html:21 -msgid "Client secret" -msgstr "Client secret" - -#: cps/templates/config_edit.html:25 -msgid "Calibre Base URL" -msgstr "Calibre Base URL" +#: cps/templates/config_edit.html:18 +msgid "Google drive config problem" +msgstr "" -#: cps/templates/config_edit.html:29 +#: cps/templates/config_edit.html:28 msgid "Google drive Calibre folder" msgstr "La cartella Calibre di Google drive" -#: cps/templates/config_edit.html:38 +#: cps/templates/config_edit.html:36 msgid "Metadata Watch Channel ID" msgstr "ID canale Watch Metadata" -#: cps/templates/config_edit.html:52 +#: cps/templates/config_edit.html:39 +msgid "Revoke" +msgstr "" + +#: cps/templates/config_edit.html:48 msgid "Server Port" msgstr "Porta del server" -#: cps/templates/config_edit.html:56 +#: cps/templates/config_edit.html:52 msgid "SSL certfile location (leave it empty for non-SSL Servers)" msgstr "" -#: cps/templates/config_edit.html:60 +#: cps/templates/config_edit.html:56 msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "" -#: cps/templates/config_edit.html:64 cps/templates/layout.html:128 -#: cps/templates/layout.html:129 cps/templates/shelf_edit.html:7 +#: cps/templates/config_edit.html:60 cps/templates/layout.html:130 +#: cps/templates/layout.html:131 cps/templates/shelf_edit.html:7 msgid "Title" msgstr "Titolo" -#: cps/templates/config_edit.html:72 +#: cps/templates/config_edit.html:68 msgid "No. of random books to show" msgstr "Numero di libri casuali da mostrare" -#: cps/templates/config_edit.html:76 +#: cps/templates/config_edit.html:72 msgid "Regular expression for ignoring columns" msgstr "Espressione regolare per ignorare le colonne" -#: cps/templates/config_edit.html:80 +#: cps/templates/config_edit.html:76 msgid "Regular expression for title sorting" msgstr "Espressione regolare per la selezione del titolo" -#: cps/templates/config_edit.html:84 +#: cps/templates/config_edit.html:80 msgid "Tags for Mature Content" msgstr "Tags per Contenuti maturi" -#: cps/templates/config_edit.html:100 +#: cps/templates/config_edit.html:96 msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "" -#: cps/templates/config_edit.html:106 +#: cps/templates/config_edit.html:102 msgid "Enable uploading" msgstr "Abilita il caricamento" -#: cps/templates/config_edit.html:110 +#: cps/templates/config_edit.html:106 msgid "Enable anonymous browsing" msgstr "Abilita la navigazione anonima" -#: cps/templates/config_edit.html:114 +#: cps/templates/config_edit.html:110 msgid "Enable public registration" msgstr "Abilita la registrazione pubblica" -#: cps/templates/config_edit.html:118 +#: cps/templates/config_edit.html:114 msgid "Enable remote login (\"magic link\")" msgstr "Attiva login remoto (\"magic link\")" -#: cps/templates/config_edit.html:123 +#: cps/templates/config_edit.html:119 msgid "Use" msgstr "Uso" -#: cps/templates/config_edit.html:124 +#: cps/templates/config_edit.html:120 msgid "Obtain an API Key" msgstr "Ottenere una chiave API" -#: cps/templates/config_edit.html:128 +#: cps/templates/config_edit.html:124 msgid "Goodreads API Key" msgstr "API di Goodreads" -#: cps/templates/config_edit.html:132 +#: cps/templates/config_edit.html:128 msgid "Goodreads API Secret" msgstr "Goodreads API Secret" -#: cps/templates/config_edit.html:137 +#: cps/templates/config_edit.html:133 msgid "Default Settings for new users" msgstr "Impostazioni predefinite per i nuovi utenti" -#: cps/templates/config_edit.html:140 cps/templates/user_edit.html:94 +#: cps/templates/config_edit.html:136 cps/templates/user_edit.html:102 msgid "Admin user" msgstr "Utente amministratore" -#: cps/templates/config_edit.html:144 cps/templates/user_edit.html:103 +#: cps/templates/config_edit.html:140 cps/templates/user_edit.html:111 msgid "Allow Downloads" msgstr "Consenti download" -#: cps/templates/config_edit.html:148 cps/templates/user_edit.html:107 +#: cps/templates/config_edit.html:144 cps/templates/user_edit.html:115 msgid "Allow Uploads" msgstr "Consenti caricamenti" -#: cps/templates/config_edit.html:152 cps/templates/user_edit.html:111 +#: cps/templates/config_edit.html:148 cps/templates/user_edit.html:119 msgid "Allow Edit" msgstr "Consenti Modifica" -#: cps/templates/config_edit.html:156 cps/templates/user_edit.html:115 +#: cps/templates/config_edit.html:152 cps/templates/user_edit.html:123 msgid "Allow Delete books" msgstr "Consenti l'eliminazione di libri" -#: cps/templates/config_edit.html:160 cps/templates/user_edit.html:120 +#: cps/templates/config_edit.html:156 cps/templates/user_edit.html:128 msgid "Allow Changing Password" msgstr "Consenti la modifica della password" -#: cps/templates/config_edit.html:164 cps/templates/user_edit.html:124 +#: cps/templates/config_edit.html:160 cps/templates/user_edit.html:132 msgid "Allow Editing Public Shelfs" msgstr "Consenti la modifica dei ripiani pubblici" -#: cps/templates/config_edit.html:168 +#: cps/templates/config_edit.html:164 msgid "Default visiblities for new users" msgstr "" -#: cps/templates/config_edit.html:172 cps/templates/user_edit.html:46 +#: cps/templates/config_edit.html:168 cps/templates/user_edit.html:54 msgid "Show random books" msgstr "Mostra libro a caso" -#: cps/templates/config_edit.html:176 cps/templates/user_edit.html:50 +#: cps/templates/config_edit.html:172 cps/templates/user_edit.html:58 msgid "Show recent books" msgstr "" -#: cps/templates/config_edit.html:180 cps/templates/user_edit.html:54 +#: cps/templates/config_edit.html:176 cps/templates/user_edit.html:62 msgid "Show sorted books" msgstr "" -#: cps/templates/config_edit.html:184 cps/templates/user_edit.html:58 +#: cps/templates/config_edit.html:180 cps/templates/user_edit.html:66 msgid "Show hot books" msgstr "Mostra libri popolari" -#: cps/templates/config_edit.html:188 cps/templates/user_edit.html:62 +#: cps/templates/config_edit.html:184 cps/templates/user_edit.html:70 msgid "Show best rated books" msgstr "Mostra sezione più votati" -#: cps/templates/config_edit.html:192 cps/templates/user_edit.html:66 +#: cps/templates/config_edit.html:188 cps/templates/user_edit.html:74 msgid "Show language selection" msgstr "Mostra sezione lingua" -#: cps/templates/config_edit.html:196 cps/templates/user_edit.html:70 +#: cps/templates/config_edit.html:192 cps/templates/user_edit.html:78 msgid "Show series selection" msgstr "Mostra sezione serie" -#: cps/templates/config_edit.html:200 cps/templates/user_edit.html:74 +#: cps/templates/config_edit.html:196 cps/templates/user_edit.html:82 msgid "Show category selection" msgstr "Mostra sezione categorie" -#: cps/templates/config_edit.html:204 cps/templates/user_edit.html:78 +#: cps/templates/config_edit.html:200 cps/templates/user_edit.html:86 msgid "Show author selection" msgstr "Mostra sezione autore" -#: cps/templates/config_edit.html:208 cps/templates/user_edit.html:82 +#: cps/templates/config_edit.html:204 cps/templates/user_edit.html:90 msgid "Show read and unread" msgstr "Mostra letto e non letto" -#: cps/templates/config_edit.html:212 cps/templates/user_edit.html:86 +#: cps/templates/config_edit.html:208 cps/templates/user_edit.html:94 msgid "Show random books in detail view" msgstr "Un libro a caso" -#: cps/templates/config_edit.html:216 cps/templates/user_edit.html:99 +#: cps/templates/config_edit.html:212 cps/templates/user_edit.html:107 msgid "Show mature content" msgstr "Mostra sezione adulti" -#: cps/templates/config_edit.html:226 cps/templates/layout.html:77 +#: cps/templates/config_edit.html:222 cps/templates/layout.html:79 #: cps/templates/login.html:4 msgid "Login" msgstr "Accesso" @@ -1060,12 +1078,12 @@ msgstr "Salva le impostazioni" msgid "Save settings and send Test E-Mail" msgstr "Salvare le impostazioni e inviare Test e-mail" -#: cps/templates/feed.xml:20 cps/templates/layout.html:200 +#: cps/templates/feed.xml:20 cps/templates/layout.html:202 msgid "Next" msgstr "Prossimo" #: cps/templates/feed.xml:29 cps/templates/index.xml:7 -#: cps/templates/layout.html:41 cps/templates/layout.html:42 +#: cps/templates/layout.html:43 cps/templates/layout.html:44 msgid "Search" msgstr "Cerca" @@ -1077,7 +1095,7 @@ msgstr "Scoprire (Libri casuali)" msgid "Start" msgstr "Inizio" -#: cps/templates/index.xml:14 cps/templates/layout.html:134 +#: cps/templates/index.xml:14 cps/templates/layout.html:136 msgid "Hot Books" msgstr "Hot Ebook" @@ -1085,7 +1103,7 @@ msgstr "Hot Ebook" msgid "Popular publications from this catalog based on Downloads." msgstr "Pubblicazioni popolari di questo catalogo in base ai download." -#: cps/templates/index.xml:20 cps/templates/layout.html:137 +#: cps/templates/index.xml:20 cps/templates/layout.html:139 msgid "Best rated Books" msgstr "Libri più votati" @@ -1105,7 +1123,7 @@ msgstr "Gli ultimi Libri" msgid "Show Random Books" msgstr "Mostra libri casuali" -#: cps/templates/index.xml:52 cps/templates/layout.html:155 +#: cps/templates/index.xml:52 cps/templates/layout.html:157 msgid "Authors" msgstr "Autori" @@ -1121,7 +1139,7 @@ msgstr "Libri ordinati per categoria" msgid "Books ordered by series" msgstr "Libri ordinati per serie" -#: cps/templates/index.xml:70 cps/templates/layout.html:161 +#: cps/templates/index.xml:70 cps/templates/layout.html:163 msgid "Public Shelves" msgstr "Ripiani pubblici" @@ -1129,7 +1147,7 @@ msgstr "Ripiani pubblici" msgid "Books organized in public shelfs, visible to everyone" msgstr "" -#: cps/templates/index.xml:77 cps/templates/layout.html:165 +#: cps/templates/index.xml:77 cps/templates/layout.html:167 msgid "Your Shelves" msgstr "I tuoi scaffali" @@ -1137,88 +1155,88 @@ msgstr "I tuoi scaffali" msgid "User's own shelfs, only visible to the current user himself" msgstr "" -#: cps/templates/layout.html:31 +#: cps/templates/layout.html:33 msgid "Toggle navigation" msgstr "Toggle navigation" -#: cps/templates/layout.html:52 +#: cps/templates/layout.html:54 msgid "Advanced Search" msgstr "Ricerca avanzata" -#: cps/templates/layout.html:73 +#: cps/templates/layout.html:75 msgid "Logout" msgstr "Logout" -#: cps/templates/layout.html:78 cps/templates/register.html:18 +#: cps/templates/layout.html:80 cps/templates/register.html:18 msgid "Register" msgstr "Registrare" -#: cps/templates/layout.html:103 +#: cps/templates/layout.html:105 msgid "Uploading..." msgstr "" -#: cps/templates/layout.html:104 +#: cps/templates/layout.html:106 msgid "please don't refresh the page" msgstr "" -#: cps/templates/layout.html:115 +#: cps/templates/layout.html:117 msgid "Browse" msgstr "Navigare" -#: cps/templates/layout.html:117 +#: cps/templates/layout.html:119 msgid "Recently Added" msgstr "Aggiunto recentemente" -#: cps/templates/layout.html:122 +#: cps/templates/layout.html:124 msgid "Sorted Books" msgstr "Libri ordinati" -#: cps/templates/layout.html:126 cps/templates/layout.html:127 #: cps/templates/layout.html:128 cps/templates/layout.html:129 +#: cps/templates/layout.html:130 cps/templates/layout.html:131 msgid "Sort By" msgstr "Ordina per" -#: cps/templates/layout.html:126 +#: cps/templates/layout.html:128 msgid "Newest" msgstr "i più nuovi" -#: cps/templates/layout.html:127 +#: cps/templates/layout.html:129 msgid "Oldest" msgstr "il più vecchio" -#: cps/templates/layout.html:128 +#: cps/templates/layout.html:130 msgid "Ascending" msgstr "Ascendente" -#: cps/templates/layout.html:129 +#: cps/templates/layout.html:131 msgid "Descending" msgstr "Discendente" -#: cps/templates/layout.html:146 +#: cps/templates/layout.html:148 msgid "Discover" msgstr "Per scoprire" -#: cps/templates/layout.html:149 +#: cps/templates/layout.html:151 msgid "Categories" msgstr "Categoria" -#: cps/templates/layout.html:158 cps/templates/search_form.html:75 +#: cps/templates/layout.html:160 cps/templates/search_form.html:75 msgid "Languages" msgstr "lingua" -#: cps/templates/layout.html:170 +#: cps/templates/layout.html:172 msgid "Create a Shelf" msgstr "Crea una mensola" -#: cps/templates/layout.html:171 cps/templates/stats.html:3 +#: cps/templates/layout.html:173 cps/templates/stats.html:3 msgid "About" msgstr "Di" -#: cps/templates/layout.html:185 +#: cps/templates/layout.html:187 msgid "Previous" msgstr "Precedente" -#: cps/templates/layout.html:212 +#: cps/templates/layout.html:214 msgid "Book Details" msgstr "Dettagli ebook" @@ -1391,18 +1409,30 @@ msgid "Kindle E-Mail" msgstr "Email Kindle" #: cps/templates/user_edit.html:35 +msgid "Theme" +msgstr "" + +#: cps/templates/user_edit.html:37 +msgid "Standard Theme" +msgstr "" + +#: cps/templates/user_edit.html:38 +msgid "caliBlur! Dark Theme (Beta)" +msgstr "" + +#: cps/templates/user_edit.html:43 msgid "Show books with language" msgstr "Mostra libri per lingua" -#: cps/templates/user_edit.html:37 +#: cps/templates/user_edit.html:45 msgid "Show all" msgstr "Mostra tutto" -#: cps/templates/user_edit.html:131 +#: cps/templates/user_edit.html:139 msgid "Delete this user" msgstr "Elimina questo utente" -#: cps/templates/user_edit.html:146 +#: cps/templates/user_edit.html:154 msgid "Recent Downloads" msgstr "Download Recenti" diff --git a/cps/translations/ja/LC_MESSAGES/messages.po b/cps/translations/ja/LC_MESSAGES/messages.po index ca3fa0e1..593054c8 100644 --- a/cps/translations/ja/LC_MESSAGES/messages.po +++ b/cps/translations/ja/LC_MESSAGES/messages.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n" -"POT-Creation-Date: 2018-04-01 19:27+0200\n" +"POT-Creation-Date: 2018-06-02 10:45+0200\n" "PO-Revision-Date: 2018-02-07 02:20-0500\n" "Last-Translator: white \n" "Language: ja\n" @@ -24,57 +24,57 @@ msgstr "" msgid "not installed" msgstr "インストールされません" -#: cps/helper.py:78 +#: cps/helper.py:79 #, python-format msgid "kindlegen binary %(kindlepath)s not found" msgstr "kindlegenのバイナリー %(kindlepath)s は見つかりません" -#: cps/helper.py:84 +#: cps/helper.py:85 #, python-format msgid "epub format not found for book id: %(book)d" msgstr "本ID %(book)d のepub拡張子は見つからない" -#: cps/helper.py:94 +#: cps/helper.py:95 msgid "kindlegen failed, no execution permissions" msgstr "kindlegenは失敗しました、実行許可はありません" -#: cps/helper.py:109 +#: cps/helper.py:110 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Kindlegen 失敗しました、エーラ %(error)s. メッセージ: %(message)s" -#: cps/helper.py:188 +#: cps/helper.py:189 #, python-format msgid "Failed to send mail: %s" msgstr "送信は失敗しました: %s" -#: cps/helper.py:195 +#: cps/helper.py:196 msgid "Calibre-web test email" msgstr "Calibre-webのテストメール" -#: cps/helper.py:196 cps/helper.py:208 +#: cps/helper.py:197 cps/helper.py:209 msgid "This email has been sent via calibre web." msgstr "このメールはcalibre webより送信されました" -#: cps/helper.py:205 cps/templates/detail.html:44 +#: cps/helper.py:206 cps/templates/detail.html:44 msgid "Send to Kindle" msgstr "Kindleに送信する" -#: cps/helper.py:225 cps/helper.py:239 +#: cps/helper.py:226 cps/helper.py:240 msgid "Could not find any formats suitable for sending by email" msgstr "メールを送るための適切な拡張子は見つかりません" -#: cps/helper.py:340 +#: cps/helper.py:341 #, python-format msgid "Rename title from: \"%s\" to \"%s\" failed with error: %s" msgstr "タイトルを\"%s\"から\"%s\"の改名は失敗しました。エーラ: %s" -#: cps/helper.py:349 +#: cps/helper.py:350 #, python-format msgid "Rename author from: \"%s\" to \"%s\" failed with error: %s" msgstr "著者を\"%s\"から\"%s\"の改名は失敗しました。エーラ:%s" -#: cps/ub.py:684 +#: cps/ub.py:694 msgid "Guest" msgstr "ゲスト" @@ -142,7 +142,7 @@ msgstr "任意の本" msgid "Author list" msgstr "著者リスト" -#: cps/web.py:1220 cps/web.py:1278 cps/web.py:1408 cps/web.py:1903 +#: cps/web.py:1220 cps/web.py:1278 cps/web.py:1408 cps/web.py:1917 msgid "Error opening eBook. File does not exist or file is not accessible:" msgstr "電子本を開けません。ファイルは存在しないまたはアクセスできません" @@ -181,306 +181,328 @@ msgstr "実行許可はありません" msgid "Statistics" msgstr "統計" -#: cps/web.py:1641 +#: cps/web.py:1573 +msgid "" +"Callback domain is not verified, please follow steps to verify domain in " +"google developer console" +msgstr "" + +#: cps/web.py:1651 msgid "Server restarted, please reload page" msgstr "サーバを再起動しました、ページを再読み込みしてください" -#: cps/web.py:1643 +#: cps/web.py:1653 msgid "Performing shutdown of server, please close window" msgstr "サーバをシャットダウンします、ページを閉じてください" -#: cps/web.py:1659 +#: cps/web.py:1669 msgid "Update done" msgstr "更新完了" -#: cps/web.py:1716 +#: cps/web.py:1726 #, python-format msgid "Published after %s" msgstr "" -#: cps/web.py:1721 +#: cps/web.py:1731 msgid "Published before " msgstr "" -#: cps/web.py:1767 cps/web.py:1780 +#: cps/web.py:1777 cps/web.py:1790 msgid "search" msgstr "検索" +#: cps/web.py:1816 +msgid "not found on GDrive" +msgstr "" + #: cps/templates/index.xml:39 cps/templates/index.xml:42 -#: cps/templates/layout.html:141 cps/web.py:1858 +#: cps/templates/layout.html:143 cps/web.py:1872 msgid "Read Books" msgstr "既読の本" #: cps/templates/index.xml:46 cps/templates/index.xml:49 -#: cps/templates/layout.html:143 cps/web.py:1861 +#: cps/templates/layout.html:145 cps/web.py:1875 msgid "Unread Books" msgstr "未読の本" -#: cps/web.py:1936 cps/web.py:1938 cps/web.py:1940 cps/web.py:1949 +#: cps/web.py:1950 cps/web.py:1952 cps/web.py:1954 cps/web.py:1963 msgid "Read a Book" msgstr "本を読む" -#: cps/web.py:2001 cps/web.py:2718 +#: cps/web.py:2015 cps/web.py:2751 msgid "Please fill out all fields!" msgstr "全ての項目を入力してください" -#: cps/web.py:2002 cps/web.py:2019 cps/web.py:2024 cps/web.py:2026 +#: cps/web.py:2016 cps/web.py:2033 cps/web.py:2038 cps/web.py:2040 msgid "register" msgstr "登録" -#: cps/web.py:2018 +#: cps/web.py:2032 msgid "An unknown error occured. Please try again later." msgstr "未知のエーラが発生しました、再度試してください" -#: cps/web.py:2023 +#: cps/web.py:2037 msgid "This username or email address is already in use." msgstr "ユーザ名またはメールアドレスは使われました" -#: cps/web.py:2042 cps/web.py:2138 +#: cps/web.py:2056 cps/web.py:2152 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "%(nickname)s としてログインします" -#: cps/web.py:2047 +#: cps/web.py:2061 msgid "Wrong Username or Password" msgstr "ユーザ名またはパスワードは間違いました" -#: cps/web.py:2053 cps/web.py:2074 +#: cps/web.py:2067 cps/web.py:2088 msgid "login" msgstr "ログイン" -#: cps/web.py:2086 cps/web.py:2117 +#: cps/web.py:2100 cps/web.py:2131 msgid "Token not found" msgstr "トークンは見つかりません" -#: cps/web.py:2094 cps/web.py:2125 +#: cps/web.py:2108 cps/web.py:2139 msgid "Token has expired" msgstr "トークンは失効されました" -#: cps/web.py:2102 +#: cps/web.py:2116 msgid "Success! Please return to your device" msgstr "成功しまた!端末に戻ってください" -#: cps/web.py:2152 +#: cps/web.py:2166 msgid "Please configure the SMTP mail settings first..." msgstr "SMTPメールをまず設定してください" -#: cps/web.py:2156 +#: cps/web.py:2170 #, python-format msgid "Book successfully send to %(kindlemail)s" msgstr "本を %(kindlemail)s に送信しました" -#: cps/web.py:2160 +#: cps/web.py:2174 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "%(res)s を送信する際にエーラが発生しました" -#: cps/web.py:2162 cps/web.py:2805 +#: cps/web.py:2176 cps/web.py:2839 msgid "Please configure your kindle email address first..." msgstr "Kindleのメールアドレスをまず設定してください" -#: cps/web.py:2206 +#: cps/web.py:2220 #, python-format msgid "Book has been added to shelf: %(sname)s" msgstr "本 %(sname)s を書架に追加されました" -#: cps/web.py:2244 +#: cps/web.py:2258 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "本 %(sname)s を書架から除去されました" -#: cps/web.py:2250 +#: cps/web.py:2264 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "" -#: cps/web.py:2270 cps/web.py:2294 +#: cps/web.py:2284 cps/web.py:2308 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "名前を使った書架 '%(title)s' は既に存在しました" -#: cps/web.py:2275 +#: cps/web.py:2289 #, python-format msgid "Shelf %(title)s created" msgstr "書架%(title)s は作成されました" -#: cps/web.py:2277 cps/web.py:2305 +#: cps/web.py:2291 cps/web.py:2319 msgid "There was an error" msgstr "エーラが発生しました" -#: cps/web.py:2278 cps/web.py:2280 +#: cps/web.py:2292 cps/web.py:2294 msgid "create a shelf" msgstr "書架を作成する" -#: cps/web.py:2303 +#: cps/web.py:2317 #, python-format msgid "Shelf %(title)s changed" msgstr "書架 %(title)s 変わりました" -#: cps/web.py:2306 cps/web.py:2308 +#: cps/web.py:2320 cps/web.py:2322 msgid "Edit a shelf" msgstr "書架を編集する" -#: cps/web.py:2329 +#: cps/web.py:2343 #, python-format msgid "successfully deleted shelf %(name)s" msgstr "%(name)s の書架を削除されました" -#: cps/web.py:2351 +#: cps/web.py:2365 #, python-format msgid "Shelf: '%(name)s'" msgstr "書架: '%(name)s'" -#: cps/web.py:2354 +#: cps/web.py:2368 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "書架を開けません。書架は存在しないまたはアクセスできません" -#: cps/web.py:2385 +#: cps/web.py:2399 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "'%(name)s' の書架の順番を入れ替える" -#: cps/web.py:2454 +#: cps/web.py:2469 msgid "Found an existing account for this email address." msgstr "このメールアドレスを使ったアカウント名は既に存在します" -#: cps/web.py:2456 cps/web.py:2460 +#: cps/web.py:2471 cps/web.py:2475 #, python-format msgid "%(name)s's profile" msgstr "%(name)sのプロファイル" -#: cps/web.py:2457 +#: cps/web.py:2472 msgid "Profile updated" msgstr "プロファイルが更新されました" -#: cps/web.py:2469 +#: cps/web.py:2484 msgid "Unknown" msgstr "" -#: cps/web.py:2482 +#: cps/web.py:2497 msgid "Admin page" msgstr "管理者ページ" -#: cps/web.py:2553 -msgid "Keyfile location is not valid, please enter correct path" +#: cps/web.py:2520 +msgid "Import of optional GDrive requirements missing" msgstr "" -#: cps/web.py:2556 cps/web.py:2567 cps/web.py:2660 cps/web.py:2679 -#: cps/web.py:2685 cps/web.py:2699 +#: cps/web.py:2523 +msgid "client_secret.json is missing or not readable" +msgstr "" + +#: cps/web.py:2528 cps/web.py:2553 +msgid "client_secret.json is not configured for web application" +msgstr "" + +#: cps/web.py:2556 cps/web.py:2582 cps/web.py:2593 cps/web.py:2686 +#: cps/web.py:2706 cps/web.py:2713 cps/web.py:2732 msgid "Basic Configuration" msgstr "基本設定" -#: cps/web.py:2564 +#: cps/web.py:2579 +msgid "Keyfile location is not valid, please enter correct path" +msgstr "" + +#: cps/web.py:2590 msgid "Certfile location is not valid, please enter correct path" msgstr "" -#: cps/web.py:2657 +#: cps/web.py:2683 msgid "Logfile location is not valid, please enter correct path" msgstr "ログファイルの場所は不適切です。正しい場所を入力してください" -#: cps/web.py:2672 +#: cps/web.py:2698 msgid "Calibre-web configuration updated" msgstr "Calibre-web 設定を更新されました" -#: cps/web.py:2683 +#: cps/web.py:2710 msgid "DB location is not valid, please enter correct path" msgstr "データベースの場所は不適切です。正しい場所を入力してください" -#: cps/templates/admin.html:34 cps/web.py:2720 cps/web.py:2775 +#: cps/templates/admin.html:34 cps/web.py:2753 cps/web.py:2809 msgid "Add new user" msgstr "新規ユーザ追加" -#: cps/web.py:2765 +#: cps/web.py:2799 #, python-format msgid "User '%(user)s' created" msgstr "ユーザ '%(user)s' が作成されました" -#: cps/web.py:2769 +#: cps/web.py:2803 msgid "Found an existing account for this email address or nickname." msgstr "同じメールアドレスまたは通所は既に存在しました" -#: cps/web.py:2793 +#: cps/web.py:2827 msgid "Mail settings updated" msgstr "メール設定が更新されました" -#: cps/web.py:2800 +#: cps/web.py:2834 #, python-format msgid "Test E-Mail successfully send to %(kindlemail)s" msgstr "テストメールから%(kindlemail)sまでの送信は完了しました" -#: cps/web.py:2803 +#: cps/web.py:2837 #, python-format msgid "There was an error sending the Test E-Mail: %(res)s" msgstr "テストメールに送信するエラーが発生しました: %(res)s" -#: cps/web.py:2807 +#: cps/web.py:2841 msgid "E-Mail settings updated" msgstr "メール設定更新されました" -#: cps/web.py:2808 +#: cps/web.py:2842 msgid "Edit mail settings" msgstr "メール編集設定" -#: cps/web.py:2837 +#: cps/web.py:2871 #, python-format msgid "User '%(nick)s' deleted" msgstr "ユーザ '%(nick)s' 削除されました" -#: cps/web.py:2945 +#: cps/web.py:2980 #, python-format msgid "User '%(nick)s' updated" msgstr "ユーザ '%(nick)s' 更新されました" -#: cps/web.py:2948 +#: cps/web.py:2983 msgid "An unknown error occured." msgstr "不明のエーラが発生しました" -#: cps/web.py:2951 +#: cps/web.py:2986 #, python-format msgid "Edit User %(nick)s" msgstr "ユーザ編集 %(nick)s" -#: cps/web.py:2967 +#: cps/web.py:3002 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "電子本を開けません。ファイルは存在しないまたはアクセスできません" -#: cps/web.py:2982 cps/web.py:3193 cps/web.py:3198 cps/web.py:3344 +#: cps/web.py:3017 cps/web.py:3228 cps/web.py:3233 cps/web.py:3379 msgid "edit metadata" msgstr "メタデータを編集します" -#: cps/web.py:2992 cps/web.py:3238 +#: cps/web.py:3027 cps/web.py:3273 #, python-format msgid "File extension \"%s\" is not allowed to be uploaded to this server" msgstr "ファイル拡張子 \"%s\" をこのサーバにアップロードする許可はありません" -#: cps/web.py:3003 +#: cps/web.py:3038 #, python-format msgid "Failed to store file %s." msgstr "フアイル %s の保存を失敗しました" -#: cps/web.py:3025 cps/web.py:3029 +#: cps/web.py:3060 cps/web.py:3064 msgid "unknown" msgstr "不明" -#: cps/web.py:3052 +#: cps/web.py:3087 msgid "Cover is not a jpg file, can't save" msgstr "" -#: cps/web.py:3244 +#: cps/web.py:3279 msgid "File to be uploaded must have an extension" msgstr "ファイルをアップロードするために拡張子が必要です" -#: cps/web.py:3263 +#: cps/web.py:3298 #, python-format msgid "Failed to create path %s (Permission denied)." msgstr "場所 %s の作成を失敗しました (許可拒否)" -#: cps/web.py:3268 +#: cps/web.py:3303 #, python-format msgid "Failed to store file %s (Permission denied)." msgstr "ファイル %s の保存を失敗しました (許可拒否)" -#: cps/web.py:3273 +#: cps/web.py:3308 #, python-format msgid "Failed to delete file %s (Permission denied)." msgstr "ファイル %s の削除を失敗しました (許可拒否)" @@ -505,7 +527,7 @@ msgstr "Kindle" msgid "DLS" msgstr "DLS" -#: cps/templates/admin.html:12 cps/templates/layout.html:69 +#: cps/templates/admin.html:12 cps/templates/layout.html:71 msgid "Admin" msgstr "管理者" @@ -514,7 +536,7 @@ msgstr "管理者" msgid "Download" msgstr "ダウンロード" -#: cps/templates/admin.html:14 cps/templates/layout.html:62 +#: cps/templates/admin.html:14 cps/templates/layout.html:64 msgid "Upload" msgstr "アップロード" @@ -566,7 +588,7 @@ msgstr "設定" msgid "Calibre DB dir" msgstr "Calibre データベースの場所" -#: cps/templates/admin.html:61 cps/templates/config_edit.html:91 +#: cps/templates/admin.html:61 cps/templates/config_edit.html:87 msgid "Log Level" msgstr "ログレベル" @@ -574,7 +596,7 @@ msgstr "ログレベル" msgid "Port" msgstr "ポート" -#: cps/templates/admin.html:63 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:63 cps/templates/config_edit.html:64 msgid "Books per page" msgstr "本数毎ページ" @@ -637,9 +659,9 @@ msgstr "はい" #: cps/templates/admin.html:105 cps/templates/admin.html:119 #: cps/templates/book_edit.html:135 cps/templates/book_edit.html:157 -#: cps/templates/config_edit.html:223 cps/templates/email_edit.html:36 +#: cps/templates/config_edit.html:219 cps/templates/email_edit.html:36 #: cps/templates/shelf.html:60 cps/templates/shelf_edit.html:19 -#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:139 +#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:147 msgid "Back" msgstr "戻る" @@ -685,7 +707,7 @@ msgstr "詳細" msgid "Tags" msgstr "タグ" -#: cps/templates/book_edit.html:39 cps/templates/layout.html:152 +#: cps/templates/book_edit.html:39 cps/templates/layout.html:154 #: cps/templates/search_form.html:54 msgid "Series" msgstr "叢書" @@ -732,9 +754,9 @@ msgstr "編集してから本を表示します" msgid "Get metadata" msgstr "メタデータを取得します" -#: cps/templates/book_edit.html:134 cps/templates/config_edit.html:221 +#: cps/templates/book_edit.html:134 cps/templates/config_edit.html:217 #: cps/templates/login.html:20 cps/templates/search_form.html:96 -#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:145 msgid "Submit" msgstr "提出" @@ -762,7 +784,7 @@ msgstr "キーワード" msgid " Search keyword " msgstr "キーワードを検索します" -#: cps/templates/book_edit.html:175 cps/templates/layout.html:44 +#: cps/templates/book_edit.html:175 cps/templates/layout.html:46 msgid "Go!" msgstr "行く" @@ -774,7 +796,7 @@ msgstr "メタデータをフォームに読み込むためにカバーをクリ msgid "Loading..." msgstr "読み込み中..." -#: cps/templates/book_edit.html:196 cps/templates/layout.html:216 +#: cps/templates/book_edit.html:196 cps/templates/layout.html:218 msgid "Close" msgstr "閉じる" @@ -799,184 +821,180 @@ msgstr "結果なし! 他のキーワードで検索してください。" msgid "Location of Calibre database" msgstr "Calibreデータベースの場所" -#: cps/templates/config_edit.html:13 +#: cps/templates/config_edit.html:12 msgid "Use google drive?" msgstr "Googleドライブを利用します?" -#: cps/templates/config_edit.html:17 -msgid "Client id" -msgstr "クライアント番号" - -#: cps/templates/config_edit.html:21 -msgid "Client secret" -msgstr "クライアント秘密" - -#: cps/templates/config_edit.html:25 -msgid "Calibre Base URL" -msgstr "CalibreベースURL" +#: cps/templates/config_edit.html:18 +msgid "Google drive config problem" +msgstr "" -#: cps/templates/config_edit.html:29 +#: cps/templates/config_edit.html:28 msgid "Google drive Calibre folder" msgstr "GoogleドライブCalibreフォルダ" -#: cps/templates/config_edit.html:38 +#: cps/templates/config_edit.html:36 msgid "Metadata Watch Channel ID" msgstr "" -#: cps/templates/config_edit.html:52 +#: cps/templates/config_edit.html:39 +msgid "Revoke" +msgstr "" + +#: cps/templates/config_edit.html:48 msgid "Server Port" msgstr "サーバポート" -#: cps/templates/config_edit.html:56 +#: cps/templates/config_edit.html:52 msgid "SSL certfile location (leave it empty for non-SSL Servers)" msgstr "" -#: cps/templates/config_edit.html:60 +#: cps/templates/config_edit.html:56 msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "" -#: cps/templates/config_edit.html:64 cps/templates/layout.html:128 -#: cps/templates/layout.html:129 cps/templates/shelf_edit.html:7 +#: cps/templates/config_edit.html:60 cps/templates/layout.html:130 +#: cps/templates/layout.html:131 cps/templates/shelf_edit.html:7 msgid "Title" msgstr "タイトル" -#: cps/templates/config_edit.html:72 +#: cps/templates/config_edit.html:68 msgid "No. of random books to show" msgstr "任意本を表示するの数" -#: cps/templates/config_edit.html:76 +#: cps/templates/config_edit.html:72 msgid "Regular expression for ignoring columns" msgstr "列を無視するの正規表現" -#: cps/templates/config_edit.html:80 +#: cps/templates/config_edit.html:76 msgid "Regular expression for title sorting" msgstr "タイトルを並び替えの正規表現" -#: cps/templates/config_edit.html:84 +#: cps/templates/config_edit.html:80 msgid "Tags for Mature Content" msgstr "成人向けのタグ" -#: cps/templates/config_edit.html:100 +#: cps/templates/config_edit.html:96 msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "ログファイルの場所と名前 (エントリーなしでcalibre-web.log)" -#: cps/templates/config_edit.html:106 +#: cps/templates/config_edit.html:102 msgid "Enable uploading" msgstr "アップロードを 有効する" -#: cps/templates/config_edit.html:110 +#: cps/templates/config_edit.html:106 msgid "Enable anonymous browsing" msgstr "匿名ブラウジングを有効する" -#: cps/templates/config_edit.html:114 +#: cps/templates/config_edit.html:110 msgid "Enable public registration" msgstr "公的登録を有効する" -#: cps/templates/config_edit.html:118 +#: cps/templates/config_edit.html:114 msgid "Enable remote login (\"magic link\")" msgstr "遠距離ログインを有効する (\"マジックリンク\")" -#: cps/templates/config_edit.html:123 +#: cps/templates/config_edit.html:119 msgid "Use" msgstr "使う" -#: cps/templates/config_edit.html:124 +#: cps/templates/config_edit.html:120 msgid "Obtain an API Key" msgstr "APIキーを取得する" -#: cps/templates/config_edit.html:128 +#: cps/templates/config_edit.html:124 msgid "Goodreads API Key" msgstr "GoodreadsのAPIキー" -#: cps/templates/config_edit.html:132 +#: cps/templates/config_edit.html:128 msgid "Goodreads API Secret" msgstr "GoodreadsのAPI秘密" -#: cps/templates/config_edit.html:137 +#: cps/templates/config_edit.html:133 msgid "Default Settings for new users" msgstr "新規ユーザにデフォルト設定を設定する" -#: cps/templates/config_edit.html:140 cps/templates/user_edit.html:94 +#: cps/templates/config_edit.html:136 cps/templates/user_edit.html:102 msgid "Admin user" msgstr "管理ユーザ" -#: cps/templates/config_edit.html:144 cps/templates/user_edit.html:103 +#: cps/templates/config_edit.html:140 cps/templates/user_edit.html:111 msgid "Allow Downloads" msgstr "ダウンロードを有効する" -#: cps/templates/config_edit.html:148 cps/templates/user_edit.html:107 +#: cps/templates/config_edit.html:144 cps/templates/user_edit.html:115 msgid "Allow Uploads" msgstr "アップロードを有効する" -#: cps/templates/config_edit.html:152 cps/templates/user_edit.html:111 +#: cps/templates/config_edit.html:148 cps/templates/user_edit.html:119 msgid "Allow Edit" msgstr "編集を有効する" -#: cps/templates/config_edit.html:156 cps/templates/user_edit.html:115 +#: cps/templates/config_edit.html:152 cps/templates/user_edit.html:123 msgid "Allow Delete books" msgstr "本削除を有効する" -#: cps/templates/config_edit.html:160 cps/templates/user_edit.html:120 +#: cps/templates/config_edit.html:156 cps/templates/user_edit.html:128 msgid "Allow Changing Password" msgstr "パスワード変更を有効する" -#: cps/templates/config_edit.html:164 cps/templates/user_edit.html:124 +#: cps/templates/config_edit.html:160 cps/templates/user_edit.html:132 msgid "Allow Editing Public Shelfs" msgstr "公的叢書の編集を有効する" -#: cps/templates/config_edit.html:168 +#: cps/templates/config_edit.html:164 msgid "Default visiblities for new users" msgstr "新規ユーザにデフォルト可視性を設定する" -#: cps/templates/config_edit.html:172 cps/templates/user_edit.html:46 +#: cps/templates/config_edit.html:168 cps/templates/user_edit.html:54 msgid "Show random books" msgstr "任意本を表示する" -#: cps/templates/config_edit.html:176 cps/templates/user_edit.html:50 +#: cps/templates/config_edit.html:172 cps/templates/user_edit.html:58 msgid "Show recent books" msgstr "最近の本を表示する" -#: cps/templates/config_edit.html:180 cps/templates/user_edit.html:54 +#: cps/templates/config_edit.html:176 cps/templates/user_edit.html:62 msgid "Show sorted books" msgstr "整列された本を表示する" -#: cps/templates/config_edit.html:184 cps/templates/user_edit.html:58 +#: cps/templates/config_edit.html:180 cps/templates/user_edit.html:66 msgid "Show hot books" msgstr "有名な本を表示する" -#: cps/templates/config_edit.html:188 cps/templates/user_edit.html:62 +#: cps/templates/config_edit.html:184 cps/templates/user_edit.html:70 msgid "Show best rated books" msgstr "最高評価の本を表示する" -#: cps/templates/config_edit.html:192 cps/templates/user_edit.html:66 +#: cps/templates/config_edit.html:188 cps/templates/user_edit.html:74 msgid "Show language selection" msgstr "言語選択を表示する" -#: cps/templates/config_edit.html:196 cps/templates/user_edit.html:70 +#: cps/templates/config_edit.html:192 cps/templates/user_edit.html:78 msgid "Show series selection" msgstr "奏者選択を表示する" -#: cps/templates/config_edit.html:200 cps/templates/user_edit.html:74 +#: cps/templates/config_edit.html:196 cps/templates/user_edit.html:82 msgid "Show category selection" msgstr "カテゴリー選択を表示する" -#: cps/templates/config_edit.html:204 cps/templates/user_edit.html:78 +#: cps/templates/config_edit.html:200 cps/templates/user_edit.html:86 msgid "Show author selection" msgstr "著者選択を表示する" -#: cps/templates/config_edit.html:208 cps/templates/user_edit.html:82 +#: cps/templates/config_edit.html:204 cps/templates/user_edit.html:90 msgid "Show read and unread" msgstr "既読と未読の本を表示する" -#: cps/templates/config_edit.html:212 cps/templates/user_edit.html:86 +#: cps/templates/config_edit.html:208 cps/templates/user_edit.html:94 msgid "Show random books in detail view" msgstr "任意の本を詳細閲覧で表示する" -#: cps/templates/config_edit.html:216 cps/templates/user_edit.html:99 +#: cps/templates/config_edit.html:212 cps/templates/user_edit.html:107 msgid "Show mature content" msgstr "成人向けコンテンツを表示" -#: cps/templates/config_edit.html:226 cps/templates/layout.html:77 +#: cps/templates/config_edit.html:222 cps/templates/layout.html:79 #: cps/templates/login.html:4 msgid "Login" msgstr "ログイン" @@ -1045,12 +1063,12 @@ msgstr "設定を保存する" msgid "Save settings and send Test E-Mail" msgstr "設定を保存するとテストメールを送信する" -#: cps/templates/feed.xml:20 cps/templates/layout.html:200 +#: cps/templates/feed.xml:20 cps/templates/layout.html:202 msgid "Next" msgstr "次" #: cps/templates/feed.xml:29 cps/templates/index.xml:7 -#: cps/templates/layout.html:41 cps/templates/layout.html:42 +#: cps/templates/layout.html:43 cps/templates/layout.html:44 msgid "Search" msgstr "検索" @@ -1062,7 +1080,7 @@ msgstr "発見 (任意の本)" msgid "Start" msgstr "開始" -#: cps/templates/index.xml:14 cps/templates/layout.html:134 +#: cps/templates/index.xml:14 cps/templates/layout.html:136 msgid "Hot Books" msgstr "最新の本" @@ -1070,7 +1088,7 @@ msgstr "最新の本" msgid "Popular publications from this catalog based on Downloads." msgstr "ダウンロードによりカタログの有名な出版" -#: cps/templates/index.xml:20 cps/templates/layout.html:137 +#: cps/templates/index.xml:20 cps/templates/layout.html:139 msgid "Best rated Books" msgstr "最高評価の本" @@ -1090,7 +1108,7 @@ msgstr "最近の本" msgid "Show Random Books" msgstr "任意の本を表示する" -#: cps/templates/index.xml:52 cps/templates/layout.html:155 +#: cps/templates/index.xml:52 cps/templates/layout.html:157 msgid "Authors" msgstr "著者" @@ -1106,7 +1124,7 @@ msgstr "カテゴリーで並び替える" msgid "Books ordered by series" msgstr "叢書で並び替える" -#: cps/templates/index.xml:70 cps/templates/layout.html:161 +#: cps/templates/index.xml:70 cps/templates/layout.html:163 msgid "Public Shelves" msgstr "公的の叢書" @@ -1114,7 +1132,7 @@ msgstr "公的の叢書" msgid "Books organized in public shelfs, visible to everyone" msgstr "公的の叢書に選び分ける、みんなに見える" -#: cps/templates/index.xml:77 cps/templates/layout.html:165 +#: cps/templates/index.xml:77 cps/templates/layout.html:167 msgid "Your Shelves" msgstr "あなたの叢書" @@ -1122,88 +1140,88 @@ msgstr "あなたの叢書" msgid "User's own shelfs, only visible to the current user himself" msgstr "ユーザ自身の叢書、自分しか見えない" -#: cps/templates/layout.html:31 +#: cps/templates/layout.html:33 msgid "Toggle navigation" msgstr "ナビゲーション" -#: cps/templates/layout.html:52 +#: cps/templates/layout.html:54 msgid "Advanced Search" msgstr "詳細検索" -#: cps/templates/layout.html:73 +#: cps/templates/layout.html:75 msgid "Logout" msgstr "ロクアウト" -#: cps/templates/layout.html:78 cps/templates/register.html:18 +#: cps/templates/layout.html:80 cps/templates/register.html:18 msgid "Register" msgstr "登録" -#: cps/templates/layout.html:103 +#: cps/templates/layout.html:105 msgid "Uploading..." msgstr "" -#: cps/templates/layout.html:104 +#: cps/templates/layout.html:106 msgid "please don't refresh the page" msgstr "" -#: cps/templates/layout.html:115 +#: cps/templates/layout.html:117 msgid "Browse" msgstr "ブラウズ" -#: cps/templates/layout.html:117 +#: cps/templates/layout.html:119 msgid "Recently Added" msgstr "最近追加" -#: cps/templates/layout.html:122 +#: cps/templates/layout.html:124 msgid "Sorted Books" msgstr "整列した本" -#: cps/templates/layout.html:126 cps/templates/layout.html:127 #: cps/templates/layout.html:128 cps/templates/layout.html:129 +#: cps/templates/layout.html:130 cps/templates/layout.html:131 msgid "Sort By" msgstr "整列" -#: cps/templates/layout.html:126 +#: cps/templates/layout.html:128 msgid "Newest" msgstr "最新" -#: cps/templates/layout.html:127 +#: cps/templates/layout.html:129 msgid "Oldest" msgstr "最古" -#: cps/templates/layout.html:128 +#: cps/templates/layout.html:130 msgid "Ascending" msgstr "昇順" -#: cps/templates/layout.html:129 +#: cps/templates/layout.html:131 msgid "Descending" msgstr "降順" -#: cps/templates/layout.html:146 +#: cps/templates/layout.html:148 msgid "Discover" msgstr "発見" -#: cps/templates/layout.html:149 +#: cps/templates/layout.html:151 msgid "Categories" msgstr "カテゴリー" -#: cps/templates/layout.html:158 cps/templates/search_form.html:75 +#: cps/templates/layout.html:160 cps/templates/search_form.html:75 msgid "Languages" msgstr "言語" -#: cps/templates/layout.html:170 +#: cps/templates/layout.html:172 msgid "Create a Shelf" msgstr "叢書を作成する" -#: cps/templates/layout.html:171 cps/templates/stats.html:3 +#: cps/templates/layout.html:173 cps/templates/stats.html:3 msgid "About" msgstr "このサイトについて" -#: cps/templates/layout.html:185 +#: cps/templates/layout.html:187 msgid "Previous" msgstr "前" -#: cps/templates/layout.html:212 +#: cps/templates/layout.html:214 msgid "Book Details" msgstr "本の詳細" @@ -1374,18 +1392,30 @@ msgid "Kindle E-Mail" msgstr "Kindleメール" #: cps/templates/user_edit.html:35 +msgid "Theme" +msgstr "" + +#: cps/templates/user_edit.html:37 +msgid "Standard Theme" +msgstr "" + +#: cps/templates/user_edit.html:38 +msgid "caliBlur! Dark Theme (Beta)" +msgstr "" + +#: cps/templates/user_edit.html:43 msgid "Show books with language" msgstr "言語で本を表示する" -#: cps/templates/user_edit.html:37 +#: cps/templates/user_edit.html:45 msgid "Show all" msgstr "全て表示" -#: cps/templates/user_edit.html:131 +#: cps/templates/user_edit.html:139 msgid "Delete this user" msgstr "このユーザを削除する" -#: cps/templates/user_edit.html:146 +#: cps/templates/user_edit.html:154 msgid "Recent Downloads" msgstr "最近ダウンロード" diff --git a/cps/translations/nl/LC_MESSAGES/messages.po b/cps/translations/nl/LC_MESSAGES/messages.po index c04bcbe5..79dc6a7b 100644 --- a/cps/translations/nl/LC_MESSAGES/messages.po +++ b/cps/translations/nl/LC_MESSAGES/messages.po @@ -22,7 +22,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-web dutch translation by Ed Driesen (GPL V3)\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2018-04-01 19:27+0200\n" +"POT-Creation-Date: 2018-06-02 10:45+0200\n" "PO-Revision-Date: 2017-06-21 20:15+0200\n" "Last-Translator: \n" "Language: nl\n" @@ -37,57 +37,57 @@ msgstr "" msgid "not installed" msgstr "niet geïnstalleerd" -#: cps/helper.py:78 +#: cps/helper.py:79 #, python-format msgid "kindlegen binary %(kindlepath)s not found" msgstr "kindlegen binary %(kindlepath)s niet gevonden" -#: cps/helper.py:84 +#: cps/helper.py:85 #, python-format msgid "epub format not found for book id: %(book)d" msgstr "epub type niet gevonden voor boek met id: %(book)d" -#: cps/helper.py:94 +#: cps/helper.py:95 msgid "kindlegen failed, no execution permissions" msgstr "kindlegen gefaald, geen rechten om uit te voeren" -#: cps/helper.py:109 +#: cps/helper.py:110 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Kindlegen gefaald met Error %(error)s. Bericht: %(message)s" -#: cps/helper.py:188 +#: cps/helper.py:189 #, python-format msgid "Failed to send mail: %s" msgstr "Mail sturen gefaald: %s" -#: cps/helper.py:195 +#: cps/helper.py:196 msgid "Calibre-web test email" msgstr "Calibre-web test email" -#: cps/helper.py:196 cps/helper.py:208 +#: cps/helper.py:197 cps/helper.py:209 msgid "This email has been sent via calibre web." msgstr "Deze mail werd verstuurd met calibre web." -#: cps/helper.py:205 cps/templates/detail.html:44 +#: cps/helper.py:206 cps/templates/detail.html:44 msgid "Send to Kindle" msgstr "Stuur naar Kindle:" -#: cps/helper.py:225 cps/helper.py:239 +#: cps/helper.py:226 cps/helper.py:240 msgid "Could not find any formats suitable for sending by email" msgstr "Kon geen geschikte formaten vinden om te verzenden per email" -#: cps/helper.py:340 +#: cps/helper.py:341 #, python-format msgid "Rename title from: \"%s\" to \"%s\" failed with error: %s" msgstr "" -#: cps/helper.py:349 +#: cps/helper.py:350 #, python-format msgid "Rename author from: \"%s\" to \"%s\" failed with error: %s" msgstr "" -#: cps/ub.py:684 +#: cps/ub.py:694 msgid "Guest" msgstr "Gast" @@ -155,7 +155,7 @@ msgstr "Willekeurige boeken" msgid "Author list" msgstr "Auteur lijst" -#: cps/web.py:1220 cps/web.py:1278 cps/web.py:1408 cps/web.py:1903 +#: cps/web.py:1220 cps/web.py:1278 cps/web.py:1408 cps/web.py:1917 msgid "Error opening eBook. File does not exist or file is not accessible:" msgstr "" "Fout bij openen van het boek. Bestand bestaat niet of is niet " @@ -196,308 +196,330 @@ msgstr "Rechten om uit te voeren ontbreken" msgid "Statistics" msgstr "Statistieken" -#: cps/web.py:1641 +#: cps/web.py:1573 +msgid "" +"Callback domain is not verified, please follow steps to verify domain in " +"google developer console" +msgstr "" + +#: cps/web.py:1651 msgid "Server restarted, please reload page" msgstr "Server herstart, gelieve de pagina herladen" -#: cps/web.py:1643 +#: cps/web.py:1653 msgid "Performing shutdown of server, please close window" msgstr "Bezig met het stoppen van de server, gelieve venster te sluiten" -#: cps/web.py:1659 +#: cps/web.py:1669 msgid "Update done" msgstr "Update voltooid" -#: cps/web.py:1716 +#: cps/web.py:1726 #, python-format msgid "Published after %s" msgstr "" -#: cps/web.py:1721 +#: cps/web.py:1731 msgid "Published before " msgstr "" -#: cps/web.py:1767 cps/web.py:1780 +#: cps/web.py:1777 cps/web.py:1790 msgid "search" msgstr "zoek" +#: cps/web.py:1816 +msgid "not found on GDrive" +msgstr "" + #: cps/templates/index.xml:39 cps/templates/index.xml:42 -#: cps/templates/layout.html:141 cps/web.py:1858 +#: cps/templates/layout.html:143 cps/web.py:1872 msgid "Read Books" msgstr "Gelezen Boeken" #: cps/templates/index.xml:46 cps/templates/index.xml:49 -#: cps/templates/layout.html:143 cps/web.py:1861 +#: cps/templates/layout.html:145 cps/web.py:1875 msgid "Unread Books" msgstr "Ongelezen Boeken" -#: cps/web.py:1936 cps/web.py:1938 cps/web.py:1940 cps/web.py:1949 +#: cps/web.py:1950 cps/web.py:1952 cps/web.py:1954 cps/web.py:1963 msgid "Read a Book" msgstr "Lees een boek" -#: cps/web.py:2001 cps/web.py:2718 +#: cps/web.py:2015 cps/web.py:2751 msgid "Please fill out all fields!" msgstr "Gelieve alle velden in te vullen!" -#: cps/web.py:2002 cps/web.py:2019 cps/web.py:2024 cps/web.py:2026 +#: cps/web.py:2016 cps/web.py:2033 cps/web.py:2038 cps/web.py:2040 msgid "register" msgstr "registreer" -#: cps/web.py:2018 +#: cps/web.py:2032 msgid "An unknown error occured. Please try again later." msgstr "Een onbekende fout deed zich voor. Gelieve later nog eens te proberen." -#: cps/web.py:2023 +#: cps/web.py:2037 msgid "This username or email address is already in use." msgstr "Deze gebruikersnaam of dit emailadres is reeds in gebruik." -#: cps/web.py:2042 cps/web.py:2138 +#: cps/web.py:2056 cps/web.py:2152 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "je bent nu ingelogd als: '%(nickname)s'" -#: cps/web.py:2047 +#: cps/web.py:2061 msgid "Wrong Username or Password" msgstr "Verkeerde gebruikersnaam of Wachtwoord" -#: cps/web.py:2053 cps/web.py:2074 +#: cps/web.py:2067 cps/web.py:2088 msgid "login" msgstr "login" -#: cps/web.py:2086 cps/web.py:2117 +#: cps/web.py:2100 cps/web.py:2131 msgid "Token not found" msgstr "Token niet gevonden" -#: cps/web.py:2094 cps/web.py:2125 +#: cps/web.py:2108 cps/web.py:2139 msgid "Token has expired" msgstr "Token is verlopen" -#: cps/web.py:2102 +#: cps/web.py:2116 msgid "Success! Please return to your device" msgstr "Gelukt! Ga terug naar je apparaat" -#: cps/web.py:2152 +#: cps/web.py:2166 msgid "Please configure the SMTP mail settings first..." msgstr "Gelieve de SMTP mail instellingen eerst te configureren..." -#: cps/web.py:2156 +#: cps/web.py:2170 #, python-format msgid "Book successfully send to %(kindlemail)s" msgstr "Boek met succes verstuurd naar %(kindlemail)s" -#: cps/web.py:2160 +#: cps/web.py:2174 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "Er trad een fout op bij het versturen van dit boek: %(res)s" -#: cps/web.py:2162 cps/web.py:2805 +#: cps/web.py:2176 cps/web.py:2839 msgid "Please configure your kindle email address first..." msgstr "Gelieve eerst je kindle email adres te configureren..." -#: cps/web.py:2206 +#: cps/web.py:2220 #, python-format msgid "Book has been added to shelf: %(sname)s" msgstr "Boek werd toegevoegd aan boekenplank: %(sname)s" -#: cps/web.py:2244 +#: cps/web.py:2258 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "Boek werd verwijderd van boekenplank: %(sname)s" -#: cps/web.py:2250 +#: cps/web.py:2264 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "" -#: cps/web.py:2270 cps/web.py:2294 +#: cps/web.py:2284 cps/web.py:2308 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "Een boekenplank met de naam '%(title)s' bestaat reeds." -#: cps/web.py:2275 +#: cps/web.py:2289 #, python-format msgid "Shelf %(title)s created" msgstr "Boekenplank %(title)s aangemaakt" -#: cps/web.py:2277 cps/web.py:2305 +#: cps/web.py:2291 cps/web.py:2319 msgid "There was an error" msgstr "Er deed zich een fout voor" -#: cps/web.py:2278 cps/web.py:2280 +#: cps/web.py:2292 cps/web.py:2294 msgid "create a shelf" msgstr "maak een boekenplank" -#: cps/web.py:2303 +#: cps/web.py:2317 #, python-format msgid "Shelf %(title)s changed" msgstr "Boekenplank %(title)s gewijzigd" -#: cps/web.py:2306 cps/web.py:2308 +#: cps/web.py:2320 cps/web.py:2322 msgid "Edit a shelf" msgstr "Bewerk een boekenplank" -#: cps/web.py:2329 +#: cps/web.py:2343 #, python-format msgid "successfully deleted shelf %(name)s" msgstr "Boekenplank %(name)s succesvol gewist" -#: cps/web.py:2351 +#: cps/web.py:2365 #, python-format msgid "Shelf: '%(name)s'" msgstr "Boekenplank: '%(name)s'" -#: cps/web.py:2354 +#: cps/web.py:2368 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "" "Fout bij openen boekenplank. Boekenplank bestaat niet of is niet " "toegankelijk" -#: cps/web.py:2385 +#: cps/web.py:2399 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Verander volgorde van Boekenplank: '%(name)s'" -#: cps/web.py:2454 +#: cps/web.py:2469 msgid "Found an existing account for this email address." msgstr "Een bestaand gebruiker gevonden voor dit email adres." -#: cps/web.py:2456 cps/web.py:2460 +#: cps/web.py:2471 cps/web.py:2475 #, python-format msgid "%(name)s's profile" msgstr "%(name)s's profiel" -#: cps/web.py:2457 +#: cps/web.py:2472 msgid "Profile updated" msgstr "Profiel aangepast" -#: cps/web.py:2469 +#: cps/web.py:2484 msgid "Unknown" msgstr "" -#: cps/web.py:2482 +#: cps/web.py:2497 msgid "Admin page" msgstr "Administratie pagina" -#: cps/web.py:2553 -msgid "Keyfile location is not valid, please enter correct path" +#: cps/web.py:2520 +msgid "Import of optional GDrive requirements missing" msgstr "" -#: cps/web.py:2556 cps/web.py:2567 cps/web.py:2660 cps/web.py:2679 -#: cps/web.py:2685 cps/web.py:2699 +#: cps/web.py:2523 +msgid "client_secret.json is missing or not readable" +msgstr "" + +#: cps/web.py:2528 cps/web.py:2553 +msgid "client_secret.json is not configured for web application" +msgstr "" + +#: cps/web.py:2556 cps/web.py:2582 cps/web.py:2593 cps/web.py:2686 +#: cps/web.py:2706 cps/web.py:2713 cps/web.py:2732 msgid "Basic Configuration" msgstr "Basis configuratie" -#: cps/web.py:2564 +#: cps/web.py:2579 +msgid "Keyfile location is not valid, please enter correct path" +msgstr "" + +#: cps/web.py:2590 msgid "Certfile location is not valid, please enter correct path" msgstr "" -#: cps/web.py:2657 +#: cps/web.py:2683 msgid "Logfile location is not valid, please enter correct path" msgstr "" -#: cps/web.py:2672 +#: cps/web.py:2698 msgid "Calibre-web configuration updated" msgstr "Calibre-web configuratie aangepast" -#: cps/web.py:2683 +#: cps/web.py:2710 msgid "DB location is not valid, please enter correct path" msgstr "DB locatie is niet geldig, gelieve het correcte pad in te geven" -#: cps/templates/admin.html:34 cps/web.py:2720 cps/web.py:2775 +#: cps/templates/admin.html:34 cps/web.py:2753 cps/web.py:2809 msgid "Add new user" msgstr "Voeg nieuwe gebruiker toe" -#: cps/web.py:2765 +#: cps/web.py:2799 #, python-format msgid "User '%(user)s' created" msgstr "Gebruiker '%(user)s' aangemaakt" -#: cps/web.py:2769 +#: cps/web.py:2803 msgid "Found an existing account for this email address or nickname." msgstr "Een bestaande gebruiker gevonden voor dit emailadres of gebruikersnaam." -#: cps/web.py:2793 +#: cps/web.py:2827 msgid "Mail settings updated" msgstr "Mail instellingen aangepast" -#: cps/web.py:2800 +#: cps/web.py:2834 #, python-format msgid "Test E-Mail successfully send to %(kindlemail)s" msgstr "Test email met succes verstuurd naar %(kindlemail)s" -#: cps/web.py:2803 +#: cps/web.py:2837 #, python-format msgid "There was an error sending the Test E-Mail: %(res)s" msgstr "Er trad een fout op met het versturen van de test email: %(res)s" -#: cps/web.py:2807 +#: cps/web.py:2841 msgid "E-Mail settings updated" msgstr "Email instellingen aangepast" -#: cps/web.py:2808 +#: cps/web.py:2842 msgid "Edit mail settings" msgstr "Bewerk mail instellingen" -#: cps/web.py:2837 +#: cps/web.py:2871 #, python-format msgid "User '%(nick)s' deleted" msgstr "Gebruiker '%(nick)s' verwijderd" -#: cps/web.py:2945 +#: cps/web.py:2980 #, python-format msgid "User '%(nick)s' updated" msgstr "Gebruiker '%(nick)s' aangepast" -#: cps/web.py:2948 +#: cps/web.py:2983 msgid "An unknown error occured." msgstr "Een onbekende fout deed zich voor." -#: cps/web.py:2951 +#: cps/web.py:2986 #, python-format msgid "Edit User %(nick)s" msgstr "Bewerk gebruiker '%(nick)s'" -#: cps/web.py:2967 +#: cps/web.py:3002 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "Fout bij openen eBook. Het bestand bestaat niet of is niet toegankelijk" -#: cps/web.py:2982 cps/web.py:3193 cps/web.py:3198 cps/web.py:3344 +#: cps/web.py:3017 cps/web.py:3228 cps/web.py:3233 cps/web.py:3379 msgid "edit metadata" msgstr "Bewerk metadata" -#: cps/web.py:2992 cps/web.py:3238 +#: cps/web.py:3027 cps/web.py:3273 #, python-format msgid "File extension \"%s\" is not allowed to be uploaded to this server" msgstr "Het uploaden van bestandsextensie \"%s\" is niet toegestaan op deze server" -#: cps/web.py:3003 +#: cps/web.py:3038 #, python-format msgid "Failed to store file %s." msgstr "Bestand opslaan niet gelukt voor %s." -#: cps/web.py:3025 cps/web.py:3029 +#: cps/web.py:3060 cps/web.py:3064 msgid "unknown" msgstr "onbekend" -#: cps/web.py:3052 +#: cps/web.py:3087 msgid "Cover is not a jpg file, can't save" msgstr "" -#: cps/web.py:3244 +#: cps/web.py:3279 msgid "File to be uploaded must have an extension" msgstr "Up te loaden bestanden dienen een extensie te hebben" -#: cps/web.py:3263 +#: cps/web.py:3298 #, python-format msgid "Failed to create path %s (Permission denied)." msgstr "Het pad %s aanmaken mislukt (Geen toestemming)." -#: cps/web.py:3268 +#: cps/web.py:3303 #, python-format msgid "Failed to store file %s (Permission denied)." msgstr "Bestand %s opslaan mislukt (Geen toestemming)." -#: cps/web.py:3273 +#: cps/web.py:3308 #, python-format msgid "Failed to delete file %s (Permission denied)." msgstr "Bestand %s wissen mislukt (Geen toestemming)." @@ -522,7 +544,7 @@ msgstr "Kindlle" msgid "DLS" msgstr "DLS" -#: cps/templates/admin.html:12 cps/templates/layout.html:69 +#: cps/templates/admin.html:12 cps/templates/layout.html:71 msgid "Admin" msgstr "Administratie" @@ -531,7 +553,7 @@ msgstr "Administratie" msgid "Download" msgstr "Download" -#: cps/templates/admin.html:14 cps/templates/layout.html:62 +#: cps/templates/admin.html:14 cps/templates/layout.html:64 msgid "Upload" msgstr "Upload" @@ -583,7 +605,7 @@ msgstr "Configuratie" msgid "Calibre DB dir" msgstr "Calibre DB map" -#: cps/templates/admin.html:61 cps/templates/config_edit.html:91 +#: cps/templates/admin.html:61 cps/templates/config_edit.html:87 msgid "Log Level" msgstr "Log niveau" @@ -591,7 +613,7 @@ msgstr "Log niveau" msgid "Port" msgstr "Poort" -#: cps/templates/admin.html:63 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:63 cps/templates/config_edit.html:64 msgid "Books per page" msgstr "Boeken per pagina" @@ -654,9 +676,9 @@ msgstr "Ok" #: cps/templates/admin.html:105 cps/templates/admin.html:119 #: cps/templates/book_edit.html:135 cps/templates/book_edit.html:157 -#: cps/templates/config_edit.html:223 cps/templates/email_edit.html:36 +#: cps/templates/config_edit.html:219 cps/templates/email_edit.html:36 #: cps/templates/shelf.html:60 cps/templates/shelf_edit.html:19 -#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:139 +#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:147 msgid "Back" msgstr "Terug" @@ -702,7 +724,7 @@ msgstr "Omschrijving" msgid "Tags" msgstr "Tags" -#: cps/templates/book_edit.html:39 cps/templates/layout.html:152 +#: cps/templates/book_edit.html:39 cps/templates/layout.html:154 #: cps/templates/search_form.html:54 msgid "Series" msgstr "Series" @@ -749,9 +771,9 @@ msgstr "bekijk boek na bewerking" msgid "Get metadata" msgstr "Verkrijg metadata" -#: cps/templates/book_edit.html:134 cps/templates/config_edit.html:221 +#: cps/templates/book_edit.html:134 cps/templates/config_edit.html:217 #: cps/templates/login.html:20 cps/templates/search_form.html:96 -#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:145 msgid "Submit" msgstr "Indienen" @@ -779,7 +801,7 @@ msgstr "Zoekwoord" msgid " Search keyword " msgstr "Zoek voor zoekwoord" -#: cps/templates/book_edit.html:175 cps/templates/layout.html:44 +#: cps/templates/book_edit.html:175 cps/templates/layout.html:46 msgid "Go!" msgstr "Start!" @@ -791,7 +813,7 @@ msgstr "Klik op de omslag om de metatadata in het formulier te laden" msgid "Loading..." msgstr "Aan het laden..." -#: cps/templates/book_edit.html:196 cps/templates/layout.html:216 +#: cps/templates/book_edit.html:196 cps/templates/layout.html:218 msgid "Close" msgstr "Sluit" @@ -816,184 +838,180 @@ msgstr "Geen resultaat! Gelieve een ander zoekwoord proberen" msgid "Location of Calibre database" msgstr "Locatie van de Calibre database" -#: cps/templates/config_edit.html:13 +#: cps/templates/config_edit.html:12 msgid "Use google drive?" msgstr "Google drive gebruiken?" -#: cps/templates/config_edit.html:17 -msgid "Client id" -msgstr "Client id" - -#: cps/templates/config_edit.html:21 -msgid "Client secret" -msgstr "Client geheim" - -#: cps/templates/config_edit.html:25 -msgid "Calibre Base URL" -msgstr "Calibre basis URL" +#: cps/templates/config_edit.html:18 +msgid "Google drive config problem" +msgstr "" -#: cps/templates/config_edit.html:29 +#: cps/templates/config_edit.html:28 msgid "Google drive Calibre folder" msgstr "Google drive calibre folder" -#: cps/templates/config_edit.html:38 +#: cps/templates/config_edit.html:36 msgid "Metadata Watch Channel ID" msgstr "Metadata Watch Channel ID" -#: cps/templates/config_edit.html:52 +#: cps/templates/config_edit.html:39 +msgid "Revoke" +msgstr "" + +#: cps/templates/config_edit.html:48 msgid "Server Port" msgstr "Server poort" -#: cps/templates/config_edit.html:56 +#: cps/templates/config_edit.html:52 msgid "SSL certfile location (leave it empty for non-SSL Servers)" msgstr "" -#: cps/templates/config_edit.html:60 +#: cps/templates/config_edit.html:56 msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "" -#: cps/templates/config_edit.html:64 cps/templates/layout.html:128 -#: cps/templates/layout.html:129 cps/templates/shelf_edit.html:7 +#: cps/templates/config_edit.html:60 cps/templates/layout.html:130 +#: cps/templates/layout.html:131 cps/templates/shelf_edit.html:7 msgid "Title" msgstr "Titel" -#: cps/templates/config_edit.html:72 +#: cps/templates/config_edit.html:68 msgid "No. of random books to show" msgstr "Aantal boeken te tonen" -#: cps/templates/config_edit.html:76 +#: cps/templates/config_edit.html:72 msgid "Regular expression for ignoring columns" msgstr "Reguliere expressie om kolommen te negeren" -#: cps/templates/config_edit.html:80 +#: cps/templates/config_edit.html:76 msgid "Regular expression for title sorting" msgstr "Rguliere expressie op titels te sorteren" -#: cps/templates/config_edit.html:84 +#: cps/templates/config_edit.html:80 msgid "Tags for Mature Content" msgstr "Tags voor Volwassen Inhoud" -#: cps/templates/config_edit.html:100 +#: cps/templates/config_edit.html:96 msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "" -#: cps/templates/config_edit.html:106 +#: cps/templates/config_edit.html:102 msgid "Enable uploading" msgstr "Uploaden aanzetten" -#: cps/templates/config_edit.html:110 +#: cps/templates/config_edit.html:106 msgid "Enable anonymous browsing" msgstr "Anoniem verkennen aanzetten" -#: cps/templates/config_edit.html:114 +#: cps/templates/config_edit.html:110 msgid "Enable public registration" msgstr "Publieke registratie aanzetten" -#: cps/templates/config_edit.html:118 +#: cps/templates/config_edit.html:114 msgid "Enable remote login (\"magic link\")" msgstr "Maak op afstand ionloggen mogelijk (\"magic link\")" -#: cps/templates/config_edit.html:123 +#: cps/templates/config_edit.html:119 msgid "Use" msgstr "Gebruik" -#: cps/templates/config_edit.html:124 +#: cps/templates/config_edit.html:120 msgid "Obtain an API Key" msgstr "Verkrijg een API sleutel" -#: cps/templates/config_edit.html:128 +#: cps/templates/config_edit.html:124 msgid "Goodreads API Key" msgstr "Goodreads API sleutel" -#: cps/templates/config_edit.html:132 +#: cps/templates/config_edit.html:128 msgid "Goodreads API Secret" msgstr "Goodreads API geheim" -#: cps/templates/config_edit.html:137 +#: cps/templates/config_edit.html:133 msgid "Default Settings for new users" msgstr "Standaard instellingen voor nieuwe gebruikers" -#: cps/templates/config_edit.html:140 cps/templates/user_edit.html:94 +#: cps/templates/config_edit.html:136 cps/templates/user_edit.html:102 msgid "Admin user" msgstr "Administratie gebruiker" -#: cps/templates/config_edit.html:144 cps/templates/user_edit.html:103 +#: cps/templates/config_edit.html:140 cps/templates/user_edit.html:111 msgid "Allow Downloads" msgstr "Downloads toestaan" -#: cps/templates/config_edit.html:148 cps/templates/user_edit.html:107 +#: cps/templates/config_edit.html:144 cps/templates/user_edit.html:115 msgid "Allow Uploads" msgstr "Uploads toestaan" -#: cps/templates/config_edit.html:152 cps/templates/user_edit.html:111 +#: cps/templates/config_edit.html:148 cps/templates/user_edit.html:119 msgid "Allow Edit" msgstr "Bewerken toestaan" -#: cps/templates/config_edit.html:156 cps/templates/user_edit.html:115 +#: cps/templates/config_edit.html:152 cps/templates/user_edit.html:123 msgid "Allow Delete books" msgstr "Het wissen van boeken toestaan" -#: cps/templates/config_edit.html:160 cps/templates/user_edit.html:120 +#: cps/templates/config_edit.html:156 cps/templates/user_edit.html:128 msgid "Allow Changing Password" msgstr "Wachtwoord wijzigen toestaan" -#: cps/templates/config_edit.html:164 cps/templates/user_edit.html:124 +#: cps/templates/config_edit.html:160 cps/templates/user_edit.html:132 msgid "Allow Editing Public Shelfs" msgstr "Publieke boekenplanken bewerken toestaan" -#: cps/templates/config_edit.html:168 +#: cps/templates/config_edit.html:164 msgid "Default visiblities for new users" msgstr "" -#: cps/templates/config_edit.html:172 cps/templates/user_edit.html:46 +#: cps/templates/config_edit.html:168 cps/templates/user_edit.html:54 msgid "Show random books" msgstr "Toon willekeurige boeken" -#: cps/templates/config_edit.html:176 cps/templates/user_edit.html:50 +#: cps/templates/config_edit.html:172 cps/templates/user_edit.html:58 msgid "Show recent books" msgstr "" -#: cps/templates/config_edit.html:180 cps/templates/user_edit.html:54 +#: cps/templates/config_edit.html:176 cps/templates/user_edit.html:62 msgid "Show sorted books" msgstr "" -#: cps/templates/config_edit.html:184 cps/templates/user_edit.html:58 +#: cps/templates/config_edit.html:180 cps/templates/user_edit.html:66 msgid "Show hot books" msgstr "Toon populaire boeken" -#: cps/templates/config_edit.html:188 cps/templates/user_edit.html:62 +#: cps/templates/config_edit.html:184 cps/templates/user_edit.html:70 msgid "Show best rated books" msgstr "Toon best beoordeelde boeken" -#: cps/templates/config_edit.html:192 cps/templates/user_edit.html:66 +#: cps/templates/config_edit.html:188 cps/templates/user_edit.html:74 msgid "Show language selection" msgstr "Toon taal selectie" -#: cps/templates/config_edit.html:196 cps/templates/user_edit.html:70 +#: cps/templates/config_edit.html:192 cps/templates/user_edit.html:78 msgid "Show series selection" msgstr "Toon serie selectie" -#: cps/templates/config_edit.html:200 cps/templates/user_edit.html:74 +#: cps/templates/config_edit.html:196 cps/templates/user_edit.html:82 msgid "Show category selection" msgstr "Toon categorie selectie" -#: cps/templates/config_edit.html:204 cps/templates/user_edit.html:78 +#: cps/templates/config_edit.html:200 cps/templates/user_edit.html:86 msgid "Show author selection" msgstr "Toon auteur selectie" -#: cps/templates/config_edit.html:208 cps/templates/user_edit.html:82 +#: cps/templates/config_edit.html:204 cps/templates/user_edit.html:90 msgid "Show read and unread" msgstr "Toon gelezen en ongelezen" -#: cps/templates/config_edit.html:212 cps/templates/user_edit.html:86 +#: cps/templates/config_edit.html:208 cps/templates/user_edit.html:94 msgid "Show random books in detail view" msgstr "Toon willekeurige boeken in gedetailleerd zicht" -#: cps/templates/config_edit.html:216 cps/templates/user_edit.html:99 +#: cps/templates/config_edit.html:212 cps/templates/user_edit.html:107 msgid "Show mature content" msgstr "Toon Volwassen Inhoud" -#: cps/templates/config_edit.html:226 cps/templates/layout.html:77 +#: cps/templates/config_edit.html:222 cps/templates/layout.html:79 #: cps/templates/login.html:4 msgid "Login" msgstr "Login" @@ -1064,12 +1082,12 @@ msgstr "Bewaar instelling" msgid "Save settings and send Test E-Mail" msgstr "Bewaar instellingen en stuur test email" -#: cps/templates/feed.xml:20 cps/templates/layout.html:200 +#: cps/templates/feed.xml:20 cps/templates/layout.html:202 msgid "Next" msgstr "Volgende" #: cps/templates/feed.xml:29 cps/templates/index.xml:7 -#: cps/templates/layout.html:41 cps/templates/layout.html:42 +#: cps/templates/layout.html:43 cps/templates/layout.html:44 msgid "Search" msgstr "Zoek" @@ -1081,7 +1099,7 @@ msgstr "Ontdek (Willekeurige Boeken)" msgid "Start" msgstr "Start" -#: cps/templates/index.xml:14 cps/templates/layout.html:134 +#: cps/templates/index.xml:14 cps/templates/layout.html:136 msgid "Hot Books" msgstr "Populaire Boeken" @@ -1089,7 +1107,7 @@ msgstr "Populaire Boeken" msgid "Popular publications from this catalog based on Downloads." msgstr "Populaire publicaties van deze cataloog gebaseerd op Downloads." -#: cps/templates/index.xml:20 cps/templates/layout.html:137 +#: cps/templates/index.xml:20 cps/templates/layout.html:139 msgid "Best rated Books" msgstr "Best beoordeeld" @@ -1109,7 +1127,7 @@ msgstr "Recentste boeken" msgid "Show Random Books" msgstr "Toon Willekeurige Boeken" -#: cps/templates/index.xml:52 cps/templates/layout.html:155 +#: cps/templates/index.xml:52 cps/templates/layout.html:157 msgid "Authors" msgstr "Auteurs" @@ -1125,7 +1143,7 @@ msgstr "Boeken gesorteerd op Categorie" msgid "Books ordered by series" msgstr "Boeken gesorteerd op Serie" -#: cps/templates/index.xml:70 cps/templates/layout.html:161 +#: cps/templates/index.xml:70 cps/templates/layout.html:163 msgid "Public Shelves" msgstr "Publieke Boekenplanken" @@ -1133,7 +1151,7 @@ msgstr "Publieke Boekenplanken" msgid "Books organized in public shelfs, visible to everyone" msgstr "" -#: cps/templates/index.xml:77 cps/templates/layout.html:165 +#: cps/templates/index.xml:77 cps/templates/layout.html:167 msgid "Your Shelves" msgstr "Jou Boekenplanken" @@ -1141,88 +1159,88 @@ msgstr "Jou Boekenplanken" msgid "User's own shelfs, only visible to the current user himself" msgstr "" -#: cps/templates/layout.html:31 +#: cps/templates/layout.html:33 msgid "Toggle navigation" msgstr "Kies navigatie" -#: cps/templates/layout.html:52 +#: cps/templates/layout.html:54 msgid "Advanced Search" msgstr "Geavanceerd zoeken" -#: cps/templates/layout.html:73 +#: cps/templates/layout.html:75 msgid "Logout" msgstr "Log uit" -#: cps/templates/layout.html:78 cps/templates/register.html:18 +#: cps/templates/layout.html:80 cps/templates/register.html:18 msgid "Register" msgstr "Registreer" -#: cps/templates/layout.html:103 +#: cps/templates/layout.html:105 msgid "Uploading..." msgstr "" -#: cps/templates/layout.html:104 +#: cps/templates/layout.html:106 msgid "please don't refresh the page" msgstr "" -#: cps/templates/layout.html:115 +#: cps/templates/layout.html:117 msgid "Browse" msgstr "Verkennen" -#: cps/templates/layout.html:117 +#: cps/templates/layout.html:119 msgid "Recently Added" msgstr "Recent Toegevoegd" -#: cps/templates/layout.html:122 +#: cps/templates/layout.html:124 msgid "Sorted Books" msgstr "Gesorteerde Boeken" -#: cps/templates/layout.html:126 cps/templates/layout.html:127 #: cps/templates/layout.html:128 cps/templates/layout.html:129 +#: cps/templates/layout.html:130 cps/templates/layout.html:131 msgid "Sort By" msgstr "Sorteren op" -#: cps/templates/layout.html:126 +#: cps/templates/layout.html:128 msgid "Newest" msgstr "Nieuwste" -#: cps/templates/layout.html:127 +#: cps/templates/layout.html:129 msgid "Oldest" msgstr "Oudste" -#: cps/templates/layout.html:128 +#: cps/templates/layout.html:130 msgid "Ascending" msgstr "Oplopend" -#: cps/templates/layout.html:129 +#: cps/templates/layout.html:131 msgid "Descending" msgstr "Aflopend" -#: cps/templates/layout.html:146 +#: cps/templates/layout.html:148 msgid "Discover" msgstr "Ontdek" -#: cps/templates/layout.html:149 +#: cps/templates/layout.html:151 msgid "Categories" msgstr "Categorieën" -#: cps/templates/layout.html:158 cps/templates/search_form.html:75 +#: cps/templates/layout.html:160 cps/templates/search_form.html:75 msgid "Languages" msgstr "Talen" -#: cps/templates/layout.html:170 +#: cps/templates/layout.html:172 msgid "Create a Shelf" msgstr "Maak een boekenplank" -#: cps/templates/layout.html:171 cps/templates/stats.html:3 +#: cps/templates/layout.html:173 cps/templates/stats.html:3 msgid "About" msgstr "Over" -#: cps/templates/layout.html:185 +#: cps/templates/layout.html:187 msgid "Previous" msgstr "Vorige" -#: cps/templates/layout.html:212 +#: cps/templates/layout.html:214 msgid "Book Details" msgstr "Boek Details" @@ -1393,18 +1411,30 @@ msgid "Kindle E-Mail" msgstr "Kindle email" #: cps/templates/user_edit.html:35 +msgid "Theme" +msgstr "" + +#: cps/templates/user_edit.html:37 +msgid "Standard Theme" +msgstr "" + +#: cps/templates/user_edit.html:38 +msgid "caliBlur! Dark Theme (Beta)" +msgstr "" + +#: cps/templates/user_edit.html:43 msgid "Show books with language" msgstr "Toon boeken met taal" -#: cps/templates/user_edit.html:37 +#: cps/templates/user_edit.html:45 msgid "Show all" msgstr "Toon alles" -#: cps/templates/user_edit.html:131 +#: cps/templates/user_edit.html:139 msgid "Delete this user" msgstr "Wis deze gebruiker" -#: cps/templates/user_edit.html:146 +#: cps/templates/user_edit.html:154 msgid "Recent Downloads" msgstr "Recente Downloads" diff --git a/cps/translations/pl/LC_MESSAGES/messages.po b/cps/translations/pl/LC_MESSAGES/messages.po index 9ab3def2..45447a45 100644 --- a/cps/translations/pl/LC_MESSAGES/messages.po +++ b/cps/translations/pl/LC_MESSAGES/messages.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre Web - polski (POT: 2017-04-11 22:51)\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2018-04-01 19:27+0200\n" +"POT-Creation-Date: 2018-06-02 10:45+0200\n" "PO-Revision-Date: 2017-04-11 22:51+0200\n" "Last-Translator: Radosław Kierznowski \n" "Language: pl\n" @@ -28,59 +28,59 @@ msgstr "" msgid "not installed" msgstr "nie zainstalowane" -#: cps/helper.py:78 +#: cps/helper.py:79 #, python-format msgid "kindlegen binary %(kindlepath)s not found" msgstr "" -#: cps/helper.py:84 +#: cps/helper.py:85 #, python-format msgid "epub format not found for book id: %(book)d" msgstr "" -#: cps/helper.py:94 +#: cps/helper.py:95 msgid "kindlegen failed, no execution permissions" msgstr "" -#: cps/helper.py:109 +#: cps/helper.py:110 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "" -#: cps/helper.py:188 +#: cps/helper.py:189 #, python-format msgid "Failed to send mail: %s" msgstr "Nie można wysłać poczty: %s" -#: cps/helper.py:195 +#: cps/helper.py:196 msgid "Calibre-web test email" msgstr "Calibre-web testowy email" -#: cps/helper.py:196 cps/helper.py:208 +#: cps/helper.py:197 cps/helper.py:209 msgid "This email has been sent via calibre web." msgstr "Ten e-mail został wysłany przez Calibre Web." -#: cps/helper.py:205 cps/templates/detail.html:44 +#: cps/helper.py:206 cps/templates/detail.html:44 msgid "Send to Kindle" msgstr "Wyślij do Kindle" -#: cps/helper.py:225 cps/helper.py:239 +#: cps/helper.py:226 cps/helper.py:240 msgid "Could not find any formats suitable for sending by email" msgstr "" "Nie można znaleźć żadnych formatów przystosowane do wysyłania pocztą " "e-mail" -#: cps/helper.py:340 +#: cps/helper.py:341 #, python-format msgid "Rename title from: \"%s\" to \"%s\" failed with error: %s" msgstr "" -#: cps/helper.py:349 +#: cps/helper.py:350 #, python-format msgid "Rename author from: \"%s\" to \"%s\" failed with error: %s" msgstr "" -#: cps/ub.py:684 +#: cps/ub.py:694 msgid "Guest" msgstr "Gość" @@ -148,7 +148,7 @@ msgstr "Losowe książki" msgid "Author list" msgstr "Lista autorów" -#: cps/web.py:1220 cps/web.py:1278 cps/web.py:1408 cps/web.py:1903 +#: cps/web.py:1220 cps/web.py:1278 cps/web.py:1408 cps/web.py:1917 msgid "Error opening eBook. File does not exist or file is not accessible:" msgstr "Błąd otwierania e-booka. Plik nie istnieje lub plik nie jest dostępny:" @@ -187,306 +187,328 @@ msgstr "" msgid "Statistics" msgstr "Statystyki" -#: cps/web.py:1641 +#: cps/web.py:1573 +msgid "" +"Callback domain is not verified, please follow steps to verify domain in " +"google developer console" +msgstr "" + +#: cps/web.py:1651 msgid "Server restarted, please reload page" msgstr "Serwer uruchomiony ponownie, proszę odświeżyć stronę" -#: cps/web.py:1643 +#: cps/web.py:1653 msgid "Performing shutdown of server, please close window" msgstr "Wykonano wyłączenie serwera, proszę zamknąć okno" -#: cps/web.py:1659 +#: cps/web.py:1669 msgid "Update done" msgstr "Aktualizacja zakończona" -#: cps/web.py:1716 +#: cps/web.py:1726 #, python-format msgid "Published after %s" msgstr "" -#: cps/web.py:1721 +#: cps/web.py:1731 msgid "Published before " msgstr "" -#: cps/web.py:1767 cps/web.py:1780 +#: cps/web.py:1777 cps/web.py:1790 msgid "search" msgstr "szukaj" +#: cps/web.py:1816 +msgid "not found on GDrive" +msgstr "" + #: cps/templates/index.xml:39 cps/templates/index.xml:42 -#: cps/templates/layout.html:141 cps/web.py:1858 +#: cps/templates/layout.html:143 cps/web.py:1872 msgid "Read Books" msgstr "Przeczytane książki" #: cps/templates/index.xml:46 cps/templates/index.xml:49 -#: cps/templates/layout.html:143 cps/web.py:1861 +#: cps/templates/layout.html:145 cps/web.py:1875 msgid "Unread Books" msgstr "Nieprzeczytane książki" -#: cps/web.py:1936 cps/web.py:1938 cps/web.py:1940 cps/web.py:1949 +#: cps/web.py:1950 cps/web.py:1952 cps/web.py:1954 cps/web.py:1963 msgid "Read a Book" msgstr "Czytaj książkę" -#: cps/web.py:2001 cps/web.py:2718 +#: cps/web.py:2015 cps/web.py:2751 msgid "Please fill out all fields!" msgstr "Proszę wypełnić wszystkie pola!" -#: cps/web.py:2002 cps/web.py:2019 cps/web.py:2024 cps/web.py:2026 +#: cps/web.py:2016 cps/web.py:2033 cps/web.py:2038 cps/web.py:2040 msgid "register" msgstr "rejestracja" -#: cps/web.py:2018 +#: cps/web.py:2032 msgid "An unknown error occured. Please try again later." msgstr "Wystąpił nieznany błąd. Spróbuj ponownie później." -#: cps/web.py:2023 +#: cps/web.py:2037 msgid "This username or email address is already in use." msgstr "Nazwa użytkownika lub adres e-mail jest już w użyciu." -#: cps/web.py:2042 cps/web.py:2138 +#: cps/web.py:2056 cps/web.py:2152 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "Zalogowałeś się jako: '%(nickname)s'" -#: cps/web.py:2047 +#: cps/web.py:2061 msgid "Wrong Username or Password" msgstr "Błędna nazwa użytkownika lub hasło" -#: cps/web.py:2053 cps/web.py:2074 +#: cps/web.py:2067 cps/web.py:2088 msgid "login" msgstr "logowanie" -#: cps/web.py:2086 cps/web.py:2117 +#: cps/web.py:2100 cps/web.py:2131 msgid "Token not found" msgstr "" -#: cps/web.py:2094 cps/web.py:2125 +#: cps/web.py:2108 cps/web.py:2139 msgid "Token has expired" msgstr "" -#: cps/web.py:2102 +#: cps/web.py:2116 msgid "Success! Please return to your device" msgstr "" -#: cps/web.py:2152 +#: cps/web.py:2166 msgid "Please configure the SMTP mail settings first..." msgstr "Proszę najpierw skonfigurować ustawienia SMTP poczty e-mail..." -#: cps/web.py:2156 +#: cps/web.py:2170 #, python-format msgid "Book successfully send to %(kindlemail)s" msgstr "Książka została pomyślnie wysłana do %(kindlemail)s" -#: cps/web.py:2160 +#: cps/web.py:2174 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "Wystąpił błąd podczas wysyłania tej książki: %(res)s" -#: cps/web.py:2162 cps/web.py:2805 +#: cps/web.py:2176 cps/web.py:2839 msgid "Please configure your kindle email address first..." msgstr "Proszę najpierw skonfigurować adres e-mail swojego kindla..." -#: cps/web.py:2206 +#: cps/web.py:2220 #, python-format msgid "Book has been added to shelf: %(sname)s" msgstr "Książka została dodana do półki: %(sname)s" -#: cps/web.py:2244 +#: cps/web.py:2258 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "Książka została usunięta z półki: %(sname)s" -#: cps/web.py:2250 +#: cps/web.py:2264 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "" -#: cps/web.py:2270 cps/web.py:2294 +#: cps/web.py:2284 cps/web.py:2308 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "Półka o nazwie '%(title)s' już istnieje." -#: cps/web.py:2275 +#: cps/web.py:2289 #, python-format msgid "Shelf %(title)s created" msgstr "Półka %(title)s została utworzona" -#: cps/web.py:2277 cps/web.py:2305 +#: cps/web.py:2291 cps/web.py:2319 msgid "There was an error" msgstr "Wystąpił błąd" -#: cps/web.py:2278 cps/web.py:2280 +#: cps/web.py:2292 cps/web.py:2294 msgid "create a shelf" msgstr "utwórz półkę" -#: cps/web.py:2303 +#: cps/web.py:2317 #, python-format msgid "Shelf %(title)s changed" msgstr "Półka %(title)s została zmieniona" -#: cps/web.py:2306 cps/web.py:2308 +#: cps/web.py:2320 cps/web.py:2322 msgid "Edit a shelf" msgstr "Edytuj półkę" -#: cps/web.py:2329 +#: cps/web.py:2343 #, python-format msgid "successfully deleted shelf %(name)s" msgstr "pomyślnie usunięto półkę %(name)s" -#: cps/web.py:2351 +#: cps/web.py:2365 #, python-format msgid "Shelf: '%(name)s'" msgstr "Półka: '%(name)s'" -#: cps/web.py:2354 +#: cps/web.py:2368 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "" -#: cps/web.py:2385 +#: cps/web.py:2399 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Zmieniono kolejność półki: '%(name)s'" -#: cps/web.py:2454 +#: cps/web.py:2469 msgid "Found an existing account for this email address." msgstr "Znaleziono istniejące konto dla tego adresu e-mail." -#: cps/web.py:2456 cps/web.py:2460 +#: cps/web.py:2471 cps/web.py:2475 #, python-format msgid "%(name)s's profile" msgstr "Profil użytkownika %(name)s" -#: cps/web.py:2457 +#: cps/web.py:2472 msgid "Profile updated" msgstr "Zaktualizowano profil" -#: cps/web.py:2469 +#: cps/web.py:2484 msgid "Unknown" msgstr "" -#: cps/web.py:2482 +#: cps/web.py:2497 msgid "Admin page" msgstr "Portal administracyjny" -#: cps/web.py:2553 -msgid "Keyfile location is not valid, please enter correct path" +#: cps/web.py:2520 +msgid "Import of optional GDrive requirements missing" msgstr "" -#: cps/web.py:2556 cps/web.py:2567 cps/web.py:2660 cps/web.py:2679 -#: cps/web.py:2685 cps/web.py:2699 +#: cps/web.py:2523 +msgid "client_secret.json is missing or not readable" +msgstr "" + +#: cps/web.py:2528 cps/web.py:2553 +msgid "client_secret.json is not configured for web application" +msgstr "" + +#: cps/web.py:2556 cps/web.py:2582 cps/web.py:2593 cps/web.py:2686 +#: cps/web.py:2706 cps/web.py:2713 cps/web.py:2732 msgid "Basic Configuration" msgstr "Podstawowa konfiguracja" -#: cps/web.py:2564 +#: cps/web.py:2579 +msgid "Keyfile location is not valid, please enter correct path" +msgstr "" + +#: cps/web.py:2590 msgid "Certfile location is not valid, please enter correct path" msgstr "" -#: cps/web.py:2657 +#: cps/web.py:2683 msgid "Logfile location is not valid, please enter correct path" msgstr "" -#: cps/web.py:2672 +#: cps/web.py:2698 msgid "Calibre-web configuration updated" msgstr "Konfiguracja Calibre-web została zaktualizowana" -#: cps/web.py:2683 +#: cps/web.py:2710 msgid "DB location is not valid, please enter correct path" msgstr "Lokalizacja bazy danych jest nieprawidłowa, wpisz poprawną ścieżkę" -#: cps/templates/admin.html:34 cps/web.py:2720 cps/web.py:2775 +#: cps/templates/admin.html:34 cps/web.py:2753 cps/web.py:2809 msgid "Add new user" msgstr "Dodaj nowego użytkownika" -#: cps/web.py:2765 +#: cps/web.py:2799 #, python-format msgid "User '%(user)s' created" msgstr "Użytkownik '%(user)s' został utworzony" -#: cps/web.py:2769 +#: cps/web.py:2803 msgid "Found an existing account for this email address or nickname." msgstr "Znaleziono istniejące konto dla tego adresu e-mail lub nazwy użytkownika." -#: cps/web.py:2793 +#: cps/web.py:2827 msgid "Mail settings updated" msgstr "Zaktualizowano ustawienia poczty e-mail" -#: cps/web.py:2800 +#: cps/web.py:2834 #, python-format msgid "Test E-Mail successfully send to %(kindlemail)s" msgstr "Testowy e-mail został pomyślnie wysłany do %(kindlemail)s" -#: cps/web.py:2803 +#: cps/web.py:2837 #, python-format msgid "There was an error sending the Test E-Mail: %(res)s" msgstr "Wystąpił błąd podczas wysyłania testowej wiadomości e-mail: %(res)s" -#: cps/web.py:2807 +#: cps/web.py:2841 msgid "E-Mail settings updated" msgstr "Zaktualizowano ustawienia e-mail" -#: cps/web.py:2808 +#: cps/web.py:2842 msgid "Edit mail settings" msgstr "Edytuj ustawienia poczty e-mail" -#: cps/web.py:2837 +#: cps/web.py:2871 #, python-format msgid "User '%(nick)s' deleted" msgstr "Użytkownik '%(nick)s' został usunięty" -#: cps/web.py:2945 +#: cps/web.py:2980 #, python-format msgid "User '%(nick)s' updated" msgstr "Użytkownik '%(nick)s' został zaktualizowany" -#: cps/web.py:2948 +#: cps/web.py:2983 msgid "An unknown error occured." msgstr "Wystąpił nieznany błąd." -#: cps/web.py:2951 +#: cps/web.py:2986 #, python-format msgid "Edit User %(nick)s" msgstr "Edytuj użytkownika %(nick)s" -#: cps/web.py:2967 +#: cps/web.py:3002 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "" -#: cps/web.py:2982 cps/web.py:3193 cps/web.py:3198 cps/web.py:3344 +#: cps/web.py:3017 cps/web.py:3228 cps/web.py:3233 cps/web.py:3379 msgid "edit metadata" msgstr "edytuj metadane" -#: cps/web.py:2992 cps/web.py:3238 +#: cps/web.py:3027 cps/web.py:3273 #, python-format msgid "File extension \"%s\" is not allowed to be uploaded to this server" msgstr "Rozszerzenie pliku \"%s\" nie jest dozwolone do przesłania na ten serwer" -#: cps/web.py:3003 +#: cps/web.py:3038 #, python-format msgid "Failed to store file %s." msgstr "" -#: cps/web.py:3025 cps/web.py:3029 +#: cps/web.py:3060 cps/web.py:3064 msgid "unknown" msgstr "" -#: cps/web.py:3052 +#: cps/web.py:3087 msgid "Cover is not a jpg file, can't save" msgstr "" -#: cps/web.py:3244 +#: cps/web.py:3279 msgid "File to be uploaded must have an extension" msgstr "Plik do przesłania musi mieć rozszerzenie" -#: cps/web.py:3263 +#: cps/web.py:3298 #, python-format msgid "Failed to create path %s (Permission denied)." msgstr "Nie udało się utworzyć łącza %s (Odmowa dostępu)." -#: cps/web.py:3268 +#: cps/web.py:3303 #, python-format msgid "Failed to store file %s (Permission denied)." msgstr "Nie można przechowywać pliku %s (Odmowa dostępu)." -#: cps/web.py:3273 +#: cps/web.py:3308 #, python-format msgid "Failed to delete file %s (Permission denied)." msgstr "Nie udało się usunąć pliku %s (Odmowa dostępu)." @@ -511,7 +533,7 @@ msgstr "Kindle" msgid "DLS" msgstr "DLS" -#: cps/templates/admin.html:12 cps/templates/layout.html:69 +#: cps/templates/admin.html:12 cps/templates/layout.html:71 msgid "Admin" msgstr "Portal administracyjny" @@ -520,7 +542,7 @@ msgstr "Portal administracyjny" msgid "Download" msgstr "Pobierz" -#: cps/templates/admin.html:14 cps/templates/layout.html:62 +#: cps/templates/admin.html:14 cps/templates/layout.html:64 msgid "Upload" msgstr "Wyślij" @@ -572,7 +594,7 @@ msgstr "Konfiguracja" msgid "Calibre DB dir" msgstr "Folder bazy danych Calibre" -#: cps/templates/admin.html:61 cps/templates/config_edit.html:91 +#: cps/templates/admin.html:61 cps/templates/config_edit.html:87 msgid "Log Level" msgstr "Poziom logów" @@ -580,7 +602,7 @@ msgstr "Poziom logów" msgid "Port" msgstr "Port" -#: cps/templates/admin.html:63 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:63 cps/templates/config_edit.html:64 msgid "Books per page" msgstr "Ilość książek na stronie" @@ -643,9 +665,9 @@ msgstr "OK" #: cps/templates/admin.html:105 cps/templates/admin.html:119 #: cps/templates/book_edit.html:135 cps/templates/book_edit.html:157 -#: cps/templates/config_edit.html:223 cps/templates/email_edit.html:36 +#: cps/templates/config_edit.html:219 cps/templates/email_edit.html:36 #: cps/templates/shelf.html:60 cps/templates/shelf_edit.html:19 -#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:139 +#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:147 msgid "Back" msgstr "Wróć" @@ -691,7 +713,7 @@ msgstr "Opis" msgid "Tags" msgstr "Tagi" -#: cps/templates/book_edit.html:39 cps/templates/layout.html:152 +#: cps/templates/book_edit.html:39 cps/templates/layout.html:154 #: cps/templates/search_form.html:54 msgid "Series" msgstr "Seria" @@ -738,9 +760,9 @@ msgstr "wyświetl książkę po edycji" msgid "Get metadata" msgstr "Uzyskaj metadane" -#: cps/templates/book_edit.html:134 cps/templates/config_edit.html:221 +#: cps/templates/book_edit.html:134 cps/templates/config_edit.html:217 #: cps/templates/login.html:20 cps/templates/search_form.html:96 -#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:145 msgid "Submit" msgstr "Wyślij" @@ -768,7 +790,7 @@ msgstr "Słowo kluczowe" msgid " Search keyword " msgstr " Szukaj słowa kluczowego " -#: cps/templates/book_edit.html:175 cps/templates/layout.html:44 +#: cps/templates/book_edit.html:175 cps/templates/layout.html:46 msgid "Go!" msgstr "Idź!" @@ -780,7 +802,7 @@ msgstr "Kliknij okładkę, aby załadować metadane do formularza" msgid "Loading..." msgstr "Ładowanie..." -#: cps/templates/book_edit.html:196 cps/templates/layout.html:216 +#: cps/templates/book_edit.html:196 cps/templates/layout.html:218 msgid "Close" msgstr "Zamknij" @@ -805,185 +827,181 @@ msgstr "Brak wyników! Spróbuj innego słowa kluczowego." msgid "Location of Calibre database" msgstr "Lokalizacja bazy danych Calibre" -#: cps/templates/config_edit.html:13 +#: cps/templates/config_edit.html:12 msgid "Use google drive?" msgstr "Użyć dysku Google?" -#: cps/templates/config_edit.html:17 -msgid "Client id" -msgstr "Client id" - -#: cps/templates/config_edit.html:21 -msgid "Client secret" -msgstr "Client secret" - -#: cps/templates/config_edit.html:25 -msgid "Calibre Base URL" -msgstr "Adres URL bazy Calibre" +#: cps/templates/config_edit.html:18 +msgid "Google drive config problem" +msgstr "" -#: cps/templates/config_edit.html:29 +#: cps/templates/config_edit.html:28 msgid "Google drive Calibre folder" msgstr "Folder biblioteki Calibre na Dysku Google" -#: cps/templates/config_edit.html:38 +#: cps/templates/config_edit.html:36 #, fuzzy msgid "Metadata Watch Channel ID" msgstr "Metadane Watch Channel ID" -#: cps/templates/config_edit.html:52 +#: cps/templates/config_edit.html:39 +msgid "Revoke" +msgstr "" + +#: cps/templates/config_edit.html:48 msgid "Server Port" msgstr "Port serwera" -#: cps/templates/config_edit.html:56 +#: cps/templates/config_edit.html:52 msgid "SSL certfile location (leave it empty for non-SSL Servers)" msgstr "" -#: cps/templates/config_edit.html:60 +#: cps/templates/config_edit.html:56 msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "" -#: cps/templates/config_edit.html:64 cps/templates/layout.html:128 -#: cps/templates/layout.html:129 cps/templates/shelf_edit.html:7 +#: cps/templates/config_edit.html:60 cps/templates/layout.html:130 +#: cps/templates/layout.html:131 cps/templates/shelf_edit.html:7 msgid "Title" msgstr "Tytuł" -#: cps/templates/config_edit.html:72 +#: cps/templates/config_edit.html:68 msgid "No. of random books to show" msgstr "Liczba losowych książek do pokazania" -#: cps/templates/config_edit.html:76 +#: cps/templates/config_edit.html:72 msgid "Regular expression for ignoring columns" msgstr "Wyrażenie regularne dla ignorowanych kolumn" -#: cps/templates/config_edit.html:80 +#: cps/templates/config_edit.html:76 msgid "Regular expression for title sorting" msgstr "Wyrażenie regularne dla tytułu sortującego" -#: cps/templates/config_edit.html:84 +#: cps/templates/config_edit.html:80 msgid "Tags for Mature Content" msgstr "" -#: cps/templates/config_edit.html:100 +#: cps/templates/config_edit.html:96 msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "" -#: cps/templates/config_edit.html:106 +#: cps/templates/config_edit.html:102 msgid "Enable uploading" msgstr "Włącz wysyłanie" -#: cps/templates/config_edit.html:110 +#: cps/templates/config_edit.html:106 msgid "Enable anonymous browsing" msgstr "Włącz anonimowe przeglądanie" -#: cps/templates/config_edit.html:114 +#: cps/templates/config_edit.html:110 msgid "Enable public registration" msgstr "Włącz publiczną rejestrację" -#: cps/templates/config_edit.html:118 +#: cps/templates/config_edit.html:114 msgid "Enable remote login (\"magic link\")" msgstr "" -#: cps/templates/config_edit.html:123 +#: cps/templates/config_edit.html:119 msgid "Use" msgstr "" -#: cps/templates/config_edit.html:124 +#: cps/templates/config_edit.html:120 msgid "Obtain an API Key" msgstr "" -#: cps/templates/config_edit.html:128 +#: cps/templates/config_edit.html:124 msgid "Goodreads API Key" msgstr "" -#: cps/templates/config_edit.html:132 +#: cps/templates/config_edit.html:128 msgid "Goodreads API Secret" msgstr "" -#: cps/templates/config_edit.html:137 +#: cps/templates/config_edit.html:133 msgid "Default Settings for new users" msgstr "Domyślne ustawienia dla nowych użytkowników" -#: cps/templates/config_edit.html:140 cps/templates/user_edit.html:94 +#: cps/templates/config_edit.html:136 cps/templates/user_edit.html:102 msgid "Admin user" msgstr "Użytkownik z uprawnieniami administratora" -#: cps/templates/config_edit.html:144 cps/templates/user_edit.html:103 +#: cps/templates/config_edit.html:140 cps/templates/user_edit.html:111 msgid "Allow Downloads" msgstr "Zezwalaj na pobieranie" -#: cps/templates/config_edit.html:148 cps/templates/user_edit.html:107 +#: cps/templates/config_edit.html:144 cps/templates/user_edit.html:115 msgid "Allow Uploads" msgstr "Zezwalaj na wysyłanie" -#: cps/templates/config_edit.html:152 cps/templates/user_edit.html:111 +#: cps/templates/config_edit.html:148 cps/templates/user_edit.html:119 msgid "Allow Edit" msgstr "Zezwalaj na edycję" -#: cps/templates/config_edit.html:156 cps/templates/user_edit.html:115 +#: cps/templates/config_edit.html:152 cps/templates/user_edit.html:123 msgid "Allow Delete books" msgstr "" -#: cps/templates/config_edit.html:160 cps/templates/user_edit.html:120 +#: cps/templates/config_edit.html:156 cps/templates/user_edit.html:128 msgid "Allow Changing Password" msgstr "Zezwalaj na zmianę hasła" -#: cps/templates/config_edit.html:164 cps/templates/user_edit.html:124 +#: cps/templates/config_edit.html:160 cps/templates/user_edit.html:132 msgid "Allow Editing Public Shelfs" msgstr "" -#: cps/templates/config_edit.html:168 +#: cps/templates/config_edit.html:164 msgid "Default visiblities for new users" msgstr "" -#: cps/templates/config_edit.html:172 cps/templates/user_edit.html:46 +#: cps/templates/config_edit.html:168 cps/templates/user_edit.html:54 msgid "Show random books" msgstr "Pokaż losowe książki" -#: cps/templates/config_edit.html:176 cps/templates/user_edit.html:50 +#: cps/templates/config_edit.html:172 cps/templates/user_edit.html:58 msgid "Show recent books" msgstr "" -#: cps/templates/config_edit.html:180 cps/templates/user_edit.html:54 +#: cps/templates/config_edit.html:176 cps/templates/user_edit.html:62 msgid "Show sorted books" msgstr "" -#: cps/templates/config_edit.html:184 cps/templates/user_edit.html:58 +#: cps/templates/config_edit.html:180 cps/templates/user_edit.html:66 msgid "Show hot books" msgstr "Pokaż najpopularniejsze książki" -#: cps/templates/config_edit.html:188 cps/templates/user_edit.html:62 +#: cps/templates/config_edit.html:184 cps/templates/user_edit.html:70 msgid "Show best rated books" msgstr "Pokaż najlepiej ocenione książki" -#: cps/templates/config_edit.html:192 cps/templates/user_edit.html:66 +#: cps/templates/config_edit.html:188 cps/templates/user_edit.html:74 msgid "Show language selection" msgstr "Pokaż wybór języka" -#: cps/templates/config_edit.html:196 cps/templates/user_edit.html:70 +#: cps/templates/config_edit.html:192 cps/templates/user_edit.html:78 msgid "Show series selection" msgstr "Pokaż wybór serii" -#: cps/templates/config_edit.html:200 cps/templates/user_edit.html:74 +#: cps/templates/config_edit.html:196 cps/templates/user_edit.html:82 msgid "Show category selection" msgstr "Pokaż wybór kategorii" -#: cps/templates/config_edit.html:204 cps/templates/user_edit.html:78 +#: cps/templates/config_edit.html:200 cps/templates/user_edit.html:86 msgid "Show author selection" msgstr "Pokaż wybór autora" -#: cps/templates/config_edit.html:208 cps/templates/user_edit.html:82 +#: cps/templates/config_edit.html:204 cps/templates/user_edit.html:90 msgid "Show read and unread" msgstr "Pokaż przeczytane i nieprzeczytane" -#: cps/templates/config_edit.html:212 cps/templates/user_edit.html:86 +#: cps/templates/config_edit.html:208 cps/templates/user_edit.html:94 msgid "Show random books in detail view" msgstr "Pokaz losowe książki w widoku szczegółowym" -#: cps/templates/config_edit.html:216 cps/templates/user_edit.html:99 +#: cps/templates/config_edit.html:212 cps/templates/user_edit.html:107 msgid "Show mature content" msgstr "" -#: cps/templates/config_edit.html:226 cps/templates/layout.html:77 +#: cps/templates/config_edit.html:222 cps/templates/layout.html:79 #: cps/templates/login.html:4 msgid "Login" msgstr "Zaloguj się" @@ -1054,12 +1072,12 @@ msgstr "Zapisz ustawienia" msgid "Save settings and send Test E-Mail" msgstr "Zapisz ustawienia i wyślij testową wiadomość e-mail" -#: cps/templates/feed.xml:20 cps/templates/layout.html:200 +#: cps/templates/feed.xml:20 cps/templates/layout.html:202 msgid "Next" msgstr "Następne" #: cps/templates/feed.xml:29 cps/templates/index.xml:7 -#: cps/templates/layout.html:41 cps/templates/layout.html:42 +#: cps/templates/layout.html:43 cps/templates/layout.html:44 msgid "Search" msgstr "Szukaj" @@ -1071,7 +1089,7 @@ msgstr "Odkrywaj (losowe książki)" msgid "Start" msgstr "Rozpocznij" -#: cps/templates/index.xml:14 cps/templates/layout.html:134 +#: cps/templates/index.xml:14 cps/templates/layout.html:136 msgid "Hot Books" msgstr "Najpopularniejsze książki" @@ -1079,7 +1097,7 @@ msgstr "Najpopularniejsze książki" msgid "Popular publications from this catalog based on Downloads." msgstr "Popularne publikacje z tego katalogu bazujące na pobranych." -#: cps/templates/index.xml:20 cps/templates/layout.html:137 +#: cps/templates/index.xml:20 cps/templates/layout.html:139 msgid "Best rated Books" msgstr "Najlepiej ocenione książki" @@ -1099,7 +1117,7 @@ msgstr "Ostatnie książki" msgid "Show Random Books" msgstr "Pokazuj losowe książki" -#: cps/templates/index.xml:52 cps/templates/layout.html:155 +#: cps/templates/index.xml:52 cps/templates/layout.html:157 msgid "Authors" msgstr "Autorzy" @@ -1115,7 +1133,7 @@ msgstr "Książki sortowane według kategorii" msgid "Books ordered by series" msgstr "Książki sortowane według serii" -#: cps/templates/index.xml:70 cps/templates/layout.html:161 +#: cps/templates/index.xml:70 cps/templates/layout.html:163 msgid "Public Shelves" msgstr "Publiczne półki" @@ -1123,7 +1141,7 @@ msgstr "Publiczne półki" msgid "Books organized in public shelfs, visible to everyone" msgstr "" -#: cps/templates/index.xml:77 cps/templates/layout.html:165 +#: cps/templates/index.xml:77 cps/templates/layout.html:167 msgid "Your Shelves" msgstr "Twoje półki" @@ -1131,88 +1149,88 @@ msgstr "Twoje półki" msgid "User's own shelfs, only visible to the current user himself" msgstr "" -#: cps/templates/layout.html:31 +#: cps/templates/layout.html:33 msgid "Toggle navigation" msgstr "Przełącz nawigację" -#: cps/templates/layout.html:52 +#: cps/templates/layout.html:54 msgid "Advanced Search" msgstr "Zaawansowane wyszukiwanie" -#: cps/templates/layout.html:73 +#: cps/templates/layout.html:75 msgid "Logout" msgstr "Wyloguj się" -#: cps/templates/layout.html:78 cps/templates/register.html:18 +#: cps/templates/layout.html:80 cps/templates/register.html:18 msgid "Register" msgstr "Zarejestruj się" -#: cps/templates/layout.html:103 +#: cps/templates/layout.html:105 msgid "Uploading..." msgstr "" -#: cps/templates/layout.html:104 +#: cps/templates/layout.html:106 msgid "please don't refresh the page" msgstr "" -#: cps/templates/layout.html:115 +#: cps/templates/layout.html:117 msgid "Browse" msgstr "Przeglądaj" -#: cps/templates/layout.html:117 +#: cps/templates/layout.html:119 msgid "Recently Added" msgstr "" -#: cps/templates/layout.html:122 +#: cps/templates/layout.html:124 msgid "Sorted Books" msgstr "" -#: cps/templates/layout.html:126 cps/templates/layout.html:127 #: cps/templates/layout.html:128 cps/templates/layout.html:129 +#: cps/templates/layout.html:130 cps/templates/layout.html:131 msgid "Sort By" msgstr "" -#: cps/templates/layout.html:126 +#: cps/templates/layout.html:128 msgid "Newest" msgstr "" -#: cps/templates/layout.html:127 +#: cps/templates/layout.html:129 msgid "Oldest" msgstr "" -#: cps/templates/layout.html:128 +#: cps/templates/layout.html:130 msgid "Ascending" msgstr "" -#: cps/templates/layout.html:129 +#: cps/templates/layout.html:131 msgid "Descending" msgstr "" -#: cps/templates/layout.html:146 +#: cps/templates/layout.html:148 msgid "Discover" msgstr "Odkrywaj" -#: cps/templates/layout.html:149 +#: cps/templates/layout.html:151 msgid "Categories" msgstr "Kategorie" -#: cps/templates/layout.html:158 cps/templates/search_form.html:75 +#: cps/templates/layout.html:160 cps/templates/search_form.html:75 msgid "Languages" msgstr "Języki" -#: cps/templates/layout.html:170 +#: cps/templates/layout.html:172 msgid "Create a Shelf" msgstr "Utwórz półkę" -#: cps/templates/layout.html:171 cps/templates/stats.html:3 +#: cps/templates/layout.html:173 cps/templates/stats.html:3 msgid "About" msgstr "O programie" -#: cps/templates/layout.html:185 +#: cps/templates/layout.html:187 msgid "Previous" msgstr "" -#: cps/templates/layout.html:212 +#: cps/templates/layout.html:214 msgid "Book Details" msgstr "" @@ -1384,18 +1402,30 @@ msgid "Kindle E-Mail" msgstr "Adres e-mail Kindle" #: cps/templates/user_edit.html:35 +msgid "Theme" +msgstr "" + +#: cps/templates/user_edit.html:37 +msgid "Standard Theme" +msgstr "" + +#: cps/templates/user_edit.html:38 +msgid "caliBlur! Dark Theme (Beta)" +msgstr "" + +#: cps/templates/user_edit.html:43 msgid "Show books with language" msgstr "Pokaż książki w języku" -#: cps/templates/user_edit.html:37 +#: cps/templates/user_edit.html:45 msgid "Show all" msgstr "Pokaż wszystko" -#: cps/templates/user_edit.html:131 +#: cps/templates/user_edit.html:139 msgid "Delete this user" msgstr "Usuń tego użytkownika" -#: cps/templates/user_edit.html:146 +#: cps/templates/user_edit.html:154 msgid "Recent Downloads" msgstr "Ostatnio pobierane" diff --git a/cps/translations/ru/LC_MESSAGES/messages.po b/cps/translations/ru/LC_MESSAGES/messages.po index 0e1c4ca3..56b2988f 100644 --- a/cps/translations/ru/LC_MESSAGES/messages.po +++ b/cps/translations/ru/LC_MESSAGES/messages.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n" -"POT-Creation-Date: 2018-04-01 19:27+0200\n" +"POT-Creation-Date: 2018-06-02 10:45+0200\n" "PO-Revision-Date: 2017-04-30 00:47+0300\n" "Last-Translator: Pavel Korovin \n" "Language: ru\n" @@ -30,57 +30,57 @@ msgstr "" msgid "not installed" msgstr "Отсутствует" -#: cps/helper.py:78 +#: cps/helper.py:79 #, python-format msgid "kindlegen binary %(kindlepath)s not found" msgstr "" -#: cps/helper.py:84 +#: cps/helper.py:85 #, python-format msgid "epub format not found for book id: %(book)d" msgstr "" -#: cps/helper.py:94 +#: cps/helper.py:95 msgid "kindlegen failed, no execution permissions" msgstr "" -#: cps/helper.py:109 +#: cps/helper.py:110 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "" -#: cps/helper.py:188 +#: cps/helper.py:189 #, python-format msgid "Failed to send mail: %s" msgstr "Ошибка отправки письма: %s" -#: cps/helper.py:195 +#: cps/helper.py:196 msgid "Calibre-web test email" msgstr "Тестовое письмо от Calibre-web" -#: cps/helper.py:196 cps/helper.py:208 +#: cps/helper.py:197 cps/helper.py:209 msgid "This email has been sent via calibre web." msgstr "Письмо было отправлено через calibre web" -#: cps/helper.py:205 cps/templates/detail.html:44 +#: cps/helper.py:206 cps/templates/detail.html:44 msgid "Send to Kindle" msgstr "Отправить на Kindle" -#: cps/helper.py:225 cps/helper.py:239 +#: cps/helper.py:226 cps/helper.py:240 msgid "Could not find any formats suitable for sending by email" msgstr "Невозоможно найти формат, подходящий для отправки по email" -#: cps/helper.py:340 +#: cps/helper.py:341 #, python-format msgid "Rename title from: \"%s\" to \"%s\" failed with error: %s" msgstr "" -#: cps/helper.py:349 +#: cps/helper.py:350 #, python-format msgid "Rename author from: \"%s\" to \"%s\" failed with error: %s" msgstr "" -#: cps/ub.py:684 +#: cps/ub.py:694 msgid "Guest" msgstr "Гость" @@ -148,7 +148,7 @@ msgstr "Случайный выбор" msgid "Author list" msgstr "Авторы" -#: cps/web.py:1220 cps/web.py:1278 cps/web.py:1408 cps/web.py:1903 +#: cps/web.py:1220 cps/web.py:1278 cps/web.py:1408 cps/web.py:1917 msgid "Error opening eBook. File does not exist or file is not accessible:" msgstr "Невозможно открыть книгу. Файл не существует или недоступен." @@ -187,306 +187,328 @@ msgstr "" msgid "Statistics" msgstr "Статистика" -#: cps/web.py:1641 +#: cps/web.py:1573 +msgid "" +"Callback domain is not verified, please follow steps to verify domain in " +"google developer console" +msgstr "" + +#: cps/web.py:1651 msgid "Server restarted, please reload page" msgstr "Сервер перезагружен, пожалуйста, перезагрузите страницу" -#: cps/web.py:1643 +#: cps/web.py:1653 msgid "Performing shutdown of server, please close window" msgstr "Производится остановка сервера, пожалуйста, закройте окно" -#: cps/web.py:1659 +#: cps/web.py:1669 msgid "Update done" msgstr "Обновление закончено" -#: cps/web.py:1716 +#: cps/web.py:1726 #, python-format msgid "Published after %s" msgstr "" -#: cps/web.py:1721 +#: cps/web.py:1731 msgid "Published before " msgstr "" -#: cps/web.py:1767 cps/web.py:1780 +#: cps/web.py:1777 cps/web.py:1790 msgid "search" msgstr "поиск" +#: cps/web.py:1816 +msgid "not found on GDrive" +msgstr "" + #: cps/templates/index.xml:39 cps/templates/index.xml:42 -#: cps/templates/layout.html:141 cps/web.py:1858 +#: cps/templates/layout.html:143 cps/web.py:1872 msgid "Read Books" msgstr "Прочитанные" #: cps/templates/index.xml:46 cps/templates/index.xml:49 -#: cps/templates/layout.html:143 cps/web.py:1861 +#: cps/templates/layout.html:145 cps/web.py:1875 msgid "Unread Books" msgstr "Непрочитанные" -#: cps/web.py:1936 cps/web.py:1938 cps/web.py:1940 cps/web.py:1949 +#: cps/web.py:1950 cps/web.py:1952 cps/web.py:1954 cps/web.py:1963 msgid "Read a Book" msgstr "Читать книгу" -#: cps/web.py:2001 cps/web.py:2718 +#: cps/web.py:2015 cps/web.py:2751 msgid "Please fill out all fields!" msgstr "Пожалуйста, заполните все поля!" -#: cps/web.py:2002 cps/web.py:2019 cps/web.py:2024 cps/web.py:2026 +#: cps/web.py:2016 cps/web.py:2033 cps/web.py:2038 cps/web.py:2040 msgid "register" msgstr "зарегистрироваться" -#: cps/web.py:2018 +#: cps/web.py:2032 msgid "An unknown error occured. Please try again later." msgstr "Неизвестная ошибка. Пожалуйста, попробуйте позже." -#: cps/web.py:2023 +#: cps/web.py:2037 msgid "This username or email address is already in use." msgstr "Имя пользователя или адрес эл. почты уже используется" -#: cps/web.py:2042 cps/web.py:2138 +#: cps/web.py:2056 cps/web.py:2152 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "Вы вошли как пользователь '%(nickname)s'" -#: cps/web.py:2047 +#: cps/web.py:2061 msgid "Wrong Username or Password" msgstr "Ошибка в имени пользователя или пароле" -#: cps/web.py:2053 cps/web.py:2074 +#: cps/web.py:2067 cps/web.py:2088 msgid "login" msgstr "войти" -#: cps/web.py:2086 cps/web.py:2117 +#: cps/web.py:2100 cps/web.py:2131 msgid "Token not found" msgstr "" -#: cps/web.py:2094 cps/web.py:2125 +#: cps/web.py:2108 cps/web.py:2139 msgid "Token has expired" msgstr "" -#: cps/web.py:2102 +#: cps/web.py:2116 msgid "Success! Please return to your device" msgstr "" -#: cps/web.py:2152 +#: cps/web.py:2166 msgid "Please configure the SMTP mail settings first..." msgstr "Пожалуйста, сначала сконфигурируйте параметры SMTP" -#: cps/web.py:2156 +#: cps/web.py:2170 #, python-format msgid "Book successfully send to %(kindlemail)s" msgstr "Книга успешно отправлена на %(kindlemail)s" -#: cps/web.py:2160 +#: cps/web.py:2174 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "Ошибка при отправке книги: %(res)s" -#: cps/web.py:2162 cps/web.py:2805 +#: cps/web.py:2176 cps/web.py:2839 msgid "Please configure your kindle email address first..." msgstr "Пожалуйста, сначала укажите ваш kindle email..." -#: cps/web.py:2206 +#: cps/web.py:2220 #, python-format msgid "Book has been added to shelf: %(sname)s" msgstr "Книга добавлена на книжную полку: %(sname)s" -#: cps/web.py:2244 +#: cps/web.py:2258 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "Книга удалена с книжной полки: %(sname)s" -#: cps/web.py:2250 +#: cps/web.py:2264 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "" -#: cps/web.py:2270 cps/web.py:2294 +#: cps/web.py:2284 cps/web.py:2308 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "Книжкная полка с названием '%(title)s' уже существует." -#: cps/web.py:2275 +#: cps/web.py:2289 #, python-format msgid "Shelf %(title)s created" msgstr "Создана книжная полка %(title)s" -#: cps/web.py:2277 cps/web.py:2305 +#: cps/web.py:2291 cps/web.py:2319 msgid "There was an error" msgstr "Произошла ошибка" -#: cps/web.py:2278 cps/web.py:2280 +#: cps/web.py:2292 cps/web.py:2294 msgid "create a shelf" msgstr "создать книжную полку" -#: cps/web.py:2303 +#: cps/web.py:2317 #, python-format msgid "Shelf %(title)s changed" msgstr "Книжная полка %(title)s изменена" -#: cps/web.py:2306 cps/web.py:2308 +#: cps/web.py:2320 cps/web.py:2322 msgid "Edit a shelf" msgstr "Изменить книжную полку" -#: cps/web.py:2329 +#: cps/web.py:2343 #, python-format msgid "successfully deleted shelf %(name)s" msgstr "Книжная полка %(name)s удалена" -#: cps/web.py:2351 +#: cps/web.py:2365 #, python-format msgid "Shelf: '%(name)s'" msgstr "Книжная полка: '%(name)s'" -#: cps/web.py:2354 +#: cps/web.py:2368 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "" -#: cps/web.py:2385 +#: cps/web.py:2399 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Изменить расположение книжной полки '%(name)s'" -#: cps/web.py:2454 +#: cps/web.py:2469 msgid "Found an existing account for this email address." msgstr "Найдена учётная запись для для данного адреса email." -#: cps/web.py:2456 cps/web.py:2460 +#: cps/web.py:2471 cps/web.py:2475 #, python-format msgid "%(name)s's profile" msgstr "Профиль %(name)s" -#: cps/web.py:2457 +#: cps/web.py:2472 msgid "Profile updated" msgstr "Профиль обновлён" -#: cps/web.py:2469 +#: cps/web.py:2484 msgid "Unknown" msgstr "" -#: cps/web.py:2482 +#: cps/web.py:2497 msgid "Admin page" msgstr "Администрирование" -#: cps/web.py:2553 -msgid "Keyfile location is not valid, please enter correct path" +#: cps/web.py:2520 +msgid "Import of optional GDrive requirements missing" msgstr "" -#: cps/web.py:2556 cps/web.py:2567 cps/web.py:2660 cps/web.py:2679 -#: cps/web.py:2685 cps/web.py:2699 +#: cps/web.py:2523 +msgid "client_secret.json is missing or not readable" +msgstr "" + +#: cps/web.py:2528 cps/web.py:2553 +msgid "client_secret.json is not configured for web application" +msgstr "" + +#: cps/web.py:2556 cps/web.py:2582 cps/web.py:2593 cps/web.py:2686 +#: cps/web.py:2706 cps/web.py:2713 cps/web.py:2732 msgid "Basic Configuration" msgstr "Настройки сервера" -#: cps/web.py:2564 +#: cps/web.py:2579 +msgid "Keyfile location is not valid, please enter correct path" +msgstr "" + +#: cps/web.py:2590 msgid "Certfile location is not valid, please enter correct path" msgstr "" -#: cps/web.py:2657 +#: cps/web.py:2683 msgid "Logfile location is not valid, please enter correct path" msgstr "" -#: cps/web.py:2672 +#: cps/web.py:2698 msgid "Calibre-web configuration updated" msgstr "Конфигурация Calibre-web обновлена" -#: cps/web.py:2683 +#: cps/web.py:2710 msgid "DB location is not valid, please enter correct path" msgstr "Неверный путь к фалу БД, пожалуйста, укажите правильное расположение БД" -#: cps/templates/admin.html:34 cps/web.py:2720 cps/web.py:2775 +#: cps/templates/admin.html:34 cps/web.py:2753 cps/web.py:2809 msgid "Add new user" msgstr "Добавить пользователя" -#: cps/web.py:2765 +#: cps/web.py:2799 #, python-format msgid "User '%(user)s' created" msgstr "Пользователь '%(user)s' добавлен" -#: cps/web.py:2769 +#: cps/web.py:2803 msgid "Found an existing account for this email address or nickname." msgstr "Для указанного адреса или имени найдена существующая учётная запись." -#: cps/web.py:2793 +#: cps/web.py:2827 msgid "Mail settings updated" msgstr "Настройки почты изменены" -#: cps/web.py:2800 +#: cps/web.py:2834 #, python-format msgid "Test E-Mail successfully send to %(kindlemail)s" msgstr "Тестовое сообщение успешно отправлено на адрес %(kindlemail)s" -#: cps/web.py:2803 +#: cps/web.py:2837 #, python-format msgid "There was an error sending the Test E-Mail: %(res)s" msgstr "Ошибка отправки тестового сообщения: %(res)s" -#: cps/web.py:2807 +#: cps/web.py:2841 msgid "E-Mail settings updated" msgstr "Обновлены настройки e-mail" -#: cps/web.py:2808 +#: cps/web.py:2842 msgid "Edit mail settings" msgstr "Изменить почтовые настройки" -#: cps/web.py:2837 +#: cps/web.py:2871 #, python-format msgid "User '%(nick)s' deleted" msgstr "Пользователь '%(nick)s' удалён" -#: cps/web.py:2945 +#: cps/web.py:2980 #, python-format msgid "User '%(nick)s' updated" msgstr "Пользователь '%(nick)s' обновлён" -#: cps/web.py:2948 +#: cps/web.py:2983 msgid "An unknown error occured." msgstr "Произошла неизвестная ошибка." -#: cps/web.py:2951 +#: cps/web.py:2986 #, python-format msgid "Edit User %(nick)s" msgstr "Изменить пользователя %(nick)s" -#: cps/web.py:2967 +#: cps/web.py:3002 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "" -#: cps/web.py:2982 cps/web.py:3193 cps/web.py:3198 cps/web.py:3344 +#: cps/web.py:3017 cps/web.py:3228 cps/web.py:3233 cps/web.py:3379 msgid "edit metadata" msgstr "изменить метаданные" -#: cps/web.py:2992 cps/web.py:3238 +#: cps/web.py:3027 cps/web.py:3273 #, python-format msgid "File extension \"%s\" is not allowed to be uploaded to this server" msgstr "Запрещена загрузка файлов с расширением \"%s\"" -#: cps/web.py:3003 +#: cps/web.py:3038 #, python-format msgid "Failed to store file %s." msgstr "" -#: cps/web.py:3025 cps/web.py:3029 +#: cps/web.py:3060 cps/web.py:3064 msgid "unknown" msgstr "неизвестно" -#: cps/web.py:3052 +#: cps/web.py:3087 msgid "Cover is not a jpg file, can't save" msgstr "" -#: cps/web.py:3244 +#: cps/web.py:3279 msgid "File to be uploaded must have an extension" msgstr "Загружаемый файл должен иметь расширение" -#: cps/web.py:3263 +#: cps/web.py:3298 #, python-format msgid "Failed to create path %s (Permission denied)." msgstr "Ошибка при создании пути %s (доступ запрещён)" -#: cps/web.py:3268 +#: cps/web.py:3303 #, python-format msgid "Failed to store file %s (Permission denied)." msgstr "Ошибка записи файоа %s (доступ запрещён)" -#: cps/web.py:3273 +#: cps/web.py:3308 #, python-format msgid "Failed to delete file %s (Permission denied)." msgstr "Ошибка удаления файла %s (доступ запрещён)" @@ -511,7 +533,7 @@ msgstr "Kindle" msgid "DLS" msgstr "DLS" -#: cps/templates/admin.html:12 cps/templates/layout.html:69 +#: cps/templates/admin.html:12 cps/templates/layout.html:71 msgid "Admin" msgstr "Управление" @@ -520,7 +542,7 @@ msgstr "Управление" msgid "Download" msgstr "Скачать" -#: cps/templates/admin.html:14 cps/templates/layout.html:62 +#: cps/templates/admin.html:14 cps/templates/layout.html:64 msgid "Upload" msgstr "Загрузить" @@ -572,7 +594,7 @@ msgstr "Настройки сервера" msgid "Calibre DB dir" msgstr "Папка Calibre DB" -#: cps/templates/admin.html:61 cps/templates/config_edit.html:91 +#: cps/templates/admin.html:61 cps/templates/config_edit.html:87 msgid "Log Level" msgstr "Уровень логирования" @@ -580,7 +602,7 @@ msgstr "Уровень логирования" msgid "Port" msgstr "Порт" -#: cps/templates/admin.html:63 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:63 cps/templates/config_edit.html:64 msgid "Books per page" msgstr "Количество книг на странице" @@ -643,9 +665,9 @@ msgstr "Ok" #: cps/templates/admin.html:105 cps/templates/admin.html:119 #: cps/templates/book_edit.html:135 cps/templates/book_edit.html:157 -#: cps/templates/config_edit.html:223 cps/templates/email_edit.html:36 +#: cps/templates/config_edit.html:219 cps/templates/email_edit.html:36 #: cps/templates/shelf.html:60 cps/templates/shelf_edit.html:19 -#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:139 +#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:147 msgid "Back" msgstr "Назад" @@ -691,7 +713,7 @@ msgstr "Описание" msgid "Tags" msgstr "Теги" -#: cps/templates/book_edit.html:39 cps/templates/layout.html:152 +#: cps/templates/book_edit.html:39 cps/templates/layout.html:154 #: cps/templates/search_form.html:54 msgid "Series" msgstr "Серии" @@ -738,9 +760,9 @@ msgstr "смотреть книгу после редактирования" msgid "Get metadata" msgstr "Получить метаданные" -#: cps/templates/book_edit.html:134 cps/templates/config_edit.html:221 +#: cps/templates/book_edit.html:134 cps/templates/config_edit.html:217 #: cps/templates/login.html:20 cps/templates/search_form.html:96 -#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:145 msgid "Submit" msgstr "Отправить" @@ -768,7 +790,7 @@ msgstr "Ключевое слово" msgid " Search keyword " msgstr " Поиск по ключевому слову" -#: cps/templates/book_edit.html:175 cps/templates/layout.html:44 +#: cps/templates/book_edit.html:175 cps/templates/layout.html:46 msgid "Go!" msgstr "Искать" @@ -780,7 +802,7 @@ msgstr "Нажмите на обложку, чтобы получить мета msgid "Loading..." msgstr "Загрузка..." -#: cps/templates/book_edit.html:196 cps/templates/layout.html:216 +#: cps/templates/book_edit.html:196 cps/templates/layout.html:218 msgid "Close" msgstr "Закрыть" @@ -805,184 +827,180 @@ msgstr "Нет результатов. Пожалуйста, попробуйт msgid "Location of Calibre database" msgstr "Расположение БД Calibre" -#: cps/templates/config_edit.html:13 +#: cps/templates/config_edit.html:12 msgid "Use google drive?" msgstr "Использовать Google Drive?" -#: cps/templates/config_edit.html:17 -msgid "Client id" -msgstr "" - -#: cps/templates/config_edit.html:21 -msgid "Client secret" +#: cps/templates/config_edit.html:18 +msgid "Google drive config problem" msgstr "" -#: cps/templates/config_edit.html:25 -msgid "Calibre Base URL" -msgstr "URL БД Calibre" - -#: cps/templates/config_edit.html:29 +#: cps/templates/config_edit.html:28 msgid "Google drive Calibre folder" msgstr "Папка Calibre на Google drive" -#: cps/templates/config_edit.html:38 +#: cps/templates/config_edit.html:36 msgid "Metadata Watch Channel ID" msgstr "Metadata Watch Channel ID" -#: cps/templates/config_edit.html:52 +#: cps/templates/config_edit.html:39 +msgid "Revoke" +msgstr "" + +#: cps/templates/config_edit.html:48 msgid "Server Port" msgstr "Порт сервера" -#: cps/templates/config_edit.html:56 +#: cps/templates/config_edit.html:52 msgid "SSL certfile location (leave it empty for non-SSL Servers)" msgstr "" -#: cps/templates/config_edit.html:60 +#: cps/templates/config_edit.html:56 msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "" -#: cps/templates/config_edit.html:64 cps/templates/layout.html:128 -#: cps/templates/layout.html:129 cps/templates/shelf_edit.html:7 +#: cps/templates/config_edit.html:60 cps/templates/layout.html:130 +#: cps/templates/layout.html:131 cps/templates/shelf_edit.html:7 msgid "Title" msgstr "Заголовок" -#: cps/templates/config_edit.html:72 +#: cps/templates/config_edit.html:68 msgid "No. of random books to show" msgstr "Количество отображаемых случайных книг" -#: cps/templates/config_edit.html:76 +#: cps/templates/config_edit.html:72 msgid "Regular expression for ignoring columns" msgstr "Regexp для игнорирования столбцов" -#: cps/templates/config_edit.html:80 +#: cps/templates/config_edit.html:76 msgid "Regular expression for title sorting" msgstr "Regexp для сортировки по названию" -#: cps/templates/config_edit.html:84 +#: cps/templates/config_edit.html:80 msgid "Tags for Mature Content" msgstr "" -#: cps/templates/config_edit.html:100 +#: cps/templates/config_edit.html:96 msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "" -#: cps/templates/config_edit.html:106 +#: cps/templates/config_edit.html:102 msgid "Enable uploading" msgstr "Разрешить загрузку на сервер" -#: cps/templates/config_edit.html:110 +#: cps/templates/config_edit.html:106 msgid "Enable anonymous browsing" msgstr "Разрешить анонимный просмотр" -#: cps/templates/config_edit.html:114 +#: cps/templates/config_edit.html:110 msgid "Enable public registration" msgstr "Разрешить публичную регистрацию" -#: cps/templates/config_edit.html:118 +#: cps/templates/config_edit.html:114 msgid "Enable remote login (\"magic link\")" msgstr "" -#: cps/templates/config_edit.html:123 +#: cps/templates/config_edit.html:119 msgid "Use" msgstr "" -#: cps/templates/config_edit.html:124 +#: cps/templates/config_edit.html:120 msgid "Obtain an API Key" msgstr "" -#: cps/templates/config_edit.html:128 +#: cps/templates/config_edit.html:124 msgid "Goodreads API Key" msgstr "" -#: cps/templates/config_edit.html:132 +#: cps/templates/config_edit.html:128 msgid "Goodreads API Secret" msgstr "" -#: cps/templates/config_edit.html:137 +#: cps/templates/config_edit.html:133 msgid "Default Settings for new users" msgstr "Настройки по умолчанию для новых пользователей" -#: cps/templates/config_edit.html:140 cps/templates/user_edit.html:94 +#: cps/templates/config_edit.html:136 cps/templates/user_edit.html:102 msgid "Admin user" msgstr "Управление сервером" -#: cps/templates/config_edit.html:144 cps/templates/user_edit.html:103 +#: cps/templates/config_edit.html:140 cps/templates/user_edit.html:111 msgid "Allow Downloads" msgstr "Разрешить скачивание с сервера" -#: cps/templates/config_edit.html:148 cps/templates/user_edit.html:107 +#: cps/templates/config_edit.html:144 cps/templates/user_edit.html:115 msgid "Allow Uploads" msgstr "Разрешить загрузку на сервер" -#: cps/templates/config_edit.html:152 cps/templates/user_edit.html:111 +#: cps/templates/config_edit.html:148 cps/templates/user_edit.html:119 msgid "Allow Edit" msgstr "Разрешить редактирование книг" -#: cps/templates/config_edit.html:156 cps/templates/user_edit.html:115 +#: cps/templates/config_edit.html:152 cps/templates/user_edit.html:123 msgid "Allow Delete books" msgstr "Разрешить удаление книг" -#: cps/templates/config_edit.html:160 cps/templates/user_edit.html:120 +#: cps/templates/config_edit.html:156 cps/templates/user_edit.html:128 msgid "Allow Changing Password" msgstr "Разрешить смену пароля" -#: cps/templates/config_edit.html:164 cps/templates/user_edit.html:124 +#: cps/templates/config_edit.html:160 cps/templates/user_edit.html:132 msgid "Allow Editing Public Shelfs" msgstr "Разрешить редактирование публичных книжных полок" -#: cps/templates/config_edit.html:168 +#: cps/templates/config_edit.html:164 msgid "Default visiblities for new users" msgstr "" -#: cps/templates/config_edit.html:172 cps/templates/user_edit.html:46 +#: cps/templates/config_edit.html:168 cps/templates/user_edit.html:54 msgid "Show random books" msgstr "Показывать случайные книги" -#: cps/templates/config_edit.html:176 cps/templates/user_edit.html:50 +#: cps/templates/config_edit.html:172 cps/templates/user_edit.html:58 msgid "Show recent books" msgstr "" -#: cps/templates/config_edit.html:180 cps/templates/user_edit.html:54 +#: cps/templates/config_edit.html:176 cps/templates/user_edit.html:62 msgid "Show sorted books" msgstr "" -#: cps/templates/config_edit.html:184 cps/templates/user_edit.html:58 +#: cps/templates/config_edit.html:180 cps/templates/user_edit.html:66 msgid "Show hot books" msgstr "Показывать популярные книги" -#: cps/templates/config_edit.html:188 cps/templates/user_edit.html:62 +#: cps/templates/config_edit.html:184 cps/templates/user_edit.html:70 msgid "Show best rated books" msgstr "Показывать книги с наивысшим рейтингом" -#: cps/templates/config_edit.html:192 cps/templates/user_edit.html:66 +#: cps/templates/config_edit.html:188 cps/templates/user_edit.html:74 msgid "Show language selection" msgstr "Показывать выбор языка" -#: cps/templates/config_edit.html:196 cps/templates/user_edit.html:70 +#: cps/templates/config_edit.html:192 cps/templates/user_edit.html:78 msgid "Show series selection" msgstr "Показывать выбор серии" -#: cps/templates/config_edit.html:200 cps/templates/user_edit.html:74 +#: cps/templates/config_edit.html:196 cps/templates/user_edit.html:82 msgid "Show category selection" msgstr "Показывать выбор категории" -#: cps/templates/config_edit.html:204 cps/templates/user_edit.html:78 +#: cps/templates/config_edit.html:200 cps/templates/user_edit.html:86 msgid "Show author selection" msgstr "Показывать выбор автора" -#: cps/templates/config_edit.html:208 cps/templates/user_edit.html:82 +#: cps/templates/config_edit.html:204 cps/templates/user_edit.html:90 msgid "Show read and unread" msgstr "Показывать прочитанные и непрочитанные" -#: cps/templates/config_edit.html:212 cps/templates/user_edit.html:86 +#: cps/templates/config_edit.html:208 cps/templates/user_edit.html:94 msgid "Show random books in detail view" msgstr "Показывать случайные книги при просмотре деталей" -#: cps/templates/config_edit.html:216 cps/templates/user_edit.html:99 +#: cps/templates/config_edit.html:212 cps/templates/user_edit.html:107 msgid "Show mature content" msgstr "" -#: cps/templates/config_edit.html:226 cps/templates/layout.html:77 +#: cps/templates/config_edit.html:222 cps/templates/layout.html:79 #: cps/templates/login.html:4 msgid "Login" msgstr "Имя пользователя" @@ -1051,12 +1069,12 @@ msgstr "Сохранить настройки" msgid "Save settings and send Test E-Mail" msgstr "Сохранить настройки и отправить тестовое письмо" -#: cps/templates/feed.xml:20 cps/templates/layout.html:200 +#: cps/templates/feed.xml:20 cps/templates/layout.html:202 msgid "Next" msgstr "Дальше" #: cps/templates/feed.xml:29 cps/templates/index.xml:7 -#: cps/templates/layout.html:41 cps/templates/layout.html:42 +#: cps/templates/layout.html:43 cps/templates/layout.html:44 msgid "Search" msgstr "Поиск" @@ -1068,7 +1086,7 @@ msgstr "Обзор (случайные книги)" msgid "Start" msgstr "Старт" -#: cps/templates/index.xml:14 cps/templates/layout.html:134 +#: cps/templates/index.xml:14 cps/templates/layout.html:136 msgid "Hot Books" msgstr "Популярные книги" @@ -1076,7 +1094,7 @@ msgstr "Популярные книги" msgid "Popular publications from this catalog based on Downloads." msgstr "Популярные книги в этом каталоге, на основе количества скачиваний" -#: cps/templates/index.xml:20 cps/templates/layout.html:137 +#: cps/templates/index.xml:20 cps/templates/layout.html:139 msgid "Best rated Books" msgstr "Книги с наилучшим рейтингом" @@ -1096,7 +1114,7 @@ msgstr "Последние поступления" msgid "Show Random Books" msgstr "Показывать случайные книги" -#: cps/templates/index.xml:52 cps/templates/layout.html:155 +#: cps/templates/index.xml:52 cps/templates/layout.html:157 msgid "Authors" msgstr "Авторы" @@ -1112,7 +1130,7 @@ msgstr "Книги, отсортированные по категории" msgid "Books ordered by series" msgstr "Книги, отсортированные по серии" -#: cps/templates/index.xml:70 cps/templates/layout.html:161 +#: cps/templates/index.xml:70 cps/templates/layout.html:163 msgid "Public Shelves" msgstr "Общие книжные полки" @@ -1120,7 +1138,7 @@ msgstr "Общие книжные полки" msgid "Books organized in public shelfs, visible to everyone" msgstr "" -#: cps/templates/index.xml:77 cps/templates/layout.html:165 +#: cps/templates/index.xml:77 cps/templates/layout.html:167 msgid "Your Shelves" msgstr "Ваши книжные полки" @@ -1128,88 +1146,88 @@ msgstr "Ваши книжные полки" msgid "User's own shelfs, only visible to the current user himself" msgstr "" -#: cps/templates/layout.html:31 +#: cps/templates/layout.html:33 msgid "Toggle navigation" msgstr "Включить навигацию" -#: cps/templates/layout.html:52 +#: cps/templates/layout.html:54 msgid "Advanced Search" msgstr "Расширенный поиск" -#: cps/templates/layout.html:73 +#: cps/templates/layout.html:75 msgid "Logout" msgstr "Выход" -#: cps/templates/layout.html:78 cps/templates/register.html:18 +#: cps/templates/layout.html:80 cps/templates/register.html:18 msgid "Register" msgstr "Зарегистрироваться" -#: cps/templates/layout.html:103 +#: cps/templates/layout.html:105 msgid "Uploading..." msgstr "" -#: cps/templates/layout.html:104 +#: cps/templates/layout.html:106 msgid "please don't refresh the page" msgstr "" -#: cps/templates/layout.html:115 +#: cps/templates/layout.html:117 msgid "Browse" msgstr "Просмотр" -#: cps/templates/layout.html:117 +#: cps/templates/layout.html:119 msgid "Recently Added" msgstr "" -#: cps/templates/layout.html:122 +#: cps/templates/layout.html:124 msgid "Sorted Books" msgstr "" -#: cps/templates/layout.html:126 cps/templates/layout.html:127 #: cps/templates/layout.html:128 cps/templates/layout.html:129 +#: cps/templates/layout.html:130 cps/templates/layout.html:131 msgid "Sort By" msgstr "" -#: cps/templates/layout.html:126 +#: cps/templates/layout.html:128 msgid "Newest" msgstr "" -#: cps/templates/layout.html:127 +#: cps/templates/layout.html:129 msgid "Oldest" msgstr "" -#: cps/templates/layout.html:128 +#: cps/templates/layout.html:130 msgid "Ascending" msgstr "" -#: cps/templates/layout.html:129 +#: cps/templates/layout.html:131 msgid "Descending" msgstr "" -#: cps/templates/layout.html:146 +#: cps/templates/layout.html:148 msgid "Discover" msgstr "Обзор" -#: cps/templates/layout.html:149 +#: cps/templates/layout.html:151 msgid "Categories" msgstr "Категории" -#: cps/templates/layout.html:158 cps/templates/search_form.html:75 +#: cps/templates/layout.html:160 cps/templates/search_form.html:75 msgid "Languages" msgstr "Языки" -#: cps/templates/layout.html:170 +#: cps/templates/layout.html:172 msgid "Create a Shelf" msgstr "Создать книжную полку" -#: cps/templates/layout.html:171 cps/templates/stats.html:3 +#: cps/templates/layout.html:173 cps/templates/stats.html:3 msgid "About" msgstr "О программе" -#: cps/templates/layout.html:185 +#: cps/templates/layout.html:187 msgid "Previous" msgstr "" -#: cps/templates/layout.html:212 +#: cps/templates/layout.html:214 msgid "Book Details" msgstr "" @@ -1380,18 +1398,30 @@ msgid "Kindle E-Mail" msgstr "Адрес почты Kindle" #: cps/templates/user_edit.html:35 +msgid "Theme" +msgstr "" + +#: cps/templates/user_edit.html:37 +msgid "Standard Theme" +msgstr "" + +#: cps/templates/user_edit.html:38 +msgid "caliBlur! Dark Theme (Beta)" +msgstr "" + +#: cps/templates/user_edit.html:43 msgid "Show books with language" msgstr "Показать книги на языках" -#: cps/templates/user_edit.html:37 +#: cps/templates/user_edit.html:45 msgid "Show all" msgstr "Всех" -#: cps/templates/user_edit.html:131 +#: cps/templates/user_edit.html:139 msgid "Delete this user" msgstr "Удалить этого пользователя" -#: cps/templates/user_edit.html:146 +#: cps/templates/user_edit.html:154 msgid "Recent Downloads" msgstr "Недавние скачивания" diff --git a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po index ef630455..5e4e0ba9 100644 --- a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po +++ b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n" -"POT-Creation-Date: 2018-04-01 19:27+0200\n" +"POT-Creation-Date: 2018-06-02 10:45+0200\n" "PO-Revision-Date: 2017-01-06 17:00+0000\n" "Last-Translator: dalin \n" "Language: zh_Hans_CN\n" @@ -30,57 +30,57 @@ msgstr "" msgid "not installed" msgstr "未安装" -#: cps/helper.py:78 +#: cps/helper.py:79 #, python-format msgid "kindlegen binary %(kindlepath)s not found" msgstr "找不到kindlegen二进制 %(kindlepath)s" -#: cps/helper.py:84 +#: cps/helper.py:85 #, python-format msgid "epub format not found for book id: %(book)d" msgstr "没有找到书籍ID %(book)d 的epub格式" -#: cps/helper.py:94 +#: cps/helper.py:95 msgid "kindlegen failed, no execution permissions" msgstr "kindlegen失败,没有可执行权限" -#: cps/helper.py:109 +#: cps/helper.py:110 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Kindlegen 因为错误 %(error)s 失败。消息: %(message)s" -#: cps/helper.py:188 +#: cps/helper.py:189 #, python-format msgid "Failed to send mail: %s" msgstr "发送邮件失败: %s" -#: cps/helper.py:195 +#: cps/helper.py:196 msgid "Calibre-web test email" msgstr "Calibre-web 测试邮件" -#: cps/helper.py:196 cps/helper.py:208 +#: cps/helper.py:197 cps/helper.py:209 msgid "This email has been sent via calibre web." msgstr "此邮件由calibre web发送" -#: cps/helper.py:205 cps/templates/detail.html:44 +#: cps/helper.py:206 cps/templates/detail.html:44 msgid "Send to Kindle" msgstr "发送到Kindle" -#: cps/helper.py:225 cps/helper.py:239 +#: cps/helper.py:226 cps/helper.py:240 msgid "Could not find any formats suitable for sending by email" msgstr "无法找到适合邮件发送的格式" -#: cps/helper.py:340 +#: cps/helper.py:341 #, python-format msgid "Rename title from: \"%s\" to \"%s\" failed with error: %s" msgstr "" -#: cps/helper.py:349 +#: cps/helper.py:350 #, python-format msgid "Rename author from: \"%s\" to \"%s\" failed with error: %s" msgstr "" -#: cps/ub.py:684 +#: cps/ub.py:694 msgid "Guest" msgstr "游客" @@ -148,7 +148,7 @@ msgstr "随机书籍" msgid "Author list" msgstr "作者列表" -#: cps/web.py:1220 cps/web.py:1278 cps/web.py:1408 cps/web.py:1903 +#: cps/web.py:1220 cps/web.py:1278 cps/web.py:1408 cps/web.py:1917 msgid "Error opening eBook. File does not exist or file is not accessible:" msgstr "无法打开电子书。 文件不存在或者文件不可访问:" @@ -187,306 +187,328 @@ msgstr "可执行权限缺失" msgid "Statistics" msgstr "统计" -#: cps/web.py:1641 +#: cps/web.py:1573 +msgid "" +"Callback domain is not verified, please follow steps to verify domain in " +"google developer console" +msgstr "" + +#: cps/web.py:1651 msgid "Server restarted, please reload page" msgstr "服务器已重启,请刷新页面" -#: cps/web.py:1643 +#: cps/web.py:1653 msgid "Performing shutdown of server, please close window" msgstr "正在关闭服务器,请关闭窗口" -#: cps/web.py:1659 +#: cps/web.py:1669 msgid "Update done" msgstr "更新完成" -#: cps/web.py:1716 +#: cps/web.py:1726 #, python-format msgid "Published after %s" msgstr "" -#: cps/web.py:1721 +#: cps/web.py:1731 msgid "Published before " msgstr "" -#: cps/web.py:1767 cps/web.py:1780 +#: cps/web.py:1777 cps/web.py:1790 msgid "search" msgstr "搜索" +#: cps/web.py:1816 +msgid "not found on GDrive" +msgstr "" + #: cps/templates/index.xml:39 cps/templates/index.xml:42 -#: cps/templates/layout.html:141 cps/web.py:1858 +#: cps/templates/layout.html:143 cps/web.py:1872 msgid "Read Books" msgstr "已读书籍" #: cps/templates/index.xml:46 cps/templates/index.xml:49 -#: cps/templates/layout.html:143 cps/web.py:1861 +#: cps/templates/layout.html:145 cps/web.py:1875 msgid "Unread Books" msgstr "未读书籍" -#: cps/web.py:1936 cps/web.py:1938 cps/web.py:1940 cps/web.py:1949 +#: cps/web.py:1950 cps/web.py:1952 cps/web.py:1954 cps/web.py:1963 msgid "Read a Book" msgstr "阅读一本书" -#: cps/web.py:2001 cps/web.py:2718 +#: cps/web.py:2015 cps/web.py:2751 msgid "Please fill out all fields!" msgstr "请填写所有字段" -#: cps/web.py:2002 cps/web.py:2019 cps/web.py:2024 cps/web.py:2026 +#: cps/web.py:2016 cps/web.py:2033 cps/web.py:2038 cps/web.py:2040 msgid "register" msgstr "注册" -#: cps/web.py:2018 +#: cps/web.py:2032 msgid "An unknown error occured. Please try again later." msgstr "发生一个未知错误。请稍后再试。" -#: cps/web.py:2023 +#: cps/web.py:2037 msgid "This username or email address is already in use." msgstr "此用户名或邮箱已被使用。" -#: cps/web.py:2042 cps/web.py:2138 +#: cps/web.py:2056 cps/web.py:2152 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "您现在已以'%(nickname)s'身份登录" -#: cps/web.py:2047 +#: cps/web.py:2061 msgid "Wrong Username or Password" msgstr "用户名或密码错误" -#: cps/web.py:2053 cps/web.py:2074 +#: cps/web.py:2067 cps/web.py:2088 msgid "login" msgstr "登录" -#: cps/web.py:2086 cps/web.py:2117 +#: cps/web.py:2100 cps/web.py:2131 msgid "Token not found" msgstr "找不到Token" -#: cps/web.py:2094 cps/web.py:2125 +#: cps/web.py:2108 cps/web.py:2139 msgid "Token has expired" msgstr "Token已过期" -#: cps/web.py:2102 +#: cps/web.py:2116 msgid "Success! Please return to your device" msgstr "成功!请返回您的设备" -#: cps/web.py:2152 +#: cps/web.py:2166 msgid "Please configure the SMTP mail settings first..." msgstr "请先配置SMTP邮箱..." -#: cps/web.py:2156 +#: cps/web.py:2170 #, python-format msgid "Book successfully send to %(kindlemail)s" msgstr "此书已被成功发给 %(kindlemail)s" -#: cps/web.py:2160 +#: cps/web.py:2174 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "发送这本书的时候出现错误: %(res)s" -#: cps/web.py:2162 cps/web.py:2805 +#: cps/web.py:2176 cps/web.py:2839 msgid "Please configure your kindle email address first..." msgstr "请先配置您的kindle电子邮箱地址..." -#: cps/web.py:2206 +#: cps/web.py:2220 #, python-format msgid "Book has been added to shelf: %(sname)s" msgstr "此书已被添加到书架: %(sname)s" -#: cps/web.py:2244 +#: cps/web.py:2258 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "此书已从书架 %(sname)s 中删除" -#: cps/web.py:2250 +#: cps/web.py:2264 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "" -#: cps/web.py:2270 cps/web.py:2294 +#: cps/web.py:2284 cps/web.py:2308 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "已存在书架 '%(title)s'。" -#: cps/web.py:2275 +#: cps/web.py:2289 #, python-format msgid "Shelf %(title)s created" msgstr "书架 %(title)s 已被创建" -#: cps/web.py:2277 cps/web.py:2305 +#: cps/web.py:2291 cps/web.py:2319 msgid "There was an error" msgstr "发生错误" -#: cps/web.py:2278 cps/web.py:2280 +#: cps/web.py:2292 cps/web.py:2294 msgid "create a shelf" msgstr "创建书架" -#: cps/web.py:2303 +#: cps/web.py:2317 #, python-format msgid "Shelf %(title)s changed" msgstr "书架 %(title)s 已被修改" -#: cps/web.py:2306 cps/web.py:2308 +#: cps/web.py:2320 cps/web.py:2322 msgid "Edit a shelf" msgstr "编辑书架" -#: cps/web.py:2329 +#: cps/web.py:2343 #, python-format msgid "successfully deleted shelf %(name)s" msgstr "成功删除书架 %(name)s" -#: cps/web.py:2351 +#: cps/web.py:2365 #, python-format msgid "Shelf: '%(name)s'" msgstr "书架: '%(name)s'" -#: cps/web.py:2354 +#: cps/web.py:2368 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "打开书架出错。书架不存在或不可访问" -#: cps/web.py:2385 +#: cps/web.py:2399 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "修改书架 '%(name)s' 顺序" -#: cps/web.py:2454 +#: cps/web.py:2469 msgid "Found an existing account for this email address." msgstr "找到已使用此邮箱的账号。" -#: cps/web.py:2456 cps/web.py:2460 +#: cps/web.py:2471 cps/web.py:2475 #, python-format msgid "%(name)s's profile" msgstr "%(name)s 的资料" -#: cps/web.py:2457 +#: cps/web.py:2472 msgid "Profile updated" msgstr "资料已更新" -#: cps/web.py:2469 +#: cps/web.py:2484 msgid "Unknown" msgstr "" -#: cps/web.py:2482 +#: cps/web.py:2497 msgid "Admin page" msgstr "管理页" -#: cps/web.py:2553 -msgid "Keyfile location is not valid, please enter correct path" +#: cps/web.py:2520 +msgid "Import of optional GDrive requirements missing" msgstr "" -#: cps/web.py:2556 cps/web.py:2567 cps/web.py:2660 cps/web.py:2679 -#: cps/web.py:2685 cps/web.py:2699 +#: cps/web.py:2523 +msgid "client_secret.json is missing or not readable" +msgstr "" + +#: cps/web.py:2528 cps/web.py:2553 +msgid "client_secret.json is not configured for web application" +msgstr "" + +#: cps/web.py:2556 cps/web.py:2582 cps/web.py:2593 cps/web.py:2686 +#: cps/web.py:2706 cps/web.py:2713 cps/web.py:2732 msgid "Basic Configuration" msgstr "基本配置" -#: cps/web.py:2564 +#: cps/web.py:2579 +msgid "Keyfile location is not valid, please enter correct path" +msgstr "" + +#: cps/web.py:2590 msgid "Certfile location is not valid, please enter correct path" msgstr "" -#: cps/web.py:2657 +#: cps/web.py:2683 msgid "Logfile location is not valid, please enter correct path" msgstr "" -#: cps/web.py:2672 +#: cps/web.py:2698 msgid "Calibre-web configuration updated" msgstr "Calibre-web配置已更新" -#: cps/web.py:2683 +#: cps/web.py:2710 msgid "DB location is not valid, please enter correct path" msgstr "DB位置无效,请输入正确路径" -#: cps/templates/admin.html:34 cps/web.py:2720 cps/web.py:2775 +#: cps/templates/admin.html:34 cps/web.py:2753 cps/web.py:2809 msgid "Add new user" msgstr "添加新用户" -#: cps/web.py:2765 +#: cps/web.py:2799 #, python-format msgid "User '%(user)s' created" msgstr "用户 '%(user)s' 已被创建" -#: cps/web.py:2769 +#: cps/web.py:2803 msgid "Found an existing account for this email address or nickname." msgstr "已存在使用此邮箱或昵称的账号。" -#: cps/web.py:2793 +#: cps/web.py:2827 msgid "Mail settings updated" msgstr "邮箱设置已更新" -#: cps/web.py:2800 +#: cps/web.py:2834 #, python-format msgid "Test E-Mail successfully send to %(kindlemail)s" msgstr "测试邮件已成功发送到 %(kindlemail)s" -#: cps/web.py:2803 +#: cps/web.py:2837 #, python-format msgid "There was an error sending the Test E-Mail: %(res)s" msgstr "发送测试邮件时发生错误: %(res)s" -#: cps/web.py:2807 +#: cps/web.py:2841 msgid "E-Mail settings updated" msgstr "E-Mail 设置已更新" -#: cps/web.py:2808 +#: cps/web.py:2842 msgid "Edit mail settings" msgstr "编辑邮箱设置" -#: cps/web.py:2837 +#: cps/web.py:2871 #, python-format msgid "User '%(nick)s' deleted" msgstr "用户 '%(nick)s' 已被删除" -#: cps/web.py:2945 +#: cps/web.py:2980 #, python-format msgid "User '%(nick)s' updated" msgstr "用户 '%(nick)s' 已被更新" -#: cps/web.py:2948 +#: cps/web.py:2983 msgid "An unknown error occured." msgstr "发生未知错误。" -#: cps/web.py:2951 +#: cps/web.py:2986 #, python-format msgid "Edit User %(nick)s" msgstr "编辑用户 %(nick)s" -#: cps/web.py:2967 +#: cps/web.py:3002 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "打开电子书出错。文件不存在或不可访问" -#: cps/web.py:2982 cps/web.py:3193 cps/web.py:3198 cps/web.py:3344 +#: cps/web.py:3017 cps/web.py:3228 cps/web.py:3233 cps/web.py:3379 msgid "edit metadata" msgstr "编辑元数据" -#: cps/web.py:2992 cps/web.py:3238 +#: cps/web.py:3027 cps/web.py:3273 #, python-format msgid "File extension \"%s\" is not allowed to be uploaded to this server" msgstr "不能上传后缀为 \"%s\" 的文件到此服务器" -#: cps/web.py:3003 +#: cps/web.py:3038 #, python-format msgid "Failed to store file %s." msgstr "" -#: cps/web.py:3025 cps/web.py:3029 +#: cps/web.py:3060 cps/web.py:3064 msgid "unknown" msgstr "未知" -#: cps/web.py:3052 +#: cps/web.py:3087 msgid "Cover is not a jpg file, can't save" msgstr "" -#: cps/web.py:3244 +#: cps/web.py:3279 msgid "File to be uploaded must have an extension" msgstr "要上传的文件必须有一个后缀" -#: cps/web.py:3263 +#: cps/web.py:3298 #, python-format msgid "Failed to create path %s (Permission denied)." msgstr "创建路径 %s 失败(权限拒绝)。" -#: cps/web.py:3268 +#: cps/web.py:3303 #, python-format msgid "Failed to store file %s (Permission denied)." msgstr "存储文件 %s 失败(权限拒绝)。" -#: cps/web.py:3273 +#: cps/web.py:3308 #, python-format msgid "Failed to delete file %s (Permission denied)." msgstr "删除文件 %s 失败(权限拒绝)。" @@ -511,7 +533,7 @@ msgstr "" msgid "DLS" msgstr "" -#: cps/templates/admin.html:12 cps/templates/layout.html:69 +#: cps/templates/admin.html:12 cps/templates/layout.html:71 msgid "Admin" msgstr "管理" @@ -520,7 +542,7 @@ msgstr "管理" msgid "Download" msgstr "下载" -#: cps/templates/admin.html:14 cps/templates/layout.html:62 +#: cps/templates/admin.html:14 cps/templates/layout.html:64 msgid "Upload" msgstr "上传" @@ -572,7 +594,7 @@ msgstr "配置" msgid "Calibre DB dir" msgstr "Calibre DB目录" -#: cps/templates/admin.html:61 cps/templates/config_edit.html:91 +#: cps/templates/admin.html:61 cps/templates/config_edit.html:87 msgid "Log Level" msgstr "日志级别" @@ -580,7 +602,7 @@ msgstr "日志级别" msgid "Port" msgstr "端口" -#: cps/templates/admin.html:63 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:63 cps/templates/config_edit.html:64 msgid "Books per page" msgstr "每页书籍数" @@ -643,9 +665,9 @@ msgstr "确定" #: cps/templates/admin.html:105 cps/templates/admin.html:119 #: cps/templates/book_edit.html:135 cps/templates/book_edit.html:157 -#: cps/templates/config_edit.html:223 cps/templates/email_edit.html:36 +#: cps/templates/config_edit.html:219 cps/templates/email_edit.html:36 #: cps/templates/shelf.html:60 cps/templates/shelf_edit.html:19 -#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:139 +#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:147 msgid "Back" msgstr "后退" @@ -691,7 +713,7 @@ msgstr "简介" msgid "Tags" msgstr "标签" -#: cps/templates/book_edit.html:39 cps/templates/layout.html:152 +#: cps/templates/book_edit.html:39 cps/templates/layout.html:154 #: cps/templates/search_form.html:54 msgid "Series" msgstr "丛书" @@ -738,9 +760,9 @@ msgstr "编辑后查看书籍" msgid "Get metadata" msgstr "获取元数据" -#: cps/templates/book_edit.html:134 cps/templates/config_edit.html:221 +#: cps/templates/book_edit.html:134 cps/templates/config_edit.html:217 #: cps/templates/login.html:20 cps/templates/search_form.html:96 -#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:145 msgid "Submit" msgstr "提交" @@ -768,7 +790,7 @@ msgstr "关键字" msgid " Search keyword " msgstr "搜索关键字" -#: cps/templates/book_edit.html:175 cps/templates/layout.html:44 +#: cps/templates/book_edit.html:175 cps/templates/layout.html:46 msgid "Go!" msgstr "走起!" @@ -780,7 +802,7 @@ msgstr "点击封面加载元数据到表单" msgid "Loading..." msgstr "加载中..." -#: cps/templates/book_edit.html:196 cps/templates/layout.html:216 +#: cps/templates/book_edit.html:196 cps/templates/layout.html:218 msgid "Close" msgstr "关闭" @@ -805,184 +827,180 @@ msgstr "没有结果!请尝试别的关键字." msgid "Location of Calibre database" msgstr "Calibre 数据库位置" -#: cps/templates/config_edit.html:13 +#: cps/templates/config_edit.html:12 msgid "Use google drive?" msgstr "是否使用google drive?" -#: cps/templates/config_edit.html:17 -msgid "Client id" -msgstr "" - -#: cps/templates/config_edit.html:21 -msgid "Client secret" +#: cps/templates/config_edit.html:18 +msgid "Google drive config problem" msgstr "" -#: cps/templates/config_edit.html:25 -msgid "Calibre Base URL" -msgstr "" - -#: cps/templates/config_edit.html:29 +#: cps/templates/config_edit.html:28 msgid "Google drive Calibre folder" msgstr "" -#: cps/templates/config_edit.html:38 +#: cps/templates/config_edit.html:36 msgid "Metadata Watch Channel ID" msgstr "" -#: cps/templates/config_edit.html:52 +#: cps/templates/config_edit.html:39 +msgid "Revoke" +msgstr "" + +#: cps/templates/config_edit.html:48 msgid "Server Port" msgstr "服务器端口" -#: cps/templates/config_edit.html:56 +#: cps/templates/config_edit.html:52 msgid "SSL certfile location (leave it empty for non-SSL Servers)" msgstr "" -#: cps/templates/config_edit.html:60 +#: cps/templates/config_edit.html:56 msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "" -#: cps/templates/config_edit.html:64 cps/templates/layout.html:128 -#: cps/templates/layout.html:129 cps/templates/shelf_edit.html:7 +#: cps/templates/config_edit.html:60 cps/templates/layout.html:130 +#: cps/templates/layout.html:131 cps/templates/shelf_edit.html:7 msgid "Title" msgstr "标题" -#: cps/templates/config_edit.html:72 +#: cps/templates/config_edit.html:68 msgid "No. of random books to show" msgstr "随机书籍显示数量" -#: cps/templates/config_edit.html:76 +#: cps/templates/config_edit.html:72 msgid "Regular expression for ignoring columns" msgstr "忽略列的正则表达式" -#: cps/templates/config_edit.html:80 +#: cps/templates/config_edit.html:76 msgid "Regular expression for title sorting" msgstr "标题排序的正则表达式" -#: cps/templates/config_edit.html:84 +#: cps/templates/config_edit.html:80 msgid "Tags for Mature Content" msgstr "" -#: cps/templates/config_edit.html:100 +#: cps/templates/config_edit.html:96 msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "" -#: cps/templates/config_edit.html:106 +#: cps/templates/config_edit.html:102 msgid "Enable uploading" msgstr "启用上传" -#: cps/templates/config_edit.html:110 +#: cps/templates/config_edit.html:106 msgid "Enable anonymous browsing" msgstr "启用匿名浏览" -#: cps/templates/config_edit.html:114 +#: cps/templates/config_edit.html:110 msgid "Enable public registration" msgstr "启用注册" -#: cps/templates/config_edit.html:118 +#: cps/templates/config_edit.html:114 msgid "Enable remote login (\"magic link\")" msgstr "启用远程登录 (\"魔法链接\")" -#: cps/templates/config_edit.html:123 +#: cps/templates/config_edit.html:119 msgid "Use" msgstr "" -#: cps/templates/config_edit.html:124 +#: cps/templates/config_edit.html:120 msgid "Obtain an API Key" msgstr "" -#: cps/templates/config_edit.html:128 +#: cps/templates/config_edit.html:124 msgid "Goodreads API Key" msgstr "" -#: cps/templates/config_edit.html:132 +#: cps/templates/config_edit.html:128 msgid "Goodreads API Secret" msgstr "" -#: cps/templates/config_edit.html:137 +#: cps/templates/config_edit.html:133 msgid "Default Settings for new users" msgstr "新用户默认设置" -#: cps/templates/config_edit.html:140 cps/templates/user_edit.html:94 +#: cps/templates/config_edit.html:136 cps/templates/user_edit.html:102 msgid "Admin user" msgstr "管理用户" -#: cps/templates/config_edit.html:144 cps/templates/user_edit.html:103 +#: cps/templates/config_edit.html:140 cps/templates/user_edit.html:111 msgid "Allow Downloads" msgstr "允许下载" -#: cps/templates/config_edit.html:148 cps/templates/user_edit.html:107 +#: cps/templates/config_edit.html:144 cps/templates/user_edit.html:115 msgid "Allow Uploads" msgstr "允许上传" -#: cps/templates/config_edit.html:152 cps/templates/user_edit.html:111 +#: cps/templates/config_edit.html:148 cps/templates/user_edit.html:119 msgid "Allow Edit" msgstr "允许编辑" -#: cps/templates/config_edit.html:156 cps/templates/user_edit.html:115 +#: cps/templates/config_edit.html:152 cps/templates/user_edit.html:123 msgid "Allow Delete books" msgstr "允许删除书籍" -#: cps/templates/config_edit.html:160 cps/templates/user_edit.html:120 +#: cps/templates/config_edit.html:156 cps/templates/user_edit.html:128 msgid "Allow Changing Password" msgstr "允许修改密码" -#: cps/templates/config_edit.html:164 cps/templates/user_edit.html:124 +#: cps/templates/config_edit.html:160 cps/templates/user_edit.html:132 msgid "Allow Editing Public Shelfs" msgstr "允许编辑公共书架" -#: cps/templates/config_edit.html:168 +#: cps/templates/config_edit.html:164 msgid "Default visiblities for new users" msgstr "" -#: cps/templates/config_edit.html:172 cps/templates/user_edit.html:46 +#: cps/templates/config_edit.html:168 cps/templates/user_edit.html:54 msgid "Show random books" msgstr "显示随机书籍" -#: cps/templates/config_edit.html:176 cps/templates/user_edit.html:50 +#: cps/templates/config_edit.html:172 cps/templates/user_edit.html:58 msgid "Show recent books" msgstr "" -#: cps/templates/config_edit.html:180 cps/templates/user_edit.html:54 +#: cps/templates/config_edit.html:176 cps/templates/user_edit.html:62 msgid "Show sorted books" msgstr "" -#: cps/templates/config_edit.html:184 cps/templates/user_edit.html:58 +#: cps/templates/config_edit.html:180 cps/templates/user_edit.html:66 msgid "Show hot books" msgstr "显示热门书籍" -#: cps/templates/config_edit.html:188 cps/templates/user_edit.html:62 +#: cps/templates/config_edit.html:184 cps/templates/user_edit.html:70 msgid "Show best rated books" msgstr "显示最高评分书籍" -#: cps/templates/config_edit.html:192 cps/templates/user_edit.html:66 +#: cps/templates/config_edit.html:188 cps/templates/user_edit.html:74 msgid "Show language selection" msgstr "显示语言选择" -#: cps/templates/config_edit.html:196 cps/templates/user_edit.html:70 +#: cps/templates/config_edit.html:192 cps/templates/user_edit.html:78 msgid "Show series selection" msgstr "显示丛书选择" -#: cps/templates/config_edit.html:200 cps/templates/user_edit.html:74 +#: cps/templates/config_edit.html:196 cps/templates/user_edit.html:82 msgid "Show category selection" msgstr "显示分类选择" -#: cps/templates/config_edit.html:204 cps/templates/user_edit.html:78 +#: cps/templates/config_edit.html:200 cps/templates/user_edit.html:86 msgid "Show author selection" msgstr "显示作者选择" -#: cps/templates/config_edit.html:208 cps/templates/user_edit.html:82 +#: cps/templates/config_edit.html:204 cps/templates/user_edit.html:90 msgid "Show read and unread" msgstr "显示已读和未读" -#: cps/templates/config_edit.html:212 cps/templates/user_edit.html:86 +#: cps/templates/config_edit.html:208 cps/templates/user_edit.html:94 msgid "Show random books in detail view" msgstr "在详情页显示随机书籍" -#: cps/templates/config_edit.html:216 cps/templates/user_edit.html:99 +#: cps/templates/config_edit.html:212 cps/templates/user_edit.html:107 msgid "Show mature content" msgstr "" -#: cps/templates/config_edit.html:226 cps/templates/layout.html:77 +#: cps/templates/config_edit.html:222 cps/templates/layout.html:79 #: cps/templates/login.html:4 msgid "Login" msgstr "登录" @@ -1051,12 +1069,12 @@ msgstr "保存设置" msgid "Save settings and send Test E-Mail" msgstr "保存设置并发送测试邮件" -#: cps/templates/feed.xml:20 cps/templates/layout.html:200 +#: cps/templates/feed.xml:20 cps/templates/layout.html:202 msgid "Next" msgstr "下一个" #: cps/templates/feed.xml:29 cps/templates/index.xml:7 -#: cps/templates/layout.html:41 cps/templates/layout.html:42 +#: cps/templates/layout.html:43 cps/templates/layout.html:44 msgid "Search" msgstr "搜索" @@ -1068,7 +1086,7 @@ msgstr "发现(随机书籍)" msgid "Start" msgstr "开始" -#: cps/templates/index.xml:14 cps/templates/layout.html:134 +#: cps/templates/index.xml:14 cps/templates/layout.html:136 msgid "Hot Books" msgstr "热门书籍" @@ -1076,7 +1094,7 @@ msgstr "热门书籍" msgid "Popular publications from this catalog based on Downloads." msgstr "基于下载数的热门书籍" -#: cps/templates/index.xml:20 cps/templates/layout.html:137 +#: cps/templates/index.xml:20 cps/templates/layout.html:139 msgid "Best rated Books" msgstr "最高评分书籍" @@ -1096,7 +1114,7 @@ msgstr "最新书籍" msgid "Show Random Books" msgstr "显示随机书籍" -#: cps/templates/index.xml:52 cps/templates/layout.html:155 +#: cps/templates/index.xml:52 cps/templates/layout.html:157 msgid "Authors" msgstr "作者" @@ -1112,7 +1130,7 @@ msgstr "书籍按分类排序" msgid "Books ordered by series" msgstr "书籍按丛书排序" -#: cps/templates/index.xml:70 cps/templates/layout.html:161 +#: cps/templates/index.xml:70 cps/templates/layout.html:163 msgid "Public Shelves" msgstr "公开书架" @@ -1120,7 +1138,7 @@ msgstr "公开书架" msgid "Books organized in public shelfs, visible to everyone" msgstr "" -#: cps/templates/index.xml:77 cps/templates/layout.html:165 +#: cps/templates/index.xml:77 cps/templates/layout.html:167 msgid "Your Shelves" msgstr "您的书架" @@ -1128,88 +1146,88 @@ msgstr "您的书架" msgid "User's own shelfs, only visible to the current user himself" msgstr "" -#: cps/templates/layout.html:31 +#: cps/templates/layout.html:33 msgid "Toggle navigation" msgstr "切换导航" -#: cps/templates/layout.html:52 +#: cps/templates/layout.html:54 msgid "Advanced Search" msgstr "高级搜索" -#: cps/templates/layout.html:73 +#: cps/templates/layout.html:75 msgid "Logout" msgstr "注销" -#: cps/templates/layout.html:78 cps/templates/register.html:18 +#: cps/templates/layout.html:80 cps/templates/register.html:18 msgid "Register" msgstr "注册" -#: cps/templates/layout.html:103 +#: cps/templates/layout.html:105 msgid "Uploading..." msgstr "" -#: cps/templates/layout.html:104 +#: cps/templates/layout.html:106 msgid "please don't refresh the page" msgstr "" -#: cps/templates/layout.html:115 +#: cps/templates/layout.html:117 msgid "Browse" msgstr "浏览" -#: cps/templates/layout.html:117 +#: cps/templates/layout.html:119 msgid "Recently Added" msgstr "最近添加" -#: cps/templates/layout.html:122 +#: cps/templates/layout.html:124 msgid "Sorted Books" msgstr "已排序书籍" -#: cps/templates/layout.html:126 cps/templates/layout.html:127 #: cps/templates/layout.html:128 cps/templates/layout.html:129 +#: cps/templates/layout.html:130 cps/templates/layout.html:131 msgid "Sort By" msgstr "排序" -#: cps/templates/layout.html:126 +#: cps/templates/layout.html:128 msgid "Newest" msgstr "最新" -#: cps/templates/layout.html:127 +#: cps/templates/layout.html:129 msgid "Oldest" msgstr "最旧" -#: cps/templates/layout.html:128 +#: cps/templates/layout.html:130 msgid "Ascending" msgstr "升序" -#: cps/templates/layout.html:129 +#: cps/templates/layout.html:131 msgid "Descending" msgstr "降序" -#: cps/templates/layout.html:146 +#: cps/templates/layout.html:148 msgid "Discover" msgstr "发现" -#: cps/templates/layout.html:149 +#: cps/templates/layout.html:151 msgid "Categories" msgstr "分类" -#: cps/templates/layout.html:158 cps/templates/search_form.html:75 +#: cps/templates/layout.html:160 cps/templates/search_form.html:75 msgid "Languages" msgstr "语言" -#: cps/templates/layout.html:170 +#: cps/templates/layout.html:172 msgid "Create a Shelf" msgstr "创建书架" -#: cps/templates/layout.html:171 cps/templates/stats.html:3 +#: cps/templates/layout.html:173 cps/templates/stats.html:3 msgid "About" msgstr "关于" -#: cps/templates/layout.html:185 +#: cps/templates/layout.html:187 msgid "Previous" msgstr "" -#: cps/templates/layout.html:212 +#: cps/templates/layout.html:214 msgid "Book Details" msgstr "" @@ -1380,18 +1398,30 @@ msgid "Kindle E-Mail" msgstr "" #: cps/templates/user_edit.html:35 +msgid "Theme" +msgstr "" + +#: cps/templates/user_edit.html:37 +msgid "Standard Theme" +msgstr "" + +#: cps/templates/user_edit.html:38 +msgid "caliBlur! Dark Theme (Beta)" +msgstr "" + +#: cps/templates/user_edit.html:43 msgid "Show books with language" msgstr "按语言显示书籍" -#: cps/templates/user_edit.html:37 +#: cps/templates/user_edit.html:45 msgid "Show all" msgstr "显示全部" -#: cps/templates/user_edit.html:131 +#: cps/templates/user_edit.html:139 msgid "Delete this user" msgstr "删除此用户" -#: cps/templates/user_edit.html:146 +#: cps/templates/user_edit.html:154 msgid "Recent Downloads" msgstr "最近下载" diff --git a/cps/ub.py b/cps/ub.py index 53b23811..ccf82a6d 100644 --- a/cps/ub.py +++ b/cps/ub.py @@ -291,10 +291,10 @@ class Settings(Base): config_default_show = Column(SmallInteger, default=2047) config_columns_to_ignore = Column(String) config_use_google_drive = Column(Boolean) - config_google_drive_client_id = Column(String) - config_google_drive_client_secret = Column(String) + # config_google_drive_client_id = Column(String) + # config_google_drive_client_secret = Column(String) config_google_drive_folder = Column(String) - config_google_drive_calibre_url_base = Column(String) + # config_google_drive_calibre_url_base = Column(String) config_google_drive_watch_changes_response = Column(String) config_remote_login = Column(Boolean) config_use_goodreads = Column(Boolean) @@ -352,9 +352,9 @@ class Config: self.config_default_show = data.config_default_show self.config_columns_to_ignore = data.config_columns_to_ignore self.config_use_google_drive = data.config_use_google_drive - self.config_google_drive_client_id = data.config_google_drive_client_id - self.config_google_drive_client_secret = data.config_google_drive_client_secret - self.config_google_drive_calibre_url_base = data.config_google_drive_calibre_url_base + # self.config_google_drive_client_id = data.config_google_drive_client_id + # self.config_google_drive_client_secret = data.config_google_drive_client_secret + # self.config_google_drive_calibre_url_base = data.config_google_drive_calibre_url_base self.config_google_drive_folder = data.config_google_drive_folder if data.config_google_drive_watch_changes_response: self.config_google_drive_watch_changes_response = json.loads(data.config_google_drive_watch_changes_response) @@ -550,9 +550,9 @@ def migrate_Database(): except exc.OperationalError: conn = engine.connect() conn.execute("ALTER TABLE Settings ADD column `config_use_google_drive` INTEGER DEFAULT 0") - conn.execute("ALTER TABLE Settings ADD column `config_google_drive_client_id` String DEFAULT ''") - conn.execute("ALTER TABLE Settings ADD column `config_google_drive_client_secret` String DEFAULT ''") - conn.execute("ALTER TABLE Settings ADD column `config_google_drive_calibre_url_base` INTEGER DEFAULT 0") + # conn.execute("ALTER TABLE Settings ADD column `config_google_drive_client_id` String DEFAULT ''") + # conn.execute("ALTER TABLE Settings ADD column `config_google_drive_client_secret` String DEFAULT ''") + # conn.execute("ALTER TABLE Settings ADD column `config_google_drive_calibre_url_base` INTEGER DEFAULT 0") conn.execute("ALTER TABLE Settings ADD column `config_google_drive_folder` String DEFAULT ''") conn.execute("ALTER TABLE Settings ADD column `config_google_drive_watch_changes_response` String DEFAULT ''") try: diff --git a/cps/web.py b/cps/web.py index f69e3855..ea201102 100755 --- a/cps/web.py +++ b/cps/web.py @@ -1550,19 +1550,29 @@ def google_drive_callback(): @admin_required def watch_gdrive(): if not config.config_google_drive_watch_changes_response: - address = '%s/gdrive/watch/callback' % config.config_google_drive_calibre_url_base + with open('client_secret.json', 'r') as settings: + filedata = json.load(settings) + if filedata['web']['redirect_uris'][0].endswith('/'): + filedata['web']['redirect_uris'][0] = filedata['web']['redirect_uris'][0][:-((len('/gdrive/callback')+1))] + else: + filedata['web']['redirect_uris'][0] = filedata['web']['redirect_uris'][0][:-(len('/gdrive/callback'))] + address = '%s/gdrive/watch/callback' % filedata['web']['redirect_uris'][0] notification_id = str(uuid4()) - result = gdriveutils.watchChange(Gdrive.Instance().drive, notification_id, + try: + result = gdriveutils.watchChange(Gdrive.Instance().drive, notification_id, 'web_hook', address, gdrive_watch_callback_token, current_milli_time() + 604800*1000) - print (result) - settings = ub.session.query(ub.Settings).first() - settings.config_google_drive_watch_changes_response = json.dumps(result) - ub.session.merge(settings) - ub.session.commit() - settings = ub.session.query(ub.Settings).first() - config.loadSettings() - - print (settings.config_google_drive_watch_changes_response) + settings = ub.session.query(ub.Settings).first() + settings.config_google_drive_watch_changes_response = json.dumps(result) + ub.session.merge(settings) + ub.session.commit() + settings = ub.session.query(ub.Settings).first() + config.loadSettings() + except HttpError as e: + reason=json.loads(e.content)['error']['errors'][0] + if reason['reason'] == u'push.webhookUrlUnauthorized': + flash(_(u'Callback domain is not verified, please follow steps to verify domain in google developer console'), category="error") + else: + flash(reason['message'], category="error") return redirect(url_for('configuration')) @@ -1800,7 +1810,11 @@ def get_cover_via_gdrive(cover_path): @login_required_if_no_ano def get_cover(cover_path): if config.config_use_google_drive: - return redirect(get_cover_via_gdrive(cover_path)) + try: + return redirect(get_cover_via_gdrive(cover_path)) + except: + app.logger.error(cover_path + '/cover.jpg ' + _('not found on GDrive')) + return send_from_directory(os.path.join(os.path.dirname(__file__), "static"),"generic_cover.jpg") else: return send_from_directory(os.path.join(config.config_calibre_dir, cover_path), "cover.jpg") @@ -2499,8 +2513,20 @@ def basic_configuration(): def configuration_helper(origin): # global global_task reboot_required = False + gdriveError=None db_change = False success = False + if gdrive_support == False: + gdriveError = _('Import of optional GDrive requirements missing') + else: + if not os.path.isfile('client_secret.json'): + gdriveError = _('client_secret.json is missing or not readable') + else: + with open('client_secret.json', 'r') as settings: + filedata=json.load(settings) + if not 'web' in filedata: + gdriveError = _('client_secret.json is not configured for web application') + filedata = None if request.method == "POST": to_save = request.form.to_dict() content = ub.session.query(ub.Settings).first() # type: ub.Settings @@ -2509,37 +2535,36 @@ def configuration_helper(origin): content.config_calibre_dir = to_save["config_calibre_dir"] db_change = True # Google drive setup - create_new_yaml = False - if "config_google_drive_client_id" in to_save: - if content.config_google_drive_client_id != to_save["config_google_drive_client_id"]: - content.config_google_drive_client_id = to_save["config_google_drive_client_id"] - create_new_yaml = True - if "config_google_drive_client_secret" in to_save: - if content.config_google_drive_client_secret != to_save["config_google_drive_client_secret"]: - content.config_google_drive_client_secret = to_save["config_google_drive_client_secret"] - create_new_yaml = True - if "config_google_drive_calibre_url_base" in to_save: - if to_save['config_google_drive_calibre_url_base'].endswith('/'): - to_save['config_google_drive_calibre_url_base'] = to_save['config_google_drive_calibre_url_base'][:-1] - if content.config_google_drive_calibre_url_base != to_save["config_google_drive_calibre_url_base"]: - content.config_google_drive_calibre_url_base = to_save["config_google_drive_calibre_url_base"] - create_new_yaml = True - if ("config_use_google_drive" in to_save and not content.config_use_google_drive) or ("config_use_google_drive" not in to_save and content.config_use_google_drive): + if "config_use_google_drive" in to_save and not content.config_use_google_drive and not gdriveError: + if filedata: + if filedata['web']['redirect_uris'][0].endswith('/'): + filedata['web']['redirect_uris'][0] = filedata['web']['redirect_uris'][0][:-1] + with open('settings.yaml', 'w') as f: + yaml = "client_config_backend: settings\nclient_config:\n" \ + " client_id: %(client_id)s\n client_secret: %(client_secret)s\n" \ + " redirect_uri: %(redirect_uri)s\nsave_credentials: True\n" \ + "save_credentials_backend: file\nsave_credentials_file: gdrive_credentials\n" \ + "get_refresh_token: True\n\noauth_scope:\n" \ + "- https://www.googleapis.com/auth/drive\n" + f.write(yaml % {'client_id': filedata['web']['client_id'], + 'client_secret': filedata['web']['client_secret'], + 'redirect_uri': filedata['web']['redirect_uris'][0]}) + else: + flash(_(u'client_secret.json is not configured for web application'), category="error") + return render_title_template("config_edit.html", content=config, origin=origin, + gdrive=gdrive_support, gdriveError=gdriveError, + goodreads=goodreads_support, title=_(u"Basic Configuration")) + # always show google drive settings, but in case of error deny support + if (("config_use_google_drive" in to_save and not content.config_use_google_drive) or + ("config_use_google_drive" not in to_save and content.config_use_google_drive)) and not gdriveError: content.config_use_google_drive = "config_use_google_drive" in to_save - db_change = True - if not content.config_use_google_drive: - create_new_yaml = False - if create_new_yaml: - with open('settings.yaml', 'w') as f: - with open('gdrive_template.yaml', 'r') as t: - f.write(t.read() % {'client_id': content.config_google_drive_client_id, - 'client_secret': content.config_google_drive_client_secret, - "redirect_uri": content.config_google_drive_calibre_url_base + '/gdrive/callback'}) + else: + content.config_use_google_drive = 0 if "config_google_drive_folder" in to_save: if content.config_google_drive_folder != to_save["config_google_drive_folder"]: content.config_google_drive_folder = to_save["config_google_drive_folder"] - db_change = True - ## + gdriveutils.deleteDatabaseOnChange() + if "config_port" in to_save: if content.config_port != int(to_save["config_port"]): content.config_port = int(to_save["config_port"]) @@ -2553,7 +2578,7 @@ def configuration_helper(origin): ub.session.commit() flash(_(u'Keyfile location is not valid, please enter correct path'), category="error") return render_title_template("config_edit.html", content=config, origin=origin, - gdrive=gdrive_support, + gdrive=gdrive_support, gdriveError=gdriveError, goodreads=goodreads_support, title=_(u"Basic Configuration")) if "config_certfile" in to_save: if content.config_certfile != to_save["config_certfile"]: @@ -2564,7 +2589,7 @@ def configuration_helper(origin): ub.session.commit() flash(_(u'Certfile location is not valid, please enter correct path'), category="error") return render_title_template("config_edit.html", content=config, origin=origin, - gdrive=gdrive_support, + gdrive=gdrive_support, gdriveError=gdriveError, goodreads=goodreads_support, title=_(u"Basic Configuration")) if "config_calibre_web_title" in to_save: content.config_calibre_web_title = to_save["config_calibre_web_title"] @@ -2657,7 +2682,7 @@ def configuration_helper(origin): ub.session.commit() flash(_(u'Logfile location is not valid, please enter correct path'), category="error") return render_title_template("config_edit.html", content=config, origin=origin, - gdrive=gdrive_support, + gdrive=gdrive_support, gdriveError=gdriveError, goodreads=goodreads_support, title=_(u"Basic Configuration")) else: content.config_logfile = to_save["config_logfile"] @@ -2677,12 +2702,14 @@ def configuration_helper(origin): except e: flash(e, category="error") return render_title_template("config_edit.html", content=config, origin=origin, gdrive=gdrive_support, + gdriveError=gdriveError, goodreads=goodreads_support, title=_(u"Basic Configuration")) if db_change: reload(db) if not db.setup_db(): flash(_(u'DB location is not valid, please enter correct path'), category="error") return render_title_template("config_edit.html", content=config, origin=origin, gdrive=gdrive_support, + gdriveError=gdriveError, goodreads=goodreads_support, title=_(u"Basic Configuration")) if reboot_required: # db.engine.dispose() # ToDo verify correct @@ -2695,8 +2722,13 @@ def configuration_helper(origin): app.logger.info('Reboot required, restarting') if origin: success = True + if is_gdrive_ready(): + gdrivefolders=gdriveutils.listRootFolders() + else: + gdrivefolders=None return render_title_template("config_edit.html", origin=origin, success=success, content=config, show_authenticate_google_drive=not is_gdrive_ready(), gdrive=gdrive_support, + gdriveError=gdriveError, gdrivefolders=gdrivefolders, goodreads=goodreads_support, title=_(u"Basic Configuration")) @@ -3351,7 +3383,7 @@ def upload(): else: return redirect(url_for("index")) -def start_gevent(): +'''def start_gevent(): from gevent.wsgi import WSGIServer global gevent_server try: @@ -3366,4 +3398,4 @@ def start_gevent(): gevent_server = WSGIServer(('0.0.0.0', ub.config.config_port), app, **ssl_args) gevent_server.serve_forever() except: - pass + pass''' diff --git a/gdrive_template.yaml b/gdrive_template.yaml deleted file mode 100644 index a6d77eee..00000000 --- a/gdrive_template.yaml +++ /dev/null @@ -1,14 +0,0 @@ -client_config_backend: settings -client_config: - client_id: %(client_id)s - client_secret: %(client_secret)s - redirect_uri: %(redirect_uri)s - -save_credentials: True -save_credentials_backend: file -save_credentials_file: gdrive_credentials - -get_refresh_token: True - -oauth_scope: - - https://www.googleapis.com/auth/drive diff --git a/getVendor.sh b/getVendor.sh deleted file mode 100644 index 022125c7..00000000 --- a/getVendor.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -e - -pip install --target ./vendor -r requirements.txt diff --git a/messages.pot b/messages.pot index db1c90c3..a697ae21 100644 --- a/messages.pot +++ b/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2018-04-02 09:35+0200\n" +"POT-Creation-Date: 2018-06-02 10:45+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -21,57 +21,57 @@ msgstr "" msgid "not installed" msgstr "" -#: cps/helper.py:78 +#: cps/helper.py:79 #, python-format msgid "kindlegen binary %(kindlepath)s not found" msgstr "" -#: cps/helper.py:84 +#: cps/helper.py:85 #, python-format msgid "epub format not found for book id: %(book)d" msgstr "" -#: cps/helper.py:94 +#: cps/helper.py:95 msgid "kindlegen failed, no execution permissions" msgstr "" -#: cps/helper.py:109 +#: cps/helper.py:110 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "" -#: cps/helper.py:188 +#: cps/helper.py:189 #, python-format msgid "Failed to send mail: %s" msgstr "" -#: cps/helper.py:195 +#: cps/helper.py:196 msgid "Calibre-web test email" msgstr "" -#: cps/helper.py:196 cps/helper.py:208 +#: cps/helper.py:197 cps/helper.py:209 msgid "This email has been sent via calibre web." msgstr "" -#: cps/helper.py:205 cps/templates/detail.html:44 +#: cps/helper.py:206 cps/templates/detail.html:44 msgid "Send to Kindle" msgstr "" -#: cps/helper.py:225 cps/helper.py:239 +#: cps/helper.py:226 cps/helper.py:240 msgid "Could not find any formats suitable for sending by email" msgstr "" -#: cps/helper.py:340 +#: cps/helper.py:341 #, python-format msgid "Rename title from: \"%s\" to \"%s\" failed with error: %s" msgstr "" -#: cps/helper.py:349 +#: cps/helper.py:350 #, python-format msgid "Rename author from: \"%s\" to \"%s\" failed with error: %s" msgstr "" -#: cps/ub.py:684 +#: cps/ub.py:694 msgid "Guest" msgstr "" @@ -139,7 +139,7 @@ msgstr "" msgid "Author list" msgstr "" -#: cps/web.py:1220 cps/web.py:1278 cps/web.py:1408 cps/web.py:1903 +#: cps/web.py:1220 cps/web.py:1278 cps/web.py:1408 cps/web.py:1917 msgid "Error opening eBook. File does not exist or file is not accessible:" msgstr "" @@ -178,306 +178,326 @@ msgstr "" msgid "Statistics" msgstr "" -#: cps/web.py:1641 +#: cps/web.py:1573 +msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" +msgstr "" + +#: cps/web.py:1651 msgid "Server restarted, please reload page" msgstr "" -#: cps/web.py:1643 +#: cps/web.py:1653 msgid "Performing shutdown of server, please close window" msgstr "" -#: cps/web.py:1659 +#: cps/web.py:1669 msgid "Update done" msgstr "" -#: cps/web.py:1716 +#: cps/web.py:1726 #, python-format msgid "Published after %s" msgstr "" -#: cps/web.py:1721 +#: cps/web.py:1731 msgid "Published before " msgstr "" -#: cps/web.py:1767 cps/web.py:1780 +#: cps/web.py:1777 cps/web.py:1790 msgid "search" msgstr "" +#: cps/web.py:1816 +msgid "not found on GDrive" +msgstr "" + #: cps/templates/index.xml:39 cps/templates/index.xml:42 -#: cps/templates/layout.html:141 cps/web.py:1858 +#: cps/templates/layout.html:143 cps/web.py:1872 msgid "Read Books" msgstr "" #: cps/templates/index.xml:46 cps/templates/index.xml:49 -#: cps/templates/layout.html:143 cps/web.py:1861 +#: cps/templates/layout.html:145 cps/web.py:1875 msgid "Unread Books" msgstr "" -#: cps/web.py:1936 cps/web.py:1938 cps/web.py:1940 cps/web.py:1949 +#: cps/web.py:1950 cps/web.py:1952 cps/web.py:1954 cps/web.py:1963 msgid "Read a Book" msgstr "" -#: cps/web.py:2001 cps/web.py:2718 +#: cps/web.py:2015 cps/web.py:2751 msgid "Please fill out all fields!" msgstr "" -#: cps/web.py:2002 cps/web.py:2019 cps/web.py:2024 cps/web.py:2026 +#: cps/web.py:2016 cps/web.py:2033 cps/web.py:2038 cps/web.py:2040 msgid "register" msgstr "" -#: cps/web.py:2018 +#: cps/web.py:2032 msgid "An unknown error occured. Please try again later." msgstr "" -#: cps/web.py:2023 +#: cps/web.py:2037 msgid "This username or email address is already in use." msgstr "" -#: cps/web.py:2042 cps/web.py:2138 +#: cps/web.py:2056 cps/web.py:2152 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:2047 +#: cps/web.py:2061 msgid "Wrong Username or Password" msgstr "" -#: cps/web.py:2053 cps/web.py:2074 +#: cps/web.py:2067 cps/web.py:2088 msgid "login" msgstr "" -#: cps/web.py:2086 cps/web.py:2117 +#: cps/web.py:2100 cps/web.py:2131 msgid "Token not found" msgstr "" -#: cps/web.py:2094 cps/web.py:2125 +#: cps/web.py:2108 cps/web.py:2139 msgid "Token has expired" msgstr "" -#: cps/web.py:2102 +#: cps/web.py:2116 msgid "Success! Please return to your device" msgstr "" -#: cps/web.py:2152 +#: cps/web.py:2166 msgid "Please configure the SMTP mail settings first..." msgstr "" -#: cps/web.py:2156 +#: cps/web.py:2170 #, python-format msgid "Book successfully send to %(kindlemail)s" msgstr "" -#: cps/web.py:2160 +#: cps/web.py:2174 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "" -#: cps/web.py:2162 cps/web.py:2805 +#: cps/web.py:2176 cps/web.py:2839 msgid "Please configure your kindle email address first..." msgstr "" -#: cps/web.py:2206 +#: cps/web.py:2220 #, python-format msgid "Book has been added to shelf: %(sname)s" msgstr "" -#: cps/web.py:2244 +#: cps/web.py:2258 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "" -#: cps/web.py:2250 +#: cps/web.py:2264 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "" -#: cps/web.py:2270 cps/web.py:2294 +#: cps/web.py:2284 cps/web.py:2308 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "" -#: cps/web.py:2275 +#: cps/web.py:2289 #, python-format msgid "Shelf %(title)s created" msgstr "" -#: cps/web.py:2277 cps/web.py:2305 +#: cps/web.py:2291 cps/web.py:2319 msgid "There was an error" msgstr "" -#: cps/web.py:2278 cps/web.py:2280 +#: cps/web.py:2292 cps/web.py:2294 msgid "create a shelf" msgstr "" -#: cps/web.py:2303 +#: cps/web.py:2317 #, python-format msgid "Shelf %(title)s changed" msgstr "" -#: cps/web.py:2306 cps/web.py:2308 +#: cps/web.py:2320 cps/web.py:2322 msgid "Edit a shelf" msgstr "" -#: cps/web.py:2329 +#: cps/web.py:2343 #, python-format msgid "successfully deleted shelf %(name)s" msgstr "" -#: cps/web.py:2351 +#: cps/web.py:2365 #, python-format msgid "Shelf: '%(name)s'" msgstr "" -#: cps/web.py:2354 +#: cps/web.py:2368 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "" -#: cps/web.py:2385 +#: cps/web.py:2399 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "" -#: cps/web.py:2454 +#: cps/web.py:2469 msgid "Found an existing account for this email address." msgstr "" -#: cps/web.py:2456 cps/web.py:2460 +#: cps/web.py:2471 cps/web.py:2475 #, python-format msgid "%(name)s's profile" msgstr "" -#: cps/web.py:2457 +#: cps/web.py:2472 msgid "Profile updated" msgstr "" -#: cps/web.py:2469 +#: cps/web.py:2484 msgid "Unknown" msgstr "" -#: cps/web.py:2482 +#: cps/web.py:2497 msgid "Admin page" msgstr "" -#: cps/web.py:2553 -msgid "Keyfile location is not valid, please enter correct path" +#: cps/web.py:2520 +msgid "Import of optional GDrive requirements missing" msgstr "" -#: cps/web.py:2556 cps/web.py:2567 cps/web.py:2660 cps/web.py:2679 -#: cps/web.py:2685 cps/web.py:2699 +#: cps/web.py:2523 +msgid "client_secret.json is missing or not readable" +msgstr "" + +#: cps/web.py:2528 cps/web.py:2553 +msgid "client_secret.json is not configured for web application" +msgstr "" + +#: cps/web.py:2556 cps/web.py:2582 cps/web.py:2593 cps/web.py:2686 +#: cps/web.py:2706 cps/web.py:2713 cps/web.py:2732 msgid "Basic Configuration" msgstr "" -#: cps/web.py:2564 +#: cps/web.py:2579 +msgid "Keyfile location is not valid, please enter correct path" +msgstr "" + +#: cps/web.py:2590 msgid "Certfile location is not valid, please enter correct path" msgstr "" -#: cps/web.py:2657 +#: cps/web.py:2683 msgid "Logfile location is not valid, please enter correct path" msgstr "" -#: cps/web.py:2672 +#: cps/web.py:2698 msgid "Calibre-web configuration updated" msgstr "" -#: cps/web.py:2683 +#: cps/web.py:2710 msgid "DB location is not valid, please enter correct path" msgstr "" -#: cps/templates/admin.html:34 cps/web.py:2720 cps/web.py:2775 +#: cps/templates/admin.html:34 cps/web.py:2753 cps/web.py:2809 msgid "Add new user" msgstr "" -#: cps/web.py:2765 +#: cps/web.py:2799 #, python-format msgid "User '%(user)s' created" msgstr "" -#: cps/web.py:2769 +#: cps/web.py:2803 msgid "Found an existing account for this email address or nickname." msgstr "" -#: cps/web.py:2793 +#: cps/web.py:2827 msgid "Mail settings updated" msgstr "" -#: cps/web.py:2800 +#: cps/web.py:2834 #, python-format msgid "Test E-Mail successfully send to %(kindlemail)s" msgstr "" -#: cps/web.py:2803 +#: cps/web.py:2837 #, python-format msgid "There was an error sending the Test E-Mail: %(res)s" msgstr "" -#: cps/web.py:2807 +#: cps/web.py:2841 msgid "E-Mail settings updated" msgstr "" -#: cps/web.py:2808 +#: cps/web.py:2842 msgid "Edit mail settings" msgstr "" -#: cps/web.py:2837 +#: cps/web.py:2871 #, python-format msgid "User '%(nick)s' deleted" msgstr "" -#: cps/web.py:2945 +#: cps/web.py:2980 #, python-format msgid "User '%(nick)s' updated" msgstr "" -#: cps/web.py:2948 +#: cps/web.py:2983 msgid "An unknown error occured." msgstr "" -#: cps/web.py:2951 +#: cps/web.py:2986 #, python-format msgid "Edit User %(nick)s" msgstr "" -#: cps/web.py:2967 +#: cps/web.py:3002 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "" -#: cps/web.py:2982 cps/web.py:3193 cps/web.py:3198 cps/web.py:3344 +#: cps/web.py:3017 cps/web.py:3228 cps/web.py:3233 cps/web.py:3379 msgid "edit metadata" msgstr "" -#: cps/web.py:2992 cps/web.py:3238 +#: cps/web.py:3027 cps/web.py:3273 #, python-format msgid "File extension \"%s\" is not allowed to be uploaded to this server" msgstr "" -#: cps/web.py:3003 +#: cps/web.py:3038 #, python-format msgid "Failed to store file %s." msgstr "" -#: cps/web.py:3025 cps/web.py:3029 +#: cps/web.py:3060 cps/web.py:3064 msgid "unknown" msgstr "" -#: cps/web.py:3052 +#: cps/web.py:3087 msgid "Cover is not a jpg file, can't save" msgstr "" -#: cps/web.py:3244 +#: cps/web.py:3279 msgid "File to be uploaded must have an extension" msgstr "" -#: cps/web.py:3263 +#: cps/web.py:3298 #, python-format msgid "Failed to create path %s (Permission denied)." msgstr "" -#: cps/web.py:3268 +#: cps/web.py:3303 #, python-format msgid "Failed to store file %s (Permission denied)." msgstr "" -#: cps/web.py:3273 +#: cps/web.py:3308 #, python-format msgid "Failed to delete file %s (Permission denied)." msgstr "" @@ -502,7 +522,7 @@ msgstr "" msgid "DLS" msgstr "" -#: cps/templates/admin.html:12 cps/templates/layout.html:69 +#: cps/templates/admin.html:12 cps/templates/layout.html:71 msgid "Admin" msgstr "" @@ -511,7 +531,7 @@ msgstr "" msgid "Download" msgstr "" -#: cps/templates/admin.html:14 cps/templates/layout.html:62 +#: cps/templates/admin.html:14 cps/templates/layout.html:64 msgid "Upload" msgstr "" @@ -563,7 +583,7 @@ msgstr "" msgid "Calibre DB dir" msgstr "" -#: cps/templates/admin.html:61 cps/templates/config_edit.html:91 +#: cps/templates/admin.html:61 cps/templates/config_edit.html:87 msgid "Log Level" msgstr "" @@ -571,7 +591,7 @@ msgstr "" msgid "Port" msgstr "" -#: cps/templates/admin.html:63 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:63 cps/templates/config_edit.html:64 msgid "Books per page" msgstr "" @@ -634,9 +654,9 @@ msgstr "" #: cps/templates/admin.html:105 cps/templates/admin.html:119 #: cps/templates/book_edit.html:135 cps/templates/book_edit.html:157 -#: cps/templates/config_edit.html:223 cps/templates/email_edit.html:36 +#: cps/templates/config_edit.html:219 cps/templates/email_edit.html:36 #: cps/templates/shelf.html:60 cps/templates/shelf_edit.html:19 -#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:139 +#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:147 msgid "Back" msgstr "" @@ -682,7 +702,7 @@ msgstr "" msgid "Tags" msgstr "" -#: cps/templates/book_edit.html:39 cps/templates/layout.html:152 +#: cps/templates/book_edit.html:39 cps/templates/layout.html:154 #: cps/templates/search_form.html:54 msgid "Series" msgstr "" @@ -727,9 +747,9 @@ msgstr "" msgid "Get metadata" msgstr "" -#: cps/templates/book_edit.html:134 cps/templates/config_edit.html:221 +#: cps/templates/book_edit.html:134 cps/templates/config_edit.html:217 #: cps/templates/login.html:20 cps/templates/search_form.html:96 -#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:145 msgid "Submit" msgstr "" @@ -757,7 +777,7 @@ msgstr "" msgid " Search keyword " msgstr "" -#: cps/templates/book_edit.html:175 cps/templates/layout.html:44 +#: cps/templates/book_edit.html:175 cps/templates/layout.html:46 msgid "Go!" msgstr "" @@ -769,7 +789,7 @@ msgstr "" msgid "Loading..." msgstr "" -#: cps/templates/book_edit.html:196 cps/templates/layout.html:216 +#: cps/templates/book_edit.html:196 cps/templates/layout.html:218 msgid "Close" msgstr "" @@ -794,184 +814,180 @@ msgstr "" msgid "Location of Calibre database" msgstr "" -#: cps/templates/config_edit.html:13 +#: cps/templates/config_edit.html:12 msgid "Use google drive?" msgstr "" -#: cps/templates/config_edit.html:17 -msgid "Client id" -msgstr "" - -#: cps/templates/config_edit.html:21 -msgid "Client secret" +#: cps/templates/config_edit.html:18 +msgid "Google drive config problem" msgstr "" -#: cps/templates/config_edit.html:25 -msgid "Calibre Base URL" -msgstr "" - -#: cps/templates/config_edit.html:29 +#: cps/templates/config_edit.html:28 msgid "Google drive Calibre folder" msgstr "" -#: cps/templates/config_edit.html:38 +#: cps/templates/config_edit.html:36 msgid "Metadata Watch Channel ID" msgstr "" -#: cps/templates/config_edit.html:52 +#: cps/templates/config_edit.html:39 +msgid "Revoke" +msgstr "" + +#: cps/templates/config_edit.html:48 msgid "Server Port" msgstr "" -#: cps/templates/config_edit.html:56 +#: cps/templates/config_edit.html:52 msgid "SSL certfile location (leave it empty for non-SSL Servers)" msgstr "" -#: cps/templates/config_edit.html:60 +#: cps/templates/config_edit.html:56 msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "" -#: cps/templates/config_edit.html:64 cps/templates/layout.html:128 -#: cps/templates/layout.html:129 cps/templates/shelf_edit.html:7 +#: cps/templates/config_edit.html:60 cps/templates/layout.html:130 +#: cps/templates/layout.html:131 cps/templates/shelf_edit.html:7 msgid "Title" msgstr "" -#: cps/templates/config_edit.html:72 +#: cps/templates/config_edit.html:68 msgid "No. of random books to show" msgstr "" -#: cps/templates/config_edit.html:76 +#: cps/templates/config_edit.html:72 msgid "Regular expression for ignoring columns" msgstr "" -#: cps/templates/config_edit.html:80 +#: cps/templates/config_edit.html:76 msgid "Regular expression for title sorting" msgstr "" -#: cps/templates/config_edit.html:84 +#: cps/templates/config_edit.html:80 msgid "Tags for Mature Content" msgstr "" -#: cps/templates/config_edit.html:100 +#: cps/templates/config_edit.html:96 msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "" -#: cps/templates/config_edit.html:106 +#: cps/templates/config_edit.html:102 msgid "Enable uploading" msgstr "" -#: cps/templates/config_edit.html:110 +#: cps/templates/config_edit.html:106 msgid "Enable anonymous browsing" msgstr "" -#: cps/templates/config_edit.html:114 +#: cps/templates/config_edit.html:110 msgid "Enable public registration" msgstr "" -#: cps/templates/config_edit.html:118 +#: cps/templates/config_edit.html:114 msgid "Enable remote login (\"magic link\")" msgstr "" -#: cps/templates/config_edit.html:123 +#: cps/templates/config_edit.html:119 msgid "Use" msgstr "" -#: cps/templates/config_edit.html:124 +#: cps/templates/config_edit.html:120 msgid "Obtain an API Key" msgstr "" -#: cps/templates/config_edit.html:128 +#: cps/templates/config_edit.html:124 msgid "Goodreads API Key" msgstr "" -#: cps/templates/config_edit.html:132 +#: cps/templates/config_edit.html:128 msgid "Goodreads API Secret" msgstr "" -#: cps/templates/config_edit.html:137 +#: cps/templates/config_edit.html:133 msgid "Default Settings for new users" msgstr "" -#: cps/templates/config_edit.html:140 cps/templates/user_edit.html:94 +#: cps/templates/config_edit.html:136 cps/templates/user_edit.html:102 msgid "Admin user" msgstr "" -#: cps/templates/config_edit.html:144 cps/templates/user_edit.html:103 +#: cps/templates/config_edit.html:140 cps/templates/user_edit.html:111 msgid "Allow Downloads" msgstr "" -#: cps/templates/config_edit.html:148 cps/templates/user_edit.html:107 +#: cps/templates/config_edit.html:144 cps/templates/user_edit.html:115 msgid "Allow Uploads" msgstr "" -#: cps/templates/config_edit.html:152 cps/templates/user_edit.html:111 +#: cps/templates/config_edit.html:148 cps/templates/user_edit.html:119 msgid "Allow Edit" msgstr "" -#: cps/templates/config_edit.html:156 cps/templates/user_edit.html:115 +#: cps/templates/config_edit.html:152 cps/templates/user_edit.html:123 msgid "Allow Delete books" msgstr "" -#: cps/templates/config_edit.html:160 cps/templates/user_edit.html:120 +#: cps/templates/config_edit.html:156 cps/templates/user_edit.html:128 msgid "Allow Changing Password" msgstr "" -#: cps/templates/config_edit.html:164 cps/templates/user_edit.html:124 +#: cps/templates/config_edit.html:160 cps/templates/user_edit.html:132 msgid "Allow Editing Public Shelfs" msgstr "" -#: cps/templates/config_edit.html:168 +#: cps/templates/config_edit.html:164 msgid "Default visiblities for new users" msgstr "" -#: cps/templates/config_edit.html:172 cps/templates/user_edit.html:46 +#: cps/templates/config_edit.html:168 cps/templates/user_edit.html:54 msgid "Show random books" msgstr "" -#: cps/templates/config_edit.html:176 cps/templates/user_edit.html:50 +#: cps/templates/config_edit.html:172 cps/templates/user_edit.html:58 msgid "Show recent books" msgstr "" -#: cps/templates/config_edit.html:180 cps/templates/user_edit.html:54 +#: cps/templates/config_edit.html:176 cps/templates/user_edit.html:62 msgid "Show sorted books" msgstr "" -#: cps/templates/config_edit.html:184 cps/templates/user_edit.html:58 +#: cps/templates/config_edit.html:180 cps/templates/user_edit.html:66 msgid "Show hot books" msgstr "" -#: cps/templates/config_edit.html:188 cps/templates/user_edit.html:62 +#: cps/templates/config_edit.html:184 cps/templates/user_edit.html:70 msgid "Show best rated books" msgstr "" -#: cps/templates/config_edit.html:192 cps/templates/user_edit.html:66 +#: cps/templates/config_edit.html:188 cps/templates/user_edit.html:74 msgid "Show language selection" msgstr "" -#: cps/templates/config_edit.html:196 cps/templates/user_edit.html:70 +#: cps/templates/config_edit.html:192 cps/templates/user_edit.html:78 msgid "Show series selection" msgstr "" -#: cps/templates/config_edit.html:200 cps/templates/user_edit.html:74 +#: cps/templates/config_edit.html:196 cps/templates/user_edit.html:82 msgid "Show category selection" msgstr "" -#: cps/templates/config_edit.html:204 cps/templates/user_edit.html:78 +#: cps/templates/config_edit.html:200 cps/templates/user_edit.html:86 msgid "Show author selection" msgstr "" -#: cps/templates/config_edit.html:208 cps/templates/user_edit.html:82 +#: cps/templates/config_edit.html:204 cps/templates/user_edit.html:90 msgid "Show read and unread" msgstr "" -#: cps/templates/config_edit.html:212 cps/templates/user_edit.html:86 +#: cps/templates/config_edit.html:208 cps/templates/user_edit.html:94 msgid "Show random books in detail view" msgstr "" -#: cps/templates/config_edit.html:216 cps/templates/user_edit.html:99 +#: cps/templates/config_edit.html:212 cps/templates/user_edit.html:107 msgid "Show mature content" msgstr "" -#: cps/templates/config_edit.html:226 cps/templates/layout.html:77 +#: cps/templates/config_edit.html:222 cps/templates/layout.html:79 #: cps/templates/login.html:4 msgid "Login" msgstr "" @@ -1040,12 +1056,12 @@ msgstr "" msgid "Save settings and send Test E-Mail" msgstr "" -#: cps/templates/feed.xml:20 cps/templates/layout.html:200 +#: cps/templates/feed.xml:20 cps/templates/layout.html:202 msgid "Next" msgstr "" #: cps/templates/feed.xml:29 cps/templates/index.xml:7 -#: cps/templates/layout.html:41 cps/templates/layout.html:42 +#: cps/templates/layout.html:43 cps/templates/layout.html:44 msgid "Search" msgstr "" @@ -1057,7 +1073,7 @@ msgstr "" msgid "Start" msgstr "" -#: cps/templates/index.xml:14 cps/templates/layout.html:134 +#: cps/templates/index.xml:14 cps/templates/layout.html:136 msgid "Hot Books" msgstr "" @@ -1065,7 +1081,7 @@ msgstr "" msgid "Popular publications from this catalog based on Downloads." msgstr "" -#: cps/templates/index.xml:20 cps/templates/layout.html:137 +#: cps/templates/index.xml:20 cps/templates/layout.html:139 msgid "Best rated Books" msgstr "" @@ -1085,7 +1101,7 @@ msgstr "" msgid "Show Random Books" msgstr "" -#: cps/templates/index.xml:52 cps/templates/layout.html:155 +#: cps/templates/index.xml:52 cps/templates/layout.html:157 msgid "Authors" msgstr "" @@ -1101,7 +1117,7 @@ msgstr "" msgid "Books ordered by series" msgstr "" -#: cps/templates/index.xml:70 cps/templates/layout.html:161 +#: cps/templates/index.xml:70 cps/templates/layout.html:163 msgid "Public Shelves" msgstr "" @@ -1109,7 +1125,7 @@ msgstr "" msgid "Books organized in public shelfs, visible to everyone" msgstr "" -#: cps/templates/index.xml:77 cps/templates/layout.html:165 +#: cps/templates/index.xml:77 cps/templates/layout.html:167 msgid "Your Shelves" msgstr "" @@ -1117,88 +1133,88 @@ msgstr "" msgid "User's own shelfs, only visible to the current user himself" msgstr "" -#: cps/templates/layout.html:31 +#: cps/templates/layout.html:33 msgid "Toggle navigation" msgstr "" -#: cps/templates/layout.html:52 +#: cps/templates/layout.html:54 msgid "Advanced Search" msgstr "" -#: cps/templates/layout.html:73 +#: cps/templates/layout.html:75 msgid "Logout" msgstr "" -#: cps/templates/layout.html:78 cps/templates/register.html:18 +#: cps/templates/layout.html:80 cps/templates/register.html:18 msgid "Register" msgstr "" -#: cps/templates/layout.html:103 +#: cps/templates/layout.html:105 msgid "Uploading..." msgstr "" -#: cps/templates/layout.html:104 +#: cps/templates/layout.html:106 msgid "please don't refresh the page" msgstr "" -#: cps/templates/layout.html:115 +#: cps/templates/layout.html:117 msgid "Browse" msgstr "" -#: cps/templates/layout.html:117 +#: cps/templates/layout.html:119 msgid "Recently Added" msgstr "" -#: cps/templates/layout.html:122 +#: cps/templates/layout.html:124 msgid "Sorted Books" msgstr "" -#: cps/templates/layout.html:126 cps/templates/layout.html:127 #: cps/templates/layout.html:128 cps/templates/layout.html:129 +#: cps/templates/layout.html:130 cps/templates/layout.html:131 msgid "Sort By" msgstr "" -#: cps/templates/layout.html:126 +#: cps/templates/layout.html:128 msgid "Newest" msgstr "" -#: cps/templates/layout.html:127 +#: cps/templates/layout.html:129 msgid "Oldest" msgstr "" -#: cps/templates/layout.html:128 +#: cps/templates/layout.html:130 msgid "Ascending" msgstr "" -#: cps/templates/layout.html:129 +#: cps/templates/layout.html:131 msgid "Descending" msgstr "" -#: cps/templates/layout.html:146 +#: cps/templates/layout.html:148 msgid "Discover" msgstr "" -#: cps/templates/layout.html:149 +#: cps/templates/layout.html:151 msgid "Categories" msgstr "" -#: cps/templates/layout.html:158 cps/templates/search_form.html:75 +#: cps/templates/layout.html:160 cps/templates/search_form.html:75 msgid "Languages" msgstr "" -#: cps/templates/layout.html:170 +#: cps/templates/layout.html:172 msgid "Create a Shelf" msgstr "" -#: cps/templates/layout.html:171 cps/templates/stats.html:3 +#: cps/templates/layout.html:173 cps/templates/stats.html:3 msgid "About" msgstr "" -#: cps/templates/layout.html:185 +#: cps/templates/layout.html:187 msgid "Previous" msgstr "" -#: cps/templates/layout.html:212 +#: cps/templates/layout.html:214 msgid "Book Details" msgstr "" @@ -1369,18 +1385,30 @@ msgid "Kindle E-Mail" msgstr "" #: cps/templates/user_edit.html:35 -msgid "Show books with language" +msgid "Theme" msgstr "" #: cps/templates/user_edit.html:37 +msgid "Standard Theme" +msgstr "" + +#: cps/templates/user_edit.html:38 +msgid "caliBlur! Dark Theme (Beta)" +msgstr "" + +#: cps/templates/user_edit.html:43 +msgid "Show books with language" +msgstr "" + +#: cps/templates/user_edit.html:45 msgid "Show all" msgstr "" -#: cps/templates/user_edit.html:131 +#: cps/templates/user_edit.html:139 msgid "Delete this user" msgstr "" -#: cps/templates/user_edit.html:146 +#: cps/templates/user_edit.html:154 msgid "Recent Downloads" msgstr "" diff --git a/optional-requirements.txt b/optional-requirements.txt index cf743dbb..ca86cc3a 100644 --- a/optional-requirements.txt +++ b/optional-requirements.txt @@ -1,15 +1,18 @@ -gevent==1.2.1 +# GDrive Integration google-api-python-client==1.6.1 +gevent==1.2.1 greenlet==0.4.12 httplib2==0.9.2 -lxml==3.7.2 oauth2client==4.0.0 +uritemplate==3.0.0 pyasn1-modules==0.0.8 pyasn1==0.1.9 PyDrive==1.3.1 PyYAML==3.12 rsa==3.4.2 six==1.10.0 -uritemplate==3.0.0 +# goodreads goodreads>=0.3.2 python-Levenshtein>=0.12.0 +# other +lxml==3.7.2 diff --git a/readme.md b/readme.md index 1469ebdc..3a253843 100755 --- a/readme.md +++ b/readme.md @@ -88,22 +88,22 @@ Once a project has been created, we need to create a client ID and a client secr The Drive API should now be setup and ready to use, so we need to integrate it into Calibre-Web. This is done as below: - 1. Open config page -2. Enter the location that will be used to store the metadata.db file, and to temporary store uploaded books and other temporary files for upload +2. Enter the location that will be used to store the metadata.db file locally, and to temporary store uploaded books and other temporary files for upload ("Location of Calibre database") 2. Tick Use Google Drive -3. Enter Client Secret and Client Key as provided via previous steps -4. Enter the folder that is the root of your calibre library -5. Enter base URL for calibre-web (used for google callbacks) -6. Click the "Submit" button -7. Come back to the configuration form -8. Now select Authenticate Google Drive -9. This should redirect you to google to allow it top use your Drive, and then redirect you back to the config page -10. Google Drive should now be connected and be used to get images and download Epubs. The metadata.db is stored in the calibre library location +3. Click the "Submit" button +4. Now select Authenticate Google Drive +5. This should redirect you to Google to allow it top use your Drive, and then redirect you back to the config page +6. Select the folder that is the root of your calibre library on Gdrive ("Google drive Calibre folder") +7. Click the "Submit" button +8. Google Drive should now be connected and be used to get images and download Epubs. The metadata.db is stored in the calibre library location ### Optional If your calibre web is using https, it is possible to add a "watch" to the drive. This will inform us if the metadata.db file is updated and allow us to update our calibre library accordingly. +Additionally the public adress your server uses (e.g.https://example.com) has to be verified in the Google developer console. After this is done, please wait a few minutes. -11. Click enable watch of metadata.db -12. Note that this expires after a week, so will need to be manually refresh +9. Open config page +10. Click enable watch of metadata.db +11. Note that this expires after a week, so will need to be manually refresh ## Docker image diff --git a/requirements.txt b/requirements.txt index e33778a9..a5f80c0f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ Babel>=1.3 -Flask-Babel==0.11.1 +Flask-Babel>=0.11.1 Flask-Login>=0.3.2 Flask-Principal>=0.3.2 singledispatch>=3.4.0.0