From e254565901bd443b25ad81d16a752f9594eb1cea Mon Sep 17 00:00:00 2001 From: Daniel Pavel Date: Mon, 10 Jun 2019 20:19:27 +0300 Subject: [PATCH 1/4] support binding the http server to a unix socket file instead of TCP socket --- cps.py | 5 +- cps/__init__.py | 6 +- cps/about.py | 5 +- cps/admin.py | 12 +-- cps/logger.py | 61 ++++++++------- cps/server.py | 201 +++++++++++++++++++++++++----------------------- cps/ub.py | 34 ++++---- cps/updater.py | 5 +- 8 files changed, 165 insertions(+), 164 deletions(-) diff --git a/cps.py b/cps.py index c5ac1e7d..16d84957 100755 --- a/cps.py +++ b/cps.py @@ -28,8 +28,8 @@ sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'vendor from cps import create_app +from cps import web_server from cps.opds import opds -from cps import Server from cps.web import web from cps.jinjia import jinjia from cps.about import about @@ -56,7 +56,8 @@ def main(): app.register_blueprint(editbook) if oauth_available: app.register_blueprint(oauth) - Server.startServer() + success = web_server.start() + sys.exit(0 if success else 1) if __name__ == '__main__': diff --git a/cps/__init__.py b/cps/__init__.py index 1d3d598d..50bd1781 100755 --- a/cps/__init__.py +++ b/cps/__init__.py @@ -84,8 +84,8 @@ searched_ids = {} from .worker import WorkerThread global_WorkerThread = WorkerThread() -from .server import server -Server = server() +from .server import WebServer +web_server = WebServer() from .ldap import Ldap ldap = Ldap() @@ -103,7 +103,7 @@ def create_app(): Principal(app) lm.init_app(app) app.secret_key = os.getenv('SECRET_KEY', 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT') - Server.init_app(app) + web_server.init_app(app, config) db.setup_db() babel.init_app(app) ldap.init_app(app) diff --git a/cps/about.py b/cps/about.py index bc7b0e8a..162a4191 100644 --- a/cps/about.py +++ b/cps/about.py @@ -41,8 +41,9 @@ from jinja2 import __version__ as jinja2Version from pytz import __version__ as pytzVersion from sqlalchemy import __version__ as sqlalchemyVersion -from . import db, converter, Server, uploader +from . import db, converter, uploader from .isoLanguages import __version__ as iso639Version +from .server import VERSION as serverVersion from .web import render_title_template @@ -71,7 +72,7 @@ def stats(): versions['pySqlite'] = 'v' + db.engine.dialect.dbapi.version versions['Sqlite'] = 'v' + db.engine.dialect.dbapi.sqlite_version versions.update(converter.versioncheck()) - versions.update(Server.getNameVersion()) + versions.update(serverVersion) versions['Python'] = sys.version return render_title_template('stats.html', bookcounter=counter, authorcounter=authors, versions=versions, categorycounter=categorys, seriecounter=series, title=_(u"Statistics"), page="stat") diff --git a/cps/admin.py b/cps/admin.py index f6fd838f..a4473fdd 100644 --- a/cps/admin.py +++ b/cps/admin.py @@ -41,7 +41,7 @@ from sqlalchemy.exc import IntegrityError from werkzeug.security import generate_password_hash from . import constants, logger, ldap -from . import db, ub, Server, get_locale, config, updater_thread, babel, gdriveutils +from . import db, ub, web_server, get_locale, config, updater_thread, babel, gdriveutils from .helper import speaking_language, check_valid_domain, check_unrar, send_test_mail, generate_random_password, \ send_registration_mail from .gdriveutils import is_gdrive_ready, gdrive_support, downloadFile, deleteDatabaseOnChange, listRootFolders @@ -102,12 +102,10 @@ def shutdown(): showtext = {} if task == 0: showtext['text'] = _(u'Server restarted, please reload page') - Server.setRestartTyp(True) else: showtext['text'] = _(u'Performing shutdown of server, please close window') - Server.setRestartTyp(False) # stop gevent/tornado server - Server.stopServer() + web_server.stop(task == 0) return json.dumps(showtext) else: if task == 2: @@ -220,8 +218,7 @@ def view_configuration(): # ub.session.close() # ub.engine.dispose() # stop Server - Server.setRestartTyp(True) - Server.stopServer() + web_server.stop(True) log.info('Reboot required, restarting') readColumn = db.session.query(db.Custom_Columns)\ .filter(and_(db.Custom_Columns.datatype == 'bool',db.Custom_Columns.mark_for_delete == 0)).all() @@ -554,8 +551,7 @@ def configuration_helper(origin): title=_(u"Basic Configuration"), page="config") if reboot_required: # stop Server - Server.setRestartTyp(True) - Server.stopServer() + web_server.stop(True) log.info('Reboot required, restarting') if origin: success = True diff --git a/cps/logger.py b/cps/logger.py index c249cad7..408a9c02 100644 --- a/cps/logger.py +++ b/cps/logger.py @@ -25,6 +25,7 @@ from logging.handlers import RotatingFileHandler from .constants import BASE_DIR as _BASE_DIR + ACCESS_FORMATTER_GEVENT = Formatter("%(message)s") ACCESS_FORMATTER_TORNADO = Formatter("[%(asctime)s] %(message)s") @@ -33,7 +34,6 @@ DEFAULT_LOG_LEVEL = logging.INFO DEFAULT_LOG_FILE = os.path.join(_BASE_DIR, "calibre-web.log") DEFAULT_ACCESS_LOG = os.path.join(_BASE_DIR, "access.log") LOG_TO_STDERR = '/dev/stderr' -DEFAULT_ACCESS_LEVEL= logging.INFO logging.addLevelName(logging.WARNING, "WARN") logging.addLevelName(logging.CRITICAL, "CRIT") @@ -73,35 +73,26 @@ def is_valid_logfile(file_path): return (not log_dir) or os.path.isdir(log_dir) -def setup(log_file, log_level=None, logger=None): - if logger != "access" and logger != "tornado.access": - formatter = FORMATTER - default_file = DEFAULT_LOG_FILE - else: - if logger == "tornado.access": - formatter = ACCESS_FORMATTER_TORNADO - else: - formatter = ACCESS_FORMATTER_GEVENT - default_file = DEFAULT_ACCESS_LOG +def _absolute_log_file(log_file, default_log_file): if log_file: if not os.path.dirname(log_file): log_file = os.path.join(_BASE_DIR, log_file) - log_file = os.path.abspath(log_file) - else: - log_file = LOG_TO_STDERR - # log_file = default_file + return os.path.abspath(log_file) - # print ('%r -- %r' % (log_level, log_file)) - if logger != "access" and logger != "tornado.access": - r = logging.root - else: - r = logging.getLogger(logger) - r.propagate = False + return default_log_file + + +def setup(log_file, log_level=None): + ''' + Configure the logging output. + May be called multiple times. + ''' + log_file = _absolute_log_file(log_file, DEFAULT_LOG_FILE) + + r = logging.root r.setLevel(log_level or DEFAULT_LOG_LEVEL) previous_handler = r.handlers[0] if r.handlers else None - # print ('previous %r' % previous_handler) - if previous_handler: # if the log_file has not changed, don't create a new handler if getattr(previous_handler, 'baseFilename', None) == log_file: @@ -115,16 +106,32 @@ def setup(log_file, log_level=None, logger=None): try: file_handler = RotatingFileHandler(log_file, maxBytes=50000, backupCount=2) except IOError: - if log_file == default_file: + if log_file == DEFAULT_LOG_FILE: raise - file_handler = RotatingFileHandler(default_file, maxBytes=50000, backupCount=2) - file_handler.setFormatter(formatter) + file_handler = RotatingFileHandler(DEFAULT_LOG_FILE, maxBytes=50000, backupCount=2) + file_handler.setFormatter(FORMATTER) for h in r.handlers: r.removeHandler(h) h.close() r.addHandler(file_handler) - # print ('new handler %r' % file_handler) + + +def create_access_log(log_file, log_name, formatter): + ''' + One-time configuration for the web server's access log. + ''' + log_file = _absolute_log_file(log_file, DEFAULT_ACCESS_LOG) + logging.debug("access log: %s", log_file) + + access_log = logging.getLogger(log_name) + access_log.propagate = False + access_log.setLevel(logging.INFO) + + file_handler = RotatingFileHandler(log_file, maxBytes=50000, backupCount=2) + file_handler.setFormatter(formatter) + access_log.addHandler(file_handler) + return access_log # Enable logging of smtp lib debug output diff --git a/cps/server.py b/cps/server.py index 88c54c78..16b20549 100644 --- a/cps/server.py +++ b/cps/server.py @@ -20,54 +20,55 @@ from __future__ import division, print_function, unicode_literals import sys import os +import errno import signal import socket -import logging try: from gevent.pywsgi import WSGIServer from gevent.pool import Pool - from gevent import __version__ as geventVersion - gevent_present = True + from gevent import __version__ as _version + VERSION = {'Gevent': 'v' + _version} + _GEVENT = True except ImportError: from tornado.wsgi import WSGIContainer from tornado.httpserver import HTTPServer from tornado.ioloop import IOLoop - from tornado import version as tornadoVersion - from tornado import log as tornadoLog - from tornado import options as tornadoOptions - gevent_present = False + from tornado import version as _version + VERSION = {'Tornado': 'v' + _version} + _GEVENT = False -from . import logger, config, global_WorkerThread +from . import logger, global_WorkerThread log = logger.create() -class server: - - wsgiserver = None - restart = False - app = None - access_logger = None +class WebServer: def __init__(self): - signal.signal(signal.SIGINT, self.killServer) - signal.signal(signal.SIGTERM, self.killServer) + signal.signal(signal.SIGINT, self._killServer) + signal.signal(signal.SIGTERM, self._killServer) - def init_app(self, application): - self.app = application - self.port = config.config_port - self.listening = config.get_config_ipaddress(readable=True) + ":" + str(self.port) + self.wsgiserver = None self.access_logger = None + self.restart = False + self.app = None + self.listen_address = None + self.listen_port = None + self.unix_socket_file = None + self.ssl_args = None + + def init_app(self, application, config): + self.app = application + self.listen_address = config.get_config_ipaddress() + self.listen_port = config.config_port + if config.config_access_log: - if gevent_present: - logger.setup(config.config_access_logfile, logger.DEFAULT_ACCESS_LEVEL, "access") - self.access_logger = logging.getLogger("access") - else: - logger.setup(config.config_access_logfile, logger.DEFAULT_ACCESS_LEVEL, "tornado.access") + log_name = "gevent.access" if _GEVENT else "tornado.access" + formatter = logger.ACCESS_FORMATTER_GEVENT if _GEVENT else logger.ACCESS_FORMATTER_TORNADO + self.access_logger = logger.create_access_log(config.config_access_logfile, log_name, formatter) - self.ssl_args = None certfile_path = config.get_config_certfile() keyfile_path = config.get_config_keyfile() if certfile_path and keyfile_path: @@ -79,22 +80,46 @@ class server: log.warning('Cert path: %s', certfile_path) log.warning('Key path: %s', keyfile_path) + def _make_gevent_unix_socket(self, socket_file): + # the socket file must not exist prior to bind() + if os.path.exists(socket_file): + # avoid nuking regular files and symbolic links (could be a mistype or security issue) + if os.path.isfile(socket_file) or os.path.islink(socket_file): + raise OSError(errno.EEXIST, os.strerror(errno.EEXIST), socket_file) + os.remove(socket_file) + + unix_sock = WSGIServer.get_listener(socket_file, family=socket.AF_UNIX) + self.unix_socket_file = socket_file + + # ensure current user and group have r/w permissions, no permissions for other users + # this way the socket can be shared in a semi-secure manner + # between the user running calibre-web and the user running the fronting webserver + os.chmod(socket_file, 0o660); + + return unix_sock + def _make_gevent_socket(self): - if config.get_config_ipaddress(): - return (config.get_config_ipaddress(), self.port) + if os.name != 'nt': + unix_socket_file = os.environ.get("CALIBRE_UNIX_SOCKET") + if unix_socket_file: + return self._make_gevent_unix_socket(unix_socket_file) + + if self.listen_address: + return (self.listen_address, self.listen_port) + if os.name == 'nt': - return ('0.0.0.0', self.port) + return ('0.0.0.0', self.listen_port) + address = ('', self.listen_port) try: - s = WSGIServer.get_listener(('', self.port), family=socket.AF_INET6) + sock = WSGIServer.get_listener(address, family=socket.AF_INET6) except socket.error as ex: log.error('%s', ex) log.warning('Unable to listen on \'\', trying on IPv4 only...') - s = WSGIServer.get_listener(('', self.port), family=socket.AF_INET) - log.debug("%r %r", s._sock, s._sock.getsockname()) - return s + sock = WSGIServer.get_listener(address, family=socket.AF_INET) + return sock - def start_gevent(self): + def _start_gevent(self): ssl_args = self.ssl_args or {} log.info('Starting Gevent server') @@ -102,78 +127,58 @@ class server: sock = self._make_gevent_socket() self.wsgiserver = WSGIServer(sock, self.app, log=self.access_logger, spawn=Pool(), **ssl_args) self.wsgiserver.serve_forever() - except socket.error: - try: - log.info('Unable to listen on "", trying on "0.0.0.0" only...') - self.wsgiserver = WSGIServer(('0.0.0.0', config.config_port), self.app, spawn=Pool(), **ssl_args) - self.wsgiserver.serve_forever() - except (OSError, socket.error) as e: - log.info("Error starting server: %s", e.strerror) - print("Error starting server: %s" % e.strerror) - global_WorkerThread.stop() - sys.exit(1) - except Exception: - log.exception("Unknown error while starting gevent") - sys.exit(0) - - def start_tornado(self): - log.info('Starting Tornado server on %s', self.listening) - + finally: + if self.unix_socket_file: + os.remove(self.unix_socket_file) + self.unix_socket_file = None + + def _start_tornado(self): + log.info('Starting Tornado server on %s', self.listen_address) + + # Max Buffersize set to 200MB ) + http_server = HTTPServer(WSGIContainer(self.app), + max_buffer_size = 209700000, + ssl_options=self.ssl_args) + http_server.listen(self.listen_port, self.listen_address) + self.wsgiserver=IOLoop.instance() + self.wsgiserver.start() + # wait for stop signal + self.wsgiserver.close(True) + + def start(self): try: - # Max Buffersize set to 200MB ) - http_server = HTTPServer(WSGIContainer(self.app), - max_buffer_size = 209700000, - ssl_options=self.ssl_args) - address = config.get_config_ipaddress() - http_server.listen(self.port, address) - self.wsgiserver=IOLoop.instance() - self.wsgiserver.start() - # wait for stop signal - self.wsgiserver.close(True) - except socket.error as err: - log.exception("Error starting tornado server") - print("Error starting server: %s" % err.strerror) + if _GEVENT: + # leave subprocess out to allow forking for fetchers and processors + self._start_gevent() + else: + self._start_tornado() + except Exception as ex: + log.error("Error starting server: %s", ex) + print("Error starting server: %s" % ex) + return False + finally: + self.wsgiserver = None global_WorkerThread.stop() - sys.exit(1) - - def startServer(self): - if gevent_present: - # leave subprocess out to allow forking for fetchers and processors - self.start_gevent() - else: - self.start_tornado() - if self.restart is True: - log.info("Performing restart of Calibre-Web") - global_WorkerThread.stop() - if os.name == 'nt': - arguments = ["\"" + sys.executable + "\""] - for e in sys.argv: - arguments.append("\"" + e + "\"") - os.execv(sys.executable, arguments) - else: - os.execl(sys.executable, sys.executable, *sys.argv) - else: + if not self.restart: log.info("Performing shutdown of Calibre-Web") - global_WorkerThread.stop() - sys.exit(0) + return True - def setRestartTyp(self,starttyp): - self.restart = starttyp + log.info("Performing restart of Calibre-Web") + arguments = list(sys.argv) + arguments.insert(0, sys.executable) + if os.name == 'nt': + arguments = ["\"%s\"" % a for a in arguments] + os.execv(sys.executable, arguments) + return True - def killServer(self, signum, frame): - self.stopServer() + def _killServer(self, signum, frame): + self.stop() - def stopServer(self): + def stop(self, restart=False): + self.restart = restart if self.wsgiserver: - if gevent_present: + if _GEVENT: self.wsgiserver.close() else: self.wsgiserver.add_callback(self.wsgiserver.stop) - - @staticmethod - def getNameVersion(): - if gevent_present: - return {'Gevent': 'v' + geventVersion} - else: - return {'Tornado': 'v' + tornadoVersion} diff --git a/cps/ub.py b/cps/ub.py index 70d97a20..52e8423c 100644 --- a/cps/ub.py +++ b/cps/ub.py @@ -476,35 +476,27 @@ class Config: def get_config_certfile(self): if cli.certfilepath: return cli.certfilepath - else: - if cli.certfilepath is "": - return None - else: - return self.config_certfile + if cli.certfilepath is "": + return None + return self.config_certfile def get_config_keyfile(self): if cli.keyfilepath: return cli.keyfilepath - else: - if cli.certfilepath is "": - return None - else: - return self.config_keyfile + if cli.certfilepath is "": + return None + return self.config_keyfile def get_config_ipaddress(self, readable=False): if not readable: - if cli.ipadress: - return cli.ipadress + return cli.ipadress or "" + answer="0.0.0.0" + if cli.ipadress: + if cli.ipv6: + answer = "["+cli.ipadress+"]" else: - return "" - else: - answer="0.0.0.0" - if cli.ipadress: - if cli.ipv6: - answer = "["+cli.ipadress+"]" - else: - answer = cli.ipadress - return answer + answer = cli.ipadress + return answer def _has_role(self, role_flag): return constants.has_flag(self.config_default_role, role_flag) diff --git a/cps/updater.py b/cps/updater.py index 28be3b3a..33012db1 100644 --- a/cps/updater.py +++ b/cps/updater.py @@ -33,7 +33,7 @@ from tempfile import gettempdir from babel.dates import format_datetime from flask_babel import gettext as _ -from . import constants, logger, config, get_locale, Server +from . import constants, logger, config, get_locale, web_server log = logger.create() @@ -95,8 +95,7 @@ class Updater(threading.Thread): self.status = 6 log.debug(u'Preparing restart of server') time.sleep(2) - Server.setRestartTyp(True) - Server.stopServer() + web_server.stop(True) self.status = 7 time.sleep(2) except requests.exceptions.HTTPError as ex: From 5c7aeb2f2ce411975fae595adde4a4dead929eaa Mon Sep 17 00:00:00 2001 From: Ozzieisaacs Date: Thu, 20 Jun 2019 20:12:01 +0200 Subject: [PATCH 2/4] Change GDrive --- cps/admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cps/admin.py b/cps/admin.py index f6fd838f..0efc219b 100644 --- a/cps/admin.py +++ b/cps/admin.py @@ -559,7 +559,7 @@ def configuration_helper(origin): log.info('Reboot required, restarting') if origin: success = True - if is_gdrive_ready() and feature_support['gdrive'] is True: # and config.config_use_google_drive == True: + if is_gdrive_ready() and feature_support['gdrive'] is True and config.config_use_google_drive == True: gdrivefolders = listRootFolders() else: gdrivefolders = list() From 32af660f86349f03c92f68fd57eadc835af02e11 Mon Sep 17 00:00:00 2001 From: Ozzieisaacs Date: Sat, 22 Jun 2019 10:55:09 +0200 Subject: [PATCH 3/4] Improvements for logfile viewer Fix for tornado-server with deactivated accesslog doesn't log to normal log anymore Merge from master for unique user ids, get_metadata, fix Goodreads integration Update Translation (merge NL, update DE) --- cps/admin.py | 41 +- cps/logger.py | 8 + cps/oauth_bb.py | 2 +- cps/server.py | 3 + cps/static/css/style.css | 11 + cps/static/js/get_meta.js | 19 +- cps/static/js/logviewer.js | 679 +------- cps/templates/admin.html | 2 +- cps/templates/logviewer.html | 144 +- cps/translations/de/LC_MESSAGES/messages.mo | Bin 51380 -> 52969 bytes cps/translations/de/LC_MESSAGES/messages.po | 738 +++++---- cps/translations/es/LC_MESSAGES/messages.mo | Bin 51153 -> 44274 bytes cps/translations/es/LC_MESSAGES/messages.po | 666 ++++---- cps/translations/fr/LC_MESSAGES/messages.mo | Bin 52844 -> 47514 bytes cps/translations/fr/LC_MESSAGES/messages.po | 666 ++++---- cps/translations/hu/LC_MESSAGES/messages.mo | Bin 51639 -> 44426 bytes cps/translations/hu/LC_MESSAGES/messages.po | 666 ++++---- cps/translations/it/LC_MESSAGES/messages.mo | Bin 50986 -> 46797 bytes cps/translations/it/LC_MESSAGES/messages.po | 666 ++++---- cps/translations/ja/LC_MESSAGES/messages.mo | Bin 55521 -> 47594 bytes cps/translations/ja/LC_MESSAGES/messages.po | 666 ++++---- cps/translations/km/LC_MESSAGES/messages.mo | Bin 61016 -> 32544 bytes cps/translations/km/LC_MESSAGES/messages.po | 660 ++++---- cps/translations/nl/LC_MESSAGES/messages.mo | Bin 50345 -> 46991 bytes cps/translations/nl/LC_MESSAGES/messages.po | 1362 +++++++++-------- cps/translations/pl/LC_MESSAGES/messages.mo | Bin 49865 -> 28814 bytes cps/translations/pl/LC_MESSAGES/messages.po | 660 ++++---- cps/translations/ru/LC_MESSAGES/messages.mo | Bin 61864 -> 52816 bytes cps/translations/ru/LC_MESSAGES/messages.po | 666 ++++---- cps/translations/sv/LC_MESSAGES/messages.mo | Bin 50766 -> 44899 bytes cps/translations/sv/LC_MESSAGES/messages.po | 666 ++++---- cps/translations/uk/LC_MESSAGES/messages.mo | Bin 59460 -> 42578 bytes cps/translations/uk/LC_MESSAGES/messages.po | 660 ++++---- .../zh_Hans_CN/LC_MESSAGES/messages.mo | Bin 49566 -> 42762 bytes .../zh_Hans_CN/LC_MESSAGES/messages.po | 666 ++++---- cps/ub.py | 43 +- messages.pot | 646 ++++---- 37 files changed, 5756 insertions(+), 5250 deletions(-) diff --git a/cps/admin.py b/cps/admin.py index 5990d43d..449c5684 100644 --- a/cps/admin.py +++ b/cps/admin.py @@ -62,12 +62,6 @@ except ImportError: # except ImportError: # feature_support['rar'] = False -'''try: - import ldap - feature_support['ldap'] = True -except ImportError: - feature_support['ldap'] = False''' - try: from oauth_bb import oauth_check feature_support['oauth'] = True @@ -399,14 +393,14 @@ def configuration_helper(origin): flash(_(u'Please enter a LDAP provider, port, DN and user object identifier'), category="error") return render_title_template("config_edit.html", content=config, origin=origin, gdrive=gdriveutils.gdrive_support, gdriveError=gdriveError, - goodreads=goodreads_support, title=_(u"Basic Configuration"), + feature_support=feature_support, title=_(u"Basic Configuration"), page="config") elif not to_save["config_ldap_serv_username"] or not to_save["config_ldap_serv_password"]: ub.session.commit() flash(_(u'Please enter a LDAP service account and password'), category="error") return render_title_template("config_edit.html", content=config, origin=origin, gdrive=gdriveutils.gdrive_support, gdriveError=gdriveError, - goodreads=goodreads_support, title=_(u"Basic Configuration"), + feature_support=feature_support, title=_(u"Basic Configuration"), page="config") else: content.config_use_ldap = 1 @@ -439,7 +433,7 @@ def configuration_helper(origin): 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=gdriveutils.gdrive_support, gdriveError=gdriveError, - goodreads=goodreads_support, title=_(u"Basic Configuration"), + feature_support=feature_support, title=_(u"Basic Configuration"), page="config") # Remote login configuration @@ -576,9 +570,6 @@ def new_user(): to_save = request.form.to_dict() content.default_language = to_save["default_language"] content.mature_content = "Show_mature_content" in to_save - dat = datetime.strptime("1.1.2019", "%d.%m.%Y") - content.id = int(time.time()*100) - # val= int(uuid.uuid4()) if "locale" in to_save: content.locale = to_save["locale"] @@ -800,19 +791,27 @@ def reset_password(user_id): @login_required @admin_required def view_logfile(): - perpage_p = {0:"30",1:"40",2:"100"} - for key, value in perpage_p.items(): - print(key) - print(value) - return render_title_template("logviewer.html",title=_(u"Logfile viewer"), perpage_p=perpage_p, perpage = 30, - page="logfile") + logfiles = {} + logfiles[0] = logger.get_logfile(config.config_logfile) + logfiles[1] = logger.get_accesslogfile(config.config_access_logfile) + return render_title_template("logviewer.html",title=_(u"Logfile viewer"), accesslog_enable=config.config_access_log, + logfiles=logfiles, page="logfile") -@admi.route("/ajax/accesslog") +@admi.route("/ajax/log/") @login_required @admin_required -def send_logfile(): - return send_from_directory(constants.BASE_DIR,"access.log") +def send_logfile(logtype): + if logtype == 1: + logfile = logger.get_accesslogfile(config.config_access_logfile) + return send_from_directory(os.path.dirname(logfile), + os.path.basename(logfile)) + if logtype == 0: + logfile = logger.get_logfile(config.config_logfile) + return send_from_directory(os.path.dirname(logfile), + os.path.basename(logfile)) + else: + return "" @admi.route("/get_update_status", methods=['GET']) diff --git a/cps/logger.py b/cps/logger.py index 408a9c02..6b13f50d 100644 --- a/cps/logger.py +++ b/cps/logger.py @@ -82,6 +82,14 @@ def _absolute_log_file(log_file, default_log_file): return default_log_file +def get_logfile(log_file): + return _absolute_log_file(log_file, DEFAULT_LOG_FILE) + + +def get_accesslogfile(log_file): + return _absolute_log_file(log_file, DEFAULT_ACCESS_LOG) + + def setup(log_file, log_level=None): ''' Configure the logging output. diff --git a/cps/oauth_bb.py b/cps/oauth_bb.py index 3a48798a..f258e706 100644 --- a/cps/oauth_bb.py +++ b/cps/oauth_bb.py @@ -88,7 +88,7 @@ def register_user_with_oauth(user=None): if len(all_oauth.keys()) == 0: return if user is None: - flash(_(u"Register with %s" % ", ".join(list(all_oauth.values()))), category="success") + flash(_(u"Register with %(provider)s", provider=", ".join(list(all_oauth.values()))), category="success") else: for oauth in all_oauth.keys(): # Find this OAuth token in the database, or create it diff --git a/cps/server.py b/cps/server.py index 0b592480..70efcacd 100644 --- a/cps/server.py +++ b/cps/server.py @@ -70,6 +70,9 @@ class WebServer: log_name = "gevent.access" if _GEVENT else "tornado.access" formatter = logger.ACCESS_FORMATTER_GEVENT if _GEVENT else logger.ACCESS_FORMATTER_TORNADO self.access_logger = logger.create_access_log(config.config_access_logfile, log_name, formatter) + else: + if not _GEVENT: + logger.get('tornado.access').disabled = True certfile_path = config.get_config_certfile() keyfile_path = config.get_config_keyfile() diff --git a/cps/static/css/style.css b/cps/static/css/style.css index b1edd2ec..1880207a 100644 --- a/cps/static/css/style.css +++ b/cps/static/css/style.css @@ -145,3 +145,14 @@ input.pill:not(:checked) + label .glyphicon { max-height:300px; overflow-y: auto; } + +div.log { + font-family: Courier New; + font-size: 12px; + box-sizing: border-box; + height: 700px; + overflow-y: scroll; + border: 1px solid #ddd; + white-space: nowrap; + padding: 0.5em; +} diff --git a/cps/static/js/get_meta.js b/cps/static/js/get_meta.js index 7c5dbe4f..cf079ba7 100644 --- a/cps/static/js/get_meta.js +++ b/cps/static/js/get_meta.js @@ -20,16 +20,16 @@ * Douban Books api document: https://developers.douban.com/wiki/?title=book_v2 (Chinese Only) */ /* global _, i18nMsg, tinymce */ -var dbResults = []; +// var dbResults = []; var ggResults = []; $(function () { var msg = i18nMsg; /*var douban = "https://api.douban.com"; var dbSearch = "/v2/book/search";*/ - var dbDone = true; + // var dbDone = true; - var google = "https://www.googleapis.com/"; + var google = "https://www.googleapis.com"; var ggSearch = "/books/v1/volumes"; var ggDone = false; @@ -56,11 +56,9 @@ $(function () { if (showFlag === 1) { $("#meta-info").html("
    "); } - if (ggDone && dbDone) { - if (!ggResults && !dbResults) { - $("#meta-info").html("

    " + msg.no_result + "

    "); - return; - } + if (!ggDone) { + $("#meta-info").html("

    " + msg.no_result + "

    "); + return; } if (ggDone && ggResults.length > 0) { ggResults.forEach(function(result) { @@ -137,7 +135,10 @@ $(function () { dataType: "jsonp", jsonp: "callback", success: function success(data) { - ggResults = data.items; + if ("items" in data) { + ggResults = data.items; + ggDone = true; + } }, complete: function complete() { ggDone = true; diff --git a/cps/static/js/logviewer.js b/cps/static/js/logviewer.js index 77c63a3f..1eea3005 100644 --- a/cps/static/js/logviewer.js +++ b/cps/static/js/logviewer.js @@ -1,609 +1,74 @@ -var threadregexp = /(?:^| - )(\[[^\]]*\]):/; - -var colors = ["#ffa", "#aaf", "#afa", "#aff", "#faf", "#aaa", "#fd8", "#f80", "#4df", "#4fc", "#76973c", "#7e56d8", "#99593d", "#37778a", "#4068fc"]; -var screenlines = 1; - -var file = null; -var text; - -var current, nextFilterId = 1; -var shl = null; -var hl = []; -var groupwith = false; -var filterswitch = true; - -var selectedlineid = -1; -var selectedthread = null; -var reachedbottom = false; -var reachedtop = false; - - -function wheelscroll(event) -{ - renderincremental(event.deltaY); -} - -function keypress(event) -{ - if (event.key == "PageDown") { - _render(screenlines - 1); - event.preventDefault(); - } - if (event.key == "PageUp") { - _render(-(screenlines - 1)); - event.preventDefault(); - } - if (event.key == "Home" && event.ctrlKey) { - selectedlineid = 0; - render(); - event.preventDefault(); - } - if (event.key == "End" && event.ctrlKey) { - selectedlineid = text.length - 1; - render(); - event.preventDefault(); - } - if (event.key == "ArrowUp") { - renderincremental(-1); - event.preventDefault(); - } - if (event.key == "ArrowDown") { - renderincremental(1); - event.preventDefault(); - } -} - -function init(filename) { - document.addEventListener("wheel", wheelscroll, false); - document.addEventListener("keypress", keypress, false); - window.addEventListener("resize", resize, false); - - _resize(); - - var s = document.getElementById("search"); - s.value = ""; - selectfilter(0); - reload(filename); -} - -function _resize() -{ - var d = document.getElementById("renderer"); - var t = document.getElementById("toobar"); - screenlines = Math.floor((window.innerHeight - t.offsetHeight) / d.firstChild.offsetHeight) - 1; -} - -function resize() -{ - _resize(); - repaint(); -} - -function reload(filename) -{ - if (shl) shl.cache = {}; - for (_hl of hl) _hl.cache = {}; - - var q = filename; - document.title = "Log: " + (q || "none loaded"); - if (!q) - return; - - var d = document.getElementById("renderer"); - d.innerHTML = "loading " + q + "..."; - - var r = new XMLHttpRequest(); - r.open("GET", "/ajax/accesslog", true); - r.responseType = 'text'; - r.onload = function() { - console.log("prepare"); - prepare(r.responseText); - if (selectedlineid > text.length) { - selectedlineid = -1; - } - console.log("render"); - render(); - }; - r.send(); -} - -function _sanitize(t) -{ - t = t - .replace(/&/g, "&") - .replace(/ /g, " ") - .replace(//g, ">"); - - return t; -} - -function _prepare(t) -{ - // sanitization happens in render, since otherwise it eats enormous amount of memory. - /* - var t = t.split('\n'); - for (var i in t) { - t[i] = _sanitize(t[i]); - } - return t; - */ - return /*_sanitize*/(t).split('\n'); -} - -function prepare(t) -{ - text = _prepare(t); -} - -function render() -{ - _render(0, false); // completely redraws the view from the current scroll position -} - -function repaint() -{ - _render(0, true); // completely redraws the view, but centers the selected line -} - -function renderincremental(difference) -{ - _render(difference); // "scrolls" the view -} - -function _render(increment, repaintonly) -{ - var epoch = new Date(); - - var d = document.getElementById("renderer"); - var filter = _gfilteron(); - - function process(i, append) - { - var t = _sanitize(text[i]); - - var lhl = false; - function dohl(_hl) - { - if (_hl.cache[i] === false) { - // lhl is here unaffected - return t; - } - - var t2 = t.replace(new RegExp("(" + _hl.text_r + ")", "g"), "$1"); - var affecting = (t != t2); - _hl.cache[i] = affecting; - lhl = lhl || (affecting && (!filter || _hl.filter)); - return t2; - } - - for (var h in hl) - t = dohl(hl[h]); - if (shl) - t = dohl(shl); - - if (filter && !lhl && i != selectedlineid) { - return false; - } - - lhl = lhl && !filter; - var div = document.createElement("div"); - div.id = i; - if (lhl) div.className = 'lhl'; - div.onclick = function() { selectline(this); }; - div.innerHTML = t; - if (t.match(new RegExp(selectedthread, "g"))) div.className += ' thread'; - - if (append) - d.appendChild(div); - else - d.insertBefore(div, d.firstChild); - - return true; - } - - var lefttodraw = Math.floor(Math.abs(increment)); - - if (increment < 0) { - // scroll up - reachedbottom = false; - if (reachedtop) { - _hint("reached top of the file"); - return; - } - for (var i = parseInt(d.firstChild.id) - 1; lefttodraw && i >= 0 && i < text.length; --i) { - if (process(i, false)) { - --lefttodraw; - if (d.childNodes.length > screenlines) - d.removeChild(d.lastChild); - } - } - if (lefttodraw) { - _hint("reached top of the file"); - reachedtop = true; - } - } else if (increment > 0) { - // scroll down - reachedtop = false; - if (reachedbottom) { - _hint("reached bottom of the file"); - return; - } - for (var i = parseInt(d.lastChild.id) + 1; lefttodraw && i < text.length; ++i) { - if (process(i, true)) { - --lefttodraw; - if (d.childNodes.length > screenlines) - d.removeChild(d.firstChild); - } - } - if (lefttodraw) { - _hint("reached bottom of the file"); - reachedbottom = true; - } - } else { // == 0 - // redraw all - reachedbottom = false; - reachedtop = false; - lefttodraw = screenlines; - var i = repaintonly ? parseInt(d.firstChild.id) : selectedlineid; - if (i < 0) i = 0; - - d.innerHTML = ""; - for (; lefttodraw && i < text.length; ++i) { - if (process(i, true)) { - --lefttodraw; - } - } - - if (!repaintonly && selectedlineid > -1) { - // center the selected line in the middle of screen! - _render(-(screenlines / 2)); - } - } - - selectline(selectedlineid); - - var now = new Date(); - console.log("rendered in " + (now.getTime() - epoch.getTime()) + "ms"); - - var pos = document.getElementById("position"); - pos.textContent = Math.round((parseInt(d.firstChild.id) / text.length) * 1000) / 10 + "%"; -} - -function _hint(h) -{ - document.getElementById("hint").innerHTML = h; -} - -function _gfilteron() -{ - if (!filterswitch) - return false; - - if (shl && shl.filter) - return true; - - for (var h in hl) - { - if (hl[h].filter) - return true; - } - - return false; -} - -function _getfilterelement(filter) -{ - if (filter == 0) - return document.getElementById("search"); - - return document.getElementById("filter" + filter); -} - -function _setfilterelementstate(p0, _hl) -{ - p0.style.textDecoration = _hl.filter ? "underline" : ""; -} - -function _triminput(t) -{ - t = t - .replace(/^\s+/, "") - .replace(/\s+$/, "") - ; - return t; -} - -function _regexpescape(t) -{ - t = t - .replace(/\\/g, "\\\\") - .replace(/\?/g, "\\?") - .replace(/\./g, "\\.") - .replace(/\+/g, "\\+") - .replace(/\*/g, "\\*") - .replace(/\^/g, "\\^") - .replace(/\$/g, "\\$") - .replace(/\(/g, "\\(") - .replace(/\)/g, "\\)") - .replace(/\[/g, "\\[") - .replace(/\]/g, "\\]") - .replace(/\|/g, "\\|") - ; - return t; -} - -function resetuistate() -{ - groupwith = false; - _hint(""); -} - -function newhl(t, p, persistent) -{ - return { - id: persistent ? nextFilterId++ : 0, - text: t, - text_r: _sanitize(_regexpescape(t)), - color: p ? p.color : colors[0], - filter: p ? p.filter : false, - cache: {} - }; -} - -function selectline(id) -{ - var l0 = document.getElementById(selectedlineid); - if (l0) - l0.style.backgroundColor = ""; - - var l1 = null; - if (typeof(id) == "object") { - l1 = id; - id = parseInt(l1.id); - } else { - l1 = document.getElementById(id); - } - - selectedlineid = id; - if (selectedlineid > -1) - _hint("line # " + (selectedlineid + 1)); - - if (l1) { - l1.style.background = "#faa"; - } - - var thread = null; - var m = text[selectedlineid].match(threadregexp); - if (m) thread = _regexpescape(_sanitize(m[1])); - if (thread != selectedthread) { - selectedthread = thread; - repaint(); - } - - return l1; -} - -function mouseup(event) -{ - if (event.ctrlKey) - return; - - resetuistate(); - - var s = window.getSelection(); - var t = _triminput(s.toString()); - if (!t) - return; - - s = document.getElementById("search"); - s.value = t; - - t = _prepare(t)[0]; - - shl = newhl(t, shl); - selectfilter(0); - repaint(); -} - -function persist() -{ - resetuistate(); - - var dorender = false; - if (!shl) - { - _apply(); - dorender = true; - } - - if (!shl) - return; - - selectfilter(0); - - var _hl = newhl(shl.text, shl, true); - _hl.cache = shl.cache; // hope this is right, shl is updated in _apply, that always creates an empty cache - hl.push(_hl); - - var p = document.getElementById("persistents"); - var p0 = document.createElement("div"); - p0.id = "filter" + _hl.id; - p0.className = "persistent"; - p0.style.backgroundColor = _hl.color; - p0.innerHTML = _hl.text; - p0.onclick = function() {selectfilter(_hl.id)}; - _setfilterelementstate(p0, _hl); - p.appendChild(p0); - - _restartshl(); - selectfilter(_hl.id); - if (dorender) - render(); - - colors.push(colors.shift()); -} - -function _apply() -{ - s = document.getElementById("search"); - var t = _triminput(s.value); - - if (!t) - { - shl = null; - } - else - { - t = _prepare(t)[0]; - shl = newhl(t, shl); - } +/* This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) + * Copyright (C) 2018 OzzieIsaacs + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +// Upon loading load the logfile for the first option (event log) +$(function() { + init(0); +}); + +// After change the radio option load the corresponding log file +$("#log_group input").on("change", function() { + var element = $("#log_group input[type='radio']:checked").val(); + init(element); +}); + + +// Handle reloading of the log file and display the content +function init(logType) { + var d = document.getElementById("renderer"); + d.innerHTML = "loading ..."; + + /*var r = new XMLHttpRequest(); + r.open("GET", "/ajax/log/" + logType, true); + r.responseType = "text"; + r.onload = function() { + var text; + text = (r.responseText).split("\n"); + $("#renderer").text(""); + console.log(text.length); + for (var i = 0; i < text.length; i++) { + $("#renderer").append( "
    " + _sanitize(text[i]) + "
    " ); + } + }; + r.send();*/ + $.ajax({ + url: "/ajax/log/" + logType, + datatype: 'text', + cache: false + }) + .done( function(data) { + var text; + $("#renderer").text(""); + text = (data).split("\n"); + console.log(text.length); + for (var i = 0; i < text.length; i++) { + $("#renderer").append( "
    " + _sanitize(text[i]) + "
    " ); + } + }); +} + + +function _sanitize(t) { + t = t + .replace(/&/g, "&") + .replace(/ /g, " ") + .replace(//g, ">"); + + return t; } -function highlight() -{ - resetuistate(); - - _apply(); - - repaint(); - selectfilter(0); -} - -function filter() -{ - resetuistate(); - - if ((!shl && !hl.length) || (current == shl)) - { - _apply(); - selectfilter(0); - } - - if (current) { - current.filter = !current.filter; - _setfilterelementstate(_getfilterelement(current.id), current); - if (filterswitch) - render(); - else - repaint(); - } -} - -function group() -{ - resetuistate(); - - // the code it self happens in selectfilter() function - - if (!shl) - { - _hint("press higlight or filter first"); - return; - } - - if (hl.length) - { - groupwith = true; - _hint("-> now select a pinned filter to group the current highlight with"); - } - else - { - _hint("you have to pin a filter with the 'pin' button first"); - } -} - -function _restartshl() -{ - var s = document.getElementById("search"); - s.value = ""; - s.style.backgroundColor = ""; - s.style.textDecoration = ""; - current = shl = null; -} - -function restart() -{ - resetuistate(); - - var filtered = _gfilteron(); // was: = current && current.filter - - if (current == shl) - { - _restartshl(); - } - else - { - var p0 = _getfilterelement(current.id); - - for (var h in hl) - if (hl[h].id == current.id) { - hl.splice(h, 1); - break; - } - - if (current.text) { - shl = newhl(current.text, current); - var s = document.getElementById("search"); - s.value = current.text; - _setfilterelementstate(s, shl); - } - selectfilter(0); - - var p = document.getElementById("persistents"); - p.removeChild(p0); - } - - if (!shl) // means: filter could not be switched back to shl or directly shl was reset - render(); -} - -function selectfilter(filter) -{ - var el0 = _getfilterelement(current ? current.id : 0); - var el1 = _getfilterelement(filter); - - el0.style.border = ""; - el0.style.margin = ""; - el1.style.border = "solid 2px #3ad"; - el1.style.margin = "0px"; - - function filterbyid(id) - { - for (var h in hl) - if (hl[h].id == id) - return hl[h]; - } - - if (groupwith && filter) - { - el1.innerHTML += "+" + shl.text; - var _hl = filterbyid(filter); - _hl.text = ""; // not backward compatible - _hl.text_r += "|" + shl.text_r; - _hl.cache = {}; - resetuistate(); - _restartshl(); - render(); - } - else - resetuistate(); - - current = (filter == 0) ? shl : filterbyid(filter); - - // A bit hacky redraw of the search box color :) - if (filter === 0 && shl) - { - var s = document.getElementById("search"); - s.style.backgroundColor = shl.color; - } -} - -function flipfilter(event) -{ - filterswitch = !filterswitch; - event.target.innerHTML = (filterswitch ? "filters on" : "filters off"); - render(); - - event.stopPropagation(); -} diff --git a/cps/templates/admin.html b/cps/templates/admin.html index a89193d0..6618a113 100644 --- a/cps/templates/admin.html +++ b/cps/templates/admin.html @@ -106,7 +106,7 @@

    {{_('Administration')}}

    - +
    {{_('Reconnect to Calibre DB')}}
    {{_('Restart Calibre-Web')}}
    {{_('Stop Calibre-Web')}}
    diff --git a/cps/templates/logviewer.html b/cps/templates/logviewer.html index 0f01f773..5a47a176 100644 --- a/cps/templates/logviewer.html +++ b/cps/templates/logviewer.html @@ -1,141 +1,15 @@ {% extends "layout.html" %} {% block body %} -{% block header %} - -{% endblock %} - -
    - -
    apply
    -
    filters on
    -
    -
    filter
    -
    -
    -
    -
    - -
    -
    -
    - -   - - -
    -
    -
    {{warning}}
    -
    -
    - -
    nothing loaded
    - {% for line in log %} - - {% endfor %} -
    {{line.line}}{{line.date}}{{line.level}}{{line.message}}
    -
    -
    -
    - - - -
    -
    +
    +
    + {{logfiles[0]}}
    + {% if accesslog_enable %} +
    + {{logfiles[1]}}
    + {% endif %} +
    +
    {% endblock %} {% block js %} - - {% endblock %} diff --git a/cps/translations/de/LC_MESSAGES/messages.mo b/cps/translations/de/LC_MESSAGES/messages.mo index abd73016a6ae55be949ad25acd3a9af23ccb73cc..3ef503eb32c26173fdd64e8aac69d4caf2a47cc3 100644 GIT binary patch delta 17885 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 %(rating)s" msgstr "Bewertung >= %(rating)s" -#: cps/web.py:924 cps/web.py:933 +#: cps/web.py:917 cps/web.py:926 msgid "search" msgstr "Suche" -#: cps/web.py:1018 +#: cps/web.py:1012 msgid "Please configure the SMTP mail settings first..." msgstr "Bitte zuerst die SMTP Mail Einstellung konfigurieren ..." -#: cps/web.py:1023 +#: cps/web.py:1017 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Buch erfolgreich zum Senden an %(kindlemail)s eingereiht" -#: cps/web.py:1027 +#: cps/web.py:1021 #, 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:1046 cps/web.py:1071 cps/web.py:1076 cps/web.py:1081 -#: cps/web.py:1085 +#: cps/web.py:1041 cps/web.py:1066 cps/web.py:1070 cps/web.py:1075 +#: cps/web.py:1079 msgid "register" msgstr "Registieren" -#: cps/web.py:1073 +#: cps/web.py:1068 msgid "Your e-mail is not allowed to register" msgstr "Diese E-Mail ist nicht für die Registrierung zugelassen" -#: cps/web.py:1077 +#: cps/web.py:1071 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Eine Bestätigungs E-Mail wurde an den E-Mail Account versendet." -#: cps/web.py:1080 +#: cps/web.py:1074 msgid "This username or e-mail address is already in use." msgstr "Benutzername oder E-Mailadresse ist bereits in Verwendung." -#: cps/web.py:1103 cps/web.py:1115 +#: cps/web.py:1089 +msgid "Cannot activate LDAP authentication" +msgstr "LDAP Authentifizierung kann nicht aktiviert werden" + +#: cps/web.py:1098 cps/web.py:1212 #, python-format -msgid "You are now logged in as: '%(nickname)s'" -msgstr "" +msgid "you are now logged in as: '%(nickname)s'" +msgstr "Du bist nun eingeloggt als '%(nickname)s'" -#: cps/web.py:1108 cps/web.py:1120 +#: cps/web.py:1105 cps/web.py:1122 msgid "Wrong Username or Password" msgstr "Falscher Benutzername oder Passwort" -#: cps/web.py:1111 +#: cps/web.py:1108 msgid "Could not login. LDAP server down, please contact your administrator" -msgstr "" +msgstr "Login nicht erfolgreich, LDAP Server nicht erreichbar, bitte Administrator kontaktieren" -#: cps/web.py:1124 cps/web.py:1146 +#: cps/web.py:1117 +#, python-format +msgid "You are now logged in as: '%(nickname)s'" +msgstr "Eingeloggt als: '%(nickname)s'" + +#: cps/web.py:1126 cps/web.py:1148 msgid "login" msgstr "Login" -#: cps/web.py:1158 cps/web.py:1189 +#: cps/web.py:1160 cps/web.py:1191 msgid "Token not found" msgstr "Token wurde nicht gefunden" -#: cps/web.py:1166 cps/web.py:1197 +#: cps/web.py:1168 cps/web.py:1199 msgid "Token has expired" msgstr "Das Token ist abgelaufen" -#: cps/web.py:1174 +#: cps/web.py:1176 msgid "Success! Please return to your device" msgstr "Erfolg! Bitte zum Gerät zurückkehren" -#: cps/web.py:1210 -#, python-format -msgid "you are now logged in as: '%(nickname)s'" -msgstr "Du bist nun eingeloggt als '%(nickname)s'" - -#: cps/web.py:1250 cps/web.py:1277 cps/web.py:1281 +#: cps/web.py:1253 cps/web.py:1280 cps/web.py:1284 #, python-format msgid "%(name)s's profile" msgstr "%(name)s's Profil" -#: cps/web.py:1274 +#: cps/web.py:1277 msgid "Found an existing account for this e-mail address." msgstr "Es existiert bereits ein Benutzer für diese E-Mailadresse." -#: cps/web.py:1279 +#: cps/web.py:1282 msgid "Profile updated" msgstr "Profil aktualisiert" -#: cps/web.py:1304 cps/web.py:1306 cps/web.py:1308 cps/web.py:1314 -#: cps/web.py:1318 +#: cps/web.py:1308 cps/web.py:1310 cps/web.py:1312 cps/web.py:1318 +#: cps/web.py:1322 msgid "Read a Book" msgstr "Lese ein Buch" -#: cps/web.py:1328 +#: cps/web.py:1332 msgid "Error opening eBook. File does not exist or file is not accessible." -msgstr "" +msgstr "Fehler beim Öffnen des eBooks. Datei existiert nicht, oder Zugriff ist nicht erlaubt. " -#: cps/worker.py:308 +#: cps/worker.py:311 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Fehler EBook-converter: %(error)s" -#: cps/worker.py:319 +#: cps/worker.py:322 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Kindlegen Aufruf mit Fehler %(error)s. Text: %(message)s fehlgeschlagen" @@ -977,7 +987,7 @@ msgstr "Download" #: cps/templates/admin.html:15 msgid "View Ebooks" -msgstr "" +msgstr "EBook ansehen" #: cps/templates/admin.html:16 cps/templates/layout.html:65 msgid "Upload" @@ -1056,53 +1066,57 @@ msgid "Administration" msgstr "Administration" #: cps/templates/admin.html:109 +msgid "View Logfiles" +msgstr "Logdateien ansehen" + +#: cps/templates/admin.html:110 msgid "Reconnect to Calibre DB" msgstr "Calibre-DB neu verbinden" -#: cps/templates/admin.html:110 +#: cps/templates/admin.html:111 msgid "Restart Calibre-Web" msgstr "Calibre-Web Neustarten" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:112 msgid "Stop Calibre-Web" msgstr "Stoppe Calibre-Web" -#: cps/templates/admin.html:117 +#: cps/templates/admin.html:118 msgid "Update" msgstr "Update" -#: cps/templates/admin.html:121 +#: cps/templates/admin.html:122 msgid "Version" msgstr "Version" -#: cps/templates/admin.html:122 +#: cps/templates/admin.html:123 msgid "Details" msgstr "Details" -#: cps/templates/admin.html:128 +#: cps/templates/admin.html:129 msgid "Current version" msgstr "Aktuelle Version" -#: cps/templates/admin.html:134 +#: cps/templates/admin.html:135 msgid "Check for update" msgstr "Suche nach Update" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:136 msgid "Perform Update" msgstr "Update durchführen" -#: cps/templates/admin.html:147 +#: cps/templates/admin.html:148 msgid "Do you really want to restart Calibre-Web?" msgstr "Calibre-Web wirklich neustarten?" -#: cps/templates/admin.html:152 cps/templates/admin.html:166 -#: cps/templates/admin.html:186 cps/templates/shelf.html:72 +#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:187 cps/templates/shelf.html:72 msgid "Ok" msgstr "Ok" -#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:154 cps/templates/admin.html:168 #: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:281 cps/templates/config_view_edit.html:147 +#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:74 #: cps/templates/layout.html:28 cps/templates/shelf.html:73 #: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:12 @@ -1110,11 +1124,11 @@ msgstr "Ok" msgid "Back" msgstr "Zurück" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:166 msgid "Do you really want to stop Calibre-Web?" msgstr "Calibre-Web wirklich stoppen?" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:178 msgid "Updating, please do not reload page" msgstr "Updatevorgang, bitte Seite nicht neu laden" @@ -1243,7 +1257,7 @@ msgstr "Buch nach Bearbeitung ansehen" msgid "Get metadata" msgstr "Metadaten laden" -#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:279 +#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329 #: cps/templates/config_view_edit.html:146 cps/templates/login.html:20 #: cps/templates/search_form.html:150 cps/templates/shelf_edit.html:17 #: cps/templates/user_edit.html:130 @@ -1387,123 +1401,171 @@ msgstr "Log Level" msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "Position und Name des Logfiles (calibre-web.log bei keinem Eintrag)" -#: cps/templates/config_edit.html:140 +#: cps/templates/config_edit.html:134 +msgid "Enable Access Log" +msgstr "Zugriffs-Logdatei aktivieren" + +#: cps/templates/config_edit.html:137 +msgid "Location and name of access logfile (access.log for no entry)" +msgstr "Position und Name des Zugriffs-Logfiles (access.log bei keinem Eintrag)" + +#: cps/templates/config_edit.html:148 msgid "Feature Configuration" msgstr "Feature Konfiguration" -#: cps/templates/config_edit.html:148 +#: cps/templates/config_edit.html:156 msgid "Enable uploading" msgstr "Hochladen aktivieren" -#: cps/templates/config_edit.html:152 +#: cps/templates/config_edit.html:160 msgid "Enable anonymous browsing" msgstr "Anonymes Browsen aktivieren" -#: cps/templates/config_edit.html:156 +#: cps/templates/config_edit.html:164 msgid "Enable public registration" msgstr "Öffentliche Registrierung aktivieren" -#: cps/templates/config_edit.html:160 +#: cps/templates/config_edit.html:168 msgid "Enable remote login (\"magic link\")" msgstr "Remote Login aktivieren ('Magischer Link')" -#: cps/templates/config_edit.html:165 +#: cps/templates/config_edit.html:173 msgid "Use" msgstr "Benutze" -#: cps/templates/config_edit.html:166 +#: cps/templates/config_edit.html:174 msgid "Obtain an API Key" msgstr "Einen API Schlüssel erhalten" -#: cps/templates/config_edit.html:170 +#: cps/templates/config_edit.html:178 msgid "Goodreads API Key" msgstr "Öffentlicher Goodreads API Schlüssel" -#: cps/templates/config_edit.html:174 +#: cps/templates/config_edit.html:182 msgid "Goodreads API Secret" msgstr "Geheimer Goodreads API Schlüssel" -#: cps/templates/config_edit.html:181 +#: cps/templates/config_edit.html:189 msgid "Login type" msgstr "Login typ" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:191 msgid "Use standard Authentication" msgstr "Benutze Standard Anmeldung" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:193 msgid "Use LDAP Authentication" msgstr "Benutze LDAP Login" -#: cps/templates/config_edit.html:188 +#: cps/templates/config_edit.html:196 msgid "Use GitHub OAuth" msgstr "Benutze Github Oauth" -#: cps/templates/config_edit.html:189 +#: cps/templates/config_edit.html:197 msgid "Use Google OAuth" msgstr "Benutze Google Oauth" -#: cps/templates/config_edit.html:196 -msgid "LDAP Provider URL" -msgstr "LDAP Anbieter Url" +#: cps/templates/config_edit.html:204 +msgid "LDAP Server Host Name or IP Address" +msgstr "LDAP Server Host Name oder IP Adresse" + +#: cps/templates/config_edit.html:208 +msgid "LDAP Server Port" +msgstr "LDAP Server Port" + +#: cps/templates/config_edit.html:212 +msgid "LDAP schema (ldap or ldaps)" +msgstr "LDAP Schema (ldap oder ldaps)" + +#: cps/templates/config_edit.html:216 +msgid "LDAP Admin username" +msgstr "LDAP Admin Benutzername" + +#: cps/templates/config_edit.html:220 +msgid "LDAP Admin password" +msgstr "LDAP Admin Passwort" -#: cps/templates/config_edit.html:200 +#: cps/templates/config_edit.html:225 +msgid "LDAP Server use SSL" +msgstr "LDAP Server benutzt SSL" + +#: cps/templates/config_edit.html:229 +msgid "LDAP Server use TLS" +msgstr "LDAP Server benutzt TLS" + +#: cps/templates/config_edit.html:233 +msgid "LDAP Server Certificate" +msgstr "LDAP Server Zertifikat" + +#: cps/templates/config_edit.html:237 +msgid "LDAP SSL Certificate Path" +msgstr "LDAP SSL Zertifikat Pfad" + +#: cps/templates/config_edit.html:242 msgid "LDAP Distinguished Name (DN)" -msgstr "" +msgstr "LDAP Distinguished Name (DN)" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:246 +msgid "LDAP User object filter" +msgstr "LDAP User Object Filter" + +#: cps/templates/config_edit.html:251 +msgid "LDAP Server is OpenLDAP?" +msgstr "LDAP Server ist OpenLDAP?" + +#: cps/templates/config_edit.html:258 msgid "Obtain GitHub OAuth Credential" -msgstr "" +msgstr "GitHub OAuth Credential erhalten" -#: cps/templates/config_edit.html:211 +#: cps/templates/config_edit.html:261 msgid "GitHub OAuth Client Id" msgstr "Github OAuth Client ID" -#: cps/templates/config_edit.html:215 +#: cps/templates/config_edit.html:265 msgid "GitHub OAuth Client Secret" msgstr "Github OAuth Client Secret" -#: cps/templates/config_edit.html:221 +#: cps/templates/config_edit.html:271 msgid "Obtain Google OAuth Credential" -msgstr "" +msgstr "Google OAuth Credential erhalten" -#: cps/templates/config_edit.html:224 +#: cps/templates/config_edit.html:274 msgid "Google OAuth Client Id" msgstr "Google OAuth Client ID" -#: cps/templates/config_edit.html:228 +#: cps/templates/config_edit.html:278 msgid "Google OAuth Client Secret" msgstr "Google OAuth Client Secret" -#: cps/templates/config_edit.html:242 +#: cps/templates/config_edit.html:292 msgid "External binaries" msgstr "Externe Programme" -#: cps/templates/config_edit.html:250 +#: cps/templates/config_edit.html:300 msgid "No converter" msgstr "Kein Konverter" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:302 msgid "Use Kindlegen" msgstr "Kindlegen benutzen" -#: cps/templates/config_edit.html:254 +#: cps/templates/config_edit.html:304 msgid "Use calibre's ebook converter" msgstr "Benutze Calibre's Ebook Konverter" -#: cps/templates/config_edit.html:258 +#: cps/templates/config_edit.html:308 msgid "E-Book converter settings" msgstr "E-Book Konverter Einstellungen" -#: cps/templates/config_edit.html:262 +#: cps/templates/config_edit.html:312 msgid "Path to convertertool" msgstr "Pfad zu Konvertertool" -#: cps/templates/config_edit.html:268 +#: cps/templates/config_edit.html:318 msgid "Location of Unrar binary" msgstr "Pfad zum UnRar Programm" -#: cps/templates/config_edit.html:284 cps/templates/layout.html:84 +#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 #: cps/templates/login.html:4 msgid "Login" msgstr "Login" @@ -1566,7 +1628,7 @@ msgstr "Downloads erlauben" #: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:96 msgid "Allow book viewer" -msgstr "" +msgstr "Buch Anzeige erlauben" #: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:100 msgid "Allow Uploads" @@ -1717,9 +1779,9 @@ msgstr "Zurück zur Hautseite" msgid "Discover (Random Books)" msgstr "Entdecke (Zufälliges Buch)" -#: cps/templates/index.html:65 +#: cps/templates/index.html:64 msgid "Group by series" -msgstr "" +msgstr "Gruppierung per Serie" #: cps/templates/index.xml:6 msgid "Start" @@ -1779,7 +1841,7 @@ msgstr "Persönliches Bücherregal des Benutzers, nur sichtbar für den aktuelle #: cps/templates/layout.html:28 msgid "Home" -msgstr "" +msgstr "Home" #: cps/templates/layout.html:34 msgid "Toggle navigation" @@ -1796,7 +1858,7 @@ msgstr "Einstellungen" #: cps/templates/layout.html:78 msgid "Account" -msgstr "" +msgstr "Account" #: cps/templates/layout.html:80 msgid "Logout" @@ -1860,6 +1922,14 @@ msgstr "Merken" msgid "Log in with magic link" msgstr "Einloggen mit magischem Link" +#: cps/templates/logviewer.html:5 +msgid "Show Calibre-Web log" +msgstr "Zeige Calibre-Web Logdatei" + +#: cps/templates/logviewer.html:8 +msgid "Show access log" +msgstr "Zeige Zugriffslogdatei" + #: cps/templates/osd.xml:5 msgid "Calibre-Web ebook catalog" msgstr "Calibre-Web E-Book Katalog" @@ -1966,7 +2036,7 @@ msgstr "Rechts nach links" #: cps/templates/readpdf.html:29 msgid "PDF reader" -msgstr "" +msgstr "PDF Reader" #: cps/templates/readtxt.html:6 msgid "Basic txt Reader" @@ -2154,15 +2224,15 @@ msgstr "Zeige alle" #: cps/templates/user_edit.html:52 msgid "OAuth Settings" -msgstr "" +msgstr "Oauth Einstellungen" #: cps/templates/user_edit.html:54 msgid "Link" -msgstr "" +msgstr "Verknüpfung herstellen" #: cps/templates/user_edit.html:56 msgid "Unlink" -msgstr "" +msgstr "Verknüpfung entfernen" #: cps/templates/user_edit.html:124 msgid "Delete this user" @@ -2211,3 +2281,21 @@ msgstr "Letzte Downloads" #~ msgid "PDF.js viewer" #~ msgstr "PDF.js Viewer" +#~ msgid "Failed to create path for cover %(path)s (Permission denied)." +#~ msgstr "Fehler beim Erzeugen des Pfads für das Cover %(path)s (Zugriff verweigert)" + +#~ msgid "Failed to store cover-file %(cover)s." +#~ msgstr "Fehler beim Speichern des Covers %(cover)s." + +#~ msgid "Cover-file is not a valid image file" +#~ msgstr "Cover-Datei ist keine gültige Bilddatei" + +#~ msgid "successfully deleted shelf %(name)s" +#~ msgstr "Bücherregal %(name)s erfolgreich gelöscht" + +#~ msgid "LDAP Provider URL" +#~ msgstr "LDAP Anbieter Url" + +#~ msgid "Register with %s, " +#~ msgstr "" + diff --git a/cps/translations/es/LC_MESSAGES/messages.mo b/cps/translations/es/LC_MESSAGES/messages.mo index b9404c8b5fc52ecebf0c54e97d371069a55b50e7..6d50c4d75a9ea8903008535f0a47ae5dd0fb3ff8 100644 GIT binary patch delta 14168 zcmYM(34Bf0+Q;#8BoSf?Vh$2hjWN~~6cG|J2PK9kAvHxp#L$WyHMCk?Nr)_tD&6oP4Z5sAU`Du&=nERFf*PSgZ%+w-I5DJ)C-1uTa*u{hqtK>Q1} zptr3XNC;})FbwqgJf27j>d?S!j#{WaR>3Z)oef1TFaZ_dGgt!`U>VHE+PDkV?+j{V z*RUFXi>=Vp&JD0NR$zTkM{DSdO4VT0M5EOKb5Rq$irU$07>4<%!1tSn&6B7F&!PJN zfEs@XtKgql5zDvtczo(mpMp9xMb+Dw(O8OlcT_6-p%zR;^&e@DMeR7<>N%(d7NG9V z8q~ansCnK(WpICc@~^WyN`odmYaK4427Y1wggUcFr~pcJaE~a=td5#E0yR&4RN&35 zy#s1|7u3QD_!tiDK>nLh$fcnvZpV&z5jieT1uBg(9-Cn{Ho{F<2~VR^dL66b1FMHc zdpz7bPgB$eQ&E9UMFsi{DkHf*D=b9qYzgWPthDymQ3JQ2F6A!Ng!`~MzK@Z34HbZ= zlN(TVOrhEebvaj{=GlbGz;@Jl-+t?G4t3eCp*r3{lHmCh6~KZU`1|39Umg|6UZcmwNTsVBJM7==ptV$|8KMFsFW z>eg>Yjo)we!}k0Pwx<0v)Q7D^S9jskW<}}aL3Ik6I1+1P1FVHTQGukP7FdLe{8iLW z)}St70V)>V7!hfL_D$~R5Ulp}LgxLwzZy4%QPQc2z0g2hOADP1Q2Xf6koqVxwie{tUg6B{f zS&RX=0u|sIR0dv0o$+B*hR&gO`lYqsM)iM$x_m)BT{~ba>XT9P_jxr`V6`zq z?|(gOh(%qJ-lze?P#H);Ei@kMVm9hhu0i!bh~anwbrd&HJN^~5AF{l(zHnXgKCMqM(S^L5S z@~=o=qCv0AGStK$nCDOte~wDsb?k`0VJU3h#|&r6 zsEp+IA^$2A(oh=rqR#XPYUdxL0=Q^iLoIyM>UU86|3FP#ysz88EUI56)TcQTwN6X3 zBWnH_9|fhVFKVGds4vrSY>(-vi8rHmv=enye$)iVP~%Rc7C3M9FR%>t8yJmuPysdT z=g!x`^mU`40OC;#^h2d^Flyp-)Wp-Qo@4d-sQyb(0WP=aYpuS~>V@W8sQw2~^Sz5~ z)aN-tK|8sOx*Ru99lt|O{1a-xJ=E=gWY5F;yW^^(`qjfm*cA2N4@KRjab^}O6LV0n z>%Xz8-v0{}6u>X2Z}p#64;|nxSRHi~El`0?KxHP=oPo;V94w9VPzx_b1-2G7|0dM< z9jHsW7mI%XPf^fWeTo|R6>7&nsssLJ^@pel0|&a#OQSMU3AI2I)bqzt<2su?Q1d02 zgHZvG!lK{*R0?`M#-jqrK~3}mDzK%f%d_6v3sF1SgZdNe0P0usv_1b8)&FNyU=L6M z1rBm8g&JRB5cyY!sx)Z9I`*J3R-oPj6=@7=f;iN`{#GA?WvP!eCt3TmsEs^l^(Clv z94y)hYTm*@oWCCIvWA0LbURTCoB=g>rv}%!}7S-XNBXag)g8M{?h8-q9*#qyoVb25G!Jt!EXOZRGCn_|u| zb5QHdLuK5z*a{9R(skA$9~E(-J>O^bL-zb6M)3R`Dg$>=M-e>4{X?TNYJqsHjRR5h zO~n?NgKhNw@1&rVUB{;Q2=zx|lc8>^;!zn%M1A{{upO>M1^h8;;!jaKyNbHB-=dD{ zH#6`__jwrVvev}1djH!|P%3+3C?=s&JPCDHb5Ik#fMK{AE8q@PU`J3pJ%I}34C*^@ z+1kHF_4^q${+<~!jCok!Q=5VoZiU)W3~Hh{)NM^f1@IKAUnVNmb5Rp6#VS~U`UB+< zDidE}W&9o+pl7)Ir`%&$k7|GPX@P7Cig+%@;mglqz1auVKN+>N$*2Xh zQJI^A%E(fCzS`V?T5mII{GKH8uUmSU1`RlFo<`k?&roOiD=H(8tX^`2do)$BH|>$A z-;Q+bfK#v|Zb!{~6BXc3r~vMxGFWUR`By`E{y|R-HBmciiW=A&6<{=Kf^OE{8+A7Z z+4GU8KvS^}PO)~!+FwH*;a2kiYQ2*_3R>U-YT++X6Wy@-9aP6ZPyq#xa{HG<^{<2q zBph|t4Nx2Ej5>;V)EyaN?Nd-^pM%glNY7NRz=-s(G0Z`*NX9-rqDg$NpcKt)>WDR+Sg)Woe&3&o*!JP?(M zVOCGJ`Z&~UnTg8aJbS(jm7&$BaT~3@u&D0i|Ba%c2oIVkF_!uT)R~1RyEa7y&hh6`Aq`cCRwtyn>o1B-NcK6!qb%gk7)!>Uml!=dUxHL_-VAMWuE(>hj&d##nxg`=inc zwbM-01T#@PnS=H5d28Qc?!^Gw52D5$LS^PSDx(+1kbgb+${yT8o%sXQB?=kqUc#!V z0a2)(w>O_ajqhppL+x}ZhT}MEUw|671QoD@0hs5bpaJ>TVUKkO@<>!5^-=xXp~lCe`i((dw(;g%a}DZ9-$Lg1c|NBQO~Xx8Y9hzEXWJOHPz$TK z!C>kgQT@83E@cAh4h^;T2^d5@3xjc%IT!WeS%i9?S0v}Z$r`qyCf;TB16ZBws zUPA@;4Hm~+R{sU{7Tm>P{0H?sczn_SE9)tXI+6rzfWxrp_uofB1D2yww-z<v6m)hAQ61kv1+W8k zIsI4zkD~(p3YCFdr~qzbL-bDMFIz9?i~4k*pXBj8f#0JpX`^)aQ=f$OsLxKf_dlP8 z88rA&ACShA-G!2{B=uBOVCks9rrYxza{=nLU4pvpd8iESxAqTFM|lYq*j;NcnZfz1 zW3>!-!KSDqXoFg?1L~4>$1>O#mBJCIKvGcs#-jqAinVbzDv))k`S+m$Jc)JiBI^6_ zz-J9rGTl^nL`{@{I+7unfYVS59zmu2gw;Ps^}mj_@HXnTEH%Xqtftujm4W7{BkXPZ z22s!iNvOZ|#-etZYaJG#1};IpK3h?Nyn`Bd%<8Aj^X3&)X1+FmKrMXNe2C@r{s&BT zA5=vB1yciye)my<#G#I)AL=L)u`G^8Eif6?Zw6|7j_Du^c($V!ejC;Q7^?p%Ec*9< zpICN2rW` zgAv?6&p#COdPQWre|U7l3e@MJQoRzDfjrbsHkyT~9qlpSw)XeUQ>dMuM`i3X>Whi6|qKu$kr$W^D6Xsd$PW=*U zo*J{7)LYK7_kS@Bx-1(|N3jb-@gppapQ8e}g<9ZetN)IzssD`~vE?(os+f)% z{}t-!?x4osxAwnK0hRGR>nQE1RVPn)MHVf5phB?PvU@pd{JYS9t@d!4@Tc|** z&UVK~qBhbHwZX?x0s00~s7N8zoPp~25-QcJQ4?)OrFs`C(0`$h;1E{F6R11%HR>%W zmE+dC;A7Osqt;o5+E4*9-sgFfLVX(cqdtwFqZW9Cx^#haxOf>I^U0^Q)){enDmA zK5BtSs7!=&r&?e;)SViS>ZiLV=VCQngthpuXA}Puj_=_(yoQyr=Un&aa}@TXz8<^b zO;jcxd(J(AW~hnVq3+BRr~qTIHugpZG7}?XdPd z_lTavs?_J80$7C_mxpz*!0IP4iuzfM!$+t~*=xRgS!be-uwXvtuW$NJ8WizC)PzS+ zk)Ff=ynuu73hLLe*#dWhXRsFad8nOkL><|Cs1MVps4wX))PfIDnGRg&W+ZYUsSc!} zB@M-}Eh-}&P=O?viKu=fFcOn72zTeN z3R<{5YG8~Rj|!we7ROZ-poRseGV$XrKlrWXV14`3D)=Q zrJ%ET#~xfky~p36-s^v`1lD}fwSn0jHDPM)TR9zN8?@80)t+1k0cpYe;P|-Hfmfh z`ZV!EYj_1U(Ms%yTTuaBNA>#|70~af0RFLh;9~cZl}0_Ui(04&YN5wb<2zYB7Ijzp zEGGZzFo*^X9Bv&_%<j*Poh3(mr)zO zh05SBK5O_5712Y~jsjkBFIQ<)`L12v)F>W9qt&5ux*^b-uhZ%_;Uf~E0yYY$xNwwFU~qzWp4n#ix9 z&(q2}^g*S3Fe>6>8zvt-b}7somy&)L%&NpcX!h>i;7a z{qz5SDfFY^9%^8Z<*vQW0jL2(QGty@Eu4nRK!(+)p>~*K^%qeYU5+~1_1GE{hF>M|LWL|hO*cND_~#LuUj%|r_Z21B=hX~Ml4T#pVd!bCF++^^ZjD=`>2$c zUgg>lwV@tnA0GupJQx+gQ}!Uk>N8M(u`Dzys7o8P+CB4%=3`iy z_Gr{b2BCiBd{ZeXHA_%CJ%{@1^fKx<;4U`As5P!nq5__a3S==3zychE_pm<3z2+WC z1}ZbJV5s_`GO!=Xl+W`n1>N%Fr~p2*4p&i^@g{1aA5l99TShF%)BE3mLI-S%nrMn1;4IW7TV(aMr~tO3Qu;3HvYkg| z=!(_vqQ*b4ddPZr;qs{dRZtnJg}!POnp4n#c+>*Ju?D7NMO=ifF%K2sIaJCoVRgKU z3g8cn#_}87aeYxcPC*^rIMnwc7i;3;4dlNTg+dw>$cGq?*HIJxg9@bT>+XOysEGz) zGn|0xzZ%tlpVdD`9mNl*9shPU)Q4s^YQYas{ZFInpP@4IIcokY8{JGq_$X-MW~c$3P?7gQ9Z5gb?bq z)2#jiMp1vo>hGfFIgXm=H0r1>pzh4)s3W;!`hKUNi2g=hw&I)Ig{q<^sEzfpk=6U# z^Wmt4l2H?mH#6*cHfjU2QS&cG^5>^SnW!8xP(?O%(8k``VO5-O?}|hV@Z9 z$wj^Q^RX4K!5(-D+hAyc`!>a57wSG#0EbZ-JZbea*jexYMSD@3%Z^757fe+1~ zE$#&6P=Qs(Mp)h2d!PbJu=-Hc_)(~Z#-YwW6LpssVhlQ1^zZ*KQm9MA4b&Y7-s&z; z4K;BL_P~DF939j|@1s)wiPej5b9WeqdOK=jAT~0iunP6os0}AWpg{qA zi6!wn)P#3X3;cnaFl4*i9*U}0L5;6z?F~?YH?!w`tvwMHSd!I8TRqK3L8+X8nsBCd zn1h|EFF<`VkD)Sf7L~$~H{FHnpitl)9csQVW)IZc)Ejk~M_>o^O`*`0!glNM zqxlzV!ZJJD_c#m{NIfiuEinSyU@07e%3KO6z)7f2^L%@rkIKLf)Dgdh4b*gMhrf5n z2(R;Aba$szrw^RZI%WBXb>8Il2S1VIb(VMi$Vu(C!{4ZTR)F(yY+I*H&oR#ao+JHh zdoB0++s0q<`l}_(@H#8|oc3?-Thi;??$^c%7*KI}{|I>A$sdsJj~SR;%=tTUqEl%| ztTS=Qi~c``%m{GS5AW;zF}#D*HmQUExulX_|H=_jUgyh^y_`n{)tphIK6JW`&T!6+ z?&b7sD!q-Bk;0(;}=e(PpQ~c@7 ztjQ_a&Xnm5oUPN#mq?h9F*ZGIT$=O!^t%25GXlL%^2~4iYi2d}I-fk#%n5on+8O)o zv5>aSTD6L3*`ed(ZTu}}*YSGW`4e+Sc%7i!9{z#3WxP(RFV7!3_dj0$f1g|8b#~AH z$=S5v9Vc>OCI8C{rvy69Uy5~dUz+E{E}rg>S@MO~-{_UZV$RNYD*D$fJL+{tFF)!} zb$WT7?^d*P&aAxZ99#8_KWp{bV$Qm?OPv3#>+LkpbNnas`~gm3eu7hMV;3iO-686K^`Ll(k7=kJ+~G3?`>PosbpbW;c_6y^%U0 zEn{q^CnhCpTndG#s3^~ntg+KQL#Cxir+r0lf delta 20085 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 diff --git a/cps/translations/es/LC_MESSAGES/messages.po b/cps/translations/es/LC_MESSAGES/messages.po index 206f5129..960f9dee 100644 --- a/cps/translations/es/LC_MESSAGES/messages.po +++ b/cps/translations/es/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2019-05-31 11:20+0200\n" +"POT-Creation-Date: 2019-06-22 19:54+0200\n" "PO-Revision-Date: 2018-10-05 11:27+0100\n" "Last-Translator: victorhck \n" "Language: es\n" @@ -16,13 +16,13 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.6.0\n" +"Generated-By: Babel 2.7.0\n" -#: cps/about.py:76 +#: cps/about.py:78 msgid "Statistics" msgstr "Estadísticas" -#: cps/admin.py:97 +#: cps/admin.py:98 msgid "Server restarted, please reload page" msgstr "Servidor reiniciado. Por favor, recargue la página" @@ -30,186 +30,202 @@ msgstr "Servidor reiniciado. Por favor, recargue la página" msgid "Performing shutdown of server, please close window" msgstr "Servidor en proceso de apagado. Por favor, cierre la ventana." -#: cps/admin.py:120 cps/updater.py:445 +#: cps/admin.py:119 cps/updater.py:448 msgid "Unknown" msgstr "Desconocido" -#: cps/admin.py:139 +#: cps/admin.py:138 msgid "Admin page" msgstr "Página de administración" -#: cps/admin.py:208 cps/admin.py:486 +#: cps/admin.py:207 cps/admin.py:532 msgid "Calibre-Web configuration updated" msgstr "Configuración de Calibre-Web actualizada" -#: cps/admin.py:222 cps/templates/admin.html:102 +#: cps/admin.py:220 cps/templates/admin.html:102 msgid "UI Configuration" msgstr "Configuración de la interfaz del usuario" -#: cps/admin.py:295 +#: cps/admin.py:293 msgid "Import of optional Google Drive requirements missing" msgstr "Falta la importación de requisitos opcionales de Google Drive" -#: cps/admin.py:298 +#: cps/admin.py:296 msgid "client_secrets.json is missing or not readable" msgstr "client_secrets.json está desaparecido o no se puede leer" -#: cps/admin.py:303 cps/admin.py:332 +#: cps/admin.py:301 cps/admin.py:330 msgid "client_secrets.json is not configured for web application" msgstr "client_secrets.json no está configurado para la aplicación web" -#: cps/admin.py:335 cps/admin.py:361 cps/admin.py:373 cps/admin.py:398 -#: cps/admin.py:426 cps/admin.py:440 cps/admin.py:463 cps/admin.py:476 -#: cps/admin.py:494 cps/admin.py:501 cps/admin.py:516 -#: cps/templates/admin.html:101 +#: cps/admin.py:333 cps/admin.py:359 cps/admin.py:371 cps/admin.py:396 +#: cps/admin.py:403 cps/admin.py:436 cps/admin.py:460 cps/admin.py:474 +#: cps/admin.py:493 cps/admin.py:510 cps/admin.py:522 cps/admin.py:538 +#: cps/admin.py:545 cps/admin.py:559 cps/templates/admin.html:101 msgid "Basic Configuration" msgstr "Configuración básica" -#: cps/admin.py:358 +#: cps/admin.py:356 msgid "Keyfile location is not valid, please enter correct path" msgstr "La ubicación del fichero clave (Keyfile) no es válida, por favor introduzca la ruta correcta" -#: cps/admin.py:370 +#: cps/admin.py:368 cps/admin.py:433 msgid "Certfile location is not valid, please enter correct path" msgstr "La ubicación del fichero de certificado (Certfile) no es válida, por favor introduzca la ruta correcta" -#: cps/admin.py:395 -msgid "Please enter a LDAP provider and a DN" +#: cps/admin.py:393 +msgid "Please enter a LDAP provider, port, DN and user object identifier" msgstr "" -#: cps/admin.py:423 +#: cps/admin.py:400 +msgid "Please enter a LDAP service account and password" +msgstr "" + +#: cps/admin.py:457 msgid "Please enter Github oauth credentials" msgstr "" -#: cps/admin.py:437 +#: cps/admin.py:471 msgid "Please enter Google oauth credentials" msgstr "" -#: cps/admin.py:460 +#: cps/admin.py:490 msgid "Logfile location is not valid, please enter correct path" msgstr "La ubicación del fichero de registro (Logfile) no es válida, por favor introduzca la ruta correcta" -#: cps/admin.py:498 +#: cps/admin.py:507 +msgid "Access Logfile location is not valid, please enter correct path" +msgstr "" + +#: cps/admin.py:542 msgid "DB location is not valid, please enter correct path" msgstr "Localización de la BD inválida, por favor introduzca la ruta correcta" -#: cps/admin.py:558 cps/web.py:1045 +#: cps/admin.py:602 cps/web.py:1040 msgid "Please fill out all fields!" msgstr "¡Por favor completar todos los campos!" -#: cps/admin.py:560 cps/admin.py:566 cps/admin.py:582 +#: cps/admin.py:604 cps/admin.py:610 cps/admin.py:626 #: cps/templates/admin.html:35 msgid "Add new user" msgstr "Agregar un nuevo usuario" -#: cps/admin.py:564 cps/web.py:1248 +#: cps/admin.py:608 cps/web.py:1251 msgid "E-mail is not from valid domain" msgstr "El correo electrónico no tiene un nombre de dominio válido" -#: cps/admin.py:572 +#: cps/admin.py:616 #, python-format msgid "User '%(user)s' created" msgstr "Usuario '%(user)s' creado" -#: cps/admin.py:576 +#: cps/admin.py:620 msgid "Found an existing account for this e-mail address or nickname." msgstr "Encontrada una cuenta existente para este correo electrónico o nombre de usuario." -#: cps/admin.py:607 +#: cps/admin.py:651 #, python-format msgid "Test e-mail successfully send to %(kindlemail)s" msgstr "Correo electrónico de prueba enviado con éxito a %(kindlemail)s" -#: cps/admin.py:610 +#: cps/admin.py:654 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Ocurrió un error enviando el correo electrónico de prueba: %(res)s" -#: cps/admin.py:612 cps/web.py:1029 +#: cps/admin.py:656 cps/web.py:1023 msgid "Please configure your kindle e-mail address first..." msgstr "Por favor configure primero la dirección de correo de su kindle..." -#: cps/admin.py:614 +#: cps/admin.py:658 msgid "E-mail server settings updated" msgstr "Actualizados los ajustes del servidor de correo electrónico" -#: cps/admin.py:615 +#: cps/admin.py:659 msgid "Edit e-mail server settings" msgstr "Editar los ajustes del servidor de correo electrónico" -#: cps/admin.py:640 +#: cps/admin.py:687 #, python-format msgid "User '%(nick)s' deleted" msgstr "Usuario '%(nick)s' borrado" -#: cps/admin.py:711 +#: cps/admin.py:690 +msgid "No admin user remaining, can't delete user" +msgstr "" + +#: cps/admin.py:761 #, python-format msgid "User '%(nick)s' updated" msgstr "Usuario '%(nick)s' actualizado" -#: cps/admin.py:714 +#: cps/admin.py:764 msgid "An unknown error occured." msgstr "Ocurrió un error inesperado." -#: cps/admin.py:717 +#: cps/admin.py:767 #, python-format msgid "Edit User %(nick)s" msgstr "Editar Usuario %(nick)s" -#: cps/admin.py:733 +#: cps/admin.py:783 #, python-format msgid "Password for user %(user)s reset" msgstr "Contraseña para el usuario %(user)s reinicializada" -#: cps/admin.py:736 cps/web.py:1070 +#: cps/admin.py:786 cps/web.py:1065 msgid "An unknown error occurred. Please try again later." msgstr "Ha ocurrido un error desconocido. Por favor vuelva a intentarlo más tarde." -#: cps/admin.py:755 +#: cps/admin.py:797 +msgid "Logfile viewer" +msgstr "" + +#: cps/admin.py:832 msgid "Requesting update package" msgstr "Solicitando paquete de actualización" -#: cps/admin.py:756 +#: cps/admin.py:833 msgid "Downloading update package" msgstr "Descargando paquete de actualización" -#: cps/admin.py:757 +#: cps/admin.py:834 msgid "Unzipping update package" msgstr "Descomprimiendo paquete de actualización" -#: cps/admin.py:758 +#: cps/admin.py:835 msgid "Replacing files" msgstr "" -#: cps/admin.py:759 +#: cps/admin.py:836 msgid "Database connections are closed" msgstr "Los conexiones de base datos están cerradas" -#: cps/admin.py:760 +#: cps/admin.py:837 msgid "Stopping server" msgstr "" -#: cps/admin.py:761 +#: cps/admin.py:838 msgid "Update finished, please press okay and reload page" msgstr "Actualización finalizada. Por favor, pulse OK y recargue la página" -#: cps/admin.py:762 cps/admin.py:763 cps/admin.py:764 cps/admin.py:765 +#: cps/admin.py:839 cps/admin.py:840 cps/admin.py:841 cps/admin.py:842 msgid "Update failed:" msgstr "" -#: cps/admin.py:762 cps/updater.py:277 cps/updater.py:456 cps/updater.py:458 +#: cps/admin.py:839 cps/updater.py:273 cps/updater.py:459 cps/updater.py:461 msgid "HTTP Error" msgstr "Error HTTP" -#: cps/admin.py:763 cps/updater.py:279 cps/updater.py:460 +#: cps/admin.py:840 cps/updater.py:275 cps/updater.py:463 msgid "Connection error" msgstr "Error de conexión" -#: cps/admin.py:764 cps/updater.py:281 cps/updater.py:462 +#: cps/admin.py:841 cps/updater.py:277 cps/updater.py:465 msgid "Timeout while establishing connection" msgstr "Tiempo agotado mientras se trataba de establecer la conexión" -#: cps/admin.py:765 cps/updater.py:283 cps/updater.py:464 +#: cps/admin.py:842 cps/updater.py:279 cps/updater.py:467 msgid "General error" msgstr "Error general" @@ -227,720 +243,714 @@ msgstr "Permisos de ejecución ausentes" msgid "not configured" msgstr "" -#: cps/editbooks.py:218 cps/editbooks.py:432 +#: cps/editbooks.py:215 cps/editbooks.py:394 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "Error abriendo un eBook. El archivo no existe o no es accesible" -#: cps/editbooks.py:246 +#: cps/editbooks.py:243 msgid "edit metadata" msgstr "editar metadatos" -#: cps/editbooks.py:325 cps/editbooks.py:595 +#: cps/editbooks.py:322 cps/editbooks.py:557 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "No se permite subir archivos con la extensión '%(ext)s' a este servidor" -#: cps/editbooks.py:329 cps/editbooks.py:599 +#: cps/editbooks.py:326 cps/editbooks.py:561 msgid "File to be uploaded must have an extension" msgstr "El archivo a subir debe tener una extensión" -#: cps/editbooks.py:341 cps/editbooks.py:619 +#: cps/editbooks.py:338 cps/editbooks.py:581 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Fallo al crear la ruta %(path)s (permiso denegado)" -#: cps/editbooks.py:346 +#: cps/editbooks.py:343 #, python-format msgid "Failed to store file %(file)s." msgstr "Falla al guardar el archivo %(file)s." -#: cps/editbooks.py:363 +#: cps/editbooks.py:360 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Fichero con formato %(ext)s añadido a %(book)s" -#: cps/editbooks.py:382 -#, python-format -msgid "Failed to create path for cover %(path)s (Permission denied)." -msgstr "" - -#: cps/editbooks.py:390 -#, python-format -msgid "Failed to store cover-file %(cover)s." -msgstr "" - -#: cps/editbooks.py:393 -msgid "Cover-file is not a valid image file" -msgstr "" - -#: cps/editbooks.py:399 cps/editbooks.py:413 +#: cps/editbooks.py:374 msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" msgstr "" -#: cps/editbooks.py:445 cps/editbooks.py:454 +#: cps/editbooks.py:407 cps/editbooks.py:416 msgid "unknown" msgstr "desconocido" -#: cps/editbooks.py:486 +#: cps/editbooks.py:448 msgid "Cover is not a jpg file, can't save" msgstr "" -#: cps/editbooks.py:534 +#: cps/editbooks.py:496 #, python-format msgid "%(langname)s is not a valid language" msgstr "%(langname)s no es un idioma válido" -#: cps/editbooks.py:565 +#: cps/editbooks.py:527 msgid "Metadata successfully updated" msgstr "" -#: cps/editbooks.py:574 +#: cps/editbooks.py:536 msgid "Error editing book, please check logfile for details" msgstr "Error al editar el libro, por favor compruebe el fichero de registro (logfile) para tener más detalles" -#: cps/editbooks.py:624 +#: cps/editbooks.py:586 #, python-format msgid "Failed to store file %(file)s (Permission denied)." msgstr "Fallo al guardar el archivo %(file)s (permiso denegado)" -#: cps/editbooks.py:629 +#: cps/editbooks.py:591 #, python-format msgid "Failed to delete file %(file)s (Permission denied)." msgstr "Fallo al borrar el archivo %(file)s (permiso denegado)" -#: cps/editbooks.py:712 +#: cps/editbooks.py:674 #, python-format msgid "File %(file)s uploaded" msgstr "" -#: cps/editbooks.py:741 +#: cps/editbooks.py:703 msgid "Source or destination format for conversion missing" msgstr "Falta la fuente o el formato de destino para la conversión" -#: cps/editbooks.py:751 +#: cps/editbooks.py:711 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Libro puesto a la cola con éxito para convertirlo a %(book_format)s" -#: cps/editbooks.py:755 +#: cps/editbooks.py:715 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Ocurrió un error al convertir este libro: %(res)s" -#: cps/gdrive.py:56 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgstr "" -#: cps/gdrive.py:101 +#: cps/gdrive.py:106 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "El dominio de devolución de llamada no se ha verificado, siga los pasos para verificar el dominio en la consola de desarrollador de Google" -#: cps/helper.py:97 +#: cps/helper.py:94 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "%(format)s formato no encontrado para el id del libro: %(book)d" -#: cps/helper.py:109 +#: cps/helper.py:106 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s no encontrado en Google Drive: %(fn)s" -#: cps/helper.py:116 cps/helper.py:223 cps/templates/detail.html:41 +#: cps/helper.py:113 cps/helper.py:220 cps/templates/detail.html:41 #: cps/templates/detail.html:45 msgid "Send to Kindle" msgstr "Enviar a Kindle" -#: cps/helper.py:117 cps/helper.py:135 cps/helper.py:225 +#: cps/helper.py:114 cps/helper.py:132 cps/helper.py:222 msgid "This e-mail has been sent via Calibre-Web." msgstr "Este correo electrónico ha sido enviado por Calibre-Web." -#: cps/helper.py:128 +#: cps/helper.py:125 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s no encontrado: %(fn)s" -#: cps/helper.py:133 +#: cps/helper.py:130 msgid "Calibre-Web test e-mail" msgstr "Calibre-Web comprobar correo electrónico" -#: cps/helper.py:134 +#: cps/helper.py:131 msgid "Test e-mail" msgstr "Comprobar correo electrónico" -#: cps/helper.py:150 +#: cps/helper.py:147 msgid "Get Started with Calibre-Web" msgstr "Primeros pasos con Calibre-Web" -#: cps/helper.py:151 +#: cps/helper.py:148 #, python-format msgid "Registration e-mail for user: %(name)s" msgstr "Registrar un correo electrónico para el usuario: %(name)s" -#: cps/helper.py:165 cps/helper.py:167 cps/helper.py:169 cps/helper.py:177 -#: cps/helper.py:179 cps/helper.py:181 +#: cps/helper.py:162 cps/helper.py:164 cps/helper.py:166 cps/helper.py:174 +#: cps/helper.py:176 cps/helper.py:178 #, python-format msgid "Send %(format)s to Kindle" msgstr "" -#: cps/helper.py:185 +#: cps/helper.py:182 #, python-format msgid "Convert %(orig)s to %(format)s and send to Kindle" msgstr "" -#: cps/helper.py:224 +#: cps/helper.py:221 #, python-format msgid "E-mail: %(book)s" msgstr "Correo electrónico: %(book)s" -#: cps/helper.py:227 +#: cps/helper.py:224 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "El fichero solicitado no puede ser leído. ¿Quizás existen problemas con los permisos?" -#: cps/helper.py:335 +#: cps/helper.py:331 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "El renombrado del título de: '%(src)s' a '%(dest)s' falló con errores: %(error)s" -#: cps/helper.py:345 +#: cps/helper.py:341 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "El renombrado del autor de: '%(src)s' a '%(dest)s' falló con errores: %(error)s" -#: cps/helper.py:359 +#: cps/helper.py:355 #, python-format msgid "Rename file in path '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "" -#: cps/helper.py:385 cps/helper.py:395 cps/helper.py:403 +#: cps/helper.py:381 cps/helper.py:391 cps/helper.py:399 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "Fichero %(file)s no encontrado en Google Drive" -#: cps/helper.py:424 +#: cps/helper.py:420 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "La ruta %(path)s del libro no fue encontrada en Google Drive" -#: cps/helper.py:584 +#: cps/helper.py:579 msgid "Error excecuting UnRar" msgstr "Error ejecutando UnRar" -#: cps/helper.py:586 +#: cps/helper.py:581 msgid "Unrar binary file not found" msgstr "Fichero binario Unrar no encontrado" -#: cps/helper.py:614 +#: cps/helper.py:609 msgid "Waiting" msgstr "Esperando" -#: cps/helper.py:616 +#: cps/helper.py:611 msgid "Failed" msgstr "Fallido" -#: cps/helper.py:618 +#: cps/helper.py:613 msgid "Started" msgstr "Comenzado" -#: cps/helper.py:620 +#: cps/helper.py:615 msgid "Finished" msgstr "Finalizado" -#: cps/helper.py:622 +#: cps/helper.py:617 msgid "Unknown Status" msgstr "" -#: cps/helper.py:627 +#: cps/helper.py:622 msgid "E-mail: " msgstr "" -#: cps/helper.py:629 cps/helper.py:633 +#: cps/helper.py:624 cps/helper.py:628 msgid "Convert: " msgstr "" -#: cps/helper.py:631 +#: cps/helper.py:626 msgid "Upload: " msgstr "" -#: cps/helper.py:635 +#: cps/helper.py:630 msgid "Unknown Task: " msgstr "" -#: cps/oauth_bb.py:87 +#: cps/oauth_bb.py:91 #, python-format -msgid "Register with %s, " +msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:145 +#: cps/oauth_bb.py:149 msgid "Failed to log in with GitHub." msgstr "" -#: cps/oauth_bb.py:150 +#: cps/oauth_bb.py:154 msgid "Failed to fetch user info from GitHub." msgstr "" -#: cps/oauth_bb.py:161 +#: cps/oauth_bb.py:165 msgid "Failed to log in with Google." msgstr "" -#: cps/oauth_bb.py:166 +#: cps/oauth_bb.py:170 msgid "Failed to fetch user info from Google." msgstr "" -#: cps/oauth_bb.py:265 +#: cps/oauth_bb.py:269 #, python-format msgid "Unlink to %(oauth)s success." msgstr "" -#: cps/oauth_bb.py:269 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s failed." msgstr "" -#: cps/oauth_bb.py:272 +#: cps/oauth_bb.py:276 #, python-format msgid "Not linked to %(oauth)s." msgstr "" -#: cps/oauth_bb.py:300 +#: cps/oauth_bb.py:304 msgid "GitHub Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:319 +#: cps/oauth_bb.py:323 msgid "Google Oauth error, please retry later." msgstr "" -#: cps/shelf.py:40 cps/shelf.py:92 +#: cps/shelf.py:46 cps/shelf.py:98 msgid "Invalid shelf specified" msgstr "Estante especificado inválido" -#: cps/shelf.py:47 +#: cps/shelf.py:53 #, python-format msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" msgstr "" -#: cps/shelf.py:55 +#: cps/shelf.py:61 msgid "You are not allowed to edit public shelves" msgstr "" -#: cps/shelf.py:64 +#: cps/shelf.py:70 #, python-format msgid "Book is already part of the shelf: %(shelfname)s" msgstr "" -#: cps/shelf.py:78 +#: cps/shelf.py:84 #, python-format msgid "Book has been added to shelf: %(sname)s" msgstr "El libro fue agregado a el estante: %(sname)s" -#: cps/shelf.py:97 +#: cps/shelf.py:103 #, python-format msgid "You are not allowed to add a book to the the shelf: %(name)s" msgstr "No tiene permiso para añadir un libro a el estante: %(name)s" -#: cps/shelf.py:102 +#: cps/shelf.py:108 msgid "User is not allowed to edit public shelves" msgstr "El usuario no tiene permiso para editar estantes públicos" -#: cps/shelf.py:120 +#: cps/shelf.py:126 #, python-format msgid "Books are already part of the shelf: %(name)s" msgstr "Los libros ya forman parte del estante: %(name)s" -#: cps/shelf.py:134 +#: cps/shelf.py:140 #, python-format msgid "Books have been added to shelf: %(sname)s" msgstr "Los libros han sido añadidos al estante: %(sname)s" -#: cps/shelf.py:136 +#: cps/shelf.py:142 #, python-format msgid "Could not add books to shelf: %(sname)s" msgstr "No se pudieron agregar libros al estante: %(sname)s" -#: cps/shelf.py:173 +#: cps/shelf.py:179 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "El libro fue eliminado del estante: %(sname)s" -#: cps/shelf.py:179 +#: cps/shelf.py:185 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "Lo siento, no tiene permiso para eliminar un libro del estante: %(sname)s" -#: cps/shelf.py:200 cps/shelf.py:224 +#: cps/shelf.py:206 cps/shelf.py:230 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "Un estante con el nombre '%(title)s' ya existe." -#: cps/shelf.py:205 +#: cps/shelf.py:211 #, python-format msgid "Shelf %(title)s created" msgstr "Estante %(title)s creado" -#: cps/shelf.py:207 cps/shelf.py:235 +#: cps/shelf.py:213 cps/shelf.py:241 msgid "There was an error" msgstr "Ha sucedido un error" -#: cps/shelf.py:208 cps/shelf.py:210 +#: cps/shelf.py:214 cps/shelf.py:216 msgid "create a shelf" msgstr "crear un estante" -#: cps/shelf.py:233 +#: cps/shelf.py:239 #, python-format msgid "Shelf %(title)s changed" msgstr "Estante %(title)s cambiado" -#: cps/shelf.py:236 cps/shelf.py:238 +#: cps/shelf.py:242 cps/shelf.py:244 msgid "Edit a shelf" msgstr "Editar un estante" -#: cps/shelf.py:259 -#, python-format -msgid "successfully deleted shelf %(name)s" -msgstr "Estante %(name)s fue borrado correctamente" - -#: cps/shelf.py:289 +#: cps/shelf.py:295 #, python-format msgid "Shelf: '%(name)s'" msgstr "Estante: '%(name)s'" -#: cps/shelf.py:292 +#: cps/shelf.py:298 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Error al abrir un estante. El estante no existe o no es accesible" -#: cps/shelf.py:324 +#: cps/shelf.py:330 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Cambiar orden del estante: '%(name)s'" -#: cps/ub.py:111 +#: cps/ub.py:68 msgid "Recently Added" msgstr "Añadido recientemente" -#: cps/ub.py:113 +#: cps/ub.py:70 msgid "Show recent books" msgstr "Mostrar libros recientes" -#: cps/templates/index.xml:17 cps/ub.py:114 +#: cps/templates/index.xml:17 cps/ub.py:71 msgid "Hot Books" msgstr "Libros populares" -#: cps/ub.py:115 +#: cps/ub.py:72 msgid "Show hot books" msgstr "Mostrar libros populares" -#: cps/templates/index.xml:24 cps/ub.py:118 +#: cps/templates/index.xml:24 cps/ub.py:75 msgid "Best rated Books" msgstr "Libros mejor valorados" -#: cps/ub.py:120 +#: cps/ub.py:77 msgid "Show best rated books" msgstr "Mostrar libros mejor valorados" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:121 -#: cps/web.py:965 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:78 +#: cps/web.py:958 msgid "Read Books" msgstr "Libros leídos" -#: cps/ub.py:123 +#: cps/ub.py:80 msgid "Show read and unread" msgstr "Mostrar leídos y no leídos" -#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:125 -#: cps/web.py:969 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:82 +#: cps/web.py:962 msgid "Unread Books" msgstr "Libros no leídos" -#: cps/ub.py:127 +#: cps/ub.py:84 msgid "Show unread" msgstr "" -#: cps/ub.py:128 +#: cps/ub.py:85 msgid "Discover" msgstr "Descubrir" -#: cps/ub.py:130 +#: cps/ub.py:87 msgid "Show random books" msgstr "Mostrar libros al azar" -#: cps/ub.py:131 +#: cps/ub.py:88 msgid "Categories" msgstr "Categorías" -#: cps/ub.py:133 +#: cps/ub.py:90 msgid "Show category selection" msgstr "Mostrar categorías elegidas" #: cps/templates/book_edit.html:71 cps/templates/search_form.html:53 -#: cps/ub.py:134 +#: cps/ub.py:91 msgid "Series" msgstr "Series" -#: cps/ub.py:136 +#: cps/ub.py:93 msgid "Show series selection" msgstr "Mostrar series seleccionadas" -#: cps/templates/index.xml:61 cps/ub.py:137 +#: cps/templates/index.xml:61 cps/ub.py:94 msgid "Authors" msgstr "Autores" -#: cps/ub.py:139 +#: cps/ub.py:96 msgid "Show author selection" msgstr "Mostrar selección de autores" -#: cps/templates/index.xml:68 cps/ub.py:141 +#: cps/templates/index.xml:68 cps/ub.py:98 msgid "Publishers" msgstr "" -#: cps/ub.py:143 +#: cps/ub.py:100 msgid "Show publisher selection" msgstr "" -#: cps/templates/search_form.html:74 cps/ub.py:144 +#: cps/templates/search_form.html:74 cps/ub.py:101 msgid "Languages" msgstr "Idioma" -#: cps/ub.py:147 +#: cps/ub.py:104 msgid "Show language selection" msgstr "Mostrar idioma seleccionado" -#: cps/ub.py:148 +#: cps/ub.py:105 msgid "Ratings" msgstr "" -#: cps/ub.py:150 +#: cps/ub.py:107 msgid "Show ratings selection" msgstr "" -#: cps/ub.py:151 +#: cps/ub.py:108 msgid "File formats" msgstr "" -#: cps/ub.py:153 +#: cps/ub.py:110 msgid "Show file formats selection" msgstr "" -#: cps/updater.py:257 cps/updater.py:364 cps/updater.py:377 +#: cps/updater.py:253 cps/updater.py:360 cps/updater.py:373 msgid "Unexpected data while reading update information" msgstr "Dato inesperado mientras se leía la información de actualización" -#: cps/updater.py:264 cps/updater.py:370 +#: cps/updater.py:260 cps/updater.py:366 msgid "No update available. You already have the latest version installed" msgstr "Actualización no disponible. Ya tienes la versión más reciente instalada" -#: cps/updater.py:290 cps/updater.py:422 +#: cps/updater.py:286 msgid "A new update is available. Click on the button below to update to the latest version." msgstr "Una nueva actualización está disponible. Haz clic en el botón inferior para actualizar a la versión más reciente." -#: cps/updater.py:343 +#: cps/updater.py:339 msgid "Could not fetch update information" msgstr "No se puede conseguir información sobre la actualización" -#: cps/updater.py:357 +#: cps/updater.py:353 msgid "No release information available" msgstr "" -#: cps/updater.py:403 cps/updater.py:412 +#: cps/updater.py:406 cps/updater.py:415 #, python-format msgid "A new update is available. Click on the button below to update to version: %(version)s" msgstr "" -#: cps/web.py:457 +#: cps/updater.py:425 +msgid "Click on the button below to update to the latest stable version." +msgstr "" + +#: cps/web.py:445 msgid "Recently Added Books" msgstr "Libros recientemente añadidos" -#: cps/web.py:484 +#: cps/web.py:473 msgid "Best rated books" msgstr "Libros mejor valorados" -#: cps/templates/index.xml:38 cps/web.py:492 +#: cps/templates/index.xml:38 cps/web.py:481 msgid "Random Books" msgstr "Libros al azar" -#: cps/web.py:516 +#: cps/web.py:505 msgid "Books" msgstr "" -#: cps/web.py:543 +#: cps/web.py:532 msgid "Hot Books (most downloaded)" msgstr "Libros populares (los mas descargados)" -#: cps/web.py:553 cps/web.py:1294 cps/web.py:1383 +#: cps/web.py:542 cps/web.py:1298 cps/web.py:1386 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:" -#: cps/web.py:580 +#: cps/web.py:559 +#, python-format +msgid "Author: %(name)s" +msgstr "" + +#: cps/web.py:571 #, python-format msgid "Publisher: %(name)s" msgstr "" -#: cps/web.py:591 +#: cps/web.py:582 #, python-format msgid "Series: %(serie)s" msgstr "Series : %(serie)s" -#: cps/web.py:602 +#: cps/web.py:593 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:613 +#: cps/web.py:604 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:625 +#: cps/web.py:616 #, python-format msgid "Category: %(name)s" msgstr "Categoría : %(name)s" -#: cps/web.py:659 +#: cps/web.py:650 msgid "Publisher list" msgstr "" -#: cps/templates/index.xml:82 cps/web.py:675 +#: cps/templates/index.xml:82 cps/web.py:666 msgid "Series list" msgstr "Lista de series" -#: cps/web.py:689 +#: cps/web.py:680 msgid "Ratings list" msgstr "" -#: cps/web.py:702 +#: cps/web.py:693 msgid "File formats list" msgstr "" -#: cps/web.py:730 +#: cps/web.py:721 msgid "Available languages" msgstr "Idiomas disponibles" -#: cps/web.py:750 +#: cps/web.py:741 #, python-format msgid "Language: %(name)s" msgstr "Idioma: %(name)s" -#: cps/templates/index.xml:75 cps/web.py:764 +#: cps/templates/index.xml:75 cps/web.py:755 msgid "Category list" msgstr "Lista de categorías" -#: cps/templates/layout.html:73 cps/web.py:777 +#: cps/templates/layout.html:73 cps/web.py:769 msgid "Tasks" msgstr "Tareas" -#: cps/web.py:841 +#: cps/web.py:834 msgid "Published after " msgstr "Publicado antes de" -#: cps/web.py:848 +#: cps/web.py:841 msgid "Published before " msgstr "Publicado después de" -#: cps/web.py:862 +#: cps/web.py:855 #, python-format msgid "Rating <= %(rating)s" msgstr "Clasificación <= %(rating)s" -#: cps/web.py:864 +#: cps/web.py:857 #, python-format msgid "Rating >= %(rating)s" msgstr "Clasificación >= %(rating)s" -#: cps/web.py:924 cps/web.py:933 +#: cps/web.py:917 cps/web.py:926 msgid "search" msgstr "búsqueda" -#: cps/web.py:1018 +#: cps/web.py:1012 msgid "Please configure the SMTP mail settings first..." msgstr "Configurar primero los parámetros SMTP por favor..." -#: cps/web.py:1023 +#: cps/web.py:1017 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Libro puesto en la cola de envío a %(kindlemail)s" -#: cps/web.py:1027 +#: cps/web.py:1021 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "Ha sucedido un error en el envío del libro: %(res)s" -#: cps/web.py:1046 cps/web.py:1071 cps/web.py:1076 cps/web.py:1081 -#: cps/web.py:1085 +#: cps/web.py:1041 cps/web.py:1066 cps/web.py:1070 cps/web.py:1075 +#: cps/web.py:1079 msgid "register" msgstr "registrarse" -#: cps/web.py:1073 +#: cps/web.py:1068 msgid "Your e-mail is not allowed to register" msgstr "Su correo electrónico no está permitido para registrarse" -#: cps/web.py:1077 +#: cps/web.py:1071 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Se ha enviado un correo electrónico de verificación a su cuenta de correo electrónico." -#: cps/web.py:1080 +#: cps/web.py:1074 msgid "This username or e-mail address is already in use." msgstr "Este nombre de usuario o correo electrónico ya están en uso." -#: cps/web.py:1103 cps/web.py:1115 -#, python-format -msgid "You are now logged in as: '%(nickname)s'" +#: cps/web.py:1089 +msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1108 cps/web.py:1120 +#: cps/web.py:1098 cps/web.py:1212 +#, python-format +msgid "you are now logged in as: '%(nickname)s'" +msgstr "Sesión iniciada como : '%(nickname)s'" + +#: cps/web.py:1105 cps/web.py:1122 msgid "Wrong Username or Password" msgstr "Usuario o contraseña inválido" -#: cps/web.py:1111 +#: cps/web.py:1108 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "" -#: cps/web.py:1124 cps/web.py:1146 +#: cps/web.py:1117 +#, python-format +msgid "You are now logged in as: '%(nickname)s'" +msgstr "" + +#: cps/web.py:1126 cps/web.py:1148 msgid "login" msgstr "Iniciar sesión" -#: cps/web.py:1158 cps/web.py:1189 +#: cps/web.py:1160 cps/web.py:1191 msgid "Token not found" msgstr "Token no encontrado" -#: cps/web.py:1166 cps/web.py:1197 +#: cps/web.py:1168 cps/web.py:1199 msgid "Token has expired" msgstr "El token ha expirado" -#: cps/web.py:1174 +#: cps/web.py:1176 msgid "Success! Please return to your device" msgstr "¡Correcto! Por favor regrese a su dispositivo" -#: cps/web.py:1210 -#, python-format -msgid "you are now logged in as: '%(nickname)s'" -msgstr "Sesión iniciada como : '%(nickname)s'" - -#: cps/web.py:1250 cps/web.py:1277 cps/web.py:1281 +#: cps/web.py:1253 cps/web.py:1280 cps/web.py:1284 #, python-format msgid "%(name)s's profile" msgstr "Perfil de %(name)s" -#: cps/web.py:1274 +#: cps/web.py:1277 msgid "Found an existing account for this e-mail address." msgstr "Encontrada una cuenta existente para esa dirección de correo electrónico." -#: cps/web.py:1279 +#: cps/web.py:1282 msgid "Profile updated" msgstr "Perfil actualizado" -#: cps/web.py:1304 cps/web.py:1306 cps/web.py:1308 cps/web.py:1314 -#: cps/web.py:1318 +#: cps/web.py:1308 cps/web.py:1310 cps/web.py:1312 cps/web.py:1318 +#: cps/web.py:1322 msgid "Read a Book" msgstr "Leer un libro" -#: cps/web.py:1328 +#: cps/web.py:1332 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "" -#: cps/worker.py:308 +#: cps/worker.py:311 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Falló Ebook-converter: %(error)s" -#: cps/worker.py:319 +#: cps/worker.py:322 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Kindlegen falló con error %(error)s. Mensaje: %(message)s" @@ -1056,53 +1066,57 @@ msgid "Administration" msgstr "Administración" #: cps/templates/admin.html:109 +msgid "View Logfiles" +msgstr "" + +#: cps/templates/admin.html:110 msgid "Reconnect to Calibre DB" msgstr "Reconectar a la BD Calibre" -#: cps/templates/admin.html:110 +#: cps/templates/admin.html:111 msgid "Restart Calibre-Web" msgstr "Reiniciar Calibre-Web" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:112 msgid "Stop Calibre-Web" msgstr "Detener Calibre-Web" -#: cps/templates/admin.html:117 +#: cps/templates/admin.html:118 msgid "Update" msgstr "Actualizar" -#: cps/templates/admin.html:121 +#: cps/templates/admin.html:122 msgid "Version" msgstr "Versión" -#: cps/templates/admin.html:122 +#: cps/templates/admin.html:123 msgid "Details" msgstr "Detalles" -#: cps/templates/admin.html:128 +#: cps/templates/admin.html:129 msgid "Current version" msgstr "Versión actual" -#: cps/templates/admin.html:134 +#: cps/templates/admin.html:135 msgid "Check for update" msgstr "Comprobar actualizaciones" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:136 msgid "Perform Update" msgstr "Realizar actualización" -#: cps/templates/admin.html:147 +#: cps/templates/admin.html:148 msgid "Do you really want to restart Calibre-Web?" msgstr "¿Realmente quiere reiniciar Calibre-Web?" -#: cps/templates/admin.html:152 cps/templates/admin.html:166 -#: cps/templates/admin.html:186 cps/templates/shelf.html:72 +#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:187 cps/templates/shelf.html:72 msgid "Ok" msgstr "Ok" -#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:154 cps/templates/admin.html:168 #: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:281 cps/templates/config_view_edit.html:147 +#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:74 #: cps/templates/layout.html:28 cps/templates/shelf.html:73 #: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:12 @@ -1110,11 +1124,11 @@ msgstr "Ok" msgid "Back" msgstr "Regresar" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:166 msgid "Do you really want to stop Calibre-Web?" msgstr "¿Realmente quiere detener Calibre-Web?" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:178 msgid "Updating, please do not reload page" msgstr "Actualizando. Por favor, no recargue la página" @@ -1243,7 +1257,7 @@ msgstr "ver libro tras la edición" msgid "Get metadata" msgstr "Obtener metadatos" -#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:279 +#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329 #: cps/templates/config_view_edit.html:146 cps/templates/login.html:20 #: cps/templates/search_form.html:150 cps/templates/shelf_edit.html:17 #: cps/templates/user_edit.html:130 @@ -1387,123 +1401,171 @@ msgstr "Nivel de registro" msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "Ubicación y nombre del archivo de registro (si no se especifica será calibre-web.log)" -#: cps/templates/config_edit.html:140 +#: cps/templates/config_edit.html:134 +msgid "Enable Access Log" +msgstr "" + +#: cps/templates/config_edit.html:137 +msgid "Location and name of access logfile (access.log for no entry)" +msgstr "" + +#: cps/templates/config_edit.html:148 msgid "Feature Configuration" msgstr "Configuración de características" -#: cps/templates/config_edit.html:148 +#: cps/templates/config_edit.html:156 msgid "Enable uploading" msgstr "Permitir subida" -#: cps/templates/config_edit.html:152 +#: cps/templates/config_edit.html:160 msgid "Enable anonymous browsing" msgstr "Permitir navegación anónima" -#: cps/templates/config_edit.html:156 +#: cps/templates/config_edit.html:164 msgid "Enable public registration" msgstr "Permitir registro público" -#: cps/templates/config_edit.html:160 +#: cps/templates/config_edit.html:168 msgid "Enable remote login (\"magic link\")" msgstr "Permitir inicio de sesión remoto (\"magic link\")" -#: cps/templates/config_edit.html:165 +#: cps/templates/config_edit.html:173 msgid "Use" msgstr "Usar" -#: cps/templates/config_edit.html:166 +#: cps/templates/config_edit.html:174 msgid "Obtain an API Key" msgstr "Obtener una API Key" -#: cps/templates/config_edit.html:170 +#: cps/templates/config_edit.html:178 msgid "Goodreads API Key" msgstr "Goodreads API Key" -#: cps/templates/config_edit.html:174 +#: cps/templates/config_edit.html:182 msgid "Goodreads API Secret" msgstr "Goodreads API Secret" -#: cps/templates/config_edit.html:181 +#: cps/templates/config_edit.html:189 msgid "Login type" msgstr "" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:191 msgid "Use standard Authentication" msgstr "" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:193 msgid "Use LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:188 +#: cps/templates/config_edit.html:196 msgid "Use GitHub OAuth" msgstr "" -#: cps/templates/config_edit.html:189 +#: cps/templates/config_edit.html:197 msgid "Use Google OAuth" msgstr "" -#: cps/templates/config_edit.html:196 -msgid "LDAP Provider URL" +#: cps/templates/config_edit.html:204 +msgid "LDAP Server Host Name or IP Address" +msgstr "" + +#: cps/templates/config_edit.html:208 +msgid "LDAP Server Port" +msgstr "" + +#: cps/templates/config_edit.html:212 +msgid "LDAP schema (ldap or ldaps)" +msgstr "" + +#: cps/templates/config_edit.html:216 +msgid "LDAP Admin username" +msgstr "" + +#: cps/templates/config_edit.html:220 +msgid "LDAP Admin password" +msgstr "" + +#: cps/templates/config_edit.html:225 +msgid "LDAP Server use SSL" msgstr "" -#: cps/templates/config_edit.html:200 +#: cps/templates/config_edit.html:229 +msgid "LDAP Server use TLS" +msgstr "" + +#: cps/templates/config_edit.html:233 +msgid "LDAP Server Certificate" +msgstr "" + +#: cps/templates/config_edit.html:237 +msgid "LDAP SSL Certificate Path" +msgstr "" + +#: cps/templates/config_edit.html:242 msgid "LDAP Distinguished Name (DN)" msgstr "" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:246 +msgid "LDAP User object filter" +msgstr "" + +#: cps/templates/config_edit.html:251 +msgid "LDAP Server is OpenLDAP?" +msgstr "" + +#: cps/templates/config_edit.html:258 msgid "Obtain GitHub OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:211 +#: cps/templates/config_edit.html:261 msgid "GitHub OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:215 +#: cps/templates/config_edit.html:265 msgid "GitHub OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:221 +#: cps/templates/config_edit.html:271 msgid "Obtain Google OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:224 +#: cps/templates/config_edit.html:274 msgid "Google OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:228 +#: cps/templates/config_edit.html:278 msgid "Google OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:242 +#: cps/templates/config_edit.html:292 msgid "External binaries" msgstr "Binarios externos" -#: cps/templates/config_edit.html:250 +#: cps/templates/config_edit.html:300 msgid "No converter" msgstr "No convertir" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:302 msgid "Use Kindlegen" msgstr "Utilizar Kindlegen" -#: cps/templates/config_edit.html:254 +#: cps/templates/config_edit.html:304 msgid "Use calibre's ebook converter" msgstr "Utilizar el convertidor de libros de Calibre" -#: cps/templates/config_edit.html:258 +#: cps/templates/config_edit.html:308 msgid "E-Book converter settings" msgstr "Ajustes del convertidos E-Book" -#: cps/templates/config_edit.html:262 +#: cps/templates/config_edit.html:312 msgid "Path to convertertool" msgstr "Ruta para convertertool" -#: cps/templates/config_edit.html:268 +#: cps/templates/config_edit.html:318 msgid "Location of Unrar binary" msgstr "Ubicación del binario de Unrar" -#: cps/templates/config_edit.html:284 cps/templates/layout.html:84 +#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 #: cps/templates/login.html:4 msgid "Login" msgstr "Inicio de sesión" @@ -1717,7 +1779,7 @@ msgstr "" msgid "Discover (Random Books)" msgstr "Descubrir (Libros al azar)" -#: cps/templates/index.html:65 +#: cps/templates/index.html:64 msgid "Group by series" msgstr "" @@ -1860,6 +1922,14 @@ msgstr "Recordarme" msgid "Log in with magic link" msgstr "Iniciar sesión con \"magic link\"" +#: cps/templates/logviewer.html:5 +msgid "Show Calibre-Web log" +msgstr "" + +#: cps/templates/logviewer.html:8 +msgid "Show access log" +msgstr "" + #: cps/templates/osd.xml:5 msgid "Calibre-Web ebook catalog" msgstr "Cátalogo de ebook de Calibre-Web" @@ -2254,13 +2324,13 @@ msgstr "Descargas recientes" #~ msgstr "" #~ msgid "Failed to create path for cover %(path)s (Permission denied)." -#~ msgstr "Fallo al crear la ruta para la cubierta %(path)s (Permiso denegado)." +#~ msgstr "" #~ msgid "Failed to store cover-file %(cover)s." -#~ msgstr "Fallo al guardar el archivo de cubierta %(cover)s." +#~ msgstr "" #~ msgid "Cover-file is not a valid image file" -#~ msgstr "El archivo de imagen de la portada no es válido" +#~ msgstr "" #~ msgid "Cover is not a jpg file, can't save" #~ msgstr "La cubierta no es un archivo jpg, no se puede guardar" @@ -2319,3 +2389,15 @@ msgstr "Descargas recientes" #~ msgid "PDF.js viewer" #~ msgstr "Visor PDF.js" +#~ msgid "Please enter a LDAP provider and a DN" +#~ msgstr "" + +#~ msgid "successfully deleted shelf %(name)s" +#~ msgstr "Estante %(name)s fue borrado correctamente" + +#~ msgid "LDAP Provider URL" +#~ msgstr "" + +#~ msgid "Register with %s, " +#~ msgstr "" + diff --git a/cps/translations/fr/LC_MESSAGES/messages.mo b/cps/translations/fr/LC_MESSAGES/messages.mo index ad5a2025f8bc4297029ea344ce5d557031de1911..e227b89e8c1f3d687c69951520032b3d6d72b591 100644 GIT binary patch delta 14337 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 G%=!;<;NRl_ diff --git a/cps/translations/fr/LC_MESSAGES/messages.po b/cps/translations/fr/LC_MESSAGES/messages.po index 957dba43..3f63673c 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: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2019-05-31 11:20+0200\n" +"POT-Creation-Date: 2019-06-22 19:54+0200\n" "PO-Revision-Date: 2019-02-03 14:57+0100\n" "Last-Translator: Nicolas Roudninski \n" "Language: fr\n" @@ -29,13 +29,13 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.6.0\n" +"Generated-By: Babel 2.7.0\n" -#: cps/about.py:76 +#: cps/about.py:78 msgid "Statistics" msgstr "Statistiques" -#: cps/admin.py:97 +#: cps/admin.py:98 msgid "Server restarted, please reload page" msgstr "Serveur redémarré, merci de rafraîchir la page" @@ -43,186 +43,202 @@ msgstr "Serveur redémarré, merci de rafraîchir la page" msgid "Performing shutdown of server, please close window" msgstr "Arrêt du serveur en cours, merci de fermer la fenêtre" -#: cps/admin.py:120 cps/updater.py:445 +#: cps/admin.py:119 cps/updater.py:448 msgid "Unknown" msgstr "Inconnu" -#: cps/admin.py:139 +#: cps/admin.py:138 msgid "Admin page" msgstr "Page administrateur" -#: cps/admin.py:208 cps/admin.py:486 +#: cps/admin.py:207 cps/admin.py:532 msgid "Calibre-Web configuration updated" msgstr "Configuration de Calibre-Web mise à jour" -#: cps/admin.py:222 cps/templates/admin.html:102 +#: cps/admin.py:220 cps/templates/admin.html:102 msgid "UI Configuration" msgstr "Configuration de l’interface utilisateur" -#: cps/admin.py:295 +#: cps/admin.py:293 msgid "Import of optional Google Drive requirements missing" msgstr "L’import des pré-requis optionnels pour Google Drive est manquant" -#: cps/admin.py:298 +#: cps/admin.py:296 msgid "client_secrets.json is missing or not readable" msgstr "client_secrets.json est manquant ou ne peut être lu" -#: cps/admin.py:303 cps/admin.py:332 +#: cps/admin.py:301 cps/admin.py:330 msgid "client_secrets.json is not configured for web application" msgstr "client_secrets.json n’est pas configuré pour une application web" -#: cps/admin.py:335 cps/admin.py:361 cps/admin.py:373 cps/admin.py:398 -#: cps/admin.py:426 cps/admin.py:440 cps/admin.py:463 cps/admin.py:476 -#: cps/admin.py:494 cps/admin.py:501 cps/admin.py:516 -#: cps/templates/admin.html:101 +#: cps/admin.py:333 cps/admin.py:359 cps/admin.py:371 cps/admin.py:396 +#: cps/admin.py:403 cps/admin.py:436 cps/admin.py:460 cps/admin.py:474 +#: cps/admin.py:493 cps/admin.py:510 cps/admin.py:522 cps/admin.py:538 +#: cps/admin.py:545 cps/admin.py:559 cps/templates/admin.html:101 msgid "Basic Configuration" msgstr "Configuration principale" -#: cps/admin.py:358 +#: cps/admin.py:356 msgid "Keyfile location is not valid, please enter correct path" msgstr "L’emplacement du fichier de la clé de chiffrement (keyfile) n’est pas valide, veuillez saisir un chemin d’accès correct" -#: cps/admin.py:370 +#: cps/admin.py:368 cps/admin.py:433 msgid "Certfile location is not valid, please enter correct path" msgstr "L’emplacement du fichier de certificat (cert) n’est pas valide, veuillez saisir un chemin d’accès correct" -#: cps/admin.py:395 -msgid "Please enter a LDAP provider and a DN" +#: cps/admin.py:393 +msgid "Please enter a LDAP provider, port, DN and user object identifier" msgstr "" -#: cps/admin.py:423 +#: cps/admin.py:400 +msgid "Please enter a LDAP service account and password" +msgstr "" + +#: cps/admin.py:457 msgid "Please enter Github oauth credentials" msgstr "" -#: cps/admin.py:437 +#: cps/admin.py:471 msgid "Please enter Google oauth credentials" msgstr "" -#: cps/admin.py:460 +#: cps/admin.py:490 msgid "Logfile location is not valid, please enter correct path" msgstr "L’emplacement du fichier de Log n’est pas valide, veuillez saisir un chemin d’accès correct" -#: cps/admin.py:498 +#: cps/admin.py:507 +msgid "Access Logfile location is not valid, please enter correct path" +msgstr "" + +#: cps/admin.py:542 msgid "DB location is not valid, please enter correct path" msgstr "L’emplacement du fichier de base de donnée (DB) n’est pas valide, veuillez saisir un chemin d’accès correct" -#: cps/admin.py:558 cps/web.py:1045 +#: cps/admin.py:602 cps/web.py:1040 msgid "Please fill out all fields!" msgstr "SVP, complétez tous les champs !" -#: cps/admin.py:560 cps/admin.py:566 cps/admin.py:582 +#: cps/admin.py:604 cps/admin.py:610 cps/admin.py:626 #: cps/templates/admin.html:35 msgid "Add new user" msgstr "Ajouter un nouvel utilisateur" -#: cps/admin.py:564 cps/web.py:1248 +#: cps/admin.py:608 cps/web.py:1251 msgid "E-mail is not from valid domain" msgstr "Cette adresse de courriel n’appartient pas à un domaine valide" -#: cps/admin.py:572 +#: cps/admin.py:616 #, python-format msgid "User '%(user)s' created" msgstr "Utilisateur '%(user)s' créé" -#: cps/admin.py:576 +#: cps/admin.py:620 msgid "Found an existing account for this e-mail address or nickname." msgstr "Un compte existant a été trouvé pour cette adresse de courriel ou pour ce surnom." -#: cps/admin.py:607 +#: cps/admin.py:651 #, python-format msgid "Test e-mail successfully send to %(kindlemail)s" msgstr "Courriel de test envoyé avec succès sur %(kindlemail)s" -#: cps/admin.py:610 +#: cps/admin.py:654 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Il y a eu une erreur pendant l’envoi du courriel de test : %(res)s" -#: cps/admin.py:612 cps/web.py:1029 +#: cps/admin.py:656 cps/web.py:1023 msgid "Please configure your kindle e-mail address first..." msgstr "Veuillez configurer votre adresse de courriel Kindle en premier lieu…" -#: cps/admin.py:614 +#: cps/admin.py:658 msgid "E-mail server settings updated" msgstr "Les paramètres du serveur de courriels ont été mis à jour" -#: cps/admin.py:615 +#: cps/admin.py:659 msgid "Edit e-mail server settings" msgstr "Modifier les paramètres du serveur de courriels" -#: cps/admin.py:640 +#: cps/admin.py:687 #, python-format msgid "User '%(nick)s' deleted" msgstr "Utilisateur '%(nick)s' supprimé" -#: cps/admin.py:711 +#: cps/admin.py:690 +msgid "No admin user remaining, can't delete user" +msgstr "" + +#: cps/admin.py:761 #, python-format msgid "User '%(nick)s' updated" msgstr "Utilisateur '%(nick)s' mis à jour" -#: cps/admin.py:714 +#: cps/admin.py:764 msgid "An unknown error occured." msgstr "Oups ! Une erreur inconnue a eu lieu." -#: cps/admin.py:717 +#: cps/admin.py:767 #, python-format msgid "Edit User %(nick)s" msgstr "Éditer l'utilisateur %(nick)s" -#: cps/admin.py:733 +#: cps/admin.py:783 #, python-format msgid "Password for user %(user)s reset" msgstr "Le mot de passe de l’utilisateur %(user)s a été réinitialisé" -#: cps/admin.py:736 cps/web.py:1070 +#: cps/admin.py:786 cps/web.py:1065 msgid "An unknown error occurred. Please try again later." msgstr "Une erreur inconnue est survenue. Veuillez réessayer plus tard." -#: cps/admin.py:755 +#: cps/admin.py:797 +msgid "Logfile viewer" +msgstr "" + +#: cps/admin.py:832 msgid "Requesting update package" msgstr "Demander une mise à jour" -#: cps/admin.py:756 +#: cps/admin.py:833 msgid "Downloading update package" msgstr "Téléchargement la mise à jour" -#: cps/admin.py:757 +#: cps/admin.py:834 msgid "Unzipping update package" msgstr "Décompression de la mise à jour" -#: cps/admin.py:758 +#: cps/admin.py:835 msgid "Replacing files" msgstr "Remplacement des fichiers" -#: cps/admin.py:759 +#: cps/admin.py:836 msgid "Database connections are closed" msgstr "Connexion à la base de donnée fermée" -#: cps/admin.py:760 +#: cps/admin.py:837 msgid "Stopping server" msgstr "Arrêt du serveur" -#: cps/admin.py:761 +#: cps/admin.py:838 msgid "Update finished, please press okay and reload page" msgstr "Mise à jour terminée, merci d’appuyer sur okay et de rafraîchir la page" -#: cps/admin.py:762 cps/admin.py:763 cps/admin.py:764 cps/admin.py:765 +#: cps/admin.py:839 cps/admin.py:840 cps/admin.py:841 cps/admin.py:842 msgid "Update failed:" msgstr "La mise à jour à échouée : " -#: cps/admin.py:762 cps/updater.py:277 cps/updater.py:456 cps/updater.py:458 +#: cps/admin.py:839 cps/updater.py:273 cps/updater.py:459 cps/updater.py:461 msgid "HTTP Error" msgstr "Erreur HTTP" -#: cps/admin.py:763 cps/updater.py:279 cps/updater.py:460 +#: cps/admin.py:840 cps/updater.py:275 cps/updater.py:463 msgid "Connection error" msgstr "Erreur de connexion" -#: cps/admin.py:764 cps/updater.py:281 cps/updater.py:462 +#: cps/admin.py:841 cps/updater.py:277 cps/updater.py:465 msgid "Timeout while establishing connection" msgstr "Délai d'attente dépassé lors de l'établissement de connexion" -#: cps/admin.py:765 cps/updater.py:283 cps/updater.py:464 +#: cps/admin.py:842 cps/updater.py:279 cps/updater.py:467 msgid "General error" msgstr "Erreur générale" @@ -240,720 +256,714 @@ msgstr "Permission d’exécution manquante" msgid "not configured" msgstr "non configuré" -#: cps/editbooks.py:218 cps/editbooks.py:432 +#: cps/editbooks.py:215 cps/editbooks.py:394 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/editbooks.py:246 +#: cps/editbooks.py:243 msgid "edit metadata" msgstr "modifier les métadonnées" -#: cps/editbooks.py:325 cps/editbooks.py:595 +#: cps/editbooks.py:322 cps/editbooks.py:557 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "L’extension de fichier '%(ext)s' n’est pas autorisée pour être déposée sur ce serveur" -#: cps/editbooks.py:329 cps/editbooks.py:599 +#: cps/editbooks.py:326 cps/editbooks.py:561 msgid "File to be uploaded must have an extension" msgstr "Pour être déposé le fichier doit avoir une extension" -#: cps/editbooks.py:341 cps/editbooks.py:619 +#: cps/editbooks.py:338 cps/editbooks.py:581 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Impossible de créer le chemin %(path)s (permission refusée)" -#: cps/editbooks.py:346 +#: cps/editbooks.py:343 #, python-format msgid "Failed to store file %(file)s." msgstr "Echec de la sauvegarde du fichier %(file)s." -#: cps/editbooks.py:363 +#: cps/editbooks.py:360 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Le format de fichier %(ext)s a été ajouté à %(book)s" -#: cps/editbooks.py:382 -#, python-format -msgid "Failed to create path for cover %(path)s (Permission denied)." -msgstr "" - -#: cps/editbooks.py:390 -#, python-format -msgid "Failed to store cover-file %(cover)s." -msgstr "" - -#: cps/editbooks.py:393 -msgid "Cover-file is not a valid image file" -msgstr "" - -#: cps/editbooks.py:399 cps/editbooks.py:413 +#: cps/editbooks.py:374 msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" msgstr "" -#: cps/editbooks.py:445 cps/editbooks.py:454 +#: cps/editbooks.py:407 cps/editbooks.py:416 msgid "unknown" msgstr "inconnu" -#: cps/editbooks.py:486 +#: cps/editbooks.py:448 msgid "Cover is not a jpg file, can't save" msgstr "" -#: cps/editbooks.py:534 +#: cps/editbooks.py:496 #, python-format msgid "%(langname)s is not a valid language" msgstr "%(langname)s n'est pas une langue valide" -#: cps/editbooks.py:565 +#: cps/editbooks.py:527 msgid "Metadata successfully updated" msgstr "Les métadonnées ont bien été mise à jour" -#: cps/editbooks.py:574 +#: cps/editbooks.py:536 msgid "Error editing book, please check logfile for details" msgstr "Erreur d’édition du livre, veuillez consulter le journal (log) pour plus de détails" -#: cps/editbooks.py:624 +#: cps/editbooks.py:586 #, python-format msgid "Failed to store file %(file)s (Permission denied)." msgstr "Impossible d'enregistrer le fichier %(file)s (permission refusée)" -#: cps/editbooks.py:629 +#: cps/editbooks.py:591 #, python-format msgid "Failed to delete file %(file)s (Permission denied)." msgstr "Impossible de supprimer le fichier %(file)s (permission refusée)" -#: cps/editbooks.py:712 +#: cps/editbooks.py:674 #, python-format msgid "File %(file)s uploaded" msgstr "" -#: cps/editbooks.py:741 +#: cps/editbooks.py:703 msgid "Source or destination format for conversion missing" msgstr "Le format de conversion de la source ou de la destination est manquant" -#: cps/editbooks.py:751 +#: cps/editbooks.py:711 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Le livre a été mis avec succès en file de traitement pour conversion vers %(book_format)s" -#: cps/editbooks.py:755 +#: cps/editbooks.py:715 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Une erreur est survenue au cours de la conversion du livre : %(res)s" -#: cps/gdrive.py:56 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgstr "" -#: cps/gdrive.py:101 +#: cps/gdrive.py:106 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Le domaine de retour d’appel (Callback domain) est non vérifié, Veuillez suivre les étapes nécessaires pour vérifier le domaine dans la console de développement de Google" -#: cps/helper.py:97 +#: cps/helper.py:94 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "le format %(format)s est introuvable pour le livre : %(book)d" -#: cps/helper.py:109 +#: cps/helper.py:106 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "le %(format)s est introuvable sur Google Drive : %(fn)s" -#: cps/helper.py:116 cps/helper.py:223 cps/templates/detail.html:41 +#: cps/helper.py:113 cps/helper.py:220 cps/templates/detail.html:41 #: cps/templates/detail.html:45 msgid "Send to Kindle" msgstr "Envoyer vers Kindle" -#: cps/helper.py:117 cps/helper.py:135 cps/helper.py:225 +#: cps/helper.py:114 cps/helper.py:132 cps/helper.py:222 msgid "This e-mail has been sent via Calibre-Web." msgstr "Ce courriel a été envoyé depuis Calibre-Web." -#: cps/helper.py:128 +#: cps/helper.py:125 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s introuvable : %(fn)s" -#: cps/helper.py:133 +#: cps/helper.py:130 msgid "Calibre-Web test e-mail" msgstr "Courriel de test de Calibre-Web" -#: cps/helper.py:134 +#: cps/helper.py:131 msgid "Test e-mail" msgstr "Courriel de test" -#: cps/helper.py:150 +#: cps/helper.py:147 msgid "Get Started with Calibre-Web" msgstr "Bien démarrer avec Calibre-Web" -#: cps/helper.py:151 +#: cps/helper.py:148 #, python-format msgid "Registration e-mail for user: %(name)s" msgstr "Courriel d’inscription pour l’utilisateur : %(name)s" -#: cps/helper.py:165 cps/helper.py:167 cps/helper.py:169 cps/helper.py:177 -#: cps/helper.py:179 cps/helper.py:181 +#: cps/helper.py:162 cps/helper.py:164 cps/helper.py:166 cps/helper.py:174 +#: cps/helper.py:176 cps/helper.py:178 #, python-format msgid "Send %(format)s to Kindle" msgstr "Envoyer %(format)s vers le Kindle" -#: cps/helper.py:185 +#: cps/helper.py:182 #, python-format msgid "Convert %(orig)s to %(format)s and send to Kindle" msgstr "Convertir de %(orig)s vers %(format)s et envoyer au Kindle" -#: cps/helper.py:224 +#: cps/helper.py:221 #, python-format msgid "E-mail: %(book)s" msgstr "Courriel : %(book)s" -#: cps/helper.py:227 +#: cps/helper.py:224 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "Le fichier demandé n’a pu être lu. Problème de permission d’accès ?" -#: cps/helper.py:335 +#: cps/helper.py:331 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Renommer le titre de : '%(src)s' à '%(dest)s' a échoué avec l’erreur : %(error)s" -#: cps/helper.py:345 +#: cps/helper.py:341 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Renommer l’auteur de : '%(src)s' à '%(dest)s' a échoué avec l’erreur : %(error)s" -#: cps/helper.py:359 +#: cps/helper.py:355 #, python-format msgid "Rename file in path '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "La modification du nom de fichier du chemin : '%(src)s' vers '%(dest)s' a échoué avec l’erreur : %(error)s" -#: cps/helper.py:385 cps/helper.py:395 cps/helper.py:403 +#: cps/helper.py:381 cps/helper.py:391 cps/helper.py:399 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "" -#: cps/helper.py:424 +#: cps/helper.py:420 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "" -#: cps/helper.py:584 +#: cps/helper.py:579 msgid "Error excecuting UnRar" msgstr "" -#: cps/helper.py:586 +#: cps/helper.py:581 msgid "Unrar binary file not found" msgstr "" -#: cps/helper.py:614 +#: cps/helper.py:609 msgid "Waiting" msgstr "" -#: cps/helper.py:616 +#: cps/helper.py:611 msgid "Failed" msgstr "" -#: cps/helper.py:618 +#: cps/helper.py:613 msgid "Started" msgstr "" -#: cps/helper.py:620 +#: cps/helper.py:615 msgid "Finished" msgstr "Terminé" -#: cps/helper.py:622 +#: cps/helper.py:617 msgid "Unknown Status" msgstr "Statut inconnu" -#: cps/helper.py:627 +#: cps/helper.py:622 msgid "E-mail: " msgstr "Courriel : " -#: cps/helper.py:629 cps/helper.py:633 +#: cps/helper.py:624 cps/helper.py:628 msgid "Convert: " msgstr "Convertir vers : " -#: cps/helper.py:631 +#: cps/helper.py:626 msgid "Upload: " msgstr "Déposer : " -#: cps/helper.py:635 +#: cps/helper.py:630 msgid "Unknown Task: " msgstr "Tâche inconnue : " -#: cps/oauth_bb.py:87 +#: cps/oauth_bb.py:91 #, python-format -msgid "Register with %s, " +msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:145 +#: cps/oauth_bb.py:149 msgid "Failed to log in with GitHub." msgstr "" -#: cps/oauth_bb.py:150 +#: cps/oauth_bb.py:154 msgid "Failed to fetch user info from GitHub." msgstr "" -#: cps/oauth_bb.py:161 +#: cps/oauth_bb.py:165 msgid "Failed to log in with Google." msgstr "" -#: cps/oauth_bb.py:166 +#: cps/oauth_bb.py:170 msgid "Failed to fetch user info from Google." msgstr "" -#: cps/oauth_bb.py:265 +#: cps/oauth_bb.py:269 #, python-format msgid "Unlink to %(oauth)s success." msgstr "" -#: cps/oauth_bb.py:269 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s failed." msgstr "" -#: cps/oauth_bb.py:272 +#: cps/oauth_bb.py:276 #, python-format msgid "Not linked to %(oauth)s." msgstr "" -#: cps/oauth_bb.py:300 +#: cps/oauth_bb.py:304 msgid "GitHub Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:319 +#: cps/oauth_bb.py:323 msgid "Google Oauth error, please retry later." msgstr "" -#: cps/shelf.py:40 cps/shelf.py:92 +#: cps/shelf.py:46 cps/shelf.py:98 msgid "Invalid shelf specified" msgstr "L’étagère indiquée est invalide" -#: cps/shelf.py:47 +#: cps/shelf.py:53 #, python-format msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" msgstr "Désolé, vous n’êtes pas autorisé à ajouter un livre dans l’étagère %(shelfname)s" -#: cps/shelf.py:55 +#: cps/shelf.py:61 msgid "You are not allowed to edit public shelves" msgstr "Désolé, vous n’êtes pas autorisé à éditer les étagères publiques" -#: cps/shelf.py:64 +#: cps/shelf.py:70 #, python-format msgid "Book is already part of the shelf: %(shelfname)s" msgstr "Ce livre est déjà sur l’étagère : %(shelfname)s" -#: cps/shelf.py:78 +#: cps/shelf.py:84 #, python-format msgid "Book has been added to shelf: %(sname)s" msgstr "Le livre a bien été ajouté à l'étagère : %(sname)s" -#: cps/shelf.py:97 +#: cps/shelf.py:103 #, python-format msgid "You are not allowed to add a book to the the shelf: %(name)s" msgstr "Vous n’êtes pas autorisé à ajouter un livre dans l’étagère %(name)s" -#: cps/shelf.py:102 +#: cps/shelf.py:108 msgid "User is not allowed to edit public shelves" msgstr "L’utilisateur n’est pas autorisé à éditer les étagères publiques" -#: cps/shelf.py:120 +#: cps/shelf.py:126 #, python-format msgid "Books are already part of the shelf: %(name)s" msgstr "Ces livres sont déjà sur l’étagère : %(name)s" -#: cps/shelf.py:134 +#: cps/shelf.py:140 #, python-format msgid "Books have been added to shelf: %(sname)s" msgstr "Les livres ont été ajoutés à l’étagère : %(sname)s" -#: cps/shelf.py:136 +#: cps/shelf.py:142 #, python-format msgid "Could not add books to shelf: %(sname)s" msgstr "Impossible d’ajouter les livres à l’étagère : %(sname)s" -#: cps/shelf.py:173 +#: cps/shelf.py:179 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "Le livre a été supprimé de l'étagère %(sname)s" -#: cps/shelf.py:179 +#: cps/shelf.py:185 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "Désolé, vous n’êtes pas autorisé à enlever un livre de cette étagère : %(sname)s" -#: cps/shelf.py:200 cps/shelf.py:224 +#: cps/shelf.py:206 cps/shelf.py:230 #, 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/shelf.py:205 +#: cps/shelf.py:211 #, python-format msgid "Shelf %(title)s created" msgstr "Étagère %(title)s créée" -#: cps/shelf.py:207 cps/shelf.py:235 +#: cps/shelf.py:213 cps/shelf.py:241 msgid "There was an error" msgstr "Il y a eu une erreur" -#: cps/shelf.py:208 cps/shelf.py:210 +#: cps/shelf.py:214 cps/shelf.py:216 msgid "create a shelf" msgstr "Créer une étagère" -#: cps/shelf.py:233 +#: cps/shelf.py:239 #, python-format msgid "Shelf %(title)s changed" msgstr "L’étagère %(title)s a été modifiée" -#: cps/shelf.py:236 cps/shelf.py:238 +#: cps/shelf.py:242 cps/shelf.py:244 msgid "Edit a shelf" msgstr "Modifier une étagère" -#: cps/shelf.py:259 -#, python-format -msgid "successfully deleted shelf %(name)s" -msgstr "l’étagère %(name)s a été supprimé avec succès" - -#: cps/shelf.py:289 +#: cps/shelf.py:295 #, python-format msgid "Shelf: '%(name)s'" msgstr "Étagère : '%(name)s'" -#: cps/shelf.py:292 +#: cps/shelf.py:298 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Erreur à l’ouverture de l’étagère. Elle n’existe plus ou n’est plus accessible." -#: cps/shelf.py:324 +#: cps/shelf.py:330 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Modifier l’arrangement de l’étagère : ‘%(name)s’" -#: cps/ub.py:111 +#: cps/ub.py:68 msgid "Recently Added" msgstr "Ajouts récents" -#: cps/ub.py:113 +#: cps/ub.py:70 msgid "Show recent books" msgstr "Afficher les livres récents" -#: cps/templates/index.xml:17 cps/ub.py:114 +#: cps/templates/index.xml:17 cps/ub.py:71 msgid "Hot Books" msgstr "Livres populaires" -#: cps/ub.py:115 +#: cps/ub.py:72 msgid "Show hot books" msgstr "Montrer les livres populaires" -#: cps/templates/index.xml:24 cps/ub.py:118 +#: cps/templates/index.xml:24 cps/ub.py:75 msgid "Best rated Books" msgstr "Livres les mieux notés" -#: cps/ub.py:120 +#: cps/ub.py:77 msgid "Show best rated books" msgstr "Montrer les livres les mieux notés" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:121 -#: cps/web.py:965 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:78 +#: cps/web.py:958 msgid "Read Books" msgstr "Livres lus" -#: cps/ub.py:123 +#: cps/ub.py:80 msgid "Show read and unread" msgstr "Montrer lu et non-lu" -#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:125 -#: cps/web.py:969 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:82 +#: cps/web.py:962 msgid "Unread Books" msgstr "Livres non-lus" -#: cps/ub.py:127 +#: cps/ub.py:84 msgid "Show unread" msgstr "" -#: cps/ub.py:128 +#: cps/ub.py:85 msgid "Discover" msgstr "Découvrir" -#: cps/ub.py:130 +#: cps/ub.py:87 msgid "Show random books" msgstr "Montrer des livres au hasard" -#: cps/ub.py:131 +#: cps/ub.py:88 msgid "Categories" msgstr "Catégories" -#: cps/ub.py:133 +#: cps/ub.py:90 msgid "Show category selection" msgstr "Montrer la sélection par catégories" #: cps/templates/book_edit.html:71 cps/templates/search_form.html:53 -#: cps/ub.py:134 +#: cps/ub.py:91 msgid "Series" msgstr "Séries" -#: cps/ub.py:136 +#: cps/ub.py:93 msgid "Show series selection" msgstr "Montrer la sélection par séries" -#: cps/templates/index.xml:61 cps/ub.py:137 +#: cps/templates/index.xml:61 cps/ub.py:94 msgid "Authors" msgstr "Auteurs" -#: cps/ub.py:139 +#: cps/ub.py:96 msgid "Show author selection" msgstr "Montrer la sélection par auteur" -#: cps/templates/index.xml:68 cps/ub.py:141 +#: cps/templates/index.xml:68 cps/ub.py:98 msgid "Publishers" msgstr "Editeurs" -#: cps/ub.py:143 +#: cps/ub.py:100 msgid "Show publisher selection" msgstr "Montrer la sélection par éditeur" -#: cps/templates/search_form.html:74 cps/ub.py:144 +#: cps/templates/search_form.html:74 cps/ub.py:101 msgid "Languages" msgstr "Langues" -#: cps/ub.py:147 +#: cps/ub.py:104 msgid "Show language selection" msgstr "Montrer la sélection par langue" -#: cps/ub.py:148 +#: cps/ub.py:105 msgid "Ratings" msgstr "" -#: cps/ub.py:150 +#: cps/ub.py:107 msgid "Show ratings selection" msgstr "" -#: cps/ub.py:151 +#: cps/ub.py:108 msgid "File formats" msgstr "" -#: cps/ub.py:153 +#: cps/ub.py:110 msgid "Show file formats selection" msgstr "" -#: cps/updater.py:257 cps/updater.py:364 cps/updater.py:377 +#: cps/updater.py:253 cps/updater.py:360 cps/updater.py:373 msgid "Unexpected data while reading update information" msgstr "Données inattendues lors de la lecture des informations de mise à jour" -#: cps/updater.py:264 cps/updater.py:370 +#: cps/updater.py:260 cps/updater.py:366 msgid "No update available. You already have the latest version installed" msgstr "Aucune mise à jour disponible. Vous avez déjà la dernière version installée" -#: cps/updater.py:290 cps/updater.py:422 +#: cps/updater.py:286 msgid "A new update is available. Click on the button below to update to the latest version." msgstr "Une nouvelle mise à jour est disponible. Cliquez sur le bouton ci-dessous pour charger la dernière version." -#: cps/updater.py:343 +#: cps/updater.py:339 msgid "Could not fetch update information" msgstr "Impossible d'extraire les informations de mise à jour" -#: cps/updater.py:357 +#: cps/updater.py:353 msgid "No release information available" msgstr "Aucune information concernant cette version n’est disponible" -#: cps/updater.py:403 cps/updater.py:412 +#: cps/updater.py:406 cps/updater.py:415 #, python-format msgid "A new update is available. Click on the button below to update to version: %(version)s" msgstr "Une nouvelle mise à jour est disponible. Cliquez sur le bouton ci-dessous pour charger la version %(version)s" -#: cps/web.py:457 +#: cps/updater.py:425 +msgid "Click on the button below to update to the latest stable version." +msgstr "" + +#: cps/web.py:445 msgid "Recently Added Books" msgstr "Ajouts récents" -#: cps/web.py:484 +#: cps/web.py:473 msgid "Best rated books" msgstr "Livres les mieux notés" -#: cps/templates/index.xml:38 cps/web.py:492 +#: cps/templates/index.xml:38 cps/web.py:481 msgid "Random Books" msgstr "Livres au hasard" -#: cps/web.py:516 +#: cps/web.py:505 msgid "Books" msgstr "" -#: cps/web.py:543 +#: cps/web.py:532 msgid "Hot Books (most downloaded)" msgstr "Livres populaires (les plus téléchargés)" -#: cps/web.py:553 cps/web.py:1294 cps/web.py:1383 +#: cps/web.py:542 cps/web.py:1298 cps/web.py:1386 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 pas accessible :" -#: cps/web.py:580 +#: cps/web.py:559 +#, python-format +msgid "Author: %(name)s" +msgstr "" + +#: cps/web.py:571 #, python-format msgid "Publisher: %(name)s" msgstr "Editeur : '%(name)s'" -#: cps/web.py:591 +#: cps/web.py:582 #, python-format msgid "Series: %(serie)s" msgstr "Séries : %(serie)s" -#: cps/web.py:602 +#: cps/web.py:593 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:613 +#: cps/web.py:604 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:625 +#: cps/web.py:616 #, python-format msgid "Category: %(name)s" msgstr "Catégorie : %(name)s" -#: cps/web.py:659 +#: cps/web.py:650 msgid "Publisher list" msgstr "Liste des éditeurs" -#: cps/templates/index.xml:82 cps/web.py:675 +#: cps/templates/index.xml:82 cps/web.py:666 msgid "Series list" msgstr "Liste des séries" -#: cps/web.py:689 +#: cps/web.py:680 msgid "Ratings list" msgstr "" -#: cps/web.py:702 +#: cps/web.py:693 msgid "File formats list" msgstr "" -#: cps/web.py:730 +#: cps/web.py:721 msgid "Available languages" msgstr "Langues disponibles" -#: cps/web.py:750 +#: cps/web.py:741 #, python-format msgid "Language: %(name)s" msgstr "Langue : %(name)s" -#: cps/templates/index.xml:75 cps/web.py:764 +#: cps/templates/index.xml:75 cps/web.py:755 msgid "Category list" msgstr "Liste des catégories" -#: cps/templates/layout.html:73 cps/web.py:777 +#: cps/templates/layout.html:73 cps/web.py:769 msgid "Tasks" msgstr "Tâches" -#: cps/web.py:841 +#: cps/web.py:834 msgid "Published after " msgstr "Publié après le " -#: cps/web.py:848 +#: cps/web.py:841 msgid "Published before " msgstr "Publié avant le " -#: cps/web.py:862 +#: cps/web.py:855 #, python-format msgid "Rating <= %(rating)s" msgstr "Évaluation <= %(rating)s" -#: cps/web.py:864 +#: cps/web.py:857 #, python-format msgid "Rating >= %(rating)s" msgstr "Évaluation >= %(rating)s" -#: cps/web.py:924 cps/web.py:933 +#: cps/web.py:917 cps/web.py:926 msgid "search" msgstr "recherche" -#: cps/web.py:1018 +#: cps/web.py:1012 msgid "Please configure the SMTP mail settings first..." msgstr "Veuillez configurer les paramètres SMTP au préalable…" -#: cps/web.py:1023 +#: cps/web.py:1017 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Le livre a été mis en file de traitement avec succès pour un envois vers %(kindlemail)s" -#: cps/web.py:1027 +#: cps/web.py:1021 #, 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:1046 cps/web.py:1071 cps/web.py:1076 cps/web.py:1081 -#: cps/web.py:1085 +#: cps/web.py:1041 cps/web.py:1066 cps/web.py:1070 cps/web.py:1075 +#: cps/web.py:1079 msgid "register" msgstr "s’enregistrer" -#: cps/web.py:1073 +#: cps/web.py:1068 msgid "Your e-mail is not allowed to register" msgstr "Votre adresse de courriel n’est pas autorisé pour une inscription" -#: cps/web.py:1077 +#: cps/web.py:1071 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Le courriel de confirmation a été envoyé à votre adresse." -#: cps/web.py:1080 +#: cps/web.py:1074 msgid "This username or e-mail address is already in use." msgstr "Ce nom d’utilisateur ou cette adresse de courriel sont déjà utilisés." -#: cps/web.py:1103 cps/web.py:1115 -#, python-format -msgid "You are now logged in as: '%(nickname)s'" +#: cps/web.py:1089 +msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1108 cps/web.py:1120 +#: cps/web.py:1098 cps/web.py:1212 +#, python-format +msgid "you are now logged in as: '%(nickname)s'" +msgstr "Vous êtes maintenant connecté sous : '%(nickname)s'" + +#: cps/web.py:1105 cps/web.py:1122 msgid "Wrong Username or Password" msgstr "Mauvais nom d'utilisateur ou mot de passe" -#: cps/web.py:1111 +#: cps/web.py:1108 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "" -#: cps/web.py:1124 cps/web.py:1146 +#: cps/web.py:1117 +#, python-format +msgid "You are now logged in as: '%(nickname)s'" +msgstr "" + +#: cps/web.py:1126 cps/web.py:1148 msgid "login" msgstr "connexion" -#: cps/web.py:1158 cps/web.py:1189 +#: cps/web.py:1160 cps/web.py:1191 msgid "Token not found" msgstr "Jeton non trouvé" -#: cps/web.py:1166 cps/web.py:1197 +#: cps/web.py:1168 cps/web.py:1199 msgid "Token has expired" msgstr "Jeton expiré" -#: cps/web.py:1174 +#: cps/web.py:1176 msgid "Success! Please return to your device" msgstr "Réussite! Merci de vous tourner vers votre appareil" -#: cps/web.py:1210 -#, python-format -msgid "you are now logged in as: '%(nickname)s'" -msgstr "Vous êtes maintenant connecté sous : '%(nickname)s'" - -#: cps/web.py:1250 cps/web.py:1277 cps/web.py:1281 +#: cps/web.py:1253 cps/web.py:1280 cps/web.py:1284 #, python-format msgid "%(name)s's profile" msgstr "Profil de %(name)s" -#: cps/web.py:1274 +#: cps/web.py:1277 msgid "Found an existing account for this e-mail address." msgstr "Un compte existant a été trouvé pour cette adresse de courriel" -#: cps/web.py:1279 +#: cps/web.py:1282 msgid "Profile updated" msgstr "Profil mis à jour" -#: cps/web.py:1304 cps/web.py:1306 cps/web.py:1308 cps/web.py:1314 -#: cps/web.py:1318 +#: cps/web.py:1308 cps/web.py:1310 cps/web.py:1312 cps/web.py:1318 +#: cps/web.py:1322 msgid "Read a Book" msgstr "Lire un livre" -#: cps/web.py:1328 +#: cps/web.py:1332 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "" -#: cps/worker.py:308 +#: cps/worker.py:311 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "La commande ebook-convert a échouée : %(error)s" -#: cps/worker.py:319 +#: cps/worker.py:322 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "La commande Kindlegen a échouée avec le code d’erreur : %(error)s et le message : %(message)s" @@ -1069,53 +1079,57 @@ msgid "Administration" msgstr "Administration" #: cps/templates/admin.html:109 +msgid "View Logfiles" +msgstr "" + +#: cps/templates/admin.html:110 msgid "Reconnect to Calibre DB" msgstr "Se reconnecter à Calibre-Web" -#: cps/templates/admin.html:110 +#: cps/templates/admin.html:111 msgid "Restart Calibre-Web" msgstr "Redémarrer Calibre-Web" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:112 msgid "Stop Calibre-Web" msgstr "Arrêter Calibre-Web" -#: cps/templates/admin.html:117 +#: cps/templates/admin.html:118 msgid "Update" msgstr "Mise à jour de Calibre-Web" -#: cps/templates/admin.html:121 +#: cps/templates/admin.html:122 msgid "Version" msgstr "Version" -#: cps/templates/admin.html:122 +#: cps/templates/admin.html:123 msgid "Details" msgstr "Détails" -#: cps/templates/admin.html:128 +#: cps/templates/admin.html:129 msgid "Current version" msgstr "Version actuellement installée" -#: cps/templates/admin.html:134 +#: cps/templates/admin.html:135 msgid "Check for update" msgstr "Rechercher les mise à jour" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:136 msgid "Perform Update" msgstr "Effectuer la mise à jour" -#: cps/templates/admin.html:147 +#: cps/templates/admin.html:148 msgid "Do you really want to restart Calibre-Web?" msgstr "Voulez-vous vraiment redémarrer Calibre-Web?" -#: cps/templates/admin.html:152 cps/templates/admin.html:166 -#: cps/templates/admin.html:186 cps/templates/shelf.html:72 +#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:187 cps/templates/shelf.html:72 msgid "Ok" msgstr "D’accord" -#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:154 cps/templates/admin.html:168 #: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:281 cps/templates/config_view_edit.html:147 +#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:74 #: cps/templates/layout.html:28 cps/templates/shelf.html:73 #: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:12 @@ -1123,11 +1137,11 @@ msgstr "D’accord" msgid "Back" msgstr "Retour" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:166 msgid "Do you really want to stop Calibre-Web?" msgstr "Voulez-Vous vraiment arrêter Calibre-Web?" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:178 msgid "Updating, please do not reload page" msgstr "Mise à jour en cours, ne pas rafraîchir la page" @@ -1256,7 +1270,7 @@ msgstr "voir le livre après l'édition" msgid "Get metadata" msgstr "Obtenir les métadonnées" -#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:279 +#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329 #: cps/templates/config_view_edit.html:146 cps/templates/login.html:20 #: cps/templates/search_form.html:150 cps/templates/shelf_edit.html:17 #: cps/templates/user_edit.html:130 @@ -1400,123 +1414,171 @@ msgstr "Niveau de journalisation" msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "Emplacement et nom du fichier journal (sera calibre-web.log si vide)" -#: cps/templates/config_edit.html:140 +#: cps/templates/config_edit.html:134 +msgid "Enable Access Log" +msgstr "" + +#: cps/templates/config_edit.html:137 +msgid "Location and name of access logfile (access.log for no entry)" +msgstr "" + +#: cps/templates/config_edit.html:148 msgid "Feature Configuration" msgstr "Configuration des options" -#: cps/templates/config_edit.html:148 +#: cps/templates/config_edit.html:156 msgid "Enable uploading" msgstr "Autoriser le dépôt de fichier" -#: cps/templates/config_edit.html:152 +#: cps/templates/config_edit.html:160 msgid "Enable anonymous browsing" msgstr "Autoriser la navigation anonyme" -#: cps/templates/config_edit.html:156 +#: cps/templates/config_edit.html:164 msgid "Enable public registration" msgstr "Autoriser l’inscription publique" -#: cps/templates/config_edit.html:160 +#: cps/templates/config_edit.html:168 msgid "Enable remote login (\"magic link\")" msgstr "Activer la connexion (\"magic link\")" -#: cps/templates/config_edit.html:165 +#: cps/templates/config_edit.html:173 msgid "Use" msgstr "Utiliser" -#: cps/templates/config_edit.html:166 +#: cps/templates/config_edit.html:174 msgid "Obtain an API Key" msgstr "Obtenir la clé API" -#: cps/templates/config_edit.html:170 +#: cps/templates/config_edit.html:178 msgid "Goodreads API Key" msgstr "Clé de l’API Goodreads" -#: cps/templates/config_edit.html:174 +#: cps/templates/config_edit.html:182 msgid "Goodreads API Secret" msgstr "Secret de l’API Goodreads" -#: cps/templates/config_edit.html:181 +#: cps/templates/config_edit.html:189 msgid "Login type" msgstr "" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:191 msgid "Use standard Authentication" msgstr "" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:193 msgid "Use LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:188 +#: cps/templates/config_edit.html:196 msgid "Use GitHub OAuth" msgstr "" -#: cps/templates/config_edit.html:189 +#: cps/templates/config_edit.html:197 msgid "Use Google OAuth" msgstr "" -#: cps/templates/config_edit.html:196 -msgid "LDAP Provider URL" +#: cps/templates/config_edit.html:204 +msgid "LDAP Server Host Name or IP Address" +msgstr "" + +#: cps/templates/config_edit.html:208 +msgid "LDAP Server Port" +msgstr "" + +#: cps/templates/config_edit.html:212 +msgid "LDAP schema (ldap or ldaps)" +msgstr "" + +#: cps/templates/config_edit.html:216 +msgid "LDAP Admin username" +msgstr "" + +#: cps/templates/config_edit.html:220 +msgid "LDAP Admin password" +msgstr "" + +#: cps/templates/config_edit.html:225 +msgid "LDAP Server use SSL" msgstr "" -#: cps/templates/config_edit.html:200 +#: cps/templates/config_edit.html:229 +msgid "LDAP Server use TLS" +msgstr "" + +#: cps/templates/config_edit.html:233 +msgid "LDAP Server Certificate" +msgstr "" + +#: cps/templates/config_edit.html:237 +msgid "LDAP SSL Certificate Path" +msgstr "" + +#: cps/templates/config_edit.html:242 msgid "LDAP Distinguished Name (DN)" msgstr "" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:246 +msgid "LDAP User object filter" +msgstr "" + +#: cps/templates/config_edit.html:251 +msgid "LDAP Server is OpenLDAP?" +msgstr "" + +#: cps/templates/config_edit.html:258 msgid "Obtain GitHub OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:211 +#: cps/templates/config_edit.html:261 msgid "GitHub OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:215 +#: cps/templates/config_edit.html:265 msgid "GitHub OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:221 +#: cps/templates/config_edit.html:271 msgid "Obtain Google OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:224 +#: cps/templates/config_edit.html:274 msgid "Google OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:228 +#: cps/templates/config_edit.html:278 msgid "Google OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:242 +#: cps/templates/config_edit.html:292 msgid "External binaries" msgstr "Configuration des outils de conversion externes" -#: cps/templates/config_edit.html:250 +#: cps/templates/config_edit.html:300 msgid "No converter" msgstr "Pas de convertisseur" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:302 msgid "Use Kindlegen" msgstr "Utiliser Kindlegen" -#: cps/templates/config_edit.html:254 +#: cps/templates/config_edit.html:304 msgid "Use calibre's ebook converter" msgstr "Utiliser Calibre ebook-convert" -#: cps/templates/config_edit.html:258 +#: cps/templates/config_edit.html:308 msgid "E-Book converter settings" msgstr "Paramètres de la commande de conversion de livres" -#: cps/templates/config_edit.html:262 +#: cps/templates/config_edit.html:312 msgid "Path to convertertool" msgstr "Chemin d’accès à la commande de conversion" -#: cps/templates/config_edit.html:268 +#: cps/templates/config_edit.html:318 msgid "Location of Unrar binary" msgstr "Chemin d’accès à la commande UnRar" -#: cps/templates/config_edit.html:284 cps/templates/layout.html:84 +#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 #: cps/templates/login.html:4 msgid "Login" msgstr "Connexion" @@ -1730,7 +1792,7 @@ msgstr "Retour à l’accueil" msgid "Discover (Random Books)" msgstr "Découverte (livres au hasard)" -#: cps/templates/index.html:65 +#: cps/templates/index.html:64 msgid "Group by series" msgstr "" @@ -1873,6 +1935,14 @@ msgstr "Se rappeler de moi" msgid "Log in with magic link" msgstr "Se connecter avec le (\"magic link\")" +#: cps/templates/logviewer.html:5 +msgid "Show Calibre-Web log" +msgstr "" + +#: cps/templates/logviewer.html:8 +msgid "Show access log" +msgstr "" + #: cps/templates/osd.xml:5 msgid "Calibre-Web ebook catalog" msgstr "Catalogue de livres électroniques Calibre-Web" @@ -2222,13 +2292,13 @@ msgstr "Téléchargements récents" #~ msgstr "Mise à jour effectuée" #~ msgid "Failed to create path for cover %(path)s (Permission denied)." -#~ msgstr "Impossible de créer le chemin d’accès pour la couverture %(path)s (Autorisation refusée)" +#~ msgstr "" #~ msgid "Failed to store cover-file %(cover)s." -#~ msgstr "Echec de la sauvegarde du fichier de couverture %(cover)s." +#~ msgstr "" #~ msgid "Cover-file is not a valid image file" -#~ msgstr "Le fichier de couverture n’est pas un fichier d’image valide" +#~ msgstr "" #~ msgid "Cover is not a jpg file, can't save" #~ msgstr "Le fichier de couverture n’est pas au format jpg, impossible de sauvegarder" @@ -2287,3 +2357,15 @@ msgstr "Téléchargements récents" #~ msgid "PDF.js viewer" #~ msgstr "Visionneuse PDF.js" +#~ msgid "Please enter a LDAP provider and a DN" +#~ msgstr "" + +#~ msgid "successfully deleted shelf %(name)s" +#~ msgstr "l’étagère %(name)s a été supprimé avec succès" + +#~ msgid "LDAP Provider URL" +#~ msgstr "" + +#~ msgid "Register with %s, " +#~ msgstr "" + diff --git a/cps/translations/hu/LC_MESSAGES/messages.mo b/cps/translations/hu/LC_MESSAGES/messages.mo index 849f222c96afb92f01a047ea05ae020d0746cf29..579ec7369ae2abba569f720be158445dad0ab4c6 100644 GIT binary patch delta 14099 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 %(rating)s" msgstr "Értékelés <= %(rating)s" -#: cps/web.py:924 cps/web.py:933 +#: cps/web.py:917 cps/web.py:926 msgid "search" msgstr "keresés" -#: cps/web.py:1018 +#: cps/web.py:1012 msgid "Please configure the SMTP mail settings first..." msgstr "Először be kell állítani az SMTP levelező beállításokat..." -#: cps/web.py:1023 +#: cps/web.py:1017 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "A könyv sikeresen küldésre lett jelölve a következő címre: %(kindlemail)s" -#: cps/web.py:1027 +#: cps/web.py:1021 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "Hiba történt a könyv küldésekor: %(res)s" -#: cps/web.py:1046 cps/web.py:1071 cps/web.py:1076 cps/web.py:1081 -#: cps/web.py:1085 +#: cps/web.py:1041 cps/web.py:1066 cps/web.py:1070 cps/web.py:1075 +#: cps/web.py:1079 msgid "register" msgstr "regisztrálás" -#: cps/web.py:1073 +#: cps/web.py:1068 msgid "Your e-mail is not allowed to register" msgstr "Nem engedélyezett a megadott e-mail cím bejegyzése" -#: cps/web.py:1077 +#: cps/web.py:1071 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Jóváhagyó levél elküldve az email címedre." -#: cps/web.py:1080 +#: cps/web.py:1074 msgid "This username or e-mail address is already in use." msgstr "Ez a felhasználónév vagy e-mail cím már használatban van." -#: cps/web.py:1103 cps/web.py:1115 -#, python-format -msgid "You are now logged in as: '%(nickname)s'" +#: cps/web.py:1089 +msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1108 cps/web.py:1120 +#: cps/web.py:1098 cps/web.py:1212 +#, python-format +msgid "you are now logged in as: '%(nickname)s'" +msgstr "Be vagy jelentkezve mint: %(nickname)s" + +#: cps/web.py:1105 cps/web.py:1122 msgid "Wrong Username or Password" msgstr "Rossz felhasználó név vagy jelszó!" -#: cps/web.py:1111 +#: cps/web.py:1108 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "" -#: cps/web.py:1124 cps/web.py:1146 +#: cps/web.py:1117 +#, python-format +msgid "You are now logged in as: '%(nickname)s'" +msgstr "" + +#: cps/web.py:1126 cps/web.py:1148 msgid "login" msgstr "belépés" -#: cps/web.py:1158 cps/web.py:1189 +#: cps/web.py:1160 cps/web.py:1191 msgid "Token not found" msgstr "A token nem található." -#: cps/web.py:1166 cps/web.py:1197 +#: cps/web.py:1168 cps/web.py:1199 msgid "Token has expired" msgstr "A token érvényessége lejárt." -#: cps/web.py:1174 +#: cps/web.py:1176 msgid "Success! Please return to your device" msgstr "Sikerült! Újra használható az eszköz." -#: cps/web.py:1210 -#, python-format -msgid "you are now logged in as: '%(nickname)s'" -msgstr "Be vagy jelentkezve mint: %(nickname)s" - -#: cps/web.py:1250 cps/web.py:1277 cps/web.py:1281 +#: cps/web.py:1253 cps/web.py:1280 cps/web.py:1284 #, python-format msgid "%(name)s's profile" msgstr "%(name)s profilja" -#: cps/web.py:1274 +#: cps/web.py:1277 msgid "Found an existing account for this e-mail address." msgstr "Már létezik felhasználó ehhez az e-mail címhez." -#: cps/web.py:1279 +#: cps/web.py:1282 msgid "Profile updated" msgstr "A profil frissítve." -#: cps/web.py:1304 cps/web.py:1306 cps/web.py:1308 cps/web.py:1314 -#: cps/web.py:1318 +#: cps/web.py:1308 cps/web.py:1310 cps/web.py:1312 cps/web.py:1318 +#: cps/web.py:1322 msgid "Read a Book" msgstr "Egy olvasott könyv" -#: cps/web.py:1328 +#: cps/web.py:1332 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "" -#: cps/worker.py:308 +#: cps/worker.py:311 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Az e-könyv átalakítás nem sikerült: %(error)s" -#: cps/worker.py:319 +#: cps/worker.py:322 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "A Kindlegen futtatása nem sikerült a(z) %(error)s hiba miatt. Üzenet: %(message)s" @@ -1056,53 +1066,57 @@ msgid "Administration" msgstr "Adminisztráció" #: cps/templates/admin.html:109 +msgid "View Logfiles" +msgstr "" + +#: cps/templates/admin.html:110 msgid "Reconnect to Calibre DB" msgstr "Újracsatlakozás a Calibre adatbázishoz" -#: cps/templates/admin.html:110 +#: cps/templates/admin.html:111 msgid "Restart Calibre-Web" msgstr "A Calibre adatbázis újraindítása" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:112 msgid "Stop Calibre-Web" msgstr "A Calibre adatbázis leállítása" -#: cps/templates/admin.html:117 +#: cps/templates/admin.html:118 msgid "Update" msgstr "Frissítés" -#: cps/templates/admin.html:121 +#: cps/templates/admin.html:122 msgid "Version" msgstr "Verzió" -#: cps/templates/admin.html:122 +#: cps/templates/admin.html:123 msgid "Details" msgstr "Részletek" -#: cps/templates/admin.html:128 +#: cps/templates/admin.html:129 msgid "Current version" msgstr "Jelenlegi verzió" -#: cps/templates/admin.html:134 +#: cps/templates/admin.html:135 msgid "Check for update" msgstr "Frissítés keresése" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:136 msgid "Perform Update" msgstr "Frissítés elkezdése" -#: cps/templates/admin.html:147 +#: cps/templates/admin.html:148 msgid "Do you really want to restart Calibre-Web?" msgstr "Valóban újra akarod indítani a Calibre-Web-et?" -#: cps/templates/admin.html:152 cps/templates/admin.html:166 -#: cps/templates/admin.html:186 cps/templates/shelf.html:72 +#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:187 cps/templates/shelf.html:72 msgid "Ok" msgstr "OK" -#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:154 cps/templates/admin.html:168 #: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:281 cps/templates/config_view_edit.html:147 +#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:74 #: cps/templates/layout.html:28 cps/templates/shelf.html:73 #: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:12 @@ -1110,11 +1124,11 @@ msgstr "OK" msgid "Back" msgstr "Vissza" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:166 msgid "Do you really want to stop Calibre-Web?" msgstr "Valóban le akarod állítani a Calibre-Web-et?" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:178 msgid "Updating, please do not reload page" msgstr "Frissítés folyamatban, ne töltsd újra az oldalt" @@ -1243,7 +1257,7 @@ msgstr "Könyv megnézése szerkesztés után" msgid "Get metadata" msgstr "Metaadatok beszerzése" -#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:279 +#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329 #: cps/templates/config_view_edit.html:146 cps/templates/login.html:20 #: cps/templates/search_form.html:150 cps/templates/shelf_edit.html:17 #: cps/templates/user_edit.html:130 @@ -1387,123 +1401,171 @@ msgstr "Naplózás szintje" msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "Naplófájl helye és neve (üresen hagyva calibre-web.log)" -#: cps/templates/config_edit.html:140 +#: cps/templates/config_edit.html:134 +msgid "Enable Access Log" +msgstr "" + +#: cps/templates/config_edit.html:137 +msgid "Location and name of access logfile (access.log for no entry)" +msgstr "" + +#: cps/templates/config_edit.html:148 msgid "Feature Configuration" msgstr "Funkciók beállítása" -#: cps/templates/config_edit.html:148 +#: cps/templates/config_edit.html:156 msgid "Enable uploading" msgstr "Feltöltés engedélyezése" -#: cps/templates/config_edit.html:152 +#: cps/templates/config_edit.html:160 msgid "Enable anonymous browsing" msgstr "Böngészés bejelentkezés nélkül engedélyezése" -#: cps/templates/config_edit.html:156 +#: cps/templates/config_edit.html:164 msgid "Enable public registration" msgstr "Nyilvános regisztráció engedélyezése" -#: cps/templates/config_edit.html:160 +#: cps/templates/config_edit.html:168 msgid "Enable remote login (\"magic link\")" msgstr "Távoli belépés engedélyezése (\"varázs-hivatkozás\")" -#: cps/templates/config_edit.html:165 +#: cps/templates/config_edit.html:173 msgid "Use" msgstr "Engedélyezés" -#: cps/templates/config_edit.html:166 +#: cps/templates/config_edit.html:174 msgid "Obtain an API Key" msgstr "API-kulcs beszerzése" -#: cps/templates/config_edit.html:170 +#: cps/templates/config_edit.html:178 msgid "Goodreads API Key" msgstr "Goodreads API-kulcs" -#: cps/templates/config_edit.html:174 +#: cps/templates/config_edit.html:182 msgid "Goodreads API Secret" msgstr "Goodreads API titkos kód" -#: cps/templates/config_edit.html:181 +#: cps/templates/config_edit.html:189 msgid "Login type" msgstr "" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:191 msgid "Use standard Authentication" msgstr "" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:193 msgid "Use LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:188 +#: cps/templates/config_edit.html:196 msgid "Use GitHub OAuth" msgstr "" -#: cps/templates/config_edit.html:189 +#: cps/templates/config_edit.html:197 msgid "Use Google OAuth" msgstr "" -#: cps/templates/config_edit.html:196 -msgid "LDAP Provider URL" +#: cps/templates/config_edit.html:204 +msgid "LDAP Server Host Name or IP Address" +msgstr "" + +#: cps/templates/config_edit.html:208 +msgid "LDAP Server Port" +msgstr "" + +#: cps/templates/config_edit.html:212 +msgid "LDAP schema (ldap or ldaps)" +msgstr "" + +#: cps/templates/config_edit.html:216 +msgid "LDAP Admin username" +msgstr "" + +#: cps/templates/config_edit.html:220 +msgid "LDAP Admin password" +msgstr "" + +#: cps/templates/config_edit.html:225 +msgid "LDAP Server use SSL" msgstr "" -#: cps/templates/config_edit.html:200 +#: cps/templates/config_edit.html:229 +msgid "LDAP Server use TLS" +msgstr "" + +#: cps/templates/config_edit.html:233 +msgid "LDAP Server Certificate" +msgstr "" + +#: cps/templates/config_edit.html:237 +msgid "LDAP SSL Certificate Path" +msgstr "" + +#: cps/templates/config_edit.html:242 msgid "LDAP Distinguished Name (DN)" msgstr "" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:246 +msgid "LDAP User object filter" +msgstr "" + +#: cps/templates/config_edit.html:251 +msgid "LDAP Server is OpenLDAP?" +msgstr "" + +#: cps/templates/config_edit.html:258 msgid "Obtain GitHub OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:211 +#: cps/templates/config_edit.html:261 msgid "GitHub OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:215 +#: cps/templates/config_edit.html:265 msgid "GitHub OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:221 +#: cps/templates/config_edit.html:271 msgid "Obtain Google OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:224 +#: cps/templates/config_edit.html:274 msgid "Google OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:228 +#: cps/templates/config_edit.html:278 msgid "Google OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:242 +#: cps/templates/config_edit.html:292 msgid "External binaries" msgstr "Külső futtatható fájlok" -#: cps/templates/config_edit.html:250 +#: cps/templates/config_edit.html:300 msgid "No converter" msgstr "Átalakítás nélkül" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:302 msgid "Use Kindlegen" msgstr "Kindlegen használata" -#: cps/templates/config_edit.html:254 +#: cps/templates/config_edit.html:304 msgid "Use calibre's ebook converter" msgstr "Calibre e-könyv átalakító használata" -#: cps/templates/config_edit.html:258 +#: cps/templates/config_edit.html:308 msgid "E-Book converter settings" msgstr "E-könyv átalakító beállításai" -#: cps/templates/config_edit.html:262 +#: cps/templates/config_edit.html:312 msgid "Path to convertertool" msgstr "Elérési út az átalakító-eszközhöz" -#: cps/templates/config_edit.html:268 +#: cps/templates/config_edit.html:318 msgid "Location of Unrar binary" msgstr "Az Unrar futtatási állományának helye" -#: cps/templates/config_edit.html:284 cps/templates/layout.html:84 +#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 #: cps/templates/login.html:4 msgid "Login" msgstr "Belépés" @@ -1717,7 +1779,7 @@ msgstr "Vissza a kezdőlapra" msgid "Discover (Random Books)" msgstr "Felfedezés (könyvek találomra)" -#: cps/templates/index.html:65 +#: cps/templates/index.html:64 msgid "Group by series" msgstr "" @@ -1860,6 +1922,14 @@ msgstr "Emlékezz rám" msgid "Log in with magic link" msgstr "Belépés varázshivatkozással" +#: cps/templates/logviewer.html:5 +msgid "Show Calibre-Web log" +msgstr "" + +#: cps/templates/logviewer.html:8 +msgid "Show access log" +msgstr "" + #: cps/templates/osd.xml:5 msgid "Calibre-Web ebook catalog" msgstr "Calibre-Web e-könyv katalógus" @@ -3235,13 +3305,13 @@ msgstr "Utolsó letöltések" #~ msgstr "Dokumentum előkészítése nyomtatásra..." #~ msgid "Failed to create path for cover %(path)s (Permission denied)." -#~ msgstr "Nem sikerült létrehozni az elérési utat a borítóhoz (engedély megtagadva): %(path)s." +#~ msgstr "" #~ msgid "Failed to store cover-file %(cover)s." -#~ msgstr "Nem sikerült elmenteni a borító-fájlt: %(cover)s." +#~ msgstr "" #~ msgid "Cover-file is not a valid image file" -#~ msgstr "A borító-fájl nem érvényes képfájl!" +#~ msgstr "" #~ msgid "Cover is not a jpg file, can't save" #~ msgstr "A borító nem jpg fájl, nem lehet elmenteni." @@ -3297,3 +3367,15 @@ msgstr "Utolsó letöltések" #~ msgid "PDF.js viewer" #~ msgstr "PDF.js olvasó" +#~ msgid "Please enter a LDAP provider and a DN" +#~ msgstr "" + +#~ msgid "successfully deleted shelf %(name)s" +#~ msgstr "A következő polc sikeresen törölve: %(name)s" + +#~ msgid "LDAP Provider URL" +#~ msgstr "" + +#~ msgid "Register with %s, " +#~ msgstr "" + diff --git a/cps/translations/it/LC_MESSAGES/messages.mo b/cps/translations/it/LC_MESSAGES/messages.mo index 8778b0da4d76c2e44a71a543e91b262dd790acf1..cda874e8819c7eba9763ad9ebf47ed7d08563393 100644 GIT binary patch delta 14496 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 diff --git a/cps/translations/it/LC_MESSAGES/messages.po b/cps/translations/it/LC_MESSAGES/messages.po index ddf8e92b..75b140e4 100644 --- a/cps/translations/it/LC_MESSAGES/messages.po +++ b/cps/translations/it/LC_MESSAGES/messages.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2019-05-31 11:20+0200\n" +"POT-Creation-Date: 2019-06-22 19:54+0200\n" "PO-Revision-Date: 2017-04-04 15:09+0200\n" "Last-Translator: Marco Picone \n" "Language: it\n" @@ -15,13 +15,13 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.6.0\n" +"Generated-By: Babel 2.7.0\n" -#: cps/about.py:76 +#: cps/about.py:78 msgid "Statistics" msgstr "Statistica" -#: cps/admin.py:97 +#: cps/admin.py:98 msgid "Server restarted, please reload page" msgstr "Server riavviato, per favore ricarica la pagina" @@ -29,186 +29,202 @@ msgstr "Server riavviato, per favore ricarica la pagina" msgid "Performing shutdown of server, please close window" msgstr "Eseguo l'arresto del server, per favore chiudi la finestra." -#: cps/admin.py:120 cps/updater.py:445 +#: cps/admin.py:119 cps/updater.py:448 msgid "Unknown" msgstr "Sconosciuto" -#: cps/admin.py:139 +#: cps/admin.py:138 msgid "Admin page" msgstr "Pagina di amministrazione" -#: cps/admin.py:208 cps/admin.py:486 +#: cps/admin.py:207 cps/admin.py:532 msgid "Calibre-Web configuration updated" msgstr "Aggiornamento della configurazione di Calibre-Web" -#: cps/admin.py:222 cps/templates/admin.html:102 +#: cps/admin.py:220 cps/templates/admin.html:102 msgid "UI Configuration" msgstr "Configurazione dell'interfaccia utente" -#: cps/admin.py:295 +#: cps/admin.py:293 msgid "Import of optional Google Drive requirements missing" msgstr "Importa parametri mancanti per Google Drive" -#: cps/admin.py:298 +#: cps/admin.py:296 msgid "client_secrets.json is missing or not readable" msgstr "client_secrets.json manca o è inaccessibile" -#: cps/admin.py:303 cps/admin.py:332 +#: cps/admin.py:301 cps/admin.py:330 msgid "client_secrets.json is not configured for web application" msgstr "client_secrets.json non è configurato per questa applicazione web" -#: cps/admin.py:335 cps/admin.py:361 cps/admin.py:373 cps/admin.py:398 -#: cps/admin.py:426 cps/admin.py:440 cps/admin.py:463 cps/admin.py:476 -#: cps/admin.py:494 cps/admin.py:501 cps/admin.py:516 -#: cps/templates/admin.html:101 +#: cps/admin.py:333 cps/admin.py:359 cps/admin.py:371 cps/admin.py:396 +#: cps/admin.py:403 cps/admin.py:436 cps/admin.py:460 cps/admin.py:474 +#: cps/admin.py:493 cps/admin.py:510 cps/admin.py:522 cps/admin.py:538 +#: cps/admin.py:545 cps/admin.py:559 cps/templates/admin.html:101 msgid "Basic Configuration" msgstr "Configurazione di base" -#: cps/admin.py:358 +#: cps/admin.py:356 msgid "Keyfile location is not valid, please enter correct path" msgstr "La posizione del Keyfile non è corretta: per favore indica il percorso corretto" -#: cps/admin.py:370 +#: cps/admin.py:368 cps/admin.py:433 msgid "Certfile location is not valid, please enter correct path" msgstr "La posizione del Cerfile non è corretta: per favore indica il percorso corretto" -#: cps/admin.py:395 -msgid "Please enter a LDAP provider and a DN" +#: cps/admin.py:393 +msgid "Please enter a LDAP provider, port, DN and user object identifier" msgstr "" -#: cps/admin.py:423 +#: cps/admin.py:400 +msgid "Please enter a LDAP service account and password" +msgstr "" + +#: cps/admin.py:457 msgid "Please enter Github oauth credentials" msgstr "" -#: cps/admin.py:437 +#: cps/admin.py:471 msgid "Please enter Google oauth credentials" msgstr "" -#: cps/admin.py:460 +#: cps/admin.py:490 msgid "Logfile location is not valid, please enter correct path" msgstr "La posizione del Logfile non è corretta: per favore indica il percorso corretto" -#: cps/admin.py:498 +#: cps/admin.py:507 +msgid "Access Logfile location is not valid, please enter correct path" +msgstr "" + +#: cps/admin.py:542 msgid "DB location is not valid, please enter correct path" msgstr "La posizione DB non è corretta: per favore indica il percorso corretto" -#: cps/admin.py:558 cps/web.py:1045 +#: cps/admin.py:602 cps/web.py:1040 msgid "Please fill out all fields!" msgstr "Per favore compila tutti i campi!" -#: cps/admin.py:560 cps/admin.py:566 cps/admin.py:582 +#: cps/admin.py:604 cps/admin.py:610 cps/admin.py:626 #: cps/templates/admin.html:35 msgid "Add new user" msgstr "Aggiungi un nuovo utente" -#: cps/admin.py:564 cps/web.py:1248 +#: cps/admin.py:608 cps/web.py:1251 msgid "E-mail is not from valid domain" msgstr "L'e-mail non proviene da un dominio valido" -#: cps/admin.py:572 +#: cps/admin.py:616 #, python-format msgid "User '%(user)s' created" msgstr "Utente '%(user)s' creato" -#: cps/admin.py:576 +#: cps/admin.py:620 msgid "Found an existing account for this e-mail address or nickname." msgstr "Trovato un account esistente con questo e-mail o nome di utente" -#: cps/admin.py:607 +#: cps/admin.py:651 #, python-format msgid "Test e-mail successfully send to %(kindlemail)s" msgstr "E-mail di test inviato con successo a %(kindlemail)s" -#: cps/admin.py:610 +#: cps/admin.py:654 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Si è verificato un errore nell'invio dell'e-mail di test: %(res)s" -#: cps/admin.py:612 cps/web.py:1029 +#: cps/admin.py:656 cps/web.py:1023 msgid "Please configure your kindle e-mail address first..." msgstr "Per favore configura dapprima il tuo indirizzo e-mail di Kindle..." -#: cps/admin.py:614 +#: cps/admin.py:658 msgid "E-mail server settings updated" msgstr "Configurazione del server e-mail aggiornata" -#: cps/admin.py:615 +#: cps/admin.py:659 msgid "Edit e-mail server settings" msgstr "Modifica la configurazione del server e-mail" -#: cps/admin.py:640 +#: cps/admin.py:687 #, python-format msgid "User '%(nick)s' deleted" msgstr "Utente '%(nick)s' eliminato" -#: cps/admin.py:711 +#: cps/admin.py:690 +msgid "No admin user remaining, can't delete user" +msgstr "" + +#: cps/admin.py:761 #, python-format msgid "User '%(nick)s' updated" msgstr "Utente '%(nick)s' aggiornato" -#: cps/admin.py:714 +#: cps/admin.py:764 msgid "An unknown error occured." msgstr "Si è verificato un errore imprevisto." -#: cps/admin.py:717 +#: cps/admin.py:767 #, python-format msgid "Edit User %(nick)s" msgstr "Modifica utente %(nick)s" -#: cps/admin.py:733 +#: cps/admin.py:783 #, python-format msgid "Password for user %(user)s reset" msgstr "La password dell'utente %(user)s è stata resettata" -#: cps/admin.py:736 cps/web.py:1070 +#: cps/admin.py:786 cps/web.py:1065 msgid "An unknown error occurred. Please try again later." msgstr "Si è verificato un errore sconosciuto: per favore riprova." -#: cps/admin.py:755 +#: cps/admin.py:797 +msgid "Logfile viewer" +msgstr "" + +#: cps/admin.py:832 msgid "Requesting update package" msgstr "Richiesta del pacchetto di aggiornamento" -#: cps/admin.py:756 +#: cps/admin.py:833 msgid "Downloading update package" msgstr "Scarico il pacchetto di aggiornamento" -#: cps/admin.py:757 +#: cps/admin.py:834 msgid "Unzipping update package" msgstr "Decomprimo il pacchetto di aggiornamento" -#: cps/admin.py:758 +#: cps/admin.py:835 msgid "Replacing files" msgstr "Sostituzione files" -#: cps/admin.py:759 +#: cps/admin.py:836 msgid "Database connections are closed" msgstr "Le connessioni al database sono chiuse" -#: cps/admin.py:760 +#: cps/admin.py:837 msgid "Stopping server" msgstr "Arresta il server" -#: cps/admin.py:761 +#: cps/admin.py:838 msgid "Update finished, please press okay and reload page" msgstr "Aggiornamento completato, prego premere ok e ricaricare la pagina" -#: cps/admin.py:762 cps/admin.py:763 cps/admin.py:764 cps/admin.py:765 +#: cps/admin.py:839 cps/admin.py:840 cps/admin.py:841 cps/admin.py:842 msgid "Update failed:" msgstr "Aggiornamento fallito:" -#: cps/admin.py:762 cps/updater.py:277 cps/updater.py:456 cps/updater.py:458 +#: cps/admin.py:839 cps/updater.py:273 cps/updater.py:459 cps/updater.py:461 msgid "HTTP Error" msgstr "HTTP Error" -#: cps/admin.py:763 cps/updater.py:279 cps/updater.py:460 +#: cps/admin.py:840 cps/updater.py:275 cps/updater.py:463 msgid "Connection error" msgstr "Errore di connessione" -#: cps/admin.py:764 cps/updater.py:281 cps/updater.py:462 +#: cps/admin.py:841 cps/updater.py:277 cps/updater.py:465 msgid "Timeout while establishing connection" msgstr "Tempo scaduto nello stabilire la connessione" -#: cps/admin.py:765 cps/updater.py:283 cps/updater.py:464 +#: cps/admin.py:842 cps/updater.py:279 cps/updater.py:467 msgid "General error" msgstr "Errore generale" @@ -226,720 +242,714 @@ msgstr "Mancano le autorizzazioni di esecuzione" msgid "not configured" msgstr "non configurato" -#: cps/editbooks.py:218 cps/editbooks.py:432 +#: cps/editbooks.py:215 cps/editbooks.py:394 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "Errore durante l'apertura del libro. Il file non esiste o il file non è accessibile" -#: cps/editbooks.py:246 +#: cps/editbooks.py:243 msgid "edit metadata" msgstr "modifica i metadati" -#: cps/editbooks.py:325 cps/editbooks.py:595 +#: cps/editbooks.py:322 cps/editbooks.py:557 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "Non è consentito caricare file con l'estensione '%(ext)s' su questo server" -#: cps/editbooks.py:329 cps/editbooks.py:599 +#: cps/editbooks.py:326 cps/editbooks.py:561 msgid "File to be uploaded must have an extension" msgstr "Il file da caricare deve avere un'estensione" -#: cps/editbooks.py:341 cps/editbooks.py:619 +#: cps/editbooks.py:338 cps/editbooks.py:581 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Impossibile creare il percorso %(path)s (autorizzazione negata)." -#: cps/editbooks.py:346 +#: cps/editbooks.py:343 #, python-format msgid "Failed to store file %(file)s." msgstr "Il salvataggio del file %(file)s è fallito." -#: cps/editbooks.py:363 +#: cps/editbooks.py:360 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Ho aggiunto l'estensione %(ext)s al libro %(book)s" -#: cps/editbooks.py:382 -#, python-format -msgid "Failed to create path for cover %(path)s (Permission denied)." -msgstr "" - -#: cps/editbooks.py:390 -#, python-format -msgid "Failed to store cover-file %(cover)s." -msgstr "" - -#: cps/editbooks.py:393 -msgid "Cover-file is not a valid image file" -msgstr "" - -#: cps/editbooks.py:399 cps/editbooks.py:413 +#: cps/editbooks.py:374 msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" msgstr "" -#: cps/editbooks.py:445 cps/editbooks.py:454 +#: cps/editbooks.py:407 cps/editbooks.py:416 msgid "unknown" msgstr "sconosciuto" -#: cps/editbooks.py:486 +#: cps/editbooks.py:448 msgid "Cover is not a jpg file, can't save" msgstr "" -#: cps/editbooks.py:534 +#: cps/editbooks.py:496 #, python-format msgid "%(langname)s is not a valid language" msgstr "%(langname)s non è una lingua valida" -#: cps/editbooks.py:565 +#: cps/editbooks.py:527 msgid "Metadata successfully updated" msgstr "I metadati sono stati aggiornati con successo" -#: cps/editbooks.py:574 +#: cps/editbooks.py:536 msgid "Error editing book, please check logfile for details" msgstr "Errore nella modifica del libro. Per favore verifica i dettagli nel file di registro (logfile)" -#: cps/editbooks.py:624 +#: cps/editbooks.py:586 #, python-format msgid "Failed to store file %(file)s (Permission denied)." msgstr "Impossibile salvare il file %(file)s (autorizzazione negata)" -#: cps/editbooks.py:629 +#: cps/editbooks.py:591 #, python-format msgid "Failed to delete file %(file)s (Permission denied)." msgstr "Impossibile eliminare il file %(file)s (autorizzazione negata)" -#: cps/editbooks.py:712 +#: cps/editbooks.py:674 #, python-format msgid "File %(file)s uploaded" msgstr "" -#: cps/editbooks.py:741 +#: cps/editbooks.py:703 msgid "Source or destination format for conversion missing" msgstr "Il formato sorgente o quello di destinazione per la conversione mancano" -#: cps/editbooks.py:751 +#: cps/editbooks.py:711 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Libro accodato con successo per essere convertito in %(book_format)s" -#: cps/editbooks.py:755 +#: cps/editbooks.py:715 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Si è verificato un errore durante la conversione del libro: %(res)s" -#: cps/gdrive.py:56 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgstr "La configurazione di Google Drive non è stata completata correttamente. Prova a disattivare e riattivare nuovamente Google Drive" -#: cps/gdrive.py:101 +#: cps/gdrive.py:106 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Callback domain non è stato verificato. Per favore intraprendi il necessario per verificare il dominio nella developer console di Google" -#: cps/helper.py:97 +#: cps/helper.py:94 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "%(format)s formato non trovato per il libro: %(book)d" -#: cps/helper.py:109 +#: cps/helper.py:106 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s non trovato su Google Drive: %(fn)s" -#: cps/helper.py:116 cps/helper.py:223 cps/templates/detail.html:41 +#: cps/helper.py:113 cps/helper.py:220 cps/templates/detail.html:41 #: cps/templates/detail.html:45 msgid "Send to Kindle" msgstr "Invia a Kindle" -#: cps/helper.py:117 cps/helper.py:135 cps/helper.py:225 +#: cps/helper.py:114 cps/helper.py:132 cps/helper.py:222 msgid "This e-mail has been sent via Calibre-Web." msgstr "Questo e-mail è stato spedito tramite Calibre-Web." -#: cps/helper.py:128 +#: cps/helper.py:125 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s non trovato: %(fn)s" -#: cps/helper.py:133 +#: cps/helper.py:130 msgid "Calibre-Web test e-mail" msgstr "E-mail di test da Calibre-Web" -#: cps/helper.py:134 +#: cps/helper.py:131 msgid "Test e-mail" msgstr "E-mail di test" -#: cps/helper.py:150 +#: cps/helper.py:147 msgid "Get Started with Calibre-Web" msgstr "Inizia con Calibre-Web" -#: cps/helper.py:151 +#: cps/helper.py:148 #, python-format msgid "Registration e-mail for user: %(name)s" msgstr "E-mail di registrazione per l'utente: %(name)s" -#: cps/helper.py:165 cps/helper.py:167 cps/helper.py:169 cps/helper.py:177 -#: cps/helper.py:179 cps/helper.py:181 +#: cps/helper.py:162 cps/helper.py:164 cps/helper.py:166 cps/helper.py:174 +#: cps/helper.py:176 cps/helper.py:178 #, python-format msgid "Send %(format)s to Kindle" msgstr "Invia %(format)s a Kindle" -#: cps/helper.py:185 +#: cps/helper.py:182 #, python-format msgid "Convert %(orig)s to %(format)s and send to Kindle" msgstr "Converti %(orig)s in %(format)s e spedisci a Kindle" -#: cps/helper.py:224 +#: cps/helper.py:221 #, python-format msgid "E-mail: %(book)s" msgstr "E-mail: %(book)s" -#: cps/helper.py:227 +#: cps/helper.py:224 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "Il file richiesto non può essere letto. I permessi sono corretti?" -#: cps/helper.py:335 +#: cps/helper.py:331 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "La modifica del titolo da: '%(src)s' a '%(dest)s' è terminata con l'errore: %(error)s" -#: cps/helper.py:345 +#: cps/helper.py:341 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "La modifica dell'autore da: '%(src)s' a '%(dest)s' è terminata con l'errore: %(error)s" -#: cps/helper.py:359 +#: cps/helper.py:355 #, python-format msgid "Rename file in path '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "La modifica del file nella cartella da '%(src)s' a '%(dest)s' è terminata con l'errore: %(error)s" -#: cps/helper.py:385 cps/helper.py:395 cps/helper.py:403 +#: cps/helper.py:381 cps/helper.py:391 cps/helper.py:399 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "File %(file)s non trovato su Google Drive" -#: cps/helper.py:424 +#: cps/helper.py:420 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "Non ho trovato la cartella %(path)s su Google Drive" -#: cps/helper.py:584 +#: cps/helper.py:579 msgid "Error excecuting UnRar" msgstr "Errore nell'esecuzione di UnRar" -#: cps/helper.py:586 +#: cps/helper.py:581 msgid "Unrar binary file not found" msgstr "Non ho trovato il file binario di UnRar" -#: cps/helper.py:614 +#: cps/helper.py:609 msgid "Waiting" msgstr "Attendere" -#: cps/helper.py:616 +#: cps/helper.py:611 msgid "Failed" msgstr "Fallito" -#: cps/helper.py:618 +#: cps/helper.py:613 msgid "Started" msgstr "Avviato" -#: cps/helper.py:620 +#: cps/helper.py:615 msgid "Finished" msgstr "Terminato" -#: cps/helper.py:622 +#: cps/helper.py:617 msgid "Unknown Status" msgstr "Stato sconosciuto" -#: cps/helper.py:627 +#: cps/helper.py:622 msgid "E-mail: " msgstr "E-mail: " -#: cps/helper.py:629 cps/helper.py:633 +#: cps/helper.py:624 cps/helper.py:628 msgid "Convert: " msgstr "Conversione: " -#: cps/helper.py:631 +#: cps/helper.py:626 msgid "Upload: " msgstr "Upload: " -#: cps/helper.py:635 +#: cps/helper.py:630 msgid "Unknown Task: " msgstr "Processo sconosciuto: " -#: cps/oauth_bb.py:87 +#: cps/oauth_bb.py:91 #, python-format -msgid "Register with %s, " +msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:145 +#: cps/oauth_bb.py:149 msgid "Failed to log in with GitHub." msgstr "" -#: cps/oauth_bb.py:150 +#: cps/oauth_bb.py:154 msgid "Failed to fetch user info from GitHub." msgstr "" -#: cps/oauth_bb.py:161 +#: cps/oauth_bb.py:165 msgid "Failed to log in with Google." msgstr "" -#: cps/oauth_bb.py:166 +#: cps/oauth_bb.py:170 msgid "Failed to fetch user info from Google." msgstr "" -#: cps/oauth_bb.py:265 +#: cps/oauth_bb.py:269 #, python-format msgid "Unlink to %(oauth)s success." msgstr "" -#: cps/oauth_bb.py:269 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s failed." msgstr "" -#: cps/oauth_bb.py:272 +#: cps/oauth_bb.py:276 #, python-format msgid "Not linked to %(oauth)s." msgstr "" -#: cps/oauth_bb.py:300 +#: cps/oauth_bb.py:304 msgid "GitHub Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:319 +#: cps/oauth_bb.py:323 msgid "Google Oauth error, please retry later." msgstr "" -#: cps/shelf.py:40 cps/shelf.py:92 +#: cps/shelf.py:46 cps/shelf.py:98 msgid "Invalid shelf specified" msgstr "Lo scaffale specificato non è valevole" -#: cps/shelf.py:47 +#: cps/shelf.py:53 #, python-format msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" msgstr "Mi spiace, ma non sei autorizzato ad aggiungere libri allo scaffale: %(shelfname)s" -#: cps/shelf.py:55 +#: cps/shelf.py:61 msgid "You are not allowed to edit public shelves" msgstr "Non sei autorizzato a modificare gli scaffali pubblici" -#: cps/shelf.py:64 +#: cps/shelf.py:70 #, python-format msgid "Book is already part of the shelf: %(shelfname)s" msgstr "Il libro è gia presente nello scaffale: %(shelfname)s" -#: cps/shelf.py:78 +#: cps/shelf.py:84 #, python-format msgid "Book has been added to shelf: %(sname)s" msgstr "Il libro è stato aggiunto allo scaffale: %(sname)s" -#: cps/shelf.py:97 +#: cps/shelf.py:103 #, python-format msgid "You are not allowed to add a book to the the shelf: %(name)s" msgstr "Non sei autorizzato ad aggiungere libri allo scaffale: %(name)s" -#: cps/shelf.py:102 +#: cps/shelf.py:108 msgid "User is not allowed to edit public shelves" msgstr "L'utente non è autorizzato a modificare gli scaffali pubblici" -#: cps/shelf.py:120 +#: cps/shelf.py:126 #, python-format msgid "Books are already part of the shelf: %(name)s" msgstr "I libri sono già presenti nello scaffale: %(name)s" -#: cps/shelf.py:134 +#: cps/shelf.py:140 #, python-format msgid "Books have been added to shelf: %(sname)s" msgstr "I libri sono stati aggiunti allo scaffale: %(sname)s" -#: cps/shelf.py:136 +#: cps/shelf.py:142 #, python-format msgid "Could not add books to shelf: %(sname)s" msgstr "Non posso aggiungere libri allo scaffale: %(sname)s" -#: cps/shelf.py:173 +#: cps/shelf.py:179 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "Il libro è stato rimosso dallo scaffale: %(sname)s" -#: cps/shelf.py:179 +#: cps/shelf.py:185 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "Spiacente, ma non sei autorizzato a togliere libri dallo scaffale: %(sname)s" -#: cps/shelf.py:200 cps/shelf.py:224 +#: cps/shelf.py:206 cps/shelf.py:230 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "Uno scaffale con il nome '%(title)s' esiste già." -#: cps/shelf.py:205 +#: cps/shelf.py:211 #, python-format msgid "Shelf %(title)s created" msgstr "Lo scaffale %(title)s è stato creato" -#: cps/shelf.py:207 cps/shelf.py:235 +#: cps/shelf.py:213 cps/shelf.py:241 msgid "There was an error" msgstr "C'era un errore" -#: cps/shelf.py:208 cps/shelf.py:210 +#: cps/shelf.py:214 cps/shelf.py:216 msgid "create a shelf" msgstr "crea uno scaffale" -#: cps/shelf.py:233 +#: cps/shelf.py:239 #, python-format msgid "Shelf %(title)s changed" msgstr "Lo scaffale %(title)s è stato modificato" -#: cps/shelf.py:236 cps/shelf.py:238 +#: cps/shelf.py:242 cps/shelf.py:244 msgid "Edit a shelf" msgstr "Modifica uno scaffale" -#: cps/shelf.py:259 -#, python-format -msgid "successfully deleted shelf %(name)s" -msgstr "lo scaffale %(name)s è stato eliminato con successo" - -#: cps/shelf.py:289 +#: cps/shelf.py:295 #, python-format msgid "Shelf: '%(name)s'" msgstr "Scaffale: '%(name)s'" -#: cps/shelf.py:292 +#: cps/shelf.py:298 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Errore durante l'apertura dello scaffale. Lo scaffale non esiste o non è accessibile" -#: cps/shelf.py:324 +#: cps/shelf.py:330 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Modificare l'ordine dello scaffale: '%(name)s'" -#: cps/ub.py:111 +#: cps/ub.py:68 msgid "Recently Added" msgstr "Aggiunto recentemente" -#: cps/ub.py:113 +#: cps/ub.py:70 msgid "Show recent books" msgstr "Mostra i libri recenti" -#: cps/templates/index.xml:17 cps/ub.py:114 +#: cps/templates/index.xml:17 cps/ub.py:71 msgid "Hot Books" msgstr "Hot Ebook" -#: cps/ub.py:115 +#: cps/ub.py:72 msgid "Show hot books" msgstr "Mostra libri popolari" -#: cps/templates/index.xml:24 cps/ub.py:118 +#: cps/templates/index.xml:24 cps/ub.py:75 msgid "Best rated Books" msgstr "Libri più votati" -#: cps/ub.py:120 +#: cps/ub.py:77 msgid "Show best rated books" msgstr "Mostra la sezione dei libri più votati" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:121 -#: cps/web.py:965 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:78 +#: cps/web.py:958 msgid "Read Books" msgstr "Libri da leggere" -#: cps/ub.py:123 +#: cps/ub.py:80 msgid "Show read and unread" msgstr "Mostra letto e non letto" -#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:125 -#: cps/web.py:969 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:82 +#: cps/web.py:962 msgid "Unread Books" msgstr "Libri non letti" -#: cps/ub.py:127 +#: cps/ub.py:84 msgid "Show unread" msgstr "" -#: cps/ub.py:128 +#: cps/ub.py:85 msgid "Discover" msgstr "Per scoprire" -#: cps/ub.py:130 +#: cps/ub.py:87 msgid "Show random books" msgstr "Mostra libro a caso" -#: cps/ub.py:131 +#: cps/ub.py:88 msgid "Categories" msgstr "Categoria" -#: cps/ub.py:133 +#: cps/ub.py:90 msgid "Show category selection" msgstr "Mostra la selezione delle categorie" #: cps/templates/book_edit.html:71 cps/templates/search_form.html:53 -#: cps/ub.py:134 +#: cps/ub.py:91 msgid "Series" msgstr "Serie" -#: cps/ub.py:136 +#: cps/ub.py:93 msgid "Show series selection" msgstr "Mostra la selezione delle serie" -#: cps/templates/index.xml:61 cps/ub.py:137 +#: cps/templates/index.xml:61 cps/ub.py:94 msgid "Authors" msgstr "Autori" -#: cps/ub.py:139 +#: cps/ub.py:96 msgid "Show author selection" msgstr "Mostra la selezione dell'autore" -#: cps/templates/index.xml:68 cps/ub.py:141 +#: cps/templates/index.xml:68 cps/ub.py:98 msgid "Publishers" msgstr "Editori" -#: cps/ub.py:143 +#: cps/ub.py:100 msgid "Show publisher selection" msgstr "Mostra la selezione dell'editore" -#: cps/templates/search_form.html:74 cps/ub.py:144 +#: cps/templates/search_form.html:74 cps/ub.py:101 msgid "Languages" msgstr "Lingua" -#: cps/ub.py:147 +#: cps/ub.py:104 msgid "Show language selection" msgstr "Mostra la selezione della lingua" -#: cps/ub.py:148 +#: cps/ub.py:105 msgid "Ratings" msgstr "" -#: cps/ub.py:150 +#: cps/ub.py:107 msgid "Show ratings selection" msgstr "" -#: cps/ub.py:151 +#: cps/ub.py:108 msgid "File formats" msgstr "" -#: cps/ub.py:153 +#: cps/ub.py:110 msgid "Show file formats selection" msgstr "" -#: cps/updater.py:257 cps/updater.py:364 cps/updater.py:377 +#: cps/updater.py:253 cps/updater.py:360 cps/updater.py:373 msgid "Unexpected data while reading update information" msgstr "Dati inattesi durante il processo di aggiornamento" -#: cps/updater.py:264 cps/updater.py:370 +#: cps/updater.py:260 cps/updater.py:366 msgid "No update available. You already have the latest version installed" msgstr "Nessun aggiornamento disponibile. Hai già installato l'ultima versione disponibile" -#: cps/updater.py:290 cps/updater.py:422 +#: cps/updater.py:286 msgid "A new update is available. Click on the button below to update to the latest version." msgstr "Nuovo aggiornamento disponibile. Clicca sul pulsante sottostante per aggiornare all'ultima versione." -#: cps/updater.py:343 +#: cps/updater.py:339 msgid "Could not fetch update information" msgstr "Impossibile recuperare informazioni di aggiornamento" -#: cps/updater.py:357 +#: cps/updater.py:353 msgid "No release information available" msgstr "Non sono disponibili informazioni sulla versione" -#: cps/updater.py:403 cps/updater.py:412 +#: cps/updater.py:406 cps/updater.py:415 #, python-format msgid "A new update is available. Click on the button below to update to version: %(version)s" msgstr "Nuovo aggiornamento disponibile. Clicca sul pulsante sottostante per aggiornare alla versione: %(version)s" -#: cps/web.py:457 +#: cps/updater.py:425 +msgid "Click on the button below to update to the latest stable version." +msgstr "" + +#: cps/web.py:445 msgid "Recently Added Books" msgstr "Libri aggiunti di recente" -#: cps/web.py:484 +#: cps/web.py:473 msgid "Best rated books" msgstr "I libri con le migliori valutazioni" -#: cps/templates/index.xml:38 cps/web.py:492 +#: cps/templates/index.xml:38 cps/web.py:481 msgid "Random Books" msgstr "Libri a caso" -#: cps/web.py:516 +#: cps/web.py:505 msgid "Books" msgstr "" -#: cps/web.py:543 +#: cps/web.py:532 msgid "Hot Books (most downloaded)" msgstr "I libri più richiesti" -#: cps/web.py:553 cps/web.py:1294 cps/web.py:1383 +#: cps/web.py:542 cps/web.py:1298 cps/web.py:1386 msgid "Error opening eBook. File does not exist or file is not accessible:" msgstr "Errore durante l'apertura del libro. Il file non esiste o il file non è accessibile:" -#: cps/web.py:580 +#: cps/web.py:559 +#, python-format +msgid "Author: %(name)s" +msgstr "" + +#: cps/web.py:571 #, python-format msgid "Publisher: %(name)s" msgstr "Editore: %(name)s" -#: cps/web.py:591 +#: cps/web.py:582 #, python-format msgid "Series: %(serie)s" msgstr "Serie: %(serie)s" -#: cps/web.py:602 +#: cps/web.py:593 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:613 +#: cps/web.py:604 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:625 +#: cps/web.py:616 #, python-format msgid "Category: %(name)s" msgstr "Categoria: %(name)s" -#: cps/web.py:659 +#: cps/web.py:650 msgid "Publisher list" msgstr "Lista degli editori" -#: cps/templates/index.xml:82 cps/web.py:675 +#: cps/templates/index.xml:82 cps/web.py:666 msgid "Series list" msgstr "Lista delle serie" -#: cps/web.py:689 +#: cps/web.py:680 msgid "Ratings list" msgstr "" -#: cps/web.py:702 +#: cps/web.py:693 msgid "File formats list" msgstr "" -#: cps/web.py:730 +#: cps/web.py:721 msgid "Available languages" msgstr "Lingue disponibili" -#: cps/web.py:750 +#: cps/web.py:741 #, python-format msgid "Language: %(name)s" msgstr "Lingua: %(name)s" -#: cps/templates/index.xml:75 cps/web.py:764 +#: cps/templates/index.xml:75 cps/web.py:755 msgid "Category list" msgstr "Elenco categorie" -#: cps/templates/layout.html:73 cps/web.py:777 +#: cps/templates/layout.html:73 cps/web.py:769 msgid "Tasks" msgstr "Compito" -#: cps/web.py:841 +#: cps/web.py:834 msgid "Published after " msgstr "Pubblicato dopo " -#: cps/web.py:848 +#: cps/web.py:841 msgid "Published before " msgstr "Pubblicato prima " -#: cps/web.py:862 +#: cps/web.py:855 #, python-format msgid "Rating <= %(rating)s" msgstr "Valutazione <= %(rating)s" -#: cps/web.py:864 +#: cps/web.py:857 #, python-format msgid "Rating >= %(rating)s" msgstr "Valutazione >= %(rating)s" -#: cps/web.py:924 cps/web.py:933 +#: cps/web.py:917 cps/web.py:926 msgid "search" msgstr "ricerca" -#: cps/web.py:1018 +#: cps/web.py:1012 msgid "Please configure the SMTP mail settings first..." msgstr "Configurare dapprima le impostazioni del server SMTP..." -#: cps/web.py:1023 +#: cps/web.py:1017 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Libro accodato con successo per essere spedito a %(kindlemail)s" -#: cps/web.py:1027 +#: cps/web.py:1021 #, 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:1046 cps/web.py:1071 cps/web.py:1076 cps/web.py:1081 -#: cps/web.py:1085 +#: cps/web.py:1041 cps/web.py:1066 cps/web.py:1070 cps/web.py:1075 +#: cps/web.py:1079 msgid "register" msgstr "registra" -#: cps/web.py:1073 +#: cps/web.py:1068 msgid "Your e-mail is not allowed to register" msgstr "Il tuo e-mail non può essere utilizzato per la registrazione" -#: cps/web.py:1077 +#: cps/web.py:1071 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Un e-mail di conferma è stato inviato al tuo indirizzo." -#: cps/web.py:1080 +#: cps/web.py:1074 msgid "This username or e-mail address is already in use." msgstr "Questo nome di utente o questo e-mail sono già utilizzati." -#: cps/web.py:1103 cps/web.py:1115 -#, python-format -msgid "You are now logged in as: '%(nickname)s'" +#: cps/web.py:1089 +msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1108 cps/web.py:1120 +#: cps/web.py:1098 cps/web.py:1212 +#, python-format +msgid "you are now logged in as: '%(nickname)s'" +msgstr "ora sei connesso come: '%(nickname)s'" + +#: cps/web.py:1105 cps/web.py:1122 msgid "Wrong Username or Password" msgstr "Nome utente o password errati" -#: cps/web.py:1111 +#: cps/web.py:1108 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "" -#: cps/web.py:1124 cps/web.py:1146 +#: cps/web.py:1117 +#, python-format +msgid "You are now logged in as: '%(nickname)s'" +msgstr "" + +#: cps/web.py:1126 cps/web.py:1148 msgid "login" msgstr "accedi" -#: cps/web.py:1158 cps/web.py:1189 +#: cps/web.py:1160 cps/web.py:1191 msgid "Token not found" msgstr "Token non trovato" -#: cps/web.py:1166 cps/web.py:1197 +#: cps/web.py:1168 cps/web.py:1199 msgid "Token has expired" msgstr "Il token è scaduto" -#: cps/web.py:1174 +#: cps/web.py:1176 msgid "Success! Please return to your device" msgstr "Successo! Torna al tuo dispositivo" -#: cps/web.py:1210 -#, python-format -msgid "you are now logged in as: '%(nickname)s'" -msgstr "ora sei connesso come: '%(nickname)s'" - -#: cps/web.py:1250 cps/web.py:1277 cps/web.py:1281 +#: cps/web.py:1253 cps/web.py:1280 cps/web.py:1284 #, python-format msgid "%(name)s's profile" msgstr "Profilo di %(name)s" -#: cps/web.py:1274 +#: cps/web.py:1277 msgid "Found an existing account for this e-mail address." msgstr "Ho trovato un account creato in precedenza con questo e-mail." -#: cps/web.py:1279 +#: cps/web.py:1282 msgid "Profile updated" msgstr "Profilo aggiornato" -#: cps/web.py:1304 cps/web.py:1306 cps/web.py:1308 cps/web.py:1314 -#: cps/web.py:1318 +#: cps/web.py:1308 cps/web.py:1310 cps/web.py:1312 cps/web.py:1318 +#: cps/web.py:1322 msgid "Read a Book" msgstr "Leggere un libro" -#: cps/web.py:1328 +#: cps/web.py:1332 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "" -#: cps/worker.py:308 +#: cps/worker.py:311 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Errore nel convertitore: %(error)s" -#: cps/worker.py:319 +#: cps/worker.py:322 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Kindlegen ha restituito l'errore %(error)s. Messaggio: %(message)s" @@ -1055,53 +1065,57 @@ msgid "Administration" msgstr "Amministrazione" #: cps/templates/admin.html:109 +msgid "View Logfiles" +msgstr "" + +#: cps/templates/admin.html:110 msgid "Reconnect to Calibre DB" msgstr "Ricollegare al DB Calibre" -#: cps/templates/admin.html:110 +#: cps/templates/admin.html:111 msgid "Restart Calibre-Web" msgstr "Riavvia Calibre-Web" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:112 msgid "Stop Calibre-Web" msgstr "Arresta Calibre-Web" -#: cps/templates/admin.html:117 +#: cps/templates/admin.html:118 msgid "Update" msgstr "Aggiornamento" -#: cps/templates/admin.html:121 +#: cps/templates/admin.html:122 msgid "Version" msgstr "Versione" -#: cps/templates/admin.html:122 +#: cps/templates/admin.html:123 msgid "Details" msgstr "Dettagli" -#: cps/templates/admin.html:128 +#: cps/templates/admin.html:129 msgid "Current version" msgstr "Versione attuale" -#: cps/templates/admin.html:134 +#: cps/templates/admin.html:135 msgid "Check for update" msgstr "Ricerca aggiornamenti" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:136 msgid "Perform Update" msgstr "Esegui aggiornamento" -#: cps/templates/admin.html:147 +#: cps/templates/admin.html:148 msgid "Do you really want to restart Calibre-Web?" msgstr "Vuoi veramente riavviare Calibre-Web?" -#: cps/templates/admin.html:152 cps/templates/admin.html:166 -#: cps/templates/admin.html:186 cps/templates/shelf.html:72 +#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:187 cps/templates/shelf.html:72 msgid "Ok" msgstr "Ok" -#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:154 cps/templates/admin.html:168 #: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:281 cps/templates/config_view_edit.html:147 +#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:74 #: cps/templates/layout.html:28 cps/templates/shelf.html:73 #: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:12 @@ -1109,11 +1123,11 @@ msgstr "Ok" msgid "Back" msgstr "Indietro" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:166 msgid "Do you really want to stop Calibre-Web?" msgstr "Vuoi veramente arrestare Calibre-Web?" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:178 msgid "Updating, please do not reload page" msgstr "Aggiornamento, non ricaricare la pagina." @@ -1242,7 +1256,7 @@ msgstr "visualizzare il libro dopo la modifica" msgid "Get metadata" msgstr "Ottieni metadati" -#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:279 +#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329 #: cps/templates/config_view_edit.html:146 cps/templates/login.html:20 #: cps/templates/search_form.html:150 cps/templates/shelf_edit.html:17 #: cps/templates/user_edit.html:130 @@ -1386,123 +1400,171 @@ msgstr "Livello di Log" msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "Percorso e nome del logfile (senza indicazioni sarà calibre-web.log)" -#: cps/templates/config_edit.html:140 +#: cps/templates/config_edit.html:134 +msgid "Enable Access Log" +msgstr "" + +#: cps/templates/config_edit.html:137 +msgid "Location and name of access logfile (access.log for no entry)" +msgstr "" + +#: cps/templates/config_edit.html:148 msgid "Feature Configuration" msgstr "Configurazione della caratteristica" -#: cps/templates/config_edit.html:148 +#: cps/templates/config_edit.html:156 msgid "Enable uploading" msgstr "Abilita il caricamento" -#: cps/templates/config_edit.html:152 +#: cps/templates/config_edit.html:160 msgid "Enable anonymous browsing" msgstr "Abilita la navigazione anonima" -#: cps/templates/config_edit.html:156 +#: cps/templates/config_edit.html:164 msgid "Enable public registration" msgstr "Abilita la registrazione pubblica" -#: cps/templates/config_edit.html:160 +#: cps/templates/config_edit.html:168 msgid "Enable remote login (\"magic link\")" msgstr "Attiva login remoto (\"magic link\")" -#: cps/templates/config_edit.html:165 +#: cps/templates/config_edit.html:173 msgid "Use" msgstr "Uso" -#: cps/templates/config_edit.html:166 +#: cps/templates/config_edit.html:174 msgid "Obtain an API Key" msgstr "Ottenere una chiave API" -#: cps/templates/config_edit.html:170 +#: cps/templates/config_edit.html:178 msgid "Goodreads API Key" msgstr "API di Goodreads" -#: cps/templates/config_edit.html:174 +#: cps/templates/config_edit.html:182 msgid "Goodreads API Secret" msgstr "Goodreads API Secret" -#: cps/templates/config_edit.html:181 +#: cps/templates/config_edit.html:189 msgid "Login type" msgstr "" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:191 msgid "Use standard Authentication" msgstr "" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:193 msgid "Use LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:188 +#: cps/templates/config_edit.html:196 msgid "Use GitHub OAuth" msgstr "" -#: cps/templates/config_edit.html:189 +#: cps/templates/config_edit.html:197 msgid "Use Google OAuth" msgstr "" -#: cps/templates/config_edit.html:196 -msgid "LDAP Provider URL" +#: cps/templates/config_edit.html:204 +msgid "LDAP Server Host Name or IP Address" +msgstr "" + +#: cps/templates/config_edit.html:208 +msgid "LDAP Server Port" +msgstr "" + +#: cps/templates/config_edit.html:212 +msgid "LDAP schema (ldap or ldaps)" +msgstr "" + +#: cps/templates/config_edit.html:216 +msgid "LDAP Admin username" +msgstr "" + +#: cps/templates/config_edit.html:220 +msgid "LDAP Admin password" +msgstr "" + +#: cps/templates/config_edit.html:225 +msgid "LDAP Server use SSL" msgstr "" -#: cps/templates/config_edit.html:200 +#: cps/templates/config_edit.html:229 +msgid "LDAP Server use TLS" +msgstr "" + +#: cps/templates/config_edit.html:233 +msgid "LDAP Server Certificate" +msgstr "" + +#: cps/templates/config_edit.html:237 +msgid "LDAP SSL Certificate Path" +msgstr "" + +#: cps/templates/config_edit.html:242 msgid "LDAP Distinguished Name (DN)" msgstr "" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:246 +msgid "LDAP User object filter" +msgstr "" + +#: cps/templates/config_edit.html:251 +msgid "LDAP Server is OpenLDAP?" +msgstr "" + +#: cps/templates/config_edit.html:258 msgid "Obtain GitHub OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:211 +#: cps/templates/config_edit.html:261 msgid "GitHub OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:215 +#: cps/templates/config_edit.html:265 msgid "GitHub OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:221 +#: cps/templates/config_edit.html:271 msgid "Obtain Google OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:224 +#: cps/templates/config_edit.html:274 msgid "Google OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:228 +#: cps/templates/config_edit.html:278 msgid "Google OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:242 +#: cps/templates/config_edit.html:292 msgid "External binaries" msgstr "Files binari esterni" -#: cps/templates/config_edit.html:250 +#: cps/templates/config_edit.html:300 msgid "No converter" msgstr "Nessun convertitore" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:302 msgid "Use Kindlegen" msgstr "Utilizza Kindlegen" -#: cps/templates/config_edit.html:254 +#: cps/templates/config_edit.html:304 msgid "Use calibre's ebook converter" msgstr "Utilizza il convertitore di Calibre" -#: cps/templates/config_edit.html:258 +#: cps/templates/config_edit.html:308 msgid "E-Book converter settings" msgstr "Configurazione del convertitore di e-book" -#: cps/templates/config_edit.html:262 +#: cps/templates/config_edit.html:312 msgid "Path to convertertool" msgstr "Percorso del convertitore" -#: cps/templates/config_edit.html:268 +#: cps/templates/config_edit.html:318 msgid "Location of Unrar binary" msgstr "Percorso di UnRar" -#: cps/templates/config_edit.html:284 cps/templates/layout.html:84 +#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 #: cps/templates/login.html:4 msgid "Login" msgstr "Accesso" @@ -1716,7 +1778,7 @@ msgstr "Ritorno alla pagina principale" msgid "Discover (Random Books)" msgstr "Scoprire (libri casuali)" -#: cps/templates/index.html:65 +#: cps/templates/index.html:64 msgid "Group by series" msgstr "" @@ -1859,6 +1921,14 @@ msgstr "Ricordami" msgid "Log in with magic link" msgstr "Accedi con magic link" +#: cps/templates/logviewer.html:5 +msgid "Show Calibre-Web log" +msgstr "" + +#: cps/templates/logviewer.html:8 +msgid "Show access log" +msgstr "" + #: cps/templates/osd.xml:5 msgid "Calibre-Web ebook catalog" msgstr "Catalogo Calibre-Web" @@ -3426,13 +3496,13 @@ msgstr "Download Recenti" #~ msgstr "Zaza" #~ msgid "Failed to create path for cover %(path)s (Permission denied)." -#~ msgstr "Impossibile creare il percorso per la copertina %(path)s (autorizzazione negata)." +#~ msgstr "" #~ msgid "Failed to store cover-file %(cover)s." -#~ msgstr "Impossibile salvare la copertina %(cover)s." +#~ msgstr "" #~ msgid "Cover-file is not a valid image file" -#~ msgstr "Il file della copertina non è un file d'immagine valido" +#~ msgstr "" #~ msgid "Cover is not a jpg file, can't save" #~ msgstr "La copertina non è un file in formato jpg: non posso salvare" @@ -3491,3 +3561,15 @@ msgstr "Download Recenti" #~ msgid "PDF.js viewer" #~ msgstr "Visore PDF.js" +#~ msgid "Please enter a LDAP provider and a DN" +#~ msgstr "" + +#~ msgid "successfully deleted shelf %(name)s" +#~ msgstr "lo scaffale %(name)s è stato eliminato con successo" + +#~ msgid "LDAP Provider URL" +#~ msgstr "" + +#~ msgid "Register with %s, " +#~ msgstr "" + diff --git a/cps/translations/ja/LC_MESSAGES/messages.mo b/cps/translations/ja/LC_MESSAGES/messages.mo index 345d4d04a4db0855c693fd84f5a0e73f87441ef0..ef48be8bc096a569c530d6492e53b94f64290b7d 100644 GIT binary patch delta 13956 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 delta 21581 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 Xh9xK0+*>|>Rr&nAk-ygMyT<%4rjD6i diff --git a/cps/translations/ja/LC_MESSAGES/messages.po b/cps/translations/ja/LC_MESSAGES/messages.po index 301580ac..a17b0f49 100644 --- a/cps/translations/ja/LC_MESSAGES/messages.po +++ b/cps/translations/ja/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2019-05-31 11:20+0200\n" +"POT-Creation-Date: 2019-06-22 19:54+0200\n" "PO-Revision-Date: 2018-02-07 02:20-0500\n" "Last-Translator: white \n" "Language: ja\n" @@ -16,13 +16,13 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.6.0\n" +"Generated-By: Babel 2.7.0\n" -#: cps/about.py:76 +#: cps/about.py:78 msgid "Statistics" msgstr "統計" -#: cps/admin.py:97 +#: cps/admin.py:98 msgid "Server restarted, please reload page" msgstr "サーバを再起動しました。ページを再読み込みしてください" @@ -30,186 +30,202 @@ msgstr "サーバを再起動しました。ページを再読み込みしてく msgid "Performing shutdown of server, please close window" msgstr "サーバをシャットダウンしています。ページを閉じてください" -#: cps/admin.py:120 cps/updater.py:445 +#: cps/admin.py:119 cps/updater.py:448 msgid "Unknown" msgstr "不明" -#: cps/admin.py:139 +#: cps/admin.py:138 msgid "Admin page" msgstr "管理者ページ" -#: cps/admin.py:208 cps/admin.py:486 +#: cps/admin.py:207 cps/admin.py:532 msgid "Calibre-Web configuration updated" msgstr "Calibre-Web の設定を更新しました" -#: cps/admin.py:222 cps/templates/admin.html:102 +#: cps/admin.py:220 cps/templates/admin.html:102 msgid "UI Configuration" msgstr "UI設定" -#: cps/admin.py:295 +#: cps/admin.py:293 msgid "Import of optional Google Drive requirements missing" msgstr "Googleドライブ用のOptional Requirementsがインストールされていません" -#: cps/admin.py:298 +#: cps/admin.py:296 msgid "client_secrets.json is missing or not readable" msgstr "client_secrets.json が存在しないか読み込めません" -#: cps/admin.py:303 cps/admin.py:332 +#: cps/admin.py:301 cps/admin.py:330 msgid "client_secrets.json is not configured for web application" msgstr "client_secrets.json がWebアプリ用に設定されていません" -#: cps/admin.py:335 cps/admin.py:361 cps/admin.py:373 cps/admin.py:398 -#: cps/admin.py:426 cps/admin.py:440 cps/admin.py:463 cps/admin.py:476 -#: cps/admin.py:494 cps/admin.py:501 cps/admin.py:516 -#: cps/templates/admin.html:101 +#: cps/admin.py:333 cps/admin.py:359 cps/admin.py:371 cps/admin.py:396 +#: cps/admin.py:403 cps/admin.py:436 cps/admin.py:460 cps/admin.py:474 +#: cps/admin.py:493 cps/admin.py:510 cps/admin.py:522 cps/admin.py:538 +#: cps/admin.py:545 cps/admin.py:559 cps/templates/admin.html:101 msgid "Basic Configuration" msgstr "基本設定" -#: cps/admin.py:358 +#: cps/admin.py:356 msgid "Keyfile location is not valid, please enter correct path" msgstr "キーファイルが無効です。正しいパスを入力してください" -#: cps/admin.py:370 +#: cps/admin.py:368 cps/admin.py:433 msgid "Certfile location is not valid, please enter correct path" msgstr "証明書が無効です。正しいパスを入力してください" -#: cps/admin.py:395 -msgid "Please enter a LDAP provider and a DN" +#: cps/admin.py:393 +msgid "Please enter a LDAP provider, port, DN and user object identifier" msgstr "" -#: cps/admin.py:423 +#: cps/admin.py:400 +msgid "Please enter a LDAP service account and password" +msgstr "" + +#: cps/admin.py:457 msgid "Please enter Github oauth credentials" msgstr "" -#: cps/admin.py:437 +#: cps/admin.py:471 msgid "Please enter Google oauth credentials" msgstr "" -#: cps/admin.py:460 +#: cps/admin.py:490 msgid "Logfile location is not valid, please enter correct path" msgstr "ログファイルが無効です。正しいパスを入力してください" -#: cps/admin.py:498 +#: cps/admin.py:507 +msgid "Access Logfile location is not valid, please enter correct path" +msgstr "" + +#: cps/admin.py:542 msgid "DB location is not valid, please enter correct path" msgstr "データベースが無効です。正しいパスを入力してください" -#: cps/admin.py:558 cps/web.py:1045 +#: cps/admin.py:602 cps/web.py:1040 msgid "Please fill out all fields!" msgstr "全ての項目を入力してください" -#: cps/admin.py:560 cps/admin.py:566 cps/admin.py:582 +#: cps/admin.py:604 cps/admin.py:610 cps/admin.py:626 #: cps/templates/admin.html:35 msgid "Add new user" msgstr "新規ユーザ追加" -#: cps/admin.py:564 cps/web.py:1248 +#: cps/admin.py:608 cps/web.py:1251 msgid "E-mail is not from valid domain" msgstr "このメールは有効なドメインからのものではありません" -#: cps/admin.py:572 +#: cps/admin.py:616 #, python-format msgid "User '%(user)s' created" msgstr "ユーザ '%(user)s' を作成しました" -#: cps/admin.py:576 +#: cps/admin.py:620 msgid "Found an existing account for this e-mail address or nickname." msgstr "このメールアドレスかニックネームで登録されたアカウントが見つかりました" -#: cps/admin.py:607 +#: cps/admin.py:651 #, python-format msgid "Test e-mail successfully send to %(kindlemail)s" msgstr "テストメールが %(kindlemail)s に送信されました" -#: cps/admin.py:610 +#: cps/admin.py:654 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "テストメールを %(res)s に送信中にエラーが発生しました" -#: cps/admin.py:612 cps/web.py:1029 +#: cps/admin.py:656 cps/web.py:1023 msgid "Please configure your kindle e-mail address first..." msgstr "初めにKindleのメールアドレスを設定してください" -#: cps/admin.py:614 +#: cps/admin.py:658 msgid "E-mail server settings updated" msgstr "メールサーバの設定を更新しました" -#: cps/admin.py:615 +#: cps/admin.py:659 msgid "Edit e-mail server settings" msgstr "メールサーバの設定を編集" -#: cps/admin.py:640 +#: cps/admin.py:687 #, python-format msgid "User '%(nick)s' deleted" msgstr "ユーザ '%(nick)s' を削除しました" -#: cps/admin.py:711 +#: cps/admin.py:690 +msgid "No admin user remaining, can't delete user" +msgstr "" + +#: cps/admin.py:761 #, python-format msgid "User '%(nick)s' updated" msgstr "ユーザ '%(nick)s' を更新しました" -#: cps/admin.py:714 +#: cps/admin.py:764 msgid "An unknown error occured." msgstr "不明なエラーが発生しました。" -#: cps/admin.py:717 +#: cps/admin.py:767 #, python-format msgid "Edit User %(nick)s" msgstr "%(nick)s を編集" -#: cps/admin.py:733 +#: cps/admin.py:783 #, python-format msgid "Password for user %(user)s reset" msgstr "%(user)s 用のパスワードをリセット" -#: cps/admin.py:736 cps/web.py:1070 +#: cps/admin.py:786 cps/web.py:1065 msgid "An unknown error occurred. Please try again later." msgstr "不明なエラーが発生しました。あとで再試行してください。" -#: cps/admin.py:755 +#: cps/admin.py:797 +msgid "Logfile viewer" +msgstr "" + +#: cps/admin.py:832 msgid "Requesting update package" msgstr "更新データを要求中" -#: cps/admin.py:756 +#: cps/admin.py:833 msgid "Downloading update package" msgstr "更新データをダウンロード中" -#: cps/admin.py:757 +#: cps/admin.py:834 msgid "Unzipping update package" msgstr "更新データを展開中" -#: cps/admin.py:758 +#: cps/admin.py:835 msgid "Replacing files" msgstr "ファイルを置換中" -#: cps/admin.py:759 +#: cps/admin.py:836 msgid "Database connections are closed" msgstr "データベースの接続を切断完了" -#: cps/admin.py:760 +#: cps/admin.py:837 msgid "Stopping server" msgstr "サーバ停止中" -#: cps/admin.py:761 +#: cps/admin.py:838 msgid "Update finished, please press okay and reload page" msgstr "アップデート完了、OKを押してページをリロードしてください" -#: cps/admin.py:762 cps/admin.py:763 cps/admin.py:764 cps/admin.py:765 +#: cps/admin.py:839 cps/admin.py:840 cps/admin.py:841 cps/admin.py:842 msgid "Update failed:" msgstr "アップデート失敗:" -#: cps/admin.py:762 cps/updater.py:277 cps/updater.py:456 cps/updater.py:458 +#: cps/admin.py:839 cps/updater.py:273 cps/updater.py:459 cps/updater.py:461 msgid "HTTP Error" msgstr "HTTPエラー" -#: cps/admin.py:763 cps/updater.py:279 cps/updater.py:460 +#: cps/admin.py:840 cps/updater.py:275 cps/updater.py:463 msgid "Connection error" msgstr "接続エラー" -#: cps/admin.py:764 cps/updater.py:281 cps/updater.py:462 +#: cps/admin.py:841 cps/updater.py:277 cps/updater.py:465 msgid "Timeout while establishing connection" msgstr "接続を確立中にタイムアウトしました" -#: cps/admin.py:765 cps/updater.py:283 cps/updater.py:464 +#: cps/admin.py:842 cps/updater.py:279 cps/updater.py:467 msgid "General error" msgstr "エラー発生" @@ -227,720 +243,714 @@ msgstr "実行許可がありません" msgid "not configured" msgstr "未設定です" -#: cps/editbooks.py:218 cps/editbooks.py:432 +#: cps/editbooks.py:215 cps/editbooks.py:394 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "電子書籍を開けません。ファイルが存在しないかアクセスできません" -#: cps/editbooks.py:246 +#: cps/editbooks.py:243 msgid "edit metadata" msgstr "メタデータを編集" -#: cps/editbooks.py:325 cps/editbooks.py:595 +#: cps/editbooks.py:322 cps/editbooks.py:557 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "ファイル拡張子 '%(ext)s' をこのサーバにアップロードすることは許可されていません" -#: cps/editbooks.py:329 cps/editbooks.py:599 +#: cps/editbooks.py:326 cps/editbooks.py:561 msgid "File to be uploaded must have an extension" msgstr "アップロードするファイルには拡張子が必要です" -#: cps/editbooks.py:341 cps/editbooks.py:619 +#: cps/editbooks.py:338 cps/editbooks.py:581 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "%(path)s の作成に失敗しました (Permission denied)。" -#: cps/editbooks.py:346 +#: cps/editbooks.py:343 #, python-format msgid "Failed to store file %(file)s." msgstr "%(file)s を保存できません。" -#: cps/editbooks.py:363 +#: cps/editbooks.py:360 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "ファイル形式 %(ext)s が %(book)s に追加されました" -#: cps/editbooks.py:382 -#, python-format -msgid "Failed to create path for cover %(path)s (Permission denied)." -msgstr "" - -#: cps/editbooks.py:390 -#, python-format -msgid "Failed to store cover-file %(cover)s." -msgstr "" - -#: cps/editbooks.py:393 -msgid "Cover-file is not a valid image file" -msgstr "" - -#: cps/editbooks.py:399 cps/editbooks.py:413 +#: cps/editbooks.py:374 msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" msgstr "" -#: cps/editbooks.py:445 cps/editbooks.py:454 +#: cps/editbooks.py:407 cps/editbooks.py:416 msgid "unknown" msgstr "不明" -#: cps/editbooks.py:486 +#: cps/editbooks.py:448 msgid "Cover is not a jpg file, can't save" msgstr "" -#: cps/editbooks.py:534 +#: cps/editbooks.py:496 #, python-format msgid "%(langname)s is not a valid language" msgstr "%(langname)s は有効な言語ではありません" -#: cps/editbooks.py:565 +#: cps/editbooks.py:527 msgid "Metadata successfully updated" msgstr "メタデータを更新しました" -#: cps/editbooks.py:574 +#: cps/editbooks.py:536 msgid "Error editing book, please check logfile for details" msgstr "本の編集でエラーが発生しました。詳細はログファイルを確認してください" -#: cps/editbooks.py:624 +#: cps/editbooks.py:586 #, python-format msgid "Failed to store file %(file)s (Permission denied)." msgstr "ファイル %(file)s の保存に失敗しました (Permission denied)。" -#: cps/editbooks.py:629 +#: cps/editbooks.py:591 #, python-format msgid "Failed to delete file %(file)s (Permission denied)." msgstr "ファイル %(file)s の削除に失敗しました (Permission denied)。" -#: cps/editbooks.py:712 +#: cps/editbooks.py:674 #, python-format msgid "File %(file)s uploaded" msgstr "" -#: cps/editbooks.py:741 +#: cps/editbooks.py:703 msgid "Source or destination format for conversion missing" msgstr "変換元の形式または変換後の形式が指定されていません" -#: cps/editbooks.py:751 +#: cps/editbooks.py:711 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "本の %(book_format)s への変換がキューに追加されました" -#: cps/editbooks.py:755 +#: cps/editbooks.py:715 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "この本の変換中にエラーが発生しました: %(res)s" -#: cps/gdrive.py:56 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgstr "Googleドライブの設定が完了していません。Googleドライブを無効化してから再度有効にしてみてください" -#: cps/gdrive.py:101 +#: cps/gdrive.py:106 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "コールバックドメインが認証されていません。Google Developer Consoleでドメインを認証してください" -#: cps/helper.py:97 +#: cps/helper.py:94 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "ID: %(book)d の本に %(format)s フォーマットはありません" -#: cps/helper.py:109 +#: cps/helper.py:106 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "Googleドライブ: %(fn)s に %(format)s はありません" -#: cps/helper.py:116 cps/helper.py:223 cps/templates/detail.html:41 +#: cps/helper.py:113 cps/helper.py:220 cps/templates/detail.html:41 #: cps/templates/detail.html:45 msgid "Send to Kindle" msgstr "Kindleに送信" -#: cps/helper.py:117 cps/helper.py:135 cps/helper.py:225 +#: cps/helper.py:114 cps/helper.py:132 cps/helper.py:222 msgid "This e-mail has been sent via Calibre-Web." msgstr "このメールはCalibre-Web経由で送信されました。" -#: cps/helper.py:128 +#: cps/helper.py:125 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s がありません: %(fn)s" -#: cps/helper.py:133 +#: cps/helper.py:130 msgid "Calibre-Web test e-mail" msgstr "Calibre-Web テストメール" -#: cps/helper.py:134 +#: cps/helper.py:131 msgid "Test e-mail" msgstr "テストメール" -#: cps/helper.py:150 +#: cps/helper.py:147 msgid "Get Started with Calibre-Web" msgstr "Calibre-Webを始める" -#: cps/helper.py:151 +#: cps/helper.py:148 #, python-format msgid "Registration e-mail for user: %(name)s" msgstr "ユーザ: %(name)s 用の登録メール" -#: cps/helper.py:165 cps/helper.py:167 cps/helper.py:169 cps/helper.py:177 -#: cps/helper.py:179 cps/helper.py:181 +#: cps/helper.py:162 cps/helper.py:164 cps/helper.py:166 cps/helper.py:174 +#: cps/helper.py:176 cps/helper.py:178 #, python-format msgid "Send %(format)s to Kindle" msgstr "Kindleに %(format)s を送信" -#: cps/helper.py:185 +#: cps/helper.py:182 #, python-format msgid "Convert %(orig)s to %(format)s and send to Kindle" msgstr "%(orig)s を %(format)s に変換してからKindleに送信" -#: cps/helper.py:224 +#: cps/helper.py:221 #, python-format msgid "E-mail: %(book)s" msgstr "メール: %(book)s" -#: cps/helper.py:227 +#: cps/helper.py:224 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "要求されたファイルを読み込めませんでした。権限設定が正しいか確認してください。" -#: cps/helper.py:335 +#: cps/helper.py:331 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "エラー: %(error)s により、タイトルを %(src)s から %(dest)s に変更できませんでした。" -#: cps/helper.py:345 +#: cps/helper.py:341 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "エラー: %(error)s により、著者名を %(src)s から %(dest)s に変更できませんでした。" -#: cps/helper.py:359 +#: cps/helper.py:355 #, python-format msgid "Rename file in path '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "エラー: %(error)s により、ファイルパスを %(src)s から %(dest)s に変更できませんでした。" -#: cps/helper.py:385 cps/helper.py:395 cps/helper.py:403 +#: cps/helper.py:381 cps/helper.py:391 cps/helper.py:399 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "ファイル %(file)s はGoogleドライブ上にありません" -#: cps/helper.py:424 +#: cps/helper.py:420 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "本のパス %(path)s はGoogleドライブ上にありません" -#: cps/helper.py:584 +#: cps/helper.py:579 msgid "Error excecuting UnRar" msgstr "rarファイルを展開中にエラーが発生しました" -#: cps/helper.py:586 +#: cps/helper.py:581 msgid "Unrar binary file not found" msgstr "Unrarバイナリが見つかりません" -#: cps/helper.py:614 +#: cps/helper.py:609 msgid "Waiting" msgstr "待機中" -#: cps/helper.py:616 +#: cps/helper.py:611 msgid "Failed" msgstr "失敗" -#: cps/helper.py:618 +#: cps/helper.py:613 msgid "Started" msgstr "開始" -#: cps/helper.py:620 +#: cps/helper.py:615 msgid "Finished" msgstr "終了" -#: cps/helper.py:622 +#: cps/helper.py:617 msgid "Unknown Status" msgstr "不明" -#: cps/helper.py:627 +#: cps/helper.py:622 msgid "E-mail: " msgstr "メール: " -#: cps/helper.py:629 cps/helper.py:633 +#: cps/helper.py:624 cps/helper.py:628 msgid "Convert: " msgstr "変換: " -#: cps/helper.py:631 +#: cps/helper.py:626 msgid "Upload: " msgstr "アップロード: " -#: cps/helper.py:635 +#: cps/helper.py:630 msgid "Unknown Task: " msgstr "不明なタスク: " -#: cps/oauth_bb.py:87 +#: cps/oauth_bb.py:91 #, python-format -msgid "Register with %s, " +msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:145 +#: cps/oauth_bb.py:149 msgid "Failed to log in with GitHub." msgstr "" -#: cps/oauth_bb.py:150 +#: cps/oauth_bb.py:154 msgid "Failed to fetch user info from GitHub." msgstr "" -#: cps/oauth_bb.py:161 +#: cps/oauth_bb.py:165 msgid "Failed to log in with Google." msgstr "" -#: cps/oauth_bb.py:166 +#: cps/oauth_bb.py:170 msgid "Failed to fetch user info from Google." msgstr "" -#: cps/oauth_bb.py:265 +#: cps/oauth_bb.py:269 #, python-format msgid "Unlink to %(oauth)s success." msgstr "" -#: cps/oauth_bb.py:269 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s failed." msgstr "" -#: cps/oauth_bb.py:272 +#: cps/oauth_bb.py:276 #, python-format msgid "Not linked to %(oauth)s." msgstr "" -#: cps/oauth_bb.py:300 +#: cps/oauth_bb.py:304 msgid "GitHub Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:319 +#: cps/oauth_bb.py:323 msgid "Google Oauth error, please retry later." msgstr "" -#: cps/shelf.py:40 cps/shelf.py:92 +#: cps/shelf.py:46 cps/shelf.py:98 msgid "Invalid shelf specified" msgstr "指定された本棚は無効です" -#: cps/shelf.py:47 +#: cps/shelf.py:53 #, python-format msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" msgstr "申し訳ありませんが、あなたは %(shelfname)s に本を追加することが許可されていません" -#: cps/shelf.py:55 +#: cps/shelf.py:61 msgid "You are not allowed to edit public shelves" msgstr "みんなの本棚を編集することが許可されていません" -#: cps/shelf.py:64 +#: cps/shelf.py:70 #, python-format msgid "Book is already part of the shelf: %(shelfname)s" msgstr "この本は %(shelfname)s にすでに追加されています" -#: cps/shelf.py:78 +#: cps/shelf.py:84 #, python-format msgid "Book has been added to shelf: %(sname)s" msgstr "本を %(sname)s に追加しました" -#: cps/shelf.py:97 +#: cps/shelf.py:103 #, python-format msgid "You are not allowed to add a book to the the shelf: %(name)s" msgstr "%(name)s に本を追加することが許可されていません" -#: cps/shelf.py:102 +#: cps/shelf.py:108 msgid "User is not allowed to edit public shelves" msgstr "みんなの本棚を編集することが許可されていません" -#: cps/shelf.py:120 +#: cps/shelf.py:126 #, python-format msgid "Books are already part of the shelf: %(name)s" msgstr "これらの本は %(name)s にすでに追加されています" -#: cps/shelf.py:134 +#: cps/shelf.py:140 #, python-format msgid "Books have been added to shelf: %(sname)s" msgstr "本が %(sname)s に追加されました" -#: cps/shelf.py:136 +#: cps/shelf.py:142 #, python-format msgid "Could not add books to shelf: %(sname)s" msgstr "%(sname)s に本を追加できません" -#: cps/shelf.py:173 +#: cps/shelf.py:179 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "本が %(sname)s から削除されました" -#: cps/shelf.py:179 +#: cps/shelf.py:185 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "申し訳ありませんが、%(sname)s から本を削除することが許可されていません" -#: cps/shelf.py:200 cps/shelf.py:224 +#: cps/shelf.py:206 cps/shelf.py:230 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "'%(title)s'は既に存在します" -#: cps/shelf.py:205 +#: cps/shelf.py:211 #, python-format msgid "Shelf %(title)s created" msgstr "%(title)s を作成しました" -#: cps/shelf.py:207 cps/shelf.py:235 +#: cps/shelf.py:213 cps/shelf.py:241 msgid "There was an error" msgstr "エラーが発生しました" -#: cps/shelf.py:208 cps/shelf.py:210 +#: cps/shelf.py:214 cps/shelf.py:216 msgid "create a shelf" msgstr "本棚を作成する" -#: cps/shelf.py:233 +#: cps/shelf.py:239 #, python-format msgid "Shelf %(title)s changed" msgstr "%(title)s を変更しました" -#: cps/shelf.py:236 cps/shelf.py:238 +#: cps/shelf.py:242 cps/shelf.py:244 msgid "Edit a shelf" msgstr "本棚を編集する" -#: cps/shelf.py:259 -#, python-format -msgid "successfully deleted shelf %(name)s" -msgstr "%(name)s を削除しました" - -#: cps/shelf.py:289 +#: cps/shelf.py:295 #, python-format msgid "Shelf: '%(name)s'" msgstr "本棚: '%(name)s'" -#: cps/shelf.py:292 +#: cps/shelf.py:298 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "本棚を開けません。この本棚は存在しないかアクセスできません" -#: cps/shelf.py:324 +#: cps/shelf.py:330 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "'%(name)s' 内の本の順番を変更する" -#: cps/ub.py:111 +#: cps/ub.py:68 msgid "Recently Added" msgstr "最近追加した本" -#: cps/ub.py:113 +#: cps/ub.py:70 msgid "Show recent books" msgstr "最近追加された本を表示" -#: cps/templates/index.xml:17 cps/ub.py:114 +#: cps/templates/index.xml:17 cps/ub.py:71 msgid "Hot Books" msgstr "人気の本" -#: cps/ub.py:115 +#: cps/ub.py:72 msgid "Show hot books" msgstr "人気な本を表示" -#: cps/templates/index.xml:24 cps/ub.py:118 +#: cps/templates/index.xml:24 cps/ub.py:75 msgid "Best rated Books" msgstr "高評価の本" -#: cps/ub.py:120 +#: cps/ub.py:77 msgid "Show best rated books" msgstr "評価が高い本を表示" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:121 -#: cps/web.py:965 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:78 +#: cps/web.py:958 msgid "Read Books" msgstr "読んだ本" -#: cps/ub.py:123 +#: cps/ub.py:80 msgid "Show read and unread" msgstr "既読の本と未読の本を表示" -#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:125 -#: cps/web.py:969 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:82 +#: cps/web.py:962 msgid "Unread Books" msgstr "未読の本" -#: cps/ub.py:127 +#: cps/ub.py:84 msgid "Show unread" msgstr "" -#: cps/ub.py:128 +#: cps/ub.py:85 msgid "Discover" msgstr "見つける" -#: cps/ub.py:130 +#: cps/ub.py:87 msgid "Show random books" msgstr "ランダムで本を表示" -#: cps/ub.py:131 +#: cps/ub.py:88 msgid "Categories" msgstr "カテゴリ" -#: cps/ub.py:133 +#: cps/ub.py:90 msgid "Show category selection" msgstr "カテゴリ選択を表示" #: cps/templates/book_edit.html:71 cps/templates/search_form.html:53 -#: cps/ub.py:134 +#: cps/ub.py:91 msgid "Series" msgstr "シリーズ" -#: cps/ub.py:136 +#: cps/ub.py:93 msgid "Show series selection" msgstr "シリーズ選択を表示" -#: cps/templates/index.xml:61 cps/ub.py:137 +#: cps/templates/index.xml:61 cps/ub.py:94 msgid "Authors" msgstr "著者" -#: cps/ub.py:139 +#: cps/ub.py:96 msgid "Show author selection" msgstr "著者選択を表示" -#: cps/templates/index.xml:68 cps/ub.py:141 +#: cps/templates/index.xml:68 cps/ub.py:98 msgid "Publishers" msgstr "出版社" -#: cps/ub.py:143 +#: cps/ub.py:100 msgid "Show publisher selection" msgstr "出版社選択を表示" -#: cps/templates/search_form.html:74 cps/ub.py:144 +#: cps/templates/search_form.html:74 cps/ub.py:101 msgid "Languages" msgstr "言語" -#: cps/ub.py:147 +#: cps/ub.py:104 msgid "Show language selection" msgstr "言語選択を表示" -#: cps/ub.py:148 +#: cps/ub.py:105 msgid "Ratings" msgstr "" -#: cps/ub.py:150 +#: cps/ub.py:107 msgid "Show ratings selection" msgstr "" -#: cps/ub.py:151 +#: cps/ub.py:108 msgid "File formats" msgstr "" -#: cps/ub.py:153 +#: cps/ub.py:110 msgid "Show file formats selection" msgstr "" -#: cps/updater.py:257 cps/updater.py:364 cps/updater.py:377 +#: cps/updater.py:253 cps/updater.py:360 cps/updater.py:373 msgid "Unexpected data while reading update information" msgstr "アップデート情報を読み込み中に予期しないデータが見つかりました" -#: cps/updater.py:264 cps/updater.py:370 +#: cps/updater.py:260 cps/updater.py:366 msgid "No update available. You already have the latest version installed" msgstr "アップデートはありません。すでに最新バージョンがインストールされています" -#: cps/updater.py:290 cps/updater.py:422 +#: cps/updater.py:286 msgid "A new update is available. Click on the button below to update to the latest version." msgstr "アップデートが利用可能です。下のボタンをクリックして最新バージョンにアップデートしてください。" -#: cps/updater.py:343 +#: cps/updater.py:339 msgid "Could not fetch update information" msgstr "アップデート情報を取得できません" -#: cps/updater.py:357 +#: cps/updater.py:353 msgid "No release information available" msgstr "リリース情報がありません" -#: cps/updater.py:403 cps/updater.py:412 +#: cps/updater.py:406 cps/updater.py:415 #, python-format msgid "A new update is available. Click on the button below to update to version: %(version)s" msgstr "アップデートが利用可能です。下のボタンをクリックしてバージョン: %(version)s にアップデートしてください。" -#: cps/web.py:457 +#: cps/updater.py:425 +msgid "Click on the button below to update to the latest stable version." +msgstr "" + +#: cps/web.py:445 msgid "Recently Added Books" msgstr "最近追加された本" -#: cps/web.py:484 +#: cps/web.py:473 msgid "Best rated books" msgstr "高評価" -#: cps/templates/index.xml:38 cps/web.py:492 +#: cps/templates/index.xml:38 cps/web.py:481 msgid "Random Books" msgstr "ランダム" -#: cps/web.py:516 +#: cps/web.py:505 msgid "Books" msgstr "" -#: cps/web.py:543 +#: cps/web.py:532 msgid "Hot Books (most downloaded)" msgstr "話題(ダウンロード数順)" -#: cps/web.py:553 cps/web.py:1294 cps/web.py:1383 +#: cps/web.py:542 cps/web.py:1298 cps/web.py:1386 msgid "Error opening eBook. File does not exist or file is not accessible:" msgstr "電子書籍を開けません。ファイルが存在しないかアクセスできません:" -#: cps/web.py:580 +#: cps/web.py:559 +#, python-format +msgid "Author: %(name)s" +msgstr "" + +#: cps/web.py:571 #, python-format msgid "Publisher: %(name)s" msgstr "出版社: %(name)s" -#: cps/web.py:591 +#: cps/web.py:582 #, python-format msgid "Series: %(serie)s" msgstr "シリーズ: %(serie)s" -#: cps/web.py:602 +#: cps/web.py:593 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:613 +#: cps/web.py:604 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:625 +#: cps/web.py:616 #, python-format msgid "Category: %(name)s" msgstr "カテゴリ: %(name)s" -#: cps/web.py:659 +#: cps/web.py:650 msgid "Publisher list" msgstr "出版社一覧" -#: cps/templates/index.xml:82 cps/web.py:675 +#: cps/templates/index.xml:82 cps/web.py:666 msgid "Series list" msgstr "シリーズ一覧" -#: cps/web.py:689 +#: cps/web.py:680 msgid "Ratings list" msgstr "" -#: cps/web.py:702 +#: cps/web.py:693 msgid "File formats list" msgstr "" -#: cps/web.py:730 +#: cps/web.py:721 msgid "Available languages" msgstr "言語" -#: cps/web.py:750 +#: cps/web.py:741 #, python-format msgid "Language: %(name)s" msgstr "言語: %(name)s" -#: cps/templates/index.xml:75 cps/web.py:764 +#: cps/templates/index.xml:75 cps/web.py:755 msgid "Category list" msgstr "カテゴリ一覧" -#: cps/templates/layout.html:73 cps/web.py:777 +#: cps/templates/layout.html:73 cps/web.py:769 msgid "Tasks" msgstr "タスク" -#: cps/web.py:841 +#: cps/web.py:834 msgid "Published after " msgstr "これ以降に出版 " -#: cps/web.py:848 +#: cps/web.py:841 msgid "Published before " msgstr "これ以前に出版 " -#: cps/web.py:862 +#: cps/web.py:855 #, python-format msgid "Rating <= %(rating)s" msgstr "評価 <= %(rating)s" -#: cps/web.py:864 +#: cps/web.py:857 #, python-format msgid "Rating >= %(rating)s" msgstr "評価 >= %(rating)s" -#: cps/web.py:924 cps/web.py:933 +#: cps/web.py:917 cps/web.py:926 msgid "search" msgstr "検索" -#: cps/web.py:1018 +#: cps/web.py:1012 msgid "Please configure the SMTP mail settings first..." msgstr "初めにSMTPメールの設定をしてください" -#: cps/web.py:1023 +#: cps/web.py:1017 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "本の %(kindlemail)s への送信がキューに追加されました" -#: cps/web.py:1027 +#: cps/web.py:1021 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "%(res)s を送信中にエラーが発生しました" -#: cps/web.py:1046 cps/web.py:1071 cps/web.py:1076 cps/web.py:1081 -#: cps/web.py:1085 +#: cps/web.py:1041 cps/web.py:1066 cps/web.py:1070 cps/web.py:1075 +#: cps/web.py:1079 msgid "register" msgstr "登録" -#: cps/web.py:1073 +#: cps/web.py:1068 msgid "Your e-mail is not allowed to register" msgstr "このメールアドレスは登録が許可されていません" -#: cps/web.py:1077 +#: cps/web.py:1071 msgid "Confirmation e-mail was send to your e-mail account." msgstr "確認メールがこのメールアドレスに送信されました。" -#: cps/web.py:1080 +#: cps/web.py:1074 msgid "This username or e-mail address is already in use." msgstr "このユーザ名またはメールアドレスはすでに使われています。" -#: cps/web.py:1103 cps/web.py:1115 -#, python-format -msgid "You are now logged in as: '%(nickname)s'" +#: cps/web.py:1089 +msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1108 cps/web.py:1120 +#: cps/web.py:1098 cps/web.py:1212 +#, python-format +msgid "you are now logged in as: '%(nickname)s'" +msgstr "%(nickname)s としてログイン中" + +#: cps/web.py:1105 cps/web.py:1122 msgid "Wrong Username or Password" msgstr "ユーザ名またはパスワードが違います" -#: cps/web.py:1111 +#: cps/web.py:1108 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "" -#: cps/web.py:1124 cps/web.py:1146 +#: cps/web.py:1117 +#, python-format +msgid "You are now logged in as: '%(nickname)s'" +msgstr "" + +#: cps/web.py:1126 cps/web.py:1148 msgid "login" msgstr "ログイン" -#: cps/web.py:1158 cps/web.py:1189 +#: cps/web.py:1160 cps/web.py:1191 msgid "Token not found" msgstr "トークンが見つかりません" -#: cps/web.py:1166 cps/web.py:1197 +#: cps/web.py:1168 cps/web.py:1199 msgid "Token has expired" msgstr "トークンが無効です" -#: cps/web.py:1174 +#: cps/web.py:1176 msgid "Success! Please return to your device" msgstr "成功です!端末に戻ってください" -#: cps/web.py:1210 -#, python-format -msgid "you are now logged in as: '%(nickname)s'" -msgstr "%(nickname)s としてログイン中" - -#: cps/web.py:1250 cps/web.py:1277 cps/web.py:1281 +#: cps/web.py:1253 cps/web.py:1280 cps/web.py:1284 #, python-format msgid "%(name)s's profile" msgstr "%(name)s のプロフィール" -#: cps/web.py:1274 +#: cps/web.py:1277 msgid "Found an existing account for this e-mail address." msgstr "このメールアドレスで登録されたアカウントがあります" -#: cps/web.py:1279 +#: cps/web.py:1282 msgid "Profile updated" msgstr "プロフィールを更新しました" -#: cps/web.py:1304 cps/web.py:1306 cps/web.py:1308 cps/web.py:1314 -#: cps/web.py:1318 +#: cps/web.py:1308 cps/web.py:1310 cps/web.py:1312 cps/web.py:1318 +#: cps/web.py:1322 msgid "Read a Book" msgstr "本を読む" -#: cps/web.py:1328 +#: cps/web.py:1332 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "" -#: cps/worker.py:308 +#: cps/worker.py:311 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Ebook-converter が失敗しました: %(error)s" -#: cps/worker.py:319 +#: cps/worker.py:322 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Kindlegen が失敗しました。エラー: %(error)s, メッセージ: %(message)s" @@ -1056,53 +1066,57 @@ msgid "Administration" msgstr "管理" #: cps/templates/admin.html:109 +msgid "View Logfiles" +msgstr "" + +#: cps/templates/admin.html:110 msgid "Reconnect to Calibre DB" msgstr "Calibreデータベースに再接続" -#: cps/templates/admin.html:110 +#: cps/templates/admin.html:111 msgid "Restart Calibre-Web" msgstr "Calibre-Webを再起動" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:112 msgid "Stop Calibre-Web" msgstr "Calibre-Webを停止" -#: cps/templates/admin.html:117 +#: cps/templates/admin.html:118 msgid "Update" msgstr "アップデート" -#: cps/templates/admin.html:121 +#: cps/templates/admin.html:122 msgid "Version" msgstr "バージョン" -#: cps/templates/admin.html:122 +#: cps/templates/admin.html:123 msgid "Details" msgstr "詳細" -#: cps/templates/admin.html:128 +#: cps/templates/admin.html:129 msgid "Current version" msgstr "現在のバージョン" -#: cps/templates/admin.html:134 +#: cps/templates/admin.html:135 msgid "Check for update" msgstr "更新を確認" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:136 msgid "Perform Update" msgstr "更新を実行" -#: cps/templates/admin.html:147 +#: cps/templates/admin.html:148 msgid "Do you really want to restart Calibre-Web?" msgstr "Calibre-Webを再起動します。よろしいですか?" -#: cps/templates/admin.html:152 cps/templates/admin.html:166 -#: cps/templates/admin.html:186 cps/templates/shelf.html:72 +#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:187 cps/templates/shelf.html:72 msgid "Ok" msgstr "はい" -#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:154 cps/templates/admin.html:168 #: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:281 cps/templates/config_view_edit.html:147 +#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:74 #: cps/templates/layout.html:28 cps/templates/shelf.html:73 #: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:12 @@ -1110,11 +1124,11 @@ msgstr "はい" msgid "Back" msgstr "戻る" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:166 msgid "Do you really want to stop Calibre-Web?" msgstr "Calibre-Webを停止します。よろしいですか?" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:178 msgid "Updating, please do not reload page" msgstr "更新中です。ページ再読み込みしないでください" @@ -1243,7 +1257,7 @@ msgstr "編集後に本を表示" msgid "Get metadata" msgstr "メタデータを取得" -#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:279 +#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329 #: cps/templates/config_view_edit.html:146 cps/templates/login.html:20 #: cps/templates/search_form.html:150 cps/templates/shelf_edit.html:17 #: cps/templates/user_edit.html:130 @@ -1387,123 +1401,171 @@ msgstr "ログレベル" msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "ログファイル名 (空欄の場合はcalibre-web.log)" -#: cps/templates/config_edit.html:140 +#: cps/templates/config_edit.html:134 +msgid "Enable Access Log" +msgstr "" + +#: cps/templates/config_edit.html:137 +msgid "Location and name of access logfile (access.log for no entry)" +msgstr "" + +#: cps/templates/config_edit.html:148 msgid "Feature Configuration" msgstr "機能設定" -#: cps/templates/config_edit.html:148 +#: cps/templates/config_edit.html:156 msgid "Enable uploading" msgstr "アップロードを有効にする" -#: cps/templates/config_edit.html:152 +#: cps/templates/config_edit.html:160 msgid "Enable anonymous browsing" msgstr "匿名での閲覧を有効にする" -#: cps/templates/config_edit.html:156 +#: cps/templates/config_edit.html:164 msgid "Enable public registration" msgstr "誰でも新規登録を可能にする" -#: cps/templates/config_edit.html:160 +#: cps/templates/config_edit.html:168 msgid "Enable remote login (\"magic link\")" msgstr "リモートログインを有効する (\"マジックリンク\")" -#: cps/templates/config_edit.html:165 +#: cps/templates/config_edit.html:173 msgid "Use" msgstr "使う" -#: cps/templates/config_edit.html:166 +#: cps/templates/config_edit.html:174 msgid "Obtain an API Key" msgstr "APIキーを取得" -#: cps/templates/config_edit.html:170 +#: cps/templates/config_edit.html:178 msgid "Goodreads API Key" msgstr "GoodreadsのAPIキー" -#: cps/templates/config_edit.html:174 +#: cps/templates/config_edit.html:182 msgid "Goodreads API Secret" msgstr "GoodreadsのAPIシークレット" -#: cps/templates/config_edit.html:181 +#: cps/templates/config_edit.html:189 msgid "Login type" msgstr "" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:191 msgid "Use standard Authentication" msgstr "" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:193 msgid "Use LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:188 +#: cps/templates/config_edit.html:196 msgid "Use GitHub OAuth" msgstr "" -#: cps/templates/config_edit.html:189 +#: cps/templates/config_edit.html:197 msgid "Use Google OAuth" msgstr "" -#: cps/templates/config_edit.html:196 -msgid "LDAP Provider URL" +#: cps/templates/config_edit.html:204 +msgid "LDAP Server Host Name or IP Address" +msgstr "" + +#: cps/templates/config_edit.html:208 +msgid "LDAP Server Port" +msgstr "" + +#: cps/templates/config_edit.html:212 +msgid "LDAP schema (ldap or ldaps)" +msgstr "" + +#: cps/templates/config_edit.html:216 +msgid "LDAP Admin username" +msgstr "" + +#: cps/templates/config_edit.html:220 +msgid "LDAP Admin password" +msgstr "" + +#: cps/templates/config_edit.html:225 +msgid "LDAP Server use SSL" msgstr "" -#: cps/templates/config_edit.html:200 +#: cps/templates/config_edit.html:229 +msgid "LDAP Server use TLS" +msgstr "" + +#: cps/templates/config_edit.html:233 +msgid "LDAP Server Certificate" +msgstr "" + +#: cps/templates/config_edit.html:237 +msgid "LDAP SSL Certificate Path" +msgstr "" + +#: cps/templates/config_edit.html:242 msgid "LDAP Distinguished Name (DN)" msgstr "" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:246 +msgid "LDAP User object filter" +msgstr "" + +#: cps/templates/config_edit.html:251 +msgid "LDAP Server is OpenLDAP?" +msgstr "" + +#: cps/templates/config_edit.html:258 msgid "Obtain GitHub OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:211 +#: cps/templates/config_edit.html:261 msgid "GitHub OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:215 +#: cps/templates/config_edit.html:265 msgid "GitHub OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:221 +#: cps/templates/config_edit.html:271 msgid "Obtain Google OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:224 +#: cps/templates/config_edit.html:274 msgid "Google OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:228 +#: cps/templates/config_edit.html:278 msgid "Google OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:242 +#: cps/templates/config_edit.html:292 msgid "External binaries" msgstr "外部バイナリ" -#: cps/templates/config_edit.html:250 +#: cps/templates/config_edit.html:300 msgid "No converter" msgstr "変換ソフトなし" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:302 msgid "Use Kindlegen" msgstr "Kindlegenを使う" -#: cps/templates/config_edit.html:254 +#: cps/templates/config_edit.html:304 msgid "Use calibre's ebook converter" msgstr "calibreのebook converterを使う" -#: cps/templates/config_edit.html:258 +#: cps/templates/config_edit.html:308 msgid "E-Book converter settings" msgstr "E-Book converterの設定" -#: cps/templates/config_edit.html:262 +#: cps/templates/config_edit.html:312 msgid "Path to convertertool" msgstr "convertertoolのパス" -#: cps/templates/config_edit.html:268 +#: cps/templates/config_edit.html:318 msgid "Location of Unrar binary" msgstr "Unrarバイナリのパス" -#: cps/templates/config_edit.html:284 cps/templates/layout.html:84 +#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 #: cps/templates/login.html:4 msgid "Login" msgstr "ログイン" @@ -1717,7 +1779,7 @@ msgstr "ホームに戻る" msgid "Discover (Random Books)" msgstr "本を見つける (ランダムで表示)" -#: cps/templates/index.html:65 +#: cps/templates/index.html:64 msgid "Group by series" msgstr "" @@ -1860,6 +1922,14 @@ msgstr "記憶する" msgid "Log in with magic link" msgstr "マジックリンクでログイン" +#: cps/templates/logviewer.html:5 +msgid "Show Calibre-Web log" +msgstr "" + +#: cps/templates/logviewer.html:8 +msgid "Show access log" +msgstr "" + #: cps/templates/osd.xml:5 msgid "Calibre-Web ebook catalog" msgstr "Calibre-Web 電子書籍カタログ" @@ -2173,13 +2243,13 @@ msgid "Recent Downloads" msgstr "最近のダウンロード" #~ msgid "Failed to create path for cover %(path)s (Permission denied)." -#~ msgstr "カバー画像 %(path)s の作成に失敗しました (Permission denied)。" +#~ msgstr "" #~ msgid "Failed to store cover-file %(cover)s." -#~ msgstr "カバー画像 %(cover)s の保存に失敗しました。" +#~ msgstr "" #~ msgid "Cover-file is not a valid image file" -#~ msgstr "カバー画像が無効な画像ファイルです" +#~ msgstr "" #~ msgid "Cover is not a jpg file, can't save" #~ msgstr "カバー画像がjpgファイルでないため、保存できません" @@ -2238,3 +2308,15 @@ msgstr "最近のダウンロード" #~ msgid "PDF.js viewer" #~ msgstr "PDF.js ビューア" +#~ msgid "Please enter a LDAP provider and a DN" +#~ msgstr "" + +#~ msgid "successfully deleted shelf %(name)s" +#~ msgstr "%(name)s を削除しました" + +#~ msgid "LDAP Provider URL" +#~ msgstr "" + +#~ msgid "Register with %s, " +#~ msgstr "" + diff --git a/cps/translations/km/LC_MESSAGES/messages.mo b/cps/translations/km/LC_MESSAGES/messages.mo index 9e077ba0f0c6f9f47fd6b4df1395adf091d39cc5..64b17b2b3c60a4e81226814e296fb8abf498c4f9 100644 GIT binary patch delta 7177 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

    @0VAi@cSSk|bwRT9mh(LuS5nlIiglx=W?&lyuoP zB}?9$np8P0R#K*=%IayRL_X0*dOk5RoZ=b#TO_zWrZaD$k!j9%rn%ikUPcSbjm*NC zMVc2Q(=7|8J0)XAiDlB!nN}WTpMma~D3uQ*`sJdA$uUG3QJzUe|u&cKO z@P>Y2>&I3W`lZC#{^Z!?x>?+g*8IwJ3(lpU-VJGeVuo8T`d5x)VpC{bM z^Bzu2?J1`#Ki^||y_E}(%9(}9QfpCEv)OK6FQ+}cDQJTo#f6nG=FWko2kQO+!h z3vOMK>X5REmcgMFeI0Ug=_t9f>}HctU{feip+8$HLxIhqEzgAlRdQ&1bIE@$L!v`1 z#eKN8l$=YIfy-w||K(A^pO?ouq}$3|`F!O?iCA@2-dNRB`n+%}N-qx_2(QMVLY%>t zQn`Adw0-fmWUpx@)#BD zbg;EFf2lHf@}*}T!3i7V9rEHU2PENejNI9@K|a~uOfFaTllhyAAX{TbhYKko$k;ze(QKfJARwA>+5l$n|X*m@f6+=!hd&xRd;S zduDLbn=uaAwqu?+chZt?#p|Ei;XECZ%=JlijZk1iXv^{hsq^+Wx%W#pA6jehW#EwWSUMy~m{}IDunvawT|5s`vGl-2Khu z{Qh>5SKXSLyc7yZxF8!sf&Dt&vRd|3ClUpBUMk5S_$24UiAkZrvhZ1ykh3Hln2uIa zLn;t{C-5ql_dohY##bar+QE=a`goKKKlF~oe=9uCnctU%>N9xU!CSx0i^ zvm=+~?$Ne#=cq@Pe4QX?jiEvAW@5N@D%WE4WgSU>~bOhs1zUGkopRSgwf1fU` zKN~7XJ{uft_qnTv-1;IQhw04UPWOoq1zrw^OL&K@9NI61p!>_O9l=p&G8}T`e2i3l z-8y*cY}Ug`lw3I;DaD7oNagu84^NO&XPa=M8J<7-*KH!-yhaC-sc;(yUeUHca^Wl4 z`)z^v|D#Z9Uz{cfE_R`?%`|T5ap^3b(M+EEZh+)nZYs}R?kqljS>G1d_*{Ar{^zWce2G`rS@axNwBa%5e9IdCnpak%c3Z$sBmV0pNtTV&ra qkBQ^@@L=)vgAVC^qfjbNG?$|{Vz_o4X_SObu@Z5!v%Glo)V}~(c=Z4P literal 61016 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

    |*!8#_vOcXOW2n`t-~ z8y^-oK_=(I;yF>u7eH#GOUYT;%0gAxOH9+Qu~qzbrI=a5D8zpzZj({g?#qm*6A^~B zZl6JEl;g*DQs|=wOSFA&R61^H6Ry^iQ#B*F(A0yk_;+2Y@T=w&BM|geg|E=?Fc zn$ZSZ7fqZy8@-f~bnEiY^5`jU5j7;*Zo<jZ-w&W)RXiHQmF}k#S?j9^W|Tn8u^V zMq|fL7&qpKF&y{7VQu5sM4(b!`rj2VB#7=A;&-JEo(r*RRp4z{y7 zM>`?nj?a=OM4esd%$}LJ8y98LT|8fa-lcPm)0rXDF7n;xES)%ZB0nkAlM}~mH+RLc8%hZ?c^HuQ>FB;AqYMR@=$89h_3BlOO`7o#}hG8 zdIAxex+SKYxQj>2zO(`#gL~TeYz-cs(mW^`Ds{4jlhlVyZP2Di80v`d1S77iO;>TQ zbbRXCP%S*tzvgmF^m5BFiQX621=o*SW^S@3L#v??c@8lb6pto$CGuTQL}(!i zcr&ATH}|huMXjwr%(WIb*}?p*Sie`y6b35RoV6FdKHt^KV`ZaAh}-M!UHxm{vHs{N zHeN{_WxK^hb#-_FiP=E)i;Q9>g#|eOU6lVUGVY%>a2)F0Atp7inRS*>b+bl0sJbg; zl4ZGF)xAm4lBhTG!v)QqhCJv?NEj*ni@s{av$j)ia7ZjW$M?gPU*!cnjvl4J5j2v7^T95QU*2oxUFEBgXy3cr0u4G zyEJp;OQ9dKY@vxaMS6|OAOR=8{#U9fmbD}ojLAT$RplE$$PszdCOmu8z{OS%WRDhn znR!517f~S;W2mSpHvurr=oyhFE$($D@E5%7r7myebiNT}N7`jo#N!QFZD(~IW^`^Dtk6fxUC`$E8 zd}M7$mO`~JlY#x@LMCcpy;I(Y&8F2U02+s_qxMmzN)08iXdsb_2F6pnl%x{BdnT;S`liR2)=qWNvdcI zT3hLDHX+7%kfQ+(JdQ;T; z*i!><^;^#w>|p$|r-3?WN=xiChbt?`l&UH?G2K{lswQz#Q#V)FS(3w~qZ!yqCV>Zu zi&rtRHe2&Lskl(60I6XKR#@fRMb+Taj&dauNIch@*bV!L6^|->T;j8350@aT9%Rtp zOciGZX}BGt=olB8DMhz_P1oFX>rHH{EZ-{?!(aLeE9-5E9wCr8mNL1hS+bG2R4zyy zp(W}sPu<)AbeS%T2Tdpjd7iZ!t14O;h@szd->_#}pS=r6oY`&h5W z@M=A<%PLCt?pm(MJsGX9@|5ki#6SKB8w1*wkIxUVnq1k-{`Xt9Ht{W6dcT$lp9+?) z#D>fD0R2bXFN_-c*W6vK#%rDVFl};^S+jyeVDuIRpzrXSN0U8r z{CQVft2WyHZqY7BCD||{Ad@RhpoQXsw9gjtxZ?@fI-YSH9$>yH$JFYcqlY~8E_=M-Y%hD zvDW`eGOIRXMR!mt6a;;xBK?k6s*fJY9fplTBWi`8L<0x4SV;!e;Z-gHhwU|B#fXEyPDkGSi4=f*uBcqUTKM;9h5JbX(r=vZwr6Rd`#t_ z4!}jLg|Wk_HmxV0Sn4Ub$L5K~@ZV6ScXSNUN)_ z{;^Ck&sQWuwt)$XK$q?IZ}ljmKxt8t>T-HcxsO47z|5t|Ew03BQV0$Jg-iZJJ|BVqW8P$EdO_hT+XR>hj00syQO!Q6?BQ{p=`sD=xItc3I)jarRGSF; zQR~_Uj8QlFRe4p7$cvS%ym}9eT3GiTEDojsH`QKgsoi_*e-@B-qu z48_iH4#UnyZPHuzOa&1U>619glDJm;T3G1eoTQzese0$0<&p|=TR^F}4l7R{F8-~K z*?yvnN4jkCOsl+@Z{X9~rVxix6G^T~N&+NvdcP8x8!VQJU0Ltj{RRulux8NC2f2jd z^2WXfP=%3*Q0cJJZh}JNunH6dx$%#uIJw|&vUuVF@q==ZoAqs^C2`q|N5iPP*@utT zP%ckWOE{?wW-S~hvnGjBSZA%~;=RIZS+~2Hl-*o;CBsWA-YbK)!6M^?S$3J!`lZ(Ef?M`{_)ZwFH?LxJCP|SCMOXLU z#7%hxWK-&|Q_>`}gO@ZZ7DA!OiSHqc)^7uwBr*y-s468AsaU9?Bwz8dv3Wqe8-A~3 zd@g~LL)Z$GfI4H)Kttmn*NLIUPMI_4u{&2-Mczmy&@Nn?LO&HRtw^l~eN3CdzR{x8 zpa=26o3r#Tz+uJd#3YIh{ z>;I&LQXd<(Asm$LFBZ;UAu+Fij`45!{hO9&^6$lAM4Jr#s6tAF_J?^DubZ@&at>L< z5J^P|l1U`p5rXo8#U;sVxgCa|t{;3PDpa1S3CJN^=|r*^p~0rQAW!y zA&1H&Evu&E^lT6?jA>0&eh5;V%6`Rgvg&@V!+%aSAZy9=xGp2E+I5ns^OLme6>(;L zQH?P}jR2G>e_Ls-HS{jVI$CDo|9*j~-f`+LFpUSUKAc3?!n6j}T503S0T2Fv^>R~d zzdsZzxW|yTGErHtH`y$Ihm7=IkkOS9)L^EhE80b~jmuWSVj0_r4 zov}ynC=eZ|m7}t_{vv}nXzo*hqDrfPN3x4gSoM<|5VfU4NUYB4L;4#T8B~@nf>kerdFD+ zyC%{$X~;hILuu@HFR$}0xBYAGFhyQr%^!8XDt@zxMz~s_LJ(m@5kE`rZL-{;T(8nC$qZ z7E?^FXdlFRqkb?w&^$!eonZ>-%W9USlXcJmuMU<(LZ9m^9aKBzBr&8$rZ3bAGnX}H zsB%=#@`QgI2F8-AegSdy&*6z_MO8OQKCf2BxSe#9NoL4Ea!r91f3jH5rxD^$^ze4z z_Q>B#oX92?VbHy}?1Pk}Cij)4Vyf})ZcaB!0xB(M`0ORgwz)}P&IEs@RS%+-W>m>- z5E&A~zhA2SfB&V*)`q=5PJTy7V@5?7ON1@2zuy~|2aMM%KUC~ryNb6iS6;(hm2tP) z7=bJ6-^*NQ+;l9qGAib{_1k$V^9Eno?ADF93P=9xzm0rpvrQ7{ff7@1^LbfN{#|cF zee7tmaz=|(3HoiTg6TzdNNU6V5f}3TOb$=6vzSxAAC~!*$A7VRL7Q=++oCfW^t?F} zu$prjQcCqXUTy^7V(?vsb!ONuM+|z2bX^5-_h0{g($>SGD&h2ny;WKZFzb1%w5bU} zu4SM@-@(;dM8jAE9ij;^0ANtQ(gcYe&~9O518E*pDJ$$RlLY(?HD|tWqq}8Km1rNa z2x3-e^q5 zZ97l)wv_lqExb;GWhkUxKRl`)R+y|eu9>U-tNM_E_1x5}oYXFIbqUcj+^Qq&RhCDs zh9Ljy5hI?kC1i?ZhhF}ttdGiz%#C}m`k{j2Lk6MVHs!V4CQMJjvzN>S2F&K{U8M0S zpA1o2iWf$s@mr~rSBCft;`~=x_3!Jdf5$g(gkY)i@AA6ts`64*RvlVtLH^XA*BRy< zgT`dWdbS{9rXd>J9zr!%*GSDagXs|Z$k=Y+gotka?KKOfktqa5~&zA|8<M$I_O6t_iYW3MI z{DtEg1gH;|6l$m%_dYN*xhNw08w?Umoq0y{NYaERi4D>o;`hB{(Cj^5;hpd`uN6=3 z>4=^WvWbb2)(}x{jHh^bK@`luSJIX?DsGecIzMb?qdWAC&UDBZ)SEe3VV$3E4%813 zdDFbVwZ5wP4XNBj+?84&vc#_|I6klq7EdKXX5`tv=czd)`kbGuGN^VqM;=aQ-3`AEjasNs9EzIdzAHpH`4q3g(&b?4O^mG-m@m72Pf`NbL<1hR|fn*RW9eawP-6S9q z3Phn17s^{%MOEtcUpX*SfM{HI5EJ<&0?NU)i-v)s$AmX7yvIggFd(GEJTau~^1%n< z^X(C4Imm==`VqYHm{{>kUh%hjdOieAj?Ox{-~8h*xdfANgk&{23*8c@EsM;8A7cT(%%S;6&oo9;&EXt~<38s}a?JxC!Mo zhZx?o2Cz3D^{*6B*Vd}#>$k@3^4A4NM zk31eQd7$WSmC$Fk#Etp@#egL@n#h2;r6zK;mg?p~s`V`|{=qWs8Dq)6#Hx6M)2zGB zPozQWkoR;l-g`|d$eS+a!tF*#L?6GXO30g=%$G&Vqxz8Cy4${uF+?anaUmc2TE-AQ zYQCRgeFUb?G9|6OB+^$h;vHNHKp%p-uCNOj@ zkyYH(s56=x4WnisJC2Q1(NiMFPF>=k5cz9-NJP;q)|wYqQkJBUgFKdoNd)MQi(sAU z<=R8|ZpQ|`KvG*)bolM@K7Dhh`eP)PEmRd1N6>yOz1|WqoFNkk1!F}nYkb$ZEvKGe z{(7B~ckeF{=OBB|))$0dE++je_JihG6E%{marfI+IgQOehEgTQ8eLgm6D7vj9+^Qi z0gwffp`3$RRBzgZ8~R~nYU3h6PS_T-7G*Of4%+NS5#xh}rD9fKhzN!%W1FdOvOoat z^33{M&GQNGMzv}G)dQo&csjZH&^ApW|Z|;h>g-p{V5lv z(=VPXKkrC%!1Tx0!I1(|RPW;r(JovBjQ45EW>OVnTma3i>36R(QM!yN6_KcCiT5eE zQ|&}KAJAf7RbJ4mx_52x5fRudcR`u%VLS1R4_7eFh@J27iz|R^DmLGHv`H&n*s1J|KfgI6Als-rLu)mUUztpC80NVuqe3uE{wQ{~HZbsuSx z7ARq~XBAQZJ-*fyH*u0g-)+{bJ_vwduFq34>s+5FZ;w8-5MTREPwrv3S!U4E?>&2-`7X48d0{bdF|2pUN7rq?C+ee1u4` zU2(baVbUWuY)GeC}f%pEOg(>KcwMv)N=0 zVAvA9)H@+bYn=^YP^iR2*GyJZ9;MX_siTU?FJ5U6F%u;P+qSfZh8=ua+Ud9$%n((t<&engrPo+R;3G@ za-7PtL%v9sEF^;rGIeESruk8;Dy%zMeY<~X%}U|ReS~q7k5S&>Qi}UfM964UGFzP^ z>dX6~*O3LUFqN%;%`G-ox*~j?jSqThO?i_){bnKWbova#`TV}p=j9G89T1nDMCyJm6l^`@_LprcB9EiRQ%)a� zQ73)Uj*rgjl_i6H{LN~&dZ@gyWkx(z%Y|Y0&Mh!%Ld)`vZ-j{v!f?4w^}*rBrV&X5 zk`9&)okRhME*TBb0brt7q1xE!%zFD2ni^mvM>WT5@$u<~nib-Wk2>{wK2BIwm=#t$ zWK%Ol@Xr?x{;k5;>q^T$0wA!PGK8ch)xYd3hPL^MT<8clQ4~}fZ%RT3m^<)~h}@`< zRcew(cV%jb?;)Bl;-~uf_`lNk5o=q-;0nL7-%X4)AMv5#s5+*YMul`}ODKHZp4||M zZPce0ElP|%6@*e@?-{R?4k;6>rf)R$L{IByZx)6|#PLhQ^N#>m+xJZEQ;h_r;rcM1 z3(tPdP%9ejlZ>W9Nx;MgB%_F6Gl_j;;z}YKbbwgX@~ZTe!joML1!AZ8gZ7NRi>a=H z9Mu``igo01z1_E=h>1lNOO-ON)B=&EL#si|TE&| znX1UjGUqm$j*_l}Y9MykNB$Bgf4Qlnvy!4-a~c~CA0H1{4|SR3f= %(rating)s" msgstr "ការវាយតម្លៃ >= %(rating)s" -#: cps/web.py:924 cps/web.py:933 +#: cps/web.py:917 cps/web.py:926 msgid "search" msgstr "ស្វែងរក" -#: cps/web.py:1018 +#: cps/web.py:1012 msgid "Please configure the SMTP mail settings first..." msgstr "សូមកំណត់អ៊ីមែល SMTP ជាមុនសិន" -#: cps/web.py:1023 +#: cps/web.py:1017 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "សៀវភៅបានចូលជួរសម្រាប់ផ្ញើទៅ %(kindlemail)s ដោយជោគជ័យ" -#: cps/web.py:1027 +#: cps/web.py:1021 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "មានបញ្ហានៅពេលផ្ញើសៀវភៅនេះ៖ %(res)s" -#: cps/web.py:1046 cps/web.py:1071 cps/web.py:1076 cps/web.py:1081 -#: cps/web.py:1085 +#: cps/web.py:1041 cps/web.py:1066 cps/web.py:1070 cps/web.py:1075 +#: cps/web.py:1079 msgid "register" msgstr "ចុះឈ្មោះ" -#: cps/web.py:1073 +#: cps/web.py:1068 msgid "Your e-mail is not allowed to register" msgstr "" -#: cps/web.py:1077 +#: cps/web.py:1071 msgid "Confirmation e-mail was send to your e-mail account." msgstr "" -#: cps/web.py:1080 +#: cps/web.py:1074 msgid "This username or e-mail address is already in use." msgstr "" -#: cps/web.py:1103 cps/web.py:1115 -#, python-format -msgid "You are now logged in as: '%(nickname)s'" +#: cps/web.py:1089 +msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1108 cps/web.py:1120 +#: cps/web.py:1098 cps/web.py:1212 +#, python-format +msgid "you are now logged in as: '%(nickname)s'" +msgstr "ឥឡូវអ្នកបានចូលដោយមានឈ្មោះថា៖ ‘%(nickname)s’" + +#: cps/web.py:1105 cps/web.py:1122 msgid "Wrong Username or Password" msgstr "ខុសឈ្មោះអ្នកប្រើប្រាស់ ឬលេខសម្ងាត់" -#: cps/web.py:1111 +#: cps/web.py:1108 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "" -#: cps/web.py:1124 cps/web.py:1146 +#: cps/web.py:1117 +#, python-format +msgid "You are now logged in as: '%(nickname)s'" +msgstr "" + +#: cps/web.py:1126 cps/web.py:1148 msgid "login" msgstr "ចូលប្រើ" -#: cps/web.py:1158 cps/web.py:1189 +#: cps/web.py:1160 cps/web.py:1191 msgid "Token not found" msgstr "រកមិនឃើញវត្ថុតាង" -#: cps/web.py:1166 cps/web.py:1197 +#: cps/web.py:1168 cps/web.py:1199 msgid "Token has expired" msgstr "វត្ថុតាងហួសពេលកំណត់" -#: cps/web.py:1174 +#: cps/web.py:1176 msgid "Success! Please return to your device" msgstr "ជោគជ័យ! សូមវិលមកឧបករណ៍អ្នកវិញ" -#: cps/web.py:1210 -#, python-format -msgid "you are now logged in as: '%(nickname)s'" -msgstr "ឥឡូវអ្នកបានចូលដោយមានឈ្មោះថា៖ ‘%(nickname)s’" - -#: cps/web.py:1250 cps/web.py:1277 cps/web.py:1281 +#: cps/web.py:1253 cps/web.py:1280 cps/web.py:1284 #, python-format msgid "%(name)s's profile" msgstr "ព័ត៌មានសង្ខេបរបស់ %(name)s" -#: cps/web.py:1274 +#: cps/web.py:1277 msgid "Found an existing account for this e-mail address." msgstr "" -#: cps/web.py:1279 +#: cps/web.py:1282 msgid "Profile updated" msgstr "ព័ត៌មានសង្ខេបបានកែប្រែ" -#: cps/web.py:1304 cps/web.py:1306 cps/web.py:1308 cps/web.py:1314 -#: cps/web.py:1318 +#: cps/web.py:1308 cps/web.py:1310 cps/web.py:1312 cps/web.py:1318 +#: cps/web.py:1322 msgid "Read a Book" msgstr "អានសៀវភៅ" -#: cps/web.py:1328 +#: cps/web.py:1332 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "" -#: cps/worker.py:308 +#: cps/worker.py:311 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Ebook-converter បានបរាជ័យ៖ %(error)s" -#: cps/worker.py:319 +#: cps/worker.py:322 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Kindlegen បានបរាជ័យដោយមានកំហុស %(error)s. សារ៖ %(message)s" @@ -1057,53 +1067,57 @@ msgid "Administration" msgstr "កិច្ចការរដ្ឋបាល" #: cps/templates/admin.html:109 +msgid "View Logfiles" +msgstr "" + +#: cps/templates/admin.html:110 msgid "Reconnect to Calibre DB" msgstr "ភ្ជាប់ទៅ database Calibre ម្តងទៀត" -#: cps/templates/admin.html:110 +#: cps/templates/admin.html:111 msgid "Restart Calibre-Web" msgstr "" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:112 msgid "Stop Calibre-Web" msgstr "" -#: cps/templates/admin.html:117 +#: cps/templates/admin.html:118 msgid "Update" msgstr "" -#: cps/templates/admin.html:121 +#: cps/templates/admin.html:122 msgid "Version" msgstr "" -#: cps/templates/admin.html:122 +#: cps/templates/admin.html:123 msgid "Details" msgstr "" -#: cps/templates/admin.html:128 +#: cps/templates/admin.html:129 msgid "Current version" msgstr "" -#: cps/templates/admin.html:134 +#: cps/templates/admin.html:135 msgid "Check for update" msgstr "រកមើលបច្ចុប្បន្នភាព" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:136 msgid "Perform Update" msgstr "ធ្វើបច្ចុប្បន្នភាព" -#: cps/templates/admin.html:147 +#: cps/templates/admin.html:148 msgid "Do you really want to restart Calibre-Web?" msgstr "" -#: cps/templates/admin.html:152 cps/templates/admin.html:166 -#: cps/templates/admin.html:186 cps/templates/shelf.html:72 +#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:187 cps/templates/shelf.html:72 msgid "Ok" msgstr "បាទ/ចាស" -#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:154 cps/templates/admin.html:168 #: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:281 cps/templates/config_view_edit.html:147 +#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:74 #: cps/templates/layout.html:28 cps/templates/shelf.html:73 #: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:12 @@ -1111,11 +1125,11 @@ msgstr "បាទ/ចាស" msgid "Back" msgstr "មកក្រោយ" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:166 msgid "Do you really want to stop Calibre-Web?" msgstr "" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:178 msgid "Updating, please do not reload page" msgstr "កំពុងធ្វើបច្ចុប្បន្នភាព សូមកុំបើកទំព័រជាថ្មី" @@ -1244,7 +1258,7 @@ msgstr "មើលសៀវភៅក្រោយពីកែប្រែ" msgid "Get metadata" msgstr "មើលទិន្នន័យមេតា" -#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:279 +#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329 #: cps/templates/config_view_edit.html:146 cps/templates/login.html:20 #: cps/templates/search_form.html:150 cps/templates/shelf_edit.html:17 #: cps/templates/user_edit.html:130 @@ -1388,123 +1402,171 @@ msgstr "កម្រិត log" msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "ទីតាំង និងឈ្មោះ logfile (calibre-web.log ប្រសិនបើទទេ)" -#: cps/templates/config_edit.html:140 +#: cps/templates/config_edit.html:134 +msgid "Enable Access Log" +msgstr "" + +#: cps/templates/config_edit.html:137 +msgid "Location and name of access logfile (access.log for no entry)" +msgstr "" + +#: cps/templates/config_edit.html:148 msgid "Feature Configuration" msgstr "ការកំណត់មុខងារ" -#: cps/templates/config_edit.html:148 +#: cps/templates/config_edit.html:156 msgid "Enable uploading" msgstr "អនុញ្ញាតការអាប់ឡូត" -#: cps/templates/config_edit.html:152 +#: cps/templates/config_edit.html:160 msgid "Enable anonymous browsing" msgstr "អនុញ្ញាតការរុករកដោយអនាមិក" -#: cps/templates/config_edit.html:156 +#: cps/templates/config_edit.html:164 msgid "Enable public registration" msgstr "អនុញ្ញាតការចុះឈ្មោះសាធារណៈ" -#: cps/templates/config_edit.html:160 +#: cps/templates/config_edit.html:168 msgid "Enable remote login (\"magic link\")" msgstr "អនុញ្ញាតការ login ពីចម្ងាយ (ឬ “magic link”)" -#: cps/templates/config_edit.html:165 +#: cps/templates/config_edit.html:173 msgid "Use" msgstr "ប្រើប្រាស់" -#: cps/templates/config_edit.html:166 +#: cps/templates/config_edit.html:174 msgid "Obtain an API Key" msgstr "ទាញយក API key" -#: cps/templates/config_edit.html:170 +#: cps/templates/config_edit.html:178 msgid "Goodreads API Key" msgstr "Goodreads API key" -#: cps/templates/config_edit.html:174 +#: cps/templates/config_edit.html:182 msgid "Goodreads API Secret" msgstr "Goodreads API secret" -#: cps/templates/config_edit.html:181 +#: cps/templates/config_edit.html:189 msgid "Login type" msgstr "" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:191 msgid "Use standard Authentication" msgstr "" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:193 msgid "Use LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:188 +#: cps/templates/config_edit.html:196 msgid "Use GitHub OAuth" msgstr "" -#: cps/templates/config_edit.html:189 +#: cps/templates/config_edit.html:197 msgid "Use Google OAuth" msgstr "" -#: cps/templates/config_edit.html:196 -msgid "LDAP Provider URL" +#: cps/templates/config_edit.html:204 +msgid "LDAP Server Host Name or IP Address" +msgstr "" + +#: cps/templates/config_edit.html:208 +msgid "LDAP Server Port" +msgstr "" + +#: cps/templates/config_edit.html:212 +msgid "LDAP schema (ldap or ldaps)" +msgstr "" + +#: cps/templates/config_edit.html:216 +msgid "LDAP Admin username" +msgstr "" + +#: cps/templates/config_edit.html:220 +msgid "LDAP Admin password" msgstr "" -#: cps/templates/config_edit.html:200 +#: cps/templates/config_edit.html:225 +msgid "LDAP Server use SSL" +msgstr "" + +#: cps/templates/config_edit.html:229 +msgid "LDAP Server use TLS" +msgstr "" + +#: cps/templates/config_edit.html:233 +msgid "LDAP Server Certificate" +msgstr "" + +#: cps/templates/config_edit.html:237 +msgid "LDAP SSL Certificate Path" +msgstr "" + +#: cps/templates/config_edit.html:242 msgid "LDAP Distinguished Name (DN)" msgstr "" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:246 +msgid "LDAP User object filter" +msgstr "" + +#: cps/templates/config_edit.html:251 +msgid "LDAP Server is OpenLDAP?" +msgstr "" + +#: cps/templates/config_edit.html:258 msgid "Obtain GitHub OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:211 +#: cps/templates/config_edit.html:261 msgid "GitHub OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:215 +#: cps/templates/config_edit.html:265 msgid "GitHub OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:221 +#: cps/templates/config_edit.html:271 msgid "Obtain Google OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:224 +#: cps/templates/config_edit.html:274 msgid "Google OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:228 +#: cps/templates/config_edit.html:278 msgid "Google OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:242 +#: cps/templates/config_edit.html:292 msgid "External binaries" msgstr "" -#: cps/templates/config_edit.html:250 +#: cps/templates/config_edit.html:300 msgid "No converter" msgstr "គ្មានកម្មវិធីបម្លែង" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:302 msgid "Use Kindlegen" msgstr "ប្រើ Kindlegen" -#: cps/templates/config_edit.html:254 +#: cps/templates/config_edit.html:304 msgid "Use calibre's ebook converter" msgstr "ប្រើកម្មវិធីបម្លែង eBook របស់ Calibre" -#: cps/templates/config_edit.html:258 +#: cps/templates/config_edit.html:308 msgid "E-Book converter settings" msgstr "ការកំណត់របស់កម្មវិធីបម្លែង eBook" -#: cps/templates/config_edit.html:262 +#: cps/templates/config_edit.html:312 msgid "Path to convertertool" msgstr "ទីតាំងរបស់កម្មវិធីបម្លែង" -#: cps/templates/config_edit.html:268 +#: cps/templates/config_edit.html:318 msgid "Location of Unrar binary" msgstr "" -#: cps/templates/config_edit.html:284 cps/templates/layout.html:84 +#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 #: cps/templates/login.html:4 msgid "Login" msgstr "ចូលប្រើប្រាស់" @@ -1718,7 +1780,7 @@ msgstr "" msgid "Discover (Random Books)" msgstr "ស្រាវជ្រាវ (សៀវភៅចៃដន្យ)" -#: cps/templates/index.html:65 +#: cps/templates/index.html:64 msgid "Group by series" msgstr "" @@ -1861,6 +1923,14 @@ msgstr "ចងចាំខ្ញុំ" msgid "Log in with magic link" msgstr "ចូលប្រើប្រាស់ដោយ magic link" +#: cps/templates/logviewer.html:5 +msgid "Show Calibre-Web log" +msgstr "" + +#: cps/templates/logviewer.html:8 +msgid "Show access log" +msgstr "" + #: cps/templates/osd.xml:5 msgid "Calibre-Web ebook catalog" msgstr "" @@ -2320,3 +2390,15 @@ msgstr "ការទាញយកថ្មីៗ" #~ msgid "PDF.js viewer" #~ msgstr "កម្មវិធីមើល PDF.js" +#~ msgid "Please enter a LDAP provider and a DN" +#~ msgstr "" + +#~ msgid "successfully deleted shelf %(name)s" +#~ msgstr "បានបង្កើតធ្នើឈ្មោះ %(name)s ដោយជោគជ័យ" + +#~ msgid "LDAP Provider URL" +#~ msgstr "" + +#~ msgid "Register with %s, " +#~ msgstr "" + diff --git a/cps/translations/nl/LC_MESSAGES/messages.mo b/cps/translations/nl/LC_MESSAGES/messages.mo index 5b4f0125e673e353a177b0a05ff60dc7d22f9d99..f6057405b3c067624506a89e178546a892f0db1f 100644 GIT binary patch literal 46991 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 literal 50345 zcmdU&34C2uz3(^kJVQYyH_*})nslH{EmPX0>5#O&P1*_yx^uFVoaE%}aE6AIhXbe} zT&^erf&&NwUO+_v*Be>;qQmj;UjQw z_##{f_g)kP>){~ObDxDf!Qa8{;Gf_QaI2GoU`MzUl>gpP{s%yk6ohbRI34Z^=Xjn3 z6@IzDzuNN*xI6wa+yhqN_VBH6TX+f7`!0h@&(%=z-r(=w?(g5_`5CD9d*eO0LN?}U2(N~nB&5bgu-_V>T) z??2?-Kk|GG?n1aHpvv|4Q04ePQ19LDR2T2=p3|W6eW-W0K)vTUsP?r2Dm|}-imw-{ zJO`lavjmmSxA^<-fO_sX{cnJJ?iQ$WxC1J_d!XL; zC3qNo94Z~#E^+BP6h^p@gKEF;g^K4UsB-xj)bscH`wv64)5oF0Jqu5SFF>X1_%_GW zpxWhfsB%6F>ixq|&s_>tpI1OVca!JG{r!79AAriom!b0e1MmM+sDAcKsOSIW{kLs* z^|dQhIh+WUuT$Xy*ah|8^P$G6%c0WuAXIw40~P)WsP^(K)O)vD>gr(^sPyj*_1**F zOn3x59Ik{UB`Ctz!8_p*aL*3X02jdNumY8@tKqirBXB$TQK)`%Csh2Kz5DC_{*U1? z_&*M}fzy_`bRFnjD(4?U zmD{hN!u<)V+;&**%41*8gQ4;<9qt5=f;++mQ2pR!I1{deE$}?3esr7n{{htdUxZ56 zekH zf5M&MZ=mx198`OH5h}ggta9bDGgST0f-1K~a96m(`)_~>pNDFfqmU^p_^@|B4v)k= zZMEacQ1#U3c|M$h`#Lxuei5oZ{s<3%2dr`Fod;DO$3wM`Q=#6w4yrx94l4g|h3)Wt zQ1Sj0s@?7IPcGfBhRV-ucoaMZD*t)U64ZOng{sF3pz8f1sPefSsvNI^O7Hif(y`N8 zm+n2G>U9p>6Rv=J!Pk2C2-N%D2zP-OLe<0NQ1$WwxHY^1>iL_X!vCAU{{U3Fz6eA3 zHShin+zt2dpu)chm98DT-Fx{`W#X|7ED>zY7)b zkD%W7Gw=UvsPg|ERQTth!fmzQ<$D(>_e`j8^E{99{)?c>uig7EhkD;CxB&J*#rqD= z_duolTBvq(6I=-Ifoea$hkDvaIb?Zmp;!CsQTXs z)h;f8iuYYm?|+}?^-%BqSMR=C$9wl_-rWHeehpN7>;3(+ygP>0ub}GfVt@bro;N@}e+yLn zw?pOoUZ{M19jcvtA1d4Py`bDpQ171)Pk_sy((x9kcrS!1$9H>P z4V9kjpxWDwP~q-?O7Hzp@jeI@&$po7|2?R9ehZcVXQ7_k1|du3ushWK{k{88sQ6}j z_Z+Bno&Xj9Du4eqP|v-=a{wy7qURV?dfyC{p0`2uqf4OPe=XE|Zh=bI9Z>mt0IHpS z1FGHq7%JS8Q1Lts_l3{FSHWG*bo1g2sBlZ5o?8i(-VIRcj64US;z|7dD%5jt^8Ob> zwWmv=l{eJ$H~RaxdG{UA#y`(5d;cFmkY6C=Ah#Hi08*VKMD2z`=HXh8LFJV>G^%A{5%R3?q^WpeghTm58nME)cu_! zS5EstmD>WSbgzK(;ptG%{WE+ud=FH7pM-PaXQAeur{N4Zqt|hz=h^Te{I7zu;hnGv zJ_ZkgJLOz?&x9(6d2k^-0jj>rQ2DtP>bvggdc)>|1D7E zd$)H#=-m%NrS~zY=bnH{-+w_p|E%}_3)~6!_CxOeo>1wW1`mhRy?=-I?}94V*Ln^^ zz5iUO_%DWf?`2T&T;<(2Le;}p};D1BqbC+RPANxbK zqghb?r$Duf6;Sy~pxWg*Q0?qI&nsXv?vFy%>%T+2_bKoGJ=F8t72J5UyXSPM_P-D+ zzHX@c9EQrrh2H;4sP^?SsPLbM_8u7GehMl-yN|f^&w#qW5NdquguB3AsB{#e%3}~>VO!DF@5P?i zK*f6tJO+LOD&AkfUEx#y{_{}j*(!1I?+aDFM?i(21(mLOaA&v(D&D0~<3tzS1D@sm zi*N?+s&~H+s$8yzisx3SdcF&)Uhac>-*=$i_d}@oAA>6AC%pe3p`P1n)IGO7RJ?~m zJwMaCo4xxusPHFwcPmu-JG^@>)O%jz`Ff~&?1yt;2`b*}q2l=n+!KBj9tl4KPl3OH z3OD_1SB^))xwub;D)%C6hS$TR;J4v?_$R3Rwv^oS$3f-iBsc@Md;ek2v!TY9F{tOx zg?qsZpvv_M?|-fLzZvd<|GjWG_!X%3`U9x&PeJAX51xO4ig&xR<8E+I-21_U;gQ~d z3Dk2dq0+k+DqXLI3jcb4f7IU}^X@l8z4t<>_q+=#{Z~V^$6KMw?H+&smvDF7zw-<# z?!9|J_2X$!>6-7|tD)iEchiX69K&9hBxCnj=Dt)_*xpuTKRC*5d?n9x7oh6l3V0;E9x6XyfqMSOQ04h^sQ3KR^J(w@2hTr4 zJ-5}k8{hYZEx2dF6X9#1+RwY8>hVKR`TRIkIo;#$f5zYc2HYC|e}}5)N1@*TXQ=14 z+2q{2LbaEDpxVK7sP=doRQmg%%BcYNg`-gUejB`QE9NVx`dIzHTsz1?^`C2@frTas0e|Wd||0Yy=ehd}we?i6b9Mt=^f0Jw9dqCCitDwRi36;)fsBkAh zm47Q#Id#B;;YxTY9E5t$g;4$R8mRKS4XWI~=l%Z^PRIQ}-hIfM-E(uGd7op1g+fey_2C5u)c#C^(52$jP2IW5;Djl<-oADKB)HkIjHjaHdHx&A1b{+gNo-jQ1Sl-s{FS<-@Sht zRJk=n`JV>$+#0Cba|+>iuS@^nMm9o^L>f`@ZLoq4M!K zRC;~`mEQk`df!$TIQRBY^}i3C0}u6F1y98NM(@4{uEhN$?1T&6>eh*GfqL)9;6nIG zsP_L~Q29CXZLXYKq1w-x@DTXFpzdD-JK$YV<@W+qe)f2~OXmSl{)a&2XAac;6FnDu z|CLbrTnD#Z+ zb5DE!KSQ;HZQtR-9SqeTro)rqe5i6rpz=|Ls?YPG^6_an4}RUd{{ofX-7j|cXF`?7 z@lfww26u!#o@c_HareUo@N766-UQp=ci{j$;1W0fz8Rj1`@?WL{5e#A-szuRJs%2{ z-XoyOcNW|Uo(z@$4!AR14;4=Yw}Bsm+rt~7p1;kz@9?}A9)bS@Q04z~cof|GQkS2T zq2gKU-7Da$aCgJq;0RPY&xPv0m%&}(4RAMjJ5)V=1}Yt2gi6OZpwj1$Nsy^Q9c{iMa`(d~MJ`dGC=Un0X#TiiPeLYlr zilNFQfqL)7um!#wsy;pkmCql-Iq=9U-8iuxs@)dhUhrI~_gxAV@8_Y);p=c)_&v`@ z;BL5o0#!aw!FKpNcsxA*Dwnb+aP*WKR* zZjE~{sPf(ys@=?h%I{pL^ql}zZYM*-ecyuJ@ENH1mR{rH zI}<9tbD+|D9aK5o0u}F_@Kx|$sOP>5)ee6JRSwTXE4TN#=Xdek59;|>d(MC=zoY&A zC!c^y*Y}{pJqq={ zpLzdZLA9gb`}==@df%Vn32^K8yZ*HZD*hEv^|~Ia9Qxowc&@*HH&i-54^=K-htuK1 zQ1AaE+#mi0?gOWNz=b~wDqRbpo?8Ufua|hPg)09DT75%>J0Ge%F82OcK&9{fP~mU! z{$GGf|JR_(=Lb;fd=jdBo`EXwKS8B)#}B&rcY}IvKlo4ZFsSFsP~~(URDE6G{jY>d z-*r&&-VBw_+o9sW2QGpSLdCn)wJ!a;LABchpx)mC_1rO@i=g6L0+ruRsP}B}{%1j@ zX8*^{box{d+whfO`H*Q1AZ+RQZ3$`~MUw-Y1~m`#Y#`{{vOt zFF>Vhm+PF|G7T!eIZ)|77AildKs~n<&VwtV@_imux-N$bcOz6ieH5MqKLcM4{{#<$ z2YtxB?|3Nx#opZu)xJjHD)=_2bUf_uKLQp1FQC%(6jXYigI51g`PlJ#7j7S@d>;fA z&kU&ekA^CTB~am4K$Y`4sCXl&=Z3ty0`=bWpx*N~sOR4e74B+({|4`Wt9Rc472kcH zo1xPCb*S__1P_HjfJ(=6Q199523LPOLA~z)@16mb&IM56PJ@bPndd5~e$xXFfkmis z?w_Hadp}fqKLVBhJ3Q}&isu2S^nTIvTb@6JYEM6fO8?VP>3S9_zO6s(;@cG}+&)n4 z>TvHr7wY}TL&d+u-|vJPhtBZ+XG5iT6WkVF3>Duyq4N7dsBz~eXyppG!Mz!_!!JS2 z8@t`;+VSD=K-`O92-m|7I0lc0pM`q=AK-Ry_nX{%_l2sDS3&tthf2p$o+rWsa4&;O zM+CQrLr~>$Hq>+HdcFnf`3s@y`%2HdpyGKLDql~*?cr88yLo#@crxx?pyFHZxf&|m zI;i)(4l2FWn@Pkm#-Q@WRcognWLzT-DQ1$T_cq-ie zBQBm*FvPt9>iKh^=8+4auliT#J{2B@e+=is3tGR6D!L^HXpK+~4;6A>0}FV^H<_Yw!Oe+y(azx4C-X z$8$DRxOS*?pYHt=sCX}eyTZ$$>hl9o>AN0UzM<;rvrzf}mgi5Q#)IEOjk~*j)Rp@z zsPvryHU7p>`F|Tc3clBKGgSTj7ApVyf6V3oFxZ8AK3oRh?D-X__w4;~7jFxcdlgi9 z4MCOPo8YeSGPoQ3093i(3YGp(`uksms^9NIwf{$;!aoLghrjjyFF-xN&Fzl6LiMx# zpu#VJ%I{*h2ki3hGvO-SgHYqhzd^OLPkH|rpvu4V6E5B!sQ!8;RK7NP_q(CW`BtcO zJP7sNH=)x1eW>#L5AXj3RC@l)yPt=9;okZVC&%s!_1sBtPq+lCee^)hUxQHP`DUna zS3tFk_d~_|A*giR29>V6pyL0Q_x~wWdHxFO`KO`M_Xnu)a;rOCJ3Scc{Y_BsKM|_l zy5Q094DWtBR6LhMwWn)f2=9Z(z<-BI_a2{g@0|%%j?GZ%T?+Sw{{+=f`@Q=DsOR1b zRo=Hl^^dQ^z2W2D{VY_tUG8%69s%dzJ_)M77of`F0=N(SfafQm`s0I8>39e#A3uhw zzn^*cuf6*jsP{Y%_l0}k?aFzk=Uk|AJkfIrR6Jc!?QWfC4BK#5;Zk@XRD0d(-(31a zsQO$0o8gI2=^B74|Dt!F3sny1L&bjuRK4B^_1;^d@^vTFbDx2V=W9^)`W-k8{tPPo z^HAgS*7vw@)1mTnG~5p!3ze>wP~q1=z3(+p@t)=VW2pE?y!(w%&%GV0eO&?-?@gY! zL$%lYpyJyM75*#U{Y|Lw4@158QKjtQL`UF&a{W4VkANKrrsCXZT%FnN$;(r>d zKfMU`o`XN_o;wn%yqclXbpj0GNl@{e>F>u-?Q7J#FYx#O1*$z<2^H^ca1p#4svMqy zD(^o*waZ=ackewI9)$Y{crZK_syPJ#KZL61oj&8j zoeb4~+Tcu>gDR&>pz?DSRQ%UMmFw+L?duEv{#X3{hv5GBKknVnL)FJFpLPC+K=qGf zq4Kc->V0LXa(EwnHM|iX3Lo_DpTottw|&6nqXRC%y#XqJ?}IA0TcGOWPN;hPH>h&B zA1eMYK-Jqfq4Mz~sC+&J_52^9^1Jot9CwC_XK$!{9N^tYdCr9je;m|%PVxTjQ1!CX zyGu~v&Vfqbo1wzL6>beLflAN6K&9h)fB#l^EbcqtZ1^N>g8O~mrRNlQ9PTwx^?M=I zd#-}2pKGDs^I@p^yVbit?eA}f>K9-3{0W?g`#E?jY})L`=|QOY&x4BhQmAryH&nXc z>v@1OgvF%7WwqERkFYmMhQoZ{!f-~DE@$=CKT!*s z6vK`r87RbITPeRWR`CAftn!qB>uwgJ;y^JPiFtdzY;TUjjZq=r7wS$m8iQ3z@i0CoU#^r%Nbm4qv?(7Ixk{>)pf#7HI>fn@S|rt8YCh~%QK!Myjn+S8 z4S8ce9#gR>T5{KCMP@BOEX4!lKQ0j)_bX9;QP@rC55^^OGcp*J^0}b37*>nJMUoT7 zr4qd($>pl0xUXdkcXTUUQ;4H-99Bx>VKhJuS;H&okpYSiB*pQOq*@MpOUYQ-USEoO z^|n$pkhlsjMbvF>QMkIlKcCA-g|O-PxpSM3nL9UJyri8XPw#gVu9UB+0!q}zU?Pr1 z!ypdFlPbB43Wf2oOsY@Cb0l_kQ!dje)w0T!YRPI#IWJc7Id!r6o*lGuC!q)p6t!bW zzAA(C#m;DRozf%&&qP{_z(Ku;tSGps(hu+$>D6P4qjD5BEg|`(B%$@;9vse>MB2lWq}ZPysQOmz{3_>E z!nJfb+5sMCSBX3xBBHnum8xZBesN6PVbdABA|DZDTpZx_uw1d9koagli>-;u*L%1& zyLgZ!Eecn~qfsGPJeUlPQl!D+{BVMkenb3pHGawkYAaY=$d}9GBfUwX94JQn3EN^? zp!W%TG*UQ!;$}RHi(%B)M-tM$ts$rE#>olcO7Tdtk&ykRWW~rI<7C~L^%i&CUJI zI;w`otL9f98RK|9PP3Gh2Ixtfc#TGTH#%C4mS=|>^W{9VrOGd+4#pW|d~Bm}$xRK5 zld_Eri%Zc^u(%X6j{?RgLRJ~JHCQaJ76$0h>M$BK=o?iA6mBe`aVGq_5^q}^_R%3z zr#u-TLWY0}18zQ7PH#1Dhj-QQ^jz=i8XzcR3TCMkiv38e_TS|dl!Wr z%4QxH>7gi~YEBhVyPVVz{H^hjx~!xD$JN<Y}Cx7z25-PLPg> zD~)ia4Nuty&_y@yO7g2kMeoWNTf)w^RyCKBin|ZVC+j)6q*#e)ZB}HF zWJ@PMTKOpSy0x8Q)6nR^Y+qT-Gm1bJ#;|0CR7o@tGD4-p^6Ze_NnQvW_0y)uqEcTu zj7LT*UV55E3Kcm4EWaTy;F&_qTcYC3N?2xeo*1TF9UVchD9MCzS|TYiOfijmcFS=Eu!)8mxTNb+cSfeWEXDi~FN$ zfx_~`fc4~b)lklE+eCrLQeilo6r_M)S&9iOdEFz_q?BIwt3?b_=#{99Ebj$-SNP?H zsoSJR8)zDQY*o@0mvf~&ZJvf%cdcigc+@t?ViRewEnh^GZp&-_TFZ@71Hsep=hNR$;1% zX)vTurmcxPHU~RsOriwJ-Z$;JCXl*5<)-NLz8`DS$TAtg#l|R@UU-cJ5o=U!uBD?N z0U$P&g{{(%3vI=yAKzE)avg8djEly=2ca+9m}%kDX<$Nn+`V+d3EKPf!$JGNIE^$a zhE1)-T%Ha-D`+2%hN|2_#?R9|+KbXpFz8KM?D;!hM02Z9zh3dTB*HV!*mxW^9nJ{G z%7%5s@Zr41#ap$duGWt2#au~=p~tir2P7({tX1p0c`P319XppQ^spfKM7pnSma)oMN9Cp&V zr8=Y8d!KH%GDw|05rSX)In-_uRYGsRh$KtsrPggcG*aZ;1lPFSYg&`Nn%XTQOV4WA z!ZT_BPEN}fi!brCAAqg-AW+c|W|hO2c*ct|>dbir8Mo5y$XAwCd+QT6bubg|>x0pF zC6Ac4ZgM0IcPBkdm9dbt96Q-zMw2;aq11DQYf_no`kS)oB5rs@G16t4+Rv^=L@1q5 zM-@REeFZlvd45ZDp*UEIkb<@+TvETV3YO-F)VP+at7QefMRo3kaBj3gjIhUJ8d6a$ zQR@U8Qfa2`+w0kAORUG!$5aS5>${QF#o}c$A45&Okqz?pE*DDcBzMKQUFYBEaBC~O zJ>mT$Ra7>%if72qlCPNZqpVT5aDt02Otf0cjX*!)a>je{( zEPt_0gX#RIF-&ufhEi(pZ+)Cc5FMGL9crVwP0|ZAq93PGJH2fK`Uwl>H>dY?i-mtw zTokrP(sYuC)MFLWv1vLppAER&-0U|i=!oM@{1h1k3r@v~3sr{2 z!?>g942#0fWGuV(^2)OOz+k=5Vl!MCUgc2>aJ*(YBpba_(UR~n##3B~2oly1TWt)e zliBQMHt~1l3%wG1=wfc12vP#CjKe@#E?i&^vKH`>C7Wp3tZh&+;>JB@QvvA85QcsHhg^-C8^NsG?{ zEh?d><${h9S|R<$!;3;MgN02bciw_ykD-p;jjn`ZKuD8kvwRb>i58A=Nb_Gu6@@aI z*^VkI3f5~u$5=i$_|;F7m1RBXOiWk_Skuv*mqpdGe#fG`+UBwt-QpOa1y(=_Wk|3r z&t!}m%CCQxF}w^!<4AzqQI#&sBiMH(l`2>C8KlHzBZ$_)GAX>5F{UGElSwWsZrM`1 zVm**BhSiqSvw~$+wA7}JTUH&7g5_+x1j})Ee1I}qUPy-d9npGNDjsPR z5{Ur~6POsfxjyQr+M_FHvut9fUUSy3^KILt#h@n93?)Yq^{-TqrTK>K=``t`1W;>>Y76nvc$gZrNZmR*1xu zGnHPjoY9Pg=(jdHo~VIwz6M5r!^TBg1~>2{&B}yrU8yUtU@y_MRV$FBlIB*o6XP5R zK9=K^D3D9Gxy98uBIwE}hi(fLB8nhiCaqkLj1L3bNmv;d$C;Q{M#W-8m11-wVt-rObi ztMeRSqrxr5++ga&edc(Lct}NI7gBsQVB5uLj&;e5&a>kYnjcLYEAyp+!ThFRr5X}F zXJs-%(�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 r=`=`9eVE-R?1QK~>Pc;4xtud61}ro<#cdz|, 2017. msgid "" msgstr "" -"Project-Id-Version: Calibre-Web dutch translation by Ed Driesen (GPL V3)\n" +"Project-Id-Version: Calibre-Web (GPLV3)\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2019-05-31 11:20+0200\n" -"PO-Revision-Date: 2018-12-09 15:07+0100\n" -"Last-Translator: \n" +"POT-Creation-Date: 2019-06-22 19:54+0200\n" +"PO-Revision-Date: 2019-06-17 22:37+0200\n" +"Last-Translator: Heimen Stoffels \n" "Language: nl\n" "Language-Team: ed.driesen@telenet.be\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.6.0\n" +"Generated-By: Babel 2.7.0\n" -#: cps/about.py:76 +#: cps/about.py:78 msgid "Statistics" msgstr "Statistieken" -#: cps/admin.py:97 +#: cps/admin.py:98 msgid "Server restarted, please reload page" -msgstr "Server herstart, gelieve de pagina herladen" +msgstr "De server is herstart; vernieuw de pagina" #: cps/admin.py:100 msgid "Performing shutdown of server, please close window" -msgstr "Bezig met het stoppen van de server, gelieve venster te sluiten" +msgstr "Bezig het stoppen van server; sluit het venster" -#: cps/admin.py:120 cps/updater.py:445 +#: cps/admin.py:119 cps/updater.py:448 msgid "Unknown" msgstr "Onbekend" -#: cps/admin.py:139 +#: cps/admin.py:138 msgid "Admin page" -msgstr "Administratie pagina" +msgstr "Administratiepagina" -#: cps/admin.py:208 cps/admin.py:486 +#: cps/admin.py:207 cps/admin.py:532 msgid "Calibre-Web configuration updated" -msgstr "Calibre-Web configuratie aangepast" +msgstr "Calibre-Web-configuratie bijgewerkt" -#: cps/admin.py:222 cps/templates/admin.html:102 +#: cps/admin.py:220 cps/templates/admin.html:102 msgid "UI Configuration" -msgstr "Gebruikersinterface configuratie" +msgstr "Uiterlijke instellingen" -#: cps/admin.py:295 +#: cps/admin.py:293 msgid "Import of optional Google Drive requirements missing" msgstr "De import van optionele Google Drive vereisten ontbreken" -#: cps/admin.py:298 +#: cps/admin.py:296 msgid "client_secrets.json is missing or not readable" msgstr "client_secrets.json ontbreekt of is niet leesbaar" -#: cps/admin.py:303 cps/admin.py:332 +#: cps/admin.py:301 cps/admin.py:330 msgid "client_secrets.json is not configured for web application" msgstr "client_secrets.json is niet geconfigureerd voor web applicaties" -#: cps/admin.py:335 cps/admin.py:361 cps/admin.py:373 cps/admin.py:398 -#: cps/admin.py:426 cps/admin.py:440 cps/admin.py:463 cps/admin.py:476 -#: cps/admin.py:494 cps/admin.py:501 cps/admin.py:516 -#: cps/templates/admin.html:101 +#: cps/admin.py:333 cps/admin.py:359 cps/admin.py:371 cps/admin.py:396 +#: cps/admin.py:403 cps/admin.py:436 cps/admin.py:460 cps/admin.py:474 +#: cps/admin.py:493 cps/admin.py:510 cps/admin.py:522 cps/admin.py:538 +#: cps/admin.py:545 cps/admin.py:559 cps/templates/admin.html:101 msgid "Basic Configuration" msgstr "Basis configuratie" -#: cps/admin.py:358 +#: cps/admin.py:356 msgid "Keyfile location is not valid, please enter correct path" msgstr "Sleutelbestand (\"keyfile\") locatie ongeldig, gelieve het correcte pad in te geven" -#: cps/admin.py:370 +#: cps/admin.py:368 cps/admin.py:433 msgid "Certfile location is not valid, please enter correct path" msgstr "Certificatiebestand (\"certfile\") locatie ongeldig, gelieve het correcte pad in te geven" -#: cps/admin.py:395 -msgid "Please enter a LDAP provider and a DN" +#: cps/admin.py:393 +msgid "Please enter a LDAP provider, port, DN and user object identifier" msgstr "" -#: cps/admin.py:423 +#: cps/admin.py:400 +msgid "Please enter a LDAP service account and password" +msgstr "" + +#: cps/admin.py:457 msgid "Please enter Github oauth credentials" msgstr "" -#: cps/admin.py:437 +#: cps/admin.py:471 msgid "Please enter Google oauth credentials" msgstr "" -#: cps/admin.py:460 +#: cps/admin.py:490 msgid "Logfile location is not valid, please enter correct path" -msgstr "Log bestand (\"logfile\") locatie ongeldig, gelieve het correcte pad in te geven" +msgstr "De locatie met logbestanden is ongeldig; geef het juiste pad op" -#: cps/admin.py:498 +#: cps/admin.py:507 +msgid "Access Logfile location is not valid, please enter correct path" +msgstr "" + +#: cps/admin.py:542 msgid "DB location is not valid, please enter correct path" -msgstr "DB locatie is niet geldig, gelieve het correcte pad in te geven" +msgstr "De DB-locatie is ongeldig; geef het juiste pad op" -#: cps/admin.py:558 cps/web.py:1045 +#: cps/admin.py:602 cps/web.py:1040 msgid "Please fill out all fields!" -msgstr "Gelieve alle velden in te vullen!" +msgstr "Vul alle velden in!" -#: cps/admin.py:560 cps/admin.py:566 cps/admin.py:582 +#: cps/admin.py:604 cps/admin.py:610 cps/admin.py:626 #: cps/templates/admin.html:35 msgid "Add new user" -msgstr "Voeg nieuwe gebruiker toe" +msgstr "Nieuwe gebruiker toevoegen" -#: cps/admin.py:564 cps/web.py:1248 +#: cps/admin.py:608 cps/web.py:1251 msgid "E-mail is not from valid domain" -msgstr "Email is niet van een geldig domein" +msgstr "Het e-mailadres bevat geen geldige domeinnaam" -#: cps/admin.py:572 +#: cps/admin.py:616 #, python-format msgid "User '%(user)s' created" -msgstr "Gebruiker '%(user)s' aangemaakt" +msgstr "Gebruiker '%(user)s' is gecreëerd" -#: cps/admin.py:576 +#: cps/admin.py:620 msgid "Found an existing account for this e-mail address or nickname." -msgstr "Een bestaande account gevonden met dit email adres of gebruikersnaam." +msgstr "Er is een bestaand account met dit e-mailadres of deze gebruikersnaam aangetroffen." -#: cps/admin.py:607 +#: cps/admin.py:651 #, python-format msgid "Test e-mail successfully send to %(kindlemail)s" -msgstr "Test email met succes verzonden naar %(kindlemail)s" +msgstr "De test-e-mail is verstuurd naar %(kindlemail)s" -#: cps/admin.py:610 +#: cps/admin.py:654 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" -msgstr "Er was een fout bij het verzenden van test email: %(res)s" +msgstr "Er is een fout opgetreden bij het versturen van de test-e-mail: %(res)s" -#: cps/admin.py:612 cps/web.py:1029 +#: cps/admin.py:656 cps/web.py:1023 msgid "Please configure your kindle e-mail address first..." -msgstr "Gelieve eerst je kindle mailadres te configureren..." +msgstr "Stel eerst je kindle-mailadres in..." -#: cps/admin.py:614 +#: cps/admin.py:658 msgid "E-mail server settings updated" -msgstr "Email server instellingen aangepast" +msgstr "E-mailserverinstellingen bijgewerkt" -#: cps/admin.py:615 +#: cps/admin.py:659 msgid "Edit e-mail server settings" -msgstr "Bewerk email server instellingen" +msgstr "E-mailserverinstellingen bewerken" -#: cps/admin.py:640 +#: cps/admin.py:687 #, python-format msgid "User '%(nick)s' deleted" -msgstr "Gebruiker '%(nick)s' verwijderd" +msgstr "Gebruiker '%(nick)s' is verwijderd" + +#: cps/admin.py:690 +msgid "No admin user remaining, can't delete user" +msgstr "" -#: cps/admin.py:711 +#: cps/admin.py:761 #, python-format msgid "User '%(nick)s' updated" -msgstr "Gebruiker '%(nick)s' aangepast" +msgstr "Gebruiker '%(nick)s' is bijgewerkt" -#: cps/admin.py:714 +#: cps/admin.py:764 msgid "An unknown error occured." -msgstr "Een onbekende fout deed zich voor." +msgstr "Er is een onbekende fout opgetreden." -#: cps/admin.py:717 +#: cps/admin.py:767 #, python-format msgid "Edit User %(nick)s" -msgstr "Bewerk gebruiker '%(nick)s" +msgstr "Gebruiker '%(nick)s' bewerken" -#: cps/admin.py:733 +#: cps/admin.py:783 #, python-format msgid "Password for user %(user)s reset" -msgstr "Wachtwoord voor gebruiker %(user)s gereset" +msgstr "Wachtwoord voor gebruiker %(user)s is hersteld" -#: cps/admin.py:736 cps/web.py:1070 +#: cps/admin.py:786 cps/web.py:1065 msgid "An unknown error occurred. Please try again later." -msgstr "Er was een onbekende fout. Gelieve later nog eens te proberen." +msgstr "Er is een onbekende fout opgetreden. Probeer het later nog eens." -#: cps/admin.py:755 +#: cps/admin.py:797 +msgid "Logfile viewer" +msgstr "" + +#: cps/admin.py:832 msgid "Requesting update package" -msgstr "Update pakket wordt aangevraagd" +msgstr "Bezig met opvragen van updatepakket" -#: cps/admin.py:756 +#: cps/admin.py:833 msgid "Downloading update package" -msgstr "Update pakket wordt gedownload" +msgstr "Bezig met downloaden van updatepakket" -#: cps/admin.py:757 +#: cps/admin.py:834 msgid "Unzipping update package" -msgstr "Update pakket wordt uitgepakt" +msgstr "Bezig met uitpakken van updatepakket" -#: cps/admin.py:758 +#: cps/admin.py:835 msgid "Replacing files" -msgstr "Bestanden aan het vervangen" +msgstr "Bezig met bestandsvervanging" -#: cps/admin.py:759 +#: cps/admin.py:836 msgid "Database connections are closed" -msgstr "Database verbindingen zijn gesloten" +msgstr "Databankverbindingen zijn gesloten" -#: cps/admin.py:760 +#: cps/admin.py:837 msgid "Stopping server" -msgstr "Server aan het stoppen" +msgstr "Bezig met stoppen van server" -#: cps/admin.py:761 +#: cps/admin.py:838 msgid "Update finished, please press okay and reload page" -msgstr "Update voltooid, klik op ok en herlaad de pagina" +msgstr "Update voltooid; klik op 'Oké' en vernieuw de pagina" -#: cps/admin.py:762 cps/admin.py:763 cps/admin.py:764 cps/admin.py:765 +#: cps/admin.py:839 cps/admin.py:840 cps/admin.py:841 cps/admin.py:842 msgid "Update failed:" -msgstr "Update gefaald:" +msgstr "Update mislukt:" -#: cps/admin.py:762 cps/updater.py:277 cps/updater.py:456 cps/updater.py:458 +#: cps/admin.py:839 cps/updater.py:273 cps/updater.py:459 cps/updater.py:461 msgid "HTTP Error" -msgstr "HTTP fout" +msgstr "HTTP-fout" -#: cps/admin.py:763 cps/updater.py:279 cps/updater.py:460 +#: cps/admin.py:840 cps/updater.py:275 cps/updater.py:463 msgid "Connection error" msgstr "Verbindingsfout" -#: cps/admin.py:764 cps/updater.py:281 cps/updater.py:462 +#: cps/admin.py:841 cps/updater.py:277 cps/updater.py:465 msgid "Timeout while establishing connection" -msgstr "Time-out bij het maken van de verbinding" +msgstr "Time-out tijdens maken van verbinding" -#: cps/admin.py:765 cps/updater.py:283 cps/updater.py:464 +#: cps/admin.py:842 cps/updater.py:279 cps/updater.py:467 msgid "General error" msgstr "Algemene fout" @@ -222,729 +238,723 @@ msgstr "niet geïnstalleerd" #: cps/converter.py:43 cps/converter.py:60 msgid "Excecution permissions missing" -msgstr "Rechten om uit te voeren ontbreken" +msgstr "Machtigingen om uit te voeren ontbreken" #: cps/converter.py:70 msgid "not configured" -msgstr "Niet geconfigureerd" +msgstr "niet ingesteld" -#: cps/editbooks.py:218 cps/editbooks.py:432 +#: cps/editbooks.py:215 cps/editbooks.py:394 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" +msgstr "Kan e-boek niet openen: het bestand bestaat niet of is ontoegankelijk" -#: cps/editbooks.py:246 +#: cps/editbooks.py:243 msgid "edit metadata" -msgstr "bewerk metadata" +msgstr "metagegevens bewerken" -#: cps/editbooks.py:325 cps/editbooks.py:595 +#: cps/editbooks.py:322 cps/editbooks.py:557 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" -msgstr "Het uploaden van bestandsextensie '%(ext)s' is niet toegestaan op deze server" +msgstr "De bestandsextensie '%(ext)s' is niet toegestaan op deze server" -#: cps/editbooks.py:329 cps/editbooks.py:599 +#: cps/editbooks.py:326 cps/editbooks.py:561 msgid "File to be uploaded must have an extension" -msgstr "Up te loaden bestanden dienen een extensie te hebben" +msgstr "Het te uploaden bestand moet voorzien zijn van een extensie" -#: cps/editbooks.py:341 cps/editbooks.py:619 +#: cps/editbooks.py:338 cps/editbooks.py:581 #, python-format msgid "Failed to create path %(path)s (Permission denied)." -msgstr "Het pad %(path)s aanmaken mislukt (Geen toestemming)." +msgstr "Kan het pad '%(path)s' niet creëren (niet gemachtigd)." -#: cps/editbooks.py:346 +#: cps/editbooks.py:343 #, python-format msgid "Failed to store file %(file)s." -msgstr "Bestand opslaan niet gelukt voor %(file)s." +msgstr "Kan %(file)s niet opslaan." -#: cps/editbooks.py:363 +#: cps/editbooks.py:360 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Bestandsformaat %(ext)s toegevoegd aan %(book)s" -#: cps/editbooks.py:382 -#, python-format -msgid "Failed to create path for cover %(path)s (Permission denied)." -msgstr "" - -#: cps/editbooks.py:390 -#, python-format -msgid "Failed to store cover-file %(cover)s." -msgstr "" - -#: cps/editbooks.py:393 -msgid "Cover-file is not a valid image file" -msgstr "" - -#: cps/editbooks.py:399 cps/editbooks.py:413 +#: cps/editbooks.py:374 msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" -msgstr "" +msgstr "Het omslagbestand is een niet-ondersteund afbeeldingsformaat (jpg/png/webp); kan niet opslaan" -#: cps/editbooks.py:445 cps/editbooks.py:454 +#: cps/editbooks.py:407 cps/editbooks.py:416 msgid "unknown" msgstr "onbekend" -#: cps/editbooks.py:486 +#: cps/editbooks.py:448 msgid "Cover is not a jpg file, can't save" msgstr "" -#: cps/editbooks.py:534 +#: cps/editbooks.py:496 #, python-format msgid "%(langname)s is not a valid language" msgstr "%(langname)s is geen geldige taal" -#: cps/editbooks.py:565 +#: cps/editbooks.py:527 msgid "Metadata successfully updated" -msgstr "Metadata succesvol geüpdatet" +msgstr "De metagegevens zijn bijgewerkt" -#: cps/editbooks.py:574 +#: cps/editbooks.py:536 msgid "Error editing book, please check logfile for details" -msgstr "Fout bij het bewerken van het boek, gelieve logfile controleren" +msgstr "Kan het boek niet bewerken; controleer het logbestand" -#: cps/editbooks.py:624 +#: cps/editbooks.py:586 #, python-format msgid "Failed to store file %(file)s (Permission denied)." -msgstr "Bestand %(file)s opslaan mislukt (Geen toestemming)." +msgstr "Kan %(file)s niet opslaan (niet gemachtigd)." -#: cps/editbooks.py:629 +#: cps/editbooks.py:591 #, python-format msgid "Failed to delete file %(file)s (Permission denied)." -msgstr "Bestand %(file)s wissen mislukt (Geen toestemming)." +msgstr "Kan %(file)s niet verwijderen (niet gemachtigd)." -#: cps/editbooks.py:712 +#: cps/editbooks.py:674 #, python-format msgid "File %(file)s uploaded" msgstr "" -#: cps/editbooks.py:741 +#: cps/editbooks.py:703 msgid "Source or destination format for conversion missing" -msgstr "Bron of doel formaat voor conversie ontbreekt" +msgstr "Bron- of doelformaat ontbreekt voor conversie" -#: cps/editbooks.py:751 +#: cps/editbooks.py:711 #, python-format msgid "Book successfully queued for converting to %(book_format)s" -msgstr "Boek succesvol in de wachtrij geplaatst voor conversie naar %(book_format)s" +msgstr "Het boek is in de wachtrij geplaatst voor conversie naar %(book_format)s" -#: cps/editbooks.py:755 +#: cps/editbooks.py:715 #, python-format msgid "There was an error converting this book: %(res)s" -msgstr "Er trad een fout op bij het converteren van dit boek: %(res)s" +msgstr "Er is een fout opgetreden bij het converteren van dit boek: %(res)s" -#: cps/gdrive.py:56 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" -msgstr "" +msgstr "Het instellen van Google Drive is niet afgerond; heractiveer Google Drive" -#: cps/gdrive.py:101 +#: cps/gdrive.py:106 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" -msgstr "Het callback domein is niet geverifieerd, volg de stappen in de google ontwikkelaars console om het domein te verifiëren" +msgstr "Het callback-domein is niet geverifieerd. Volg de stappen in de Google-ontwikkelaarsconsole om het domein te verifiëren." -#: cps/helper.py:97 +#: cps/helper.py:94 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "%(format)s formaat niet gevonden voor boek met id: %(book)d" -#: cps/helper.py:109 +#: cps/helper.py:106 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" -msgstr "%(format)s niet gevonden op Google Drive: %(fn)s" +msgstr "%(format)s niet aangetroffen op Google Drive: %(fn)s" -#: cps/helper.py:116 cps/helper.py:223 cps/templates/detail.html:41 +#: cps/helper.py:113 cps/helper.py:220 cps/templates/detail.html:41 #: cps/templates/detail.html:45 msgid "Send to Kindle" -msgstr "Stuur naar Kindle" +msgstr "Versturen naar Kindle" -#: cps/helper.py:117 cps/helper.py:135 cps/helper.py:225 +#: cps/helper.py:114 cps/helper.py:132 cps/helper.py:222 msgid "This e-mail has been sent via Calibre-Web." -msgstr "Deze email werd verzonden via Calibre-Web." +msgstr "Deze e-mail is verstuurd via Calibre-Web." -#: cps/helper.py:128 +#: cps/helper.py:125 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s niet gevonden %(fn)s" -#: cps/helper.py:133 +#: cps/helper.py:130 msgid "Calibre-Web test e-mail" -msgstr "Calibre-Web test email" +msgstr "Calibre-Web - test-e-mail" -#: cps/helper.py:134 +#: cps/helper.py:131 msgid "Test e-mail" -msgstr "Test email" +msgstr "Test-e-mail" -#: cps/helper.py:150 +#: cps/helper.py:147 msgid "Get Started with Calibre-Web" msgstr "Aan de slag met Calibre-Web" -#: cps/helper.py:151 +#: cps/helper.py:148 #, python-format msgid "Registration e-mail for user: %(name)s" -msgstr "Registratie email voor gebruiker: %(name)s" +msgstr "Registratie-e-mailadres van gebruiker: %(name)s" -#: cps/helper.py:165 cps/helper.py:167 cps/helper.py:169 cps/helper.py:177 -#: cps/helper.py:179 cps/helper.py:181 +#: cps/helper.py:162 cps/helper.py:164 cps/helper.py:166 cps/helper.py:174 +#: cps/helper.py:176 cps/helper.py:178 #, python-format msgid "Send %(format)s to Kindle" -msgstr "" +msgstr "%(format)s versturen naar Kindle" -#: cps/helper.py:185 +#: cps/helper.py:182 #, python-format msgid "Convert %(orig)s to %(format)s and send to Kindle" -msgstr "" +msgstr "%(orig)s converteren naar %(format)s en versturen naar Kindle" -#: cps/helper.py:224 +#: cps/helper.py:221 #, python-format msgid "E-mail: %(book)s" -msgstr "Email: %(book)s" +msgstr "E-mail: %(book)s" -#: cps/helper.py:227 +#: cps/helper.py:224 msgid "The requested file could not be read. Maybe wrong permissions?" -msgstr "Het gevraagde bestand kon niet worden gelezen. Misschien niet de juiste permissies?" +msgstr "Het opgevraagde bestand kan niet worden uitgelezen. Ben je hiertoe gemachtigd?" -#: cps/helper.py:335 +#: cps/helper.py:331 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" -msgstr "Hernoemen van titel: '%(src)s' naar '%(dest)s' faade met fout: %(error)s" +msgstr "Kan de naam '%(src)s' niet wijzigen in '%(dest)s': %(error)s" -#: cps/helper.py:345 +#: cps/helper.py:341 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" -msgstr "Hernoemen van de auteur: '%(src)s' naar '%(dest)s' faalde met fout: %(error)s" +msgstr "Kan de auteursnaam '%(src)s' niet wijzigen in '%(dest)s': %(error)s" -#: cps/helper.py:359 +#: cps/helper.py:355 #, python-format msgid "Rename file in path '%(src)s' to '%(dest)s' failed with error: %(error)s" -msgstr "" +msgstr "Kan de naam van het bestand in '%(src)s' niet wijzigen in '%(dest)s': %(error)s" -#: cps/helper.py:385 cps/helper.py:395 cps/helper.py:403 +#: cps/helper.py:381 cps/helper.py:391 cps/helper.py:399 #, python-format msgid "File %(file)s not found on Google Drive" -msgstr "Bestand %(file)s niet gevonden op Google Drive" +msgstr "Bestand '%(file)s' niet aangetroffen op Google Drive" -#: cps/helper.py:424 +#: cps/helper.py:420 #, python-format msgid "Book path %(path)s not found on Google Drive" -msgstr "Boek pad %(path)s niet gevonden op Google Drive" +msgstr "Boekpad '%(path)s' niet aangetroffen op Google Drive" -#: cps/helper.py:584 +#: cps/helper.py:579 msgid "Error excecuting UnRar" -msgstr "Fout bij het uitvoeren van UnRar" +msgstr "Kan UnRar niet uitvoeren" -#: cps/helper.py:586 +#: cps/helper.py:581 msgid "Unrar binary file not found" -msgstr "Unrar uitvoeringsbestand niet gevonden" +msgstr "Kan uitvoerbaar bestand van UnRar niet vinden" -#: cps/helper.py:614 +#: cps/helper.py:609 msgid "Waiting" -msgstr "Wachten" +msgstr "Aan het wachten" -#: cps/helper.py:616 +#: cps/helper.py:611 msgid "Failed" msgstr "Mislukt" -#: cps/helper.py:618 +#: cps/helper.py:613 msgid "Started" msgstr "Gestart" -#: cps/helper.py:620 +#: cps/helper.py:615 msgid "Finished" msgstr "Voltooid" -#: cps/helper.py:622 +#: cps/helper.py:617 msgid "Unknown Status" msgstr "Onbekende status" -#: cps/helper.py:627 +#: cps/helper.py:622 msgid "E-mail: " -msgstr "Email:" +msgstr "E-mailadres: " -#: cps/helper.py:629 cps/helper.py:633 +#: cps/helper.py:624 cps/helper.py:628 msgid "Convert: " -msgstr "Converteer:" +msgstr "Converteren: " -#: cps/helper.py:631 +#: cps/helper.py:626 msgid "Upload: " -msgstr "Upload:" +msgstr "Uploaden: " -#: cps/helper.py:635 +#: cps/helper.py:630 msgid "Unknown Task: " -msgstr "Onbekende taak:" +msgstr "Onbekende taak: " -#: cps/oauth_bb.py:87 +#: cps/oauth_bb.py:91 #, python-format -msgid "Register with %s, " +msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:145 +#: cps/oauth_bb.py:149 msgid "Failed to log in with GitHub." msgstr "" -#: cps/oauth_bb.py:150 +#: cps/oauth_bb.py:154 msgid "Failed to fetch user info from GitHub." msgstr "" -#: cps/oauth_bb.py:161 +#: cps/oauth_bb.py:165 msgid "Failed to log in with Google." msgstr "" -#: cps/oauth_bb.py:166 +#: cps/oauth_bb.py:170 msgid "Failed to fetch user info from Google." msgstr "" -#: cps/oauth_bb.py:265 +#: cps/oauth_bb.py:269 #, python-format msgid "Unlink to %(oauth)s success." msgstr "" -#: cps/oauth_bb.py:269 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s failed." msgstr "" -#: cps/oauth_bb.py:272 +#: cps/oauth_bb.py:276 #, python-format msgid "Not linked to %(oauth)s." msgstr "" -#: cps/oauth_bb.py:300 +#: cps/oauth_bb.py:304 msgid "GitHub Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:319 +#: cps/oauth_bb.py:323 msgid "Google Oauth error, please retry later." msgstr "" -#: cps/shelf.py:40 cps/shelf.py:92 +#: cps/shelf.py:46 cps/shelf.py:98 msgid "Invalid shelf specified" -msgstr "Ongeldige boekenplank gespecificeerd" +msgstr "Ongeldige boekenplank opgegeven" -#: cps/shelf.py:47 +#: cps/shelf.py:53 #, python-format msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" -msgstr "Sorry, jij mag geen boeken toe voegen aan boekenplank: %(shelfname)s" +msgstr "Sorry, je mag geen boeken toevoegen aan de boekenplank '%(shelfname)s'" -#: cps/shelf.py:55 +#: cps/shelf.py:61 msgid "You are not allowed to edit public shelves" -msgstr "Jij mag geen publieke boekenplanken bewerken" +msgstr "Je mag openbare boekenplanken niet aanpassen" -#: cps/shelf.py:64 +#: cps/shelf.py:70 #, python-format msgid "Book is already part of the shelf: %(shelfname)s" -msgstr "Dit boek maakt al deel uit van boekenplank: %(shelfname)s" +msgstr "Dit boek maakt al deel uit van de boekenplank '%(shelfname)s'" -#: cps/shelf.py:78 +#: cps/shelf.py:84 #, python-format msgid "Book has been added to shelf: %(sname)s" -msgstr "Boek werd toegevoegd aan boekenplank: %(sname)s" +msgstr "Het boek is toegevoegd aan de boekenplank '%(sname)s'" -#: cps/shelf.py:97 +#: cps/shelf.py:103 #, python-format msgid "You are not allowed to add a book to the the shelf: %(name)s" -msgstr "Jij mag geen boeken plaatsen op boekenplank: %(name)s" +msgstr "Je mag geen boeken plaatsen op de boekenplank '%(name)s'" -#: cps/shelf.py:102 +#: cps/shelf.py:108 msgid "User is not allowed to edit public shelves" -msgstr "Gebruiker is niet toegestaan om publieke boekenplanken te bewerken" +msgstr "Gebruiker is niet toegestaan om openbare boekenplanken aan te passen" -#: cps/shelf.py:120 +#: cps/shelf.py:126 #, python-format msgid "Books are already part of the shelf: %(name)s" -msgstr "Deze boeken maken reeds deel uit van boekenplank: %(name)s" +msgstr "Deze boeken maken al deel uit van de boekenplank '%(name)s'" -#: cps/shelf.py:134 +#: cps/shelf.py:140 #, python-format msgid "Books have been added to shelf: %(sname)s" -msgstr "De boeken werden toegevoegd aan boekenplank: %(sname)s" +msgstr "De boeken zijn toegevoegd aan de boekenplank '%(sname)s'" -#: cps/shelf.py:136 +#: cps/shelf.py:142 #, python-format msgid "Could not add books to shelf: %(sname)s" -msgstr "Kon geen boeken toevoegen aan boekenplank: %(sname)s" +msgstr "Kan boeken niet toevoegen aan boekenplank '%(sname)s'" -#: cps/shelf.py:173 +#: cps/shelf.py:179 #, python-format msgid "Book has been removed from shelf: %(sname)s" -msgstr "Boek werd verwijderd van boekenplank: %(sname)s" +msgstr "Het boek werd verwijderd van de boekenplank '%(sname)s'" -#: cps/shelf.py:179 +#: cps/shelf.py:185 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" -msgstr "Sorry, jij mag geen boeken verwijderen van deze boekenplank: %(sname)s" +msgstr "Sorry, je mag geen boeken verwijderen van deze boekenplank: %(sname)s" -#: cps/shelf.py:200 cps/shelf.py:224 +#: cps/shelf.py:206 cps/shelf.py:230 #, python-format msgid "A shelf with the name '%(title)s' already exists." -msgstr "Een boekenplank met de naam '%(title)s' bestaat reeds." +msgstr "Er bestaat al een boekenplank met de naam '%(title)s'." -#: cps/shelf.py:205 +#: cps/shelf.py:211 #, python-format msgid "Shelf %(title)s created" -msgstr "Boekenplank %(title)s aangemaakt" +msgstr "Boekenplank '%(title)s' is gecreëerd" -#: cps/shelf.py:207 cps/shelf.py:235 +#: cps/shelf.py:213 cps/shelf.py:241 msgid "There was an error" -msgstr "Er deed zich een fout voor" +msgstr "Er is een fout opgetreden" -#: cps/shelf.py:208 cps/shelf.py:210 +#: cps/shelf.py:214 cps/shelf.py:216 msgid "create a shelf" -msgstr "maak een boekenplank" +msgstr "creëer een boekenplank" -#: cps/shelf.py:233 +#: cps/shelf.py:239 #, python-format msgid "Shelf %(title)s changed" -msgstr "Boekenplank %(title)s gewijzigd" +msgstr "Boekenplank '%(title)s' is aangepast" -#: cps/shelf.py:236 cps/shelf.py:238 +#: cps/shelf.py:242 cps/shelf.py:244 msgid "Edit a shelf" -msgstr "Bewerk een boekenplank" - -#: cps/shelf.py:259 -#, python-format -msgid "successfully deleted shelf %(name)s" -msgstr "boekenplank %(name)s succesvol gewist" +msgstr "Pas een boekenplank aan" -#: cps/shelf.py:289 +#: cps/shelf.py:295 #, python-format msgid "Shelf: '%(name)s'" msgstr "Boekenplank: '%(name)s'" -#: cps/shelf.py:292 +#: cps/shelf.py:298 msgid "Error opening shelf. Shelf does not exist or is not accessible" -msgstr "Fout bij openen boekenplank. Boekenplank bestaat niet of is niet toegankelijk" +msgstr "Kan boekenplank niet openen: de boekenplank bestaat niet of is ontoegankelijk" -#: cps/shelf.py:324 +#: cps/shelf.py:330 #, python-format msgid "Change order of Shelf: '%(name)s'" -msgstr "Verander volgorde van Boekenplank: '%(name)s'" +msgstr "Volgorde aanpassen van boekenplank '%(name)s'" -#: cps/ub.py:111 +#: cps/ub.py:68 msgid "Recently Added" -msgstr "Recent Toegevoegd" +msgstr "Recent toegevoegd" -#: cps/ub.py:113 +#: cps/ub.py:70 msgid "Show recent books" -msgstr "Toon recente boeken" +msgstr "Recente boeken tonen" -#: cps/templates/index.xml:17 cps/ub.py:114 +#: cps/templates/index.xml:17 cps/ub.py:71 msgid "Hot Books" -msgstr "Populaire Boeken" +msgstr "Populaire boeken" -#: cps/ub.py:115 +#: cps/ub.py:72 msgid "Show hot books" -msgstr "Toon populaire boeken" +msgstr "Populaire boeken tonen" -#: cps/templates/index.xml:24 cps/ub.py:118 +#: cps/templates/index.xml:24 cps/ub.py:75 msgid "Best rated Books" -msgstr "Best beoordeeld" +msgstr "Best beoordeelde boeken" -#: cps/ub.py:120 +#: cps/ub.py:77 msgid "Show best rated books" -msgstr "Toon best beoordeelde boeken" +msgstr "Best beoordeelde boeken tonen" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:121 -#: cps/web.py:965 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:78 +#: cps/web.py:958 msgid "Read Books" -msgstr "Gelezen Boeken" +msgstr "Gelezen boeken" -#: cps/ub.py:123 +#: cps/ub.py:80 msgid "Show read and unread" -msgstr "Toon gelezen en ongelezen" +msgstr "Gelezen/Ongelezen tonen" -#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:125 -#: cps/web.py:969 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:82 +#: cps/web.py:962 msgid "Unread Books" -msgstr "Ongelezen Boeken" +msgstr "Ongelezen boeken" -#: cps/ub.py:127 +#: cps/ub.py:84 msgid "Show unread" msgstr "" -#: cps/ub.py:128 +#: cps/ub.py:85 msgid "Discover" -msgstr "Ontdek" +msgstr "Verkennen" -#: cps/ub.py:130 +#: cps/ub.py:87 msgid "Show random books" -msgstr "Toon willekeurige boeken" +msgstr "Willekeurige boeken tonen" -#: cps/ub.py:131 +#: cps/ub.py:88 msgid "Categories" msgstr "Categorieën" -#: cps/ub.py:133 +#: cps/ub.py:90 msgid "Show category selection" -msgstr "Toon categorie selectie" +msgstr "Categoriekeuze tonen" #: cps/templates/book_edit.html:71 cps/templates/search_form.html:53 -#: cps/ub.py:134 +#: cps/ub.py:91 msgid "Series" -msgstr "Series" +msgstr "Serie" -#: cps/ub.py:136 +#: cps/ub.py:93 msgid "Show series selection" -msgstr "Toon serie selectie" +msgstr "Seriekeuze tonen" -#: cps/templates/index.xml:61 cps/ub.py:137 +#: cps/templates/index.xml:61 cps/ub.py:94 msgid "Authors" msgstr "Auteurs" -#: cps/ub.py:139 +#: cps/ub.py:96 msgid "Show author selection" -msgstr "Toon auteur selectie" +msgstr "Auteurkeuze tonen" -#: cps/templates/index.xml:68 cps/ub.py:141 +#: cps/templates/index.xml:68 cps/ub.py:98 msgid "Publishers" msgstr "Uitgevers" -#: cps/ub.py:143 +#: cps/ub.py:100 msgid "Show publisher selection" -msgstr "Toon uitgevers selectie" +msgstr "Uitgeverskeuze tonen" -#: cps/templates/search_form.html:74 cps/ub.py:144 +#: cps/templates/search_form.html:74 cps/ub.py:101 msgid "Languages" msgstr "Talen" -#: cps/ub.py:147 +#: cps/ub.py:104 msgid "Show language selection" -msgstr "Toon taal selectie" +msgstr "Taalkeuze tonen" -#: cps/ub.py:148 +#: cps/ub.py:105 msgid "Ratings" msgstr "" -#: cps/ub.py:150 +#: cps/ub.py:107 msgid "Show ratings selection" msgstr "" -#: cps/ub.py:151 +#: cps/ub.py:108 msgid "File formats" msgstr "" -#: cps/ub.py:153 +#: cps/ub.py:110 msgid "Show file formats selection" msgstr "" -#: cps/updater.py:257 cps/updater.py:364 cps/updater.py:377 +#: cps/updater.py:253 cps/updater.py:360 cps/updater.py:373 msgid "Unexpected data while reading update information" -msgstr "Onverwachte data tijdens het lezen van de update informatie" +msgstr "Onverwachte gegevens tijdens het uitlezen van de update-informatie" -#: cps/updater.py:264 cps/updater.py:370 +#: cps/updater.py:260 cps/updater.py:366 msgid "No update available. You already have the latest version installed" -msgstr "Geen update beschikbaar. Je hebt reeds de laatste versie geïnstalleerd" +msgstr "Geen update beschikbaar; je beschikt al over de nieuwste versie" -#: cps/updater.py:290 cps/updater.py:422 +#: cps/updater.py:286 msgid "A new update is available. Click on the button below to update to the latest version." -msgstr "Een nieuwe update is beschikbaar. Click op de knop hier onder op te updaten naar de laatste versie." +msgstr "Er is een update beschikbaar. Klik op de knop hieronder om te updaten naar de nieuwste versie." -#: cps/updater.py:343 +#: cps/updater.py:339 msgid "Could not fetch update information" -msgstr "De update informatie kon niet gelezen worden" +msgstr "De update-informatie kan niet worden opgehaald" -#: cps/updater.py:357 +#: cps/updater.py:353 msgid "No release information available" -msgstr "" +msgstr "Geen wijzigingslog beschikbaar" -#: cps/updater.py:403 cps/updater.py:412 +#: cps/updater.py:406 cps/updater.py:415 #, python-format msgid "A new update is available. Click on the button below to update to version: %(version)s" +msgstr "Er is een update beschikbaar. Klik op de knop hieronder om te updaten naar de nieuwste versie: %(version)s" + +#: cps/updater.py:425 +msgid "Click on the button below to update to the latest stable version." msgstr "" -#: cps/web.py:457 +#: cps/web.py:445 msgid "Recently Added Books" msgstr "Recent toegevoegde boeken" -#: cps/web.py:484 +#: cps/web.py:473 msgid "Best rated books" msgstr "Best beoordeelde boeken" -#: cps/templates/index.xml:38 cps/web.py:492 +#: cps/templates/index.xml:38 cps/web.py:481 msgid "Random Books" msgstr "Willekeurige boeken" -#: cps/web.py:516 +#: cps/web.py:505 msgid "Books" msgstr "" -#: cps/web.py:543 +#: cps/web.py:532 msgid "Hot Books (most downloaded)" -msgstr "Populaire boeken (meeste downloads)" +msgstr "Populaire boeken (vaakst gedownload)" -#: cps/web.py:553 cps/web.py:1294 cps/web.py:1383 +#: cps/web.py:542 cps/web.py:1298 cps/web.py:1386 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 toegankelijk:" +msgstr "Kan e-boek niet openen. Het bestand bestaat niet of is niet toegankelijk:" -#: cps/web.py:580 +#: cps/web.py:559 +#, python-format +msgid "Author: %(name)s" +msgstr "" + +#: cps/web.py:571 #, python-format msgid "Publisher: %(name)s" msgstr "Uitgever: %(name)s" -#: cps/web.py:591 +#: cps/web.py:582 #, python-format msgid "Series: %(serie)s" msgstr "Serie: %(serie)s" -#: cps/web.py:602 +#: cps/web.py:593 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:613 +#: cps/web.py:604 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:625 +#: cps/web.py:616 #, python-format msgid "Category: %(name)s" msgstr "Categorie: %(name)s" -#: cps/web.py:659 +#: cps/web.py:650 msgid "Publisher list" msgstr "Uitgeverslijst" -#: cps/templates/index.xml:82 cps/web.py:675 +#: cps/templates/index.xml:82 cps/web.py:666 msgid "Series list" -msgstr "Serie lijst" +msgstr "Serielijst" -#: cps/web.py:689 +#: cps/web.py:680 msgid "Ratings list" msgstr "" -#: cps/web.py:702 +#: cps/web.py:693 msgid "File formats list" msgstr "" -#: cps/web.py:730 +#: cps/web.py:721 msgid "Available languages" msgstr "Beschikbare talen" -#: cps/web.py:750 +#: cps/web.py:741 #, python-format msgid "Language: %(name)s" msgstr "Taal: %(name)s" -#: cps/templates/index.xml:75 cps/web.py:764 +#: cps/templates/index.xml:75 cps/web.py:755 msgid "Category list" -msgstr "Categorie lijst" +msgstr "Categorielijst" -#: cps/templates/layout.html:73 cps/web.py:777 +#: cps/templates/layout.html:73 cps/web.py:769 msgid "Tasks" msgstr "Taken" -#: cps/web.py:841 +#: cps/web.py:834 msgid "Published after " msgstr "Gepubliceerd na " -#: cps/web.py:848 +#: cps/web.py:841 msgid "Published before " -msgstr "Gepubliceerd voor " +msgstr "Gepubliceerd vóór " -#: cps/web.py:862 +#: cps/web.py:855 #, python-format msgid "Rating <= %(rating)s" -msgstr "Waardering <= %(rating)s" +msgstr "Beoordeling <= %(rating)s" -#: cps/web.py:864 +#: cps/web.py:857 #, python-format msgid "Rating >= %(rating)s" -msgstr "Waardering >= %(rating)s" +msgstr "Beoordeling >= %(rating)s" -#: cps/web.py:924 cps/web.py:933 +#: cps/web.py:917 cps/web.py:926 msgid "search" -msgstr "zoek" +msgstr "zoeken" -#: cps/web.py:1018 +#: cps/web.py:1012 msgid "Please configure the SMTP mail settings first..." -msgstr "Gelieve de SMTP mail instellingen eerst te configureren..." +msgstr "Stel eerst SMTP-mail in..." -#: cps/web.py:1023 +#: cps/web.py:1017 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" -msgstr "Boek met succes in de wachtrij geplaatst om te verzenden naar %(kindlemail)s" +msgstr "Het boek is in de wachtrij geplaatst om te worden verstuurd aan %(kindlemail)s" -#: cps/web.py:1027 +#: cps/web.py:1021 #, 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" +msgstr "Er is een fout opgetreden bij het versturen van dit boek: %(res)s" -#: cps/web.py:1046 cps/web.py:1071 cps/web.py:1076 cps/web.py:1081 -#: cps/web.py:1085 +#: cps/web.py:1041 cps/web.py:1066 cps/web.py:1070 cps/web.py:1075 +#: cps/web.py:1079 msgid "register" -msgstr "registreer" +msgstr "registreren" -#: cps/web.py:1073 +#: cps/web.py:1068 msgid "Your e-mail is not allowed to register" -msgstr "Het is niet toegestaan om te registreren met jou email" +msgstr "Dit e-mailadres mag niet worden gebruikt voor registratie" -#: cps/web.py:1077 +#: cps/web.py:1071 msgid "Confirmation e-mail was send to your e-mail account." -msgstr "Bevestigings email werd verzonden naar jou email account." +msgstr "Er is een bevestigingse-mail verstuurd naar je e-mailadres." -#: cps/web.py:1080 +#: cps/web.py:1074 msgid "This username or e-mail address is already in use." -msgstr "Deze gebruikersnaam of email adres is reeds in gebruik." +msgstr "Deze gebruikersnaam of e-mailadres is al in gebruik." -#: cps/web.py:1103 cps/web.py:1115 -#, python-format -msgid "You are now logged in as: '%(nickname)s'" +#: cps/web.py:1089 +msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1108 cps/web.py:1120 +#: cps/web.py:1098 cps/web.py:1212 +#, python-format +msgid "you are now logged in as: '%(nickname)s'" +msgstr "je bent nu ingelogd als: '%(nickname)s'" + +#: cps/web.py:1105 cps/web.py:1122 msgid "Wrong Username or Password" -msgstr "Verkeerde gebruikersnaam of Wachtwoord" +msgstr "Verkeerde gebruikersnaam of wachtwoord" -#: cps/web.py:1111 +#: cps/web.py:1108 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "" -#: cps/web.py:1124 cps/web.py:1146 +#: cps/web.py:1117 +#, python-format +msgid "You are now logged in as: '%(nickname)s'" +msgstr "" + +#: cps/web.py:1126 cps/web.py:1148 msgid "login" -msgstr "login" +msgstr "inloggen" -#: cps/web.py:1158 cps/web.py:1189 +#: cps/web.py:1160 cps/web.py:1191 msgid "Token not found" -msgstr "Token niet gevonden" +msgstr "Toegangssleutel niet gevonden" -#: cps/web.py:1166 cps/web.py:1197 +#: cps/web.py:1168 cps/web.py:1199 msgid "Token has expired" -msgstr "Token is verlopen" +msgstr "Toegangssleutel is verlopen" -#: cps/web.py:1174 +#: cps/web.py:1176 msgid "Success! Please return to your device" msgstr "Gelukt! Ga terug naar je apparaat" -#: cps/web.py:1210 -#, python-format -msgid "you are now logged in as: '%(nickname)s'" -msgstr "je bent nu ingelogd als: '%(nickname)s'" - -#: cps/web.py:1250 cps/web.py:1277 cps/web.py:1281 +#: cps/web.py:1253 cps/web.py:1280 cps/web.py:1284 #, python-format msgid "%(name)s's profile" msgstr "%(name)s's profiel" -#: cps/web.py:1274 +#: cps/web.py:1277 msgid "Found an existing account for this e-mail address." -msgstr "Een bestaand account met dit email adres werd gevonden." +msgstr "Er is een bestaand account met dit e-mailadres aangetroffen." -#: cps/web.py:1279 +#: cps/web.py:1282 msgid "Profile updated" -msgstr "Profiel aangepast" +msgstr "Profiel bijgewerkt" -#: cps/web.py:1304 cps/web.py:1306 cps/web.py:1308 cps/web.py:1314 -#: cps/web.py:1318 +#: cps/web.py:1308 cps/web.py:1310 cps/web.py:1312 cps/web.py:1318 +#: cps/web.py:1322 msgid "Read a Book" msgstr "Lees een boek" -#: cps/web.py:1328 +#: cps/web.py:1332 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "" -#: cps/worker.py:308 +#: cps/worker.py:311 #, python-format msgid "Ebook-converter failed: %(error)s" -msgstr "Ebook conversie mislukt: %(error)s" +msgstr "E-boek-conversie mislukt: %(error)s" -#: cps/worker.py:319 +#: cps/worker.py:322 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" -msgstr "Kindlegen gefaald met Error %(error)s. Bericht: %(message)s" +msgstr "Kindlegen mislukt; fout: %(error)s. Bericht: %(message)s" #: cps/templates/admin.html:6 msgid "User list" @@ -956,7 +966,7 @@ msgstr "Gebruikersnaam" #: cps/templates/admin.html:10 msgid "E-mail" -msgstr "Email" +msgstr "E-mailadres" #: cps/templates/admin.html:11 msgid "Kindle" @@ -974,7 +984,7 @@ msgstr "Administratie" #: cps/templates/detail.html:27 cps/templates/shelf.html:6 #: cps/templates/shelfdown.html:62 msgid "Download" -msgstr "Download" +msgstr "Downloaden" #: cps/templates/admin.html:15 msgid "View Ebooks" @@ -982,23 +992,23 @@ msgstr "" #: cps/templates/admin.html:16 cps/templates/layout.html:65 msgid "Upload" -msgstr "Upload" +msgstr "Uploaden" #: cps/templates/admin.html:17 msgid "Edit" -msgstr "Bewerk" +msgstr "Bewerken" #: cps/templates/admin.html:41 msgid "SMTP e-mail server settings" -msgstr "SMTP email server instellingen" +msgstr "SMTP-serverinstellingen" #: cps/templates/admin.html:44 cps/templates/email_edit.html:11 msgid "SMTP hostname" -msgstr "SMTP hostnaam" +msgstr "SMTP-hostnaam" #: cps/templates/admin.html:45 msgid "SMTP port" -msgstr "SMTP poort" +msgstr "SMTP-poort" #: cps/templates/admin.html:46 msgid "SSL" @@ -1006,27 +1016,27 @@ msgstr "SSL" #: cps/templates/admin.html:47 cps/templates/email_edit.html:27 msgid "SMTP login" -msgstr "SMTP login" +msgstr "SMTP-gebruikersnaam" #: cps/templates/admin.html:48 msgid "From mail" -msgstr "Van mail" +msgstr "Van e-mail" #: cps/templates/admin.html:58 msgid "Change SMTP settings" -msgstr "Bewerk SMTP instellingen" +msgstr "SMTP-instellingen bewerken" #: cps/templates/admin.html:64 msgid "Configuration" -msgstr "Configuratie" +msgstr "Instellingen" #: cps/templates/admin.html:67 msgid "Calibre DB dir" -msgstr "Calibre DB map" +msgstr "Calibre DB-map" #: cps/templates/admin.html:71 msgid "Log level" -msgstr "Log niveau" +msgstr "Logniveau" #: cps/templates/admin.html:75 msgid "Port" @@ -1034,11 +1044,11 @@ msgstr "Poort" #: cps/templates/admin.html:81 cps/templates/config_view_edit.html:23 msgid "Books per page" -msgstr "Boeken per pagina" +msgstr "Aantal boeken per pagina" #: cps/templates/admin.html:85 msgid "Uploading" -msgstr "Aan het uploaden" +msgstr "Bezig met uploaden" #: cps/templates/admin.html:89 msgid "Anonymous browsing" @@ -1046,64 +1056,68 @@ msgstr "Anoniem verkennen" #: cps/templates/admin.html:93 msgid "Public registration" -msgstr "Publieke registratie" +msgstr "Openbare registratie" #: cps/templates/admin.html:97 cps/templates/remote_login.html:4 msgid "Remote login" -msgstr "Login op afstand" +msgstr "Inloggen op afstand" #: cps/templates/admin.html:108 msgid "Administration" msgstr "Administratie" #: cps/templates/admin.html:109 -msgid "Reconnect to Calibre DB" -msgstr "Herverbinden met calibre DB" +msgid "View Logfiles" +msgstr "" #: cps/templates/admin.html:110 -msgid "Restart Calibre-Web" -msgstr "Herstart Calibre-Web" +msgid "Reconnect to Calibre DB" +msgstr "Opnieuw verbinden met Calibre DB" #: cps/templates/admin.html:111 +msgid "Restart Calibre-Web" +msgstr "Calibre-Web herstarten" + +#: cps/templates/admin.html:112 msgid "Stop Calibre-Web" -msgstr "Stop Calibre-Web" +msgstr "Calibre-Web stoppen" -#: cps/templates/admin.html:117 +#: cps/templates/admin.html:118 msgid "Update" -msgstr "Update" +msgstr "Bijwerken" -#: cps/templates/admin.html:121 +#: cps/templates/admin.html:122 msgid "Version" msgstr "Versie" -#: cps/templates/admin.html:122 +#: cps/templates/admin.html:123 msgid "Details" msgstr "Details" -#: cps/templates/admin.html:128 +#: cps/templates/admin.html:129 msgid "Current version" msgstr "Huidige versie" -#: cps/templates/admin.html:134 +#: cps/templates/admin.html:135 msgid "Check for update" -msgstr "Controleer voor update" +msgstr "Controleren op updates" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:136 msgid "Perform Update" -msgstr "Voer update uit" +msgstr "Update uitvoeren" -#: cps/templates/admin.html:147 +#: cps/templates/admin.html:148 msgid "Do you really want to restart Calibre-Web?" -msgstr "Wil je Calibre-Web echt herstarten?" +msgstr "Weet je zeker dat je Calibre-Web wilt herstarten?" -#: cps/templates/admin.html:152 cps/templates/admin.html:166 -#: cps/templates/admin.html:186 cps/templates/shelf.html:72 +#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:187 cps/templates/shelf.html:72 msgid "Ok" -msgstr "Ok" +msgstr "Oké" -#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:154 cps/templates/admin.html:168 #: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:281 cps/templates/config_view_edit.html:147 +#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:74 #: cps/templates/layout.html:28 cps/templates/shelf.html:73 #: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:12 @@ -1111,13 +1125,13 @@ msgstr "Ok" msgid "Back" msgstr "Terug" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:166 msgid "Do you really want to stop Calibre-Web?" -msgstr "Wil je Calibre-Web echt stoppen?" +msgstr "Weet je zeker dat je Calibre-Web wilt stoppen?" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:178 msgid "Updating, please do not reload page" -msgstr "Aan het updaten, gelieve de pagina niet te herladen" +msgstr "Bezig met bijwerken; vernieuw de pagina niet" #: cps/templates/author.html:15 msgid "via" @@ -1125,7 +1139,7 @@ msgstr "via" #: cps/templates/author.html:23 msgid "In Library" -msgstr "In Bibliotheek" +msgstr "In bibliotheek" #: cps/templates/author.html:34 cps/templates/list.html:14 #: cps/templates/search.html:41 @@ -1137,7 +1151,7 @@ msgstr "" #: cps/templates/index.html:89 cps/templates/search.html:67 #: cps/templates/shelf.html:36 msgid "reduce" -msgstr "" +msgstr "beperken" #: cps/templates/author.html:89 msgid "More by" @@ -1145,40 +1159,40 @@ msgstr "Meer van" #: cps/templates/book_edit.html:12 msgid "Delete Book" -msgstr "Wis boek" +msgstr "Boek verwijderen" #: cps/templates/book_edit.html:15 msgid "Delete formats:" -msgstr "Wis formaten:" +msgstr "Formaten verwijderen:" #: cps/templates/book_edit.html:18 cps/templates/book_edit.html:195 #: cps/templates/email_edit.html:73 msgid "Delete" -msgstr "Wis" +msgstr "Verwijderen" #: cps/templates/book_edit.html:26 msgid "Convert book format:" -msgstr "Converteer boek formaat:" +msgstr "Boekformaat converteren:" #: cps/templates/book_edit.html:30 msgid "Convert from:" -msgstr "Converteer van:" +msgstr "Converteren van:" #: cps/templates/book_edit.html:32 cps/templates/book_edit.html:39 msgid "select an option" -msgstr "selecteer een optie" +msgstr "kies een optie" #: cps/templates/book_edit.html:37 msgid "Convert to:" -msgstr "Converteer naar:" +msgstr "Converteren naar:" #: cps/templates/book_edit.html:46 msgid "Convert book" -msgstr "Converteer boek" +msgstr "Boek converteren" #: cps/templates/book_edit.html:55 cps/templates/search_form.html:6 msgid "Book Title" -msgstr "Boek titel" +msgstr "Boektitel" #: cps/templates/book_edit.html:59 cps/templates/book_edit.html:255 #: cps/templates/book_edit.html:273 cps/templates/search_form.html:10 @@ -1192,11 +1206,11 @@ msgstr "Omschrijving" #: cps/templates/book_edit.html:67 cps/templates/search_form.html:33 msgid "Tags" -msgstr "Tags" +msgstr "Labels" #: cps/templates/book_edit.html:75 msgid "Series id" -msgstr "Series id" +msgstr "Serie-id" #: cps/templates/book_edit.html:79 msgid "Rating" @@ -1204,15 +1218,15 @@ msgstr "Beoordeling" #: cps/templates/book_edit.html:83 msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" -msgstr "Boekomslag URL (jpg, omslag wordt gedownload en opgeslagen in database, invulveld is nadien terug leeg)" +msgstr "Boekomslag-url (jpg - de omslag wordt gedownload en opgeslagen in de databank; het invoerveld is nadien leeg)" #: cps/templates/book_edit.html:87 msgid "Upload Cover from local drive" -msgstr "Upload cover van lokale schijf" +msgstr "Omslag uploaden vanaf computer" #: cps/templates/book_edit.html:92 cps/templates/detail.html:168 msgid "Publishing date" -msgstr "Publicatie datum" +msgstr "Publicatiedatum" #: cps/templates/book_edit.html:99 cps/templates/book_edit.html:257 #: cps/templates/book_edit.html:274 cps/templates/detail.html:159 @@ -1234,17 +1248,17 @@ msgstr "Nee" #: cps/templates/book_edit.html:160 msgid "Upload format" -msgstr "Upload type" +msgstr "Uploadformaat" #: cps/templates/book_edit.html:169 msgid "view book after edit" -msgstr "bekijk boek na bewerking" +msgstr "boek inkijken na bewerking" #: cps/templates/book_edit.html:172 cps/templates/book_edit.html:208 msgid "Get metadata" -msgstr "Verkrijg metadata" +msgstr "Metagegevens ophalen" -#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:279 +#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329 #: cps/templates/config_view_edit.html:146 cps/templates/login.html:20 #: cps/templates/search_form.html:150 cps/templates/shelf_edit.html:17 #: cps/templates/user_edit.html:130 @@ -1253,11 +1267,11 @@ msgstr "Opslaan" #: cps/templates/book_edit.html:187 msgid "Are you really sure?" -msgstr "Ben je zeker?" +msgstr "Weet je het zeker?" #: cps/templates/book_edit.html:190 msgid "Book will be deleted from Calibre database" -msgstr "Boek wordt nu gewist uit de Calibre database" +msgstr "Het boek wordt verwijderd uit de Calibre-databank" #: cps/templates/book_edit.html:191 msgid "and from hard disk" @@ -1265,28 +1279,28 @@ msgstr "en van de harde schijf" #: cps/templates/book_edit.html:211 msgid "Keyword" -msgstr "Zoekwoord" +msgstr "Trefwoord" #: cps/templates/book_edit.html:212 msgid " Search keyword " -msgstr " Zoek sleutelwoord " +msgstr " Trefwoord zoeken " #: cps/templates/book_edit.html:214 cps/templates/layout.html:47 msgid "Go!" -msgstr "Start!" +msgstr "Ga!" #: cps/templates/book_edit.html:218 msgid "Click the cover to load metadata to the form" -msgstr "Klik op de omslag om de metatadata in het formulier te laden" +msgstr "Klik op de omslag om de metagegevens in het formulier te laden" #: cps/templates/book_edit.html:230 cps/templates/book_edit.html:270 msgid "Loading..." -msgstr "Aan het laden..." +msgstr "Bezig met laden..." #: cps/templates/book_edit.html:235 cps/templates/layout.html:187 #: cps/templates/layout.html:219 msgid "Close" -msgstr "Sluit" +msgstr "Sluiten" #: cps/templates/book_edit.html:262 cps/templates/book_edit.html:276 msgid "Source" @@ -1294,19 +1308,19 @@ msgstr "Bron" #: cps/templates/book_edit.html:271 msgid "Search error!" -msgstr "Zoek fout!" +msgstr "Zoekfout!" #: cps/templates/book_edit.html:272 msgid "No Result(s) found! Please try aonther keyword." -msgstr "Geen resultaten gevonden! Gebruik alsjeblieft een ander sleutelwoord." +msgstr "Geen resultaten gevonden! Gebruik een ander trefwoord." #: cps/templates/config_edit.html:12 msgid "Library Configuration" -msgstr "Bibliotheek configuratie" +msgstr "Bibliotheekinstellingen" #: cps/templates/config_edit.html:19 msgid "Location of Calibre database" -msgstr "Locatie van de Calibre database" +msgstr "Locatie van de Calibre-databank" #: cps/templates/config_edit.html:24 msgid "Use Google Drive?" @@ -1314,204 +1328,252 @@ msgstr "Google Drive gebruiken?" #: cps/templates/config_edit.html:30 msgid "Google Drive config problem" -msgstr "Google Drive configuratie probleem" +msgstr "Google Drive-instelprobleem" #: cps/templates/config_edit.html:36 msgid "Authenticate Google Drive" -msgstr "Verifieer Google Drive" +msgstr "Google Drive goedkeuren" #: cps/templates/config_edit.html:40 msgid "Please hit submit to continue with setup" -msgstr "" +msgstr "Druk op 'Opslaan' om door te gaan met instellen" #: cps/templates/config_edit.html:43 msgid "Please finish Google Drive setup after login" -msgstr "Gelieve Google Drive setup te voltooien na login" +msgstr "Voltooi na het inloggen de Google Drive-instelwizard" #: cps/templates/config_edit.html:48 msgid "Google Drive Calibre folder" -msgstr "Google Drive Calibre folder" +msgstr "Google Drive Calibre-map" #: cps/templates/config_edit.html:56 msgid "Metadata Watch Channel ID" -msgstr "Metadata Watch Channel ID" +msgstr "Metagegevens Watch Channel ID" #: cps/templates/config_edit.html:59 msgid "Revoke" -msgstr "Terugtrekken" +msgstr "Intrekken" #: cps/templates/config_edit.html:78 msgid "Server Configuration" -msgstr "Server configuratie" +msgstr "Serverinstellingen" #: cps/templates/config_edit.html:85 msgid "Server Port" -msgstr "Server poort" +msgstr "Serverpoort" #: cps/templates/config_edit.html:89 msgid "SSL certfile location (leave it empty for non-SSL Servers)" -msgstr "SSL certificaat (\"certfile\") bestand locatie (laat leeg voor niet-SSL servers)" +msgstr "SSL-certificaatlocatie ('certfile' - laat leeg voor niet-SSL-servers)" #: cps/templates/config_edit.html:93 msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" -msgstr "SSL sleutel (\"keyfile\") bestand (laat leeg voor niet-SSL servers)" +msgstr "SSL-sleutellocatie ('keyfile' - laat leeg voor niet-SSL-servers)" #: cps/templates/config_edit.html:97 msgid "Update channel" -msgstr "" +msgstr "Updatekanaal" #: cps/templates/config_edit.html:99 msgid "Stable" -msgstr "" +msgstr "Stabiel" #: cps/templates/config_edit.html:100 msgid "Stable (Automatic)" -msgstr "" +msgstr "Stabiel (automatisch)" #: cps/templates/config_edit.html:101 msgid "Nightly" -msgstr "" +msgstr "Bèta" #: cps/templates/config_edit.html:102 msgid "Nightly (Automatic)" -msgstr "" +msgstr "Bèta (automatisch)" #: cps/templates/config_edit.html:113 msgid "Logfile Configuration" -msgstr "Logbestand configuratie" +msgstr "Logbestand-instellingen" #: cps/templates/config_edit.html:120 msgid "Log Level" -msgstr "Log niveau" +msgstr "Logniveau" #: cps/templates/config_edit.html:129 msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "Locatie en naam van logbestand (calibre-web.log indien leeg)" -#: cps/templates/config_edit.html:140 -msgid "Feature Configuration" -msgstr "Voorzieningen configuratie" +#: cps/templates/config_edit.html:134 +msgid "Enable Access Log" +msgstr "" + +#: cps/templates/config_edit.html:137 +msgid "Location and name of access logfile (access.log for no entry)" +msgstr "" #: cps/templates/config_edit.html:148 +msgid "Feature Configuration" +msgstr "Mogelijkheden" + +#: cps/templates/config_edit.html:156 msgid "Enable uploading" -msgstr "Uploaden aanzetten" +msgstr "Uploaden inschakelen" -#: cps/templates/config_edit.html:152 +#: cps/templates/config_edit.html:160 msgid "Enable anonymous browsing" -msgstr "Anoniem verkennen aanzetten" +msgstr "Anoniem verkennen inschakelen" -#: cps/templates/config_edit.html:156 +#: cps/templates/config_edit.html:164 msgid "Enable public registration" -msgstr "Publieke registratie aanzetten" +msgstr "Openbare registratie inschakelen" -#: cps/templates/config_edit.html:160 +#: cps/templates/config_edit.html:168 msgid "Enable remote login (\"magic link\")" -msgstr "Maak op afstand ionloggen mogelijk (\"magic link\")" +msgstr "Inloggen op afstand inschakelen ('magic link')" -#: cps/templates/config_edit.html:165 +#: cps/templates/config_edit.html:173 msgid "Use" -msgstr "Gebruik" +msgstr "Gebruiken" -#: cps/templates/config_edit.html:166 +#: cps/templates/config_edit.html:174 msgid "Obtain an API Key" -msgstr "Verkrijg een API sleutel" +msgstr "API-sleutel verkrijgen" -#: cps/templates/config_edit.html:170 +#: cps/templates/config_edit.html:178 msgid "Goodreads API Key" -msgstr "Goodreads API sleutel" +msgstr "Goodreads API-sleutel" -#: cps/templates/config_edit.html:174 +#: cps/templates/config_edit.html:182 msgid "Goodreads API Secret" -msgstr "Goodreads API geheim" +msgstr "Goodreads API-geheim" -#: cps/templates/config_edit.html:181 +#: cps/templates/config_edit.html:189 msgid "Login type" msgstr "" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:191 msgid "Use standard Authentication" msgstr "" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:193 msgid "Use LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:188 +#: cps/templates/config_edit.html:196 msgid "Use GitHub OAuth" msgstr "" -#: cps/templates/config_edit.html:189 +#: cps/templates/config_edit.html:197 msgid "Use Google OAuth" msgstr "" -#: cps/templates/config_edit.html:196 -msgid "LDAP Provider URL" +#: cps/templates/config_edit.html:204 +msgid "LDAP Server Host Name or IP Address" msgstr "" -#: cps/templates/config_edit.html:200 +#: cps/templates/config_edit.html:208 +msgid "LDAP Server Port" +msgstr "" + +#: cps/templates/config_edit.html:212 +msgid "LDAP schema (ldap or ldaps)" +msgstr "" + +#: cps/templates/config_edit.html:216 +msgid "LDAP Admin username" +msgstr "" + +#: cps/templates/config_edit.html:220 +msgid "LDAP Admin password" +msgstr "" + +#: cps/templates/config_edit.html:225 +msgid "LDAP Server use SSL" +msgstr "" + +#: cps/templates/config_edit.html:229 +msgid "LDAP Server use TLS" +msgstr "" + +#: cps/templates/config_edit.html:233 +msgid "LDAP Server Certificate" +msgstr "" + +#: cps/templates/config_edit.html:237 +msgid "LDAP SSL Certificate Path" +msgstr "" + +#: cps/templates/config_edit.html:242 msgid "LDAP Distinguished Name (DN)" msgstr "" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:246 +msgid "LDAP User object filter" +msgstr "" + +#: cps/templates/config_edit.html:251 +msgid "LDAP Server is OpenLDAP?" +msgstr "" + +#: cps/templates/config_edit.html:258 msgid "Obtain GitHub OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:211 +#: cps/templates/config_edit.html:261 msgid "GitHub OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:215 +#: cps/templates/config_edit.html:265 msgid "GitHub OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:221 +#: cps/templates/config_edit.html:271 msgid "Obtain Google OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:224 +#: cps/templates/config_edit.html:274 msgid "Google OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:228 +#: cps/templates/config_edit.html:278 msgid "Google OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:242 +#: cps/templates/config_edit.html:292 msgid "External binaries" msgstr "Externe bibliotheken" -#: cps/templates/config_edit.html:250 +#: cps/templates/config_edit.html:300 msgid "No converter" -msgstr "Geen conversie programma" +msgstr "Geen conversieprogramma" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:302 msgid "Use Kindlegen" -msgstr "Gebruik Kindlegen" +msgstr "Kindlegen gebruiken" -#: cps/templates/config_edit.html:254 +#: cps/templates/config_edit.html:304 msgid "Use calibre's ebook converter" -msgstr "Gebruik calibre's ebook converter" +msgstr "Calibre's e-boekconversie gebruiken" -#: cps/templates/config_edit.html:258 +#: cps/templates/config_edit.html:308 msgid "E-Book converter settings" -msgstr "E-book conversie instellingen" +msgstr "Conversie-instellingen" -#: cps/templates/config_edit.html:262 +#: cps/templates/config_edit.html:312 msgid "Path to convertertool" -msgstr "Pad naar conversietool" +msgstr "Pad naar conversieprogramma" -#: cps/templates/config_edit.html:268 +#: cps/templates/config_edit.html:318 msgid "Location of Unrar binary" -msgstr "Locatie van Unrar programma" +msgstr "Locatie van Unrar-programma" -#: cps/templates/config_edit.html:284 cps/templates/layout.html:84 +#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 #: cps/templates/login.html:4 msgid "Login" -msgstr "Login" +msgstr "Inloggen" #: cps/templates/config_view_edit.html:12 msgid "View Configuration" -msgstr "Bekijk Configuratie" +msgstr "Instellingen bekijken" #: cps/templates/config_view_edit.html:19 cps/templates/shelf_edit.html:7 msgid "Title" @@ -1519,11 +1581,11 @@ msgstr "Titel" #: cps/templates/config_view_edit.html:27 msgid "No. of random books to show" -msgstr "Aantal boeken te tonen" +msgstr "Aantal te tonen willekeurige boeken" #: cps/templates/config_view_edit.html:31 msgid "No. of authors to show before hiding (0=disable hiding)" -msgstr "" +msgstr "Aantal te tonen auteurs alvorens te verbergen (0=nooit verbergen)" #: cps/templates/config_view_edit.html:35 cps/templates/readcbr.html:112 msgid "Theme" @@ -1535,7 +1597,7 @@ msgstr "Standaard thema" #: cps/templates/config_view_edit.html:38 msgid "caliBlur! Dark Theme" -msgstr "caliBlur! Donker Thema" +msgstr "caliBlur! donker thema" #: cps/templates/config_view_edit.html:42 msgid "Regular expression for ignoring columns" @@ -1543,23 +1605,23 @@ msgstr "Reguliere expressie om kolommen te negeren" #: cps/templates/config_view_edit.html:46 msgid "Link read/unread status to Calibre column" -msgstr "Koppel gelezen/ongelezen status aan Calibre kolom" +msgstr "Gelezen/Ongelezen-status koppelen aan Calibre-kolom" #: cps/templates/config_view_edit.html:55 msgid "Regular expression for title sorting" -msgstr "Rguliere expressie op titels te sorteren" +msgstr "Reguliere expressie voor het sorteren op titel" #: cps/templates/config_view_edit.html:59 msgid "Tags for Mature Content" -msgstr "Tags voor Volwassen Inhoud" +msgstr "Labels voor 18+-inhoud" #: cps/templates/config_view_edit.html:73 msgid "Default settings for new users" -msgstr "Standaard instellingen voor nieuwe gebruikers" +msgstr "Standaardinstellingen voor nieuwe gebruikers" #: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:83 msgid "Admin user" -msgstr "Administratie gebruiker" +msgstr "Admin-gebruiker" #: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:92 msgid "Allow Downloads" @@ -1579,7 +1641,7 @@ msgstr "Bewerken toestaan" #: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:108 msgid "Allow Delete books" -msgstr "Het wissen van boeken toestaan" +msgstr "Verwijderen van boeken toestaan" #: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:113 msgid "Allow Changing Password" @@ -1587,7 +1649,7 @@ msgstr "Wachtwoord wijzigen toestaan" #: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:117 msgid "Allow Editing Public Shelfs" -msgstr "Publieke boekenplanken bewerken toestaan" +msgstr "Bewerken van openbare boekenplanken toestaan" #: cps/templates/config_view_edit.html:119 msgid "Default visibilities for new users" @@ -1595,15 +1657,15 @@ msgstr "Standaard zichtbaar voor nieuwe gebruikers" #: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:75 msgid "Show random books in detail view" -msgstr "Toon willekeurige boeken in gedetailleerd zicht" +msgstr "Willekeurige boeken tonen in gedetailleerde weergave" #: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:88 msgid "Show mature content" -msgstr "Toon Volwassen Inhoud" +msgstr "18+-inhoud tonen" #: cps/templates/detail.html:59 msgid "Read in browser" -msgstr "Lees in browser" +msgstr "Lezen in webbrowser" #: cps/templates/detail.html:73 msgid "Listen in browser" @@ -1623,15 +1685,15 @@ msgstr "taal" #: cps/templates/detail.html:203 msgid "Mark As Unread" -msgstr "" +msgstr "Markeren als ongelezen" #: cps/templates/detail.html:203 msgid "Mark As Read" -msgstr "" +msgstr "Markeren als gelezen" #: cps/templates/detail.html:204 msgid "Read" -msgstr "Lees" +msgstr "Lezen" #: cps/templates/detail.html:214 cps/templates/listenmp3.html:54 msgid "Description:" @@ -1639,19 +1701,19 @@ msgstr "Omschrijving:" #: cps/templates/detail.html:227 cps/templates/search.html:14 msgid "Add to shelf" -msgstr "Voeg toe aan boekenplank" +msgstr "Toevoegen aan boekenplank" #: cps/templates/detail.html:289 msgid "Edit metadata" -msgstr "Bewerk metadata" +msgstr "Metagegevens bewerken" #: cps/templates/email_edit.html:15 msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" -msgstr "SMTP poort (meestal 25 voor normale SMTP en 465 voor SSL en 587 voor STARTTLS)" +msgstr "SMTP-poort (meestal 25 voor normale SMTP, 465 voor SSL en 587 voor STARTTLS)" #: cps/templates/email_edit.html:19 msgid "Encryption" -msgstr "Encryptie" +msgstr "Versleuteling" #: cps/templates/email_edit.html:21 msgid "None" @@ -1667,19 +1729,19 @@ msgstr "SSL/TLS" #: cps/templates/email_edit.html:31 msgid "SMTP password" -msgstr "SMTP wachtwoord" +msgstr "SMTP-wachtwoord" #: cps/templates/email_edit.html:35 msgid "From e-mail" -msgstr "Van email" +msgstr "Van e-mailadres" #: cps/templates/email_edit.html:38 msgid "Save settings" -msgstr "Bewaar instelling" +msgstr "Instellingen opslaan" #: cps/templates/email_edit.html:39 msgid "Save settings and send Test E-Mail" -msgstr "Bewaar instellingen en stuur test email" +msgstr "Instellingen opslaan en test-e-mail versturen" #: cps/templates/email_edit.html:43 msgid "Allowed domains for registering" @@ -1691,15 +1753,15 @@ msgstr "Voer domeinnaam in" #: cps/templates/email_edit.html:55 msgid "Add Domain" -msgstr "Voeg Domein toe" +msgstr "Domein toevoegen" #: cps/templates/email_edit.html:58 msgid "Add" -msgstr "Voeg toe" +msgstr "Toevoegen" #: cps/templates/email_edit.html:72 msgid "Do you really want to delete this domain rule?" -msgstr "Wil je werkelijk deze domein regel verwijderen?" +msgstr "Weet je zeker dat je deze domeinregel wilt verwijderen?" #: cps/templates/feed.xml:21 cps/templates/layout.html:171 msgid "Next" @@ -1708,35 +1770,35 @@ msgstr "Volgende" #: cps/templates/feed.xml:33 cps/templates/layout.html:44 #: cps/templates/layout.html:45 msgid "Search" -msgstr "Zoek" +msgstr "Zoeken" #: cps/templates/http_error.html:23 msgid "Back to home" -msgstr "" +msgstr "Terug naar startpagina" #: cps/templates/index.html:5 msgid "Discover (Random Books)" -msgstr "Ontdek (Willekeurige Boeken)" +msgstr "Verkennen (willekeurige boeken)" -#: cps/templates/index.html:65 +#: cps/templates/index.html:64 msgid "Group by series" msgstr "" #: cps/templates/index.xml:6 msgid "Start" -msgstr "Start" +msgstr "Starten" #: cps/templates/index.xml:21 msgid "Popular publications from this catalog based on Downloads." -msgstr "Populaire publicaties van deze cataloog gebaseerd op Downloads." +msgstr "Populaire publicaties uit deze catalogus, gebaseerd op Downloads." #: cps/templates/index.xml:28 msgid "Popular publications from this catalog based on Rating." -msgstr "Populaire publicaties van deze cataloog gebaseerd op Beoordeling." +msgstr "Populaire publicaties uit deze catalogus, gebaseerd op Beoordeling." #: cps/templates/index.xml:31 msgid "New Books" -msgstr "Nieuwe Boeken" +msgstr "Nieuwe boeken" #: cps/templates/index.xml:35 msgid "The latest Books" @@ -1744,11 +1806,11 @@ msgstr "Recentste boeken" #: cps/templates/index.xml:42 msgid "Show Random Books" -msgstr "Toon Willekeurige Boeken" +msgstr "Willekeurige boeken tonen" #: cps/templates/index.xml:65 msgid "Books ordered by Author" -msgstr "Boeken gesorteerd op Auteur" +msgstr "Boeken gesorteerd op auteur" #: cps/templates/index.xml:72 msgid "Books ordered by publisher" @@ -1756,35 +1818,35 @@ msgstr "Boeken gesorteerd op uitgever" #: cps/templates/index.xml:79 msgid "Books ordered by category" -msgstr "Boeken gesorteerd op Categorie" +msgstr "Boeken gesorteerd op categorie" #: cps/templates/index.xml:86 msgid "Books ordered by series" -msgstr "Boeken gesorteerd op Serie" +msgstr "Boeken gesorteerd op serie" #: cps/templates/index.xml:89 cps/templates/layout.html:132 msgid "Public Shelves" -msgstr "Publieke Boekenplanken" +msgstr "Openbare boekenplanken" #: cps/templates/index.xml:93 msgid "Books organized in public shelfs, visible to everyone" -msgstr "Boeken georganiseerd in publieke boekenplanken, zichtbaar voor iedereen" +msgstr "Boeken georganiseerd op openbare boekenplanken, zichtbaar voor iedereen" #: cps/templates/index.xml:97 cps/templates/layout.html:136 msgid "Your Shelves" -msgstr "Jou Boekenplanken" +msgstr "Jouw boekenplanken" #: cps/templates/index.xml:101 msgid "User's own shelfs, only visible to the current user himself" -msgstr "Eigen boekenplanken, enkel zichtbaar voor de huidige gebruiker zelf" +msgstr "Eigen boekenplanken, enkel zichtbaar voor de huidige gebruiker" #: cps/templates/layout.html:28 msgid "Home" -msgstr "" +msgstr "Startpagina" #: cps/templates/layout.html:34 msgid "Toggle navigation" -msgstr "Kies navigatie" +msgstr "Navigatie aanpassen" #: cps/templates/layout.html:55 msgid "Advanced Search" @@ -1797,23 +1859,23 @@ msgstr "Instellingen" #: cps/templates/layout.html:78 msgid "Account" -msgstr "" +msgstr "Account" #: cps/templates/layout.html:80 msgid "Logout" -msgstr "Log uit" +msgstr "Uitloggen" #: cps/templates/layout.html:85 cps/templates/register.html:14 msgid "Register" -msgstr "Registreer" +msgstr "Registreren" #: cps/templates/layout.html:111 cps/templates/layout.html:218 msgid "Uploading..." -msgstr "Aan het uploaden..." +msgstr "Bezig met uploaden..." #: cps/templates/layout.html:112 msgid "please don't refresh the page" -msgstr "gelieve de pagina niet te herladen" +msgstr "vernieuw de pagina niet" #: cps/templates/layout.html:122 msgid "Browse" @@ -1821,7 +1883,7 @@ msgstr "Verkennen" #: cps/templates/layout.html:141 msgid "Create a Shelf" -msgstr "Maak een boekenplank" +msgstr "Creëer een boekenplank" #: cps/templates/layout.html:142 cps/templates/stats.html:3 msgid "About" @@ -1833,15 +1895,15 @@ msgstr "Vorige" #: cps/templates/layout.html:183 msgid "Book Details" -msgstr "Boek Details" +msgstr "Boekgegevens" #: cps/templates/layout.html:217 msgid "Upload done, processing, please wait..." -msgstr "" +msgstr "Uploaden voltooid; bezig met verwerken..." #: cps/templates/layout.html:220 msgid "Error" -msgstr "" +msgstr "Fout" #: cps/templates/login.html:8 cps/templates/login.html:9 #: cps/templates/register.html:7 cps/templates/user_edit.html:8 @@ -1855,19 +1917,27 @@ msgstr "Wachtwoord" #: cps/templates/login.html:17 msgid "Remember me" -msgstr "Onthoumij" +msgstr "Onthouden" #: cps/templates/login.html:22 msgid "Log in with magic link" msgstr "Inloggen met magische koppeling" +#: cps/templates/logviewer.html:5 +msgid "Show Calibre-Web log" +msgstr "" + +#: cps/templates/logviewer.html:8 +msgid "Show access log" +msgstr "" + #: cps/templates/osd.xml:5 msgid "Calibre-Web ebook catalog" -msgstr "Calibre-Web ebook cataloog" +msgstr "Calibre-Web - e-boekcatalogus" #: cps/templates/read.html:74 msgid "Reflow text when sidebars are open." -msgstr "Herschuif tekst waneer het zijpaneel open staat." +msgstr "Tekstindeling automatisch aanpassen als het zijpaneel geopend is." #: cps/templates/readcbr.html:88 msgid "Keyboard Shortcuts" @@ -1875,39 +1945,39 @@ msgstr "Sneltoetsen" #: cps/templates/readcbr.html:91 msgid "Previous Page" -msgstr "Vorige Pagina" +msgstr "Vorige pagina" #: cps/templates/readcbr.html:92 msgid "Next Page" -msgstr "Volgende Pagina" +msgstr "Volgende pagina" #: cps/templates/readcbr.html:93 msgid "Scale to Best" -msgstr "Optimaal schalen" +msgstr "Optimaal inpassen" #: cps/templates/readcbr.html:94 msgid "Scale to Width" -msgstr "Schalen naar breedte" +msgstr "Aanpassen aan breedte" #: cps/templates/readcbr.html:95 msgid "Scale to Height" -msgstr "Schalen naar hoogte" +msgstr "Aanpassen aan hoogte" #: cps/templates/readcbr.html:96 msgid "Scale to Native" -msgstr "Schalen op ware grootte" +msgstr "Ware grootte" #: cps/templates/readcbr.html:97 msgid "Rotate Right" -msgstr "Draai rechtsom" +msgstr "Naar rechts draaien" #: cps/templates/readcbr.html:98 msgid "Rotate Left" -msgstr "Draai linksom" +msgstr "Naar links draaien" #: cps/templates/readcbr.html:99 msgid "Flip Image" -msgstr "Keer beeld om" +msgstr "Afbeelding omdraaien" #: cps/templates/readcbr.html:115 msgid "Light" @@ -1939,11 +2009,11 @@ msgstr "Ware grootte" #: cps/templates/readcbr.html:132 msgid "Rotate" -msgstr "Draai" +msgstr "Draaien" #: cps/templates/readcbr.html:143 msgid "Flip" -msgstr "Keer" +msgstr "Omdraaien" #: cps/templates/readcbr.html:146 msgid "Horizontal" @@ -1955,15 +2025,15 @@ msgstr "Verticaal" #: cps/templates/readcbr.html:152 msgid "Direction" -msgstr "" +msgstr "Richting" #: cps/templates/readcbr.html:155 msgid "Left to Right" -msgstr "" +msgstr "Links-naar-rechts" #: cps/templates/readcbr.html:156 msgid "Right to Left" -msgstr "" +msgstr "Rechts-naar-links" #: cps/templates/readpdf.html:29 msgid "PDF reader" @@ -1971,11 +2041,11 @@ msgstr "" #: cps/templates/readtxt.html:6 msgid "Basic txt Reader" -msgstr "Basis txt Lezer" +msgstr "Basis tekstlezer" #: cps/templates/register.html:4 msgid "Register a new account" -msgstr "Registreer een nieuwe gebruiker" +msgstr "Nieuw account registreren" #: cps/templates/register.html:8 msgid "Choose a username" @@ -1983,31 +2053,31 @@ msgstr "Kies een gebruikersnaam" #: cps/templates/register.html:11 cps/templates/user_edit.html:13 msgid "E-mail address" -msgstr "Email adres" +msgstr "E-mailadres" #: cps/templates/register.html:12 msgid "Your email address" -msgstr "Jou email adres" +msgstr "Je e-mailadres" #: cps/templates/remote_login.html:6 msgid "Use your other device, login and visit " -msgstr "" +msgstr "Pak je andere apparaat, log in en ga naar " #: cps/templates/remote_login.html:9 msgid "Once you do so, you will automatically get logged in on this device." -msgstr "Eenmaal gedaan wordt je automagisch op dit apparaat ingelogd." +msgstr "Daarna wordt je automatisch op dit apparaat ingelogd." #: cps/templates/remote_login.html:12 msgid "The link will expire after 10 minutes." -msgstr "" +msgstr "De link vervalt na 10 minuten." #: cps/templates/search.html:5 msgid "No Results for:" -msgstr "Geen resultaat voor:" +msgstr "Geen resultaten voor:" #: cps/templates/search.html:6 msgid "Please try a different search" -msgstr "Gelieve een ander zoekwoord proberen" +msgstr "Probeer andere zoektermen" #: cps/templates/search.html:8 msgid "Results for:" @@ -2015,87 +2085,87 @@ msgstr "Resultaten voor:" #: cps/templates/search_form.html:19 msgid "Publishing date from" -msgstr "Publicatie datum van" +msgstr "Publicatiedatum van" #: cps/templates/search_form.html:26 msgid "Publishing date to" -msgstr "Publicatie datum tot" +msgstr "Publicatiedatum tot" #: cps/templates/search_form.html:43 msgid "Exclude Tags" -msgstr "Sluit Tags uit" +msgstr "Labels uitsluiten" #: cps/templates/search_form.html:63 msgid "Exclude Series" -msgstr "Sluit Series uit" +msgstr "Series uitsluiten" #: cps/templates/search_form.html:84 msgid "Exclude Languages" -msgstr "Sluit Talen uit" +msgstr "Talen uitsluiten" #: cps/templates/search_form.html:97 msgid "Rating bigger than" -msgstr "Waardering meer dan" +msgstr "Met beoordeling hoger dan" #: cps/templates/search_form.html:101 msgid "Rating less than" -msgstr "Waardering minder dan" +msgstr "Met beoordeling lager dan" #: cps/templates/shelf.html:10 msgid "Delete this Shelf" -msgstr "Wis deze boekenplank" +msgstr "Deze boekenplank verwijderen" #: cps/templates/shelf.html:11 msgid "Edit Shelf" -msgstr "Bewerk Boekenplank" +msgstr "Boekenplank aanpassen" #: cps/templates/shelf.html:12 cps/templates/shelf_order.html:11 msgid "Change order" -msgstr "Verander volgorde" +msgstr "Volgorde veranderen" #: cps/templates/shelf.html:67 msgid "Do you really want to delete the shelf?" -msgstr "Wil je echt deze boekenplank verwijderen?" +msgstr "Weet je zeker dat je deze boekenplank wilt verwijderen?" #: cps/templates/shelf.html:70 msgid "Shelf will be lost for everybody and forever!" -msgstr "Boekenplank zal verdwijnen voor iedereen en altijd!" +msgstr "De boekenplank wordt permanent verwijderd voor iedereen!" #: cps/templates/shelf_edit.html:13 msgid "should the shelf be public?" -msgstr "mag deze boekenplank publiek zijn?" +msgstr "moet de boekenplank openbaar zijn?" #: cps/templates/shelf_order.html:5 msgid "Drag 'n drop to rearrange order" -msgstr "Sleep en laat vallen om de volgorde te veranderen" +msgstr "Verander de volgorde middels slepen-en-neerzetten" #: cps/templates/stats.html:7 msgid "Calibre library statistics" -msgstr "Calibre bibliotheek statistieken" +msgstr "Calibre-bibliotheekstatistieken" #: cps/templates/stats.html:12 msgid "Books in this Library" -msgstr "Boeken in deze Bibliotheek" +msgstr "Boeken in deze bibliotheek" #: cps/templates/stats.html:16 msgid "Authors in this Library" -msgstr "Auteurs in deze Bibliotheek" +msgstr "Auteurs in deze bibliotheek" #: cps/templates/stats.html:20 msgid "Categories in this Library" -msgstr "Categorieën in deze Bibliotheek" +msgstr "Categorieën in deze bibliotheek" #: cps/templates/stats.html:24 msgid "Series in this Library" -msgstr "Series in deze Bibliotheek" +msgstr "Series in deze bibliotheek" #: cps/templates/stats.html:28 msgid "Linked libraries" -msgstr "Gelinkte bibliotheken" +msgstr "Gekoppelde bibliotheken" #: cps/templates/stats.html:32 msgid "Program library" -msgstr "Programma bibliotheek" +msgstr "Programmabibliotheek" #: cps/templates/stats.html:33 msgid "Installed Version" @@ -2103,7 +2173,7 @@ msgstr "Geïnstalleerde versie" #: cps/templates/tasks.html:7 msgid "Tasks list" -msgstr "Taaklijst" +msgstr "Takenlijst" #: cps/templates/tasks.html:12 msgid "User" @@ -2119,7 +2189,7 @@ msgstr "Status" #: cps/templates/tasks.html:16 msgid "Progress" -msgstr "Vooruitgang" +msgstr "Voortgang" #: cps/templates/tasks.html:17 msgid "Runtime" @@ -2127,31 +2197,31 @@ msgstr "Looptijd" #: cps/templates/tasks.html:18 msgid "Starttime" -msgstr "Start tijd" +msgstr "Begintijd" #: cps/templates/tasks.html:24 msgid "Delete finished tasks" -msgstr "Verwijder voltooide taken" +msgstr "Afgeronde taken verwijderen" #: cps/templates/tasks.html:25 msgid "Hide all tasks" -msgstr "Verberg alle taken" +msgstr "Alle taken verbergen" #: cps/templates/user_edit.html:18 msgid "Reset user Password" -msgstr "Reset gebruikers wachtwoord" +msgstr "Gebruikerswachtwoord herstellen" #: cps/templates/user_edit.html:27 msgid "Kindle E-Mail" -msgstr "Kindle email" +msgstr "Kindle-e-mailadres" #: cps/templates/user_edit.html:40 msgid "Show books with language" -msgstr "Toon boeken met taal" +msgstr "Boeken tonen met taal" #: cps/templates/user_edit.html:42 msgid "Show all" -msgstr "Toon alles" +msgstr "Alle tonen" #: cps/templates/user_edit.html:52 msgid "OAuth Settings" @@ -2167,11 +2237,11 @@ msgstr "" #: cps/templates/user_edit.html:124 msgid "Delete this user" -msgstr "Wis deze gebruiker" +msgstr "Deze gebruiker verwijderen" #: cps/templates/user_edit.html:139 msgid "Recent Downloads" -msgstr "Recente Downloads" +msgstr "Recente downloads" #~ msgid "Afar" #~ msgstr "Afar; Hamitisch" @@ -3439,18 +3509,12 @@ msgstr "Recente Downloads" #~ msgid "Cover is not a jpg file, can't save" #~ msgstr "Boekomslag is geen jpg bestand, opslaan niet mogelijk" -#~ msgid "Preparing document for printing..." -#~ msgstr "" - #~ msgid "Using your another device, visit" #~ msgstr "Bezoek met je andere apparaat" #~ msgid "and log in" #~ msgstr "en log in" -#~ msgid "Using your another device, login and visit " -#~ msgstr "" - #~ msgid "Newest Books" #~ msgstr "Nieuwste boeken" @@ -3461,19 +3525,22 @@ msgstr "Recente Downloads" #~ msgstr "Boeken (A-Z)" #~ msgid "Books (Z-A)" -#~ msgstr "Boeken (A-Z)" +#~ msgstr "Boeken (Z-A)" #~ msgid "Error opening eBook. Fileformat is not supported." -#~ msgstr "" +#~ msgstr "Kan boek niet openen: het bestandsformaat wordt niet ondersteund." + +#~ msgid "successfully deleted shelf %(name)s" +#~ msgstr "boekenplank '%(name)s' is verwijderd" #~ msgid "File %(title)s" -#~ msgstr "" +#~ msgstr "Bestand %(title)s" #~ msgid "Show sorted books" -#~ msgstr "Toon gesorteerde boeken" +#~ msgstr "Gesorteerde boeken tonen" #~ msgid "Sorted Books" -#~ msgstr "Gesorteerde Boeken" +#~ msgstr "Gesorteerde boeken" #~ msgid "Sort By" #~ msgstr "Sorteren op" @@ -3491,5 +3558,8 @@ msgstr "Recente Downloads" #~ msgstr "Aflopend" #~ msgid "PDF.js viewer" -#~ msgstr "PDF.js viewer" +#~ msgstr "PDF.js-weergave" + +#~ msgid "Register with %s, " +#~ msgstr "" diff --git a/cps/translations/pl/LC_MESSAGES/messages.mo b/cps/translations/pl/LC_MESSAGES/messages.mo index 3e193cb23376db9ce1e8d6cc11832338e34968f1..779428ae26e85b23f8b373498cf2ed361a36ae84 100644 GIT binary patch delta 12207 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 W*%+@AsVFV<7MMOqI+$fgCj1ZIhJOM8 literal 49865 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\n" "Language: pl\n" @@ -17,13 +17,13 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.6.0\n" +"Generated-By: Babel 2.7.0\n" -#: cps/about.py:76 +#: cps/about.py:78 msgid "Statistics" msgstr "Statystyki" -#: cps/admin.py:97 +#: cps/admin.py:98 msgid "Server restarted, please reload page" msgstr "Serwer uruchomiony ponownie, proszę odświeżyć stronę" @@ -31,186 +31,202 @@ msgstr "Serwer uruchomiony ponownie, proszę odświeżyć stronę" msgid "Performing shutdown of server, please close window" msgstr "Wykonano wyłączenie serwera, proszę zamknąć okno" -#: cps/admin.py:120 cps/updater.py:445 +#: cps/admin.py:119 cps/updater.py:448 msgid "Unknown" msgstr "" -#: cps/admin.py:139 +#: cps/admin.py:138 msgid "Admin page" msgstr "Portal administracyjny" -#: cps/admin.py:208 cps/admin.py:486 +#: cps/admin.py:207 cps/admin.py:532 msgid "Calibre-Web configuration updated" msgstr "Konfiguracja Calibre-Web została zaktualizowana" -#: cps/admin.py:222 cps/templates/admin.html:102 +#: cps/admin.py:220 cps/templates/admin.html:102 msgid "UI Configuration" msgstr "" -#: cps/admin.py:295 +#: cps/admin.py:293 msgid "Import of optional Google Drive requirements missing" msgstr "" -#: cps/admin.py:298 +#: cps/admin.py:296 msgid "client_secrets.json is missing or not readable" msgstr "" -#: cps/admin.py:303 cps/admin.py:332 +#: cps/admin.py:301 cps/admin.py:330 msgid "client_secrets.json is not configured for web application" msgstr "" -#: cps/admin.py:335 cps/admin.py:361 cps/admin.py:373 cps/admin.py:398 -#: cps/admin.py:426 cps/admin.py:440 cps/admin.py:463 cps/admin.py:476 -#: cps/admin.py:494 cps/admin.py:501 cps/admin.py:516 -#: cps/templates/admin.html:101 +#: cps/admin.py:333 cps/admin.py:359 cps/admin.py:371 cps/admin.py:396 +#: cps/admin.py:403 cps/admin.py:436 cps/admin.py:460 cps/admin.py:474 +#: cps/admin.py:493 cps/admin.py:510 cps/admin.py:522 cps/admin.py:538 +#: cps/admin.py:545 cps/admin.py:559 cps/templates/admin.html:101 msgid "Basic Configuration" msgstr "Podstawowa konfiguracja" -#: cps/admin.py:358 +#: cps/admin.py:356 msgid "Keyfile location is not valid, please enter correct path" msgstr "" -#: cps/admin.py:370 +#: cps/admin.py:368 cps/admin.py:433 msgid "Certfile location is not valid, please enter correct path" msgstr "" -#: cps/admin.py:395 -msgid "Please enter a LDAP provider and a DN" +#: cps/admin.py:393 +msgid "Please enter a LDAP provider, port, DN and user object identifier" msgstr "" -#: cps/admin.py:423 +#: cps/admin.py:400 +msgid "Please enter a LDAP service account and password" +msgstr "" + +#: cps/admin.py:457 msgid "Please enter Github oauth credentials" msgstr "" -#: cps/admin.py:437 +#: cps/admin.py:471 msgid "Please enter Google oauth credentials" msgstr "" -#: cps/admin.py:460 +#: cps/admin.py:490 msgid "Logfile location is not valid, please enter correct path" msgstr "" -#: cps/admin.py:498 +#: cps/admin.py:507 +msgid "Access Logfile location is not valid, please enter correct path" +msgstr "" + +#: cps/admin.py:542 msgid "DB location is not valid, please enter correct path" msgstr "Lokalizacja bazy danych jest nieprawidłowa, wpisz poprawną ścieżkę" -#: cps/admin.py:558 cps/web.py:1045 +#: cps/admin.py:602 cps/web.py:1040 msgid "Please fill out all fields!" msgstr "Proszę wypełnić wszystkie pola!" -#: cps/admin.py:560 cps/admin.py:566 cps/admin.py:582 +#: cps/admin.py:604 cps/admin.py:610 cps/admin.py:626 #: cps/templates/admin.html:35 msgid "Add new user" msgstr "Dodaj nowego użytkownika" -#: cps/admin.py:564 cps/web.py:1248 +#: cps/admin.py:608 cps/web.py:1251 msgid "E-mail is not from valid domain" msgstr "" -#: cps/admin.py:572 +#: cps/admin.py:616 #, python-format msgid "User '%(user)s' created" msgstr "Użytkownik '%(user)s' został utworzony" -#: cps/admin.py:576 +#: cps/admin.py:620 msgid "Found an existing account for this e-mail address or nickname." msgstr "" -#: cps/admin.py:607 +#: cps/admin.py:651 #, python-format msgid "Test e-mail successfully send to %(kindlemail)s" msgstr "" -#: cps/admin.py:610 +#: cps/admin.py:654 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "" -#: cps/admin.py:612 cps/web.py:1029 +#: cps/admin.py:656 cps/web.py:1023 msgid "Please configure your kindle e-mail address first..." msgstr "" -#: cps/admin.py:614 +#: cps/admin.py:658 msgid "E-mail server settings updated" msgstr "" -#: cps/admin.py:615 +#: cps/admin.py:659 msgid "Edit e-mail server settings" msgstr "" -#: cps/admin.py:640 +#: cps/admin.py:687 #, python-format msgid "User '%(nick)s' deleted" msgstr "Użytkownik '%(nick)s' został usunięty" -#: cps/admin.py:711 +#: cps/admin.py:690 +msgid "No admin user remaining, can't delete user" +msgstr "" + +#: cps/admin.py:761 #, python-format msgid "User '%(nick)s' updated" msgstr "Użytkownik '%(nick)s' został zaktualizowany" -#: cps/admin.py:714 +#: cps/admin.py:764 msgid "An unknown error occured." msgstr "Wystąpił nieznany błąd." -#: cps/admin.py:717 +#: cps/admin.py:767 #, python-format msgid "Edit User %(nick)s" msgstr "Edytuj użytkownika %(nick)s" -#: cps/admin.py:733 +#: cps/admin.py:783 #, python-format msgid "Password for user %(user)s reset" msgstr "" -#: cps/admin.py:736 cps/web.py:1070 +#: cps/admin.py:786 cps/web.py:1065 msgid "An unknown error occurred. Please try again later." msgstr "" -#: cps/admin.py:755 +#: cps/admin.py:797 +msgid "Logfile viewer" +msgstr "" + +#: cps/admin.py:832 msgid "Requesting update package" msgstr "Żądanie o pakiet aktualizacji" -#: cps/admin.py:756 +#: cps/admin.py:833 msgid "Downloading update package" msgstr "Pobieranie pakietu aktualizacji" -#: cps/admin.py:757 +#: cps/admin.py:834 msgid "Unzipping update package" msgstr "Rozpakowywanie pakietu aktualizacji" -#: cps/admin.py:758 +#: cps/admin.py:835 msgid "Replacing files" msgstr "" -#: cps/admin.py:759 +#: cps/admin.py:836 msgid "Database connections are closed" msgstr "Połączenia z bazą danych zostały zakończone" -#: cps/admin.py:760 +#: cps/admin.py:837 msgid "Stopping server" msgstr "" -#: cps/admin.py:761 +#: cps/admin.py:838 msgid "Update finished, please press okay and reload page" msgstr "Aktualizacja zakończona, proszę nacisnąć OK i odświeżyć stronę" -#: cps/admin.py:762 cps/admin.py:763 cps/admin.py:764 cps/admin.py:765 +#: cps/admin.py:839 cps/admin.py:840 cps/admin.py:841 cps/admin.py:842 msgid "Update failed:" msgstr "" -#: cps/admin.py:762 cps/updater.py:277 cps/updater.py:456 cps/updater.py:458 +#: cps/admin.py:839 cps/updater.py:273 cps/updater.py:459 cps/updater.py:461 msgid "HTTP Error" msgstr "" -#: cps/admin.py:763 cps/updater.py:279 cps/updater.py:460 +#: cps/admin.py:840 cps/updater.py:275 cps/updater.py:463 msgid "Connection error" msgstr "" -#: cps/admin.py:764 cps/updater.py:281 cps/updater.py:462 +#: cps/admin.py:841 cps/updater.py:277 cps/updater.py:465 msgid "Timeout while establishing connection" msgstr "" -#: cps/admin.py:765 cps/updater.py:283 cps/updater.py:464 +#: cps/admin.py:842 cps/updater.py:279 cps/updater.py:467 msgid "General error" msgstr "" @@ -228,720 +244,714 @@ msgstr "" msgid "not configured" msgstr "" -#: cps/editbooks.py:218 cps/editbooks.py:432 +#: cps/editbooks.py:215 cps/editbooks.py:394 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "" -#: cps/editbooks.py:246 +#: cps/editbooks.py:243 msgid "edit metadata" msgstr "edytuj metadane" -#: cps/editbooks.py:325 cps/editbooks.py:595 +#: cps/editbooks.py:322 cps/editbooks.py:557 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "Rozszerzenie pliku '%(ext)s' nie jest dozwolone do przesłania na ten serwer" -#: cps/editbooks.py:329 cps/editbooks.py:599 +#: cps/editbooks.py:326 cps/editbooks.py:561 msgid "File to be uploaded must have an extension" msgstr "Plik do przesłania musi mieć rozszerzenie" -#: cps/editbooks.py:341 cps/editbooks.py:619 +#: cps/editbooks.py:338 cps/editbooks.py:581 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Nie udało się utworzyć łącza %(path)s (Odmowa dostępu)." -#: cps/editbooks.py:346 +#: cps/editbooks.py:343 #, python-format msgid "Failed to store file %(file)s." msgstr "" -#: cps/editbooks.py:363 +#: cps/editbooks.py:360 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "" -#: cps/editbooks.py:382 -#, python-format -msgid "Failed to create path for cover %(path)s (Permission denied)." -msgstr "" - -#: cps/editbooks.py:390 -#, python-format -msgid "Failed to store cover-file %(cover)s." -msgstr "" - -#: cps/editbooks.py:393 -msgid "Cover-file is not a valid image file" -msgstr "" - -#: cps/editbooks.py:399 cps/editbooks.py:413 +#: cps/editbooks.py:374 msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" msgstr "" -#: cps/editbooks.py:445 cps/editbooks.py:454 +#: cps/editbooks.py:407 cps/editbooks.py:416 msgid "unknown" msgstr "" -#: cps/editbooks.py:486 +#: cps/editbooks.py:448 msgid "Cover is not a jpg file, can't save" msgstr "" -#: cps/editbooks.py:534 +#: cps/editbooks.py:496 #, python-format msgid "%(langname)s is not a valid language" msgstr "" -#: cps/editbooks.py:565 +#: cps/editbooks.py:527 msgid "Metadata successfully updated" msgstr "" -#: cps/editbooks.py:574 +#: cps/editbooks.py:536 msgid "Error editing book, please check logfile for details" msgstr "" -#: cps/editbooks.py:624 +#: cps/editbooks.py:586 #, python-format msgid "Failed to store file %(file)s (Permission denied)." msgstr "Nie można przechowywać pliku %(file)s (Odmowa dostępu)." -#: cps/editbooks.py:629 +#: cps/editbooks.py:591 #, python-format msgid "Failed to delete file %(file)s (Permission denied)." msgstr "Nie udało się usunąć pliku %(file)s (Odmowa dostępu)." -#: cps/editbooks.py:712 +#: cps/editbooks.py:674 #, python-format msgid "File %(file)s uploaded" msgstr "" -#: cps/editbooks.py:741 +#: cps/editbooks.py:703 msgid "Source or destination format for conversion missing" msgstr "" -#: cps/editbooks.py:751 +#: cps/editbooks.py:711 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "" -#: cps/editbooks.py:755 +#: cps/editbooks.py:715 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "" -#: cps/gdrive.py:56 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgstr "" -#: cps/gdrive.py:101 +#: cps/gdrive.py:106 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "" -#: cps/helper.py:97 +#: cps/helper.py:94 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "" -#: cps/helper.py:109 +#: cps/helper.py:106 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "" -#: cps/helper.py:116 cps/helper.py:223 cps/templates/detail.html:41 +#: cps/helper.py:113 cps/helper.py:220 cps/templates/detail.html:41 #: cps/templates/detail.html:45 msgid "Send to Kindle" msgstr "Wyślij do Kindle" -#: cps/helper.py:117 cps/helper.py:135 cps/helper.py:225 +#: cps/helper.py:114 cps/helper.py:132 cps/helper.py:222 msgid "This e-mail has been sent via Calibre-Web." msgstr "" -#: cps/helper.py:128 +#: cps/helper.py:125 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "" -#: cps/helper.py:133 +#: cps/helper.py:130 msgid "Calibre-Web test e-mail" msgstr "" -#: cps/helper.py:134 +#: cps/helper.py:131 msgid "Test e-mail" msgstr "" -#: cps/helper.py:150 +#: cps/helper.py:147 msgid "Get Started with Calibre-Web" msgstr "" -#: cps/helper.py:151 +#: cps/helper.py:148 #, python-format msgid "Registration e-mail for user: %(name)s" msgstr "" -#: cps/helper.py:165 cps/helper.py:167 cps/helper.py:169 cps/helper.py:177 -#: cps/helper.py:179 cps/helper.py:181 +#: cps/helper.py:162 cps/helper.py:164 cps/helper.py:166 cps/helper.py:174 +#: cps/helper.py:176 cps/helper.py:178 #, python-format msgid "Send %(format)s to Kindle" msgstr "" -#: cps/helper.py:185 +#: cps/helper.py:182 #, python-format msgid "Convert %(orig)s to %(format)s and send to Kindle" msgstr "" -#: cps/helper.py:224 +#: cps/helper.py:221 #, python-format msgid "E-mail: %(book)s" msgstr "" -#: cps/helper.py:227 +#: cps/helper.py:224 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "" -#: cps/helper.py:335 +#: cps/helper.py:331 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "" -#: cps/helper.py:345 +#: cps/helper.py:341 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "" -#: cps/helper.py:359 +#: cps/helper.py:355 #, python-format msgid "Rename file in path '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "" -#: cps/helper.py:385 cps/helper.py:395 cps/helper.py:403 +#: cps/helper.py:381 cps/helper.py:391 cps/helper.py:399 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "" -#: cps/helper.py:424 +#: cps/helper.py:420 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "" -#: cps/helper.py:584 +#: cps/helper.py:579 msgid "Error excecuting UnRar" msgstr "" -#: cps/helper.py:586 +#: cps/helper.py:581 msgid "Unrar binary file not found" msgstr "" -#: cps/helper.py:614 +#: cps/helper.py:609 msgid "Waiting" msgstr "" -#: cps/helper.py:616 +#: cps/helper.py:611 msgid "Failed" msgstr "" -#: cps/helper.py:618 +#: cps/helper.py:613 msgid "Started" msgstr "" -#: cps/helper.py:620 +#: cps/helper.py:615 msgid "Finished" msgstr "" -#: cps/helper.py:622 +#: cps/helper.py:617 msgid "Unknown Status" msgstr "" -#: cps/helper.py:627 +#: cps/helper.py:622 msgid "E-mail: " msgstr "" -#: cps/helper.py:629 cps/helper.py:633 +#: cps/helper.py:624 cps/helper.py:628 msgid "Convert: " msgstr "" -#: cps/helper.py:631 +#: cps/helper.py:626 msgid "Upload: " msgstr "" -#: cps/helper.py:635 +#: cps/helper.py:630 msgid "Unknown Task: " msgstr "" -#: cps/oauth_bb.py:87 +#: cps/oauth_bb.py:91 #, python-format -msgid "Register with %s, " +msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:145 +#: cps/oauth_bb.py:149 msgid "Failed to log in with GitHub." msgstr "" -#: cps/oauth_bb.py:150 +#: cps/oauth_bb.py:154 msgid "Failed to fetch user info from GitHub." msgstr "" -#: cps/oauth_bb.py:161 +#: cps/oauth_bb.py:165 msgid "Failed to log in with Google." msgstr "" -#: cps/oauth_bb.py:166 +#: cps/oauth_bb.py:170 msgid "Failed to fetch user info from Google." msgstr "" -#: cps/oauth_bb.py:265 +#: cps/oauth_bb.py:269 #, python-format msgid "Unlink to %(oauth)s success." msgstr "" -#: cps/oauth_bb.py:269 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s failed." msgstr "" -#: cps/oauth_bb.py:272 +#: cps/oauth_bb.py:276 #, python-format msgid "Not linked to %(oauth)s." msgstr "" -#: cps/oauth_bb.py:300 +#: cps/oauth_bb.py:304 msgid "GitHub Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:319 +#: cps/oauth_bb.py:323 msgid "Google Oauth error, please retry later." msgstr "" -#: cps/shelf.py:40 cps/shelf.py:92 +#: cps/shelf.py:46 cps/shelf.py:98 msgid "Invalid shelf specified" msgstr "" -#: cps/shelf.py:47 +#: cps/shelf.py:53 #, python-format msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" msgstr "" -#: cps/shelf.py:55 +#: cps/shelf.py:61 msgid "You are not allowed to edit public shelves" msgstr "" -#: cps/shelf.py:64 +#: cps/shelf.py:70 #, python-format msgid "Book is already part of the shelf: %(shelfname)s" msgstr "" -#: cps/shelf.py:78 +#: cps/shelf.py:84 #, python-format msgid "Book has been added to shelf: %(sname)s" msgstr "Książka została dodana do półki: %(sname)s" -#: cps/shelf.py:97 +#: cps/shelf.py:103 #, python-format msgid "You are not allowed to add a book to the the shelf: %(name)s" msgstr "" -#: cps/shelf.py:102 +#: cps/shelf.py:108 msgid "User is not allowed to edit public shelves" msgstr "" -#: cps/shelf.py:120 +#: cps/shelf.py:126 #, python-format msgid "Books are already part of the shelf: %(name)s" msgstr "" -#: cps/shelf.py:134 +#: cps/shelf.py:140 #, python-format msgid "Books have been added to shelf: %(sname)s" msgstr "" -#: cps/shelf.py:136 +#: cps/shelf.py:142 #, python-format msgid "Could not add books to shelf: %(sname)s" msgstr "" -#: cps/shelf.py:173 +#: cps/shelf.py:179 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "Książka została usunięta z półki: %(sname)s" -#: cps/shelf.py:179 +#: cps/shelf.py:185 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "" -#: cps/shelf.py:200 cps/shelf.py:224 +#: cps/shelf.py:206 cps/shelf.py:230 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "Półka o nazwie '%(title)s' już istnieje." -#: cps/shelf.py:205 +#: cps/shelf.py:211 #, python-format msgid "Shelf %(title)s created" msgstr "Półka %(title)s została utworzona" -#: cps/shelf.py:207 cps/shelf.py:235 +#: cps/shelf.py:213 cps/shelf.py:241 msgid "There was an error" msgstr "Wystąpił błąd" -#: cps/shelf.py:208 cps/shelf.py:210 +#: cps/shelf.py:214 cps/shelf.py:216 msgid "create a shelf" msgstr "utwórz półkę" -#: cps/shelf.py:233 +#: cps/shelf.py:239 #, python-format msgid "Shelf %(title)s changed" msgstr "Półka %(title)s została zmieniona" -#: cps/shelf.py:236 cps/shelf.py:238 +#: cps/shelf.py:242 cps/shelf.py:244 msgid "Edit a shelf" msgstr "Edytuj półkę" -#: cps/shelf.py:259 -#, python-format -msgid "successfully deleted shelf %(name)s" -msgstr "pomyślnie usunięto półkę %(name)s" - -#: cps/shelf.py:289 +#: cps/shelf.py:295 #, python-format msgid "Shelf: '%(name)s'" msgstr "Półka: '%(name)s'" -#: cps/shelf.py:292 +#: cps/shelf.py:298 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "" -#: cps/shelf.py:324 +#: cps/shelf.py:330 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Zmieniono kolejność półki: '%(name)s'" -#: cps/ub.py:111 +#: cps/ub.py:68 msgid "Recently Added" msgstr "" -#: cps/ub.py:113 +#: cps/ub.py:70 msgid "Show recent books" msgstr "" -#: cps/templates/index.xml:17 cps/ub.py:114 +#: cps/templates/index.xml:17 cps/ub.py:71 msgid "Hot Books" msgstr "Najpopularniejsze książki" -#: cps/ub.py:115 +#: cps/ub.py:72 msgid "Show hot books" msgstr "Pokaż najpopularniejsze książki" -#: cps/templates/index.xml:24 cps/ub.py:118 +#: cps/templates/index.xml:24 cps/ub.py:75 msgid "Best rated Books" msgstr "Najlepiej ocenione książki" -#: cps/ub.py:120 +#: cps/ub.py:77 msgid "Show best rated books" msgstr "Pokaż najlepiej ocenione książki" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:121 -#: cps/web.py:965 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:78 +#: cps/web.py:958 msgid "Read Books" msgstr "Przeczytane książki" -#: cps/ub.py:123 +#: cps/ub.py:80 msgid "Show read and unread" msgstr "Pokaż przeczytane i nieprzeczytane" -#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:125 -#: cps/web.py:969 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:82 +#: cps/web.py:962 msgid "Unread Books" msgstr "Nieprzeczytane książki" -#: cps/ub.py:127 +#: cps/ub.py:84 msgid "Show unread" msgstr "" -#: cps/ub.py:128 +#: cps/ub.py:85 msgid "Discover" msgstr "Odkrywaj" -#: cps/ub.py:130 +#: cps/ub.py:87 msgid "Show random books" msgstr "Pokaż losowe książki" -#: cps/ub.py:131 +#: cps/ub.py:88 msgid "Categories" msgstr "Kategorie" -#: cps/ub.py:133 +#: cps/ub.py:90 msgid "Show category selection" msgstr "Pokaż wybór kategorii" #: cps/templates/book_edit.html:71 cps/templates/search_form.html:53 -#: cps/ub.py:134 +#: cps/ub.py:91 msgid "Series" msgstr "Seria" -#: cps/ub.py:136 +#: cps/ub.py:93 msgid "Show series selection" msgstr "Pokaż wybór serii" -#: cps/templates/index.xml:61 cps/ub.py:137 +#: cps/templates/index.xml:61 cps/ub.py:94 msgid "Authors" msgstr "Autorzy" -#: cps/ub.py:139 +#: cps/ub.py:96 msgid "Show author selection" msgstr "Pokaż wybór autora" -#: cps/templates/index.xml:68 cps/ub.py:141 +#: cps/templates/index.xml:68 cps/ub.py:98 msgid "Publishers" msgstr "" -#: cps/ub.py:143 +#: cps/ub.py:100 msgid "Show publisher selection" msgstr "" -#: cps/templates/search_form.html:74 cps/ub.py:144 +#: cps/templates/search_form.html:74 cps/ub.py:101 msgid "Languages" msgstr "Języki" -#: cps/ub.py:147 +#: cps/ub.py:104 msgid "Show language selection" msgstr "Pokaż wybór języka" -#: cps/ub.py:148 +#: cps/ub.py:105 msgid "Ratings" msgstr "" -#: cps/ub.py:150 +#: cps/ub.py:107 msgid "Show ratings selection" msgstr "" -#: cps/ub.py:151 +#: cps/ub.py:108 msgid "File formats" msgstr "" -#: cps/ub.py:153 +#: cps/ub.py:110 msgid "Show file formats selection" msgstr "" -#: cps/updater.py:257 cps/updater.py:364 cps/updater.py:377 +#: cps/updater.py:253 cps/updater.py:360 cps/updater.py:373 msgid "Unexpected data while reading update information" msgstr "" -#: cps/updater.py:264 cps/updater.py:370 +#: cps/updater.py:260 cps/updater.py:366 msgid "No update available. You already have the latest version installed" msgstr "" -#: cps/updater.py:290 cps/updater.py:422 +#: cps/updater.py:286 msgid "A new update is available. Click on the button below to update to the latest version." msgstr "" -#: cps/updater.py:343 +#: cps/updater.py:339 msgid "Could not fetch update information" msgstr "" -#: cps/updater.py:357 +#: cps/updater.py:353 msgid "No release information available" msgstr "" -#: cps/updater.py:403 cps/updater.py:412 +#: cps/updater.py:406 cps/updater.py:415 #, python-format msgid "A new update is available. Click on the button below to update to version: %(version)s" msgstr "" -#: cps/web.py:457 +#: cps/updater.py:425 +msgid "Click on the button below to update to the latest stable version." +msgstr "" + +#: cps/web.py:445 msgid "Recently Added Books" msgstr "" -#: cps/web.py:484 +#: cps/web.py:473 msgid "Best rated books" msgstr "Najlepiej oceniane książki" -#: cps/templates/index.xml:38 cps/web.py:492 +#: cps/templates/index.xml:38 cps/web.py:481 msgid "Random Books" msgstr "Losowe książki" -#: cps/web.py:516 +#: cps/web.py:505 msgid "Books" msgstr "" -#: cps/web.py:543 +#: cps/web.py:532 msgid "Hot Books (most downloaded)" msgstr "Najpopularniejsze książki (najczęściej pobierane)" -#: cps/web.py:553 cps/web.py:1294 cps/web.py:1383 +#: cps/web.py:542 cps/web.py:1298 cps/web.py:1386 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:" -#: cps/web.py:580 +#: cps/web.py:559 +#, python-format +msgid "Author: %(name)s" +msgstr "" + +#: cps/web.py:571 #, python-format msgid "Publisher: %(name)s" msgstr "" -#: cps/web.py:591 +#: cps/web.py:582 #, python-format msgid "Series: %(serie)s" msgstr "Seria: %(serie)s" -#: cps/web.py:602 +#: cps/web.py:593 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:613 +#: cps/web.py:604 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:625 +#: cps/web.py:616 #, python-format msgid "Category: %(name)s" msgstr "Kategoria: %(name)s" -#: cps/web.py:659 +#: cps/web.py:650 msgid "Publisher list" msgstr "" -#: cps/templates/index.xml:82 cps/web.py:675 +#: cps/templates/index.xml:82 cps/web.py:666 msgid "Series list" msgstr "Lista serii" -#: cps/web.py:689 +#: cps/web.py:680 msgid "Ratings list" msgstr "" -#: cps/web.py:702 +#: cps/web.py:693 msgid "File formats list" msgstr "" -#: cps/web.py:730 +#: cps/web.py:721 msgid "Available languages" msgstr "Dostępne języki" -#: cps/web.py:750 +#: cps/web.py:741 #, python-format msgid "Language: %(name)s" msgstr "Język: %(name)s" -#: cps/templates/index.xml:75 cps/web.py:764 +#: cps/templates/index.xml:75 cps/web.py:755 msgid "Category list" msgstr "Lista kategorii" -#: cps/templates/layout.html:73 cps/web.py:777 +#: cps/templates/layout.html:73 cps/web.py:769 msgid "Tasks" msgstr "" -#: cps/web.py:841 +#: cps/web.py:834 msgid "Published after " msgstr "" -#: cps/web.py:848 +#: cps/web.py:841 msgid "Published before " msgstr "" -#: cps/web.py:862 +#: cps/web.py:855 #, python-format msgid "Rating <= %(rating)s" msgstr "" -#: cps/web.py:864 +#: cps/web.py:857 #, python-format msgid "Rating >= %(rating)s" msgstr "" -#: cps/web.py:924 cps/web.py:933 +#: cps/web.py:917 cps/web.py:926 msgid "search" msgstr "szukaj" -#: cps/web.py:1018 +#: cps/web.py:1012 msgid "Please configure the SMTP mail settings first..." msgstr "Proszę najpierw skonfigurować ustawienia SMTP poczty e-mail..." -#: cps/web.py:1023 +#: cps/web.py:1017 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "" -#: cps/web.py:1027 +#: cps/web.py:1021 #, 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:1046 cps/web.py:1071 cps/web.py:1076 cps/web.py:1081 -#: cps/web.py:1085 +#: cps/web.py:1041 cps/web.py:1066 cps/web.py:1070 cps/web.py:1075 +#: cps/web.py:1079 msgid "register" msgstr "rejestracja" -#: cps/web.py:1073 +#: cps/web.py:1068 msgid "Your e-mail is not allowed to register" msgstr "" -#: cps/web.py:1077 +#: cps/web.py:1071 msgid "Confirmation e-mail was send to your e-mail account." msgstr "" -#: cps/web.py:1080 +#: cps/web.py:1074 msgid "This username or e-mail address is already in use." msgstr "" -#: cps/web.py:1103 cps/web.py:1115 -#, python-format -msgid "You are now logged in as: '%(nickname)s'" +#: cps/web.py:1089 +msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1108 cps/web.py:1120 +#: cps/web.py:1098 cps/web.py:1212 +#, python-format +msgid "you are now logged in as: '%(nickname)s'" +msgstr "Zalogowałeś się jako: '%(nickname)s'" + +#: cps/web.py:1105 cps/web.py:1122 msgid "Wrong Username or Password" msgstr "Błędna nazwa użytkownika lub hasło" -#: cps/web.py:1111 +#: cps/web.py:1108 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "" -#: cps/web.py:1124 cps/web.py:1146 +#: cps/web.py:1117 +#, python-format +msgid "You are now logged in as: '%(nickname)s'" +msgstr "" + +#: cps/web.py:1126 cps/web.py:1148 msgid "login" msgstr "logowanie" -#: cps/web.py:1158 cps/web.py:1189 +#: cps/web.py:1160 cps/web.py:1191 msgid "Token not found" msgstr "" -#: cps/web.py:1166 cps/web.py:1197 +#: cps/web.py:1168 cps/web.py:1199 msgid "Token has expired" msgstr "" -#: cps/web.py:1174 +#: cps/web.py:1176 msgid "Success! Please return to your device" msgstr "" -#: cps/web.py:1210 -#, python-format -msgid "you are now logged in as: '%(nickname)s'" -msgstr "Zalogowałeś się jako: '%(nickname)s'" - -#: cps/web.py:1250 cps/web.py:1277 cps/web.py:1281 +#: cps/web.py:1253 cps/web.py:1280 cps/web.py:1284 #, python-format msgid "%(name)s's profile" msgstr "Profil użytkownika %(name)s" -#: cps/web.py:1274 +#: cps/web.py:1277 msgid "Found an existing account for this e-mail address." msgstr "" -#: cps/web.py:1279 +#: cps/web.py:1282 msgid "Profile updated" msgstr "Zaktualizowano profil" -#: cps/web.py:1304 cps/web.py:1306 cps/web.py:1308 cps/web.py:1314 -#: cps/web.py:1318 +#: cps/web.py:1308 cps/web.py:1310 cps/web.py:1312 cps/web.py:1318 +#: cps/web.py:1322 msgid "Read a Book" msgstr "Czytaj książkę" -#: cps/web.py:1328 +#: cps/web.py:1332 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "" -#: cps/worker.py:308 +#: cps/worker.py:311 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "" -#: cps/worker.py:319 +#: cps/worker.py:322 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "" @@ -1057,53 +1067,57 @@ msgid "Administration" msgstr "Zarządzanie" #: cps/templates/admin.html:109 +msgid "View Logfiles" +msgstr "" + +#: cps/templates/admin.html:110 msgid "Reconnect to Calibre DB" msgstr "Połącz ponownie z bazą danych Calibre" -#: cps/templates/admin.html:110 +#: cps/templates/admin.html:111 msgid "Restart Calibre-Web" msgstr "Uruchom ponownie Calibre Web" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:112 msgid "Stop Calibre-Web" msgstr "Zatrzymaj Calibre Web" -#: cps/templates/admin.html:117 +#: cps/templates/admin.html:118 msgid "Update" msgstr "" -#: cps/templates/admin.html:121 +#: cps/templates/admin.html:122 msgid "Version" msgstr "" -#: cps/templates/admin.html:122 +#: cps/templates/admin.html:123 msgid "Details" msgstr "" -#: cps/templates/admin.html:128 +#: cps/templates/admin.html:129 msgid "Current version" msgstr "" -#: cps/templates/admin.html:134 +#: cps/templates/admin.html:135 msgid "Check for update" msgstr "Sprawdź aktualizacje" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:136 msgid "Perform Update" msgstr "Wykonaj aktualizację" -#: cps/templates/admin.html:147 +#: cps/templates/admin.html:148 msgid "Do you really want to restart Calibre-Web?" msgstr "Na pewno chcesz uruchomić ponownie Calibre Web?" -#: cps/templates/admin.html:152 cps/templates/admin.html:166 -#: cps/templates/admin.html:186 cps/templates/shelf.html:72 +#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:187 cps/templates/shelf.html:72 msgid "Ok" msgstr "OK" -#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:154 cps/templates/admin.html:168 #: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:281 cps/templates/config_view_edit.html:147 +#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:74 #: cps/templates/layout.html:28 cps/templates/shelf.html:73 #: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:12 @@ -1111,11 +1125,11 @@ msgstr "OK" msgid "Back" msgstr "Wróć" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:166 msgid "Do you really want to stop Calibre-Web?" msgstr "Na pewno chcesz zatrzymać Calibre Web?" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:178 msgid "Updating, please do not reload page" msgstr "Aktualizowanie, proszę nie odświeżać strony" @@ -1244,7 +1258,7 @@ msgstr "wyświetl książkę po edycji" msgid "Get metadata" msgstr "Uzyskaj metadane" -#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:279 +#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329 #: cps/templates/config_view_edit.html:146 cps/templates/login.html:20 #: cps/templates/search_form.html:150 cps/templates/shelf_edit.html:17 #: cps/templates/user_edit.html:130 @@ -1389,123 +1403,171 @@ msgstr "Poziom logów" msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "" -#: cps/templates/config_edit.html:140 -msgid "Feature Configuration" +#: cps/templates/config_edit.html:134 +msgid "Enable Access Log" +msgstr "" + +#: cps/templates/config_edit.html:137 +msgid "Location and name of access logfile (access.log for no entry)" msgstr "" #: cps/templates/config_edit.html:148 +msgid "Feature Configuration" +msgstr "" + +#: cps/templates/config_edit.html:156 msgid "Enable uploading" msgstr "Włącz wysyłanie" -#: cps/templates/config_edit.html:152 +#: cps/templates/config_edit.html:160 msgid "Enable anonymous browsing" msgstr "Włącz anonimowe przeglądanie" -#: cps/templates/config_edit.html:156 +#: cps/templates/config_edit.html:164 msgid "Enable public registration" msgstr "Włącz publiczną rejestrację" -#: cps/templates/config_edit.html:160 +#: cps/templates/config_edit.html:168 msgid "Enable remote login (\"magic link\")" msgstr "" -#: cps/templates/config_edit.html:165 +#: cps/templates/config_edit.html:173 msgid "Use" msgstr "" -#: cps/templates/config_edit.html:166 +#: cps/templates/config_edit.html:174 msgid "Obtain an API Key" msgstr "" -#: cps/templates/config_edit.html:170 +#: cps/templates/config_edit.html:178 msgid "Goodreads API Key" msgstr "" -#: cps/templates/config_edit.html:174 +#: cps/templates/config_edit.html:182 msgid "Goodreads API Secret" msgstr "" -#: cps/templates/config_edit.html:181 +#: cps/templates/config_edit.html:189 msgid "Login type" msgstr "" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:191 msgid "Use standard Authentication" msgstr "" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:193 msgid "Use LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:188 +#: cps/templates/config_edit.html:196 msgid "Use GitHub OAuth" msgstr "" -#: cps/templates/config_edit.html:189 +#: cps/templates/config_edit.html:197 msgid "Use Google OAuth" msgstr "" -#: cps/templates/config_edit.html:196 -msgid "LDAP Provider URL" +#: cps/templates/config_edit.html:204 +msgid "LDAP Server Host Name or IP Address" +msgstr "" + +#: cps/templates/config_edit.html:208 +msgid "LDAP Server Port" +msgstr "" + +#: cps/templates/config_edit.html:212 +msgid "LDAP schema (ldap or ldaps)" +msgstr "" + +#: cps/templates/config_edit.html:216 +msgid "LDAP Admin username" +msgstr "" + +#: cps/templates/config_edit.html:220 +msgid "LDAP Admin password" msgstr "" -#: cps/templates/config_edit.html:200 +#: cps/templates/config_edit.html:225 +msgid "LDAP Server use SSL" +msgstr "" + +#: cps/templates/config_edit.html:229 +msgid "LDAP Server use TLS" +msgstr "" + +#: cps/templates/config_edit.html:233 +msgid "LDAP Server Certificate" +msgstr "" + +#: cps/templates/config_edit.html:237 +msgid "LDAP SSL Certificate Path" +msgstr "" + +#: cps/templates/config_edit.html:242 msgid "LDAP Distinguished Name (DN)" msgstr "" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:246 +msgid "LDAP User object filter" +msgstr "" + +#: cps/templates/config_edit.html:251 +msgid "LDAP Server is OpenLDAP?" +msgstr "" + +#: cps/templates/config_edit.html:258 msgid "Obtain GitHub OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:211 +#: cps/templates/config_edit.html:261 msgid "GitHub OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:215 +#: cps/templates/config_edit.html:265 msgid "GitHub OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:221 +#: cps/templates/config_edit.html:271 msgid "Obtain Google OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:224 +#: cps/templates/config_edit.html:274 msgid "Google OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:228 +#: cps/templates/config_edit.html:278 msgid "Google OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:242 +#: cps/templates/config_edit.html:292 msgid "External binaries" msgstr "" -#: cps/templates/config_edit.html:250 +#: cps/templates/config_edit.html:300 msgid "No converter" msgstr "" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:302 msgid "Use Kindlegen" msgstr "" -#: cps/templates/config_edit.html:254 +#: cps/templates/config_edit.html:304 msgid "Use calibre's ebook converter" msgstr "" -#: cps/templates/config_edit.html:258 +#: cps/templates/config_edit.html:308 msgid "E-Book converter settings" msgstr "" -#: cps/templates/config_edit.html:262 +#: cps/templates/config_edit.html:312 msgid "Path to convertertool" msgstr "" -#: cps/templates/config_edit.html:268 +#: cps/templates/config_edit.html:318 msgid "Location of Unrar binary" msgstr "" -#: cps/templates/config_edit.html:284 cps/templates/layout.html:84 +#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 #: cps/templates/login.html:4 msgid "Login" msgstr "Zaloguj się" @@ -1719,7 +1781,7 @@ msgstr "" msgid "Discover (Random Books)" msgstr "Odkrywaj (losowe książki)" -#: cps/templates/index.html:65 +#: cps/templates/index.html:64 msgid "Group by series" msgstr "" @@ -1862,6 +1924,14 @@ msgstr "Zapamiętaj mnie" msgid "Log in with magic link" msgstr "" +#: cps/templates/logviewer.html:5 +msgid "Show Calibre-Web log" +msgstr "" + +#: cps/templates/logviewer.html:8 +msgid "Show access log" +msgstr "" + #: cps/templates/osd.xml:5 msgid "Calibre-Web ebook catalog" msgstr "" @@ -3495,3 +3565,15 @@ msgstr "Ostatnio pobierane" #~ msgid "PDF.js viewer" #~ msgstr "PDF.js viewer" +#~ msgid "Please enter a LDAP provider and a DN" +#~ msgstr "" + +#~ msgid "successfully deleted shelf %(name)s" +#~ msgstr "pomyślnie usunięto półkę %(name)s" + +#~ msgid "LDAP Provider URL" +#~ msgstr "" + +#~ msgid "Register with %s, " +#~ msgstr "" + diff --git a/cps/translations/ru/LC_MESSAGES/messages.mo b/cps/translations/ru/LC_MESSAGES/messages.mo index 0ee14ae4e7b1752513ffaad132599c35b96258df..f36bc84c37ed11f35b29ec238c85eeb5c1576092 100644 GIT binary patch delta 13826 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 Z_un*^?w<`DeJ~@)H2ZC_dGXtO{{zwz)*=7^ delta 22339 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\n" "Language: ru\n" @@ -16,13 +16,13 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.6.0\n" +"Generated-By: Babel 2.7.0\n" -#: cps/about.py:76 +#: cps/about.py:78 msgid "Statistics" msgstr "Статистика" -#: cps/admin.py:97 +#: cps/admin.py:98 msgid "Server restarted, please reload page" msgstr "Сервер перезагружен, пожалуйста, перезагрузите страницу" @@ -30,186 +30,202 @@ msgstr "Сервер перезагружен, пожалуйста, перез msgid "Performing shutdown of server, please close window" msgstr "Производится остановка сервера, пожалуйста, закройте окно" -#: cps/admin.py:120 cps/updater.py:445 +#: cps/admin.py:119 cps/updater.py:448 msgid "Unknown" msgstr "Неизвестно" -#: cps/admin.py:139 +#: cps/admin.py:138 msgid "Admin page" msgstr "Администрирование" -#: cps/admin.py:208 cps/admin.py:486 +#: cps/admin.py:207 cps/admin.py:532 msgid "Calibre-Web configuration updated" msgstr "Конфигурация Calibre-Web обновлена" -#: cps/admin.py:222 cps/templates/admin.html:102 +#: cps/admin.py:220 cps/templates/admin.html:102 msgid "UI Configuration" msgstr "Настройка интерфейса" -#: cps/admin.py:295 +#: cps/admin.py:293 msgid "Import of optional Google Drive requirements missing" msgstr "Импорт дополнительных требований к Google Диску отсутствует" -#: cps/admin.py:298 +#: cps/admin.py:296 msgid "client_secrets.json is missing or not readable" msgstr "client_secrets.json отсутствует или его невозможно прочесть" -#: cps/admin.py:303 cps/admin.py:332 +#: cps/admin.py:301 cps/admin.py:330 msgid "client_secrets.json is not configured for web application" msgstr "client_secrets.json не настроен для веб-приложения" -#: cps/admin.py:335 cps/admin.py:361 cps/admin.py:373 cps/admin.py:398 -#: cps/admin.py:426 cps/admin.py:440 cps/admin.py:463 cps/admin.py:476 -#: cps/admin.py:494 cps/admin.py:501 cps/admin.py:516 -#: cps/templates/admin.html:101 +#: cps/admin.py:333 cps/admin.py:359 cps/admin.py:371 cps/admin.py:396 +#: cps/admin.py:403 cps/admin.py:436 cps/admin.py:460 cps/admin.py:474 +#: cps/admin.py:493 cps/admin.py:510 cps/admin.py:522 cps/admin.py:538 +#: cps/admin.py:545 cps/admin.py:559 cps/templates/admin.html:101 msgid "Basic Configuration" msgstr "Настройки сервера" -#: cps/admin.py:358 +#: cps/admin.py:356 msgid "Keyfile location is not valid, please enter correct path" msgstr "Неверное расположение файла-ключа, введите правильный путь" -#: cps/admin.py:370 +#: cps/admin.py:368 cps/admin.py:433 msgid "Certfile location is not valid, please enter correct path" msgstr "Неверное расположение сертификата, введите правильный путь" -#: cps/admin.py:395 -msgid "Please enter a LDAP provider and a DN" +#: cps/admin.py:393 +msgid "Please enter a LDAP provider, port, DN and user object identifier" msgstr "" -#: cps/admin.py:423 +#: cps/admin.py:400 +msgid "Please enter a LDAP service account and password" +msgstr "" + +#: cps/admin.py:457 msgid "Please enter Github oauth credentials" msgstr "" -#: cps/admin.py:437 +#: cps/admin.py:471 msgid "Please enter Google oauth credentials" msgstr "" -#: cps/admin.py:460 +#: cps/admin.py:490 msgid "Logfile location is not valid, please enter correct path" msgstr "Неверное расположение лог-файла, введите правильный путь" -#: cps/admin.py:498 +#: cps/admin.py:507 +msgid "Access Logfile location is not valid, please enter correct path" +msgstr "" + +#: cps/admin.py:542 msgid "DB location is not valid, please enter correct path" msgstr "Неверное расположение базы данных, введите правильный путь" -#: cps/admin.py:558 cps/web.py:1045 +#: cps/admin.py:602 cps/web.py:1040 msgid "Please fill out all fields!" msgstr "Пожалуйста, заполните все поля!" -#: cps/admin.py:560 cps/admin.py:566 cps/admin.py:582 +#: cps/admin.py:604 cps/admin.py:610 cps/admin.py:626 #: cps/templates/admin.html:35 msgid "Add new user" msgstr "Добавить пользователя" -#: cps/admin.py:564 cps/web.py:1248 +#: cps/admin.py:608 cps/web.py:1251 msgid "E-mail is not from valid domain" msgstr "E-mail не из существующей доменной зоны" -#: cps/admin.py:572 +#: cps/admin.py:616 #, python-format msgid "User '%(user)s' created" msgstr "Пользователь '%(user)s' добавлен" -#: cps/admin.py:576 +#: cps/admin.py:620 msgid "Found an existing account for this e-mail address or nickname." msgstr "Для этого адреса электронной почты или логина уже есть аккаунт." -#: cps/admin.py:607 +#: cps/admin.py:651 #, python-format msgid "Test e-mail successfully send to %(kindlemail)s" msgstr "Тестовое письмо успешно отправлено на %(kindlemail)s" -#: cps/admin.py:610 +#: cps/admin.py:654 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Произошла ошибка при отправке тестового письма на: %(res)s" -#: cps/admin.py:612 cps/web.py:1029 +#: cps/admin.py:656 cps/web.py:1023 msgid "Please configure your kindle e-mail address first..." msgstr "Пожалуйста, сначала настройте e-mail на вашем kindle..." -#: cps/admin.py:614 +#: cps/admin.py:658 msgid "E-mail server settings updated" msgstr "Настройки E-mail сервера обновлены" -#: cps/admin.py:615 +#: cps/admin.py:659 msgid "Edit e-mail server settings" msgstr "Изменить настройки e-mail сервера" -#: cps/admin.py:640 +#: cps/admin.py:687 #, python-format msgid "User '%(nick)s' deleted" msgstr "Пользователь '%(nick)s' удалён" -#: cps/admin.py:711 +#: cps/admin.py:690 +msgid "No admin user remaining, can't delete user" +msgstr "" + +#: cps/admin.py:761 #, python-format msgid "User '%(nick)s' updated" msgstr "Пользователь '%(nick)s' обновлён" -#: cps/admin.py:714 +#: cps/admin.py:764 msgid "An unknown error occured." msgstr "Произошла неизвестная ошибка." -#: cps/admin.py:717 +#: cps/admin.py:767 #, python-format msgid "Edit User %(nick)s" msgstr "Изменить пользователя %(nick)s" -#: cps/admin.py:733 +#: cps/admin.py:783 #, python-format msgid "Password for user %(user)s reset" msgstr "Пароль для пользователя %(user)s сброшен" -#: cps/admin.py:736 cps/web.py:1070 +#: cps/admin.py:786 cps/web.py:1065 msgid "An unknown error occurred. Please try again later." msgstr "Неизвестная ошибка. Попробуйте позже." -#: cps/admin.py:755 +#: cps/admin.py:797 +msgid "Logfile viewer" +msgstr "" + +#: cps/admin.py:832 msgid "Requesting update package" msgstr "Проверка обновлений" -#: cps/admin.py:756 +#: cps/admin.py:833 msgid "Downloading update package" msgstr "Загрузка обновлений" -#: cps/admin.py:757 +#: cps/admin.py:834 msgid "Unzipping update package" msgstr "Распаковка обновлений" -#: cps/admin.py:758 +#: cps/admin.py:835 msgid "Replacing files" msgstr "Замена файлов" -#: cps/admin.py:759 +#: cps/admin.py:836 msgid "Database connections are closed" msgstr "Соеднинения с базой данных закрыты" -#: cps/admin.py:760 +#: cps/admin.py:837 msgid "Stopping server" msgstr "Остановка сервера" -#: cps/admin.py:761 +#: cps/admin.py:838 msgid "Update finished, please press okay and reload page" msgstr "Обновления установлены, нажмите okay и перезагрузите страницу" -#: cps/admin.py:762 cps/admin.py:763 cps/admin.py:764 cps/admin.py:765 +#: cps/admin.py:839 cps/admin.py:840 cps/admin.py:841 cps/admin.py:842 msgid "Update failed:" msgstr "Ошибка обновления:" -#: cps/admin.py:762 cps/updater.py:277 cps/updater.py:456 cps/updater.py:458 +#: cps/admin.py:839 cps/updater.py:273 cps/updater.py:459 cps/updater.py:461 msgid "HTTP Error" msgstr "Ошибка HTTP" -#: cps/admin.py:763 cps/updater.py:279 cps/updater.py:460 +#: cps/admin.py:840 cps/updater.py:275 cps/updater.py:463 msgid "Connection error" msgstr "Ошибка соединения" -#: cps/admin.py:764 cps/updater.py:281 cps/updater.py:462 +#: cps/admin.py:841 cps/updater.py:277 cps/updater.py:465 msgid "Timeout while establishing connection" msgstr "Таймаут при установлении соединения" -#: cps/admin.py:765 cps/updater.py:283 cps/updater.py:464 +#: cps/admin.py:842 cps/updater.py:279 cps/updater.py:467 msgid "General error" msgstr "Общая ошибка" @@ -227,720 +243,714 @@ msgstr "Отсутствуют разрешения на выполнение" msgid "not configured" msgstr "не настроен" -#: cps/editbooks.py:218 cps/editbooks.py:432 +#: cps/editbooks.py:215 cps/editbooks.py:394 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "Ошибка при открытии eBook. Файл не существует или файл недоступен" -#: cps/editbooks.py:246 +#: cps/editbooks.py:243 msgid "edit metadata" msgstr "изменить метаданные" -#: cps/editbooks.py:325 cps/editbooks.py:595 +#: cps/editbooks.py:322 cps/editbooks.py:557 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "Запрещена загрузка файлов с расширением '%(ext)s'" -#: cps/editbooks.py:329 cps/editbooks.py:599 +#: cps/editbooks.py:326 cps/editbooks.py:561 msgid "File to be uploaded must have an extension" msgstr "Загружаемый файл должен иметь расширение" -#: cps/editbooks.py:341 cps/editbooks.py:619 +#: cps/editbooks.py:338 cps/editbooks.py:581 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Ошибка при создании пути %(path)s (Доступ запрещён)." -#: cps/editbooks.py:346 +#: cps/editbooks.py:343 #, python-format msgid "Failed to store file %(file)s." msgstr "Не удалось сохранить файл %(file)s." -#: cps/editbooks.py:363 +#: cps/editbooks.py:360 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Формат файла %(ext)s добавлен в %(book)s" -#: cps/editbooks.py:382 -#, python-format -msgid "Failed to create path for cover %(path)s (Permission denied)." -msgstr "" - -#: cps/editbooks.py:390 -#, python-format -msgid "Failed to store cover-file %(cover)s." -msgstr "" - -#: cps/editbooks.py:393 -msgid "Cover-file is not a valid image file" -msgstr "" - -#: cps/editbooks.py:399 cps/editbooks.py:413 +#: cps/editbooks.py:374 msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" msgstr "" -#: cps/editbooks.py:445 cps/editbooks.py:454 +#: cps/editbooks.py:407 cps/editbooks.py:416 msgid "unknown" msgstr "неизвестно" -#: cps/editbooks.py:486 +#: cps/editbooks.py:448 msgid "Cover is not a jpg file, can't save" msgstr "" -#: cps/editbooks.py:534 +#: cps/editbooks.py:496 #, python-format msgid "%(langname)s is not a valid language" msgstr "%(langname)s не допустимый язык" -#: cps/editbooks.py:565 +#: cps/editbooks.py:527 msgid "Metadata successfully updated" msgstr "Метаданные обновлены" -#: cps/editbooks.py:574 +#: cps/editbooks.py:536 msgid "Error editing book, please check logfile for details" msgstr "Ошибка редактирования книги. Пожалуйста, проверьте лог-файл для дополнительной информации" -#: cps/editbooks.py:624 +#: cps/editbooks.py:586 #, python-format msgid "Failed to store file %(file)s (Permission denied)." msgstr "Ошибка записи файла %(file)s (Доступ запрещён)." -#: cps/editbooks.py:629 +#: cps/editbooks.py:591 #, python-format msgid "Failed to delete file %(file)s (Permission denied)." msgstr "Ошибка удаления файла %(file)s (Доступ запрещён)." -#: cps/editbooks.py:712 +#: cps/editbooks.py:674 #, python-format msgid "File %(file)s uploaded" msgstr "" -#: cps/editbooks.py:741 +#: cps/editbooks.py:703 msgid "Source or destination format for conversion missing" msgstr "Исходный или целевой формат для конвертирования отсутствует" -#: cps/editbooks.py:751 +#: cps/editbooks.py:711 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Книга успешно поставлена в очередь для конвертирования в %(book_format)s" -#: cps/editbooks.py:755 +#: cps/editbooks.py:715 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Произошла ошибка при конвертирования этой книги: %(res)s" -#: cps/gdrive.py:56 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgstr "" -#: cps/gdrive.py:101 +#: cps/gdrive.py:106 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Не удалось проверить домен обратного вызова, пожалуйста, выполните шаги для проверки домена в консоли разработчика Google." -#: cps/helper.py:97 +#: cps/helper.py:94 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "%(format)s форма не найден для книги с id: %(book)d" -#: cps/helper.py:109 +#: cps/helper.py:106 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s не найден на Google Drive: %(fn)s" -#: cps/helper.py:116 cps/helper.py:223 cps/templates/detail.html:41 +#: cps/helper.py:113 cps/helper.py:220 cps/templates/detail.html:41 #: cps/templates/detail.html:45 msgid "Send to Kindle" msgstr "Отправить на Kindle" -#: cps/helper.py:117 cps/helper.py:135 cps/helper.py:225 +#: cps/helper.py:114 cps/helper.py:132 cps/helper.py:222 msgid "This e-mail has been sent via Calibre-Web." msgstr "Это электронное письмо было отправлено через Caliber-Web." -#: cps/helper.py:128 +#: cps/helper.py:125 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s не найден: %(fn)s" -#: cps/helper.py:133 +#: cps/helper.py:130 msgid "Calibre-Web test e-mail" msgstr "Тестовый e-mail для Calibre-Web" -#: cps/helper.py:134 +#: cps/helper.py:131 msgid "Test e-mail" msgstr "Тестовый e-mail" -#: cps/helper.py:150 +#: cps/helper.py:147 msgid "Get Started with Calibre-Web" msgstr "Начать работать с Calibre-Web" -#: cps/helper.py:151 +#: cps/helper.py:148 #, python-format msgid "Registration e-mail for user: %(name)s" msgstr "Регистрационный e-mail для пользователя: %(name)s" -#: cps/helper.py:165 cps/helper.py:167 cps/helper.py:169 cps/helper.py:177 -#: cps/helper.py:179 cps/helper.py:181 +#: cps/helper.py:162 cps/helper.py:164 cps/helper.py:166 cps/helper.py:174 +#: cps/helper.py:176 cps/helper.py:178 #, python-format msgid "Send %(format)s to Kindle" msgstr "" -#: cps/helper.py:185 +#: cps/helper.py:182 #, python-format msgid "Convert %(orig)s to %(format)s and send to Kindle" msgstr "" -#: cps/helper.py:224 +#: cps/helper.py:221 #, python-format msgid "E-mail: %(book)s" msgstr "Эл. почта: %(book)s" -#: cps/helper.py:227 +#: cps/helper.py:224 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "Запрашиваемый файл не может быть прочитан. Возможно не верные разрешения?" -#: cps/helper.py:335 +#: cps/helper.py:331 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Переименовывание заголовка с: '%(src)s' на '%(dest)s' не удалось из-за ошибки: %(error)s" -#: cps/helper.py:345 +#: cps/helper.py:341 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Переименовывание автора с: '%(src)s' на '%(dest)s' не удалось из-за ошибки: %(error)s" -#: cps/helper.py:359 +#: cps/helper.py:355 #, python-format msgid "Rename file in path '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "" -#: cps/helper.py:385 cps/helper.py:395 cps/helper.py:403 +#: cps/helper.py:381 cps/helper.py:391 cps/helper.py:399 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "Файл %(file)s не найден на Google Drive" -#: cps/helper.py:424 +#: cps/helper.py:420 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "Путь книги %(path)s не найден на Google Drive" -#: cps/helper.py:584 +#: cps/helper.py:579 msgid "Error excecuting UnRar" msgstr "Ошибка извлечения UnRar" -#: cps/helper.py:586 +#: cps/helper.py:581 msgid "Unrar binary file not found" msgstr "Unrar двочиный файл не найден" -#: cps/helper.py:614 +#: cps/helper.py:609 msgid "Waiting" msgstr "Ожидание" -#: cps/helper.py:616 +#: cps/helper.py:611 msgid "Failed" msgstr "Неудачно" -#: cps/helper.py:618 +#: cps/helper.py:613 msgid "Started" msgstr "Начало" -#: cps/helper.py:620 +#: cps/helper.py:615 msgid "Finished" msgstr "Закончено" -#: cps/helper.py:622 +#: cps/helper.py:617 msgid "Unknown Status" msgstr "Неизвестный статус" -#: cps/helper.py:627 +#: cps/helper.py:622 msgid "E-mail: " msgstr "E-mail: " -#: cps/helper.py:629 cps/helper.py:633 +#: cps/helper.py:624 cps/helper.py:628 msgid "Convert: " msgstr "Конвертировать:" -#: cps/helper.py:631 +#: cps/helper.py:626 msgid "Upload: " msgstr "Загрузить:" -#: cps/helper.py:635 +#: cps/helper.py:630 msgid "Unknown Task: " msgstr "Неизвестная задача:" -#: cps/oauth_bb.py:87 +#: cps/oauth_bb.py:91 #, python-format -msgid "Register with %s, " +msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:145 +#: cps/oauth_bb.py:149 msgid "Failed to log in with GitHub." msgstr "" -#: cps/oauth_bb.py:150 +#: cps/oauth_bb.py:154 msgid "Failed to fetch user info from GitHub." msgstr "" -#: cps/oauth_bb.py:161 +#: cps/oauth_bb.py:165 msgid "Failed to log in with Google." msgstr "" -#: cps/oauth_bb.py:166 +#: cps/oauth_bb.py:170 msgid "Failed to fetch user info from Google." msgstr "" -#: cps/oauth_bb.py:265 +#: cps/oauth_bb.py:269 #, python-format msgid "Unlink to %(oauth)s success." msgstr "" -#: cps/oauth_bb.py:269 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s failed." msgstr "" -#: cps/oauth_bb.py:272 +#: cps/oauth_bb.py:276 #, python-format msgid "Not linked to %(oauth)s." msgstr "" -#: cps/oauth_bb.py:300 +#: cps/oauth_bb.py:304 msgid "GitHub Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:319 +#: cps/oauth_bb.py:323 msgid "Google Oauth error, please retry later." msgstr "" -#: cps/shelf.py:40 cps/shelf.py:92 +#: cps/shelf.py:46 cps/shelf.py:98 msgid "Invalid shelf specified" msgstr "Указана неверная полка" -#: cps/shelf.py:47 +#: cps/shelf.py:53 #, python-format msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" msgstr "Извините, но вам не разрешено добавлять книгу на полку: %(shelfname)s" -#: cps/shelf.py:55 +#: cps/shelf.py:61 msgid "You are not allowed to edit public shelves" msgstr "Вы не можете редактировать общедоступные полки" -#: cps/shelf.py:64 +#: cps/shelf.py:70 #, python-format msgid "Book is already part of the shelf: %(shelfname)s" msgstr "Книги уже размещены на полке: %(shelfname)s" -#: cps/shelf.py:78 +#: cps/shelf.py:84 #, python-format msgid "Book has been added to shelf: %(sname)s" msgstr "Книга добавлена на книжную полку: %(sname)s" -#: cps/shelf.py:97 +#: cps/shelf.py:103 #, python-format msgid "You are not allowed to add a book to the the shelf: %(name)s" msgstr "Вам не разрешено добавлять книгу на полку: %(name)s" -#: cps/shelf.py:102 +#: cps/shelf.py:108 msgid "User is not allowed to edit public shelves" msgstr "Пользователь не может редактировать общедоступные полки" -#: cps/shelf.py:120 +#: cps/shelf.py:126 #, python-format msgid "Books are already part of the shelf: %(name)s" msgstr "Книги уже размещены на полке: %(name)s" -#: cps/shelf.py:134 +#: cps/shelf.py:140 #, python-format msgid "Books have been added to shelf: %(sname)s" msgstr "Книги добавлены в полку: %(sname)s" -#: cps/shelf.py:136 +#: cps/shelf.py:142 #, python-format msgid "Could not add books to shelf: %(sname)s" msgstr "Не удалось добавить книги на полку: %(sname)s" -#: cps/shelf.py:173 +#: cps/shelf.py:179 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "Книга удалена с полки: %(sname)s" -#: cps/shelf.py:179 +#: cps/shelf.py:185 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "Извините, вы не можете удалить книгу с полки: %(sname)s" -#: cps/shelf.py:200 cps/shelf.py:224 +#: cps/shelf.py:206 cps/shelf.py:230 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "Полка с названием '%(title)s' уже существует." -#: cps/shelf.py:205 +#: cps/shelf.py:211 #, python-format msgid "Shelf %(title)s created" msgstr "Создана полка %(title)s" -#: cps/shelf.py:207 cps/shelf.py:235 +#: cps/shelf.py:213 cps/shelf.py:241 msgid "There was an error" msgstr "Произошла ошибка" -#: cps/shelf.py:208 cps/shelf.py:210 +#: cps/shelf.py:214 cps/shelf.py:216 msgid "create a shelf" msgstr "создать полку" -#: cps/shelf.py:233 +#: cps/shelf.py:239 #, python-format msgid "Shelf %(title)s changed" msgstr "Колка %(title)s изменена" -#: cps/shelf.py:236 cps/shelf.py:238 +#: cps/shelf.py:242 cps/shelf.py:244 msgid "Edit a shelf" msgstr "Изменить полку" -#: cps/shelf.py:259 -#, python-format -msgid "successfully deleted shelf %(name)s" -msgstr "удачно удалена полка %(name)s" - -#: cps/shelf.py:289 +#: cps/shelf.py:295 #, python-format msgid "Shelf: '%(name)s'" msgstr "Полка: '%(name)s'" -#: cps/shelf.py:292 +#: cps/shelf.py:298 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Ошибка открытия Полки. Полка не существует или недоступна" -#: cps/shelf.py:324 +#: cps/shelf.py:330 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Изменить расположение полки '%(name)s'" -#: cps/ub.py:111 +#: cps/ub.py:68 msgid "Recently Added" msgstr "Недавно Добавленные" -#: cps/ub.py:113 +#: cps/ub.py:70 msgid "Show recent books" msgstr "Показывать недавние книги" -#: cps/templates/index.xml:17 cps/ub.py:114 +#: cps/templates/index.xml:17 cps/ub.py:71 msgid "Hot Books" msgstr "Популярные Книги" -#: cps/ub.py:115 +#: cps/ub.py:72 msgid "Show hot books" msgstr "Показывать популярные книги" -#: cps/templates/index.xml:24 cps/ub.py:118 +#: cps/templates/index.xml:24 cps/ub.py:75 msgid "Best rated Books" msgstr "Книги с наилучшим рейтингом" -#: cps/ub.py:120 +#: cps/ub.py:77 msgid "Show best rated books" msgstr "Показывать книги с наивысшим рейтингом" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:121 -#: cps/web.py:965 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:78 +#: cps/web.py:958 msgid "Read Books" msgstr "Прочитанные Книги" -#: cps/ub.py:123 +#: cps/ub.py:80 msgid "Show read and unread" msgstr "Показывать прочитанные и непрочитанные" -#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:125 -#: cps/web.py:969 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:82 +#: cps/web.py:962 msgid "Unread Books" msgstr "Непрочитанные Книги" -#: cps/ub.py:127 +#: cps/ub.py:84 msgid "Show unread" msgstr "" -#: cps/ub.py:128 +#: cps/ub.py:85 msgid "Discover" msgstr "Обзор" -#: cps/ub.py:130 +#: cps/ub.py:87 msgid "Show random books" msgstr "Показывать случайные книги" -#: cps/ub.py:131 +#: cps/ub.py:88 msgid "Categories" msgstr "Категории" -#: cps/ub.py:133 +#: cps/ub.py:90 msgid "Show category selection" msgstr "Показывать выбор категории" #: cps/templates/book_edit.html:71 cps/templates/search_form.html:53 -#: cps/ub.py:134 +#: cps/ub.py:91 msgid "Series" msgstr "Серии" -#: cps/ub.py:136 +#: cps/ub.py:93 msgid "Show series selection" msgstr "Показывать выбор серии" -#: cps/templates/index.xml:61 cps/ub.py:137 +#: cps/templates/index.xml:61 cps/ub.py:94 msgid "Authors" msgstr "Авторы" -#: cps/ub.py:139 +#: cps/ub.py:96 msgid "Show author selection" msgstr "Показывать выбор автора" -#: cps/templates/index.xml:68 cps/ub.py:141 +#: cps/templates/index.xml:68 cps/ub.py:98 msgid "Publishers" msgstr "Издатели" -#: cps/ub.py:143 +#: cps/ub.py:100 msgid "Show publisher selection" msgstr "Показать выбор издателя" -#: cps/templates/search_form.html:74 cps/ub.py:144 +#: cps/templates/search_form.html:74 cps/ub.py:101 msgid "Languages" msgstr "Языки" -#: cps/ub.py:147 +#: cps/ub.py:104 msgid "Show language selection" msgstr "Показывать выбор языка" -#: cps/ub.py:148 +#: cps/ub.py:105 msgid "Ratings" msgstr "" -#: cps/ub.py:150 +#: cps/ub.py:107 msgid "Show ratings selection" msgstr "" -#: cps/ub.py:151 +#: cps/ub.py:108 msgid "File formats" msgstr "" -#: cps/ub.py:153 +#: cps/ub.py:110 msgid "Show file formats selection" msgstr "" -#: cps/updater.py:257 cps/updater.py:364 cps/updater.py:377 +#: cps/updater.py:253 cps/updater.py:360 cps/updater.py:373 msgid "Unexpected data while reading update information" msgstr "Некорректные данные при чтении информации об обновлении" -#: cps/updater.py:264 cps/updater.py:370 +#: cps/updater.py:260 cps/updater.py:366 msgid "No update available. You already have the latest version installed" msgstr "Обновление недоступно. Вы используете самую последнюю версию" -#: cps/updater.py:290 cps/updater.py:422 +#: cps/updater.py:286 msgid "A new update is available. Click on the button below to update to the latest version." msgstr "Доступно обновление. Нажмите на кнопку, что бы обновиться до последней версии." -#: cps/updater.py:343 +#: cps/updater.py:339 msgid "Could not fetch update information" msgstr "Не удалось получить информацию об обновлении" -#: cps/updater.py:357 +#: cps/updater.py:353 msgid "No release information available" msgstr "" -#: cps/updater.py:403 cps/updater.py:412 +#: cps/updater.py:406 cps/updater.py:415 #, python-format msgid "A new update is available. Click on the button below to update to version: %(version)s" msgstr "" -#: cps/web.py:457 +#: cps/updater.py:425 +msgid "Click on the button below to update to the latest stable version." +msgstr "" + +#: cps/web.py:445 msgid "Recently Added Books" msgstr "Недавно Добавленные Книги" -#: cps/web.py:484 +#: cps/web.py:473 msgid "Best rated books" msgstr "Книги с наивысшим рейтингом" -#: cps/templates/index.xml:38 cps/web.py:492 +#: cps/templates/index.xml:38 cps/web.py:481 msgid "Random Books" msgstr "Случайный выбор" -#: cps/web.py:516 +#: cps/web.py:505 msgid "Books" msgstr "" -#: cps/web.py:543 +#: cps/web.py:532 msgid "Hot Books (most downloaded)" msgstr "Популярные книги (часто загружаемые)" -#: cps/web.py:553 cps/web.py:1294 cps/web.py:1383 +#: cps/web.py:542 cps/web.py:1298 cps/web.py:1386 msgid "Error opening eBook. File does not exist or file is not accessible:" msgstr "Невозможно открыть книгу. Файл не существует или недоступен." -#: cps/web.py:580 +#: cps/web.py:559 +#, python-format +msgid "Author: %(name)s" +msgstr "" + +#: cps/web.py:571 #, python-format msgid "Publisher: %(name)s" msgstr "Издатель: %(name)s" -#: cps/web.py:591 +#: cps/web.py:582 #, python-format msgid "Series: %(serie)s" msgstr "Серии: %(serie)s" -#: cps/web.py:602 +#: cps/web.py:593 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:613 +#: cps/web.py:604 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:625 +#: cps/web.py:616 #, python-format msgid "Category: %(name)s" msgstr "Категория: %(name)s" -#: cps/web.py:659 +#: cps/web.py:650 msgid "Publisher list" msgstr "Список издателей" -#: cps/templates/index.xml:82 cps/web.py:675 +#: cps/templates/index.xml:82 cps/web.py:666 msgid "Series list" msgstr "Серии" -#: cps/web.py:689 +#: cps/web.py:680 msgid "Ratings list" msgstr "" -#: cps/web.py:702 +#: cps/web.py:693 msgid "File formats list" msgstr "" -#: cps/web.py:730 +#: cps/web.py:721 msgid "Available languages" msgstr "Доступные языки" -#: cps/web.py:750 +#: cps/web.py:741 #, python-format msgid "Language: %(name)s" msgstr "Язык: %(name)s" -#: cps/templates/index.xml:75 cps/web.py:764 +#: cps/templates/index.xml:75 cps/web.py:755 msgid "Category list" msgstr "Категории" -#: cps/templates/layout.html:73 cps/web.py:777 +#: cps/templates/layout.html:73 cps/web.py:769 msgid "Tasks" msgstr "Задания" -#: cps/web.py:841 +#: cps/web.py:834 msgid "Published after " msgstr "Опубликовано до " -#: cps/web.py:848 +#: cps/web.py:841 msgid "Published before " msgstr "Опубликовано после " -#: cps/web.py:862 +#: cps/web.py:855 #, python-format msgid "Rating <= %(rating)s" msgstr "Рейтинг <= %(rating)s" -#: cps/web.py:864 +#: cps/web.py:857 #, python-format msgid "Rating >= %(rating)s" msgstr "Рейтинг >= %(rating)s" -#: cps/web.py:924 cps/web.py:933 +#: cps/web.py:917 cps/web.py:926 msgid "search" msgstr "поиск" -#: cps/web.py:1018 +#: cps/web.py:1012 msgid "Please configure the SMTP mail settings first..." msgstr "Пожалуйста, сначала сконфигурируйте параметры SMTP" -#: cps/web.py:1023 +#: cps/web.py:1017 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Книга успешно поставлена в очередь для отправки на %(kindlemail)s" -#: cps/web.py:1027 +#: cps/web.py:1021 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "Ошибка при отправке книги: %(res)s" -#: cps/web.py:1046 cps/web.py:1071 cps/web.py:1076 cps/web.py:1081 -#: cps/web.py:1085 +#: cps/web.py:1041 cps/web.py:1066 cps/web.py:1070 cps/web.py:1075 +#: cps/web.py:1079 msgid "register" msgstr "регистрация" -#: cps/web.py:1073 +#: cps/web.py:1068 msgid "Your e-mail is not allowed to register" msgstr "Ваш e-mail не подходит для регистрации" -#: cps/web.py:1077 +#: cps/web.py:1071 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Письмо с подтверждением отправлено вам на e-mail" -#: cps/web.py:1080 +#: cps/web.py:1074 msgid "This username or e-mail address is already in use." msgstr "Этот никнейм или e-mail уже используются" -#: cps/web.py:1103 cps/web.py:1115 -#, python-format -msgid "You are now logged in as: '%(nickname)s'" +#: cps/web.py:1089 +msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1108 cps/web.py:1120 +#: cps/web.py:1098 cps/web.py:1212 +#, python-format +msgid "you are now logged in as: '%(nickname)s'" +msgstr "Вы вошли как пользователь '%(nickname)s'" + +#: cps/web.py:1105 cps/web.py:1122 msgid "Wrong Username or Password" msgstr "Ошибка в имени пользователя или пароле" -#: cps/web.py:1111 +#: cps/web.py:1108 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "" -#: cps/web.py:1124 cps/web.py:1146 +#: cps/web.py:1117 +#, python-format +msgid "You are now logged in as: '%(nickname)s'" +msgstr "" + +#: cps/web.py:1126 cps/web.py:1148 msgid "login" msgstr "войти" -#: cps/web.py:1158 cps/web.py:1189 +#: cps/web.py:1160 cps/web.py:1191 msgid "Token not found" msgstr "Ключ не найден" -#: cps/web.py:1166 cps/web.py:1197 +#: cps/web.py:1168 cps/web.py:1199 msgid "Token has expired" msgstr "Ключ просрочен" -#: cps/web.py:1174 +#: cps/web.py:1176 msgid "Success! Please return to your device" msgstr "Успешно! Пожалуйста, проверьте свое устройство" -#: cps/web.py:1210 -#, python-format -msgid "you are now logged in as: '%(nickname)s'" -msgstr "Вы вошли как пользователь '%(nickname)s'" - -#: cps/web.py:1250 cps/web.py:1277 cps/web.py:1281 +#: cps/web.py:1253 cps/web.py:1280 cps/web.py:1284 #, python-format msgid "%(name)s's profile" msgstr "Профиль %(name)s" -#: cps/web.py:1274 +#: cps/web.py:1277 msgid "Found an existing account for this e-mail address." msgstr "Этот адрес электронной почты уже зарегистрирован." -#: cps/web.py:1279 +#: cps/web.py:1282 msgid "Profile updated" msgstr "Профиль обновлён" -#: cps/web.py:1304 cps/web.py:1306 cps/web.py:1308 cps/web.py:1314 -#: cps/web.py:1318 +#: cps/web.py:1308 cps/web.py:1310 cps/web.py:1312 cps/web.py:1318 +#: cps/web.py:1322 msgid "Read a Book" msgstr "Читать Книгу" -#: cps/web.py:1328 +#: cps/web.py:1332 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "" -#: cps/worker.py:308 +#: cps/worker.py:311 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Ошибка Ebook-конвертора: %(error)s" -#: cps/worker.py:319 +#: cps/worker.py:322 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Kindlegen - неудачно, с Ошибкой %(error)s. Сообщение: %(message)s" @@ -1056,53 +1066,57 @@ msgid "Administration" msgstr "Управление" #: cps/templates/admin.html:109 +msgid "View Logfiles" +msgstr "" + +#: cps/templates/admin.html:110 msgid "Reconnect to Calibre DB" msgstr "Переподключиться к БД Calibre" -#: cps/templates/admin.html:110 +#: cps/templates/admin.html:111 msgid "Restart Calibre-Web" msgstr "Перезагрузить Calibre-Web" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:112 msgid "Stop Calibre-Web" msgstr "Остановить Calibre-Web" -#: cps/templates/admin.html:117 +#: cps/templates/admin.html:118 msgid "Update" msgstr "Обновление" -#: cps/templates/admin.html:121 +#: cps/templates/admin.html:122 msgid "Version" msgstr "Версия" -#: cps/templates/admin.html:122 +#: cps/templates/admin.html:123 msgid "Details" msgstr "Подробности" -#: cps/templates/admin.html:128 +#: cps/templates/admin.html:129 msgid "Current version" msgstr "Текущая версия" -#: cps/templates/admin.html:134 +#: cps/templates/admin.html:135 msgid "Check for update" msgstr "Проверка обновлений" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:136 msgid "Perform Update" msgstr "Установить обновления" -#: cps/templates/admin.html:147 +#: cps/templates/admin.html:148 msgid "Do you really want to restart Calibre-Web?" msgstr "Вы действительно хотите перезагрузить Calibre-Web?" -#: cps/templates/admin.html:152 cps/templates/admin.html:166 -#: cps/templates/admin.html:186 cps/templates/shelf.html:72 +#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:187 cps/templates/shelf.html:72 msgid "Ok" msgstr "Ok" -#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:154 cps/templates/admin.html:168 #: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:281 cps/templates/config_view_edit.html:147 +#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:74 #: cps/templates/layout.html:28 cps/templates/shelf.html:73 #: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:12 @@ -1110,11 +1124,11 @@ msgstr "Ok" msgid "Back" msgstr "Назад" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:166 msgid "Do you really want to stop Calibre-Web?" msgstr "Вы действительно хотите остановить Calibre-Web?" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:178 msgid "Updating, please do not reload page" msgstr "Установка обновлений, пожалуйста, не обновляйте страницу." @@ -1243,7 +1257,7 @@ msgstr "смотреть книгу после редактирования" msgid "Get metadata" msgstr "Получить метаданные" -#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:279 +#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329 #: cps/templates/config_view_edit.html:146 cps/templates/login.html:20 #: cps/templates/search_form.html:150 cps/templates/shelf_edit.html:17 #: cps/templates/user_edit.html:130 @@ -1387,123 +1401,171 @@ msgstr "Уровень Логирования" msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "Расположение и имя лог-файла (не вводите calibre-web.log)" -#: cps/templates/config_edit.html:140 +#: cps/templates/config_edit.html:134 +msgid "Enable Access Log" +msgstr "" + +#: cps/templates/config_edit.html:137 +msgid "Location and name of access logfile (access.log for no entry)" +msgstr "" + +#: cps/templates/config_edit.html:148 msgid "Feature Configuration" msgstr "Дополнительный Настройки" -#: cps/templates/config_edit.html:148 +#: cps/templates/config_edit.html:156 msgid "Enable uploading" msgstr "Разрешить загрузку на сервер" -#: cps/templates/config_edit.html:152 +#: cps/templates/config_edit.html:160 msgid "Enable anonymous browsing" msgstr "Разрешить анонимный просмотр" -#: cps/templates/config_edit.html:156 +#: cps/templates/config_edit.html:164 msgid "Enable public registration" msgstr "Разрешить публичную регистрацию" -#: cps/templates/config_edit.html:160 +#: cps/templates/config_edit.html:168 msgid "Enable remote login (\"magic link\")" msgstr "Включить удаленный логин (\"magic link\")" -#: cps/templates/config_edit.html:165 +#: cps/templates/config_edit.html:173 msgid "Use" msgstr "Использовать" -#: cps/templates/config_edit.html:166 +#: cps/templates/config_edit.html:174 msgid "Obtain an API Key" msgstr "Получить ключ API" -#: cps/templates/config_edit.html:170 +#: cps/templates/config_edit.html:178 msgid "Goodreads API Key" msgstr "Ключ API Goodreads" -#: cps/templates/config_edit.html:174 +#: cps/templates/config_edit.html:182 msgid "Goodreads API Secret" msgstr "Goodreads API Секрет" -#: cps/templates/config_edit.html:181 +#: cps/templates/config_edit.html:189 msgid "Login type" msgstr "" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:191 msgid "Use standard Authentication" msgstr "" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:193 msgid "Use LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:188 +#: cps/templates/config_edit.html:196 msgid "Use GitHub OAuth" msgstr "" -#: cps/templates/config_edit.html:189 +#: cps/templates/config_edit.html:197 msgid "Use Google OAuth" msgstr "" -#: cps/templates/config_edit.html:196 -msgid "LDAP Provider URL" +#: cps/templates/config_edit.html:204 +msgid "LDAP Server Host Name or IP Address" +msgstr "" + +#: cps/templates/config_edit.html:208 +msgid "LDAP Server Port" +msgstr "" + +#: cps/templates/config_edit.html:212 +msgid "LDAP schema (ldap or ldaps)" +msgstr "" + +#: cps/templates/config_edit.html:216 +msgid "LDAP Admin username" +msgstr "" + +#: cps/templates/config_edit.html:220 +msgid "LDAP Admin password" +msgstr "" + +#: cps/templates/config_edit.html:225 +msgid "LDAP Server use SSL" msgstr "" -#: cps/templates/config_edit.html:200 +#: cps/templates/config_edit.html:229 +msgid "LDAP Server use TLS" +msgstr "" + +#: cps/templates/config_edit.html:233 +msgid "LDAP Server Certificate" +msgstr "" + +#: cps/templates/config_edit.html:237 +msgid "LDAP SSL Certificate Path" +msgstr "" + +#: cps/templates/config_edit.html:242 msgid "LDAP Distinguished Name (DN)" msgstr "" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:246 +msgid "LDAP User object filter" +msgstr "" + +#: cps/templates/config_edit.html:251 +msgid "LDAP Server is OpenLDAP?" +msgstr "" + +#: cps/templates/config_edit.html:258 msgid "Obtain GitHub OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:211 +#: cps/templates/config_edit.html:261 msgid "GitHub OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:215 +#: cps/templates/config_edit.html:265 msgid "GitHub OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:221 +#: cps/templates/config_edit.html:271 msgid "Obtain Google OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:224 +#: cps/templates/config_edit.html:274 msgid "Google OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:228 +#: cps/templates/config_edit.html:278 msgid "Google OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:242 +#: cps/templates/config_edit.html:292 msgid "External binaries" msgstr "Внешние двоичные файлы" -#: cps/templates/config_edit.html:250 +#: cps/templates/config_edit.html:300 msgid "No converter" msgstr "Нет конвертера" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:302 msgid "Use Kindlegen" msgstr "Использовать Kindlegen" -#: cps/templates/config_edit.html:254 +#: cps/templates/config_edit.html:304 msgid "Use calibre's ebook converter" msgstr "Использовать конвертер calibre's ebook" -#: cps/templates/config_edit.html:258 +#: cps/templates/config_edit.html:308 msgid "E-Book converter settings" msgstr "Настройки конвертера E-Book" -#: cps/templates/config_edit.html:262 +#: cps/templates/config_edit.html:312 msgid "Path to convertertool" msgstr "Путь к конвертеру" -#: cps/templates/config_edit.html:268 +#: cps/templates/config_edit.html:318 msgid "Location of Unrar binary" msgstr "Расположение двоичного файла Unrar" -#: cps/templates/config_edit.html:284 cps/templates/layout.html:84 +#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 #: cps/templates/login.html:4 msgid "Login" msgstr "Логин" @@ -1717,7 +1779,7 @@ msgstr "" msgid "Discover (Random Books)" msgstr "Обзор (Случайные Книги)" -#: cps/templates/index.html:65 +#: cps/templates/index.html:64 msgid "Group by series" msgstr "" @@ -1860,6 +1922,14 @@ msgstr "Запомнить меня" msgid "Log in with magic link" msgstr "Войти через магическую ссылку" +#: cps/templates/logviewer.html:5 +msgid "Show Calibre-Web log" +msgstr "" + +#: cps/templates/logviewer.html:8 +msgid "Show access log" +msgstr "" + #: cps/templates/osd.xml:5 msgid "Calibre-Web ebook catalog" msgstr "Каталог электронных книг Caliber-Web" @@ -3427,13 +3497,13 @@ msgstr "Недавние скачивания" #~ msgstr "Зазаки" #~ msgid "Failed to create path for cover %(path)s (Permission denied)." -#~ msgstr "Не удалось создать путь для обложки %(path)s (Доступ запрещён)." +#~ msgstr "" #~ msgid "Failed to store cover-file %(cover)s." -#~ msgstr "Не удалось сохранить файл обложки %(cover)s." +#~ msgstr "" #~ msgid "Cover-file is not a valid image file" -#~ msgstr "Файл обложки не соответствует изображению" +#~ msgstr "" #~ msgid "Cover is not a jpg file, can't save" #~ msgstr "Обложка не jpg файл, невозможно сохранить" @@ -3492,3 +3562,15 @@ msgstr "Недавние скачивания" #~ msgid "PDF.js viewer" #~ msgstr "Просмотровщик PDF.js" +#~ msgid "Please enter a LDAP provider and a DN" +#~ msgstr "" + +#~ msgid "successfully deleted shelf %(name)s" +#~ msgstr "удачно удалена полка %(name)s" + +#~ msgid "LDAP Provider URL" +#~ msgstr "" + +#~ msgid "Register with %s, " +#~ msgstr "" + diff --git a/cps/translations/sv/LC_MESSAGES/messages.mo b/cps/translations/sv/LC_MESSAGES/messages.mo index 68378090363c00baad6c5ebd0bc4cdc8252504b0..beecf9cab448c056cea7f10fa800bbf28e698415 100644 GIT binary patch delta 14318 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 Pw=VDBzgXg)8v1_#G*KD} diff --git a/cps/translations/sv/LC_MESSAGES/messages.po b/cps/translations/sv/LC_MESSAGES/messages.po index 7d190a51..cc56d328 100644 --- a/cps/translations/sv/LC_MESSAGES/messages.po +++ b/cps/translations/sv/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2019-05-31 11:20+0200\n" +"POT-Creation-Date: 2019-06-22 19:54+0200\n" "PO-Revision-Date: 2018-11-23 02:57+0100\n" "Last-Translator: Jonatan Nyberg \n" "Language: sv\n" @@ -16,13 +16,13 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.6.0\n" +"Generated-By: Babel 2.7.0\n" -#: cps/about.py:76 +#: cps/about.py:78 msgid "Statistics" msgstr "Statistik" -#: cps/admin.py:97 +#: cps/admin.py:98 msgid "Server restarted, please reload page" msgstr "Server startas om, vänligen uppdatera sidan" @@ -30,186 +30,202 @@ msgstr "Server startas om, vänligen uppdatera sidan" msgid "Performing shutdown of server, please close window" msgstr "Stänger servern, vänligen stäng fönstret" -#: cps/admin.py:120 cps/updater.py:445 +#: cps/admin.py:119 cps/updater.py:448 msgid "Unknown" msgstr "Okänd" -#: cps/admin.py:139 +#: cps/admin.py:138 msgid "Admin page" msgstr "Administrationssida" -#: cps/admin.py:208 cps/admin.py:486 +#: cps/admin.py:207 cps/admin.py:532 msgid "Calibre-Web configuration updated" msgstr "Calibre-Web konfiguration uppdaterad" -#: cps/admin.py:222 cps/templates/admin.html:102 +#: cps/admin.py:220 cps/templates/admin.html:102 msgid "UI Configuration" msgstr "Användargränssnitt konfiguration" -#: cps/admin.py:295 +#: cps/admin.py:293 msgid "Import of optional Google Drive requirements missing" msgstr "Import av valfri Google Drive krav saknas" -#: cps/admin.py:298 +#: cps/admin.py:296 msgid "client_secrets.json is missing or not readable" msgstr "client_secrets.json saknas eller inte kan läsas" -#: cps/admin.py:303 cps/admin.py:332 +#: cps/admin.py:301 cps/admin.py:330 msgid "client_secrets.json is not configured for web application" msgstr "client_secrets.json är inte konfigurerad för webbapplikation" -#: cps/admin.py:335 cps/admin.py:361 cps/admin.py:373 cps/admin.py:398 -#: cps/admin.py:426 cps/admin.py:440 cps/admin.py:463 cps/admin.py:476 -#: cps/admin.py:494 cps/admin.py:501 cps/admin.py:516 -#: cps/templates/admin.html:101 +#: cps/admin.py:333 cps/admin.py:359 cps/admin.py:371 cps/admin.py:396 +#: cps/admin.py:403 cps/admin.py:436 cps/admin.py:460 cps/admin.py:474 +#: cps/admin.py:493 cps/admin.py:510 cps/admin.py:522 cps/admin.py:538 +#: cps/admin.py:545 cps/admin.py:559 cps/templates/admin.html:101 msgid "Basic Configuration" msgstr "Grundläggande konfiguration" -#: cps/admin.py:358 +#: cps/admin.py:356 msgid "Keyfile location is not valid, please enter correct path" msgstr "Platsen för Keyfile är inte giltig, ange rätt sökväg" -#: cps/admin.py:370 +#: cps/admin.py:368 cps/admin.py:433 msgid "Certfile location is not valid, please enter correct path" msgstr "Platsen för Certfile är inte giltig, ange rätt sökväg" -#: cps/admin.py:395 -msgid "Please enter a LDAP provider and a DN" +#: cps/admin.py:393 +msgid "Please enter a LDAP provider, port, DN and user object identifier" msgstr "" -#: cps/admin.py:423 +#: cps/admin.py:400 +msgid "Please enter a LDAP service account and password" +msgstr "" + +#: cps/admin.py:457 msgid "Please enter Github oauth credentials" msgstr "" -#: cps/admin.py:437 +#: cps/admin.py:471 msgid "Please enter Google oauth credentials" msgstr "" -#: cps/admin.py:460 +#: cps/admin.py:490 msgid "Logfile location is not valid, please enter correct path" msgstr "Platsen för Logfile platsen är inte giltig, ange rätt sökväg" -#: cps/admin.py:498 +#: cps/admin.py:507 +msgid "Access Logfile location is not valid, please enter correct path" +msgstr "" + +#: cps/admin.py:542 msgid "DB location is not valid, please enter correct path" msgstr "Platsen för DB är inte giltig, ange rätt sökväg" -#: cps/admin.py:558 cps/web.py:1045 +#: cps/admin.py:602 cps/web.py:1040 msgid "Please fill out all fields!" msgstr "Fyll i alla fält!" -#: cps/admin.py:560 cps/admin.py:566 cps/admin.py:582 +#: cps/admin.py:604 cps/admin.py:610 cps/admin.py:626 #: cps/templates/admin.html:35 msgid "Add new user" msgstr "Lägg till ny användare" -#: cps/admin.py:564 cps/web.py:1248 +#: cps/admin.py:608 cps/web.py:1251 msgid "E-mail is not from valid domain" msgstr "E-posten är inte från giltig domän" -#: cps/admin.py:572 +#: cps/admin.py:616 #, python-format msgid "User '%(user)s' created" msgstr "Användaren '%(user)s' skapad" -#: cps/admin.py:576 +#: cps/admin.py:620 msgid "Found an existing account for this e-mail address or nickname." msgstr "Hittade ett befintligt konto för den här e-postadressen eller smeknamnet." -#: cps/admin.py:607 +#: cps/admin.py:651 #, python-format msgid "Test e-mail successfully send to %(kindlemail)s" msgstr "Test-e-post skicka till %(kindlemail)s" -#: cps/admin.py:610 +#: cps/admin.py:654 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Det gick inte att skicka Testmeddelandet: %(res)s" -#: cps/admin.py:612 cps/web.py:1029 +#: cps/admin.py:656 cps/web.py:1023 msgid "Please configure your kindle e-mail address first..." msgstr "Konfigurera din kindle-e-postadress först..." -#: cps/admin.py:614 +#: cps/admin.py:658 msgid "E-mail server settings updated" msgstr "E-postserverinställningar uppdaterade" -#: cps/admin.py:615 +#: cps/admin.py:659 msgid "Edit e-mail server settings" msgstr "Redigera inställningar för e-postserver" -#: cps/admin.py:640 +#: cps/admin.py:687 #, python-format msgid "User '%(nick)s' deleted" msgstr "Användaren '%(nick)s' borttagen" -#: cps/admin.py:711 +#: cps/admin.py:690 +msgid "No admin user remaining, can't delete user" +msgstr "" + +#: cps/admin.py:761 #, python-format msgid "User '%(nick)s' updated" msgstr "Användaren '%(nick)s' uppdaterad" -#: cps/admin.py:714 +#: cps/admin.py:764 msgid "An unknown error occured." msgstr "Ett okänt fel uppstod." -#: cps/admin.py:717 +#: cps/admin.py:767 #, python-format msgid "Edit User %(nick)s" msgstr "Redigera användaren %(nick)s" -#: cps/admin.py:733 +#: cps/admin.py:783 #, python-format msgid "Password for user %(user)s reset" msgstr "Lösenord för användaren %(user)s återställd" -#: cps/admin.py:736 cps/web.py:1070 +#: cps/admin.py:786 cps/web.py:1065 msgid "An unknown error occurred. Please try again later." msgstr "Ett okänt fel uppstod. Försök igen senare." -#: cps/admin.py:755 +#: cps/admin.py:797 +msgid "Logfile viewer" +msgstr "" + +#: cps/admin.py:832 msgid "Requesting update package" msgstr "Begär uppdateringspaketet" -#: cps/admin.py:756 +#: cps/admin.py:833 msgid "Downloading update package" msgstr "Hämtar uppdateringspaketet" -#: cps/admin.py:757 +#: cps/admin.py:834 msgid "Unzipping update package" msgstr "Packar upp uppdateringspaketet" -#: cps/admin.py:758 +#: cps/admin.py:835 msgid "Replacing files" msgstr "Ersätta filer" -#: cps/admin.py:759 +#: cps/admin.py:836 msgid "Database connections are closed" msgstr "Databasanslutningarna är stängda" -#: cps/admin.py:760 +#: cps/admin.py:837 msgid "Stopping server" msgstr "Stoppar server" -#: cps/admin.py:761 +#: cps/admin.py:838 msgid "Update finished, please press okay and reload page" msgstr "Uppdatering klar, tryck på okej och uppdatera sidan" -#: cps/admin.py:762 cps/admin.py:763 cps/admin.py:764 cps/admin.py:765 +#: cps/admin.py:839 cps/admin.py:840 cps/admin.py:841 cps/admin.py:842 msgid "Update failed:" msgstr "Uppdateringen misslyckades:" -#: cps/admin.py:762 cps/updater.py:277 cps/updater.py:456 cps/updater.py:458 +#: cps/admin.py:839 cps/updater.py:273 cps/updater.py:459 cps/updater.py:461 msgid "HTTP Error" msgstr "HTTP-fel" -#: cps/admin.py:763 cps/updater.py:279 cps/updater.py:460 +#: cps/admin.py:840 cps/updater.py:275 cps/updater.py:463 msgid "Connection error" msgstr "Anslutningsfel" -#: cps/admin.py:764 cps/updater.py:281 cps/updater.py:462 +#: cps/admin.py:841 cps/updater.py:277 cps/updater.py:465 msgid "Timeout while establishing connection" msgstr "Tiden ute när du etablerade anslutning" -#: cps/admin.py:765 cps/updater.py:283 cps/updater.py:464 +#: cps/admin.py:842 cps/updater.py:279 cps/updater.py:467 msgid "General error" msgstr "Allmänt fel" @@ -227,720 +243,714 @@ msgstr "Utförande behörighet saknas" msgid "not configured" msgstr "inte konfigurerad" -#: cps/editbooks.py:218 cps/editbooks.py:432 +#: cps/editbooks.py:215 cps/editbooks.py:394 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "Det gick inte att öppna e-boken. Filen finns inte eller filen är inte tillgänglig" -#: cps/editbooks.py:246 +#: cps/editbooks.py:243 msgid "edit metadata" msgstr "redigera metadata" -#: cps/editbooks.py:325 cps/editbooks.py:595 +#: cps/editbooks.py:322 cps/editbooks.py:557 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "Filändelsen '%(ext)s' får inte laddas upp till den här servern" -#: cps/editbooks.py:329 cps/editbooks.py:599 +#: cps/editbooks.py:326 cps/editbooks.py:561 msgid "File to be uploaded must have an extension" msgstr "Filen som ska laddas upp måste ha en ändelse" -#: cps/editbooks.py:341 cps/editbooks.py:619 +#: cps/editbooks.py:338 cps/editbooks.py:581 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Det gick inte att skapa sökväg %(path)s (behörighet nekad)." -#: cps/editbooks.py:346 +#: cps/editbooks.py:343 #, python-format msgid "Failed to store file %(file)s." msgstr "Det gick inte att lagra filen %(file)s." -#: cps/editbooks.py:363 +#: cps/editbooks.py:360 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Filformatet %(ext)s lades till %(book)s" -#: cps/editbooks.py:382 -#, python-format -msgid "Failed to create path for cover %(path)s (Permission denied)." -msgstr "" - -#: cps/editbooks.py:390 -#, python-format -msgid "Failed to store cover-file %(cover)s." -msgstr "" - -#: cps/editbooks.py:393 -msgid "Cover-file is not a valid image file" -msgstr "" - -#: cps/editbooks.py:399 cps/editbooks.py:413 +#: cps/editbooks.py:374 msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" msgstr "" -#: cps/editbooks.py:445 cps/editbooks.py:454 +#: cps/editbooks.py:407 cps/editbooks.py:416 msgid "unknown" msgstr "okänd" -#: cps/editbooks.py:486 +#: cps/editbooks.py:448 msgid "Cover is not a jpg file, can't save" msgstr "" -#: cps/editbooks.py:534 +#: cps/editbooks.py:496 #, python-format msgid "%(langname)s is not a valid language" msgstr "%(langname)s är inte ett giltigt språk" -#: cps/editbooks.py:565 +#: cps/editbooks.py:527 msgid "Metadata successfully updated" msgstr "Metadata uppdaterades" -#: cps/editbooks.py:574 +#: cps/editbooks.py:536 msgid "Error editing book, please check logfile for details" msgstr "Det gick inte att redigera boken, kontrollera loggfilen för mer information" -#: cps/editbooks.py:624 +#: cps/editbooks.py:586 #, python-format msgid "Failed to store file %(file)s (Permission denied)." msgstr "Det gick inte att lagra filen %(file)s (behörighet nekad)." -#: cps/editbooks.py:629 +#: cps/editbooks.py:591 #, python-format msgid "Failed to delete file %(file)s (Permission denied)." msgstr "Det gick inte att ta bort filen %(file)s (behörighet nekad)." -#: cps/editbooks.py:712 +#: cps/editbooks.py:674 #, python-format msgid "File %(file)s uploaded" msgstr "" -#: cps/editbooks.py:741 +#: cps/editbooks.py:703 msgid "Source or destination format for conversion missing" msgstr "Källa eller målformat för konvertering saknas" -#: cps/editbooks.py:751 +#: cps/editbooks.py:711 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Boken är i kö för konvertering till %(book_format)s" -#: cps/editbooks.py:755 +#: cps/editbooks.py:715 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Det gick inte att konvertera den här boken: %(res)s" -#: cps/gdrive.py:56 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgstr "" -#: cps/gdrive.py:101 +#: cps/gdrive.py:106 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Återuppringningsdomänen är inte verifierad, följ stegen för att verifiera domänen i Google utvecklarkonsol" -#: cps/helper.py:97 +#: cps/helper.py:94 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "%(format)s formatet hittades inte för bok-id: %(book)d" -#: cps/helper.py:109 +#: cps/helper.py:106 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s hittades inte på Google Drive: %(fn)s" -#: cps/helper.py:116 cps/helper.py:223 cps/templates/detail.html:41 +#: cps/helper.py:113 cps/helper.py:220 cps/templates/detail.html:41 #: cps/templates/detail.html:45 msgid "Send to Kindle" msgstr "Skicka till Kindle" -#: cps/helper.py:117 cps/helper.py:135 cps/helper.py:225 +#: cps/helper.py:114 cps/helper.py:132 cps/helper.py:222 msgid "This e-mail has been sent via Calibre-Web." msgstr "Detta e-postmeddelande har skickats via Calibre-Web." -#: cps/helper.py:128 +#: cps/helper.py:125 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s hittades inte: %(fn)s" -#: cps/helper.py:133 +#: cps/helper.py:130 msgid "Calibre-Web test e-mail" msgstr "Calibre-Web test e-post" -#: cps/helper.py:134 +#: cps/helper.py:131 msgid "Test e-mail" msgstr "Test e-post" -#: cps/helper.py:150 +#: cps/helper.py:147 msgid "Get Started with Calibre-Web" msgstr "Kom igång med Calibre-Web" -#: cps/helper.py:151 +#: cps/helper.py:148 #, python-format msgid "Registration e-mail for user: %(name)s" msgstr "Registrera e-post för användare: %(name)s" -#: cps/helper.py:165 cps/helper.py:167 cps/helper.py:169 cps/helper.py:177 -#: cps/helper.py:179 cps/helper.py:181 +#: cps/helper.py:162 cps/helper.py:164 cps/helper.py:166 cps/helper.py:174 +#: cps/helper.py:176 cps/helper.py:178 #, python-format msgid "Send %(format)s to Kindle" msgstr "" -#: cps/helper.py:185 +#: cps/helper.py:182 #, python-format msgid "Convert %(orig)s to %(format)s and send to Kindle" msgstr "" -#: cps/helper.py:224 +#: cps/helper.py:221 #, python-format msgid "E-mail: %(book)s" msgstr "E-post: %(book)s" -#: cps/helper.py:227 +#: cps/helper.py:224 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "Den begärda filen kunde inte läsas. Kanske fel behörigheter?" -#: cps/helper.py:335 +#: cps/helper.py:331 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Byt namn på titel från: \"%(src)s\" till \"%(dest)s\" misslyckades med fel: %(error)s" -#: cps/helper.py:345 +#: cps/helper.py:341 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Byt namn på författare från: \"%(src)s\" till \"%(dest)s\" misslyckades med fel: %(error)s" -#: cps/helper.py:359 +#: cps/helper.py:355 #, python-format msgid "Rename file in path '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "" -#: cps/helper.py:385 cps/helper.py:395 cps/helper.py:403 +#: cps/helper.py:381 cps/helper.py:391 cps/helper.py:399 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "Filen %(file)s hittades inte på Google Drive" -#: cps/helper.py:424 +#: cps/helper.py:420 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "Boksökvägen %(path)s hittades inte på Google Drive" -#: cps/helper.py:584 +#: cps/helper.py:579 msgid "Error excecuting UnRar" msgstr "Fel vid körning av UnRar" -#: cps/helper.py:586 +#: cps/helper.py:581 msgid "Unrar binary file not found" msgstr "Unrar binärfil hittades inte" -#: cps/helper.py:614 +#: cps/helper.py:609 msgid "Waiting" msgstr "Väntar" -#: cps/helper.py:616 +#: cps/helper.py:611 msgid "Failed" msgstr "Misslyckades" -#: cps/helper.py:618 +#: cps/helper.py:613 msgid "Started" msgstr "Startad" -#: cps/helper.py:620 +#: cps/helper.py:615 msgid "Finished" msgstr "Klar" -#: cps/helper.py:622 +#: cps/helper.py:617 msgid "Unknown Status" msgstr "Okänd status" -#: cps/helper.py:627 +#: cps/helper.py:622 msgid "E-mail: " msgstr "E-post: " -#: cps/helper.py:629 cps/helper.py:633 +#: cps/helper.py:624 cps/helper.py:628 msgid "Convert: " msgstr "Konvertera: " -#: cps/helper.py:631 +#: cps/helper.py:626 msgid "Upload: " msgstr "Överför: " -#: cps/helper.py:635 +#: cps/helper.py:630 msgid "Unknown Task: " msgstr "Okänd uppgift: " -#: cps/oauth_bb.py:87 +#: cps/oauth_bb.py:91 #, python-format -msgid "Register with %s, " +msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:145 +#: cps/oauth_bb.py:149 msgid "Failed to log in with GitHub." msgstr "" -#: cps/oauth_bb.py:150 +#: cps/oauth_bb.py:154 msgid "Failed to fetch user info from GitHub." msgstr "" -#: cps/oauth_bb.py:161 +#: cps/oauth_bb.py:165 msgid "Failed to log in with Google." msgstr "" -#: cps/oauth_bb.py:166 +#: cps/oauth_bb.py:170 msgid "Failed to fetch user info from Google." msgstr "" -#: cps/oauth_bb.py:265 +#: cps/oauth_bb.py:269 #, python-format msgid "Unlink to %(oauth)s success." msgstr "" -#: cps/oauth_bb.py:269 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s failed." msgstr "" -#: cps/oauth_bb.py:272 +#: cps/oauth_bb.py:276 #, python-format msgid "Not linked to %(oauth)s." msgstr "" -#: cps/oauth_bb.py:300 +#: cps/oauth_bb.py:304 msgid "GitHub Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:319 +#: cps/oauth_bb.py:323 msgid "Google Oauth error, please retry later." msgstr "" -#: cps/shelf.py:40 cps/shelf.py:92 +#: cps/shelf.py:46 cps/shelf.py:98 msgid "Invalid shelf specified" msgstr "Ogiltig hylla specificerad" -#: cps/shelf.py:47 +#: cps/shelf.py:53 #, python-format msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" msgstr "" -#: cps/shelf.py:55 +#: cps/shelf.py:61 msgid "You are not allowed to edit public shelves" msgstr "Du får inte redigera offentliga hyllor" -#: cps/shelf.py:64 +#: cps/shelf.py:70 #, python-format msgid "Book is already part of the shelf: %(shelfname)s" msgstr "Boken är redan en del av hyllan: %(shelfname)s" -#: cps/shelf.py:78 +#: cps/shelf.py:84 #, python-format msgid "Book has been added to shelf: %(sname)s" msgstr "Boken har lagts till i hyllan: %(sname)s" -#: cps/shelf.py:97 +#: cps/shelf.py:103 #, python-format msgid "You are not allowed to add a book to the the shelf: %(name)s" msgstr "Du får inte lägga till en bok i hyllan: %(name)s" -#: cps/shelf.py:102 +#: cps/shelf.py:108 msgid "User is not allowed to edit public shelves" msgstr "Användaren får inte redigera publika hyllor" -#: cps/shelf.py:120 +#: cps/shelf.py:126 #, python-format msgid "Books are already part of the shelf: %(name)s" msgstr "Böcker är redan en del av hyllan: %(name)s" -#: cps/shelf.py:134 +#: cps/shelf.py:140 #, python-format msgid "Books have been added to shelf: %(sname)s" msgstr "Böcker har lagts till hyllan: %(sname)s" -#: cps/shelf.py:136 +#: cps/shelf.py:142 #, python-format msgid "Could not add books to shelf: %(sname)s" msgstr "Kunde inte lägga till böcker till hyllan: %(sname)s" -#: cps/shelf.py:173 +#: cps/shelf.py:179 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "Boken har tagits bort från hyllan: %(sname)s" -#: cps/shelf.py:179 +#: cps/shelf.py:185 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "Tyvärr har du inte rätt att ta bort en bok från den här hyllan: %(sname)s" -#: cps/shelf.py:200 cps/shelf.py:224 +#: cps/shelf.py:206 cps/shelf.py:230 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "En hylla med namnet '%(title)s' finns redan." -#: cps/shelf.py:205 +#: cps/shelf.py:211 #, python-format msgid "Shelf %(title)s created" msgstr "Hyllan %(title)s skapad" -#: cps/shelf.py:207 cps/shelf.py:235 +#: cps/shelf.py:213 cps/shelf.py:241 msgid "There was an error" msgstr "Det fanns ett fel" -#: cps/shelf.py:208 cps/shelf.py:210 +#: cps/shelf.py:214 cps/shelf.py:216 msgid "create a shelf" msgstr "skapa en hylla" -#: cps/shelf.py:233 +#: cps/shelf.py:239 #, python-format msgid "Shelf %(title)s changed" msgstr "Hyllan %(title)s ändrad" -#: cps/shelf.py:236 cps/shelf.py:238 +#: cps/shelf.py:242 cps/shelf.py:244 msgid "Edit a shelf" msgstr "Redigera en hylla" -#: cps/shelf.py:259 -#, python-format -msgid "successfully deleted shelf %(name)s" -msgstr "tog bort hyllan %(name)s" - -#: cps/shelf.py:289 +#: cps/shelf.py:295 #, python-format msgid "Shelf: '%(name)s'" msgstr "Hylla: '%(name)s'" -#: cps/shelf.py:292 +#: cps/shelf.py:298 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Fel vid öppning av hyllan. Hylla finns inte eller är inte tillgänglig" -#: cps/shelf.py:324 +#: cps/shelf.py:330 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Ändra ordning på hyllan: '%(name)s'" -#: cps/ub.py:111 +#: cps/ub.py:68 msgid "Recently Added" msgstr "Nyligen tillagda" -#: cps/ub.py:113 +#: cps/ub.py:70 msgid "Show recent books" msgstr "Visa senaste böcker" -#: cps/templates/index.xml:17 cps/ub.py:114 +#: cps/templates/index.xml:17 cps/ub.py:71 msgid "Hot Books" msgstr "Heta böcker" -#: cps/ub.py:115 +#: cps/ub.py:72 msgid "Show hot books" msgstr "Visa heta böcker" -#: cps/templates/index.xml:24 cps/ub.py:118 +#: cps/templates/index.xml:24 cps/ub.py:75 msgid "Best rated Books" msgstr "Bäst rankade böcker" -#: cps/ub.py:120 +#: cps/ub.py:77 msgid "Show best rated books" msgstr "Visa böcker med bästa betyg" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:121 -#: cps/web.py:965 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:78 +#: cps/web.py:958 msgid "Read Books" msgstr "Lästa böcker" -#: cps/ub.py:123 +#: cps/ub.py:80 msgid "Show read and unread" msgstr "Visa lästa och olästa" -#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:125 -#: cps/web.py:969 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:82 +#: cps/web.py:962 msgid "Unread Books" msgstr "Olästa böcker" -#: cps/ub.py:127 +#: cps/ub.py:84 msgid "Show unread" msgstr "" -#: cps/ub.py:128 +#: cps/ub.py:85 msgid "Discover" msgstr "Upptäck" -#: cps/ub.py:130 +#: cps/ub.py:87 msgid "Show random books" msgstr "Visa slumpmässiga böcker" -#: cps/ub.py:131 +#: cps/ub.py:88 msgid "Categories" msgstr "Kategorier" -#: cps/ub.py:133 +#: cps/ub.py:90 msgid "Show category selection" msgstr "Visa kategorival" #: cps/templates/book_edit.html:71 cps/templates/search_form.html:53 -#: cps/ub.py:134 +#: cps/ub.py:91 msgid "Series" msgstr "Serier" -#: cps/ub.py:136 +#: cps/ub.py:93 msgid "Show series selection" msgstr "Visa serieval" -#: cps/templates/index.xml:61 cps/ub.py:137 +#: cps/templates/index.xml:61 cps/ub.py:94 msgid "Authors" msgstr "Författare" -#: cps/ub.py:139 +#: cps/ub.py:96 msgid "Show author selection" msgstr "Visa författarval" -#: cps/templates/index.xml:68 cps/ub.py:141 +#: cps/templates/index.xml:68 cps/ub.py:98 msgid "Publishers" msgstr "Förlag" -#: cps/ub.py:143 +#: cps/ub.py:100 msgid "Show publisher selection" msgstr "Visa urval av förlag" -#: cps/templates/search_form.html:74 cps/ub.py:144 +#: cps/templates/search_form.html:74 cps/ub.py:101 msgid "Languages" msgstr "Språk" -#: cps/ub.py:147 +#: cps/ub.py:104 msgid "Show language selection" msgstr "Visa språkval" -#: cps/ub.py:148 +#: cps/ub.py:105 msgid "Ratings" msgstr "" -#: cps/ub.py:150 +#: cps/ub.py:107 msgid "Show ratings selection" msgstr "" -#: cps/ub.py:151 +#: cps/ub.py:108 msgid "File formats" msgstr "" -#: cps/ub.py:153 +#: cps/ub.py:110 msgid "Show file formats selection" msgstr "" -#: cps/updater.py:257 cps/updater.py:364 cps/updater.py:377 +#: cps/updater.py:253 cps/updater.py:360 cps/updater.py:373 msgid "Unexpected data while reading update information" msgstr "Oväntade data vid läsning av uppdateringsinformation" -#: cps/updater.py:264 cps/updater.py:370 +#: cps/updater.py:260 cps/updater.py:366 msgid "No update available. You already have the latest version installed" msgstr "Ingen uppdatering tillgänglig. Du har redan den senaste versionen installerad" -#: cps/updater.py:290 cps/updater.py:422 +#: cps/updater.py:286 msgid "A new update is available. Click on the button below to update to the latest version." msgstr "En ny uppdatering är tillgänglig. Klicka på knappen nedan för att uppdatera till den senaste versionen." -#: cps/updater.py:343 +#: cps/updater.py:339 msgid "Could not fetch update information" msgstr "Kunde inte hämta uppdateringsinformation" -#: cps/updater.py:357 +#: cps/updater.py:353 msgid "No release information available" msgstr "" -#: cps/updater.py:403 cps/updater.py:412 +#: cps/updater.py:406 cps/updater.py:415 #, python-format msgid "A new update is available. Click on the button below to update to version: %(version)s" msgstr "" -#: cps/web.py:457 +#: cps/updater.py:425 +msgid "Click on the button below to update to the latest stable version." +msgstr "" + +#: cps/web.py:445 msgid "Recently Added Books" msgstr "Nyligen tillagda böcker" -#: cps/web.py:484 +#: cps/web.py:473 msgid "Best rated books" msgstr "Bäst rankade böcker" -#: cps/templates/index.xml:38 cps/web.py:492 +#: cps/templates/index.xml:38 cps/web.py:481 msgid "Random Books" msgstr "Slumpmässiga böcker" -#: cps/web.py:516 +#: cps/web.py:505 msgid "Books" msgstr "" -#: cps/web.py:543 +#: cps/web.py:532 msgid "Hot Books (most downloaded)" msgstr "Heta böcker (mest hämtade)" -#: cps/web.py:553 cps/web.py:1294 cps/web.py:1383 +#: cps/web.py:542 cps/web.py:1298 cps/web.py:1386 msgid "Error opening eBook. File does not exist or file is not accessible:" msgstr "Fel vid öppnande av e-bok. Filen finns inte eller filen är inte tillgänglig:" -#: cps/web.py:580 +#: cps/web.py:559 +#, python-format +msgid "Author: %(name)s" +msgstr "" + +#: cps/web.py:571 #, python-format msgid "Publisher: %(name)s" msgstr "Förlag: %(name)s" -#: cps/web.py:591 +#: cps/web.py:582 #, python-format msgid "Series: %(serie)s" msgstr "Serier: %(serie)s" -#: cps/web.py:602 +#: cps/web.py:593 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:613 +#: cps/web.py:604 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:625 +#: cps/web.py:616 #, python-format msgid "Category: %(name)s" msgstr "Kategori: %(name)s" -#: cps/web.py:659 +#: cps/web.py:650 msgid "Publisher list" msgstr "Lista över förlag" -#: cps/templates/index.xml:82 cps/web.py:675 +#: cps/templates/index.xml:82 cps/web.py:666 msgid "Series list" msgstr "Serielista" -#: cps/web.py:689 +#: cps/web.py:680 msgid "Ratings list" msgstr "" -#: cps/web.py:702 +#: cps/web.py:693 msgid "File formats list" msgstr "" -#: cps/web.py:730 +#: cps/web.py:721 msgid "Available languages" msgstr "Tillgängliga språk" -#: cps/web.py:750 +#: cps/web.py:741 #, python-format msgid "Language: %(name)s" msgstr "Språk: %(name)s" -#: cps/templates/index.xml:75 cps/web.py:764 +#: cps/templates/index.xml:75 cps/web.py:755 msgid "Category list" msgstr "Kategorilista" -#: cps/templates/layout.html:73 cps/web.py:777 +#: cps/templates/layout.html:73 cps/web.py:769 msgid "Tasks" msgstr "Uppgifter" -#: cps/web.py:841 +#: cps/web.py:834 msgid "Published after " msgstr "Publicerad efter " -#: cps/web.py:848 +#: cps/web.py:841 msgid "Published before " msgstr "Publicerad före " -#: cps/web.py:862 +#: cps/web.py:855 #, python-format msgid "Rating <= %(rating)s" msgstr "Betyg <= %(rating)s" -#: cps/web.py:864 +#: cps/web.py:857 #, python-format msgid "Rating >= %(rating)s" msgstr "Betyg >= %(rating)s" -#: cps/web.py:924 cps/web.py:933 +#: cps/web.py:917 cps/web.py:926 msgid "search" msgstr "sök" -#: cps/web.py:1018 +#: cps/web.py:1012 msgid "Please configure the SMTP mail settings first..." msgstr "Konfigurera SMTP-postinställningarna först..." -#: cps/web.py:1023 +#: cps/web.py:1017 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Boken är i kö för att skicka till %(kindlemail)s" -#: cps/web.py:1027 +#: cps/web.py:1021 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "Det gick inte att skicka den här boken: %(res)s" -#: cps/web.py:1046 cps/web.py:1071 cps/web.py:1076 cps/web.py:1081 -#: cps/web.py:1085 +#: cps/web.py:1041 cps/web.py:1066 cps/web.py:1070 cps/web.py:1075 +#: cps/web.py:1079 msgid "register" msgstr "registrera" -#: cps/web.py:1073 +#: cps/web.py:1068 msgid "Your e-mail is not allowed to register" msgstr "Din e-post är inte tillåten att registrera" -#: cps/web.py:1077 +#: cps/web.py:1071 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Bekräftelsemail skickades till ditt e-postkonto." -#: cps/web.py:1080 +#: cps/web.py:1074 msgid "This username or e-mail address is already in use." msgstr "Det här användarnamnet eller e-postadressen är redan i bruk." -#: cps/web.py:1103 cps/web.py:1115 -#, python-format -msgid "You are now logged in as: '%(nickname)s'" +#: cps/web.py:1089 +msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1108 cps/web.py:1120 +#: cps/web.py:1098 cps/web.py:1212 +#, python-format +msgid "you are now logged in as: '%(nickname)s'" +msgstr "du är nu inloggad som: \"%(nickname)s\"" + +#: cps/web.py:1105 cps/web.py:1122 msgid "Wrong Username or Password" msgstr "Fel användarnamn eller lösenord" -#: cps/web.py:1111 +#: cps/web.py:1108 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "" -#: cps/web.py:1124 cps/web.py:1146 +#: cps/web.py:1117 +#, python-format +msgid "You are now logged in as: '%(nickname)s'" +msgstr "" + +#: cps/web.py:1126 cps/web.py:1148 msgid "login" msgstr "logga in" -#: cps/web.py:1158 cps/web.py:1189 +#: cps/web.py:1160 cps/web.py:1191 msgid "Token not found" msgstr "Token hittades inte" -#: cps/web.py:1166 cps/web.py:1197 +#: cps/web.py:1168 cps/web.py:1199 msgid "Token has expired" msgstr "Token har löpt ut" -#: cps/web.py:1174 +#: cps/web.py:1176 msgid "Success! Please return to your device" msgstr "Lyckades! Vänligen återvänd till din enhet" -#: cps/web.py:1210 -#, python-format -msgid "you are now logged in as: '%(nickname)s'" -msgstr "du är nu inloggad som: \"%(nickname)s\"" - -#: cps/web.py:1250 cps/web.py:1277 cps/web.py:1281 +#: cps/web.py:1253 cps/web.py:1280 cps/web.py:1284 #, python-format msgid "%(name)s's profile" msgstr "%(name)ss profil" -#: cps/web.py:1274 +#: cps/web.py:1277 msgid "Found an existing account for this e-mail address." msgstr "Hittade ett befintligt konto för den här e-postadressen." -#: cps/web.py:1279 +#: cps/web.py:1282 msgid "Profile updated" msgstr "Profilen uppdaterad" -#: cps/web.py:1304 cps/web.py:1306 cps/web.py:1308 cps/web.py:1314 -#: cps/web.py:1318 +#: cps/web.py:1308 cps/web.py:1310 cps/web.py:1312 cps/web.py:1318 +#: cps/web.py:1322 msgid "Read a Book" msgstr "Läs en bok" -#: cps/web.py:1328 +#: cps/web.py:1332 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "" -#: cps/worker.py:308 +#: cps/worker.py:311 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "E-bokkonverteraren misslyckades: %(error)s" -#: cps/worker.py:319 +#: cps/worker.py:322 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Kindlegen misslyckades med fel %(error)s. Meddelande: %(message)s" @@ -1056,53 +1066,57 @@ msgid "Administration" msgstr "Administration" #: cps/templates/admin.html:109 +msgid "View Logfiles" +msgstr "" + +#: cps/templates/admin.html:110 msgid "Reconnect to Calibre DB" msgstr "Anslut till Calibre DB igen" -#: cps/templates/admin.html:110 +#: cps/templates/admin.html:111 msgid "Restart Calibre-Web" msgstr "Starta om Calibre-Web" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:112 msgid "Stop Calibre-Web" msgstr "Stoppa Calibre-Web" -#: cps/templates/admin.html:117 +#: cps/templates/admin.html:118 msgid "Update" msgstr "Uppdatera" -#: cps/templates/admin.html:121 +#: cps/templates/admin.html:122 msgid "Version" msgstr "Version" -#: cps/templates/admin.html:122 +#: cps/templates/admin.html:123 msgid "Details" msgstr "Detaljer" -#: cps/templates/admin.html:128 +#: cps/templates/admin.html:129 msgid "Current version" msgstr "Aktuell version" -#: cps/templates/admin.html:134 +#: cps/templates/admin.html:135 msgid "Check for update" msgstr "Sök efter uppdatering" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:136 msgid "Perform Update" msgstr "Utför uppdatering" -#: cps/templates/admin.html:147 +#: cps/templates/admin.html:148 msgid "Do you really want to restart Calibre-Web?" msgstr "Är du säker på att du vill starta om Calibre-Web?" -#: cps/templates/admin.html:152 cps/templates/admin.html:166 -#: cps/templates/admin.html:186 cps/templates/shelf.html:72 +#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:187 cps/templates/shelf.html:72 msgid "Ok" msgstr "Ok" -#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:154 cps/templates/admin.html:168 #: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:281 cps/templates/config_view_edit.html:147 +#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:74 #: cps/templates/layout.html:28 cps/templates/shelf.html:73 #: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:12 @@ -1110,11 +1124,11 @@ msgstr "Ok" msgid "Back" msgstr "Tillbaka" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:166 msgid "Do you really want to stop Calibre-Web?" msgstr "Är du säker på att du vill stoppa Calibre-Web?" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:178 msgid "Updating, please do not reload page" msgstr "Uppdaterar, vänligen uppdatera inte sidan" @@ -1243,7 +1257,7 @@ msgstr "visa bok efter redigering" msgid "Get metadata" msgstr "Hämta metadata" -#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:279 +#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329 #: cps/templates/config_view_edit.html:146 cps/templates/login.html:20 #: cps/templates/search_form.html:150 cps/templates/shelf_edit.html:17 #: cps/templates/user_edit.html:130 @@ -1387,123 +1401,171 @@ msgstr "Loggnivå" msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "Plats och namn på loggfilen (calibre-web.log för ingen post)" -#: cps/templates/config_edit.html:140 +#: cps/templates/config_edit.html:134 +msgid "Enable Access Log" +msgstr "" + +#: cps/templates/config_edit.html:137 +msgid "Location and name of access logfile (access.log for no entry)" +msgstr "" + +#: cps/templates/config_edit.html:148 msgid "Feature Configuration" msgstr "Funktion konfiguration" -#: cps/templates/config_edit.html:148 +#: cps/templates/config_edit.html:156 msgid "Enable uploading" msgstr "Aktivera uppladdning" -#: cps/templates/config_edit.html:152 +#: cps/templates/config_edit.html:160 msgid "Enable anonymous browsing" msgstr "Aktivera anonym surfning" -#: cps/templates/config_edit.html:156 +#: cps/templates/config_edit.html:164 msgid "Enable public registration" msgstr "Aktivera offentlig registrering" -#: cps/templates/config_edit.html:160 +#: cps/templates/config_edit.html:168 msgid "Enable remote login (\"magic link\")" msgstr "Aktivera fjärrinloggning (\"magic link\")" -#: cps/templates/config_edit.html:165 +#: cps/templates/config_edit.html:173 msgid "Use" msgstr "Använd" -#: cps/templates/config_edit.html:166 +#: cps/templates/config_edit.html:174 msgid "Obtain an API Key" msgstr "Hämta en API-nyckel" -#: cps/templates/config_edit.html:170 +#: cps/templates/config_edit.html:178 msgid "Goodreads API Key" msgstr "Goodreads API-nyckel" -#: cps/templates/config_edit.html:174 +#: cps/templates/config_edit.html:182 msgid "Goodreads API Secret" msgstr "Goodreads API-hemlighet" -#: cps/templates/config_edit.html:181 +#: cps/templates/config_edit.html:189 msgid "Login type" msgstr "" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:191 msgid "Use standard Authentication" msgstr "" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:193 msgid "Use LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:188 +#: cps/templates/config_edit.html:196 msgid "Use GitHub OAuth" msgstr "" -#: cps/templates/config_edit.html:189 +#: cps/templates/config_edit.html:197 msgid "Use Google OAuth" msgstr "" -#: cps/templates/config_edit.html:196 -msgid "LDAP Provider URL" +#: cps/templates/config_edit.html:204 +msgid "LDAP Server Host Name or IP Address" +msgstr "" + +#: cps/templates/config_edit.html:208 +msgid "LDAP Server Port" +msgstr "" + +#: cps/templates/config_edit.html:212 +msgid "LDAP schema (ldap or ldaps)" +msgstr "" + +#: cps/templates/config_edit.html:216 +msgid "LDAP Admin username" +msgstr "" + +#: cps/templates/config_edit.html:220 +msgid "LDAP Admin password" +msgstr "" + +#: cps/templates/config_edit.html:225 +msgid "LDAP Server use SSL" msgstr "" -#: cps/templates/config_edit.html:200 +#: cps/templates/config_edit.html:229 +msgid "LDAP Server use TLS" +msgstr "" + +#: cps/templates/config_edit.html:233 +msgid "LDAP Server Certificate" +msgstr "" + +#: cps/templates/config_edit.html:237 +msgid "LDAP SSL Certificate Path" +msgstr "" + +#: cps/templates/config_edit.html:242 msgid "LDAP Distinguished Name (DN)" msgstr "" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:246 +msgid "LDAP User object filter" +msgstr "" + +#: cps/templates/config_edit.html:251 +msgid "LDAP Server is OpenLDAP?" +msgstr "" + +#: cps/templates/config_edit.html:258 msgid "Obtain GitHub OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:211 +#: cps/templates/config_edit.html:261 msgid "GitHub OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:215 +#: cps/templates/config_edit.html:265 msgid "GitHub OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:221 +#: cps/templates/config_edit.html:271 msgid "Obtain Google OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:224 +#: cps/templates/config_edit.html:274 msgid "Google OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:228 +#: cps/templates/config_edit.html:278 msgid "Google OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:242 +#: cps/templates/config_edit.html:292 msgid "External binaries" msgstr "Externa binärer" -#: cps/templates/config_edit.html:250 +#: cps/templates/config_edit.html:300 msgid "No converter" msgstr "Ingen konverterare" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:302 msgid "Use Kindlegen" msgstr "Använd Kindlegen" -#: cps/templates/config_edit.html:254 +#: cps/templates/config_edit.html:304 msgid "Use calibre's ebook converter" msgstr "Använd calibres e-bokkonverterare" -#: cps/templates/config_edit.html:258 +#: cps/templates/config_edit.html:308 msgid "E-Book converter settings" msgstr "Inställningar för e-bokkonverteraren" -#: cps/templates/config_edit.html:262 +#: cps/templates/config_edit.html:312 msgid "Path to convertertool" msgstr "Sökväg till convertertool" -#: cps/templates/config_edit.html:268 +#: cps/templates/config_edit.html:318 msgid "Location of Unrar binary" msgstr "Plats för Unrar-binär" -#: cps/templates/config_edit.html:284 cps/templates/layout.html:84 +#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 #: cps/templates/login.html:4 msgid "Login" msgstr "Logga in" @@ -1717,7 +1779,7 @@ msgstr "Tillbaka till hemmet" msgid "Discover (Random Books)" msgstr "Upptäck (slumpmässiga böcker)" -#: cps/templates/index.html:65 +#: cps/templates/index.html:64 msgid "Group by series" msgstr "" @@ -1860,6 +1922,14 @@ msgstr "Kom ihåg mig" msgid "Log in with magic link" msgstr "Logga in med magic link" +#: cps/templates/logviewer.html:5 +msgid "Show Calibre-Web log" +msgstr "" + +#: cps/templates/logviewer.html:8 +msgid "Show access log" +msgstr "" + #: cps/templates/osd.xml:5 msgid "Calibre-Web ebook catalog" msgstr "Calibre-Web e-bokkatalog" @@ -2227,13 +2297,13 @@ msgstr "Senaste hämtningar" #~ msgstr "" #~ msgid "Failed to create path for cover %(path)s (Permission denied)." -#~ msgstr "Det gick inte att skapa sökväg för omslag %(path)s (behörighet nekad)." +#~ msgstr "" #~ msgid "Failed to store cover-file %(cover)s." -#~ msgstr "Det gick inte att lagra omslagsfilen %(cover)s." +#~ msgstr "" #~ msgid "Cover-file is not a valid image file" -#~ msgstr "Omslagsfilen är inte en giltig bildfil" +#~ msgstr "" #~ msgid "Cover is not a jpg file, can't save" #~ msgstr "Omslag är inte en jpg-fil, kan inte spara" @@ -2292,3 +2362,15 @@ msgstr "Senaste hämtningar" #~ msgid "PDF.js viewer" #~ msgstr "PDF.js visare" +#~ msgid "Please enter a LDAP provider and a DN" +#~ msgstr "" + +#~ msgid "successfully deleted shelf %(name)s" +#~ msgstr "tog bort hyllan %(name)s" + +#~ msgid "LDAP Provider URL" +#~ msgstr "" + +#~ msgid "Register with %s, " +#~ msgstr "" + diff --git a/cps/translations/uk/LC_MESSAGES/messages.mo b/cps/translations/uk/LC_MESSAGES/messages.mo index 2104efe900984b49a24a3d95c2d2daa7d9799f71..46176c455ece878869319afbe98e6e5976f302a4 100644 GIT binary patch delta 12683 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\n" "Language: uk\n" @@ -15,13 +15,13 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.6.0\n" +"Generated-By: Babel 2.7.0\n" -#: cps/about.py:76 +#: cps/about.py:78 msgid "Statistics" msgstr "Статистика" -#: cps/admin.py:97 +#: cps/admin.py:98 msgid "Server restarted, please reload page" msgstr "Сервер перезавантажено, будь-ласка, перезавантажте сторінку" @@ -29,186 +29,202 @@ msgstr "Сервер перезавантажено, будь-ласка, пер msgid "Performing shutdown of server, please close window" msgstr "Виконується зупинка серверу, будь-ласка, закрийте вікно" -#: cps/admin.py:120 cps/updater.py:445 +#: cps/admin.py:119 cps/updater.py:448 msgid "Unknown" msgstr "Невідомий" -#: cps/admin.py:139 +#: cps/admin.py:138 msgid "Admin page" msgstr "Сторінка адміністратора" -#: cps/admin.py:208 cps/admin.py:486 +#: cps/admin.py:207 cps/admin.py:532 msgid "Calibre-Web configuration updated" msgstr "" -#: cps/admin.py:222 cps/templates/admin.html:102 +#: cps/admin.py:220 cps/templates/admin.html:102 msgid "UI Configuration" msgstr "Конфігурація інтерфейсу" -#: cps/admin.py:295 +#: cps/admin.py:293 msgid "Import of optional Google Drive requirements missing" msgstr "Імпорт додаткових вимог Google Drive відсутній" -#: cps/admin.py:298 +#: cps/admin.py:296 msgid "client_secrets.json is missing or not readable" msgstr "Неможливо зчитати client_secrets.json або він відсутній" -#: cps/admin.py:303 cps/admin.py:332 +#: cps/admin.py:301 cps/admin.py:330 msgid "client_secrets.json is not configured for web application" msgstr "Неможливо зконфігурувати client_secrets.json для веб-додатку" -#: cps/admin.py:335 cps/admin.py:361 cps/admin.py:373 cps/admin.py:398 -#: cps/admin.py:426 cps/admin.py:440 cps/admin.py:463 cps/admin.py:476 -#: cps/admin.py:494 cps/admin.py:501 cps/admin.py:516 -#: cps/templates/admin.html:101 +#: cps/admin.py:333 cps/admin.py:359 cps/admin.py:371 cps/admin.py:396 +#: cps/admin.py:403 cps/admin.py:436 cps/admin.py:460 cps/admin.py:474 +#: cps/admin.py:493 cps/admin.py:510 cps/admin.py:522 cps/admin.py:538 +#: cps/admin.py:545 cps/admin.py:559 cps/templates/admin.html:101 msgid "Basic Configuration" msgstr "Настройки сервера" -#: cps/admin.py:358 +#: cps/admin.py:356 msgid "Keyfile location is not valid, please enter correct path" msgstr "Невідомий шлях до Keyfile. Будь-ласка введіть коректний" -#: cps/admin.py:370 +#: cps/admin.py:368 cps/admin.py:433 msgid "Certfile location is not valid, please enter correct path" msgstr "Невідомий шлях до Certfile. Будь-ласка введіть коректний" -#: cps/admin.py:395 -msgid "Please enter a LDAP provider and a DN" +#: cps/admin.py:393 +msgid "Please enter a LDAP provider, port, DN and user object identifier" msgstr "" -#: cps/admin.py:423 +#: cps/admin.py:400 +msgid "Please enter a LDAP service account and password" +msgstr "" + +#: cps/admin.py:457 msgid "Please enter Github oauth credentials" msgstr "" -#: cps/admin.py:437 +#: cps/admin.py:471 msgid "Please enter Google oauth credentials" msgstr "" -#: cps/admin.py:460 +#: cps/admin.py:490 msgid "Logfile location is not valid, please enter correct path" msgstr "Невідомий шлях до Logfile. Будь-ласка введіть коректний" -#: cps/admin.py:498 +#: cps/admin.py:507 +msgid "Access Logfile location is not valid, please enter correct path" +msgstr "" + +#: cps/admin.py:542 msgid "DB location is not valid, please enter correct path" msgstr "Невідомий шлях до БД. Будь-ласка введіть коректний" -#: cps/admin.py:558 cps/web.py:1045 +#: cps/admin.py:602 cps/web.py:1040 msgid "Please fill out all fields!" msgstr "Будь-ласка, заповніть всі поля!" -#: cps/admin.py:560 cps/admin.py:566 cps/admin.py:582 +#: cps/admin.py:604 cps/admin.py:610 cps/admin.py:626 #: cps/templates/admin.html:35 msgid "Add new user" msgstr "Додати користувача" -#: cps/admin.py:564 cps/web.py:1248 +#: cps/admin.py:608 cps/web.py:1251 msgid "E-mail is not from valid domain" msgstr "" -#: cps/admin.py:572 +#: cps/admin.py:616 #, python-format msgid "User '%(user)s' created" msgstr "Користувач '%(user)s' додан" -#: cps/admin.py:576 +#: cps/admin.py:620 msgid "Found an existing account for this e-mail address or nickname." msgstr "" -#: cps/admin.py:607 +#: cps/admin.py:651 #, python-format msgid "Test e-mail successfully send to %(kindlemail)s" msgstr "" -#: cps/admin.py:610 +#: cps/admin.py:654 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "" -#: cps/admin.py:612 cps/web.py:1029 +#: cps/admin.py:656 cps/web.py:1023 msgid "Please configure your kindle e-mail address first..." msgstr "" -#: cps/admin.py:614 +#: cps/admin.py:658 msgid "E-mail server settings updated" msgstr "" -#: cps/admin.py:615 +#: cps/admin.py:659 msgid "Edit e-mail server settings" msgstr "" -#: cps/admin.py:640 +#: cps/admin.py:687 #, python-format msgid "User '%(nick)s' deleted" msgstr "Користувача '%(nick)s' видалено" -#: cps/admin.py:711 +#: cps/admin.py:690 +msgid "No admin user remaining, can't delete user" +msgstr "" + +#: cps/admin.py:761 #, python-format msgid "User '%(nick)s' updated" msgstr "Користувача '%(nick)s' оновлено" -#: cps/admin.py:714 +#: cps/admin.py:764 msgid "An unknown error occured." msgstr "Сталась невідома помилка" -#: cps/admin.py:717 +#: cps/admin.py:767 #, python-format msgid "Edit User %(nick)s" msgstr "Змінити користувача %(nick)s" -#: cps/admin.py:733 +#: cps/admin.py:783 #, python-format msgid "Password for user %(user)s reset" msgstr "" -#: cps/admin.py:736 cps/web.py:1070 +#: cps/admin.py:786 cps/web.py:1065 msgid "An unknown error occurred. Please try again later." msgstr "" -#: cps/admin.py:755 +#: cps/admin.py:797 +msgid "Logfile viewer" +msgstr "" + +#: cps/admin.py:832 msgid "Requesting update package" msgstr "Перевірка оновлень" -#: cps/admin.py:756 +#: cps/admin.py:833 msgid "Downloading update package" msgstr "Завантаження оновлень" -#: cps/admin.py:757 +#: cps/admin.py:834 msgid "Unzipping update package" msgstr "Розпакування оновлення" -#: cps/admin.py:758 +#: cps/admin.py:835 msgid "Replacing files" msgstr "" -#: cps/admin.py:759 +#: cps/admin.py:836 msgid "Database connections are closed" msgstr "З'єднання з базою даних закрите" -#: cps/admin.py:760 +#: cps/admin.py:837 msgid "Stopping server" msgstr "" -#: cps/admin.py:761 +#: cps/admin.py:838 msgid "Update finished, please press okay and reload page" msgstr "Оновлення встановлені, натисніть ok і перезавантажте сторінку" -#: cps/admin.py:762 cps/admin.py:763 cps/admin.py:764 cps/admin.py:765 +#: cps/admin.py:839 cps/admin.py:840 cps/admin.py:841 cps/admin.py:842 msgid "Update failed:" msgstr "" -#: cps/admin.py:762 cps/updater.py:277 cps/updater.py:456 cps/updater.py:458 +#: cps/admin.py:839 cps/updater.py:273 cps/updater.py:459 cps/updater.py:461 msgid "HTTP Error" msgstr "" -#: cps/admin.py:763 cps/updater.py:279 cps/updater.py:460 +#: cps/admin.py:840 cps/updater.py:275 cps/updater.py:463 msgid "Connection error" msgstr "" -#: cps/admin.py:764 cps/updater.py:281 cps/updater.py:462 +#: cps/admin.py:841 cps/updater.py:277 cps/updater.py:465 msgid "Timeout while establishing connection" msgstr "" -#: cps/admin.py:765 cps/updater.py:283 cps/updater.py:464 +#: cps/admin.py:842 cps/updater.py:279 cps/updater.py:467 msgid "General error" msgstr "" @@ -226,720 +242,714 @@ msgstr "Відсутній дозвіл на виконання" msgid "not configured" msgstr "" -#: cps/editbooks.py:218 cps/editbooks.py:432 +#: cps/editbooks.py:215 cps/editbooks.py:394 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "Сталась помилка при відкриванні eBook. Файл не існує або відсутній доступ до нього" -#: cps/editbooks.py:246 +#: cps/editbooks.py:243 msgid "edit metadata" msgstr "змінити метадані" -#: cps/editbooks.py:325 cps/editbooks.py:595 +#: cps/editbooks.py:322 cps/editbooks.py:557 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "" -#: cps/editbooks.py:329 cps/editbooks.py:599 +#: cps/editbooks.py:326 cps/editbooks.py:561 msgid "File to be uploaded must have an extension" msgstr "Завантажувальний файл повинен мати розширення" -#: cps/editbooks.py:341 cps/editbooks.py:619 +#: cps/editbooks.py:338 cps/editbooks.py:581 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "" -#: cps/editbooks.py:346 +#: cps/editbooks.py:343 #, python-format msgid "Failed to store file %(file)s." msgstr "" -#: cps/editbooks.py:363 +#: cps/editbooks.py:360 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "" -#: cps/editbooks.py:382 -#, python-format -msgid "Failed to create path for cover %(path)s (Permission denied)." -msgstr "" - -#: cps/editbooks.py:390 -#, python-format -msgid "Failed to store cover-file %(cover)s." -msgstr "" - -#: cps/editbooks.py:393 -msgid "Cover-file is not a valid image file" -msgstr "" - -#: cps/editbooks.py:399 cps/editbooks.py:413 +#: cps/editbooks.py:374 msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" msgstr "" -#: cps/editbooks.py:445 cps/editbooks.py:454 +#: cps/editbooks.py:407 cps/editbooks.py:416 msgid "unknown" msgstr "невідомий" -#: cps/editbooks.py:486 +#: cps/editbooks.py:448 msgid "Cover is not a jpg file, can't save" msgstr "" -#: cps/editbooks.py:534 +#: cps/editbooks.py:496 #, python-format msgid "%(langname)s is not a valid language" msgstr "" -#: cps/editbooks.py:565 +#: cps/editbooks.py:527 msgid "Metadata successfully updated" msgstr "" -#: cps/editbooks.py:574 +#: cps/editbooks.py:536 msgid "Error editing book, please check logfile for details" msgstr "Сталась помилка при редагуванні книги. Будь-ласка, перевірте лог-файл для деталей" -#: cps/editbooks.py:624 +#: cps/editbooks.py:586 #, python-format msgid "Failed to store file %(file)s (Permission denied)." msgstr "" -#: cps/editbooks.py:629 +#: cps/editbooks.py:591 #, python-format msgid "Failed to delete file %(file)s (Permission denied)." msgstr "" -#: cps/editbooks.py:712 +#: cps/editbooks.py:674 #, python-format msgid "File %(file)s uploaded" msgstr "" -#: cps/editbooks.py:741 +#: cps/editbooks.py:703 msgid "Source or destination format for conversion missing" msgstr "" -#: cps/editbooks.py:751 +#: cps/editbooks.py:711 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "" -#: cps/editbooks.py:755 +#: cps/editbooks.py:715 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "" -#: cps/gdrive.py:56 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgstr "" -#: cps/gdrive.py:101 +#: cps/gdrive.py:106 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Домен зворотнього зв'язку не підтверджено. Виконайте дії для підтвердження домену, будь-ласка" -#: cps/helper.py:97 +#: cps/helper.py:94 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "" -#: cps/helper.py:109 +#: cps/helper.py:106 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "" -#: cps/helper.py:116 cps/helper.py:223 cps/templates/detail.html:41 +#: cps/helper.py:113 cps/helper.py:220 cps/templates/detail.html:41 #: cps/templates/detail.html:45 msgid "Send to Kindle" msgstr "Відправити на Kindle" -#: cps/helper.py:117 cps/helper.py:135 cps/helper.py:225 +#: cps/helper.py:114 cps/helper.py:132 cps/helper.py:222 msgid "This e-mail has been sent via Calibre-Web." msgstr "" -#: cps/helper.py:128 +#: cps/helper.py:125 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "" -#: cps/helper.py:133 +#: cps/helper.py:130 msgid "Calibre-Web test e-mail" msgstr "" -#: cps/helper.py:134 +#: cps/helper.py:131 msgid "Test e-mail" msgstr "" -#: cps/helper.py:150 +#: cps/helper.py:147 msgid "Get Started with Calibre-Web" msgstr "" -#: cps/helper.py:151 +#: cps/helper.py:148 #, python-format msgid "Registration e-mail for user: %(name)s" msgstr "" -#: cps/helper.py:165 cps/helper.py:167 cps/helper.py:169 cps/helper.py:177 -#: cps/helper.py:179 cps/helper.py:181 +#: cps/helper.py:162 cps/helper.py:164 cps/helper.py:166 cps/helper.py:174 +#: cps/helper.py:176 cps/helper.py:178 #, python-format msgid "Send %(format)s to Kindle" msgstr "" -#: cps/helper.py:185 +#: cps/helper.py:182 #, python-format msgid "Convert %(orig)s to %(format)s and send to Kindle" msgstr "" -#: cps/helper.py:224 +#: cps/helper.py:221 #, python-format msgid "E-mail: %(book)s" msgstr "" -#: cps/helper.py:227 +#: cps/helper.py:224 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "" -#: cps/helper.py:335 +#: cps/helper.py:331 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "" -#: cps/helper.py:345 +#: cps/helper.py:341 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "" -#: cps/helper.py:359 +#: cps/helper.py:355 #, python-format msgid "Rename file in path '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "" -#: cps/helper.py:385 cps/helper.py:395 cps/helper.py:403 +#: cps/helper.py:381 cps/helper.py:391 cps/helper.py:399 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "" -#: cps/helper.py:424 +#: cps/helper.py:420 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "" -#: cps/helper.py:584 +#: cps/helper.py:579 msgid "Error excecuting UnRar" msgstr "" -#: cps/helper.py:586 +#: cps/helper.py:581 msgid "Unrar binary file not found" msgstr "" -#: cps/helper.py:614 +#: cps/helper.py:609 msgid "Waiting" msgstr "" -#: cps/helper.py:616 +#: cps/helper.py:611 msgid "Failed" msgstr "" -#: cps/helper.py:618 +#: cps/helper.py:613 msgid "Started" msgstr "" -#: cps/helper.py:620 +#: cps/helper.py:615 msgid "Finished" msgstr "" -#: cps/helper.py:622 +#: cps/helper.py:617 msgid "Unknown Status" msgstr "" -#: cps/helper.py:627 +#: cps/helper.py:622 msgid "E-mail: " msgstr "" -#: cps/helper.py:629 cps/helper.py:633 +#: cps/helper.py:624 cps/helper.py:628 msgid "Convert: " msgstr "" -#: cps/helper.py:631 +#: cps/helper.py:626 msgid "Upload: " msgstr "" -#: cps/helper.py:635 +#: cps/helper.py:630 msgid "Unknown Task: " msgstr "" -#: cps/oauth_bb.py:87 +#: cps/oauth_bb.py:91 #, python-format -msgid "Register with %s, " +msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:145 +#: cps/oauth_bb.py:149 msgid "Failed to log in with GitHub." msgstr "" -#: cps/oauth_bb.py:150 +#: cps/oauth_bb.py:154 msgid "Failed to fetch user info from GitHub." msgstr "" -#: cps/oauth_bb.py:161 +#: cps/oauth_bb.py:165 msgid "Failed to log in with Google." msgstr "" -#: cps/oauth_bb.py:166 +#: cps/oauth_bb.py:170 msgid "Failed to fetch user info from Google." msgstr "" -#: cps/oauth_bb.py:265 +#: cps/oauth_bb.py:269 #, python-format msgid "Unlink to %(oauth)s success." msgstr "" -#: cps/oauth_bb.py:269 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s failed." msgstr "" -#: cps/oauth_bb.py:272 +#: cps/oauth_bb.py:276 #, python-format msgid "Not linked to %(oauth)s." msgstr "" -#: cps/oauth_bb.py:300 +#: cps/oauth_bb.py:304 msgid "GitHub Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:319 +#: cps/oauth_bb.py:323 msgid "Google Oauth error, please retry later." msgstr "" -#: cps/shelf.py:40 cps/shelf.py:92 +#: cps/shelf.py:46 cps/shelf.py:98 msgid "Invalid shelf specified" msgstr "" -#: cps/shelf.py:47 +#: cps/shelf.py:53 #, python-format msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" msgstr "" -#: cps/shelf.py:55 +#: cps/shelf.py:61 msgid "You are not allowed to edit public shelves" msgstr "" -#: cps/shelf.py:64 +#: cps/shelf.py:70 #, python-format msgid "Book is already part of the shelf: %(shelfname)s" msgstr "" -#: cps/shelf.py:78 +#: cps/shelf.py:84 #, python-format msgid "Book has been added to shelf: %(sname)s" msgstr "Книга додана на книжкову полицю: %(sname)s" -#: cps/shelf.py:97 +#: cps/shelf.py:103 #, python-format msgid "You are not allowed to add a book to the the shelf: %(name)s" msgstr "" -#: cps/shelf.py:102 +#: cps/shelf.py:108 msgid "User is not allowed to edit public shelves" msgstr "" -#: cps/shelf.py:120 +#: cps/shelf.py:126 #, python-format msgid "Books are already part of the shelf: %(name)s" msgstr "" -#: cps/shelf.py:134 +#: cps/shelf.py:140 #, python-format msgid "Books have been added to shelf: %(sname)s" msgstr "" -#: cps/shelf.py:136 +#: cps/shelf.py:142 #, python-format msgid "Could not add books to shelf: %(sname)s" msgstr "" -#: cps/shelf.py:173 +#: cps/shelf.py:179 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "Книга видалена з книжкової полиці: %(sname)s" -#: cps/shelf.py:179 +#: cps/shelf.py:185 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "Вибачте, але у вас немає дозволу для видалення книги з цієї полиці" -#: cps/shelf.py:200 cps/shelf.py:224 +#: cps/shelf.py:206 cps/shelf.py:230 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "Книжкова полиця з назвою '%(title)s' уже существует." -#: cps/shelf.py:205 +#: cps/shelf.py:211 #, python-format msgid "Shelf %(title)s created" msgstr "Створена книжкова полиця %(title)s" -#: cps/shelf.py:207 cps/shelf.py:235 +#: cps/shelf.py:213 cps/shelf.py:241 msgid "There was an error" msgstr "Сталась помилка" -#: cps/shelf.py:208 cps/shelf.py:210 +#: cps/shelf.py:214 cps/shelf.py:216 msgid "create a shelf" msgstr "створити книжкову полицю" -#: cps/shelf.py:233 +#: cps/shelf.py:239 #, python-format msgid "Shelf %(title)s changed" msgstr "Книжкова полиця %(title)s змінена" -#: cps/shelf.py:236 cps/shelf.py:238 +#: cps/shelf.py:242 cps/shelf.py:244 msgid "Edit a shelf" msgstr "Змінити книжкову полицю" -#: cps/shelf.py:259 -#, python-format -msgid "successfully deleted shelf %(name)s" -msgstr "Книжкова полиця %(name)s видалена" - -#: cps/shelf.py:289 +#: cps/shelf.py:295 #, python-format msgid "Shelf: '%(name)s'" msgstr "Книжкова полиця: '%(name)s'" -#: cps/shelf.py:292 +#: cps/shelf.py:298 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Помилка при відкриванні полиці. Полиця не існує або до неї відсутній доступ" -#: cps/shelf.py:324 +#: cps/shelf.py:330 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Змінити розташування книжкової полиці '%(name)s'" -#: cps/ub.py:111 +#: cps/ub.py:68 msgid "Recently Added" msgstr "Останні додані" -#: cps/ub.py:113 +#: cps/ub.py:70 msgid "Show recent books" msgstr "Показувати останні книги" -#: cps/templates/index.xml:17 cps/ub.py:114 +#: cps/templates/index.xml:17 cps/ub.py:71 msgid "Hot Books" msgstr "Популярні книги" -#: cps/ub.py:115 +#: cps/ub.py:72 msgid "Show hot books" msgstr "Показувати популярні книги" -#: cps/templates/index.xml:24 cps/ub.py:118 +#: cps/templates/index.xml:24 cps/ub.py:75 msgid "Best rated Books" msgstr "Книги з найкращим рейтингом" -#: cps/ub.py:120 +#: cps/ub.py:77 msgid "Show best rated books" msgstr "Показувати книги з найвищим рейтингом" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:121 -#: cps/web.py:965 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:78 +#: cps/web.py:958 msgid "Read Books" msgstr "Прочитані книги" -#: cps/ub.py:123 +#: cps/ub.py:80 msgid "Show read and unread" msgstr "Показувати прочитані та непрочитані книги" -#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:125 -#: cps/web.py:969 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:82 +#: cps/web.py:962 msgid "Unread Books" msgstr "Непрочитані книги" -#: cps/ub.py:127 +#: cps/ub.py:84 msgid "Show unread" msgstr "" -#: cps/ub.py:128 +#: cps/ub.py:85 msgid "Discover" msgstr "Огляд" -#: cps/ub.py:130 +#: cps/ub.py:87 msgid "Show random books" msgstr "Показувати випадкові книги" -#: cps/ub.py:131 +#: cps/ub.py:88 msgid "Categories" msgstr "Категорії" -#: cps/ub.py:133 +#: cps/ub.py:90 msgid "Show category selection" msgstr "Показувати вибір категорії" #: cps/templates/book_edit.html:71 cps/templates/search_form.html:53 -#: cps/ub.py:134 +#: cps/ub.py:91 msgid "Series" msgstr "Серії" -#: cps/ub.py:136 +#: cps/ub.py:93 msgid "Show series selection" msgstr "Показувати вибір серії" -#: cps/templates/index.xml:61 cps/ub.py:137 +#: cps/templates/index.xml:61 cps/ub.py:94 msgid "Authors" msgstr "Автори" -#: cps/ub.py:139 +#: cps/ub.py:96 msgid "Show author selection" msgstr "Показувати вибір автора" -#: cps/templates/index.xml:68 cps/ub.py:141 +#: cps/templates/index.xml:68 cps/ub.py:98 msgid "Publishers" msgstr "" -#: cps/ub.py:143 +#: cps/ub.py:100 msgid "Show publisher selection" msgstr "" -#: cps/templates/search_form.html:74 cps/ub.py:144 +#: cps/templates/search_form.html:74 cps/ub.py:101 msgid "Languages" msgstr "Мови" -#: cps/ub.py:147 +#: cps/ub.py:104 msgid "Show language selection" msgstr "Показувати вибір мови" -#: cps/ub.py:148 +#: cps/ub.py:105 msgid "Ratings" msgstr "" -#: cps/ub.py:150 +#: cps/ub.py:107 msgid "Show ratings selection" msgstr "" -#: cps/ub.py:151 +#: cps/ub.py:108 msgid "File formats" msgstr "" -#: cps/ub.py:153 +#: cps/ub.py:110 msgid "Show file formats selection" msgstr "" -#: cps/updater.py:257 cps/updater.py:364 cps/updater.py:377 +#: cps/updater.py:253 cps/updater.py:360 cps/updater.py:373 msgid "Unexpected data while reading update information" msgstr "" -#: cps/updater.py:264 cps/updater.py:370 +#: cps/updater.py:260 cps/updater.py:366 msgid "No update available. You already have the latest version installed" msgstr "" -#: cps/updater.py:290 cps/updater.py:422 +#: cps/updater.py:286 msgid "A new update is available. Click on the button below to update to the latest version." msgstr "" -#: cps/updater.py:343 +#: cps/updater.py:339 msgid "Could not fetch update information" msgstr "" -#: cps/updater.py:357 +#: cps/updater.py:353 msgid "No release information available" msgstr "" -#: cps/updater.py:403 cps/updater.py:412 +#: cps/updater.py:406 cps/updater.py:415 #, python-format msgid "A new update is available. Click on the button below to update to version: %(version)s" msgstr "" -#: cps/web.py:457 +#: cps/updater.py:425 +msgid "Click on the button below to update to the latest stable version." +msgstr "" + +#: cps/web.py:445 msgid "Recently Added Books" msgstr "Нещодавно додані книги" -#: cps/web.py:484 +#: cps/web.py:473 msgid "Best rated books" msgstr "Книги з найкращим рейтингом" -#: cps/templates/index.xml:38 cps/web.py:492 +#: cps/templates/index.xml:38 cps/web.py:481 msgid "Random Books" msgstr "Випадковий список книг" -#: cps/web.py:516 +#: cps/web.py:505 msgid "Books" msgstr "" -#: cps/web.py:543 +#: cps/web.py:532 msgid "Hot Books (most downloaded)" msgstr "Популярні книги (найбільш завантажувані)" -#: cps/web.py:553 cps/web.py:1294 cps/web.py:1383 +#: cps/web.py:542 cps/web.py:1298 cps/web.py:1386 msgid "Error opening eBook. File does not exist or file is not accessible:" msgstr "Неможливо відкрити книгу. Файл не існує або немає доступу." -#: cps/web.py:580 +#: cps/web.py:559 +#, python-format +msgid "Author: %(name)s" +msgstr "" + +#: cps/web.py:571 #, python-format msgid "Publisher: %(name)s" msgstr "" -#: cps/web.py:591 +#: cps/web.py:582 #, python-format msgid "Series: %(serie)s" msgstr "Серії: %(serie)s" -#: cps/web.py:602 +#: cps/web.py:593 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:613 +#: cps/web.py:604 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:625 +#: cps/web.py:616 #, python-format msgid "Category: %(name)s" msgstr "Категорія: %(name)s" -#: cps/web.py:659 +#: cps/web.py:650 msgid "Publisher list" msgstr "" -#: cps/templates/index.xml:82 cps/web.py:675 +#: cps/templates/index.xml:82 cps/web.py:666 msgid "Series list" msgstr "Список серій" -#: cps/web.py:689 +#: cps/web.py:680 msgid "Ratings list" msgstr "" -#: cps/web.py:702 +#: cps/web.py:693 msgid "File formats list" msgstr "" -#: cps/web.py:730 +#: cps/web.py:721 msgid "Available languages" msgstr "Доступні мови" -#: cps/web.py:750 +#: cps/web.py:741 #, python-format msgid "Language: %(name)s" msgstr "Мова: %(name)s" -#: cps/templates/index.xml:75 cps/web.py:764 +#: cps/templates/index.xml:75 cps/web.py:755 msgid "Category list" msgstr "Список категорій" -#: cps/templates/layout.html:73 cps/web.py:777 +#: cps/templates/layout.html:73 cps/web.py:769 msgid "Tasks" msgstr "" -#: cps/web.py:841 +#: cps/web.py:834 msgid "Published after " msgstr "" -#: cps/web.py:848 +#: cps/web.py:841 msgid "Published before " msgstr "Опубліковано до" -#: cps/web.py:862 +#: cps/web.py:855 #, python-format msgid "Rating <= %(rating)s" msgstr "" -#: cps/web.py:864 +#: cps/web.py:857 #, python-format msgid "Rating >= %(rating)s" msgstr "" -#: cps/web.py:924 cps/web.py:933 +#: cps/web.py:917 cps/web.py:926 msgid "search" msgstr "пошук" -#: cps/web.py:1018 +#: cps/web.py:1012 msgid "Please configure the SMTP mail settings first..." msgstr "Будь-ласка, спочатку сконфігуруйте параметри SMTP" -#: cps/web.py:1023 +#: cps/web.py:1017 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "" -#: cps/web.py:1027 +#: cps/web.py:1021 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "Помилка при відправці книги: %(res)s" -#: cps/web.py:1046 cps/web.py:1071 cps/web.py:1076 cps/web.py:1081 -#: cps/web.py:1085 +#: cps/web.py:1041 cps/web.py:1066 cps/web.py:1070 cps/web.py:1075 +#: cps/web.py:1079 msgid "register" msgstr "зареєструватись" -#: cps/web.py:1073 +#: cps/web.py:1068 msgid "Your e-mail is not allowed to register" msgstr "" -#: cps/web.py:1077 +#: cps/web.py:1071 msgid "Confirmation e-mail was send to your e-mail account." msgstr "" -#: cps/web.py:1080 +#: cps/web.py:1074 msgid "This username or e-mail address is already in use." msgstr "" -#: cps/web.py:1103 cps/web.py:1115 -#, python-format -msgid "You are now logged in as: '%(nickname)s'" +#: cps/web.py:1089 +msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1108 cps/web.py:1120 +#: cps/web.py:1098 cps/web.py:1212 +#, python-format +msgid "you are now logged in as: '%(nickname)s'" +msgstr "Ви увійшли як користувач: '%(nickname)s'" + +#: cps/web.py:1105 cps/web.py:1122 msgid "Wrong Username or Password" msgstr "Помилка в імені користувача або паролі" -#: cps/web.py:1111 +#: cps/web.py:1108 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "" -#: cps/web.py:1124 cps/web.py:1146 +#: cps/web.py:1117 +#, python-format +msgid "You are now logged in as: '%(nickname)s'" +msgstr "" + +#: cps/web.py:1126 cps/web.py:1148 msgid "login" msgstr "увійти" -#: cps/web.py:1158 cps/web.py:1189 +#: cps/web.py:1160 cps/web.py:1191 msgid "Token not found" msgstr "Токен не знайдено" -#: cps/web.py:1166 cps/web.py:1197 +#: cps/web.py:1168 cps/web.py:1199 msgid "Token has expired" msgstr "Час дії токено вичерпано" -#: cps/web.py:1174 +#: cps/web.py:1176 msgid "Success! Please return to your device" msgstr "Вдалося! Будь-ласка, поверніться до вашого пристрою" -#: cps/web.py:1210 -#, python-format -msgid "you are now logged in as: '%(nickname)s'" -msgstr "Ви увійшли як користувач: '%(nickname)s'" - -#: cps/web.py:1250 cps/web.py:1277 cps/web.py:1281 +#: cps/web.py:1253 cps/web.py:1280 cps/web.py:1284 #, python-format msgid "%(name)s's profile" msgstr "Профіль %(name)s" -#: cps/web.py:1274 +#: cps/web.py:1277 msgid "Found an existing account for this e-mail address." msgstr "" -#: cps/web.py:1279 +#: cps/web.py:1282 msgid "Profile updated" msgstr "Профіль оновлено" -#: cps/web.py:1304 cps/web.py:1306 cps/web.py:1308 cps/web.py:1314 -#: cps/web.py:1318 +#: cps/web.py:1308 cps/web.py:1310 cps/web.py:1312 cps/web.py:1318 +#: cps/web.py:1322 msgid "Read a Book" msgstr "Читати книгу" -#: cps/web.py:1328 +#: cps/web.py:1332 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "" -#: cps/worker.py:308 +#: cps/worker.py:311 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "" -#: cps/worker.py:319 +#: cps/worker.py:322 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Kindlegen відхилено з помилкою %(error)s. Повідомлення: %(message)s " @@ -1055,53 +1065,57 @@ msgid "Administration" msgstr "Адміністрування" #: cps/templates/admin.html:109 +msgid "View Logfiles" +msgstr "" + +#: cps/templates/admin.html:110 msgid "Reconnect to Calibre DB" msgstr "Повторне підключення до БД Calibre" -#: cps/templates/admin.html:110 +#: cps/templates/admin.html:111 msgid "Restart Calibre-Web" msgstr "" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:112 msgid "Stop Calibre-Web" msgstr "" -#: cps/templates/admin.html:117 +#: cps/templates/admin.html:118 msgid "Update" msgstr "" -#: cps/templates/admin.html:121 +#: cps/templates/admin.html:122 msgid "Version" msgstr "" -#: cps/templates/admin.html:122 +#: cps/templates/admin.html:123 msgid "Details" msgstr "" -#: cps/templates/admin.html:128 +#: cps/templates/admin.html:129 msgid "Current version" msgstr "" -#: cps/templates/admin.html:134 +#: cps/templates/admin.html:135 msgid "Check for update" msgstr "Перевірка оновлень" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:136 msgid "Perform Update" msgstr "Встановити оновлення" -#: cps/templates/admin.html:147 +#: cps/templates/admin.html:148 msgid "Do you really want to restart Calibre-Web?" msgstr "" -#: cps/templates/admin.html:152 cps/templates/admin.html:166 -#: cps/templates/admin.html:186 cps/templates/shelf.html:72 +#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:187 cps/templates/shelf.html:72 msgid "Ok" msgstr "Ok" -#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:154 cps/templates/admin.html:168 #: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:281 cps/templates/config_view_edit.html:147 +#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:74 #: cps/templates/layout.html:28 cps/templates/shelf.html:73 #: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:12 @@ -1109,11 +1123,11 @@ msgstr "Ok" msgid "Back" msgstr "Назад" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:166 msgid "Do you really want to stop Calibre-Web?" msgstr "" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:178 msgid "Updating, please do not reload page" msgstr "Встановлення оновлень, будь-ласка, не оновлюйте сторінку" @@ -1242,7 +1256,7 @@ msgstr "переглянути книгу після редагування" msgid "Get metadata" msgstr "Отримати метадані" -#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:279 +#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329 #: cps/templates/config_view_edit.html:146 cps/templates/login.html:20 #: cps/templates/search_form.html:150 cps/templates/shelf_edit.html:17 #: cps/templates/user_edit.html:130 @@ -1386,123 +1400,171 @@ msgstr "Рівень логовання" msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "Розташування і назва логфайлу (calibre-web.log for no entry)" -#: cps/templates/config_edit.html:140 +#: cps/templates/config_edit.html:134 +msgid "Enable Access Log" +msgstr "" + +#: cps/templates/config_edit.html:137 +msgid "Location and name of access logfile (access.log for no entry)" +msgstr "" + +#: cps/templates/config_edit.html:148 msgid "Feature Configuration" msgstr "Особливі налаштування" -#: cps/templates/config_edit.html:148 +#: cps/templates/config_edit.html:156 msgid "Enable uploading" msgstr "Дозволити завантаження книг на сервер" -#: cps/templates/config_edit.html:152 +#: cps/templates/config_edit.html:160 msgid "Enable anonymous browsing" msgstr "Дозволити анонімний перегляд" -#: cps/templates/config_edit.html:156 +#: cps/templates/config_edit.html:164 msgid "Enable public registration" msgstr "Дозволити публічну реєстрацію" -#: cps/templates/config_edit.html:160 +#: cps/templates/config_edit.html:168 msgid "Enable remote login (\"magic link\")" msgstr "Включити віддалений логін (\"magic link\")" -#: cps/templates/config_edit.html:165 +#: cps/templates/config_edit.html:173 msgid "Use" msgstr "Використовувати" -#: cps/templates/config_edit.html:166 +#: cps/templates/config_edit.html:174 msgid "Obtain an API Key" msgstr "Отримати ключ API" -#: cps/templates/config_edit.html:170 +#: cps/templates/config_edit.html:178 msgid "Goodreads API Key" msgstr "" -#: cps/templates/config_edit.html:174 +#: cps/templates/config_edit.html:182 msgid "Goodreads API Secret" msgstr "" -#: cps/templates/config_edit.html:181 +#: cps/templates/config_edit.html:189 msgid "Login type" msgstr "" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:191 msgid "Use standard Authentication" msgstr "" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:193 msgid "Use LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:188 +#: cps/templates/config_edit.html:196 msgid "Use GitHub OAuth" msgstr "" -#: cps/templates/config_edit.html:189 +#: cps/templates/config_edit.html:197 msgid "Use Google OAuth" msgstr "" -#: cps/templates/config_edit.html:196 -msgid "LDAP Provider URL" +#: cps/templates/config_edit.html:204 +msgid "LDAP Server Host Name or IP Address" +msgstr "" + +#: cps/templates/config_edit.html:208 +msgid "LDAP Server Port" +msgstr "" + +#: cps/templates/config_edit.html:212 +msgid "LDAP schema (ldap or ldaps)" +msgstr "" + +#: cps/templates/config_edit.html:216 +msgid "LDAP Admin username" +msgstr "" + +#: cps/templates/config_edit.html:220 +msgid "LDAP Admin password" msgstr "" -#: cps/templates/config_edit.html:200 +#: cps/templates/config_edit.html:225 +msgid "LDAP Server use SSL" +msgstr "" + +#: cps/templates/config_edit.html:229 +msgid "LDAP Server use TLS" +msgstr "" + +#: cps/templates/config_edit.html:233 +msgid "LDAP Server Certificate" +msgstr "" + +#: cps/templates/config_edit.html:237 +msgid "LDAP SSL Certificate Path" +msgstr "" + +#: cps/templates/config_edit.html:242 msgid "LDAP Distinguished Name (DN)" msgstr "" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:246 +msgid "LDAP User object filter" +msgstr "" + +#: cps/templates/config_edit.html:251 +msgid "LDAP Server is OpenLDAP?" +msgstr "" + +#: cps/templates/config_edit.html:258 msgid "Obtain GitHub OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:211 +#: cps/templates/config_edit.html:261 msgid "GitHub OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:215 +#: cps/templates/config_edit.html:265 msgid "GitHub OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:221 +#: cps/templates/config_edit.html:271 msgid "Obtain Google OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:224 +#: cps/templates/config_edit.html:274 msgid "Google OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:228 +#: cps/templates/config_edit.html:278 msgid "Google OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:242 +#: cps/templates/config_edit.html:292 msgid "External binaries" msgstr "" -#: cps/templates/config_edit.html:250 +#: cps/templates/config_edit.html:300 msgid "No converter" msgstr "" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:302 msgid "Use Kindlegen" msgstr "" -#: cps/templates/config_edit.html:254 +#: cps/templates/config_edit.html:304 msgid "Use calibre's ebook converter" msgstr "" -#: cps/templates/config_edit.html:258 +#: cps/templates/config_edit.html:308 msgid "E-Book converter settings" msgstr "" -#: cps/templates/config_edit.html:262 +#: cps/templates/config_edit.html:312 msgid "Path to convertertool" msgstr "" -#: cps/templates/config_edit.html:268 +#: cps/templates/config_edit.html:318 msgid "Location of Unrar binary" msgstr "" -#: cps/templates/config_edit.html:284 cps/templates/layout.html:84 +#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 #: cps/templates/login.html:4 msgid "Login" msgstr "Ім'я користувача" @@ -1716,7 +1778,7 @@ msgstr "" msgid "Discover (Random Books)" msgstr "Огляд (випадкові книги)" -#: cps/templates/index.html:65 +#: cps/templates/index.html:64 msgid "Group by series" msgstr "" @@ -1859,6 +1921,14 @@ msgstr "Запам'ятати мене" msgid "Log in with magic link" msgstr "Увійдіть в систему за допомогою magic link" +#: cps/templates/logviewer.html:5 +msgid "Show Calibre-Web log" +msgstr "" + +#: cps/templates/logviewer.html:8 +msgid "Show access log" +msgstr "" + #: cps/templates/osd.xml:5 msgid "Calibre-Web ebook catalog" msgstr "" @@ -2387,3 +2457,15 @@ msgstr "Нещодавно переглянуті" #~ msgid "PDF.js viewer" #~ msgstr "Переглядач PDF.js" +#~ msgid "Please enter a LDAP provider and a DN" +#~ msgstr "" + +#~ msgid "successfully deleted shelf %(name)s" +#~ msgstr "Книжкова полиця %(name)s видалена" + +#~ msgid "LDAP Provider URL" +#~ msgstr "" + +#~ msgid "Register with %s, " +#~ msgstr "" + diff --git a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo index 8fa2c6a47f3ba987fc18571a89d826f893afee23..7865836b3f8fa5abc1130a71ae5bdc6bd33d396f 100644 GIT binary patch delta 14059 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 delta 20167 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 jtv)pO?qkc>{e9Pl!>b\n" "Language: zh_Hans_CN\n" @@ -16,13 +16,13 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.6.0\n" +"Generated-By: Babel 2.7.0\n" -#: cps/about.py:76 +#: cps/about.py:78 msgid "Statistics" msgstr "统计" -#: cps/admin.py:97 +#: cps/admin.py:98 msgid "Server restarted, please reload page" msgstr "服务器已重启,请刷新页面" @@ -30,186 +30,202 @@ msgstr "服务器已重启,请刷新页面" msgid "Performing shutdown of server, please close window" msgstr "正在关闭服务器,请关闭窗口" -#: cps/admin.py:120 cps/updater.py:445 +#: cps/admin.py:119 cps/updater.py:448 msgid "Unknown" msgstr "未知" -#: cps/admin.py:139 +#: cps/admin.py:138 msgid "Admin page" msgstr "管理页" -#: cps/admin.py:208 cps/admin.py:486 +#: cps/admin.py:207 cps/admin.py:532 msgid "Calibre-Web configuration updated" msgstr "Calibre-Web配置已更新" -#: cps/admin.py:222 cps/templates/admin.html:102 +#: cps/admin.py:220 cps/templates/admin.html:102 msgid "UI Configuration" msgstr "UI配置" -#: cps/admin.py:295 +#: cps/admin.py:293 msgid "Import of optional Google Drive requirements missing" msgstr "可选的Google Drive依赖导入缺失" -#: cps/admin.py:298 +#: cps/admin.py:296 msgid "client_secrets.json is missing or not readable" msgstr "client_secrets.json文件缺失或不可读" -#: cps/admin.py:303 cps/admin.py:332 +#: cps/admin.py:301 cps/admin.py:330 msgid "client_secrets.json is not configured for web application" msgstr "没有为web应用配置client_secrets.json" -#: cps/admin.py:335 cps/admin.py:361 cps/admin.py:373 cps/admin.py:398 -#: cps/admin.py:426 cps/admin.py:440 cps/admin.py:463 cps/admin.py:476 -#: cps/admin.py:494 cps/admin.py:501 cps/admin.py:516 -#: cps/templates/admin.html:101 +#: cps/admin.py:333 cps/admin.py:359 cps/admin.py:371 cps/admin.py:396 +#: cps/admin.py:403 cps/admin.py:436 cps/admin.py:460 cps/admin.py:474 +#: cps/admin.py:493 cps/admin.py:510 cps/admin.py:522 cps/admin.py:538 +#: cps/admin.py:545 cps/admin.py:559 cps/templates/admin.html:101 msgid "Basic Configuration" msgstr "基本配置" -#: cps/admin.py:358 +#: cps/admin.py:356 msgid "Keyfile location is not valid, please enter correct path" msgstr "key文件位置无效,请输入正确路径" -#: cps/admin.py:370 +#: cps/admin.py:368 cps/admin.py:433 msgid "Certfile location is not valid, please enter correct path" msgstr "证书文件位置无效,请输入正确路径" -#: cps/admin.py:395 -msgid "Please enter a LDAP provider and a DN" +#: cps/admin.py:393 +msgid "Please enter a LDAP provider, port, DN and user object identifier" msgstr "" -#: cps/admin.py:423 +#: cps/admin.py:400 +msgid "Please enter a LDAP service account and password" +msgstr "" + +#: cps/admin.py:457 msgid "Please enter Github oauth credentials" msgstr "" -#: cps/admin.py:437 +#: cps/admin.py:471 msgid "Please enter Google oauth credentials" msgstr "" -#: cps/admin.py:460 +#: cps/admin.py:490 msgid "Logfile location is not valid, please enter correct path" msgstr "日志文件位置无效,请输入正确路径" -#: cps/admin.py:498 +#: cps/admin.py:507 +msgid "Access Logfile location is not valid, please enter correct path" +msgstr "" + +#: cps/admin.py:542 msgid "DB location is not valid, please enter correct path" msgstr "DB位置无效,请输入正确路径" -#: cps/admin.py:558 cps/web.py:1045 +#: cps/admin.py:602 cps/web.py:1040 msgid "Please fill out all fields!" msgstr "请填写所有字段" -#: cps/admin.py:560 cps/admin.py:566 cps/admin.py:582 +#: cps/admin.py:604 cps/admin.py:610 cps/admin.py:626 #: cps/templates/admin.html:35 msgid "Add new user" msgstr "添加新用户" -#: cps/admin.py:564 cps/web.py:1248 +#: cps/admin.py:608 cps/web.py:1251 msgid "E-mail is not from valid domain" msgstr "邮箱不在有效域中'" -#: cps/admin.py:572 +#: cps/admin.py:616 #, python-format msgid "User '%(user)s' created" msgstr "用户 '%(user)s' 已被创建" -#: cps/admin.py:576 +#: cps/admin.py:620 msgid "Found an existing account for this e-mail address or nickname." msgstr "此邮箱或昵称的账号已经存在。" -#: cps/admin.py:607 +#: cps/admin.py:651 #, python-format msgid "Test e-mail successfully send to %(kindlemail)s" msgstr "测试邮件已经被成功发到 %(kindlemail)s" -#: cps/admin.py:610 +#: cps/admin.py:654 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "发送测试邮件出错了: %(res)s" -#: cps/admin.py:612 cps/web.py:1029 +#: cps/admin.py:656 cps/web.py:1023 msgid "Please configure your kindle e-mail address first..." msgstr "请先配置您的kindle邮箱..." -#: cps/admin.py:614 +#: cps/admin.py:658 msgid "E-mail server settings updated" msgstr "已更新邮件服务器设置" -#: cps/admin.py:615 +#: cps/admin.py:659 msgid "Edit e-mail server settings" msgstr "编辑邮箱服务器设置" -#: cps/admin.py:640 +#: cps/admin.py:687 #, python-format msgid "User '%(nick)s' deleted" msgstr "用户 '%(nick)s' 已被删除" -#: cps/admin.py:711 +#: cps/admin.py:690 +msgid "No admin user remaining, can't delete user" +msgstr "" + +#: cps/admin.py:761 #, python-format msgid "User '%(nick)s' updated" msgstr "用户 '%(nick)s' 已被更新" -#: cps/admin.py:714 +#: cps/admin.py:764 msgid "An unknown error occured." msgstr "发生未知错误。" -#: cps/admin.py:717 +#: cps/admin.py:767 #, python-format msgid "Edit User %(nick)s" msgstr "编辑用户 %(nick)s" -#: cps/admin.py:733 +#: cps/admin.py:783 #, python-format msgid "Password for user %(user)s reset" msgstr "用户 %(user)s 的密码已重置" -#: cps/admin.py:736 cps/web.py:1070 +#: cps/admin.py:786 cps/web.py:1065 msgid "An unknown error occurred. Please try again later." msgstr "发生一个未知错误,请稍后再试。" -#: cps/admin.py:755 +#: cps/admin.py:797 +msgid "Logfile viewer" +msgstr "" + +#: cps/admin.py:832 msgid "Requesting update package" msgstr "正在请求更新包" -#: cps/admin.py:756 +#: cps/admin.py:833 msgid "Downloading update package" msgstr "正在下载更新包" -#: cps/admin.py:757 +#: cps/admin.py:834 msgid "Unzipping update package" msgstr "正在解压更新包" -#: cps/admin.py:758 +#: cps/admin.py:835 msgid "Replacing files" msgstr "正在替换文件" -#: cps/admin.py:759 +#: cps/admin.py:836 msgid "Database connections are closed" msgstr "数据库连接已关闭" -#: cps/admin.py:760 +#: cps/admin.py:837 msgid "Stopping server" msgstr "正在停止服务器" -#: cps/admin.py:761 +#: cps/admin.py:838 msgid "Update finished, please press okay and reload page" msgstr "更新完成,请按确定并刷新页面" -#: cps/admin.py:762 cps/admin.py:763 cps/admin.py:764 cps/admin.py:765 +#: cps/admin.py:839 cps/admin.py:840 cps/admin.py:841 cps/admin.py:842 msgid "Update failed:" msgstr "更新失败:" -#: cps/admin.py:762 cps/updater.py:277 cps/updater.py:456 cps/updater.py:458 +#: cps/admin.py:839 cps/updater.py:273 cps/updater.py:459 cps/updater.py:461 msgid "HTTP Error" msgstr "HTTP错误" -#: cps/admin.py:763 cps/updater.py:279 cps/updater.py:460 +#: cps/admin.py:840 cps/updater.py:275 cps/updater.py:463 msgid "Connection error" msgstr "连接错误" -#: cps/admin.py:764 cps/updater.py:281 cps/updater.py:462 +#: cps/admin.py:841 cps/updater.py:277 cps/updater.py:465 msgid "Timeout while establishing connection" msgstr "建立连接超时" -#: cps/admin.py:765 cps/updater.py:283 cps/updater.py:464 +#: cps/admin.py:842 cps/updater.py:279 cps/updater.py:467 msgid "General error" msgstr "一般错误" @@ -227,720 +243,714 @@ msgstr "可执行权限缺失" msgid "not configured" msgstr "未配置" -#: cps/editbooks.py:218 cps/editbooks.py:432 +#: cps/editbooks.py:215 cps/editbooks.py:394 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "打开电子书出错。文件不存在或不可访问" -#: cps/editbooks.py:246 +#: cps/editbooks.py:243 msgid "edit metadata" msgstr "编辑元数据" -#: cps/editbooks.py:325 cps/editbooks.py:595 +#: cps/editbooks.py:322 cps/editbooks.py:557 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "不能上传后缀为 '%(ext)s' 的文件到此服务器" -#: cps/editbooks.py:329 cps/editbooks.py:599 +#: cps/editbooks.py:326 cps/editbooks.py:561 msgid "File to be uploaded must have an extension" msgstr "要上传的文件必须有一个后缀" -#: cps/editbooks.py:341 cps/editbooks.py:619 +#: cps/editbooks.py:338 cps/editbooks.py:581 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "创建路径 %(path)s 失败(权限拒绝)。" -#: cps/editbooks.py:346 +#: cps/editbooks.py:343 #, python-format msgid "Failed to store file %(file)s." msgstr "保存文件 %(file)s 失败。" -#: cps/editbooks.py:363 +#: cps/editbooks.py:360 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "已添加 %(ext)s 格式到 %(book)s" -#: cps/editbooks.py:382 -#, python-format -msgid "Failed to create path for cover %(path)s (Permission denied)." -msgstr "" - -#: cps/editbooks.py:390 -#, python-format -msgid "Failed to store cover-file %(cover)s." -msgstr "" - -#: cps/editbooks.py:393 -msgid "Cover-file is not a valid image file" -msgstr "" - -#: cps/editbooks.py:399 cps/editbooks.py:413 +#: cps/editbooks.py:374 msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" msgstr "" -#: cps/editbooks.py:445 cps/editbooks.py:454 +#: cps/editbooks.py:407 cps/editbooks.py:416 msgid "unknown" msgstr "未知" -#: cps/editbooks.py:486 +#: cps/editbooks.py:448 msgid "Cover is not a jpg file, can't save" msgstr "" -#: cps/editbooks.py:534 +#: cps/editbooks.py:496 #, python-format msgid "%(langname)s is not a valid language" msgstr "%(langname)s 不是一种有效语言" -#: cps/editbooks.py:565 +#: cps/editbooks.py:527 msgid "Metadata successfully updated" msgstr "已成功更新元数据" -#: cps/editbooks.py:574 +#: cps/editbooks.py:536 msgid "Error editing book, please check logfile for details" msgstr "编辑书籍出错,详情请检查日志文件" -#: cps/editbooks.py:624 +#: cps/editbooks.py:586 #, python-format msgid "Failed to store file %(file)s (Permission denied)." msgstr "存储文件 %(file)s 失败(权限拒绝)。" -#: cps/editbooks.py:629 +#: cps/editbooks.py:591 #, python-format msgid "Failed to delete file %(file)s (Permission denied)." msgstr "删除文件 %(file)s 失败(权限拒绝)。" -#: cps/editbooks.py:712 +#: cps/editbooks.py:674 #, python-format msgid "File %(file)s uploaded" msgstr "" -#: cps/editbooks.py:741 +#: cps/editbooks.py:703 msgid "Source or destination format for conversion missing" msgstr "转换的源或目的格式缺失" -#: cps/editbooks.py:751 +#: cps/editbooks.py:711 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "书籍已经被成功加入 %(book_format)s 的转换队列" -#: cps/editbooks.py:755 +#: cps/editbooks.py:715 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "转换此书时出现错误: %(res)s" -#: cps/gdrive.py:56 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgstr "" -#: cps/gdrive.py:101 +#: cps/gdrive.py:106 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "回调域名尚未被校验,请在google开发者控制台按步骤校验域名" -#: cps/helper.py:97 +#: cps/helper.py:94 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "找不到id为 %(book)d 的书的 %(format)s 格式" -#: cps/helper.py:109 +#: cps/helper.py:106 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "Google Drive %(fn)s 上找不到 %(format)s" -#: cps/helper.py:116 cps/helper.py:223 cps/templates/detail.html:41 +#: cps/helper.py:113 cps/helper.py:220 cps/templates/detail.html:41 #: cps/templates/detail.html:45 msgid "Send to Kindle" msgstr "发送到Kindle" -#: cps/helper.py:117 cps/helper.py:135 cps/helper.py:225 +#: cps/helper.py:114 cps/helper.py:132 cps/helper.py:222 msgid "This e-mail has been sent via Calibre-Web." msgstr "此邮件已经通过Calibre-Web发送" -#: cps/helper.py:128 +#: cps/helper.py:125 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "找不到 %(format)s: %(fn)s" -#: cps/helper.py:133 +#: cps/helper.py:130 msgid "Calibre-Web test e-mail" msgstr "Calibre-Web测试邮件" -#: cps/helper.py:134 +#: cps/helper.py:131 msgid "Test e-mail" msgstr "测试邮件" -#: cps/helper.py:150 +#: cps/helper.py:147 msgid "Get Started with Calibre-Web" msgstr "开启Calibre-Web之旅" -#: cps/helper.py:151 +#: cps/helper.py:148 #, python-format msgid "Registration e-mail for user: %(name)s" msgstr "用户 %(name)s 的注册邮箱" -#: cps/helper.py:165 cps/helper.py:167 cps/helper.py:169 cps/helper.py:177 -#: cps/helper.py:179 cps/helper.py:181 +#: cps/helper.py:162 cps/helper.py:164 cps/helper.py:166 cps/helper.py:174 +#: cps/helper.py:176 cps/helper.py:178 #, python-format msgid "Send %(format)s to Kindle" msgstr "" -#: cps/helper.py:185 +#: cps/helper.py:182 #, python-format msgid "Convert %(orig)s to %(format)s and send to Kindle" msgstr "" -#: cps/helper.py:224 +#: cps/helper.py:221 #, python-format msgid "E-mail: %(book)s" msgstr "" -#: cps/helper.py:227 +#: cps/helper.py:224 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "无法读取请求的文件。 可能有错误的权限设置?" -#: cps/helper.py:335 +#: cps/helper.py:331 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "将标题从'%(src)s'改为'%(dest)s'时失败,出错信息: %(error)s" -#: cps/helper.py:345 +#: cps/helper.py:341 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "将作者从'%(src)s'改为'%(dest)s'时失败,出错信息: %(error)s" -#: cps/helper.py:359 +#: cps/helper.py:355 #, python-format msgid "Rename file in path '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "" -#: cps/helper.py:385 cps/helper.py:395 cps/helper.py:403 +#: cps/helper.py:381 cps/helper.py:391 cps/helper.py:399 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "Google Drive上找不到文件 %(file)s" -#: cps/helper.py:424 +#: cps/helper.py:420 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "Google Drive上找不到书籍路径 %(path)s" -#: cps/helper.py:584 +#: cps/helper.py:579 msgid "Error excecuting UnRar" msgstr "执行UnRar时出错" -#: cps/helper.py:586 +#: cps/helper.py:581 msgid "Unrar binary file not found" msgstr "找不到Unrar二进制文件" -#: cps/helper.py:614 +#: cps/helper.py:609 msgid "Waiting" msgstr "等待中" -#: cps/helper.py:616 +#: cps/helper.py:611 msgid "Failed" msgstr "失败" -#: cps/helper.py:618 +#: cps/helper.py:613 msgid "Started" msgstr "已开始" -#: cps/helper.py:620 +#: cps/helper.py:615 msgid "Finished" msgstr "已完成" -#: cps/helper.py:622 +#: cps/helper.py:617 msgid "Unknown Status" msgstr "未知状态" -#: cps/helper.py:627 +#: cps/helper.py:622 msgid "E-mail: " msgstr "" -#: cps/helper.py:629 cps/helper.py:633 +#: cps/helper.py:624 cps/helper.py:628 msgid "Convert: " msgstr "转换:" -#: cps/helper.py:631 +#: cps/helper.py:626 msgid "Upload: " msgstr "上传:" -#: cps/helper.py:635 +#: cps/helper.py:630 msgid "Unknown Task: " msgstr "未知任务:" -#: cps/oauth_bb.py:87 +#: cps/oauth_bb.py:91 #, python-format -msgid "Register with %s, " +msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:145 +#: cps/oauth_bb.py:149 msgid "Failed to log in with GitHub." msgstr "" -#: cps/oauth_bb.py:150 +#: cps/oauth_bb.py:154 msgid "Failed to fetch user info from GitHub." msgstr "" -#: cps/oauth_bb.py:161 +#: cps/oauth_bb.py:165 msgid "Failed to log in with Google." msgstr "" -#: cps/oauth_bb.py:166 +#: cps/oauth_bb.py:170 msgid "Failed to fetch user info from Google." msgstr "" -#: cps/oauth_bb.py:265 +#: cps/oauth_bb.py:269 #, python-format msgid "Unlink to %(oauth)s success." msgstr "" -#: cps/oauth_bb.py:269 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s failed." msgstr "" -#: cps/oauth_bb.py:272 +#: cps/oauth_bb.py:276 #, python-format msgid "Not linked to %(oauth)s." msgstr "" -#: cps/oauth_bb.py:300 +#: cps/oauth_bb.py:304 msgid "GitHub Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:319 +#: cps/oauth_bb.py:323 msgid "Google Oauth error, please retry later." msgstr "" -#: cps/shelf.py:40 cps/shelf.py:92 +#: cps/shelf.py:46 cps/shelf.py:98 msgid "Invalid shelf specified" msgstr "指定的书架无效" -#: cps/shelf.py:47 +#: cps/shelf.py:53 #, python-format msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" msgstr "对不起,您没有添加书籍到书架 %(shelfname)s 的权限" -#: cps/shelf.py:55 +#: cps/shelf.py:61 msgid "You are not allowed to edit public shelves" msgstr "您没有编辑书架的权限" -#: cps/shelf.py:64 +#: cps/shelf.py:70 #, python-format msgid "Book is already part of the shelf: %(shelfname)s" msgstr "此书已经是书架 %(shelfname)s 的一部分" -#: cps/shelf.py:78 +#: cps/shelf.py:84 #, python-format msgid "Book has been added to shelf: %(sname)s" msgstr "此书已被添加到书架: %(sname)s" -#: cps/shelf.py:97 +#: cps/shelf.py:103 #, python-format msgid "You are not allowed to add a book to the the shelf: %(name)s" msgstr "您没有添加书籍到书架 %(name)s 的权限" -#: cps/shelf.py:102 +#: cps/shelf.py:108 msgid "User is not allowed to edit public shelves" msgstr "用户没有编辑公开书架的权限" -#: cps/shelf.py:120 +#: cps/shelf.py:126 #, python-format msgid "Books are already part of the shelf: %(name)s" msgstr "书籍已经在书架 %(name)s 中了" -#: cps/shelf.py:134 +#: cps/shelf.py:140 #, python-format msgid "Books have been added to shelf: %(sname)s" msgstr "书籍已经被添加到书架 %(sname)s 中'" -#: cps/shelf.py:136 +#: cps/shelf.py:142 #, python-format msgid "Could not add books to shelf: %(sname)s" msgstr "无法添加书籍到书架: %(sname)s" -#: cps/shelf.py:173 +#: cps/shelf.py:179 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "此书已从书架 %(sname)s 中删除" -#: cps/shelf.py:179 +#: cps/shelf.py:185 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "对不起,您没有从书架 %(sname)s 中删除书籍的权限" -#: cps/shelf.py:200 cps/shelf.py:224 +#: cps/shelf.py:206 cps/shelf.py:230 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "已存在书架 '%(title)s'。" -#: cps/shelf.py:205 +#: cps/shelf.py:211 #, python-format msgid "Shelf %(title)s created" msgstr "书架 %(title)s 已被创建" -#: cps/shelf.py:207 cps/shelf.py:235 +#: cps/shelf.py:213 cps/shelf.py:241 msgid "There was an error" msgstr "发生错误" -#: cps/shelf.py:208 cps/shelf.py:210 +#: cps/shelf.py:214 cps/shelf.py:216 msgid "create a shelf" msgstr "创建书架" -#: cps/shelf.py:233 +#: cps/shelf.py:239 #, python-format msgid "Shelf %(title)s changed" msgstr "书架 %(title)s 已被修改" -#: cps/shelf.py:236 cps/shelf.py:238 +#: cps/shelf.py:242 cps/shelf.py:244 msgid "Edit a shelf" msgstr "编辑书架" -#: cps/shelf.py:259 -#, python-format -msgid "successfully deleted shelf %(name)s" -msgstr "成功删除书架 %(name)s" - -#: cps/shelf.py:289 +#: cps/shelf.py:295 #, python-format msgid "Shelf: '%(name)s'" msgstr "书架: '%(name)s'" -#: cps/shelf.py:292 +#: cps/shelf.py:298 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "打开书架出错。书架不存在或不可访问" -#: cps/shelf.py:324 +#: cps/shelf.py:330 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "修改书架 '%(name)s' 顺序" -#: cps/ub.py:111 +#: cps/ub.py:68 msgid "Recently Added" msgstr "最近添加" -#: cps/ub.py:113 +#: cps/ub.py:70 msgid "Show recent books" msgstr "显示最近书籍" -#: cps/templates/index.xml:17 cps/ub.py:114 +#: cps/templates/index.xml:17 cps/ub.py:71 msgid "Hot Books" msgstr "热门书籍" -#: cps/ub.py:115 +#: cps/ub.py:72 msgid "Show hot books" msgstr "显示热门书籍" -#: cps/templates/index.xml:24 cps/ub.py:118 +#: cps/templates/index.xml:24 cps/ub.py:75 msgid "Best rated Books" msgstr "最高评分书籍" -#: cps/ub.py:120 +#: cps/ub.py:77 msgid "Show best rated books" msgstr "显示最高评分书籍" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:121 -#: cps/web.py:965 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:78 +#: cps/web.py:958 msgid "Read Books" msgstr "已读书籍" -#: cps/ub.py:123 +#: cps/ub.py:80 msgid "Show read and unread" msgstr "显示已读和未读" -#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:125 -#: cps/web.py:969 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:82 +#: cps/web.py:962 msgid "Unread Books" msgstr "未读书籍" -#: cps/ub.py:127 +#: cps/ub.py:84 msgid "Show unread" msgstr "" -#: cps/ub.py:128 +#: cps/ub.py:85 msgid "Discover" msgstr "发现" -#: cps/ub.py:130 +#: cps/ub.py:87 msgid "Show random books" msgstr "显示随机书籍" -#: cps/ub.py:131 +#: cps/ub.py:88 msgid "Categories" msgstr "分类" -#: cps/ub.py:133 +#: cps/ub.py:90 msgid "Show category selection" msgstr "显示分类选择" #: cps/templates/book_edit.html:71 cps/templates/search_form.html:53 -#: cps/ub.py:134 +#: cps/ub.py:91 msgid "Series" msgstr "丛书" -#: cps/ub.py:136 +#: cps/ub.py:93 msgid "Show series selection" msgstr "显示丛书选择" -#: cps/templates/index.xml:61 cps/ub.py:137 +#: cps/templates/index.xml:61 cps/ub.py:94 msgid "Authors" msgstr "作者" -#: cps/ub.py:139 +#: cps/ub.py:96 msgid "Show author selection" msgstr "显示作者选择" -#: cps/templates/index.xml:68 cps/ub.py:141 +#: cps/templates/index.xml:68 cps/ub.py:98 msgid "Publishers" msgstr "出版社" -#: cps/ub.py:143 +#: cps/ub.py:100 msgid "Show publisher selection" msgstr "显示出版社选择" -#: cps/templates/search_form.html:74 cps/ub.py:144 +#: cps/templates/search_form.html:74 cps/ub.py:101 msgid "Languages" msgstr "语言" -#: cps/ub.py:147 +#: cps/ub.py:104 msgid "Show language selection" msgstr "显示语言选择" -#: cps/ub.py:148 +#: cps/ub.py:105 msgid "Ratings" msgstr "" -#: cps/ub.py:150 +#: cps/ub.py:107 msgid "Show ratings selection" msgstr "" -#: cps/ub.py:151 +#: cps/ub.py:108 msgid "File formats" msgstr "" -#: cps/ub.py:153 +#: cps/ub.py:110 msgid "Show file formats selection" msgstr "" -#: cps/updater.py:257 cps/updater.py:364 cps/updater.py:377 +#: cps/updater.py:253 cps/updater.py:360 cps/updater.py:373 msgid "Unexpected data while reading update information" msgstr "读取更新信息时出现异常数据" -#: cps/updater.py:264 cps/updater.py:370 +#: cps/updater.py:260 cps/updater.py:366 msgid "No update available. You already have the latest version installed" msgstr "没有可用更新。您已经安装了最新版本" -#: cps/updater.py:290 cps/updater.py:422 +#: cps/updater.py:286 msgid "A new update is available. Click on the button below to update to the latest version." msgstr "有一个更新可用。点击正文按钮更新到最新版本。" -#: cps/updater.py:343 +#: cps/updater.py:339 msgid "Could not fetch update information" msgstr "无法获取更新信息" -#: cps/updater.py:357 +#: cps/updater.py:353 msgid "No release information available" msgstr "" -#: cps/updater.py:403 cps/updater.py:412 +#: cps/updater.py:406 cps/updater.py:415 #, python-format msgid "A new update is available. Click on the button below to update to version: %(version)s" msgstr "" -#: cps/web.py:457 +#: cps/updater.py:425 +msgid "Click on the button below to update to the latest stable version." +msgstr "" + +#: cps/web.py:445 msgid "Recently Added Books" msgstr "最近添加的书籍" -#: cps/web.py:484 +#: cps/web.py:473 msgid "Best rated books" msgstr "最高评分书籍" -#: cps/templates/index.xml:38 cps/web.py:492 +#: cps/templates/index.xml:38 cps/web.py:481 msgid "Random Books" msgstr "随机书籍" -#: cps/web.py:516 +#: cps/web.py:505 msgid "Books" msgstr "" -#: cps/web.py:543 +#: cps/web.py:532 msgid "Hot Books (most downloaded)" msgstr "热门书籍(最多下载)" -#: cps/web.py:553 cps/web.py:1294 cps/web.py:1383 +#: cps/web.py:542 cps/web.py:1298 cps/web.py:1386 msgid "Error opening eBook. File does not exist or file is not accessible:" msgstr "无法打开电子书。 文件不存在或者文件不可访问:" -#: cps/web.py:580 +#: cps/web.py:559 +#, python-format +msgid "Author: %(name)s" +msgstr "" + +#: cps/web.py:571 #, python-format msgid "Publisher: %(name)s" msgstr "出版社: %(name)s" -#: cps/web.py:591 +#: cps/web.py:582 #, python-format msgid "Series: %(serie)s" msgstr "丛书: %(serie)s" -#: cps/web.py:602 +#: cps/web.py:593 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:613 +#: cps/web.py:604 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:625 +#: cps/web.py:616 #, python-format msgid "Category: %(name)s" msgstr "分类: %(name)s" -#: cps/web.py:659 +#: cps/web.py:650 msgid "Publisher list" msgstr "出版社列表" -#: cps/templates/index.xml:82 cps/web.py:675 +#: cps/templates/index.xml:82 cps/web.py:666 msgid "Series list" msgstr "丛书列表" -#: cps/web.py:689 +#: cps/web.py:680 msgid "Ratings list" msgstr "" -#: cps/web.py:702 +#: cps/web.py:693 msgid "File formats list" msgstr "" -#: cps/web.py:730 +#: cps/web.py:721 msgid "Available languages" msgstr "可用语言" -#: cps/web.py:750 +#: cps/web.py:741 #, python-format msgid "Language: %(name)s" msgstr "语言: %(name)s" -#: cps/templates/index.xml:75 cps/web.py:764 +#: cps/templates/index.xml:75 cps/web.py:755 msgid "Category list" msgstr "分类列表" -#: cps/templates/layout.html:73 cps/web.py:777 +#: cps/templates/layout.html:73 cps/web.py:769 msgid "Tasks" msgstr "任务" -#: cps/web.py:841 +#: cps/web.py:834 msgid "Published after " msgstr "出版时晚于 " -#: cps/web.py:848 +#: cps/web.py:841 msgid "Published before " msgstr "出版时早于 " -#: cps/web.py:862 +#: cps/web.py:855 #, python-format msgid "Rating <= %(rating)s" msgstr "评分 <= %(rating)s" -#: cps/web.py:864 +#: cps/web.py:857 #, python-format msgid "Rating >= %(rating)s" msgstr "评分 >= %(rating)s" -#: cps/web.py:924 cps/web.py:933 +#: cps/web.py:917 cps/web.py:926 msgid "search" msgstr "搜索" -#: cps/web.py:1018 +#: cps/web.py:1012 msgid "Please configure the SMTP mail settings first..." msgstr "请先配置SMTP邮箱..." -#: cps/web.py:1023 +#: cps/web.py:1017 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "书籍已经被成功加入 %(kindlemail)s 的发送队列" -#: cps/web.py:1027 +#: cps/web.py:1021 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "发送这本书的时候出现错误: %(res)s" -#: cps/web.py:1046 cps/web.py:1071 cps/web.py:1076 cps/web.py:1081 -#: cps/web.py:1085 +#: cps/web.py:1041 cps/web.py:1066 cps/web.py:1070 cps/web.py:1075 +#: cps/web.py:1079 msgid "register" msgstr "注册" -#: cps/web.py:1073 +#: cps/web.py:1068 msgid "Your e-mail is not allowed to register" msgstr "您的邮箱不能用来注册" -#: cps/web.py:1077 +#: cps/web.py:1071 msgid "Confirmation e-mail was send to your e-mail account." msgstr "确认邮件已经发送到您的邮箱。" -#: cps/web.py:1080 +#: cps/web.py:1074 msgid "This username or e-mail address is already in use." msgstr "这个用户名或者邮箱已经被使用。" -#: cps/web.py:1103 cps/web.py:1115 -#, python-format -msgid "You are now logged in as: '%(nickname)s'" +#: cps/web.py:1089 +msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1108 cps/web.py:1120 +#: cps/web.py:1098 cps/web.py:1212 +#, python-format +msgid "you are now logged in as: '%(nickname)s'" +msgstr "您现在已以'%(nickname)s'身份登录" + +#: cps/web.py:1105 cps/web.py:1122 msgid "Wrong Username or Password" msgstr "用户名或密码错误" -#: cps/web.py:1111 +#: cps/web.py:1108 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "" -#: cps/web.py:1124 cps/web.py:1146 +#: cps/web.py:1117 +#, python-format +msgid "You are now logged in as: '%(nickname)s'" +msgstr "" + +#: cps/web.py:1126 cps/web.py:1148 msgid "login" msgstr "登录" -#: cps/web.py:1158 cps/web.py:1189 +#: cps/web.py:1160 cps/web.py:1191 msgid "Token not found" msgstr "找不到Token" -#: cps/web.py:1166 cps/web.py:1197 +#: cps/web.py:1168 cps/web.py:1199 msgid "Token has expired" msgstr "Token已过期" -#: cps/web.py:1174 +#: cps/web.py:1176 msgid "Success! Please return to your device" msgstr "成功!请返回您的设备" -#: cps/web.py:1210 -#, python-format -msgid "you are now logged in as: '%(nickname)s'" -msgstr "您现在已以'%(nickname)s'身份登录" - -#: cps/web.py:1250 cps/web.py:1277 cps/web.py:1281 +#: cps/web.py:1253 cps/web.py:1280 cps/web.py:1284 #, python-format msgid "%(name)s's profile" msgstr "%(name)s 的资料" -#: cps/web.py:1274 +#: cps/web.py:1277 msgid "Found an existing account for this e-mail address." msgstr "找到一个已有账号使用这个邮箱。" -#: cps/web.py:1279 +#: cps/web.py:1282 msgid "Profile updated" msgstr "资料已更新" -#: cps/web.py:1304 cps/web.py:1306 cps/web.py:1308 cps/web.py:1314 -#: cps/web.py:1318 +#: cps/web.py:1308 cps/web.py:1310 cps/web.py:1312 cps/web.py:1318 +#: cps/web.py:1322 msgid "Read a Book" msgstr "阅读一本书" -#: cps/web.py:1328 +#: cps/web.py:1332 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "" -#: cps/worker.py:308 +#: cps/worker.py:311 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "电子书转换器失败: %(error)s" -#: cps/worker.py:319 +#: cps/worker.py:322 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Kindlegen 因为错误 %(error)s 失败。消息: %(message)s" @@ -1056,53 +1066,57 @@ msgid "Administration" msgstr "管理" #: cps/templates/admin.html:109 +msgid "View Logfiles" +msgstr "" + +#: cps/templates/admin.html:110 msgid "Reconnect to Calibre DB" msgstr "重新连接到Calibre数据库" -#: cps/templates/admin.html:110 +#: cps/templates/admin.html:111 msgid "Restart Calibre-Web" msgstr "重启 Calibre-Web" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:112 msgid "Stop Calibre-Web" msgstr "停止 Calibre-Web" -#: cps/templates/admin.html:117 +#: cps/templates/admin.html:118 msgid "Update" msgstr "更新" -#: cps/templates/admin.html:121 +#: cps/templates/admin.html:122 msgid "Version" msgstr "版本" -#: cps/templates/admin.html:122 +#: cps/templates/admin.html:123 msgid "Details" msgstr "详情" -#: cps/templates/admin.html:128 +#: cps/templates/admin.html:129 msgid "Current version" msgstr "当前版本" -#: cps/templates/admin.html:134 +#: cps/templates/admin.html:135 msgid "Check for update" msgstr "检查更新" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:136 msgid "Perform Update" msgstr "执行更新" -#: cps/templates/admin.html:147 +#: cps/templates/admin.html:148 msgid "Do you really want to restart Calibre-Web?" msgstr "您确定要重启 Calibre-Web 吗?" -#: cps/templates/admin.html:152 cps/templates/admin.html:166 -#: cps/templates/admin.html:186 cps/templates/shelf.html:72 +#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:187 cps/templates/shelf.html:72 msgid "Ok" msgstr "确定" -#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:154 cps/templates/admin.html:168 #: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:281 cps/templates/config_view_edit.html:147 +#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:74 #: cps/templates/layout.html:28 cps/templates/shelf.html:73 #: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:12 @@ -1110,11 +1124,11 @@ msgstr "确定" msgid "Back" msgstr "后退" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:166 msgid "Do you really want to stop Calibre-Web?" msgstr "您确定要关闭 Calibre-Web 吗?" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:178 msgid "Updating, please do not reload page" msgstr "正在更新,请不要刷新页面" @@ -1243,7 +1257,7 @@ msgstr "编辑后查看书籍" msgid "Get metadata" msgstr "获取元数据" -#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:279 +#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329 #: cps/templates/config_view_edit.html:146 cps/templates/login.html:20 #: cps/templates/search_form.html:150 cps/templates/shelf_edit.html:17 #: cps/templates/user_edit.html:130 @@ -1387,123 +1401,171 @@ msgstr "日志级别" msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "日志文件位置和名称(默认为calibre-web.log)" -#: cps/templates/config_edit.html:140 +#: cps/templates/config_edit.html:134 +msgid "Enable Access Log" +msgstr "" + +#: cps/templates/config_edit.html:137 +msgid "Location and name of access logfile (access.log for no entry)" +msgstr "" + +#: cps/templates/config_edit.html:148 msgid "Feature Configuration" msgstr "特性配置" -#: cps/templates/config_edit.html:148 +#: cps/templates/config_edit.html:156 msgid "Enable uploading" msgstr "启用上传" -#: cps/templates/config_edit.html:152 +#: cps/templates/config_edit.html:160 msgid "Enable anonymous browsing" msgstr "启用匿名浏览" -#: cps/templates/config_edit.html:156 +#: cps/templates/config_edit.html:164 msgid "Enable public registration" msgstr "启用注册" -#: cps/templates/config_edit.html:160 +#: cps/templates/config_edit.html:168 msgid "Enable remote login (\"magic link\")" msgstr "启用远程登录 ('魔法链接')" -#: cps/templates/config_edit.html:165 +#: cps/templates/config_edit.html:173 msgid "Use" msgstr "使用" -#: cps/templates/config_edit.html:166 +#: cps/templates/config_edit.html:174 msgid "Obtain an API Key" msgstr "获取API Key" -#: cps/templates/config_edit.html:170 +#: cps/templates/config_edit.html:178 msgid "Goodreads API Key" msgstr "" -#: cps/templates/config_edit.html:174 +#: cps/templates/config_edit.html:182 msgid "Goodreads API Secret" msgstr "" -#: cps/templates/config_edit.html:181 +#: cps/templates/config_edit.html:189 msgid "Login type" msgstr "" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:191 msgid "Use standard Authentication" msgstr "" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:193 msgid "Use LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:188 +#: cps/templates/config_edit.html:196 msgid "Use GitHub OAuth" msgstr "" -#: cps/templates/config_edit.html:189 +#: cps/templates/config_edit.html:197 msgid "Use Google OAuth" msgstr "" -#: cps/templates/config_edit.html:196 -msgid "LDAP Provider URL" +#: cps/templates/config_edit.html:204 +msgid "LDAP Server Host Name or IP Address" +msgstr "" + +#: cps/templates/config_edit.html:208 +msgid "LDAP Server Port" +msgstr "" + +#: cps/templates/config_edit.html:212 +msgid "LDAP schema (ldap or ldaps)" +msgstr "" + +#: cps/templates/config_edit.html:216 +msgid "LDAP Admin username" +msgstr "" + +#: cps/templates/config_edit.html:220 +msgid "LDAP Admin password" +msgstr "" + +#: cps/templates/config_edit.html:225 +msgid "LDAP Server use SSL" msgstr "" -#: cps/templates/config_edit.html:200 +#: cps/templates/config_edit.html:229 +msgid "LDAP Server use TLS" +msgstr "" + +#: cps/templates/config_edit.html:233 +msgid "LDAP Server Certificate" +msgstr "" + +#: cps/templates/config_edit.html:237 +msgid "LDAP SSL Certificate Path" +msgstr "" + +#: cps/templates/config_edit.html:242 msgid "LDAP Distinguished Name (DN)" msgstr "" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:246 +msgid "LDAP User object filter" +msgstr "" + +#: cps/templates/config_edit.html:251 +msgid "LDAP Server is OpenLDAP?" +msgstr "" + +#: cps/templates/config_edit.html:258 msgid "Obtain GitHub OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:211 +#: cps/templates/config_edit.html:261 msgid "GitHub OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:215 +#: cps/templates/config_edit.html:265 msgid "GitHub OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:221 +#: cps/templates/config_edit.html:271 msgid "Obtain Google OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:224 +#: cps/templates/config_edit.html:274 msgid "Google OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:228 +#: cps/templates/config_edit.html:278 msgid "Google OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:242 +#: cps/templates/config_edit.html:292 msgid "External binaries" msgstr "外部二进制" -#: cps/templates/config_edit.html:250 +#: cps/templates/config_edit.html:300 msgid "No converter" msgstr "没有转换器" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:302 msgid "Use Kindlegen" msgstr "使用Kindlegen" -#: cps/templates/config_edit.html:254 +#: cps/templates/config_edit.html:304 msgid "Use calibre's ebook converter" msgstr "使用calibre的电子书转换器" -#: cps/templates/config_edit.html:258 +#: cps/templates/config_edit.html:308 msgid "E-Book converter settings" msgstr "电子书转换设置" -#: cps/templates/config_edit.html:262 +#: cps/templates/config_edit.html:312 msgid "Path to convertertool" msgstr "转换工具路径" -#: cps/templates/config_edit.html:268 +#: cps/templates/config_edit.html:318 msgid "Location of Unrar binary" msgstr "Unrar二进制位置" -#: cps/templates/config_edit.html:284 cps/templates/layout.html:84 +#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 #: cps/templates/login.html:4 msgid "Login" msgstr "登录" @@ -1717,7 +1779,7 @@ msgstr "" msgid "Discover (Random Books)" msgstr "发现(随机书籍)" -#: cps/templates/index.html:65 +#: cps/templates/index.html:64 msgid "Group by series" msgstr "" @@ -1860,6 +1922,14 @@ msgstr "记住我" msgid "Log in with magic link" msgstr "通过魔法链接登录" +#: cps/templates/logviewer.html:5 +msgid "Show Calibre-Web log" +msgstr "" + +#: cps/templates/logviewer.html:8 +msgid "Show access log" +msgstr "" + #: cps/templates/osd.xml:5 msgid "Calibre-Web ebook catalog" msgstr "Caliebre-Web电子书目录" @@ -3427,13 +3497,13 @@ msgstr "最近下载" #~ msgstr "扎扎其语" #~ msgid "Failed to create path for cover %(path)s (Permission denied)." -#~ msgstr "为封面 %(path)s 创建路径失败(权限拒绝)。" +#~ msgstr "" #~ msgid "Failed to store cover-file %(cover)s." -#~ msgstr "保存封面文件 %(cover)s 失败。" +#~ msgstr "" #~ msgid "Cover-file is not a valid image file" -#~ msgstr "封面文件不是一个有效的图片文件" +#~ msgstr "" #~ msgid "Cover is not a jpg file, can't save" #~ msgstr "封面不是一个jpg文件,无法保存" @@ -3492,3 +3562,15 @@ msgstr "最近下载" #~ msgid "PDF.js viewer" #~ msgstr "PDF.js 查看器" +#~ msgid "Please enter a LDAP provider and a DN" +#~ msgstr "" + +#~ msgid "successfully deleted shelf %(name)s" +#~ msgstr "成功删除书架 %(name)s" + +#~ msgid "LDAP Provider URL" +#~ msgstr "" + +#~ msgid "Register with %s, " +#~ msgstr "" + diff --git a/cps/ub.py b/cps/ub.py index 7469638e..9d04a908 100644 --- a/cps/ub.py +++ b/cps/ub.py @@ -171,18 +171,12 @@ class UserBase: def __repr__(self): return '' % self.nickname - # Login via LDAP method - '''@staticmethod - def try_login(username, password,config_dn, ldap_provider_url): - conn = get_ldap_connection(ldap_provider_url) - conn.simple_bind_s( - config_dn.replace("%s", username), - password)''' # Baseclass for Users in Calibre-Web, settings which are depending on certain users are stored here. It is derived from # User Base (all access methods are declared there) class User(UserBase, Base): __tablename__ = 'user' + __table_args__ = {'sqlite_autoincrement': True} id = Column(Integer, primary_key=True) nickname = Column(String(64), unique=True) @@ -769,6 +763,34 @@ def migrate_Database(): conn.execute("ALTER TABLE Settings ADD column `config_access_log` INTEGER DEFAULT 0") conn.execute("ALTER TABLE Settings ADD column `config_access_logfile` String DEFAULT ''") session.commit() + try: + # check if one table with autoincrement is existing (should be user table) + conn = engine.connect() + conn.execute("SELECT COUNT(*) FROM sqlite_sequence WHERE name='user'") + except exc.OperationalError: + # Create new table user_id and copy contents of table user into it + conn = engine.connect() + conn.execute("CREATE TABLE user_id (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," + "nickname VARCHAR(64)," + "email VARCHAR(120)," + "role SMALLINT," + "password VARCHAR," + "kindle_mail VARCHAR(120)," + "locale VARCHAR(2)," + "sidebar_view INTEGER," + "default_language VARCHAR(3)," + "mature_content BOOLEAN," + "UNIQUE (nickname)," + "UNIQUE (email)," + "CHECK (mature_content IN (0, 1)))") + conn.execute("INSERT INTO user_id(id, nickname, email, role, password, kindle_mail,locale," + "sidebar_view, default_language, mature_content) " + "SELECT id, nickname, email, role, password, kindle_mail, locale," + "sidebar_view, default_language, mature_content FROM user") + # delete old user table and rename new user_id table to user: + conn.execute("DROP TABLE user") + conn.execute("ALTER TABLE user_id RENAME TO user") + session.commit() # Remove login capability of user Guest conn = engine.connect() @@ -782,13 +804,6 @@ def clean_database(): session.query(RemoteAuthToken).filter(now > RemoteAuthToken.expiration).delete() -'''#get LDAP connection -def get_ldap_connection(ldap_provider_url): - conn = ldap.initialize('ldap://{}'.format(ldap_provider_url)) - return conn''' - - - def create_default_config(): settings = Settings() settings.mail_server = "mail.example.com" diff --git a/messages.pot b/messages.pot index 458c614e..61cb08bf 100644 --- a/messages.pot +++ b/messages.pot @@ -8,20 +8,20 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2019-05-31 11:20+0200\n" +"POT-Creation-Date: 2019-06-22 19:54+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.6.0\n" +"Generated-By: Babel 2.7.0\n" -#: cps/about.py:76 +#: cps/about.py:78 msgid "Statistics" msgstr "" -#: cps/admin.py:97 +#: cps/admin.py:98 msgid "Server restarted, please reload page" msgstr "" @@ -29,186 +29,202 @@ msgstr "" msgid "Performing shutdown of server, please close window" msgstr "" -#: cps/admin.py:120 cps/updater.py:445 +#: cps/admin.py:119 cps/updater.py:448 msgid "Unknown" msgstr "" -#: cps/admin.py:139 +#: cps/admin.py:138 msgid "Admin page" msgstr "" -#: cps/admin.py:208 cps/admin.py:486 +#: cps/admin.py:207 cps/admin.py:532 msgid "Calibre-Web configuration updated" msgstr "" -#: cps/admin.py:222 cps/templates/admin.html:102 +#: cps/admin.py:220 cps/templates/admin.html:102 msgid "UI Configuration" msgstr "" -#: cps/admin.py:295 +#: cps/admin.py:293 msgid "Import of optional Google Drive requirements missing" msgstr "" -#: cps/admin.py:298 +#: cps/admin.py:296 msgid "client_secrets.json is missing or not readable" msgstr "" -#: cps/admin.py:303 cps/admin.py:332 +#: cps/admin.py:301 cps/admin.py:330 msgid "client_secrets.json is not configured for web application" msgstr "" -#: cps/admin.py:335 cps/admin.py:361 cps/admin.py:373 cps/admin.py:398 -#: cps/admin.py:426 cps/admin.py:440 cps/admin.py:463 cps/admin.py:476 -#: cps/admin.py:494 cps/admin.py:501 cps/admin.py:516 -#: cps/templates/admin.html:101 +#: cps/admin.py:333 cps/admin.py:359 cps/admin.py:371 cps/admin.py:396 +#: cps/admin.py:403 cps/admin.py:436 cps/admin.py:460 cps/admin.py:474 +#: cps/admin.py:493 cps/admin.py:510 cps/admin.py:522 cps/admin.py:538 +#: cps/admin.py:545 cps/admin.py:559 cps/templates/admin.html:101 msgid "Basic Configuration" msgstr "" -#: cps/admin.py:358 +#: cps/admin.py:356 msgid "Keyfile location is not valid, please enter correct path" msgstr "" -#: cps/admin.py:370 +#: cps/admin.py:368 cps/admin.py:433 msgid "Certfile location is not valid, please enter correct path" msgstr "" -#: cps/admin.py:395 -msgid "Please enter a LDAP provider and a DN" +#: cps/admin.py:393 +msgid "Please enter a LDAP provider, port, DN and user object identifier" msgstr "" -#: cps/admin.py:423 +#: cps/admin.py:400 +msgid "Please enter a LDAP service account and password" +msgstr "" + +#: cps/admin.py:457 msgid "Please enter Github oauth credentials" msgstr "" -#: cps/admin.py:437 +#: cps/admin.py:471 msgid "Please enter Google oauth credentials" msgstr "" -#: cps/admin.py:460 +#: cps/admin.py:490 msgid "Logfile location is not valid, please enter correct path" msgstr "" -#: cps/admin.py:498 +#: cps/admin.py:507 +msgid "Access Logfile location is not valid, please enter correct path" +msgstr "" + +#: cps/admin.py:542 msgid "DB location is not valid, please enter correct path" msgstr "" -#: cps/admin.py:558 cps/web.py:1045 +#: cps/admin.py:602 cps/web.py:1040 msgid "Please fill out all fields!" msgstr "" -#: cps/admin.py:560 cps/admin.py:566 cps/admin.py:582 +#: cps/admin.py:604 cps/admin.py:610 cps/admin.py:626 #: cps/templates/admin.html:35 msgid "Add new user" msgstr "" -#: cps/admin.py:564 cps/web.py:1248 +#: cps/admin.py:608 cps/web.py:1251 msgid "E-mail is not from valid domain" msgstr "" -#: cps/admin.py:572 +#: cps/admin.py:616 #, python-format msgid "User '%(user)s' created" msgstr "" -#: cps/admin.py:576 +#: cps/admin.py:620 msgid "Found an existing account for this e-mail address or nickname." msgstr "" -#: cps/admin.py:607 +#: cps/admin.py:651 #, python-format msgid "Test e-mail successfully send to %(kindlemail)s" msgstr "" -#: cps/admin.py:610 +#: cps/admin.py:654 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "" -#: cps/admin.py:612 cps/web.py:1029 +#: cps/admin.py:656 cps/web.py:1023 msgid "Please configure your kindle e-mail address first..." msgstr "" -#: cps/admin.py:614 +#: cps/admin.py:658 msgid "E-mail server settings updated" msgstr "" -#: cps/admin.py:615 +#: cps/admin.py:659 msgid "Edit e-mail server settings" msgstr "" -#: cps/admin.py:640 +#: cps/admin.py:687 #, python-format msgid "User '%(nick)s' deleted" msgstr "" -#: cps/admin.py:711 +#: cps/admin.py:690 +msgid "No admin user remaining, can't delete user" +msgstr "" + +#: cps/admin.py:761 #, python-format msgid "User '%(nick)s' updated" msgstr "" -#: cps/admin.py:714 +#: cps/admin.py:764 msgid "An unknown error occured." msgstr "" -#: cps/admin.py:717 +#: cps/admin.py:767 #, python-format msgid "Edit User %(nick)s" msgstr "" -#: cps/admin.py:733 +#: cps/admin.py:783 #, python-format msgid "Password for user %(user)s reset" msgstr "" -#: cps/admin.py:736 cps/web.py:1070 +#: cps/admin.py:786 cps/web.py:1065 msgid "An unknown error occurred. Please try again later." msgstr "" -#: cps/admin.py:755 +#: cps/admin.py:797 +msgid "Logfile viewer" +msgstr "" + +#: cps/admin.py:832 msgid "Requesting update package" msgstr "" -#: cps/admin.py:756 +#: cps/admin.py:833 msgid "Downloading update package" msgstr "" -#: cps/admin.py:757 +#: cps/admin.py:834 msgid "Unzipping update package" msgstr "" -#: cps/admin.py:758 +#: cps/admin.py:835 msgid "Replacing files" msgstr "" -#: cps/admin.py:759 +#: cps/admin.py:836 msgid "Database connections are closed" msgstr "" -#: cps/admin.py:760 +#: cps/admin.py:837 msgid "Stopping server" msgstr "" -#: cps/admin.py:761 +#: cps/admin.py:838 msgid "Update finished, please press okay and reload page" msgstr "" -#: cps/admin.py:762 cps/admin.py:763 cps/admin.py:764 cps/admin.py:765 +#: cps/admin.py:839 cps/admin.py:840 cps/admin.py:841 cps/admin.py:842 msgid "Update failed:" msgstr "" -#: cps/admin.py:762 cps/updater.py:277 cps/updater.py:456 cps/updater.py:458 +#: cps/admin.py:839 cps/updater.py:273 cps/updater.py:459 cps/updater.py:461 msgid "HTTP Error" msgstr "" -#: cps/admin.py:763 cps/updater.py:279 cps/updater.py:460 +#: cps/admin.py:840 cps/updater.py:275 cps/updater.py:463 msgid "Connection error" msgstr "" -#: cps/admin.py:764 cps/updater.py:281 cps/updater.py:462 +#: cps/admin.py:841 cps/updater.py:277 cps/updater.py:465 msgid "Timeout while establishing connection" msgstr "" -#: cps/admin.py:765 cps/updater.py:283 cps/updater.py:464 +#: cps/admin.py:842 cps/updater.py:279 cps/updater.py:467 msgid "General error" msgstr "" @@ -226,720 +242,714 @@ msgstr "" msgid "not configured" msgstr "" -#: cps/editbooks.py:218 cps/editbooks.py:432 +#: cps/editbooks.py:215 cps/editbooks.py:394 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "" -#: cps/editbooks.py:246 +#: cps/editbooks.py:243 msgid "edit metadata" msgstr "" -#: cps/editbooks.py:325 cps/editbooks.py:595 +#: cps/editbooks.py:322 cps/editbooks.py:557 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "" -#: cps/editbooks.py:329 cps/editbooks.py:599 +#: cps/editbooks.py:326 cps/editbooks.py:561 msgid "File to be uploaded must have an extension" msgstr "" -#: cps/editbooks.py:341 cps/editbooks.py:619 +#: cps/editbooks.py:338 cps/editbooks.py:581 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "" -#: cps/editbooks.py:346 +#: cps/editbooks.py:343 #, python-format msgid "Failed to store file %(file)s." msgstr "" -#: cps/editbooks.py:363 +#: cps/editbooks.py:360 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "" -#: cps/editbooks.py:382 -#, python-format -msgid "Failed to create path for cover %(path)s (Permission denied)." -msgstr "" - -#: cps/editbooks.py:390 -#, python-format -msgid "Failed to store cover-file %(cover)s." -msgstr "" - -#: cps/editbooks.py:393 -msgid "Cover-file is not a valid image file" -msgstr "" - -#: cps/editbooks.py:399 cps/editbooks.py:413 +#: cps/editbooks.py:374 msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" msgstr "" -#: cps/editbooks.py:445 cps/editbooks.py:454 +#: cps/editbooks.py:407 cps/editbooks.py:416 msgid "unknown" msgstr "" -#: cps/editbooks.py:486 +#: cps/editbooks.py:448 msgid "Cover is not a jpg file, can't save" msgstr "" -#: cps/editbooks.py:534 +#: cps/editbooks.py:496 #, python-format msgid "%(langname)s is not a valid language" msgstr "" -#: cps/editbooks.py:565 +#: cps/editbooks.py:527 msgid "Metadata successfully updated" msgstr "" -#: cps/editbooks.py:574 +#: cps/editbooks.py:536 msgid "Error editing book, please check logfile for details" msgstr "" -#: cps/editbooks.py:624 +#: cps/editbooks.py:586 #, python-format msgid "Failed to store file %(file)s (Permission denied)." msgstr "" -#: cps/editbooks.py:629 +#: cps/editbooks.py:591 #, python-format msgid "Failed to delete file %(file)s (Permission denied)." msgstr "" -#: cps/editbooks.py:712 +#: cps/editbooks.py:674 #, python-format msgid "File %(file)s uploaded" msgstr "" -#: cps/editbooks.py:741 +#: cps/editbooks.py:703 msgid "Source or destination format for conversion missing" msgstr "" -#: cps/editbooks.py:751 +#: cps/editbooks.py:711 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "" -#: cps/editbooks.py:755 +#: cps/editbooks.py:715 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "" -#: cps/gdrive.py:56 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgstr "" -#: cps/gdrive.py:101 +#: cps/gdrive.py:106 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "" -#: cps/helper.py:97 +#: cps/helper.py:94 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "" -#: cps/helper.py:109 +#: cps/helper.py:106 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "" -#: cps/helper.py:116 cps/helper.py:223 cps/templates/detail.html:41 +#: cps/helper.py:113 cps/helper.py:220 cps/templates/detail.html:41 #: cps/templates/detail.html:45 msgid "Send to Kindle" msgstr "" -#: cps/helper.py:117 cps/helper.py:135 cps/helper.py:225 +#: cps/helper.py:114 cps/helper.py:132 cps/helper.py:222 msgid "This e-mail has been sent via Calibre-Web." msgstr "" -#: cps/helper.py:128 +#: cps/helper.py:125 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "" -#: cps/helper.py:133 +#: cps/helper.py:130 msgid "Calibre-Web test e-mail" msgstr "" -#: cps/helper.py:134 +#: cps/helper.py:131 msgid "Test e-mail" msgstr "" -#: cps/helper.py:150 +#: cps/helper.py:147 msgid "Get Started with Calibre-Web" msgstr "" -#: cps/helper.py:151 +#: cps/helper.py:148 #, python-format msgid "Registration e-mail for user: %(name)s" msgstr "" -#: cps/helper.py:165 cps/helper.py:167 cps/helper.py:169 cps/helper.py:177 -#: cps/helper.py:179 cps/helper.py:181 +#: cps/helper.py:162 cps/helper.py:164 cps/helper.py:166 cps/helper.py:174 +#: cps/helper.py:176 cps/helper.py:178 #, python-format msgid "Send %(format)s to Kindle" msgstr "" -#: cps/helper.py:185 +#: cps/helper.py:182 #, python-format msgid "Convert %(orig)s to %(format)s and send to Kindle" msgstr "" -#: cps/helper.py:224 +#: cps/helper.py:221 #, python-format msgid "E-mail: %(book)s" msgstr "" -#: cps/helper.py:227 +#: cps/helper.py:224 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "" -#: cps/helper.py:335 +#: cps/helper.py:331 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "" -#: cps/helper.py:345 +#: cps/helper.py:341 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "" -#: cps/helper.py:359 +#: cps/helper.py:355 #, python-format msgid "Rename file in path '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "" -#: cps/helper.py:385 cps/helper.py:395 cps/helper.py:403 +#: cps/helper.py:381 cps/helper.py:391 cps/helper.py:399 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "" -#: cps/helper.py:424 +#: cps/helper.py:420 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "" -#: cps/helper.py:584 +#: cps/helper.py:579 msgid "Error excecuting UnRar" msgstr "" -#: cps/helper.py:586 +#: cps/helper.py:581 msgid "Unrar binary file not found" msgstr "" -#: cps/helper.py:614 +#: cps/helper.py:609 msgid "Waiting" msgstr "" -#: cps/helper.py:616 +#: cps/helper.py:611 msgid "Failed" msgstr "" -#: cps/helper.py:618 +#: cps/helper.py:613 msgid "Started" msgstr "" -#: cps/helper.py:620 +#: cps/helper.py:615 msgid "Finished" msgstr "" -#: cps/helper.py:622 +#: cps/helper.py:617 msgid "Unknown Status" msgstr "" -#: cps/helper.py:627 +#: cps/helper.py:622 msgid "E-mail: " msgstr "" -#: cps/helper.py:629 cps/helper.py:633 +#: cps/helper.py:624 cps/helper.py:628 msgid "Convert: " msgstr "" -#: cps/helper.py:631 +#: cps/helper.py:626 msgid "Upload: " msgstr "" -#: cps/helper.py:635 +#: cps/helper.py:630 msgid "Unknown Task: " msgstr "" -#: cps/oauth_bb.py:87 +#: cps/oauth_bb.py:91 #, python-format -msgid "Register with %s, " +msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:145 +#: cps/oauth_bb.py:149 msgid "Failed to log in with GitHub." msgstr "" -#: cps/oauth_bb.py:150 +#: cps/oauth_bb.py:154 msgid "Failed to fetch user info from GitHub." msgstr "" -#: cps/oauth_bb.py:161 +#: cps/oauth_bb.py:165 msgid "Failed to log in with Google." msgstr "" -#: cps/oauth_bb.py:166 +#: cps/oauth_bb.py:170 msgid "Failed to fetch user info from Google." msgstr "" -#: cps/oauth_bb.py:265 +#: cps/oauth_bb.py:269 #, python-format msgid "Unlink to %(oauth)s success." msgstr "" -#: cps/oauth_bb.py:269 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s failed." msgstr "" -#: cps/oauth_bb.py:272 +#: cps/oauth_bb.py:276 #, python-format msgid "Not linked to %(oauth)s." msgstr "" -#: cps/oauth_bb.py:300 +#: cps/oauth_bb.py:304 msgid "GitHub Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:319 +#: cps/oauth_bb.py:323 msgid "Google Oauth error, please retry later." msgstr "" -#: cps/shelf.py:40 cps/shelf.py:92 +#: cps/shelf.py:46 cps/shelf.py:98 msgid "Invalid shelf specified" msgstr "" -#: cps/shelf.py:47 +#: cps/shelf.py:53 #, python-format msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" msgstr "" -#: cps/shelf.py:55 +#: cps/shelf.py:61 msgid "You are not allowed to edit public shelves" msgstr "" -#: cps/shelf.py:64 +#: cps/shelf.py:70 #, python-format msgid "Book is already part of the shelf: %(shelfname)s" msgstr "" -#: cps/shelf.py:78 +#: cps/shelf.py:84 #, python-format msgid "Book has been added to shelf: %(sname)s" msgstr "" -#: cps/shelf.py:97 +#: cps/shelf.py:103 #, python-format msgid "You are not allowed to add a book to the the shelf: %(name)s" msgstr "" -#: cps/shelf.py:102 +#: cps/shelf.py:108 msgid "User is not allowed to edit public shelves" msgstr "" -#: cps/shelf.py:120 +#: cps/shelf.py:126 #, python-format msgid "Books are already part of the shelf: %(name)s" msgstr "" -#: cps/shelf.py:134 +#: cps/shelf.py:140 #, python-format msgid "Books have been added to shelf: %(sname)s" msgstr "" -#: cps/shelf.py:136 +#: cps/shelf.py:142 #, python-format msgid "Could not add books to shelf: %(sname)s" msgstr "" -#: cps/shelf.py:173 +#: cps/shelf.py:179 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "" -#: cps/shelf.py:179 +#: cps/shelf.py:185 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "" -#: cps/shelf.py:200 cps/shelf.py:224 +#: cps/shelf.py:206 cps/shelf.py:230 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:205 +#: cps/shelf.py:211 #, python-format msgid "Shelf %(title)s created" msgstr "" -#: cps/shelf.py:207 cps/shelf.py:235 +#: cps/shelf.py:213 cps/shelf.py:241 msgid "There was an error" msgstr "" -#: cps/shelf.py:208 cps/shelf.py:210 +#: cps/shelf.py:214 cps/shelf.py:216 msgid "create a shelf" msgstr "" -#: cps/shelf.py:233 +#: cps/shelf.py:239 #, python-format msgid "Shelf %(title)s changed" msgstr "" -#: cps/shelf.py:236 cps/shelf.py:238 +#: cps/shelf.py:242 cps/shelf.py:244 msgid "Edit a shelf" msgstr "" -#: cps/shelf.py:259 -#, python-format -msgid "successfully deleted shelf %(name)s" -msgstr "" - -#: cps/shelf.py:289 +#: cps/shelf.py:295 #, python-format msgid "Shelf: '%(name)s'" msgstr "" -#: cps/shelf.py:292 +#: cps/shelf.py:298 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "" -#: cps/shelf.py:324 +#: cps/shelf.py:330 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "" -#: cps/ub.py:111 +#: cps/ub.py:68 msgid "Recently Added" msgstr "" -#: cps/ub.py:113 +#: cps/ub.py:70 msgid "Show recent books" msgstr "" -#: cps/templates/index.xml:17 cps/ub.py:114 +#: cps/templates/index.xml:17 cps/ub.py:71 msgid "Hot Books" msgstr "" -#: cps/ub.py:115 +#: cps/ub.py:72 msgid "Show hot books" msgstr "" -#: cps/templates/index.xml:24 cps/ub.py:118 +#: cps/templates/index.xml:24 cps/ub.py:75 msgid "Best rated Books" msgstr "" -#: cps/ub.py:120 +#: cps/ub.py:77 msgid "Show best rated books" msgstr "" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:121 -#: cps/web.py:965 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:78 +#: cps/web.py:958 msgid "Read Books" msgstr "" -#: cps/ub.py:123 +#: cps/ub.py:80 msgid "Show read and unread" msgstr "" -#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:125 -#: cps/web.py:969 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:82 +#: cps/web.py:962 msgid "Unread Books" msgstr "" -#: cps/ub.py:127 +#: cps/ub.py:84 msgid "Show unread" msgstr "" -#: cps/ub.py:128 +#: cps/ub.py:85 msgid "Discover" msgstr "" -#: cps/ub.py:130 +#: cps/ub.py:87 msgid "Show random books" msgstr "" -#: cps/ub.py:131 +#: cps/ub.py:88 msgid "Categories" msgstr "" -#: cps/ub.py:133 +#: cps/ub.py:90 msgid "Show category selection" msgstr "" #: cps/templates/book_edit.html:71 cps/templates/search_form.html:53 -#: cps/ub.py:134 +#: cps/ub.py:91 msgid "Series" msgstr "" -#: cps/ub.py:136 +#: cps/ub.py:93 msgid "Show series selection" msgstr "" -#: cps/templates/index.xml:61 cps/ub.py:137 +#: cps/templates/index.xml:61 cps/ub.py:94 msgid "Authors" msgstr "" -#: cps/ub.py:139 +#: cps/ub.py:96 msgid "Show author selection" msgstr "" -#: cps/templates/index.xml:68 cps/ub.py:141 +#: cps/templates/index.xml:68 cps/ub.py:98 msgid "Publishers" msgstr "" -#: cps/ub.py:143 +#: cps/ub.py:100 msgid "Show publisher selection" msgstr "" -#: cps/templates/search_form.html:74 cps/ub.py:144 +#: cps/templates/search_form.html:74 cps/ub.py:101 msgid "Languages" msgstr "" -#: cps/ub.py:147 +#: cps/ub.py:104 msgid "Show language selection" msgstr "" -#: cps/ub.py:148 +#: cps/ub.py:105 msgid "Ratings" msgstr "" -#: cps/ub.py:150 +#: cps/ub.py:107 msgid "Show ratings selection" msgstr "" -#: cps/ub.py:151 +#: cps/ub.py:108 msgid "File formats" msgstr "" -#: cps/ub.py:153 +#: cps/ub.py:110 msgid "Show file formats selection" msgstr "" -#: cps/updater.py:257 cps/updater.py:364 cps/updater.py:377 +#: cps/updater.py:253 cps/updater.py:360 cps/updater.py:373 msgid "Unexpected data while reading update information" msgstr "" -#: cps/updater.py:264 cps/updater.py:370 +#: cps/updater.py:260 cps/updater.py:366 msgid "No update available. You already have the latest version installed" msgstr "" -#: cps/updater.py:290 cps/updater.py:422 +#: cps/updater.py:286 msgid "A new update is available. Click on the button below to update to the latest version." msgstr "" -#: cps/updater.py:343 +#: cps/updater.py:339 msgid "Could not fetch update information" msgstr "" -#: cps/updater.py:357 +#: cps/updater.py:353 msgid "No release information available" msgstr "" -#: cps/updater.py:403 cps/updater.py:412 +#: cps/updater.py:406 cps/updater.py:415 #, python-format msgid "A new update is available. Click on the button below to update to version: %(version)s" msgstr "" -#: cps/web.py:457 +#: cps/updater.py:425 +msgid "Click on the button below to update to the latest stable version." +msgstr "" + +#: cps/web.py:445 msgid "Recently Added Books" msgstr "" -#: cps/web.py:484 +#: cps/web.py:473 msgid "Best rated books" msgstr "" -#: cps/templates/index.xml:38 cps/web.py:492 +#: cps/templates/index.xml:38 cps/web.py:481 msgid "Random Books" msgstr "" -#: cps/web.py:516 +#: cps/web.py:505 msgid "Books" msgstr "" -#: cps/web.py:543 +#: cps/web.py:532 msgid "Hot Books (most downloaded)" msgstr "" -#: cps/web.py:553 cps/web.py:1294 cps/web.py:1383 +#: cps/web.py:542 cps/web.py:1298 cps/web.py:1386 msgid "Error opening eBook. File does not exist or file is not accessible:" msgstr "" -#: cps/web.py:580 +#: cps/web.py:559 +#, python-format +msgid "Author: %(name)s" +msgstr "" + +#: cps/web.py:571 #, python-format msgid "Publisher: %(name)s" msgstr "" -#: cps/web.py:591 +#: cps/web.py:582 #, python-format msgid "Series: %(serie)s" msgstr "" -#: cps/web.py:602 +#: cps/web.py:593 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:613 +#: cps/web.py:604 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:625 +#: cps/web.py:616 #, python-format msgid "Category: %(name)s" msgstr "" -#: cps/web.py:659 +#: cps/web.py:650 msgid "Publisher list" msgstr "" -#: cps/templates/index.xml:82 cps/web.py:675 +#: cps/templates/index.xml:82 cps/web.py:666 msgid "Series list" msgstr "" -#: cps/web.py:689 +#: cps/web.py:680 msgid "Ratings list" msgstr "" -#: cps/web.py:702 +#: cps/web.py:693 msgid "File formats list" msgstr "" -#: cps/web.py:730 +#: cps/web.py:721 msgid "Available languages" msgstr "" -#: cps/web.py:750 +#: cps/web.py:741 #, python-format msgid "Language: %(name)s" msgstr "" -#: cps/templates/index.xml:75 cps/web.py:764 +#: cps/templates/index.xml:75 cps/web.py:755 msgid "Category list" msgstr "" -#: cps/templates/layout.html:73 cps/web.py:777 +#: cps/templates/layout.html:73 cps/web.py:769 msgid "Tasks" msgstr "" -#: cps/web.py:841 +#: cps/web.py:834 msgid "Published after " msgstr "" -#: cps/web.py:848 +#: cps/web.py:841 msgid "Published before " msgstr "" -#: cps/web.py:862 +#: cps/web.py:855 #, python-format msgid "Rating <= %(rating)s" msgstr "" -#: cps/web.py:864 +#: cps/web.py:857 #, python-format msgid "Rating >= %(rating)s" msgstr "" -#: cps/web.py:924 cps/web.py:933 +#: cps/web.py:917 cps/web.py:926 msgid "search" msgstr "" -#: cps/web.py:1018 +#: cps/web.py:1012 msgid "Please configure the SMTP mail settings first..." msgstr "" -#: cps/web.py:1023 +#: cps/web.py:1017 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "" -#: cps/web.py:1027 +#: cps/web.py:1021 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "" -#: cps/web.py:1046 cps/web.py:1071 cps/web.py:1076 cps/web.py:1081 -#: cps/web.py:1085 +#: cps/web.py:1041 cps/web.py:1066 cps/web.py:1070 cps/web.py:1075 +#: cps/web.py:1079 msgid "register" msgstr "" -#: cps/web.py:1073 +#: cps/web.py:1068 msgid "Your e-mail is not allowed to register" msgstr "" -#: cps/web.py:1077 +#: cps/web.py:1071 msgid "Confirmation e-mail was send to your e-mail account." msgstr "" -#: cps/web.py:1080 +#: cps/web.py:1074 msgid "This username or e-mail address is already in use." msgstr "" -#: cps/web.py:1103 cps/web.py:1115 +#: cps/web.py:1089 +msgid "Cannot activate LDAP authentication" +msgstr "" + +#: cps/web.py:1098 cps/web.py:1212 #, python-format -msgid "You are now logged in as: '%(nickname)s'" +msgid "you are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1108 cps/web.py:1120 +#: cps/web.py:1105 cps/web.py:1122 msgid "Wrong Username or Password" msgstr "" -#: cps/web.py:1111 +#: cps/web.py:1108 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "" -#: cps/web.py:1124 cps/web.py:1146 +#: cps/web.py:1117 +#, python-format +msgid "You are now logged in as: '%(nickname)s'" +msgstr "" + +#: cps/web.py:1126 cps/web.py:1148 msgid "login" msgstr "" -#: cps/web.py:1158 cps/web.py:1189 +#: cps/web.py:1160 cps/web.py:1191 msgid "Token not found" msgstr "" -#: cps/web.py:1166 cps/web.py:1197 +#: cps/web.py:1168 cps/web.py:1199 msgid "Token has expired" msgstr "" -#: cps/web.py:1174 +#: cps/web.py:1176 msgid "Success! Please return to your device" msgstr "" -#: cps/web.py:1210 -#, python-format -msgid "you are now logged in as: '%(nickname)s'" -msgstr "" - -#: cps/web.py:1250 cps/web.py:1277 cps/web.py:1281 +#: cps/web.py:1253 cps/web.py:1280 cps/web.py:1284 #, python-format msgid "%(name)s's profile" msgstr "" -#: cps/web.py:1274 +#: cps/web.py:1277 msgid "Found an existing account for this e-mail address." msgstr "" -#: cps/web.py:1279 +#: cps/web.py:1282 msgid "Profile updated" msgstr "" -#: cps/web.py:1304 cps/web.py:1306 cps/web.py:1308 cps/web.py:1314 -#: cps/web.py:1318 +#: cps/web.py:1308 cps/web.py:1310 cps/web.py:1312 cps/web.py:1318 +#: cps/web.py:1322 msgid "Read a Book" msgstr "" -#: cps/web.py:1328 +#: cps/web.py:1332 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "" -#: cps/worker.py:308 +#: cps/worker.py:311 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "" -#: cps/worker.py:319 +#: cps/worker.py:322 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "" @@ -1055,53 +1065,57 @@ msgid "Administration" msgstr "" #: cps/templates/admin.html:109 -msgid "Reconnect to Calibre DB" +msgid "View Logfiles" msgstr "" #: cps/templates/admin.html:110 -msgid "Restart Calibre-Web" +msgid "Reconnect to Calibre DB" msgstr "" #: cps/templates/admin.html:111 +msgid "Restart Calibre-Web" +msgstr "" + +#: cps/templates/admin.html:112 msgid "Stop Calibre-Web" msgstr "" -#: cps/templates/admin.html:117 +#: cps/templates/admin.html:118 msgid "Update" msgstr "" -#: cps/templates/admin.html:121 +#: cps/templates/admin.html:122 msgid "Version" msgstr "" -#: cps/templates/admin.html:122 +#: cps/templates/admin.html:123 msgid "Details" msgstr "" -#: cps/templates/admin.html:128 +#: cps/templates/admin.html:129 msgid "Current version" msgstr "" -#: cps/templates/admin.html:134 +#: cps/templates/admin.html:135 msgid "Check for update" msgstr "" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:136 msgid "Perform Update" msgstr "" -#: cps/templates/admin.html:147 +#: cps/templates/admin.html:148 msgid "Do you really want to restart Calibre-Web?" msgstr "" -#: cps/templates/admin.html:152 cps/templates/admin.html:166 -#: cps/templates/admin.html:186 cps/templates/shelf.html:72 +#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:187 cps/templates/shelf.html:72 msgid "Ok" msgstr "" -#: cps/templates/admin.html:153 cps/templates/admin.html:167 +#: cps/templates/admin.html:154 cps/templates/admin.html:168 #: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:281 cps/templates/config_view_edit.html:147 +#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:74 #: cps/templates/layout.html:28 cps/templates/shelf.html:73 #: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:12 @@ -1109,11 +1123,11 @@ msgstr "" msgid "Back" msgstr "" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:166 msgid "Do you really want to stop Calibre-Web?" msgstr "" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:178 msgid "Updating, please do not reload page" msgstr "" @@ -1242,7 +1256,7 @@ msgstr "" msgid "Get metadata" msgstr "" -#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:279 +#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329 #: cps/templates/config_view_edit.html:146 cps/templates/login.html:20 #: cps/templates/search_form.html:150 cps/templates/shelf_edit.html:17 #: cps/templates/user_edit.html:130 @@ -1386,123 +1400,171 @@ msgstr "" msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "" -#: cps/templates/config_edit.html:140 -msgid "Feature Configuration" +#: cps/templates/config_edit.html:134 +msgid "Enable Access Log" +msgstr "" + +#: cps/templates/config_edit.html:137 +msgid "Location and name of access logfile (access.log for no entry)" msgstr "" #: cps/templates/config_edit.html:148 +msgid "Feature Configuration" +msgstr "" + +#: cps/templates/config_edit.html:156 msgid "Enable uploading" msgstr "" -#: cps/templates/config_edit.html:152 +#: cps/templates/config_edit.html:160 msgid "Enable anonymous browsing" msgstr "" -#: cps/templates/config_edit.html:156 +#: cps/templates/config_edit.html:164 msgid "Enable public registration" msgstr "" -#: cps/templates/config_edit.html:160 +#: cps/templates/config_edit.html:168 msgid "Enable remote login (\"magic link\")" msgstr "" -#: cps/templates/config_edit.html:165 +#: cps/templates/config_edit.html:173 msgid "Use" msgstr "" -#: cps/templates/config_edit.html:166 +#: cps/templates/config_edit.html:174 msgid "Obtain an API Key" msgstr "" -#: cps/templates/config_edit.html:170 +#: cps/templates/config_edit.html:178 msgid "Goodreads API Key" msgstr "" -#: cps/templates/config_edit.html:174 +#: cps/templates/config_edit.html:182 msgid "Goodreads API Secret" msgstr "" -#: cps/templates/config_edit.html:181 +#: cps/templates/config_edit.html:189 msgid "Login type" msgstr "" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:191 msgid "Use standard Authentication" msgstr "" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:193 msgid "Use LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:188 +#: cps/templates/config_edit.html:196 msgid "Use GitHub OAuth" msgstr "" -#: cps/templates/config_edit.html:189 +#: cps/templates/config_edit.html:197 msgid "Use Google OAuth" msgstr "" -#: cps/templates/config_edit.html:196 -msgid "LDAP Provider URL" +#: cps/templates/config_edit.html:204 +msgid "LDAP Server Host Name or IP Address" +msgstr "" + +#: cps/templates/config_edit.html:208 +msgid "LDAP Server Port" msgstr "" -#: cps/templates/config_edit.html:200 +#: cps/templates/config_edit.html:212 +msgid "LDAP schema (ldap or ldaps)" +msgstr "" + +#: cps/templates/config_edit.html:216 +msgid "LDAP Admin username" +msgstr "" + +#: cps/templates/config_edit.html:220 +msgid "LDAP Admin password" +msgstr "" + +#: cps/templates/config_edit.html:225 +msgid "LDAP Server use SSL" +msgstr "" + +#: cps/templates/config_edit.html:229 +msgid "LDAP Server use TLS" +msgstr "" + +#: cps/templates/config_edit.html:233 +msgid "LDAP Server Certificate" +msgstr "" + +#: cps/templates/config_edit.html:237 +msgid "LDAP SSL Certificate Path" +msgstr "" + +#: cps/templates/config_edit.html:242 msgid "LDAP Distinguished Name (DN)" msgstr "" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:246 +msgid "LDAP User object filter" +msgstr "" + +#: cps/templates/config_edit.html:251 +msgid "LDAP Server is OpenLDAP?" +msgstr "" + +#: cps/templates/config_edit.html:258 msgid "Obtain GitHub OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:211 +#: cps/templates/config_edit.html:261 msgid "GitHub OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:215 +#: cps/templates/config_edit.html:265 msgid "GitHub OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:221 +#: cps/templates/config_edit.html:271 msgid "Obtain Google OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:224 +#: cps/templates/config_edit.html:274 msgid "Google OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:228 +#: cps/templates/config_edit.html:278 msgid "Google OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:242 +#: cps/templates/config_edit.html:292 msgid "External binaries" msgstr "" -#: cps/templates/config_edit.html:250 +#: cps/templates/config_edit.html:300 msgid "No converter" msgstr "" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:302 msgid "Use Kindlegen" msgstr "" -#: cps/templates/config_edit.html:254 +#: cps/templates/config_edit.html:304 msgid "Use calibre's ebook converter" msgstr "" -#: cps/templates/config_edit.html:258 +#: cps/templates/config_edit.html:308 msgid "E-Book converter settings" msgstr "" -#: cps/templates/config_edit.html:262 +#: cps/templates/config_edit.html:312 msgid "Path to convertertool" msgstr "" -#: cps/templates/config_edit.html:268 +#: cps/templates/config_edit.html:318 msgid "Location of Unrar binary" msgstr "" -#: cps/templates/config_edit.html:284 cps/templates/layout.html:84 +#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 #: cps/templates/login.html:4 msgid "Login" msgstr "" @@ -1716,7 +1778,7 @@ msgstr "" msgid "Discover (Random Books)" msgstr "" -#: cps/templates/index.html:65 +#: cps/templates/index.html:64 msgid "Group by series" msgstr "" @@ -1859,6 +1921,14 @@ msgstr "" msgid "Log in with magic link" msgstr "" +#: cps/templates/logviewer.html:5 +msgid "Show Calibre-Web log" +msgstr "" + +#: cps/templates/logviewer.html:8 +msgid "Show access log" +msgstr "" + #: cps/templates/osd.xml:5 msgid "Calibre-Web ebook catalog" msgstr "" From 572b5427c7e73f01bbe24f286b5787abd949caaa Mon Sep 17 00:00:00 2001 From: Ozzieisaacs Date: Sun, 23 Jun 2019 09:22:26 +0200 Subject: [PATCH 4/4] Fix Encoding issues for python2 --- cps.py | 8 +- cps/__init__.py | 12 +- cps/admin.py | 4 +- cps/cli.py | 12 + cps/constants.py | 7 +- cps/db.py | 2 +- cps/{ldap.py => ldap_login.py} | 3 +- cps/opds.py | 15 +- cps/server.py | 2 +- cps/ub.py | 8 +- cps/web.py | 10 +- cps/worker.py | 2 + test/Calibre-Web TestSummary.html | 6154 ++++++++++++++++++++++++----- 13 files changed, 5182 insertions(+), 1057 deletions(-) rename cps/{ldap.py => ldap_login.py} (95%) diff --git a/cps.py b/cps.py index 16d84957..ca7d7230 100755 --- a/cps.py +++ b/cps.py @@ -23,8 +23,12 @@ import os # Insert local directories into path -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'vendor')) +if sys.version_info < (3, 0): + sys.path.append(os.path.dirname(os.path.abspath(__file__.decode('utf-8')))) + sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__.decode('utf-8'))), 'vendor')) +else: + sys.path.append(os.path.dirname(os.path.abspath(__file__))) + sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'vendor')) from cps import create_app diff --git a/cps/__init__.py b/cps/__init__.py index 50bd1781..6b8815e9 100755 --- a/cps/__init__.py +++ b/cps/__init__.py @@ -87,8 +87,8 @@ global_WorkerThread = WorkerThread() from .server import WebServer web_server = WebServer() -from .ldap import Ldap -ldap = Ldap() +from .ldap_login import Ldap +ldap1 = Ldap() babel = Babel() @@ -97,6 +97,12 @@ log = logger.create() def create_app(): app.wsgi_app = ReverseProxied(app.wsgi_app) + # For python2 convert path to unicode + if sys.version_info < (3, 0): + app.static_folder = app.static_folder.decode('utf-8') + app.root_path = app.root_path.decode('utf-8') + app.instance_path = app.instance_path .decode('utf-8') + cache_buster.init_cache_busting(app) log.info('Starting Calibre Web...') @@ -106,7 +112,7 @@ def create_app(): web_server.init_app(app, config) db.setup_db() babel.init_app(app) - ldap.init_app(app) + ldap1.init_app(app) global_WorkerThread.start() return app diff --git a/cps/admin.py b/cps/admin.py index 449c5684..4984e2f0 100644 --- a/cps/admin.py +++ b/cps/admin.py @@ -40,7 +40,7 @@ from sqlalchemy import and_ from sqlalchemy.exc import IntegrityError from werkzeug.security import generate_password_hash -from . import constants, logger, ldap +from . import constants, logger, ldap1 from . import db, ub, web_server, get_locale, config, updater_thread, babel, gdriveutils from .helper import speaking_language, check_valid_domain, check_unrar, send_test_mail, generate_random_password, \ send_registration_mail @@ -48,7 +48,7 @@ from .gdriveutils import is_gdrive_ready, gdrive_support, downloadFile, deleteDa from .web import admin_required, render_title_template, before_request, unconfigured, login_required_if_no_ano feature_support = dict() -feature_support['ldap'] = ldap.ldap_supported() +feature_support['ldap'] = ldap1.ldap_supported() try: from goodreads.client import GoodreadsClient diff --git a/cps/cli.py b/cps/cli.py index 1bda9c93..de12be5a 100644 --- a/cps/cli.py +++ b/cps/cli.py @@ -82,6 +82,18 @@ parser.add_argument('-i', metavar='ip-adress', help='Server IP-Adress to listen' parser.add_argument('-s', metavar='user:pass', help='Sets specific username to new password') args = parser.parse_args() +if sys.version_info < (3, 0): + if args.p: + args.p = args.p.decode('utf-8') + if args.g: + args.g = args.g.decode('utf-8') + if args.k: + args.k = args.k.decode('utf-8') + if args.c: + args.c = args.c.decode('utf-8') + if args.s: + args.s = args.s.decode('utf-8') + settingspath = args.p or os.path.join(_CONFIG_DIR, "app.db") gdpath = args.g or os.path.join(_CONFIG_DIR, "gdrive.db") diff --git a/cps/constants.py b/cps/constants.py index aaf0cd21..fce91312 100644 --- a/cps/constants.py +++ b/cps/constants.py @@ -24,7 +24,12 @@ from collections import namedtuple # Base dir is parent of current file, necessary if called from different folder -BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),os.pardir)) +if sys.version_info < (3, 0): + BASE_DIR = os.path.abspath(os.path.join( + os.path.dirname(os.path.abspath(__file__)),os.pardir)).decode('utf-8') +else: + BASE_DIR = os.path.abspath(os.path.join( + os.path.dirname(os.path.abspath(__file__)),os.pardir)) STATIC_DIR = os.path.join(BASE_DIR, 'cps', 'static') TEMPLATES_DIR = os.path.join(BASE_DIR, 'cps', 'templates') TRANSLATIONS_DIR = os.path.join(BASE_DIR, 'cps', 'translations') diff --git a/cps/db.py b/cps/db.py index 2cd959ad..5429e93c 100755 --- a/cps/db.py +++ b/cps/db.py @@ -342,7 +342,7 @@ def setup_db(): try: if not os.path.exists(dbpath): raise - engine = create_engine('sqlite:///' + dbpath, + engine = create_engine('sqlite:///{0}'.format(dbpath), echo=False, isolation_level="SERIALIZABLE", connect_args={'check_same_thread': False}) diff --git a/cps/ldap.py b/cps/ldap_login.py similarity index 95% rename from cps/ldap.py rename to cps/ldap_login.py index 0688475a..dcded6f6 100644 --- a/cps/ldap.py +++ b/cps/ldap_login.py @@ -16,10 +16,11 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . +from __future__ import division, print_function, unicode_literals import base64 try: - from flask_simpleldap import LDAP, LDAPException + from flask_simpleldap import LDAP # , LDAPException ldap_support = True except ImportError: ldap_support = False diff --git a/cps/opds.py b/cps/opds.py index 2ba95635..ee3e86fc 100644 --- a/cps/opds.py +++ b/cps/opds.py @@ -31,7 +31,7 @@ from flask_login import current_user from sqlalchemy.sql.expression import func, text, or_, and_ from werkzeug.security import check_password_hash -from . import logger, config, db, ub, ldap +from . import logger, config, db, ub, ldap1 from .helper import fill_indexpage, get_download_link, get_book_cover from .pagination import Pagination from .web import common_filters, get_search_results, render_read_books, download_required @@ -40,14 +40,14 @@ from .web import common_filters, get_search_results, render_read_books, download opds = Blueprint('opds', __name__) log = logger.create() -ldap_support = ldap.ldap_supported() +ldap_support = ldap1.ldap_supported() def requires_basic_auth_if_no_ano(f): @wraps(f) def decorated(*args, **kwargs): if config.config_login_type == 1 and ldap_support: - return ldap.ldap.basic_auth_required(*args, **kwargs) + return ldap1.ldap.basic_auth_required(*args, **kwargs) auth = request.authorization if config.config_anonbrowse != 1: if not auth or not check_auth(auth.username, auth.password): @@ -57,15 +57,6 @@ def requires_basic_auth_if_no_ano(f): return decorated -'''def basic_auth_required_check(condition): - print("susi") - def decorator(f): - if condition and ldap_support: - return ldap.ldap.basic_auth_required(f) - return requires_basic_auth_if_no_ano(f) - return decorator''' - - @opds.route("/opds/") @requires_basic_auth_if_no_ano def feed_index(): diff --git a/cps/server.py b/cps/server.py index 70efcacd..5945b332 100644 --- a/cps/server.py +++ b/cps/server.py @@ -25,7 +25,7 @@ import signal import socket try: - from gevent.pyiwsgi import WSGIServer + from gevent.pywsgi import WSGIServer from gevent.pool import Pool from gevent import __version__ as _version VERSION = {'Gevent': 'v' + _version} diff --git a/cps/ub.py b/cps/ub.py index 9d04a908..02623448 100644 --- a/cps/ub.py +++ b/cps/ub.py @@ -40,18 +40,12 @@ from sqlalchemy.orm import relationship, sessionmaker from sqlalchemy.ext.declarative import declarative_base from werkzeug.security import generate_password_hash -'''try: - import ldap -except ImportError: - pass''' - from . import constants, logger, cli session = None - -engine = create_engine('sqlite:///{0}'.format(cli.settingspath), echo=False) +engine = create_engine(u'sqlite:///{0}'.format(cli.settingspath), echo=False) Base = declarative_base() diff --git a/cps/web.py b/cps/web.py index 3f8964d4..491fbbf6 100644 --- a/cps/web.py +++ b/cps/web.py @@ -41,7 +41,7 @@ from werkzeug.exceptions import default_exceptions from werkzeug.datastructures import Headers from werkzeug.security import generate_password_hash, check_password_hash -from . import constants, logger, isoLanguages, ldap +from . import constants, logger, isoLanguages, ldap1 from . import global_WorkerThread, searched_ids, lm, babel, db, ub, config, get_locale, app, language_table from .gdriveutils import getFileFromEbooksFolder, do_gdrive_download from .helper import common_filters, get_search_results, fill_indexpage, speaking_language, check_valid_domain, \ @@ -52,7 +52,7 @@ from .pagination import Pagination from .redirect import redirect_back feature_support = dict() -feature_support['ldap'] = ldap.ldap_supported() +feature_support['ldap'] = ldap1.ldap_supported() try: from .oauth_bb import oauth_check, register_user_with_oauth, logout_oauth_user, get_oauth_status @@ -1093,17 +1093,17 @@ def login(): .first() if config.config_login_type == 1 and user and feature_support['ldap']: try: - if ldap.ldap.bind_user(form['username'], form['password']) is not None: + if ldap1.ldap.bind_user(form['username'], form['password']) is not None: login_user(user, remember=True) flash(_(u"you are now logged in as: '%(nickname)s'", nickname=user.nickname), category="success") return redirect_back(url_for("web.index")) - except ldap.ldap.INVALID_CREDENTIALS as e: + except ldap1.ldap.INVALID_CREDENTIALS as e: log.error('Login Error: ' + str(e)) ipAdress = request.headers.get('X-Forwarded-For', request.remote_addr) log.info('LDAP Login failed for user "%s" IP-adress: %s', form['username'], ipAdress) flash(_(u"Wrong Username or Password"), category="error") - except ldap.ldap.SERVER_DOWN: + except ldap1.ldap.SERVER_DOWN: log.info('LDAP Login failed, LDAP Server down') flash(_(u"Could not login. LDAP server down, please contact your administrator"), category="error") '''except LDAPException as exception: diff --git a/cps/worker.py b/cps/worker.py index a33ad99d..345d79bb 100644 --- a/cps/worker.py +++ b/cps/worker.py @@ -326,6 +326,8 @@ class WorkerThread(threading.Thread): nextline = p.stdout.readline() if os.name == 'nt' and sys.version_info < (3, 0): nextline = nextline.decode('windows-1252') + elif os.name == 'posix' and sys.version_info < (3, 0): + nextline = nextline.decode('utf-8') log.debug(nextline.strip('\r\n')) # parse progress string from calibre-converter progress = re.search("(\d+)%\s.*", nextline) diff --git a/test/Calibre-Web TestSummary.html b/test/Calibre-Web TestSummary.html index 571c1fb1..b1ef2283 100644 --- a/test/Calibre-Web TestSummary.html +++ b/test/Calibre-Web TestSummary.html @@ -30,15 +30,15 @@

    @@ -574,8 +574,8 @@ ret['edit_enable'] = bool(tree.find("//*[@class='glyphicon glyphicon-edit']")) /home/matthias/Entwicklung/calibre-web-test/test/ui_helper.py:709: FutureWarning: The behavior of this method will change in future versions. Use specific 'len(elem)' or 'elem is not None' test instead. ret['read']= bool(tree.find("//*[@id='have_read_cb']")) -Incomming connection 127.0.0.1:45556 -127.0.0.1:45556 Timeouted +Incomming connection 127.0.0.1:45524 +127.0.0.1:45524 Timeouted
    @@ -598,8 +598,8 @@ Incomming connection 127.0.0.1:45556 aria-hidden="true">×
    -
    pt3.2: Incomming connection 127.0.0.1:45562
    -127.0.0.1:45562 Timeouted
    +
    pt3.2: Incomming connection 127.0.0.1:45526
    +127.0.0.1:45526 Timeouted
    @@ -622,17 +622,17 @@ Incomming connection 127.0.0.1:45556 aria-hidden="true">×
    -
    pt3.3: Incomming connection 127.0.0.1:45564
    +                
    pt3.3: Incomming connection 127.0.0.1:45528
     Received: EHLO
     Received: AUTH
     User: name@host.com, Password: 10234
     Received: MAIL
     Received: RCPT
     Received: DATA
    -('Receiving message from:', ('127.0.0.1', 45564))
    -('Message addressed from:', '<name@host.com> size=507')
    +('Receiving message from:', ('127.0.0.1', 45528))
    +('Message addressed from:', '<name@host.com> size=508')
     ('Message addressed to  :', ['a1@b.com'])
    -('Message length        :', 506)
    +('Message length        :', 507)
     Received: QUIT
    @@ -656,17 +656,17 @@ Received: QUIT aria-hidden="true">×
    -
    pt3.4: Incomming connection 127.0.0.1:45566
    +                
    pt3.4: Incomming connection 127.0.0.1:45530
     Received: EHLO
     Received: AUTH
     User: name@host.com, Password: 10234
     Received: MAIL
     Received: RCPT
     Received: DATA
    -('Receiving message from:', ('127.0.0.1', 45566))
    -('Message addressed from:', '<name@host.com> size=30377')
    +('Receiving message from:', ('127.0.0.1', 45530))
    +('Message addressed from:', '<name@host.com> size=30379')
     ('Message addressed to  :', ['a1@b.com'])
    -('Message length        :', 30376)
    +('Message length        :', 30378)
     Received: QUIT
    @@ -701,8 +701,8 @@ Received: QUIT aria-hidden="true">×
    -
    pt4.1: Incomming connection 127.0.0.1:45674
    -127.0.0.1:45674 Timeouted
    +
    pt4.1: Incomming connection 127.0.0.1:45622
    +127.0.0.1:45622 Timeouted
    @@ -725,8 +725,8 @@ Received: QUIT aria-hidden="true">×
    -
    pt4.2: Incomming connection 127.0.0.1:45680
    -127.0.0.1:45680 Timeouted
    +
    pt4.2: Incomming connection 127.0.0.1:45624
    +127.0.0.1:45624 Timeouted
    @@ -749,14 +749,14 @@ Received: QUIT aria-hidden="true">×
    -
    pt4.3: Incomming connection 127.0.0.1:45682
    +                
    pt4.3: Incomming connection 127.0.0.1:45626
     Received: EHLO
     Received: AUTH
     User: name@host.com, Password: 10234
     Received: MAIL
     Received: RCPT
     Received: DATA
    -('Receiving message from:', ('127.0.0.1', 45682))
    +('Receiving message from:', ('127.0.0.1', 45626))
     ('Message addressed from:', '<name@host.com> size=523')
     ('Message addressed to  :', ['a1@b.com'])
     ('Message length        :', 506)
    @@ -783,14 +783,14 @@ Received: QUIT
    aria-hidden="true">×
    -
    pt4.4: Incomming connection 127.0.0.1:45684
    +                
    pt4.4: Incomming connection 127.0.0.1:45628
     Received: EHLO
     Received: AUTH
     User: name@host.com, Password: 10234
     Received: MAIL
     Received: RCPT
     Received: DATA
    -('Receiving message from:', ('127.0.0.1', 45684))
    +('Receiving message from:', ('127.0.0.1', 45628))
     ('Message addressed from:', '<name@host.com> size=30788')
     ('Message addressed to  :', ['a1@b.com'])
     ('Message length        :', 30378)
    @@ -801,78 +801,118 @@ Received: QUIT
    - - test_logging.test_logging_Python27 - 5 + + unittest.suite._ErrorHolder + 3 + 0 + 0 3 - 1 0 - 1 -
    Detail + Detail - + -
    test_debug_log
    +
    test_logging_Python27)
    - PASS - - - -
    test_failed_login
    + +
    + ERROR +
    + + + - PASS - + -
    test_failed_register
    +
    test_anonymous_Python27)
    - SKIP + ERROR
    -
    - test_anonymous.test_anonymous_Python27 + test_anonymous.test_anonymous_Python36 10 10 0 @@ -1545,834 +1585,3800 @@ AssertionError: logfile config value is not empty after reseting to default PASS - - test_anonymous.test_anonymous_Python36 - 10 - 10 - 0 - 0 - 0 - - Detail - - - - -
    test_guest_about
    - - PASS - - - -
    test_guest_change_visibility_category
    - - PASS - - - -
    test_guest_change_visibility_hot
    - - PASS - - - -
    test_guest_change_visibility_language
    - - PASS - - - -
    test_guest_change_visibility_publisher
    - - PASS - - - -
    test_guest_change_visibility_rated
    - - PASS - - - -
    test_guest_change_visibility_series
    - - PASS - - - -
    test_guest_random_books_available
    - - PASS - - - -
    test_guest_visibility_read
    - - PASS - - - -
    test_guest_visibility_sidebar
    - - PASS - - + test_user_template.test_user_template_Python27 - 14 - 11 + 25 0 0 + 22 3 - Detail + Detail - +
    test_author_user_template
    - PASS - - - -
    test_best_user_template
    - - PASS - - - -
    test_category_user_template
    - - PASS - - - -
    test_detail_random_user_template
    - - PASS - - - -
    test_hot_user_template
    - - PASS - - - -
    test_language_user_template
    - - PASS - - - -
    test_limit_book_languages
    -
    - SKIP + ERROR
    -