diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..d31e3bcd --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,35 @@ +--- +name: Bug/Problem report +about: Create a report to help us improve Calibre-Web +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug/problem** +A clear and concise description of what the bug is. If you are asking for support, please check our [Wiki](https://github.com/janeczku/calibre-web/wiki) if your question is already answered there. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Environment (please complete the following information):** + - OS: [e.g. Windows 10/raspian] + - Python version [e.g. python2.7] + - Calibre-Web version [e.g. 0.6.5 or master@16.02.20, 19:55 ]: + - Docker container [ None/Technosoft2000/Linuxuser]: + - Special Hardware [e.g. Rasperry Pi Zero] + - Browser [e.g. chrome, safari] + +**Additional context** +Add any other context about the problem here. [e.g. access via reverse proxy] diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..1a71b1ac --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for Calibre-Web +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.gitignore b/.gitignore index 3fc60194..f06dcd44 100644 --- a/.gitignore +++ b/.gitignore @@ -21,14 +21,12 @@ vendor/ # calibre-web *.db *.log -config.ini -cps/static/[0-9]* .idea/ *.bak *.log.* -tags settings.yaml gdrive_credentials client_secrets.json + diff --git a/README.md b/README.md index d81e7ece..91b3eb16 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Calibre-Web is a web app providing a clean interface for browsing, reading and d ## Quick start -1. Install dependencies by running `pip install --target vendor -r requirements.txt`. +1. Install dependencies by running `pip3 install --target vendor -r requirements.txt` (python3.x) or `pip install --target vendor -r requirements.txt` (python2.7). 2. Execute the command: `python cps.py` (or `nohup python cps.py` - recommended if you want to exit the terminal window) 3. Point your browser to `http://localhost:8083` or `http://localhost:8083/opds` for the OPDS catalog 4. Set `Location of Calibre database` to the path of the folder where your Calibre library (metadata.db) lives, push "submit" button\ @@ -46,7 +46,7 @@ Please note that running the above install command can fail on some versions of ## Requirements -Python 2.7+, python 3.x+ +python 3.x+, (Python 2.7+) Optionally, to enable on-the-fly conversion from one ebook format to another when using the send-to-kindle feature, or during editing of ebooks metadata: diff --git a/cps.py b/cps.py index ca7d7230..3601e4b6 100755 --- a/cps.py +++ b/cps.py @@ -41,6 +41,14 @@ from cps.shelf import shelf from cps.admin import admi from cps.gdrive import gdrive from cps.editbooks import editbook + +try: + from cps.kobo import kobo, get_kobo_activated + from cps.kobo_auth import kobo_auth + kobo_available = get_kobo_activated() +except ImportError: + kobo_available = False + try: from cps.oauth_bb import oauth oauth_available = True @@ -58,6 +66,9 @@ def main(): app.register_blueprint(admi) app.register_blueprint(gdrive) app.register_blueprint(editbook) + if kobo_available: + app.register_blueprint(kobo) + app.register_blueprint(kobo_auth) if oauth_available: app.register_blueprint(oauth) success = web_server.start() diff --git a/cps/__init__.py b/cps/__init__.py index abcc4cbb..6c241d4f 100755 --- a/cps/__init__.py +++ b/cps/__init__.py @@ -116,14 +116,13 @@ def get_locale(): if user.nickname != 'Guest': # if the account is the guest account bypass the config lang settings return user.locale - preferred = set() + preferred = list() if request.accept_languages: for x in request.accept_languages.values(): try: - preferred.add(str(LC.parse(x.replace('-', '_')))) + preferred.append(str(LC.parse(x.replace('-', '_')))) except (UnknownLocaleError, ValueError) as e: - log.warning('Could not parse locale "%s": %s', x, e) - # preferred.append('en') + log.debug('Could not parse locale "%s": %s', x, e) return negotiate_locale(preferred or ['en'], _BABEL_TRANSLATIONS) diff --git a/cps/about.py b/cps/about.py index aa1e866e..fd52ca7b 100644 --- a/cps/about.py +++ b/cps/about.py @@ -30,7 +30,7 @@ import babel, pytz, requests, sqlalchemy import werkzeug, flask, flask_login, flask_principal, jinja2 from flask_babel import gettext as _ -from . import db, converter, uploader, server, isoLanguages +from . import db, converter, uploader, server, isoLanguages, constants from .web import render_title_template try: from flask_login import __version__ as flask_loginVersion @@ -49,8 +49,11 @@ about = flask.Blueprint('about', __name__) _VERSIONS = OrderedDict( - Platform = ' '.join(platform.uname()), + Platform = '{0[0]} {0[2]} {0[3]} {0[4]} {0[5]}'.format(platform.uname()), Python=sys.version, + Calibre_Web=constants.STABLE_VERSION['version'] + ' - ' + + constants.NIGHTLY_VERSION[0].replace('%','%%') + ' - ' + + constants.NIGHTLY_VERSION[1].replace('%','%%'), WebServer=server.VERSION, Flask=flask.__version__, Flask_Login=flask_loginVersion, @@ -67,7 +70,7 @@ _VERSIONS = OrderedDict( Unidecode = unidecode_version, Flask_SimpleLDAP = u'installed' if bool(services.ldap) else u'not installed', Goodreads = u'installed' if bool(services.goodreads_support) else u'not installed', - + jsonschema = services.SyncToken.__version__ if bool(services.SyncToken) else u'not installed', ) _VERSIONS.update(uploader.get_versions()) diff --git a/cps/admin.py b/cps/admin.py index d338da42..8e4f7df2 100644 --- a/cps/admin.py +++ b/cps/admin.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- # This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) @@ -45,7 +44,8 @@ from .web import admin_required, render_title_template, before_request, unconfig feature_support = { 'ldap': False, # bool(services.ldap), - 'goodreads': bool(services.goodreads_support) + 'goodreads': bool(services.goodreads_support), + 'kobo': bool(services.kobo) } # try: @@ -144,7 +144,10 @@ def configuration(): def view_configuration(): readColumn = db.session.query(db.Custom_Columns)\ .filter(and_(db.Custom_Columns.datatype == 'bool',db.Custom_Columns.mark_for_delete == 0)).all() + restrictColumns= db.session.query(db.Custom_Columns)\ + .filter(and_(db.Custom_Columns.datatype == 'text',db.Custom_Columns.mark_for_delete == 0)).all() return render_title_template("config_view_edit.html", conf=config, readColumns=readColumn, + restrictColumns=restrictColumns, title=_(u"UI Configuration"), page="uiconfig") @@ -160,7 +163,7 @@ def update_view_configuration(): _config_string("config_calibre_web_title") _config_string("config_columns_to_ignore") - _config_string("config_mature_content_tags") + # _config_string("config_mature_content_tags") reboot_required |= _config_string("config_title_regex") _config_int("config_read_column") @@ -168,6 +171,7 @@ def update_view_configuration(): _config_int("config_random_books") _config_int("config_books_per_page") _config_int("config_authors_max") + _config_int("config_restricted_column") if config.config_google_drive_watch_changes_response: config.config_google_drive_watch_changes_response = json.dumps(config.config_google_drive_watch_changes_response) @@ -176,8 +180,6 @@ def update_view_configuration(): config.config_default_role &= ~constants.ROLE_ANONYMOUS config.config_default_show = sum(int(k[5:]) for k in to_save if k.startswith('show_')) - if "Show_mature_content" in to_save: - config.config_default_show |= constants.MATURE_CONTENT if "Show_detail_random" in to_save: config.config_default_show |= constants.DETAIL_RANDOM @@ -202,7 +204,6 @@ def edit_domain(allow): # value: 'superuser!' //new value vals = request.form.to_dict() answer = ub.session.query(ub.Registration).filter(ub.Registration.id == vals['pk']).first() - # domain_name = request.args.get('domain') answer.domain = vals['value'].replace('*', '%').replace('?', '_').lower() ub.session.commit() return "" @@ -247,6 +248,228 @@ def list_domain(allow): response.headers["Content-Type"] = "application/json; charset=utf-8" return response +@admi.route("/ajax/editrestriction/", methods=['POST']) +@login_required +@admin_required +def edit_restriction(type): + element = request.form.to_dict() + if element['id'].startswith('a'): + if type == 0: # Tags as template + elementlist = config.list_allowed_tags() + elementlist[int(element['id'][1:])]=element['Element'] + config.config_allowed_tags = ','.join(elementlist) + config.save() + if type == 1: # CustomC + elementlist = config.list_allowed_column_values() + elementlist[int(element['id'][1:])]=element['Element'] + config.config_allowed_column_value = ','.join(elementlist) + config.save() + if type == 2: # Tags per user + usr_id = os.path.split(request.referrer)[-1] + if usr_id.isdigit() == True: + usr = ub.session.query(ub.User).filter(ub.User.id == int(usr_id)).first() + else: + usr = current_user + elementlist = usr.list_allowed_tags() + elementlist[int(element['id'][1:])]=element['Element'] + usr.allowed_tags = ','.join(elementlist) + ub.session.commit() + if type == 3: # CColumn per user + usr_id = os.path.split(request.referrer)[-1] + if usr_id.isdigit() == True: + usr = ub.session.query(ub.User).filter(ub.User.id == int(usr_id)).first() + else: + usr = current_user + elementlist = usr.list_allowed_column_values() + elementlist[int(element['id'][1:])]=element['Element'] + usr.allowed_column_value = ','.join(elementlist) + ub.session.commit() + if element['id'].startswith('d'): + if type == 0: # Tags as template + elementlist = config.list_denied_tags() + elementlist[int(element['id'][1:])]=element['Element'] + config.config_denied_tags = ','.join(elementlist) + config.save() + if type == 1: # CustomC + elementlist = config.list_denied_column_values() + elementlist[int(element['id'][1:])]=element['Element'] + config.config_denied_column_value = ','.join(elementlist) + config.save() + pass + if type == 2: # Tags per user + usr_id = os.path.split(request.referrer)[-1] + if usr_id.isdigit() == True: + usr = ub.session.query(ub.User).filter(ub.User.id == int(usr_id)).first() + else: + usr = current_user + elementlist = usr.list_denied_tags() + elementlist[int(element['id'][1:])]=element['Element'] + usr.denied_tags = ','.join(elementlist) + ub.session.commit() + if type == 3: # CColumn per user + usr_id = os.path.split(request.referrer)[-1] + if usr_id.isdigit() == True: + usr = ub.session.query(ub.User).filter(ub.User.id == int(usr_id)).first() + else: + usr = current_user + elementlist = usr.list_denied_column_values() + elementlist[int(element['id'][1:])]=element['Element'] + usr.denied_column_value = ','.join(elementlist) + ub.session.commit() + return "" + +def restriction_addition(element, list_func): + elementlist = list_func() + if elementlist == ['']: + elementlist = [] + if not element['add_element'] in elementlist: + elementlist += [element['add_element']] + return ','.join(elementlist) + + +def restriction_deletion(element, list_func): + elementlist = list_func() + if element['Element'] in elementlist: + elementlist.remove(element['Element']) + return ','.join(elementlist) + + +@admi.route("/ajax/addrestriction/", methods=['POST']) +@login_required +@admin_required +def add_restriction(type): + element = request.form.to_dict() + if type == 0: # Tags as template + if 'submit_allow' in element: + config.config_allowed_tags = restriction_addition(element, config.list_allowed_tags) + config.save() + elif 'submit_deny' in element: + config.config_denied_tags = restriction_addition(element, config.list_denied_tags) + config.save() + if type == 1: # CCustom as template + if 'submit_allow' in element: + config.config_allowed_column_value = restriction_addition(element, config.list_denied_column_values) + config.save() + elif 'submit_deny' in element: + config.config_denied_column_value = restriction_addition(element, config.list_allowed_column_values) + config.save() + if type == 2: # Tags per user + usr_id = os.path.split(request.referrer)[-1] + if usr_id.isdigit() == True: + usr = ub.session.query(ub.User).filter(ub.User.id == int(usr_id)).first() + else: + usr = current_user + if 'submit_allow' in element: + usr.allowed_tags = restriction_addition(element, usr.list_allowed_tags) + ub.session.commit() + elif 'submit_deny' in element: + usr.denied_tags = restriction_addition(element, usr.list_denied_tags) + ub.session.commit() + if type == 3: # CustomC per user + usr_id = os.path.split(request.referrer)[-1] + if usr_id.isdigit() == True: + usr = ub.session.query(ub.User).filter(ub.User.id == int(usr_id)).first() + else: + usr = current_user + if 'submit_allow' in element: + usr.allowed_column_value = restriction_addition(element, usr.list_allowed_column_values) + ub.session.commit() + elif 'submit_deny' in element: + usr.denied_column_value = restriction_addition(element, usr.list_denied_column_values) + ub.session.commit() + return "" + +@admi.route("/ajax/deleterestriction/", methods=['POST']) +@login_required +@admin_required +def delete_restriction(type): + element = request.form.to_dict() + if type == 0: # Tags as template + if element['id'].startswith('a'): + config.config_allowed_tags = restriction_deletion(element, config.list_allowed_tags) + config.save() + elif element['id'].startswith('d'): + config.config_denied_tags = restriction_deletion(element, config.list_denied_tags) + config.save() + elif type == 1: # CustomC as template + if element['id'].startswith('a'): + config.config_allowed_column_value = restriction_deletion(element, config.list_allowed_column_values) + config.save() + elif element['id'].startswith('d'): + config.config_denied_column_value = restriction_deletion(element, config.list_denied_column_values) + config.save() + elif type == 2: # Tags per user + usr_id = os.path.split(request.referrer)[-1] + if usr_id.isdigit() == True: + usr = ub.session.query(ub.User).filter(ub.User.id == int(usr_id)).first() + else: + usr = current_user + if element['id'].startswith('a'): + usr.allowed_tags = restriction_deletion(element, usr.list_allowed_tags) + ub.session.commit() + elif element['id'].startswith('d'): + usr.denied_tags = restriction_deletion(element, usr.list_denied_tags) + ub.session.commit() + elif type == 3: # Columns per user + usr_id = os.path.split(request.referrer)[-1] + if usr_id.isdigit() == True: # select current user if admins are editing their own rights + usr = ub.session.query(ub.User).filter(ub.User.id == int(usr_id)).first() + else: + usr = current_user + if element['id'].startswith('a'): + usr.allowed_column_value = restriction_deletion(element, usr.list_allowed_column_values) + ub.session.commit() + elif element['id'].startswith('d'): + usr.denied_column_value = restriction_deletion(element, usr.list_denied_column_values) + ub.session.commit() + return "" + + +#@admi.route("/ajax/listrestriction//", defaults={'user_id': '0'}) +@admi.route("/ajax/listrestriction/") +@login_required +@admin_required +def list_restriction(type): + if type == 0: # Tags as template + restrict = [{'Element': x, 'type':_('Deny'), 'id': 'd'+str(i) } + for i,x in enumerate(config.list_denied_tags()) if x != '' ] + allow = [{'Element': x, 'type':_('Allow'), 'id': 'a'+str(i) } + for i,x in enumerate(config.list_allowed_tags()) if x != ''] + json_dumps = restrict + allow + elif type == 1: # CustomC as template + restrict = [{'Element': x, 'type':_('Deny'), 'id': 'd'+str(i) } + for i,x in enumerate(config.list_denied_column_values()) if x != '' ] + allow = [{'Element': x, 'type':_('Allow'), 'id': 'a'+str(i) } + for i,x in enumerate(config.list_allowed_column_values()) if x != ''] + json_dumps = restrict + allow + elif type == 2: # Tags per user + usr_id = os.path.split(request.referrer)[-1] + if usr_id.isdigit() == True: + usr = ub.session.query(ub.User).filter(ub.User.id == usr_id).first() + else: + usr = current_user + restrict = [{'Element': x, 'type':_('Deny'), 'id': 'd'+str(i) } + for i,x in enumerate(usr.list_denied_tags()) if x != '' ] + allow = [{'Element': x, 'type':_('Allow'), 'id': 'a'+str(i) } + for i,x in enumerate(usr.list_allowed_tags()) if x != ''] + json_dumps = restrict + allow + elif type == 3: # CustomC per user + usr_id = os.path.split(request.referrer)[-1] + if usr_id.isdigit() == True: + usr = ub.session.query(ub.User).filter(ub.User.id==usr_id).first() + else: + usr = current_user + restrict = [{'Element': x, 'type':_('Deny'), 'id': 'd'+str(i) } + for i,x in enumerate(usr.list_denied_column_values()) if x != '' ] + allow = [{'Element': x, 'type':_('Allow'), 'id': 'a'+str(i) } + for i,x in enumerate(usr.list_allowed_column_values()) if x != ''] + json_dumps = restrict + allow + else: + json_dumps="" + js = json.dumps(json_dumps) + response = make_response(js.replace("'", '"')) + response.headers["Content-Type"] = "application/json; charset=utf-8" + return response @admi.route("/config", methods=["GET", "POST"]) @unconfigured @@ -262,7 +485,6 @@ def _configuration_update_helper(): db_change = False to_save = request.form.to_dict() - # _config_dict = lambda x: config.set_from_dictionary(to_save, x, lambda y: y['id']) _config_string = lambda x: config.set_from_dictionary(to_save, x, lambda y: y.strip() if y else y) _config_int = lambda x: config.set_from_dictionary(to_save, x, int) _config_checkbox = lambda x: config.set_from_dictionary(to_save, x, lambda y: y == "on", False) @@ -305,6 +527,9 @@ def _configuration_update_helper(): _config_checkbox_int("config_uploading") _config_checkbox_int("config_anonbrowse") _config_checkbox_int("config_public_reg") + reboot_required |= _config_checkbox_int("config_kobo_sync") + _config_checkbox_int("config_kobo_proxy") + _config_int("config_ebookconverter") _config_string("config_calibre") @@ -339,7 +564,7 @@ def _configuration_update_helper(): # Remote login configuration _config_checkbox("config_remote_login") if not config.config_remote_login: - ub.session.query(ub.RemoteAuthToken).delete() + ub.session.query(ub.RemoteAuthToken).filter(ub.RemoteAuthToken.token_type==0).delete() # Goodreads configuration _config_checkbox("config_use_goodreads") @@ -449,10 +674,11 @@ def new_user(): content = ub.User() languages = speaking_language() translations = [LC('en')] + babel.list_translations() + kobo_support = feature_support['kobo'] and config.config_kobo_sync if request.method == "POST": to_save = request.form.to_dict() content.default_language = to_save["default_language"] - content.mature_content = "Show_mature_content" in to_save + # content.mature_content = "Show_mature_content" in to_save content.locale = to_save.get("locale", content.locale) content.sidebar_view = sum(int(key[5:]) for key in to_save if key.startswith('show_')) @@ -464,7 +690,8 @@ def new_user(): if not to_save["nickname"] or not to_save["email"] or not to_save["password"]: flash(_(u"Please fill out all fields!"), category="error") return render_title_template("user_edit.html", new_user=1, content=content, translations=translations, - registered_oauth=oauth_check, title=_(u"Add new user")) + registered_oauth=oauth_check, kobo_support=kobo_support, + title=_(u"Add new user")) content.password = generate_password_hash(to_save["password"]) existing_user = ub.session.query(ub.User).filter(func.lower(ub.User.nickname) == to_save["nickname"].lower())\ .first() @@ -475,15 +702,20 @@ def new_user(): if config.config_public_reg and not check_valid_domain(to_save["email"]): flash(_(u"E-mail is not from valid domain"), category="error") return render_title_template("user_edit.html", new_user=1, content=content, translations=translations, - registered_oauth=oauth_check, title=_(u"Add new user")) + registered_oauth=oauth_check, kobo_support=kobo_support, + title=_(u"Add new user")) else: content.email = to_save["email"] else: flash(_(u"Found an existing account for this e-mail address or nickname."), category="error") return render_title_template("user_edit.html", new_user=1, content=content, translations=translations, languages=languages, title=_(u"Add new user"), page="newuser", - registered_oauth=oauth_check) + kobo_support=kobo_support, registered_oauth=oauth_check) try: + content.allowed_tags = config.config_allowed_tags + content.denied_tags = config.config_denied_tags + content.allowed_column_value = config.config_allowed_column_value + content.denied_column_value = config.config_denied_column_value ub.session.add(content) ub.session.commit() flash(_(u"User '%(user)s' created", user=content.nickname), category="success") @@ -494,10 +726,9 @@ def new_user(): else: content.role = config.config_default_role content.sidebar_view = config.config_default_show - content.mature_content = bool(config.config_default_show & constants.MATURE_CONTENT) return render_title_template("user_edit.html", new_user=1, content=content, translations=translations, languages=languages, title=_(u"Add new user"), page="newuser", - registered_oauth=oauth_check) + kobo_support=kobo_support, registered_oauth=oauth_check) @admi.route("/admin/mailsettings") @@ -552,6 +783,7 @@ def edit_user(user_id): downloads = list() languages = speaking_language() translations = babel.list_translations() + [LC('en')] + kobo_support = feature_support['kobo'] and config.config_kobo_sync for book in content.downloads: downloadbook = db.session.query(db.Books).filter(db.Books.id == book.book_id).first() if downloadbook: @@ -597,8 +829,6 @@ def edit_user(user_id): else: content.sidebar_view &= ~constants.DETAIL_RANDOM - content.mature_content = "Show_mature_content" in to_save - if "default_language" in to_save: content.default_language = to_save["default_language"] if "locale" in to_save and to_save["locale"]: @@ -610,9 +840,15 @@ def edit_user(user_id): content.email = to_save["email"] else: flash(_(u"Found an existing account for this e-mail address."), category="error") - return render_title_template("user_edit.html", translations=translations, languages=languages, + return render_title_template("user_edit.html", + translations=translations, + languages=languages, mail_configured = config.get_mail_server_configured(), - new_user=0, content=content, downloads=downloads, registered_oauth=oauth_check, + kobo_support=kobo_support, + new_user=0, + content=content, + downloads=downloads, + registered_oauth=oauth_check, title=_(u"Edit User %(nick)s", nick=content.nickname), page="edituser") if "nickname" in to_save and to_save["nickname"] != content.nickname: # Query User nickname, if not existing, change @@ -627,6 +863,7 @@ def edit_user(user_id): new_user=0, content=content, downloads=downloads, registered_oauth=oauth_check, + kobo_support=kobo_support, title=_(u"Edit User %(nick)s", nick=content.nickname), page="edituser") @@ -638,9 +875,15 @@ def edit_user(user_id): except IntegrityError: ub.session.rollback() flash(_(u"An unknown error occured."), category="error") - return render_title_template("user_edit.html", translations=translations, languages=languages, new_user=0, - content=content, downloads=downloads, registered_oauth=oauth_check, + return render_title_template("user_edit.html", + translations=translations, + languages=languages, + new_user=0, + content=content, + downloads=downloads, + registered_oauth=oauth_check, mail_configured=config.get_mail_server_configured(), + kobo_support=kobo_support, title=_(u"Edit User %(nick)s", nick=content.nickname), page="edituser") @@ -671,8 +914,12 @@ def view_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") + return render_title_template("logviewer.html", + title=_(u"Logfile viewer"), + accesslog_enable=config.config_access_log, + log_enable=bool(config.config_logfile != logger.LOG_TO_STDOUT), + logfiles=logfiles, + page="logfile") @admi.route("/ajax/log/") diff --git a/cps/cache_buster.py b/cps/cache_buster.py index 02aa7187..99614dfa 100644 --- a/cps/cache_buster.py +++ b/cps/cache_buster.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + # This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) # Copyright (C) 2016-2019 jkrehm andy29485 OzzieIsaacs # diff --git a/cps/cli.py b/cps/cli.py index e76a12cc..8d410a90 100644 --- a/cps/cli.py +++ b/cps/cli.py @@ -43,7 +43,7 @@ parser.add_argument('-k', metavar='path', help='path and name to SSL keyfile, e.g. /opt/test.key, works only in combination with certfile') parser.add_argument('-v', '--version', action='version', help='Shows version number and exits Calibre-web', version=version_info()) -parser.add_argument('-i', metavar='ip-adress', help='Server IP-Adress to listen') +parser.add_argument('-i', metavar='ip-address', help='Server IP-Address to listen') parser.add_argument('-s', metavar='user:pass', help='Sets specific username to new password') args = parser.parse_args() diff --git a/cps/comic.py b/cps/comic.py index 971d7999..9f0a3aa2 100755 --- a/cps/comic.py +++ b/cps/comic.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- # This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) diff --git a/cps/config_sql.py b/cps/config_sql.py index c00bc213..d971f72a 100644 --- a/cps/config_sql.py +++ b/cps/config_sql.py @@ -25,7 +25,7 @@ import sys from sqlalchemy import exc, Column, String, Integer, SmallInteger, Boolean from sqlalchemy.ext.declarative import declarative_base -from . import constants, cli, logger +from . import constants, cli, logger, ub log = logger.create() @@ -68,12 +68,18 @@ class _Settings(_Base): config_anonbrowse = Column(SmallInteger, default=0) config_public_reg = Column(SmallInteger, default=0) config_remote_login = Column(Boolean, default=False) - + config_kobo_sync = Column(Boolean, default=False) config_default_role = Column(SmallInteger, default=0) config_default_show = Column(SmallInteger, default=6143) config_columns_to_ignore = Column(String) + config_denied_tags = Column(String, default="") + config_allowed_tags = Column(String, default="") + config_restricted_column = Column(SmallInteger, default=0) + config_denied_column_value = Column(String, default="") + config_allowed_column_value = Column(String, default="") + config_use_google_drive = Column(Boolean, default=False) config_google_drive_folder = Column(String) config_google_drive_watch_changes_response = Column(String) @@ -84,7 +90,8 @@ class _Settings(_Base): config_login_type = Column(Integer, default=0) - # config_oauth_provider = Column(Integer) + config_kobo_proxy = Column(Boolean, default=False) + config_ldap_provider_url = Column(String, default='localhost') config_ldap_port = Column(SmallInteger, default=389) @@ -179,11 +186,20 @@ class _ConfigSQL(object): def show_detail_random(self): return self.show_element_new_user(constants.DETAIL_RANDOM) - def show_mature_content(self): - return self.show_element_new_user(constants.MATURE_CONTENT) + def list_denied_tags(self): + mct = self.config_denied_tags.split(",") + return [t.strip() for t in mct] + + def list_allowed_tags(self): + mct = self.config_allowed_tags.split(",") + return [t.strip() for t in mct] + + def list_denied_column_values(self): + mct = self.config_denied_column_value.split(",") + return [t.strip() for t in mct] - def mature_content_tags(self): - mct = self.config_mature_content_tags.split(",") + def list_allowed_column_values(self): + mct = self.config_allowed_column_value.split(",") return [t.strip() for t in mct] def get_log_level(self): @@ -323,5 +339,12 @@ def load_configuration(session): if not session.query(_Settings).count(): session.add(_Settings()) session.commit() - - return _ConfigSQL(session) + conf = _ConfigSQL(session) + # Migrate from global restrictions to user based restrictions + if bool(conf.config_default_show & constants.MATURE_CONTENT) and conf.config_denied_tags == "": + conf.config_denied_tags = conf.config_mature_content_tags + conf.save() + session.query(ub.User).filter(ub.User.mature_content != True). \ + update({"denied_tags": conf.config_mature_content_tags}, synchronize_session=False) + session.commit() + return conf diff --git a/cps/constants.py b/cps/constants.py index 7630b38f..8301800b 100644 --- a/cps/constants.py +++ b/cps/constants.py @@ -106,7 +106,6 @@ except ValueError: del env_CALIBRE_PORT - EXTENSIONS_AUDIO = {'mp3', 'm4a', 'm4b'} EXTENSIONS_CONVERT = {'pdf', 'epub', 'mobi', 'azw3', 'docx', 'rtf', 'fb2', 'lit', 'lrf', 'txt', 'htmlz', 'rtf', 'odt'} EXTENSIONS_UPLOAD = {'txt', 'pdf', 'epub', 'mobi', 'azw', 'azw3', 'cbr', 'cbz', 'cbt', 'djvu', 'prc', 'doc', 'docx', @@ -126,7 +125,7 @@ def selected_roles(dictionary): BookMeta = namedtuple('BookMeta', 'file_path, extension, title, author, cover, description, tags, series, ' 'series_id, languages') -STABLE_VERSION = {'version': '0.6.5 Beta'} +STABLE_VERSION = {'version': '0.6.7 Beta'} NIGHTLY_VERSION = {} NIGHTLY_VERSION[0] = '$Format:%H$' diff --git a/cps/db.py b/cps/db.py index 1ef06427..f40e0cda 100755 --- a/cps/db.py +++ b/cps/db.py @@ -25,13 +25,13 @@ import ast from sqlalchemy import create_engine from sqlalchemy import Table, Column, ForeignKey -from sqlalchemy import String, Integer, Boolean +from sqlalchemy import String, Integer, Boolean, TIMESTAMP, Float from sqlalchemy.orm import relationship, sessionmaker, scoped_session from sqlalchemy.ext.declarative import declarative_base session = None -cc_exceptions = ['datetime', 'comments', 'float', 'composite', 'series'] +cc_exceptions = ['datetime', 'comments', 'composite', 'series'] cc_classes = {} engine = None @@ -251,10 +251,10 @@ class Books(Base): title = Column(String) sort = Column(String) author_sort = Column(String) - timestamp = Column(String) + timestamp = Column(TIMESTAMP) pubdate = Column(String) series_index = Column(String) - last_modified = Column(String) + last_modified = Column(TIMESTAMP) path = Column(String) has_cover = Column(Integer) uuid = Column(String) @@ -378,6 +378,11 @@ def setup_db(config): 'id': Column(Integer, primary_key=True), 'book': Column(Integer, ForeignKey('books.id')), 'value': Column(Integer)} + elif row.datatype == 'float': + ccdict = {'__tablename__': 'custom_column_' + str(row.id), + 'id': Column(Integer, primary_key=True), + 'book': Column(Integer, ForeignKey('books.id')), + 'value': Column(Float)} else: ccdict = {'__tablename__': 'custom_column_' + str(row.id), 'id': Column(Integer, primary_key=True), @@ -385,7 +390,7 @@ def setup_db(config): cc_classes[row.id] = type(str('Custom_Column_' + str(row.id)), (Base,), ccdict) for cc_id in cc_ids: - if (cc_id[1] == 'bool') or (cc_id[1] == 'int'): + if (cc_id[1] == 'bool') or (cc_id[1] == 'int') or (cc_id[1] == 'float'): setattr(Books, 'custom_column_' + str(cc_id[0]), relationship(cc_classes[cc_id[0]], primaryjoin=( Books.id == cc_classes[cc_id[0]].book), diff --git a/cps/editbooks.py b/cps/editbooks.py index 7b78cf97..8e86132c 100644 --- a/cps/editbooks.py +++ b/cps/editbooks.py @@ -175,7 +175,7 @@ def delete_book(book_id, book_format): cc_string = "custom_column_" + str(c.id) if not c.is_multiple: if len(getattr(book, cc_string)) > 0: - if c.datatype == 'bool' or c.datatype == 'integer': + if c.datatype == 'bool' or c.datatype == 'integer' or c.datatype == 'float': del_cc = getattr(book, cc_string)[0] getattr(book, cc_string).remove(del_cc) db.session.delete(del_cc) @@ -254,7 +254,7 @@ def edit_cc_data(book_id, book, to_save): else: cc_db_value = None if to_save[cc_string].strip(): - if c.datatype == 'int' or c.datatype == 'bool': + if c.datatype == 'int' or c.datatype == 'bool' or c.datatype == 'float': if to_save[cc_string] == 'None': to_save[cc_string] = None elif c.datatype == 'bool': @@ -369,11 +369,11 @@ def upload_cover(request, book): requested_file = request.files['btn-upload-cover'] # check for empty request if requested_file.filename != '': - if helper.save_cover(requested_file, book.path) is True: + ret, message = helper.save_cover(requested_file, book.path) + if ret is True: return True else: - # ToDo Message not always coorect - flash(_(u"Cover is not a supported imageformat (jpg/png/webp), can't save"), category="error") + flash(message, category="error") return False return None @@ -697,7 +697,6 @@ def upload(): # Reread book. It's important not to filter the result, as it could have language which hide it from # current users view (tags are not stored/extracted from metadata and could also be limited) book = db.session.query(db.Books).filter(db.Books.id == book_id).first() - # upload book to gdrive if nesseccary and add "(bookid)" to folder name if config.config_use_google_drive: gdriveutils.updateGdriveCalibreFromLocal() diff --git a/cps/epub.py b/cps/epub.py index 7495b6b4..8b988084 100644 --- a/cps/epub.py +++ b/cps/epub.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- # This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) diff --git a/cps/fb2.py b/cps/fb2.py index cd61b511..bdb3d1d5 100644 --- a/cps/fb2.py +++ b/cps/fb2.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- # This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) diff --git a/cps/gdrive.py b/cps/gdrive.py index a95060b0..23a36a91 100644 --- a/cps/gdrive.py +++ b/cps/gdrive.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- # This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) diff --git a/cps/gdriveutils.py b/cps/gdriveutils.py index f70747a6..d53044bd 100644 --- a/cps/gdriveutils.py +++ b/cps/gdriveutils.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- # This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) diff --git a/cps/helper.py b/cps/helper.py index 61058f53..f82564b8 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -448,32 +448,46 @@ def delete_book(book, calibrepath, book_format): return delete_book_file(book, calibrepath, book_format) +def get_cover_on_failure(use_generic_cover): + if use_generic_cover: + return send_from_directory(_STATIC_DIR, "generic_cover.jpg") + else: + return None + def get_book_cover(book_id): - book = db.session.query(db.Books).filter(db.Books.id == book_id).first() - if book.has_cover: + book = db.session.query(db.Books).filter(db.Books.id == book_id).filter(common_filters()).first() + return get_book_cover_internal(book, use_generic_cover_on_failure=True) +def get_book_cover_with_uuid(book_uuid, + use_generic_cover_on_failure=True): + book = db.session.query(db.Books).filter(db.Books.uuid == book_uuid).first() + return get_book_cover_internal(book, use_generic_cover_on_failure) + +def get_book_cover_internal(book, + use_generic_cover_on_failure): + if book and book.has_cover: if config.config_use_google_drive: try: if not gd.is_gdrive_ready(): - return send_from_directory(_STATIC_DIR, "generic_cover.jpg") + return get_cover_on_failure(use_generic_cover_on_failure) path=gd.get_cover_via_gdrive(book.path) if path: return redirect(path) else: log.error('%s/cover.jpg not found on Google Drive', book.path) - return send_from_directory(_STATIC_DIR, "generic_cover.jpg") + return get_cover_on_failure(use_generic_cover_on_failure) except Exception as e: log.exception(e) # traceback.print_exc() - return send_from_directory(_STATIC_DIR,"generic_cover.jpg") + return get_cover_on_failure(use_generic_cover_on_failure) else: cover_file_path = os.path.join(config.config_calibre_dir, book.path) if os.path.isfile(os.path.join(cover_file_path, "cover.jpg")): return send_from_directory(cover_file_path, "cover.jpg") else: - return send_from_directory(_STATIC_DIR,"generic_cover.jpg") + return get_cover_on_failure(use_generic_cover_on_failure) else: - return send_from_directory(_STATIC_DIR,"generic_cover.jpg") + return get_cover_on_failure(use_generic_cover_on_failure) # saves book cover from url @@ -494,16 +508,16 @@ def save_cover_from_filestorage(filepath, saved_filename, img): os.makedirs(filepath) except OSError: log.error(u"Failed to create path for cover") - return False + return False, _(u"Failed to create path for cover") try: img.save(os.path.join(filepath, saved_filename)) except IOError: log.error(u"Cover-file is not a valid image file") - return False + return False, _(u"Cover-file is not a valid image file") except OSError: log.error(u"Failed to store cover-file") - return False - return True + return False, _(u"Failed to store cover-file") + return True, None # saves book cover to gdrive or locally @@ -513,7 +527,7 @@ def save_cover(img, book_path): if use_PIL: if content_type not in ('image/jpeg', 'image/png', 'image/webp'): log.error("Only jpg/jpeg/png/webp files are supported as coverfile") - return False + return False, _("Only jpg/jpeg/png/webp files are supported as coverfile") # convert to jpg because calibre only supports jpg if content_type in ('image/png', 'image/webp'): if hasattr(img,'stream'): @@ -527,17 +541,18 @@ def save_cover(img, book_path): else: if content_type not in ('image/jpeg'): log.error("Only jpg/jpeg files are supported as coverfile") - return False + return False, _("Only jpg/jpeg files are supported as coverfile") if config.config_use_google_drive: tmpDir = gettempdir() - if save_cover_from_filestorage(tmpDir, "uploaded_cover.jpg", img) is True: + ret, message = save_cover_from_filestorage(tmpDir, "uploaded_cover.jpg", img) + if ret is True: gd.uploadFileToEbooksFolder(os.path.join(book_path, 'cover.jpg'), os.path.join(tmpDir, "uploaded_cover.jpg")) log.info("Cover is saved on Google Drive") - return True + return True, None else: - return False + return False, message else: return save_cover_from_filestorage(os.path.join(config.config_calibre_dir, book_path), "cover.jpg", img) @@ -674,20 +689,40 @@ def common_filters(): lang_filter = db.Books.languages.any(db.Languages.lang_code == current_user.filter_language()) else: lang_filter = true() - content_rating_filter = false() if current_user.mature_content else \ - db.Books.tags.any(db.Tags.name.in_(config.mature_content_tags())) - return and_(lang_filter, ~content_rating_filter) + negtags_list = current_user.list_denied_tags() + postags_list = current_user.list_allowed_tags() + neg_content_tags_filter = false() if negtags_list == [''] else db.Books.tags.any(db.Tags.name.in_(negtags_list)) + pos_content_tags_filter = true() if postags_list == [''] else db.Books.tags.any(db.Tags.name.in_(postags_list)) + if config.config_restricted_column: + pos_cc_list = current_user.allowed_column_value.split(',') + pos_content_cc_filter = true() if pos_cc_list == [''] else \ + getattr(db.Books, 'custom_column_' + str(config.config_restricted_column)).\ + any(db.cc_classes[config.config_restricted_column].value.in_(pos_cc_list)) + neg_cc_list = current_user.denied_column_value.split(',') + neg_content_cc_filter = false() if neg_cc_list == [''] else \ + getattr(db.Books, 'custom_column_' + str(config.config_restricted_column)).\ + any(db.cc_classes[config.config_restricted_column].value.in_(neg_cc_list)) + else: + pos_content_cc_filter = true() + neg_content_cc_filter = false() + return and_(lang_filter, pos_content_tags_filter, ~neg_content_tags_filter, + pos_content_cc_filter, ~neg_content_cc_filter) + def tags_filters(): - return ~(false() if current_user.mature_content else \ - db.Tags.name.in_(config.mature_content_tags())) - # return db.session.query(db.Tags).filter(~content_rating_filter).order_by(db.Tags.name).all() + negtags_list = current_user.list_denied_tags() + postags_list = current_user.list_allowed_tags() + neg_content_tags_filter = false() if negtags_list == [''] else db.Tags.name.in_(negtags_list) + pos_content_tags_filter = true() if postags_list == [''] else db.Tags.name.in_(postags_list) + return and_(pos_content_tags_filter, ~neg_content_tags_filter) + # return ~(false()) if postags_list == [''] else db.Tags.in_(postags_list) # Creates for all stored languages a translated speaking name in the array for the UI def speaking_language(languages=None): if not languages: - languages = db.session.query(db.Languages).all() + languages = db.session.query(db.Languages).join(db.books_languages_link).join(db.Books).filter(common_filters())\ + .group_by(text('books_languages_link.lang_code')).all() for lang in languages: try: cur_l = LC.parse(lang.lang_code) @@ -774,7 +809,7 @@ def get_cc_columns(): cc = [] for col in tmpcc: r = re.compile(config.config_columns_to_ignore) - if r.match(col.label): + if not r.match(col.name): cc.append(col) else: cc = tmpcc @@ -784,11 +819,11 @@ def get_download_link(book_id, book_format): book_format = book_format.split(".")[0] book = db.session.query(db.Books).filter(db.Books.id == book_id).filter(common_filters()).first() if book: - data = db.session.query(db.Data).filter(db.Data.book == book.id)\ + data1 = db.session.query(db.Data).filter(db.Data.book == book.id)\ .filter(db.Data.format == book_format.upper()).first() else: abort(404) - if data: + if data1: # collect downloaded books only for registered user and not for anonymous user if current_user.is_authenticated: ub.update_download(book_id, int(current_user.id)) @@ -798,9 +833,9 @@ def get_download_link(book_id, book_format): file_name = get_valid_filename(file_name) headers = Headers() headers["Content-Type"] = mimetypes.types_map.get('.' + book_format, "application/octet-stream") - headers["Content-Disposition"] = "attachment; filename*=UTF-8''%s.%s" % (quote(file_name.encode('utf-8')), - book_format) - return do_download_file(book, book_format, data, headers) + headers["Content-Disposition"] = "attachment; filename=%s.%s; filename*=UTF-8''%s.%s" % ( + quote(file_name.encode('utf-8')), book_format, quote(file_name.encode('utf-8')), book_format) + return do_download_file(book, book_format, data1, headers) else: abort(404) diff --git a/cps/jinjia.py b/cps/jinjia.py index ffd6832c..5d05eeee 100644 --- a/cps/jinjia.py +++ b/cps/jinjia.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- # This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) diff --git a/cps/kobo.py b/cps/kobo.py new file mode 100644 index 00000000..f634f272 --- /dev/null +++ b/cps/kobo.py @@ -0,0 +1,629 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) +# Copyright (C) 2018-2019 shavitmichael, 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 . + +import sys +import base64 +import os +import uuid +from datetime import datetime +from time import gmtime, strftime +try: + from urllib import unquote +except ImportError: + from urllib.parse import unquote + +from flask import ( + Blueprint, + request, + make_response, + jsonify, + current_app, + url_for, + redirect, + abort +) +from flask_login import login_required +from werkzeug.datastructures import Headers +from sqlalchemy import func +import requests + +from . import config, logger, kobo_auth, db, helper +from .services import SyncToken as SyncToken +from .web import download_required +from .kobo_auth import requires_kobo_auth + +KOBO_FORMATS = {"KEPUB": ["KEPUB"], "EPUB": ["EPUB3", "EPUB"]} +KOBO_STOREAPI_URL = "https://storeapi.kobo.com" + +kobo = Blueprint("kobo", __name__, url_prefix="/kobo/") +kobo_auth.disable_failed_auth_redirect_for_blueprint(kobo) +kobo_auth.register_url_value_preprocessor(kobo) + +log = logger.create() + +def get_store_url_for_current_request(): + # Programmatically modify the current url to point to the official Kobo store + base, sep, request_path_with_auth_token = request.full_path.rpartition("/kobo/") + auth_token, sep, request_path = request_path_with_auth_token.rstrip("?").partition( + "/" + ) + return KOBO_STOREAPI_URL + "/" + request_path + + +CONNECTION_SPECIFIC_HEADERS = [ + "connection", + "content-encoding", + "content-length", + "transfer-encoding", +] + +def get_kobo_activated(): + return config.config_kobo_sync + + +def make_request_to_kobo_store(sync_token=None): + outgoing_headers = Headers(request.headers) + outgoing_headers.remove("Host") + if sync_token: + sync_token.set_kobo_store_header(outgoing_headers) + + store_response = requests.request( + method=request.method, + url=get_store_url_for_current_request(), + headers=outgoing_headers, + data=request.get_data(), + allow_redirects=False, + timeout=(2, 10) + ) + return store_response + + +def redirect_or_proxy_request(): + if config.config_kobo_proxy: + if request.method == "GET": + return redirect(get_store_url_for_current_request(), 307) + if request.method == "DELETE": + log.info('Delete Book') + return make_response(jsonify({})) + else: + # The Kobo device turns other request types into GET requests on redirects, so we instead proxy to the Kobo store ourselves. + store_response = make_request_to_kobo_store() + + response_headers = store_response.headers + for header_key in CONNECTION_SPECIFIC_HEADERS: + response_headers.pop(header_key, default=None) + + return make_response( + store_response.content, store_response.status_code, response_headers.items() + ) + else: + return make_response(jsonify({})) + + +@kobo.route("/v1/library/sync") +@requires_kobo_auth +@download_required +def HandleSyncRequest(): + sync_token = SyncToken.SyncToken.from_headers(request.headers) + log.info("Kobo library sync request received.") + if not current_app.wsgi_app.is_proxied: + log.debug('Kobo: Received unproxied request, changed request port to server port') + + # TODO: Limit the number of books return per sync call, and rely on the sync-continuatation header + # instead so that the device triggers another sync. + + new_books_last_modified = sync_token.books_last_modified + new_books_last_created = sync_token.books_last_created + entitlements = [] + + # We reload the book database so that the user get's a fresh view of the library + # in case of external changes (e.g: adding a book through Calibre). + db.reconnect_db(config) + + # sqlite gives unexpected results when performing the last_modified comparison without the datetime cast. + # It looks like it's treating the db.Books.last_modified field as a string and may fail + # the comparison because of the +00:00 suffix. + changed_entries = ( + db.session.query(db.Books) + .join(db.Data) + .filter(func.datetime(db.Books.last_modified) > sync_token.books_last_modified) + .filter(db.Data.format.in_(KOBO_FORMATS)) + .all() + ) + + for book in changed_entries: + entitlement = { + "BookEntitlement": create_book_entitlement(book), + "BookMetadata": get_metadata(book), + "ReadingState": reading_state(book), + } + if book.timestamp > sync_token.books_last_created: + entitlements.append({"NewEntitlement": entitlement}) + else: + entitlements.append({"ChangedEntitlement": entitlement}) + + new_books_last_modified = max( + book.last_modified, sync_token.books_last_modified + ) + new_books_last_created = max(book.timestamp, sync_token.books_last_created) + + sync_token.books_last_created = new_books_last_created + sync_token.books_last_modified = new_books_last_modified + + if config.config_kobo_proxy: + return generate_sync_response(request, sync_token, entitlements) + + return make_response(jsonify(entitlements)) + # Missing feature: Detect server-side book deletions. + + +def generate_sync_response(request, sync_token, entitlements): + extra_headers = {} + if config.config_kobo_proxy: + # Merge in sync results from the official Kobo store. + try: + store_response = make_request_to_kobo_store(sync_token) + + store_entitlements = store_response.json() + entitlements += store_entitlements + sync_token.merge_from_store_response(store_response) + extra_headers["x-kobo-sync"] = store_response.headers.get("x-kobo-sync") + extra_headers["x-kobo-sync-mode"] = store_response.headers.get("x-kobo-sync-mode") + extra_headers["x-kobo-recent-reads"] = store_response.headers.get("x-kobo-recent-reads") + + except Exception as e: + log.error("Failed to receive or parse response from Kobo's sync endpoint: " + str(e)) + sync_token.to_headers(extra_headers) + + response = make_response(jsonify(entitlements), extra_headers) + + return response + + +@kobo.route("/v1/library//metadata") +@requires_kobo_auth +@download_required +def HandleMetadataRequest(book_uuid): + if not current_app.wsgi_app.is_proxied: + log.debug('Kobo: Received unproxied request, changed request port to server port') + log.info("Kobo library metadata request received for book %s" % book_uuid) + book = db.session.query(db.Books).filter(db.Books.uuid == book_uuid).first() + if not book or not book.data: + log.info(u"Book %s not found in database", book_uuid) + return redirect_or_proxy_request() + + metadata = get_metadata(book) + return jsonify([metadata]) + + +def get_download_url_for_book(book, book_format): + if not current_app.wsgi_app.is_proxied: + if ':' in request.host and not request.host.endswith(']') : + host = "".join(request.host.split(':')[:-1]) + else: + host = request.host + return "{url_scheme}://{url_base}:{url_port}/download/{book_id}/{book_format}".format( + url_scheme=request.scheme, + url_base=host, + url_port=config.config_port, + book_id=book.id, + book_format=book_format.lower() + ) + return url_for( + "web.download_link", + book_id=book.id, + book_format=book_format.lower(), + _external=True, + ) + + +def create_book_entitlement(book): + book_uuid = book.uuid + return { + "Accessibility": "Full", + "ActivePeriod": {"From": current_time(),}, + "Created": book.timestamp.strftime("%Y-%m-%dT%H:%M:%SZ"), + "CrossRevisionId": book_uuid, + "Id": book_uuid, + "IsHiddenFromArchive": False, + "IsLocked": False, + # Setting this to true removes from the device. + "IsRemoved": False, + "LastModified": book.last_modified.strftime("%Y-%m-%dT%H:%M:%SZ"), + "OriginCategory": "Imported", + "RevisionId": book_uuid, + "Status": "Active", + } + + +def current_time(): + return strftime("%Y-%m-%dT%H:%M:%SZ", gmtime()) + + +def get_description(book): + if not book.comments: + return None + return book.comments[0].text + + +# TODO handle multiple authors +def get_author(book): + if not book.authors: + return None + return book.authors[0].name + + +def get_publisher(book): + if not book.publishers: + return None + return book.publishers[0].name + + +def get_series(book): + if not book.series: + return None + return book.series[0].name + + +def get_metadata(book): + download_urls = [] + for book_data in book.data: + if book_data.format not in KOBO_FORMATS: + continue + for kobo_format in KOBO_FORMATS[book_data.format]: + # log.debug('Id: %s, Format: %s' % (book.id, kobo_format)) + download_urls.append( + { + "Format": kobo_format, + "Size": book_data.uncompressed_size, + "Url": get_download_url_for_book(book, book_data.format), + # The Kobo forma accepts platforms: (Generic, Android) + "Platform": "Generic", + # "DrmType": "None", # Not required + } + ) + + book_uuid = book.uuid + metadata = { + "Categories": ["00000000-0000-0000-0000-000000000001",], + "Contributors": get_author(book), + "CoverImageId": book_uuid, + "CrossRevisionId": book_uuid, + "CurrentDisplayPrice": {"CurrencyCode": "USD", "TotalAmount": 0}, + "CurrentLoveDisplayPrice": {"TotalAmount": 0}, + "Description": get_description(book), + "DownloadUrls": download_urls, + "EntitlementId": book_uuid, + "ExternalIds": [], + "Genre": "00000000-0000-0000-0000-000000000001", + "IsEligibleForKoboLove": False, + "IsInternetArchive": False, + "IsPreOrder": False, + "IsSocialEnabled": True, + "Language": "en", + "PhoneticPronunciations": {}, + "PublicationDate": book.pubdate, + "Publisher": {"Imprint": "", "Name": get_publisher(book),}, + "RevisionId": book_uuid, + "Title": book.title, + "WorkId": book_uuid, + } + + if get_series(book): + if sys.version_info < (3, 0): + name = get_series(book).encode("utf-8") + else: + name = get_series(book) + metadata["Series"] = { + "Name": get_series(book), + "Number": book.series_index, + "NumberFloat": float(book.series_index), + # Get a deterministic id based on the series name. + "Id": uuid.uuid3(uuid.NAMESPACE_DNS, name), + } + + return metadata + + +def reading_state(book): + # TODO: Implement + reading_state = { + # "StatusInfo": { + # "LastModified": get_single_cc_value(book, "lastreadtimestamp"), + # "Status": get_single_cc_value(book, "reading_status"), + # } + # TODO: CurrentBookmark, Location + } + return reading_state + + +@kobo.route("//image.jpg") +@requires_kobo_auth +def HandleCoverImageRequest(book_uuid): + book_cover = helper.get_book_cover_with_uuid( + book_uuid, use_generic_cover_on_failure=False + ) + if not book_cover: + if config.config_kobo_proxy: + log.debug("Cover for unknown book: %s proxied to kobo" % book_uuid) + return redirect(get_store_url_for_current_request(), 307) + else: + log.debug("Cover for unknown book: %s requested" % book_uuid) + return redirect_or_proxy_request() + log.debug("Cover request received for book %s" % book_uuid) + return book_cover + + +@kobo.route("") +def TopLevelEndpoint(): + return make_response(jsonify({})) + + +# TODO: Implement the following routes +@kobo.route("/v1/library/", methods=["DELETE", "GET"]) +@kobo.route("/v1/library//state", methods=["PUT"]) +@kobo.route("/v1/library/tags", methods=["POST"]) +@kobo.route("/v1/library/tags/", methods=["POST"]) +@kobo.route("/v1/library/tags/", methods=["DELETE"]) +def HandleUnimplementedRequest(dummy=None, book_uuid=None, shelf_name=None, tag_id=None): + log.debug("Unimplemented Library Request received: %s", request.base_url) + return redirect_or_proxy_request() + + +# TODO: Implement the following routes +@kobo.route("/v1/user/loyalty/", methods=["GET", "POST"]) +@kobo.route("/v1/user/profile", methods=["GET", "POST"]) +@kobo.route("/v1/user/wishlist", methods=["GET", "POST"]) +@kobo.route("/v1/user/recommendations", methods=["GET", "POST"]) +@kobo.route("/v1/analytics/", methods=["GET", "POST"]) +def HandleUserRequest(dummy=None): + log.debug("Unimplemented User Request received: %s", request.base_url) + return redirect_or_proxy_request() + + +@kobo.route("/v1/products//prices", methods=["GET", "POST"]) +@kobo.route("/v1/products//recommendations", methods=["GET", "POST"]) +@kobo.route("/v1/products//nextread", methods=["GET", "POST"]) +@kobo.route("/v1/products//reviews", methods=["GET", "POST"]) +@kobo.route("/v1/products/books/", methods=["GET", "POST"]) +@kobo.route("/v1/products/dailydeal", methods=["GET", "POST"]) +@kobo.route("/v1/products", methods=["GET", "POST"]) +def HandleProductsRequest(dummy=None): + log.debug("Unimplemented Products Request received: %s", request.base_url) + return redirect_or_proxy_request() + + +@kobo.app_errorhandler(404) +def handle_404(err): + # This handler acts as a catch-all for endpoints that we don't have an interest in + # implementing (e.g: v1/analytics/gettests, v1/user/recommendations, etc) + log.debug("Unknown Request received: %s", request.base_url) + return redirect_or_proxy_request() + + +def make_calibre_web_auth_response(): + # As described in kobo_auth.py, CalibreWeb doesn't make use practical use of this auth/device API call for + # authentation (nor for authorization). We return a dummy response just to keep the device happy. + content = request.get_json() + AccessToken = base64.b64encode(os.urandom(24)).decode('utf-8') + RefreshToken = base64.b64encode(os.urandom(24)).decode('utf-8') + return make_response( + jsonify( + { + "AccessToken": AccessToken, + "RefreshToken": RefreshToken, + "TokenType": "Bearer", + "TrackingId": str(uuid.uuid4()), + "UserKey": content['UserKey'], + } + ) + ) + + +@kobo.route("/v1/auth/device", methods=["POST"]) +@requires_kobo_auth +def HandleAuthRequest(): + log.debug('Kobo Auth request') + if config.config_kobo_proxy: + try: + return redirect_or_proxy_request() + except: + log.error("Failed to receive or parse response from Kobo's auth endpoint. Falling back to un-proxied mode.") + return make_calibre_web_auth_response() + + +def make_calibre_web_init_response(calibre_web_url): + resources = NATIVE_KOBO_RESOURCES(calibre_web_url) + response = make_response(jsonify({"Resources": resources})) + response.headers["x-kobo-apitoken"] = "e30=" + return response + + +@kobo.route("/v1/initialization") +@requires_kobo_auth +def HandleInitRequest(): + log.info('Init') + + if not current_app.wsgi_app.is_proxied: + log.debug('Kobo: Received unproxied request, changed request port to server port') + if ':' in request.host and not request.host.endswith(']'): + host = "".join(request.host.split(':')[:-1]) + else: + host = request.host + calibre_web_url = "{url_scheme}://{url_base}:{url_port}".format( + url_scheme=request.scheme, + url_base=host, + url_port=config.config_port + ) + else: + calibre_web_url = url_for("web.index", _external=True).strip("/") + + if config.config_kobo_proxy: + try: + store_response = make_request_to_kobo_store() + + store_response_json = store_response.json() + if "Resources" in store_response_json: + kobo_resources = store_response_json["Resources"] + # calibre_web_url = url_for("web.index", _external=True).strip("/") + kobo_resources["image_host"] = calibre_web_url + kobo_resources["image_url_quality_template"] = unquote(calibre_web_url + url_for("kobo.HandleCoverImageRequest", + auth_token = kobo_auth.get_auth_token(), + book_uuid="{ImageId}")) + kobo_resources["image_url_template"] = unquote(calibre_web_url + url_for("kobo.HandleCoverImageRequest", + auth_token = kobo_auth.get_auth_token(), + book_uuid="{ImageId}")) + + return make_response(store_response_json, store_response.status_code) + except: + log.error("Failed to receive or parse response from Kobo's init endpoint. Falling back to un-proxied mode.") + + return make_calibre_web_init_response(calibre_web_url) + + +def NATIVE_KOBO_RESOURCES(calibre_web_url): + return { + "account_page": "https://secure.kobobooks.com/profile", + "account_page_rakuten": "https://my.rakuten.co.jp/", + "add_entitlement": "https://storeapi.kobo.com/v1/library/{RevisionIds}", + "affiliaterequest": "https://storeapi.kobo.com/v1/affiliate", + "audiobook_subscription_orange_deal_inclusion_url": "https://authorize.kobo.com/inclusion", + "authorproduct_recommendations": "https://storeapi.kobo.com/v1/products/books/authors/recommendations", + "autocomplete": "https://storeapi.kobo.com/v1/products/autocomplete", + "blackstone_header": {"key": "x-amz-request-payer", "value": "requester"}, + "book": "https://storeapi.kobo.com/v1/products/books/{ProductId}", + "book_detail_page": "https://store.kobobooks.com/{culture}/ebook/{slug}", + "book_detail_page_rakuten": "http://books.rakuten.co.jp/rk/{crossrevisionid}", + "book_landing_page": "https://store.kobobooks.com/ebooks", + "book_subscription": "https://storeapi.kobo.com/v1/products/books/subscriptions", + "categories": "https://storeapi.kobo.com/v1/categories", + "categories_page": "https://store.kobobooks.com/ebooks/categories", + "category": "https://storeapi.kobo.com/v1/categories/{CategoryId}", + "category_featured_lists": "https://storeapi.kobo.com/v1/categories/{CategoryId}/featured", + "category_products": "https://storeapi.kobo.com/v1/categories/{CategoryId}/products", + "checkout_borrowed_book": "https://storeapi.kobo.com/v1/library/borrow", + "configuration_data": "https://storeapi.kobo.com/v1/configuration", + "content_access_book": "https://storeapi.kobo.com/v1/products/books/{ProductId}/access", + "customer_care_live_chat": "https://v2.zopim.com/widget/livechat.html?key=Y6gwUmnu4OATxN3Tli4Av9bYN319BTdO", + "daily_deal": "https://storeapi.kobo.com/v1/products/dailydeal", + "deals": "https://storeapi.kobo.com/v1/deals", + "delete_entitlement": "https://storeapi.kobo.com/v1/library/{Ids}", + "delete_tag": "https://storeapi.kobo.com/v1/library/tags/{TagId}", + "delete_tag_items": "https://storeapi.kobo.com/v1/library/tags/{TagId}/items/delete", + "device_auth": "https://storeapi.kobo.com/v1/auth/device", + "device_refresh": "https://storeapi.kobo.com/v1/auth/refresh", + "dictionary_host": "https://kbdownload1-a.akamaihd.net", + "discovery_host": "https://discovery.kobobooks.com", + "eula_page": "https://www.kobo.com/termsofuse?style=onestore", + "exchange_auth": "https://storeapi.kobo.com/v1/auth/exchange", + "external_book": "https://storeapi.kobo.com/v1/products/books/external/{Ids}", + "facebook_sso_page": "https://authorize.kobo.com/signin/provider/Facebook/login?returnUrl=http://store.kobobooks.com/", + "featured_list": "https://storeapi.kobo.com/v1/products/featured/{FeaturedListId}", + "featured_lists": "https://storeapi.kobo.com/v1/products/featured", + "free_books_page": { + "EN": "https://www.kobo.com/{region}/{language}/p/free-ebooks", + "FR": "https://www.kobo.com/{region}/{language}/p/livres-gratuits", + "IT": "https://www.kobo.com/{region}/{language}/p/libri-gratuiti", + "NL": "https://www.kobo.com/{region}/{language}/List/bekijk-het-overzicht-van-gratis-ebooks/QpkkVWnUw8sxmgjSlCbJRg", + "PT": "https://www.kobo.com/{region}/{language}/p/livros-gratis", + }, + "fte_feedback": "https://storeapi.kobo.com/v1/products/ftefeedback", + "get_tests_request": "https://storeapi.kobo.com/v1/analytics/gettests", + "giftcard_epd_redeem_url": "https://www.kobo.com/{storefront}/{language}/redeem-ereader", + "giftcard_redeem_url": "https://www.kobo.com/{storefront}/{language}/redeem", + "help_page": "http://www.kobo.com/help", + "image_host": calibre_web_url, + "image_url_quality_template": unquote(calibre_web_url + url_for("kobo.HandleCoverImageRequest", + auth_token = kobo_auth.get_auth_token(), + book_uuid="{ImageId}")), + "image_url_template": unquote(calibre_web_url + url_for("kobo.HandleCoverImageRequest", + auth_token = kobo_auth.get_auth_token(), + book_uuid="{ImageId}")), + "kobo_audiobooks_enabled": "False", + "kobo_audiobooks_orange_deal_enabled": "False", + "kobo_audiobooks_subscriptions_enabled": "False", + "kobo_nativeborrow_enabled": "True", + "kobo_onestorelibrary_enabled": "False", + "kobo_redeem_enabled": "True", + "kobo_shelfie_enabled": "False", + "kobo_subscriptions_enabled": "False", + "kobo_superpoints_enabled": "False", + "kobo_wishlist_enabled": "True", + "library_book": "https://storeapi.kobo.com/v1/user/library/books/{LibraryItemId}", + "library_items": "https://storeapi.kobo.com/v1/user/library", + "library_metadata": "https://storeapi.kobo.com/v1/library/{Ids}/metadata", + "library_prices": "https://storeapi.kobo.com/v1/user/library/previews/prices", + "library_stack": "https://storeapi.kobo.com/v1/user/library/stacks/{LibraryItemId}", + "library_sync": "https://storeapi.kobo.com/v1/library/sync", + "love_dashboard_page": "https://store.kobobooks.com/{culture}/kobosuperpoints", + "love_points_redemption_page": "https://store.kobobooks.com/{culture}/KoboSuperPointsRedemption?productId={ProductId}", + "magazine_landing_page": "https://store.kobobooks.com/emagazines", + "notifications_registration_issue": "https://storeapi.kobo.com/v1/notifications/registration", + "oauth_host": "https://oauth.kobo.com", + "overdrive_account": "https://auth.overdrive.com/account", + "overdrive_library": "https://{libraryKey}.auth.overdrive.com/library", + "overdrive_library_finder_host": "https://libraryfinder.api.overdrive.com", + "overdrive_thunder_host": "https://thunder.api.overdrive.com", + "password_retrieval_page": "https://www.kobobooks.com/passwordretrieval.html", + "post_analytics_event": "https://storeapi.kobo.com/v1/analytics/event", + "privacy_page": "https://www.kobo.com/privacypolicy?style=onestore", + "product_nextread": "https://storeapi.kobo.com/v1/products/{ProductIds}/nextread", + "product_prices": "https://storeapi.kobo.com/v1/products/{ProductIds}/prices", + "product_recommendations": "https://storeapi.kobo.com/v1/products/{ProductId}/recommendations", + "product_reviews": "https://storeapi.kobo.com/v1/products/{ProductIds}/reviews", + "products": "https://storeapi.kobo.com/v1/products", + "provider_external_sign_in_page": "https://authorize.kobo.com/ExternalSignIn/{providerName}?returnUrl=http://store.kobobooks.com/", + "purchase_buy": "https://www.kobo.com/checkout/createpurchase/", + "purchase_buy_templated": "https://www.kobo.com/{culture}/checkout/createpurchase/{ProductId}", + "quickbuy_checkout": "https://storeapi.kobo.com/v1/store/quickbuy/{PurchaseId}/checkout", + "quickbuy_create": "https://storeapi.kobo.com/v1/store/quickbuy/purchase", + "rating": "https://storeapi.kobo.com/v1/products/{ProductId}/rating/{Rating}", + "reading_state": "https://storeapi.kobo.com/v1/library/{Ids}/state", + "redeem_interstitial_page": "https://store.kobobooks.com", + "registration_page": "https://authorize.kobo.com/signup?returnUrl=http://store.kobobooks.com/", + "related_items": "https://storeapi.kobo.com/v1/products/{Id}/related", + "remaining_book_series": "https://storeapi.kobo.com/v1/products/books/series/{SeriesId}", + "rename_tag": "https://storeapi.kobo.com/v1/library/tags/{TagId}", + "review": "https://storeapi.kobo.com/v1/products/reviews/{ReviewId}", + "review_sentiment": "https://storeapi.kobo.com/v1/products/reviews/{ReviewId}/sentiment/{Sentiment}", + "shelfie_recommendations": "https://storeapi.kobo.com/v1/user/recommendations/shelfie", + "sign_in_page": "https://authorize.kobo.com/signin?returnUrl=http://store.kobobooks.com/", + "social_authorization_host": "https://social.kobobooks.com:8443", + "social_host": "https://social.kobobooks.com", + "stacks_host_productId": "https://store.kobobooks.com/collections/byproductid/", + "store_home": "www.kobo.com/{region}/{language}", + "store_host": "store.kobobooks.com", + "store_newreleases": "https://store.kobobooks.com/{culture}/List/new-releases/961XUjtsU0qxkFItWOutGA", + "store_search": "https://store.kobobooks.com/{culture}/Search?Query={query}", + "store_top50": "https://store.kobobooks.com/{culture}/ebooks/Top", + "tag_items": "https://storeapi.kobo.com/v1/library/tags/{TagId}/Items", + "tags": "https://storeapi.kobo.com/v1/library/tags", + "taste_profile": "https://storeapi.kobo.com/v1/products/tasteprofile", + "update_accessibility_to_preview": "https://storeapi.kobo.com/v1/library/{EntitlementIds}/preview", + "use_one_store": "False", + "user_loyalty_benefits": "https://storeapi.kobo.com/v1/user/loyalty/benefits", + "user_platform": "https://storeapi.kobo.com/v1/user/platform", + "user_profile": "https://storeapi.kobo.com/v1/user/profile", + "user_ratings": "https://storeapi.kobo.com/v1/user/ratings", + "user_recommendations": "https://storeapi.kobo.com/v1/user/recommendations", + "user_reviews": "https://storeapi.kobo.com/v1/user/reviews", + "user_wishlist": "https://storeapi.kobo.com/v1/user/wishlist", + "userguide_host": "https://kbdownload1-a.akamaihd.net", + "wishlist_page": "https://store.kobobooks.com/{region}/{language}/account/wishlist", + } diff --git a/cps/kobo_auth.py b/cps/kobo_auth.py new file mode 100644 index 00000000..ed712980 --- /dev/null +++ b/cps/kobo_auth.py @@ -0,0 +1,165 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) +# Copyright (C) 2018-2019 shavitmichael, 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 . + + +"""This module is used to control authentication/authorization of Kobo sync requests. +This module also includes research notes into the auth protocol used by Kobo devices. + +Log-in: +When first booting a Kobo device the user must sign into a Kobo (or affiliate) account. +Upon successful sign-in, the user is redirected to + https://auth.kobobooks.com/CrossDomainSignIn?id= +which serves the following response: + +And triggers the insertion of a userKey into the device's User table. + +Together, the device's DeviceId and UserKey act as an *irrevocable* authentication +token to most (if not all) Kobo APIs. In fact, in most cases only the UserKey is +required to authorize the API call. + +Changing Kobo password *does not* invalidate user keys! This is apparently a known +issue for a few years now https://www.mobileread.com/forums/showpost.php?p=3476851&postcount=13 +(although this poster hypothesised that Kobo could blacklist a DeviceId, many endpoints +will still grant access given the userkey.) + +Official Kobo Store Api authorization: +* For most of the endpoints we care about (sync, metadata, tags, etc), the userKey is +passed in the x-kobo-userkey header, and is sufficient to authorize the API call. +* Some endpoints (e.g: AnnotationService) instead make use of Bearer tokens pass through +an authorization header. To get a BearerToken, the device makes a POST request to the +v1/auth/device endpoint with the secret UserKey and the device's DeviceId. +* The book download endpoint passes an auth token as a URL param instead of a header. + +Our implementation: +We pretty much ignore all of the above. To authenticate the user, we generate a random +and unique token that they append to the CalibreWeb Url when setting up the api_store +setting on the device. +Thus, every request from the device to the api_store will hit CalibreWeb with the +auth_token in the url (e.g: https://mylibrary.com//v1/library/sync). +In addition, once authenticated we also set the login cookie on the response that will +be sent back for the duration of the session to authorize subsequent API calls (in +particular calls to non-Kobo specific endpoints such as the CalibreWeb book download). +""" + +from binascii import hexlify +from datetime import datetime +from os import urandom +import os + +from flask import g, Blueprint, url_for, abort, request +from flask_login import login_user, login_required +from flask_babel import gettext as _ + +from . import logger, ub, lm +from .web import render_title_template + +try: + from functools import wraps +except ImportError: + pass # We're not using Python 3 + + +log = logger.create() + + +def register_url_value_preprocessor(kobo): + @kobo.url_value_preprocessor + def pop_auth_token(endpoint, values): + g.auth_token = values.pop("auth_token") + + +def disable_failed_auth_redirect_for_blueprint(bp): + lm.blueprint_login_views[bp.name] = None + + +def get_auth_token(): + if "auth_token" in g: + return g.get("auth_token") + else: + return None + + +def requires_kobo_auth(f): + @wraps(f) + def inner(*args, **kwargs): + auth_token = get_auth_token() + if auth_token is not None: + user = ( + ub.session.query(ub.User) + .join(ub.RemoteAuthToken) + .filter(ub.RemoteAuthToken.auth_token == auth_token).filter(ub.RemoteAuthToken.token_type==1) + .first() + ) + if user is not None: + login_user(user) + return f(*args, **kwargs) + log.debug("Received Kobo request without a recognizable auth token.") + return abort(401) + return inner + + +kobo_auth = Blueprint("kobo_auth", __name__, url_prefix="/kobo_auth") + + +@kobo_auth.route("/generate_auth_token/") +@login_required +def generate_auth_token(user_id): + host = ':'.join(request.host.rsplit(':')[0:-1]) + if host.startswith('127.') or host.lower() == 'localhost' or host.startswith('[::ffff:7f'): + warning = _('PLease access calibre-web from non localhost to get valid api_endpoint for kobo device') + return render_title_template( + "generate_kobo_auth_url.html", + title=_(u"Kobo Setup"), + warning = warning + ) + else: + # Invalidate any prevously generated Kobo Auth token for this user. + auth_token = ub.session.query(ub.RemoteAuthToken).filter( + ub.RemoteAuthToken.user_id == user_id + ).filter(ub.RemoteAuthToken.token_type==1).first() + + if not auth_token: + auth_token = ub.RemoteAuthToken() + auth_token.user_id = user_id + auth_token.expiration = datetime.max + auth_token.auth_token = (hexlify(urandom(16))).decode("utf-8") + auth_token.token_type = 1 + + ub.session.add(auth_token) + ub.session.commit() + return render_title_template( + "generate_kobo_auth_url.html", + title=_(u"Kobo Setup"), + kobo_auth_url=url_for( + "kobo.TopLevelEndpoint", auth_token=auth_token.auth_token, _external=True + ), + warning = False + ) + + +@kobo_auth.route("/deleteauthtoken/") +@login_required +def delete_auth_token(user_id): + # Invalidate any prevously generated Kobo Auth token for this user. + ub.session.query(ub.RemoteAuthToken).filter(ub.RemoteAuthToken.user_id == user_id)\ + .filter(ub.RemoteAuthToken.token_type==1).delete() + ub.session.commit() + return "" diff --git a/cps/oauth.py b/cps/oauth.py index f08c66df..a0d36eb5 100644 --- a/cps/oauth.py +++ b/cps/oauth.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- # This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) diff --git a/cps/oauth_bb.py b/cps/oauth_bb.py index 092473da..70dc9aa6 100644 --- a/cps/oauth_bb.py +++ b/cps/oauth_bb.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- # This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) @@ -50,7 +49,7 @@ def oauth_required(f): def inner(*args, **kwargs): if config.config_login_type == constants.LOGIN_OAUTH: return f(*args, **kwargs) - if request.is_xhr: + if request.headers.get('X-Requested-With') == 'XMLHttpRequest': data = {'status': 'error', 'message': 'Not Found'} response = make_response(json.dumps(data, ensure_ascii=False)) response.headers["Content-Type"] = "application/json; charset=utf-8" diff --git a/cps/opds.py b/cps/opds.py index 3ff718da..f76d5dc0 100644 --- a/cps/opds.py +++ b/cps/opds.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- # This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) @@ -57,6 +56,20 @@ def requires_basic_auth_if_no_ano(f): return decorated +class FeedObject(): + def __init__(self,rating_id , rating_name): + self.rating_id = rating_id + self.rating_name = rating_name + + @property + def id(self): + return self.rating_id + + @property + def name(self): + return self.rating_name + + @opds.route("/opds/") @opds.route("/opds") @requires_basic_auth_if_no_ano @@ -215,6 +228,31 @@ def feed_series(book_id): db.Books, db.Books.series.any(db.Series.id == book_id), [db.Books.series_index]) return render_xml_template('feed.xml', entries=entries, pagination=pagination) +@opds.route("/opds/ratings") +@requires_basic_auth_if_no_ano +def feed_ratingindex(): + off = request.args.get("offset") or 0 + entries = db.session.query(db.Ratings, func.count('books_ratings_link.book').label('count'), + (db.Ratings.rating / 2).label('name')) \ + .join(db.books_ratings_link).join(db.Books).filter(common_filters()) \ + .group_by(text('books_ratings_link.rating')).order_by(db.Ratings.rating).all() + + pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page, + len(entries)) + element = list() + for entry in entries: + element.append(FeedObject(entry[0].id, "{} Stars".format(entry.name))) + return render_xml_template('feed.xml', listelements=element, folder='opds.feed_ratings', pagination=pagination) + +@opds.route("/opds/ratings/") +@requires_basic_auth_if_no_ano +def feed_ratings(book_id): + off = request.args.get("offset") or 0 + entries, __, pagination = fill_indexpage((int(off) / (int(config.config_books_per_page)) + 1), + db.Books, db.Books.ratings.any(db.Ratings.id == book_id),[db.Books.timestamp.desc()]) + return render_xml_template('feed.xml', entries=entries, pagination=pagination) + + @opds.route("/opds/formats") @requires_basic_auth_if_no_ano def feed_formatindex(): @@ -223,10 +261,11 @@ def feed_formatindex(): .group_by(db.Data.format).order_by(db.Data.format).all() pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page, len(entries)) + + element = list() for entry in entries: - entry.name = entry.format - entry.id = entry.format - return render_xml_template('feed.xml', listelements=entries, folder='opds.feed_format', pagination=pagination) + element.append(FeedObject(entry.format, entry.format)) + return render_xml_template('feed.xml', listelements=element, folder='opds.feed_format', pagination=pagination) @opds.route("/opds/formats/") @@ -266,16 +305,9 @@ def feed_languages(book_id): off = request.args.get("offset") or 0 entries, __, pagination = fill_indexpage((int(off) / (int(config.config_books_per_page)) + 1), db.Books, db.Books.languages.any(db.Languages.id == book_id), [db.Books.timestamp.desc()]) - '''for entry in entries: - for index in range(0, len(entry.languages)): - try: - entry.languages[index].language_name = LC.parse(entry.languages[index].lang_code).get_language_name( - get_locale()) - except UnknownLocaleError: - entry.languages[index].language_name = _( - isoLanguages.get(part3=entry.languages[index].lang_code).name)''' return render_xml_template('feed.xml', entries=entries, pagination=pagination) + @opds.route("/opds/shelfindex", defaults={'public': 0}) @opds.route("/opds/shelfindex/") @requires_basic_auth_if_no_ano @@ -320,11 +352,11 @@ def feed_shelf(book_id): @requires_basic_auth_if_no_ano @download_required def opds_download_link(book_id, book_format): - return get_download_link(book_id,book_format) + return get_download_link(book_id,book_format.lower()) @opds.route("/ajax/book//") -@opds.route("/ajax/book/") +@opds.route("/ajax/book/",defaults={'library': ""}) @requires_basic_auth_if_no_ano def get_metadata_calibre_companion(uuid, library): entry = db.session.query(db.Books).filter(db.Books.uuid.like("%" + uuid + "%")).first() diff --git a/cps/pagination.py b/cps/pagination.py index 0a138a64..c29717c2 100644 --- a/cps/pagination.py +++ b/cps/pagination.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- # This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) diff --git a/cps/redirect.py b/cps/redirect.py index 324c4b20..593afd0c 100644 --- a/cps/redirect.py +++ b/cps/redirect.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- # Flask License diff --git a/cps/reverseproxy.py b/cps/reverseproxy.py index 25bbe77b..42b64050 100644 --- a/cps/reverseproxy.py +++ b/cps/reverseproxy.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- # Flask License @@ -60,10 +59,13 @@ class ReverseProxied(object): def __init__(self, application): self.app = application + self.proxied = False def __call__(self, environ, start_response): + self.proxied = False script_name = environ.get('HTTP_X_SCRIPT_NAME', '') if script_name: + self.proxied = True environ['SCRIPT_NAME'] = script_name path_info = environ.get('PATH_INFO', '') if path_info and path_info.startswith(script_name): @@ -76,3 +78,7 @@ class ReverseProxied(object): if servr: environ['HTTP_HOST'] = servr return self.app(environ, start_response) + + @property + def is_proxied(self): + return self.proxied diff --git a/cps/server.py b/cps/server.py index 43792ecd..74c591ec 100755 --- a/cps/server.py +++ b/cps/server.py @@ -146,7 +146,7 @@ class WebServer(object): self.unix_socket_file = None def _start_tornado(self): - if os.name == 'nt': + if os.name == 'nt' and sys.version_info > (3, 7): import asyncio asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) log.info('Starting Tornado server on %s', _readable_listen_address(self.listen_address, self.listen_port)) @@ -156,7 +156,7 @@ class WebServer(object): max_buffer_size=209700000, ssl_options=self.ssl_args) http_server.listen(self.listen_port, self.listen_address) - self.wsgiserver = IOLoop.instance() + self.wsgiserver = IOLoop.current() self.wsgiserver.start() # wait for stop signal self.wsgiserver.close(True) @@ -177,6 +177,8 @@ class WebServer(object): if not self.restart: log.info("Performing shutdown of Calibre-Web") + # prevent irritiating log of pending tasks message from asyncio + logger.get('asyncio').setLevel(logger.logging.CRITICAL) return True log.info("Performing restart of Calibre-Web") @@ -197,4 +199,4 @@ class WebServer(object): if _GEVENT: self.wsgiserver.close() else: - self.wsgiserver.add_callback(self.wsgiserver.stop) + self.wsgiserver.add_callback_from_signal(self.wsgiserver.stop) diff --git a/cps/services/SyncToken.py b/cps/services/SyncToken.py new file mode 100644 index 00000000..63d82ac0 --- /dev/null +++ b/cps/services/SyncToken.py @@ -0,0 +1,148 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) +# Copyright (C) 2018-2019 shavitmichael, 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 . + +import sys +from base64 import b64decode, b64encode +from jsonschema import validate, exceptions, __version__ +from datetime import datetime +try: + from urllib import unquote +except ImportError: + from urllib.parse import unquote + +from flask import json +from .. import logger as log + + +def b64encode_json(json_data): + if sys.version_info < (3, 0): + return b64encode(json.dumps(json_data)) + else: + return b64encode(json.dumps(json_data).encode()) + + +# Python3 has a timestamp() method we could be calling, however it's not avaiable in python2. +def to_epoch_timestamp(datetime_object): + return (datetime_object - datetime(1970, 1, 1)).total_seconds() + + +class SyncToken(): + """ The SyncToken is used to persist state accross requests. + When serialized over the response headers, the Kobo device will propagate the token onto following requests to the service. + As an example use-case, the SyncToken is used to detect books that have been added to the library since the last time the device synced to the server. + + Attributes: + books_last_created: Datetime representing the newest book that the device knows about. + books_last_modified: Datetime representing the last modified book that the device knows about. + """ + + SYNC_TOKEN_HEADER = "x-kobo-synctoken" + VERSION = "1-0-0" + MIN_VERSION = "1-0-0" + + token_schema = { + "type": "object", + "properties": {"version": {"type": "string"}, "data": {"type": "object"},}, + } + # This Schema doesn't contain enough information to detect and propagate book deletions from Calibre to the device. + # A potential solution might be to keep a list of all known book uuids in the token, and look for any missing from the db. + data_schema_v1 = { + "type": "object", + "properties": { + "raw_kobo_store_token": {"type": "string"}, + "books_last_modified": {"type": "string"}, + "books_last_created": {"type": "string"}, + }, + } + + def __init__( + self, + raw_kobo_store_token="", + books_last_created=datetime.min, + books_last_modified=datetime.min, + ): + self.raw_kobo_store_token = raw_kobo_store_token + self.books_last_created = books_last_created + self.books_last_modified = books_last_modified + + @staticmethod + def from_headers(headers): + sync_token_header = headers.get(SyncToken.SYNC_TOKEN_HEADER, "") + if sync_token_header == "": + return SyncToken() + + # On the first sync from a Kobo device, we may receive the SyncToken + # from the official Kobo store. Without digging too deep into it, that + # token is of the form [b64encoded blob].[b64encoded blob 2] + if "." in sync_token_header: + return SyncToken(raw_kobo_store_token=sync_token_header) + + try: + sync_token_json = json.loads( + b64decode(sync_token_header + "=" * (-len(sync_token_header) % 4)) + ) + validate(sync_token_json, SyncToken.token_schema) + if sync_token_json["version"] < SyncToken.MIN_VERSION: + raise ValueError + + data_json = sync_token_json["data"] + validate(sync_token_json, SyncToken.data_schema_v1) + except (exceptions.ValidationError, ValueError): + log.error("Sync token contents do not follow the expected json schema.") + return SyncToken() + + raw_kobo_store_token = data_json["raw_kobo_store_token"] + try: + books_last_modified = datetime.utcfromtimestamp( + data_json["books_last_modified"] + ) + books_last_created = datetime.utcfromtimestamp( + data_json["books_last_created"] + ) + except TypeError: + log.error("SyncToken timestamps don't parse to a datetime.") + return SyncToken(raw_kobo_store_token=raw_kobo_store_token) + + return SyncToken( + raw_kobo_store_token=raw_kobo_store_token, + books_last_created=books_last_created, + books_last_modified=books_last_modified, + ) + + def set_kobo_store_header(self, store_headers): + store_headers.set(SyncToken.SYNC_TOKEN_HEADER, self.raw_kobo_store_token) + + def merge_from_store_response(self, store_response): + self.raw_kobo_store_token = store_response.headers.get( + SyncToken.SYNC_TOKEN_HEADER, "" + ) + + def to_headers(self, headers): + headers[SyncToken.SYNC_TOKEN_HEADER] = self.build_sync_token() + + def build_sync_token(self): + token = { + "version": SyncToken.VERSION, + "data": { + "raw_kobo_store_token": self.raw_kobo_store_token, + "books_last_modified": to_epoch_timestamp(self.books_last_modified), + "books_last_created": to_epoch_timestamp(self.books_last_created), + }, + } + return b64encode_json(token) diff --git a/cps/services/__init__.py b/cps/services/__init__.py index d468d0b7..2eb82f0d 100644 --- a/cps/services/__init__.py +++ b/cps/services/__init__.py @@ -35,4 +35,10 @@ except ImportError as err: log.debug("cannot import simpleldap, logging in with ldap will not work: %s", err) ldap = None - +try: + from . import SyncToken as SyncToken + kobo = True +except ImportError as err: + log.debug("cannot import SyncToken, syncing books with Kobo Devices will not work: %s", err) + kobo = None + SyncToken = None diff --git a/cps/shelf.py b/cps/shelf.py index 1d24c4f1..afee1eaa 100644 --- a/cps/shelf.py +++ b/cps/shelf.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- # This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) @@ -40,17 +39,18 @@ log = logger.create() @shelf.route("/shelf/add//") @login_required def add_to_shelf(shelf_id, book_id): + xhr = request.headers.get('X-Requested-With') == 'XMLHttpRequest' shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.id == shelf_id).first() if shelf is None: log.error("Invalid shelf specified: %s", shelf_id) - if not request.is_xhr: + if not xhr: flash(_(u"Invalid shelf specified"), category="error") return redirect(url_for('web.index')) return "Invalid shelf specified", 400 if not shelf.is_public and not shelf.user_id == int(current_user.id): log.error("User %s not allowed to add a book to %s", current_user, shelf) - if not request.is_xhr: + if not xhr: flash(_(u"Sorry you are not allowed to add a book to the the shelf: %(shelfname)s", shelfname=shelf.name), category="error") return redirect(url_for('web.index')) @@ -58,7 +58,7 @@ def add_to_shelf(shelf_id, book_id): if shelf.is_public and not current_user.role_edit_shelfs(): log.info("User %s not allowed to edit public shelves", current_user) - if not request.is_xhr: + if not xhr: flash(_(u"You are not allowed to edit public shelves"), category="error") return redirect(url_for('web.index')) return "User is not allowed to edit public shelves", 403 @@ -67,7 +67,7 @@ def add_to_shelf(shelf_id, book_id): ub.BookShelf.book_id == book_id).first() if book_in_shelf: log.error("Book %s is already part of %s", book_id, shelf) - if not request.is_xhr: + if not xhr: flash(_(u"Book is already part of the shelf: %(shelfname)s", shelfname=shelf.name), category="error") return redirect(url_for('web.index')) return "Book is already part of the shelf: %s" % shelf.name, 400 @@ -81,7 +81,7 @@ def add_to_shelf(shelf_id, book_id): ins = ub.BookShelf(shelf=shelf.id, book_id=book_id, order=maxOrder + 1) ub.session.add(ins) ub.session.commit() - if not request.is_xhr: + if not xhr: flash(_(u"Book has been added to shelf: %(sname)s", sname=shelf.name), category="success") if "HTTP_REFERER" in request.environ: return redirect(request.environ["HTTP_REFERER"]) @@ -147,10 +147,11 @@ def search_to_shelf(shelf_id): @shelf.route("/shelf/remove//") @login_required def remove_from_shelf(shelf_id, book_id): + xhr = request.headers.get('X-Requested-With') == 'XMLHttpRequest' shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.id == shelf_id).first() if shelf is None: log.error("Invalid shelf specified: %s", shelf_id) - if not request.is_xhr: + if not xhr: return redirect(url_for('web.index')) return "Invalid shelf specified", 400 @@ -169,20 +170,23 @@ def remove_from_shelf(shelf_id, book_id): if book_shelf is None: log.error("Book %s already removed from %s", book_id, shelf) - if not request.is_xhr: + if not xhr: return redirect(url_for('web.index')) return "Book already removed from shelf", 410 ub.session.delete(book_shelf) ub.session.commit() - if not request.is_xhr: + if not xhr: flash(_(u"Book has been removed from shelf: %(sname)s", sname=shelf.name), category="success") - return redirect(request.environ["HTTP_REFERER"]) + if "HTTP_REFERER" in request.environ: + return redirect(request.environ["HTTP_REFERER"]) + else: + return redirect(url_for('web.index')) return "", 204 else: log.error("User %s not allowed to remove a book from %s", current_user, shelf) - if not request.is_xhr: + if not xhr: flash(_(u"Sorry you are not allowed to remove a book from this shelf: %(sname)s", sname=shelf.name), category="error") return redirect(url_for('web.index')) @@ -284,8 +288,16 @@ def show_shelf(shelf_type, shelf_id): books_in_shelf = ub.session.query(ub.BookShelf).filter(ub.BookShelf.shelf == shelf_id)\ .order_by(ub.BookShelf.order.asc()).all() - books_list = [ b.book_id for b in books_in_shelf] - result = db.session.query(db.Books).filter(db.Books.id.in_(books_list)).filter(common_filters()).all() + for book in books_in_shelf: + cur_book = db.session.query(db.Books).filter(db.Books.id == book.book_id).filter(common_filters()).first() + if cur_book: + result.append(cur_book) + else: + cur_book = db.session.query(db.Books).filter(db.Books.id == book.book_id).first() + if not cur_book: + log.info('Not existing book %s in %s deleted', book.book_id, shelf) + ub.session.query(ub.BookShelf).filter(ub.BookShelf.book_id == book.book_id).delete() + ub.session.commit() return render_title_template(page, entries=result, title=_(u"Shelf: '%(name)s'", name=shelf.name), shelf=shelf, page="shelf") else: @@ -317,8 +329,20 @@ def order_shelf(shelf_id): if shelf: books_in_shelf2 = ub.session.query(ub.BookShelf).filter(ub.BookShelf.shelf == shelf_id) \ .order_by(ub.BookShelf.order.asc()).all() - books_list = [ b.book_id for b in books_in_shelf2] - result = db.session.query(db.Books).filter(db.Books.id.in_(books_list)).filter(common_filters()).all() + for book in books_in_shelf2: + cur_book = db.session.query(db.Books).filter(db.Books.id == book.book_id).filter(common_filters()).first() + if cur_book: + result.append({'title':cur_book.title, + 'id':cur_book.id, + 'author':cur_book.authors, + 'series':cur_book.series, + 'series_index':cur_book.series_index}) + else: + cur_book = db.session.query(db.Books).filter(db.Books.id == book.book_id).first() + result.append({'title':_('Hidden Book'), + 'id':cur_book.id, + 'author':[], + 'series':[]}) return render_title_template('shelf_order.html', entries=result, title=_(u"Change order of Shelf: '%(name)s'", name=shelf.name), shelf=shelf, page="shelforder") diff --git a/cps/static/css/libs/viewer.css b/cps/static/css/libs/viewer.css index 82766d66..5835b309 100644 --- a/cps/static/css/libs/viewer.css +++ b/cps/static/css/libs/viewer.css @@ -230,36 +230,46 @@ z-index: 200; max-width: 20em; background-color: #FFFF99; - box-shadow: 0px 2px 5px #333; + box-shadow: 0px 2px 5px #888; border-radius: 2px; - padding: 0.6em; + padding: 6px; margin-left: 5px; cursor: pointer; font: message-box; + font-size: 9px; word-wrap: break-word; } +.annotationLayer .popup > * { + font-size: 9px; +} + .annotationLayer .popup h1 { - font-size: 1em; - border-bottom: 1px solid #000000; - margin: 0; - padding-bottom: 0.2em; + display: inline-block; +} + +.annotationLayer .popup span { + display: inline-block; + margin-left: 5px; } .annotationLayer .popup p { - margin: 0; - padding-top: 0.2em; + border-top: 1px solid #333; + margin-top: 2px; + padding-top: 2px; } .annotationLayer .highlightAnnotation, .annotationLayer .underlineAnnotation, .annotationLayer .squigglyAnnotation, .annotationLayer .strikeoutAnnotation, +.annotationLayer .freeTextAnnotation, .annotationLayer .lineAnnotation svg line, .annotationLayer .squareAnnotation svg rect, .annotationLayer .circleAnnotation svg ellipse, .annotationLayer .polylineAnnotation svg polyline, .annotationLayer .polygonAnnotation svg polygon, +.annotationLayer .caretAnnotation, .annotationLayer .inkAnnotation svg polyline, .annotationLayer .stampAnnotation, .annotationLayer .fileAttachmentAnnotation { @@ -279,8 +289,9 @@ overflow: visible; border: 9px solid transparent; background-clip: content-box; - -o-border-image: url(images/shadow.png) 9 9 repeat; - border-image: url(images/shadow.png) 9 9 repeat; + -webkit-border-image: url(images/shadow.png) 9 9 repeat; + -o-border-image: url(images/shadow.png) 9 9 repeat; + border-image: url(images/shadow.png) 9 9 repeat; background-color: white; } @@ -543,15 +554,20 @@ select { z-index: 100; border-top: 1px solid #333; - transition-duration: 200ms; - transition-timing-function: ease; + -webkit-transition-duration: 200ms; + + transition-duration: 200ms; + -webkit-transition-timing-function: ease; + transition-timing-function: ease; } html[dir='ltr'] #sidebarContainer { + -webkit-transition-property: left; transition-property: left; left: -200px; left: calc(-1 * var(--sidebar-width)); } html[dir='rtl'] #sidebarContainer { + -webkit-transition-property: right; transition-property: right; right: -200px; right: calc(-1 * var(--sidebar-width)); @@ -563,7 +579,8 @@ html[dir='rtl'] #sidebarContainer { #outerContainer.sidebarResizing #sidebarContainer { /* Improve responsiveness and avoid visual glitches when the sidebar is resized. */ - transition-duration: 0s; + -webkit-transition-duration: 0s; + transition-duration: 0s; /* Prevent e.g. the thumbnails being selected when the sidebar is resized. */ -webkit-user-select: none; -moz-user-select: none; @@ -620,8 +637,10 @@ html[dir='rtl'] #sidebarContent { outline: none; } #viewerContainer:not(.pdfPresentationMode) { - transition-duration: 200ms; - transition-timing-function: ease; + -webkit-transition-duration: 200ms; + transition-duration: 200ms; + -webkit-transition-timing-function: ease; + transition-timing-function: ease; } html[dir='ltr'] #viewerContainer { box-shadow: inset 1px 0 0 hsla(0,0%,100%,.05); @@ -632,15 +651,18 @@ html[dir='rtl'] #viewerContainer { #outerContainer.sidebarResizing #viewerContainer { /* Improve responsiveness and avoid visual glitches when the sidebar is resized. */ - transition-duration: 0s; + -webkit-transition-duration: 0s; + transition-duration: 0s; } html[dir='ltr'] #outerContainer.sidebarOpen #viewerContainer:not(.pdfPresentationMode) { + -webkit-transition-property: left; transition-property: left; left: 200px; left: var(--sidebar-width); } html[dir='rtl'] #outerContainer.sidebarOpen #viewerContainer:not(.pdfPresentationMode) { + -webkit-transition-property: right; transition-property: right; right: 200px; right: var(--sidebar-width); @@ -662,6 +684,8 @@ html[dir='rtl'] #outerContainer.sidebarOpen #viewerContainer:not(.pdfPresentatio width: 100%; height: 32px; background-color: #424242; /* fallback */ + background-image: url(images/texture.png), + -webkit-gradient(linear, left top, left bottom, from(hsla(0,0%,30%,.99)), to(hsla(0,0%,25%,.95))); background-image: url(images/texture.png), linear-gradient(hsla(0,0%,30%,.99), hsla(0,0%,25%,.95)); } @@ -697,6 +721,8 @@ html[dir='rtl'] #sidebarResizer { position: relative; height: 32px; background-color: #474747; /* fallback */ + background-image: url(images/texture.png), + -webkit-gradient(linear, left top, left bottom, from(hsla(0,0%,32%,.99)), to(hsla(0,0%,27%,.95))); background-image: url(images/texture.png), linear-gradient(hsla(0,0%,32%,.99), hsla(0,0%,27%,.95)); } @@ -733,6 +759,7 @@ html[dir='rtl'] #toolbarContainer, .findbar, .secondaryToolbar { height: 100%; background-color: #ddd; overflow: hidden; + -webkit-transition: width 200ms; transition: width 200ms; } @@ -748,6 +775,7 @@ html[dir='rtl'] #toolbarContainer, .findbar, .secondaryToolbar { #loadingBar .progress.indeterminate { background-color: #999; + -webkit-transition: none; transition: none; } @@ -815,6 +843,9 @@ html[dir='rtl'] .findbar { #findInput::-webkit-input-placeholder { color: hsl(0, 0%, 75%); } +#findInput::-moz-placeholder { + font-style: italic; +} #findInput:-ms-input-placeholder { font-style: italic; } @@ -1006,6 +1037,7 @@ html[dir='rtl'] .splitToolbarButton > .toolbarButton { .splitToolbarButton.toggled > .toolbarButton, .toolbarButton.textButton { background-color: hsla(0,0%,0%,.12); + background-image: -webkit-gradient(linear, left top, left bottom, from(hsla(0,0%,100%,.05)), to(hsla(0,0%,100%,0))); background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); background-clip: padding-box; border: 1px solid hsla(0,0%,0%,.35); @@ -1013,9 +1045,12 @@ html[dir='rtl'] .splitToolbarButton > .toolbarButton { box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset, 0 0 1px hsla(0,0%,100%,.15) inset, 0 1px 0 hsla(0,0%,100%,.05); + -webkit-transition-property: background-color, border-color, box-shadow; transition-property: background-color, border-color, box-shadow; - transition-duration: 150ms; - transition-timing-function: ease; + -webkit-transition-duration: 150ms; + transition-duration: 150ms; + -webkit-transition-timing-function: ease; + transition-timing-function: ease; } .splitToolbarButton > .toolbarButton:hover, @@ -1072,9 +1107,12 @@ html[dir='rtl'] .splitToolbarButtonSeparator { padding: 12px 0; margin: 1px 0; box-shadow: 0 0 0 1px hsla(0,0%,100%,.03); + -webkit-transition-property: padding; transition-property: padding; - transition-duration: 10ms; - transition-timing-function: ease; + -webkit-transition-duration: 10ms; + transition-duration: 10ms; + -webkit-transition-timing-function: ease; + transition-timing-function: ease; } .toolbarButton, @@ -1094,9 +1132,12 @@ html[dir='rtl'] .splitToolbarButtonSeparator { user-select: none; /* Opera does not support user-select, use <... unselectable="on"> instead */ cursor: default; + -webkit-transition-property: background-color, border-color, box-shadow; transition-property: background-color, border-color, box-shadow; - transition-duration: 150ms; - transition-timing-function: ease; + -webkit-transition-duration: 150ms; + transition-duration: 150ms; + -webkit-transition-timing-function: ease; + transition-timing-function: ease; } html[dir='ltr'] .toolbarButton, @@ -1117,6 +1158,7 @@ html[dir='rtl'] .dropdownToolbarButton { .secondaryToolbarButton:hover, .secondaryToolbarButton:focus { background-color: hsla(0,0%,0%,.12); + background-image: -webkit-gradient(linear, left top, left bottom, from(hsla(0,0%,100%,.05)), to(hsla(0,0%,100%,0))); background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); background-clip: padding-box; border: 1px solid hsla(0,0%,0%,.35); @@ -1131,28 +1173,36 @@ html[dir='rtl'] .dropdownToolbarButton { .dropdownToolbarButton:hover:active, .secondaryToolbarButton:hover:active { background-color: hsla(0,0%,0%,.2); + background-image: -webkit-gradient(linear, left top, left bottom, from(hsla(0,0%,100%,.05)), to(hsla(0,0%,100%,0))); background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); border-color: hsla(0,0%,0%,.35) hsla(0,0%,0%,.4) hsla(0,0%,0%,.45); box-shadow: 0 1px 1px hsla(0,0%,0%,.1) inset, 0 0 1px hsla(0,0%,0%,.2) inset, 0 1px 0 hsla(0,0%,100%,.05); + -webkit-transition-property: background-color, border-color, box-shadow; transition-property: background-color, border-color, box-shadow; - transition-duration: 10ms; - transition-timing-function: linear; + -webkit-transition-duration: 10ms; + transition-duration: 10ms; + -webkit-transition-timing-function: linear; + transition-timing-function: linear; } .toolbarButton.toggled, .splitToolbarButton.toggled > .toolbarButton.toggled, .secondaryToolbarButton.toggled { background-color: hsla(0,0%,0%,.3); + background-image: -webkit-gradient(linear, left top, left bottom, from(hsla(0,0%,100%,.05)), to(hsla(0,0%,100%,0))); background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.45) hsla(0,0%,0%,.5); box-shadow: 0 1px 1px hsla(0,0%,0%,.1) inset, 0 0 1px hsla(0,0%,0%,.2) inset, 0 1px 0 hsla(0,0%,100%,.05); + -webkit-transition-property: background-color, border-color, box-shadow; transition-property: background-color, border-color, box-shadow; - transition-duration: 10ms; - transition-timing-function: linear; + -webkit-transition-duration: 10ms; + transition-duration: 10ms; + -webkit-transition-timing-function: linear; + transition-timing-function: linear; } .toolbarButton.toggled:hover:active, @@ -1493,6 +1543,7 @@ html[dir='rtl'] .verticalToolbarSeparator { border: 1px solid transparent; border-radius: 2px; background-color: hsla(0,0%,100%,.09); + background-image: -webkit-gradient(linear, left top, left bottom, from(hsla(0,0%,100%,.05)), to(hsla(0,0%,100%,0))); background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); background-clip: padding-box; border: 1px solid hsla(0,0%,0%,.35); @@ -1503,9 +1554,12 @@ html[dir='rtl'] .verticalToolbarSeparator { font-size: 12px; line-height: 14px; outline-style: none; + -webkit-transition-property: background-color, border-color, box-shadow; transition-property: background-color, border-color, box-shadow; - transition-duration: 150ms; - transition-timing-function: ease; + -webkit-transition-duration: 150ms; + transition-duration: 150ms; + -webkit-transition-timing-function: ease; + transition-timing-function: ease; } .toolbarField[type=checkbox] { @@ -1619,6 +1673,7 @@ a:focus > .thumbnail > .thumbnailSelectionRing > .thumbnailImage, a:focus > .thumbnail > .thumbnailSelectionRing, .thumbnail:hover > .thumbnailSelectionRing { background-color: hsla(0,0%,100%,.15); + background-image: -webkit-gradient(linear, left top, left bottom, from(hsla(0,0%,100%,.05)), to(hsla(0,0%,100%,0))); background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); background-clip: padding-box; box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset, @@ -1634,6 +1689,7 @@ a:focus > .thumbnail > .thumbnailSelectionRing, .thumbnail.selected > .thumbnailSelectionRing { background-color: hsla(0,0%,100%,.3); + background-image: -webkit-gradient(linear, left top, left bottom, from(hsla(0,0%,100%,.05)), to(hsla(0,0%,100%,0))); background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); background-clip: padding-box; box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset, @@ -1755,6 +1811,7 @@ html[dir='rtl'] .outlineItemToggler::before { .outlineItem > a:hover, .attachmentsItem > button:hover { background-color: hsla(0,0%,100%,.02); + background-image: -webkit-gradient(linear, left top, left bottom, from(hsla(0,0%,100%,.05)), to(hsla(0,0%,100%,0))); background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); background-clip: padding-box; box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset, @@ -1766,6 +1823,7 @@ html[dir='rtl'] .outlineItemToggler::before { .outlineItem.selected { background-color: hsla(0,0%,100%,.08); + background-image: -webkit-gradient(linear, left top, left bottom, from(hsla(0,0%,100%,.05)), to(hsla(0,0%,100%,0))); background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); background-clip: padding-box; box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset, @@ -1850,6 +1908,8 @@ html[dir='rtl'] .outlineItemToggler::before { font-size: 12px; line-height: 14px; background-color: #474747; /* fallback */ + background-image: url(images/texture.png), + -webkit-gradient(linear, left top, left bottom, from(hsla(0,0%,32%,.99)), to(hsla(0,0%,27%,.95))); background-image: url(images/texture.png), linear-gradient(hsla(0,0%,32%,.99), hsla(0,0%,27%,.95)); box-shadow: inset 1px 0 0 hsla(0,0%,100%,.08), diff --git a/cps/static/css/style.css b/cps/static/css/style.css index da088021..0850e10a 100644 --- a/cps/static/css/style.css +++ b/cps/static/css/style.css @@ -26,7 +26,7 @@ html.http-error { body{background:#f2f2f2}body h2{font-weight:normal;color:#444} body { margin-bottom: 40px;} -a{color: #45b29d}a:hover{color: #444;} +a{color: #45b29d} /*a:hover{color: #444;}*/ .navigation .nav-head{text-transform:uppercase;color:#999;margin:20px 0}.navigation .nav-head:nth-child(1n+2){border-top:1px solid #ccc;padding-top:20px} .navigation li a{color:#444;text-decoration:none;display:block;padding:10px}.navigation li a:hover{background:rgba(153,153,153,0.4);border-radius:5px} .navigation li a span{margin-right:10px} @@ -65,6 +65,10 @@ span.glyphicon.glyphicon-tags {padding-right: 5px;color: #999;vertical-align: te .navbar-default .navbar-toggle {border-color: #000;} .cover { margin-bottom: 10px;} .cover-height { max-height: 100px;} +.col-sm-2 a .cover-small { + margin:5px; + max-height: 200px; +} .btn-file {position: relative; overflow: hidden;} .btn-file input[type=file] {position: absolute; top: 0; right: 0; min-width: 100%; min-height: 100%; font-size: 100px; text-align: right; filter: alpha(opacity=0); opacity: 0; outline: none; background: white; cursor: inherit; display: block;} @@ -78,6 +82,12 @@ span.glyphicon.glyphicon-tags {padding-right: 5px;color: #999;vertical-align: te .spinner {margin:0 41%;} .spinner2 {margin:0 41%;} +table .bg-dark-danger {background-color: #d9534f; color: #fff;} +table .bg-dark-danger a {color: #fff;} +table .bg-dark-danger:hover {background-color: #c9302c;} +table .bg-primary:hover {background-color: #1C5484;} +table .bg-primary a {color: #fff;} + .block-label {display: block;} .fake-input {position: absolute; pointer-events: none; top: 0;} diff --git a/cps/static/js/archive/archive.js b/cps/static/js/archive/archive.js index 13e1d183..cb76321f 100644 --- a/cps/static/js/archive/archive.js +++ b/cps/static/js/archive/archive.js @@ -40,7 +40,8 @@ function alphanumCase(a, b) { while (i = (j = t.charAt(x++)).charCodeAt(0)) { var m = (i === 46 || (i >= 48 && i <= 57)); - if (m !== n) { + // Compare has to be with != otherwise fails + if (m != n) { tz[++y] = ""; n = m; } @@ -55,7 +56,8 @@ function alphanumCase(a, b) { for (var x = 0; aa[x] && bb[x]; x++) { if (aa[x] !== bb[x]) { var c = Number(aa[x]), d = Number(bb[x]); - if (c === aa[x] && d === bb[x]) { + // Compare has to be with == otherwise fails + if (c == aa[x] && d == bb[x]) { return c - d; } else { return (aa[x] > bb[x]) ? 1 : -1; diff --git a/cps/static/js/caliBlur.js b/cps/static/js/caliBlur.js index 53f033ba..1bd5f69c 100644 --- a/cps/static/js/caliBlur.js +++ b/cps/static/js/caliBlur.js @@ -159,10 +159,12 @@ if ( $( 'body.book' ).length > 0 ) { real_custom_column = $( '.real_custom_columns' ); // $( '.real_custom_columns' ).remove(); $.each(real_custom_column, function(i, val) { - real_cc = $(this).text().split( ':' ); + var split = $(this).text().split( ':' ); + real_cc_key = split.shift(); + real_cc_value = split.join(':'); $( this ).text(""); - if (real_cc.length > 1) { - $( this ).append( '' + real_cc[0] + '' + real_cc[1] + '' ); + if (real_cc_value != "") { + $( this ).append( '' + real_cc_key + '' + real_cc_value + '' ); } }); //$( '.real_custom_columns:nth-child(3)' ).text(function() { diff --git a/cps/static/js/get_meta.js b/cps/static/js/get_meta.js index a453b092..e10b83ed 100644 --- a/cps/static/js/get_meta.js +++ b/cps/static/js/get_meta.js @@ -15,13 +15,15 @@ * along with this program. If not, see . */ /* - * Get Metadata from Douban Books api and Google Books api + * Get Metadata from Douban Books api and Google Books api and ComicVine * Google Books api document: https://developers.google.com/books/docs/v1/using * Douban Books api document: https://developers.douban.com/wiki/?title=book_v2 (Chinese Only) + * ComicVine api document: https://comicvine.gamespot.com/api/documentation */ -/* global _, i18nMsg, tinymce */ +/* global _, i18nMsg, tinymce */ var dbResults = []; var ggResults = []; +var cvResults = []; $(function () { var msg = i18nMsg; @@ -33,6 +35,10 @@ $(function () { var ggSearch = "/books/v1/volumes"; var ggDone = false; + var comicvine = "https://comicvine.gamespot.com"; + var cvSearch = "/api/search/"; + var cvDone = false; + var showFlag = 0; var templates = { @@ -48,16 +54,17 @@ $(function () { if ($.inArray(el, uniqueTags) === -1) uniqueTags.push(el); }); - $("#bookAuthor").val(book.authors); + var ampSeparatedAuthors = (book.authors || []).join(" & "); + $("#bookAuthor").val(ampSeparatedAuthors); $("#book_title").val(book.title); $("#tags").val(uniqueTags.join(",")); $("#rating").data("rating").setValue(Math.round(book.rating)); $(".cover img").attr("src", book.cover); $("#cover_url").val(book.cover); $("#pubdate").val(book.publishedDate); - $("#publisher").val(book.publisher) - if (book.series != undefined) { - $("#series").val(book.series) + $("#publisher").val(book.publisher); + if (typeof book.series !== "undefined") { + $("#series").val(book.series); } } @@ -72,16 +79,18 @@ $(function () { } function formatDate (date) { var d = new Date(date), - month = '' + (d.getMonth() + 1), - day = '' + d.getDate(), + month = "" + (d.getMonth() + 1), + day = "" + d.getDate(), year = d.getFullYear(); - - if (month.length < 2) - month = '0' + month; - if (day.length < 2) - day = '0' + day; - - return [year, month, day].join('-'); + + if (month.length < 2) { + month = "0" + month; + } + if (day.length < 2) { + day = "0" + day; + } + + return [year, month, day].join("-"); } if (ggDone && ggResults.length > 0) { @@ -116,16 +125,17 @@ $(function () { } if (dbDone && dbResults.length > 0) { dbResults.forEach(function(result) { - if (result.series){ - var series_title = result.series.title + var seriesTitle = ""; + if (result.series) { + seriesTitle = result.series.title; } - var date_fomers = result.pubdate.split("-") - var publishedYear = parseInt(date_fomers[0]) - var publishedMonth = parseInt(date_fomers[1]) - var publishedDate = new Date(publishedYear, publishedMonth-1, 1) + var dateFomers = result.pubdate.split("-"); + var publishedYear = parseInt(dateFomers[0]); + var publishedMonth = parseInt(dateFomers[1]); + var publishedDate = new Date(publishedYear, publishedMonth - 1, 1); + + publishedDate = formatDate(publishedDate); - publishedDate = formatDate(publishedDate) - var book = { id: result.id, title: result.title, @@ -137,7 +147,7 @@ $(function () { return tag.title.toLowerCase().replace(/,/g, "_"); }), rating: result.rating.average || 0, - series: series_title || "", + series: seriesTitle || "", cover: result.image, url: "https://book.douban.com/subject/" + result.id, source: { @@ -160,6 +170,52 @@ $(function () { }); dbDone = false; } + if (cvDone && cvResults.length > 0) { + cvResults.forEach(function(result) { + var seriesTitle = ""; + if (result.volume.name) { + seriesTitle = result.volume.name; + } + var dateFomers = ""; + if (result.store_date) { + dateFomers = result.store_date.split("-"); + }else{ + dateFomers = result.date_added.split("-"); + } + var publishedYear = parseInt(dateFomers[0]); + var publishedMonth = parseInt(dateFomers[1]); + var publishedDate = new Date(publishedYear, publishedMonth - 1, 1); + + publishedDate = formatDate(publishedDate); + + var book = { + id: result.id, + title: seriesTitle + ' #' +('00' + result.issue_number).slice(-3) + ' - ' + result.name, + authors: result.author || [], + description: result.description, + publisher: "", + publishedDate: publishedDate || "", + tags: ['Comics', seriesTitle], + rating: 0, + series: seriesTitle || "", + cover: result.image.original_url, + url: result.site_detail_url, + source: { + id: "comicvine", + description: "ComicVine Books", + url: "https://comicvine.gamespot.com/" + } + }; + + var $book = $(templates.bookResult(book)); + $book.find("img").on("click", function () { + populateForm(book); + }); + + $("#book-list").append($book); + }); + cvDone = false; + } } function ggSearchBook (title) { @@ -183,7 +239,7 @@ $(function () { } function dbSearchBook (title) { - apikey="0df993c66c0c636e29ecbb5344252a4a" + var apikey = "0df993c66c0c636e29ecbb5344252a4a"; $.ajax({ url: douban + dbSearch + "?apikey=" + apikey + "&q=" + title + "&fields=all&count=10", type: "GET", @@ -193,7 +249,7 @@ $(function () { dbResults = data.books; }, error: function error() { - $("#meta-info").html("

" + msg.search_error + "!

"+ $("#meta-info")[0].innerHTML) + $("#meta-info").html("

" + msg.search_error + "!

" + $("#meta-info")[0].innerHTML); }, complete: function complete() { dbDone = true; @@ -203,12 +259,35 @@ $(function () { }); } + function cvSearchBook (title) { + var apikey = "57558043c53943d5d1e96a9ad425b0eb85532ee6"; + title = encodeURIComponent(title); + $.ajax({ + url: comicvine + cvSearch + "?api_key=" + apikey + "&resources=issue&query=" + title + "&sort=name:desc&format=jsonp", + type: "GET", + dataType: "jsonp", + jsonp: "json_callback", + success: function success(data) { + cvResults = data.results; + }, + error: function error() { + $("#meta-info").html("

" + msg.search_error + "!

" + $("#meta-info")[0].innerHTML); + }, + complete: function complete() { + cvDone = true; + showResult(); + $("#show-comics").trigger("change"); + } + }); + } + function doSearch (keyword) { showFlag = 0; $("#meta-info").text(msg.loading); if (keyword) { dbSearchBook(keyword); ggSearchBook(keyword); + cvSearchBook(keyword); } } diff --git a/cps/static/js/libs/Sortable.min.js b/cps/static/js/libs/Sortable.min.js index e95d2a30..eba06149 100644 --- a/cps/static/js/libs/Sortable.min.js +++ b/cps/static/js/libs/Sortable.min.js @@ -1,2 +1,2 @@ -/*! Sortable 1.4.2 - MIT | git://github.com/rubaxa/Sortable.git */ -!function(a){"use strict";"function"==typeof define&&define.amd?define(a):"undefined"!=typeof module&&"undefined"!=typeof module.exports?module.exports=a():"undefined"!=typeof Package?Sortable=a():window.Sortable=a()}(function(){"use strict";function a(a,b){if(!a||!a.nodeType||1!==a.nodeType)throw"Sortable: `el` must be HTMLElement, and not "+{}.toString.call(a);this.el=a,this.options=b=r({},b),a[L]=this;var c={group:Math.random(),sort:!0,disabled:!1,store:null,handle:null,scroll:!0,scrollSensitivity:30,scrollSpeed:10,draggable:/[uo]l/i.test(a.nodeName)?"li":">*",ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",ignore:"a, img",filter:null,animation:0,setData:function(a,b){a.setData("Text",b.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1};for(var d in c)!(d in b)&&(b[d]=c[d]);V(b);for(var f in this)"_"===f.charAt(0)&&(this[f]=this[f].bind(this));this.nativeDraggable=b.forceFallback?!1:P,e(a,"mousedown",this._onTapStart),e(a,"touchstart",this._onTapStart),this.nativeDraggable&&(e(a,"dragover",this),e(a,"dragenter",this)),T.push(this._onDragOver),b.store&&this.sort(b.store.get(this))}function b(a){v&&v.state!==a&&(h(v,"display",a?"none":""),!a&&v.state&&w.insertBefore(v,s),v.state=a)}function c(a,b,c){if(a){c=c||N,b=b.split(".");var d=b.shift().toUpperCase(),e=new RegExp("\\s("+b.join("|")+")(?=\\s)","g");do if(">*"===d&&a.parentNode===c||(""===d||a.nodeName.toUpperCase()==d)&&(!b.length||((" "+a.className+" ").match(e)||[]).length==b.length))return a;while(a!==c&&(a=a.parentNode))}return null}function d(a){a.dataTransfer&&(a.dataTransfer.dropEffect="move"),a.preventDefault()}function e(a,b,c){a.addEventListener(b,c,!1)}function f(a,b,c){a.removeEventListener(b,c,!1)}function g(a,b,c){if(a)if(a.classList)a.classList[c?"add":"remove"](b);else{var d=(" "+a.className+" ").replace(K," ").replace(" "+b+" "," ");a.className=(d+(c?" "+b:"")).replace(K," ")}}function h(a,b,c){var d=a&&a.style;if(d){if(void 0===c)return N.defaultView&&N.defaultView.getComputedStyle?c=N.defaultView.getComputedStyle(a,""):a.currentStyle&&(c=a.currentStyle),void 0===b?c:c[b];b in d||(b="-webkit-"+b),d[b]=c+("string"==typeof c?"":"px")}}function i(a,b,c){if(a){var d=a.getElementsByTagName(b),e=0,f=d.length;if(c)for(;f>e;e++)c(d[e],e);return d}return[]}function j(a,b,c,d,e,f,g){var h=N.createEvent("Event"),i=(a||b[L]).options,j="on"+c.charAt(0).toUpperCase()+c.substr(1);h.initEvent(c,!0,!0),h.to=b,h.from=e||b,h.item=d||b,h.clone=v,h.oldIndex=f,h.newIndex=g,b.dispatchEvent(h),i[j]&&i[j].call(a,h)}function k(a,b,c,d,e,f){var g,h,i=a[L],j=i.options.onMove;return g=N.createEvent("Event"),g.initEvent("move",!0,!0),g.to=b,g.from=a,g.dragged=c,g.draggedRect=d,g.related=e||b,g.relatedRect=f||b.getBoundingClientRect(),a.dispatchEvent(g),j&&(h=j.call(i,g)),h}function l(a){a.draggable=!1}function m(){R=!1}function n(a,b){var c=a.lastElementChild,d=c.getBoundingClientRect();return(b.clientY-(d.top+d.height)>5||b.clientX-(d.right+d.width)>5)&&c}function o(a){for(var b=a.tagName+a.className+a.src+a.href+a.textContent,c=b.length,d=0;c--;)d+=b.charCodeAt(c);return d.toString(36)}function p(a){var b=0;if(!a||!a.parentNode)return-1;for(;a&&(a=a.previousElementSibling);)"TEMPLATE"!==a.nodeName.toUpperCase()&&b++;return b}function q(a,b){var c,d;return function(){void 0===c&&(c=arguments,d=this,setTimeout(function(){1===c.length?a.call(d,c[0]):a.apply(d,c),c=void 0},b))}}function r(a,b){if(a&&b)for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a}var s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J={},K=/\s+/g,L="Sortable"+(new Date).getTime(),M=window,N=M.document,O=M.parseInt,P=!!("draggable"in N.createElement("div")),Q=function(a){return a=N.createElement("x"),a.style.cssText="pointer-events:auto","auto"===a.style.pointerEvents}(),R=!1,S=Math.abs,T=([].slice,[]),U=q(function(a,b,c){if(c&&b.scroll){var d,e,f,g,h=b.scrollSensitivity,i=b.scrollSpeed,j=a.clientX,k=a.clientY,l=window.innerWidth,m=window.innerHeight;if(z!==c&&(y=b.scroll,z=c,y===!0)){y=c;do if(y.offsetWidth=l-j)-(h>=j),g=(h>=m-k)-(h>=k),(f||g)&&(d=M)),(J.vx!==f||J.vy!==g||J.el!==d)&&(J.el=d,J.vx=f,J.vy=g,clearInterval(J.pid),d&&(J.pid=setInterval(function(){d===M?M.scrollTo(M.pageXOffset+f*i,M.pageYOffset+g*i):(g&&(d.scrollTop+=g*i),f&&(d.scrollLeft+=f*i))},24)))}},30),V=function(a){var b=a.group;b&&"object"==typeof b||(b=a.group={name:b}),["pull","put"].forEach(function(a){a in b||(b[a]=!0)}),a.groups=" "+b.name+(b.put.join?" "+b.put.join(" "):"")+" "};return a.prototype={constructor:a,_onTapStart:function(a){var b=this,d=this.el,e=this.options,f=a.type,g=a.touches&&a.touches[0],h=(g||a).target,i=h,k=e.filter;if(!("mousedown"===f&&0!==a.button||e.disabled)&&(h=c(h,e.draggable,d))){if(D=p(h),"function"==typeof k){if(k.call(this,a,h,this))return j(b,i,"filter",h,d,D),void a.preventDefault()}else if(k&&(k=k.split(",").some(function(a){return a=c(i,a.trim(),d),a?(j(b,a,"filter",h,d,D),!0):void 0})))return void a.preventDefault();(!e.handle||c(i,e.handle,d))&&this._prepareDragStart(a,g,h)}},_prepareDragStart:function(a,b,c){var d,f=this,h=f.el,j=f.options,k=h.ownerDocument;c&&!s&&c.parentNode===h&&(G=a,w=h,s=c,t=s.parentNode,x=s.nextSibling,F=j.group,d=function(){f._disableDelayedDrag(),s.draggable=!0,g(s,f.options.chosenClass,!0),f._triggerDragStart(b)},j.ignore.split(",").forEach(function(a){i(s,a.trim(),l)}),e(k,"mouseup",f._onDrop),e(k,"touchend",f._onDrop),e(k,"touchcancel",f._onDrop),j.delay?(e(k,"mouseup",f._disableDelayedDrag),e(k,"touchend",f._disableDelayedDrag),e(k,"touchcancel",f._disableDelayedDrag),e(k,"mousemove",f._disableDelayedDrag),e(k,"touchmove",f._disableDelayedDrag),f._dragStartTimer=setTimeout(d,j.delay)):d())},_disableDelayedDrag:function(){var a=this.el.ownerDocument;clearTimeout(this._dragStartTimer),f(a,"mouseup",this._disableDelayedDrag),f(a,"touchend",this._disableDelayedDrag),f(a,"touchcancel",this._disableDelayedDrag),f(a,"mousemove",this._disableDelayedDrag),f(a,"touchmove",this._disableDelayedDrag)},_triggerDragStart:function(a){a?(G={target:s,clientX:a.clientX,clientY:a.clientY},this._onDragStart(G,"touch")):this.nativeDraggable?(e(s,"dragend",this),e(w,"dragstart",this._onDragStart)):this._onDragStart(G,!0);try{N.selection?N.selection.empty():window.getSelection().removeAllRanges()}catch(b){}},_dragStarted:function(){w&&s&&(g(s,this.options.ghostClass,!0),a.active=this,j(this,w,"start",s,w,D))},_emulateDragOver:function(){if(H){if(this._lastX===H.clientX&&this._lastY===H.clientY)return;this._lastX=H.clientX,this._lastY=H.clientY,Q||h(u,"display","none");var a=N.elementFromPoint(H.clientX,H.clientY),b=a,c=" "+this.options.group.name,d=T.length;if(b)do{if(b[L]&&b[L].options.groups.indexOf(c)>-1){for(;d--;)T[d]({clientX:H.clientX,clientY:H.clientY,target:a,rootEl:b});break}a=b}while(b=b.parentNode);Q||h(u,"display","")}},_onTouchMove:function(b){if(G){a.active||this._dragStarted(),this._appendGhost();var c=b.touches?b.touches[0]:b,d=c.clientX-G.clientX,e=c.clientY-G.clientY,f=b.touches?"translate3d("+d+"px,"+e+"px,0)":"translate("+d+"px,"+e+"px)";I=!0,H=c,h(u,"webkitTransform",f),h(u,"mozTransform",f),h(u,"msTransform",f),h(u,"transform",f),b.preventDefault()}},_appendGhost:function(){if(!u){var a,b=s.getBoundingClientRect(),c=h(s),d=this.options;u=s.cloneNode(!0),g(u,d.ghostClass,!1),g(u,d.fallbackClass,!0),h(u,"top",b.top-O(c.marginTop,10)),h(u,"left",b.left-O(c.marginLeft,10)),h(u,"width",b.width),h(u,"height",b.height),h(u,"opacity","0.8"),h(u,"position","fixed"),h(u,"zIndex","100000"),h(u,"pointerEvents","none"),d.fallbackOnBody&&N.body.appendChild(u)||w.appendChild(u),a=u.getBoundingClientRect(),h(u,"width",2*b.width-a.width),h(u,"height",2*b.height-a.height)}},_onDragStart:function(a,b){var c=a.dataTransfer,d=this.options;this._offUpEvents(),"clone"==F.pull&&(v=s.cloneNode(!0),h(v,"display","none"),w.insertBefore(v,s)),b?("touch"===b?(e(N,"touchmove",this._onTouchMove),e(N,"touchend",this._onDrop),e(N,"touchcancel",this._onDrop)):(e(N,"mousemove",this._onTouchMove),e(N,"mouseup",this._onDrop)),this._loopId=setInterval(this._emulateDragOver,50)):(c&&(c.effectAllowed="move",d.setData&&d.setData.call(this,c,s)),e(N,"drop",this),setTimeout(this._dragStarted,0))},_onDragOver:function(a){var d,e,f,g=this.el,i=this.options,j=i.group,l=j.put,o=F===j,p=i.sort;if(void 0!==a.preventDefault&&(a.preventDefault(),!i.dragoverBubble&&a.stopPropagation()),I=!0,F&&!i.disabled&&(o?p||(f=!w.contains(s)):F.pull&&l&&(F.name===j.name||l.indexOf&&~l.indexOf(F.name)))&&(void 0===a.rootEl||a.rootEl===this.el)){if(U(a,i,this.el),R)return;if(d=c(a.target,i.draggable,g),e=s.getBoundingClientRect(),f)return b(!0),void(v||x?w.insertBefore(s,v||x):p||w.appendChild(s));if(0===g.children.length||g.children[0]===u||g===a.target&&(d=n(g,a))){if(d){if(d.animated)return;r=d.getBoundingClientRect()}b(o),k(w,g,s,e,d,r)!==!1&&(s.contains(g)||(g.appendChild(s),t=g),this._animate(e,s),d&&this._animate(r,d))}else if(d&&!d.animated&&d!==s&&void 0!==d.parentNode[L]){A!==d&&(A=d,B=h(d),C=h(d.parentNode));var q,r=d.getBoundingClientRect(),y=r.right-r.left,z=r.bottom-r.top,D=/left|right|inline/.test(B.cssFloat+B.display)||"flex"==C.display&&0===C["flex-direction"].indexOf("row"),E=d.offsetWidth>s.offsetWidth,G=d.offsetHeight>s.offsetHeight,H=(D?(a.clientX-r.left)/y:(a.clientY-r.top)/z)>.5,J=d.nextElementSibling,K=k(w,g,s,e,d,r);if(K!==!1){if(R=!0,setTimeout(m,30),b(o),1===K||-1===K)q=1===K;else if(D){var M=s.offsetTop,N=d.offsetTop;q=M===N?d.previousElementSibling===s&&!E||H&&E:N>M}else q=J!==s&&!G||H&&G;s.contains(g)||(q&&!J?g.appendChild(s):d.parentNode.insertBefore(s,q?J:d)),t=s.parentNode,this._animate(e,s),this._animate(r,d)}}}},_animate:function(a,b){var c=this.options.animation;if(c){var d=b.getBoundingClientRect();h(b,"transition","none"),h(b,"transform","translate3d("+(a.left-d.left)+"px,"+(a.top-d.top)+"px,0)"),b.offsetWidth,h(b,"transition","all "+c+"ms"),h(b,"transform","translate3d(0,0,0)"),clearTimeout(b.animated),b.animated=setTimeout(function(){h(b,"transition",""),h(b,"transform",""),b.animated=!1},c)}},_offUpEvents:function(){var a=this.el.ownerDocument;f(N,"touchmove",this._onTouchMove),f(a,"mouseup",this._onDrop),f(a,"touchend",this._onDrop),f(a,"touchcancel",this._onDrop)},_onDrop:function(b){var c=this.el,d=this.options;clearInterval(this._loopId),clearInterval(J.pid),clearTimeout(this._dragStartTimer),f(N,"mousemove",this._onTouchMove),this.nativeDraggable&&(f(N,"drop",this),f(c,"dragstart",this._onDragStart)),this._offUpEvents(),b&&(I&&(b.preventDefault(),!d.dropBubble&&b.stopPropagation()),u&&u.parentNode.removeChild(u),s&&(this.nativeDraggable&&f(s,"dragend",this),l(s),g(s,this.options.ghostClass,!1),g(s,this.options.chosenClass,!1),w!==t?(E=p(s),E>=0&&(j(null,t,"sort",s,w,D,E),j(this,w,"sort",s,w,D,E),j(null,t,"add",s,w,D,E),j(this,w,"remove",s,w,D,E))):(v&&v.parentNode.removeChild(v),s.nextSibling!==x&&(E=p(s),E>=0&&(j(this,w,"update",s,w,D,E),j(this,w,"sort",s,w,D,E)))),a.active&&((null===E||-1===E)&&(E=D),j(this,w,"end",s,w,D,E),this.save())),w=s=t=u=x=v=y=z=G=H=I=E=A=B=F=a.active=null)},handleEvent:function(a){var b=a.type;"dragover"===b||"dragenter"===b?s&&(this._onDragOver(a),d(a)):("drop"===b||"dragend"===b)&&this._onDrop(a)},toArray:function(){for(var a,b=[],d=this.el.children,e=0,f=d.length,g=this.options;f>e;e++)a=d[e],c(a,g.draggable,this.el)&&b.push(a.getAttribute(g.dataIdAttr)||o(a));return b},sort:function(a){var b={},d=this.el;this.toArray().forEach(function(a,e){var f=d.children[e];c(f,this.options.draggable,d)&&(b[a]=f)},this),a.forEach(function(a){b[a]&&(d.removeChild(b[a]),d.appendChild(b[a]))})},save:function(){var a=this.options.store;a&&a.set(this)},closest:function(a,b){return c(a,b||this.options.draggable,this.el)},option:function(a,b){var c=this.options;return void 0===b?c[a]:(c[a]=b,void("group"===a&&V(c)))},destroy:function(){var a=this.el;a[L]=null,f(a,"mousedown",this._onTapStart),f(a,"touchstart",this._onTapStart),this.nativeDraggable&&(f(a,"dragover",this),f(a,"dragenter",this)),Array.prototype.forEach.call(a.querySelectorAll("[draggable]"),function(a){a.removeAttribute("draggable")}),T.splice(T.indexOf(this._onDragOver),1),this._onDrop(),this.el=a=null}},a.utils={on:e,off:f,css:h,find:i,is:function(a,b){return!!c(a,b,a)},extend:r,throttle:q,closest:c,toggleClass:g,index:p},a.create=function(b,c){return new a(b,c)},a.version="1.4.2",a}); \ No newline at end of file +/*! Sortable 1.10.2 - MIT | git://github.com/SortableJS/Sortable.git */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).Sortable=e()}(this,function(){"use strict";function o(t){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function a(){return(a=Object.assign||function(t){for(var e=1;e"===e[0]&&(e=e.substring(1)),t)try{if(t.matches)return t.matches(e);if(t.msMatchesSelector)return t.msMatchesSelector(e);if(t.webkitMatchesSelector)return t.webkitMatchesSelector(e)}catch(t){return!1}return!1}}function P(t,e,n,o){if(t){n=n||document;do{if(null!=e&&(">"===e[0]?t.parentNode===n&&h(t,e):h(t,e))||o&&t===n)return t;if(t===n)break}while(t=(i=t).host&&i!==document&&i.host.nodeType?i.host:i.parentNode)}var i;return null}var f,p=/\s+/g;function k(t,e,n){if(t&&e)if(t.classList)t.classList[n?"add":"remove"](e);else{var o=(" "+t.className+" ").replace(p," ").replace(" "+e+" "," ");t.className=(o+(n?" "+e:"")).replace(p," ")}}function R(t,e,n){var o=t&&t.style;if(o){if(void 0===n)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(t,""):t.currentStyle&&(n=t.currentStyle),void 0===e?n:n[e];e in o||-1!==e.indexOf("webkit")||(e="-webkit-"+e),o[e]=n+("string"==typeof n?"":"px")}}function v(t,e){var n="";if("string"==typeof t)n=t;else do{var o=R(t,"transform");o&&"none"!==o&&(n=o+" "+n)}while(!e&&(t=t.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(n)}function g(t,e,n){if(t){var o=t.getElementsByTagName(e),i=0,r=o.length;if(n)for(;i=e.left-n&&r<=e.right+n,i=a>=e.top-n&&a<=e.bottom+n;return n&&o&&i?l=t:void 0}}),l}((t=t.touches?t.touches[0]:t).clientX,t.clientY);if(e){var n={};for(var o in t)t.hasOwnProperty(o)&&(n[o]=t[o]);n.target=n.rootEl=e,n.preventDefault=void 0,n.stopPropagation=void 0,e[j]._onDragOver(n)}}}function kt(t){z&&z.parentNode[j]._isOutsideThisEl(t.target)}function Rt(t,e){if(!t||!t.nodeType||1!==t.nodeType)throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(t));this.el=t,this.options=e=a({},e),t[j]=this;var n={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(t.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return Ot(t,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(t,e){t.setData("Text",e.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==Rt.supportPointer&&"PointerEvent"in window,emptyInsertThreshold:5};for(var o in O.initializePlugins(this,t,n),n)o in e||(e[o]=n[o]);for(var i in At(e),this)"_"===i.charAt(0)&&"function"==typeof this[i]&&(this[i]=this[i].bind(this));this.nativeDraggable=!e.forceFallback&&xt,this.nativeDraggable&&(this.options.touchStartThreshold=1),e.supportPointer?u(t,"pointerdown",this._onTapStart):(u(t,"mousedown",this._onTapStart),u(t,"touchstart",this._onTapStart)),this.nativeDraggable&&(u(t,"dragover",this),u(t,"dragenter",this)),bt.push(this.el),e.store&&e.store.get&&this.sort(e.store.get(this)||[]),a(this,T())}function Xt(t,e,n,o,i,r,a,l){var s,c,u=t[j],d=u.options.onMove;return!window.CustomEvent||w||E?(s=document.createEvent("Event")).initEvent("move",!0,!0):s=new CustomEvent("move",{bubbles:!0,cancelable:!0}),s.to=e,s.from=t,s.dragged=n,s.draggedRect=o,s.related=i||e,s.relatedRect=r||X(e),s.willInsertAfter=l,s.originalEvent=a,t.dispatchEvent(s),d&&(c=d.call(u,s,a)),c}function Yt(t){t.draggable=!1}function Bt(){Dt=!1}function Ft(t){for(var e=t.tagName+t.className+t.src+t.href+t.textContent,n=e.length,o=0;n--;)o+=e.charCodeAt(n);return o.toString(36)}function Ht(t){return setTimeout(t,0)}function Lt(t){return clearTimeout(t)}Rt.prototype={constructor:Rt,_isOutsideThisEl:function(t){this.el.contains(t)||t===this.el||(ht=null)},_getDirection:function(t,e){return"function"==typeof this.options.direction?this.options.direction.call(this,t,e,z):this.options.direction},_onTapStart:function(e){if(e.cancelable){var n=this,o=this.el,t=this.options,i=t.preventOnFilter,r=e.type,a=e.touches&&e.touches[0]||e.pointerType&&"touch"===e.pointerType&&e,l=(a||e).target,s=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||l,c=t.filter;if(function(t){St.length=0;var e=t.getElementsByTagName("input"),n=e.length;for(;n--;){var o=e[n];o.checked&&St.push(o)}}(o),!z&&!(/mousedown|pointerdown/.test(r)&&0!==e.button||t.disabled||s.isContentEditable||(l=P(l,t.draggable,o,!1))&&l.animated||Z===l)){if(J=F(l),et=F(l,t.draggable),"function"==typeof c){if(c.call(this,e,l,this))return W({sortable:n,rootEl:s,name:"filter",targetEl:l,toEl:o,fromEl:o}),K("filter",n,{evt:e}),void(i&&e.cancelable&&e.preventDefault())}else if(c&&(c=c.split(",").some(function(t){if(t=P(s,t.trim(),o,!1))return W({sortable:n,rootEl:t,name:"filter",targetEl:l,fromEl:o,toEl:o}),K("filter",n,{evt:e}),!0})))return void(i&&e.cancelable&&e.preventDefault());t.handle&&!P(s,t.handle,o,!1)||this._prepareDragStart(e,a,l)}}},_prepareDragStart:function(t,e,n){var o,i=this,r=i.el,a=i.options,l=r.ownerDocument;if(n&&!z&&n.parentNode===r){var s=X(n);if(q=r,G=(z=n).parentNode,V=z.nextSibling,Z=n,ot=a.group,rt={target:Rt.dragged=z,clientX:(e||t).clientX,clientY:(e||t).clientY},ct=rt.clientX-s.left,ut=rt.clientY-s.top,this._lastX=(e||t).clientX,this._lastY=(e||t).clientY,z.style["will-change"]="all",o=function(){K("delayEnded",i,{evt:t}),Rt.eventCanceled?i._onDrop():(i._disableDelayedDragEvents(),!c&&i.nativeDraggable&&(z.draggable=!0),i._triggerDragStart(t,e),W({sortable:i,name:"choose",originalEvent:t}),k(z,a.chosenClass,!0))},a.ignore.split(",").forEach(function(t){g(z,t.trim(),Yt)}),u(l,"dragover",Pt),u(l,"mousemove",Pt),u(l,"touchmove",Pt),u(l,"mouseup",i._onDrop),u(l,"touchend",i._onDrop),u(l,"touchcancel",i._onDrop),c&&this.nativeDraggable&&(this.options.touchStartThreshold=4,z.draggable=!0),K("delayStart",this,{evt:t}),!a.delay||a.delayOnTouchOnly&&!e||this.nativeDraggable&&(E||w))o();else{if(Rt.eventCanceled)return void this._onDrop();u(l,"mouseup",i._disableDelayedDrag),u(l,"touchend",i._disableDelayedDrag),u(l,"touchcancel",i._disableDelayedDrag),u(l,"mousemove",i._delayedDragTouchMoveHandler),u(l,"touchmove",i._delayedDragTouchMoveHandler),a.supportPointer&&u(l,"pointermove",i._delayedDragTouchMoveHandler),i._dragStartTimer=setTimeout(o,a.delay)}}},_delayedDragTouchMoveHandler:function(t){var e=t.touches?t.touches[0]:t;Math.max(Math.abs(e.clientX-this._lastX),Math.abs(e.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){z&&Yt(z),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;d(t,"mouseup",this._disableDelayedDrag),d(t,"touchend",this._disableDelayedDrag),d(t,"touchcancel",this._disableDelayedDrag),d(t,"mousemove",this._delayedDragTouchMoveHandler),d(t,"touchmove",this._delayedDragTouchMoveHandler),d(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,e){e=e||"touch"==t.pointerType&&t,!this.nativeDraggable||e?this.options.supportPointer?u(document,"pointermove",this._onTouchMove):u(document,e?"touchmove":"mousemove",this._onTouchMove):(u(z,"dragend",this),u(q,"dragstart",this._onDragStart));try{document.selection?Ht(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch(t){}},_dragStarted:function(t,e){if(vt=!1,q&&z){K("dragStarted",this,{evt:e}),this.nativeDraggable&&u(document,"dragover",kt);var n=this.options;t||k(z,n.dragClass,!1),k(z,n.ghostClass,!0),Rt.active=this,t&&this._appendGhost(),W({sortable:this,name:"start",originalEvent:e})}else this._nulling()},_emulateDragOver:function(){if(at){this._lastX=at.clientX,this._lastY=at.clientY,Nt();for(var t=document.elementFromPoint(at.clientX,at.clientY),e=t;t&&t.shadowRoot&&(t=t.shadowRoot.elementFromPoint(at.clientX,at.clientY))!==e;)e=t;if(z.parentNode[j]._isOutsideThisEl(t),e)do{if(e[j]){if(e[j]._onDragOver({clientX:at.clientX,clientY:at.clientY,target:t,rootEl:e})&&!this.options.dragoverBubble)break}t=e}while(e=e.parentNode);It()}},_onTouchMove:function(t){if(rt){var e=this.options,n=e.fallbackTolerance,o=e.fallbackOffset,i=t.touches?t.touches[0]:t,r=U&&v(U,!0),a=U&&r&&r.a,l=U&&r&&r.d,s=Ct&>&&b(gt),c=(i.clientX-rt.clientX+o.x)/(a||1)+(s?s[0]-Et[0]:0)/(a||1),u=(i.clientY-rt.clientY+o.y)/(l||1)+(s?s[1]-Et[1]:0)/(l||1);if(!Rt.active&&!vt){if(n&&Math.max(Math.abs(i.clientX-this._lastX),Math.abs(i.clientY-this._lastY))o.right+10||t.clientX<=o.right&&t.clientY>o.bottom&&t.clientX>=o.left:t.clientX>o.right&&t.clientY>o.top||t.clientX<=o.right&&t.clientY>o.bottom+10}(n,a,this)&&!g.animated){if(g===z)return A(!1);if(g&&l===n.target&&(s=g),s&&(i=X(s)),!1!==Xt(q,l,z,o,s,i,n,!!s))return O(),l.appendChild(z),G=l,N(),A(!0)}else if(s.parentNode===l){i=X(s);var v,m,b,y=z.parentNode!==l,w=!function(t,e,n){var o=n?t.left:t.top,i=n?t.right:t.bottom,r=n?t.width:t.height,a=n?e.left:e.top,l=n?e.right:e.bottom,s=n?e.width:e.height;return o===a||i===l||o+r/2===a+s/2}(z.animated&&z.toRect||o,s.animated&&s.toRect||i,a),E=a?"top":"left",D=Y(s,"top","top")||Y(z,"top","top"),S=D?D.scrollTop:void 0;if(ht!==s&&(m=i[E],yt=!1,wt=!w&&e.invertSwap||y),0!==(v=function(t,e,n,o,i,r,a,l){var s=o?t.clientY:t.clientX,c=o?n.height:n.width,u=o?n.top:n.left,d=o?n.bottom:n.right,h=!1;if(!a)if(l&&pt LOOP_LIMIT) { - warn("getInheritableProperty: maximum loop count exceeded for \"".concat(key, "\"")); - break; - } - - dict = dict.get('Parent'); - } - - return values; -} - var Util = function UtilClosure() { function Util() {} @@ -1044,30 +951,6 @@ var Util = function UtilClosure() { }(); exports.Util = Util; -var ROMAN_NUMBER_MAP = ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX']; - -function toRomanNumerals(number) { - var lowerCase = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - assert(Number.isInteger(number) && number > 0, 'The number should be a positive integer.'); - var pos, - romanBuf = []; - - while (number >= 1000) { - number -= 1000; - romanBuf.push('M'); - } - - pos = number / 100 | 0; - number %= 100; - romanBuf.push(ROMAN_NUMBER_MAP[pos]); - pos = number / 10 | 0; - number %= 10; - romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]); - romanBuf.push(ROMAN_NUMBER_MAP[20 + number]); - var romanStr = romanBuf.join(''); - return lowerCase ? romanStr.toLowerCase() : romanStr; -} - var PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC]; function stringToPDFString(str) { @@ -1121,6 +1004,16 @@ function isArrayBuffer(v) { return _typeof(v) === 'object' && v !== null && v.byteLength !== undefined; } +function isArrayEqual(arr1, arr2) { + if (arr1.length !== arr2.length) { + return false; + } + + return arr1.every(function (element, index) { + return element === arr2[index]; + }); +} + function isSpace(ch) { return ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A; } @@ -1252,8 +1145,8 @@ if (!globalScope._pdfjsCompatibilityChecked) { tokens[_key] = arguments[_key]; } - for (var _i = 0; _i < tokens.length; _i++) { - var token = tokens[_i]; + for (var _i = 0, _tokens = tokens; _i < _tokens.length; _i++) { + var token = _tokens[_i]; OriginalDOMTokenListAdd.call(this, token); } }; @@ -1263,8 +1156,8 @@ if (!globalScope._pdfjsCompatibilityChecked) { tokens[_key2] = arguments[_key2]; } - for (var _i2 = 0; _i2 < tokens.length; _i2++) { - var token = tokens[_i2]; + for (var _i2 = 0, _tokens2 = tokens; _i2 < _tokens2.length; _i2++) { + var token = _tokens2[_i2]; OriginalDOMTokenListRemove.call(this, token); } }; @@ -1300,7 +1193,7 @@ if (!globalScope._pdfjsCompatibilityChecked) { return; } - __w_pdfjs_require__(35); + __w_pdfjs_require__(36); })(); (function checkStringIncludes() { @@ -1308,7 +1201,7 @@ if (!globalScope._pdfjsCompatibilityChecked) { return; } - __w_pdfjs_require__(37); + __w_pdfjs_require__(38); })(); (function checkArrayIncludes() { @@ -1316,7 +1209,7 @@ if (!globalScope._pdfjsCompatibilityChecked) { return; } - __w_pdfjs_require__(39); + __w_pdfjs_require__(40); })(); (function checkArrayFrom() { @@ -1324,7 +1217,7 @@ if (!globalScope._pdfjsCompatibilityChecked) { return; } - __w_pdfjs_require__(46); + __w_pdfjs_require__(47); })(); (function checkObjectAssign() { @@ -1332,7 +1225,7 @@ if (!globalScope._pdfjsCompatibilityChecked) { return; } - __w_pdfjs_require__(69); + __w_pdfjs_require__(70); })(); (function checkMathLog2() { @@ -1340,7 +1233,7 @@ if (!globalScope._pdfjsCompatibilityChecked) { return; } - Math.log2 = __w_pdfjs_require__(74); + Math.log2 = __w_pdfjs_require__(75); })(); (function checkNumberIsNaN() { @@ -1348,7 +1241,7 @@ if (!globalScope._pdfjsCompatibilityChecked) { return; } - Number.isNaN = __w_pdfjs_require__(76); + Number.isNaN = __w_pdfjs_require__(77); })(); (function checkNumberIsInteger() { @@ -1356,15 +1249,15 @@ if (!globalScope._pdfjsCompatibilityChecked) { return; } - Number.isInteger = __w_pdfjs_require__(78); + Number.isInteger = __w_pdfjs_require__(79); })(); (function checkPromise() { - if (globalScope.Promise && globalScope.Promise.prototype && globalScope.Promise.prototype.finally) { + if (globalScope.Promise && globalScope.Promise.prototype && globalScope.Promise.prototype["finally"]) { return; } - globalScope.Promise = __w_pdfjs_require__(81); + globalScope.Promise = __w_pdfjs_require__(82); })(); (function checkWeakMap() { @@ -1372,7 +1265,7 @@ if (!globalScope._pdfjsCompatibilityChecked) { return; } - globalScope.WeakMap = __w_pdfjs_require__(101); + globalScope.WeakMap = __w_pdfjs_require__(102); })(); (function checkWeakSet() { @@ -1380,7 +1273,7 @@ if (!globalScope._pdfjsCompatibilityChecked) { return; } - globalScope.WeakSet = __w_pdfjs_require__(118); + globalScope.WeakSet = __w_pdfjs_require__(119); })(); (function checkStringCodePointAt() { @@ -1388,7 +1281,7 @@ if (!globalScope._pdfjsCompatibilityChecked) { return; } - String.codePointAt = __w_pdfjs_require__(122); + String.codePointAt = __w_pdfjs_require__(123); })(); (function checkStringFromCodePoint() { @@ -1396,7 +1289,7 @@ if (!globalScope._pdfjsCompatibilityChecked) { return; } - String.fromCodePoint = __w_pdfjs_require__(124); + String.fromCodePoint = __w_pdfjs_require__(125); })(); (function checkSymbol() { @@ -1404,7 +1297,7 @@ if (!globalScope._pdfjsCompatibilityChecked) { return; } - __w_pdfjs_require__(126); + __w_pdfjs_require__(127); })(); (function checkStringPadStart() { @@ -1412,7 +1305,7 @@ if (!globalScope._pdfjsCompatibilityChecked) { return; } - __w_pdfjs_require__(133); + __w_pdfjs_require__(134); })(); (function checkStringPadEnd() { @@ -1420,7 +1313,7 @@ if (!globalScope._pdfjsCompatibilityChecked) { return; } - __w_pdfjs_require__(137); + __w_pdfjs_require__(138); })(); (function checkObjectValues() { @@ -1428,7 +1321,7 @@ if (!globalScope._pdfjsCompatibilityChecked) { return; } - Object.values = __w_pdfjs_require__(139); + Object.values = __w_pdfjs_require__(140); })(); } @@ -1451,7 +1344,7 @@ module.exports = typeof window !== 'undefined' && window.Math === Math ? window function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } module.exports = function isNodeJS() { - return (typeof process === "undefined" ? "undefined" : _typeof(process)) === 'object' && process + '' === '[object process]' && !process.versions['nw']; + return (typeof process === "undefined" ? "undefined" : _typeof(process)) === 'object' && process + '' === '[object process]' && !process.versions['nw'] && !process.versions['electron']; }; /***/ }), @@ -1474,13 +1367,13 @@ module.exports = __w_pdfjs_require__(9).String.startsWith; var $export = __w_pdfjs_require__(7); -var toLength = __w_pdfjs_require__(25); +var toLength = __w_pdfjs_require__(28); -var context = __w_pdfjs_require__(27); +var context = __w_pdfjs_require__(30); var STARTS_WITH = 'startsWith'; var $startsWith = ''[STARTS_WITH]; -$export($export.P + $export.F * __w_pdfjs_require__(34)(STARTS_WITH), 'String', { +$export($export.P + $export.F * __w_pdfjs_require__(35)(STARTS_WITH), 'String', { startsWith: function startsWith(searchString) { var that = context(this, searchString, STARTS_WITH); var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length)); @@ -1504,7 +1397,7 @@ var hide = __w_pdfjs_require__(10); var redefine = __w_pdfjs_require__(20); -var ctx = __w_pdfjs_require__(23); +var ctx = __w_pdfjs_require__(26); var PROTOTYPE = 'prototype'; @@ -1559,7 +1452,7 @@ if (typeof __g == 'number') __g = global; var core = module.exports = { - version: '2.6.2' + version: '2.6.9' }; if (typeof __e == 'number') __e = core; @@ -1745,8 +1638,9 @@ var has = __w_pdfjs_require__(21); var SRC = __w_pdfjs_require__(22)('src'); +var $toString = __w_pdfjs_require__(23); + var TO_STRING = 'toString'; -var $toString = Function[TO_STRING]; var TPL = ('' + $toString).split(TO_STRING); __w_pdfjs_require__(9).inspectSource = function (it) { @@ -1807,7 +1701,46 @@ module.exports = function (key) { "use strict"; -var aFunction = __w_pdfjs_require__(24); +module.exports = __w_pdfjs_require__(24)('native-function-to-string', Function.toString); + +/***/ }), +/* 24 */ +/***/ (function(module, exports, __w_pdfjs_require__) { + +"use strict"; + + +var core = __w_pdfjs_require__(9); + +var global = __w_pdfjs_require__(8); + +var SHARED = '__core-js_shared__'; +var store = global[SHARED] || (global[SHARED] = {}); +(module.exports = function (key, value) { + return store[key] || (store[key] = value !== undefined ? value : {}); +})('versions', []).push({ + version: core.version, + mode: __w_pdfjs_require__(25) ? 'pure' : 'global', + copyright: '© 2019 Denis Pushkarev (zloirock.ru)' +}); + +/***/ }), +/* 25 */ +/***/ (function(module, exports, __w_pdfjs_require__) { + +"use strict"; + + +module.exports = false; + +/***/ }), +/* 26 */ +/***/ (function(module, exports, __w_pdfjs_require__) { + +"use strict"; + + +var aFunction = __w_pdfjs_require__(27); module.exports = function (fn, that, length) { aFunction(fn); @@ -1836,7 +1769,7 @@ module.exports = function (fn, that, length) { }; /***/ }), -/* 24 */ +/* 27 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -1848,13 +1781,13 @@ module.exports = function (it) { }; /***/ }), -/* 25 */ +/* 28 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var toInteger = __w_pdfjs_require__(26); +var toInteger = __w_pdfjs_require__(29); var min = Math.min; @@ -1863,7 +1796,7 @@ module.exports = function (it) { }; /***/ }), -/* 26 */ +/* 29 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -1877,15 +1810,15 @@ module.exports = function (it) { }; /***/ }), -/* 27 */ +/* 30 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var isRegExp = __w_pdfjs_require__(28); +var isRegExp = __w_pdfjs_require__(31); -var defined = __w_pdfjs_require__(33); +var defined = __w_pdfjs_require__(34); module.exports = function (that, searchString, NAME) { if (isRegExp(searchString)) throw TypeError('String#' + NAME + " doesn't accept regex!"); @@ -1893,7 +1826,7 @@ module.exports = function (that, searchString, NAME) { }; /***/ }), -/* 28 */ +/* 31 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -1901,9 +1834,9 @@ module.exports = function (that, searchString, NAME) { var isObject = __w_pdfjs_require__(13); -var cof = __w_pdfjs_require__(29); +var cof = __w_pdfjs_require__(32); -var MATCH = __w_pdfjs_require__(30)('match'); +var MATCH = __w_pdfjs_require__(33)('match'); module.exports = function (it) { var isRegExp; @@ -1911,7 +1844,7 @@ module.exports = function (it) { }; /***/ }), -/* 29 */ +/* 32 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -1924,13 +1857,13 @@ module.exports = function (it) { }; /***/ }), -/* 30 */ +/* 33 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var store = __w_pdfjs_require__(31)('wks'); +var store = __w_pdfjs_require__(24)('wks'); var uid = __w_pdfjs_require__(22); @@ -1945,37 +1878,7 @@ var $exports = module.exports = function (name) { $exports.store = store; /***/ }), -/* 31 */ -/***/ (function(module, exports, __w_pdfjs_require__) { - -"use strict"; - - -var core = __w_pdfjs_require__(9); - -var global = __w_pdfjs_require__(8); - -var SHARED = '__core-js_shared__'; -var store = global[SHARED] || (global[SHARED] = {}); -(module.exports = function (key, value) { - return store[key] || (store[key] = value !== undefined ? value : {}); -})('versions', []).push({ - version: core.version, - mode: __w_pdfjs_require__(32) ? 'pure' : 'global', - copyright: '© 2019 Denis Pushkarev (zloirock.ru)' -}); - -/***/ }), -/* 32 */ -/***/ (function(module, exports, __w_pdfjs_require__) { - -"use strict"; - - -module.exports = false; - -/***/ }), -/* 33 */ +/* 34 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -1987,13 +1890,13 @@ module.exports = function (it) { }; /***/ }), -/* 34 */ +/* 35 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var MATCH = __w_pdfjs_require__(30)('match'); +var MATCH = __w_pdfjs_require__(33)('match'); module.exports = function (KEY) { var re = /./; @@ -2011,18 +1914,18 @@ module.exports = function (KEY) { }; /***/ }), -/* 35 */ +/* 36 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -__w_pdfjs_require__(36); +__w_pdfjs_require__(37); module.exports = __w_pdfjs_require__(9).String.endsWith; /***/ }), -/* 36 */ +/* 37 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -2030,13 +1933,13 @@ module.exports = __w_pdfjs_require__(9).String.endsWith; var $export = __w_pdfjs_require__(7); -var toLength = __w_pdfjs_require__(25); +var toLength = __w_pdfjs_require__(28); -var context = __w_pdfjs_require__(27); +var context = __w_pdfjs_require__(30); var ENDS_WITH = 'endsWith'; var $endsWith = ''[ENDS_WITH]; -$export($export.P + $export.F * __w_pdfjs_require__(34)(ENDS_WITH), 'String', { +$export($export.P + $export.F * __w_pdfjs_require__(35)(ENDS_WITH), 'String', { endsWith: function endsWith(searchString) { var that = context(this, searchString, ENDS_WITH); var endPosition = arguments.length > 1 ? arguments[1] : undefined; @@ -2048,18 +1951,18 @@ $export($export.P + $export.F * __w_pdfjs_require__(34)(ENDS_WITH), 'String', { }); /***/ }), -/* 37 */ +/* 38 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -__w_pdfjs_require__(38); +__w_pdfjs_require__(39); module.exports = __w_pdfjs_require__(9).String.includes; /***/ }), -/* 38 */ +/* 39 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -2067,28 +1970,28 @@ module.exports = __w_pdfjs_require__(9).String.includes; var $export = __w_pdfjs_require__(7); -var context = __w_pdfjs_require__(27); +var context = __w_pdfjs_require__(30); var INCLUDES = 'includes'; -$export($export.P + $export.F * __w_pdfjs_require__(34)(INCLUDES), 'String', { +$export($export.P + $export.F * __w_pdfjs_require__(35)(INCLUDES), 'String', { includes: function includes(searchString) { return !!~context(this, searchString, INCLUDES).indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined); } }); /***/ }), -/* 39 */ +/* 40 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -__w_pdfjs_require__(40); +__w_pdfjs_require__(41); module.exports = __w_pdfjs_require__(9).Array.includes; /***/ }), -/* 40 */ +/* 41 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -2096,7 +1999,7 @@ module.exports = __w_pdfjs_require__(9).Array.includes; var $export = __w_pdfjs_require__(7); -var $includes = __w_pdfjs_require__(41)(true); +var $includes = __w_pdfjs_require__(42)(true); $export($export.P, 'Array', { includes: function includes(el) { @@ -2104,20 +2007,20 @@ $export($export.P, 'Array', { } }); -__w_pdfjs_require__(45)('includes'); +__w_pdfjs_require__(46)('includes'); /***/ }), -/* 41 */ +/* 42 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var toIObject = __w_pdfjs_require__(42); +var toIObject = __w_pdfjs_require__(43); -var toLength = __w_pdfjs_require__(25); +var toLength = __w_pdfjs_require__(28); -var toAbsoluteIndex = __w_pdfjs_require__(44); +var toAbsoluteIndex = __w_pdfjs_require__(45); module.exports = function (IS_INCLUDES) { return function ($this, el, fromIndex) { @@ -2138,41 +2041,41 @@ module.exports = function (IS_INCLUDES) { }; /***/ }), -/* 42 */ +/* 43 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var IObject = __w_pdfjs_require__(43); +var IObject = __w_pdfjs_require__(44); -var defined = __w_pdfjs_require__(33); +var defined = __w_pdfjs_require__(34); module.exports = function (it) { return IObject(defined(it)); }; /***/ }), -/* 43 */ +/* 44 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var cof = __w_pdfjs_require__(29); +var cof = __w_pdfjs_require__(32); module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) { return cof(it) == 'String' ? it.split('') : Object(it); }; /***/ }), -/* 44 */ +/* 45 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var toInteger = __w_pdfjs_require__(26); +var toInteger = __w_pdfjs_require__(29); var max = Math.max; var min = Math.min; @@ -2183,13 +2086,13 @@ module.exports = function (index, length) { }; /***/ }), -/* 45 */ +/* 46 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var UNSCOPABLES = __w_pdfjs_require__(30)('unscopables'); +var UNSCOPABLES = __w_pdfjs_require__(33)('unscopables'); var ArrayProto = Array.prototype; if (ArrayProto[UNSCOPABLES] == undefined) __w_pdfjs_require__(10)(ArrayProto, UNSCOPABLES, {}); @@ -2199,28 +2102,28 @@ module.exports = function (key) { }; /***/ }), -/* 46 */ +/* 47 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -__w_pdfjs_require__(47); +__w_pdfjs_require__(48); -__w_pdfjs_require__(62); +__w_pdfjs_require__(63); module.exports = __w_pdfjs_require__(9).Array.from; /***/ }), -/* 47 */ +/* 48 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var $at = __w_pdfjs_require__(48)(true); +var $at = __w_pdfjs_require__(49)(true); -__w_pdfjs_require__(49)(String, 'String', function (iterated) { +__w_pdfjs_require__(50)(String, 'String', function (iterated) { this._t = String(iterated); this._i = 0; }, function () { @@ -2240,15 +2143,15 @@ __w_pdfjs_require__(49)(String, 'String', function (iterated) { }); /***/ }), -/* 48 */ +/* 49 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var toInteger = __w_pdfjs_require__(26); +var toInteger = __w_pdfjs_require__(29); -var defined = __w_pdfjs_require__(33); +var defined = __w_pdfjs_require__(34); module.exports = function (TO_STRING) { return function (that, pos) { @@ -2263,13 +2166,13 @@ module.exports = function (TO_STRING) { }; /***/ }), -/* 49 */ +/* 50 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var LIBRARY = __w_pdfjs_require__(32); +var LIBRARY = __w_pdfjs_require__(25); var $export = __w_pdfjs_require__(7); @@ -2277,15 +2180,15 @@ var redefine = __w_pdfjs_require__(20); var hide = __w_pdfjs_require__(10); -var Iterators = __w_pdfjs_require__(50); +var Iterators = __w_pdfjs_require__(51); -var $iterCreate = __w_pdfjs_require__(51); +var $iterCreate = __w_pdfjs_require__(52); -var setToStringTag = __w_pdfjs_require__(59); +var setToStringTag = __w_pdfjs_require__(60); -var getPrototypeOf = __w_pdfjs_require__(60); +var getPrototypeOf = __w_pdfjs_require__(61); -var ITERATOR = __w_pdfjs_require__(30)('iterator'); +var ITERATOR = __w_pdfjs_require__(33)('iterator'); var BUGGY = !([].keys && 'next' in [].keys()); var FF_ITERATOR = '@@iterator'; @@ -2368,7 +2271,7 @@ module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCE }; /***/ }), -/* 50 */ +/* 51 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -2377,21 +2280,21 @@ module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCE module.exports = {}; /***/ }), -/* 51 */ +/* 52 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var create = __w_pdfjs_require__(52); +var create = __w_pdfjs_require__(53); var descriptor = __w_pdfjs_require__(19); -var setToStringTag = __w_pdfjs_require__(59); +var setToStringTag = __w_pdfjs_require__(60); var IteratorPrototype = {}; -__w_pdfjs_require__(10)(IteratorPrototype, __w_pdfjs_require__(30)('iterator'), function () { +__w_pdfjs_require__(10)(IteratorPrototype, __w_pdfjs_require__(33)('iterator'), function () { return this; }); @@ -2403,7 +2306,7 @@ module.exports = function (Constructor, NAME, next) { }; /***/ }), -/* 52 */ +/* 53 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -2411,11 +2314,11 @@ module.exports = function (Constructor, NAME, next) { var anObject = __w_pdfjs_require__(12); -var dPs = __w_pdfjs_require__(53); +var dPs = __w_pdfjs_require__(54); -var enumBugKeys = __w_pdfjs_require__(57); +var enumBugKeys = __w_pdfjs_require__(58); -var IE_PROTO = __w_pdfjs_require__(56)('IE_PROTO'); +var IE_PROTO = __w_pdfjs_require__(57)('IE_PROTO'); var Empty = function Empty() {}; @@ -2430,7 +2333,7 @@ var _createDict = function createDict() { var iframeDocument; iframe.style.display = 'none'; - __w_pdfjs_require__(58).appendChild(iframe); + __w_pdfjs_require__(59).appendChild(iframe); iframe.src = 'javascript:'; iframeDocument = iframe.contentWindow.document; @@ -2460,7 +2363,7 @@ module.exports = Object.create || function create(O, Properties) { }; /***/ }), -/* 53 */ +/* 54 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -2470,7 +2373,7 @@ var dP = __w_pdfjs_require__(11); var anObject = __w_pdfjs_require__(12); -var getKeys = __w_pdfjs_require__(54); +var getKeys = __w_pdfjs_require__(55); module.exports = __w_pdfjs_require__(15) ? Object.defineProperties : function defineProperties(O, Properties) { anObject(O); @@ -2487,22 +2390,22 @@ module.exports = __w_pdfjs_require__(15) ? Object.defineProperties : function de }; /***/ }), -/* 54 */ +/* 55 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var $keys = __w_pdfjs_require__(55); +var $keys = __w_pdfjs_require__(56); -var enumBugKeys = __w_pdfjs_require__(57); +var enumBugKeys = __w_pdfjs_require__(58); module.exports = Object.keys || function keys(O) { return $keys(O, enumBugKeys); }; /***/ }), -/* 55 */ +/* 56 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -2510,11 +2413,11 @@ module.exports = Object.keys || function keys(O) { var has = __w_pdfjs_require__(21); -var toIObject = __w_pdfjs_require__(42); +var toIObject = __w_pdfjs_require__(43); -var arrayIndexOf = __w_pdfjs_require__(41)(false); +var arrayIndexOf = __w_pdfjs_require__(42)(false); -var IE_PROTO = __w_pdfjs_require__(56)('IE_PROTO'); +var IE_PROTO = __w_pdfjs_require__(57)('IE_PROTO'); module.exports = function (object, names) { var O = toIObject(object); @@ -2536,13 +2439,13 @@ module.exports = function (object, names) { }; /***/ }), -/* 56 */ +/* 57 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var shared = __w_pdfjs_require__(31)('keys'); +var shared = __w_pdfjs_require__(24)('keys'); var uid = __w_pdfjs_require__(22); @@ -2551,7 +2454,7 @@ module.exports = function (key) { }; /***/ }), -/* 57 */ +/* 58 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -2560,7 +2463,7 @@ module.exports = function (key) { module.exports = 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'.split(','); /***/ }), -/* 58 */ +/* 59 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -2571,7 +2474,7 @@ var document = __w_pdfjs_require__(8).document; module.exports = document && document.documentElement; /***/ }), -/* 59 */ +/* 60 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -2581,7 +2484,7 @@ var def = __w_pdfjs_require__(11).f; var has = __w_pdfjs_require__(21); -var TAG = __w_pdfjs_require__(30)('toStringTag'); +var TAG = __w_pdfjs_require__(33)('toStringTag'); module.exports = function (it, tag, stat) { if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { @@ -2591,7 +2494,7 @@ module.exports = function (it, tag, stat) { }; /***/ }), -/* 60 */ +/* 61 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -2599,9 +2502,9 @@ module.exports = function (it, tag, stat) { var has = __w_pdfjs_require__(21); -var toObject = __w_pdfjs_require__(61); +var toObject = __w_pdfjs_require__(62); -var IE_PROTO = __w_pdfjs_require__(56)('IE_PROTO'); +var IE_PROTO = __w_pdfjs_require__(57)('IE_PROTO'); var ObjectProto = Object.prototype; @@ -2617,42 +2520,42 @@ module.exports = Object.getPrototypeOf || function (O) { }; /***/ }), -/* 61 */ +/* 62 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var defined = __w_pdfjs_require__(33); +var defined = __w_pdfjs_require__(34); module.exports = function (it) { return Object(defined(it)); }; /***/ }), -/* 62 */ +/* 63 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var ctx = __w_pdfjs_require__(23); +var ctx = __w_pdfjs_require__(26); var $export = __w_pdfjs_require__(7); -var toObject = __w_pdfjs_require__(61); +var toObject = __w_pdfjs_require__(62); -var call = __w_pdfjs_require__(63); +var call = __w_pdfjs_require__(64); -var isArrayIter = __w_pdfjs_require__(64); +var isArrayIter = __w_pdfjs_require__(65); -var toLength = __w_pdfjs_require__(25); +var toLength = __w_pdfjs_require__(28); -var createProperty = __w_pdfjs_require__(65); +var createProperty = __w_pdfjs_require__(66); -var getIterFn = __w_pdfjs_require__(66); +var getIterFn = __w_pdfjs_require__(67); -$export($export.S + $export.F * !__w_pdfjs_require__(68)(function (iter) { +$export($export.S + $export.F * !__w_pdfjs_require__(69)(function (iter) { Array.from(iter); }), 'Array', { from: function from(arrayLike) { @@ -2684,7 +2587,7 @@ $export($export.S + $export.F * !__w_pdfjs_require__(68)(function (iter) { }); /***/ }), -/* 63 */ +/* 64 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -2703,15 +2606,15 @@ module.exports = function (iterator, fn, value, entries) { }; /***/ }), -/* 64 */ +/* 65 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var Iterators = __w_pdfjs_require__(50); +var Iterators = __w_pdfjs_require__(51); -var ITERATOR = __w_pdfjs_require__(30)('iterator'); +var ITERATOR = __w_pdfjs_require__(33)('iterator'); var ArrayProto = Array.prototype; @@ -2720,7 +2623,7 @@ module.exports = function (it) { }; /***/ }), -/* 65 */ +/* 66 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -2735,32 +2638,32 @@ module.exports = function (object, index, value) { }; /***/ }), -/* 66 */ +/* 67 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var classof = __w_pdfjs_require__(67); +var classof = __w_pdfjs_require__(68); -var ITERATOR = __w_pdfjs_require__(30)('iterator'); +var ITERATOR = __w_pdfjs_require__(33)('iterator'); -var Iterators = __w_pdfjs_require__(50); +var Iterators = __w_pdfjs_require__(51); module.exports = __w_pdfjs_require__(9).getIteratorMethod = function (it) { if (it != undefined) return it[ITERATOR] || it['@@iterator'] || Iterators[classof(it)]; }; /***/ }), -/* 67 */ +/* 68 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var cof = __w_pdfjs_require__(29); +var cof = __w_pdfjs_require__(32); -var TAG = __w_pdfjs_require__(30)('toStringTag'); +var TAG = __w_pdfjs_require__(33)('toStringTag'); var ARG = cof(function () { return arguments; @@ -2778,13 +2681,13 @@ module.exports = function (it) { }; /***/ }), -/* 68 */ +/* 69 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var ITERATOR = __w_pdfjs_require__(30)('iterator'); +var ITERATOR = __w_pdfjs_require__(33)('iterator'); var SAFE_CLOSING = false; @@ -2825,18 +2728,18 @@ module.exports = function (exec, skipClosing) { }; /***/ }), -/* 69 */ +/* 70 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -__w_pdfjs_require__(70); +__w_pdfjs_require__(71); module.exports = __w_pdfjs_require__(9).Object.assign; /***/ }), -/* 70 */ +/* 71 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -2845,25 +2748,27 @@ module.exports = __w_pdfjs_require__(9).Object.assign; var $export = __w_pdfjs_require__(7); $export($export.S + $export.F, 'Object', { - assign: __w_pdfjs_require__(71) + assign: __w_pdfjs_require__(72) }); /***/ }), -/* 71 */ +/* 72 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var getKeys = __w_pdfjs_require__(54); +var DESCRIPTORS = __w_pdfjs_require__(15); + +var getKeys = __w_pdfjs_require__(55); -var gOPS = __w_pdfjs_require__(72); +var gOPS = __w_pdfjs_require__(73); -var pIE = __w_pdfjs_require__(73); +var pIE = __w_pdfjs_require__(74); -var toObject = __w_pdfjs_require__(61); +var toObject = __w_pdfjs_require__(62); -var IObject = __w_pdfjs_require__(43); +var IObject = __w_pdfjs_require__(44); var $assign = Object.assign; module.exports = !$assign || __w_pdfjs_require__(16)(function () { @@ -2891,7 +2796,8 @@ module.exports = !$assign || __w_pdfjs_require__(16)(function () { var key; while (length > j) { - if (isEnum.call(S, key = keys[j++])) T[key] = S[key]; + key = keys[j++]; + if (!DESCRIPTORS || isEnum.call(S, key)) T[key] = S[key]; } } @@ -2899,7 +2805,7 @@ module.exports = !$assign || __w_pdfjs_require__(16)(function () { } : $assign; /***/ }), -/* 72 */ +/* 73 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -2908,7 +2814,7 @@ module.exports = !$assign || __w_pdfjs_require__(16)(function () { exports.f = Object.getOwnPropertySymbols; /***/ }), -/* 73 */ +/* 74 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -2917,18 +2823,18 @@ exports.f = Object.getOwnPropertySymbols; exports.f = {}.propertyIsEnumerable; /***/ }), -/* 74 */ +/* 75 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -__w_pdfjs_require__(75); +__w_pdfjs_require__(76); module.exports = __w_pdfjs_require__(9).Math.log2; /***/ }), -/* 75 */ +/* 76 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -2943,18 +2849,18 @@ $export($export.S, 'Math', { }); /***/ }), -/* 76 */ +/* 77 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -__w_pdfjs_require__(77); +__w_pdfjs_require__(78); module.exports = __w_pdfjs_require__(9).Number.isNaN; /***/ }), -/* 77 */ +/* 78 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -2969,18 +2875,18 @@ $export($export.S, 'Number', { }); /***/ }), -/* 78 */ +/* 79 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -__w_pdfjs_require__(79); +__w_pdfjs_require__(80); module.exports = __w_pdfjs_require__(9).Number.isInteger; /***/ }), -/* 79 */ +/* 80 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -2989,11 +2895,11 @@ module.exports = __w_pdfjs_require__(9).Number.isInteger; var $export = __w_pdfjs_require__(7); $export($export.S, 'Number', { - isInteger: __w_pdfjs_require__(80) + isInteger: __w_pdfjs_require__(81) }); /***/ }), -/* 80 */ +/* 81 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -3008,37 +2914,37 @@ module.exports = function isInteger(it) { }; /***/ }), -/* 81 */ +/* 82 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -__w_pdfjs_require__(82); - -__w_pdfjs_require__(47); - __w_pdfjs_require__(83); -__w_pdfjs_require__(86); +__w_pdfjs_require__(48); + +__w_pdfjs_require__(84); -__w_pdfjs_require__(99); +__w_pdfjs_require__(87); __w_pdfjs_require__(100); +__w_pdfjs_require__(101); + module.exports = __w_pdfjs_require__(9).Promise; /***/ }), -/* 82 */ +/* 83 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var classof = __w_pdfjs_require__(67); +var classof = __w_pdfjs_require__(68); var test = {}; -test[__w_pdfjs_require__(30)('toStringTag')] = 'z'; +test[__w_pdfjs_require__(33)('toStringTag')] = 'z'; if (test + '' != '[object z]') { __w_pdfjs_require__(20)(Object.prototype, 'toString', function toString() { @@ -3047,15 +2953,15 @@ if (test + '' != '[object z]') { } /***/ }), -/* 83 */ +/* 84 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var $iterators = __w_pdfjs_require__(84); +var $iterators = __w_pdfjs_require__(85); -var getKeys = __w_pdfjs_require__(54); +var getKeys = __w_pdfjs_require__(55); var redefine = __w_pdfjs_require__(20); @@ -3063,9 +2969,9 @@ var global = __w_pdfjs_require__(8); var hide = __w_pdfjs_require__(10); -var Iterators = __w_pdfjs_require__(50); +var Iterators = __w_pdfjs_require__(51); -var wks = __w_pdfjs_require__(30); +var wks = __w_pdfjs_require__(33); var ITERATOR = wks('iterator'); var TO_STRING_TAG = wks('toStringTag'); @@ -3122,21 +3028,21 @@ for (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++ } /***/ }), -/* 84 */ +/* 85 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var addToUnscopables = __w_pdfjs_require__(45); +var addToUnscopables = __w_pdfjs_require__(46); -var step = __w_pdfjs_require__(85); +var step = __w_pdfjs_require__(86); -var Iterators = __w_pdfjs_require__(50); +var Iterators = __w_pdfjs_require__(51); -var toIObject = __w_pdfjs_require__(42); +var toIObject = __w_pdfjs_require__(43); -module.exports = __w_pdfjs_require__(49)(Array, 'Array', function (iterated, kind) { +module.exports = __w_pdfjs_require__(50)(Array, 'Array', function (iterated, kind) { this._t = toIObject(iterated); this._i = 0; this._k = kind; @@ -3160,7 +3066,7 @@ addToUnscopables('values'); addToUnscopables('entries'); /***/ }), -/* 85 */ +/* 86 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -3174,43 +3080,43 @@ module.exports = function (done, value) { }; /***/ }), -/* 86 */ +/* 87 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var LIBRARY = __w_pdfjs_require__(32); +var LIBRARY = __w_pdfjs_require__(25); var global = __w_pdfjs_require__(8); -var ctx = __w_pdfjs_require__(23); +var ctx = __w_pdfjs_require__(26); -var classof = __w_pdfjs_require__(67); +var classof = __w_pdfjs_require__(68); var $export = __w_pdfjs_require__(7); var isObject = __w_pdfjs_require__(13); -var aFunction = __w_pdfjs_require__(24); +var aFunction = __w_pdfjs_require__(27); -var anInstance = __w_pdfjs_require__(87); +var anInstance = __w_pdfjs_require__(88); -var forOf = __w_pdfjs_require__(88); +var forOf = __w_pdfjs_require__(89); -var speciesConstructor = __w_pdfjs_require__(89); +var speciesConstructor = __w_pdfjs_require__(90); -var task = __w_pdfjs_require__(90).set; +var task = __w_pdfjs_require__(91).set; -var microtask = __w_pdfjs_require__(92)(); +var microtask = __w_pdfjs_require__(93)(); -var newPromiseCapabilityModule = __w_pdfjs_require__(93); +var newPromiseCapabilityModule = __w_pdfjs_require__(94); -var perform = __w_pdfjs_require__(94); +var perform = __w_pdfjs_require__(95); -var userAgent = __w_pdfjs_require__(95); +var userAgent = __w_pdfjs_require__(96); -var promiseResolve = __w_pdfjs_require__(96); +var promiseResolve = __w_pdfjs_require__(97); var PROMISE = 'Promise'; var TypeError = global.TypeError; @@ -3228,7 +3134,7 @@ var USE_NATIVE = !!function () { try { var promise = $Promise.resolve(1); - var FakePromise = (promise.constructor = {})[__w_pdfjs_require__(30)('species')] = function (exec) { + var FakePromise = (promise.constructor = {})[__w_pdfjs_require__(33)('species')] = function (exec) { exec(empty, empty); }; @@ -3412,7 +3318,7 @@ if (!USE_NATIVE) { this._n = false; }; - Internal.prototype = __w_pdfjs_require__(97)($Promise.prototype, { + Internal.prototype = __w_pdfjs_require__(98)($Promise.prototype, { then: function then(onFulfilled, onRejected) { var reaction = newPromiseCapability(speciesConstructor(this, $Promise)); reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; @@ -3446,9 +3352,9 @@ $export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise }); -__w_pdfjs_require__(59)($Promise, PROMISE); +__w_pdfjs_require__(60)($Promise, PROMISE); -__w_pdfjs_require__(98)(PROMISE); +__w_pdfjs_require__(99)(PROMISE); Wrapper = __w_pdfjs_require__(9)[PROMISE]; $export($export.S + $export.F * !USE_NATIVE, PROMISE, { @@ -3464,7 +3370,7 @@ $export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, { return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x); } }); -$export($export.S + $export.F * !(USE_NATIVE && __w_pdfjs_require__(68)(function (iter) { +$export($export.S + $export.F * !(USE_NATIVE && __w_pdfjs_require__(69)(function (iter) { $Promise.all(iter)['catch'](empty); })), PROMISE, { all: function all(iterable) { @@ -3508,7 +3414,7 @@ $export($export.S + $export.F * !(USE_NATIVE && __w_pdfjs_require__(68)(function }); /***/ }), -/* 87 */ +/* 88 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -3523,23 +3429,23 @@ module.exports = function (it, Constructor, name, forbiddenField) { }; /***/ }), -/* 88 */ +/* 89 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var ctx = __w_pdfjs_require__(23); +var ctx = __w_pdfjs_require__(26); -var call = __w_pdfjs_require__(63); +var call = __w_pdfjs_require__(64); -var isArrayIter = __w_pdfjs_require__(64); +var isArrayIter = __w_pdfjs_require__(65); var anObject = __w_pdfjs_require__(12); -var toLength = __w_pdfjs_require__(25); +var toLength = __w_pdfjs_require__(28); -var getIterFn = __w_pdfjs_require__(66); +var getIterFn = __w_pdfjs_require__(67); var BREAK = {}; var RETURN = {}; @@ -3565,7 +3471,7 @@ _exports.BREAK = BREAK; _exports.RETURN = RETURN; /***/ }), -/* 89 */ +/* 90 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -3573,9 +3479,9 @@ _exports.RETURN = RETURN; var anObject = __w_pdfjs_require__(12); -var aFunction = __w_pdfjs_require__(24); +var aFunction = __w_pdfjs_require__(27); -var SPECIES = __w_pdfjs_require__(30)('species'); +var SPECIES = __w_pdfjs_require__(33)('species'); module.exports = function (O, D) { var C = anObject(O).constructor; @@ -3584,17 +3490,17 @@ module.exports = function (O, D) { }; /***/ }), -/* 90 */ +/* 91 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var ctx = __w_pdfjs_require__(23); +var ctx = __w_pdfjs_require__(26); -var invoke = __w_pdfjs_require__(91); +var invoke = __w_pdfjs_require__(92); -var html = __w_pdfjs_require__(58); +var html = __w_pdfjs_require__(59); var cel = __w_pdfjs_require__(17); @@ -3645,7 +3551,7 @@ if (!setTask || !clearTask) { delete queue[id]; }; - if (__w_pdfjs_require__(29)(process) == 'process') { + if (__w_pdfjs_require__(32)(process) == 'process') { defer = function defer(id) { process.nextTick(ctx(run, id, 1)); }; @@ -3684,7 +3590,7 @@ module.exports = { }; /***/ }), -/* 91 */ +/* 92 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -3714,7 +3620,7 @@ module.exports = function (fn, args, that) { }; /***/ }), -/* 92 */ +/* 93 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -3722,12 +3628,12 @@ module.exports = function (fn, args, that) { var global = __w_pdfjs_require__(8); -var macrotask = __w_pdfjs_require__(90).set; +var macrotask = __w_pdfjs_require__(91).set; var Observer = global.MutationObserver || global.WebKitMutationObserver; var process = global.process; var Promise = global.Promise; -var isNode = __w_pdfjs_require__(29)(process) == 'process'; +var isNode = __w_pdfjs_require__(32)(process) == 'process'; module.exports = function () { var head, last, notify; @@ -3795,13 +3701,13 @@ module.exports = function () { }; /***/ }), -/* 93 */ +/* 94 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var aFunction = __w_pdfjs_require__(24); +var aFunction = __w_pdfjs_require__(27); function PromiseCapability(C) { var resolve, reject; @@ -3819,7 +3725,7 @@ module.exports.f = function (C) { }; /***/ }), -/* 94 */ +/* 95 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -3840,7 +3746,7 @@ module.exports = function (exec) { }; /***/ }), -/* 95 */ +/* 96 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -3852,7 +3758,7 @@ var navigator = global.navigator; module.exports = navigator && navigator.userAgent || ''; /***/ }), -/* 96 */ +/* 97 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -3862,7 +3768,7 @@ var anObject = __w_pdfjs_require__(12); var isObject = __w_pdfjs_require__(13); -var newPromiseCapability = __w_pdfjs_require__(93); +var newPromiseCapability = __w_pdfjs_require__(94); module.exports = function (C, x) { anObject(C); @@ -3874,7 +3780,7 @@ module.exports = function (C, x) { }; /***/ }), -/* 97 */ +/* 98 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -3891,7 +3797,7 @@ module.exports = function (target, src, safe) { }; /***/ }), -/* 98 */ +/* 99 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -3903,7 +3809,7 @@ var dP = __w_pdfjs_require__(11); var DESCRIPTORS = __w_pdfjs_require__(15); -var SPECIES = __w_pdfjs_require__(30)('species'); +var SPECIES = __w_pdfjs_require__(33)('species'); module.exports = function (KEY) { var C = global[KEY]; @@ -3916,7 +3822,7 @@ module.exports = function (KEY) { }; /***/ }), -/* 99 */ +/* 100 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -3928,9 +3834,9 @@ var core = __w_pdfjs_require__(9); var global = __w_pdfjs_require__(8); -var speciesConstructor = __w_pdfjs_require__(89); +var speciesConstructor = __w_pdfjs_require__(90); -var promiseResolve = __w_pdfjs_require__(96); +var promiseResolve = __w_pdfjs_require__(97); $export($export.P + $export.R, 'Promise', { 'finally': function _finally(onFinally) { @@ -3949,7 +3855,7 @@ $export($export.P + $export.R, 'Promise', { }); /***/ }), -/* 100 */ +/* 101 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -3957,9 +3863,9 @@ $export($export.P + $export.R, 'Promise', { var $export = __w_pdfjs_require__(7); -var newPromiseCapability = __w_pdfjs_require__(93); +var newPromiseCapability = __w_pdfjs_require__(94); -var perform = __w_pdfjs_require__(94); +var perform = __w_pdfjs_require__(95); $export($export.S, 'Promise', { 'try': function _try(callbackfn) { @@ -3971,52 +3877,54 @@ $export($export.S, 'Promise', { }); /***/ }), -/* 101 */ +/* 102 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -__w_pdfjs_require__(82); - __w_pdfjs_require__(83); -__w_pdfjs_require__(102); +__w_pdfjs_require__(84); -__w_pdfjs_require__(114); +__w_pdfjs_require__(103); -__w_pdfjs_require__(116); +__w_pdfjs_require__(115); + +__w_pdfjs_require__(117); module.exports = __w_pdfjs_require__(9).WeakMap; /***/ }), -/* 102 */ +/* 103 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var each = __w_pdfjs_require__(103)(0); +var global = __w_pdfjs_require__(8); + +var each = __w_pdfjs_require__(104)(0); var redefine = __w_pdfjs_require__(20); -var meta = __w_pdfjs_require__(107); +var meta = __w_pdfjs_require__(108); -var assign = __w_pdfjs_require__(71); +var assign = __w_pdfjs_require__(72); -var weak = __w_pdfjs_require__(108); +var weak = __w_pdfjs_require__(109); var isObject = __w_pdfjs_require__(13); -var fails = __w_pdfjs_require__(16); +var validate = __w_pdfjs_require__(110); -var validate = __w_pdfjs_require__(109); +var NATIVE_WEAK_MAP = __w_pdfjs_require__(110); +var IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global; var WEAK_MAP = 'WeakMap'; var getWeak = meta.getWeak; var isExtensible = Object.isExtensible; var uncaughtFrozenStore = weak.ufstore; -var tmp = {}; var InternalMap; var wrapper = function wrapper(get) { @@ -4038,11 +3946,9 @@ var methods = { } }; -var $WeakMap = module.exports = __w_pdfjs_require__(110)(WEAK_MAP, wrapper, methods, weak, true, true); +var $WeakMap = module.exports = __w_pdfjs_require__(111)(WEAK_MAP, wrapper, methods, weak, true, true); -if (fails(function () { - return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; -})) { +if (NATIVE_WEAK_MAP && IS_IE11) { InternalMap = weak.getConstructor(wrapper, WEAK_MAP); assign(InternalMap.prototype, methods); meta.NEED = true; @@ -4064,21 +3970,21 @@ if (fails(function () { } /***/ }), -/* 103 */ +/* 104 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var ctx = __w_pdfjs_require__(23); +var ctx = __w_pdfjs_require__(26); -var IObject = __w_pdfjs_require__(43); +var IObject = __w_pdfjs_require__(44); -var toObject = __w_pdfjs_require__(61); +var toObject = __w_pdfjs_require__(62); -var toLength = __w_pdfjs_require__(25); +var toLength = __w_pdfjs_require__(28); -var asc = __w_pdfjs_require__(104); +var asc = __w_pdfjs_require__(105); module.exports = function (TYPE, $create) { var IS_MAP = TYPE == 1; @@ -4125,20 +4031,20 @@ module.exports = function (TYPE, $create) { }; /***/ }), -/* 104 */ +/* 105 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var speciesConstructor = __w_pdfjs_require__(105); +var speciesConstructor = __w_pdfjs_require__(106); module.exports = function (original, length) { return new (speciesConstructor(original))(length); }; /***/ }), -/* 105 */ +/* 106 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -4146,9 +4052,9 @@ module.exports = function (original, length) { var isObject = __w_pdfjs_require__(13); -var isArray = __w_pdfjs_require__(106); +var isArray = __w_pdfjs_require__(107); -var SPECIES = __w_pdfjs_require__(30)('species'); +var SPECIES = __w_pdfjs_require__(33)('species'); module.exports = function (original) { var C; @@ -4167,20 +4073,20 @@ module.exports = function (original) { }; /***/ }), -/* 106 */ +/* 107 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var cof = __w_pdfjs_require__(29); +var cof = __w_pdfjs_require__(32); module.exports = Array.isArray || function isArray(arg) { return cof(arg) == 'Array'; }; /***/ }), -/* 107 */ +/* 108 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -4251,29 +4157,29 @@ var meta = module.exports = { }; /***/ }), -/* 108 */ +/* 109 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var redefineAll = __w_pdfjs_require__(97); +var redefineAll = __w_pdfjs_require__(98); -var getWeak = __w_pdfjs_require__(107).getWeak; +var getWeak = __w_pdfjs_require__(108).getWeak; var anObject = __w_pdfjs_require__(12); var isObject = __w_pdfjs_require__(13); -var anInstance = __w_pdfjs_require__(87); +var anInstance = __w_pdfjs_require__(88); -var forOf = __w_pdfjs_require__(88); +var forOf = __w_pdfjs_require__(89); -var createArrayMethod = __w_pdfjs_require__(103); +var createArrayMethod = __w_pdfjs_require__(104); var $has = __w_pdfjs_require__(21); -var validate = __w_pdfjs_require__(109); +var validate = __w_pdfjs_require__(110); var arrayFind = createArrayMethod(5); var arrayFindIndex = createArrayMethod(6); @@ -4347,7 +4253,7 @@ module.exports = { }; /***/ }), -/* 109 */ +/* 110 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -4361,7 +4267,7 @@ module.exports = function (it, TYPE) { }; /***/ }), -/* 110 */ +/* 111 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -4373,23 +4279,23 @@ var $export = __w_pdfjs_require__(7); var redefine = __w_pdfjs_require__(20); -var redefineAll = __w_pdfjs_require__(97); +var redefineAll = __w_pdfjs_require__(98); -var meta = __w_pdfjs_require__(107); +var meta = __w_pdfjs_require__(108); -var forOf = __w_pdfjs_require__(88); +var forOf = __w_pdfjs_require__(89); -var anInstance = __w_pdfjs_require__(87); +var anInstance = __w_pdfjs_require__(88); var isObject = __w_pdfjs_require__(13); var fails = __w_pdfjs_require__(16); -var $iterDetect = __w_pdfjs_require__(68); +var $iterDetect = __w_pdfjs_require__(69); -var setToStringTag = __w_pdfjs_require__(59); +var setToStringTag = __w_pdfjs_require__(60); -var inheritIfRequired = __w_pdfjs_require__(111); +var inheritIfRequired = __w_pdfjs_require__(112); module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) { var Base = global[NAME]; @@ -4470,7 +4376,7 @@ module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) { }; /***/ }), -/* 111 */ +/* 112 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -4478,7 +4384,7 @@ module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) { var isObject = __w_pdfjs_require__(13); -var setPrototypeOf = __w_pdfjs_require__(112).set; +var setPrototypeOf = __w_pdfjs_require__(113).set; module.exports = function (that, target, C) { var S = target.constructor; @@ -4492,7 +4398,7 @@ module.exports = function (that, target, C) { }; /***/ }), -/* 112 */ +/* 113 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -4510,7 +4416,7 @@ var check = function check(O, proto) { module.exports = { set: Object.setPrototypeOf || ('__proto__' in {} ? function (test, buggy, set) { try { - set = __w_pdfjs_require__(23)(Function.call, __w_pdfjs_require__(113).f(Object.prototype, '__proto__').set, 2); + set = __w_pdfjs_require__(26)(Function.call, __w_pdfjs_require__(114).f(Object.prototype, '__proto__').set, 2); set(test, []); buggy = !(test instanceof Array); } catch (e) { @@ -4527,17 +4433,17 @@ module.exports = { }; /***/ }), -/* 113 */ +/* 114 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var pIE = __w_pdfjs_require__(73); +var pIE = __w_pdfjs_require__(74); var createDesc = __w_pdfjs_require__(19); -var toIObject = __w_pdfjs_require__(42); +var toIObject = __w_pdfjs_require__(43); var toPrimitive = __w_pdfjs_require__(18); @@ -4556,16 +4462,16 @@ exports.f = __w_pdfjs_require__(15) ? gOPD : function getOwnPropertyDescriptor(O }; /***/ }), -/* 114 */ +/* 115 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -__w_pdfjs_require__(115)('WeakMap'); +__w_pdfjs_require__(116)('WeakMap'); /***/ }), -/* 115 */ +/* 116 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -4589,16 +4495,16 @@ module.exports = function (COLLECTION) { }; /***/ }), -/* 116 */ +/* 117 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -__w_pdfjs_require__(117)('WeakMap'); +__w_pdfjs_require__(118)('WeakMap'); /***/ }), -/* 117 */ +/* 118 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -4606,11 +4512,11 @@ __w_pdfjs_require__(117)('WeakMap'); var $export = __w_pdfjs_require__(7); -var aFunction = __w_pdfjs_require__(24); +var aFunction = __w_pdfjs_require__(27); -var ctx = __w_pdfjs_require__(23); +var ctx = __w_pdfjs_require__(26); -var forOf = __w_pdfjs_require__(88); +var forOf = __w_pdfjs_require__(89); module.exports = function (COLLECTION) { $export($export.S, COLLECTION, { @@ -4639,38 +4545,38 @@ module.exports = function (COLLECTION) { }; /***/ }), -/* 118 */ +/* 119 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -__w_pdfjs_require__(82); - __w_pdfjs_require__(83); -__w_pdfjs_require__(119); +__w_pdfjs_require__(84); __w_pdfjs_require__(120); __w_pdfjs_require__(121); +__w_pdfjs_require__(122); + module.exports = __w_pdfjs_require__(9).WeakSet; /***/ }), -/* 119 */ +/* 120 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var weak = __w_pdfjs_require__(108); +var weak = __w_pdfjs_require__(109); -var validate = __w_pdfjs_require__(109); +var validate = __w_pdfjs_require__(110); var WEAK_SET = 'WeakSet'; -__w_pdfjs_require__(110)(WEAK_SET, function (get) { +__w_pdfjs_require__(111)(WEAK_SET, function (get) { return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); }; @@ -4681,36 +4587,36 @@ __w_pdfjs_require__(110)(WEAK_SET, function (get) { }, weak, false, true); /***/ }), -/* 120 */ +/* 121 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -__w_pdfjs_require__(115)('WeakSet'); +__w_pdfjs_require__(116)('WeakSet'); /***/ }), -/* 121 */ +/* 122 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -__w_pdfjs_require__(117)('WeakSet'); +__w_pdfjs_require__(118)('WeakSet'); /***/ }), -/* 122 */ +/* 123 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -__w_pdfjs_require__(123); +__w_pdfjs_require__(124); module.exports = __w_pdfjs_require__(9).String.codePointAt; /***/ }), -/* 123 */ +/* 124 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -4718,7 +4624,7 @@ module.exports = __w_pdfjs_require__(9).String.codePointAt; var $export = __w_pdfjs_require__(7); -var $at = __w_pdfjs_require__(48)(false); +var $at = __w_pdfjs_require__(49)(false); $export($export.P, 'String', { codePointAt: function codePointAt(pos) { @@ -4727,18 +4633,18 @@ $export($export.P, 'String', { }); /***/ }), -/* 124 */ +/* 125 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -__w_pdfjs_require__(125); +__w_pdfjs_require__(126); module.exports = __w_pdfjs_require__(9).String.fromCodePoint; /***/ }), -/* 125 */ +/* 126 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -4746,7 +4652,7 @@ module.exports = __w_pdfjs_require__(9).String.fromCodePoint; var $export = __w_pdfjs_require__(7); -var toAbsoluteIndex = __w_pdfjs_require__(44); +var toAbsoluteIndex = __w_pdfjs_require__(45); var fromCharCode = String.fromCharCode; var $fromCodePoint = String.fromCodePoint; @@ -4768,20 +4674,20 @@ $export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1) }); /***/ }), -/* 126 */ +/* 127 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -__w_pdfjs_require__(127); +__w_pdfjs_require__(128); -__w_pdfjs_require__(82); +__w_pdfjs_require__(83); module.exports = __w_pdfjs_require__(9).Symbol; /***/ }), -/* 127 */ +/* 128 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -4799,45 +4705,49 @@ var $export = __w_pdfjs_require__(7); var redefine = __w_pdfjs_require__(20); -var META = __w_pdfjs_require__(107).KEY; +var META = __w_pdfjs_require__(108).KEY; var $fails = __w_pdfjs_require__(16); -var shared = __w_pdfjs_require__(31); +var shared = __w_pdfjs_require__(24); -var setToStringTag = __w_pdfjs_require__(59); +var setToStringTag = __w_pdfjs_require__(60); var uid = __w_pdfjs_require__(22); -var wks = __w_pdfjs_require__(30); +var wks = __w_pdfjs_require__(33); -var wksExt = __w_pdfjs_require__(128); +var wksExt = __w_pdfjs_require__(129); -var wksDefine = __w_pdfjs_require__(129); +var wksDefine = __w_pdfjs_require__(130); -var enumKeys = __w_pdfjs_require__(130); +var enumKeys = __w_pdfjs_require__(131); -var isArray = __w_pdfjs_require__(106); +var isArray = __w_pdfjs_require__(107); var anObject = __w_pdfjs_require__(12); var isObject = __w_pdfjs_require__(13); -var toIObject = __w_pdfjs_require__(42); +var toObject = __w_pdfjs_require__(62); + +var toIObject = __w_pdfjs_require__(43); var toPrimitive = __w_pdfjs_require__(18); var createDesc = __w_pdfjs_require__(19); -var _create = __w_pdfjs_require__(52); +var _create = __w_pdfjs_require__(53); -var gOPNExt = __w_pdfjs_require__(131); +var gOPNExt = __w_pdfjs_require__(132); -var $GOPD = __w_pdfjs_require__(113); +var $GOPD = __w_pdfjs_require__(114); + +var $GOPS = __w_pdfjs_require__(73); var $DP = __w_pdfjs_require__(11); -var $keys = __w_pdfjs_require__(54); +var $keys = __w_pdfjs_require__(55); var gOPD = $GOPD.f; var dP = $DP.f; @@ -4855,7 +4765,7 @@ var SymbolRegistry = shared('symbol-registry'); var AllSymbols = shared('symbols'); var OPSymbols = shared('op-symbols'); var ObjectProto = Object[PROTOTYPE]; -var USE_NATIVE = typeof $Symbol == 'function'; +var USE_NATIVE = typeof $Symbol == 'function' && !!$GOPS.f; var QObject = global.QObject; var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild; var setSymbolDesc = DESCRIPTORS && $fails(function () { @@ -4992,11 +4902,11 @@ if (!USE_NATIVE) { }); $GOPD.f = $getOwnPropertyDescriptor; $DP.f = $defineProperty; - __w_pdfjs_require__(132).f = gOPNExt.f = $getOwnPropertyNames; - __w_pdfjs_require__(73).f = $propertyIsEnumerable; - __w_pdfjs_require__(72).f = $getOwnPropertySymbols; + __w_pdfjs_require__(133).f = gOPNExt.f = $getOwnPropertyNames; + __w_pdfjs_require__(74).f = $propertyIsEnumerable; + $GOPS.f = $getOwnPropertySymbols; - if (DESCRIPTORS && !__w_pdfjs_require__(32)) { + if (DESCRIPTORS && !__w_pdfjs_require__(25)) { redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true); } @@ -5043,6 +4953,14 @@ $export($export.S + $export.F * !USE_NATIVE, 'Object', { getOwnPropertyNames: $getOwnPropertyNames, getOwnPropertySymbols: $getOwnPropertySymbols }); +var FAILS_ON_PRIMITIVES = $fails(function () { + $GOPS.f(1); +}); +$export($export.S + $export.F * FAILS_ON_PRIMITIVES, 'Object', { + getOwnPropertySymbols: function getOwnPropertySymbols(it) { + return $GOPS.f(toObject(it)); + } +}); $JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () { var S = $Symbol(); return _stringify([S]) != '[null]' || _stringify({ @@ -5074,16 +4992,16 @@ setToStringTag(Math, 'Math', true); setToStringTag(global.JSON, 'JSON', true); /***/ }), -/* 128 */ +/* 129 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -exports.f = __w_pdfjs_require__(30); +exports.f = __w_pdfjs_require__(33); /***/ }), -/* 129 */ +/* 130 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -5093,9 +5011,9 @@ var global = __w_pdfjs_require__(8); var core = __w_pdfjs_require__(9); -var LIBRARY = __w_pdfjs_require__(32); +var LIBRARY = __w_pdfjs_require__(25); -var wksExt = __w_pdfjs_require__(128); +var wksExt = __w_pdfjs_require__(129); var defineProperty = __w_pdfjs_require__(11).f; @@ -5107,17 +5025,17 @@ module.exports = function (name) { }; /***/ }), -/* 130 */ +/* 131 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var getKeys = __w_pdfjs_require__(54); +var getKeys = __w_pdfjs_require__(55); -var gOPS = __w_pdfjs_require__(72); +var gOPS = __w_pdfjs_require__(73); -var pIE = __w_pdfjs_require__(73); +var pIE = __w_pdfjs_require__(74); module.exports = function (it) { var result = getKeys(it); @@ -5138,7 +5056,7 @@ module.exports = function (it) { }; /***/ }), -/* 131 */ +/* 132 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -5146,9 +5064,9 @@ module.exports = function (it) { function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } -var toIObject = __w_pdfjs_require__(42); +var toIObject = __w_pdfjs_require__(43); -var gOPN = __w_pdfjs_require__(132).f; +var gOPN = __w_pdfjs_require__(133).f; var toString = {}.toString; var windowNames = (typeof window === "undefined" ? "undefined" : _typeof(window)) == 'object' && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : []; @@ -5166,33 +5084,33 @@ module.exports.f = function getOwnPropertyNames(it) { }; /***/ }), -/* 132 */ +/* 133 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var $keys = __w_pdfjs_require__(55); +var $keys = __w_pdfjs_require__(56); -var hiddenKeys = __w_pdfjs_require__(57).concat('length', 'prototype'); +var hiddenKeys = __w_pdfjs_require__(58).concat('length', 'prototype'); exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { return $keys(O, hiddenKeys); }; /***/ }), -/* 133 */ +/* 134 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -__w_pdfjs_require__(134); +__w_pdfjs_require__(135); module.exports = __w_pdfjs_require__(9).String.padStart; /***/ }), -/* 134 */ +/* 135 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -5200,28 +5118,29 @@ module.exports = __w_pdfjs_require__(9).String.padStart; var $export = __w_pdfjs_require__(7); -var $pad = __w_pdfjs_require__(135); +var $pad = __w_pdfjs_require__(136); -var userAgent = __w_pdfjs_require__(95); +var userAgent = __w_pdfjs_require__(96); -$export($export.P + $export.F * /Version\/10\.\d+(\.\d+)? Safari\//.test(userAgent), 'String', { +var WEBKIT_BUG = /Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(userAgent); +$export($export.P + $export.F * WEBKIT_BUG, 'String', { padStart: function padStart(maxLength) { return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true); } }); /***/ }), -/* 135 */ +/* 136 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var toLength = __w_pdfjs_require__(25); +var toLength = __w_pdfjs_require__(28); -var repeat = __w_pdfjs_require__(136); +var repeat = __w_pdfjs_require__(137); -var defined = __w_pdfjs_require__(33); +var defined = __w_pdfjs_require__(34); module.exports = function (that, maxLength, fillString, left) { var S = String(defined(that)); @@ -5236,15 +5155,15 @@ module.exports = function (that, maxLength, fillString, left) { }; /***/ }), -/* 136 */ +/* 137 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var toInteger = __w_pdfjs_require__(26); +var toInteger = __w_pdfjs_require__(29); -var defined = __w_pdfjs_require__(33); +var defined = __w_pdfjs_require__(34); module.exports = function repeat(count) { var str = String(defined(this)); @@ -5260,18 +5179,18 @@ module.exports = function repeat(count) { }; /***/ }), -/* 137 */ +/* 138 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -__w_pdfjs_require__(138); +__w_pdfjs_require__(139); module.exports = __w_pdfjs_require__(9).String.padEnd; /***/ }), -/* 138 */ +/* 139 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -5279,29 +5198,30 @@ module.exports = __w_pdfjs_require__(9).String.padEnd; var $export = __w_pdfjs_require__(7); -var $pad = __w_pdfjs_require__(135); +var $pad = __w_pdfjs_require__(136); -var userAgent = __w_pdfjs_require__(95); +var userAgent = __w_pdfjs_require__(96); -$export($export.P + $export.F * /Version\/10\.\d+(\.\d+)? Safari\//.test(userAgent), 'String', { +var WEBKIT_BUG = /Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(userAgent); +$export($export.P + $export.F * WEBKIT_BUG, 'String', { padEnd: function padEnd(maxLength) { return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false); } }); /***/ }), -/* 139 */ +/* 140 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -__w_pdfjs_require__(140); +__w_pdfjs_require__(141); module.exports = __w_pdfjs_require__(9).Object.values; /***/ }), -/* 140 */ +/* 141 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -5309,7 +5229,7 @@ module.exports = __w_pdfjs_require__(9).Object.values; var $export = __w_pdfjs_require__(7); -var $values = __w_pdfjs_require__(141)(false); +var $values = __w_pdfjs_require__(142)(false); $export($export.S, 'Object', { values: function values(it) { @@ -5318,17 +5238,19 @@ $export($export.S, 'Object', { }); /***/ }), -/* 141 */ +/* 142 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var getKeys = __w_pdfjs_require__(54); +var DESCRIPTORS = __w_pdfjs_require__(15); + +var getKeys = __w_pdfjs_require__(55); -var toIObject = __w_pdfjs_require__(42); +var toIObject = __w_pdfjs_require__(43); -var isEnum = __w_pdfjs_require__(73).f; +var isEnum = __w_pdfjs_require__(74).f; module.exports = function (isEntries) { return function (it) { @@ -5340,7 +5262,9 @@ module.exports = function (isEntries) { var key; while (length > i) { - if (isEnum.call(O, key = keys[i++])) { + key = keys[i++]; + + if (!DESCRIPTORS || isEnum.call(O, key)) { result.push(isEntries ? [key, O[key]] : O[key]); } } @@ -5350,7 +5274,7 @@ module.exports = function (isEntries) { }; /***/ }), -/* 142 */ +/* 143 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -5373,12 +5297,12 @@ module.exports = function (isEntries) { if (isReadableStreamSupported) { exports.ReadableStream = ReadableStream; } else { - exports.ReadableStream = __w_pdfjs_require__(143).ReadableStream; + exports.ReadableStream = __w_pdfjs_require__(144).ReadableStream; } } /***/ }), -/* 143 */ +/* 144 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -6015,7 +5939,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera if (writer !== undefined) { defaultWriterClosedPromiseReject(writer, stream._storedError); - writer._closedPromise.catch(function () {}); + writer._closedPromise["catch"](function () {}); } } @@ -6063,7 +5987,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera } else if (state === 'erroring') { defaultWriterReadyPromiseInitializeAsRejected(this, stream._storedError); - this._readyPromise.catch(function () {}); + this._readyPromise["catch"](function () {}); defaultWriterClosedPromiseInitialize(this); } else if (state === 'closed') { @@ -6074,11 +5998,11 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera var storedError = stream._storedError; defaultWriterReadyPromiseInitializeAsRejected(this, storedError); - this._readyPromise.catch(function () {}); + this._readyPromise["catch"](function () {}); defaultWriterClosedPromiseInitializeAsRejected(this, storedError); - this._closedPromise.catch(function () {}); + this._closedPromise["catch"](function () {}); } } @@ -6248,7 +6172,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera defaultWriterClosedPromiseResetToRejected(writer, error); } - writer._closedPromise.catch(function () {}); + writer._closedPromise["catch"](function () {}); } function WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, error) { @@ -6258,7 +6182,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera defaultWriterReadyPromiseResetToRejected(writer, error); } - writer._readyPromise.catch(function () {}); + writer._readyPromise["catch"](function () {}); } function WritableStreamDefaultWriterGetDesiredSize(writer) { @@ -6382,7 +6306,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera assert(stream._state === 'writable' || stream._state === 'erroring'); _this._started = true; WritableStreamDealWithRejection(stream, r); - }).catch(rethrowAssertionErrorRejection); + })["catch"](rethrowAssertionErrorRejection); } }]); @@ -6498,7 +6422,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera WritableStreamFinishInFlightClose(stream); }, function (reason) { WritableStreamFinishInFlightCloseWithError(stream, reason); - }).catch(rethrowAssertionErrorRejection); + })["catch"](rethrowAssertionErrorRejection); } function WritableStreamDefaultControllerProcessWrite(controller, chunk) { @@ -6519,7 +6443,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); }, function (reason) { WritableStreamFinishInFlightWriteWithError(stream, reason); - }).catch(rethrowAssertionErrorRejection); + })["catch"](rethrowAssertionErrorRejection); } function WritableStreamDefaultControllerGetBackpressure(controller) { @@ -6902,7 +6826,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera return; } - currentWrite = WritableStreamDefaultWriterWrite(writer, value).catch(function () {}); + currentWrite = WritableStreamDefaultWriterWrite(writer, value)["catch"](function () {}); }); }).then(pipeLoop); } @@ -6947,7 +6871,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera } } - pipeLoop().catch(function (err) { + pipeLoop()["catch"](function (err) { currentWrite = Promise.resolve(); rethrowAssertionErrorRejection(err); }); @@ -6963,7 +6887,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera if (stream._state === 'errored') { action(stream._storedError); } else { - promise.catch(action).catch(rethrowAssertionErrorRejection); + promise["catch"](action)["catch"](rethrowAssertionErrorRejection); } } @@ -6971,7 +6895,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera if (stream._state === 'closed') { action(); } else { - promise.then(action).catch(rethrowAssertionErrorRejection); + promise.then(action)["catch"](rethrowAssertionErrorRejection); } } @@ -6993,7 +6917,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera return finalize(originalIsError, originalError); }, function (newError) { return finalize(true, newError); - }).catch(rethrowAssertionErrorRejection); + })["catch"](rethrowAssertionErrorRejection); } } @@ -7007,7 +6931,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) { waitForWritesToFinish().then(function () { return finalize(isError, error); - }).catch(rethrowAssertionErrorRejection); + })["catch"](rethrowAssertionErrorRejection); } else { finalize(isError, error); } @@ -7128,7 +7052,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera pull._branch1 = branch1Stream._readableStreamController; pull._branch2 = branch2Stream._readableStreamController; - reader._closedPromise.catch(function (r) { + reader._closedPromise["catch"](function (r) { if (teeState.closedOrErrored === true) { return; } @@ -7329,7 +7253,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera defaultReaderClosedPromiseReject(reader, e); - reader._closedPromise.catch(function () {}); + reader._closedPromise["catch"](function () {}); } function ReadableStreamFulfillReadIntoRequest(stream, chunk, done) { @@ -7580,7 +7504,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera assert(stream._state === 'errored', 'state must be errored'); defaultReaderClosedPromiseInitializeAsRejected(reader, stream._storedError); - reader._closedPromise.catch(function () {}); + reader._closedPromise["catch"](function () {}); } } @@ -7600,7 +7524,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera defaultReaderClosedPromiseResetToRejected(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\'s closedness')); } - reader._closedPromise.catch(function () {}); + reader._closedPromise["catch"](function () {}); reader._ownerReadableStream._reader = undefined; reader._ownerReadableStream = undefined; @@ -7668,7 +7592,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera ReadableStreamDefaultControllerCallPullIfNeeded(controller); }, function (r) { ReadableStreamDefaultControllerErrorIfNeeded(controller, r); - }).catch(rethrowAssertionErrorRejection); + })["catch"](rethrowAssertionErrorRejection); } _createClass(ReadableStreamDefaultController, [{ @@ -7803,7 +7727,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera return undefined; }, function (e) { ReadableStreamDefaultControllerErrorIfNeeded(controller, e); - }).catch(rethrowAssertionErrorRejection); + })["catch"](rethrowAssertionErrorRejection); return undefined; } @@ -7998,7 +7922,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera if (stream._state === 'readable') { ReadableByteStreamControllerError(controller, r); } - }).catch(rethrowAssertionErrorRejection); + })["catch"](rethrowAssertionErrorRejection); } _createClass(ReadableByteStreamController, [{ @@ -8200,7 +8124,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera if (controller._controlledReadableStream._state === 'readable') { ReadableByteStreamControllerError(controller, e); } - }).catch(rethrowAssertionErrorRejection); + })["catch"](rethrowAssertionErrorRejection); return undefined; } @@ -8931,7 +8855,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera } return Promise.resolve(); - }).catch(function (r) { + })["catch"](function (r) { TransformStreamErrorIfNeeded(transformStream, r); return Promise.reject(transformStream._storedError); }); @@ -9080,7 +9004,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera var transformStream = this; var startResult = InvokeOrNoop(transformer, 'start', [transformStream._transformStreamController]); startPromise_resolve(startResult); - startPromise.catch(function (e) { + startPromise["catch"](function (e) { if (transformStream._errored === false) { transformStream._errored = true; transformStream._storedError = e; @@ -9127,7 +9051,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera }])); /***/ }), -/* 144 */ +/* 145 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -9149,7 +9073,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat if (isURLSupported) { exports.URL = URL; } else { - var PolyfillURL = __w_pdfjs_require__(145).URL; + var PolyfillURL = __w_pdfjs_require__(146).URL; var OriginalURL = __w_pdfjs_require__(3).URL; @@ -9168,7 +9092,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat } /***/ }), -/* 145 */ +/* 146 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -9838,7 +9762,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat })(); /***/ }), -/* 146 */ +/* 147 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -9851,11 +9775,11 @@ exports.getDocument = getDocument; exports.setPDFNetworkStreamFactory = setPDFNetworkStreamFactory; exports.build = exports.version = exports.PDFPageProxy = exports.PDFDocumentProxy = exports.PDFWorker = exports.PDFDataRangeTransport = exports.LoopbackPort = void 0; -var _regenerator = _interopRequireDefault(__w_pdfjs_require__(147)); +var _regenerator = _interopRequireDefault(__w_pdfjs_require__(148)); var _util = __w_pdfjs_require__(1); -var _dom_utils = __w_pdfjs_require__(151); +var _display_utils = __w_pdfjs_require__(151); var _font_loader = __w_pdfjs_require__(152); @@ -10029,7 +9953,7 @@ function getDocument(src) { } params.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE; - params.CMapReaderFactory = params.CMapReaderFactory || _dom_utils.DOMCMapReaderFactory; + params.CMapReaderFactory = params.CMapReaderFactory || _display_utils.DOMCMapReaderFactory; params.ignoreErrors = params.stopAtErrors !== true; params.pdfBug = params.pdfBug === true; var NativeImageDecoderValues = Object.values(_util.NativeImageDecoding); @@ -10095,6 +10019,7 @@ function getDocument(src) { networkStream = new _transport_stream.PDFDataTransportStream({ length: params.length, initialData: params.initialData, + progressiveDone: params.progressiveDone, disableRange: params.disableRange, disableStream: params.disableStream }, rangeTransport); @@ -10116,7 +10041,7 @@ function getDocument(src) { task._transport = transport; messageHandler.send('Ready', null); }); - }).catch(task._capability.reject); + })["catch"](task._capability.reject); return task; } @@ -10128,11 +10053,12 @@ function _fetchDocument(worker, source, pdfDataRangeTransport, docId) { if (pdfDataRangeTransport) { source.length = pdfDataRangeTransport.length; source.initialData = pdfDataRangeTransport.initialData; + source.progressiveDone = pdfDataRangeTransport.progressiveDone; } return worker.messageHandler.sendWithPromise('GetDocRequest', { docId: docId, - apiVersion: '2.1.266', + apiVersion: '2.2.228', source: { data: source.data, url: source.url, @@ -10197,7 +10123,7 @@ var PDFDocumentLoadingTask = function PDFDocumentLoadingTaskClosure() { }, { key: "then", value: function then(onFulfilled, onRejected) { - (0, _util.deprecated)('PDFDocumentLoadingTask.then method, ' + 'use the `promise` getter instead.'); + (0, _display_utils.deprecated)('PDFDocumentLoadingTask.then method, ' + 'use the `promise` getter instead.'); return this.promise.then.apply(this.promise, arguments); } }, { @@ -10217,13 +10143,17 @@ var PDFDataRangeTransport = /*#__PURE__*/ function () { function PDFDataRangeTransport(length, initialData) { + var progressiveDone = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + _classCallCheck(this, PDFDataRangeTransport); this.length = length; this.initialData = initialData; + this.progressiveDone = progressiveDone; this._rangeListeners = []; this._progressListeners = []; this._progressiveReadListeners = []; + this._progressiveDoneListeners = []; this._readyCapability = (0, _util.createPromiseCapability)(); } @@ -10242,6 +10172,11 @@ function () { value: function addProgressiveReadListener(listener) { this._progressiveReadListeners.push(listener); } + }, { + key: "addProgressiveDoneListener", + value: function addProgressiveDoneListener(listener) { + this._progressiveDoneListeners.push(listener); + } }, { key: "onDataRange", value: function onDataRange(begin, chunk) { @@ -10259,8 +10194,8 @@ function () { _iteratorError = err; } finally { try { - if (!_iteratorNormalCompletion && _iterator.return != null) { - _iterator.return(); + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); } } finally { if (_didIteratorError) { @@ -10271,7 +10206,7 @@ function () { } }, { key: "onDataProgress", - value: function onDataProgress(loaded) { + value: function onDataProgress(loaded, total) { var _this2 = this; this._readyCapability.promise.then(function () { @@ -10282,15 +10217,15 @@ function () { try { for (var _iterator2 = _this2._progressListeners[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var listener = _step2.value; - listener(loaded); + listener(loaded, total); } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { - if (!_iteratorNormalCompletion2 && _iterator2.return != null) { - _iterator2.return(); + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); } } finally { if (_didIteratorError2) { @@ -10320,8 +10255,8 @@ function () { _iteratorError3 = err; } finally { try { - if (!_iteratorNormalCompletion3 && _iterator3.return != null) { - _iterator3.return(); + if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) { + _iterator3["return"](); } } finally { if (_didIteratorError3) { @@ -10331,6 +10266,37 @@ function () { } }); } + }, { + key: "onDataProgressiveDone", + value: function onDataProgressiveDone() { + var _this4 = this; + + this._readyCapability.promise.then(function () { + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; + + try { + for (var _iterator4 = _this4._progressiveDoneListeners[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var listener = _step4.value; + listener(); + } + } catch (err) { + _didIteratorError4 = true; + _iteratorError4 = err; + } finally { + try { + if (!_iteratorNormalCompletion4 && _iterator4["return"] != null) { + _iterator4["return"](); + } + } finally { + if (_didIteratorError4) { + throw _iteratorError4; + } + } + } + }); + } }, { key: "transportReady", value: function transportReady() { @@ -10354,10 +10320,9 @@ exports.PDFDataRangeTransport = PDFDataRangeTransport; var PDFDocumentProxy = /*#__PURE__*/ function () { - function PDFDocumentProxy(pdfInfo, transport, loadingTask) { + function PDFDocumentProxy(pdfInfo, transport) { _classCallCheck(this, PDFDocumentProxy); - this.loadingTask = loadingTask; this._pdfInfo = pdfInfo; this._transport = transport; } @@ -10387,11 +10352,21 @@ function () { value: function getPageLabels() { return this._transport.getPageLabels(); } + }, { + key: "getPageLayout", + value: function getPageLayout() { + return this._transport.getPageLayout(); + } }, { key: "getPageMode", value: function getPageMode() { return this._transport.getPageMode(); } + }, { + key: "getViewerPreferences", + value: function getViewerPreferences() { + return this._transport.getViewerPreferences(); + } }, { key: "getOpenActionDestination", value: function getOpenActionDestination() { @@ -10462,6 +10437,11 @@ function () { get: function get() { return this._transport.loadingParams; } + }, { + key: "loadingTask", + get: function get() { + return this._transport.loadingTask; + } }]); return PDFDocumentProxy; @@ -10480,7 +10460,7 @@ function () { this.pageIndex = pageIndex; this._pageInfo = pageInfo; this._transport = transport; - this._stats = pdfBug ? new _dom_utils.StatTimer() : _dom_utils.DummyStatTimer; + this._stats = pdfBug ? new _display_utils.StatTimer() : _display_utils.DummyStatTimer; this._pdfBug = pdfBug; this.commonObjs = transport.commonObjs; this.objs = new PDFObjects(); @@ -10501,13 +10481,13 @@ function () { dontFlip = _ref$dontFlip === void 0 ? false : _ref$dontFlip; if (arguments.length > 1 || typeof arguments[0] === 'number') { - (0, _util.deprecated)('getViewport is called with obsolete arguments.'); + (0, _display_utils.deprecated)('getViewport is called with obsolete arguments.'); scale = arguments[0]; rotation = typeof arguments[1] === 'number' ? arguments[1] : this.rotate; dontFlip = typeof arguments[2] === 'boolean' ? arguments[2] : false; } - return new _dom_utils.PageViewport({ + return new _display_utils.PageViewport({ viewBox: this.view, scale: scale, rotation: rotation, @@ -10531,7 +10511,7 @@ function () { }, { key: "render", value: function render(_ref3) { - var _this4 = this; + var _this5 = this; var canvasContext = _ref3.canvasContext, viewport = _ref3.viewport, @@ -10553,7 +10533,7 @@ function () { stats.time('Overall'); this.pendingCleanup = false; var renderingIntent = intent === 'print' ? 'print' : 'display'; - var canvasFactoryInstance = canvasFactory || new _dom_utils.DOMCanvasFactory(); + var canvasFactoryInstance = canvasFactory || new _display_utils.DOMCanvasFactory(); var webGLContext = new _webgl.WebGLContext({ enable: enableWebGL }); @@ -10588,11 +10568,11 @@ function () { intentState.renderTasks.splice(i, 1); } - if (_this4.cleanupAfterRender) { - _this4.pendingCleanup = true; + if (_this5.cleanupAfterRender || renderingIntent === 'print') { + _this5.pendingCleanup = true; } - _this4._tryCleanup(); + _this5._tryCleanup(); if (error) { internalRenderTask.capability.reject(error); @@ -10630,7 +10610,7 @@ function () { intentState.renderTasks.push(internalRenderTask); var renderTask = internalRenderTask.task; intentState.displayReadyCapability.promise.then(function (transparency) { - if (_this4.pendingCleanup) { + if (_this5.pendingCleanup) { complete(); return; } @@ -10638,7 +10618,7 @@ function () { stats.time('Rendering'); internalRenderTask.initializeGraphics(transparency); internalRenderTask.operatorListChanged(); - }).catch(complete); + })["catch"](complete); return renderTask; } }, { @@ -10755,7 +10735,7 @@ function () { var intentState = this.intentStates[intent]; intentState.renderTasks.forEach(function (renderTask) { - var renderCompleted = renderTask.capability.promise.catch(function () {}); + var renderCompleted = renderTask.capability.promise["catch"](function () {}); waitOn.push(renderCompleted); renderTask.cancel(); }); @@ -10791,8 +10771,8 @@ function () { this.objs.clear(); this.annotationsPromise = null; - if (resetStats && this._stats instanceof _dom_utils.StatTimer) { - this._stats = new _dom_utils.StatTimer(); + if (resetStats && this._stats instanceof _display_utils.StatTimer) { + this._stats = new _display_utils.StatTimer(); } this.pendingCleanup = false; @@ -10856,7 +10836,7 @@ function () { }, { key: "stats", get: function get() { - return this._stats instanceof _dom_utils.StatTimer ? this._stats : null; + return this._stats instanceof _display_utils.StatTimer ? this._stats : null; } }]); @@ -10881,7 +10861,7 @@ function () { _createClass(LoopbackPort, [{ key: "postMessage", value: function postMessage(obj, transfers) { - var _this5 = this; + var _this6 = this; function cloneValue(value) { if (_typeof(value) !== 'object' || value === null) { @@ -10946,9 +10926,9 @@ function () { }; this._deferred.then(function () { - _this5._listeners.forEach(function (listener) { + _this6._listeners.forEach(function (listener) { listener.call(this, e); - }, _this5); + }, _this6); }); } }, { @@ -10966,7 +10946,7 @@ function () { }, { key: "terminate", value: function terminate() { - this._listeners = []; + this._listeners.length = 0; } }]); @@ -11016,7 +10996,7 @@ var PDFWorker = function PDFWorkerClosure() { } var loader = fakeWorkerFilesLoader || function () { - return (0, _dom_utils.loadScript)(_getWorkerSrc()).then(function () { + return (0, _display_utils.loadScript)(_getWorkerSrc()).then(function () { return window.pdfjsWorker.WorkerMessageHandler; }); }; @@ -11083,7 +11063,7 @@ var PDFWorker = function PDFWorkerClosure() { }, { key: "_initialize", value: function _initialize() { - var _this6 = this; + var _this7 = this; if (typeof Worker !== 'undefined' && !isWorkerDisabled && !getMainThreadWorkerMessageHandler()) { var workerSrc = _getWorkerSrc(); @@ -11101,15 +11081,15 @@ var PDFWorker = function PDFWorkerClosure() { messageHandler.destroy(); worker.terminate(); - if (_this6.destroyed) { - _this6._readyCapability.reject(new Error('Worker was destroyed')); + if (_this7.destroyed) { + _this7._readyCapability.reject(new Error('Worker was destroyed')); } else { - _this6._setupFakeWorker(); + _this7._setupFakeWorker(); } }; var onWorkerError = function onWorkerError() { - if (!_this6._webWorker) { + if (!_this7._webWorker) { terminateEarly(); } }; @@ -11118,27 +11098,27 @@ var PDFWorker = function PDFWorkerClosure() { messageHandler.on('test', function (data) { worker.removeEventListener('error', onWorkerError); - if (_this6.destroyed) { + if (_this7.destroyed) { terminateEarly(); return; } if (data && data.supportTypedArray) { - _this6._messageHandler = messageHandler; - _this6._port = worker; - _this6._webWorker = worker; + _this7._messageHandler = messageHandler; + _this7._port = worker; + _this7._webWorker = worker; if (!data.supportTransfers) { - _this6.postMessageTransfers = false; + _this7.postMessageTransfers = false; } - _this6._readyCapability.resolve(); + _this7._readyCapability.resolve(); messageHandler.send('configure', { - verbosity: _this6.verbosity + verbosity: _this7.verbosity }); } else { - _this6._setupFakeWorker(); + _this7._setupFakeWorker(); messageHandler.destroy(); worker.terminate(); @@ -11147,7 +11127,7 @@ var PDFWorker = function PDFWorkerClosure() { messageHandler.on('ready', function (data) { worker.removeEventListener('error', onWorkerError); - if (_this6.destroyed) { + if (_this7.destroyed) { terminateEarly(); return; } @@ -11155,12 +11135,12 @@ var PDFWorker = function PDFWorkerClosure() { try { sendTest(); } catch (e) { - _this6._setupFakeWorker(); + _this7._setupFakeWorker(); } }); var sendTest = function sendTest() { - var testObj = new Uint8Array([_this6.postMessageTransfers ? 255 : 0]); + var testObj = new Uint8Array([_this7.postMessageTransfers ? 255 : 0]); try { messageHandler.send('test', testObj, [testObj.buffer]); @@ -11183,7 +11163,7 @@ var PDFWorker = function PDFWorkerClosure() { }, { key: "_setupFakeWorker", value: function _setupFakeWorker() { - var _this7 = this; + var _this8 = this; if (!isWorkerDisabled) { (0, _util.warn)('Setting up fake worker.'); @@ -11191,23 +11171,23 @@ var PDFWorker = function PDFWorkerClosure() { } setupFakeWorkerGlobal().then(function (WorkerMessageHandler) { - if (_this7.destroyed) { - _this7._readyCapability.reject(new Error('Worker was destroyed')); + if (_this8.destroyed) { + _this8._readyCapability.reject(new Error('Worker was destroyed')); return; } var port = new LoopbackPort(); - _this7._port = port; + _this8._port = port; var id = 'fake' + nextFakeWorkerId++; var workerHandler = new _message_handler.MessageHandler(id + '_worker', id, port); WorkerMessageHandler.setup(workerHandler, port); var messageHandler = new _message_handler.MessageHandler(id, id + '_worker', port); - _this7._messageHandler = messageHandler; + _this8._messageHandler = messageHandler; - _this7._readyCapability.resolve(); - }).catch(function (reason) { - _this7._readyCapability.reject(new Error("Setting up fake worker failed: \"".concat(reason.message, "\"."))); + _this8._readyCapability.resolve(); + })["catch"](function (reason) { + _this8._readyCapability.reject(new Error("Setting up fake worker failed: \"".concat(reason.message, "\"."))); }); } }, { @@ -11221,7 +11201,7 @@ var PDFWorker = function PDFWorkerClosure() { this._webWorker = null; } - pdfWorkerPorts.delete(this._port); + pdfWorkerPorts["delete"](this._port); this._port = null; if (this._messageHandler) { @@ -11306,7 +11286,7 @@ function () { _createClass(WorkerTransport, [{ key: "destroy", value: function destroy() { - var _this8 = this; + var _this9 = this; if (this.destroyCapability) { return this.destroyCapability.promise; @@ -11325,24 +11305,24 @@ function () { waitOn.push(page._destroy()); } }); - this.pageCache = []; - this.pagePromises = []; + this.pageCache.length = 0; + this.pagePromises.length = 0; var terminated = this.messageHandler.sendWithPromise('Terminate', null); waitOn.push(terminated); Promise.all(waitOn).then(function () { - _this8.fontLoader.clear(); + _this9.fontLoader.clear(); - if (_this8._networkStream) { - _this8._networkStream.cancelAllRequests(); + if (_this9._networkStream) { + _this9._networkStream.cancelAllRequests(); } - if (_this8.messageHandler) { - _this8.messageHandler.destroy(); + if (_this9.messageHandler) { + _this9.messageHandler.destroy(); - _this8.messageHandler = null; + _this9.messageHandler = null; } - _this8.destroyCapability.resolve(); + _this9.destroyCapability.resolve(); }, this.destroyCapability.reject); return this.destroyCapability.promise; } @@ -11352,20 +11332,20 @@ function () { var messageHandler = this.messageHandler, loadingTask = this.loadingTask; messageHandler.on('GetReader', function (data, sink) { - var _this9 = this; + var _this10 = this; (0, _util.assert)(this._networkStream); this._fullReader = this._networkStream.getFullReader(); this._fullReader.onProgress = function (evt) { - _this9._lastProgress = { + _this10._lastProgress = { loaded: evt.loaded, total: evt.total }; }; sink.onPull = function () { - _this9._fullReader.read().then(function (_ref7) { + _this10._fullReader.read().then(function (_ref7) { var value = _ref7.value, done = _ref7.done; @@ -11376,24 +11356,24 @@ function () { (0, _util.assert)((0, _util.isArrayBuffer)(value)); sink.enqueue(new Uint8Array(value), 1, [value]); - }).catch(function (reason) { + })["catch"](function (reason) { sink.error(reason); }); }; sink.onCancel = function (reason) { - _this9._fullReader.cancel(reason); + _this10._fullReader.cancel(reason); }; }, this); messageHandler.on('ReaderHeadersReady', function (data) { - var _this10 = this; + var _this11 = this; var headersCapability = (0, _util.createPromiseCapability)(); var fullReader = this._fullReader; fullReader.headersReady.then(function () { if (!fullReader.isStreamingSupported || !fullReader.isRangeSupported) { - if (_this10._lastProgress && loadingTask.onProgress) { - loadingTask.onProgress(_this10._lastProgress); + if (_this11._lastProgress && loadingTask.onProgress) { + loadingTask.onProgress(_this11._lastProgress); } fullReader.onProgress = function (evt) { @@ -11419,6 +11399,11 @@ function () { var rangeReader = this._networkStream.getRangeReader(data.begin, data.end); + if (!rangeReader) { + sink.close(); + return; + } + sink.onPull = function () { rangeReader.read().then(function (_ref8) { var value = _ref8.value, @@ -11431,7 +11416,7 @@ function () { (0, _util.assert)((0, _util.isArrayBuffer)(value)); sink.enqueue(new Uint8Array(value), 1, [value]); - }).catch(function (reason) { + })["catch"](function (reason) { sink.error(reason); }); }; @@ -11442,19 +11427,18 @@ function () { }, this); messageHandler.on('GetDoc', function (_ref9) { var pdfInfo = _ref9.pdfInfo; - this.numPages = pdfInfo.numPages; - this.pdfDocument = new PDFDocumentProxy(pdfInfo, this, loadingTask); + this._numPages = pdfInfo.numPages; - loadingTask._capability.resolve(this.pdfDocument); + loadingTask._capability.resolve(new PDFDocumentProxy(pdfInfo, this)); }, this); messageHandler.on('PasswordRequest', function (exception) { - var _this11 = this; + var _this12 = this; this._passwordCapability = (0, _util.createPromiseCapability)(); if (loadingTask.onPassword) { var updatePassword = function updatePassword(password) { - _this11._passwordCapability.resolve({ + _this12._passwordCapability.resolve({ password: password }); }; @@ -11516,7 +11500,7 @@ function () { page._renderPageChunk(data.operatorList, data.intent); }, this); messageHandler.on('commonobj', function (data) { - var _this12 = this; + var _this13 = this; if (this.destroyed) { return; @@ -11544,10 +11528,10 @@ function () { var fontRegistry = null; - if (params.pdfBug && _global_scope.default.FontInspector && _global_scope.default.FontInspector.enabled) { + if (params.pdfBug && _global_scope["default"].FontInspector && _global_scope["default"].FontInspector.enabled) { fontRegistry = { registerFont: function registerFont(font, url) { - _global_scope.default['FontInspector'].fontAdded(font, url); + _global_scope["default"]['FontInspector'].fontAdded(font, url); } }; } @@ -11560,17 +11544,18 @@ function () { fontRegistry: fontRegistry }); this.fontLoader.bind(font).then(function () { - _this12.commonObjs.resolve(id, font); + _this13.commonObjs.resolve(id, font); }, function (reason) { messageHandler.sendWithPromise('FontFallback', { id: id - }).finally(function () { - _this12.commonObjs.resolve(id, font); + })["finally"](function () { + _this13.commonObjs.resolve(id, font); }); }); break; case 'FontPath': + case 'FontType3Res': this.commonObjs.resolve(id, exportedData); break; @@ -11580,7 +11565,7 @@ function () { }, this); messageHandler.on('obj', function (data) { if (this.destroyed) { - return; + return undefined; } var _data2 = _slicedToArray(data, 4), @@ -11592,7 +11577,7 @@ function () { var pageProxy = this.pageCache[pageIndex]; if (pageProxy.objs.has(id)) { - return; + return undefined; } switch (type) { @@ -11606,6 +11591,7 @@ function () { img.onerror = function () { reject(new Error('Error during JPEG image loading')); + (0, _display_utils.releaseImageResources)(img); }; img.src = imageData; @@ -11626,6 +11612,8 @@ function () { default: throw new Error("Got unknown object type ".concat(type)); } + + return undefined; }, this); messageHandler.on('DocProgress', function (data) { if (this.destroyed) { @@ -11644,11 +11632,11 @@ function () { return; } - var page = this.pageCache[data.pageNum - 1]; + var page = this.pageCache[data.pageIndex]; var intentState = page.intentStates[data.intent]; if (intentState.displayReadyCapability) { - intentState.displayReadyCapability.reject(data.error); + intentState.displayReadyCapability.reject(new Error(data.error)); } else { throw new Error(data.error); } @@ -11683,8 +11671,8 @@ function () { var img = new Image(); img.onload = function () { - var width = img.width; - var height = img.height; + var width = img.width, + height = img.height; var size = width * height; var rgbaLength = size * 4; var buf = new Uint8ClampedArray(size * components); @@ -11712,10 +11700,16 @@ function () { width: width, height: height }); + (0, _display_utils.releaseImageResources)(img); + tmpCanvas.width = 0; + tmpCanvas.height = 0; + tmpCanvas = null; + tmpCtx = null; }; img.onerror = function () { reject(new Error('JpegDecode failed to load image')); + (0, _display_utils.releaseImageResources)(img); }; img.src = imageUrl; @@ -11752,9 +11746,9 @@ function () { }, { key: "getPage", value: function getPage(pageNumber) { - var _this13 = this; + var _this14 = this; - if (!Number.isInteger(pageNumber) || pageNumber <= 0 || pageNumber > this.numPages) { + if (!Number.isInteger(pageNumber) || pageNumber <= 0 || pageNumber > this._numPages) { return Promise.reject(new Error('Invalid page request')); } @@ -11767,12 +11761,12 @@ function () { var promise = this.messageHandler.sendWithPromise('GetPage', { pageIndex: pageIndex }).then(function (pageInfo) { - if (_this13.destroyed) { + if (_this14.destroyed) { throw new Error('Transport destroyed'); } - var page = new PDFPageProxy(pageIndex, pageInfo, _this13, _this13._params.pdfBug); - _this13.pageCache[pageIndex] = page; + var page = new PDFPageProxy(pageIndex, pageInfo, _this14, _this14._params.pdfBug); + _this14.pageCache[pageIndex] = page; return page; }); this.pagePromises[pageIndex] = promise; @@ -11783,7 +11777,7 @@ function () { value: function getPageIndex(ref) { return this.messageHandler.sendWithPromise('GetPageIndex', { ref: ref - }).catch(function (reason) { + })["catch"](function (reason) { return Promise.reject(new Error(reason)); }); } @@ -11816,15 +11810,25 @@ function () { value: function getPageLabels() { return this.messageHandler.sendWithPromise('GetPageLabels', null); } + }, { + key: "getPageLayout", + value: function getPageLayout() { + return this.messageHandler.sendWithPromise('GetPageLayout', null); + } }, { key: "getPageMode", value: function getPageMode() { return this.messageHandler.sendWithPromise('GetPageMode', null); } + }, { + key: "getViewerPreferences", + value: function getViewerPreferences() { + return this.messageHandler.sendWithPromise('GetViewerPreferences', null); + } }, { key: "getOpenActionDestination", value: function getOpenActionDestination() { - return this.messageHandler.sendWithPromise('getOpenActionDestination', null); + return this.messageHandler.sendWithPromise('GetOpenActionDestination', null); } }, { key: "getAttachments", @@ -11849,13 +11853,13 @@ function () { }, { key: "getMetadata", value: function getMetadata() { - var _this14 = this; + var _this15 = this; return this.messageHandler.sendWithPromise('GetMetadata', null).then(function (results) { return { info: results[0], metadata: results[1] ? new _metadata.Metadata(results[1]) : null, - contentDispositionFilename: _this14._fullReader ? _this14._fullReader.filename : null + contentDispositionFilename: _this15._fullReader ? _this15._fullReader.filename : null }; }); } @@ -11867,20 +11871,20 @@ function () { }, { key: "startCleanup", value: function startCleanup() { - var _this15 = this; + var _this16 = this; this.messageHandler.sendWithPromise('Cleanup', null).then(function () { - for (var i = 0, ii = _this15.pageCache.length; i < ii; i++) { - var page = _this15.pageCache[i]; + for (var i = 0, ii = _this16.pageCache.length; i < ii; i++) { + var page = _this16.pageCache[i]; if (page) { page.cleanup(); } } - _this15.commonObjs.clear(); + _this16.commonObjs.clear(); - _this15.fontLoader.clear(); + _this16.fontLoader.clear(); }); } }, { @@ -11958,6 +11962,14 @@ function () { }, { key: "clear", value: function clear() { + for (var objId in this._objs) { + var data = this._objs[objId].data; + + if (typeof Image !== 'undefined' && data instanceof Image) { + (0, _display_utils.releaseImageResources)(data); + } + } + this._objs = Object.create(null); } }]); @@ -11983,7 +11995,7 @@ function () { }, { key: "then", value: function then(onFulfilled, onRejected) { - (0, _util.deprecated)('RenderTask.then method, use the `promise` getter instead.'); + (0, _display_utils.deprecated)('RenderTask.then method, use the `promise` getter instead.'); return this.promise.then.apply(this.promise, arguments); } }, { @@ -12058,8 +12070,8 @@ var InternalRenderTask = function InternalRenderTaskClosure() { canvasInRendering.add(this._canvas); } - if (this._pdfBug && _global_scope.default.StepperManager && _global_scope.default.StepperManager.enabled) { - this.stepper = _global_scope.default.StepperManager.create(this.pageNumber - 1); + if (this._pdfBug && _global_scope["default"].StepperManager && _global_scope["default"].StepperManager.enabled) { + this.stepper = _global_scope["default"].StepperManager.create(this.pageNumber - 1); this.stepper.init(this.operatorList); this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint(); } @@ -12096,10 +12108,10 @@ var InternalRenderTask = function InternalRenderTaskClosure() { } if (this._canvas) { - canvasInRendering.delete(this._canvas); + canvasInRendering["delete"](this._canvas); } - this.callback(error || new _dom_utils.RenderingCancelledException("Rendering cancelled, page ".concat(this.pageNumber), 'canvas')); + this.callback(error || new _display_utils.RenderingCancelledException("Rendering cancelled, page ".concat(this.pageNumber), 'canvas')); } }, { key: "operatorListChanged", @@ -12140,14 +12152,14 @@ var InternalRenderTask = function InternalRenderTaskClosure() { }, { key: "_scheduleNext", value: function _scheduleNext() { - var _this16 = this; + var _this17 = this; if (this._useRequestAnimationFrame) { window.requestAnimationFrame(function () { - _this16._nextBound().catch(_this16.cancel.bind(_this16)); + _this17._nextBound()["catch"](_this17.cancel.bind(_this17)); }); } else { - Promise.resolve().then(this._nextBound).catch(this.cancel.bind(this)); + Promise.resolve().then(this._nextBound)["catch"](this.cancel.bind(this)); } } }, { @@ -12155,8 +12167,8 @@ var InternalRenderTask = function InternalRenderTaskClosure() { value: function () { var _next2 = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee() { - return _regenerator.default.wrap(function _callee$(_context) { + _regenerator["default"].mark(function _callee() { + return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: @@ -12177,7 +12189,7 @@ var InternalRenderTask = function InternalRenderTaskClosure() { this.gfx.endDrawing(); if (this._canvas) { - canvasInRendering.delete(this._canvas); + canvasInRendering["delete"](this._canvas); } this.callback(); @@ -12206,20 +12218,11 @@ var InternalRenderTask = function InternalRenderTaskClosure() { return InternalRenderTask; }(); -var version = '2.1.266'; +var version = '2.2.228'; exports.version = version; -var build = '81f5835c'; +var build = 'd7afb74a'; exports.build = build; -/***/ }), -/* 147 */ -/***/ (function(module, exports, __w_pdfjs_require__) { - -"use strict"; - - -module.exports = __w_pdfjs_require__(148); - /***/ }), /* 148 */ /***/ (function(module, exports, __w_pdfjs_require__) { @@ -12227,27 +12230,8 @@ module.exports = __w_pdfjs_require__(148); "use strict"; -function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } - -var g = function () { - return this || (typeof self === "undefined" ? "undefined" : _typeof(self)) === "object" && self; -}() || Function("return this")(); - -var hadRuntime = g.regeneratorRuntime && Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >= 0; -var oldRuntime = hadRuntime && g.regeneratorRuntime; -g.regeneratorRuntime = undefined; module.exports = __w_pdfjs_require__(149); -if (hadRuntime) { - g.regeneratorRuntime = oldRuntime; -} else { - try { - delete g.regeneratorRuntime; - } catch (e) { - g.regeneratorRuntime = undefined; - } -} - /***/ }), /* 149 */ /***/ (function(module, exports, __w_pdfjs_require__) { @@ -12257,7 +12241,7 @@ if (hadRuntime) { function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } -!function (global) { +var runtime = function (exports) { "use strict"; var Op = Object.prototype; @@ -12267,18 +12251,6 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat var iteratorSymbol = $Symbol.iterator || "@@iterator"; var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator"; var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; - var inModule = ( false ? undefined : _typeof(module)) === "object"; - var runtime = global.regeneratorRuntime; - - if (runtime) { - if (inModule) { - module.exports = runtime; - } - - return; - } - - runtime = global.regeneratorRuntime = inModule ? module.exports : {}; function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; @@ -12288,7 +12260,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat return generator; } - runtime.wrap = wrap; + exports.wrap = wrap; function tryCatch(fn, obj, arg) { try { @@ -12342,12 +12314,12 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat }); } - runtime.isGeneratorFunction = function (genFun) { + exports.isGeneratorFunction = function (genFun) { var ctor = typeof genFun === "function" && genFun.constructor; return ctor ? ctor === GeneratorFunction || (ctor.displayName || ctor.name) === "GeneratorFunction" : false; }; - runtime.mark = function (genFun) { + exports.mark = function (genFun) { if (Object.setPrototypeOf) { Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); } else { @@ -12362,7 +12334,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat return genFun; }; - runtime.awrap = function (arg) { + exports.awrap = function (arg) { return { __await: arg }; @@ -12416,11 +12388,11 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat return this; }; - runtime.AsyncIterator = AsyncIterator; + exports.AsyncIterator = AsyncIterator; - runtime.async = function (innerFn, outerFn, self, tryLocsList) { + exports.async = function (innerFn, outerFn, self, tryLocsList) { var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList)); - return runtime.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { + return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }; @@ -12498,7 +12470,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat context.delegate = null; if (context.method === "throw") { - if (delegate.iterator.return) { + if (delegate.iterator["return"]) { context.method = "return"; context.arg = undefined; maybeInvokeDelegate(delegate, context); @@ -12592,7 +12564,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat this.reset(true); } - runtime.keys = function (object) { + exports.keys = function (object) { var keys = []; for (var key in object) { @@ -12653,7 +12625,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat }; } - runtime.values = values; + exports.values = values; function doneResult() { return { @@ -12831,9 +12803,14 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat return ContinueSentinel; } }; -}(function () { - return this || (typeof self === "undefined" ? "undefined" : _typeof(self)) === "object" && self; -}() || Function("return this")()); + return exports; +}(( false ? undefined : _typeof(module)) === "object" ? module.exports : {}); + +try { + regeneratorRuntime = runtime; +} catch (accidentalStrictMode) { + Function("r", "regeneratorRuntime = r")(runtime); +} /* WEBPACK VAR INJECTION */}.call(this, __w_pdfjs_require__(150)(module))) /***/ }), @@ -12879,11 +12856,23 @@ Object.defineProperty(exports, "__esModule", { }); exports.addLinkAttributes = addLinkAttributes; exports.getFilenameFromUrl = getFilenameFromUrl; +exports.isFetchSupported = isFetchSupported; +exports.isValidFetchUrl = isValidFetchUrl; exports.loadScript = loadScript; -exports.DummyStatTimer = exports.StatTimer = exports.DOMSVGFactory = exports.DOMCMapReaderFactory = exports.DOMCanvasFactory = exports.DEFAULT_LINK_REL = exports.LinkTarget = exports.RenderingCancelledException = exports.PageViewport = void 0; +exports.deprecated = deprecated; +exports.releaseImageResources = releaseImageResources; +exports.PDFDateString = exports.DummyStatTimer = exports.StatTimer = exports.DOMSVGFactory = exports.DOMCMapReaderFactory = exports.DOMCanvasFactory = exports.DEFAULT_LINK_REL = exports.LinkTarget = exports.RenderingCancelledException = exports.PageViewport = void 0; + +var _regenerator = _interopRequireDefault(__w_pdfjs_require__(148)); var _util = __w_pdfjs_require__(1); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } @@ -12905,7 +12894,7 @@ function () { key: "create", value: function create(width, height) { if (width <= 0 || height <= 0) { - throw new Error('invalid canvas size'); + throw new Error('Invalid canvas size'); } var canvas = document.createElement('canvas'); @@ -12921,11 +12910,11 @@ function () { key: "reset", value: function reset(canvasAndContext, width, height) { if (!canvasAndContext.canvas) { - throw new Error('canvas is not specified'); + throw new Error('Canvas is not specified'); } if (width <= 0 || height <= 0) { - throw new Error('invalid canvas size'); + throw new Error('Invalid canvas size'); } canvasAndContext.canvas.width = width; @@ -12935,7 +12924,7 @@ function () { key: "destroy", value: function destroy(canvasAndContext) { if (!canvasAndContext.canvas) { - throw new Error('canvas is not specified'); + throw new Error('Canvas is not specified'); } canvasAndContext.canvas.width = 0; @@ -12967,58 +12956,172 @@ function () { _createClass(DOMCMapReaderFactory, [{ key: "fetch", - value: function fetch(_ref2) { - var _this = this; - - var name = _ref2.name; - - if (!this.baseUrl) { - return Promise.reject(new Error('The CMap "baseUrl" parameter must be specified, ensure that ' + 'the "cMapUrl" and "cMapPacked" API parameters are provided.')); + value: function (_fetch) { + function fetch(_x) { + return _fetch.apply(this, arguments); } - if (!name) { - return Promise.reject(new Error('CMap name must be specified.')); - } + fetch.toString = function () { + return _fetch.toString(); + }; - return new Promise(function (resolve, reject) { - var url = _this.baseUrl + name + (_this.isCompressed ? '.bcmap' : ''); - var request = new XMLHttpRequest(); - request.open('GET', url, true); + return fetch; + }( + /*#__PURE__*/ + function () { + var _ref3 = _asyncToGenerator( + /*#__PURE__*/ + _regenerator["default"].mark(function _callee2(_ref2) { + var _this = this; - if (_this.isCompressed) { - request.responseType = 'arraybuffer'; - } + var name, url, compressionType; + return _regenerator["default"].wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + name = _ref2.name; - request.onreadystatechange = function () { - if (request.readyState !== XMLHttpRequest.DONE) { - return; - } + if (this.baseUrl) { + _context2.next = 3; + break; + } - if (request.status === 200 || request.status === 0) { - var data; + throw new Error('The CMap "baseUrl" parameter must be specified, ensure that ' + 'the "cMapUrl" and "cMapPacked" API parameters are provided.'); - if (_this.isCompressed && request.response) { - data = new Uint8Array(request.response); - } else if (!_this.isCompressed && request.responseText) { - data = (0, _util.stringToBytes)(request.responseText); - } + case 3: + if (name) { + _context2.next = 5; + break; + } - if (data) { - resolve({ - cMapData: data, - compressionType: _this.isCompressed ? _util.CMapCompressionType.BINARY : _util.CMapCompressionType.NONE - }); - return; - } - } + throw new Error('CMap name must be specified.'); - reject(new Error('Unable to load ' + (_this.isCompressed ? 'binary ' : '') + 'CMap at: ' + url)); - }; + case 5: + url = this.baseUrl + name + (this.isCompressed ? '.bcmap' : ''); + compressionType = this.isCompressed ? _util.CMapCompressionType.BINARY : _util.CMapCompressionType.NONE; - request.send(null); - }); - } - }]); + if (!(isFetchSupported() && isValidFetchUrl(url, document.baseURI))) { + _context2.next = 9; + break; + } + + return _context2.abrupt("return", fetch(url).then( + /*#__PURE__*/ + function () { + var _ref4 = _asyncToGenerator( + /*#__PURE__*/ + _regenerator["default"].mark(function _callee(response) { + var cMapData; + return _regenerator["default"].wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + if (response.ok) { + _context.next = 2; + break; + } + + throw new Error(response.statusText); + + case 2: + if (!_this.isCompressed) { + _context.next = 10; + break; + } + + _context.t0 = Uint8Array; + _context.next = 6; + return response.arrayBuffer(); + + case 6: + _context.t1 = _context.sent; + cMapData = new _context.t0(_context.t1); + _context.next = 15; + break; + + case 10: + _context.t2 = _util.stringToBytes; + _context.next = 13; + return response.text(); + + case 13: + _context.t3 = _context.sent; + cMapData = (0, _context.t2)(_context.t3); + + case 15: + return _context.abrupt("return", { + cMapData: cMapData, + compressionType: compressionType + }); + + case 16: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function (_x3) { + return _ref4.apply(this, arguments); + }; + }())["catch"](function (reason) { + throw new Error("Unable to load ".concat(_this.isCompressed ? 'binary ' : '') + "CMap at: ".concat(url)); + })); + + case 9: + return _context2.abrupt("return", new Promise(function (resolve, reject) { + var request = new XMLHttpRequest(); + request.open('GET', url, true); + + if (_this.isCompressed) { + request.responseType = 'arraybuffer'; + } + + request.onreadystatechange = function () { + if (request.readyState !== XMLHttpRequest.DONE) { + return; + } + + if (request.status === 200 || request.status === 0) { + var cMapData; + + if (_this.isCompressed && request.response) { + cMapData = new Uint8Array(request.response); + } else if (!_this.isCompressed && request.responseText) { + cMapData = (0, _util.stringToBytes)(request.responseText); + } + + if (cMapData) { + resolve({ + cMapData: cMapData, + compressionType: compressionType + }); + return; + } + } + + reject(new Error(request.statusText)); + }; + + request.send(null); + })["catch"](function (reason) { + throw new Error("Unable to load ".concat(_this.isCompressed ? 'binary ' : '') + "CMap at: ".concat(url)); + })); + + case 10: + case "end": + return _context2.stop(); + } + } + }, _callee2, this); + })); + + return function (_x2) { + return _ref3.apply(this, arguments); + }; + }()) + }]); return DOMCMapReaderFactory; }(); @@ -13060,16 +13163,16 @@ exports.DOMSVGFactory = DOMSVGFactory; var PageViewport = /*#__PURE__*/ function () { - function PageViewport(_ref3) { - var viewBox = _ref3.viewBox, - scale = _ref3.scale, - rotation = _ref3.rotation, - _ref3$offsetX = _ref3.offsetX, - offsetX = _ref3$offsetX === void 0 ? 0 : _ref3$offsetX, - _ref3$offsetY = _ref3.offsetY, - offsetY = _ref3$offsetY === void 0 ? 0 : _ref3$offsetY, - _ref3$dontFlip = _ref3.dontFlip, - dontFlip = _ref3$dontFlip === void 0 ? false : _ref3$dontFlip; + function PageViewport(_ref5) { + var viewBox = _ref5.viewBox, + scale = _ref5.scale, + rotation = _ref5.rotation, + _ref5$offsetX = _ref5.offsetX, + offsetX = _ref5$offsetX === void 0 ? 0 : _ref5$offsetX, + _ref5$offsetY = _ref5.offsetY, + offsetY = _ref5$offsetY === void 0 ? 0 : _ref5$offsetY, + _ref5$dontFlip = _ref5.dontFlip, + dontFlip = _ref5$dontFlip === void 0 ? false : _ref5$dontFlip; _classCallCheck(this, PageViewport); @@ -13142,13 +13245,13 @@ function () { _createClass(PageViewport, [{ key: "clone", value: function clone() { - var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, - _ref4$scale = _ref4.scale, - scale = _ref4$scale === void 0 ? this.scale : _ref4$scale, - _ref4$rotation = _ref4.rotation, - rotation = _ref4$rotation === void 0 ? this.rotation : _ref4$rotation, - _ref4$dontFlip = _ref4.dontFlip, - dontFlip = _ref4$dontFlip === void 0 ? false : _ref4$dontFlip; + var _ref6 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + _ref6$scale = _ref6.scale, + scale = _ref6$scale === void 0 ? this.scale : _ref6$scale, + _ref6$rotation = _ref6.rotation, + rotation = _ref6$rotation === void 0 ? this.rotation : _ref6$rotation, + _ref6$dontFlip = _ref6.dontFlip, + dontFlip = _ref6$dontFlip === void 0 ? false : _ref6$dontFlip; return new PageViewport({ viewBox: this.viewBox.slice(), @@ -13167,11 +13270,11 @@ function () { }, { key: "convertToViewportRectangle", value: function convertToViewportRectangle(rect) { - var tl = _util.Util.applyTransform([rect[0], rect[1]], this.transform); + var topLeft = _util.Util.applyTransform([rect[0], rect[1]], this.transform); - var br = _util.Util.applyTransform([rect[2], rect[3]], this.transform); + var bottomRight = _util.Util.applyTransform([rect[2], rect[3]], this.transform); - return [tl[0], tl[1], br[0], br[1]]; + return [topLeft[0], topLeft[1], bottomRight[0], bottomRight[1]]; } }, { key: "convertToPdfPoint", @@ -13209,10 +13312,10 @@ exports.LinkTarget = LinkTarget; var LinkTargetStringMap = ['', '_self', '_blank', '_parent', '_top']; function addLinkAttributes(link) { - var _ref5 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - url = _ref5.url, - target = _ref5.target, - rel = _ref5.rel; + var _ref7 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + url = _ref7.url, + target = _ref7.target, + rel = _ref7.rel; link.href = link.title = url ? (0, _util.removeNullCharacters)(url) : ''; @@ -13278,22 +13381,59 @@ function () { }, { key: "toString", value: function toString() { - var times = this.times; var out = '', longest = 0; + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; - for (var i = 0, ii = times.length; i < ii; ++i) { - var name = times[i]['name']; + try { + for (var _iterator = this.times[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var time = _step.value; + var name = time.name; - if (name.length > longest) { - longest = name.length; + if (name.length > longest) { + longest = name.length; + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } } } - for (var _i = 0, _ii = times.length; _i < _ii; ++_i) { - var span = times[_i]; - var duration = span.end - span.start; - out += "".concat(span['name'].padEnd(longest), " ").concat(duration, "ms\n"); + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = this.times[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var _time = _step2.value; + var duration = _time.end - _time.start; + out += "".concat(_time.name.padEnd(longest), " ").concat(duration, "ms\n"); + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } } return out; @@ -13332,6 +13472,21 @@ function () { exports.DummyStatTimer = DummyStatTimer; +function isFetchSupported() { + return typeof fetch !== 'undefined' && typeof Response !== 'undefined' && 'body' in Response.prototype && typeof ReadableStream !== 'undefined'; +} + +function isValidFetchUrl(url, baseUrl) { + try { + var _ref8 = baseUrl ? new _util.URL(url, baseUrl) : new _util.URL(url), + protocol = _ref8.protocol; + + return protocol === 'http:' || protocol === 'https:'; + } catch (ex) { + return false; + } +} + function loadScript(src) { return new Promise(function (resolve, reject) { var script = document.createElement('script'); @@ -13346,6 +13501,81 @@ function loadScript(src) { }); } +function deprecated(details) { + console.log('Deprecated API usage: ' + details); +} + +function releaseImageResources(img) { + (0, _util.assert)(img instanceof Image, 'Invalid `img` parameter.'); + var url = img.src; + + if (typeof url === 'string' && url.startsWith('blob:') && _util.URL.revokeObjectURL) { + _util.URL.revokeObjectURL(url); + } + + img.removeAttribute('src'); +} + +var pdfDateStringRegex; + +var PDFDateString = +/*#__PURE__*/ +function () { + function PDFDateString() { + _classCallCheck(this, PDFDateString); + } + + _createClass(PDFDateString, null, [{ + key: "toDateObject", + value: function toDateObject(input) { + if (!input || !(0, _util.isString)(input)) { + return null; + } + + if (!pdfDateStringRegex) { + pdfDateStringRegex = new RegExp('^D:' + '(\\d{4})' + '(\\d{2})?' + '(\\d{2})?' + '(\\d{2})?' + '(\\d{2})?' + '(\\d{2})?' + '([Z|+|-])?' + '(\\d{2})?' + '\'?' + '(\\d{2})?' + '\'?'); + } + + var matches = pdfDateStringRegex.exec(input); + + if (!matches) { + return null; + } + + var year = parseInt(matches[1], 10); + var month = parseInt(matches[2], 10); + month = month >= 1 && month <= 12 ? month - 1 : 0; + var day = parseInt(matches[3], 10); + day = day >= 1 && day <= 31 ? day : 1; + var hour = parseInt(matches[4], 10); + hour = hour >= 0 && hour <= 23 ? hour : 0; + var minute = parseInt(matches[5], 10); + minute = minute >= 0 && minute <= 59 ? minute : 0; + var second = parseInt(matches[6], 10); + second = second >= 0 && second <= 59 ? second : 0; + var universalTimeRelation = matches[7] || 'Z'; + var offsetHour = parseInt(matches[8], 10); + offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0; + var offsetMinute = parseInt(matches[9], 10) || 0; + offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0; + + if (universalTimeRelation === '-') { + hour += offsetHour; + minute += offsetMinute; + } else if (universalTimeRelation === '+') { + hour -= offsetHour; + minute -= offsetMinute; + } + + return new Date(Date.UTC(year, month, day, hour, minute, second)); + } + }]); + + return PDFDateString; +}(); + +exports.PDFDateString = PDFDateString; + /***/ }), /* 152 */ /***/ (function(module, exports, __w_pdfjs_require__) { @@ -13358,11 +13588,11 @@ Object.defineProperty(exports, "__esModule", { }); exports.FontLoader = exports.FontFaceObject = void 0; -var _regenerator = _interopRequireDefault(__w_pdfjs_require__(147)); +var _regenerator = _interopRequireDefault(__w_pdfjs_require__(148)); var _util = __w_pdfjs_require__(1); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } @@ -13429,7 +13659,7 @@ function () { key: "clear", value: function clear() { this.nativeFontFaces.forEach(function (nativeFontFace) { - document.fonts.delete(nativeFontFace); + document.fonts["delete"](nativeFontFace); }); this.nativeFontFaces.length = 0; @@ -13443,11 +13673,11 @@ function () { value: function () { var _bind = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee(font) { + _regenerator["default"].mark(function _callee(font) { var _this = this; var nativeFontFace, rule; - return _regenerator.default.wrap(function _callee$(_context) { + return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: @@ -13456,7 +13686,7 @@ function () { break; } - return _context.abrupt("return"); + return _context.abrupt("return", undefined); case 2: font.attached = true; @@ -13495,7 +13725,7 @@ function () { throw _context.t0; case 18: - return _context.abrupt("return"); + return _context.abrupt("return", undefined); case 19: rule = font.createFontFaceRule(); @@ -13512,7 +13742,7 @@ function () { break; } - return _context.abrupt("return"); + return _context.abrupt("return", undefined); case 24: return _context.abrupt("return", new Promise(function (resolve) { @@ -13522,6 +13752,9 @@ function () { })); case 25: + return _context.abrupt("return", undefined); + + case 26: case "end": return _context.stop(); } @@ -14207,7 +14440,10 @@ function compileType3Glyph(imgData) { coords.push(p % width1); coords.push(p / width1 | 0); - --count; + + if (!points[p]) { + --count; + } } while (p0 !== p); outlines.push(coords); @@ -14651,16 +14887,32 @@ var CanvasGraphics = function CanvasGraphicsClosure() { if (fnId !== _util.OPS.dependency) { this[fnId].apply(this, argsArray[i]); } else { - var deps = argsArray[i]; + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; - for (var n = 0, nn = deps.length; n < nn; n++) { - var depObjId = deps[n]; - var common = depObjId[0] === 'g' && depObjId[1] === '_'; - var objsPool = common ? commonObjs : objs; + try { + for (var _iterator = argsArray[i][Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var depObjId = _step.value; + var objsPool = depObjId.startsWith('g_') ? commonObjs : objs; - if (!objsPool.has(depObjId)) { - objsPool.get(depObjId, continueCallback); - return i; + if (!objsPool.has(depObjId)) { + objsPool.get(depObjId, continueCallback); + return i; + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } } } } @@ -14725,8 +14977,8 @@ var CanvasGraphics = function CanvasGraphicsClosure() { ctx.lineDashOffset = dashPhase; } }, - setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) {}, - setFlatness: function CanvasGraphics_setFlatness(flatness) {}, + setRenderingIntent: function setRenderingIntent(intent) {}, + setFlatness: function setFlatness(flatness) {}, setGState: function CanvasGraphics_setGState(states) { for (var i = 0, ii = states.length; i < ii; i++) { var state = states[i]; @@ -15207,7 +15459,9 @@ var CanvasGraphics = function CanvasGraphicsClosure() { }, get isFontSubpixelAAEnabled() { - var ctx = this.canvasFactory.create(10, 10).context; + var _this$cachedCanvases$ = this.cachedCanvases.getCanvas('isFontSubpixelAAEnabled', 10, 10), + ctx = _this$cachedCanvases$.context; + ctx.scale(1.5, 1); ctx.fillText('I', 0, 10); var data = ctx.getImageData(0, 0, 10, 10).data; @@ -15234,7 +15488,7 @@ var CanvasGraphics = function CanvasGraphicsClosure() { var fontSize = current.fontSize; if (fontSize === 0) { - return; + return undefined; } var ctx = this.ctx; @@ -15660,7 +15914,7 @@ var CanvasGraphics = function CanvasGraphicsClosure() { this.restore(); }, paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) { - var domImage = this.objs.get(objId); + var domImage = this.processingType3 ? this.commonObjs.get(objId) : this.objs.get(objId); if (!domImage) { (0, _util.warn)('Dependent image isn\'t ready yet'); @@ -15769,7 +16023,7 @@ var CanvasGraphics = function CanvasGraphicsClosure() { } }, paintImageXObject: function CanvasGraphics_paintImageXObject(objId) { - var imgData = this.objs.get(objId); + var imgData = this.processingType3 ? this.commonObjs.get(objId) : this.objs.get(objId); if (!imgData) { (0, _util.warn)('Dependent image isn\'t ready yet'); @@ -15779,7 +16033,7 @@ var CanvasGraphics = function CanvasGraphicsClosure() { this.paintInlineImageXObject(imgData); }, paintImageXObjectRepeat: function CanvasGraphics_paintImageXObjectRepeat(objId, scaleX, scaleY, positions) { - var imgData = this.objs.get(objId); + var imgData = this.processingType3 ? this.commonObjs.get(objId) : this.objs.get(objId); if (!imgData) { (0, _util.warn)('Dependent image isn\'t ready yet'); @@ -16296,42 +16550,42 @@ var TilingPattern = function TilingPatternClosure() { y0 = bbox[1], x1 = bbox[2], y1 = bbox[3]; - var topLeft = [x0, y0]; - var botRight = [x0 + xstep, y0 + ystep]; - var width = botRight[0] - topLeft[0]; - var height = botRight[1] - topLeft[1]; var matrixScale = _util.Util.singularValueDecompose2dScale(this.matrix); var curMatrixScale = _util.Util.singularValueDecompose2dScale(this.baseTransform); var combinedScale = [matrixScale[0] * curMatrixScale[0], matrixScale[1] * curMatrixScale[1]]; - width = Math.min(Math.ceil(Math.abs(width * combinedScale[0])), MAX_PATTERN_SIZE); - height = Math.min(Math.ceil(Math.abs(height * combinedScale[1])), MAX_PATTERN_SIZE); - var tmpCanvas = owner.cachedCanvases.getCanvas('pattern', width, height, true); + var dimx = this.getSizeAndScale(xstep, this.ctx.canvas.width, combinedScale[0]); + var dimy = this.getSizeAndScale(ystep, this.ctx.canvas.height, combinedScale[1]); + var tmpCanvas = owner.cachedCanvases.getCanvas('pattern', dimx.size, dimy.size, true); var tmpCtx = tmpCanvas.context; var graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx); graphics.groupLevel = owner.groupLevel; this.setFillAndStrokeStyleToContext(graphics, paintType, color); - this.setScale(width, height, xstep, ystep); - this.transformToScale(graphics); - var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]]; - graphics.transform.apply(graphics, tmpTranslate); + graphics.transform(dimx.scale, 0, 0, dimy.scale, 0, 0); + graphics.transform(1, 0, 0, 1, -x0, -y0); this.clipBbox(graphics, bbox, x0, y0, x1, y1); graphics.executeOperatorList(operatorList); + this.ctx.transform(1, 0, 0, 1, x0, y0); + this.ctx.scale(1 / dimx.scale, 1 / dimy.scale); return tmpCanvas.canvas; }, - setScale: function TilingPattern_setScale(width, height, xstep, ystep) { - this.scale = [width / xstep, height / ystep]; - }, - transformToScale: function TilingPattern_transformToScale(graphics) { - var scale = this.scale; - var tmpScale = [scale[0], 0, 0, scale[1], 0, 0]; - graphics.transform.apply(graphics, tmpScale); - }, - scaleToContext: function TilingPattern_scaleToContext() { - var scale = this.scale; - this.ctx.scale(1 / scale[0], 1 / scale[1]); + getSizeAndScale: function TilingPattern_getSizeAndScale(step, realOutputSize, scale) { + step = Math.abs(step); + var maxSize = Math.max(MAX_PATTERN_SIZE, realOutputSize); + var size = Math.ceil(step * scale); + + if (size >= maxSize) { + size = maxSize; + } else { + scale = size / step; + } + + return { + scale: scale, + size: size + }; }, clipBbox: function clipBbox(graphics, bbox, x0, y0, x1, y1) { if (Array.isArray(bbox) && bbox.length === 4) { @@ -16369,11 +16623,10 @@ var TilingPattern = function TilingPatternClosure() { } }, getPattern: function TilingPattern_getPattern(ctx, owner) { - var temporaryPatternCanvas = this.createPatternCanvas(owner); ctx = this.ctx; ctx.setTransform.apply(ctx, this.baseTransform); ctx.transform.apply(ctx, this.matrix); - this.scaleToContext(); + var temporaryPatternCanvas = this.createPatternCanvas(owner); return ctx.createPattern(temporaryPatternCanvas, 'repeat'); } }; @@ -16410,11 +16663,11 @@ Object.defineProperty(exports, "__esModule", { }); exports.MessageHandler = MessageHandler; -var _regenerator = _interopRequireDefault(__w_pdfjs_require__(147)); +var _regenerator = _interopRequireDefault(__w_pdfjs_require__(148)); var _util = __w_pdfjs_require__(1); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } @@ -16429,10 +16682,10 @@ function resolveCall(_x, _x2) { function _resolveCall() { _resolveCall = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee(fn, args) { + _regenerator["default"].mark(function _callee(fn, args) { var thisArg, _args = arguments; - return _regenerator.default.wrap(function _callee$(_context) { + return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: @@ -16443,7 +16696,7 @@ function _resolveCall() { break; } - return _context.abrupt("return"); + return _context.abrupt("return", undefined); case 3: return _context.abrupt("return", fn.apply(thisArg, args)); @@ -16453,7 +16706,7 @@ function _resolveCall() { return _context.stop(); } } - }, _callee, this); + }, _callee); })); return _resolveCall.apply(this, arguments); } @@ -16495,7 +16748,7 @@ function resolveOrReject(capability, success, reason) { } function finalize(promise) { - return Promise.resolve(promise).catch(function () {}); + return Promise.resolve(promise)["catch"](function () {}); } function MessageHandler(sourceName, targetName, comObj) { @@ -17588,7 +17841,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.PDFDataTransportStream = void 0; -var _regenerator = _interopRequireDefault(__w_pdfjs_require__(147)); +var _regenerator = _interopRequireDefault(__w_pdfjs_require__(148)); var _util = __w_pdfjs_require__(1); @@ -17598,12 +17851,23 @@ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } -var PDFDataTransportStream = function PDFDataTransportStreamClosure() { +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var PDFDataTransportStream = +/*#__PURE__*/ +function () { function PDFDataTransportStream(params, pdfDataRangeTransport) { var _this = this; + _classCallCheck(this, PDFDataTransportStream); + (0, _util.assert)(pdfDataRangeTransport); this._queuedChunks = []; + this._progressiveDone = params.progressiveDone || false; var initialData = params.initialData; if (initialData && initialData.length > 0) { @@ -17626,9 +17890,10 @@ var PDFDataTransportStream = function PDFDataTransportStreamClosure() { }); }); - this._pdfDataRangeTransport.addProgressListener(function (loaded) { + this._pdfDataRangeTransport.addProgressListener(function (loaded, total) { _this._onProgress({ - loaded: loaded + loaded: loaded, + total: total }); }); @@ -17638,11 +17903,16 @@ var PDFDataTransportStream = function PDFDataTransportStreamClosure() { }); }); + this._pdfDataRangeTransport.addProgressiveDoneListener(function () { + _this._onProgressiveDone(); + }); + this._pdfDataRangeTransport.transportReady(); } - PDFDataTransportStream.prototype = { - _onReceiveData: function PDFDataTransportStream_onReceiveData(args) { + _createClass(PDFDataTransportStream, [{ + key: "_onReceiveData", + value: function _onReceiveData(args) { var buffer = new Uint8Array(args.chunk).buffer; if (args.begin === undefined) { @@ -17664,32 +17934,62 @@ var PDFDataTransportStream = function PDFDataTransportStreamClosure() { (0, _util.assert)(found); } - }, - _onProgress: function PDFDataTransportStream_onDataProgress(evt) { - if (this._rangeReaders.length > 0) { + } + }, { + key: "_onProgress", + value: function _onProgress(evt) { + if (evt.total === undefined) { var firstReader = this._rangeReaders[0]; - if (firstReader.onProgress) { + if (firstReader && firstReader.onProgress) { firstReader.onProgress({ loaded: evt.loaded }); } + } else { + var fullReader = this._fullRequestReader; + + if (fullReader && fullReader.onProgress) { + fullReader.onProgress({ + loaded: evt.loaded, + total: evt.total + }); + } } - }, - _removeRangeReader: function PDFDataTransportStream_removeRangeReader(reader) { + } + }, { + key: "_onProgressiveDone", + value: function _onProgressiveDone() { + if (this._fullRequestReader) { + this._fullRequestReader.progressiveDone(); + } + + this._progressiveDone = true; + } + }, { + key: "_removeRangeReader", + value: function _removeRangeReader(reader) { var i = this._rangeReaders.indexOf(reader); if (i >= 0) { this._rangeReaders.splice(i, 1); } - }, - getFullReader: function PDFDataTransportStream_getFullReader() { + } + }, { + key: "getFullReader", + value: function getFullReader() { (0, _util.assert)(!this._fullRequestReader); var queuedChunks = this._queuedChunks; this._queuedChunks = null; - return new PDFDataTransportStreamReader(this, queuedChunks); - }, - getRangeReader: function PDFDataTransportStream_getRangeReader(begin, end) { + return new PDFDataTransportStreamReader(this, queuedChunks, this._progressiveDone); + } + }, { + key: "getRangeReader", + value: function getRangeReader(begin, end) { + if (end <= this._progressiveDataLength) { + return null; + } + var reader = new PDFDataTransportStreamRangeReader(this, begin, end); this._pdfDataRangeTransport.requestDataRange(begin, end); @@ -17697,8 +17997,10 @@ var PDFDataTransportStream = function PDFDataTransportStreamClosure() { this._rangeReaders.push(reader); return reader; - }, - cancelAllRequests: function PDFDataTransportStream_cancelAllRequests(reason) { + } + }, { + key: "cancelAllRequests", + value: function cancelAllRequests(reason) { if (this._fullRequestReader) { this._fullRequestReader.cancel(reason); } @@ -17711,21 +18013,64 @@ var PDFDataTransportStream = function PDFDataTransportStreamClosure() { this._pdfDataRangeTransport.abort(); } - }; + }, { + key: "_progressiveDataLength", + get: function get() { + return this._fullRequestReader ? this._fullRequestReader._loaded : 0; + } + }]); + + return PDFDataTransportStream; +}(); +exports.PDFDataTransportStream = PDFDataTransportStream; + +var PDFDataTransportStreamReader = +/*#__PURE__*/ +function () { function PDFDataTransportStreamReader(stream, queuedChunks) { + var progressiveDone = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + _classCallCheck(this, PDFDataTransportStreamReader); + this._stream = stream; - this._done = false; + this._done = progressiveDone || false; this._filename = null; this._queuedChunks = queuedChunks || []; + this._loaded = 0; + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = this._queuedChunks[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var chunk = _step.value; + this._loaded += chunk.byteLength; + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + this._requests = []; this._headersReady = Promise.resolve(); stream._fullRequestReader = this; this.onProgress = null; } - PDFDataTransportStreamReader.prototype = { - _enqueue: function PDFDataTransportStreamReader_enqueue(chunk) { + _createClass(PDFDataTransportStreamReader, [{ + key: "_enqueue", + value: function _enqueue(chunk) { if (this._done) { return; } @@ -17737,38 +18082,20 @@ var PDFDataTransportStream = function PDFDataTransportStreamClosure() { value: chunk, done: false }); - return; + } else { + this._queuedChunks.push(chunk); } - this._queuedChunks.push(chunk); - }, - - get headersReady() { - return this._headersReady; - }, - - get filename() { - return this._filename; - }, - - get isRangeSupported() { - return this._stream._isRangeSupported; - }, - - get isStreamingSupported() { - return this._stream._isStreamingSupported; - }, - - get contentLength() { - return this._stream._contentLength; - }, - - read: function () { + this._loaded += chunk.byteLength; + } + }, { + key: "read", + value: function () { var _read = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee() { + _regenerator["default"].mark(function _callee() { var chunk, requestCapability; - return _regenerator.default.wrap(function _callee$(_context) { + return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: @@ -17814,8 +18141,10 @@ var PDFDataTransportStream = function PDFDataTransportStreamClosure() { } return read; - }(), - cancel: function PDFDataTransportStreamReader_cancel(reason) { + }() + }, { + key: "cancel", + value: function cancel(reason) { this._done = true; this._requests.forEach(function (requestCapability) { @@ -17827,59 +18156,99 @@ var PDFDataTransportStream = function PDFDataTransportStreamClosure() { this._requests = []; } - }; - - function PDFDataTransportStreamRangeReader(stream, begin, end) { - this._stream = stream; - this._begin = begin; - this._end = end; - this._queuedChunk = null; - this._requests = []; - this._done = false; - this.onProgress = null; - } - - PDFDataTransportStreamRangeReader.prototype = { - _enqueue: function PDFDataTransportStreamRangeReader_enqueue(chunk) { + }, { + key: "progressiveDone", + value: function progressiveDone() { if (this._done) { return; } - if (this._requests.length === 0) { - this._queuedChunk = chunk; - } else { - var requestsCapability = this._requests.shift(); - - requestsCapability.resolve({ - value: chunk, - done: false - }); - - this._requests.forEach(function (requestCapability) { - requestCapability.resolve({ - value: undefined, - done: true - }); - }); - - this._requests = []; - } - this._done = true; + } + }, { + key: "headersReady", + get: function get() { + return this._headersReady; + } + }, { + key: "filename", + get: function get() { + return this._filename; + } + }, { + key: "isRangeSupported", + get: function get() { + return this._stream._isRangeSupported; + } + }, { + key: "isStreamingSupported", + get: function get() { + return this._stream._isStreamingSupported; + } + }, { + key: "contentLength", + get: function get() { + return this._stream._contentLength; + } + }]); - this._stream._removeRangeReader(this); - }, - - get isStreamingSupported() { - return false; - }, + return PDFDataTransportStreamReader; +}(); + +var PDFDataTransportStreamRangeReader = +/*#__PURE__*/ +function () { + function PDFDataTransportStreamRangeReader(stream, begin, end) { + _classCallCheck(this, PDFDataTransportStreamRangeReader); + + this._stream = stream; + this._begin = begin; + this._end = end; + this._queuedChunk = null; + this._requests = []; + this._done = false; + this.onProgress = null; + } + + _createClass(PDFDataTransportStreamRangeReader, [{ + key: "_enqueue", + value: function _enqueue(chunk) { + if (this._done) { + return; + } + + if (this._requests.length === 0) { + this._queuedChunk = chunk; + } else { + var requestsCapability = this._requests.shift(); + + requestsCapability.resolve({ + value: chunk, + done: false + }); + + this._requests.forEach(function (requestCapability) { + requestCapability.resolve({ + value: undefined, + done: true + }); + }); + + this._requests = []; + } + + this._done = true; - read: function () { + this._stream._removeRangeReader(this); + } + }, { + key: "read", + value: function () { var _read2 = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee2() { + _regenerator["default"].mark(function _callee2() { var chunk, requestCapability; - return _regenerator.default.wrap(function _callee2$(_context2) { + return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: @@ -17926,8 +18295,10 @@ var PDFDataTransportStream = function PDFDataTransportStreamClosure() { } return read; - }(), - cancel: function PDFDataTransportStreamRangeReader_cancel(reason) { + }() + }, { + key: "cancel", + value: function cancel(reason) { this._done = true; this._requests.forEach(function (requestCapability) { @@ -17941,11 +18312,15 @@ var PDFDataTransportStream = function PDFDataTransportStreamClosure() { this._stream._removeRangeReader(this); } - }; - return PDFDataTransportStream; -}(); + }, { + key: "isStreamingSupported", + get: function get() { + return false; + } + }]); -exports.PDFDataTransportStream = PDFDataTransportStream; + return PDFDataTransportStreamRangeReader; +}(); /***/ }), /* 161 */ @@ -18423,7 +18798,7 @@ var _util = __w_pdfjs_require__(1); var _global_scope = _interopRequireDefault(__w_pdfjs_require__(3)); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } var renderTextLayer = function renderTextLayerClosure() { var MAX_TEXT_DIVS_TO_RENDER = 100000; @@ -18842,6 +19217,8 @@ var renderTextLayer = function renderTextLayerClosure() { } function TextLayerRenderTask(_ref) { + var _this = this; + var textContent = _ref.textContent, textContentStream = _ref.textContentStream, container = _ref.container, @@ -18856,7 +19233,7 @@ var renderTextLayer = function renderTextLayerClosure() { this._textDivs = textDivs || []; this._textContentItemsStr = textContentItemsStr || []; this._enhanceTextSelection = !!enhanceTextSelection; - this._fontInspectorEnabled = !!(_global_scope.default.FontInspector && _global_scope.default.FontInspector.enabled); + this._fontInspectorEnabled = !!(_global_scope["default"].FontInspector && _global_scope["default"].FontInspector.enabled); this._reader = null; this._layoutTextLastFontSize = null; this._layoutTextLastFontFamily = null; @@ -18867,6 +19244,14 @@ var renderTextLayer = function renderTextLayerClosure() { this._capability = (0, _util.createPromiseCapability)(); this._renderTimer = null; this._bounds = []; + + this._capability.promise["finally"](function () { + if (_this._layoutTextCtx) { + _this._layoutTextCtx.canvas.width = 0; + _this._layoutTextCtx.canvas.height = 0; + _this._layoutTextCtx = null; + } + }); } TextLayerRenderTask.prototype = { @@ -18875,20 +19260,20 @@ var renderTextLayer = function renderTextLayerClosure() { }, cancel: function TextLayer_cancel() { + this._canceled = true; + if (this._reader) { - this._reader.cancel(new _util.AbortException('text layer task cancelled')); + this._reader.cancel(new _util.AbortException('TextLayer task cancelled.')); this._reader = null; } - this._canceled = true; - if (this._renderTimer !== null) { clearTimeout(this._renderTimer); this._renderTimer = null; } - this._capability.reject('canceled'); + this._capability.reject(new Error('TextLayer task cancelled.')); }, _processItems: function _processItems(items, styleCache) { for (var i = 0, len = items.length; i < len; i++) { @@ -18938,7 +19323,7 @@ var renderTextLayer = function renderTextLayerClosure() { textLayerFrag.appendChild(textDiv); }, _render: function TextLayer_render(timeout) { - var _this = this; + var _this2 = this; var capability = (0, _util.createPromiseCapability)(); var styleCache = Object.create(null); @@ -18957,7 +19342,7 @@ var renderTextLayer = function renderTextLayerClosure() { capability.resolve(); } else if (this._textContentStream) { var pump = function pump() { - _this._reader.read().then(function (_ref2) { + _this2._reader.read().then(function (_ref2) { var value = _ref2.value, done = _ref2.done; @@ -18968,7 +19353,7 @@ var renderTextLayer = function renderTextLayerClosure() { Object.assign(styleCache, value.styles); - _this._processItems(value.items, styleCache); + _this2._processItems(value.items, styleCache); pump(); }, capability.reject); @@ -18984,11 +19369,11 @@ var renderTextLayer = function renderTextLayerClosure() { styleCache = null; if (!timeout) { - render(_this); + render(_this2); } else { - _this._renderTimer = setTimeout(function () { - render(_this); - _this._renderTimer = null; + _this2._renderTimer = setTimeout(function () { + render(_this2); + _this2._renderTimer = null; }, timeout); } }, this._capability.reject); @@ -19090,7 +19475,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.AnnotationLayer = void 0; -var _dom_utils = __w_pdfjs_require__(151); +var _display_utils = __w_pdfjs_require__(151); var _util = __w_pdfjs_require__(1); @@ -19160,6 +19545,9 @@ function () { case _util.AnnotationType.POPUP: return new PopupAnnotationElement(parameters); + case _util.AnnotationType.FREETEXT: + return new FreeTextAnnotationElement(parameters); + case _util.AnnotationType.LINE: return new LineAnnotationElement(parameters); @@ -19172,6 +19560,9 @@ function () { case _util.AnnotationType.POLYLINE: return new PolylineAnnotationElement(parameters); + case _util.AnnotationType.CARET: + return new CaretAnnotationElement(parameters); + case _util.AnnotationType.INK: return new InkAnnotationElement(parameters); @@ -19316,6 +19707,7 @@ function () { trigger: trigger, color: data.color, title: data.title, + modificationDate: data.modificationDate, contents: data.contents, hideWrapper: true }); @@ -19352,9 +19744,9 @@ function (_AnnotationElement) { var data = this.data, linkService = this.linkService; var link = document.createElement('a'); - (0, _dom_utils.addLinkAttributes)(link, { + (0, _display_utils.addLinkAttributes)(link, { url: data.url, - target: data.newWindow ? _dom_utils.LinkTarget.BLANK : linkService.externalLinkTarget, + target: data.newWindow ? _display_utils.LinkTarget.BLANK : linkService.externalLinkTarget, rel: linkService.externalLinkRel }); @@ -19719,6 +20111,7 @@ function (_AnnotationElement4) { trigger: parentElement, color: this.data.color, title: this.data.title, + modificationDate: this.data.modificationDate, contents: this.data.contents }); var parentLeft = parseFloat(parentElement.style.left); @@ -19743,6 +20136,7 @@ function () { this.trigger = parameters.trigger; this.color = parameters.color; this.title = parameters.title; + this.modificationDate = parameters.modificationDate; this.contents = parameters.contents; this.hideWrapper = parameters.hideWrapper || false; this.pinned = false; @@ -19767,16 +20161,30 @@ function () { popup.style.backgroundColor = _util.Util.makeCssRgb(r | 0, g | 0, b | 0); } - var contents = this._formatContents(this.contents); - var title = document.createElement('h1'); title.textContent = this.title; + popup.appendChild(title); + + var dateObject = _display_utils.PDFDateString.toDateObject(this.modificationDate); + + if (dateObject) { + var modificationDate = document.createElement('span'); + modificationDate.textContent = '{{date}}, {{time}}'; + modificationDate.dataset.l10nId = 'annotation_date_string'; + modificationDate.dataset.l10nArgs = JSON.stringify({ + date: dateObject.toLocaleDateString(), + time: dateObject.toLocaleTimeString() + }); + popup.appendChild(modificationDate); + } + + var contents = this._formatContents(this.contents); + + popup.appendChild(contents); this.trigger.addEventListener('click', this._toggle.bind(this)); this.trigger.addEventListener('mouseover', this._show.bind(this, false)); this.trigger.addEventListener('mouseout', this._hide.bind(this, false)); popup.addEventListener('click', this._hide.bind(this, true)); - popup.appendChild(title); - popup.appendChild(contents); wrapper.appendChild(popup); return wrapper; } @@ -19839,10 +20247,38 @@ function () { return PopupElement; }(); -var LineAnnotationElement = +var FreeTextAnnotationElement = /*#__PURE__*/ function (_AnnotationElement5) { - _inherits(LineAnnotationElement, _AnnotationElement5); + _inherits(FreeTextAnnotationElement, _AnnotationElement5); + + function FreeTextAnnotationElement(parameters) { + _classCallCheck(this, FreeTextAnnotationElement); + + var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents); + return _possibleConstructorReturn(this, _getPrototypeOf(FreeTextAnnotationElement).call(this, parameters, isRenderable, true)); + } + + _createClass(FreeTextAnnotationElement, [{ + key: "render", + value: function render() { + this.container.className = 'freeTextAnnotation'; + + if (!this.data.hasPopup) { + this._createPopup(this.container, null, this.data); + } + + return this.container; + } + }]); + + return FreeTextAnnotationElement; +}(AnnotationElement); + +var LineAnnotationElement = +/*#__PURE__*/ +function (_AnnotationElement6) { + _inherits(LineAnnotationElement, _AnnotationElement6); function LineAnnotationElement(parameters) { _classCallCheck(this, LineAnnotationElement); @@ -19880,8 +20316,8 @@ function (_AnnotationElement5) { var SquareAnnotationElement = /*#__PURE__*/ -function (_AnnotationElement6) { - _inherits(SquareAnnotationElement, _AnnotationElement6); +function (_AnnotationElement7) { + _inherits(SquareAnnotationElement, _AnnotationElement7); function SquareAnnotationElement(parameters) { _classCallCheck(this, SquareAnnotationElement); @@ -19921,8 +20357,8 @@ function (_AnnotationElement6) { var CircleAnnotationElement = /*#__PURE__*/ -function (_AnnotationElement7) { - _inherits(CircleAnnotationElement, _AnnotationElement7); +function (_AnnotationElement8) { + _inherits(CircleAnnotationElement, _AnnotationElement8); function CircleAnnotationElement(parameters) { _classCallCheck(this, CircleAnnotationElement); @@ -19962,8 +20398,8 @@ function (_AnnotationElement7) { var PolylineAnnotationElement = /*#__PURE__*/ -function (_AnnotationElement8) { - _inherits(PolylineAnnotationElement, _AnnotationElement8); +function (_AnnotationElement9) { + _inherits(PolylineAnnotationElement, _AnnotationElement9); function PolylineAnnotationElement(parameters) { var _this3; @@ -20032,10 +20468,38 @@ function (_PolylineAnnotationEl) { return PolygonAnnotationElement; }(PolylineAnnotationElement); +var CaretAnnotationElement = +/*#__PURE__*/ +function (_AnnotationElement10) { + _inherits(CaretAnnotationElement, _AnnotationElement10); + + function CaretAnnotationElement(parameters) { + _classCallCheck(this, CaretAnnotationElement); + + var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents); + return _possibleConstructorReturn(this, _getPrototypeOf(CaretAnnotationElement).call(this, parameters, isRenderable, true)); + } + + _createClass(CaretAnnotationElement, [{ + key: "render", + value: function render() { + this.container.className = 'caretAnnotation'; + + if (!this.data.hasPopup) { + this._createPopup(this.container, null, this.data); + } + + return this.container; + } + }]); + + return CaretAnnotationElement; +}(AnnotationElement); + var InkAnnotationElement = /*#__PURE__*/ -function (_AnnotationElement9) { - _inherits(InkAnnotationElement, _AnnotationElement9); +function (_AnnotationElement11) { + _inherits(InkAnnotationElement, _AnnotationElement11); function InkAnnotationElement(parameters) { var _this5; @@ -20092,8 +20556,8 @@ function (_AnnotationElement9) { var HighlightAnnotationElement = /*#__PURE__*/ -function (_AnnotationElement10) { - _inherits(HighlightAnnotationElement, _AnnotationElement10); +function (_AnnotationElement12) { + _inherits(HighlightAnnotationElement, _AnnotationElement12); function HighlightAnnotationElement(parameters) { _classCallCheck(this, HighlightAnnotationElement); @@ -20120,8 +20584,8 @@ function (_AnnotationElement10) { var UnderlineAnnotationElement = /*#__PURE__*/ -function (_AnnotationElement11) { - _inherits(UnderlineAnnotationElement, _AnnotationElement11); +function (_AnnotationElement13) { + _inherits(UnderlineAnnotationElement, _AnnotationElement13); function UnderlineAnnotationElement(parameters) { _classCallCheck(this, UnderlineAnnotationElement); @@ -20148,8 +20612,8 @@ function (_AnnotationElement11) { var SquigglyAnnotationElement = /*#__PURE__*/ -function (_AnnotationElement12) { - _inherits(SquigglyAnnotationElement, _AnnotationElement12); +function (_AnnotationElement14) { + _inherits(SquigglyAnnotationElement, _AnnotationElement14); function SquigglyAnnotationElement(parameters) { _classCallCheck(this, SquigglyAnnotationElement); @@ -20176,8 +20640,8 @@ function (_AnnotationElement12) { var StrikeOutAnnotationElement = /*#__PURE__*/ -function (_AnnotationElement13) { - _inherits(StrikeOutAnnotationElement, _AnnotationElement13); +function (_AnnotationElement15) { + _inherits(StrikeOutAnnotationElement, _AnnotationElement15); function StrikeOutAnnotationElement(parameters) { _classCallCheck(this, StrikeOutAnnotationElement); @@ -20204,8 +20668,8 @@ function (_AnnotationElement13) { var StampAnnotationElement = /*#__PURE__*/ -function (_AnnotationElement14) { - _inherits(StampAnnotationElement, _AnnotationElement14); +function (_AnnotationElement16) { + _inherits(StampAnnotationElement, _AnnotationElement16); function StampAnnotationElement(parameters) { _classCallCheck(this, StampAnnotationElement); @@ -20232,8 +20696,8 @@ function (_AnnotationElement14) { var FileAttachmentAnnotationElement = /*#__PURE__*/ -function (_AnnotationElement15) { - _inherits(FileAttachmentAnnotationElement, _AnnotationElement15); +function (_AnnotationElement17) { + _inherits(FileAttachmentAnnotationElement, _AnnotationElement17); function FileAttachmentAnnotationElement(parameters) { var _this6; @@ -20244,12 +20708,12 @@ function (_AnnotationElement15) { var _this6$data$file = _this6.data.file, filename = _this6$data$file.filename, content = _this6$data$file.content; - _this6.filename = (0, _dom_utils.getFilenameFromUrl)(filename); + _this6.filename = (0, _display_utils.getFilenameFromUrl)(filename); _this6.content = content; if (_this6.linkService.eventBus) { _this6.linkService.eventBus.dispatch('fileattachmentannotation', { - source: _assertThisInitialized(_assertThisInitialized(_this6)), + source: _assertThisInitialized(_this6), id: (0, _util.stringToPDFString)(filename), filename: filename, content: content @@ -20316,7 +20780,7 @@ function () { downloadManager: parameters.downloadManager, imageResourcesPath: parameters.imageResourcesPath || '', renderInteractiveForms: parameters.renderInteractiveForms || false, - svgFactory: new _dom_utils.DOMSVGFactory() + svgFactory: new _display_utils.DOMSVGFactory() }); if (element.isRenderable) { @@ -20359,11 +20823,33 @@ exports.SVGGraphics = void 0; var _util = __w_pdfjs_require__(1); -var _dom_utils = __w_pdfjs_require__(151); +var _display_utils = __w_pdfjs_require__(151); var _is_node = _interopRequireDefault(__w_pdfjs_require__(4)); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } + +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } + +function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } + +function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } + +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } + +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var SVGGraphics = function SVGGraphics() { throw new Error('Not implemented: SVGGraphics'); @@ -20371,13 +20857,105 @@ var SVGGraphics = function SVGGraphics() { exports.SVGGraphics = SVGGraphics; { + var opListToTree = function opListToTree(opList) { + var opTree = []; + var tmp = []; + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = opList[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var opListElement = _step.value; + + if (opListElement.fn === 'save') { + opTree.push({ + 'fnId': 92, + 'fn': 'group', + 'items': [] + }); + tmp.push(opTree); + opTree = opTree[opTree.length - 1].items; + continue; + } + + if (opListElement.fn === 'restore') { + opTree = tmp.pop(); + } else { + opTree.push(opListElement); + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + return opTree; + }; + + var pf = function pf(value) { + if (Number.isInteger(value)) { + return value.toString(); + } + + var s = value.toFixed(10); + var i = s.length - 1; + + if (s[i] !== '0') { + return s; + } + + do { + i--; + } while (s[i] === '0'); + + return s.substring(0, s[i] === '.' ? i : i + 1); + }; + + var pm = function pm(m) { + if (m[4] === 0 && m[5] === 0) { + if (m[1] === 0 && m[2] === 0) { + if (m[0] === 1 && m[3] === 1) { + return ''; + } + + return "scale(".concat(pf(m[0]), " ").concat(pf(m[3]), ")"); + } + + if (m[0] === m[3] && m[1] === -m[2]) { + var a = Math.acos(m[0]) * 180 / Math.PI; + return "rotate(".concat(pf(a), ")"); + } + } else { + if (m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1) { + return "translate(".concat(pf(m[4]), " ").concat(pf(m[5]), ")"); + } + } + + return "matrix(".concat(pf(m[0]), " ").concat(pf(m[1]), " ").concat(pf(m[2]), " ").concat(pf(m[3]), " ").concat(pf(m[4]), " ") + "".concat(pf(m[5]), ")"); + }; + var SVG_DEFAULTS = { fontStyle: 'normal', fontWeight: 'normal', fillColor: '#000000' }; + var XML_NS = 'http://www.w3.org/XML/1998/namespace'; + var XLINK_NS = 'http://www.w3.org/1999/xlink'; + var LINE_CAP_STYLES = ['butt', 'round', 'square']; + var LINE_JOIN_STYLES = ['miter', 'round', 'bevel']; - var convertImgDataToPng = function convertImgDataToPngClosure() { + var convertImgDataToPng = function () { var PNG_HEADER = new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]); var CHUNK_WRAPPER_SIZE = 12; var crcTable = new Int32Array(256); @@ -20399,8 +20977,8 @@ exports.SVGGraphics = SVGGraphics; function crc32(data, start, end) { var crc = -1; - for (var i = start; i < end; i++) { - var a = (crc ^ data[i]) & 0xff; + for (var _i = start; _i < end; _i++) { + var a = (crc ^ data[_i]) & 0xff; var b = crcTable[a]; crc = crc >>> 8 ^ b; } @@ -20434,8 +21012,8 @@ exports.SVGGraphics = SVGGraphics; var a = 1; var b = 0; - for (var i = start; i < end; ++i) { - a = (a + (data[i] & 0xff)) % 65521; + for (var _i2 = start; _i2 < end; ++_i2) { + a = (a + (data[_i2] & 0xff)) % 65521; b = (b + a) % 65521; } @@ -20443,7 +21021,7 @@ exports.SVGGraphics = SVGGraphics; } function deflateSync(literals) { - if (!(0, _is_node.default)()) { + if (!(0, _is_node["default"])()) { return deflateSyncUncompressed(literals); } @@ -20537,9 +21115,8 @@ exports.SVGGraphics = SVGGraphics; var literals = new Uint8Array((1 + lineSize) * height); var offsetLiterals = 0, offsetBytes = 0; - var y, i; - for (y = 0; y < height; ++y) { + for (var y = 0; y < height; ++y) { literals[offsetLiterals++] = 0; literals.set(bytes.subarray(offsetBytes, offsetBytes + lineSize), offsetLiterals); offsetBytes += lineSize; @@ -20549,10 +21126,10 @@ exports.SVGGraphics = SVGGraphics; if (kind === _util.ImageKind.GRAYSCALE_1BPP && isMask) { offsetLiterals = 0; - for (y = 0; y < height; y++) { + for (var _y = 0; _y < height; _y++) { offsetLiterals++; - for (i = 0; i < lineSize; i++) { + for (var _i3 = 0; _i3 < lineSize; _i3++) { literals[offsetLiterals++] ^= 0xFF; } } @@ -20579,8 +21156,12 @@ exports.SVGGraphics = SVGGraphics; }; }(); - var SVGExtraState = function SVGExtraStateClosure() { + var SVGExtraState = + /*#__PURE__*/ + function () { function SVGExtraState() { + _classCallCheck(this, SVGExtraState); + this.fontSizeScale = 1; this.fontWeight = SVG_DEFAULTS.fontWeight; this.fontSize = 0; @@ -20588,6 +21169,7 @@ exports.SVGGraphics = SVGGraphics; this.fontMatrix = _util.FONT_IDENTITY_MATRIX; this.leading = 0; this.textRenderingMode = _util.TextRenderingMode.FILL; + this.textMatrixScale = 1; this.x = 0; this.y = 0; this.lineX = 0; @@ -20612,90 +21194,33 @@ exports.SVGGraphics = SVGGraphics; this.maskId = ''; } - SVGExtraState.prototype = { - clone: function SVGExtraState_clone() { + _createClass(SVGExtraState, [{ + key: "clone", + value: function clone() { return Object.create(this); - }, - setCurrentPoint: function SVGExtraState_setCurrentPoint(x, y) { + } + }, { + key: "setCurrentPoint", + value: function setCurrentPoint(x, y) { this.x = x; this.y = y; } - }; + }]); + return SVGExtraState; }(); - exports.SVGGraphics = SVGGraphics = function SVGGraphicsClosure() { - function opListToTree(opList) { - var opTree = []; - var tmp = []; - var opListLen = opList.length; - - for (var x = 0; x < opListLen; x++) { - if (opList[x].fn === 'save') { - opTree.push({ - 'fnId': 92, - 'fn': 'group', - 'items': [] - }); - tmp.push(opTree); - opTree = opTree[opTree.length - 1].items; - continue; - } - - if (opList[x].fn === 'restore') { - opTree = tmp.pop(); - } else { - opTree.push(opList[x]); - } - } - - return opTree; - } - - function pf(value) { - if (Number.isInteger(value)) { - return value.toString(); - } - - var s = value.toFixed(10); - var i = s.length - 1; - - if (s[i] !== '0') { - return s; - } - - do { - i--; - } while (s[i] === '0'); - - return s.substring(0, s[i] === '.' ? i : i + 1); - } - - function pm(m) { - if (m[4] === 0 && m[5] === 0) { - if (m[1] === 0 && m[2] === 0) { - if (m[0] === 1 && m[3] === 1) { - return ''; - } - - return 'scale(' + pf(m[0]) + ' ' + pf(m[3]) + ')'; - } - - if (m[0] === m[3] && m[1] === -m[2]) { - var a = Math.acos(m[0]) * 180 / Math.PI; - return 'rotate(' + pf(a) + ')'; - } - } else { - if (m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1) { - return 'translate(' + pf(m[4]) + ' ' + pf(m[5]) + ')'; - } - } - - return 'matrix(' + pf(m[0]) + ' ' + pf(m[1]) + ' ' + pf(m[2]) + ' ' + pf(m[3]) + ' ' + pf(m[4]) + ' ' + pf(m[5]) + ')'; - } + var clipCount = 0; + var maskCount = 0; + var shadingCount = 0; + exports.SVGGraphics = SVGGraphics = + /*#__PURE__*/ + function () { function SVGGraphics(commonObjs, objs, forceDataSchema) { - this.svgFactory = new _dom_utils.DOMSVGFactory(); + _classCallCheck(this, SVGGraphics); + + this.svgFactory = new _display_utils.DOMSVGFactory(); this.current = new SVGExtraState(); this.transformMatrix = _util.IDENTITY_MATRIX; this.transformStack = []; @@ -20708,71 +21233,95 @@ exports.SVGGraphics = SVGGraphics; this.embeddedFonts = Object.create(null); this.cssStyle = null; this.forceDataSchema = !!forceDataSchema; + this._operatorIdMapping = []; + + for (var op in _util.OPS) { + this._operatorIdMapping[_util.OPS[op]] = op; + } } - var XML_NS = 'http://www.w3.org/XML/1998/namespace'; - var XLINK_NS = 'http://www.w3.org/1999/xlink'; - var LINE_CAP_STYLES = ['butt', 'round', 'square']; - var LINE_JOIN_STYLES = ['miter', 'round', 'bevel']; - var clipCount = 0; - var maskCount = 0; - SVGGraphics.prototype = { - save: function SVGGraphics_save() { + _createClass(SVGGraphics, [{ + key: "save", + value: function save() { this.transformStack.push(this.transformMatrix); var old = this.current; this.extraStack.push(old); this.current = old.clone(); - }, - restore: function SVGGraphics_restore() { + } + }, { + key: "restore", + value: function restore() { this.transformMatrix = this.transformStack.pop(); this.current = this.extraStack.pop(); this.pendingClip = null; this.tgrp = null; - }, - group: function SVGGraphics_group(items) { + } + }, { + key: "group", + value: function group(items) { this.save(); this.executeOpTree(items); this.restore(); - }, - loadDependencies: function SVGGraphics_loadDependencies(operatorList) { + } + }, { + key: "loadDependencies", + value: function loadDependencies(operatorList) { var _this = this; var fnArray = operatorList.fnArray; - var fnArrayLen = fnArray.length; var argsArray = operatorList.argsArray; - for (var i = 0; i < fnArrayLen; i++) { - if (_util.OPS.dependency === fnArray[i]) { - var deps = argsArray[i]; + for (var i = 0, ii = fnArray.length; i < ii; i++) { + if (fnArray[i] !== _util.OPS.dependency) { + continue; + } + + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; - for (var n = 0, nn = deps.length; n < nn; n++) { - var obj = deps[n]; - var common = obj.substring(0, 2) === 'g_'; - var promise; + try { + var _loop = function _loop() { + var obj = _step2.value; + var objsPool = obj.startsWith('g_') ? _this.commonObjs : _this.objs; + var promise = new Promise(function (resolve) { + objsPool.get(obj, resolve); + }); - if (common) { - promise = new Promise(function (resolve) { - _this.commonObjs.get(obj, resolve); - }); - } else { - promise = new Promise(function (resolve) { - _this.objs.get(obj, resolve); - }); - } + _this.current.dependencies.push(promise); + }; - this.current.dependencies.push(promise); + for (var _iterator2 = argsArray[i][Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + _loop(); + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } } } } return Promise.all(this.current.dependencies); - }, - transform: function SVGGraphics_transform(a, b, c, d, e, f) { + } + }, { + key: "transform", + value: function transform(a, b, c, d, e, f) { var transformMatrix = [a, b, c, d, e, f]; this.transformMatrix = _util.Util.transform(this.transformMatrix, transformMatrix); this.tgrp = null; - }, - getSVG: function SVGGraphics_getSVG(operatorList, viewport) { + } + }, { + key: "getSVG", + value: function getSVG(operatorList, viewport) { var _this2 = this; this.viewport = viewport; @@ -20782,276 +21331,328 @@ exports.SVGGraphics = SVGGraphics; return this.loadDependencies(operatorList).then(function () { _this2.transformMatrix = _util.IDENTITY_MATRIX; - var opTree = _this2.convertOpList(operatorList); - - _this2.executeOpTree(opTree); + _this2.executeOpTree(_this2.convertOpList(operatorList)); return svgElement; }); - }, - convertOpList: function SVGGraphics_convertOpList(operatorList) { + } + }, { + key: "convertOpList", + value: function convertOpList(operatorList) { + var operatorIdMapping = this._operatorIdMapping; var argsArray = operatorList.argsArray; var fnArray = operatorList.fnArray; - var fnArrayLen = fnArray.length; - var REVOPS = []; var opList = []; - for (var op in _util.OPS) { - REVOPS[_util.OPS[op]] = op; - } - - for (var x = 0; x < fnArrayLen; x++) { - var fnId = fnArray[x]; + for (var i = 0, ii = fnArray.length; i < ii; i++) { + var fnId = fnArray[i]; opList.push({ 'fnId': fnId, - 'fn': REVOPS[fnId], - 'args': argsArray[x] + 'fn': operatorIdMapping[fnId], + 'args': argsArray[i] }); } return opListToTree(opList); - }, - executeOpTree: function SVGGraphics_executeOpTree(opTree) { - var opTreeLen = opTree.length; + } + }, { + key: "executeOpTree", + value: function executeOpTree(opTree) { + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; - for (var x = 0; x < opTreeLen; x++) { - var fn = opTree[x].fn; - var fnId = opTree[x].fnId; - var args = opTree[x].args; + try { + for (var _iterator3 = opTree[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var opTreeElement = _step3.value; + var fn = opTreeElement.fn; + var fnId = opTreeElement.fnId; + var args = opTreeElement.args; + + switch (fnId | 0) { + case _util.OPS.beginText: + this.beginText(); + break; - switch (fnId | 0) { - case _util.OPS.beginText: - this.beginText(); - break; + case _util.OPS.dependency: + break; - case _util.OPS.dependency: - break; + case _util.OPS.setLeading: + this.setLeading(args); + break; - case _util.OPS.setLeading: - this.setLeading(args); - break; + case _util.OPS.setLeadingMoveText: + this.setLeadingMoveText(args[0], args[1]); + break; - case _util.OPS.setLeadingMoveText: - this.setLeadingMoveText(args[0], args[1]); - break; + case _util.OPS.setFont: + this.setFont(args); + break; - case _util.OPS.setFont: - this.setFont(args); - break; + case _util.OPS.showText: + this.showText(args[0]); + break; - case _util.OPS.showText: - this.showText(args[0]); - break; + case _util.OPS.showSpacedText: + this.showText(args[0]); + break; - case _util.OPS.showSpacedText: - this.showText(args[0]); - break; + case _util.OPS.endText: + this.endText(); + break; - case _util.OPS.endText: - this.endText(); - break; + case _util.OPS.moveText: + this.moveText(args[0], args[1]); + break; - case _util.OPS.moveText: - this.moveText(args[0], args[1]); - break; + case _util.OPS.setCharSpacing: + this.setCharSpacing(args[0]); + break; - case _util.OPS.setCharSpacing: - this.setCharSpacing(args[0]); - break; + case _util.OPS.setWordSpacing: + this.setWordSpacing(args[0]); + break; - case _util.OPS.setWordSpacing: - this.setWordSpacing(args[0]); - break; + case _util.OPS.setHScale: + this.setHScale(args[0]); + break; - case _util.OPS.setHScale: - this.setHScale(args[0]); - break; + case _util.OPS.setTextMatrix: + this.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]); + break; - case _util.OPS.setTextMatrix: - this.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]); - break; + case _util.OPS.setTextRise: + this.setTextRise(args[0]); + break; - case _util.OPS.setTextRise: - this.setTextRise(args[0]); - break; + case _util.OPS.setTextRenderingMode: + this.setTextRenderingMode(args[0]); + break; - case _util.OPS.setTextRenderingMode: - this.setTextRenderingMode(args[0]); - break; + case _util.OPS.setLineWidth: + this.setLineWidth(args[0]); + break; - case _util.OPS.setLineWidth: - this.setLineWidth(args[0]); - break; + case _util.OPS.setLineJoin: + this.setLineJoin(args[0]); + break; - case _util.OPS.setLineJoin: - this.setLineJoin(args[0]); - break; + case _util.OPS.setLineCap: + this.setLineCap(args[0]); + break; - case _util.OPS.setLineCap: - this.setLineCap(args[0]); - break; + case _util.OPS.setMiterLimit: + this.setMiterLimit(args[0]); + break; - case _util.OPS.setMiterLimit: - this.setMiterLimit(args[0]); - break; + case _util.OPS.setFillRGBColor: + this.setFillRGBColor(args[0], args[1], args[2]); + break; - case _util.OPS.setFillRGBColor: - this.setFillRGBColor(args[0], args[1], args[2]); - break; + case _util.OPS.setStrokeRGBColor: + this.setStrokeRGBColor(args[0], args[1], args[2]); + break; - case _util.OPS.setStrokeRGBColor: - this.setStrokeRGBColor(args[0], args[1], args[2]); - break; + case _util.OPS.setStrokeColorN: + this.setStrokeColorN(args); + break; - case _util.OPS.setDash: - this.setDash(args[0], args[1]); - break; + case _util.OPS.setFillColorN: + this.setFillColorN(args); + break; - case _util.OPS.setGState: - this.setGState(args[0]); - break; + case _util.OPS.shadingFill: + this.shadingFill(args[0]); + break; - case _util.OPS.fill: - this.fill(); - break; + case _util.OPS.setDash: + this.setDash(args[0], args[1]); + break; - case _util.OPS.eoFill: - this.eoFill(); - break; + case _util.OPS.setRenderingIntent: + this.setRenderingIntent(args[0]); + break; - case _util.OPS.stroke: - this.stroke(); - break; + case _util.OPS.setFlatness: + this.setFlatness(args[0]); + break; - case _util.OPS.fillStroke: - this.fillStroke(); - break; + case _util.OPS.setGState: + this.setGState(args[0]); + break; - case _util.OPS.eoFillStroke: - this.eoFillStroke(); - break; + case _util.OPS.fill: + this.fill(); + break; - case _util.OPS.clip: - this.clip('nonzero'); - break; + case _util.OPS.eoFill: + this.eoFill(); + break; - case _util.OPS.eoClip: - this.clip('evenodd'); - break; + case _util.OPS.stroke: + this.stroke(); + break; - case _util.OPS.paintSolidColorImageMask: - this.paintSolidColorImageMask(); - break; + case _util.OPS.fillStroke: + this.fillStroke(); + break; - case _util.OPS.paintJpegXObject: - this.paintJpegXObject(args[0], args[1], args[2]); - break; + case _util.OPS.eoFillStroke: + this.eoFillStroke(); + break; - case _util.OPS.paintImageXObject: - this.paintImageXObject(args[0]); - break; + case _util.OPS.clip: + this.clip('nonzero'); + break; - case _util.OPS.paintInlineImageXObject: - this.paintInlineImageXObject(args[0]); - break; + case _util.OPS.eoClip: + this.clip('evenodd'); + break; - case _util.OPS.paintImageMaskXObject: - this.paintImageMaskXObject(args[0]); - break; + case _util.OPS.paintSolidColorImageMask: + this.paintSolidColorImageMask(); + break; - case _util.OPS.paintFormXObjectBegin: - this.paintFormXObjectBegin(args[0], args[1]); - break; + case _util.OPS.paintJpegXObject: + this.paintJpegXObject(args[0], args[1], args[2]); + break; - case _util.OPS.paintFormXObjectEnd: - this.paintFormXObjectEnd(); - break; + case _util.OPS.paintImageXObject: + this.paintImageXObject(args[0]); + break; - case _util.OPS.closePath: - this.closePath(); - break; + case _util.OPS.paintInlineImageXObject: + this.paintInlineImageXObject(args[0]); + break; - case _util.OPS.closeStroke: - this.closeStroke(); - break; + case _util.OPS.paintImageMaskXObject: + this.paintImageMaskXObject(args[0]); + break; - case _util.OPS.closeFillStroke: - this.closeFillStroke(); - break; + case _util.OPS.paintFormXObjectBegin: + this.paintFormXObjectBegin(args[0], args[1]); + break; - case _util.OPS.closeEOFillStroke: - this.closeEOFillStroke(); - break; + case _util.OPS.paintFormXObjectEnd: + this.paintFormXObjectEnd(); + break; - case _util.OPS.nextLine: - this.nextLine(); - break; + case _util.OPS.closePath: + this.closePath(); + break; - case _util.OPS.transform: - this.transform(args[0], args[1], args[2], args[3], args[4], args[5]); - break; + case _util.OPS.closeStroke: + this.closeStroke(); + break; - case _util.OPS.constructPath: - this.constructPath(args[0], args[1]); - break; + case _util.OPS.closeFillStroke: + this.closeFillStroke(); + break; - case _util.OPS.endPath: - this.endPath(); - break; + case _util.OPS.closeEOFillStroke: + this.closeEOFillStroke(); + break; - case 92: - this.group(opTree[x].items); - break; + case _util.OPS.nextLine: + this.nextLine(); + break; - default: - (0, _util.warn)('Unimplemented operator ' + fn); - break; + case _util.OPS.transform: + this.transform(args[0], args[1], args[2], args[3], args[4], args[5]); + break; + + case _util.OPS.constructPath: + this.constructPath(args[0], args[1]); + break; + + case _util.OPS.endPath: + this.endPath(); + break; + + case 92: + this.group(opTreeElement.items); + break; + + default: + (0, _util.warn)("Unimplemented operator ".concat(fn)); + break; + } + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) { + _iterator3["return"](); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } } } - }, - setWordSpacing: function SVGGraphics_setWordSpacing(wordSpacing) { + } + }, { + key: "setWordSpacing", + value: function setWordSpacing(wordSpacing) { this.current.wordSpacing = wordSpacing; - }, - setCharSpacing: function SVGGraphics_setCharSpacing(charSpacing) { + } + }, { + key: "setCharSpacing", + value: function setCharSpacing(charSpacing) { this.current.charSpacing = charSpacing; - }, - nextLine: function SVGGraphics_nextLine() { + } + }, { + key: "nextLine", + value: function nextLine() { this.moveText(0, this.current.leading); - }, - setTextMatrix: function SVGGraphics_setTextMatrix(a, b, c, d, e, f) { + } + }, { + key: "setTextMatrix", + value: function setTextMatrix(a, b, c, d, e, f) { var current = this.current; - this.current.textMatrix = this.current.lineMatrix = [a, b, c, d, e, f]; - this.current.x = this.current.lineX = 0; - this.current.y = this.current.lineY = 0; + current.textMatrix = current.lineMatrix = [a, b, c, d, e, f]; + current.textMatrixScale = Math.sqrt(a * a + b * b); + current.x = current.lineX = 0; + current.y = current.lineY = 0; current.xcoords = []; current.tspan = this.svgFactory.createElement('svg:tspan'); current.tspan.setAttributeNS(null, 'font-family', current.fontFamily); - current.tspan.setAttributeNS(null, 'font-size', pf(current.fontSize) + 'px'); + current.tspan.setAttributeNS(null, 'font-size', "".concat(pf(current.fontSize), "px")); current.tspan.setAttributeNS(null, 'y', pf(-current.y)); current.txtElement = this.svgFactory.createElement('svg:text'); current.txtElement.appendChild(current.tspan); - }, - beginText: function SVGGraphics_beginText() { - this.current.x = this.current.lineX = 0; - this.current.y = this.current.lineY = 0; - this.current.textMatrix = _util.IDENTITY_MATRIX; - this.current.lineMatrix = _util.IDENTITY_MATRIX; - this.current.tspan = this.svgFactory.createElement('svg:tspan'); - this.current.txtElement = this.svgFactory.createElement('svg:text'); - this.current.txtgrp = this.svgFactory.createElement('svg:g'); - this.current.xcoords = []; - }, - moveText: function SVGGraphics_moveText(x, y) { + } + }, { + key: "beginText", + value: function beginText() { + var current = this.current; + current.x = current.lineX = 0; + current.y = current.lineY = 0; + current.textMatrix = _util.IDENTITY_MATRIX; + current.lineMatrix = _util.IDENTITY_MATRIX; + current.textMatrixScale = 1; + current.tspan = this.svgFactory.createElement('svg:tspan'); + current.txtElement = this.svgFactory.createElement('svg:text'); + current.txtgrp = this.svgFactory.createElement('svg:g'); + current.xcoords = []; + } + }, { + key: "moveText", + value: function moveText(x, y) { var current = this.current; - this.current.x = this.current.lineX += x; - this.current.y = this.current.lineY += y; + current.x = current.lineX += x; + current.y = current.lineY += y; current.xcoords = []; current.tspan = this.svgFactory.createElement('svg:tspan'); current.tspan.setAttributeNS(null, 'font-family', current.fontFamily); - current.tspan.setAttributeNS(null, 'font-size', pf(current.fontSize) + 'px'); + current.tspan.setAttributeNS(null, 'font-size', "".concat(pf(current.fontSize), "px")); current.tspan.setAttributeNS(null, 'y', pf(-current.y)); - }, - showText: function SVGGraphics_showText(glyphs) { + } + }, { + key: "showText", + value: function showText(glyphs) { var current = this.current; var font = current.font; var fontSize = current.fontSize; @@ -21064,36 +21665,52 @@ exports.SVGGraphics = SVGGraphics; var wordSpacing = current.wordSpacing; var fontDirection = current.fontDirection; var textHScale = current.textHScale * fontDirection; - var glyphsLength = glyphs.length; var vertical = font.vertical; var widthAdvanceScale = fontSize * current.fontMatrix[0]; - var x = 0, - i; + var x = 0; + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; - for (i = 0; i < glyphsLength; ++i) { - var glyph = glyphs[i]; + try { + for (var _iterator4 = glyphs[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var glyph = _step4.value; + + if (glyph === null) { + x += fontDirection * wordSpacing; + continue; + } else if ((0, _util.isNum)(glyph)) { + x += -glyph * fontSize * 0.001; + continue; + } - if (glyph === null) { - x += fontDirection * wordSpacing; - continue; - } else if ((0, _util.isNum)(glyph)) { - x += -glyph * fontSize * 0.001; - continue; - } + var width = glyph.width; + var character = glyph.fontChar; + var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; + var charWidth = width * widthAdvanceScale + spacing * fontDirection; - var width = glyph.width; - var character = glyph.fontChar; - var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; - var charWidth = width * widthAdvanceScale + spacing * fontDirection; + if (!glyph.isInFont && !font.missingFile) { + x += charWidth; + continue; + } - if (!glyph.isInFont && !font.missingFile) { + current.xcoords.push(current.x + x * textHScale); + current.tspan.textContent += character; x += charWidth; - continue; } - - current.xcoords.push(current.x + x * textHScale); - current.tspan.textContent += character; - x += charWidth; + } catch (err) { + _didIteratorError4 = true; + _iteratorError4 = err; + } finally { + try { + if (!_iteratorNormalCompletion4 && _iterator4["return"] != null) { + _iterator4["return"](); + } + } finally { + if (_didIteratorError4) { + throw _iteratorError4; + } + } } if (vertical) { @@ -21105,7 +21722,7 @@ exports.SVGGraphics = SVGGraphics; current.tspan.setAttributeNS(null, 'x', current.xcoords.map(pf).join(' ')); current.tspan.setAttributeNS(null, 'y', pf(-current.y)); current.tspan.setAttributeNS(null, 'font-family', current.fontFamily); - current.tspan.setAttributeNS(null, 'font-size', pf(current.fontSize) + 'px'); + current.tspan.setAttributeNS(null, 'font-size', "".concat(pf(current.fontSize), "px")); if (current.fontStyle !== SVG_DEFAULTS.fontStyle) { current.tspan.setAttributeNS(null, 'font-style', current.fontStyle); @@ -21132,7 +21749,9 @@ exports.SVGGraphics = SVGGraphics; } if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) { - this._setStrokeAttributes(current.tspan); + var lineWidthScale = 1 / (current.textMatrixScale || 1); + + this._setStrokeAttributes(current.tspan, lineWidthScale); } var textMatrix = current.textMatrix; @@ -21142,18 +21761,22 @@ exports.SVGGraphics = SVGGraphics; textMatrix[5] += current.textRise; } - current.txtElement.setAttributeNS(null, 'transform', pm(textMatrix) + ' scale(1, -1)'); + current.txtElement.setAttributeNS(null, 'transform', "".concat(pm(textMatrix), " scale(1, -1)")); current.txtElement.setAttributeNS(XML_NS, 'xml:space', 'preserve'); current.txtElement.appendChild(current.tspan); current.txtgrp.appendChild(current.txtElement); this._ensureTransformGroup().appendChild(current.txtElement); - }, - setLeadingMoveText: function SVGGraphics_setLeadingMoveText(x, y) { + } + }, { + key: "setLeadingMoveText", + value: function setLeadingMoveText(x, y) { this.setLeading(-y); this.moveText(x, y); - }, - addFontStyle: function SVGGraphics_addFontStyle(fontObj) { + } + }, { + key: "addFontStyle", + value: function addFontStyle(fontObj) { if (!this.cssStyle) { this.cssStyle = this.svgFactory.createElement('svg:style'); this.cssStyle.setAttributeNS(null, 'type', 'text/css'); @@ -21161,13 +21784,15 @@ exports.SVGGraphics = SVGGraphics; } var url = (0, _util.createObjectURL)(fontObj.data, fontObj.mimetype, this.forceDataSchema); - this.cssStyle.textContent += '@font-face { font-family: "' + fontObj.loadedName + '";' + ' src: url(' + url + '); }\n'; - }, - setFont: function SVGGraphics_setFont(details) { + this.cssStyle.textContent += "@font-face { font-family: \"".concat(fontObj.loadedName, "\";") + " src: url(".concat(url, "); }\n"); + } + }, { + key: "setFont", + value: function setFont(details) { var current = this.current; var fontObj = this.commonObjs.get(details[0]); var size = details[1]; - this.current.font = fontObj; + current.font = fontObj; if (this.embedFonts && fontObj.data && !this.embeddedFonts[fontObj.loadedName]) { this.addFontStyle(fontObj); @@ -21192,8 +21817,10 @@ exports.SVGGraphics = SVGGraphics; current.tspan = this.svgFactory.createElement('svg:tspan'); current.tspan.setAttributeNS(null, 'y', pf(-current.y)); current.xcoords = []; - }, - endText: function endText() { + } + }, { + key: "endText", + value: function endText() { var current = this.current; if (current.textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG && current.txtElement && current.txtElement.hasChildNodes()) { @@ -21201,118 +21828,365 @@ exports.SVGGraphics = SVGGraphics; this.clip('nonzero'); this.endPath(); } - }, - setLineWidth: function SVGGraphics_setLineWidth(width) { + } + }, { + key: "setLineWidth", + value: function setLineWidth(width) { if (width > 0) { this.current.lineWidth = width; } - }, - setLineCap: function SVGGraphics_setLineCap(style) { + } + }, { + key: "setLineCap", + value: function setLineCap(style) { this.current.lineCap = LINE_CAP_STYLES[style]; - }, - setLineJoin: function SVGGraphics_setLineJoin(style) { + } + }, { + key: "setLineJoin", + value: function setLineJoin(style) { this.current.lineJoin = LINE_JOIN_STYLES[style]; - }, - setMiterLimit: function SVGGraphics_setMiterLimit(limit) { + } + }, { + key: "setMiterLimit", + value: function setMiterLimit(limit) { this.current.miterLimit = limit; - }, - setStrokeAlpha: function SVGGraphics_setStrokeAlpha(strokeAlpha) { + } + }, { + key: "setStrokeAlpha", + value: function setStrokeAlpha(strokeAlpha) { this.current.strokeAlpha = strokeAlpha; - }, - setStrokeRGBColor: function SVGGraphics_setStrokeRGBColor(r, g, b) { - var color = _util.Util.makeCssRgb(r, g, b); - - this.current.strokeColor = color; - }, - setFillAlpha: function SVGGraphics_setFillAlpha(fillAlpha) { + } + }, { + key: "setStrokeRGBColor", + value: function setStrokeRGBColor(r, g, b) { + this.current.strokeColor = _util.Util.makeCssRgb(r, g, b); + } + }, { + key: "setFillAlpha", + value: function setFillAlpha(fillAlpha) { this.current.fillAlpha = fillAlpha; - }, - setFillRGBColor: function SVGGraphics_setFillRGBColor(r, g, b) { - var color = _util.Util.makeCssRgb(r, g, b); - - this.current.fillColor = color; + } + }, { + key: "setFillRGBColor", + value: function setFillRGBColor(r, g, b) { + this.current.fillColor = _util.Util.makeCssRgb(r, g, b); this.current.tspan = this.svgFactory.createElement('svg:tspan'); this.current.xcoords = []; - }, - setDash: function SVGGraphics_setDash(dashArray, dashPhase) { + } + }, { + key: "setStrokeColorN", + value: function setStrokeColorN(args) { + this.current.strokeColor = this._makeColorN_Pattern(args); + } + }, { + key: "setFillColorN", + value: function setFillColorN(args) { + this.current.fillColor = this._makeColorN_Pattern(args); + } + }, { + key: "shadingFill", + value: function shadingFill(args) { + var width = this.viewport.width; + var height = this.viewport.height; + + var inv = _util.Util.inverseTransform(this.transformMatrix); + + var bl = _util.Util.applyTransform([0, 0], inv); + + var br = _util.Util.applyTransform([0, height], inv); + + var ul = _util.Util.applyTransform([width, 0], inv); + + var ur = _util.Util.applyTransform([width, height], inv); + + var x0 = Math.min(bl[0], br[0], ul[0], ur[0]); + var y0 = Math.min(bl[1], br[1], ul[1], ur[1]); + var x1 = Math.max(bl[0], br[0], ul[0], ur[0]); + var y1 = Math.max(bl[1], br[1], ul[1], ur[1]); + var rect = this.svgFactory.createElement('svg:rect'); + rect.setAttributeNS(null, 'x', x0); + rect.setAttributeNS(null, 'y', y0); + rect.setAttributeNS(null, 'width', x1 - x0); + rect.setAttributeNS(null, 'height', y1 - y0); + rect.setAttributeNS(null, 'fill', this._makeShadingPattern(args)); + + this._ensureTransformGroup().appendChild(rect); + } + }, { + key: "_makeColorN_Pattern", + value: function _makeColorN_Pattern(args) { + if (args[0] === 'TilingPattern') { + return this._makeTilingPattern(args); + } + + return this._makeShadingPattern(args); + } + }, { + key: "_makeTilingPattern", + value: function _makeTilingPattern(args) { + var color = args[1]; + var operatorList = args[2]; + var matrix = args[3] || _util.IDENTITY_MATRIX; + + var _args$ = _slicedToArray(args[4], 4), + x0 = _args$[0], + y0 = _args$[1], + x1 = _args$[2], + y1 = _args$[3]; + + var xstep = args[5]; + var ystep = args[6]; + var paintType = args[7]; + var tilingId = "shading".concat(shadingCount++); + + var _Util$applyTransform = _util.Util.applyTransform([x0, y0], matrix), + _Util$applyTransform2 = _slicedToArray(_Util$applyTransform, 2), + tx0 = _Util$applyTransform2[0], + ty0 = _Util$applyTransform2[1]; + + var _Util$applyTransform3 = _util.Util.applyTransform([x1, y1], matrix), + _Util$applyTransform4 = _slicedToArray(_Util$applyTransform3, 2), + tx1 = _Util$applyTransform4[0], + ty1 = _Util$applyTransform4[1]; + + var _Util$singularValueDe = _util.Util.singularValueDecompose2dScale(matrix), + _Util$singularValueDe2 = _slicedToArray(_Util$singularValueDe, 2), + xscale = _Util$singularValueDe2[0], + yscale = _Util$singularValueDe2[1]; + + var txstep = xstep * xscale; + var tystep = ystep * yscale; + var tiling = this.svgFactory.createElement('svg:pattern'); + tiling.setAttributeNS(null, 'id', tilingId); + tiling.setAttributeNS(null, 'patternUnits', 'userSpaceOnUse'); + tiling.setAttributeNS(null, 'width', txstep); + tiling.setAttributeNS(null, 'height', tystep); + tiling.setAttributeNS(null, 'x', "".concat(tx0)); + tiling.setAttributeNS(null, 'y', "".concat(ty0)); + var svg = this.svg; + var transformMatrix = this.transformMatrix; + var fillColor = this.current.fillColor; + var strokeColor = this.current.strokeColor; + var bbox = this.svgFactory.create(tx1 - tx0, ty1 - ty0); + this.svg = bbox; + this.transformMatrix = matrix; + + if (paintType === 2) { + var cssColor = _util.Util.makeCssRgb.apply(_util.Util, _toConsumableArray(color)); + + this.current.fillColor = cssColor; + this.current.strokeColor = cssColor; + } + + this.executeOpTree(this.convertOpList(operatorList)); + this.svg = svg; + this.transformMatrix = transformMatrix; + this.current.fillColor = fillColor; + this.current.strokeColor = strokeColor; + tiling.appendChild(bbox.childNodes[0]); + this.defs.appendChild(tiling); + return "url(#".concat(tilingId, ")"); + } + }, { + key: "_makeShadingPattern", + value: function _makeShadingPattern(args) { + switch (args[0]) { + case 'RadialAxial': + var shadingId = "shading".concat(shadingCount++); + var colorStops = args[2]; + var gradient; + + switch (args[1]) { + case 'axial': + var point0 = args[3]; + var point1 = args[4]; + gradient = this.svgFactory.createElement('svg:linearGradient'); + gradient.setAttributeNS(null, 'id', shadingId); + gradient.setAttributeNS(null, 'gradientUnits', 'userSpaceOnUse'); + gradient.setAttributeNS(null, 'x1', point0[0]); + gradient.setAttributeNS(null, 'y1', point0[1]); + gradient.setAttributeNS(null, 'x2', point1[0]); + gradient.setAttributeNS(null, 'y2', point1[1]); + break; + + case 'radial': + var focalPoint = args[3]; + var circlePoint = args[4]; + var focalRadius = args[5]; + var circleRadius = args[6]; + gradient = this.svgFactory.createElement('svg:radialGradient'); + gradient.setAttributeNS(null, 'id', shadingId); + gradient.setAttributeNS(null, 'gradientUnits', 'userSpaceOnUse'); + gradient.setAttributeNS(null, 'cx', circlePoint[0]); + gradient.setAttributeNS(null, 'cy', circlePoint[1]); + gradient.setAttributeNS(null, 'r', circleRadius); + gradient.setAttributeNS(null, 'fx', focalPoint[0]); + gradient.setAttributeNS(null, 'fy', focalPoint[1]); + gradient.setAttributeNS(null, 'fr', focalRadius); + break; + + default: + throw new Error("Unknown RadialAxial type: ".concat(args[1])); + } + + var _iteratorNormalCompletion5 = true; + var _didIteratorError5 = false; + var _iteratorError5 = undefined; + + try { + for (var _iterator5 = colorStops[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { + var colorStop = _step5.value; + var stop = this.svgFactory.createElement('svg:stop'); + stop.setAttributeNS(null, 'offset', colorStop[0]); + stop.setAttributeNS(null, 'stop-color', colorStop[1]); + gradient.appendChild(stop); + } + } catch (err) { + _didIteratorError5 = true; + _iteratorError5 = err; + } finally { + try { + if (!_iteratorNormalCompletion5 && _iterator5["return"] != null) { + _iterator5["return"](); + } + } finally { + if (_didIteratorError5) { + throw _iteratorError5; + } + } + } + + this.defs.appendChild(gradient); + return "url(#".concat(shadingId, ")"); + + case 'Mesh': + (0, _util.warn)('Unimplemented pattern Mesh'); + return null; + + case 'Dummy': + return 'hotpink'; + + default: + throw new Error("Unknown IR type: ".concat(args[0])); + } + } + }, { + key: "setDash", + value: function setDash(dashArray, dashPhase) { this.current.dashArray = dashArray; this.current.dashPhase = dashPhase; - }, - constructPath: function SVGGraphics_constructPath(ops, args) { + } + }, { + key: "constructPath", + value: function constructPath(ops, args) { var current = this.current; var x = current.x, y = current.y; - current.path = this.svgFactory.createElement('svg:path'); var d = []; - var opLength = ops.length; - - for (var i = 0, j = 0; i < opLength; i++) { - switch (ops[i] | 0) { - case _util.OPS.rectangle: - x = args[j++]; - y = args[j++]; - var width = args[j++]; - var height = args[j++]; - var xw = x + width; - var yh = y + height; - d.push('M', pf(x), pf(y), 'L', pf(xw), pf(y), 'L', pf(xw), pf(yh), 'L', pf(x), pf(yh), 'Z'); - break; + var j = 0; + var _iteratorNormalCompletion6 = true; + var _didIteratorError6 = false; + var _iteratorError6 = undefined; - case _util.OPS.moveTo: - x = args[j++]; - y = args[j++]; - d.push('M', pf(x), pf(y)); - break; + try { + for (var _iterator6 = ops[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { + var op = _step6.value; + + switch (op | 0) { + case _util.OPS.rectangle: + x = args[j++]; + y = args[j++]; + var width = args[j++]; + var height = args[j++]; + var xw = x + width; + var yh = y + height; + d.push('M', pf(x), pf(y), 'L', pf(xw), pf(y), 'L', pf(xw), pf(yh), 'L', pf(x), pf(yh), 'Z'); + break; - case _util.OPS.lineTo: - x = args[j++]; - y = args[j++]; - d.push('L', pf(x), pf(y)); - break; + case _util.OPS.moveTo: + x = args[j++]; + y = args[j++]; + d.push('M', pf(x), pf(y)); + break; - case _util.OPS.curveTo: - x = args[j + 4]; - y = args[j + 5]; - d.push('C', pf(args[j]), pf(args[j + 1]), pf(args[j + 2]), pf(args[j + 3]), pf(x), pf(y)); - j += 6; - break; + case _util.OPS.lineTo: + x = args[j++]; + y = args[j++]; + d.push('L', pf(x), pf(y)); + break; - case _util.OPS.curveTo2: - x = args[j + 2]; - y = args[j + 3]; - d.push('C', pf(x), pf(y), pf(args[j]), pf(args[j + 1]), pf(args[j + 2]), pf(args[j + 3])); - j += 4; - break; + case _util.OPS.curveTo: + x = args[j + 4]; + y = args[j + 5]; + d.push('C', pf(args[j]), pf(args[j + 1]), pf(args[j + 2]), pf(args[j + 3]), pf(x), pf(y)); + j += 6; + break; - case _util.OPS.curveTo3: - x = args[j + 2]; - y = args[j + 3]; - d.push('C', pf(args[j]), pf(args[j + 1]), pf(x), pf(y), pf(x), pf(y)); - j += 4; - break; + case _util.OPS.curveTo2: + x = args[j + 2]; + y = args[j + 3]; + d.push('C', pf(x), pf(y), pf(args[j]), pf(args[j + 1]), pf(args[j + 2]), pf(args[j + 3])); + j += 4; + break; - case _util.OPS.closePath: - d.push('Z'); - break; + case _util.OPS.curveTo3: + x = args[j + 2]; + y = args[j + 3]; + d.push('C', pf(args[j]), pf(args[j + 1]), pf(x), pf(y), pf(x), pf(y)); + j += 4; + break; + + case _util.OPS.closePath: + d.push('Z'); + break; + } + } + } catch (err) { + _didIteratorError6 = true; + _iteratorError6 = err; + } finally { + try { + if (!_iteratorNormalCompletion6 && _iterator6["return"] != null) { + _iterator6["return"](); + } + } finally { + if (_didIteratorError6) { + throw _iteratorError6; + } } } - current.path.setAttributeNS(null, 'd', d.join(' ')); - current.path.setAttributeNS(null, 'fill', 'none'); + d = d.join(' '); - this._ensureTransformGroup().appendChild(current.path); + if (current.path && ops.length > 0 && ops[0] !== _util.OPS.rectangle && ops[0] !== _util.OPS.moveTo) { + d = current.path.getAttributeNS(null, 'd') + d; + } else { + current.path = this.svgFactory.createElement('svg:path'); + + this._ensureTransformGroup().appendChild(current.path); + } + current.path.setAttributeNS(null, 'd', d); + current.path.setAttributeNS(null, 'fill', 'none'); current.element = current.path; current.setCurrentPoint(x, y); - }, - endPath: function SVGGraphics_endPath() { + } + }, { + key: "endPath", + value: function endPath() { + var current = this.current; + current.path = null; + if (!this.pendingClip) { return; } - var current = this.current; - var clipId = 'clippath' + clipCount; - clipCount++; + if (!current.element) { + this.pendingClip = null; + return; + } + + var clipId = "clippath".concat(clipCount++); var clipPath = this.svgFactory.createElement('svg:clipPath'); clipPath.setAttributeNS(null, 'id', clipId); clipPath.setAttributeNS(null, 'transform', pm(this.transformMatrix)); @@ -21336,79 +22210,127 @@ exports.SVGGraphics = SVGGraphics; clipPath.setAttributeNS(null, 'clip-path', current.activeClipUrl); } - current.activeClipUrl = 'url(#' + clipId + ')'; + current.activeClipUrl = "url(#".concat(clipId, ")"); this.tgrp = null; - }, - clip: function SVGGraphics_clip(type) { + } + }, { + key: "clip", + value: function clip(type) { this.pendingClip = type; - }, - closePath: function SVGGraphics_closePath() { + } + }, { + key: "closePath", + value: function closePath() { var current = this.current; if (current.path) { - var d = current.path.getAttributeNS(null, 'd'); - d += 'Z'; + var d = "".concat(current.path.getAttributeNS(null, 'd'), "Z"); current.path.setAttributeNS(null, 'd', d); } - }, - setLeading: function SVGGraphics_setLeading(leading) { + } + }, { + key: "setLeading", + value: function setLeading(leading) { this.current.leading = -leading; - }, - setTextRise: function SVGGraphics_setTextRise(textRise) { + } + }, { + key: "setTextRise", + value: function setTextRise(textRise) { this.current.textRise = textRise; - }, - setTextRenderingMode: function setTextRenderingMode(textRenderingMode) { + } + }, { + key: "setTextRenderingMode", + value: function setTextRenderingMode(textRenderingMode) { this.current.textRenderingMode = textRenderingMode; - }, - setHScale: function SVGGraphics_setHScale(scale) { + } + }, { + key: "setHScale", + value: function setHScale(scale) { this.current.textHScale = scale / 100; - }, - setGState: function SVGGraphics_setGState(states) { - for (var i = 0, ii = states.length; i < ii; i++) { - var state = states[i]; - var key = state[0]; - var value = state[1]; - - switch (key) { - case 'LW': - this.setLineWidth(value); - break; + } + }, { + key: "setRenderingIntent", + value: function setRenderingIntent(intent) {} + }, { + key: "setFlatness", + value: function setFlatness(flatness) {} + }, { + key: "setGState", + value: function setGState(states) { + var _iteratorNormalCompletion7 = true; + var _didIteratorError7 = false; + var _iteratorError7 = undefined; - case 'LC': - this.setLineCap(value); - break; + try { + for (var _iterator7 = states[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) { + var _step7$value = _slicedToArray(_step7.value, 2), + key = _step7$value[0], + value = _step7$value[1]; + + switch (key) { + case 'LW': + this.setLineWidth(value); + break; - case 'LJ': - this.setLineJoin(value); - break; + case 'LC': + this.setLineCap(value); + break; - case 'ML': - this.setMiterLimit(value); - break; + case 'LJ': + this.setLineJoin(value); + break; - case 'D': - this.setDash(value[0], value[1]); - break; + case 'ML': + this.setMiterLimit(value); + break; - case 'Font': - this.setFont(value); - break; + case 'D': + this.setDash(value[0], value[1]); + break; - case 'CA': - this.setStrokeAlpha(value); - break; + case 'RI': + this.setRenderingIntent(value); + break; - case 'ca': - this.setFillAlpha(value); - break; + case 'FL': + this.setFlatness(value); + break; - default: - (0, _util.warn)('Unimplemented graphic state ' + key); - break; + case 'Font': + this.setFont(value); + break; + + case 'CA': + this.setStrokeAlpha(value); + break; + + case 'ca': + this.setFillAlpha(value); + break; + + default: + (0, _util.warn)("Unimplemented graphic state operator ".concat(key)); + break; + } + } + } catch (err) { + _didIteratorError7 = true; + _iteratorError7 = err; + } finally { + try { + if (!_iteratorNormalCompletion7 && _iterator7["return"] != null) { + _iterator7["return"](); + } + } finally { + if (_didIteratorError7) { + throw _iteratorError7; + } } } - }, - fill: function SVGGraphics_fill() { + } + }, { + key: "fill", + value: function fill() { var current = this.current; if (current.element) { @@ -21416,8 +22338,10 @@ exports.SVGGraphics = SVGGraphics; current.element.setAttributeNS(null, 'fill-opacity', current.fillAlpha); this.endPath(); } - }, - stroke: function SVGGraphics_stroke() { + } + }, { + key: "stroke", + value: function stroke() { var current = this.current; if (current.element) { @@ -21426,60 +22350,86 @@ exports.SVGGraphics = SVGGraphics; current.element.setAttributeNS(null, 'fill', 'none'); this.endPath(); } - }, - _setStrokeAttributes: function _setStrokeAttributes(element) { + } + }, { + key: "_setStrokeAttributes", + value: function _setStrokeAttributes(element) { + var lineWidthScale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var current = this.current; + var dashArray = current.dashArray; + + if (lineWidthScale !== 1 && dashArray.length > 0) { + dashArray = dashArray.map(function (value) { + return lineWidthScale * value; + }); + } + element.setAttributeNS(null, 'stroke', current.strokeColor); element.setAttributeNS(null, 'stroke-opacity', current.strokeAlpha); element.setAttributeNS(null, 'stroke-miterlimit', pf(current.miterLimit)); element.setAttributeNS(null, 'stroke-linecap', current.lineCap); element.setAttributeNS(null, 'stroke-linejoin', current.lineJoin); - element.setAttributeNS(null, 'stroke-width', pf(current.lineWidth) + 'px'); - element.setAttributeNS(null, 'stroke-dasharray', current.dashArray.map(pf).join(' ')); - element.setAttributeNS(null, 'stroke-dashoffset', pf(current.dashPhase) + 'px'); - }, - eoFill: function SVGGraphics_eoFill() { + element.setAttributeNS(null, 'stroke-width', pf(lineWidthScale * current.lineWidth) + 'px'); + element.setAttributeNS(null, 'stroke-dasharray', dashArray.map(pf).join(' ')); + element.setAttributeNS(null, 'stroke-dashoffset', pf(lineWidthScale * current.dashPhase) + 'px'); + } + }, { + key: "eoFill", + value: function eoFill() { if (this.current.element) { this.current.element.setAttributeNS(null, 'fill-rule', 'evenodd'); } this.fill(); - }, - fillStroke: function SVGGraphics_fillStroke() { + } + }, { + key: "fillStroke", + value: function fillStroke() { this.stroke(); this.fill(); - }, - eoFillStroke: function SVGGraphics_eoFillStroke() { + } + }, { + key: "eoFillStroke", + value: function eoFillStroke() { if (this.current.element) { this.current.element.setAttributeNS(null, 'fill-rule', 'evenodd'); } this.fillStroke(); - }, - closeStroke: function SVGGraphics_closeStroke() { + } + }, { + key: "closeStroke", + value: function closeStroke() { this.closePath(); this.stroke(); - }, - closeFillStroke: function SVGGraphics_closeFillStroke() { + } + }, { + key: "closeFillStroke", + value: function closeFillStroke() { this.closePath(); this.fillStroke(); - }, - closeEOFillStroke: function closeEOFillStroke() { + } + }, { + key: "closeEOFillStroke", + value: function closeEOFillStroke() { this.closePath(); this.eoFillStroke(); - }, - paintSolidColorImageMask: function SVGGraphics_paintSolidColorImageMask() { - var current = this.current; + } + }, { + key: "paintSolidColorImageMask", + value: function paintSolidColorImageMask() { var rect = this.svgFactory.createElement('svg:rect'); rect.setAttributeNS(null, 'x', '0'); rect.setAttributeNS(null, 'y', '0'); rect.setAttributeNS(null, 'width', '1px'); rect.setAttributeNS(null, 'height', '1px'); - rect.setAttributeNS(null, 'fill', current.fillColor); + rect.setAttributeNS(null, 'fill', this.current.fillColor); this._ensureTransformGroup().appendChild(rect); - }, - paintJpegXObject: function SVGGraphics_paintJpegXObject(objId, w, h) { + } + }, { + key: "paintJpegXObject", + value: function paintJpegXObject(objId, w, h) { var imgObj = this.objs.get(objId); var imgEl = this.svgFactory.createElement('svg:image'); imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgObj.src); @@ -21487,21 +22437,25 @@ exports.SVGGraphics = SVGGraphics; imgEl.setAttributeNS(null, 'height', pf(h)); imgEl.setAttributeNS(null, 'x', '0'); imgEl.setAttributeNS(null, 'y', pf(-h)); - imgEl.setAttributeNS(null, 'transform', 'scale(' + pf(1 / w) + ' ' + pf(-1 / h) + ')'); + imgEl.setAttributeNS(null, 'transform', "scale(".concat(pf(1 / w), " ").concat(pf(-1 / h), ")")); this._ensureTransformGroup().appendChild(imgEl); - }, - paintImageXObject: function SVGGraphics_paintImageXObject(objId) { + } + }, { + key: "paintImageXObject", + value: function paintImageXObject(objId) { var imgData = this.objs.get(objId); if (!imgData) { - (0, _util.warn)('Dependent image isn\'t ready yet'); + (0, _util.warn)("Dependent image with object ID ".concat(objId, " is not ready yet")); return; } this.paintInlineImageXObject(imgData); - }, - paintInlineImageXObject: function SVGGraphics_paintInlineImageXObject(imgData, mask) { + } + }, { + key: "paintInlineImageXObject", + value: function paintInlineImageXObject(imgData, mask) { var width = imgData.width; var height = imgData.height; var imgSrc = convertImgDataToPng(imgData, this.forceDataSchema, !!mask); @@ -21518,20 +22472,22 @@ exports.SVGGraphics = SVGGraphics; imgEl.setAttributeNS(null, 'y', pf(-height)); imgEl.setAttributeNS(null, 'width', pf(width) + 'px'); imgEl.setAttributeNS(null, 'height', pf(height) + 'px'); - imgEl.setAttributeNS(null, 'transform', 'scale(' + pf(1 / width) + ' ' + pf(-1 / height) + ')'); + imgEl.setAttributeNS(null, 'transform', "scale(".concat(pf(1 / width), " ").concat(pf(-1 / height), ")")); if (mask) { mask.appendChild(imgEl); } else { this._ensureTransformGroup().appendChild(imgEl); } - }, - paintImageMaskXObject: function SVGGraphics_paintImageMaskXObject(imgData) { + } + }, { + key: "paintImageMaskXObject", + value: function paintImageMaskXObject(imgData) { var current = this.current; var width = imgData.width; var height = imgData.height; var fillColor = current.fillColor; - current.maskId = 'mask' + maskCount++; + current.maskId = "mask".concat(maskCount++); var mask = this.svgFactory.createElement('svg:mask'); mask.setAttributeNS(null, 'id', current.maskId); var rect = this.svgFactory.createElement('svg:rect'); @@ -21540,14 +22496,16 @@ exports.SVGGraphics = SVGGraphics; rect.setAttributeNS(null, 'width', pf(width)); rect.setAttributeNS(null, 'height', pf(height)); rect.setAttributeNS(null, 'fill', fillColor); - rect.setAttributeNS(null, 'mask', 'url(#' + current.maskId + ')'); + rect.setAttributeNS(null, 'mask', "url(#".concat(current.maskId, ")")); this.defs.appendChild(mask); this._ensureTransformGroup().appendChild(rect); this.paintInlineImageXObject(imgData, mask); - }, - paintFormXObjectBegin: function SVGGraphics_paintFormXObjectBegin(matrix, bbox) { + } + }, { + key: "paintFormXObjectBegin", + value: function paintFormXObjectBegin(matrix, bbox) { if (Array.isArray(matrix) && matrix.length === 6) { this.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]); } @@ -21564,9 +22522,13 @@ exports.SVGGraphics = SVGGraphics; this.clip('nonzero'); this.endPath(); } - }, - paintFormXObjectEnd: function SVGGraphics_paintFormXObjectEnd() {}, - _initialize: function _initialize(viewport) { + } + }, { + key: "paintFormXObjectEnd", + value: function paintFormXObjectEnd() {} + }, { + key: "_initialize", + value: function _initialize(viewport) { var svg = this.svgFactory.create(viewport.width, viewport.height); var definitions = this.svgFactory.createElement('svg:defs'); svg.appendChild(definitions); @@ -21576,8 +22538,10 @@ exports.SVGGraphics = SVGGraphics; svg.appendChild(rootGroup); this.svg = rootGroup; return svg; - }, - _ensureClipGroup: function SVGGraphics_ensureClipGroup() { + } + }, { + key: "_ensureClipGroup", + value: function _ensureClipGroup() { if (!this.current.clipGroup) { var clipGroup = this.svgFactory.createElement('svg:g'); clipGroup.setAttributeNS(null, 'clip-path', this.current.activeClipUrl); @@ -21586,8 +22550,10 @@ exports.SVGGraphics = SVGGraphics; } return this.current.clipGroup; - }, - _ensureTransformGroup: function SVGGraphics_ensureTransformGroup() { + } + }, { + key: "_ensureTransformGroup", + value: function _ensureTransformGroup() { if (!this.tgrp) { this.tgrp = this.svgFactory.createElement('svg:g'); this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); @@ -21601,7 +22567,8 @@ exports.SVGGraphics = SVGGraphics; return this.tgrp; } - }; + }]); + return SVGGraphics; }(); } @@ -21618,13 +22585,13 @@ Object.defineProperty(exports, "__esModule", { }); exports.PDFNodeStream = void 0; -var _regenerator = _interopRequireDefault(__w_pdfjs_require__(147)); +var _regenerator = _interopRequireDefault(__w_pdfjs_require__(148)); var _util = __w_pdfjs_require__(1); var _network_utils = __w_pdfjs_require__(166); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } @@ -21687,20 +22654,24 @@ function () { this.isHttp = this.url.protocol === 'http:' || this.url.protocol === 'https:'; this.isFsUrl = this.url.protocol === 'file:'; this.httpHeaders = this.isHttp && source.httpHeaders || {}; - this._fullRequest = null; + this._fullRequestReader = null; this._rangeRequestReaders = []; } _createClass(PDFNodeStream, [{ key: "getFullReader", value: function getFullReader() { - (0, _util.assert)(!this._fullRequest); - this._fullRequest = this.isFsUrl ? new PDFNodeStreamFsFullReader(this) : new PDFNodeStreamFullReader(this); - return this._fullRequest; + (0, _util.assert)(!this._fullRequestReader); + this._fullRequestReader = this.isFsUrl ? new PDFNodeStreamFsFullReader(this) : new PDFNodeStreamFullReader(this); + return this._fullRequestReader; } }, { key: "getRangeReader", value: function getRangeReader(start, end) { + if (end <= this._progressiveDataLength) { + return null; + } + var rangeReader = this.isFsUrl ? new PDFNodeStreamFsRangeReader(this, start, end) : new PDFNodeStreamRangeReader(this, start, end); this._rangeRequestReaders.push(rangeReader); @@ -21710,8 +22681,8 @@ function () { }, { key: "cancelAllRequests", value: function cancelAllRequests(reason) { - if (this._fullRequest) { - this._fullRequest.cancel(reason); + if (this._fullRequestReader) { + this._fullRequestReader.cancel(reason); } var readers = this._rangeRequestReaders.slice(0); @@ -21720,6 +22691,11 @@ function () { reader.cancel(reason); }); } + }, { + key: "_progressiveDataLength", + get: function get() { + return this._fullRequestReader ? this._fullRequestReader._loaded : 0; + } }]); return PDFNodeStream; @@ -21760,9 +22736,9 @@ function () { value: function () { var _read = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee() { + _regenerator["default"].mark(function _callee() { var chunk, buffer; - return _regenerator.default.wrap(function _callee$(_context) { + return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: @@ -21926,9 +22902,9 @@ function () { value: function () { var _read2 = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee2() { + _regenerator["default"].mark(function _callee2() { var chunk, buffer; - return _regenerator.default.wrap(function _callee2$(_context2) { + return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: @@ -22550,9 +23526,9 @@ function getFilenameFromContentDispositionHeader(contentDisposition) { Object.defineProperty(exports, "__esModule", { value: true }); -exports.PDFFetchStream = void 0; +exports.PDFNetworkStream = void 0; -var _regenerator = _interopRequireDefault(__w_pdfjs_require__(147)); +var _regenerator = _interopRequireDefault(__w_pdfjs_require__(148)); var _util = __w_pdfjs_require__(1); @@ -22570,41 +23546,256 @@ function _defineProperties(target, props) { for (var i = 0; i < props.length; i+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } -function createFetchOptions(headers, withCredentials, abortController) { - return { - method: 'GET', - headers: headers, - signal: abortController && abortController.signal, - mode: 'cors', - credentials: withCredentials ? 'include' : 'same-origin', - redirect: 'follow' - }; +; +var OK_RESPONSE = 200; +var PARTIAL_CONTENT_RESPONSE = 206; + +function getArrayBuffer(xhr) { + var data = xhr.response; + + if (typeof data !== 'string') { + return data; + } + + var array = (0, _util.stringToBytes)(data); + return array.buffer; } -var PDFFetchStream = +var NetworkManager = /*#__PURE__*/ function () { - function PDFFetchStream(source) { - _classCallCheck(this, PDFFetchStream); + function NetworkManager(url, args) { + _classCallCheck(this, NetworkManager); - this.source = source; - this.isHttp = /^https?:/i.test(source.url); - this.httpHeaders = this.isHttp && source.httpHeaders || {}; + this.url = url; + args = args || {}; + this.isHttp = /^https?:/i.test(url); + this.httpHeaders = this.isHttp && args.httpHeaders || {}; + this.withCredentials = args.withCredentials || false; + + this.getXhr = args.getXhr || function NetworkManager_getXhr() { + return new XMLHttpRequest(); + }; + + this.currXhrId = 0; + this.pendingRequests = Object.create(null); + } + + _createClass(NetworkManager, [{ + key: "requestRange", + value: function requestRange(begin, end, listeners) { + var args = { + begin: begin, + end: end + }; + + for (var prop in listeners) { + args[prop] = listeners[prop]; + } + + return this.request(args); + } + }, { + key: "requestFull", + value: function requestFull(listeners) { + return this.request(listeners); + } + }, { + key: "request", + value: function request(args) { + var xhr = this.getXhr(); + var xhrId = this.currXhrId++; + var pendingRequest = this.pendingRequests[xhrId] = { + xhr: xhr + }; + xhr.open('GET', this.url); + xhr.withCredentials = this.withCredentials; + + for (var property in this.httpHeaders) { + var value = this.httpHeaders[property]; + + if (typeof value === 'undefined') { + continue; + } + + xhr.setRequestHeader(property, value); + } + + if (this.isHttp && 'begin' in args && 'end' in args) { + xhr.setRequestHeader('Range', "bytes=".concat(args.begin, "-").concat(args.end - 1)); + pendingRequest.expectedStatus = PARTIAL_CONTENT_RESPONSE; + } else { + pendingRequest.expectedStatus = OK_RESPONSE; + } + + xhr.responseType = 'arraybuffer'; + + if (args.onError) { + xhr.onerror = function (evt) { + args.onError(xhr.status); + }; + } + + xhr.onreadystatechange = this.onStateChange.bind(this, xhrId); + xhr.onprogress = this.onProgress.bind(this, xhrId); + pendingRequest.onHeadersReceived = args.onHeadersReceived; + pendingRequest.onDone = args.onDone; + pendingRequest.onError = args.onError; + pendingRequest.onProgress = args.onProgress; + xhr.send(null); + return xhrId; + } + }, { + key: "onProgress", + value: function onProgress(xhrId, evt) { + var pendingRequest = this.pendingRequests[xhrId]; + + if (!pendingRequest) { + return; + } + + if (pendingRequest.onProgress) { + pendingRequest.onProgress(evt); + } + } + }, { + key: "onStateChange", + value: function onStateChange(xhrId, evt) { + var pendingRequest = this.pendingRequests[xhrId]; + + if (!pendingRequest) { + return; + } + + var xhr = pendingRequest.xhr; + + if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) { + pendingRequest.onHeadersReceived(); + delete pendingRequest.onHeadersReceived; + } + + if (xhr.readyState !== 4) { + return; + } + + if (!(xhrId in this.pendingRequests)) { + return; + } + + delete this.pendingRequests[xhrId]; + + if (xhr.status === 0 && this.isHttp) { + if (pendingRequest.onError) { + pendingRequest.onError(xhr.status); + } + + return; + } + + var xhrStatus = xhr.status || OK_RESPONSE; + var ok_response_on_range_request = xhrStatus === OK_RESPONSE && pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE; + + if (!ok_response_on_range_request && xhrStatus !== pendingRequest.expectedStatus) { + if (pendingRequest.onError) { + pendingRequest.onError(xhr.status); + } + + return; + } + + var chunk = getArrayBuffer(xhr); + + if (xhrStatus === PARTIAL_CONTENT_RESPONSE) { + var rangeHeader = xhr.getResponseHeader('Content-Range'); + var matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader); + pendingRequest.onDone({ + begin: parseInt(matches[1], 10), + chunk: chunk + }); + } else if (chunk) { + pendingRequest.onDone({ + begin: 0, + chunk: chunk + }); + } else if (pendingRequest.onError) { + pendingRequest.onError(xhr.status); + } + } + }, { + key: "hasPendingRequests", + value: function hasPendingRequests() { + for (var xhrId in this.pendingRequests) { + return true; + } + + return false; + } + }, { + key: "getRequestXhr", + value: function getRequestXhr(xhrId) { + return this.pendingRequests[xhrId].xhr; + } + }, { + key: "isPendingRequest", + value: function isPendingRequest(xhrId) { + return xhrId in this.pendingRequests; + } + }, { + key: "abortAllRequests", + value: function abortAllRequests() { + for (var xhrId in this.pendingRequests) { + this.abortRequest(xhrId | 0); + } + } + }, { + key: "abortRequest", + value: function abortRequest(xhrId) { + var xhr = this.pendingRequests[xhrId].xhr; + delete this.pendingRequests[xhrId]; + xhr.abort(); + } + }]); + + return NetworkManager; +}(); + +var PDFNetworkStream = +/*#__PURE__*/ +function () { + function PDFNetworkStream(source) { + _classCallCheck(this, PDFNetworkStream); + + this._source = source; + this._manager = new NetworkManager(source.url, { + httpHeaders: source.httpHeaders, + withCredentials: source.withCredentials + }); + this._rangeChunkSize = source.rangeChunkSize; this._fullRequestReader = null; this._rangeRequestReaders = []; } - _createClass(PDFFetchStream, [{ + _createClass(PDFNetworkStream, [{ + key: "_onRangeRequestReaderClosed", + value: function _onRangeRequestReaderClosed(reader) { + var i = this._rangeRequestReaders.indexOf(reader); + + if (i >= 0) { + this._rangeRequestReaders.splice(i, 1); + } + } + }, { key: "getFullReader", value: function getFullReader() { (0, _util.assert)(!this._fullRequestReader); - this._fullRequestReader = new PDFFetchStreamReader(this); + this._fullRequestReader = new PDFNetworkStreamFullRequestReader(this._manager, this._source); return this._fullRequestReader; } }, { key: "getRangeReader", value: function getRangeReader(begin, end) { - var reader = new PDFFetchStreamRangeReader(this, begin, end); + var reader = new PDFNetworkStreamRangeRequestReader(this._manager, begin, end); + reader.onClosed = this._onRangeRequestReaderClosed.bind(this); this._rangeRequestReaders.push(reader); @@ -22625,137 +23816,184 @@ function () { } }]); - return PDFFetchStream; + return PDFNetworkStream; }(); -exports.PDFFetchStream = PDFFetchStream; +exports.PDFNetworkStream = PDFNetworkStream; -var PDFFetchStreamReader = +var PDFNetworkStreamFullRequestReader = /*#__PURE__*/ function () { - function PDFFetchStreamReader(stream) { - var _this = this; - - _classCallCheck(this, PDFFetchStreamReader); + function PDFNetworkStreamFullRequestReader(manager, source) { + _classCallCheck(this, PDFNetworkStreamFullRequestReader); - this._stream = stream; - this._reader = null; - this._loaded = 0; - this._filename = null; - var source = stream.source; - this._withCredentials = source.withCredentials; - this._contentLength = source.length; - this._headersCapability = (0, _util.createPromiseCapability)(); + this._manager = manager; + var args = { + onHeadersReceived: this._onHeadersReceived.bind(this), + onDone: this._onDone.bind(this), + onError: this._onError.bind(this), + onProgress: this._onProgress.bind(this) + }; + this._url = source.url; + this._fullRequestId = manager.requestFull(args); + this._headersReceivedCapability = (0, _util.createPromiseCapability)(); this._disableRange = source.disableRange || false; + this._contentLength = source.length; this._rangeChunkSize = source.rangeChunkSize; if (!this._rangeChunkSize && !this._disableRange) { this._disableRange = true; } - if (typeof AbortController !== 'undefined') { - this._abortController = new AbortController(); - } - - this._isStreamingSupported = !source.disableStream; - this._isRangeSupported = !source.disableRange; - this._headers = new Headers(); - - for (var property in this._stream.httpHeaders) { - var value = this._stream.httpHeaders[property]; - - if (typeof value === 'undefined') { - continue; - } - - this._headers.append(property, value); - } - - var url = source.url; - fetch(url, createFetchOptions(this._headers, this._withCredentials, this._abortController)).then(function (response) { - if (!(0, _network_utils.validateResponseStatus)(response.status)) { - throw (0, _network_utils.createResponseStatusError)(response.status, url); - } + this._isStreamingSupported = false; + this._isRangeSupported = false; + this._cachedChunks = []; + this._requests = []; + this._done = false; + this._storedError = undefined; + this._filename = null; + this.onProgress = null; + } - _this._reader = response.body.getReader(); + _createClass(PDFNetworkStreamFullRequestReader, [{ + key: "_onHeadersReceived", + value: function _onHeadersReceived() { + var fullRequestXhrId = this._fullRequestId; - _this._headersCapability.resolve(); + var fullRequestXhr = this._manager.getRequestXhr(fullRequestXhrId); var getResponseHeader = function getResponseHeader(name) { - return response.headers.get(name); + return fullRequestXhr.getResponseHeader(name); }; var _validateRangeRequest = (0, _network_utils.validateRangeRequestCapabilities)({ getResponseHeader: getResponseHeader, - isHttp: _this._stream.isHttp, - rangeChunkSize: _this._rangeChunkSize, - disableRange: _this._disableRange + isHttp: this._manager.isHttp, + rangeChunkSize: this._rangeChunkSize, + disableRange: this._disableRange }), allowRangeRequests = _validateRangeRequest.allowRangeRequests, suggestedLength = _validateRangeRequest.suggestedLength; - _this._isRangeSupported = allowRangeRequests; - _this._contentLength = suggestedLength || _this._contentLength; - _this._filename = (0, _network_utils.extractFilenameFromHeader)(getResponseHeader); + if (allowRangeRequests) { + this._isRangeSupported = true; + } - if (!_this._isStreamingSupported && _this._isRangeSupported) { - _this.cancel(new _util.AbortException('streaming is disabled')); + this._contentLength = suggestedLength || this._contentLength; + this._filename = (0, _network_utils.extractFilenameFromHeader)(getResponseHeader); + + if (this._isRangeSupported) { + this._manager.abortRequest(fullRequestXhrId); } - }).catch(this._headersCapability.reject); - this.onProgress = null; - } - _createClass(PDFFetchStreamReader, [{ + this._headersReceivedCapability.resolve(); + } + }, { + key: "_onDone", + value: function _onDone(args) { + if (args) { + if (this._requests.length > 0) { + var requestCapability = this._requests.shift(); + + requestCapability.resolve({ + value: args.chunk, + done: false + }); + } else { + this._cachedChunks.push(args.chunk); + } + } + + this._done = true; + + if (this._cachedChunks.length > 0) { + return; + } + + this._requests.forEach(function (requestCapability) { + requestCapability.resolve({ + value: undefined, + done: true + }); + }); + + this._requests = []; + } + }, { + key: "_onError", + value: function _onError(status) { + var url = this._url; + var exception = (0, _network_utils.createResponseStatusError)(status, url); + this._storedError = exception; + + this._headersReceivedCapability.reject(exception); + + this._requests.forEach(function (requestCapability) { + requestCapability.reject(exception); + }); + + this._requests = []; + this._cachedChunks = []; + } + }, { + key: "_onProgress", + value: function _onProgress(data) { + if (this.onProgress) { + this.onProgress({ + loaded: data.loaded, + total: data.lengthComputable ? data.total : this._contentLength + }); + } + } + }, { key: "read", value: function () { var _read = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee() { - var _ref, value, done, buffer; - - return _regenerator.default.wrap(function _callee$(_context) { + _regenerator["default"].mark(function _callee() { + var chunk, requestCapability; + return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: - _context.next = 2; - return this._headersCapability.promise; - - case 2: - _context.next = 4; - return this._reader.read(); + if (!this._storedError) { + _context.next = 2; + break; + } - case 4: - _ref = _context.sent; - value = _ref.value; - done = _ref.done; + throw this._storedError; - if (!done) { - _context.next = 9; + case 2: + if (!(this._cachedChunks.length > 0)) { + _context.next = 5; break; } + chunk = this._cachedChunks.shift(); return _context.abrupt("return", { - value: value, - done: done + value: chunk, + done: false }); - case 9: - this._loaded += value.byteLength; - - if (this.onProgress) { - this.onProgress({ - loaded: this._loaded, - total: this._contentLength - }); + case 5: + if (!this._done) { + _context.next = 7; + break; } - buffer = new Uint8Array(value).buffer; return _context.abrupt("return", { - value: buffer, - done: false + value: undefined, + done: true }); - case 13: + case 7: + requestCapability = (0, _util.createPromiseCapability)(); + + this._requests.push(requestCapability); + + return _context.abrupt("return", requestCapability.promise); + + case 10: case "end": return _context.stop(); } @@ -22772,29 +24010,30 @@ function () { }, { key: "cancel", value: function cancel(reason) { - if (this._reader) { - this._reader.cancel(reason); - } + this._done = true; - if (this._abortController) { - this._abortController.abort(); + this._headersReceivedCapability.reject(reason); + + this._requests.forEach(function (requestCapability) { + requestCapability.resolve({ + value: undefined, + done: true + }); + }); + + this._requests = []; + + if (this._manager.isPendingRequest(this._fullRequestId)) { + this._manager.abortRequest(this._fullRequestId); } - } - }, { - key: "headersReady", - get: function get() { - return this._headersCapability.promise; + + this._fullRequestReader = null; } }, { key: "filename", get: function get() { return this._filename; } - }, { - key: "contentLength", - get: function get() { - return this._contentLength; - } }, { key: "isRangeSupported", get: function get() { @@ -22805,110 +24044,127 @@ function () { get: function get() { return this._isStreamingSupported; } + }, { + key: "contentLength", + get: function get() { + return this._contentLength; + } + }, { + key: "headersReady", + get: function get() { + return this._headersReceivedCapability.promise; + } }]); - return PDFFetchStreamReader; + return PDFNetworkStreamFullRequestReader; }(); -var PDFFetchStreamRangeReader = +var PDFNetworkStreamRangeRequestReader = /*#__PURE__*/ function () { - function PDFFetchStreamRangeReader(stream, begin, end) { - var _this2 = this; - - _classCallCheck(this, PDFFetchStreamRangeReader); + function PDFNetworkStreamRangeRequestReader(manager, begin, end) { + _classCallCheck(this, PDFNetworkStreamRangeRequestReader); - this._stream = stream; - this._reader = null; - this._loaded = 0; - var source = stream.source; - this._withCredentials = source.withCredentials; - this._readCapability = (0, _util.createPromiseCapability)(); - this._isStreamingSupported = !source.disableStream; + this._manager = manager; + var args = { + onDone: this._onDone.bind(this), + onProgress: this._onProgress.bind(this) + }; + this._requestId = manager.requestRange(begin, end, args); + this._requests = []; + this._queuedChunk = null; + this._done = false; + this.onProgress = null; + this.onClosed = null; + } - if (typeof AbortController !== 'undefined') { - this._abortController = new AbortController(); + _createClass(PDFNetworkStreamRangeRequestReader, [{ + key: "_close", + value: function _close() { + if (this.onClosed) { + this.onClosed(this); + } } + }, { + key: "_onDone", + value: function _onDone(data) { + var chunk = data.chunk; - this._headers = new Headers(); - - for (var property in this._stream.httpHeaders) { - var value = this._stream.httpHeaders[property]; + if (this._requests.length > 0) { + var requestCapability = this._requests.shift(); - if (typeof value === 'undefined') { - continue; + requestCapability.resolve({ + value: chunk, + done: false + }); + } else { + this._queuedChunk = chunk; } - this._headers.append(property, value); - } + this._done = true; - var rangeStr = begin + '-' + (end - 1); + this._requests.forEach(function (requestCapability) { + requestCapability.resolve({ + value: undefined, + done: true + }); + }); - this._headers.append('Range', 'bytes=' + rangeStr); + this._requests = []; - var url = source.url; - fetch(url, createFetchOptions(this._headers, this._withCredentials, this._abortController)).then(function (response) { - if (!(0, _network_utils.validateResponseStatus)(response.status)) { - throw (0, _network_utils.createResponseStatusError)(response.status, url); + this._close(); + } + }, { + key: "_onProgress", + value: function _onProgress(evt) { + if (!this.isStreamingSupported && this.onProgress) { + this.onProgress({ + loaded: evt.loaded + }); } - - _this2._readCapability.resolve(); - - _this2._reader = response.body.getReader(); - }); - this.onProgress = null; - } - - _createClass(PDFFetchStreamRangeReader, [{ + } + }, { key: "read", value: function () { var _read2 = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee2() { - var _ref2, value, done, buffer; - - return _regenerator.default.wrap(function _callee2$(_context2) { + _regenerator["default"].mark(function _callee2() { + var chunk, requestCapability; + return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: - _context2.next = 2; - return this._readCapability.promise; + if (!(this._queuedChunk !== null)) { + _context2.next = 4; + break; + } - case 2: - _context2.next = 4; - return this._reader.read(); + chunk = this._queuedChunk; + this._queuedChunk = null; + return _context2.abrupt("return", { + value: chunk, + done: false + }); case 4: - _ref2 = _context2.sent; - value = _ref2.value; - done = _ref2.done; - - if (!done) { - _context2.next = 9; + if (!this._done) { + _context2.next = 6; break; } return _context2.abrupt("return", { - value: value, - done: done + value: undefined, + done: true }); - case 9: - this._loaded += value.byteLength; + case 6: + requestCapability = (0, _util.createPromiseCapability)(); - if (this.onProgress) { - this.onProgress({ - loaded: this._loaded - }); - } + this._requests.push(requestCapability); - buffer = new Uint8Array(value).buffer; - return _context2.abrupt("return", { - value: buffer, - done: false - }); + return _context2.abrupt("return", requestCapability.promise); - case 13: + case 9: case "end": return _context2.stop(); } @@ -22925,22 +24181,31 @@ function () { }, { key: "cancel", value: function cancel(reason) { - if (this._reader) { - this._reader.cancel(reason); - } + this._done = true; - if (this._abortController) { - this._abortController.abort(); + this._requests.forEach(function (requestCapability) { + requestCapability.resolve({ + value: undefined, + done: true + }); + }); + + this._requests = []; + + if (this._manager.isPendingRequest(this._requestId)) { + this._manager.abortRequest(this._requestId); } + + this._close(); } }, { key: "isStreamingSupported", get: function get() { - return this._isStreamingSupported; + return false; } }]); - return PDFFetchStreamRangeReader; + return PDFNetworkStreamRangeRequestReader; }(); /***/ }), @@ -22953,645 +24218,405 @@ function () { Object.defineProperty(exports, "__esModule", { value: true }); -exports.PDFNetworkStream = PDFNetworkStream; -exports.NetworkManager = NetworkManager; +exports.PDFFetchStream = void 0; -var _regenerator = _interopRequireDefault(__w_pdfjs_require__(147)); +var _regenerator = _interopRequireDefault(__w_pdfjs_require__(148)); var _util = __w_pdfjs_require__(1); var _network_utils = __w_pdfjs_require__(166); -var _global_scope = _interopRequireDefault(__w_pdfjs_require__(3)); - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } -; -var OK_RESPONSE = 200; -var PARTIAL_CONTENT_RESPONSE = 206; +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function NetworkManager(url, args) { - this.url = url; - args = args || {}; - this.isHttp = /^https?:/i.test(url); - this.httpHeaders = this.isHttp && args.httpHeaders || {}; - this.withCredentials = args.withCredentials || false; +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - this.getXhr = args.getXhr || function NetworkManager_getXhr() { - return new XMLHttpRequest(); - }; +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - this.currXhrId = 0; - this.pendingRequests = Object.create(null); - this.loadedRequests = Object.create(null); +function createFetchOptions(headers, withCredentials, abortController) { + return { + method: 'GET', + headers: headers, + signal: abortController && abortController.signal, + mode: 'cors', + credentials: withCredentials ? 'include' : 'same-origin', + redirect: 'follow' + }; } -function getArrayBuffer(xhr) { - var data = xhr.response; +var PDFFetchStream = +/*#__PURE__*/ +function () { + function PDFFetchStream(source) { + _classCallCheck(this, PDFFetchStream); - if (typeof data !== 'string') { - return data; + this.source = source; + this.isHttp = /^https?:/i.test(source.url); + this.httpHeaders = this.isHttp && source.httpHeaders || {}; + this._fullRequestReader = null; + this._rangeRequestReaders = []; } - var array = (0, _util.stringToBytes)(data); - return array.buffer; -} + _createClass(PDFFetchStream, [{ + key: "getFullReader", + value: function getFullReader() { + (0, _util.assert)(!this._fullRequestReader); + this._fullRequestReader = new PDFFetchStreamReader(this); + return this._fullRequestReader; + } + }, { + key: "getRangeReader", + value: function getRangeReader(begin, end) { + if (end <= this._progressiveDataLength) { + return null; + } -var supportsMozChunked = function supportsMozChunkedClosure() { - try { - var x = new XMLHttpRequest(); - x.open('GET', _global_scope.default.location.href); - x.responseType = 'moz-chunked-arraybuffer'; - return x.responseType === 'moz-chunked-arraybuffer'; - } catch (e) { - return false; - } -}(); + var reader = new PDFFetchStreamRangeReader(this, begin, end); -NetworkManager.prototype = { - requestRange: function NetworkManager_requestRange(begin, end, listeners) { - var args = { - begin: begin, - end: end - }; + this._rangeRequestReaders.push(reader); - for (var prop in listeners) { - args[prop] = listeners[prop]; + return reader; } + }, { + key: "cancelAllRequests", + value: function cancelAllRequests(reason) { + if (this._fullRequestReader) { + this._fullRequestReader.cancel(reason); + } - return this.request(args); - }, - requestFull: function NetworkManager_requestFull(listeners) { - return this.request(listeners); - }, - request: function NetworkManager_request(args) { - var xhr = this.getXhr(); - var xhrId = this.currXhrId++; - var pendingRequest = this.pendingRequests[xhrId] = { - xhr: xhr - }; - xhr.open('GET', this.url); - xhr.withCredentials = this.withCredentials; - - for (var property in this.httpHeaders) { - var value = this.httpHeaders[property]; + var readers = this._rangeRequestReaders.slice(0); - if (typeof value === 'undefined') { - continue; - } - - xhr.setRequestHeader(property, value); - } - - if (this.isHttp && 'begin' in args && 'end' in args) { - var rangeStr = args.begin + '-' + (args.end - 1); - xhr.setRequestHeader('Range', 'bytes=' + rangeStr); - pendingRequest.expectedStatus = 206; - } else { - pendingRequest.expectedStatus = 200; + readers.forEach(function (reader) { + reader.cancel(reason); + }); } - - var useMozChunkedLoading = supportsMozChunked && !!args.onProgressiveData; - - if (useMozChunkedLoading) { - xhr.responseType = 'moz-chunked-arraybuffer'; - pendingRequest.onProgressiveData = args.onProgressiveData; - pendingRequest.mozChunked = true; - } else { - xhr.responseType = 'arraybuffer'; + }, { + key: "_progressiveDataLength", + get: function get() { + return this._fullRequestReader ? this._fullRequestReader._loaded : 0; } + }]); - if (args.onError) { - xhr.onerror = function (evt) { - args.onError(xhr.status); - }; - } + return PDFFetchStream; +}(); - xhr.onreadystatechange = this.onStateChange.bind(this, xhrId); - xhr.onprogress = this.onProgress.bind(this, xhrId); - pendingRequest.onHeadersReceived = args.onHeadersReceived; - pendingRequest.onDone = args.onDone; - pendingRequest.onError = args.onError; - pendingRequest.onProgress = args.onProgress; - xhr.send(null); - return xhrId; - }, - onProgress: function NetworkManager_onProgress(xhrId, evt) { - var pendingRequest = this.pendingRequests[xhrId]; +exports.PDFFetchStream = PDFFetchStream; - if (!pendingRequest) { - return; - } +var PDFFetchStreamReader = +/*#__PURE__*/ +function () { + function PDFFetchStreamReader(stream) { + var _this = this; - if (pendingRequest.mozChunked) { - var chunk = getArrayBuffer(pendingRequest.xhr); - pendingRequest.onProgressiveData(chunk); - } + _classCallCheck(this, PDFFetchStreamReader); - var onProgress = pendingRequest.onProgress; + this._stream = stream; + this._reader = null; + this._loaded = 0; + this._filename = null; + var source = stream.source; + this._withCredentials = source.withCredentials || false; + this._contentLength = source.length; + this._headersCapability = (0, _util.createPromiseCapability)(); + this._disableRange = source.disableRange || false; + this._rangeChunkSize = source.rangeChunkSize; - if (onProgress) { - onProgress(evt); + if (!this._rangeChunkSize && !this._disableRange) { + this._disableRange = true; } - }, - onStateChange: function NetworkManager_onStateChange(xhrId, evt) { - var pendingRequest = this.pendingRequests[xhrId]; - if (!pendingRequest) { - return; + if (typeof AbortController !== 'undefined') { + this._abortController = new AbortController(); } - var xhr = pendingRequest.xhr; + this._isStreamingSupported = !source.disableStream; + this._isRangeSupported = !source.disableRange; + this._headers = new Headers(); - if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) { - pendingRequest.onHeadersReceived(); - delete pendingRequest.onHeadersReceived; - } + for (var property in this._stream.httpHeaders) { + var value = this._stream.httpHeaders[property]; - if (xhr.readyState !== 4) { - return; - } + if (typeof value === 'undefined') { + continue; + } - if (!(xhrId in this.pendingRequests)) { - return; + this._headers.append(property, value); } - delete this.pendingRequests[xhrId]; - - if (xhr.status === 0 && this.isHttp) { - if (pendingRequest.onError) { - pendingRequest.onError(xhr.status); + var url = source.url; + fetch(url, createFetchOptions(this._headers, this._withCredentials, this._abortController)).then(function (response) { + if (!(0, _network_utils.validateResponseStatus)(response.status)) { + throw (0, _network_utils.createResponseStatusError)(response.status, url); } - return; - } - - var xhrStatus = xhr.status || OK_RESPONSE; - var ok_response_on_range_request = xhrStatus === OK_RESPONSE && pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE; + _this._reader = response.body.getReader(); - if (!ok_response_on_range_request && xhrStatus !== pendingRequest.expectedStatus) { - if (pendingRequest.onError) { - pendingRequest.onError(xhr.status); - } + _this._headersCapability.resolve(); - return; - } + var getResponseHeader = function getResponseHeader(name) { + return response.headers.get(name); + }; - this.loadedRequests[xhrId] = true; - var chunk = getArrayBuffer(xhr); + var _validateRangeRequest = (0, _network_utils.validateRangeRequestCapabilities)({ + getResponseHeader: getResponseHeader, + isHttp: _this._stream.isHttp, + rangeChunkSize: _this._rangeChunkSize, + disableRange: _this._disableRange + }), + allowRangeRequests = _validateRangeRequest.allowRangeRequests, + suggestedLength = _validateRangeRequest.suggestedLength; - if (xhrStatus === PARTIAL_CONTENT_RESPONSE) { - var rangeHeader = xhr.getResponseHeader('Content-Range'); - var matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader); - var begin = parseInt(matches[1], 10); - pendingRequest.onDone({ - begin: begin, - chunk: chunk - }); - } else if (pendingRequest.onProgressiveData) { - pendingRequest.onDone(null); - } else if (chunk) { - pendingRequest.onDone({ - begin: 0, - chunk: chunk - }); - } else if (pendingRequest.onError) { - pendingRequest.onError(xhr.status); - } - }, - hasPendingRequests: function NetworkManager_hasPendingRequests() { - for (var xhrId in this.pendingRequests) { - return true; - } + _this._isRangeSupported = allowRangeRequests; + _this._contentLength = suggestedLength || _this._contentLength; + _this._filename = (0, _network_utils.extractFilenameFromHeader)(getResponseHeader); - return false; - }, - getRequestXhr: function NetworkManager_getXhr(xhrId) { - return this.pendingRequests[xhrId].xhr; - }, - isStreamingRequest: function NetworkManager_isStreamingRequest(xhrId) { - return !!this.pendingRequests[xhrId].onProgressiveData; - }, - isPendingRequest: function NetworkManager_isPendingRequest(xhrId) { - return xhrId in this.pendingRequests; - }, - isLoadedRequest: function NetworkManager_isLoadedRequest(xhrId) { - return xhrId in this.loadedRequests; - }, - abortAllRequests: function NetworkManager_abortAllRequests() { - for (var xhrId in this.pendingRequests) { - this.abortRequest(xhrId | 0); - } - }, - abortRequest: function NetworkManager_abortRequest(xhrId) { - var xhr = this.pendingRequests[xhrId].xhr; - delete this.pendingRequests[xhrId]; - xhr.abort(); + if (!_this._isStreamingSupported && _this._isRangeSupported) { + _this.cancel(new _util.AbortException('Streaming is disabled.')); + } + })["catch"](this._headersCapability.reject); + this.onProgress = null; } -}; -function PDFNetworkStream(source) { - this._source = source; - this._manager = new NetworkManager(source.url, { - httpHeaders: source.httpHeaders, - withCredentials: source.withCredentials - }); - this._rangeChunkSize = source.rangeChunkSize; - this._fullRequestReader = null; - this._rangeRequestReaders = []; -} + _createClass(PDFFetchStreamReader, [{ + key: "read", + value: function () { + var _read = _asyncToGenerator( + /*#__PURE__*/ + _regenerator["default"].mark(function _callee() { + var _ref, value, done, buffer; -PDFNetworkStream.prototype = { - _onRangeRequestReaderClosed: function PDFNetworkStream_onRangeRequestReaderClosed(reader) { - var i = this._rangeRequestReaders.indexOf(reader); + return _regenerator["default"].wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.next = 2; + return this._headersCapability.promise; - if (i >= 0) { - this._rangeRequestReaders.splice(i, 1); - } - }, - getFullReader: function PDFNetworkStream_getFullReader() { - (0, _util.assert)(!this._fullRequestReader); - this._fullRequestReader = new PDFNetworkStreamFullRequestReader(this._manager, this._source); - return this._fullRequestReader; - }, - getRangeReader: function PDFNetworkStream_getRangeReader(begin, end) { - var reader = new PDFNetworkStreamRangeRequestReader(this._manager, begin, end); - reader.onClosed = this._onRangeRequestReaderClosed.bind(this); + case 2: + _context.next = 4; + return this._reader.read(); - this._rangeRequestReaders.push(reader); + case 4: + _ref = _context.sent; + value = _ref.value; + done = _ref.done; - return reader; - }, - cancelAllRequests: function PDFNetworkStream_cancelAllRequests(reason) { - if (this._fullRequestReader) { - this._fullRequestReader.cancel(reason); - } + if (!done) { + _context.next = 9; + break; + } - var readers = this._rangeRequestReaders.slice(0); + return _context.abrupt("return", { + value: value, + done: done + }); - readers.forEach(function (reader) { - reader.cancel(reason); - }); - } -}; + case 9: + this._loaded += value.byteLength; -function PDFNetworkStreamFullRequestReader(manager, source) { - this._manager = manager; - var args = { - onHeadersReceived: this._onHeadersReceived.bind(this), - onProgressiveData: source.disableStream ? null : this._onProgressiveData.bind(this), - onDone: this._onDone.bind(this), - onError: this._onError.bind(this), - onProgress: this._onProgress.bind(this) - }; - this._url = source.url; - this._fullRequestId = manager.requestFull(args); - this._headersReceivedCapability = (0, _util.createPromiseCapability)(); - this._disableRange = source.disableRange || false; - this._contentLength = source.length; - this._rangeChunkSize = source.rangeChunkSize; - - if (!this._rangeChunkSize && !this._disableRange) { - this._disableRange = true; - } - - this._isStreamingSupported = false; - this._isRangeSupported = false; - this._cachedChunks = []; - this._requests = []; - this._done = false; - this._storedError = undefined; - this._filename = null; - this.onProgress = null; -} + if (this.onProgress) { + this.onProgress({ + loaded: this._loaded, + total: this._contentLength + }); + } -PDFNetworkStreamFullRequestReader.prototype = { - _onHeadersReceived: function PDFNetworkStreamFullRequestReader_onHeadersReceived() { - var fullRequestXhrId = this._fullRequestId; + buffer = new Uint8Array(value).buffer; + return _context.abrupt("return", { + value: buffer, + done: false + }); - var fullRequestXhr = this._manager.getRequestXhr(fullRequestXhrId); + case 13: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); - var getResponseHeader = function getResponseHeader(name) { - return fullRequestXhr.getResponseHeader(name); - }; + function read() { + return _read.apply(this, arguments); + } - var _validateRangeRequest = (0, _network_utils.validateRangeRequestCapabilities)({ - getResponseHeader: getResponseHeader, - isHttp: this._manager.isHttp, - rangeChunkSize: this._rangeChunkSize, - disableRange: this._disableRange - }), - allowRangeRequests = _validateRangeRequest.allowRangeRequests, - suggestedLength = _validateRangeRequest.suggestedLength; + return read; + }() + }, { + key: "cancel", + value: function cancel(reason) { + if (this._reader) { + this._reader.cancel(reason); + } - if (allowRangeRequests) { - this._isRangeSupported = true; + if (this._abortController) { + this._abortController.abort(); + } } - - this._contentLength = suggestedLength || this._contentLength; - this._filename = (0, _network_utils.extractFilenameFromHeader)(getResponseHeader); - var networkManager = this._manager; - - if (networkManager.isStreamingRequest(fullRequestXhrId)) { - this._isStreamingSupported = true; - } else if (this._isRangeSupported) { - networkManager.abortRequest(fullRequestXhrId); + }, { + key: "headersReady", + get: function get() { + return this._headersCapability.promise; } - - this._headersReceivedCapability.resolve(); - }, - _onProgressiveData: function PDFNetworkStreamFullRequestReader_onProgressiveData(chunk) { - if (this._requests.length > 0) { - var requestCapability = this._requests.shift(); - - requestCapability.resolve({ - value: chunk, - done: false - }); - } else { - this._cachedChunks.push(chunk); + }, { + key: "filename", + get: function get() { + return this._filename; } - }, - _onDone: function PDFNetworkStreamFullRequestReader_onDone(args) { - if (args) { - this._onProgressiveData(args.chunk); + }, { + key: "contentLength", + get: function get() { + return this._contentLength; } - - this._done = true; - - if (this._cachedChunks.length > 0) { - return; + }, { + key: "isRangeSupported", + get: function get() { + return this._isRangeSupported; } - - this._requests.forEach(function (requestCapability) { - requestCapability.resolve({ - value: undefined, - done: true - }); - }); - - this._requests = []; - }, - _onError: function PDFNetworkStreamFullRequestReader_onError(status) { - var url = this._url; - var exception = (0, _network_utils.createResponseStatusError)(status, url); - this._storedError = exception; - - this._headersReceivedCapability.reject(exception); - - this._requests.forEach(function (requestCapability) { - requestCapability.reject(exception); - }); - - this._requests = []; - this._cachedChunks = []; - }, - _onProgress: function PDFNetworkStreamFullRequestReader_onProgress(data) { - if (this.onProgress) { - this.onProgress({ - loaded: data.loaded, - total: data.lengthComputable ? data.total : this._contentLength - }); + }, { + key: "isStreamingSupported", + get: function get() { + return this._isStreamingSupported; } - }, - - get filename() { - return this._filename; - }, - - get isRangeSupported() { - return this._isRangeSupported; - }, - - get isStreamingSupported() { - return this._isStreamingSupported; - }, - - get contentLength() { - return this._contentLength; - }, - - get headersReady() { - return this._headersReceivedCapability.promise; - }, - - read: function () { - var _read = _asyncToGenerator( - /*#__PURE__*/ - _regenerator.default.mark(function _callee() { - var chunk, requestCapability; - return _regenerator.default.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - if (!this._storedError) { - _context.next = 2; - break; - } - - throw this._storedError; - - case 2: - if (!(this._cachedChunks.length > 0)) { - _context.next = 5; - break; - } - - chunk = this._cachedChunks.shift(); - return _context.abrupt("return", { - value: chunk, - done: false - }); - - case 5: - if (!this._done) { - _context.next = 7; - break; - } - - return _context.abrupt("return", { - value: undefined, - done: true - }); + }]); - case 7: - requestCapability = (0, _util.createPromiseCapability)(); + return PDFFetchStreamReader; +}(); - this._requests.push(requestCapability); +var PDFFetchStreamRangeReader = +/*#__PURE__*/ +function () { + function PDFFetchStreamRangeReader(stream, begin, end) { + var _this2 = this; - return _context.abrupt("return", requestCapability.promise); + _classCallCheck(this, PDFFetchStreamRangeReader); - case 10: - case "end": - return _context.stop(); - } - } - }, _callee, this); - })); + this._stream = stream; + this._reader = null; + this._loaded = 0; + var source = stream.source; + this._withCredentials = source.withCredentials || false; + this._readCapability = (0, _util.createPromiseCapability)(); + this._isStreamingSupported = !source.disableStream; - function read() { - return _read.apply(this, arguments); + if (typeof AbortController !== 'undefined') { + this._abortController = new AbortController(); } - return read; - }(), - cancel: function PDFNetworkStreamFullRequestReader_cancel(reason) { - this._done = true; - - this._headersReceivedCapability.reject(reason); - - this._requests.forEach(function (requestCapability) { - requestCapability.resolve({ - value: undefined, - done: true - }); - }); - - this._requests = []; - - if (this._manager.isPendingRequest(this._fullRequestId)) { - this._manager.abortRequest(this._fullRequestId); - } + this._headers = new Headers(); - this._fullRequestReader = null; - } -}; + for (var property in this._stream.httpHeaders) { + var value = this._stream.httpHeaders[property]; -function PDFNetworkStreamRangeRequestReader(manager, begin, end) { - this._manager = manager; - var args = { - onDone: this._onDone.bind(this), - onProgress: this._onProgress.bind(this) - }; - this._requestId = manager.requestRange(begin, end, args); - this._requests = []; - this._queuedChunk = null; - this._done = false; - this.onProgress = null; - this.onClosed = null; -} + if (typeof value === 'undefined') { + continue; + } -PDFNetworkStreamRangeRequestReader.prototype = { - _close: function PDFNetworkStreamRangeRequestReader_close() { - if (this.onClosed) { - this.onClosed(this); + this._headers.append(property, value); } - }, - _onDone: function PDFNetworkStreamRangeRequestReader_onDone(data) { - var chunk = data.chunk; - if (this._requests.length > 0) { - var requestCapability = this._requests.shift(); + this._headers.append('Range', "bytes=".concat(begin, "-").concat(end - 1)); - requestCapability.resolve({ - value: chunk, - done: false - }); - } else { - this._queuedChunk = chunk; - } + var url = source.url; + fetch(url, createFetchOptions(this._headers, this._withCredentials, this._abortController)).then(function (response) { + if (!(0, _network_utils.validateResponseStatus)(response.status)) { + throw (0, _network_utils.createResponseStatusError)(response.status, url); + } - this._done = true; + _this2._readCapability.resolve(); - this._requests.forEach(function (requestCapability) { - requestCapability.resolve({ - value: undefined, - done: true - }); + _this2._reader = response.body.getReader(); }); + this.onProgress = null; + } - this._requests = []; - - this._close(); - }, - _onProgress: function PDFNetworkStreamRangeRequestReader_onProgress(evt) { - if (!this.isStreamingSupported && this.onProgress) { - this.onProgress({ - loaded: evt.loaded - }); - } - }, + _createClass(PDFFetchStreamRangeReader, [{ + key: "read", + value: function () { + var _read2 = _asyncToGenerator( + /*#__PURE__*/ + _regenerator["default"].mark(function _callee2() { + var _ref2, value, done, buffer; - get isStreamingSupported() { - return false; - }, + return _regenerator["default"].wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + _context2.next = 2; + return this._readCapability.promise; - read: function () { - var _read2 = _asyncToGenerator( - /*#__PURE__*/ - _regenerator.default.mark(function _callee2() { - var chunk, requestCapability; - return _regenerator.default.wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - if (!(this._queuedChunk !== null)) { + case 2: _context2.next = 4; - break; - } + return this._reader.read(); - chunk = this._queuedChunk; - this._queuedChunk = null; - return _context2.abrupt("return", { - value: chunk, - done: false - }); + case 4: + _ref2 = _context2.sent; + value = _ref2.value; + done = _ref2.done; - case 4: - if (!this._done) { - _context2.next = 6; - break; - } + if (!done) { + _context2.next = 9; + break; + } - return _context2.abrupt("return", { - value: undefined, - done: true - }); + return _context2.abrupt("return", { + value: value, + done: done + }); - case 6: - requestCapability = (0, _util.createPromiseCapability)(); + case 9: + this._loaded += value.byteLength; - this._requests.push(requestCapability); + if (this.onProgress) { + this.onProgress({ + loaded: this._loaded + }); + } - return _context2.abrupt("return", requestCapability.promise); + buffer = new Uint8Array(value).buffer; + return _context2.abrupt("return", { + value: buffer, + done: false + }); - case 9: - case "end": - return _context2.stop(); + case 13: + case "end": + return _context2.stop(); + } } - } - }, _callee2, this); - })); - - function read() { - return _read2.apply(this, arguments); - } - - return read; - }(), - cancel: function PDFNetworkStreamRangeRequestReader_cancel(reason) { - this._done = true; + }, _callee2, this); + })); - this._requests.forEach(function (requestCapability) { - requestCapability.resolve({ - value: undefined, - done: true - }); - }); + function read() { + return _read2.apply(this, arguments); + } - this._requests = []; + return read; + }() + }, { + key: "cancel", + value: function cancel(reason) { + if (this._reader) { + this._reader.cancel(reason); + } - if (this._manager.isPendingRequest(this._requestId)) { - this._manager.abortRequest(this._requestId); + if (this._abortController) { + this._abortController.abort(); + } + } + }, { + key: "isStreamingSupported", + get: function get() { + return this._isStreamingSupported; } + }]); - this._close(); - } -}; + return PDFFetchStreamRangeReader; +}(); /***/ }) /******/ ]); diff --git a/cps/static/js/libs/pdf.worker.js b/cps/static/js/libs/pdf.worker.js index 8a362bd7..211fbbdc 100644 --- a/cps/static/js/libs/pdf.worker.js +++ b/cps/static/js/libs/pdf.worker.js @@ -2,7 +2,7 @@ * @licstart The following is the entire license notice for the * Javascript code in this page * - * Copyright 2018 Mozilla Foundation + * Copyright 2019 Mozilla Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -123,8 +123,8 @@ return /******/ (function(modules) { // webpackBootstrap "use strict"; -var pdfjsVersion = '2.1.266'; -var pdfjsBuild = '81f5835c'; +var pdfjsVersion = '2.2.228'; +var pdfjsBuild = 'd7afb74a'; var pdfjsCoreWorker = __w_pdfjs_require__(1); @@ -144,17 +144,21 @@ exports.WorkerMessageHandler = exports.WorkerTask = void 0; var _regenerator = _interopRequireDefault(__w_pdfjs_require__(2)); -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); -var _pdf_manager = __w_pdfjs_require__(151); +var _primitives = __w_pdfjs_require__(151); -var _is_node = _interopRequireDefault(__w_pdfjs_require__(9)); +var _pdf_manager = __w_pdfjs_require__(152); -var _message_handler = __w_pdfjs_require__(189); +var _is_node = _interopRequireDefault(__w_pdfjs_require__(8)); -var _primitives = __w_pdfjs_require__(155); +var _message_handler = __w_pdfjs_require__(191); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var _worker_stream = __w_pdfjs_require__(192); + +var _core_utils = __w_pdfjs_require__(154); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } @@ -198,141 +202,6 @@ var WorkerTask = function WorkerTaskClosure() { }(); exports.WorkerTask = WorkerTask; - -var PDFWorkerStream = function PDFWorkerStreamClosure() { - function PDFWorkerStream(msgHandler) { - this._msgHandler = msgHandler; - this._contentLength = null; - this._fullRequestReader = null; - this._rangeRequestReaders = []; - } - - PDFWorkerStream.prototype = { - getFullReader: function getFullReader() { - (0, _util.assert)(!this._fullRequestReader); - this._fullRequestReader = new PDFWorkerStreamReader(this._msgHandler); - return this._fullRequestReader; - }, - getRangeReader: function getRangeReader(begin, end) { - var reader = new PDFWorkerStreamRangeReader(begin, end, this._msgHandler); - - this._rangeRequestReaders.push(reader); - - return reader; - }, - cancelAllRequests: function cancelAllRequests(reason) { - if (this._fullRequestReader) { - this._fullRequestReader.cancel(reason); - } - - var readers = this._rangeRequestReaders.slice(0); - - readers.forEach(function (reader) { - reader.cancel(reason); - }); - } - }; - - function PDFWorkerStreamReader(msgHandler) { - var _this = this; - - this._msgHandler = msgHandler; - this._contentLength = null; - this._isRangeSupported = false; - this._isStreamingSupported = false; - - var readableStream = this._msgHandler.sendWithStream('GetReader'); - - this._reader = readableStream.getReader(); - this._headersReady = this._msgHandler.sendWithPromise('ReaderHeadersReady').then(function (data) { - _this._isStreamingSupported = data.isStreamingSupported; - _this._isRangeSupported = data.isRangeSupported; - _this._contentLength = data.contentLength; - }); - } - - PDFWorkerStreamReader.prototype = { - get headersReady() { - return this._headersReady; - }, - - get contentLength() { - return this._contentLength; - }, - - get isStreamingSupported() { - return this._isStreamingSupported; - }, - - get isRangeSupported() { - return this._isRangeSupported; - }, - - read: function read() { - return this._reader.read().then(function (_ref) { - var value = _ref.value, - done = _ref.done; - - if (done) { - return { - value: undefined, - done: true - }; - } - - return { - value: value.buffer, - done: false - }; - }); - }, - cancel: function cancel(reason) { - this._reader.cancel(reason); - } - }; - - function PDFWorkerStreamRangeReader(begin, end, msgHandler) { - this._msgHandler = msgHandler; - this.onProgress = null; - - var readableStream = this._msgHandler.sendWithStream('GetRangeReader', { - begin: begin, - end: end - }); - - this._reader = readableStream.getReader(); - } - - PDFWorkerStreamRangeReader.prototype = { - get isStreamingSupported() { - return false; - }, - - read: function read() { - return this._reader.read().then(function (_ref2) { - var value = _ref2.value, - done = _ref2.done; - - if (done) { - return { - value: undefined, - done: true - }; - } - - return { - value: value.buffer, - done: false - }; - }); - }, - cancel: function cancel(reason) { - this._reader.cancel(reason); - } - }; - return PDFWorkerStream; -}(); - var WorkerMessageHandler = { setup: function setup(handler, port) { var testMessageProcessed = false; @@ -381,8 +250,9 @@ var WorkerMessageHandler = { var terminated = false; var cancelXHRs = null; var WorkerTasks = []; + var verbosity = (0, _util.getVerbosityLevel)(); var apiVersion = docParams.apiVersion; - var workerVersion = '2.1.266'; + var workerVersion = '2.2.228'; if (apiVersion !== workerVersion) { throw new Error("The API version \"".concat(apiVersion, "\" does not match ") + "the Worker version \"".concat(workerVersion, "\".")); @@ -417,10 +287,10 @@ var WorkerMessageHandler = { function _loadDocument() { _loadDocument = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee(recoveryMode) { - var _ref6, _ref7, numPages, fingerprint; + _regenerator["default"].mark(function _callee(recoveryMode) { + var _ref4, _ref5, numPages, fingerprint; - return _regenerator.default.wrap(function _callee$(_context) { + return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: @@ -449,10 +319,10 @@ var WorkerMessageHandler = { return Promise.all([pdfManager.ensureDoc('numPages'), pdfManager.ensureDoc('fingerprint')]); case 11: - _ref6 = _context.sent; - _ref7 = _slicedToArray(_ref6, 2); - numPages = _ref7[0]; - fingerprint = _ref7[1]; + _ref4 = _context.sent; + _ref5 = _slicedToArray(_ref4, 2); + numPages = _ref5[0]; + fingerprint = _ref5[1]; return _context.abrupt("return", { numPages: numPages, fingerprint: fingerprint @@ -463,7 +333,7 @@ var WorkerMessageHandler = { return _context.stop(); } } - }, _callee, this); + }, _callee); })); return _loadDocument.apply(this, arguments); } @@ -488,7 +358,7 @@ var WorkerMessageHandler = { cachedChunks = []; try { - pdfStream = new PDFWorkerStream(handler); + pdfStream = new _worker_stream.PDFWorkerStream(handler); } catch (ex) { pdfManagerCapability.reject(ex); return pdfManagerCapability.promise; @@ -516,7 +386,7 @@ var WorkerMessageHandler = { cachedChunks = []; pdfManagerCapability.resolve(pdfManager); cancelXHRs = null; - }).catch(function (reason) { + })["catch"](function (reason) { pdfManagerCapability.reject(reason); cancelXHRs = null; }); @@ -577,7 +447,7 @@ var WorkerMessageHandler = { fullRequest.read().then(readChunk, reject); }); - readPromise.catch(function (e) { + readPromise["catch"](function (e) { pdfManagerCapability.reject(e); cancelXHRs = null; }); @@ -607,7 +477,7 @@ var WorkerMessageHandler = { finishWorkerTask(task); pdfManager.updatePassword(data.password); pdfManagerReady(); - }).catch(function (boundException) { + })["catch"](function (boundException) { finishWorkerTask(task); handler.send('PasswordException', boundException); }.bind(null, e)); @@ -627,7 +497,7 @@ var WorkerMessageHandler = { loadDocument(false).then(onSuccess, function loadFailure(ex) { ensureNotTerminated(); - if (!(ex instanceof _util.XRefParseException)) { + if (!(ex instanceof _core_utils.XRefParseException)) { onFailure(ex); return; } @@ -666,12 +536,12 @@ var WorkerMessageHandler = { handler.on('GetPage', function wphSetupGetPage(data) { return pdfManager.getPage(data.pageIndex).then(function (page) { - return Promise.all([pdfManager.ensure(page, 'rotate'), pdfManager.ensure(page, 'ref'), pdfManager.ensure(page, 'userUnit'), pdfManager.ensure(page, 'view')]).then(function (_ref3) { - var _ref4 = _slicedToArray(_ref3, 4), - rotate = _ref4[0], - ref = _ref4[1], - userUnit = _ref4[2], - view = _ref4[3]; + return Promise.all([pdfManager.ensure(page, 'rotate'), pdfManager.ensure(page, 'ref'), pdfManager.ensure(page, 'userUnit'), pdfManager.ensure(page, 'view')]).then(function (_ref) { + var _ref2 = _slicedToArray(_ref, 4), + rotate = _ref2[0], + ref = _ref2[1], + userUnit = _ref2[2], + view = _ref2[3]; return { rotate: rotate, @@ -683,7 +553,8 @@ var WorkerMessageHandler = { }); }); handler.on('GetPageIndex', function wphSetupGetPageIndex(data) { - var ref = new _primitives.Ref(data.ref.num, data.ref.gen); + var ref = _primitives.Ref.get(data.ref.num, data.ref.gen); + var catalog = pdfManager.pdfDocument.catalog; return catalog.getPageIndex(ref); }); @@ -696,10 +567,16 @@ var WorkerMessageHandler = { handler.on('GetPageLabels', function wphSetupGetPageLabels(data) { return pdfManager.ensureCatalog('pageLabels'); }); + handler.on('GetPageLayout', function wphSetupGetPageLayout(data) { + return pdfManager.ensureCatalog('pageLayout'); + }); handler.on('GetPageMode', function wphSetupGetPageMode(data) { return pdfManager.ensureCatalog('pageMode'); }); - handler.on('getOpenActionDestination', function (data) { + handler.on('GetViewerPreferences', function (data) { + return pdfManager.ensureCatalog('viewerPreferences'); + }); + handler.on('GetOpenActionDestination', function (data) { return pdfManager.ensureCatalog('openActionDestination'); }); handler.on('GetAttachments', function wphSetupGetAttachments(data) { @@ -726,9 +603,9 @@ var WorkerMessageHandler = { handler.on('GetStats', function wphSetupGetStats(data) { return pdfManager.pdfDocument.xref.stats; }); - handler.on('GetAnnotations', function (_ref5) { - var pageIndex = _ref5.pageIndex, - intent = _ref5.intent; + handler.on('GetAnnotations', function (_ref3) { + var pageIndex = _ref3.pageIndex, + intent = _ref3.intent; return pdfManager.getPage(pageIndex).then(function (page) { return page.getAnnotationsData(intent); }); @@ -738,8 +615,7 @@ var WorkerMessageHandler = { pdfManager.getPage(pageIndex).then(function (page) { var task = new WorkerTask('RenderPageRequest: page ' + pageIndex); startWorkerTask(task); - var pageNum = pageIndex + 1; - var start = Date.now(); + var start = verbosity >= _util.VerbosityLevel.INFOS ? Date.now() : 0; page.getOperatorList({ handler: handler, task: task, @@ -747,7 +623,10 @@ var WorkerMessageHandler = { renderInteractiveForms: data.renderInteractiveForms }).then(function (operatorList) { finishWorkerTask(task); - (0, _util.info)('page=' + pageNum + ' - getOperatorList: time=' + (Date.now() - start) + 'ms, len=' + operatorList.totalLength); + + if (start) { + (0, _util.info)("page=".concat(pageIndex + 1, " - getOperatorList: time=") + "".concat(Date.now() - start, "ms, len=").concat(operatorList.totalLength)); + } }, function (e) { finishWorkerTask(task); @@ -779,7 +658,7 @@ var WorkerMessageHandler = { } handler.send('PageError', { - pageNum: pageNum, + pageIndex: pageIndex, error: wrappedException, intent: data.intent }); @@ -796,8 +675,7 @@ var WorkerMessageHandler = { pdfManager.getPage(pageIndex).then(function (page) { var task = new WorkerTask('GetTextContent: page ' + pageIndex); startWorkerTask(task); - var pageNum = pageIndex + 1; - var start = Date.now(); + var start = verbosity >= _util.VerbosityLevel.INFOS ? Date.now() : 0; page.extractTextContent({ handler: handler, task: task, @@ -806,7 +684,11 @@ var WorkerMessageHandler = { combineTextItems: data.combineTextItems }).then(function () { finishWorkerTask(task); - (0, _util.info)('text indexing: page=' + pageNum + ' - time=' + (Date.now() - start) + 'ms'); + + if (start) { + (0, _util.info)("page=".concat(pageIndex + 1, " - getTextContent: time=") + "".concat(Date.now() - start, "ms")); + } + sink.close(); }, function (reason) { finishWorkerTask(task); @@ -838,6 +720,7 @@ var WorkerMessageHandler = { cancelXHRs(); } + (0, _primitives.clearPrimitiveCaches)(); var waitOn = []; WorkerTasks.forEach(function (task) { waitOn.push(task.finished); @@ -866,7 +749,7 @@ function isMessagePort(maybePort) { return typeof maybePort.postMessage === 'function' && 'onmessage' in maybePort; } -if (typeof window === 'undefined' && !(0, _is_node.default)() && typeof self !== 'undefined' && isMessagePort(self)) { +if (typeof window === 'undefined' && !(0, _is_node["default"])() && typeof self !== 'undefined' && isMessagePort(self)) { WorkerMessageHandler.initializeFromPort(self); } @@ -883,40 +766,12 @@ module.exports = __w_pdfjs_require__(3); /* 3 */ /***/ (function(module, exports, __w_pdfjs_require__) { -"use strict"; - - -function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } - -var g = function () { - return this || (typeof self === "undefined" ? "undefined" : _typeof(self)) === "object" && self; -}() || Function("return this")(); - -var hadRuntime = g.regeneratorRuntime && Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >= 0; -var oldRuntime = hadRuntime && g.regeneratorRuntime; -g.regeneratorRuntime = undefined; -module.exports = __w_pdfjs_require__(4); - -if (hadRuntime) { - g.regeneratorRuntime = oldRuntime; -} else { - try { - delete g.regeneratorRuntime; - } catch (e) { - g.regeneratorRuntime = undefined; - } -} - -/***/ }), -/* 4 */ -/***/ (function(module, exports, __w_pdfjs_require__) { - "use strict"; /* WEBPACK VAR INJECTION */(function(module) { function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } -!function (global) { +var runtime = function (exports) { "use strict"; var Op = Object.prototype; @@ -926,18 +781,6 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat var iteratorSymbol = $Symbol.iterator || "@@iterator"; var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator"; var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; - var inModule = ( false ? undefined : _typeof(module)) === "object"; - var runtime = global.regeneratorRuntime; - - if (runtime) { - if (inModule) { - module.exports = runtime; - } - - return; - } - - runtime = global.regeneratorRuntime = inModule ? module.exports : {}; function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; @@ -947,7 +790,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat return generator; } - runtime.wrap = wrap; + exports.wrap = wrap; function tryCatch(fn, obj, arg) { try { @@ -1001,12 +844,12 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat }); } - runtime.isGeneratorFunction = function (genFun) { + exports.isGeneratorFunction = function (genFun) { var ctor = typeof genFun === "function" && genFun.constructor; return ctor ? ctor === GeneratorFunction || (ctor.displayName || ctor.name) === "GeneratorFunction" : false; }; - runtime.mark = function (genFun) { + exports.mark = function (genFun) { if (Object.setPrototypeOf) { Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); } else { @@ -1021,7 +864,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat return genFun; }; - runtime.awrap = function (arg) { + exports.awrap = function (arg) { return { __await: arg }; @@ -1075,11 +918,11 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat return this; }; - runtime.AsyncIterator = AsyncIterator; + exports.AsyncIterator = AsyncIterator; - runtime.async = function (innerFn, outerFn, self, tryLocsList) { + exports.async = function (innerFn, outerFn, self, tryLocsList) { var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList)); - return runtime.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { + return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }; @@ -1157,7 +1000,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat context.delegate = null; if (context.method === "throw") { - if (delegate.iterator.return) { + if (delegate.iterator["return"]) { context.method = "return"; context.arg = undefined; maybeInvokeDelegate(delegate, context); @@ -1251,7 +1094,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat this.reset(true); } - runtime.keys = function (object) { + exports.keys = function (object) { var keys = []; for (var key in object) { @@ -1312,7 +1155,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat }; } - runtime.values = values; + exports.values = values; function doneResult() { return { @@ -1490,13 +1333,18 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat return ContinueSentinel; } }; -}(function () { - return this || (typeof self === "undefined" ? "undefined" : _typeof(self)) === "object" && self; -}() || Function("return this")()); -/* WEBPACK VAR INJECTION */}.call(this, __w_pdfjs_require__(5)(module))) + return exports; +}(( false ? undefined : _typeof(module)) === "object" ? module.exports : {}); + +try { + regeneratorRuntime = runtime; +} catch (accidentalStrictMode) { + Function("r", "regeneratorRuntime = r")(runtime); +} +/* WEBPACK VAR INJECTION */}.call(this, __w_pdfjs_require__(4)(module))) /***/ }), -/* 5 */ +/* 4 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -1527,7 +1375,7 @@ module.exports = function (module) { }; /***/ }), -/* 6 */ +/* 5 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -1536,18 +1384,15 @@ module.exports = function (module) { Object.defineProperty(exports, "__esModule", { value: true }); -exports.toRomanNumerals = toRomanNumerals; exports.arrayByteLength = arrayByteLength; exports.arraysToBytes = arraysToBytes; exports.assert = assert; exports.bytesToString = bytesToString; exports.createPromiseCapability = createPromiseCapability; -exports.deprecated = deprecated; -exports.getInheritableProperty = getInheritableProperty; -exports.getLookupTableFactory = getLookupTableFactory; exports.getVerbosityLevel = getVerbosityLevel; exports.info = info; exports.isArrayBuffer = isArrayBuffer; +exports.isArrayEqual = isArrayEqual; exports.isBool = isBool; exports.isEmptyObj = isEmptyObj; exports.isNum = isNum; @@ -1583,9 +1428,9 @@ Object.defineProperty(exports, "URL", { return _url_polyfill.URL; } }); -exports.createObjectURL = exports.FormatError = exports.XRefParseException = exports.XRefEntryException = exports.Util = exports.UnknownErrorException = exports.UnexpectedResponseException = exports.TextRenderingMode = exports.StreamType = exports.PermissionFlag = exports.PasswordResponses = exports.PasswordException = exports.NativeImageDecoding = exports.MissingPDFException = exports.MissingDataException = exports.InvalidPDFException = exports.AbortException = exports.CMapCompressionType = exports.ImageKind = exports.FontType = exports.AnnotationType = exports.AnnotationFlag = exports.AnnotationFieldFlag = exports.AnnotationBorderStyleType = exports.UNSUPPORTED_FEATURES = exports.VerbosityLevel = exports.OPS = exports.IDENTITY_MATRIX = exports.FONT_IDENTITY_MATRIX = void 0; +exports.createObjectURL = exports.FormatError = exports.Util = exports.UnknownErrorException = exports.UnexpectedResponseException = exports.TextRenderingMode = exports.StreamType = exports.PermissionFlag = exports.PasswordResponses = exports.PasswordException = exports.NativeImageDecoding = exports.MissingPDFException = exports.InvalidPDFException = exports.AbortException = exports.CMapCompressionType = exports.ImageKind = exports.FontType = exports.AnnotationType = exports.AnnotationFlag = exports.AnnotationFieldFlag = exports.AnnotationBorderStyleType = exports.UNSUPPORTED_FEATURES = exports.VerbosityLevel = exports.OPS = exports.IDENTITY_MATRIX = exports.FONT_IDENTITY_MATRIX = void 0; -__w_pdfjs_require__(7); +__w_pdfjs_require__(6); var _streams_polyfill = __w_pdfjs_require__(147); @@ -1876,10 +1721,6 @@ function warn(msg) { } } -function deprecated(details) { - console.log('Deprecated API usage: ' + details); -} - function unreachable(msg) { throw new Error(msg); } @@ -1949,19 +1790,6 @@ function shadow(obj, prop, value) { return value; } -function getLookupTableFactory(initializer) { - var lookup; - return function () { - if (initializer) { - lookup = Object.create(null); - initializer(lookup); - initializer = null; - } - - return lookup; - }; -} - var PasswordException = function PasswordExceptionClosure() { function PasswordException(msg, code) { this.name = 'PasswordException'; @@ -2030,47 +1858,6 @@ var UnexpectedResponseException = function UnexpectedResponseExceptionClosure() exports.UnexpectedResponseException = UnexpectedResponseException; -var MissingDataException = function MissingDataExceptionClosure() { - function MissingDataException(begin, end) { - this.begin = begin; - this.end = end; - this.message = 'Missing data [' + begin + ', ' + end + ')'; - } - - MissingDataException.prototype = new Error(); - MissingDataException.prototype.name = 'MissingDataException'; - MissingDataException.constructor = MissingDataException; - return MissingDataException; -}(); - -exports.MissingDataException = MissingDataException; - -var XRefEntryException = function XRefEntryExceptionClosure() { - function XRefEntryException(msg) { - this.message = msg; - } - - XRefEntryException.prototype = new Error(); - XRefEntryException.prototype.name = 'XRefEntryException'; - XRefEntryException.constructor = XRefEntryException; - return XRefEntryException; -}(); - -exports.XRefEntryException = XRefEntryException; - -var XRefParseException = function XRefParseExceptionClosure() { - function XRefParseException(msg) { - this.message = msg; - } - - XRefParseException.prototype = new Error(); - XRefParseException.prototype.name = 'XRefParseException'; - XRefParseException.constructor = XRefParseException; - return XRefParseException; -}(); - -exports.XRefParseException = XRefParseException; - var FormatError = function FormatErrorClosure() { function FormatError(msg) { this.message = msg; @@ -2226,43 +2013,6 @@ function isEvalSupported() { } } -function getInheritableProperty(_ref) { - var dict = _ref.dict, - key = _ref.key, - _ref$getArray = _ref.getArray, - getArray = _ref$getArray === void 0 ? false : _ref$getArray, - _ref$stopWhenFound = _ref.stopWhenFound, - stopWhenFound = _ref$stopWhenFound === void 0 ? true : _ref$stopWhenFound; - var LOOP_LIMIT = 100; - var loopCount = 0; - var values; - - while (dict) { - var value = getArray ? dict.getArray(key) : dict.get(key); - - if (value !== undefined) { - if (stopWhenFound) { - return value; - } - - if (!values) { - values = []; - } - - values.push(value); - } - - if (++loopCount > LOOP_LIMIT) { - warn("getInheritableProperty: maximum loop count exceeded for \"".concat(key, "\"")); - break; - } - - dict = dict.get('Parent'); - } - - return values; -} - var Util = function UtilClosure() { function Util() {} @@ -2370,30 +2120,6 @@ var Util = function UtilClosure() { }(); exports.Util = Util; -var ROMAN_NUMBER_MAP = ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX']; - -function toRomanNumerals(number) { - var lowerCase = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - assert(Number.isInteger(number) && number > 0, 'The number should be a positive integer.'); - var pos, - romanBuf = []; - - while (number >= 1000) { - number -= 1000; - romanBuf.push('M'); - } - - pos = number / 100 | 0; - number %= 100; - romanBuf.push(ROMAN_NUMBER_MAP[pos]); - pos = number / 10 | 0; - number %= 10; - romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]); - romanBuf.push(ROMAN_NUMBER_MAP[20 + number]); - var romanStr = romanBuf.join(''); - return lowerCase ? romanStr.toLowerCase() : romanStr; -} - var PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC]; function stringToPDFString(str) { @@ -2447,6 +2173,16 @@ function isArrayBuffer(v) { return _typeof(v) === 'object' && v !== null && v.byteLength !== undefined; } +function isArrayEqual(arr1, arr2) { + if (arr1.length !== arr2.length) { + return false; + } + + return arr1.every(function (element, index) { + return element === arr2[index]; + }); +} + function isSpace(ch) { return ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A; } @@ -2505,7 +2241,7 @@ var createObjectURL = function createObjectURLClosure() { exports.createObjectURL = createObjectURL; /***/ }), -/* 7 */ +/* 6 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -2513,12 +2249,12 @@ exports.createObjectURL = createObjectURL; function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } -var globalScope = __w_pdfjs_require__(8); +var globalScope = __w_pdfjs_require__(7); if (!globalScope._pdfjsCompatibilityChecked) { globalScope._pdfjsCompatibilityChecked = true; - var isNodeJS = __w_pdfjs_require__(9); + var isNodeJS = __w_pdfjs_require__(8); var hasDOM = (typeof window === "undefined" ? "undefined" : _typeof(window)) === 'object' && (typeof document === "undefined" ? "undefined" : _typeof(document)) === 'object'; @@ -2578,8 +2314,8 @@ if (!globalScope._pdfjsCompatibilityChecked) { tokens[_key] = arguments[_key]; } - for (var _i = 0; _i < tokens.length; _i++) { - var token = tokens[_i]; + for (var _i = 0, _tokens = tokens; _i < _tokens.length; _i++) { + var token = _tokens[_i]; OriginalDOMTokenListAdd.call(this, token); } }; @@ -2589,8 +2325,8 @@ if (!globalScope._pdfjsCompatibilityChecked) { tokens[_key2] = arguments[_key2]; } - for (var _i2 = 0; _i2 < tokens.length; _i2++) { - var token = tokens[_i2]; + for (var _i2 = 0, _tokens2 = tokens; _i2 < _tokens2.length; _i2++) { + var token = _tokens2[_i2]; OriginalDOMTokenListRemove.call(this, token); } }; @@ -2618,7 +2354,7 @@ if (!globalScope._pdfjsCompatibilityChecked) { return; } - __w_pdfjs_require__(10); + __w_pdfjs_require__(9); })(); (function checkStringEndsWith() { @@ -2686,7 +2422,7 @@ if (!globalScope._pdfjsCompatibilityChecked) { })(); (function checkPromise() { - if (globalScope.Promise && globalScope.Promise.prototype && globalScope.Promise.prototype.finally) { + if (globalScope.Promise && globalScope.Promise.prototype && globalScope.Promise.prototype["finally"]) { return; } @@ -2759,7 +2495,7 @@ if (!globalScope._pdfjsCompatibilityChecked) { } /***/ }), -/* 8 */ +/* 7 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -2768,7 +2504,7 @@ if (!globalScope._pdfjsCompatibilityChecked) { module.exports = typeof window !== 'undefined' && window.Math === Math ? window : typeof global !== 'undefined' && global.Math === Math ? global : typeof self !== 'undefined' && self.Math === Math ? self : {}; /***/ }), -/* 9 */ +/* 8 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -2777,32 +2513,32 @@ module.exports = typeof window !== 'undefined' && window.Math === Math ? window function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } module.exports = function isNodeJS() { - return (typeof process === "undefined" ? "undefined" : _typeof(process)) === 'object' && process + '' === '[object process]' && !process.versions['nw']; + return (typeof process === "undefined" ? "undefined" : _typeof(process)) === 'object' && process + '' === '[object process]' && !process.versions['nw'] && !process.versions['electron']; }; /***/ }), -/* 10 */ +/* 9 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -__w_pdfjs_require__(11); +__w_pdfjs_require__(10); -module.exports = __w_pdfjs_require__(14).String.startsWith; +module.exports = __w_pdfjs_require__(13).String.startsWith; /***/ }), -/* 11 */ +/* 10 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var $export = __w_pdfjs_require__(12); +var $export = __w_pdfjs_require__(11); -var toLength = __w_pdfjs_require__(30); +var toLength = __w_pdfjs_require__(32); -var context = __w_pdfjs_require__(32); +var context = __w_pdfjs_require__(34); var STARTS_WITH = 'startsWith'; var $startsWith = ''[STARTS_WITH]; @@ -2816,21 +2552,21 @@ $export($export.P + $export.F * __w_pdfjs_require__(39)(STARTS_WITH), 'String', }); /***/ }), -/* 12 */ +/* 11 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var global = __w_pdfjs_require__(13); +var global = __w_pdfjs_require__(12); -var core = __w_pdfjs_require__(14); +var core = __w_pdfjs_require__(13); -var hide = __w_pdfjs_require__(15); +var hide = __w_pdfjs_require__(14); -var redefine = __w_pdfjs_require__(25); +var redefine = __w_pdfjs_require__(24); -var ctx = __w_pdfjs_require__(28); +var ctx = __w_pdfjs_require__(30); var PROTOTYPE = 'prototype'; @@ -2868,7 +2604,7 @@ $export.R = 128; module.exports = $export; /***/ }), -/* 13 */ +/* 12 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -2878,29 +2614,29 @@ var global = module.exports = typeof window != 'undefined' && window.Math == Mat if (typeof __g == 'number') __g = global; /***/ }), -/* 14 */ +/* 13 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; var core = module.exports = { - version: '2.6.2' + version: '2.6.9' }; if (typeof __e == 'number') __e = core; /***/ }), -/* 15 */ +/* 14 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var dP = __w_pdfjs_require__(16); +var dP = __w_pdfjs_require__(15); -var createDesc = __w_pdfjs_require__(24); +var createDesc = __w_pdfjs_require__(23); -module.exports = __w_pdfjs_require__(20) ? function (object, key, value) { +module.exports = __w_pdfjs_require__(19) ? function (object, key, value) { return dP.f(object, key, createDesc(1, value)); } : function (object, key, value) { object[key] = value; @@ -2908,20 +2644,20 @@ module.exports = __w_pdfjs_require__(20) ? function (object, key, value) { }; /***/ }), -/* 16 */ +/* 15 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var anObject = __w_pdfjs_require__(17); +var anObject = __w_pdfjs_require__(16); -var IE8_DOM_DEFINE = __w_pdfjs_require__(19); +var IE8_DOM_DEFINE = __w_pdfjs_require__(18); -var toPrimitive = __w_pdfjs_require__(23); +var toPrimitive = __w_pdfjs_require__(22); var dP = Object.defineProperty; -exports.f = __w_pdfjs_require__(20) ? Object.defineProperty : function defineProperty(O, P, Attributes) { +exports.f = __w_pdfjs_require__(19) ? Object.defineProperty : function defineProperty(O, P, Attributes) { anObject(O); P = toPrimitive(P, true); anObject(Attributes); @@ -2934,13 +2670,13 @@ exports.f = __w_pdfjs_require__(20) ? Object.defineProperty : function definePro }; /***/ }), -/* 17 */ +/* 16 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var isObject = __w_pdfjs_require__(18); +var isObject = __w_pdfjs_require__(17); module.exports = function (it) { if (!isObject(it)) throw TypeError(it + ' is not an object!'); @@ -2948,7 +2684,7 @@ module.exports = function (it) { }; /***/ }), -/* 18 */ +/* 17 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -2961,14 +2697,14 @@ module.exports = function (it) { }; /***/ }), -/* 19 */ +/* 18 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -module.exports = !__w_pdfjs_require__(20) && !__w_pdfjs_require__(21)(function () { - return Object.defineProperty(__w_pdfjs_require__(22)('div'), 'a', { +module.exports = !__w_pdfjs_require__(19) && !__w_pdfjs_require__(20)(function () { + return Object.defineProperty(__w_pdfjs_require__(21)('div'), 'a', { get: function get() { return 7; } @@ -2976,13 +2712,13 @@ module.exports = !__w_pdfjs_require__(20) && !__w_pdfjs_require__(21)(function ( }); /***/ }), -/* 20 */ +/* 19 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -module.exports = !__w_pdfjs_require__(21)(function () { +module.exports = !__w_pdfjs_require__(20)(function () { return Object.defineProperty({}, 'a', { get: function get() { return 7; @@ -2991,7 +2727,7 @@ module.exports = !__w_pdfjs_require__(21)(function () { }); /***/ }), -/* 21 */ +/* 20 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -3006,15 +2742,15 @@ module.exports = function (exec) { }; /***/ }), -/* 22 */ +/* 21 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var isObject = __w_pdfjs_require__(18); +var isObject = __w_pdfjs_require__(17); -var document = __w_pdfjs_require__(13).document; +var document = __w_pdfjs_require__(12).document; var is = isObject(document) && isObject(document.createElement); @@ -3023,13 +2759,13 @@ module.exports = function (it) { }; /***/ }), -/* 23 */ +/* 22 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var isObject = __w_pdfjs_require__(18); +var isObject = __w_pdfjs_require__(17); module.exports = function (it, S) { if (!isObject(it)) return it; @@ -3041,7 +2777,7 @@ module.exports = function (it, S) { }; /***/ }), -/* 24 */ +/* 23 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -3057,25 +2793,26 @@ module.exports = function (bitmap, value) { }; /***/ }), -/* 25 */ +/* 24 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var global = __w_pdfjs_require__(13); +var global = __w_pdfjs_require__(12); + +var hide = __w_pdfjs_require__(14); -var hide = __w_pdfjs_require__(15); +var has = __w_pdfjs_require__(25); -var has = __w_pdfjs_require__(26); +var SRC = __w_pdfjs_require__(26)('src'); -var SRC = __w_pdfjs_require__(27)('src'); +var $toString = __w_pdfjs_require__(27); var TO_STRING = 'toString'; -var $toString = Function[TO_STRING]; var TPL = ('' + $toString).split(TO_STRING); -__w_pdfjs_require__(14).inspectSource = function (it) { +__w_pdfjs_require__(13).inspectSource = function (it) { return $toString.call(it); }; @@ -3100,7 +2837,7 @@ __w_pdfjs_require__(14).inspectSource = function (it) { }); /***/ }), -/* 26 */ +/* 25 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -3113,7 +2850,7 @@ module.exports = function (it, key) { }; /***/ }), -/* 27 */ +/* 26 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -3126,6 +2863,15 @@ module.exports = function (key) { return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); }; +/***/ }), +/* 27 */ +/***/ (function(module, exports, __w_pdfjs_require__) { + +"use strict"; + + +module.exports = __w_pdfjs_require__(28)('native-function-to-string', Function.toString); + /***/ }), /* 28 */ /***/ (function(module, exports, __w_pdfjs_require__) { @@ -3133,7 +2879,37 @@ module.exports = function (key) { "use strict"; -var aFunction = __w_pdfjs_require__(29); +var core = __w_pdfjs_require__(13); + +var global = __w_pdfjs_require__(12); + +var SHARED = '__core-js_shared__'; +var store = global[SHARED] || (global[SHARED] = {}); +(module.exports = function (key, value) { + return store[key] || (store[key] = value !== undefined ? value : {}); +})('versions', []).push({ + version: core.version, + mode: __w_pdfjs_require__(29) ? 'pure' : 'global', + copyright: '© 2019 Denis Pushkarev (zloirock.ru)' +}); + +/***/ }), +/* 29 */ +/***/ (function(module, exports, __w_pdfjs_require__) { + +"use strict"; + + +module.exports = false; + +/***/ }), +/* 30 */ +/***/ (function(module, exports, __w_pdfjs_require__) { + +"use strict"; + + +var aFunction = __w_pdfjs_require__(31); module.exports = function (fn, that, length) { aFunction(fn); @@ -3162,7 +2938,7 @@ module.exports = function (fn, that, length) { }; /***/ }), -/* 29 */ +/* 31 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -3174,13 +2950,13 @@ module.exports = function (it) { }; /***/ }), -/* 30 */ +/* 32 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var toInteger = __w_pdfjs_require__(31); +var toInteger = __w_pdfjs_require__(33); var min = Math.min; @@ -3189,7 +2965,7 @@ module.exports = function (it) { }; /***/ }), -/* 31 */ +/* 33 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -3203,13 +2979,13 @@ module.exports = function (it) { }; /***/ }), -/* 32 */ +/* 34 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var isRegExp = __w_pdfjs_require__(33); +var isRegExp = __w_pdfjs_require__(35); var defined = __w_pdfjs_require__(38); @@ -3219,17 +2995,17 @@ module.exports = function (that, searchString, NAME) { }; /***/ }), -/* 33 */ +/* 35 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var isObject = __w_pdfjs_require__(18); +var isObject = __w_pdfjs_require__(17); -var cof = __w_pdfjs_require__(34); +var cof = __w_pdfjs_require__(36); -var MATCH = __w_pdfjs_require__(35)('match'); +var MATCH = __w_pdfjs_require__(37)('match'); module.exports = function (it) { var isRegExp; @@ -3237,7 +3013,7 @@ module.exports = function (it) { }; /***/ }), -/* 34 */ +/* 36 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -3250,17 +3026,17 @@ module.exports = function (it) { }; /***/ }), -/* 35 */ +/* 37 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var store = __w_pdfjs_require__(36)('wks'); +var store = __w_pdfjs_require__(28)('wks'); -var uid = __w_pdfjs_require__(27); +var uid = __w_pdfjs_require__(26); -var _Symbol = __w_pdfjs_require__(13).Symbol; +var _Symbol = __w_pdfjs_require__(12).Symbol; var USE_SYMBOL = typeof _Symbol == 'function'; @@ -3270,36 +3046,6 @@ var $exports = module.exports = function (name) { $exports.store = store; -/***/ }), -/* 36 */ -/***/ (function(module, exports, __w_pdfjs_require__) { - -"use strict"; - - -var core = __w_pdfjs_require__(14); - -var global = __w_pdfjs_require__(13); - -var SHARED = '__core-js_shared__'; -var store = global[SHARED] || (global[SHARED] = {}); -(module.exports = function (key, value) { - return store[key] || (store[key] = value !== undefined ? value : {}); -})('versions', []).push({ - version: core.version, - mode: __w_pdfjs_require__(37) ? 'pure' : 'global', - copyright: '© 2019 Denis Pushkarev (zloirock.ru)' -}); - -/***/ }), -/* 37 */ -/***/ (function(module, exports, __w_pdfjs_require__) { - -"use strict"; - - -module.exports = false; - /***/ }), /* 38 */ /***/ (function(module, exports, __w_pdfjs_require__) { @@ -3319,7 +3065,7 @@ module.exports = function (it) { "use strict"; -var MATCH = __w_pdfjs_require__(35)('match'); +var MATCH = __w_pdfjs_require__(37)('match'); module.exports = function (KEY) { var re = /./; @@ -3345,7 +3091,7 @@ module.exports = function (KEY) { __w_pdfjs_require__(41); -module.exports = __w_pdfjs_require__(14).String.endsWith; +module.exports = __w_pdfjs_require__(13).String.endsWith; /***/ }), /* 41 */ @@ -3354,11 +3100,11 @@ module.exports = __w_pdfjs_require__(14).String.endsWith; "use strict"; -var $export = __w_pdfjs_require__(12); +var $export = __w_pdfjs_require__(11); -var toLength = __w_pdfjs_require__(30); +var toLength = __w_pdfjs_require__(32); -var context = __w_pdfjs_require__(32); +var context = __w_pdfjs_require__(34); var ENDS_WITH = 'endsWith'; var $endsWith = ''[ENDS_WITH]; @@ -3382,7 +3128,7 @@ $export($export.P + $export.F * __w_pdfjs_require__(39)(ENDS_WITH), 'String', { __w_pdfjs_require__(43); -module.exports = __w_pdfjs_require__(14).String.includes; +module.exports = __w_pdfjs_require__(13).String.includes; /***/ }), /* 43 */ @@ -3391,9 +3137,9 @@ module.exports = __w_pdfjs_require__(14).String.includes; "use strict"; -var $export = __w_pdfjs_require__(12); +var $export = __w_pdfjs_require__(11); -var context = __w_pdfjs_require__(32); +var context = __w_pdfjs_require__(34); var INCLUDES = 'includes'; $export($export.P + $export.F * __w_pdfjs_require__(39)(INCLUDES), 'String', { @@ -3411,7 +3157,7 @@ $export($export.P + $export.F * __w_pdfjs_require__(39)(INCLUDES), 'String', { __w_pdfjs_require__(45); -module.exports = __w_pdfjs_require__(14).Array.includes; +module.exports = __w_pdfjs_require__(13).Array.includes; /***/ }), /* 45 */ @@ -3420,7 +3166,7 @@ module.exports = __w_pdfjs_require__(14).Array.includes; "use strict"; -var $export = __w_pdfjs_require__(12); +var $export = __w_pdfjs_require__(11); var $includes = __w_pdfjs_require__(46)(true); @@ -3441,7 +3187,7 @@ __w_pdfjs_require__(50)('includes'); var toIObject = __w_pdfjs_require__(47); -var toLength = __w_pdfjs_require__(30); +var toLength = __w_pdfjs_require__(32); var toAbsoluteIndex = __w_pdfjs_require__(49); @@ -3485,7 +3231,7 @@ module.exports = function (it) { "use strict"; -var cof = __w_pdfjs_require__(34); +var cof = __w_pdfjs_require__(36); module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) { return cof(it) == 'String' ? it.split('') : Object(it); @@ -3498,7 +3244,7 @@ module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) { "use strict"; -var toInteger = __w_pdfjs_require__(31); +var toInteger = __w_pdfjs_require__(33); var max = Math.max; var min = Math.min; @@ -3515,10 +3261,10 @@ module.exports = function (index, length) { "use strict"; -var UNSCOPABLES = __w_pdfjs_require__(35)('unscopables'); +var UNSCOPABLES = __w_pdfjs_require__(37)('unscopables'); var ArrayProto = Array.prototype; -if (ArrayProto[UNSCOPABLES] == undefined) __w_pdfjs_require__(15)(ArrayProto, UNSCOPABLES, {}); +if (ArrayProto[UNSCOPABLES] == undefined) __w_pdfjs_require__(14)(ArrayProto, UNSCOPABLES, {}); module.exports = function (key) { ArrayProto[UNSCOPABLES][key] = true; @@ -3535,7 +3281,7 @@ __w_pdfjs_require__(52); __w_pdfjs_require__(67); -module.exports = __w_pdfjs_require__(14).Array.from; +module.exports = __w_pdfjs_require__(13).Array.from; /***/ }), /* 52 */ @@ -3572,7 +3318,7 @@ __w_pdfjs_require__(54)(String, 'String', function (iterated) { "use strict"; -var toInteger = __w_pdfjs_require__(31); +var toInteger = __w_pdfjs_require__(33); var defined = __w_pdfjs_require__(38); @@ -3595,13 +3341,13 @@ module.exports = function (TO_STRING) { "use strict"; -var LIBRARY = __w_pdfjs_require__(37); +var LIBRARY = __w_pdfjs_require__(29); -var $export = __w_pdfjs_require__(12); +var $export = __w_pdfjs_require__(11); -var redefine = __w_pdfjs_require__(25); +var redefine = __w_pdfjs_require__(24); -var hide = __w_pdfjs_require__(15); +var hide = __w_pdfjs_require__(14); var Iterators = __w_pdfjs_require__(55); @@ -3611,7 +3357,7 @@ var setToStringTag = __w_pdfjs_require__(64); var getPrototypeOf = __w_pdfjs_require__(65); -var ITERATOR = __w_pdfjs_require__(35)('iterator'); +var ITERATOR = __w_pdfjs_require__(37)('iterator'); var BUGGY = !([].keys && 'next' in [].keys()); var FF_ITERATOR = '@@iterator'; @@ -3711,13 +3457,13 @@ module.exports = {}; var create = __w_pdfjs_require__(57); -var descriptor = __w_pdfjs_require__(24); +var descriptor = __w_pdfjs_require__(23); var setToStringTag = __w_pdfjs_require__(64); var IteratorPrototype = {}; -__w_pdfjs_require__(15)(IteratorPrototype, __w_pdfjs_require__(35)('iterator'), function () { +__w_pdfjs_require__(14)(IteratorPrototype, __w_pdfjs_require__(37)('iterator'), function () { return this; }); @@ -3735,7 +3481,7 @@ module.exports = function (Constructor, NAME, next) { "use strict"; -var anObject = __w_pdfjs_require__(17); +var anObject = __w_pdfjs_require__(16); var dPs = __w_pdfjs_require__(58); @@ -3748,7 +3494,7 @@ var Empty = function Empty() {}; var PROTOTYPE = 'prototype'; var _createDict = function createDict() { - var iframe = __w_pdfjs_require__(22)('iframe'); + var iframe = __w_pdfjs_require__(21)('iframe'); var i = enumBugKeys.length; var lt = '<'; @@ -3792,13 +3538,13 @@ module.exports = Object.create || function create(O, Properties) { "use strict"; -var dP = __w_pdfjs_require__(16); +var dP = __w_pdfjs_require__(15); -var anObject = __w_pdfjs_require__(17); +var anObject = __w_pdfjs_require__(16); var getKeys = __w_pdfjs_require__(59); -module.exports = __w_pdfjs_require__(20) ? Object.defineProperties : function defineProperties(O, Properties) { +module.exports = __w_pdfjs_require__(19) ? Object.defineProperties : function defineProperties(O, Properties) { anObject(O); var keys = getKeys(Properties); var length = keys.length; @@ -3834,7 +3580,7 @@ module.exports = Object.keys || function keys(O) { "use strict"; -var has = __w_pdfjs_require__(26); +var has = __w_pdfjs_require__(25); var toIObject = __w_pdfjs_require__(47); @@ -3868,9 +3614,9 @@ module.exports = function (object, names) { "use strict"; -var shared = __w_pdfjs_require__(36)('keys'); +var shared = __w_pdfjs_require__(28)('keys'); -var uid = __w_pdfjs_require__(27); +var uid = __w_pdfjs_require__(26); module.exports = function (key) { return shared[key] || (shared[key] = uid(key)); @@ -3892,7 +3638,7 @@ module.exports = 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable, "use strict"; -var document = __w_pdfjs_require__(13).document; +var document = __w_pdfjs_require__(12).document; module.exports = document && document.documentElement; @@ -3903,11 +3649,11 @@ module.exports = document && document.documentElement; "use strict"; -var def = __w_pdfjs_require__(16).f; +var def = __w_pdfjs_require__(15).f; -var has = __w_pdfjs_require__(26); +var has = __w_pdfjs_require__(25); -var TAG = __w_pdfjs_require__(35)('toStringTag'); +var TAG = __w_pdfjs_require__(37)('toStringTag'); module.exports = function (it, tag, stat) { if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { @@ -3923,7 +3669,7 @@ module.exports = function (it, tag, stat) { "use strict"; -var has = __w_pdfjs_require__(26); +var has = __w_pdfjs_require__(25); var toObject = __w_pdfjs_require__(66); @@ -3962,9 +3708,9 @@ module.exports = function (it) { "use strict"; -var ctx = __w_pdfjs_require__(28); +var ctx = __w_pdfjs_require__(30); -var $export = __w_pdfjs_require__(12); +var $export = __w_pdfjs_require__(11); var toObject = __w_pdfjs_require__(66); @@ -3972,7 +3718,7 @@ var call = __w_pdfjs_require__(68); var isArrayIter = __w_pdfjs_require__(69); -var toLength = __w_pdfjs_require__(30); +var toLength = __w_pdfjs_require__(32); var createProperty = __w_pdfjs_require__(70); @@ -4016,7 +3762,7 @@ $export($export.S + $export.F * !__w_pdfjs_require__(73)(function (iter) { "use strict"; -var anObject = __w_pdfjs_require__(17); +var anObject = __w_pdfjs_require__(16); module.exports = function (iterator, fn, value, entries) { try { @@ -4037,7 +3783,7 @@ module.exports = function (iterator, fn, value, entries) { var Iterators = __w_pdfjs_require__(55); -var ITERATOR = __w_pdfjs_require__(35)('iterator'); +var ITERATOR = __w_pdfjs_require__(37)('iterator'); var ArrayProto = Array.prototype; @@ -4052,9 +3798,9 @@ module.exports = function (it) { "use strict"; -var $defineProperty = __w_pdfjs_require__(16); +var $defineProperty = __w_pdfjs_require__(15); -var createDesc = __w_pdfjs_require__(24); +var createDesc = __w_pdfjs_require__(23); module.exports = function (object, index, value) { if (index in object) $defineProperty.f(object, index, createDesc(0, value));else object[index] = value; @@ -4069,11 +3815,11 @@ module.exports = function (object, index, value) { var classof = __w_pdfjs_require__(72); -var ITERATOR = __w_pdfjs_require__(35)('iterator'); +var ITERATOR = __w_pdfjs_require__(37)('iterator'); var Iterators = __w_pdfjs_require__(55); -module.exports = __w_pdfjs_require__(14).getIteratorMethod = function (it) { +module.exports = __w_pdfjs_require__(13).getIteratorMethod = function (it) { if (it != undefined) return it[ITERATOR] || it['@@iterator'] || Iterators[classof(it)]; }; @@ -4084,9 +3830,9 @@ module.exports = __w_pdfjs_require__(14).getIteratorMethod = function (it) { "use strict"; -var cof = __w_pdfjs_require__(34); +var cof = __w_pdfjs_require__(36); -var TAG = __w_pdfjs_require__(35)('toStringTag'); +var TAG = __w_pdfjs_require__(37)('toStringTag'); var ARG = cof(function () { return arguments; @@ -4110,7 +3856,7 @@ module.exports = function (it) { "use strict"; -var ITERATOR = __w_pdfjs_require__(35)('iterator'); +var ITERATOR = __w_pdfjs_require__(37)('iterator'); var SAFE_CLOSING = false; @@ -4159,7 +3905,7 @@ module.exports = function (exec, skipClosing) { __w_pdfjs_require__(75); -module.exports = __w_pdfjs_require__(14).Object.assign; +module.exports = __w_pdfjs_require__(13).Object.assign; /***/ }), /* 75 */ @@ -4168,7 +3914,7 @@ module.exports = __w_pdfjs_require__(14).Object.assign; "use strict"; -var $export = __w_pdfjs_require__(12); +var $export = __w_pdfjs_require__(11); $export($export.S + $export.F, 'Object', { assign: __w_pdfjs_require__(76) @@ -4181,6 +3927,8 @@ $export($export.S + $export.F, 'Object', { "use strict"; +var DESCRIPTORS = __w_pdfjs_require__(19); + var getKeys = __w_pdfjs_require__(59); var gOPS = __w_pdfjs_require__(77); @@ -4192,7 +3940,7 @@ var toObject = __w_pdfjs_require__(66); var IObject = __w_pdfjs_require__(48); var $assign = Object.assign; -module.exports = !$assign || __w_pdfjs_require__(21)(function () { +module.exports = !$assign || __w_pdfjs_require__(20)(function () { var A = {}; var B = {}; var S = Symbol(); @@ -4217,7 +3965,8 @@ module.exports = !$assign || __w_pdfjs_require__(21)(function () { var key; while (length > j) { - if (isEnum.call(S, key = keys[j++])) T[key] = S[key]; + key = keys[j++]; + if (!DESCRIPTORS || isEnum.call(S, key)) T[key] = S[key]; } } @@ -4251,7 +4000,7 @@ exports.f = {}.propertyIsEnumerable; __w_pdfjs_require__(80); -module.exports = __w_pdfjs_require__(14).Math.log2; +module.exports = __w_pdfjs_require__(13).Math.log2; /***/ }), /* 80 */ @@ -4260,7 +4009,7 @@ module.exports = __w_pdfjs_require__(14).Math.log2; "use strict"; -var $export = __w_pdfjs_require__(12); +var $export = __w_pdfjs_require__(11); $export($export.S, 'Math', { log2: function log2(x) { @@ -4277,7 +4026,7 @@ $export($export.S, 'Math', { __w_pdfjs_require__(82); -module.exports = __w_pdfjs_require__(14).Number.isNaN; +module.exports = __w_pdfjs_require__(13).Number.isNaN; /***/ }), /* 82 */ @@ -4286,7 +4035,7 @@ module.exports = __w_pdfjs_require__(14).Number.isNaN; "use strict"; -var $export = __w_pdfjs_require__(12); +var $export = __w_pdfjs_require__(11); $export($export.S, 'Number', { isNaN: function isNaN(number) { @@ -4303,7 +4052,7 @@ $export($export.S, 'Number', { __w_pdfjs_require__(84); -module.exports = __w_pdfjs_require__(14).Number.isInteger; +module.exports = __w_pdfjs_require__(13).Number.isInteger; /***/ }), /* 84 */ @@ -4312,7 +4061,7 @@ module.exports = __w_pdfjs_require__(14).Number.isInteger; "use strict"; -var $export = __w_pdfjs_require__(12); +var $export = __w_pdfjs_require__(11); $export($export.S, 'Number', { isInteger: __w_pdfjs_require__(85) @@ -4325,7 +4074,7 @@ $export($export.S, 'Number', { "use strict"; -var isObject = __w_pdfjs_require__(18); +var isObject = __w_pdfjs_require__(17); var floor = Math.floor; @@ -4352,7 +4101,7 @@ __w_pdfjs_require__(104); __w_pdfjs_require__(105); -module.exports = __w_pdfjs_require__(14).Promise; +module.exports = __w_pdfjs_require__(13).Promise; /***/ }), /* 87 */ @@ -4364,10 +4113,10 @@ module.exports = __w_pdfjs_require__(14).Promise; var classof = __w_pdfjs_require__(72); var test = {}; -test[__w_pdfjs_require__(35)('toStringTag')] = 'z'; +test[__w_pdfjs_require__(37)('toStringTag')] = 'z'; if (test + '' != '[object z]') { - __w_pdfjs_require__(25)(Object.prototype, 'toString', function toString() { + __w_pdfjs_require__(24)(Object.prototype, 'toString', function toString() { return '[object ' + classof(this) + ']'; }, true); } @@ -4383,15 +4132,15 @@ var $iterators = __w_pdfjs_require__(89); var getKeys = __w_pdfjs_require__(59); -var redefine = __w_pdfjs_require__(25); +var redefine = __w_pdfjs_require__(24); -var global = __w_pdfjs_require__(13); +var global = __w_pdfjs_require__(12); -var hide = __w_pdfjs_require__(15); +var hide = __w_pdfjs_require__(14); var Iterators = __w_pdfjs_require__(55); -var wks = __w_pdfjs_require__(35); +var wks = __w_pdfjs_require__(37); var ITERATOR = wks('iterator'); var TO_STRING_TAG = wks('toStringTag'); @@ -4506,19 +4255,19 @@ module.exports = function (done, value) { "use strict"; -var LIBRARY = __w_pdfjs_require__(37); +var LIBRARY = __w_pdfjs_require__(29); -var global = __w_pdfjs_require__(13); +var global = __w_pdfjs_require__(12); -var ctx = __w_pdfjs_require__(28); +var ctx = __w_pdfjs_require__(30); var classof = __w_pdfjs_require__(72); -var $export = __w_pdfjs_require__(12); +var $export = __w_pdfjs_require__(11); -var isObject = __w_pdfjs_require__(18); +var isObject = __w_pdfjs_require__(17); -var aFunction = __w_pdfjs_require__(29); +var aFunction = __w_pdfjs_require__(31); var anInstance = __w_pdfjs_require__(92); @@ -4554,7 +4303,7 @@ var USE_NATIVE = !!function () { try { var promise = $Promise.resolve(1); - var FakePromise = (promise.constructor = {})[__w_pdfjs_require__(35)('species')] = function (exec) { + var FakePromise = (promise.constructor = {})[__w_pdfjs_require__(37)('species')] = function (exec) { exec(empty, empty); }; @@ -4776,7 +4525,7 @@ __w_pdfjs_require__(64)($Promise, PROMISE); __w_pdfjs_require__(103)(PROMISE); -Wrapper = __w_pdfjs_require__(14)[PROMISE]; +Wrapper = __w_pdfjs_require__(13)[PROMISE]; $export($export.S + $export.F * !USE_NATIVE, PROMISE, { reject: function reject(r) { var capability = newPromiseCapability(this); @@ -4855,15 +4604,15 @@ module.exports = function (it, Constructor, name, forbiddenField) { "use strict"; -var ctx = __w_pdfjs_require__(28); +var ctx = __w_pdfjs_require__(30); var call = __w_pdfjs_require__(68); var isArrayIter = __w_pdfjs_require__(69); -var anObject = __w_pdfjs_require__(17); +var anObject = __w_pdfjs_require__(16); -var toLength = __w_pdfjs_require__(30); +var toLength = __w_pdfjs_require__(32); var getIterFn = __w_pdfjs_require__(71); @@ -4897,11 +4646,11 @@ _exports.RETURN = RETURN; "use strict"; -var anObject = __w_pdfjs_require__(17); +var anObject = __w_pdfjs_require__(16); -var aFunction = __w_pdfjs_require__(29); +var aFunction = __w_pdfjs_require__(31); -var SPECIES = __w_pdfjs_require__(35)('species'); +var SPECIES = __w_pdfjs_require__(37)('species'); module.exports = function (O, D) { var C = anObject(O).constructor; @@ -4916,15 +4665,15 @@ module.exports = function (O, D) { "use strict"; -var ctx = __w_pdfjs_require__(28); +var ctx = __w_pdfjs_require__(30); var invoke = __w_pdfjs_require__(96); var html = __w_pdfjs_require__(63); -var cel = __w_pdfjs_require__(22); +var cel = __w_pdfjs_require__(21); -var global = __w_pdfjs_require__(13); +var global = __w_pdfjs_require__(12); var process = global.process; var setTask = global.setImmediate; @@ -4971,7 +4720,7 @@ if (!setTask || !clearTask) { delete queue[id]; }; - if (__w_pdfjs_require__(34)(process) == 'process') { + if (__w_pdfjs_require__(36)(process) == 'process') { defer = function defer(id) { process.nextTick(ctx(run, id, 1)); }; @@ -5046,14 +4795,14 @@ module.exports = function (fn, args, that) { "use strict"; -var global = __w_pdfjs_require__(13); +var global = __w_pdfjs_require__(12); var macrotask = __w_pdfjs_require__(95).set; var Observer = global.MutationObserver || global.WebKitMutationObserver; var process = global.process; var Promise = global.Promise; -var isNode = __w_pdfjs_require__(34)(process) == 'process'; +var isNode = __w_pdfjs_require__(36)(process) == 'process'; module.exports = function () { var head, last, notify; @@ -5127,7 +4876,7 @@ module.exports = function () { "use strict"; -var aFunction = __w_pdfjs_require__(29); +var aFunction = __w_pdfjs_require__(31); function PromiseCapability(C) { var resolve, reject; @@ -5172,7 +4921,7 @@ module.exports = function (exec) { "use strict"; -var global = __w_pdfjs_require__(13); +var global = __w_pdfjs_require__(12); var navigator = global.navigator; module.exports = navigator && navigator.userAgent || ''; @@ -5184,9 +4933,9 @@ module.exports = navigator && navigator.userAgent || ''; "use strict"; -var anObject = __w_pdfjs_require__(17); +var anObject = __w_pdfjs_require__(16); -var isObject = __w_pdfjs_require__(18); +var isObject = __w_pdfjs_require__(17); var newPromiseCapability = __w_pdfjs_require__(98); @@ -5206,7 +4955,7 @@ module.exports = function (C, x) { "use strict"; -var redefine = __w_pdfjs_require__(25); +var redefine = __w_pdfjs_require__(24); module.exports = function (target, src, safe) { for (var key in src) { @@ -5223,13 +4972,13 @@ module.exports = function (target, src, safe) { "use strict"; -var global = __w_pdfjs_require__(13); +var global = __w_pdfjs_require__(12); -var dP = __w_pdfjs_require__(16); +var dP = __w_pdfjs_require__(15); -var DESCRIPTORS = __w_pdfjs_require__(20); +var DESCRIPTORS = __w_pdfjs_require__(19); -var SPECIES = __w_pdfjs_require__(35)('species'); +var SPECIES = __w_pdfjs_require__(37)('species'); module.exports = function (KEY) { var C = global[KEY]; @@ -5248,11 +4997,11 @@ module.exports = function (KEY) { "use strict"; -var $export = __w_pdfjs_require__(12); +var $export = __w_pdfjs_require__(11); -var core = __w_pdfjs_require__(14); +var core = __w_pdfjs_require__(13); -var global = __w_pdfjs_require__(13); +var global = __w_pdfjs_require__(12); var speciesConstructor = __w_pdfjs_require__(94); @@ -5281,7 +5030,7 @@ $export($export.P + $export.R, 'Promise', { "use strict"; -var $export = __w_pdfjs_require__(12); +var $export = __w_pdfjs_require__(11); var newPromiseCapability = __w_pdfjs_require__(98); @@ -5313,7 +5062,7 @@ __w_pdfjs_require__(119); __w_pdfjs_require__(121); -module.exports = __w_pdfjs_require__(14).WeakMap; +module.exports = __w_pdfjs_require__(13).WeakMap; /***/ }), /* 107 */ @@ -5322,9 +5071,11 @@ module.exports = __w_pdfjs_require__(14).WeakMap; "use strict"; +var global = __w_pdfjs_require__(12); + var each = __w_pdfjs_require__(108)(0); -var redefine = __w_pdfjs_require__(25); +var redefine = __w_pdfjs_require__(24); var meta = __w_pdfjs_require__(112); @@ -5332,17 +5083,17 @@ var assign = __w_pdfjs_require__(76); var weak = __w_pdfjs_require__(113); -var isObject = __w_pdfjs_require__(18); - -var fails = __w_pdfjs_require__(21); +var isObject = __w_pdfjs_require__(17); var validate = __w_pdfjs_require__(114); +var NATIVE_WEAK_MAP = __w_pdfjs_require__(114); + +var IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global; var WEAK_MAP = 'WeakMap'; var getWeak = meta.getWeak; var isExtensible = Object.isExtensible; var uncaughtFrozenStore = weak.ufstore; -var tmp = {}; var InternalMap; var wrapper = function wrapper(get) { @@ -5366,9 +5117,7 @@ var methods = { var $WeakMap = module.exports = __w_pdfjs_require__(115)(WEAK_MAP, wrapper, methods, weak, true, true); -if (fails(function () { - return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; -})) { +if (NATIVE_WEAK_MAP && IS_IE11) { InternalMap = weak.getConstructor(wrapper, WEAK_MAP); assign(InternalMap.prototype, methods); meta.NEED = true; @@ -5396,13 +5145,13 @@ if (fails(function () { "use strict"; -var ctx = __w_pdfjs_require__(28); +var ctx = __w_pdfjs_require__(30); var IObject = __w_pdfjs_require__(48); var toObject = __w_pdfjs_require__(66); -var toLength = __w_pdfjs_require__(30); +var toLength = __w_pdfjs_require__(32); var asc = __w_pdfjs_require__(109); @@ -5470,11 +5219,11 @@ module.exports = function (original, length) { "use strict"; -var isObject = __w_pdfjs_require__(18); +var isObject = __w_pdfjs_require__(17); var isArray = __w_pdfjs_require__(111); -var SPECIES = __w_pdfjs_require__(35)('species'); +var SPECIES = __w_pdfjs_require__(37)('species'); module.exports = function (original) { var C; @@ -5499,7 +5248,7 @@ module.exports = function (original) { "use strict"; -var cof = __w_pdfjs_require__(34); +var cof = __w_pdfjs_require__(36); module.exports = Array.isArray || function isArray(arg) { return cof(arg) == 'Array'; @@ -5514,13 +5263,13 @@ module.exports = Array.isArray || function isArray(arg) { function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } -var META = __w_pdfjs_require__(27)('meta'); +var META = __w_pdfjs_require__(26)('meta'); -var isObject = __w_pdfjs_require__(18); +var isObject = __w_pdfjs_require__(17); -var has = __w_pdfjs_require__(26); +var has = __w_pdfjs_require__(25); -var setDesc = __w_pdfjs_require__(16).f; +var setDesc = __w_pdfjs_require__(15).f; var id = 0; @@ -5528,7 +5277,7 @@ var isExtensible = Object.isExtensible || function () { return true; }; -var FREEZE = !__w_pdfjs_require__(21)(function () { +var FREEZE = !__w_pdfjs_require__(20)(function () { return isExtensible(Object.preventExtensions({})); }); @@ -5587,9 +5336,9 @@ var redefineAll = __w_pdfjs_require__(102); var getWeak = __w_pdfjs_require__(112).getWeak; -var anObject = __w_pdfjs_require__(17); +var anObject = __w_pdfjs_require__(16); -var isObject = __w_pdfjs_require__(18); +var isObject = __w_pdfjs_require__(17); var anInstance = __w_pdfjs_require__(92); @@ -5597,7 +5346,7 @@ var forOf = __w_pdfjs_require__(93); var createArrayMethod = __w_pdfjs_require__(108); -var $has = __w_pdfjs_require__(26); +var $has = __w_pdfjs_require__(25); var validate = __w_pdfjs_require__(114); @@ -5679,7 +5428,7 @@ module.exports = { "use strict"; -var isObject = __w_pdfjs_require__(18); +var isObject = __w_pdfjs_require__(17); module.exports = function (it, TYPE) { if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!'); @@ -5693,11 +5442,11 @@ module.exports = function (it, TYPE) { "use strict"; -var global = __w_pdfjs_require__(13); +var global = __w_pdfjs_require__(12); -var $export = __w_pdfjs_require__(12); +var $export = __w_pdfjs_require__(11); -var redefine = __w_pdfjs_require__(25); +var redefine = __w_pdfjs_require__(24); var redefineAll = __w_pdfjs_require__(102); @@ -5707,9 +5456,9 @@ var forOf = __w_pdfjs_require__(93); var anInstance = __w_pdfjs_require__(92); -var isObject = __w_pdfjs_require__(18); +var isObject = __w_pdfjs_require__(17); -var fails = __w_pdfjs_require__(21); +var fails = __w_pdfjs_require__(20); var $iterDetect = __w_pdfjs_require__(73); @@ -5802,7 +5551,7 @@ module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) { "use strict"; -var isObject = __w_pdfjs_require__(18); +var isObject = __w_pdfjs_require__(17); var setPrototypeOf = __w_pdfjs_require__(117).set; @@ -5824,9 +5573,9 @@ module.exports = function (that, target, C) { "use strict"; -var isObject = __w_pdfjs_require__(18); +var isObject = __w_pdfjs_require__(17); -var anObject = __w_pdfjs_require__(17); +var anObject = __w_pdfjs_require__(16); var check = function check(O, proto) { anObject(O); @@ -5836,7 +5585,7 @@ var check = function check(O, proto) { module.exports = { set: Object.setPrototypeOf || ('__proto__' in {} ? function (test, buggy, set) { try { - set = __w_pdfjs_require__(28)(Function.call, __w_pdfjs_require__(118).f(Object.prototype, '__proto__').set, 2); + set = __w_pdfjs_require__(30)(Function.call, __w_pdfjs_require__(118).f(Object.prototype, '__proto__').set, 2); set(test, []); buggy = !(test instanceof Array); } catch (e) { @@ -5861,18 +5610,18 @@ module.exports = { var pIE = __w_pdfjs_require__(78); -var createDesc = __w_pdfjs_require__(24); +var createDesc = __w_pdfjs_require__(23); var toIObject = __w_pdfjs_require__(47); -var toPrimitive = __w_pdfjs_require__(23); +var toPrimitive = __w_pdfjs_require__(22); -var has = __w_pdfjs_require__(26); +var has = __w_pdfjs_require__(25); -var IE8_DOM_DEFINE = __w_pdfjs_require__(19); +var IE8_DOM_DEFINE = __w_pdfjs_require__(18); var gOPD = Object.getOwnPropertyDescriptor; -exports.f = __w_pdfjs_require__(20) ? gOPD : function getOwnPropertyDescriptor(O, P) { +exports.f = __w_pdfjs_require__(19) ? gOPD : function getOwnPropertyDescriptor(O, P) { O = toIObject(O); P = toPrimitive(P, true); if (IE8_DOM_DEFINE) try { @@ -5897,7 +5646,7 @@ __w_pdfjs_require__(120)('WeakMap'); "use strict"; -var $export = __w_pdfjs_require__(12); +var $export = __w_pdfjs_require__(11); module.exports = function (COLLECTION) { $export($export.S, COLLECTION, { @@ -5930,11 +5679,11 @@ __w_pdfjs_require__(122)('WeakMap'); "use strict"; -var $export = __w_pdfjs_require__(12); +var $export = __w_pdfjs_require__(11); -var aFunction = __w_pdfjs_require__(29); +var aFunction = __w_pdfjs_require__(31); -var ctx = __w_pdfjs_require__(28); +var ctx = __w_pdfjs_require__(30); var forOf = __w_pdfjs_require__(93); @@ -5981,7 +5730,7 @@ __w_pdfjs_require__(125); __w_pdfjs_require__(126); -module.exports = __w_pdfjs_require__(14).WeakSet; +module.exports = __w_pdfjs_require__(13).WeakSet; /***/ }), /* 124 */ @@ -6033,7 +5782,7 @@ __w_pdfjs_require__(122)('WeakSet'); __w_pdfjs_require__(128); -module.exports = __w_pdfjs_require__(14).String.codePointAt; +module.exports = __w_pdfjs_require__(13).String.codePointAt; /***/ }), /* 128 */ @@ -6042,7 +5791,7 @@ module.exports = __w_pdfjs_require__(14).String.codePointAt; "use strict"; -var $export = __w_pdfjs_require__(12); +var $export = __w_pdfjs_require__(11); var $at = __w_pdfjs_require__(53)(false); @@ -6061,7 +5810,7 @@ $export($export.P, 'String', { __w_pdfjs_require__(130); -module.exports = __w_pdfjs_require__(14).String.fromCodePoint; +module.exports = __w_pdfjs_require__(13).String.fromCodePoint; /***/ }), /* 130 */ @@ -6070,7 +5819,7 @@ module.exports = __w_pdfjs_require__(14).String.fromCodePoint; "use strict"; -var $export = __w_pdfjs_require__(12); +var $export = __w_pdfjs_require__(11); var toAbsoluteIndex = __w_pdfjs_require__(49); @@ -6104,7 +5853,7 @@ __w_pdfjs_require__(132); __w_pdfjs_require__(87); -module.exports = __w_pdfjs_require__(14).Symbol; +module.exports = __w_pdfjs_require__(13).Symbol; /***/ }), /* 132 */ @@ -6115,27 +5864,27 @@ module.exports = __w_pdfjs_require__(14).Symbol; function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } -var global = __w_pdfjs_require__(13); +var global = __w_pdfjs_require__(12); -var has = __w_pdfjs_require__(26); +var has = __w_pdfjs_require__(25); -var DESCRIPTORS = __w_pdfjs_require__(20); +var DESCRIPTORS = __w_pdfjs_require__(19); -var $export = __w_pdfjs_require__(12); +var $export = __w_pdfjs_require__(11); -var redefine = __w_pdfjs_require__(25); +var redefine = __w_pdfjs_require__(24); var META = __w_pdfjs_require__(112).KEY; -var $fails = __w_pdfjs_require__(21); +var $fails = __w_pdfjs_require__(20); -var shared = __w_pdfjs_require__(36); +var shared = __w_pdfjs_require__(28); var setToStringTag = __w_pdfjs_require__(64); -var uid = __w_pdfjs_require__(27); +var uid = __w_pdfjs_require__(26); -var wks = __w_pdfjs_require__(35); +var wks = __w_pdfjs_require__(37); var wksExt = __w_pdfjs_require__(133); @@ -6145,15 +5894,17 @@ var enumKeys = __w_pdfjs_require__(135); var isArray = __w_pdfjs_require__(111); -var anObject = __w_pdfjs_require__(17); +var anObject = __w_pdfjs_require__(16); -var isObject = __w_pdfjs_require__(18); +var isObject = __w_pdfjs_require__(17); + +var toObject = __w_pdfjs_require__(66); var toIObject = __w_pdfjs_require__(47); -var toPrimitive = __w_pdfjs_require__(23); +var toPrimitive = __w_pdfjs_require__(22); -var createDesc = __w_pdfjs_require__(24); +var createDesc = __w_pdfjs_require__(23); var _create = __w_pdfjs_require__(57); @@ -6161,7 +5912,9 @@ var gOPNExt = __w_pdfjs_require__(136); var $GOPD = __w_pdfjs_require__(118); -var $DP = __w_pdfjs_require__(16); +var $GOPS = __w_pdfjs_require__(77); + +var $DP = __w_pdfjs_require__(15); var $keys = __w_pdfjs_require__(59); @@ -6181,7 +5934,7 @@ var SymbolRegistry = shared('symbol-registry'); var AllSymbols = shared('symbols'); var OPSymbols = shared('op-symbols'); var ObjectProto = Object[PROTOTYPE]; -var USE_NATIVE = typeof $Symbol == 'function'; +var USE_NATIVE = typeof $Symbol == 'function' && !!$GOPS.f; var QObject = global.QObject; var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild; var setSymbolDesc = DESCRIPTORS && $fails(function () { @@ -6320,9 +6073,9 @@ if (!USE_NATIVE) { $DP.f = $defineProperty; __w_pdfjs_require__(137).f = gOPNExt.f = $getOwnPropertyNames; __w_pdfjs_require__(78).f = $propertyIsEnumerable; - __w_pdfjs_require__(77).f = $getOwnPropertySymbols; + $GOPS.f = $getOwnPropertySymbols; - if (DESCRIPTORS && !__w_pdfjs_require__(37)) { + if (DESCRIPTORS && !__w_pdfjs_require__(29)) { redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true); } @@ -6369,6 +6122,14 @@ $export($export.S + $export.F * !USE_NATIVE, 'Object', { getOwnPropertyNames: $getOwnPropertyNames, getOwnPropertySymbols: $getOwnPropertySymbols }); +var FAILS_ON_PRIMITIVES = $fails(function () { + $GOPS.f(1); +}); +$export($export.S + $export.F * FAILS_ON_PRIMITIVES, 'Object', { + getOwnPropertySymbols: function getOwnPropertySymbols(it) { + return $GOPS.f(toObject(it)); + } +}); $JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () { var S = $Symbol(); return _stringify([S]) != '[null]' || _stringify({ @@ -6394,7 +6155,7 @@ $JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () { return _stringify.apply($JSON, args); } }); -$Symbol[PROTOTYPE][TO_PRIMITIVE] || __w_pdfjs_require__(15)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf); +$Symbol[PROTOTYPE][TO_PRIMITIVE] || __w_pdfjs_require__(14)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf); setToStringTag($Symbol, 'Symbol'); setToStringTag(Math, 'Math', true); setToStringTag(global.JSON, 'JSON', true); @@ -6406,7 +6167,7 @@ setToStringTag(global.JSON, 'JSON', true); "use strict"; -exports.f = __w_pdfjs_require__(35); +exports.f = __w_pdfjs_require__(37); /***/ }), /* 134 */ @@ -6415,15 +6176,15 @@ exports.f = __w_pdfjs_require__(35); "use strict"; -var global = __w_pdfjs_require__(13); +var global = __w_pdfjs_require__(12); -var core = __w_pdfjs_require__(14); +var core = __w_pdfjs_require__(13); -var LIBRARY = __w_pdfjs_require__(37); +var LIBRARY = __w_pdfjs_require__(29); var wksExt = __w_pdfjs_require__(133); -var defineProperty = __w_pdfjs_require__(16).f; +var defineProperty = __w_pdfjs_require__(15).f; module.exports = function (name) { var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {}); @@ -6515,7 +6276,7 @@ exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { __w_pdfjs_require__(139); -module.exports = __w_pdfjs_require__(14).String.padStart; +module.exports = __w_pdfjs_require__(13).String.padStart; /***/ }), /* 139 */ @@ -6524,13 +6285,14 @@ module.exports = __w_pdfjs_require__(14).String.padStart; "use strict"; -var $export = __w_pdfjs_require__(12); +var $export = __w_pdfjs_require__(11); var $pad = __w_pdfjs_require__(140); var userAgent = __w_pdfjs_require__(100); -$export($export.P + $export.F * /Version\/10\.\d+(\.\d+)? Safari\//.test(userAgent), 'String', { +var WEBKIT_BUG = /Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(userAgent); +$export($export.P + $export.F * WEBKIT_BUG, 'String', { padStart: function padStart(maxLength) { return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true); } @@ -6543,7 +6305,7 @@ $export($export.P + $export.F * /Version\/10\.\d+(\.\d+)? Safari\//.test(userAge "use strict"; -var toLength = __w_pdfjs_require__(30); +var toLength = __w_pdfjs_require__(32); var repeat = __w_pdfjs_require__(141); @@ -6568,7 +6330,7 @@ module.exports = function (that, maxLength, fillString, left) { "use strict"; -var toInteger = __w_pdfjs_require__(31); +var toInteger = __w_pdfjs_require__(33); var defined = __w_pdfjs_require__(38); @@ -6594,7 +6356,7 @@ module.exports = function repeat(count) { __w_pdfjs_require__(143); -module.exports = __w_pdfjs_require__(14).String.padEnd; +module.exports = __w_pdfjs_require__(13).String.padEnd; /***/ }), /* 143 */ @@ -6603,13 +6365,14 @@ module.exports = __w_pdfjs_require__(14).String.padEnd; "use strict"; -var $export = __w_pdfjs_require__(12); +var $export = __w_pdfjs_require__(11); var $pad = __w_pdfjs_require__(140); var userAgent = __w_pdfjs_require__(100); -$export($export.P + $export.F * /Version\/10\.\d+(\.\d+)? Safari\//.test(userAgent), 'String', { +var WEBKIT_BUG = /Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(userAgent); +$export($export.P + $export.F * WEBKIT_BUG, 'String', { padEnd: function padEnd(maxLength) { return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false); } @@ -6624,7 +6387,7 @@ $export($export.P + $export.F * /Version\/10\.\d+(\.\d+)? Safari\//.test(userAge __w_pdfjs_require__(145); -module.exports = __w_pdfjs_require__(14).Object.values; +module.exports = __w_pdfjs_require__(13).Object.values; /***/ }), /* 145 */ @@ -6633,7 +6396,7 @@ module.exports = __w_pdfjs_require__(14).Object.values; "use strict"; -var $export = __w_pdfjs_require__(12); +var $export = __w_pdfjs_require__(11); var $values = __w_pdfjs_require__(146)(false); @@ -6650,6 +6413,8 @@ $export($export.S, 'Object', { "use strict"; +var DESCRIPTORS = __w_pdfjs_require__(19); + var getKeys = __w_pdfjs_require__(59); var toIObject = __w_pdfjs_require__(47); @@ -6666,7 +6431,9 @@ module.exports = function (isEntries) { var key; while (length > i) { - if (isEnum.call(O, key = keys[i++])) { + key = keys[i++]; + + if (!DESCRIPTORS || isEnum.call(O, key)) { result.push(isEntries ? [key, O[key]] : O[key]); } } @@ -7341,7 +7108,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera if (writer !== undefined) { defaultWriterClosedPromiseReject(writer, stream._storedError); - writer._closedPromise.catch(function () {}); + writer._closedPromise["catch"](function () {}); } } @@ -7389,7 +7156,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera } else if (state === 'erroring') { defaultWriterReadyPromiseInitializeAsRejected(this, stream._storedError); - this._readyPromise.catch(function () {}); + this._readyPromise["catch"](function () {}); defaultWriterClosedPromiseInitialize(this); } else if (state === 'closed') { @@ -7400,11 +7167,11 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera var storedError = stream._storedError; defaultWriterReadyPromiseInitializeAsRejected(this, storedError); - this._readyPromise.catch(function () {}); + this._readyPromise["catch"](function () {}); defaultWriterClosedPromiseInitializeAsRejected(this, storedError); - this._closedPromise.catch(function () {}); + this._closedPromise["catch"](function () {}); } } @@ -7574,7 +7341,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera defaultWriterClosedPromiseResetToRejected(writer, error); } - writer._closedPromise.catch(function () {}); + writer._closedPromise["catch"](function () {}); } function WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, error) { @@ -7584,7 +7351,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera defaultWriterReadyPromiseResetToRejected(writer, error); } - writer._readyPromise.catch(function () {}); + writer._readyPromise["catch"](function () {}); } function WritableStreamDefaultWriterGetDesiredSize(writer) { @@ -7708,7 +7475,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera assert(stream._state === 'writable' || stream._state === 'erroring'); _this._started = true; WritableStreamDealWithRejection(stream, r); - }).catch(rethrowAssertionErrorRejection); + })["catch"](rethrowAssertionErrorRejection); } }]); @@ -7824,7 +7591,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera WritableStreamFinishInFlightClose(stream); }, function (reason) { WritableStreamFinishInFlightCloseWithError(stream, reason); - }).catch(rethrowAssertionErrorRejection); + })["catch"](rethrowAssertionErrorRejection); } function WritableStreamDefaultControllerProcessWrite(controller, chunk) { @@ -7845,7 +7612,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); }, function (reason) { WritableStreamFinishInFlightWriteWithError(stream, reason); - }).catch(rethrowAssertionErrorRejection); + })["catch"](rethrowAssertionErrorRejection); } function WritableStreamDefaultControllerGetBackpressure(controller) { @@ -8228,7 +7995,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera return; } - currentWrite = WritableStreamDefaultWriterWrite(writer, value).catch(function () {}); + currentWrite = WritableStreamDefaultWriterWrite(writer, value)["catch"](function () {}); }); }).then(pipeLoop); } @@ -8273,7 +8040,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera } } - pipeLoop().catch(function (err) { + pipeLoop()["catch"](function (err) { currentWrite = Promise.resolve(); rethrowAssertionErrorRejection(err); }); @@ -8289,7 +8056,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera if (stream._state === 'errored') { action(stream._storedError); } else { - promise.catch(action).catch(rethrowAssertionErrorRejection); + promise["catch"](action)["catch"](rethrowAssertionErrorRejection); } } @@ -8297,7 +8064,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera if (stream._state === 'closed') { action(); } else { - promise.then(action).catch(rethrowAssertionErrorRejection); + promise.then(action)["catch"](rethrowAssertionErrorRejection); } } @@ -8319,7 +8086,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera return finalize(originalIsError, originalError); }, function (newError) { return finalize(true, newError); - }).catch(rethrowAssertionErrorRejection); + })["catch"](rethrowAssertionErrorRejection); } } @@ -8333,7 +8100,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) { waitForWritesToFinish().then(function () { return finalize(isError, error); - }).catch(rethrowAssertionErrorRejection); + })["catch"](rethrowAssertionErrorRejection); } else { finalize(isError, error); } @@ -8454,7 +8221,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera pull._branch1 = branch1Stream._readableStreamController; pull._branch2 = branch2Stream._readableStreamController; - reader._closedPromise.catch(function (r) { + reader._closedPromise["catch"](function (r) { if (teeState.closedOrErrored === true) { return; } @@ -8655,7 +8422,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera defaultReaderClosedPromiseReject(reader, e); - reader._closedPromise.catch(function () {}); + reader._closedPromise["catch"](function () {}); } function ReadableStreamFulfillReadIntoRequest(stream, chunk, done) { @@ -8906,7 +8673,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera assert(stream._state === 'errored', 'state must be errored'); defaultReaderClosedPromiseInitializeAsRejected(reader, stream._storedError); - reader._closedPromise.catch(function () {}); + reader._closedPromise["catch"](function () {}); } } @@ -8926,7 +8693,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera defaultReaderClosedPromiseResetToRejected(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\'s closedness')); } - reader._closedPromise.catch(function () {}); + reader._closedPromise["catch"](function () {}); reader._ownerReadableStream._reader = undefined; reader._ownerReadableStream = undefined; @@ -8994,7 +8761,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera ReadableStreamDefaultControllerCallPullIfNeeded(controller); }, function (r) { ReadableStreamDefaultControllerErrorIfNeeded(controller, r); - }).catch(rethrowAssertionErrorRejection); + })["catch"](rethrowAssertionErrorRejection); } _createClass(ReadableStreamDefaultController, [{ @@ -9129,7 +8896,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera return undefined; }, function (e) { ReadableStreamDefaultControllerErrorIfNeeded(controller, e); - }).catch(rethrowAssertionErrorRejection); + })["catch"](rethrowAssertionErrorRejection); return undefined; } @@ -9324,7 +9091,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera if (stream._state === 'readable') { ReadableByteStreamControllerError(controller, r); } - }).catch(rethrowAssertionErrorRejection); + })["catch"](rethrowAssertionErrorRejection); } _createClass(ReadableByteStreamController, [{ @@ -9526,7 +9293,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera if (controller._controlledReadableStream._state === 'readable') { ReadableByteStreamControllerError(controller, e); } - }).catch(rethrowAssertionErrorRejection); + })["catch"](rethrowAssertionErrorRejection); return undefined; } @@ -10257,7 +10024,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera } return Promise.resolve(); - }).catch(function (r) { + })["catch"](function (r) { TransformStreamErrorIfNeeded(transformStream, r); return Promise.reject(transformStream._storedError); }); @@ -10406,7 +10173,7 @@ function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.itera var transformStream = this; var startResult = InvokeOrNoop(transformer, 'start', [transformStream._transformStreamController]); startPromise_resolve(startResult); - startPromise.catch(function (e) { + startPromise["catch"](function (e) { if (transformStream._errored === false) { transformStream._errored = true; transformStream._storedError = e; @@ -10477,7 +10244,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat } else { var PolyfillURL = __w_pdfjs_require__(150).URL; - var OriginalURL = __w_pdfjs_require__(8).URL; + var OriginalURL = __w_pdfjs_require__(7).URL; if (OriginalURL) { PolyfillURL.createObjectURL = function (blob) { @@ -11170,6 +10937,331 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat "use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.clearPrimitiveCaches = clearPrimitiveCaches; +exports.isEOF = isEOF; +exports.isCmd = isCmd; +exports.isDict = isDict; +exports.isName = isName; +exports.isRef = isRef; +exports.isRefsEqual = isRefsEqual; +exports.isStream = isStream; +exports.RefSetCache = exports.RefSet = exports.Ref = exports.Name = exports.Dict = exports.Cmd = exports.EOF = void 0; + +var _util = __w_pdfjs_require__(5); + +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +var EOF = {}; +exports.EOF = EOF; + +var Name = function NameClosure() { + var nameCache = Object.create(null); + + function Name(name) { + this.name = name; + } + + Name.prototype = {}; + + Name.get = function Name_get(name) { + var nameValue = nameCache[name]; + return nameValue ? nameValue : nameCache[name] = new Name(name); + }; + + Name._clearCache = function () { + nameCache = Object.create(null); + }; + + return Name; +}(); + +exports.Name = Name; + +var Cmd = function CmdClosure() { + var cmdCache = Object.create(null); + + function Cmd(cmd) { + this.cmd = cmd; + } + + Cmd.prototype = {}; + + Cmd.get = function Cmd_get(cmd) { + var cmdValue = cmdCache[cmd]; + return cmdValue ? cmdValue : cmdCache[cmd] = new Cmd(cmd); + }; + + Cmd._clearCache = function () { + cmdCache = Object.create(null); + }; + + return Cmd; +}(); + +exports.Cmd = Cmd; + +var Dict = function DictClosure() { + var nonSerializable = function nonSerializableClosure() { + return nonSerializable; + }; + + function Dict(xref) { + this._map = Object.create(null); + this.xref = xref; + this.objId = null; + this.suppressEncryption = false; + this.__nonSerializable__ = nonSerializable; + } + + Dict.prototype = { + assignXref: function Dict_assignXref(newXref) { + this.xref = newXref; + }, + get: function Dict_get(key1, key2, key3) { + var value; + var xref = this.xref, + suppressEncryption = this.suppressEncryption; + + if (typeof (value = this._map[key1]) !== 'undefined' || key1 in this._map || typeof key2 === 'undefined') { + return xref ? xref.fetchIfRef(value, suppressEncryption) : value; + } + + if (typeof (value = this._map[key2]) !== 'undefined' || key2 in this._map || typeof key3 === 'undefined') { + return xref ? xref.fetchIfRef(value, suppressEncryption) : value; + } + + value = this._map[key3] || null; + return xref ? xref.fetchIfRef(value, suppressEncryption) : value; + }, + getAsync: function Dict_getAsync(key1, key2, key3) { + var value; + var xref = this.xref, + suppressEncryption = this.suppressEncryption; + + if (typeof (value = this._map[key1]) !== 'undefined' || key1 in this._map || typeof key2 === 'undefined') { + if (xref) { + return xref.fetchIfRefAsync(value, suppressEncryption); + } + + return Promise.resolve(value); + } + + if (typeof (value = this._map[key2]) !== 'undefined' || key2 in this._map || typeof key3 === 'undefined') { + if (xref) { + return xref.fetchIfRefAsync(value, suppressEncryption); + } + + return Promise.resolve(value); + } + + value = this._map[key3] || null; + + if (xref) { + return xref.fetchIfRefAsync(value, suppressEncryption); + } + + return Promise.resolve(value); + }, + getArray: function Dict_getArray(key1, key2, key3) { + var value = this.get(key1, key2, key3); + var xref = this.xref, + suppressEncryption = this.suppressEncryption; + + if (!Array.isArray(value) || !xref) { + return value; + } + + value = value.slice(); + + for (var i = 0, ii = value.length; i < ii; i++) { + if (!isRef(value[i])) { + continue; + } + + value[i] = xref.fetch(value[i], suppressEncryption); + } + + return value; + }, + getRaw: function Dict_getRaw(key) { + return this._map[key]; + }, + getKeys: function Dict_getKeys() { + return Object.keys(this._map); + }, + set: function Dict_set(key, value) { + this._map[key] = value; + }, + has: function Dict_has(key) { + return key in this._map; + }, + forEach: function Dict_forEach(callback) { + for (var key in this._map) { + callback(key, this.get(key)); + } + } + }; + Dict.empty = new Dict(null); + + Dict.merge = function (xref, dictArray) { + var mergedDict = new Dict(xref); + + for (var i = 0, ii = dictArray.length; i < ii; i++) { + var dict = dictArray[i]; + + if (!isDict(dict)) { + continue; + } + + for (var keyName in dict._map) { + if (mergedDict._map[keyName] !== undefined) { + continue; + } + + mergedDict._map[keyName] = dict._map[keyName]; + } + } + + return mergedDict; + }; + + return Dict; +}(); + +exports.Dict = Dict; + +var Ref = function RefClosure() { + var refCache = Object.create(null); + + function Ref(num, gen) { + this.num = num; + this.gen = gen; + } + + Ref.prototype = { + toString: function Ref_toString() { + if (this.gen === 0) { + return "".concat(this.num, "R"); + } + + return "".concat(this.num, "R").concat(this.gen); + } + }; + + Ref.get = function (num, gen) { + var key = gen === 0 ? "".concat(num, "R") : "".concat(num, "R").concat(gen); + var refValue = refCache[key]; + return refValue ? refValue : refCache[key] = new Ref(num, gen); + }; + + Ref._clearCache = function () { + refCache = Object.create(null); + }; + + return Ref; +}(); + +exports.Ref = Ref; + +var RefSet = function RefSetClosure() { + function RefSet() { + this.dict = Object.create(null); + } + + RefSet.prototype = { + has: function RefSet_has(ref) { + return ref.toString() in this.dict; + }, + put: function RefSet_put(ref) { + this.dict[ref.toString()] = true; + }, + remove: function RefSet_remove(ref) { + delete this.dict[ref.toString()]; + } + }; + return RefSet; +}(); + +exports.RefSet = RefSet; + +var RefSetCache = function RefSetCacheClosure() { + function RefSetCache() { + this.dict = Object.create(null); + } + + RefSetCache.prototype = { + get: function RefSetCache_get(ref) { + return this.dict[ref.toString()]; + }, + has: function RefSetCache_has(ref) { + return ref.toString() in this.dict; + }, + put: function RefSetCache_put(ref, obj) { + this.dict[ref.toString()] = obj; + }, + putAlias: function RefSetCache_putAlias(ref, aliasRef) { + this.dict[ref.toString()] = this.get(aliasRef); + }, + forEach: function RefSetCache_forEach(fn, thisArg) { + for (var i in this.dict) { + fn.call(thisArg, this.dict[i]); + } + }, + clear: function RefSetCache_clear() { + this.dict = Object.create(null); + } + }; + return RefSetCache; +}(); + +exports.RefSetCache = RefSetCache; + +function isEOF(v) { + return v === EOF; +} + +function isName(v, name) { + return v instanceof Name && (name === undefined || v.name === name); +} + +function isCmd(v, cmd) { + return v instanceof Cmd && (cmd === undefined || v.cmd === cmd); +} + +function isDict(v, type) { + return v instanceof Dict && (type === undefined || isName(v.get('Type'), type)); +} + +function isRef(v) { + return v instanceof Ref; +} + +function isRefsEqual(v1, v2) { + return v1.num === v2.num && v1.gen === v2.gen; +} + +function isStream(v) { + return _typeof(v) === 'object' && v !== null && v.getBytes !== undefined; +} + +function clearPrimitiveCaches() { + Cmd._clearCache(); + + Name._clearCache(); + + Ref._clearCache(); +} + +/***/ }), +/* 152 */ +/***/ (function(module, exports, __w_pdfjs_require__) { + +"use strict"; + + Object.defineProperty(exports, "__esModule", { value: true }); @@ -11177,15 +11269,17 @@ exports.NetworkPdfManager = exports.LocalPdfManager = void 0; var _regenerator = _interopRequireDefault(__w_pdfjs_require__(2)); -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); -var _chunked_stream = __w_pdfjs_require__(152); +var _chunked_stream = __w_pdfjs_require__(153); -var _document = __w_pdfjs_require__(153); +var _core_utils = __w_pdfjs_require__(154); -var _stream = __w_pdfjs_require__(157); +var _document = __w_pdfjs_require__(155); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var _stream = __w_pdfjs_require__(158); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } @@ -11193,12 +11287,12 @@ function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } @@ -11260,8 +11354,8 @@ function () { value: function () { var _ensure = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee(obj, prop, args) { - return _regenerator.default.wrap(function _callee$(_context) { + _regenerator["default"].mark(function _callee(obj, prop, args) { + return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: @@ -11272,7 +11366,7 @@ function () { return _context.stop(); } } - }, _callee, this); + }, _callee); })); function ensure(_x, _x2, _x3) { @@ -11354,7 +11448,7 @@ function (_BasePdfManager) { _this._docBaseUrl = docBaseUrl; _this.evaluatorOptions = evaluatorOptions; var stream = new _stream.Stream(data); - _this.pdfDocument = new _document.PDFDocument(_assertThisInitialized(_assertThisInitialized(_this)), stream); + _this.pdfDocument = new _document.PDFDocument(_assertThisInitialized(_this), stream); _this._loadedStreamPromise = Promise.resolve(stream); return _this; } @@ -11364,9 +11458,9 @@ function (_BasePdfManager) { value: function () { var _ensure2 = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee2(obj, prop, args) { + _regenerator["default"].mark(function _callee2(obj, prop, args) { var value; - return _regenerator.default.wrap(function _callee2$(_context2) { + return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: @@ -11387,7 +11481,7 @@ function (_BasePdfManager) { return _context2.stop(); } } - }, _callee2, this); + }, _callee2); })); function ensure(_x4, _x5, _x6) { @@ -11441,7 +11535,7 @@ function (_BasePdfManager2) { disableAutoFetch: args.disableAutoFetch, rangeChunkSize: args.rangeChunkSize }); - _this2.pdfDocument = new _document.PDFDocument(_assertThisInitialized(_assertThisInitialized(_this2)), _this2.streamManager.getStream()); + _this2.pdfDocument = new _document.PDFDocument(_assertThisInitialized(_this2), _this2.streamManager.getStream()); return _this2; } @@ -11450,9 +11544,9 @@ function (_BasePdfManager2) { value: function () { var _ensure3 = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee3(obj, prop, args) { + _regenerator["default"].mark(function _callee3(obj, prop, args) { var value; - return _regenerator.default.wrap(function _callee3$(_context3) { + return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: @@ -11473,7 +11567,7 @@ function (_BasePdfManager2) { _context3.prev = 7; _context3.t0 = _context3["catch"](0); - if (_context3.t0 instanceof _util.MissingDataException) { + if (_context3.t0 instanceof _core_utils.MissingDataException) { _context3.next = 11; break; } @@ -11536,7 +11630,7 @@ function (_BasePdfManager2) { exports.NetworkPdfManager = NetworkPdfManager; /***/ }), -/* 152 */ +/* 153 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -11547,7 +11641,9 @@ Object.defineProperty(exports, "__esModule", { }); exports.ChunkedStreamManager = exports.ChunkedStream = void 0; -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); + +var _core_utils = __w_pdfjs_require__(154); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -11643,6 +11739,10 @@ function () { }, { key: "ensureByte", value: function ensureByte(pos) { + if (pos < this.progressiveDataLength) { + return; + } + var chunk = Math.floor(pos / this.chunkSize); if (chunk === this.lastSuccessfulEnsureByteChunk) { @@ -11650,7 +11750,7 @@ function () { } if (!this.loadedChunks[chunk]) { - throw new _util.MissingDataException(pos, pos + 1); + throw new _core_utils.MissingDataException(pos, pos + 1); } this.lastSuccessfulEnsureByteChunk = chunk; @@ -11672,7 +11772,7 @@ function () { for (var chunk = beginChunk; chunk < endChunk; ++chunk) { if (!this.loadedChunks[chunk]) { - throw new _util.MissingDataException(begin, end); + throw new _core_utils.MissingDataException(begin, end); } } } @@ -11799,7 +11899,11 @@ function () { }, { key: "makeSubStream", value: function makeSubStream(start, length, dict) { - this.ensureRange(start, start + length); + if (length) { + this.ensureRange(start, start + length); + } else { + this.ensureByte(start); + } function ChunkedStreamSubstream() {} @@ -11953,8 +12057,8 @@ function () { _iteratorError = err; } finally { try { - if (!_iteratorNormalCompletion && _iterator.return != null) { - _iterator.return(); + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); } } finally { if (_didIteratorError) { @@ -12003,8 +12107,8 @@ function () { _iteratorError2 = err; } finally { try { - if (!_iteratorNormalCompletion2 && _iterator2.return != null) { - _iterator2.return(); + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); } } finally { if (_didIteratorError2) { @@ -12060,8 +12164,8 @@ function () { _iteratorError3 = err; } finally { try { - if (!_iteratorNormalCompletion3 && _iterator3.return != null) { - _iterator3.return(); + if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) { + _iterator3["return"](); } } finally { if (_didIteratorError3) { @@ -12167,8 +12271,8 @@ function () { _iteratorError4 = err; } finally { try { - if (!_iteratorNormalCompletion4 && _iterator4.return != null) { - _iterator4.return(); + if (!_iteratorNormalCompletion4 && _iterator4["return"] != null) { + _iterator4["return"](); } } finally { if (_didIteratorError4) { @@ -12196,8 +12300,8 @@ function () { } } - for (var _i = 0; _i < loadedRequests.length; _i++) { - var _requestId = loadedRequests[_i]; + for (var _i = 0, _loadedRequests = loadedRequests; _i < _loadedRequests.length; _i++) { + var _requestId = _loadedRequests[_i]; var capability = this.promisesByRequest[_requestId]; delete this.promisesByRequest[_requestId]; capability.resolve(); @@ -12244,7 +12348,139 @@ function () { exports.ChunkedStreamManager = ChunkedStreamManager; /***/ }), -/* 153 */ +/* 154 */ +/***/ (function(module, exports, __w_pdfjs_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.getLookupTableFactory = getLookupTableFactory; +exports.getInheritableProperty = getInheritableProperty; +exports.toRomanNumerals = toRomanNumerals; +exports.XRefParseException = exports.XRefEntryException = exports.MissingDataException = void 0; + +var _util = __w_pdfjs_require__(5); + +function getLookupTableFactory(initializer) { + var lookup; + return function () { + if (initializer) { + lookup = Object.create(null); + initializer(lookup); + initializer = null; + } + + return lookup; + }; +} + +var MissingDataException = function MissingDataExceptionClosure() { + function MissingDataException(begin, end) { + this.begin = begin; + this.end = end; + this.message = "Missing data [".concat(begin, ", ").concat(end, ")"); + } + + MissingDataException.prototype = new Error(); + MissingDataException.prototype.name = 'MissingDataException'; + MissingDataException.constructor = MissingDataException; + return MissingDataException; +}(); + +exports.MissingDataException = MissingDataException; + +var XRefEntryException = function XRefEntryExceptionClosure() { + function XRefEntryException(msg) { + this.message = msg; + } + + XRefEntryException.prototype = new Error(); + XRefEntryException.prototype.name = 'XRefEntryException'; + XRefEntryException.constructor = XRefEntryException; + return XRefEntryException; +}(); + +exports.XRefEntryException = XRefEntryException; + +var XRefParseException = function XRefParseExceptionClosure() { + function XRefParseException(msg) { + this.message = msg; + } + + XRefParseException.prototype = new Error(); + XRefParseException.prototype.name = 'XRefParseException'; + XRefParseException.constructor = XRefParseException; + return XRefParseException; +}(); + +exports.XRefParseException = XRefParseException; + +function getInheritableProperty(_ref) { + var dict = _ref.dict, + key = _ref.key, + _ref$getArray = _ref.getArray, + getArray = _ref$getArray === void 0 ? false : _ref$getArray, + _ref$stopWhenFound = _ref.stopWhenFound, + stopWhenFound = _ref$stopWhenFound === void 0 ? true : _ref$stopWhenFound; + var LOOP_LIMIT = 100; + var loopCount = 0; + var values; + + while (dict) { + var value = getArray ? dict.getArray(key) : dict.get(key); + + if (value !== undefined) { + if (stopWhenFound) { + return value; + } + + if (!values) { + values = []; + } + + values.push(value); + } + + if (++loopCount > LOOP_LIMIT) { + (0, _util.warn)("getInheritableProperty: maximum loop count exceeded for \"".concat(key, "\"")); + break; + } + + dict = dict.get('Parent'); + } + + return values; +} + +var ROMAN_NUMBER_MAP = ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX']; + +function toRomanNumerals(number) { + var lowerCase = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + (0, _util.assert)(Number.isInteger(number) && number > 0, 'The number should be a positive integer.'); + var pos, + romanBuf = []; + + while (number >= 1000) { + number -= 1000; + romanBuf.push('M'); + } + + pos = number / 100 | 0; + number %= 100; + romanBuf.push(ROMAN_NUMBER_MAP[pos]); + pos = number / 10 | 0; + number %= 10; + romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]); + romanBuf.push(ROMAN_NUMBER_MAP[20 + number]); + var romanStr = romanBuf.join(''); + return lowerCase ? romanStr.toLowerCase() : romanStr; +} + +/***/ }), +/* 155 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -12255,25 +12491,27 @@ Object.defineProperty(exports, "__esModule", { }); exports.PDFDocument = exports.Page = void 0; -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); + +var _obj = __w_pdfjs_require__(156); -var _obj = __w_pdfjs_require__(154); +var _primitives = __w_pdfjs_require__(151); -var _primitives = __w_pdfjs_require__(155); +var _core_utils = __w_pdfjs_require__(154); -var _stream2 = __w_pdfjs_require__(157); +var _stream2 = __w_pdfjs_require__(158); -var _annotation = __w_pdfjs_require__(169); +var _annotation = __w_pdfjs_require__(170); -var _crypto = __w_pdfjs_require__(167); +var _crypto = __w_pdfjs_require__(168); -var _parser = __w_pdfjs_require__(156); +var _parser = __w_pdfjs_require__(157); -var _operator_list = __w_pdfjs_require__(170); +var _operator_list = __w_pdfjs_require__(171); -var _evaluator = __w_pdfjs_require__(171); +var _evaluator = __w_pdfjs_require__(172); -var _function = __w_pdfjs_require__(185); +var _function = __w_pdfjs_require__(186); function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } @@ -12321,13 +12559,15 @@ function () { this.pdfFunctionFactory = pdfFunctionFactory; this.evaluatorOptions = pdfManager.evaluatorOptions; this.resourcesPromise = null; - var uniquePrefix = "p".concat(this.pageIndex, "_"); var idCounters = { obj: 0 }; this.idFactory = { createObjId: function createObjId() { - return uniquePrefix + ++idCounters.obj; + return "p".concat(pageIndex, "_").concat(++idCounters.obj); + }, + getDocId: function getDocId() { + return "g_".concat(pdfManager.docId); } }; } @@ -12336,7 +12576,7 @@ function () { key: "_getInheritableProperty", value: function _getInheritableProperty(key) { var getArray = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - var value = (0, _util.getInheritableProperty)({ + var value = (0, _core_utils.getInheritableProperty)({ dict: this.pageDict, key: key, getArray: getArray, @@ -12376,8 +12616,8 @@ function () { _iteratorError = err; } finally { try { - if (!_iteratorNormalCompletion && _iterator.return != null) { - _iterator.return(); + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); } } finally { if (_didIteratorError) { @@ -12421,7 +12661,6 @@ function () { var contentStreamPromise = this.pdfManager.ensure(this, 'getContentStream'); var resourcesPromise = this.loadResources(['ExtGState', 'ColorSpace', 'Pattern', 'Shading', 'XObject', 'Font']); var partialEvaluator = new _evaluator.PartialEvaluator({ - pdfManager: this.pdfManager, xref: this.xref, handler: handler, pageIndex: this.pageIndex, @@ -12479,8 +12718,8 @@ function () { _iteratorError2 = err; } finally { try { - if (!_iteratorNormalCompletion2 && _iterator2.return != null) { - _iterator2.return(); + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); } } finally { if (_didIteratorError2) { @@ -12505,8 +12744,8 @@ function () { _iteratorError3 = err; } finally { try { - if (!_iteratorNormalCompletion3 && _iterator3.return != null) { - _iterator3.return(); + if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) { + _iterator3["return"](); } } finally { if (_didIteratorError3) { @@ -12539,7 +12778,6 @@ function () { contentStream = _ref9[0]; var partialEvaluator = new _evaluator.PartialEvaluator({ - pdfManager: _this3.pdfManager, xref: _this3.xref, handler: handler, pageIndex: _this3.pageIndex, @@ -12684,22 +12922,10 @@ exports.Page = Page; var FINGERPRINT_FIRST_BYTES = 1024; var EMPTY_FINGERPRINT = '\x00\x00\x00\x00\x00\x00\x00' + '\x00\x00\x00\x00\x00\x00\x00\x00\x00'; -function find(stream, needle, limit, backwards) { - var pos = stream.pos; - var end = stream.end; - - if (pos + limit > end) { - limit = end - pos; - } - - var strBuf = []; - - for (var i = 0; i < limit; ++i) { - strBuf.push(String.fromCharCode(stream.getByte())); - } - - var str = strBuf.join(''); - stream.pos = pos; +function find(stream, needle, limit) { + var backwards = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + (0, _util.assert)(limit > 0, 'The "limit" must be a positive integer.'); + var str = (0, _util.bytesToString)(stream.peekBytes(limit)); var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle); if (index === -1) { @@ -12757,18 +12983,32 @@ function () { this.xfa = this.acroForm.get('XFA'); var fields = this.acroForm.get('Fields'); - if ((!fields || !Array.isArray(fields) || fields.length === 0) && !this.xfa) { + if ((!Array.isArray(fields) || fields.length === 0) && !this.xfa) { this.acroForm = null; } } } catch (ex) { - if (ex instanceof _util.MissingDataException) { + if (ex instanceof _core_utils.MissingDataException) { throw ex; } (0, _util.info)('Cannot fetch AcroForm entry; assuming no AcroForms are present'); this.acroForm = null; } + + try { + var collection = this.catalog.catDict.get('Collection'); + + if ((0, _primitives.isDict)(collection) && collection.getKeys().length > 0) { + this.collection = collection; + } + } catch (ex) { + if (ex instanceof _core_utils.MissingDataException) { + throw ex; + } + + (0, _util.info)('Cannot fetch Collection dictionary.'); + } } }, { key: "checkHeader", @@ -12814,7 +13054,9 @@ function () { var catalog = this.catalog, linearization = this.linearization; (0, _util.assert)(linearization && linearization.pageFirst === pageIndex); - var ref = new _primitives.Ref(linearization.objectNumberFirst, 0); + + var ref = _primitives.Ref.get(linearization.objectNumberFirst, 0); + return this.xref.fetchAsync(ref).then(function (obj) { if ((0, _primitives.isDict)(obj, 'Page') || (0, _primitives.isDict)(obj) && !obj.has('Type') && obj.has('Contents')) { if (ref && !catalog.pageKidsCountCache.has(ref)) { @@ -12825,7 +13067,7 @@ function () { } throw new _util.FormatError('The Linearization dictionary doesn\'t point ' + 'to a valid Page dictionary.'); - }).catch(function (reason) { + })["catch"](function (reason) { (0, _util.info)(reason); return catalog.getPageDict(pageIndex); }); @@ -12864,13 +13106,13 @@ function () { value: function checkFirstPage() { var _this6 = this; - return this.getPage(0).catch(function (reason) { - if (reason instanceof _util.XRefEntryException) { + return this.getPage(0)["catch"](function (reason) { + if (reason instanceof _core_utils.XRefEntryException) { _this6._pagePromises.length = 0; _this6.cleanup(); - throw new _util.XRefParseException(); + throw new _core_utils.XRefParseException(); } }); } @@ -12892,7 +13134,7 @@ function () { try { linearization = _parser.Linearization.create(this.stream); } catch (err) { - if (err instanceof _util.MissingDataException) { + if (err instanceof _core_utils.MissingDataException) { throw err; } @@ -12980,14 +13222,15 @@ function () { PDFFormatVersion: this.pdfFormatVersion, IsLinearized: !!this.linearization, IsAcroFormPresent: !!this.acroForm, - IsXFAPresent: !!this.xfa + IsXFAPresent: !!this.xfa, + IsCollectionPresent: !!this.collection }; var infoDict; try { infoDict = this.xref.trailer.get('Info'); } catch (err) { - if (err instanceof _util.MissingDataException) { + if (err instanceof _core_utils.MissingDataException) { throw err; } @@ -13034,8 +13277,8 @@ function () { _iteratorError4 = err; } finally { try { - if (!_iteratorNormalCompletion4 && _iterator4.return != null) { - _iterator4.return(); + if (!_iteratorNormalCompletion4 && _iterator4["return"] != null) { + _iterator4["return"](); } } finally { if (_didIteratorError4) { @@ -13080,7 +13323,7 @@ function () { exports.PDFDocument = PDFDocument; /***/ }), -/* 154 */ +/* 156 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -13093,19 +13336,21 @@ exports.FileSpec = exports.XRef = exports.ObjectLoader = exports.Catalog = void var _regenerator = _interopRequireDefault(__w_pdfjs_require__(2)); -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); -var _primitives = __w_pdfjs_require__(155); +var _primitives = __w_pdfjs_require__(151); -var _parser = __w_pdfjs_require__(156); +var _parser = __w_pdfjs_require__(157); -var _chunked_stream = __w_pdfjs_require__(152); +var _core_utils = __w_pdfjs_require__(154); -var _crypto = __w_pdfjs_require__(167); +var _chunked_stream = __w_pdfjs_require__(153); -var _colorspace = __w_pdfjs_require__(168); +var _crypto = __w_pdfjs_require__(168); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var _colorspace = __w_pdfjs_require__(169); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } @@ -13211,6 +13456,7 @@ function () { var title = outlineDict.get('Title'); var flags = outlineDict.get('F') || 0; var color = outlineDict.getArray('C'); + var count = outlineDict.get('Count'); var rgbColor = blackColor; if (Array.isArray(color) && color.length === 3 && (color[0] !== 0 || color[1] !== 0 || color[2] !== 0)) { @@ -13224,7 +13470,7 @@ function () { newWindow: data.newWindow, title: (0, _util.stringToPDFString)(title), color: rgbColor, - count: outlineDict.get('Count'), + count: Number.isInteger(count) ? count : undefined, bold: !!(flags & 2), italic: !!(flags & 1), items: [] @@ -13302,6 +13548,8 @@ function () { } else if (this.catDict.has('Dests')) { return this.catDict.get('Dests'); } + + return undefined; } }, { key: "_readPageLabels", @@ -13376,7 +13624,7 @@ function () { case 'R': case 'r': - currentLabel = (0, _util.toRomanNumerals)(currentIndex, style === 'r'); + currentLabel = (0, _core_utils.toRomanNumerals)(currentIndex, style === 'r'); break; case 'A': @@ -13436,8 +13684,8 @@ function () { _iteratorError = err; } finally { try { - if (!_iteratorNormalCompletion && _iterator.return != null) { - _iterator.return(); + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); } } finally { if (_didIteratorError) { @@ -13452,6 +13700,7 @@ function () { value: function cleanup() { var _this = this; + (0, _primitives.clearPrimitiveCaches)(); this.pageKidsCountCache.clear(); var promises = []; this.fontCache.forEach(function (promise) { @@ -13696,7 +13945,7 @@ function () { try { metadata = (0, _util.stringToUTF8String)((0, _util.bytesToString)(stream.getBytes())); } catch (e) { - if (e instanceof _util.MissingDataException) { + if (e instanceof _core_utils.MissingDataException) { throw e; } @@ -13726,7 +13975,7 @@ function () { try { obj = this._readDocumentOutline(); } catch (ex) { - if (ex instanceof _util.MissingDataException) { + if (ex instanceof _core_utils.MissingDataException) { throw ex; } @@ -13743,7 +13992,7 @@ function () { try { permissions = this._readPermissions(); } catch (ex) { - if (ex instanceof _util.MissingDataException) { + if (ex instanceof _core_utils.MissingDataException) { throw ex; } @@ -13793,7 +14042,7 @@ function () { try { obj = this._readPageLabels(); } catch (ex) { - if (ex instanceof _util.MissingDataException) { + if (ex instanceof _core_utils.MissingDataException) { throw ex; } @@ -13802,6 +14051,26 @@ function () { return (0, _util.shadow)(this, 'pageLabels', obj); } + }, { + key: "pageLayout", + get: function get() { + var obj = this.catDict.get('PageLayout'); + var pageLayout = ''; + + if ((0, _primitives.isName)(obj)) { + switch (obj.name) { + case 'SinglePage': + case 'OneColumn': + case 'TwoColumnLeft': + case 'TwoColumnRight': + case 'TwoPageLeft': + case 'TwoPageRight': + pageLayout = obj.name; + } + } + + return (0, _util.shadow)(this, 'pageLayout', pageLayout); + } }, { key: "pageMode", get: function get() { @@ -13822,6 +14091,162 @@ function () { return (0, _util.shadow)(this, 'pageMode', pageMode); } + }, { + key: "viewerPreferences", + get: function get() { + var _this2 = this; + + var ViewerPreferencesValidators = { + HideToolbar: _util.isBool, + HideMenubar: _util.isBool, + HideWindowUI: _util.isBool, + FitWindow: _util.isBool, + CenterWindow: _util.isBool, + DisplayDocTitle: _util.isBool, + NonFullScreenPageMode: _primitives.isName, + Direction: _primitives.isName, + ViewArea: _primitives.isName, + ViewClip: _primitives.isName, + PrintArea: _primitives.isName, + PrintClip: _primitives.isName, + PrintScaling: _primitives.isName, + Duplex: _primitives.isName, + PickTrayByPDFSize: _util.isBool, + PrintPageRange: Array.isArray, + NumCopies: Number.isInteger + }; + var obj = this.catDict.get('ViewerPreferences'); + var prefs = Object.create(null); + + if ((0, _primitives.isDict)(obj)) { + for (var key in ViewerPreferencesValidators) { + if (!obj.has(key)) { + continue; + } + + var value = obj.get(key); + + if (!ViewerPreferencesValidators[key](value)) { + (0, _util.info)("Bad value in ViewerPreferences for \"".concat(key, "\".")); + continue; + } + + var prefValue = void 0; + + switch (key) { + case 'NonFullScreenPageMode': + switch (value.name) { + case 'UseNone': + case 'UseOutlines': + case 'UseThumbs': + case 'UseOC': + prefValue = value.name; + break; + + default: + prefValue = 'UseNone'; + } + + break; + + case 'Direction': + switch (value.name) { + case 'L2R': + case 'R2L': + prefValue = value.name; + break; + + default: + prefValue = 'L2R'; + } + + break; + + case 'ViewArea': + case 'ViewClip': + case 'PrintArea': + case 'PrintClip': + switch (value.name) { + case 'MediaBox': + case 'CropBox': + case 'BleedBox': + case 'TrimBox': + case 'ArtBox': + prefValue = value.name; + break; + + default: + prefValue = 'CropBox'; + } + + break; + + case 'PrintScaling': + switch (value.name) { + case 'None': + case 'AppDefault': + prefValue = value.name; + break; + + default: + prefValue = 'AppDefault'; + } + + break; + + case 'Duplex': + switch (value.name) { + case 'Simplex': + case 'DuplexFlipShortEdge': + case 'DuplexFlipLongEdge': + prefValue = value.name; + break; + + default: + prefValue = 'None'; + } + + break; + + case 'PrintPageRange': + var length = value.length; + + if (length % 2 !== 0) { + break; + } + + var isValid = value.every(function (page, i, arr) { + return Number.isInteger(page) && page > 0 && (i === 0 || page >= arr[i - 1]) && page <= _this2.numPages; + }); + + if (isValid) { + prefValue = value; + } + + break; + + case 'NumCopies': + if (value > 0) { + prefValue = value; + } + + break; + + default: + (0, _util.assert)(typeof value === 'boolean'); + prefValue = value; + } + + if (prefValue !== undefined) { + prefs[key] = prefValue; + } else { + (0, _util.info)("Bad value in ViewerPreferences for \"".concat(key, "\".")); + } + } + } + + return (0, _util.shadow)(this, 'viewerPreferences', prefs); + } }, { key: "openActionDestination", get: function get() { @@ -14140,7 +14565,7 @@ var XRef = function XRefClosure() { try { encrypt = trailerDict.get('Encrypt'); } catch (ex) { - if (ex instanceof _util.MissingDataException) { + if (ex instanceof _core_utils.MissingDataException) { throw ex; } @@ -14159,7 +14584,7 @@ var XRef = function XRefClosure() { try { root = trailerDict.get('Root'); } catch (ex) { - if (ex instanceof _util.MissingDataException) { + if (ex instanceof _core_utils.MissingDataException) { throw ex; } @@ -14170,7 +14595,7 @@ var XRef = function XRefClosure() { this.root = root; } else { if (!recoveryMode) { - throw new _util.XRefParseException(); + throw new _core_utils.XRefParseException(); } throw new _util.FormatError('Invalid root reference'); @@ -14240,10 +14665,16 @@ var XRef = function XRefClosure() { entry.gen = parser.getObj(); var type = parser.getObj(); - if ((0, _primitives.isCmd)(type, 'f')) { - entry.free = true; - } else if ((0, _primitives.isCmd)(type, 'n')) { - entry.uncompressed = true; + if (type instanceof _primitives.Cmd) { + switch (type.cmd) { + case 'f': + entry.free = true; + break; + + case 'n': + entry.uncompressed = true; + break; + } } if (!Number.isInteger(entry.offset) || !Number.isInteger(entry.gen) || !(entry.free || entry.uncompressed)) { @@ -14527,7 +14958,12 @@ var XRef = function XRefClosure() { for (i = 0, ii = trailers.length; i < ii; ++i) { stream.pos = trailers[i]; - var parser = new _parser.Parser(new _parser.Lexer(stream), true, this, true); + var parser = new _parser.Parser({ + lexer: new _parser.Lexer(stream), + xref: this, + allowStreams: true, + recoveryMode: true + }); var obj = parser.getObj(); if (!(0, _primitives.isCmd)(obj, 'trailer')) { @@ -14545,7 +14981,7 @@ var XRef = function XRefClosure() { try { rootDict = dict.get('Root'); } catch (ex) { - if (ex instanceof _util.MissingDataException) { + if (ex instanceof _core_utils.MissingDataException) { throw ex; } @@ -14585,7 +15021,11 @@ var XRef = function XRefClosure() { startXRefParsedCache[startXRef] = true; stream.pos = startXRef + stream.start; - var parser = new _parser.Parser(new _parser.Lexer(stream), true, this); + var parser = new _parser.Parser({ + lexer: new _parser.Lexer(stream), + xref: this, + allowStreams: true + }); var obj = parser.getObj(); var dict; @@ -14637,7 +15077,7 @@ var XRef = function XRefClosure() { return this.topDict; } catch (e) { - if (e instanceof _util.MissingDataException) { + if (e instanceof _core_utils.MissingDataException) { throw e; } @@ -14645,10 +15085,10 @@ var XRef = function XRefClosure() { } if (recoveryMode) { - return; + return undefined; } - throw new _util.XRefParseException(); + throw new _core_utils.XRefParseException(); }, getEntry: function XRef_getEntry(i) { var xrefEntry = this.entries[i]; @@ -14709,11 +15149,15 @@ var XRef = function XRefClosure() { var num = ref.num; if (xrefEntry.gen !== gen) { - throw new _util.XRefEntryException("Inconsistent generation in XRef: ".concat(ref)); + throw new _core_utils.XRefEntryException("Inconsistent generation in XRef: ".concat(ref)); } var stream = this.stream.makeSubStream(xrefEntry.offset + this.stream.start); - var parser = new _parser.Parser(new _parser.Lexer(stream), true, this); + var parser = new _parser.Parser({ + lexer: new _parser.Lexer(stream), + xref: this, + allowStreams: true + }); var obj1 = parser.getObj(); var obj2 = parser.getObj(); var obj3 = parser.getObj(); @@ -14726,8 +15170,8 @@ var XRef = function XRefClosure() { obj2 = parseInt(obj2, 10); } - if (obj1 !== num || obj2 !== gen || !(0, _primitives.isCmd)(obj3)) { - throw new _util.XRefEntryException("Bad (uncompressed) XRef entry: ".concat(ref)); + if (obj1 !== num || obj2 !== gen || !(obj3 instanceof _primitives.Cmd)) { + throw new _core_utils.XRefEntryException("Bad (uncompressed) XRef entry: ".concat(ref)); } if (obj3.cmd !== 'obj') { @@ -14739,7 +15183,7 @@ var XRef = function XRefClosure() { } } - throw new _util.XRefEntryException("Bad (uncompressed) XRef entry: ".concat(ref)); + throw new _core_utils.XRefEntryException("Bad (uncompressed) XRef entry: ".concat(ref)); } if (this.encrypt && !suppressEncryption) { @@ -14757,7 +15201,7 @@ var XRef = function XRefClosure() { fetchCompressed: function fetchCompressed(ref, xrefEntry) { var suppressEncryption = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var tableOffset = xrefEntry.offset; - var stream = this.fetch(new _primitives.Ref(tableOffset, 0)); + var stream = this.fetch(_primitives.Ref.get(tableOffset, 0)); if (!(0, _primitives.isStream)(stream)) { throw new _util.FormatError('bad ObjStm stream'); @@ -14770,8 +15214,11 @@ var XRef = function XRefClosure() { throw new _util.FormatError('invalid first and n parameters for ObjStm stream'); } - var parser = new _parser.Parser(new _parser.Lexer(stream), false, this); - parser.allowStreams = true; + var parser = new _parser.Parser({ + lexer: new _parser.Lexer(stream), + xref: this, + allowStreams: true + }); var i, entries = [], num, @@ -14810,7 +15257,7 @@ var XRef = function XRefClosure() { xrefEntry = entries[xrefEntry.gen]; if (xrefEntry === undefined) { - throw new _util.XRefEntryException("Bad (compressed) XRef entry: ".concat(ref)); + throw new _core_utils.XRefEntryException("Bad (compressed) XRef entry: ".concat(ref)); } return xrefEntry; @@ -14818,8 +15265,8 @@ var XRef = function XRefClosure() { fetchIfRefAsync: function () { var _fetchIfRefAsync = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee(obj, suppressEncryption) { - return _regenerator.default.wrap(function _callee$(_context) { + _regenerator["default"].mark(function _callee(obj, suppressEncryption) { + return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: @@ -14850,8 +15297,8 @@ var XRef = function XRefClosure() { fetchAsync: function () { var _fetchAsync = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee2(ref, suppressEncryption) { - return _regenerator.default.wrap(function _callee2$(_context2) { + _regenerator["default"].mark(function _callee2(ref, suppressEncryption) { + return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: @@ -14862,7 +15309,7 @@ var XRef = function XRefClosure() { _context2.prev = 4; _context2.t0 = _context2["catch"](0); - if (_context2.t0 instanceof _util.MissingDataException) { + if (_context2.t0 instanceof _core_utils.MissingDataException) { _context2.next = 8; break; } @@ -15234,7 +15681,7 @@ var ObjectLoader = function () { return this.capability.promise; }, _walk: function _walk(nodesToVisit) { - var _this2 = this; + var _this3 = this; var nodesToRevisit = []; var pendingRequests = []; @@ -15251,7 +15698,7 @@ var ObjectLoader = function () { this.refSet.put(currentNode); currentNode = this.xref.fetch(currentNode); } catch (ex) { - if (!(ex instanceof _util.MissingDataException)) { + if (!(ex instanceof _core_utils.MissingDataException)) { throw ex; } @@ -15293,11 +15740,11 @@ var ObjectLoader = function () { var node = nodesToRevisit[_i4]; if ((0, _primitives.isRef)(node)) { - _this2.refSet.remove(node); + _this3.refSet.remove(node); } } - _this2._walk(nodesToRevisit); + _this3._walk(nodesToRevisit); }, this.capability.reject); return; } @@ -15312,7 +15759,7 @@ var ObjectLoader = function () { exports.ObjectLoader = ObjectLoader; /***/ }), -/* 155 */ +/* 157 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -15321,312 +15768,29 @@ exports.ObjectLoader = ObjectLoader; Object.defineProperty(exports, "__esModule", { value: true }); -exports.isEOF = isEOF; -exports.isCmd = isCmd; -exports.isDict = isDict; -exports.isName = isName; -exports.isRef = isRef; -exports.isRefsEqual = isRefsEqual; -exports.isStream = isStream; -exports.RefSetCache = exports.RefSet = exports.Ref = exports.Name = exports.Dict = exports.Cmd = exports.EOF = void 0; - -function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } - -var EOF = {}; -exports.EOF = EOF; - -var Name = function NameClosure() { - function Name(name) { - this.name = name; - } - - Name.prototype = {}; - var nameCache = Object.create(null); - - Name.get = function Name_get(name) { - var nameValue = nameCache[name]; - return nameValue ? nameValue : nameCache[name] = new Name(name); - }; - - return Name; -}(); - -exports.Name = Name; - -var Cmd = function CmdClosure() { - function Cmd(cmd) { - this.cmd = cmd; - } - - Cmd.prototype = {}; - var cmdCache = Object.create(null); - - Cmd.get = function Cmd_get(cmd) { - var cmdValue = cmdCache[cmd]; - return cmdValue ? cmdValue : cmdCache[cmd] = new Cmd(cmd); - }; - - return Cmd; -}(); - -exports.Cmd = Cmd; - -var Dict = function DictClosure() { - var nonSerializable = function nonSerializableClosure() { - return nonSerializable; - }; - - function Dict(xref) { - this._map = Object.create(null); - this.xref = xref; - this.objId = null; - this.suppressEncryption = false; - this.__nonSerializable__ = nonSerializable; - } - - Dict.prototype = { - assignXref: function Dict_assignXref(newXref) { - this.xref = newXref; - }, - get: function Dict_get(key1, key2, key3) { - var value; - var xref = this.xref, - suppressEncryption = this.suppressEncryption; - - if (typeof (value = this._map[key1]) !== 'undefined' || key1 in this._map || typeof key2 === 'undefined') { - return xref ? xref.fetchIfRef(value, suppressEncryption) : value; - } - - if (typeof (value = this._map[key2]) !== 'undefined' || key2 in this._map || typeof key3 === 'undefined') { - return xref ? xref.fetchIfRef(value, suppressEncryption) : value; - } - - value = this._map[key3] || null; - return xref ? xref.fetchIfRef(value, suppressEncryption) : value; - }, - getAsync: function Dict_getAsync(key1, key2, key3) { - var value; - var xref = this.xref, - suppressEncryption = this.suppressEncryption; - - if (typeof (value = this._map[key1]) !== 'undefined' || key1 in this._map || typeof key2 === 'undefined') { - if (xref) { - return xref.fetchIfRefAsync(value, suppressEncryption); - } - - return Promise.resolve(value); - } - - if (typeof (value = this._map[key2]) !== 'undefined' || key2 in this._map || typeof key3 === 'undefined') { - if (xref) { - return xref.fetchIfRefAsync(value, suppressEncryption); - } - - return Promise.resolve(value); - } - - value = this._map[key3] || null; - - if (xref) { - return xref.fetchIfRefAsync(value, suppressEncryption); - } - - return Promise.resolve(value); - }, - getArray: function Dict_getArray(key1, key2, key3) { - var value = this.get(key1, key2, key3); - var xref = this.xref, - suppressEncryption = this.suppressEncryption; - - if (!Array.isArray(value) || !xref) { - return value; - } - - value = value.slice(); - - for (var i = 0, ii = value.length; i < ii; i++) { - if (!isRef(value[i])) { - continue; - } - - value[i] = xref.fetch(value[i], suppressEncryption); - } - - return value; - }, - getRaw: function Dict_getRaw(key) { - return this._map[key]; - }, - getKeys: function Dict_getKeys() { - return Object.keys(this._map); - }, - set: function Dict_set(key, value) { - this._map[key] = value; - }, - has: function Dict_has(key) { - return key in this._map; - }, - forEach: function Dict_forEach(callback) { - for (var key in this._map) { - callback(key, this.get(key)); - } - } - }; - Dict.empty = new Dict(null); - - Dict.merge = function (xref, dictArray) { - var mergedDict = new Dict(xref); - - for (var i = 0, ii = dictArray.length; i < ii; i++) { - var dict = dictArray[i]; - - if (!isDict(dict)) { - continue; - } - - for (var keyName in dict._map) { - if (mergedDict._map[keyName] !== undefined) { - continue; - } - - mergedDict._map[keyName] = dict._map[keyName]; - } - } - - return mergedDict; - }; - - return Dict; -}(); - -exports.Dict = Dict; - -var Ref = function RefClosure() { - function Ref(num, gen) { - this.num = num; - this.gen = gen; - } - - Ref.prototype = { - toString: function Ref_toString() { - if (this.gen !== 0) { - return "".concat(this.num, "R").concat(this.gen); - } - - return "".concat(this.num, "R"); - } - }; - return Ref; -}(); - -exports.Ref = Ref; - -var RefSet = function RefSetClosure() { - function RefSet() { - this.dict = Object.create(null); - } - - RefSet.prototype = { - has: function RefSet_has(ref) { - return ref.toString() in this.dict; - }, - put: function RefSet_put(ref) { - this.dict[ref.toString()] = true; - }, - remove: function RefSet_remove(ref) { - delete this.dict[ref.toString()]; - } - }; - return RefSet; -}(); - -exports.RefSet = RefSet; - -var RefSetCache = function RefSetCacheClosure() { - function RefSetCache() { - this.dict = Object.create(null); - } - - RefSetCache.prototype = { - get: function RefSetCache_get(ref) { - return this.dict[ref.toString()]; - }, - has: function RefSetCache_has(ref) { - return ref.toString() in this.dict; - }, - put: function RefSetCache_put(ref, obj) { - this.dict[ref.toString()] = obj; - }, - putAlias: function RefSetCache_putAlias(ref, aliasRef) { - this.dict[ref.toString()] = this.get(aliasRef); - }, - forEach: function RefSetCache_forEach(fn, thisArg) { - for (var i in this.dict) { - fn.call(thisArg, this.dict[i]); - } - }, - clear: function RefSetCache_clear() { - this.dict = Object.create(null); - } - }; - return RefSetCache; -}(); - -exports.RefSetCache = RefSetCache; - -function isEOF(v) { - return v === EOF; -} - -function isName(v, name) { - return v instanceof Name && (name === undefined || v.name === name); -} - -function isCmd(v, cmd) { - return v instanceof Cmd && (cmd === undefined || v.cmd === cmd); -} - -function isDict(v, type) { - return v instanceof Dict && (type === undefined || isName(v.get('Type'), type)); -} - -function isRef(v) { - return v instanceof Ref; -} - -function isRefsEqual(v1, v2) { - return v1.num === v2.num && v1.gen === v2.gen; -} - -function isStream(v) { - return _typeof(v) === 'object' && v !== null && v.getBytes !== undefined; -} +exports.Parser = exports.Linearization = exports.Lexer = void 0; -/***/ }), -/* 156 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +var _stream = __w_pdfjs_require__(158); -"use strict"; +var _util = __w_pdfjs_require__(5); +var _primitives = __w_pdfjs_require__(151); -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.Parser = exports.Linearization = exports.Lexer = void 0; +var _ccitt_stream = __w_pdfjs_require__(159); -var _stream = __w_pdfjs_require__(157); +var _jbig2_stream = __w_pdfjs_require__(161); -var _util = __w_pdfjs_require__(6); +var _jpeg_stream = __w_pdfjs_require__(164); -var _primitives = __w_pdfjs_require__(155); +var _jpx_stream = __w_pdfjs_require__(166); -var _ccitt_stream = __w_pdfjs_require__(158); +var _core_utils = __w_pdfjs_require__(154); -var _jbig2_stream = __w_pdfjs_require__(160); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _jpeg_stream = __w_pdfjs_require__(163); +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } -var _jpx_stream = __w_pdfjs_require__(165); +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var MAX_LENGTH_TO_CACHE = 1000; var MAX_ADLER32_LENGTH = 5552; @@ -15644,22 +15808,36 @@ function computeAdler32(bytes) { return b % 65521 << 16 | a % 65521; } -var Parser = function ParserClosure() { - function Parser(lexer, allowStreams, xref, recoveryMode) { +var Parser = +/*#__PURE__*/ +function () { + function Parser(_ref) { + var lexer = _ref.lexer, + xref = _ref.xref, + _ref$allowStreams = _ref.allowStreams, + allowStreams = _ref$allowStreams === void 0 ? false : _ref$allowStreams, + _ref$recoveryMode = _ref.recoveryMode, + recoveryMode = _ref$recoveryMode === void 0 ? false : _ref$recoveryMode; + + _classCallCheck(this, Parser); + this.lexer = lexer; - this.allowStreams = allowStreams; this.xref = xref; - this.recoveryMode = recoveryMode || false; + this.allowStreams = allowStreams; + this.recoveryMode = recoveryMode; this.imageCache = Object.create(null); this.refill(); } - Parser.prototype = { - refill: function Parser_refill() { + _createClass(Parser, [{ + key: "refill", + value: function refill() { this.buf1 = this.lexer.getObj(); this.buf2 = this.lexer.getObj(); - }, - shift: function Parser_shift() { + } + }, { + key: "shift", + value: function shift() { if ((0, _primitives.isCmd)(this.buf2, 'ID')) { this.buf1 = this.buf2; this.buf2 = null; @@ -15667,20 +15845,24 @@ var Parser = function ParserClosure() { this.buf1 = this.buf2; this.buf2 = this.lexer.getObj(); } - }, - tryShift: function Parser_tryShift() { + } + }, { + key: "tryShift", + value: function tryShift() { try { this.shift(); return true; } catch (e) { - if (e instanceof _util.MissingDataException) { + if (e instanceof _core_utils.MissingDataException) { throw e; } return false; } - }, - getObj: function Parser_getObj(cipherTransform) { + } + }, { + key: "getObj", + value: function getObj(cipherTransform) { var buf1 = this.buf1; this.shift(); @@ -15751,7 +15933,8 @@ var Parser = function ParserClosure() { var num = buf1; if (Number.isInteger(this.buf1) && (0, _primitives.isCmd)(this.buf2, 'R')) { - var ref = new _primitives.Ref(num, this.buf1); + var ref = _primitives.Ref.get(num, this.buf1); + this.shift(); this.shift(); return ref; @@ -15771,8 +15954,10 @@ var Parser = function ParserClosure() { } return buf1; - }, - findDefaultInlineStreamEnd: function findDefaultInlineStreamEnd(stream) { + } + }, { + key: "findDefaultInlineStreamEnd", + value: function findDefaultInlineStreamEnd(stream) { var E = 0x45, I = 0x49, SPACE = 0x20, @@ -15838,8 +16023,10 @@ var Parser = function ParserClosure() { } return stream.pos - endOffset - startPos; - }, - findDCTDecodeInlineStreamEnd: function Parser_findDCTDecodeInlineStreamEnd(stream) { + } + }, { + key: "findDCTDecodeInlineStreamEnd", + value: function findDCTDecodeInlineStreamEnd(stream) { var startPos = stream.pos, foundEOI = false, b, @@ -15927,8 +16114,10 @@ var Parser = function ParserClosure() { this.inlineStreamSkipEI(stream); return length; - }, - findASCII85DecodeInlineStreamEnd: function Parser_findASCII85DecodeInlineStreamEnd(stream) { + } + }, { + key: "findASCII85DecodeInlineStreamEnd", + value: function findASCII85DecodeInlineStreamEnd(stream) { var TILDE = 0x7E, GT = 0x3E; var startPos = stream.pos, @@ -15936,9 +16125,18 @@ var Parser = function ParserClosure() { length; while ((ch = stream.getByte()) !== -1) { - if (ch === TILDE && stream.peekByte() === GT) { - stream.skip(); - break; + if (ch === TILDE) { + ch = stream.peekByte(); + + while ((0, _util.isSpace)(ch)) { + stream.skip(); + ch = stream.peekByte(); + } + + if (ch === GT) { + stream.skip(); + break; + } } } @@ -15952,8 +16150,10 @@ var Parser = function ParserClosure() { this.inlineStreamSkipEI(stream); return length; - }, - findASCIIHexDecodeInlineStreamEnd: function Parser_findASCIIHexDecodeInlineStreamEnd(stream) { + } + }, { + key: "findASCIIHexDecodeInlineStreamEnd", + value: function findASCIIHexDecodeInlineStreamEnd(stream) { var GT = 0x3E; var startPos = stream.pos, ch, @@ -15975,8 +16175,10 @@ var Parser = function ParserClosure() { this.inlineStreamSkipEI(stream); return length; - }, - inlineStreamSkipEI: function Parser_inlineStreamSkipEI(stream) { + } + }, { + key: "inlineStreamSkipEI", + value: function inlineStreamSkipEI(stream) { var E = 0x45, I = 0x49; var state = 0, @@ -15991,12 +16193,14 @@ var Parser = function ParserClosure() { break; } } - }, - makeInlineImage: function Parser_makeInlineImage(cipherTransform) { + } + }, { + key: "makeInlineImage", + value: function makeInlineImage(cipherTransform) { var lexer = this.lexer; var stream = lexer.stream; - var dict = new _primitives.Dict(this.xref), - dictLength; + var dict = new _primitives.Dict(this.xref); + var dictLength; while (!(0, _primitives.isCmd)(this.buf1, 'ID') && !(0, _primitives.isEOF)(this.buf1)) { if (!(0, _primitives.isName)(this.buf1)) { @@ -16017,8 +16221,8 @@ var Parser = function ParserClosure() { dictLength = stream.pos - lexer.beginInlineImagePos; } - var filter = dict.get('Filter', 'F'), - filterName; + var filter = dict.get('Filter', 'F'); + var filterName; if ((0, _primitives.isName)(filter)) { filterName = filter.name; @@ -16030,8 +16234,8 @@ var Parser = function ParserClosure() { } } - var startPos = stream.pos, - length; + var startPos = stream.pos; + var length; if (filterName === 'DCTDecode' || filterName === 'DCT') { length = this.findDCTDecodeInlineStreamEnd(stream); @@ -16072,15 +16276,17 @@ var Parser = function ParserClosure() { imageStream.dict = dict; if (cacheKey !== undefined) { - imageStream.cacheKey = 'inline_' + length + '_' + cacheKey; + imageStream.cacheKey = "inline_".concat(length, "_").concat(cacheKey); this.imageCache[cacheKey] = imageStream; } this.buf2 = _primitives.Cmd.get('EI'); this.shift(); return imageStream; - }, - _findStreamLength: function _findStreamLength(startPos, signature) { + } + }, { + key: "_findStreamLength", + value: function _findStreamLength(startPos, signature) { var stream = this.lexer.stream; stream.pos = startPos; var SCAN_BLOCK_LENGTH = 2048; @@ -16115,8 +16321,10 @@ var Parser = function ParserClosure() { } return -1; - }, - makeStream: function Parser_makeStream(dict, cipherTransform) { + } + }, { + key: "makeStream", + value: function makeStream(dict, cipherTransform) { var lexer = this.lexer; var stream = lexer.stream; lexer.skipToNextLine(); @@ -16124,7 +16332,7 @@ var Parser = function ParserClosure() { var length = dict.get('Length'); if (!Number.isInteger(length)) { - (0, _util.info)('Bad ' + length + ' attribute in stream'); + (0, _util.info)("Bad length \"".concat(length, "\" in stream")); length = 0; } @@ -16181,8 +16389,10 @@ var Parser = function ParserClosure() { stream = this.filter(stream, dict, length); stream.dict = dict; return stream; - }, - filter: function Parser_filter(stream, dict, length) { + } + }, { + key: "filter", + value: function filter(stream, dict, length) { var filter = dict.get('Filter', 'F'); var params = dict.get('DecodeParms', 'DP'); @@ -16204,7 +16414,7 @@ var Parser = function ParserClosure() { filter = this.xref.fetchIfRef(filterArray[i]); if (!(0, _primitives.isName)(filter)) { - throw new _util.FormatError('Bad filter name: ' + filter); + throw new _util.FormatError("Bad filter name \"".concat(filter, "\"")); } params = null; @@ -16219,10 +16429,12 @@ var Parser = function ParserClosure() { } return stream; - }, - makeFilter: function Parser_makeFilter(stream, name, maybeLength, params) { + } + }, { + key: "makeFilter", + value: function makeFilter(stream, name, maybeLength, params) { if (maybeLength === 0) { - (0, _util.warn)('Empty "' + name + '" stream.'); + (0, _util.warn)("Empty \"".concat(name, "\" stream.")); return new _stream.NullStream(); } @@ -16289,54 +16501,65 @@ var Parser = function ParserClosure() { return new _jbig2_stream.Jbig2Stream(stream, maybeLength, stream.dict, params); } - (0, _util.warn)('filter "' + name + '" not supported yet'); + (0, _util.warn)("Filter \"".concat(name, "\" is not supported.")); return stream; } catch (ex) { - if (ex instanceof _util.MissingDataException) { + if (ex instanceof _core_utils.MissingDataException) { throw ex; } - (0, _util.warn)('Invalid stream: \"' + ex + '\"'); + (0, _util.warn)("Invalid stream: \"".concat(ex, "\"")); return new _stream.NullStream(); } } - }; + }]); + return Parser; }(); exports.Parser = Parser; +var specialChars = [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; -var Lexer = function LexerClosure() { - function Lexer(stream, knownCommands) { - this.stream = stream; - this.nextChar(); - this.strBuf = []; - this.knownCommands = knownCommands; - this.beginInlineImagePos = -1; +function toHexDigit(ch) { + if (ch >= 0x30 && ch <= 0x39) { + return ch & 0x0F; } - var specialChars = [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) { + return (ch & 0x0F) + 9; + } - function toHexDigit(ch) { - if (ch >= 0x30 && ch <= 0x39) { - return ch & 0x0F; - } + return -1; +} - if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) { - return (ch & 0x0F) + 9; - } +var Lexer = +/*#__PURE__*/ +function () { + function Lexer(stream) { + var knownCommands = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + + _classCallCheck(this, Lexer); - return -1; + this.stream = stream; + this.nextChar(); + this.strBuf = []; + this.knownCommands = knownCommands; + this.beginInlineImagePos = -1; } - Lexer.prototype = { - nextChar: function Lexer_nextChar() { + _createClass(Lexer, [{ + key: "nextChar", + value: function nextChar() { return this.currentChar = this.stream.getByte(); - }, - peekChar: function Lexer_peekChar() { + } + }, { + key: "peekChar", + value: function peekChar() { return this.stream.peekByte(); - }, - getNumber: function Lexer_getNumber() { + } + }, { + key: "getNumber", + value: function getNumber() { var ch = this.currentChar; var eNotation = false; var divideBy = 0; @@ -16399,7 +16622,7 @@ var Lexer = function LexerClosure() { break; } } else if (ch === 0x2D) { - (0, _util.warn)('Badly formatted number'); + (0, _util.warn)('Badly formatted number: minus sign in the middle'); } else if (ch === 0x45 || ch === 0x65) { ch = this.peekChar(); @@ -16425,8 +16648,10 @@ var Lexer = function LexerClosure() { } return sign * baseValue; - }, - getString: function Lexer_getString() { + } + }, { + key: "getString", + value: function getString() { var numParen = 1; var done = false; var strBuf = this.strBuf; @@ -16549,8 +16774,10 @@ var Lexer = function LexerClosure() { } return strBuf.join(''); - }, - getName: function Lexer_getName() { + } + }, { + key: "getName", + value: function getName() { var ch, previousCh; var strBuf = this.strBuf; strBuf.length = 0; @@ -16573,7 +16800,7 @@ var Lexer = function LexerClosure() { var x2 = toHexDigit(ch); if (x2 === -1) { - (0, _util.warn)('Lexer_getName: Illegal digit (' + String.fromCharCode(ch) + ') in hexadecimal number.'); + (0, _util.warn)("Lexer_getName: Illegal digit (".concat(String.fromCharCode(ch), ") ") + 'in hexadecimal number.'); strBuf.push('#', String.fromCharCode(previousCh)); if (specialChars[ch]) { @@ -16594,18 +16821,19 @@ var Lexer = function LexerClosure() { } if (strBuf.length > 127) { - (0, _util.warn)('name token is longer than allowed by the spec: ' + strBuf.length); + (0, _util.warn)("Name token is longer than allowed by the spec: ".concat(strBuf.length)); } return _primitives.Name.get(strBuf.join('')); - }, - getHexString: function Lexer_getHexString() { + } + }, { + key: "getHexString", + value: function getHexString() { var strBuf = this.strBuf; strBuf.length = 0; var ch = this.currentChar; var isFirstHex = true; - var firstDigit; - var secondDigit; + var firstDigit, secondDigit; while (true) { if (ch < 0) { @@ -16622,7 +16850,7 @@ var Lexer = function LexerClosure() { firstDigit = toHexDigit(ch); if (firstDigit === -1) { - (0, _util.warn)('Ignoring invalid character "' + ch + '" in hex string'); + (0, _util.warn)("Ignoring invalid character \"".concat(ch, "\" in hex string")); ch = this.nextChar(); continue; } @@ -16630,7 +16858,7 @@ var Lexer = function LexerClosure() { secondDigit = toHexDigit(ch); if (secondDigit === -1) { - (0, _util.warn)('Ignoring invalid character "' + ch + '" in hex string'); + (0, _util.warn)("Ignoring invalid character \"".concat(ch, "\" in hex string")); ch = this.nextChar(); continue; } @@ -16644,8 +16872,10 @@ var Lexer = function LexerClosure() { } return strBuf.join(''); - }, - getObj: function Lexer_getObj() { + } + }, { + key: "getObj", + value: function getObj() { var comment = false; var ch = this.currentChar; @@ -16766,8 +16996,10 @@ var Lexer = function LexerClosure() { } return _primitives.Cmd.get(str); - }, - skipToNextLine: function Lexer_skipToNextLine() { + } + }, { + key: "skipToNextLine", + value: function skipToNextLine() { var ch = this.currentChar; while (ch >= 0) { @@ -16787,69 +17019,88 @@ var Lexer = function LexerClosure() { ch = this.nextChar(); } } - }; + }]); + return Lexer; }(); exports.Lexer = Lexer; -var Linearization = { - create: function LinearizationCreate(stream) { - function getInt(name, allowZeroValue) { - var obj = linDict.get(name); - if (Number.isInteger(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) { - return obj; +var Linearization = +/*#__PURE__*/ +function () { + function Linearization() { + _classCallCheck(this, Linearization); + } + + _createClass(Linearization, null, [{ + key: "create", + value: function create(stream) { + function getInt(linDict, name) { + var allowZeroValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var obj = linDict.get(name); + + if (Number.isInteger(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) { + return obj; + } + + throw new Error("The \"".concat(name, "\" parameter in the linearization ") + 'dictionary is invalid.'); } - throw new Error('The "' + name + '" parameter in the linearization ' + 'dictionary is invalid.'); - } + function getHints(linDict) { + var hints = linDict.get('H'); + var hintsLength; - function getHints() { - var hints = linDict.get('H'), - hintsLength, - item; + if (Array.isArray(hints) && ((hintsLength = hints.length) === 2 || hintsLength === 4)) { + for (var index = 0; index < hintsLength; index++) { + var hint = hints[index]; - if (Array.isArray(hints) && ((hintsLength = hints.length) === 2 || hintsLength === 4)) { - for (var index = 0; index < hintsLength; index++) { - if (!(Number.isInteger(item = hints[index]) && item > 0)) { - throw new Error('Hint (' + index + ') in the linearization dictionary is invalid.'); + if (!(Number.isInteger(hint) && hint > 0)) { + throw new Error("Hint (".concat(index, ") in the linearization dictionary ") + 'is invalid.'); + } } + + return hints; } - return hints; + throw new Error('Hint array in the linearization dictionary is invalid.'); } - throw new Error('Hint array in the linearization dictionary is invalid.'); - } + var parser = new Parser({ + lexer: new Lexer(stream), + xref: null + }); + var obj1 = parser.getObj(); + var obj2 = parser.getObj(); + var obj3 = parser.getObj(); + var linDict = parser.getObj(); + var obj, length; - var parser = new Parser(new Lexer(stream), false, null); - var obj1 = parser.getObj(); - var obj2 = parser.getObj(); - var obj3 = parser.getObj(); - var linDict = parser.getObj(); - var obj, length; + if (!(Number.isInteger(obj1) && Number.isInteger(obj2) && (0, _primitives.isCmd)(obj3, 'obj') && (0, _primitives.isDict)(linDict) && (0, _util.isNum)(obj = linDict.get('Linearized')) && obj > 0)) { + return null; + } else if ((length = getInt(linDict, 'L')) !== stream.length) { + throw new Error('The "L" parameter in the linearization dictionary ' + 'does not equal the stream length.'); + } - if (!(Number.isInteger(obj1) && Number.isInteger(obj2) && (0, _primitives.isCmd)(obj3, 'obj') && (0, _primitives.isDict)(linDict) && (0, _util.isNum)(obj = linDict.get('Linearized')) && obj > 0)) { - return null; - } else if ((length = getInt('L')) !== stream.length) { - throw new Error('The "L" parameter in the linearization dictionary ' + 'does not equal the stream length.'); + return { + length: length, + hints: getHints(linDict), + objectNumberFirst: getInt(linDict, 'O'), + endFirst: getInt(linDict, 'E'), + numPages: getInt(linDict, 'N'), + mainXRefEntriesOffset: getInt(linDict, 'T'), + pageFirst: linDict.has('P') ? getInt(linDict, 'P', true) : 0 + }; } + }]); + + return Linearization; +}(); - return { - length: length, - hints: getHints(), - objectNumberFirst: getInt('O'), - endFirst: getInt('E'), - numPages: getInt('N'), - mainXRefEntriesOffset: getInt('T'), - pageFirst: linDict.has('P') ? getInt('P', true) : 0 - }; - } -}; exports.Linearization = Linearization; /***/ }), -/* 157 */ +/* 158 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -16860,9 +17111,9 @@ Object.defineProperty(exports, "__esModule", { }); exports.LZWStream = exports.StringStream = exports.StreamsSequenceStream = exports.Stream = exports.RunLengthStream = exports.PredictorStream = exports.NullStream = exports.FlateStream = exports.DecodeStream = exports.DecryptStream = exports.AsciiHexStream = exports.Ascii85Stream = void 0; -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); -var _primitives = __w_pdfjs_require__(155); +var _primitives = __w_pdfjs_require__(151); function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } @@ -18131,7 +18382,7 @@ var NullStream = function NullStreamClosure() { exports.NullStream = NullStream; /***/ }), -/* 158 */ +/* 159 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -18142,11 +18393,11 @@ Object.defineProperty(exports, "__esModule", { }); exports.CCITTFaxStream = void 0; -var _primitives = __w_pdfjs_require__(155); +var _primitives = __w_pdfjs_require__(151); -var _ccitt = __w_pdfjs_require__(159); +var _ccitt = __w_pdfjs_require__(160); -var _stream = __w_pdfjs_require__(157); +var _stream = __w_pdfjs_require__(158); var CCITTFaxStream = function CCITTFaxStreamClosure() { function CCITTFaxStream(str, maybeLength, params) { @@ -18197,7 +18448,7 @@ var CCITTFaxStream = function CCITTFaxStreamClosure() { exports.CCITTFaxStream = CCITTFaxStream; /***/ }), -/* 159 */ +/* 160 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -18208,7 +18459,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.CCITTFaxDecoder = void 0; -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); var CCITTFaxDecoder = function CCITTFaxDecoder() { var ccittEOL = -2; @@ -18895,7 +19146,7 @@ var CCITTFaxDecoder = function CCITTFaxDecoder() { exports.CCITTFaxDecoder = CCITTFaxDecoder; /***/ }), -/* 160 */ +/* 161 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -18906,13 +19157,13 @@ Object.defineProperty(exports, "__esModule", { }); exports.Jbig2Stream = void 0; -var _primitives = __w_pdfjs_require__(155); +var _primitives = __w_pdfjs_require__(151); -var _stream = __w_pdfjs_require__(157); +var _stream = __w_pdfjs_require__(158); -var _jbig = __w_pdfjs_require__(161); +var _jbig = __w_pdfjs_require__(162); -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); var Jbig2Stream = function Jbig2StreamClosure() { function Jbig2Stream(stream, maybeLength, dict, params) { @@ -18978,7 +19229,7 @@ var Jbig2Stream = function Jbig2StreamClosure() { exports.Jbig2Stream = Jbig2Stream; /***/ }), -/* 161 */ +/* 162 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -18989,11 +19240,11 @@ Object.defineProperty(exports, "__esModule", { }); exports.Jbig2Image = void 0; -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); -var _arithmetic_decoder = __w_pdfjs_require__(162); +var _arithmetic_decoder = __w_pdfjs_require__(163); -var _ccitt = __w_pdfjs_require__(159); +var _ccitt = __w_pdfjs_require__(160); var Jbig2Error = function Jbig2ErrorClosure() { function Jbig2Error(msg) { @@ -21177,7 +21428,7 @@ var Jbig2Image = function Jbig2ImageClosure() { exports.Jbig2Image = Jbig2Image; /***/ }), -/* 162 */ +/* 163 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -21547,7 +21798,7 @@ function () { exports.ArithmeticDecoder = ArithmeticDecoder; /***/ }), -/* 163 */ +/* 164 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -21558,13 +21809,13 @@ Object.defineProperty(exports, "__esModule", { }); exports.JpegStream = void 0; -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); -var _stream = __w_pdfjs_require__(157); +var _stream = __w_pdfjs_require__(158); -var _primitives = __w_pdfjs_require__(155); +var _primitives = __w_pdfjs_require__(151); -var _jpg = __w_pdfjs_require__(164); +var _jpg = __w_pdfjs_require__(165); var JpegStream = function JpegStreamClosure() { function JpegStream(stream, maybeLength, dict, params) { @@ -21659,7 +21910,7 @@ var JpegStream = function JpegStreamClosure() { exports.JpegStream = JpegStream; /***/ }), -/* 164 */ +/* 165 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -21670,7 +21921,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.JpegImage = void 0; -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } @@ -22660,6 +22911,7 @@ var JpegImage = function JpegImageClosure() { } this.numComponents = this.components.length; + return undefined; }, _getLinearizedBlockData: function _getLinearizedBlockData(width, height) { var isSourcePDF = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; @@ -22848,7 +23100,7 @@ var JpegImage = function JpegImageClosure() { exports.JpegImage = JpegImage; /***/ }), -/* 165 */ +/* 166 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -22859,11 +23111,11 @@ Object.defineProperty(exports, "__esModule", { }); exports.JpxStream = void 0; -var _stream = __w_pdfjs_require__(157); +var _stream = __w_pdfjs_require__(158); -var _jpx = __w_pdfjs_require__(166); +var _jpx = __w_pdfjs_require__(167); -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); var JpxStream = function JpxStreamClosure() { function JpxStream(stream, maybeLength, dict, params) { @@ -22935,7 +23187,7 @@ var JpxStream = function JpxStreamClosure() { exports.JpxStream = JpxStream; /***/ }), -/* 166 */ +/* 167 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -22946,9 +23198,9 @@ Object.defineProperty(exports, "__esModule", { }); exports.JpxImage = void 0; -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); -var _arithmetic_decoder = __w_pdfjs_require__(162); +var _arithmetic_decoder = __w_pdfjs_require__(163); var JpxError = function JpxErrorClosure() { function JpxError(msg) { @@ -25253,7 +25505,7 @@ var JpxImage = function JpxImageClosure() { exports.JpxImage = JpxImage; /***/ }), -/* 167 */ +/* 168 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -25264,11 +25516,11 @@ Object.defineProperty(exports, "__esModule", { }); exports.calculateSHA512 = exports.calculateSHA384 = exports.calculateSHA256 = exports.calculateMD5 = exports.PDF20 = exports.PDF17 = exports.CipherTransformFactory = exports.ARCFourCipher = exports.AES256Cipher = exports.AES128Cipher = void 0; -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); -var _primitives = __w_pdfjs_require__(155); +var _primitives = __w_pdfjs_require__(151); -var _stream = __w_pdfjs_require__(157); +var _stream = __w_pdfjs_require__(158); function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } @@ -26901,7 +27153,7 @@ var CipherTransformFactory = function CipherTransformFactoryClosure() { exports.CipherTransformFactory = CipherTransformFactory; /***/ }), -/* 168 */ +/* 169 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -26912,9 +27164,9 @@ Object.defineProperty(exports, "__esModule", { }); exports.ColorSpace = void 0; -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); -var _primitives = __w_pdfjs_require__(155); +var _primitives = __w_pdfjs_require__(151); function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } @@ -28111,7 +28363,7 @@ var LabCS = function LabCSClosure() { }(); /***/ }), -/* 169 */ +/* 170 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -28120,19 +28372,25 @@ var LabCS = function LabCSClosure() { Object.defineProperty(exports, "__esModule", { value: true }); -exports.AnnotationFactory = exports.AnnotationBorderStyle = exports.Annotation = void 0; +exports.MarkupAnnotation = exports.AnnotationFactory = exports.AnnotationBorderStyle = exports.Annotation = void 0; -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); -var _obj = __w_pdfjs_require__(154); +var _obj = __w_pdfjs_require__(156); -var _primitives = __w_pdfjs_require__(155); +var _primitives = __w_pdfjs_require__(151); -var _colorspace = __w_pdfjs_require__(168); +var _colorspace = __w_pdfjs_require__(169); -var _operator_list = __w_pdfjs_require__(170); +var _core_utils = __w_pdfjs_require__(154); -var _stream = __w_pdfjs_require__(157); +var _operator_list = __w_pdfjs_require__(171); + +var _stream = __w_pdfjs_require__(158); + +function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } + +function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } @@ -28140,10 +28398,6 @@ function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } -function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } - -function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } - function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } @@ -28174,16 +28428,15 @@ function () { var dict = xref.fetchIfRef(ref); if (!(0, _primitives.isDict)(dict)) { - return; + return undefined; } - var id = (0, _primitives.isRef)(ref) ? ref.toString() : 'annot_' + idFactory.createObjId(); + var id = (0, _primitives.isRef)(ref) ? ref.toString() : "annot_".concat(idFactory.createObjId()); var subtype = dict.get('Subtype'); subtype = (0, _primitives.isName)(subtype) ? subtype.name : null; var parameters = { xref: xref, dict: dict, - ref: (0, _primitives.isRef)(ref) ? ref : null, subtype: subtype, id: id, pdfManager: pdfManager @@ -28197,7 +28450,7 @@ function () { return new TextAnnotation(parameters); case 'Widget': - var fieldType = (0, _util.getInheritableProperty)({ + var fieldType = (0, _core_utils.getInheritableProperty)({ dict: dict, key: 'FT' }); @@ -28220,6 +28473,9 @@ function () { case 'Popup': return new PopupAnnotation(parameters); + case 'FreeText': + return new FreeTextAnnotation(parameters); + case 'Line': return new LineAnnotation(parameters); @@ -28235,6 +28491,9 @@ function () { case 'Polygon': return new PolygonAnnotation(parameters); + case 'Caret': + return new CaretAnnotation(parameters); + case 'Ink': return new InkAnnotation(parameters); @@ -28297,6 +28556,8 @@ function () { _classCallCheck(this, Annotation); var dict = params.dict; + this.setContents(dict.get('Contents')); + this.setModificationDate(dict.get('M')); this.setFlags(dict.get('F')); this.setRectangle(dict.getArray('Rect')); this.setColor(dict.getArray('C')); @@ -28306,8 +28567,10 @@ function () { annotationFlags: this.flags, borderStyle: this.borderStyle, color: this.color, + contents: this.contents, hasAppearance: !!this.appearance, id: params.id, + modificationDate: this.modificationDate, rect: this.rectangle, subtype: params.subtype }; @@ -28328,6 +28591,16 @@ function () { value: function _isPrintable(flags) { return this._hasFlag(flags, _util.AnnotationFlag.PRINT) && !this._hasFlag(flags, _util.AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, _util.AnnotationFlag.HIDDEN); } + }, { + key: "setContents", + value: function setContents(contents) { + this.contents = (0, _util.stringToPDFString)(contents || ''); + } + }, { + key: "setModificationDate", + value: function setModificationDate(modificationDate) { + this.modificationDate = (0, _util.isString)(modificationDate) ? modificationDate : null; + } }, { key: "setFlags", value: function setFlags(flags) { @@ -28399,7 +28672,7 @@ function () { var dictType = dict.get('Type'); if (!dictType || (0, _primitives.isName)(dictType, 'Border')) { - this.borderStyle.setWidth(dict.get('W')); + this.borderStyle.setWidth(dict.get('W'), this.rectangle); this.borderStyle.setStyle(dict.get('S')); this.borderStyle.setDashArray(dict.getArray('D')); } @@ -28409,7 +28682,7 @@ function () { if (Array.isArray(array) && array.length >= 3) { this.borderStyle.setHorizontalCornerRadius(array[0]); this.borderStyle.setVerticalCornerRadius(array[1]); - this.borderStyle.setWidth(array[2]); + this.borderStyle.setWidth(array[2], this.rectangle); if (array.length === 4) { this.borderStyle.setDashArray(array[3]); @@ -28448,23 +28721,12 @@ function () { this.appearance = normalAppearanceState.get(as.name); } - }, { - key: "_preparePopup", - value: function _preparePopup(dict) { - if (!dict.has('C')) { - this.data.color = null; - } - - this.data.hasPopup = dict.has('Popup'); - this.data.title = (0, _util.stringToPDFString)(dict.get('T') || ''); - this.data.contents = (0, _util.stringToPDFString)(dict.get('Contents') || ''); - } }, { key: "loadResources", value: function loadResources(keys) { return this.appearance.dict.getAsync('Resources').then(function (resources) { if (!resources) { - return; + return undefined; } var objectLoader = new _obj.ObjectLoader(resources, keys, resources.xref); @@ -28546,12 +28808,24 @@ function () { _createClass(AnnotationBorderStyle, [{ key: "setWidth", value: function setWidth(width) { + var rect = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [0, 0, 0, 0]; + if ((0, _primitives.isName)(width)) { this.width = 0; return; } if (Number.isInteger(width)) { + if (width > 0) { + var maxWidth = (rect[2] - rect[0]) / 2; + var maxHeight = (rect[3] - rect[1]) / 2; + + if (maxWidth > 0 && maxHeight > 0 && (width > maxWidth || width > maxHeight)) { + (0, _util.warn)("AnnotationBorderStyle.setWidth - ignoring width: ".concat(width)); + width = 1; + } + } + this.width = width; } } @@ -28636,41 +28910,78 @@ function () { exports.AnnotationBorderStyle = AnnotationBorderStyle; -var WidgetAnnotation = +var MarkupAnnotation = /*#__PURE__*/ function (_Annotation) { - _inherits(WidgetAnnotation, _Annotation); + _inherits(MarkupAnnotation, _Annotation); - function WidgetAnnotation(params) { + function MarkupAnnotation(parameters) { var _this2; + _classCallCheck(this, MarkupAnnotation); + + _this2 = _possibleConstructorReturn(this, _getPrototypeOf(MarkupAnnotation).call(this, parameters)); + var dict = parameters.dict; + + if (!dict.has('C')) { + _this2.data.color = null; + } + + _this2.setCreationDate(dict.get('CreationDate')); + + _this2.data.creationDate = _this2.creationDate; + _this2.data.hasPopup = dict.has('Popup'); + _this2.data.title = (0, _util.stringToPDFString)(dict.get('T') || ''); + return _this2; + } + + _createClass(MarkupAnnotation, [{ + key: "setCreationDate", + value: function setCreationDate(creationDate) { + this.creationDate = (0, _util.isString)(creationDate) ? creationDate : null; + } + }]); + + return MarkupAnnotation; +}(Annotation); + +exports.MarkupAnnotation = MarkupAnnotation; + +var WidgetAnnotation = +/*#__PURE__*/ +function (_Annotation2) { + _inherits(WidgetAnnotation, _Annotation2); + + function WidgetAnnotation(params) { + var _this3; + _classCallCheck(this, WidgetAnnotation); - _this2 = _possibleConstructorReturn(this, _getPrototypeOf(WidgetAnnotation).call(this, params)); + _this3 = _possibleConstructorReturn(this, _getPrototypeOf(WidgetAnnotation).call(this, params)); var dict = params.dict; - var data = _this2.data; + var data = _this3.data; data.annotationType = _util.AnnotationType.WIDGET; - data.fieldName = _this2._constructFieldName(dict); - data.fieldValue = (0, _util.getInheritableProperty)({ + data.fieldName = _this3._constructFieldName(dict); + data.fieldValue = (0, _core_utils.getInheritableProperty)({ dict: dict, key: 'V', getArray: true }); data.alternativeText = (0, _util.stringToPDFString)(dict.get('TU') || ''); - data.defaultAppearance = (0, _util.getInheritableProperty)({ + data.defaultAppearance = (0, _core_utils.getInheritableProperty)({ dict: dict, key: 'DA' }) || ''; - var fieldType = (0, _util.getInheritableProperty)({ + var fieldType = (0, _core_utils.getInheritableProperty)({ dict: dict, key: 'FT' }); data.fieldType = (0, _primitives.isName)(fieldType) ? fieldType.name : null; - _this2.fieldResources = (0, _util.getInheritableProperty)({ + _this3.fieldResources = (0, _core_utils.getInheritableProperty)({ dict: dict, key: 'DR' }) || _primitives.Dict.empty; - data.fieldFlags = (0, _util.getInheritableProperty)({ + data.fieldFlags = (0, _core_utils.getInheritableProperty)({ dict: dict, key: 'Ff' }); @@ -28679,15 +28990,15 @@ function (_Annotation) { data.fieldFlags = 0; } - data.readOnly = _this2.hasFieldFlag(_util.AnnotationFieldFlag.READONLY); + data.readOnly = _this3.hasFieldFlag(_util.AnnotationFieldFlag.READONLY); if (data.fieldType === 'Sig') { data.fieldValue = null; - _this2.setFlags(_util.AnnotationFlag.HIDDEN); + _this3.setFlags(_util.AnnotationFlag.HIDDEN); } - return _this2; + return _this3; } _createClass(WidgetAnnotation, [{ @@ -28749,14 +29060,14 @@ function (_WidgetAnnotation) { _inherits(TextWidgetAnnotation, _WidgetAnnotation); function TextWidgetAnnotation(params) { - var _this3; + var _this4; _classCallCheck(this, TextWidgetAnnotation); - _this3 = _possibleConstructorReturn(this, _getPrototypeOf(TextWidgetAnnotation).call(this, params)); + _this4 = _possibleConstructorReturn(this, _getPrototypeOf(TextWidgetAnnotation).call(this, params)); var dict = params.dict; - _this3.data.fieldValue = (0, _util.stringToPDFString)(_this3.data.fieldValue || ''); - var alignment = (0, _util.getInheritableProperty)({ + _this4.data.fieldValue = (0, _util.stringToPDFString)(_this4.data.fieldValue || ''); + var alignment = (0, _core_utils.getInheritableProperty)({ dict: dict, key: 'Q' }); @@ -28765,8 +29076,8 @@ function (_WidgetAnnotation) { alignment = null; } - _this3.data.textAlignment = alignment; - var maximumLength = (0, _util.getInheritableProperty)({ + _this4.data.textAlignment = alignment; + var maximumLength = (0, _core_utils.getInheritableProperty)({ dict: dict, key: 'MaxLen' }); @@ -28775,10 +29086,10 @@ function (_WidgetAnnotation) { maximumLength = null; } - _this3.data.maxLen = maximumLength; - _this3.data.multiLine = _this3.hasFieldFlag(_util.AnnotationFieldFlag.MULTILINE); - _this3.data.comb = _this3.hasFieldFlag(_util.AnnotationFieldFlag.COMB) && !_this3.hasFieldFlag(_util.AnnotationFieldFlag.MULTILINE) && !_this3.hasFieldFlag(_util.AnnotationFieldFlag.PASSWORD) && !_this3.hasFieldFlag(_util.AnnotationFieldFlag.FILESELECT) && _this3.data.maxLen !== null; - return _this3; + _this4.data.maxLen = maximumLength; + _this4.data.multiLine = _this4.hasFieldFlag(_util.AnnotationFieldFlag.MULTILINE); + _this4.data.comb = _this4.hasFieldFlag(_util.AnnotationFieldFlag.COMB) && !_this4.hasFieldFlag(_util.AnnotationFieldFlag.MULTILINE) && !_this4.hasFieldFlag(_util.AnnotationFieldFlag.PASSWORD) && !_this4.hasFieldFlag(_util.AnnotationFieldFlag.FILESELECT) && _this4.data.maxLen !== null; + return _this4; } _createClass(TextWidgetAnnotation, [{ @@ -28815,26 +29126,26 @@ function (_WidgetAnnotation2) { _inherits(ButtonWidgetAnnotation, _WidgetAnnotation2); function ButtonWidgetAnnotation(params) { - var _this4; + var _this5; _classCallCheck(this, ButtonWidgetAnnotation); - _this4 = _possibleConstructorReturn(this, _getPrototypeOf(ButtonWidgetAnnotation).call(this, params)); - _this4.data.checkBox = !_this4.hasFieldFlag(_util.AnnotationFieldFlag.RADIO) && !_this4.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON); - _this4.data.radioButton = _this4.hasFieldFlag(_util.AnnotationFieldFlag.RADIO) && !_this4.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON); - _this4.data.pushButton = _this4.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON); - - if (_this4.data.checkBox) { - _this4._processCheckBox(params); - } else if (_this4.data.radioButton) { - _this4._processRadioButton(params); - } else if (_this4.data.pushButton) { - _this4._processPushButton(params); + _this5 = _possibleConstructorReturn(this, _getPrototypeOf(ButtonWidgetAnnotation).call(this, params)); + _this5.data.checkBox = !_this5.hasFieldFlag(_util.AnnotationFieldFlag.RADIO) && !_this5.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON); + _this5.data.radioButton = _this5.hasFieldFlag(_util.AnnotationFieldFlag.RADIO) && !_this5.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON); + _this5.data.pushButton = _this5.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON); + + if (_this5.data.checkBox) { + _this5._processCheckBox(params); + } else if (_this5.data.radioButton) { + _this5._processRadioButton(params); + } else if (_this5.data.pushButton) { + _this5._processPushButton(params); } else { (0, _util.warn)('Invalid field flags for button widget annotation'); } - return _this4; + return _this5; } _createClass(ButtonWidgetAnnotation, [{ @@ -28925,13 +29236,13 @@ function (_WidgetAnnotation3) { _inherits(ChoiceWidgetAnnotation, _WidgetAnnotation3); function ChoiceWidgetAnnotation(params) { - var _this5; + var _this6; _classCallCheck(this, ChoiceWidgetAnnotation); - _this5 = _possibleConstructorReturn(this, _getPrototypeOf(ChoiceWidgetAnnotation).call(this, params)); - _this5.data.options = []; - var options = (0, _util.getInheritableProperty)({ + _this6 = _possibleConstructorReturn(this, _getPrototypeOf(ChoiceWidgetAnnotation).call(this, params)); + _this6.data.options = []; + var options = (0, _core_utils.getInheritableProperty)({ dict: params.dict, key: 'Opt' }); @@ -28942,20 +29253,20 @@ function (_WidgetAnnotation3) { for (var i = 0, ii = options.length; i < ii; i++) { var option = xref.fetchIfRef(options[i]); var isOptionArray = Array.isArray(option); - _this5.data.options[i] = { + _this6.data.options[i] = { exportValue: isOptionArray ? xref.fetchIfRef(option[0]) : option, displayValue: (0, _util.stringToPDFString)(isOptionArray ? xref.fetchIfRef(option[1]) : option) }; } } - if (!Array.isArray(_this5.data.fieldValue)) { - _this5.data.fieldValue = [_this5.data.fieldValue]; + if (!Array.isArray(_this6.data.fieldValue)) { + _this6.data.fieldValue = [_this6.data.fieldValue]; } - _this5.data.combo = _this5.hasFieldFlag(_util.AnnotationFieldFlag.COMBO); - _this5.data.multiSelect = _this5.hasFieldFlag(_util.AnnotationFieldFlag.MULTISELECT); - return _this5; + _this6.data.combo = _this6.hasFieldFlag(_util.AnnotationFieldFlag.COMBO); + _this6.data.multiSelect = _this6.hasFieldFlag(_util.AnnotationFieldFlag.MULTISELECT); + return _this6; } return ChoiceWidgetAnnotation; @@ -28963,33 +29274,31 @@ function (_WidgetAnnotation3) { var TextAnnotation = /*#__PURE__*/ -function (_Annotation2) { - _inherits(TextAnnotation, _Annotation2); +function (_MarkupAnnotation) { + _inherits(TextAnnotation, _MarkupAnnotation); function TextAnnotation(parameters) { - var _this6; + var _this7; _classCallCheck(this, TextAnnotation); var DEFAULT_ICON_SIZE = 22; - _this6 = _possibleConstructorReturn(this, _getPrototypeOf(TextAnnotation).call(this, parameters)); - _this6.data.annotationType = _util.AnnotationType.TEXT; + _this7 = _possibleConstructorReturn(this, _getPrototypeOf(TextAnnotation).call(this, parameters)); + _this7.data.annotationType = _util.AnnotationType.TEXT; - if (_this6.data.hasAppearance) { - _this6.data.name = 'NoIcon'; + if (_this7.data.hasAppearance) { + _this7.data.name = 'NoIcon'; } else { - _this6.data.rect[1] = _this6.data.rect[3] - DEFAULT_ICON_SIZE; - _this6.data.rect[2] = _this6.data.rect[0] + DEFAULT_ICON_SIZE; - _this6.data.name = parameters.dict.has('Name') ? parameters.dict.get('Name').name : 'Note'; + _this7.data.rect[1] = _this7.data.rect[3] - DEFAULT_ICON_SIZE; + _this7.data.rect[2] = _this7.data.rect[0] + DEFAULT_ICON_SIZE; + _this7.data.name = parameters.dict.has('Name') ? parameters.dict.get('Name').name : 'Note'; } - _this6._preparePopup(parameters.dict); - - return _this6; + return _this7; } return TextAnnotation; -}(Annotation); +}(MarkupAnnotation); var LinkAnnotation = /*#__PURE__*/ @@ -28997,20 +29306,20 @@ function (_Annotation3) { _inherits(LinkAnnotation, _Annotation3); function LinkAnnotation(params) { - var _this7; + var _this8; _classCallCheck(this, LinkAnnotation); - _this7 = _possibleConstructorReturn(this, _getPrototypeOf(LinkAnnotation).call(this, params)); - _this7.data.annotationType = _util.AnnotationType.LINK; + _this8 = _possibleConstructorReturn(this, _getPrototypeOf(LinkAnnotation).call(this, params)); + _this8.data.annotationType = _util.AnnotationType.LINK; _obj.Catalog.parseDestDictionary({ destDict: params.dict, - resultObj: _this7.data, + resultObj: _this8.data, docBaseUrl: params.pdfManager.docBaseUrl }); - return _this7; + return _this8; } return LinkAnnotation; @@ -29022,143 +29331,158 @@ function (_Annotation4) { _inherits(PopupAnnotation, _Annotation4); function PopupAnnotation(parameters) { - var _this8; + var _this9; _classCallCheck(this, PopupAnnotation); - _this8 = _possibleConstructorReturn(this, _getPrototypeOf(PopupAnnotation).call(this, parameters)); - _this8.data.annotationType = _util.AnnotationType.POPUP; + _this9 = _possibleConstructorReturn(this, _getPrototypeOf(PopupAnnotation).call(this, parameters)); + _this9.data.annotationType = _util.AnnotationType.POPUP; var dict = parameters.dict; var parentItem = dict.get('Parent'); if (!parentItem) { (0, _util.warn)('Popup annotation has a missing or invalid parent annotation.'); - return _possibleConstructorReturn(_this8); + return _possibleConstructorReturn(_this9); } var parentSubtype = parentItem.get('Subtype'); - _this8.data.parentType = (0, _primitives.isName)(parentSubtype) ? parentSubtype.name : null; - _this8.data.parentId = dict.getRaw('Parent').toString(); - _this8.data.title = (0, _util.stringToPDFString)(parentItem.get('T') || ''); - _this8.data.contents = (0, _util.stringToPDFString)(parentItem.get('Contents') || ''); + _this9.data.parentType = (0, _primitives.isName)(parentSubtype) ? parentSubtype.name : null; + _this9.data.parentId = dict.getRaw('Parent').toString(); + _this9.data.title = (0, _util.stringToPDFString)(parentItem.get('T') || ''); + _this9.data.contents = (0, _util.stringToPDFString)(parentItem.get('Contents') || ''); + + if (!parentItem.has('M')) { + _this9.data.modificationDate = null; + } else { + _this9.setModificationDate(parentItem.get('M')); + + _this9.data.modificationDate = _this9.modificationDate; + } if (!parentItem.has('C')) { - _this8.data.color = null; + _this9.data.color = null; } else { - _this8.setColor(parentItem.getArray('C')); + _this9.setColor(parentItem.getArray('C')); - _this8.data.color = _this8.color; + _this9.data.color = _this9.color; } - if (!_this8.viewable) { + if (!_this9.viewable) { var parentFlags = parentItem.get('F'); - if (_this8._isViewable(parentFlags)) { - _this8.setFlags(parentFlags); + if (_this9._isViewable(parentFlags)) { + _this9.setFlags(parentFlags); } } - return _this8; + return _this9; } return PopupAnnotation; }(Annotation); +var FreeTextAnnotation = +/*#__PURE__*/ +function (_MarkupAnnotation2) { + _inherits(FreeTextAnnotation, _MarkupAnnotation2); + + function FreeTextAnnotation(parameters) { + var _this10; + + _classCallCheck(this, FreeTextAnnotation); + + _this10 = _possibleConstructorReturn(this, _getPrototypeOf(FreeTextAnnotation).call(this, parameters)); + _this10.data.annotationType = _util.AnnotationType.FREETEXT; + return _this10; + } + + return FreeTextAnnotation; +}(MarkupAnnotation); + var LineAnnotation = /*#__PURE__*/ -function (_Annotation5) { - _inherits(LineAnnotation, _Annotation5); +function (_MarkupAnnotation3) { + _inherits(LineAnnotation, _MarkupAnnotation3); function LineAnnotation(parameters) { - var _this9; + var _this11; _classCallCheck(this, LineAnnotation); - _this9 = _possibleConstructorReturn(this, _getPrototypeOf(LineAnnotation).call(this, parameters)); - _this9.data.annotationType = _util.AnnotationType.LINE; + _this11 = _possibleConstructorReturn(this, _getPrototypeOf(LineAnnotation).call(this, parameters)); + _this11.data.annotationType = _util.AnnotationType.LINE; var dict = parameters.dict; - _this9.data.lineCoordinates = _util.Util.normalizeRect(dict.getArray('L')); - - _this9._preparePopup(dict); - - return _this9; + _this11.data.lineCoordinates = _util.Util.normalizeRect(dict.getArray('L')); + return _this11; } return LineAnnotation; -}(Annotation); +}(MarkupAnnotation); var SquareAnnotation = /*#__PURE__*/ -function (_Annotation6) { - _inherits(SquareAnnotation, _Annotation6); +function (_MarkupAnnotation4) { + _inherits(SquareAnnotation, _MarkupAnnotation4); function SquareAnnotation(parameters) { - var _this10; + var _this12; _classCallCheck(this, SquareAnnotation); - _this10 = _possibleConstructorReturn(this, _getPrototypeOf(SquareAnnotation).call(this, parameters)); - _this10.data.annotationType = _util.AnnotationType.SQUARE; - - _this10._preparePopup(parameters.dict); - - return _this10; + _this12 = _possibleConstructorReturn(this, _getPrototypeOf(SquareAnnotation).call(this, parameters)); + _this12.data.annotationType = _util.AnnotationType.SQUARE; + return _this12; } return SquareAnnotation; -}(Annotation); +}(MarkupAnnotation); var CircleAnnotation = /*#__PURE__*/ -function (_Annotation7) { - _inherits(CircleAnnotation, _Annotation7); +function (_MarkupAnnotation5) { + _inherits(CircleAnnotation, _MarkupAnnotation5); function CircleAnnotation(parameters) { - var _this11; + var _this13; _classCallCheck(this, CircleAnnotation); - _this11 = _possibleConstructorReturn(this, _getPrototypeOf(CircleAnnotation).call(this, parameters)); - _this11.data.annotationType = _util.AnnotationType.CIRCLE; - - _this11._preparePopup(parameters.dict); - - return _this11; + _this13 = _possibleConstructorReturn(this, _getPrototypeOf(CircleAnnotation).call(this, parameters)); + _this13.data.annotationType = _util.AnnotationType.CIRCLE; + return _this13; } return CircleAnnotation; -}(Annotation); +}(MarkupAnnotation); var PolylineAnnotation = /*#__PURE__*/ -function (_Annotation8) { - _inherits(PolylineAnnotation, _Annotation8); +function (_MarkupAnnotation6) { + _inherits(PolylineAnnotation, _MarkupAnnotation6); function PolylineAnnotation(parameters) { - var _this12; + var _this14; _classCallCheck(this, PolylineAnnotation); - _this12 = _possibleConstructorReturn(this, _getPrototypeOf(PolylineAnnotation).call(this, parameters)); - _this12.data.annotationType = _util.AnnotationType.POLYLINE; + _this14 = _possibleConstructorReturn(this, _getPrototypeOf(PolylineAnnotation).call(this, parameters)); + _this14.data.annotationType = _util.AnnotationType.POLYLINE; var dict = parameters.dict; var rawVertices = dict.getArray('Vertices'); - _this12.data.vertices = []; + _this14.data.vertices = []; for (var i = 0, ii = rawVertices.length; i < ii; i += 2) { - _this12.data.vertices.push({ + _this14.data.vertices.push({ x: rawVertices[i], y: rawVertices[i + 1] }); } - _this12._preparePopup(dict); - - return _this12; + return _this14; } return PolylineAnnotation; -}(Annotation); +}(MarkupAnnotation); var PolygonAnnotation = /*#__PURE__*/ @@ -29166,184 +29490,182 @@ function (_PolylineAnnotation) { _inherits(PolygonAnnotation, _PolylineAnnotation); function PolygonAnnotation(parameters) { - var _this13; + var _this15; _classCallCheck(this, PolygonAnnotation); - _this13 = _possibleConstructorReturn(this, _getPrototypeOf(PolygonAnnotation).call(this, parameters)); - _this13.data.annotationType = _util.AnnotationType.POLYGON; - return _this13; + _this15 = _possibleConstructorReturn(this, _getPrototypeOf(PolygonAnnotation).call(this, parameters)); + _this15.data.annotationType = _util.AnnotationType.POLYGON; + return _this15; } return PolygonAnnotation; }(PolylineAnnotation); +var CaretAnnotation = +/*#__PURE__*/ +function (_MarkupAnnotation7) { + _inherits(CaretAnnotation, _MarkupAnnotation7); + + function CaretAnnotation(parameters) { + var _this16; + + _classCallCheck(this, CaretAnnotation); + + _this16 = _possibleConstructorReturn(this, _getPrototypeOf(CaretAnnotation).call(this, parameters)); + _this16.data.annotationType = _util.AnnotationType.CARET; + return _this16; + } + + return CaretAnnotation; +}(MarkupAnnotation); + var InkAnnotation = /*#__PURE__*/ -function (_Annotation9) { - _inherits(InkAnnotation, _Annotation9); +function (_MarkupAnnotation8) { + _inherits(InkAnnotation, _MarkupAnnotation8); function InkAnnotation(parameters) { - var _this14; + var _this17; _classCallCheck(this, InkAnnotation); - _this14 = _possibleConstructorReturn(this, _getPrototypeOf(InkAnnotation).call(this, parameters)); - _this14.data.annotationType = _util.AnnotationType.INK; + _this17 = _possibleConstructorReturn(this, _getPrototypeOf(InkAnnotation).call(this, parameters)); + _this17.data.annotationType = _util.AnnotationType.INK; var dict = parameters.dict; var xref = parameters.xref; var originalInkLists = dict.getArray('InkList'); - _this14.data.inkLists = []; + _this17.data.inkLists = []; for (var i = 0, ii = originalInkLists.length; i < ii; ++i) { - _this14.data.inkLists.push([]); + _this17.data.inkLists.push([]); for (var j = 0, jj = originalInkLists[i].length; j < jj; j += 2) { - _this14.data.inkLists[i].push({ + _this17.data.inkLists[i].push({ x: xref.fetchIfRef(originalInkLists[i][j]), y: xref.fetchIfRef(originalInkLists[i][j + 1]) }); } } - _this14._preparePopup(dict); - - return _this14; + return _this17; } return InkAnnotation; -}(Annotation); +}(MarkupAnnotation); var HighlightAnnotation = /*#__PURE__*/ -function (_Annotation10) { - _inherits(HighlightAnnotation, _Annotation10); +function (_MarkupAnnotation9) { + _inherits(HighlightAnnotation, _MarkupAnnotation9); function HighlightAnnotation(parameters) { - var _this15; + var _this18; _classCallCheck(this, HighlightAnnotation); - _this15 = _possibleConstructorReturn(this, _getPrototypeOf(HighlightAnnotation).call(this, parameters)); - _this15.data.annotationType = _util.AnnotationType.HIGHLIGHT; - - _this15._preparePopup(parameters.dict); - - return _this15; + _this18 = _possibleConstructorReturn(this, _getPrototypeOf(HighlightAnnotation).call(this, parameters)); + _this18.data.annotationType = _util.AnnotationType.HIGHLIGHT; + return _this18; } return HighlightAnnotation; -}(Annotation); +}(MarkupAnnotation); var UnderlineAnnotation = /*#__PURE__*/ -function (_Annotation11) { - _inherits(UnderlineAnnotation, _Annotation11); +function (_MarkupAnnotation10) { + _inherits(UnderlineAnnotation, _MarkupAnnotation10); function UnderlineAnnotation(parameters) { - var _this16; + var _this19; _classCallCheck(this, UnderlineAnnotation); - _this16 = _possibleConstructorReturn(this, _getPrototypeOf(UnderlineAnnotation).call(this, parameters)); - _this16.data.annotationType = _util.AnnotationType.UNDERLINE; - - _this16._preparePopup(parameters.dict); - - return _this16; + _this19 = _possibleConstructorReturn(this, _getPrototypeOf(UnderlineAnnotation).call(this, parameters)); + _this19.data.annotationType = _util.AnnotationType.UNDERLINE; + return _this19; } return UnderlineAnnotation; -}(Annotation); +}(MarkupAnnotation); var SquigglyAnnotation = /*#__PURE__*/ -function (_Annotation12) { - _inherits(SquigglyAnnotation, _Annotation12); +function (_MarkupAnnotation11) { + _inherits(SquigglyAnnotation, _MarkupAnnotation11); function SquigglyAnnotation(parameters) { - var _this17; + var _this20; _classCallCheck(this, SquigglyAnnotation); - _this17 = _possibleConstructorReturn(this, _getPrototypeOf(SquigglyAnnotation).call(this, parameters)); - _this17.data.annotationType = _util.AnnotationType.SQUIGGLY; - - _this17._preparePopup(parameters.dict); - - return _this17; + _this20 = _possibleConstructorReturn(this, _getPrototypeOf(SquigglyAnnotation).call(this, parameters)); + _this20.data.annotationType = _util.AnnotationType.SQUIGGLY; + return _this20; } return SquigglyAnnotation; -}(Annotation); +}(MarkupAnnotation); var StrikeOutAnnotation = /*#__PURE__*/ -function (_Annotation13) { - _inherits(StrikeOutAnnotation, _Annotation13); +function (_MarkupAnnotation12) { + _inherits(StrikeOutAnnotation, _MarkupAnnotation12); function StrikeOutAnnotation(parameters) { - var _this18; + var _this21; _classCallCheck(this, StrikeOutAnnotation); - _this18 = _possibleConstructorReturn(this, _getPrototypeOf(StrikeOutAnnotation).call(this, parameters)); - _this18.data.annotationType = _util.AnnotationType.STRIKEOUT; - - _this18._preparePopup(parameters.dict); - - return _this18; + _this21 = _possibleConstructorReturn(this, _getPrototypeOf(StrikeOutAnnotation).call(this, parameters)); + _this21.data.annotationType = _util.AnnotationType.STRIKEOUT; + return _this21; } return StrikeOutAnnotation; -}(Annotation); +}(MarkupAnnotation); var StampAnnotation = /*#__PURE__*/ -function (_Annotation14) { - _inherits(StampAnnotation, _Annotation14); +function (_MarkupAnnotation13) { + _inherits(StampAnnotation, _MarkupAnnotation13); function StampAnnotation(parameters) { - var _this19; + var _this22; _classCallCheck(this, StampAnnotation); - _this19 = _possibleConstructorReturn(this, _getPrototypeOf(StampAnnotation).call(this, parameters)); - _this19.data.annotationType = _util.AnnotationType.STAMP; - - _this19._preparePopup(parameters.dict); - - return _this19; + _this22 = _possibleConstructorReturn(this, _getPrototypeOf(StampAnnotation).call(this, parameters)); + _this22.data.annotationType = _util.AnnotationType.STAMP; + return _this22; } return StampAnnotation; -}(Annotation); +}(MarkupAnnotation); var FileAttachmentAnnotation = /*#__PURE__*/ -function (_Annotation15) { - _inherits(FileAttachmentAnnotation, _Annotation15); +function (_MarkupAnnotation14) { + _inherits(FileAttachmentAnnotation, _MarkupAnnotation14); function FileAttachmentAnnotation(parameters) { - var _this20; + var _this23; _classCallCheck(this, FileAttachmentAnnotation); - _this20 = _possibleConstructorReturn(this, _getPrototypeOf(FileAttachmentAnnotation).call(this, parameters)); + _this23 = _possibleConstructorReturn(this, _getPrototypeOf(FileAttachmentAnnotation).call(this, parameters)); var file = new _obj.FileSpec(parameters.dict.get('FS'), parameters.xref); - _this20.data.annotationType = _util.AnnotationType.FILEATTACHMENT; - _this20.data.file = file.serializable; - - _this20._preparePopup(parameters.dict); - - return _this20; + _this23.data.annotationType = _util.AnnotationType.FILEATTACHMENT; + _this23.data.file = file.serializable; + return _this23; } return FileAttachmentAnnotation; -}(Annotation); +}(MarkupAnnotation); /***/ }), -/* 170 */ +/* 171 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -29354,7 +29676,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.OperatorList = void 0; -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); var QueueOptimizer = function QueueOptimizerClosure() { function addState(parentState, pattern, checkFn, iterateFn, processFn) { @@ -29409,6 +29731,8 @@ var QueueOptimizer = function QueueOptimizerClosure() { case 3: return fnArray[i] === _util.OPS.restore; } + + throw new Error("iterateInlineImageGroup - invalid pos: ".concat(pos)); }, function foundInlineImageGroup(context, i) { var MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10; var MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200; @@ -29515,6 +29839,8 @@ var QueueOptimizer = function QueueOptimizerClosure() { case 3: return fnArray[i] === _util.OPS.restore; } + + throw new Error("iterateImageMaskGroup - invalid pos: ".concat(pos)); }, function foundImageMaskGroup(context, i) { var MIN_IMAGES_IN_MASKS_BLOCK = 10; var MAX_IMAGES_IN_MASKS_BLOCK = 100; @@ -29597,7 +29923,7 @@ var QueueOptimizer = function QueueOptimizerClosure() { var argsArray = context.argsArray; var iFirstTransform = context.iCurr - 2; return argsArray[iFirstTransform][1] === 0 && argsArray[iFirstTransform][2] === 0; - }, function (context, i) { + }, function iterateImageGroup(context, i) { var fnArray = context.fnArray, argsArray = context.argsArray; var iFirstSave = context.iCurr - 3; @@ -29639,6 +29965,8 @@ var QueueOptimizer = function QueueOptimizerClosure() { case 3: return fnArray[i] === _util.OPS.restore; } + + throw new Error("iterateImageGroup - invalid pos: ".concat(pos)); }, function (context, i) { var MIN_IMAGES_IN_BLOCK = 3; var MAX_IMAGES_IN_BLOCK = 1000; @@ -29671,7 +29999,7 @@ var QueueOptimizer = function QueueOptimizerClosure() { argsArray.splice(iFirstSave, count * 4, args); return iFirstSave + 1; }); - addState(InitialState, [_util.OPS.beginText, _util.OPS.setFont, _util.OPS.setTextMatrix, _util.OPS.showText, _util.OPS.endText], null, function (context, i) { + addState(InitialState, [_util.OPS.beginText, _util.OPS.setFont, _util.OPS.setTextMatrix, _util.OPS.showText, _util.OPS.endText], null, function iterateShowTextGroup(context, i) { var fnArray = context.fnArray, argsArray = context.argsArray; var iFirstSave = context.iCurr - 4; @@ -29705,6 +30033,8 @@ var QueueOptimizer = function QueueOptimizerClosure() { case 4: return fnArray[i] === _util.OPS.endText; } + + throw new Error("iterateShowTextGroup - invalid pos: ".concat(pos)); }, function (context, i) { var MIN_CHARS_IN_BLOCK = 3; var MAX_CHARS_IN_BLOCK = 1000; @@ -29846,7 +30176,8 @@ var NullOptimizer = function NullOptimizerClosure() { this.queue.fnArray.push(fn); this.queue.argsArray.push(args); }, - flush: function flush() {} + flush: function flush() {}, + reset: function reset() {} }; return NullOptimizer; }(); @@ -29855,36 +30186,12 @@ var OperatorList = function OperatorListClosure() { var CHUNK_SIZE = 1000; var CHUNK_SIZE_ABOUT = CHUNK_SIZE - 5; - function getTransfers(queue) { - var transfers = []; - var fnArray = queue.fnArray, - argsArray = queue.argsArray; - - for (var i = 0, ii = queue.length; i < ii; i++) { - switch (fnArray[i]) { - case _util.OPS.paintInlineImageXObject: - case _util.OPS.paintInlineImageXObjectGroup: - case _util.OPS.paintImageMaskXObject: - var arg = argsArray[i][0]; - ; - - if (!arg.cached) { - transfers.push(arg.data.buffer); - } - - break; - } - } - - return transfers; - } - function OperatorList(intent, messageHandler, pageIndex) { this.messageHandler = messageHandler; this.fnArray = []; this.argsArray = []; - if (messageHandler && this.intent !== 'oplist') { + if (messageHandler && intent !== 'oplist') { this.optimizer = new QueueOptimizer(this); } else { this.optimizer = new NullOptimizer(this); @@ -29945,9 +30252,35 @@ var OperatorList = function OperatorListClosure() { length: this.length }; }, - flush: function flush(lastChunk) { + + get _transfers() { + var transfers = []; + var fnArray = this.fnArray, + argsArray = this.argsArray, + length = this.length; + + for (var i = 0; i < length; i++) { + switch (fnArray[i]) { + case _util.OPS.paintInlineImageXObject: + case _util.OPS.paintInlineImageXObjectGroup: + case _util.OPS.paintImageMaskXObject: + var arg = argsArray[i][0]; + ; + + if (!arg.cached) { + transfers.push(arg.data.buffer); + } + + break; + } + } + + return transfers; + }, + + flush: function flush() { + var lastChunk = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; this.optimizer.flush(); - var transfers = getTransfers(this); var length = this.length; this._totalLength += length; this.messageHandler.send('RenderPageChunk', { @@ -29959,7 +30292,7 @@ var OperatorList = function OperatorListClosure() { }, pageIndex: this.pageIndex, intent: this.intent - }, transfers); + }, this._transfers); this.dependencies = Object.create(null); this.fnArray.length = 0; this.argsArray.length = 0; @@ -29973,7 +30306,7 @@ var OperatorList = function OperatorListClosure() { exports.OperatorList = OperatorList; /***/ }), -/* 171 */ +/* 172 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -29986,45 +30319,49 @@ exports.PartialEvaluator = void 0; var _regenerator = _interopRequireDefault(__w_pdfjs_require__(2)); -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); -var _cmap = __w_pdfjs_require__(172); +var _cmap = __w_pdfjs_require__(173); -var _stream = __w_pdfjs_require__(157); +var _primitives = __w_pdfjs_require__(151); -var _primitives = __w_pdfjs_require__(155); +var _fonts = __w_pdfjs_require__(174); -var _fonts = __w_pdfjs_require__(173); +var _encodings = __w_pdfjs_require__(177); -var _encodings = __w_pdfjs_require__(176); +var _unicode = __w_pdfjs_require__(180); -var _unicode = __w_pdfjs_require__(179); +var _standard_fonts = __w_pdfjs_require__(179); -var _standard_fonts = __w_pdfjs_require__(178); +var _pattern = __w_pdfjs_require__(183); -var _pattern = __w_pdfjs_require__(182); +var _parser = __w_pdfjs_require__(157); -var _parser = __w_pdfjs_require__(156); +var _bidi = __w_pdfjs_require__(184); -var _bidi = __w_pdfjs_require__(183); +var _colorspace = __w_pdfjs_require__(169); -var _colorspace = __w_pdfjs_require__(168); +var _stream = __w_pdfjs_require__(158); -var _glyphlist = __w_pdfjs_require__(177); +var _glyphlist = __w_pdfjs_require__(178); -var _metrics = __w_pdfjs_require__(184); +var _core_utils = __w_pdfjs_require__(154); -var _function = __w_pdfjs_require__(185); +var _metrics = __w_pdfjs_require__(185); -var _jpeg_stream = __w_pdfjs_require__(163); +var _function = __w_pdfjs_require__(186); -var _murmurhash = __w_pdfjs_require__(187); +var _jpeg_stream = __w_pdfjs_require__(164); -var _operator_list = __w_pdfjs_require__(170); +var _murmurhash = __w_pdfjs_require__(188); -var _image = __w_pdfjs_require__(188); +var _image_utils = __w_pdfjs_require__(189); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var _operator_list = __w_pdfjs_require__(171); + +var _image = __w_pdfjs_require__(190); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } @@ -30040,77 +30377,19 @@ var PartialEvaluator = function PartialEvaluatorClosure() { isEvalSupported: true }; - function NativeImageDecoder(_ref) { + function PartialEvaluator(_ref) { + var _this = this; + var xref = _ref.xref, - resources = _ref.resources, handler = _ref.handler, - _ref$forceDataSchema = _ref.forceDataSchema, - forceDataSchema = _ref$forceDataSchema === void 0 ? false : _ref$forceDataSchema, + pageIndex = _ref.pageIndex, + idFactory = _ref.idFactory, + fontCache = _ref.fontCache, + builtInCMapCache = _ref.builtInCMapCache, + _ref$options = _ref.options, + options = _ref$options === void 0 ? null : _ref$options, pdfFunctionFactory = _ref.pdfFunctionFactory; this.xref = xref; - this.resources = resources; - this.handler = handler; - this.forceDataSchema = forceDataSchema; - this.pdfFunctionFactory = pdfFunctionFactory; - } - - NativeImageDecoder.prototype = { - canDecode: function canDecode(image) { - return image instanceof _jpeg_stream.JpegStream && NativeImageDecoder.isDecodable(image, this.xref, this.resources, this.pdfFunctionFactory); - }, - decode: function decode(image) { - var dict = image.dict; - var colorSpace = dict.get('ColorSpace', 'CS'); - colorSpace = _colorspace.ColorSpace.parse(colorSpace, this.xref, this.resources, this.pdfFunctionFactory); - return this.handler.sendWithPromise('JpegDecode', [image.getIR(this.forceDataSchema), colorSpace.numComps]).then(function (_ref2) { - var data = _ref2.data, - width = _ref2.width, - height = _ref2.height; - return new _stream.Stream(data, 0, data.length, image.dict); - }); - } - }; - - NativeImageDecoder.isSupported = function (image, xref, res, pdfFunctionFactory) { - var dict = image.dict; - - if (dict.has('DecodeParms') || dict.has('DP')) { - return false; - } - - var cs = _colorspace.ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res, pdfFunctionFactory); - - return (cs.name === 'DeviceGray' || cs.name === 'DeviceRGB') && cs.isDefaultDecode(dict.getArray('Decode', 'D')); - }; - - NativeImageDecoder.isDecodable = function (image, xref, res, pdfFunctionFactory) { - var dict = image.dict; - - if (dict.has('DecodeParms') || dict.has('DP')) { - return false; - } - - var cs = _colorspace.ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res, pdfFunctionFactory); - - var bpc = dict.get('BitsPerComponent', 'BPC') || 1; - return (cs.numComps === 1 || cs.numComps === 3) && cs.isDefaultDecode(dict.getArray('Decode', 'D'), bpc); - }; - - function PartialEvaluator(_ref3) { - var _this = this; - - var pdfManager = _ref3.pdfManager, - xref = _ref3.xref, - handler = _ref3.handler, - pageIndex = _ref3.pageIndex, - idFactory = _ref3.idFactory, - fontCache = _ref3.fontCache, - builtInCMapCache = _ref3.builtInCMapCache, - _ref3$options = _ref3.options, - options = _ref3$options === void 0 ? null : _ref3$options, - pdfFunctionFactory = _ref3.pdfFunctionFactory; - this.pdfManager = pdfManager; - this.xref = xref; this.handler = handler; this.pageIndex = pageIndex; this.idFactory = idFactory; @@ -30118,15 +30397,16 @@ var PartialEvaluator = function PartialEvaluatorClosure() { this.builtInCMapCache = builtInCMapCache; this.options = options || DefaultPartialEvaluatorOptions; this.pdfFunctionFactory = pdfFunctionFactory; + this.parsingType3Font = false; this.fetchBuiltInCMap = /*#__PURE__*/ function () { - var _ref4 = _asyncToGenerator( + var _ref2 = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee(name) { + _regenerator["default"].mark(function _callee(name) { var data; - return _regenerator.default.wrap(function _callee$(_context) { + return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: @@ -30157,11 +30437,11 @@ var PartialEvaluator = function PartialEvaluatorClosure() { return _context.stop(); } } - }, _callee, this); + }, _callee); })); return function (_x) { - return _ref4.apply(this, arguments); + return _ref2.apply(this, arguments); }; }(); } @@ -30393,154 +30673,213 @@ var PartialEvaluator = function PartialEvaluatorClosure() { } }); }, - buildPaintImageXObject: function buildPaintImageXObject(_ref5) { - var _this2 = this; + buildPaintImageXObject: function () { + var _buildPaintImageXObject = _asyncToGenerator( + /*#__PURE__*/ + _regenerator["default"].mark(function _callee2(_ref3) { + var _this2 = this; - var resources = _ref5.resources, - image = _ref5.image, - _ref5$isInline = _ref5.isInline, - isInline = _ref5$isInline === void 0 ? false : _ref5$isInline, - operatorList = _ref5.operatorList, - cacheKey = _ref5.cacheKey, - imageCache = _ref5.imageCache, - _ref5$forceDisableNat = _ref5.forceDisableNativeImageDecoder, - forceDisableNativeImageDecoder = _ref5$forceDisableNat === void 0 ? false : _ref5$forceDisableNat; - var dict = image.dict; - var w = dict.get('Width', 'W'); - var h = dict.get('Height', 'H'); + var resources, image, _ref3$isInline, isInline, operatorList, cacheKey, imageCache, _ref3$forceDisableNat, forceDisableNativeImageDecoder, dict, w, h, maxImageSize, imageMask, imgData, args, width, height, bitStrideLength, imgArray, decode, softMask, mask, SMALL_IMAGE_DIMENSIONS, imageObj, nativeImageDecoderSupport, objId, nativeImageDecoder, imgPromise; - if (!(w && (0, _util.isNum)(w)) || !(h && (0, _util.isNum)(h))) { - (0, _util.warn)('Image dimensions are missing, or not numbers.'); - return Promise.resolve(); - } + return _regenerator["default"].wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + resources = _ref3.resources, image = _ref3.image, _ref3$isInline = _ref3.isInline, isInline = _ref3$isInline === void 0 ? false : _ref3$isInline, operatorList = _ref3.operatorList, cacheKey = _ref3.cacheKey, imageCache = _ref3.imageCache, _ref3$forceDisableNat = _ref3.forceDisableNativeImageDecoder, forceDisableNativeImageDecoder = _ref3$forceDisableNat === void 0 ? false : _ref3$forceDisableNat; + dict = image.dict; + w = dict.get('Width', 'W'); + h = dict.get('Height', 'H'); - var maxImageSize = this.options.maxImageSize; + if (!(!(w && (0, _util.isNum)(w)) || !(h && (0, _util.isNum)(h)))) { + _context2.next = 7; + break; + } - if (maxImageSize !== -1 && w * h > maxImageSize) { - (0, _util.warn)('Image exceeded maximum allowed size and was removed.'); - return Promise.resolve(); - } + (0, _util.warn)('Image dimensions are missing, or not numbers.'); + return _context2.abrupt("return", undefined); - var imageMask = dict.get('ImageMask', 'IM') || false; - var imgData, args; + case 7: + maxImageSize = this.options.maxImageSize; - if (imageMask) { - var width = dict.get('Width', 'W'); - var height = dict.get('Height', 'H'); - var bitStrideLength = width + 7 >> 3; - var imgArray = image.getBytes(bitStrideLength * height, true); - var decode = dict.getArray('Decode', 'D'); - imgData = _image.PDFImage.createMask({ - imgArray: imgArray, - width: width, - height: height, - imageIsFromDecodeStream: image instanceof _stream.DecodeStream, - inverseDecode: !!decode && decode[0] > 0 - }); - imgData.cached = true; - args = [imgData]; - operatorList.addOp(_util.OPS.paintImageMaskXObject, args); - - if (cacheKey) { - imageCache[cacheKey] = { - fn: _util.OPS.paintImageMaskXObject, - args: args - }; - } + if (!(maxImageSize !== -1 && w * h > maxImageSize)) { + _context2.next = 11; + break; + } - return Promise.resolve(); - } + (0, _util.warn)('Image exceeded maximum allowed size and was removed.'); + return _context2.abrupt("return", undefined); - var softMask = dict.get('SMask', 'SM') || false; - var mask = dict.get('Mask') || false; - var SMALL_IMAGE_DIMENSIONS = 200; + case 11: + imageMask = dict.get('ImageMask', 'IM') || false; - if (isInline && !softMask && !mask && !(image instanceof _jpeg_stream.JpegStream) && w + h < SMALL_IMAGE_DIMENSIONS) { - var imageObj = new _image.PDFImage({ - xref: this.xref, - res: resources, - image: image, - isInline: isInline, - pdfFunctionFactory: this.pdfFunctionFactory - }); - imgData = imageObj.createImageData(true); - operatorList.addOp(_util.OPS.paintInlineImageXObject, [imgData]); - return Promise.resolve(); - } + if (!imageMask) { + _context2.next = 24; + break; + } - var nativeImageDecoderSupport = forceDisableNativeImageDecoder ? _util.NativeImageDecoding.NONE : this.options.nativeImageDecoderSupport; - var objId = 'img_' + this.idFactory.createObjId(); + width = dict.get('Width', 'W'); + height = dict.get('Height', 'H'); + bitStrideLength = width + 7 >> 3; + imgArray = image.getBytes(bitStrideLength * height, true); + decode = dict.getArray('Decode', 'D'); + imgData = _image.PDFImage.createMask({ + imgArray: imgArray, + width: width, + height: height, + imageIsFromDecodeStream: image instanceof _stream.DecodeStream, + inverseDecode: !!decode && decode[0] > 0 + }); + imgData.cached = !!cacheKey; + args = [imgData]; + operatorList.addOp(_util.OPS.paintImageMaskXObject, args); + + if (cacheKey) { + imageCache[cacheKey] = { + fn: _util.OPS.paintImageMaskXObject, + args: args + }; + } - if (nativeImageDecoderSupport !== _util.NativeImageDecoding.NONE && !softMask && !mask && image instanceof _jpeg_stream.JpegStream && NativeImageDecoder.isSupported(image, this.xref, resources, this.pdfFunctionFactory)) { - return this.handler.sendWithPromise('obj', [objId, this.pageIndex, 'JpegStream', image.getIR(this.options.forceDataSchema)]).then(function () { - operatorList.addDependency(objId); - args = [objId, w, h]; - operatorList.addOp(_util.OPS.paintJpegXObject, args); + return _context2.abrupt("return", undefined); - if (cacheKey) { - imageCache[cacheKey] = { - fn: _util.OPS.paintJpegXObject, - args: args - }; - } - }, function (reason) { - (0, _util.warn)('Native JPEG decoding failed -- trying to recover: ' + (reason && reason.message)); - return _this2.buildPaintImageXObject({ - resources: resources, - image: image, - isInline: isInline, - operatorList: operatorList, - cacheKey: cacheKey, - imageCache: imageCache, - forceDisableNativeImageDecoder: true - }); - }); - } + case 24: + softMask = dict.get('SMask', 'SM') || false; + mask = dict.get('Mask') || false; + SMALL_IMAGE_DIMENSIONS = 200; - var nativeImageDecoder = null; + if (!(isInline && !softMask && !mask && !(image instanceof _jpeg_stream.JpegStream) && w + h < SMALL_IMAGE_DIMENSIONS)) { + _context2.next = 32; + break; + } - if (nativeImageDecoderSupport === _util.NativeImageDecoding.DECODE && (image instanceof _jpeg_stream.JpegStream || mask instanceof _jpeg_stream.JpegStream || softMask instanceof _jpeg_stream.JpegStream)) { - nativeImageDecoder = new NativeImageDecoder({ - xref: this.xref, - resources: resources, - handler: this.handler, - forceDataSchema: this.options.forceDataSchema, - pdfFunctionFactory: this.pdfFunctionFactory - }); - } + imageObj = new _image.PDFImage({ + xref: this.xref, + res: resources, + image: image, + isInline: isInline, + pdfFunctionFactory: this.pdfFunctionFactory + }); + imgData = imageObj.createImageData(true); + operatorList.addOp(_util.OPS.paintInlineImageXObject, [imgData]); + return _context2.abrupt("return", undefined); - operatorList.addDependency(objId); - args = [objId, w, h]; + case 32: + nativeImageDecoderSupport = forceDisableNativeImageDecoder ? _util.NativeImageDecoding.NONE : this.options.nativeImageDecoderSupport; + objId = "img_".concat(this.idFactory.createObjId()); - _image.PDFImage.buildImage({ - handler: this.handler, - xref: this.xref, - res: resources, - image: image, - isInline: isInline, - nativeDecoder: nativeImageDecoder, - pdfFunctionFactory: this.pdfFunctionFactory - }).then(function (imageObj) { - var imgData = imageObj.createImageData(false); + if (this.parsingType3Font) { + (0, _util.assert)(nativeImageDecoderSupport === _util.NativeImageDecoding.NONE, 'Type3 image resources should be completely decoded in the worker.'); + objId = "".concat(this.idFactory.getDocId(), "_type3res_").concat(objId); + } + + if (!(nativeImageDecoderSupport !== _util.NativeImageDecoding.NONE && !softMask && !mask && image instanceof _jpeg_stream.JpegStream && _image_utils.NativeImageDecoder.isSupported(image, this.xref, resources, this.pdfFunctionFactory))) { + _context2.next = 37; + break; + } - _this2.handler.send('obj', [objId, _this2.pageIndex, 'Image', imgData], [imgData.data.buffer]); - }).catch(function (reason) { - (0, _util.warn)('Unable to decode image: ' + reason); + return _context2.abrupt("return", this.handler.sendWithPromise('obj', [objId, this.pageIndex, 'JpegStream', image.getIR(this.options.forceDataSchema)]).then(function () { + operatorList.addDependency(objId); + args = [objId, w, h]; + operatorList.addOp(_util.OPS.paintJpegXObject, args); - _this2.handler.send('obj', [objId, _this2.pageIndex, 'Image', null]); - }); + if (cacheKey) { + imageCache[cacheKey] = { + fn: _util.OPS.paintJpegXObject, + args: args + }; + } + }, function (reason) { + (0, _util.warn)('Native JPEG decoding failed -- trying to recover: ' + (reason && reason.message)); + return _this2.buildPaintImageXObject({ + resources: resources, + image: image, + isInline: isInline, + operatorList: operatorList, + cacheKey: cacheKey, + imageCache: imageCache, + forceDisableNativeImageDecoder: true + }); + })); - operatorList.addOp(_util.OPS.paintImageXObject, args); + case 37: + nativeImageDecoder = null; - if (cacheKey) { - imageCache[cacheKey] = { - fn: _util.OPS.paintImageXObject, - args: args - }; + if (nativeImageDecoderSupport === _util.NativeImageDecoding.DECODE && (image instanceof _jpeg_stream.JpegStream || mask instanceof _jpeg_stream.JpegStream || softMask instanceof _jpeg_stream.JpegStream)) { + nativeImageDecoder = new _image_utils.NativeImageDecoder({ + xref: this.xref, + resources: resources, + handler: this.handler, + forceDataSchema: this.options.forceDataSchema, + pdfFunctionFactory: this.pdfFunctionFactory + }); + } + + operatorList.addDependency(objId); + args = [objId, w, h]; + imgPromise = _image.PDFImage.buildImage({ + handler: this.handler, + xref: this.xref, + res: resources, + image: image, + isInline: isInline, + nativeDecoder: nativeImageDecoder, + pdfFunctionFactory: this.pdfFunctionFactory + }).then(function (imageObj) { + var imgData = imageObj.createImageData(false); + + if (_this2.parsingType3Font) { + return _this2.handler.sendWithPromise('commonobj', [objId, 'FontType3Res', imgData], [imgData.data.buffer]); + } + + _this2.handler.send('obj', [objId, _this2.pageIndex, 'Image', imgData], [imgData.data.buffer]); + + return undefined; + })["catch"](function (reason) { + (0, _util.warn)('Unable to decode image: ' + reason); + + if (_this2.parsingType3Font) { + return _this2.handler.sendWithPromise('commonobj', [objId, 'FontType3Res', null]); + } + + _this2.handler.send('obj', [objId, _this2.pageIndex, 'Image', null]); + + return undefined; + }); + + if (!this.parsingType3Font) { + _context2.next = 45; + break; + } + + _context2.next = 45; + return imgPromise; + + case 45: + operatorList.addOp(_util.OPS.paintImageXObject, args); + + if (cacheKey) { + imageCache[cacheKey] = { + fn: _util.OPS.paintImageXObject, + args: args + }; + } + + return _context2.abrupt("return", undefined); + + case 48: + case "end": + return _context2.stop(); + } + } + }, _callee2, this); + })); + + function buildPaintImageXObject(_x2) { + return _buildPaintImageXObject.apply(this, arguments); } - return Promise.resolve(); - }, + return buildPaintImageXObject; + }(), handleSMask: function PartialEvaluator_handleSmask(smask, resources, operatorList, task, stateManager) { var smaskContent = smask.get('G'); var smaskOptions = { @@ -30616,7 +30955,7 @@ var PartialEvaluator = function PartialEvaluatorClosure() { return translated.loadType3Data(_this4, resources, operatorList, task).then(function () { return translated; - }).catch(function (reason) { + })["catch"](function (reason) { _this4.handler.send('UnsupportedFeature', { featureId: _util.UNSUPPORTED_FEATURES.font }); @@ -30781,7 +31120,8 @@ var PartialEvaluator = function PartialEvaluatorClosure() { var fontCapability = (0, _util.createPromiseCapability)(); var preEvaluatedFont = this.preEvaluateFont(font); - var descriptor = preEvaluatedFont.descriptor; + var descriptor = preEvaluatedFont.descriptor, + hash = preEvaluatedFont.hash; var fontRefIsRef = (0, _primitives.isRef)(fontRef), fontID; @@ -30789,13 +31129,12 @@ var PartialEvaluator = function PartialEvaluatorClosure() { fontID = fontRef.toString(); } - if ((0, _primitives.isDict)(descriptor)) { + if (hash && (0, _primitives.isDict)(descriptor)) { if (!descriptor.fontAliases) { descriptor.fontAliases = Object.create(null); } var fontAliases = descriptor.fontAliases; - var hash = preEvaluatedFont.hash; if (fontAliases[hash]) { var aliasFontRef = fontAliases[hash].aliasRef; @@ -30824,11 +31163,11 @@ var PartialEvaluator = function PartialEvaluatorClosure() { fontID = this.idFactory.createObjId(); } - this.fontCache.put('id_' + fontID, fontCapability.promise); + this.fontCache.put("id_".concat(fontID), fontCapability.promise); } (0, _util.assert)(fontID, 'The "fontID" must be defined.'); - font.loadedName = 'g_' + this.pdfManager.docId + '_f' + fontID; + font.loadedName = "".concat(this.idFactory.getDocId(), "_f").concat(fontID); font.translated = fontCapability.promise; var translatedPromise; @@ -30845,13 +31184,12 @@ var PartialEvaluator = function PartialEvaluatorClosure() { } fontCapability.resolve(new TranslatedFont(font.loadedName, translatedFont, font)); - }).catch(function (reason) { + })["catch"](function (reason) { _this6.handler.send('UnsupportedFeature', { featureId: _util.UNSUPPORTED_FEATURES.font }); try { - var descriptor = preEvaluatedFont.descriptor; var fontFile3 = descriptor && descriptor.get('FontFile3'); var subtype = fontFile3 && fontFile3.get('Subtype'); var fontType = (0, _fonts.getFontType)(preEvaluatedFont.type, subtype && subtype.name); @@ -30863,7 +31201,8 @@ var PartialEvaluator = function PartialEvaluatorClosure() { }); return fontCapability.promise; }, - buildPath: function PartialEvaluator_buildPath(operatorList, fn, args) { + buildPath: function buildPath(operatorList, fn, args) { + var parsingText = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; var lastIndex = operatorList.length - 1; if (!args) { @@ -30871,47 +31210,90 @@ var PartialEvaluator = function PartialEvaluatorClosure() { } if (lastIndex < 0 || operatorList.fnArray[lastIndex] !== _util.OPS.constructPath) { + if (parsingText) { + (0, _util.warn)("Encountered path operator \"".concat(fn, "\" inside of a text object.")); + operatorList.addOp(_util.OPS.save, null); + } + operatorList.addOp(_util.OPS.constructPath, [[fn], args]); + + if (parsingText) { + operatorList.addOp(_util.OPS.restore, null); + } } else { var opArgs = operatorList.argsArray[lastIndex]; opArgs[0].push(fn); Array.prototype.push.apply(opArgs[1], args); } }, - handleColorN: function PartialEvaluator_handleColorN(operatorList, fn, args, cs, patterns, resources, task) { - var patternName = args[args.length - 1]; - var pattern; + handleColorN: function () { + var _handleColorN = _asyncToGenerator( + /*#__PURE__*/ + _regenerator["default"].mark(function _callee3(operatorList, fn, args, cs, patterns, resources, task) { + var patternName, pattern, dict, typeNum, color, shading, matrix; + return _regenerator["default"].wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + patternName = args[args.length - 1]; - if ((0, _primitives.isName)(patternName) && (pattern = patterns.get(patternName.name))) { - var dict = (0, _primitives.isStream)(pattern) ? pattern.dict : pattern; - var typeNum = dict.get('PatternType'); + if (!((0, _primitives.isName)(patternName) && (pattern = patterns.get(patternName.name)))) { + _context3.next = 16; + break; + } - if (typeNum === TILING_PATTERN) { - var color = cs.base ? cs.base.getRgb(args, 0) : null; - return this.handleTilingType(fn, color, resources, pattern, dict, operatorList, task); - } else if (typeNum === SHADING_PATTERN) { - var shading = dict.get('Shading'); - var matrix = dict.getArray('Matrix'); - pattern = _pattern.Pattern.parseShading(shading, matrix, this.xref, resources, this.handler, this.pdfFunctionFactory); - operatorList.addOp(fn, pattern.getIR()); - return Promise.resolve(); - } + dict = (0, _primitives.isStream)(pattern) ? pattern.dict : pattern; + typeNum = dict.get('PatternType'); + + if (!(typeNum === TILING_PATTERN)) { + _context3.next = 9; + break; + } + + color = cs.base ? cs.base.getRgb(args, 0) : null; + return _context3.abrupt("return", this.handleTilingType(fn, color, resources, pattern, dict, operatorList, task)); - return Promise.reject(new Error('Unknown PatternType: ' + typeNum)); + case 9: + if (!(typeNum === SHADING_PATTERN)) { + _context3.next = 15; + break; + } + + shading = dict.get('Shading'); + matrix = dict.getArray('Matrix'); + pattern = _pattern.Pattern.parseShading(shading, matrix, this.xref, resources, this.handler, this.pdfFunctionFactory); + operatorList.addOp(fn, pattern.getIR()); + return _context3.abrupt("return", undefined); + + case 15: + throw new _util.FormatError("Unknown PatternType: ".concat(typeNum)); + + case 16: + throw new _util.FormatError("Unknown PatternName: ".concat(patternName)); + + case 17: + case "end": + return _context3.stop(); + } + } + }, _callee3, this); + })); + + function handleColorN(_x3, _x4, _x5, _x6, _x7, _x8, _x9) { + return _handleColorN.apply(this, arguments); } - operatorList.addOp(fn, args); - return Promise.resolve(); - }, - getOperatorList: function getOperatorList(_ref6) { + return handleColorN; + }(), + getOperatorList: function getOperatorList(_ref4) { var _this7 = this; - var stream = _ref6.stream, - task = _ref6.task, - resources = _ref6.resources, - operatorList = _ref6.operatorList, - _ref6$initialState = _ref6.initialState, - initialState = _ref6$initialState === void 0 ? null : _ref6$initialState; + var stream = _ref4.stream, + task = _ref4.task, + resources = _ref4.resources, + operatorList = _ref4.operatorList, + _ref4$initialState = _ref4.initialState, + initialState = _ref4$initialState === void 0 ? null : _ref4$initialState; resources = resources || _primitives.Dict.empty; initialState = initialState || new EvalState(); @@ -30921,6 +31303,7 @@ var PartialEvaluator = function PartialEvaluatorClosure() { var self = this; var xref = this.xref; + var parsingText = false; var imageCache = Object.create(null); var xobjs = resources.get('XObject') || _primitives.Dict.empty; @@ -31022,7 +31405,7 @@ var PartialEvaluator = function PartialEvaluatorClosure() { } resolveXObject(); - }).catch(function (reason) { + })["catch"](function (reason) { if (self.options.ignoreErrors) { self.handler.send('UnsupportedFeature', { featureId: _util.UNSUPPORTED_FEATURES.unknown @@ -31043,6 +31426,14 @@ var PartialEvaluator = function PartialEvaluatorClosure() { })); return; + case _util.OPS.beginText: + parsingText = true; + break; + + case _util.OPS.endText: + parsingText = false; + break; + case _util.OPS.endInlineImage: var cacheKey = args[0].cacheKey; @@ -31224,11 +31615,8 @@ var PartialEvaluator = function PartialEvaluatorClosure() { case _util.OPS.curveTo2: case _util.OPS.curveTo3: case _util.OPS.closePath: - self.buildPath(operatorList, fn, args); - continue; - case _util.OPS.rectangle: - self.buildPath(operatorList, fn, args); + self.buildPath(operatorList, fn, args, parsingText); continue; case _util.OPS.markPoint: @@ -31266,7 +31654,7 @@ var PartialEvaluator = function PartialEvaluatorClosure() { closePendingRestoreOPS(); resolve(); - }).catch(function (reason) { + })["catch"](function (reason) { if (_this7.options.ignoreErrors) { _this7.handler.send('UnsupportedFeature', { featureId: _util.UNSUPPORTED_FEATURES.unknown @@ -31280,21 +31668,21 @@ var PartialEvaluator = function PartialEvaluatorClosure() { throw reason; }); }, - getTextContent: function getTextContent(_ref7) { + getTextContent: function getTextContent(_ref5) { var _this8 = this; - var stream = _ref7.stream, - task = _ref7.task, - resources = _ref7.resources, - _ref7$stateManager = _ref7.stateManager, - stateManager = _ref7$stateManager === void 0 ? null : _ref7$stateManager, - _ref7$normalizeWhites = _ref7.normalizeWhitespace, - normalizeWhitespace = _ref7$normalizeWhites === void 0 ? false : _ref7$normalizeWhites, - _ref7$combineTextItem = _ref7.combineTextItems, - combineTextItems = _ref7$combineTextItem === void 0 ? false : _ref7$combineTextItem, - sink = _ref7.sink, - _ref7$seenStyles = _ref7.seenStyles, - seenStyles = _ref7$seenStyles === void 0 ? Object.create(null) : _ref7$seenStyles; + var stream = _ref5.stream, + task = _ref5.task, + resources = _ref5.resources, + _ref5$stateManager = _ref5.stateManager, + stateManager = _ref5$stateManager === void 0 ? null : _ref5$stateManager, + _ref5$normalizeWhites = _ref5.normalizeWhitespace, + normalizeWhitespace = _ref5$normalizeWhites === void 0 ? false : _ref5$normalizeWhites, + _ref5$combineTextItem = _ref5.combineTextItems, + combineTextItems = _ref5$combineTextItem === void 0 ? false : _ref5$combineTextItem, + sink = _ref5.sink, + _ref5$seenStyles = _ref5.seenStyles, + seenStyles = _ref5$seenStyles === void 0 ? Object.create(null) : _ref5$seenStyles; resources = resources || _primitives.Dict.empty; stateManager = stateManager || new StateManager(new TextState()); var WhitespaceRegexp = /\s/g; @@ -31349,12 +31737,11 @@ var PartialEvaluator = function PartialEvaluatorClosure() { textContentItem.fontName = font.loadedName; var tsm = [textState.fontSize * textState.textHScale, 0, 0, textState.fontSize, 0, textState.textRise]; - if (font.isType3Font && textState.fontMatrix !== _util.FONT_IDENTITY_MATRIX && textState.fontSize === 1) { + if (font.isType3Font && textState.fontSize <= 1 && !(0, _util.isArrayEqual)(textState.fontMatrix, _util.FONT_IDENTITY_MATRIX)) { var glyphHeight = font.bbox[3] - font.bbox[1]; if (glyphHeight > 0) { - glyphHeight = glyphHeight * textState.fontMatrix[3]; - tsm[3] *= glyphHeight; + tsm[3] *= glyphHeight * textState.fontMatrix[3]; } } @@ -31804,7 +32191,7 @@ var PartialEvaluator = function PartialEvaluatorClosure() { resolveXObject(); }, rejectXObject); - }).catch(function (reason) { + })["catch"](function (reason) { if (reason instanceof _util.AbortException) { return; } @@ -31859,7 +32246,7 @@ var PartialEvaluator = function PartialEvaluatorClosure() { flushTextContentItem(); enqueueChunk(); resolve(); - }).catch(function (reason) { + })["catch"](function (reason) { if (reason instanceof _util.AbortException) { return; } @@ -31877,7 +32264,8 @@ var PartialEvaluator = function PartialEvaluatorClosure() { extractDataStructures: function PartialEvaluator_extractDataStructures(dict, baseDict, properties) { var _this9 = this; - var xref = this.xref; + var xref = this.xref, + cidToGidBytes; var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode'); var toUnicodePromise = toUnicode ? this.readToUnicode(toUnicode) : Promise.resolve(undefined); @@ -31895,7 +32283,7 @@ var PartialEvaluator = function PartialEvaluatorClosure() { var cidToGidMap = dict.get('CIDToGIDMap'); if ((0, _primitives.isStream)(cidToGidMap)) { - properties.cidToGidMap = this.readCidToGidMap(cidToGidMap); + cidToGidBytes = cidToGidMap.getBytes(); } } @@ -31972,6 +32360,11 @@ var PartialEvaluator = function PartialEvaluatorClosure() { return _this9.buildToUnicode(properties); }).then(function (toUnicode) { properties.toUnicode = toUnicode; + + if (cidToGidBytes) { + properties.cidToGidMap = _this9.readCidToGidMap(cidToGidBytes, toUnicode); + } + return properties; }); }, @@ -32152,18 +32545,17 @@ var PartialEvaluator = function PartialEvaluatorClosure() { return Promise.resolve(null); }, - readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) { - var glyphsData = cidToGidStream.getBytes(); + readCidToGidMap: function readCidToGidMap(glyphsData, toUnicode) { var result = []; for (var j = 0, jj = glyphsData.length; j < jj; j++) { var glyphID = glyphsData[j++] << 8 | glyphsData[j]; + var code = j >> 1; - if (glyphID === 0) { + if (glyphID === 0 && !toUnicode.has(code)) { continue; } - var code = j >> 1; result[code] = glyphID; } @@ -32398,6 +32790,9 @@ var PartialEvaluator = function PartialEvaluatorClosure() { } } + var firstChar = dict.get('FirstChar') || 0; + var lastChar = dict.get('LastChar') || (composite ? 0xFFFF : 0xFF); + hash.update("".concat(firstChar, "-").concat(lastChar)); var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode'); if ((0, _primitives.isStream)(toUnicode)) { @@ -32603,8 +32998,8 @@ var PartialEvaluator = function PartialEvaluatorClosure() { _iteratorError = err; } finally { try { - if (!_iteratorNormalCompletion && _iterator.return != null) { - _iterator.return(); + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); } } finally { if (_didIteratorError) { @@ -32657,7 +33052,9 @@ var TranslatedFont = function TranslatedFontClosure() { var type3Options = Object.create(evaluator.options); type3Options.ignoreErrors = false; + type3Options.nativeImageDecoderSupport = _util.NativeImageDecoding.NONE; var type3Evaluator = evaluator.clone(type3Options); + type3Evaluator.parsingType3Font = true; var translatedFont = this.font; var loadCharProcsPromise = Promise.resolve(); var charProcs = this.dict.get('CharProcs'); @@ -32678,7 +33075,7 @@ var TranslatedFont = function TranslatedFontClosure() { }).then(function () { charProcOperatorList[key] = operatorList.getIR(); parentOperatorList.addDependencies(operatorList.dependencies); - }).catch(function (reason) { + })["catch"](function (reason) { (0, _util.warn)("Type3 font resource \"".concat(key, "\" is not available.")); var operatorList = new _operator_list.OperatorList(); charProcOperatorList[key] = operatorList.getIR(); @@ -32845,7 +33242,7 @@ var EvalState = function EvalStateClosure() { }(); var EvaluatorPreprocessor = function EvaluatorPreprocessorClosure() { - var getOPMap = (0, _util.getLookupTableFactory)(function (t) { + var getOPMap = (0, _core_utils.getLookupTableFactory)(function (t) { t['w'] = { id: _util.OPS.setLineWidth, numArgs: 1, @@ -33226,7 +33623,10 @@ var EvaluatorPreprocessor = function EvaluatorPreprocessorClosure() { function EvaluatorPreprocessor(stream, xref, stateManager) { this.opMap = getOPMap(); - this.parser = new _parser.Parser(new _parser.Lexer(stream, this.opMap), false, xref); + this.parser = new _parser.Parser({ + lexer: new _parser.Lexer(stream, this.opMap), + xref: xref + }); this.stateManager = stateManager; this.nonProcessedArgs = []; this._numInvalidPathOPS = 0; @@ -33337,7 +33737,7 @@ var EvaluatorPreprocessor = function EvaluatorPreprocessorClosure() { }(); /***/ }), -/* 172 */ +/* 173 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -33348,13 +33748,15 @@ Object.defineProperty(exports, "__esModule", { }); exports.CMapFactory = exports.IdentityCMap = exports.CMap = void 0; -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); + +var _primitives = __w_pdfjs_require__(151); -var _primitives = __w_pdfjs_require__(155); +var _parser = __w_pdfjs_require__(157); -var _parser = __w_pdfjs_require__(156); +var _core_utils = __w_pdfjs_require__(154); -var _stream = __w_pdfjs_require__(157); +var _stream = __w_pdfjs_require__(158); function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } @@ -33774,7 +34176,9 @@ var BinaryCMapReader = function BinaryCMapReaderClosure() { var useCMap = null; var start = new Uint8Array(MAX_NUM_SIZE); var end = new Uint8Array(MAX_NUM_SIZE); - var char = new Uint8Array(MAX_NUM_SIZE); + + var _char = new Uint8Array(MAX_NUM_SIZE); + var charCode = new Uint8Array(MAX_NUM_SIZE); var tmp = new Uint8Array(MAX_NUM_SIZE); var code; @@ -33844,20 +34248,20 @@ var BinaryCMapReader = function BinaryCMapReaderClosure() { break; case 2: - stream.readHex(char, dataSize); + stream.readHex(_char, dataSize); code = stream.readNumber(); - cMap.mapOne(hexToInt(char, dataSize), code); + cMap.mapOne(hexToInt(_char, dataSize), code); for (i = 1; i < subitemsCount; i++) { - incHex(char, dataSize); + incHex(_char, dataSize); if (!sequence) { stream.readHexNumber(tmp, dataSize); - addHex(char, tmp, dataSize); + addHex(_char, tmp, dataSize); } code = stream.readSigned() + (code + 1); - cMap.mapOne(hexToInt(char, dataSize), code); + cMap.mapOne(hexToInt(_char, dataSize), code); } break; @@ -33888,22 +34292,22 @@ var BinaryCMapReader = function BinaryCMapReaderClosure() { break; case 4: - stream.readHex(char, ucs2DataSize); + stream.readHex(_char, ucs2DataSize); stream.readHex(charCode, dataSize); - cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize)); + cMap.mapOne(hexToInt(_char, ucs2DataSize), hexToStr(charCode, dataSize)); for (i = 1; i < subitemsCount; i++) { - incHex(char, ucs2DataSize); + incHex(_char, ucs2DataSize); if (!sequence) { stream.readHexNumber(tmp, ucs2DataSize); - addHex(char, tmp, ucs2DataSize); + addHex(_char, tmp, ucs2DataSize); } incHex(charCode, dataSize); stream.readHexSigned(tmp, dataSize); addHex(charCode, tmp, dataSize); - cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize)); + cMap.mapOne(hexToInt(_char, ucs2DataSize), hexToStr(charCode, dataSize)); } break; @@ -34183,7 +34587,7 @@ var CMapFactory = function CMapFactoryClosure() { } } } catch (ex) { - if (ex instanceof _util.MissingDataException) { + if (ex instanceof _core_utils.MissingDataException) { throw ex; } @@ -34289,7 +34693,7 @@ var CMapFactory = function CMapFactoryClosure() { exports.CMapFactory = CMapFactory; /***/ }), -/* 173 */ +/* 174 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -34301,25 +34705,27 @@ Object.defineProperty(exports, "__esModule", { exports.getFontType = getFontType; exports.IdentityToUnicodeMap = exports.ToUnicodeMap = exports.FontFlags = exports.Font = exports.ErrorFont = exports.SEAC_ANALYSIS_ENABLED = void 0; -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); -var _cff_parser = __w_pdfjs_require__(174); +var _cff_parser = __w_pdfjs_require__(175); -var _glyphlist = __w_pdfjs_require__(177); +var _glyphlist = __w_pdfjs_require__(178); -var _encodings = __w_pdfjs_require__(176); +var _encodings = __w_pdfjs_require__(177); -var _standard_fonts = __w_pdfjs_require__(178); +var _standard_fonts = __w_pdfjs_require__(179); -var _unicode = __w_pdfjs_require__(179); +var _unicode = __w_pdfjs_require__(180); -var _font_renderer = __w_pdfjs_require__(180); +var _font_renderer = __w_pdfjs_require__(181); -var _cmap = __w_pdfjs_require__(172); +var _cmap = __w_pdfjs_require__(173); -var _stream = __w_pdfjs_require__(157); +var _core_utils = __w_pdfjs_require__(154); -var _type1_parser = __w_pdfjs_require__(181); +var _stream = __w_pdfjs_require__(158); + +var _type1_parser = __w_pdfjs_require__(182); function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } @@ -35696,7 +36102,7 @@ var Font = function FontClosure() { }; } - function sanitizeMetrics(font, header, metrics, numGlyphs) { + function sanitizeMetrics(font, header, metrics, numGlyphs, dupFirstEntry) { if (!header) { if (metrics) { metrics.data = null; @@ -35734,6 +36140,12 @@ var Font = function FontClosure() { if (numMissing > 0) { var entries = new Uint8Array(metrics.length + numMissing * 2); entries.set(metrics.data); + + if (dupFirstEntry) { + entries[metrics.length] = metrics.data[2]; + entries[metrics.length + 1] = metrics.data[3]; + } + metrics.data = entries; } } @@ -36489,7 +36901,7 @@ var Font = function FontClosure() { delete tables['cvt ']; } - sanitizeMetrics(font, tables['hhea'], tables['hmtx'], numGlyphsOut); + sanitizeMetrics(font, tables['hhea'], tables['hmtx'], numGlyphsOut, dupFirstEntry); if (!tables['head']) { throw new _util.FormatError('Required "head" table is not found'); @@ -37105,7 +37517,7 @@ var Type1Font = function Type1FontClosure() { headerBytes = stream.getBytes(suggestedLength); headerBytesLength = headerBytes.length; } catch (ex) { - if (ex instanceof _util.MissingDataException) { + if (ex instanceof _core_utils.MissingDataException) { throw ex; } } @@ -37329,20 +37741,22 @@ var Type1Font = function Type1FontClosure() { cff.strings = strings; cff.globalSubrIndex = new _cff_parser.CFFIndex(); var count = glyphs.length; - var charsetArray = [0]; + var charsetArray = ['.notdef']; var i, ii; for (i = 0; i < count; i++) { - var index = _cff_parser.CFFStandardStrings.indexOf(charstrings[i].glyphName); + var glyphName = charstrings[i].glyphName; + + var index = _cff_parser.CFFStandardStrings.indexOf(glyphName); if (index === -1) { - index = 0; + strings.add(glyphName); } - charsetArray.push(index >> 8 & 0xff, index & 0xff); + charsetArray.push(glyphName); } - cff.charset = new _cff_parser.CFFCharset(false, 0, [], charsetArray); + cff.charset = new _cff_parser.CFFCharset(false, 0, charsetArray); var charStringsIndex = new _cff_parser.CFFIndex(); charStringsIndex.add([0x8B, 0x0E]); @@ -37422,16 +37836,18 @@ var CFFFont = function CFFFontClosure() { if (properties.composite) { charCodeToGlyphId = Object.create(null); + var charCode; if (cff.isCIDFont) { for (glyphId = 0; glyphId < charsets.length; glyphId++) { var cid = charsets[glyphId]; - var charCode = properties.cMap.charCodeOf(cid); + charCode = properties.cMap.charCodeOf(cid); charCodeToGlyphId[charCode] = glyphId; } } else { for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) { - charCodeToGlyphId[glyphId] = glyphId; + charCode = properties.cMap.charCodeOf(glyphId); + charCodeToGlyphId[charCode] = glyphId; } } @@ -37450,7 +37866,7 @@ var CFFFont = function CFFFontClosure() { }(); /***/ }), -/* 174 */ +/* 175 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -37461,15 +37877,16 @@ Object.defineProperty(exports, "__esModule", { }); exports.CFFFDSelect = exports.CFFCompiler = exports.CFFPrivateDict = exports.CFFTopDict = exports.CFFCharset = exports.CFFIndex = exports.CFFStrings = exports.CFFHeader = exports.CFF = exports.CFFParser = exports.CFFStandardStrings = void 0; -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); -var _charsets = __w_pdfjs_require__(175); +var _charsets = __w_pdfjs_require__(176); -var _encodings = __w_pdfjs_require__(176); +var _encodings = __w_pdfjs_require__(177); var MAX_SUBR_NESTING = 10; var CFFStandardStrings = ['.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl', 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003', 'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold']; exports.CFFStandardStrings = CFFStandardStrings; +var NUM_STANDARD_CFF_STRINGS = 391; var CFFParser = function CFFParserClosure() { var CharstringValidationData = [null, { @@ -38466,16 +38883,31 @@ var CFFStrings = function CFFStringsClosure() { CFFStrings.prototype = { get: function CFFStrings_get(index) { - if (index >= 0 && index <= 390) { + if (index >= 0 && index <= NUM_STANDARD_CFF_STRINGS - 1) { return CFFStandardStrings[index]; } - if (index - 391 <= this.strings.length) { - return this.strings[index - 391]; + if (index - NUM_STANDARD_CFF_STRINGS <= this.strings.length) { + return this.strings[index - NUM_STANDARD_CFF_STRINGS]; } return CFFStandardStrings[0]; }, + getSID: function CFFStrings_getSID(str) { + var index = CFFStandardStrings.indexOf(str); + + if (index !== -1) { + return index; + } + + index = this.strings.indexOf(str); + + if (index !== -1) { + return index + NUM_STANDARD_CFF_STRINGS; + } + + return -1; + }, add: function CFFStrings_add(value) { this.strings.push(value); }, @@ -38812,7 +39244,7 @@ var CFFCompiler = function CFFCompilerClosure() { } } - var charset = this.compileCharset(cff.charset); + var charset = this.compileCharset(cff.charset, cff.charStrings.count, cff.strings, cff.isCIDFont); topDictTracker.setEntryLocation('charset', [output.length], output); output.add(charset); var charStrings = this.compileCharStrings(cff.charStrings); @@ -38907,13 +39339,13 @@ var CFFCompiler = function CFFCompilerClosure() { var sanitizedName = new Array(length); for (var j = 0; j < length; j++) { - var char = name[j]; + var _char = name[j]; - if (char < '!' || char > '~' || char === '[' || char === ']' || char === '(' || char === ')' || char === '{' || char === '}' || char === '<' || char === '>' || char === '/' || char === '%') { - char = '_'; + if (_char < '!' || _char > '~' || _char === '[' || _char === ']' || _char === '(' || _char === ')' || _char === '{' || _char === '}' || _char === '<' || _char === '>' || _char === '/' || _char === '%') { + _char = '_'; } - sanitizedName[j] = char; + sanitizedName[j] = _char; } sanitizedName = sanitizedName.join(''); @@ -39078,9 +39510,42 @@ var CFFCompiler = function CFFCompilerClosure() { return this.compileIndex(charStringsIndex); }, - compileCharset: function CFFCompiler_compileCharset(charset) { - var length = 1 + (this.cff.charStrings.count - 1) * 2; - var out = new Uint8Array(length); + compileCharset: function CFFCompiler_compileCharset(charset, numGlyphs, strings, isCIDFont) { + var out; + var numGlyphsLessNotDef = numGlyphs - 1; + + if (isCIDFont) { + out = new Uint8Array([2, 0, 0, numGlyphsLessNotDef >> 8 & 0xFF, numGlyphsLessNotDef & 0xFF]); + } else { + var length = 1 + numGlyphsLessNotDef * 2; + out = new Uint8Array(length); + out[0] = 0; + var charsetIndex = 0; + var numCharsets = charset.charset.length; + var warned = false; + + for (var i = 1; i < out.length; i += 2) { + var sid = 0; + + if (charsetIndex < numCharsets) { + var name = charset.charset[charsetIndex++]; + sid = strings.getSID(name); + + if (sid === -1) { + sid = 0; + + if (!warned) { + warned = true; + (0, _util.warn)("Couldn't find ".concat(name, " in CFF strings")); + } + } + } + + out[i] = sid >> 8 & 0xFF; + out[i + 1] = sid & 0xFF; + } + } + return this.compileTypedArray(out); }, compileEncoding: function CFFCompiler_compileEncoding(encoding) { @@ -39201,7 +39666,7 @@ var CFFCompiler = function CFFCompilerClosure() { exports.CFFCompiler = CFFCompiler; /***/ }), -/* 175 */ +/* 176 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -39219,7 +39684,7 @@ var ExpertSubsetCharset = ['.notdef', 'space', 'dollaroldstyle', 'dollarsuperior exports.ExpertSubsetCharset = ExpertSubsetCharset; /***/ }), -/* 176 */ +/* 177 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -39273,10 +39738,10 @@ function getEncoding(encodingName) { } /***/ }), -/* 177 */ +/* 178 */ /***/ (function(module, exports, __w_pdfjs_require__) { -var getLookupTableFactory = __w_pdfjs_require__(6).getLookupTableFactory; +var getLookupTableFactory = __w_pdfjs_require__(154).getLookupTableFactory; var getGlyphsUnicode = getLookupTableFactory(function (t) { t['A'] = 0x0041; t['AE'] = 0x00C6; @@ -43809,7 +44274,7 @@ exports.getGlyphsUnicode = getGlyphsUnicode; exports.getDingbatsGlyphsUnicode = getDingbatsGlyphsUnicode; /***/ }), -/* 178 */ +/* 179 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -43820,9 +44285,9 @@ Object.defineProperty(exports, "__esModule", { }); exports.getSupplementalGlyphMapForCalibri = exports.getSupplementalGlyphMapForArialBlack = exports.getGlyphMapForStandardFonts = exports.getSymbolsFonts = exports.getSerifFonts = exports.getNonStdFontMap = exports.getStdFontMap = void 0; -var _util = __w_pdfjs_require__(6); +var _core_utils = __w_pdfjs_require__(154); -var getStdFontMap = (0, _util.getLookupTableFactory)(function (t) { +var getStdFontMap = (0, _core_utils.getLookupTableFactory)(function (t) { t['ArialNarrow'] = 'Helvetica'; t['ArialNarrow-Bold'] = 'Helvetica-Bold'; t['ArialNarrow-BoldItalic'] = 'Helvetica-BoldOblique'; @@ -43881,7 +44346,7 @@ var getStdFontMap = (0, _util.getLookupTableFactory)(function (t) { t['TimesNewRomanPSMT-Italic'] = 'Times-Italic'; }); exports.getStdFontMap = getStdFontMap; -var getNonStdFontMap = (0, _util.getLookupTableFactory)(function (t) { +var getNonStdFontMap = (0, _core_utils.getLookupTableFactory)(function (t) { t['Calibri'] = 'Helvetica'; t['Calibri-Bold'] = 'Helvetica-Bold'; t['Calibri-BoldItalic'] = 'Helvetica-BoldOblique'; @@ -43919,7 +44384,7 @@ var getNonStdFontMap = (0, _util.getLookupTableFactory)(function (t) { t['Wingdings'] = 'ZapfDingbats'; }); exports.getNonStdFontMap = getNonStdFontMap; -var getSerifFonts = (0, _util.getLookupTableFactory)(function (t) { +var getSerifFonts = (0, _core_utils.getLookupTableFactory)(function (t) { t['Adobe Jenson'] = true; t['Adobe Text'] = true; t['Albertus'] = true; @@ -44055,13 +44520,13 @@ var getSerifFonts = (0, _util.getLookupTableFactory)(function (t) { t['XITS'] = true; }); exports.getSerifFonts = getSerifFonts; -var getSymbolsFonts = (0, _util.getLookupTableFactory)(function (t) { +var getSymbolsFonts = (0, _core_utils.getLookupTableFactory)(function (t) { t['Dingbats'] = true; t['Symbol'] = true; t['ZapfDingbats'] = true; }); exports.getSymbolsFonts = getSymbolsFonts; -var getGlyphMapForStandardFonts = (0, _util.getLookupTableFactory)(function (t) { +var getGlyphMapForStandardFonts = (0, _core_utils.getLookupTableFactory)(function (t) { t[2] = 10; t[3] = 32; t[4] = 33; @@ -44457,13 +44922,13 @@ var getGlyphMapForStandardFonts = (0, _util.getLookupTableFactory)(function (t) t[3416] = 8377; }); exports.getGlyphMapForStandardFonts = getGlyphMapForStandardFonts; -var getSupplementalGlyphMapForArialBlack = (0, _util.getLookupTableFactory)(function (t) { +var getSupplementalGlyphMapForArialBlack = (0, _core_utils.getLookupTableFactory)(function (t) { t[227] = 322; t[264] = 261; t[291] = 346; }); exports.getSupplementalGlyphMapForArialBlack = getSupplementalGlyphMapForArialBlack; -var getSupplementalGlyphMapForCalibri = (0, _util.getLookupTableFactory)(function (t) { +var getSupplementalGlyphMapForCalibri = (0, _core_utils.getLookupTableFactory)(function (t) { t[1] = 32; t[4] = 65; t[17] = 66; @@ -44552,10 +45017,10 @@ var getSupplementalGlyphMapForCalibri = (0, _util.getLookupTableFactory)(functio exports.getSupplementalGlyphMapForCalibri = getSupplementalGlyphMapForCalibri; /***/ }), -/* 179 */ +/* 180 */ /***/ (function(module, exports, __w_pdfjs_require__) { -var getLookupTableFactory = __w_pdfjs_require__(6).getLookupTableFactory; +var getLookupTableFactory = __w_pdfjs_require__(154).getLookupTableFactory; var getSpecialPUASymbols = getLookupTableFactory(function (t) { t[63721] = 0x00A9; t[63193] = 0x00A9; @@ -46529,7 +46994,7 @@ exports.getNormalizedUnicodes = getNormalizedUnicodes; exports.getUnicodeForGlyph = getUnicodeForGlyph; /***/ }), -/* 180 */ +/* 181 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -46540,15 +47005,15 @@ Object.defineProperty(exports, "__esModule", { }); exports.FontRendererFactory = void 0; -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); -var _cff_parser = __w_pdfjs_require__(174); +var _cff_parser = __w_pdfjs_require__(175); -var _glyphlist = __w_pdfjs_require__(177); +var _glyphlist = __w_pdfjs_require__(178); -var _encodings = __w_pdfjs_require__(176); +var _encodings = __w_pdfjs_require__(177); -var _stream = __w_pdfjs_require__(157); +var _stream = __w_pdfjs_require__(158); function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } @@ -47538,7 +48003,7 @@ var FontRendererFactory = function FontRendererFactoryClosure() { exports.FontRendererFactory = FontRendererFactory; /***/ }), -/* 181 */ +/* 182 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -47549,11 +48014,11 @@ Object.defineProperty(exports, "__esModule", { }); exports.Type1Parser = void 0; -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); -var _encodings = __w_pdfjs_require__(176); +var _encodings = __w_pdfjs_require__(177); -var _stream = __w_pdfjs_require__(157); +var _stream = __w_pdfjs_require__(158); var HINTING_ENABLED = false; @@ -48231,7 +48696,7 @@ var Type1Parser = function Type1ParserClosure() { exports.Type1Parser = Type1Parser; /***/ }), -/* 182 */ +/* 183 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -48243,11 +48708,13 @@ Object.defineProperty(exports, "__esModule", { exports.getTilingPatternIR = getTilingPatternIR; exports.Pattern = void 0; -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); + +var _colorspace = __w_pdfjs_require__(169); -var _colorspace = __w_pdfjs_require__(168); +var _primitives = __w_pdfjs_require__(151); -var _primitives = __w_pdfjs_require__(155); +var _core_utils = __w_pdfjs_require__(154); var ShadingType = { FUNCTION_BASED: 1, @@ -48290,7 +48757,7 @@ var Pattern = function PatternClosure() { throw new _util.FormatError('Unsupported ShadingType: ' + type); } } catch (ex) { - if (ex instanceof _util.MissingDataException) { + if (ex instanceof _core_utils.MissingDataException) { throw ex; } @@ -49153,7 +49620,7 @@ function getTilingPatternIR(operatorList, dict, args) { } /***/ }), -/* 183 */ +/* 184 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -49164,7 +49631,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.bidi = bidi; -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); var baseTypes = ['BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'S', 'B', 'S', 'WS', 'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'B', 'B', 'S', 'WS', 'ON', 'ON', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'ON', 'ES', 'CS', 'ES', 'CS', 'CS', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'CS', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON', 'ON', 'ON', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'CS', 'ON', 'ET', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'L', 'ON', 'ON', 'BN', 'ON', 'ON', 'ET', 'ET', 'EN', 'EN', 'ON', 'L', 'ON', 'ON', 'ON', 'EN', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L']; var arabicTypes = ['AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'ON', 'ON', 'AL', 'ET', 'ET', 'AL', 'CS', 'AL', 'ON', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', '', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'ET', 'AN', 'AN', 'AL', 'AL', 'AL', 'NSM', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AN', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'NSM', 'NSM', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL']; @@ -49457,7 +49924,7 @@ function bidi(str, startLevel, vertical) { } /***/ }), -/* 184 */ +/* 185 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -49468,14 +49935,14 @@ Object.defineProperty(exports, "__esModule", { }); exports.getMetrics = void 0; -var _util = __w_pdfjs_require__(6); +var _core_utils = __w_pdfjs_require__(154); -var getMetrics = (0, _util.getLookupTableFactory)(function (t) { +var getMetrics = (0, _core_utils.getLookupTableFactory)(function (t) { t['Courier'] = 600; t['Courier-Bold'] = 600; t['Courier-BoldOblique'] = 600; t['Courier-Oblique'] = 600; - t['Helvetica'] = (0, _util.getLookupTableFactory)(function (t) { + t['Helvetica'] = (0, _core_utils.getLookupTableFactory)(function (t) { t['space'] = 278; t['exclam'] = 278; t['quotedbl'] = 355; @@ -49792,7 +50259,7 @@ var getMetrics = (0, _util.getLookupTableFactory)(function (t) { t['imacron'] = 278; t['Euro'] = 556; }); - t['Helvetica-Bold'] = (0, _util.getLookupTableFactory)(function (t) { + t['Helvetica-Bold'] = (0, _core_utils.getLookupTableFactory)(function (t) { t['space'] = 278; t['exclam'] = 333; t['quotedbl'] = 474; @@ -50109,7 +50576,7 @@ var getMetrics = (0, _util.getLookupTableFactory)(function (t) { t['imacron'] = 278; t['Euro'] = 556; }); - t['Helvetica-BoldOblique'] = (0, _util.getLookupTableFactory)(function (t) { + t['Helvetica-BoldOblique'] = (0, _core_utils.getLookupTableFactory)(function (t) { t['space'] = 278; t['exclam'] = 333; t['quotedbl'] = 474; @@ -50426,7 +50893,7 @@ var getMetrics = (0, _util.getLookupTableFactory)(function (t) { t['imacron'] = 278; t['Euro'] = 556; }); - t['Helvetica-Oblique'] = (0, _util.getLookupTableFactory)(function (t) { + t['Helvetica-Oblique'] = (0, _core_utils.getLookupTableFactory)(function (t) { t['space'] = 278; t['exclam'] = 278; t['quotedbl'] = 355; @@ -50743,7 +51210,7 @@ var getMetrics = (0, _util.getLookupTableFactory)(function (t) { t['imacron'] = 278; t['Euro'] = 556; }); - t['Symbol'] = (0, _util.getLookupTableFactory)(function (t) { + t['Symbol'] = (0, _core_utils.getLookupTableFactory)(function (t) { t['space'] = 250; t['exclam'] = 333; t['universal'] = 713; @@ -50935,7 +51402,7 @@ var getMetrics = (0, _util.getLookupTableFactory)(function (t) { t['bracerightbt'] = 494; t['apple'] = 790; }); - t['Times-Roman'] = (0, _util.getLookupTableFactory)(function (t) { + t['Times-Roman'] = (0, _core_utils.getLookupTableFactory)(function (t) { t['space'] = 250; t['exclam'] = 333; t['quotedbl'] = 408; @@ -51252,7 +51719,7 @@ var getMetrics = (0, _util.getLookupTableFactory)(function (t) { t['imacron'] = 278; t['Euro'] = 500; }); - t['Times-Bold'] = (0, _util.getLookupTableFactory)(function (t) { + t['Times-Bold'] = (0, _core_utils.getLookupTableFactory)(function (t) { t['space'] = 250; t['exclam'] = 333; t['quotedbl'] = 555; @@ -51569,7 +52036,7 @@ var getMetrics = (0, _util.getLookupTableFactory)(function (t) { t['imacron'] = 278; t['Euro'] = 500; }); - t['Times-BoldItalic'] = (0, _util.getLookupTableFactory)(function (t) { + t['Times-BoldItalic'] = (0, _core_utils.getLookupTableFactory)(function (t) { t['space'] = 250; t['exclam'] = 389; t['quotedbl'] = 555; @@ -51886,7 +52353,7 @@ var getMetrics = (0, _util.getLookupTableFactory)(function (t) { t['imacron'] = 278; t['Euro'] = 500; }); - t['Times-Italic'] = (0, _util.getLookupTableFactory)(function (t) { + t['Times-Italic'] = (0, _core_utils.getLookupTableFactory)(function (t) { t['space'] = 250; t['exclam'] = 333; t['quotedbl'] = 420; @@ -52203,7 +52670,7 @@ var getMetrics = (0, _util.getLookupTableFactory)(function (t) { t['imacron'] = 278; t['Euro'] = 500; }); - t['ZapfDingbats'] = (0, _util.getLookupTableFactory)(function (t) { + t['ZapfDingbats'] = (0, _core_utils.getLookupTableFactory)(function (t) { t['space'] = 278; t['a1'] = 974; t['a2'] = 961; @@ -52411,7 +52878,7 @@ var getMetrics = (0, _util.getLookupTableFactory)(function (t) { exports.getMetrics = getMetrics; /***/ }), -/* 185 */ +/* 186 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -52423,11 +52890,11 @@ Object.defineProperty(exports, "__esModule", { exports.isPDFFunction = isPDFFunction; exports.PostScriptCompiler = exports.PostScriptEvaluator = exports.PDFFunctionFactory = void 0; -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); -var _primitives = __w_pdfjs_require__(155); +var _primitives = __w_pdfjs_require__(151); -var _ps_parser = __w_pdfjs_require__(186); +var _ps_parser = __w_pdfjs_require__(187); function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } @@ -53758,7 +54225,7 @@ var PostScriptCompiler = function PostScriptCompilerClosure() { exports.PostScriptCompiler = PostScriptCompiler; /***/ }), -/* 186 */ +/* 187 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -53769,9 +54236,9 @@ Object.defineProperty(exports, "__esModule", { }); exports.PostScriptParser = exports.PostScriptLexer = void 0; -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); -var _primitives = __w_pdfjs_require__(155); +var _primitives = __w_pdfjs_require__(151); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -54051,7 +54518,7 @@ function () { exports.PostScriptLexer = PostScriptLexer; /***/ }), -/* 187 */ +/* 188 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -54062,20 +54529,31 @@ Object.defineProperty(exports, "__esModule", { }); exports.MurmurHash3_64 = void 0; -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); -var MurmurHash3_64 = function MurmurHash3_64Closure(seed) { - var MASK_HIGH = 0xffff0000; - var MASK_LOW = 0xffff; +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var SEED = 0xc3d2e1f0; +var MASK_HIGH = 0xffff0000; +var MASK_LOW = 0xffff; + +var MurmurHash3_64 = +/*#__PURE__*/ +function () { function MurmurHash3_64(seed) { - var SEED = 0xc3d2e1f0; + _classCallCheck(this, MurmurHash3_64); + this.h1 = seed ? seed & 0xffffffff : SEED; this.h2 = seed ? seed & 0xffffffff : SEED; } - MurmurHash3_64.prototype = { - update: function MurmurHash3_64_update(input) { + _createClass(MurmurHash3_64, [{ + key: "update", + value: function update(input) { var data, length; if ((0, _util.isString)(input)) { @@ -54102,14 +54580,14 @@ var MurmurHash3_64 = function MurmurHash3_64Closure(seed) { var blockCounts = length >> 2; var tailLength = length - blockCounts * 4; var dataUint32 = new Uint32Array(data.buffer, 0, blockCounts); - var k1 = 0; - var k2 = 0; - var h1 = this.h1; - var h2 = this.h2; - var C1 = 0xcc9e2d51; - var C2 = 0x1b873593; - var C1_LOW = C1 & MASK_LOW; - var C2_LOW = C2 & MASK_LOW; + var k1 = 0, + k2 = 0; + var h1 = this.h1, + h2 = this.h2; + var C1 = 0xcc9e2d51, + C2 = 0x1b873593; + var C1_LOW = C1 & MASK_LOW, + C2_LOW = C2 & MASK_LOW; for (var _i = 0; _i < blockCounts; _i++) { if (_i & 1) { @@ -54156,11 +54634,12 @@ var MurmurHash3_64 = function MurmurHash3_64Closure(seed) { this.h1 = h1; this.h2 = h2; - return this; - }, - hexdigest: function MurmurHash3_64_hexdigest() { - var h1 = this.h1; - var h2 = this.h2; + } + }, { + key: "hexdigest", + value: function hexdigest() { + var h1 = this.h1, + h2 = this.h2; h1 ^= h2 >>> 1; h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW; h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16; @@ -54168,27 +54647,115 @@ var MurmurHash3_64 = function MurmurHash3_64Closure(seed) { h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW; h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16; h1 ^= h2 >>> 1; + var hex1 = (h1 >>> 0).toString(16), + hex2 = (h2 >>> 0).toString(16); + return hex1.padStart(8, '0') + hex2.padStart(8, '0'); + } + }]); - for (var i = 0, arr = [h1, h2], str = ''; i < arr.length; i++) { - var hex = (arr[i] >>> 0).toString(16); + return MurmurHash3_64; +}(); - while (hex.length < 8) { - hex = '0' + hex; - } +exports.MurmurHash3_64 = MurmurHash3_64; + +/***/ }), +/* 189 */ +/***/ (function(module, exports, __w_pdfjs_require__) { - str += hex; +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.NativeImageDecoder = void 0; + +var _colorspace = __w_pdfjs_require__(169); + +var _jpeg_stream = __w_pdfjs_require__(164); + +var _stream = __w_pdfjs_require__(158); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var NativeImageDecoder = +/*#__PURE__*/ +function () { + function NativeImageDecoder(_ref) { + var xref = _ref.xref, + resources = _ref.resources, + handler = _ref.handler, + _ref$forceDataSchema = _ref.forceDataSchema, + forceDataSchema = _ref$forceDataSchema === void 0 ? false : _ref$forceDataSchema, + pdfFunctionFactory = _ref.pdfFunctionFactory; + + _classCallCheck(this, NativeImageDecoder); + + this.xref = xref; + this.resources = resources; + this.handler = handler; + this.forceDataSchema = forceDataSchema; + this.pdfFunctionFactory = pdfFunctionFactory; + } + + _createClass(NativeImageDecoder, [{ + key: "canDecode", + value: function canDecode(image) { + return image instanceof _jpeg_stream.JpegStream && NativeImageDecoder.isDecodable(image, this.xref, this.resources, this.pdfFunctionFactory); + } + }, { + key: "decode", + value: function decode(image) { + var dict = image.dict; + var colorSpace = dict.get('ColorSpace', 'CS'); + colorSpace = _colorspace.ColorSpace.parse(colorSpace, this.xref, this.resources, this.pdfFunctionFactory); + return this.handler.sendWithPromise('JpegDecode', [image.getIR(this.forceDataSchema), colorSpace.numComps]).then(function (_ref2) { + var data = _ref2.data, + width = _ref2.width, + height = _ref2.height; + return new _stream.Stream(data, 0, data.length, dict); + }); + } + }], [{ + key: "isSupported", + value: function isSupported(image, xref, res, pdfFunctionFactory) { + var dict = image.dict; + + if (dict.has('DecodeParms') || dict.has('DP')) { + return false; } - return str; + var cs = _colorspace.ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res, pdfFunctionFactory); + + return (cs.name === 'DeviceGray' || cs.name === 'DeviceRGB') && cs.isDefaultDecode(dict.getArray('Decode', 'D')); } - }; - return MurmurHash3_64; + }, { + key: "isDecodable", + value: function isDecodable(image, xref, res, pdfFunctionFactory) { + var dict = image.dict; + + if (dict.has('DecodeParms') || dict.has('DP')) { + return false; + } + + var cs = _colorspace.ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res, pdfFunctionFactory); + + var bpc = dict.get('BitsPerComponent', 'BPC') || 1; + return (cs.numComps === 1 || cs.numComps === 3) && cs.isDefaultDecode(dict.getArray('Decode', 'D'), bpc); + } + }]); + + return NativeImageDecoder; }(); -exports.MurmurHash3_64 = MurmurHash3_64; +exports.NativeImageDecoder = NativeImageDecoder; /***/ }), -/* 188 */ +/* 190 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -54199,17 +54766,17 @@ Object.defineProperty(exports, "__esModule", { }); exports.PDFImage = void 0; -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); -var _primitives = __w_pdfjs_require__(155); +var _primitives = __w_pdfjs_require__(151); -var _colorspace = __w_pdfjs_require__(168); +var _colorspace = __w_pdfjs_require__(169); -var _stream = __w_pdfjs_require__(157); +var _stream = __w_pdfjs_require__(158); -var _jpeg_stream = __w_pdfjs_require__(163); +var _jpeg_stream = __w_pdfjs_require__(164); -var _jpx = __w_pdfjs_require__(166); +var _jpx = __w_pdfjs_require__(167); function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } @@ -54222,7 +54789,7 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } var PDFImage = function PDFImageClosure() { function handleImageData(image, nativeDecoder) { if (nativeDecoder && nativeDecoder.canDecode(image)) { - return nativeDecoder.decode(image).catch(function (reason) { + return nativeDecoder.decode(image)["catch"](function (reason) { (0, _util.warn)('Native image decoding failed -- trying to recover: ' + (reason && reason.message)); return image; }); @@ -54859,7 +55426,7 @@ var PDFImage = function PDFImageClosure() { exports.PDFImage = PDFImage; /***/ }), -/* 189 */ +/* 191 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -54872,9 +55439,9 @@ exports.MessageHandler = MessageHandler; var _regenerator = _interopRequireDefault(__w_pdfjs_require__(2)); -var _util = __w_pdfjs_require__(6); +var _util = __w_pdfjs_require__(5); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } @@ -54889,10 +55456,10 @@ function resolveCall(_x, _x2) { function _resolveCall() { _resolveCall = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee(fn, args) { + _regenerator["default"].mark(function _callee(fn, args) { var thisArg, _args = arguments; - return _regenerator.default.wrap(function _callee$(_context) { + return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: @@ -54903,7 +55470,7 @@ function _resolveCall() { break; } - return _context.abrupt("return"); + return _context.abrupt("return", undefined); case 3: return _context.abrupt("return", fn.apply(thisArg, args)); @@ -54913,7 +55480,7 @@ function _resolveCall() { return _context.stop(); } } - }, _callee, this); + }, _callee); })); return _resolveCall.apply(this, arguments); } @@ -54955,7 +55522,7 @@ function resolveOrReject(capability, success, reason) { } function finalize(promise) { - return Promise.resolve(promise).catch(function () {}); + return Promise.resolve(promise)["catch"](function () {}); } function MessageHandler(sourceName, targetName, comObj) { @@ -55364,6 +55931,268 @@ MessageHandler.prototype = { } }; +/***/ }), +/* 192 */ +/***/ (function(module, exports, __w_pdfjs_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.PDFWorkerStream = void 0; + +var _regenerator = _interopRequireDefault(__w_pdfjs_require__(2)); + +var _util = __w_pdfjs_require__(5); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var PDFWorkerStream = +/*#__PURE__*/ +function () { + function PDFWorkerStream(msgHandler) { + _classCallCheck(this, PDFWorkerStream); + + this._msgHandler = msgHandler; + this._contentLength = null; + this._fullRequestReader = null; + this._rangeRequestReaders = []; + } + + _createClass(PDFWorkerStream, [{ + key: "getFullReader", + value: function getFullReader() { + (0, _util.assert)(!this._fullRequestReader); + this._fullRequestReader = new PDFWorkerStreamReader(this._msgHandler); + return this._fullRequestReader; + } + }, { + key: "getRangeReader", + value: function getRangeReader(begin, end) { + var reader = new PDFWorkerStreamRangeReader(begin, end, this._msgHandler); + + this._rangeRequestReaders.push(reader); + + return reader; + } + }, { + key: "cancelAllRequests", + value: function cancelAllRequests(reason) { + if (this._fullRequestReader) { + this._fullRequestReader.cancel(reason); + } + + var readers = this._rangeRequestReaders.slice(0); + + readers.forEach(function (reader) { + reader.cancel(reason); + }); + } + }]); + + return PDFWorkerStream; +}(); + +exports.PDFWorkerStream = PDFWorkerStream; + +var PDFWorkerStreamReader = +/*#__PURE__*/ +function () { + function PDFWorkerStreamReader(msgHandler) { + var _this = this; + + _classCallCheck(this, PDFWorkerStreamReader); + + this._msgHandler = msgHandler; + this.onProgress = null; + this._contentLength = null; + this._isRangeSupported = false; + this._isStreamingSupported = false; + + var readableStream = this._msgHandler.sendWithStream('GetReader'); + + this._reader = readableStream.getReader(); + this._headersReady = this._msgHandler.sendWithPromise('ReaderHeadersReady').then(function (data) { + _this._isStreamingSupported = data.isStreamingSupported; + _this._isRangeSupported = data.isRangeSupported; + _this._contentLength = data.contentLength; + }); + } + + _createClass(PDFWorkerStreamReader, [{ + key: "read", + value: function () { + var _read = _asyncToGenerator( + /*#__PURE__*/ + _regenerator["default"].mark(function _callee() { + var _ref, value, done; + + return _regenerator["default"].wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.next = 2; + return this._reader.read(); + + case 2: + _ref = _context.sent; + value = _ref.value; + done = _ref.done; + + if (!done) { + _context.next = 7; + break; + } + + return _context.abrupt("return", { + value: undefined, + done: true + }); + + case 7: + return _context.abrupt("return", { + value: value.buffer, + done: false + }); + + case 8: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + + function read() { + return _read.apply(this, arguments); + } + + return read; + }() + }, { + key: "cancel", + value: function cancel(reason) { + this._reader.cancel(reason); + } + }, { + key: "headersReady", + get: function get() { + return this._headersReady; + } + }, { + key: "contentLength", + get: function get() { + return this._contentLength; + } + }, { + key: "isStreamingSupported", + get: function get() { + return this._isStreamingSupported; + } + }, { + key: "isRangeSupported", + get: function get() { + return this._isRangeSupported; + } + }]); + + return PDFWorkerStreamReader; +}(); + +var PDFWorkerStreamRangeReader = +/*#__PURE__*/ +function () { + function PDFWorkerStreamRangeReader(begin, end, msgHandler) { + _classCallCheck(this, PDFWorkerStreamRangeReader); + + this._msgHandler = msgHandler; + this.onProgress = null; + + var readableStream = this._msgHandler.sendWithStream('GetRangeReader', { + begin: begin, + end: end + }); + + this._reader = readableStream.getReader(); + } + + _createClass(PDFWorkerStreamRangeReader, [{ + key: "read", + value: function () { + var _read2 = _asyncToGenerator( + /*#__PURE__*/ + _regenerator["default"].mark(function _callee2() { + var _ref2, value, done; + + return _regenerator["default"].wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + _context2.next = 2; + return this._reader.read(); + + case 2: + _ref2 = _context2.sent; + value = _ref2.value; + done = _ref2.done; + + if (!done) { + _context2.next = 7; + break; + } + + return _context2.abrupt("return", { + value: undefined, + done: true + }); + + case 7: + return _context2.abrupt("return", { + value: value.buffer, + done: false + }); + + case 8: + case "end": + return _context2.stop(); + } + } + }, _callee2, this); + })); + + function read() { + return _read2.apply(this, arguments); + } + + return read; + }() + }, { + key: "cancel", + value: function cancel(reason) { + this._reader.cancel(reason); + } + }, { + key: "isStreamingSupported", + get: function get() { + return false; + } + }]); + + return PDFWorkerStreamRangeReader; +}(); + /***/ }) /******/ ]); }); diff --git a/cps/static/js/libs/viewer.js b/cps/static/js/libs/viewer.js index 387eea34..1adf130b 100644 --- a/cps/static/js/libs/viewer.js +++ b/cps/static/js/libs/viewer.js @@ -2,7 +2,7 @@ * @licstart The following is the entire license notice for the * Javascript code in this page * - * Copyright 2018 Mozilla Foundation + * Copyright 2019 Mozilla Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -117,15 +117,15 @@ var pdfjsWebApp, pdfjsWebAppOptions; { pdfjsWebApp = __webpack_require__(1); - pdfjsWebAppOptions = __webpack_require__(12); + pdfjsWebAppOptions = __webpack_require__(6); } ; { - __webpack_require__(37); + __webpack_require__(36); } ; { - __webpack_require__(42); + __webpack_require__(41); } function getViewerConfiguration() { @@ -281,51 +281,51 @@ exports.PDFPrintServiceFactory = exports.DefaultExternalServices = exports.PDFVi var _regenerator = _interopRequireDefault(__webpack_require__(2)); -var _ui_utils = __webpack_require__(6); +var _ui_utils = __webpack_require__(5); -var _pdfjsLib = __webpack_require__(7); +var _app_options = __webpack_require__(6); -var _pdf_cursor_tools = __webpack_require__(8); +var _pdfjsLib = __webpack_require__(7); -var _pdf_rendering_queue = __webpack_require__(10); +var _pdf_cursor_tools = __webpack_require__(9); -var _pdf_sidebar = __webpack_require__(11); +var _pdf_rendering_queue = __webpack_require__(11); -var _app_options = __webpack_require__(12); +var _pdf_sidebar = __webpack_require__(12); -var _overlay_manager = __webpack_require__(14); +var _overlay_manager = __webpack_require__(13); -var _password_prompt = __webpack_require__(15); +var _password_prompt = __webpack_require__(14); -var _pdf_attachment_viewer = __webpack_require__(16); +var _pdf_attachment_viewer = __webpack_require__(15); -var _pdf_document_properties = __webpack_require__(17); +var _pdf_document_properties = __webpack_require__(16); -var _pdf_find_bar = __webpack_require__(18); +var _pdf_find_bar = __webpack_require__(17); -var _pdf_find_controller = __webpack_require__(19); +var _pdf_find_controller = __webpack_require__(18); -var _pdf_history = __webpack_require__(21); +var _pdf_history = __webpack_require__(20); -var _pdf_link_service = __webpack_require__(22); +var _pdf_link_service = __webpack_require__(21); -var _pdf_outline_viewer = __webpack_require__(23); +var _pdf_outline_viewer = __webpack_require__(22); -var _pdf_presentation_mode = __webpack_require__(24); +var _pdf_presentation_mode = __webpack_require__(23); -var _pdf_sidebar_resizer = __webpack_require__(25); +var _pdf_sidebar_resizer = __webpack_require__(24); -var _pdf_thumbnail_viewer = __webpack_require__(26); +var _pdf_thumbnail_viewer = __webpack_require__(25); -var _pdf_viewer = __webpack_require__(28); +var _pdf_viewer = __webpack_require__(27); -var _secondary_toolbar = __webpack_require__(33); +var _secondary_toolbar = __webpack_require__(32); -var _toolbar = __webpack_require__(35); +var _toolbar = __webpack_require__(34); -var _view_history = __webpack_require__(36); +var _view_history = __webpack_require__(35); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } @@ -411,11 +411,11 @@ var PDFViewerApplication = { initialize: function () { var _initialize = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee(appConfig) { + _regenerator["default"].mark(function _callee(appConfig) { var _this = this; var appContainer; - return _regenerator.default.wrap(function _callee$(_context) { + return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: @@ -468,9 +468,9 @@ var PDFViewerApplication = { _readPreferences: function () { var _readPreferences2 = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee2() { + _regenerator["default"].mark(function _callee2() { var prefs, name; - return _regenerator.default.wrap(function _callee2$(_context2) { + return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: @@ -493,14 +493,15 @@ var PDFViewerApplication = { _app_options.AppOptions.set(name, prefs[name]); } - _context2.next = 11; + _context2.next = 12; break; case 9: _context2.prev = 9; _context2.t0 = _context2["catch"](2); + console.error("_readPreferences: \"".concat(_context2.t0.message, "\".")); - case 11: + case 12: case "end": return _context2.stop(); } @@ -517,9 +518,9 @@ var PDFViewerApplication = { _parseHashParameters: function () { var _parseHashParameters2 = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee3() { + _regenerator["default"].mark(function _callee3() { var waitOn, hash, hashParams, viewer, enabled; - return _regenerator.default.wrap(function _callee3$(_context3) { + return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: @@ -528,7 +529,7 @@ var PDFViewerApplication = { break; } - return _context3.abrupt("return"); + return _context3.abrupt("return", undefined); case 2: waitOn = []; @@ -602,7 +603,7 @@ var PDFViewerApplication = { _app_options.AppOptions.set('locale', hashParams['locale']); } - return _context3.abrupt("return", Promise.all(waitOn).catch(function (reason) { + return _context3.abrupt("return", Promise.all(waitOn)["catch"](function (reason) { console.error("_parseHashParameters: \"".concat(reason.message, "\".")); })); @@ -623,9 +624,9 @@ var PDFViewerApplication = { _initializeL10n: function () { var _initializeL10n2 = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee4() { + _regenerator["default"].mark(function _callee4() { var dir; - return _regenerator.default.wrap(function _callee4$(_context4) { + return _regenerator["default"].wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: @@ -656,16 +657,15 @@ var PDFViewerApplication = { _initializeViewerComponents: function () { var _initializeViewerComponents2 = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee5() { - var appConfig, dispatchToDOM, eventBus, pdfRenderingQueue, pdfLinkService, downloadManager, findController, container, viewer, thumbnailContainer, sidebarConfig; - return _regenerator.default.wrap(function _callee5$(_context5) { + _regenerator["default"].mark(function _callee5() { + var appConfig, eventBus, pdfRenderingQueue, pdfLinkService, downloadManager, findController, container, viewer; + return _regenerator["default"].wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: appConfig = this.appConfig; this.overlayManager = new _overlay_manager.OverlayManager(); - dispatchToDOM = _app_options.AppOptions.get('eventBusDispatchToDOM'); - eventBus = appConfig.eventBus || (0, _ui_utils.getGlobalEventBus)(dispatchToDOM); + eventBus = appConfig.eventBus || (0, _ui_utils.getGlobalEventBus)(_app_options.AppOptions.get('eventBusDispatchToDOM')); this.eventBus = eventBus; pdfRenderingQueue = new _pdf_rendering_queue.PDFRenderingQueue(); pdfRenderingQueue.onIdle = this.cleanup.bind(this); @@ -707,9 +707,8 @@ var PDFViewerApplication = { }); pdfRenderingQueue.setViewer(this.pdfViewer); pdfLinkService.setViewer(this.pdfViewer); - thumbnailContainer = appConfig.sidebar.thumbnailView; this.pdfThumbnailViewer = new _pdf_thumbnail_viewer.PDFThumbnailViewer({ - container: thumbnailContainer, + container: appConfig.sidebar.thumbnailView, renderingQueue: pdfRenderingQueue, linkService: pdfLinkService, l10n: this.l10n @@ -751,14 +750,17 @@ var PDFViewerApplication = { eventBus: eventBus, downloadManager: downloadManager }); - sidebarConfig = Object.create(appConfig.sidebar); - sidebarConfig.pdfViewer = this.pdfViewer; - sidebarConfig.pdfThumbnailViewer = this.pdfThumbnailViewer; - this.pdfSidebar = new _pdf_sidebar.PDFSidebar(sidebarConfig, eventBus, this.l10n); + this.pdfSidebar = new _pdf_sidebar.PDFSidebar({ + elements: appConfig.sidebar, + pdfViewer: this.pdfViewer, + pdfThumbnailViewer: this.pdfThumbnailViewer, + eventBus: eventBus, + l10n: this.l10n + }); this.pdfSidebar.onToggled = this.forceRendering.bind(this); this.pdfSidebarResizer = new _pdf_sidebar_resizer.PDFSidebarResizer(appConfig.sidebarResizer, eventBus, this.l10n); - case 39: + case 34: case "end": return _context5.stop(); } @@ -797,6 +799,17 @@ var PDFViewerApplication = { this.pdfViewer.currentScaleValue = newScale; }, + zoomReset: function zoomReset() { + var ignoreDuplicate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + if (this.pdfViewer.isInPresentationMode) { + return; + } else if (ignoreDuplicate && this.pdfViewer.currentScaleValue === _ui_utils.DEFAULT_SCALE_VALUE) { + return; + } + + this.pdfViewer.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE; + }, get pagesCount() { return this.pdfDocument ? this.pdfDocument.numPages : 0; @@ -880,9 +893,9 @@ var PDFViewerApplication = { close: function () { var _close = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee6() { + _regenerator["default"].mark(function _callee6() { var errorWrapper, promise; - return _regenerator.default.wrap(function _callee6$(_context6) { + return _regenerator["default"].wrap(function _callee6$(_context6) { while (1) { switch (_context6.prev = _context6.next) { case 0: @@ -894,7 +907,7 @@ var PDFViewerApplication = { break; } - return _context6.abrupt("return"); + return _context6.abrupt("return", undefined); case 4: promise = this.pdfLoadingTask.destroy(); @@ -944,12 +957,12 @@ var PDFViewerApplication = { open: function () { var _open = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee7(file, args) { + _regenerator["default"].mark(function _callee7(file, args) { var _this2 = this; var workerParameters, key, parameters, apiParameters, _key, prop, loadingTask; - return _regenerator.default.wrap(function _callee7$(_context7) { + return _regenerator["default"].wrap(function _callee7$(_context7) { while (1) { switch (_context7.prev = _context7.next) { case 0: @@ -962,7 +975,7 @@ var PDFViewerApplication = { return this.close(); case 3: - workerParameters = _app_options.AppOptions.getAll('worker'); + workerParameters = _app_options.AppOptions.getAll(_app_options.OptionKind.WORKER); for (key in workerParameters) { _pdfjsLib.GlobalWorkerOptions[key] = workerParameters[key]; @@ -980,7 +993,7 @@ var PDFViewerApplication = { parameters.url = file.url; } - apiParameters = _app_options.AppOptions.getAll('api'); + apiParameters = _app_options.AppOptions.getAll(_app_options.OptionKind.API); for (_key in apiParameters) { parameters[_key] = apiParameters[_key]; @@ -1017,7 +1030,7 @@ var PDFViewerApplication = { _this2.load(pdfDocument); }, function (exception) { if (loadingTask !== _this2.pdfLoadingTask) { - return; + return undefined; } var message = exception && exception.message; @@ -1081,7 +1094,7 @@ var PDFViewerApplication = { type: 'application/pdf' }); downloadManager.download(blob, url, filename); - }).catch(downloadByUrl); + })["catch"](downloadByUrl); }, fallback: function fallback(featureId) {}, error: function error(message, moreInfo) { @@ -1194,8 +1207,9 @@ var PDFViewerApplication = { }); }); }); - var pageModePromise = pdfDocument.getPageMode().catch(function () {}); - var openActionDestPromise = pdfDocument.getOpenActionDestination().catch(function () {}); + var pageLayoutPromise = pdfDocument.getPageLayout()["catch"](function () {}); + var pageModePromise = pdfDocument.getPageMode()["catch"](function () {}); + var openActionDestPromise = pdfDocument.getOpenActionDestination()["catch"](function () {}); this.toolbar.setPagesCount(pdfDocument.numPages, false); this.secondaryToolbar.setPagesCount(pdfDocument.numPages); var store = this.store = new _view_history.ViewHistory(pdfDocument.fingerprint); @@ -1222,20 +1236,20 @@ var PDFViewerApplication = { sidebarView: _pdf_sidebar.SidebarView.UNKNOWN, scrollMode: _ui_utils.ScrollMode.UNKNOWN, spreadMode: _ui_utils.SpreadMode.UNKNOWN - }).catch(function () {}); - Promise.all([storePromise, pageModePromise, openActionDestPromise]).then( + })["catch"](function () {}); + Promise.all([storePromise, pageLayoutPromise, pageModePromise, openActionDestPromise]).then( /*#__PURE__*/ function () { var _ref3 = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee8(_ref2) { - var _ref4, _ref4$, values, pageMode, openActionDest, viewOnLoad, initialBookmark, zoom, hash, rotation, sidebarView, scrollMode, spreadMode; + _regenerator["default"].mark(function _callee8(_ref2) { + var _ref4, _ref4$, values, pageLayout, pageMode, openActionDest, viewOnLoad, initialBookmark, zoom, hash, rotation, sidebarView, scrollMode, spreadMode; - return _regenerator.default.wrap(function _callee8$(_context8) { + return _regenerator["default"].wrap(function _callee8$(_context8) { while (1) { switch (_context8.prev = _context8.next) { case 0: - _ref4 = _slicedToArray(_ref2, 3), _ref4$ = _ref4[0], values = _ref4$ === void 0 ? {} : _ref4$, pageMode = _ref4[1], openActionDest = _ref4[2]; + _ref4 = _slicedToArray(_ref2, 4), _ref4$ = _ref4[0], values = _ref4$ === void 0 ? {} : _ref4$, pageLayout = _ref4[1], pageMode = _ref4[2], openActionDest = _ref4[3]; viewOnLoad = _app_options.AppOptions.get('viewOnLoad'); _this5._initializePdfHistory({ @@ -1273,6 +1287,10 @@ var PDFViewerApplication = { sidebarView = apiPageModeToSidebarView(pageMode); } + if (pageLayout && spreadMode === _ui_utils.SpreadMode.UNKNOWN) { + spreadMode = apiPageLayoutToSpreadMode(pageLayout); + } + _this5.setInitialView(hash, { rotation: rotation, sidebarView: sidebarView, @@ -1288,45 +1306,45 @@ var PDFViewerApplication = { pdfViewer.focus(); } - _context8.next = 17; + _context8.next = 18; return Promise.race([pagesPromise, new Promise(function (resolve) { setTimeout(resolve, FORCE_PAGES_LOADED_TIMEOUT); })]); - case 17: + case 18: if (!(!initialBookmark && !hash)) { - _context8.next = 19; + _context8.next = 20; break; } return _context8.abrupt("return"); - case 19: + case 20: if (!pdfViewer.hasEqualPageSizes) { - _context8.next = 21; + _context8.next = 22; break; } return _context8.abrupt("return"); - case 21: + case 22: _this5.initialBookmark = initialBookmark; pdfViewer.currentScaleValue = pdfViewer.currentScaleValue; _this5.setInitialView(hash); - case 24: + case 25: case "end": return _context8.stop(); } } - }, _callee8, this); + }, _callee8); })); return function (_x4) { return _ref3.apply(this, arguments); }; - }()).catch(function () { + }())["catch"](function () { _this5.setInitialView(); }).then(function () { pdfViewer.update(); @@ -1614,6 +1632,7 @@ var PDFViewerApplication = { eventBus.on('previouspage', webViewerPreviousPage); eventBus.on('zoomin', webViewerZoomIn); eventBus.on('zoomout', webViewerZoomOut); + eventBus.on('zoomreset', webViewerZoomReset); eventBus.on('pagenumberchanged', webViewerPageNumberChanged); eventBus.on('scalechanged', webViewerScaleChanged); eventBus.on('rotatecw', webViewerRotateCw); @@ -1659,7 +1678,9 @@ var PDFViewerApplication = { }; window.addEventListener('visibilitychange', webViewerVisibilityChange); - window.addEventListener('wheel', webViewerWheel); + window.addEventListener('wheel', webViewerWheel, { + passive: false + }); window.addEventListener('click', webViewerClick); window.addEventListener('keydown', webViewerKeyDown); window.addEventListener('resize', _boundEvents.windowResize); @@ -1694,6 +1715,7 @@ var PDFViewerApplication = { eventBus.off('previouspage', webViewerPreviousPage); eventBus.off('zoomin', webViewerZoomIn); eventBus.off('zoomout', webViewerZoomOut); + eventBus.off('zoomreset', webViewerZoomReset); eventBus.off('pagenumberchanged', webViewerPageNumberChanged); eventBus.off('scalechanged', webViewerScaleChanged); eventBus.off('rotatecw', webViewerRotateCw); @@ -1979,7 +2001,7 @@ function webViewerSidebarViewChanged(evt) { var store = PDFViewerApplication.store; if (store && PDFViewerApplication.isInitialViewSet) { - store.set('sidebarView', evt.view).catch(function () {}); + store.set('sidebarView', evt.view)["catch"](function () {}); } } @@ -1994,7 +2016,7 @@ function webViewerUpdateViewarea(evt) { 'scrollLeft': location.left, 'scrollTop': location.top, 'rotation': location.rotation - }).catch(function () {}); + })["catch"](function () {}); } var href = PDFViewerApplication.pdfLinkService.getAnchorUrl(location.pdfOpenParams); @@ -2009,7 +2031,7 @@ function webViewerScrollModeChanged(evt) { var store = PDFViewerApplication.store; if (store && PDFViewerApplication.isInitialViewSet) { - store.set('scrollMode', evt.mode).catch(function () {}); + store.set('scrollMode', evt.mode)["catch"](function () {}); } } @@ -2017,7 +2039,7 @@ function webViewerSpreadModeChanged(evt) { var store = PDFViewerApplication.store; if (store && PDFViewerApplication.isInitialViewSet) { - store.set('spreadMode', evt.mode).catch(function () {}); + store.set('spreadMode', evt.mode)["catch"](function () {}); } } @@ -2137,6 +2159,10 @@ function webViewerZoomOut() { PDFViewerApplication.zoomOut(); } +function webViewerZoomReset(evt) { + PDFViewerApplication.zoomReset(evt && evt.ignoreDuplicate); +} + function webViewerPageNumberChanged(evt) { var pdfViewer = PDFViewerApplication.pdfViewer; @@ -2392,7 +2418,7 @@ function webViewerKeyDown(evt) { case 96: if (!isViewerInPresentationMode) { setTimeout(function () { - pdfViewer.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE; + PDFViewerApplication.zoomReset(); }); handled = false; } @@ -2619,6 +2645,24 @@ function webViewerKeyDown(evt) { } } +function apiPageLayoutToSpreadMode(layout) { + switch (layout) { + case 'SinglePage': + case 'OneColumn': + return _ui_utils.SpreadMode.NONE; + + case 'TwoColumnLeft': + case 'TwoPageLeft': + return _ui_utils.SpreadMode.ODD; + + case 'TwoColumnRight': + case 'TwoPageRight': + return _ui_utils.SpreadMode.EVEN; + } + + return _ui_utils.SpreadMode.NONE; +} + function apiPageModeToSidebarView(mode) { switch (mode) { case 'UseNone': @@ -2662,40 +2706,12 @@ module.exports = __webpack_require__(3); /* 3 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - - -function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } - -var g = function () { - return this || (typeof self === "undefined" ? "undefined" : _typeof(self)) === "object" && self; -}() || Function("return this")(); - -var hadRuntime = g.regeneratorRuntime && Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >= 0; -var oldRuntime = hadRuntime && g.regeneratorRuntime; -g.regeneratorRuntime = undefined; -module.exports = __webpack_require__(4); - -if (hadRuntime) { - g.regeneratorRuntime = oldRuntime; -} else { - try { - delete g.regeneratorRuntime; - } catch (e) { - g.regeneratorRuntime = undefined; - } -} - -/***/ }), -/* 4 */ -/***/ (function(module, exports, __webpack_require__) { - "use strict"; /* WEBPACK VAR INJECTION */(function(module) { function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } -!function (global) { +var runtime = function (exports) { "use strict"; var Op = Object.prototype; @@ -2705,18 +2721,6 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat var iteratorSymbol = $Symbol.iterator || "@@iterator"; var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator"; var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; - var inModule = ( false ? undefined : _typeof(module)) === "object"; - var runtime = global.regeneratorRuntime; - - if (runtime) { - if (inModule) { - module.exports = runtime; - } - - return; - } - - runtime = global.regeneratorRuntime = inModule ? module.exports : {}; function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; @@ -2726,7 +2730,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat return generator; } - runtime.wrap = wrap; + exports.wrap = wrap; function tryCatch(fn, obj, arg) { try { @@ -2780,12 +2784,12 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat }); } - runtime.isGeneratorFunction = function (genFun) { + exports.isGeneratorFunction = function (genFun) { var ctor = typeof genFun === "function" && genFun.constructor; return ctor ? ctor === GeneratorFunction || (ctor.displayName || ctor.name) === "GeneratorFunction" : false; }; - runtime.mark = function (genFun) { + exports.mark = function (genFun) { if (Object.setPrototypeOf) { Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); } else { @@ -2800,7 +2804,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat return genFun; }; - runtime.awrap = function (arg) { + exports.awrap = function (arg) { return { __await: arg }; @@ -2854,11 +2858,11 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat return this; }; - runtime.AsyncIterator = AsyncIterator; + exports.AsyncIterator = AsyncIterator; - runtime.async = function (innerFn, outerFn, self, tryLocsList) { + exports.async = function (innerFn, outerFn, self, tryLocsList) { var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList)); - return runtime.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { + return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }; @@ -2936,7 +2940,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat context.delegate = null; if (context.method === "throw") { - if (delegate.iterator.return) { + if (delegate.iterator["return"]) { context.method = "return"; context.arg = undefined; maybeInvokeDelegate(delegate, context); @@ -3030,7 +3034,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat this.reset(true); } - runtime.keys = function (object) { + exports.keys = function (object) { var keys = []; for (var key in object) { @@ -3091,7 +3095,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat }; } - runtime.values = values; + exports.values = values; function doneResult() { return { @@ -3269,13 +3273,18 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat return ContinueSentinel; } }; -}(function () { - return this || (typeof self === "undefined" ? "undefined" : _typeof(self)) === "object" && self; -}() || Function("return this")()); -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(5)(module))) + return exports; +}(( false ? undefined : _typeof(module)) === "object" ? module.exports : {}); + +try { + regeneratorRuntime = runtime; +} catch (accidentalStrictMode) { + Function("r", "regeneratorRuntime = r")(runtime); +} +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(4)(module))) /***/ }), -/* 5 */ +/* 4 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3306,7 +3315,7 @@ module.exports = function (module) { }; /***/ }), -/* 6 */ +/* 5 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3339,7 +3348,7 @@ exports.WaitOnType = exports.animationStarted = exports.ProgressBar = exports.Ev var _regenerator = _interopRequireDefault(__webpack_require__(2)); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -3426,8 +3435,8 @@ var NullL10n = { getLanguage: function () { var _getLanguage = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee() { - return _regenerator.default.wrap(function _callee$(_context) { + _regenerator["default"].mark(function _callee() { + return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: @@ -3438,7 +3447,7 @@ var NullL10n = { return _context.stop(); } } - }, _callee, this); + }, _callee); })); function getLanguage() { @@ -3450,8 +3459,8 @@ var NullL10n = { getDirection: function () { var _getDirection = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee2() { - return _regenerator.default.wrap(function _callee2$(_context2) { + _regenerator["default"].mark(function _callee2() { + return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: @@ -3462,7 +3471,7 @@ var NullL10n = { return _context2.stop(); } } - }, _callee2, this); + }, _callee2); })); function getDirection() { @@ -3474,8 +3483,8 @@ var NullL10n = { get: function () { var _get = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee3(property, args, fallback) { - return _regenerator.default.wrap(function _callee3$(_context3) { + _regenerator["default"].mark(function _callee3(property, args, fallback) { + return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: @@ -3486,7 +3495,7 @@ var NullL10n = { return _context3.stop(); } } - }, _callee3, this); + }, _callee3); })); function get(_x, _x2, _x3) { @@ -3498,8 +3507,8 @@ var NullL10n = { translate: function () { var _translate = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee4(element) { - return _regenerator.default.wrap(function _callee4$(_context4) { + _regenerator["default"].mark(function _callee4(element) { + return _regenerator["default"].wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: @@ -3507,7 +3516,7 @@ var NullL10n = { return _context4.stop(); } } - }, _callee4, this); + }, _callee4); })); function translate(_x4) { @@ -4189,24 +4198,7 @@ function moveToEndOfArray(arr, condition) { } /***/ }), -/* 7 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var pdfjsLib; - -if (typeof window !== 'undefined' && window['pdfjs-dist/build/pdf']) { - pdfjsLib = window['pdfjs-dist/build/pdf']; -} else { - pdfjsLib = require('../build/pdf.js'); -} - -module.exports = pdfjsLib; - -/***/ }), -/* 8 */ +/* 6 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4215,9 +4207,13 @@ module.exports = pdfjsLib; Object.defineProperty(exports, "__esModule", { value: true }); -exports.PDFCursorTools = exports.CursorTool = void 0; +exports.OptionKind = exports.AppOptions = void 0; + +var _pdfjsLib = __webpack_require__(7); + +var _viewer_compatibility = __webpack_require__(8); -var _grab_to_pan = __webpack_require__(9); +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -4225,39 +4221,344 @@ function _defineProperties(target, props) { for (var i = 0; i < props.length; i+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } -var CursorTool = { - SELECT: 0, - HAND: 1, - ZOOM: 2 +var OptionKind = { + VIEWER: 0x02, + API: 0x04, + WORKER: 0x08, + PREFERENCE: 0x80 }; -exports.CursorTool = CursorTool; +exports.OptionKind = OptionKind; +var defaultOptions = { + cursorToolOnLoad: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + defaultUrl: { + value: 'compressed.tracemonkey-pldi-09.pdf', + kind: OptionKind.VIEWER + }, + defaultZoomValue: { + value: '', + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + disableHistory: { + value: false, + kind: OptionKind.VIEWER + }, + disablePageLabels: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enablePrintAutoRotate: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableWebGL: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + eventBusDispatchToDOM: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + externalLinkRel: { + value: 'noopener noreferrer nofollow', + kind: OptionKind.VIEWER + }, + externalLinkTarget: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + historyUpdateUrl: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + imageResourcesPath: { + value: './images/', + kind: OptionKind.VIEWER + }, + maxCanvasPixels: { + value: 16777216, + compatibility: _viewer_compatibility.viewerCompatibilityParams.maxCanvasPixels, + kind: OptionKind.VIEWER + }, + pdfBugEnabled: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + renderer: { + value: 'canvas', + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + renderInteractiveForms: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + sidebarViewOnLoad: { + value: -1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + scrollModeOnLoad: { + value: -1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + spreadModeOnLoad: { + value: -1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + textLayerMode: { + value: 1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + useOnlyCssZoom: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + viewOnLoad: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + cMapPacked: { + value: true, + kind: OptionKind.API + }, + cMapUrl: { + value: '../web/cmaps/', + kind: OptionKind.API + }, + disableAutoFetch: { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + disableCreateObjectURL: { + value: false, + compatibility: _pdfjsLib.apiCompatibilityParams.disableCreateObjectURL, + kind: OptionKind.API + }, + disableFontFace: { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + disableRange: { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + disableStream: { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + isEvalSupported: { + value: true, + kind: OptionKind.API + }, + maxImageSize: { + value: -1, + kind: OptionKind.API + }, + pdfBug: { + value: false, + kind: OptionKind.API + }, + postMessageTransfers: { + value: true, + kind: OptionKind.API + }, + verbosity: { + value: 1, + kind: OptionKind.API + }, + workerPort: { + value: null, + kind: OptionKind.WORKER + }, + workerSrc: { + value: '../build/pdf.worker.js', + kind: OptionKind.WORKER + } +}; +{ + defaultOptions.disablePreferences = { + value: false, + kind: OptionKind.VIEWER + }; + defaultOptions.locale = { + value: typeof navigator !== 'undefined' ? navigator.language : 'en-US', + kind: OptionKind.VIEWER + }; + defaultOptions.printResolution = { + value: 150, + kind: OptionKind.VIEWER + }; +} +var userOptions = Object.create(null); -var PDFCursorTools = +var AppOptions = /*#__PURE__*/ function () { - function PDFCursorTools(_ref) { - var _this = this; + function AppOptions() { + _classCallCheck(this, AppOptions); - var container = _ref.container, - eventBus = _ref.eventBus, - _ref$cursorToolOnLoad = _ref.cursorToolOnLoad, - cursorToolOnLoad = _ref$cursorToolOnLoad === void 0 ? CursorTool.SELECT : _ref$cursorToolOnLoad; + throw new Error('Cannot initialize AppOptions.'); + } - _classCallCheck(this, PDFCursorTools); + _createClass(AppOptions, null, [{ + key: "get", + value: function get(name) { + var userOption = userOptions[name]; - this.container = container; - this.eventBus = eventBus; - this.active = CursorTool.SELECT; - this.activeBeforePresentationMode = null; - this.handTool = new _grab_to_pan.GrabToPan({ - element: this.container - }); + if (userOption !== undefined) { + return userOption; + } - this._addEventListeners(); + var defaultOption = defaultOptions[name]; - Promise.resolve().then(function () { - _this.switchTool(cursorToolOnLoad); - }); + if (defaultOption !== undefined) { + return defaultOption.compatibility || defaultOption.value; + } + + return undefined; + } + }, { + key: "getAll", + value: function getAll() { + var kind = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var options = Object.create(null); + + for (var name in defaultOptions) { + var defaultOption = defaultOptions[name]; + + if (kind) { + if ((kind & defaultOption.kind) === 0) { + continue; + } + + if (kind === OptionKind.PREFERENCE) { + var value = defaultOption.value, + valueType = _typeof(value); + + if (valueType === 'boolean' || valueType === 'string' || valueType === 'number' && Number.isInteger(value)) { + options[name] = value; + continue; + } + + throw new Error("Invalid type for preference: ".concat(name)); + } + } + + var userOption = userOptions[name]; + options[name] = userOption !== undefined ? userOption : defaultOption.compatibility || defaultOption.value; + } + + return options; + } + }, { + key: "set", + value: function set(name, value) { + userOptions[name] = value; + } + }, { + key: "remove", + value: function remove(name) { + delete userOptions[name]; + } + }]); + + return AppOptions; +}(); + +exports.AppOptions = AppOptions; + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var pdfjsLib; + +if (typeof window !== 'undefined' && window['pdfjs-dist/build/pdf']) { + pdfjsLib = window['pdfjs-dist/build/pdf']; +} else { + pdfjsLib = require('../build/pdf.js'); +} + +module.exports = pdfjsLib; + +/***/ }), +/* 8 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var compatibilityParams = Object.create(null); +{ + var userAgent = typeof navigator !== 'undefined' && navigator.userAgent || ''; + var isAndroid = /Android/.test(userAgent); + var isIOS = /\b(iPad|iPhone|iPod)(?=;)/.test(userAgent); + + (function checkCanvasSizeLimitation() { + if (isIOS || isAndroid) { + compatibilityParams.maxCanvasPixels = 5242880; + } + })(); +} +exports.viewerCompatibilityParams = Object.freeze(compatibilityParams); + +/***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.PDFCursorTools = exports.CursorTool = void 0; + +var _grab_to_pan = __webpack_require__(10); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var CursorTool = { + SELECT: 0, + HAND: 1, + ZOOM: 2 +}; +exports.CursorTool = CursorTool; + +var PDFCursorTools = +/*#__PURE__*/ +function () { + function PDFCursorTools(_ref) { + var _this = this; + + var container = _ref.container, + eventBus = _ref.eventBus, + _ref$cursorToolOnLoad = _ref.cursorToolOnLoad, + cursorToolOnLoad = _ref$cursorToolOnLoad === void 0 ? CursorTool.SELECT : _ref$cursorToolOnLoad; + + _classCallCheck(this, PDFCursorTools); + + this.container = container; + this.eventBus = eventBus; + this.active = CursorTool.SELECT; + this.activeBeforePresentationMode = null; + this.handTool = new _grab_to_pan.GrabToPan({ + element: this.container + }); + + this._addEventListeners(); + + Promise.resolve().then(function () { + _this.switchTool(cursorToolOnLoad); + }); } _createClass(PDFCursorTools, [{ @@ -4357,7 +4658,7 @@ function () { exports.PDFCursorTools = PDFCursorTools; /***/ }), -/* 9 */ +/* 10 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4517,10 +4818,12 @@ function isLeftMouseReleased(event) { if (isChrome15OrOpera15plus || isSafari6plus) { return event.which === 0; } + + return false; } /***/ }), -/* 10 */ +/* 11 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4609,7 +4912,7 @@ function () { var numVisible = visibleViews.length; if (numVisible === 0) { - return false; + return null; } for (var i = 0; i < numVisible; ++i) { @@ -4661,12 +4964,9 @@ function () { case RenderingStates.INITIAL: this.highestPriorityPage = view.renderingId; - - var continueRendering = function continueRendering() { + view.draw()["finally"](function () { _this.renderHighestPriority(); - }; - - view.draw().then(continueRendering, continueRendering); + }); break; } @@ -4680,7 +4980,7 @@ function () { exports.PDFRenderingQueue = PDFRenderingQueue; /***/ }), -/* 11 */ +/* 12 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4691,9 +4991,9 @@ Object.defineProperty(exports, "__esModule", { }); exports.PDFSidebar = exports.SidebarView = void 0; -var _ui_utils = __webpack_require__(6); +var _ui_utils = __webpack_require__(5); -var _pdf_rendering_queue = __webpack_require__(10); +var _pdf_rendering_queue = __webpack_require__(11); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -4715,8 +5015,15 @@ exports.SidebarView = SidebarView; var PDFSidebar = /*#__PURE__*/ function () { - function PDFSidebar(options, eventBus) { - var l10n = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _ui_utils.NullL10n; + function PDFSidebar(_ref) { + var elements = _ref.elements, + pdfViewer = _ref.pdfViewer, + pdfThumbnailViewer = _ref.pdfThumbnailViewer, + eventBus = _ref.eventBus, + _ref$l10n = _ref.l10n, + l10n = _ref$l10n === void 0 ? _ui_utils.NullL10n : _ref$l10n, + _ref$disableNotificat = _ref.disableNotification, + disableNotification = _ref$disableNotificat === void 0 ? false : _ref$disableNotificat; _classCallCheck(this, PDFSidebar); @@ -4724,20 +5031,20 @@ function () { this.active = SidebarView.THUMBS; this.isInitialViewSet = false; this.onToggled = null; - this.pdfViewer = options.pdfViewer; - this.pdfThumbnailViewer = options.pdfThumbnailViewer; - this.outerContainer = options.outerContainer; - this.viewerContainer = options.viewerContainer; - this.toggleButton = options.toggleButton; - this.thumbnailButton = options.thumbnailButton; - this.outlineButton = options.outlineButton; - this.attachmentsButton = options.attachmentsButton; - this.thumbnailView = options.thumbnailView; - this.outlineView = options.outlineView; - this.attachmentsView = options.attachmentsView; - this.disableNotification = options.disableNotification || false; + this.pdfViewer = pdfViewer; + this.pdfThumbnailViewer = pdfThumbnailViewer; + this.outerContainer = elements.outerContainer; + this.viewerContainer = elements.viewerContainer; + this.toggleButton = elements.toggleButton; + this.thumbnailButton = elements.thumbnailButton; + this.outlineButton = elements.outlineButton; + this.attachmentsButton = elements.attachmentsButton; + this.thumbnailView = elements.thumbnailView; + this.outlineView = elements.outlineView; + this.attachmentsView = elements.attachmentsView; this.eventBus = eventBus; this.l10n = l10n; + this._disableNotification = disableNotification; this._addEventListeners(); } @@ -4937,7 +5244,7 @@ function () { value: function _showUINotification(view) { var _this = this; - if (this.disableNotification) { + if (this._disableNotification) { return; } @@ -4966,7 +5273,7 @@ function () { value: function _hideUINotification(view) { var _this2 = this; - if (this.disableNotification) { + if (this._disableNotification) { return; } @@ -5091,255 +5398,6 @@ function () { exports.PDFSidebar = PDFSidebar; -/***/ }), -/* 12 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.OptionKind = exports.AppOptions = void 0; - -var _pdfjsLib = __webpack_require__(7); - -var _viewer_compatibility = __webpack_require__(13); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -var OptionKind = { - VIEWER: 'viewer', - API: 'api', - WORKER: 'worker' -}; -exports.OptionKind = OptionKind; -var defaultOptions = { - cursorToolOnLoad: { - value: 0, - kind: OptionKind.VIEWER - }, - defaultUrl: { - kind: OptionKind.VIEWER - }, - defaultZoomValue: { - value: '', - kind: OptionKind.VIEWER - }, - disableHistory: { - value: false, - kind: OptionKind.VIEWER - }, - disablePageLabels: { - value: false, - kind: OptionKind.VIEWER - }, - enablePrintAutoRotate: { - value: false, - kind: OptionKind.VIEWER - }, - enableWebGL: { - value: false, - kind: OptionKind.VIEWER - }, - eventBusDispatchToDOM: { - value: false, - kind: OptionKind.VIEWER - }, - externalLinkRel: { - value: 'noopener noreferrer nofollow', - kind: OptionKind.VIEWER - }, - externalLinkTarget: { - value: 0, - kind: OptionKind.VIEWER - }, - historyUpdateUrl: { - value: false, - kind: OptionKind.VIEWER - }, - imageResourcesPath: { - value: '../images/', - kind: OptionKind.VIEWER - }, - maxCanvasPixels: { - value: 16777216, - compatibility: _viewer_compatibility.viewerCompatibilityParams.maxCanvasPixels, - kind: OptionKind.VIEWER - }, - pdfBugEnabled: { - value: false, - kind: OptionKind.VIEWER - }, - renderer: { - value: 'canvas', - kind: OptionKind.VIEWER - }, - renderInteractiveForms: { - value: false, - kind: OptionKind.VIEWER - }, - sidebarViewOnLoad: { - value: -1, - kind: OptionKind.VIEWER - }, - scrollModeOnLoad: { - value: -1, - kind: OptionKind.VIEWER - }, - spreadModeOnLoad: { - value: -1, - kind: OptionKind.VIEWER - }, - textLayerMode: { - value: 1, - kind: OptionKind.VIEWER - }, - useOnlyCssZoom: { - value: false, - kind: OptionKind.VIEWER - }, - viewOnLoad: { - value: 0, - kind: OptionKind.VIEWER - }, - cMapPacked: { - value: true, - kind: OptionKind.API - }, - cMapUrl: { - value: '../web/cmaps/', - kind: OptionKind.API - }, - disableAutoFetch: { - value: false, - kind: OptionKind.API - }, - disableCreateObjectURL: { - value: false, - compatibility: _pdfjsLib.apiCompatibilityParams.disableCreateObjectURL, - kind: OptionKind.API - }, - disableFontFace: { - value: false, - kind: OptionKind.API - }, - disableRange: { - value: false, - kind: OptionKind.API - }, - disableStream: { - value: false, - kind: OptionKind.API - }, - isEvalSupported: { - value: true, - kind: OptionKind.API - }, - maxImageSize: { - value: -1, - kind: OptionKind.API - }, - pdfBug: { - value: false, - kind: OptionKind.API - }, - postMessageTransfers: { - value: true, - kind: OptionKind.API - }, - verbosity: { - value: 1, - kind: OptionKind.API - }, - workerPort: { - value: null, - kind: OptionKind.WORKER - }, - workerSrc: { - value: '../build/pdf.worker.js', - kind: OptionKind.WORKER - } -}; -{ - defaultOptions.disablePreferences = { - value: false, - kind: OptionKind.VIEWER - }; - defaultOptions.locale = { - value: typeof navigator !== 'undefined' ? navigator.language : 'en-US', - kind: OptionKind.VIEWER - }; -} -var userOptions = Object.create(null); - -var AppOptions = -/*#__PURE__*/ -function () { - function AppOptions() { - _classCallCheck(this, AppOptions); - - throw new Error('Cannot initialize AppOptions.'); - } - - _createClass(AppOptions, null, [{ - key: "get", - value: function get(name) { - var userOption = userOptions[name]; - - if (userOption !== undefined) { - return userOption; - } - - var defaultOption = defaultOptions[name]; - - if (defaultOption !== undefined) { - return defaultOption.compatibility || defaultOption.value; - } - - return undefined; - } - }, { - key: "getAll", - value: function getAll() { - var kind = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; - var options = Object.create(null); - - for (var name in defaultOptions) { - var defaultOption = defaultOptions[name]; - - if (kind && kind !== defaultOption.kind) { - continue; - } - - var userOption = userOptions[name]; - options[name] = userOption !== undefined ? userOption : defaultOption.compatibility || defaultOption.value; - } - - return options; - } - }, { - key: "set", - value: function set(name, value) { - userOptions[name] = value; - } - }, { - key: "remove", - value: function remove(name) { - delete userOptions[name]; - } - }]); - - return AppOptions; -}(); - -exports.AppOptions = AppOptions; - /***/ }), /* 13 */ /***/ (function(module, exports, __webpack_require__) { @@ -5347,27 +5405,6 @@ exports.AppOptions = AppOptions; "use strict"; -var compatibilityParams = Object.create(null); -{ - var userAgent = typeof navigator !== 'undefined' && navigator.userAgent || ''; - var isAndroid = /Android/.test(userAgent); - var isIOS = /\b(iPad|iPhone|iPod)(?=;)/.test(userAgent); - - (function checkCanvasSizeLimitation() { - if (isIOS || isAndroid) { - compatibilityParams.maxCanvasPixels = 5242880; - } - })(); -} -exports.viewerCompatibilityParams = Object.freeze(compatibilityParams); - -/***/ }), -/* 14 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - Object.defineProperty(exports, "__esModule", { value: true }); @@ -5375,7 +5412,7 @@ exports.OverlayManager = void 0; var _regenerator = _interopRequireDefault(__webpack_require__(2)); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } @@ -5403,12 +5440,12 @@ function () { value: function () { var _register = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee(name, element) { + _regenerator["default"].mark(function _callee(name, element) { var callerCloseMethod, canForceClose, container, _args = arguments; - return _regenerator.default.wrap(function _callee$(_context) { + return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: @@ -5457,8 +5494,8 @@ function () { value: function () { var _unregister = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee2(name) { - return _regenerator.default.wrap(function _callee2$(_context2) { + _regenerator["default"].mark(function _callee2(name) { + return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: @@ -5499,8 +5536,8 @@ function () { value: function () { var _open = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee3(name) { - return _regenerator.default.wrap(function _callee3$(_context3) { + _regenerator["default"].mark(function _callee3(name) { + return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: @@ -5566,8 +5603,8 @@ function () { value: function () { var _close = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee4(name) { - return _regenerator.default.wrap(function _callee4$(_context4) { + _regenerator["default"].mark(function _callee4(name) { + return _regenerator["default"].wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: @@ -5649,7 +5686,7 @@ function () { exports.OverlayManager = OverlayManager; /***/ }), -/* 15 */ +/* 14 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5660,7 +5697,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.PasswordPrompt = void 0; -var _ui_utils = __webpack_require__(6); +var _ui_utils = __webpack_require__(5); var _pdfjsLib = __webpack_require__(7); @@ -5737,7 +5774,7 @@ function () { if (password && password.length > 0) { this.close(); - return this.updateCallback(password); + this.updateCallback(password); } } }, { @@ -5754,7 +5791,7 @@ function () { exports.PasswordPrompt = PasswordPrompt; /***/ }), -/* 16 */ +/* 15 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5928,7 +5965,7 @@ function () { exports.PDFAttachmentViewer = PDFAttachmentViewer; /***/ }), -/* 17 */ +/* 16 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5939,9 +5976,17 @@ Object.defineProperty(exports, "__esModule", { }); exports.PDFDocumentProperties = void 0; -var _ui_utils = __webpack_require__(6); +var _regenerator = _interopRequireDefault(__webpack_require__(2)); + +var _pdfjsLib = __webpack_require__(7); + +var _ui_utils = __webpack_require__(5); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } -var _pdfjsLib = __webpack_require__(7); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } @@ -6165,136 +6210,197 @@ function () { } }, { key: "_parseFileSize", - value: function _parseFileSize() { - var fileSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; - var kb = fileSize / 1024; + value: function () { + var _parseFileSize2 = _asyncToGenerator( + /*#__PURE__*/ + _regenerator["default"].mark(function _callee() { + var fileSize, + kb, + _args = arguments; + return _regenerator["default"].wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + fileSize = _args.length > 0 && _args[0] !== undefined ? _args[0] : 0; + kb = fileSize / 1024; - if (!kb) { - return Promise.resolve(undefined); - } else if (kb < 1024) { - return this.l10n.get('document_properties_kb', { - size_kb: (+kb.toPrecision(3)).toLocaleString(), - size_b: fileSize.toLocaleString() - }, '{{size_kb}} KB ({{size_b}} bytes)'); + if (kb) { + _context.next = 6; + break; + } + + return _context.abrupt("return", undefined); + + case 6: + if (!(kb < 1024)) { + _context.next = 8; + break; + } + + return _context.abrupt("return", this.l10n.get('document_properties_kb', { + size_kb: (+kb.toPrecision(3)).toLocaleString(), + size_b: fileSize.toLocaleString() + }, '{{size_kb}} KB ({{size_b}} bytes)')); + + case 8: + return _context.abrupt("return", this.l10n.get('document_properties_mb', { + size_mb: (+(kb / 1024).toPrecision(3)).toLocaleString(), + size_b: fileSize.toLocaleString() + }, '{{size_mb}} MB ({{size_b}} bytes)')); + + case 9: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + + function _parseFileSize() { + return _parseFileSize2.apply(this, arguments); } - return this.l10n.get('document_properties_mb', { - size_mb: (+(kb / 1024).toPrecision(3)).toLocaleString(), - size_b: fileSize.toLocaleString() - }, '{{size_mb}} MB ({{size_b}} bytes)'); - } + return _parseFileSize; + }() }, { key: "_parsePageSize", - value: function _parsePageSize(pageSizeInches, pagesRotation) { - var _this3 = this; + value: function () { + var _parsePageSize2 = _asyncToGenerator( + /*#__PURE__*/ + _regenerator["default"].mark(function _callee2(pageSizeInches, pagesRotation) { + var _this3 = this; - if (!pageSizeInches) { - return Promise.resolve(undefined); - } + var isPortrait, sizeInches, sizeMillimeters, pageName, name, exactMillimeters, intMillimeters; + return _regenerator["default"].wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + if (pageSizeInches) { + _context2.next = 2; + break; + } - if (pagesRotation % 180 !== 0) { - pageSizeInches = { - width: pageSizeInches.height, - height: pageSizeInches.width - }; - } + return _context2.abrupt("return", undefined); - var isPortrait = (0, _ui_utils.isPortraitOrientation)(pageSizeInches); - var sizeInches = { - width: Math.round(pageSizeInches.width * 100) / 100, - height: Math.round(pageSizeInches.height * 100) / 100 - }; - var sizeMillimeters = { - width: Math.round(pageSizeInches.width * 25.4 * 10) / 10, - height: Math.round(pageSizeInches.height * 25.4 * 10) / 10 - }; - var pageName = null; - var name = getPageName(sizeInches, isPortrait, US_PAGE_NAMES) || getPageName(sizeMillimeters, isPortrait, METRIC_PAGE_NAMES); + case 2: + if (pagesRotation % 180 !== 0) { + pageSizeInches = { + width: pageSizeInches.height, + height: pageSizeInches.width + }; + } - if (!name && !(Number.isInteger(sizeMillimeters.width) && Number.isInteger(sizeMillimeters.height))) { - var exactMillimeters = { - width: pageSizeInches.width * 25.4, - height: pageSizeInches.height * 25.4 - }; - var intMillimeters = { - width: Math.round(sizeMillimeters.width), - height: Math.round(sizeMillimeters.height) - }; + isPortrait = (0, _ui_utils.isPortraitOrientation)(pageSizeInches); + sizeInches = { + width: Math.round(pageSizeInches.width * 100) / 100, + height: Math.round(pageSizeInches.height * 100) / 100 + }; + sizeMillimeters = { + width: Math.round(pageSizeInches.width * 25.4 * 10) / 10, + height: Math.round(pageSizeInches.height * 25.4 * 10) / 10 + }; + pageName = null; + name = getPageName(sizeInches, isPortrait, US_PAGE_NAMES) || getPageName(sizeMillimeters, isPortrait, METRIC_PAGE_NAMES); + + if (!name && !(Number.isInteger(sizeMillimeters.width) && Number.isInteger(sizeMillimeters.height))) { + exactMillimeters = { + width: pageSizeInches.width * 25.4, + height: pageSizeInches.height * 25.4 + }; + intMillimeters = { + width: Math.round(sizeMillimeters.width), + height: Math.round(sizeMillimeters.height) + }; + + if (Math.abs(exactMillimeters.width - intMillimeters.width) < 0.1 && Math.abs(exactMillimeters.height - intMillimeters.height) < 0.1) { + name = getPageName(intMillimeters, isPortrait, METRIC_PAGE_NAMES); + + if (name) { + sizeInches = { + width: Math.round(intMillimeters.width / 25.4 * 100) / 100, + height: Math.round(intMillimeters.height / 25.4 * 100) / 100 + }; + sizeMillimeters = intMillimeters; + } + } + } + + if (name) { + pageName = this.l10n.get('document_properties_page_size_name_' + name.toLowerCase(), null, name); + } - if (Math.abs(exactMillimeters.width - intMillimeters.width) < 0.1 && Math.abs(exactMillimeters.height - intMillimeters.height) < 0.1) { - name = getPageName(intMillimeters, isPortrait, METRIC_PAGE_NAMES); + return _context2.abrupt("return", Promise.all([this._isNonMetricLocale ? sizeInches : sizeMillimeters, this.l10n.get('document_properties_page_size_unit_' + (this._isNonMetricLocale ? 'inches' : 'millimeters'), null, this._isNonMetricLocale ? 'in' : 'mm'), pageName, this.l10n.get('document_properties_page_size_orientation_' + (isPortrait ? 'portrait' : 'landscape'), null, isPortrait ? 'portrait' : 'landscape')]).then(function (_ref6) { + var _ref7 = _slicedToArray(_ref6, 4), + _ref7$ = _ref7[0], + width = _ref7$.width, + height = _ref7$.height, + unit = _ref7[1], + name = _ref7[2], + orientation = _ref7[3]; + + return _this3.l10n.get('document_properties_page_size_dimension_' + (name ? 'name_' : '') + 'string', { + width: width.toLocaleString(), + height: height.toLocaleString(), + unit: unit, + name: name, + orientation: orientation + }, '{{width}} × {{height}} {{unit}} (' + (name ? '{{name}}, ' : '') + '{{orientation}})'); + })); - if (name) { - sizeInches = { - width: Math.round(intMillimeters.width / 25.4 * 100) / 100, - height: Math.round(intMillimeters.height / 25.4 * 100) / 100 - }; - sizeMillimeters = intMillimeters; + case 11: + case "end": + return _context2.stop(); + } } - } - } + }, _callee2, this); + })); - if (name) { - pageName = this.l10n.get('document_properties_page_size_name_' + name.toLowerCase(), null, name); + function _parsePageSize(_x, _x2) { + return _parsePageSize2.apply(this, arguments); } - return Promise.all([this._isNonMetricLocale ? sizeInches : sizeMillimeters, this.l10n.get('document_properties_page_size_unit_' + (this._isNonMetricLocale ? 'inches' : 'millimeters'), null, this._isNonMetricLocale ? 'in' : 'mm'), pageName, this.l10n.get('document_properties_page_size_orientation_' + (isPortrait ? 'portrait' : 'landscape'), null, isPortrait ? 'portrait' : 'landscape')]).then(function (_ref6) { - var _ref7 = _slicedToArray(_ref6, 4), - _ref7$ = _ref7[0], - width = _ref7$.width, - height = _ref7$.height, - unit = _ref7[1], - name = _ref7[2], - orientation = _ref7[3]; - - return _this3.l10n.get('document_properties_page_size_dimension_' + (name ? 'name_' : '') + 'string', { - width: width.toLocaleString(), - height: height.toLocaleString(), - unit: unit, - name: name, - orientation: orientation - }, '{{width}} × {{height}} {{unit}} (' + (name ? '{{name}}, ' : '') + '{{orientation}})'); - }); - } + return _parsePageSize; + }() }, { key: "_parseDate", - value: function _parseDate(inputDate) { - if (!inputDate) { - return; - } + value: function () { + var _parseDate2 = _asyncToGenerator( + /*#__PURE__*/ + _regenerator["default"].mark(function _callee3(inputDate) { + var dateObject; + return _regenerator["default"].wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + dateObject = _pdfjsLib.PDFDateString.toDateObject(inputDate); + + if (dateObject) { + _context3.next = 3; + break; + } - var dateToParse = inputDate; + return _context3.abrupt("return", undefined); - if (dateToParse.substring(0, 2) === 'D:') { - dateToParse = dateToParse.substring(2); - } + case 3: + return _context3.abrupt("return", this.l10n.get('document_properties_date_string', { + date: dateObject.toLocaleDateString(), + time: dateObject.toLocaleTimeString() + }, '{{date}}, {{time}}')); - var year = parseInt(dateToParse.substring(0, 4), 10); - var month = parseInt(dateToParse.substring(4, 6), 10) - 1; - var day = parseInt(dateToParse.substring(6, 8), 10); - var hours = parseInt(dateToParse.substring(8, 10), 10); - var minutes = parseInt(dateToParse.substring(10, 12), 10); - var seconds = parseInt(dateToParse.substring(12, 14), 10); - var utRel = dateToParse.substring(14, 15); - var offsetHours = parseInt(dateToParse.substring(15, 17), 10); - var offsetMinutes = parseInt(dateToParse.substring(18, 20), 10); + case 4: + case "end": + return _context3.stop(); + } + } + }, _callee3, this); + })); - if (utRel === '-') { - hours += offsetHours; - minutes += offsetMinutes; - } else if (utRel === '+') { - hours -= offsetHours; - minutes -= offsetMinutes; + function _parseDate(_x3) { + return _parseDate2.apply(this, arguments); } - var date = new Date(Date.UTC(year, month, day, hours, minutes, seconds)); - var dateString = date.toLocaleDateString(); - var timeString = date.toLocaleTimeString(); - return this.l10n.get('document_properties_date_string', { - date: dateString, - time: timeString - }, '{{date}}, {{time}}'); - } + return _parseDate; + }() }, { key: "_parseLinearization", value: function _parseLinearization(isLinearized) { @@ -6308,7 +6414,7 @@ function () { exports.PDFDocumentProperties = PDFDocumentProperties; /***/ }), -/* 18 */ +/* 17 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6319,9 +6425,9 @@ Object.defineProperty(exports, "__esModule", { }); exports.PDFFindBar = void 0; -var _ui_utils = __webpack_require__(6); +var _ui_utils = __webpack_require__(5); -var _pdf_find_controller = __webpack_require__(19); +var _pdf_find_controller = __webpack_require__(18); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -6553,7 +6659,7 @@ function () { exports.PDFFindBar = PDFFindBar; /***/ }), -/* 19 */ +/* 18 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6564,11 +6670,11 @@ Object.defineProperty(exports, "__esModule", { }); exports.PDFFindController = exports.FindState = void 0; -var _ui_utils = __webpack_require__(6); +var _ui_utils = __webpack_require__(5); var _pdfjsLib = __webpack_require__(7); -var _pdf_find_utils = __webpack_require__(20); +var _pdf_find_utils = __webpack_require__(19); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -6774,8 +6880,8 @@ function () { var pageNumber = this._selected.pageIdx + 1; var linkService = this._linkService; - if (pageNumber >= 1 && pageNumber <= linkService.pagesCount && linkService.page !== pageNumber && linkService.isPageVisible && !linkService.isPageVisible(pageNumber)) { - break; + if (pageNumber >= 1 && pageNumber <= linkService.pagesCount && pageNumber !== linkService.page && !linkService.isPageVisible(pageNumber)) { + return true; } return false; @@ -7291,7 +7397,7 @@ function () { exports.PDFFindController = PDFFindController; /***/ }), -/* 20 */ +/* 19 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7387,7 +7493,7 @@ function getCharacterType(charCode) { } /***/ }), -/* 21 */ +/* 20 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7400,7 +7506,7 @@ exports.isDestHashesEqual = isDestHashesEqual; exports.isDestArraysEqual = isDestArraysEqual; exports.PDFHistory = void 0; -var _ui_utils = __webpack_require__(6); +var _ui_utils = __webpack_require__(5); function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } @@ -7984,7 +8090,7 @@ function isDestArraysEqual(firstDest, secondDest) { } /***/ }), -/* 22 */ +/* 21 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7995,7 +8101,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.SimpleLinkService = exports.PDFLinkService = void 0; -var _ui_utils = __webpack_require__(6); +var _ui_utils = __webpack_require__(5); function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } @@ -8068,7 +8174,7 @@ function () { namedDest: namedDest, explicitDest: explicitDest }); - }).catch(function () { + })["catch"](function () { console.error("PDFLinkService.navigateTo: \"".concat(destRef, "\" is not ") + "a valid page reference, for dest=\"".concat(dest, "\".")); }); @@ -8467,7 +8573,7 @@ function () { exports.SimpleLinkService = SimpleLinkService; /***/ }), -/* 23 */ +/* 22 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8569,12 +8675,18 @@ function () { } }, { key: "_addToggleButton", - value: function _addToggleButton(div) { + value: function _addToggleButton(div, _ref4) { var _this = this; + var count = _ref4.count, + items = _ref4.items; var toggler = document.createElement('div'); toggler.className = 'outlineItemToggler'; + if (count < 0 && Math.abs(count) === items.length) { + toggler.classList.add('outlineItemsHidden'); + } + toggler.onclick = function (evt) { evt.stopPropagation(); toggler.classList.toggle('outlineItemsHidden'); @@ -8607,8 +8719,8 @@ function () { _iteratorError = err; } finally { try { - if (!_iteratorNormalCompletion && _iterator.return != null) { - _iterator.return(); + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); } } finally { if (_didIteratorError) { @@ -8628,8 +8740,8 @@ function () { } }, { key: "render", - value: function render(_ref4) { - var outline = _ref4.outline; + value: function render(_ref5) { + var outline = _ref5.outline; var outlineCount = 0; if (this.outline) { @@ -8653,41 +8765,60 @@ function () { while (queue.length > 0) { var levelData = queue.shift(); + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; - for (var i = 0, len = levelData.items.length; i < len; i++) { - var item = levelData.items[i]; - var div = document.createElement('div'); - div.className = 'outlineItem'; - var element = document.createElement('a'); + try { + for (var _iterator2 = levelData.items[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var item = _step2.value; + var div = document.createElement('div'); + div.className = 'outlineItem'; + var element = document.createElement('a'); - this._bindLink(element, item); + this._bindLink(element, item); - this._setStyles(element, item); + this._setStyles(element, item); - element.textContent = (0, _pdfjsLib.removeNullCharacters)(item.title) || DEFAULT_TITLE; - div.appendChild(element); + element.textContent = (0, _pdfjsLib.removeNullCharacters)(item.title) || DEFAULT_TITLE; + div.appendChild(element); - if (item.items.length > 0) { - hasAnyNesting = true; + if (item.items.length > 0) { + hasAnyNesting = true; - this._addToggleButton(div); + this._addToggleButton(div, item); - var itemsDiv = document.createElement('div'); - itemsDiv.className = 'outlineItems'; - div.appendChild(itemsDiv); - queue.push({ - parent: itemsDiv, - items: item.items - }); - } + var itemsDiv = document.createElement('div'); + itemsDiv.className = 'outlineItems'; + div.appendChild(itemsDiv); + queue.push({ + parent: itemsDiv, + items: item.items + }); + } - levelData.parent.appendChild(div); - outlineCount++; + levelData.parent.appendChild(div); + outlineCount++; + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } } } if (hasAnyNesting) { this.container.classList.add('outlineWithDeepNesting'); + this.lastToggleIsShow = fragment.querySelectorAll('.outlineItemsHidden').length === 0; } this.container.appendChild(fragment); @@ -8702,7 +8833,7 @@ function () { exports.PDFOutlineViewer = PDFOutlineViewer; /***/ }), -/* 24 */ +/* 23 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8713,7 +8844,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.PDFPresentationMode = void 0; -var _ui_utils = __webpack_require__(6); +var _ui_utils = __webpack_require__(5); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -9160,7 +9291,7 @@ function () { exports.PDFPresentationMode = PDFPresentationMode; /***/ }), -/* 25 */ +/* 24 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9171,7 +9302,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.PDFSidebarResizer = void 0; -var _ui_utils = __webpack_require__(6); +var _ui_utils = __webpack_require__(5); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -9336,7 +9467,7 @@ function () { exports.PDFSidebarResizer = PDFSidebarResizer; /***/ }), -/* 26 */ +/* 25 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9347,9 +9478,9 @@ Object.defineProperty(exports, "__esModule", { }); exports.PDFThumbnailViewer = void 0; -var _ui_utils = __webpack_require__(6); +var _ui_utils = __webpack_require__(5); -var _pdf_thumbnail_view = __webpack_require__(27); +var _pdf_thumbnail_view = __webpack_require__(26); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -9501,7 +9632,7 @@ function () { var thumbnailView = _this._thumbnails[_this._currentPageNumber - 1]; thumbnailView.div.classList.add(THUMBNAIL_SELECTED_CLASS); - }).catch(function (reason) { + })["catch"](function (reason) { console.error('Unable to initialize thumbnail viewer', reason); }); } @@ -9555,7 +9686,7 @@ function () { thumbView.setPdfPage(pdfPage); _this2._pagesRequests[pageNumber] = null; return pdfPage; - }).catch(function (reason) { + })["catch"](function (reason) { console.error('Unable to get page for thumb view', reason); _this2._pagesRequests[pageNumber] = null; }); @@ -9613,7 +9744,7 @@ function () { exports.PDFThumbnailViewer = PDFThumbnailViewer; /***/ }), -/* 27 */ +/* 26 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9626,9 +9757,9 @@ exports.PDFThumbnailView = void 0; var _pdfjsLib = __webpack_require__(7); -var _ui_utils = __webpack_require__(6); +var _ui_utils = __webpack_require__(5); -var _pdf_rendering_queue = __webpack_require__(10); +var _pdf_rendering_queue = __webpack_require__(11); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -9757,6 +9888,7 @@ function () { key: "reset", value: function reset() { this.cancelRendering(); + this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL; this.pageWidth = this.viewport.width; this.pageHeight = this.viewport.height; this.pageRatio = this.pageWidth / this.pageHeight; @@ -9807,7 +9939,6 @@ function () { this.renderTask = null; } - this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL; this.resume = null; } }, { @@ -10044,7 +10175,7 @@ function () { exports.PDFThumbnailView = PDFThumbnailView; /***/ }), -/* 28 */ +/* 27 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10055,7 +10186,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.PDFViewer = void 0; -var _base_viewer = __webpack_require__(29); +var _base_viewer = __webpack_require__(28); var _pdfjsLib = __webpack_require__(7); @@ -10162,8 +10293,8 @@ function (_BaseViewer) { _iteratorError = err; } finally { try { - if (!_iteratorNormalCompletion && _iterator.return != null) { - _iterator.return(); + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); } } finally { if (_didIteratorError) { @@ -10191,7 +10322,7 @@ function (_BaseViewer) { exports.PDFViewer = PDFViewer; /***/ }), -/* 29 */ +/* 28 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10202,19 +10333,19 @@ Object.defineProperty(exports, "__esModule", { }); exports.BaseViewer = void 0; -var _ui_utils = __webpack_require__(6); +var _ui_utils = __webpack_require__(5); -var _pdf_rendering_queue = __webpack_require__(10); +var _pdf_rendering_queue = __webpack_require__(11); -var _annotation_layer_builder = __webpack_require__(30); +var _annotation_layer_builder = __webpack_require__(29); var _pdfjsLib = __webpack_require__(7); -var _pdf_page_view = __webpack_require__(31); +var _pdf_page_view = __webpack_require__(30); -var _pdf_link_service = __webpack_require__(22); +var _pdf_link_service = __webpack_require__(21); -var _text_layer_builder = __webpack_require__(32); +var _text_layer_builder = __webpack_require__(31); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -10453,6 +10584,10 @@ function () { } onePageRenderedCapability.promise.then(function () { + if (_this2.findController) { + _this2.findController.setDocument(pdfDocument); + } + if (pdfDocument.loadingParams['disableAutoFetch']) { pagesCapability.resolve(); return; @@ -10491,14 +10626,10 @@ function () { source: _this2 }); - if (_this2.findController) { - _this2.findController.setDocument(pdfDocument); - } - if (_this2.defaultRenderingQueue) { _this2.update(); } - }).catch(function (reason) { + })["catch"](function (reason) { console.error('Unable to initialize viewer', reason); }); } @@ -10957,7 +11088,7 @@ function () { _this3._pagesRequests[pageNumber] = null; return pdfPage; - }).catch(function (reason) { + })["catch"](function (reason) { console.error('Unable to get page for page view', reason); _this3._pagesRequests[pageNumber] = null; }); @@ -11325,7 +11456,7 @@ function () { exports.BaseViewer = BaseViewer; /***/ }), -/* 30 */ +/* 29 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11338,9 +11469,9 @@ exports.DefaultAnnotationLayerFactory = exports.AnnotationLayerBuilder = void 0; var _pdfjsLib = __webpack_require__(7); -var _ui_utils = __webpack_require__(6); +var _ui_utils = __webpack_require__(5); -var _pdf_link_service = __webpack_require__(22); +var _pdf_link_service = __webpack_require__(21); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -11473,7 +11604,7 @@ function () { exports.DefaultAnnotationLayerFactory = DefaultAnnotationLayerFactory; /***/ }), -/* 31 */ +/* 30 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11486,15 +11617,15 @@ exports.PDFPageView = void 0; var _regenerator = _interopRequireDefault(__webpack_require__(2)); -var _ui_utils = __webpack_require__(6); +var _ui_utils = __webpack_require__(5); var _pdfjsLib = __webpack_require__(7); -var _pdf_rendering_queue = __webpack_require__(10); +var _pdf_rendering_queue = __webpack_require__(11); -var _viewer_compatibility = __webpack_require__(13); +var _viewer_compatibility = __webpack_require__(8); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } @@ -11588,7 +11719,7 @@ function () { } var zoomLayerCanvas = this.zoomLayer.firstChild; - this.paintedViewportMap.delete(zoomLayerCanvas); + this.paintedViewportMap["delete"](zoomLayerCanvas); zoomLayerCanvas.width = 0; zoomLayerCanvas.height = 0; @@ -11604,6 +11735,7 @@ function () { var keepZoomLayer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; var keepAnnotations = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; this.cancelRendering(keepAnnotations); + this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL; var div = this.div; div.style.width = Math.floor(this.viewport.width) + 'px'; div.style.height = Math.floor(this.viewport.height) + 'px'; @@ -11632,7 +11764,7 @@ function () { if (!currentZoomLayerNode) { if (this.canvas) { - this.paintedViewportMap.delete(this.canvas); + this.paintedViewportMap["delete"](this.canvas); this.canvas.width = 0; this.canvas.height = 0; delete this.canvas; @@ -11642,7 +11774,7 @@ function () { } if (this.svg) { - this.paintedViewportMap.delete(this.svg); + this.paintedViewportMap["delete"](this.svg); delete this.svg; } @@ -11712,14 +11844,12 @@ function () { key: "cancelRendering", value: function cancelRendering() { var keepAnnotations = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - var renderingState = this.renderingState; if (this.paintTask) { this.paintTask.cancel(); this.paintTask = null; } - this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL; this.resume = null; if (this.textLayer) { @@ -11731,14 +11861,6 @@ function () { this.annotationLayer.cancel(); this.annotationLayer = null; } - - if (renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) { - this.eventBus.dispatch('pagecancelled', { - source: this, - pageNumber: this.id, - renderingState: renderingState - }); - } } }, { key: "cssTransform", @@ -11884,8 +12006,8 @@ function () { function () { var _ref = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee(error) { - return _regenerator.default.wrap(function _callee$(_context) { + _regenerator["default"].mark(function _callee(error) { + return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: @@ -11936,7 +12058,7 @@ function () { return _context.stop(); } } - }, _callee, this); + }, _callee); })); return function finishPaintTask(_x) { @@ -12142,7 +12264,7 @@ function () { exports.PDFPageView = PDFPageView; /***/ }), -/* 32 */ +/* 31 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12153,7 +12275,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.DefaultTextLayerFactory = exports.TextLayerBuilder = void 0; -var _ui_utils = __webpack_require__(6); +var _ui_utils = __webpack_require__(5); var _pdfjsLib = __webpack_require__(7); @@ -12194,9 +12316,7 @@ function () { this.findController = findController; this.textLayerRenderTask = null; this.enhanceTextSelection = enhanceTextSelection; - this._boundEvents = Object.create(null); - - this._bindEvents(); + this._onUpdateTextLayerMatches = null; this._bindMouse(); } @@ -12249,6 +12369,16 @@ function () { _this._updateMatches(); }, function (reason) {}); + + if (!this._onUpdateTextLayerMatches) { + this._onUpdateTextLayerMatches = function (evt) { + if (evt.pageIndex === _this.pageIdx || evt.pageIndex === -1) { + _this._updateMatches(); + } + }; + + this.eventBus.on('updatetextlayermatches', this._onUpdateTextLayerMatches); + } } }, { key: "cancel", @@ -12257,6 +12387,11 @@ function () { this.textLayerRenderTask.cancel(); this.textLayerRenderTask = null; } + + if (this._onUpdateTextLayerMatches) { + this.eventBus.off('updatetextlayermatches', this._onUpdateTextLayerMatches); + this._onUpdateTextLayerMatches = null; + } } }, { key: "setTextContentStream", @@ -12457,51 +12592,16 @@ function () { this._renderMatches(this.matches); } - }, { - key: "_bindEvents", - value: function _bindEvents() { - var _this2 = this; - - var eventBus = this.eventBus, - _boundEvents = this._boundEvents; - - _boundEvents.pageCancelled = function (evt) { - if (evt.pageNumber !== _this2.pageNumber) { - return; - } - - if (_this2.textLayerRenderTask) { - console.error('TextLayerBuilder._bindEvents: `this.cancel()` should ' + 'have been called when the page was reset, or rendering cancelled.'); - return; - } - - for (var name in _boundEvents) { - eventBus.off(name.toLowerCase(), _boundEvents[name]); - delete _boundEvents[name]; - } - }; - - _boundEvents.updateTextLayerMatches = function (evt) { - if (evt.pageIndex !== _this2.pageIdx && evt.pageIndex !== -1) { - return; - } - - _this2._updateMatches(); - }; - - eventBus.on('pagecancelled', _boundEvents.pageCancelled); - eventBus.on('updatetextlayermatches', _boundEvents.updateTextLayerMatches); - } }, { key: "_bindMouse", value: function _bindMouse() { - var _this3 = this; + var _this2 = this; var div = this.textLayerDiv; var expandDivsTimer = null; div.addEventListener('mousedown', function (evt) { - if (_this3.enhanceTextSelection && _this3.textLayerRenderTask) { - _this3.textLayerRenderTask.expandTextDivs(true); + if (_this2.enhanceTextSelection && _this2.textLayerRenderTask) { + _this2.textLayerRenderTask.expandTextDivs(true); if (expandDivsTimer) { clearTimeout(expandDivsTimer); @@ -12529,10 +12629,10 @@ function () { end.classList.add('active'); }); div.addEventListener('mouseup', function () { - if (_this3.enhanceTextSelection && _this3.textLayerRenderTask) { + if (_this2.enhanceTextSelection && _this2.textLayerRenderTask) { expandDivsTimer = setTimeout(function () { - if (_this3.textLayerRenderTask) { - _this3.textLayerRenderTask.expandTextDivs(false); + if (_this2.textLayerRenderTask) { + _this2.textLayerRenderTask.expandTextDivs(false); } expandDivsTimer = null; @@ -12583,7 +12683,7 @@ function () { exports.DefaultTextLayerFactory = DefaultTextLayerFactory; /***/ }), -/* 33 */ +/* 32 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12594,11 +12694,11 @@ Object.defineProperty(exports, "__esModule", { }); exports.SecondaryToolbar = void 0; -var _ui_utils = __webpack_require__(6); +var _ui_utils = __webpack_require__(5); -var _pdf_cursor_tools = __webpack_require__(8); +var _pdf_cursor_tools = __webpack_require__(9); -var _pdf_single_page_viewer = __webpack_require__(34); +var _pdf_single_page_viewer = __webpack_require__(33); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -12792,23 +12892,25 @@ function () { eventName = _this2$buttons$button.eventName, close = _this2$buttons$button.close, eventDetails = _this2$buttons$button.eventDetails; - element.addEventListener('click', function (evt) { - if (eventName !== null) { - var details = { - source: _this2 - }; - - for (var property in eventDetails) { - details[property] = eventDetails[property]; - } + if (element) { + element.addEventListener('click', function (evt) { + if (eventName !== null) { + var details = { + source: _this2 + }; + + for (var property in eventDetails) { + details[property] = eventDetails[property]; + } - _this2.eventBus.dispatch(eventName, details); - } + _this2.eventBus.dispatch(eventName, details); + } - if (close) { - _this2.close(); - } - }); + if (close) { + _this2.close(); + } + }); + } }; for (var button in this.buttons) { @@ -12933,7 +13035,7 @@ function () { exports.SecondaryToolbar = SecondaryToolbar; /***/ }), -/* 34 */ +/* 33 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12944,7 +13046,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.PDFSinglePageViewer = void 0; -var _base_viewer = __webpack_require__(29); +var _base_viewer = __webpack_require__(28); var _pdfjsLib = __webpack_require__(7); @@ -13104,7 +13206,7 @@ function (_BaseViewer) { exports.PDFSinglePageViewer = PDFSinglePageViewer; /***/ }), -/* 35 */ +/* 34 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13115,7 +13217,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.Toolbar = void 0; -var _ui_utils = __webpack_require__(6); +var _ui_utils = __webpack_require__(5); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -13238,16 +13340,20 @@ function () { source: self }); }); - items.print.addEventListener('click', function () { - eventBus.dispatch('print', { - source: self - }); - }); - items.download.addEventListener('click', function () { - eventBus.dispatch('download', { - source: self - }); - }); + if (items.print) { + items.print.addEventListener('click', function () { + eventBus.dispatch('print', { + source: self + }); + }); + } + if (items.download) { + items.download.addEventListener('click', function () { + eventBus.dispatch('download', { + source: self + }); + }); + } items.scaleSelect.oncontextmenu = _ui_utils.noContextMenuHandler; eventBus.on('localized', function () { _this._localized(); @@ -13367,7 +13473,7 @@ function () { exports.Toolbar = Toolbar; /***/ }), -/* 36 */ +/* 35 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13380,7 +13486,7 @@ exports.ViewHistory = void 0; var _regenerator = _interopRequireDefault(__webpack_require__(2)); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } @@ -13444,9 +13550,9 @@ function () { value: function () { var _writeToStorage2 = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee() { + _regenerator["default"].mark(function _callee() { var databaseStr; - return _regenerator.default.wrap(function _callee$(_context) { + return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: @@ -13472,8 +13578,8 @@ function () { value: function () { var _readFromStorage2 = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee2() { - return _regenerator.default.wrap(function _callee2$(_context2) { + _regenerator["default"].mark(function _callee2() { + return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: @@ -13484,7 +13590,7 @@ function () { return _context2.stop(); } } - }, _callee2, this); + }, _callee2); })); function _readFromStorage() { @@ -13498,8 +13604,8 @@ function () { value: function () { var _set = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee3(name, val) { - return _regenerator.default.wrap(function _callee3$(_context3) { + _regenerator["default"].mark(function _callee3(name, val) { + return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: @@ -13529,9 +13635,9 @@ function () { value: function () { var _setMultiple = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee4(properties) { + _regenerator["default"].mark(function _callee4(properties) { var name; - return _regenerator.default.wrap(function _callee4$(_context4) { + return _regenerator["default"].wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: @@ -13564,9 +13670,9 @@ function () { value: function () { var _get = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee5(name, defaultValue) { + _regenerator["default"].mark(function _callee5(name, defaultValue) { var val; - return _regenerator.default.wrap(function _callee5$(_context5) { + return _regenerator["default"].wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: @@ -13596,9 +13702,9 @@ function () { value: function () { var _getMultiple = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee6(properties) { + _regenerator["default"].mark(function _callee6(properties) { var values, name, val; - return _regenerator.default.wrap(function _callee6$(_context6) { + return _regenerator["default"].wrap(function _callee6$(_context6) { while (1) { switch (_context6.prev = _context6.next) { case 0: @@ -13637,7 +13743,7 @@ function () { exports.ViewHistory = ViewHistory; /***/ }), -/* 37 */ +/* 36 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13652,13 +13758,13 @@ var _regenerator = _interopRequireDefault(__webpack_require__(2)); var _app = __webpack_require__(1); -var _preferences = __webpack_require__(38); +var _preferences = __webpack_require__(37); -var _download_manager = __webpack_require__(39); +var _download_manager = __webpack_require__(38); -var _genericl10n = __webpack_require__(40); +var _genericl10n = __webpack_require__(39); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } @@ -13702,8 +13808,8 @@ function (_BasePreferences) { value: function () { var _writeToStorage2 = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee(prefObj) { - return _regenerator.default.wrap(function _callee$(_context) { + _regenerator["default"].mark(function _callee(prefObj) { + return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: @@ -13714,7 +13820,7 @@ function (_BasePreferences) { return _context.stop(); } } - }, _callee, this); + }, _callee); })); function _writeToStorage(_x) { @@ -13728,8 +13834,8 @@ function (_BasePreferences) { value: function () { var _readFromStorage2 = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee2(prefObj) { - return _regenerator.default.wrap(function _callee2$(_context2) { + _regenerator["default"].mark(function _callee2(prefObj) { + return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: @@ -13740,7 +13846,7 @@ function (_BasePreferences) { return _context2.stop(); } } - }, _callee2, this); + }, _callee2); })); function _readFromStorage(_x2) { @@ -13773,7 +13879,7 @@ GenericExternalServices.createL10n = function (_ref) { _app.PDFViewerApplication.externalServices = GenericExternalServices; /***/ }), -/* 38 */ +/* 37 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13786,7 +13892,7 @@ exports.BasePreferences = void 0; var _regenerator = _interopRequireDefault(__webpack_require__(2)); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } @@ -13805,27 +13911,27 @@ var defaultPreferences = null; function getDefaultPreferences() { if (!defaultPreferences) { defaultPreferences = Promise.resolve({ - "viewOnLoad": 0, - "defaultZoomValue": "", - "sidebarViewOnLoad": -1, "cursorToolOnLoad": 0, + "defaultZoomValue": "", + "disablePageLabels": false, + "enablePrintAutoRotate": false, "enableWebGL": false, "eventBusDispatchToDOM": false, - "pdfBugEnabled": false, - "disableRange": false, - "disableStream": false, - "disableAutoFetch": false, - "disableFontFace": false, - "textLayerMode": 1, - "useOnlyCssZoom": false, "externalLinkTarget": 0, + "historyUpdateUrl": false, + "pdfBugEnabled": false, "renderer": "canvas", "renderInteractiveForms": false, - "enablePrintAutoRotate": false, - "disablePageLabels": false, - "historyUpdateUrl": false, + "sidebarViewOnLoad": -1, "scrollModeOnLoad": -1, - "spreadModeOnLoad": -1 + "spreadModeOnLoad": -1, + "textLayerMode": 1, + "useOnlyCssZoom": false, + "viewOnLoad": 0, + "disableAutoFetch": false, + "disableFontFace": false, + "disableRange": false, + "disableStream": false }); } @@ -13877,8 +13983,8 @@ function () { value: function () { var _writeToStorage2 = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee(prefObj) { - return _regenerator.default.wrap(function _callee$(_context) { + _regenerator["default"].mark(function _callee(prefObj) { + return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: @@ -13889,7 +13995,7 @@ function () { return _context.stop(); } } - }, _callee, this); + }, _callee); })); function _writeToStorage(_x) { @@ -13903,8 +14009,8 @@ function () { value: function () { var _readFromStorage2 = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee2(prefObj) { - return _regenerator.default.wrap(function _callee2$(_context2) { + _regenerator["default"].mark(function _callee2(prefObj) { + return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: @@ -13915,7 +14021,7 @@ function () { return _context2.stop(); } } - }, _callee2, this); + }, _callee2); })); function _readFromStorage(_x2) { @@ -13929,8 +14035,8 @@ function () { value: function () { var _reset = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee3() { - return _regenerator.default.wrap(function _callee3$(_context3) { + _regenerator["default"].mark(function _callee3() { + return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: @@ -13960,9 +14066,9 @@ function () { value: function () { var _set = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee4(name, value) { + _regenerator["default"].mark(function _callee4(name, value) { var defaultValue, valueType, defaultType; - return _regenerator.default.wrap(function _callee4$(_context4) { + return _regenerator["default"].wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: @@ -14043,9 +14149,9 @@ function () { value: function () { var _get = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee5(name) { + _regenerator["default"].mark(function _callee5(name) { var defaultValue, prefValue; - return _regenerator.default.wrap(function _callee5$(_context5) { + return _regenerator["default"].wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: @@ -14094,8 +14200,8 @@ function () { value: function () { var _getAll = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee6() { - return _regenerator.default.wrap(function _callee6$(_context6) { + _regenerator["default"].mark(function _callee6() { + return _regenerator["default"].wrap(function _callee6$(_context6) { while (1) { switch (_context6.prev = _context6.next) { case 0: @@ -14127,7 +14233,7 @@ function () { exports.BasePreferences = BasePreferences; /***/ }), -/* 39 */ +/* 38 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14193,9 +14299,10 @@ function () { key: "downloadData", value: function downloadData(data, filename, contentType) { if (navigator.msSaveBlob) { - return navigator.msSaveBlob(new Blob([data], { + navigator.msSaveBlob(new Blob([data], { type: contentType }), filename); + return; } var blobUrl = (0, _pdfjsLib.createObjectURL)(data, contentType, this.disableCreateObjectURL); @@ -14230,7 +14337,7 @@ function () { exports.DownloadManager = DownloadManager; /***/ }), -/* 40 */ +/* 39 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14243,9 +14350,9 @@ exports.GenericL10n = void 0; var _regenerator = _interopRequireDefault(__webpack_require__(2)); -__webpack_require__(41); +__webpack_require__(40); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } @@ -14278,9 +14385,9 @@ function () { value: function () { var _getLanguage = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee() { + _regenerator["default"].mark(function _callee() { var l10n; - return _regenerator.default.wrap(function _callee$(_context) { + return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: @@ -14310,9 +14417,9 @@ function () { value: function () { var _getDirection = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee2() { + _regenerator["default"].mark(function _callee2() { var l10n; - return _regenerator.default.wrap(function _callee2$(_context2) { + return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: @@ -14342,9 +14449,9 @@ function () { value: function () { var _get = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee3(property, args, fallback) { + _regenerator["default"].mark(function _callee3(property, args, fallback) { var l10n; - return _regenerator.default.wrap(function _callee3$(_context3) { + return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: @@ -14374,9 +14481,9 @@ function () { value: function () { var _translate = _asyncToGenerator( /*#__PURE__*/ - _regenerator.default.mark(function _callee4(element) { + _regenerator["default"].mark(function _callee4(element) { var l10n; - return _regenerator.default.wrap(function _callee4$(_context4) { + return _regenerator["default"].wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: @@ -14409,7 +14516,7 @@ function () { exports.GenericL10n = GenericL10n; /***/ }), -/* 41 */ +/* 40 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15241,7 +15348,7 @@ document.webL10n = function (window, document, undefined) { }(window, document); /***/ }), -/* 42 */ +/* 41 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15252,10 +15359,12 @@ Object.defineProperty(exports, "__esModule", { }); exports.PDFPrintService = PDFPrintService; -var _ui_utils = __webpack_require__(6); +var _ui_utils = __webpack_require__(5); var _app = __webpack_require__(1); +var _app_options = __webpack_require__(6); + var _pdfjsLib = __webpack_require__(7); var activeService = null; @@ -15263,7 +15372,7 @@ var overlayManager = null; function renderPage(activeServiceOnEntry, pdfDocument, pageNumber, size) { var scratchCanvas = activeService.scratchCanvas; - var PRINT_RESOLUTION = 150; + var PRINT_RESOLUTION = _app_options.AppOptions.get('printResolution') || 150; var PRINT_UNITS = PRINT_RESOLUTION / 72.0; scratchCanvas.width = Math.floor(size.width * PRINT_UNITS); scratchCanvas.height = Math.floor(size.height * PRINT_UNITS); @@ -15447,7 +15556,7 @@ window.print = function print() { var activeServiceOnEntry = activeService; activeService.renderPages().then(function () { return activeServiceOnEntry.performPrint(); - }).catch(function () {}).then(function () { + })["catch"](function () {}).then(function () { if (activeServiceOnEntry.active) { abort(); } diff --git a/cps/static/js/main.js b/cps/static/js/main.js index 2b2716bf..8f54ba45 100644 --- a/cps/static/js/main.js +++ b/cps/static/js/main.js @@ -228,6 +228,41 @@ $(function() { $(this).find(".modal-body").html("..."); }); + $("#modal_kobo_token") + .on("show.bs.modal", function(e) { + var $modalBody = $(this).find(".modal-body"); + + // Prevent static assets from loading multiple times + var useCache = function(options) { + options.async = true; + options.cache = true; + }; + preFilters.add(useCache); + + $.get(e.relatedTarget.href).done(function(content) { + $modalBody.html(content); + preFilters.remove(useCache); + }); + }) + .on("hidden.bs.modal", function() { + $(this).find(".modal-body").html("..."); + $("#config_delete_kobo_token").show(); + }); + + $("#btndeletetoken").click(function() { + //get data-id attribute of the clicked element + var pathname = document.getElementsByTagName("script"), src = pathname[pathname.length-1].src; + var path = src.substring(0,src.lastIndexOf("/")); + // var domainId = $(this).value("domainId"); + $.ajax({ + method:"get", + url: path + "/../../kobo_auth/deleteauthtoken/" + this.value, + }); + $("#modalDeleteToken").modal("hide"); + $("#config_delete_kobo_token").hide(); + + }); + $(window).resize(function() { $(".discover .row").isotope("layout"); }); diff --git a/cps/static/js/shelforder.js b/cps/static/js/shelforder.js index 3f804ad5..62b7e9f3 100644 --- a/cps/static/js/shelforder.js +++ b/cps/static/js/shelforder.js @@ -29,7 +29,7 @@ function sendData(path) { var maxElements; var tmp = []; - elements = Sortable.utils.find(sortTrue, "div"); + elements = $(".list-group-item"); maxElements = elements.length; var form = document.createElement("form"); diff --git a/cps/static/js/table.js b/cps/static/js/table.js index 12c07102..de570ed8 100644 --- a/cps/static/js/table.js +++ b/cps/static/js/table.js @@ -93,6 +93,116 @@ $(function() { var domainId = $(e.relatedTarget).data("domain-id"); $(e.currentTarget).find("#btndeletedomain").data("domainId", domainId); }); + + $('#restrictModal').on('hidden.bs.modal', function () { + // Destroy table and remove hooks for buttons + $("#restrict-elements-table").unbind(); + $('#restrict-elements-table').bootstrapTable('destroy'); + $("[id^=submit_]").unbind(); + $('#h1').addClass('hidden'); + $('#h2').addClass('hidden'); + $('#h3').addClass('hidden'); + $('#h4').addClass('hidden'); + }); + function startTable(type){ + var pathname = document.getElementsByTagName("script"), src = pathname[pathname.length-1].src; + var path = src.substring(0,src.lastIndexOf("/")); + $("#restrict-elements-table").bootstrapTable({ + formatNoMatches: function () { + return ""; + }, + url: path + "/../../ajax/listrestriction/" + type, + rowStyle: function(row, index) { + console.log('Reihe :' + row + ' Index :'+ index); + if (row.id.charAt(0) == 'a') { + return {classes: 'bg-primary'} + } + else { + return {classes: 'bg-dark-danger'} + } + }, + onClickCell: function (field, value, row, $element) { + if(field == 3){ + console.log("element") + $.ajax ({ + type: 'Post', + data: 'id=' + row.id + '&type=' + row.type + "&Element=" + row.Element, + url: path + "/../../ajax/deleterestriction/" + type, + async: true, + timeout: 900, + success:function(data) { + $.ajax({ + method:"get", + url: path + "/../../ajax/listrestriction/"+type, + async: true, + timeout: 900, + success:function(data) { + $("#restrict-elements-table").bootstrapTable("load", data); + } + }); + } + }); + } + }, + striped: false + }); + $("#restrict-elements-table").removeClass('table-hover'); + $("#restrict-elements-table").on('editable-save.bs.table', function (e, field, row, old, $el) { + console.log("Hallo"); + $.ajax({ + url: path + "/../../ajax/editrestriction/"+type, + type: 'Post', + data: row //$(this).closest("form").serialize() + "&" + $(this)[0].name + "=", + }); + }); + $("[id^=submit_]").click(function(event) { + // event.stopPropagation(); + // event.preventDefault(); + $(this)[0].blur(); + console.log($(this)[0].name); + $.ajax({ + url: path + "/../../ajax/addrestriction/"+type, + type: 'Post', + data: $(this).closest("form").serialize() + "&" + $(this)[0].name + "=", + success: function () { + $.ajax ({ + method:"get", + url: path + "/../../ajax/listrestriction/"+type, + async: true, + timeout: 900, + success:function(data) { + $("#restrict-elements-table").bootstrapTable("load", data); + } + }); + } + }); + return; + }); + } + $('#get_column_values').on('click',function() + { + startTable(1); + $('#h2').removeClass('hidden'); + }); + + $('#get_tags').on('click',function() + { + startTable(0); + $('#h1').removeClass('hidden'); + }); + $('#get_user_column_values').on('click',function() + { + startTable(3); + $('#h4').removeClass('hidden'); + }); + + $('#get_user_tags').on('click',function() + { + startTable(2); + $(this)[0].blur(); + $('#h3').removeClass('hidden'); + }); + }); /* Function for deleting domain restrictions */ @@ -104,3 +214,12 @@ function TableActions (value, row, index) { "" ].join(""); } + +/* Function for deleting domain restrictions */ +function RestrictionActions (value, row, index) { + return [ + "
", + "", + "
" + ].join(""); +} diff --git a/cps/static/locale/ar/viewer.properties b/cps/static/locale/ar/viewer.properties index f4b53ede..b42ba74c 100644 --- a/cps/static/locale/ar/viewer.properties +++ b/cps/static/locale/ar/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=ملف PDF تالف أو غير صحيح. missing_file_error=ملف PDF غير موجود. unexpected_response_error=استجابة خادوم غير متوقعة. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}، {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/be/viewer.properties b/cps/static/locale/be/viewer.properties index f606dc32..d3f81887 100644 --- a/cps/static/locale/be/viewer.properties +++ b/cps/static/locale/be/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Няспраўны або пашкоджаны файл PDF. missing_file_error=Адсутны файл PDF. unexpected_response_error=Нечаканы адказ сервера. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/br/viewer.properties b/cps/static/locale/br/viewer.properties index ae721dd6..ac2558e1 100644 --- a/cps/static/locale/br/viewer.properties +++ b/cps/static/locale/br/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Restr PDF didalvoudek pe kontronet. missing_file_error=Restr PDF o vankout. unexpected_response_error=Respont dic'hortoz a-berzh an dafariad +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/cak/viewer.properties b/cps/static/locale/cak/viewer.properties index 780ccf5c..8086f32a 100644 --- a/cps/static/locale/cak/viewer.properties +++ b/cps/static/locale/cak/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Man oke ta o yujtajinäq ri PDF yakb'äl. missing_file_error=Man xilitäj ta ri PDF yakb'äl. unexpected_response_error=Man oyob'en ta tz'olin rutzij ruk'u'x samaj. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/cs/viewer.properties b/cps/static/locale/cs/viewer.properties index 7ba084e9..1dd8a36c 100644 --- a/cps/static/locale/cs/viewer.properties +++ b/cps/static/locale/cs/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Neplatný nebo chybný soubor PDF. missing_file_error=Chybí soubor PDF. unexpected_response_error=Neočekávaná odpověď serveru. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/cy/viewer.properties b/cps/static/locale/cy/viewer.properties index 44a3fee5..45493a54 100644 --- a/cps/static/locale/cy/viewer.properties +++ b/cps/static/locale/cy/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Ffeil PDF annilys neu llwgr. missing_file_error=Ffeil PDF coll. unexpected_response_error=Ymateb annisgwyl gan y gweinydd. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/da/viewer.properties b/cps/static/locale/da/viewer.properties index 62db0930..dce46725 100644 --- a/cps/static/locale/da/viewer.properties +++ b/cps/static/locale/da/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=PDF-filen er ugyldig eller ødelagt. missing_file_error=Manglende PDF-fil. unexpected_response_error=Uventet svar fra serveren. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/de/viewer.properties b/cps/static/locale/de/viewer.properties index 50464d86..cea73190 100644 --- a/cps/static/locale/de/viewer.properties +++ b/cps/static/locale/de/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Ungültige oder beschädigte PDF-Datei missing_file_error=Fehlende PDF-Datei unexpected_response_error=Unerwartete Antwort des Servers +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/el/viewer.properties b/cps/static/locale/el/viewer.properties index 725c547d..d7a6abc1 100644 --- a/cps/static/locale/el/viewer.properties +++ b/cps/static/locale/el/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Μη έγκυρο ή κατεστραμμένο αρχείο missing_file_error=Λείπει αρχείο PDF. unexpected_response_error=Μη αναμενόμενη απόκριση από το διακομιστή. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/en-CA/viewer.properties b/cps/static/locale/en-CA/viewer.properties index ddc42138..e52573b1 100644 --- a/cps/static/locale/en-CA/viewer.properties +++ b/cps/static/locale/en-CA/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Invalid or corrupted PDF file. missing_file_error=Missing PDF file. unexpected_response_error=Unexpected server response. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/en-GB/viewer.properties b/cps/static/locale/en-GB/viewer.properties index ddc42138..e52573b1 100644 --- a/cps/static/locale/en-GB/viewer.properties +++ b/cps/static/locale/en-GB/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Invalid or corrupted PDF file. missing_file_error=Missing PDF file. unexpected_response_error=Unexpected server response. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/en-US/viewer.properties b/cps/static/locale/en-US/viewer.properties index 22045e11..2dd7751a 100644 --- a/cps/static/locale/en-US/viewer.properties +++ b/cps/static/locale/en-US/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Invalid or corrupted PDF file. missing_file_error=Missing PDF file. unexpected_response_error=Unexpected server response. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/eo/viewer.properties b/cps/static/locale/eo/viewer.properties index 04272e4a..eb294955 100644 --- a/cps/static/locale/eo/viewer.properties +++ b/cps/static/locale/eo/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Nevalida aŭ difektita PDF dosiero. missing_file_error=Mankas dosiero PDF. unexpected_response_error=Neatendita respondo de servilo. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/es-AR/viewer.properties b/cps/static/locale/es-AR/viewer.properties index 4ba3ddc1..6f3662c7 100644 --- a/cps/static/locale/es-AR/viewer.properties +++ b/cps/static/locale/es-AR/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Archivo PDF no válido o cocrrupto. missing_file_error=Archivo PDF faltante. unexpected_response_error=Respuesta del servidor inesperada. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/es-CL/viewer.properties b/cps/static/locale/es-CL/viewer.properties index b73dab4c..7691ed7f 100644 --- a/cps/static/locale/es-CL/viewer.properties +++ b/cps/static/locale/es-CL/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Archivo PDF inválido o corrupto. missing_file_error=Falta el archivo PDF. unexpected_response_error=Respuesta del servidor inesperada. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/es-ES/viewer.properties b/cps/static/locale/es-ES/viewer.properties index e1af4d0b..0a632ece 100644 --- a/cps/static/locale/es-ES/viewer.properties +++ b/cps/static/locale/es-ES/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Fichero PDF no válido o corrupto. missing_file_error=No hay fichero PDF. unexpected_response_error=Respuesta inesperada del servidor. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/et/viewer.properties b/cps/static/locale/et/viewer.properties index 46dd2da6..11f47c1c 100644 --- a/cps/static/locale/et/viewer.properties +++ b/cps/static/locale/et/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Vigane või rikutud PDF-fail. missing_file_error=PDF-fail puudub. unexpected_response_error=Ootamatu vastus serverilt. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}} {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/eu/viewer.properties b/cps/static/locale/eu/viewer.properties index c40b884b..a3f230a5 100644 --- a/cps/static/locale/eu/viewer.properties +++ b/cps/static/locale/eu/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=PDF fitxategi baliogabe edo hondatua. missing_file_error=PDF fitxategia falta da. unexpected_response_error=Espero gabeko zerbitzariaren erantzuna. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/fi/viewer.properties b/cps/static/locale/fi/viewer.properties index 89efd773..bb4d44ae 100644 --- a/cps/static/locale/fi/viewer.properties +++ b/cps/static/locale/fi/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Virheellinen tai vioittunut PDF-tiedosto. missing_file_error=Puuttuva PDF-tiedosto. unexpected_response_error=Odottamaton vastaus palvelimelta. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/fr/viewer.properties b/cps/static/locale/fr/viewer.properties index 7cc00b93..10559f70 100644 --- a/cps/static/locale/fr/viewer.properties +++ b/cps/static/locale/fr/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Fichier PDF invalide ou corrompu. missing_file_error=Fichier PDF manquant. unexpected_response_error=Réponse inattendue du serveur. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}} à {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/fy-NL/viewer.properties b/cps/static/locale/fy-NL/viewer.properties index 0c74953d..ddba4cc0 100644 --- a/cps/static/locale/fy-NL/viewer.properties +++ b/cps/static/locale/fy-NL/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Ynfalide of korruptearre PDF-bestân. missing_file_error=PDF-bestân ûntbrekt. unexpected_response_error=Unferwacht serverantwurd. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/gn/viewer.properties b/cps/static/locale/gn/viewer.properties index 41377566..692d1d72 100644 --- a/cps/static/locale/gn/viewer.properties +++ b/cps/static/locale/gn/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=PDF marandurenda ndoikóiva térã ivaipyréva. missing_file_error=Ndaipóri PDF marandurenda unexpected_response_error=Mohendahavusu mbohovái ñeha'arõ'ỹva. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/he/viewer.properties b/cps/static/locale/he/viewer.properties index 55a79cd5..f0259f79 100644 --- a/cps/static/locale/he/viewer.properties +++ b/cps/static/locale/he/viewer.properties @@ -173,6 +173,7 @@ find_reached_bottom=הגיע לסוף הדף, ממשיך מלמעלה # "{{current}}" and "{{total}}" will be replaced by a number representing the # index of the currently active find result, respectively a number representing # the total number of matches in the document. +find_match_count={[ plural(total) ]} find_match_count[one]=תוצאה {{current}} מתוך {{total}} find_match_count[two]={{current}} מתוך {{total}} תוצאות find_match_count[few]={{current}} מתוך {{total}} תוצאות @@ -181,13 +182,14 @@ find_match_count[other]={{current}} מתוך {{total}} תוצאות # LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are # [zero|one|two|few|many|other], with [other] as the default value. # "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} find_match_count_limit[zero]=יותר מ־{{limit}} תוצאות find_match_count_limit[one]=יותר מתוצאה אחת find_match_count_limit[two]=יותר מ־{{limit}} תוצאות find_match_count_limit[few]=יותר מ־{{limit}} תוצאות find_match_count_limit[many]=יותר מ־{{limit}} תוצאות find_match_count_limit[other]=יותר מ־{{limit}} תוצאות -find_not_found=ביטוי לא נמצא +find_not_found=הביטוי לא נמצא # Error panel labels error_more_info=מידע נוסף @@ -224,6 +226,10 @@ invalid_file_error=קובץ PDF פגום או לא תקין. missing_file_error=קובץ PDF חסר. unexpected_response_error=תגובת שרת לא צפויה. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/hi-IN/viewer.properties b/cps/static/locale/hi-IN/viewer.properties index a27bfe44..67d00053 100644 --- a/cps/static/locale/hi-IN/viewer.properties +++ b/cps/static/locale/hi-IN/viewer.properties @@ -208,6 +208,10 @@ invalid_file_error=अमान्य या भ्रष्ट PDF फ़ाइ missing_file_error=\u0020अनुपस्थित PDF फ़ाइल. unexpected_response_error=अप्रत्याशित सर्वर प्रतिक्रिया. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/hr/viewer.properties b/cps/static/locale/hr/viewer.properties index 07d19b2d..4f1f3c49 100644 --- a/cps/static/locale/hr/viewer.properties +++ b/cps/static/locale/hr/viewer.properties @@ -65,7 +65,19 @@ cursor_text_select_tool_label=Alat za označavanje teksta cursor_hand_tool.title=Omogući ručni alat cursor_hand_tool_label=Ručni alat - +scroll_vertical.title=Koristi okomito pomicanje +scroll_vertical_label=Okomito pomicanje +scroll_horizontal.title=Koristi vodoravno pomicanje +scroll_horizontal_label=Vodoravno pomicanje +scroll_wrapped.title=Koristi omotano pomicanje +scroll_wrapped_label=Omotano pomicanje + +spread_none.title=Ne pridružuj razmake stranica +spread_none_label=Bez razmaka +spread_odd.title=Pridruži razmake stranica počinjući od neparnih stranica +spread_odd_label=Neparni razmaci +spread_even.title=Pridruži razmake stranica počinjući od parnih stranica +spread_even_label=Parni razmaci # Document properties dialog box document_properties.title=Svojstva dokumenta... @@ -91,8 +103,15 @@ document_properties_creator=Stvaratelj: document_properties_producer=PDF stvaratelj: document_properties_version=PDF inačica: document_properties_page_count=Broj stranica: +document_properties_page_size=Dimenzije stranice: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=portret +document_properties_page_size_orientation_landscape=pejzaž document_properties_page_size_name_a3=A3 document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Pismo +document_properties_page_size_name_legal=Pravno # LOCALIZATION NOTE (document_properties_page_size_dimension_string): # "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by # the size, respectively their unit of measurement and orientation, of the (current) page. @@ -103,6 +122,7 @@ document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) # LOCALIZATION NOTE (document_properties_linearized): The linearization status of # the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Brzi web pregled: document_properties_linearized_yes=Da document_properties_linearized_no=Ne document_properties_close=Zatvori @@ -145,6 +165,7 @@ find_next.title=Pronađi iduće javljanje ovog izraza find_next_label=Sljedeće find_highlight=Istankni sve find_match_case_label=Slučaj podudaranja +find_entire_word_label=Cijele riječi find_reached_top=Dosegnut vrh dokumenta, nastavak od dna find_reached_bottom=Dosegnut vrh dokumenta, nastavak od vrha # LOCALIZATION NOTE (find_match_count): The supported plural forms are @@ -152,9 +173,22 @@ find_reached_bottom=Dosegnut vrh dokumenta, nastavak od vrha # "{{current}}" and "{{total}}" will be replaced by a number representing the # index of the currently active find result, respectively a number representing # the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} od {{total}} se podudara +find_match_count[two]={{current}} od {{total}} se podudara +find_match_count[few]={{current}} od {{total}} se podudara +find_match_count[many]={{current}} od {{total}} se podudara +find_match_count[other]={{current}} od {{total}} se podudara # LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are # [zero|one|two|few|many|other], with [other] as the default value. # "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Više od {{limit}} podudaranja +find_match_count_limit[one]=Više od {{limit}} podudaranja +find_match_count_limit[two]=Više od {{limit}} podudaranja +find_match_count_limit[few]=Više od {{limit}} podudaranja +find_match_count_limit[many]=Više od {{limit}} podudaranja +find_match_count_limit[other]=Više od {{limit}} podudaranja find_not_found=Izraz nije pronađen # Error panel labels @@ -192,6 +226,10 @@ invalid_file_error=Kriva ili oštećena PDF datoteka. missing_file_error=Nedostaje PDF datoteka. unexpected_response_error=Neočekivani odgovor poslužitelja. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/hsb/viewer.properties b/cps/static/locale/hsb/viewer.properties index 679ef593..790f7235 100644 --- a/cps/static/locale/hsb/viewer.properties +++ b/cps/static/locale/hsb/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Njepłaćiwa abo wobškodźena PDF-dataja. missing_file_error=Falowaca PDF-dataja. unexpected_response_error=Njewočakowana serwerowa wotmołwa. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/hu/viewer.properties b/cps/static/locale/hu/viewer.properties index 9c9ec846..fb5e35f4 100644 --- a/cps/static/locale/hu/viewer.properties +++ b/cps/static/locale/hu/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Érvénytelen vagy sérült PDF fájl. missing_file_error=Hiányzó PDF fájl. unexpected_response_error=Váratlan kiszolgálóválasz. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/ia/viewer.properties b/cps/static/locale/ia/viewer.properties index 4a5b005c..ee8842cf 100644 --- a/cps/static/locale/ia/viewer.properties +++ b/cps/static/locale/ia/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=File PDF corrumpite o non valide. missing_file_error=File PDF mancante. unexpected_response_error=Responsa del servitor inexpectate. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/id/viewer.properties b/cps/static/locale/id/viewer.properties index b6f7080b..58ebc40d 100644 --- a/cps/static/locale/id/viewer.properties +++ b/cps/static/locale/id/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Berkas PDF tidak valid atau rusak. missing_file_error=Berkas PDF tidak ada. unexpected_response_error=Balasan server yang tidak diharapkan. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/is/viewer.properties b/cps/static/locale/is/viewer.properties index 59d94b44..d24c2adf 100644 --- a/cps/static/locale/is/viewer.properties +++ b/cps/static/locale/is/viewer.properties @@ -65,7 +65,17 @@ cursor_text_select_tool_label=Textavalsáhald cursor_hand_tool.title=Virkja handarverkfæri cursor_hand_tool_label=Handarverkfæri - +scroll_vertical.title=Nota lóðrétt skrun +scroll_vertical_label=Lóðrétt skrun +scroll_horizontal.title=Nota lárétt skrun +scroll_horizontal_label=Lárétt skrun + +spread_none.title=Ekki taka þátt í dreifingu síðna +spread_none_label=Engin dreifing +spread_odd.title=Taka þátt í dreifingu síðna með oddatölum +spread_odd_label=Oddatöludreifing +spread_even.title=Taktu þátt í dreifingu síðna með jöfnuntölum +spread_even_label=Jafnatöludreifing # Document properties dialog box document_properties.title=Eiginleikar skjals… @@ -161,10 +171,21 @@ find_reached_bottom=Náði enda skjals, held áfram efst # index of the currently active find result, respectively a number representing # the total number of matches in the document. find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} af {{total}} niðurstöðu +find_match_count[two]={{current}} af {{total}} niðurstöðum +find_match_count[few]={{current}} af {{total}} niðurstöðum +find_match_count[many]={{current}} af {{total}} niðurstöðum +find_match_count[other]={{current}} af {{total}} niðurstöðum # LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are # [zero|one|two|few|many|other], with [other] as the default value. # "{{limit}}" will be replaced by a numerical value. find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Fleiri en {{limit}} niðurstöður +find_match_count_limit[one]=Fleiri en {{limit}} niðurstaða +find_match_count_limit[two]=Fleiri en {{limit}} niðurstöður +find_match_count_limit[few]=Fleiri en {{limit}} niðurstöður +find_match_count_limit[many]=Fleiri en {{limit}} niðurstöður +find_match_count_limit[other]=Fleiri en {{limit}} niðurstöður find_not_found=Fann ekki orðið # Error panel labels diff --git a/cps/static/locale/it/viewer.properties b/cps/static/locale/it/viewer.properties index 754ea18a..cff0258b 100644 --- a/cps/static/locale/it/viewer.properties +++ b/cps/static/locale/it/viewer.properties @@ -146,6 +146,7 @@ loading_error = Si è verificato un errore durante il caricamento del PDF. invalid_file_error = File PDF non valido o danneggiato. missing_file_error = File PDF non disponibile. unexpected_response_error = Risposta imprevista del server +annotation_date_string = {{date}}, {{time}} text_annotation_type.alt = [Annotazione: {{type}}] password_label = Inserire la password per aprire questo file PDF. password_invalid = Password non corretta. Riprovare. diff --git a/cps/static/locale/ja/viewer.properties b/cps/static/locale/ja/viewer.properties index d2fe56bd..3a90b47b 100644 --- a/cps/static/locale/ja/viewer.properties +++ b/cps/static/locale/ja/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=無効または破損した PDF ファイル。 missing_file_error=PDF ファイルが見つかりません。 unexpected_response_error=サーバーから予期せぬ応答がありました。 +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/ka/viewer.properties b/cps/static/locale/ka/viewer.properties index e1321374..c7b2da8d 100644 --- a/cps/static/locale/ka/viewer.properties +++ b/cps/static/locale/ka/viewer.properties @@ -100,8 +100,8 @@ document_properties_modification_date=ჩასწორების თარ # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=გამომშვები: -document_properties_producer=PDF გამომშვები: -document_properties_version=PDF ვერსია: +document_properties_producer=PDF-გამომშვები: +document_properties_version=PDF-ვერსია: document_properties_page_count=გვერდების რაოდენობა: document_properties_page_size=გვერდის ზომა: document_properties_page_size_unit_inches=დუიმი @@ -122,7 +122,7 @@ document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) # LOCALIZATION NOTE (document_properties_linearized): The linearization status of # the document; usually called "Fast Web View" in English locales of Adobe software. -document_properties_linearized=Fast Web View: +document_properties_linearized=სწრაფი შეთვალიერება: document_properties_linearized_yes=დიახ document_properties_linearized_no=არა document_properties_close=დახურვა @@ -154,7 +154,7 @@ findbar_label=ძიება thumb_page_title=გვერდი {{page}} # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. -thumb_page_canvas=გვერდის ესკიზი {{page}} +thumb_page_canvas=გვერდის შეთვალიერება {{page}} # Find panel button title and messages find_input.title=ძიება @@ -221,22 +221,26 @@ page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=შეცდომა -loading_error=შეცდომა, PDF ფაილის ჩატვირთვისას. -invalid_file_error=არამართებული ან დაზიანებული PDF ფაილი. -missing_file_error=ნაკლული PDF ფაილი. +loading_error=შეცდომა, PDF-ფაილის ჩატვირთვისას. +invalid_file_error=არამართებული ან დაზიანებული PDF-ფაილი. +missing_file_error=ნაკლული PDF-ფაილი. unexpected_response_error=სერვერის მოულოდნელი პასუხი. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} შენიშვნა] -password_label=შეიყვანეთ პაროლი PDF ფაილის გასახსნელად. +password_label=შეიყვანეთ პაროლი PDF-ფაილის გასახსნელად. password_invalid=არასწორი პაროლი. გთხოვთ, სცადოთ ხელახლა. password_ok=კარგი password_cancel=გაუქმება printing_not_supported=გაფრთხილება: ამობეჭდვა ამ ბრაუზერში არაა სრულად მხარდაჭერილი. printing_not_ready=გაფრთხილება: PDF სრულად ჩატვირთული არაა, ამობეჭდვის დასაწყებად. -web_fonts_disabled=ვებშრიფტები გამორთულია: ჩაშენებული PDF შრიფტების გამოყენება ვერ ხერხდება. -document_colors_not_allowed=PDF დოკუმენტებს არ აქვს საკუთარი ფერების გამოყენების ნებართვა: ბრაუზერში გამორთულია “გვერდებისთვის საკუთარი ფერების გამოყენების უფლება”. +web_fonts_disabled=ვებშრიფტები გამორთულია: ჩაშენებული PDF-შრიფტების გამოყენება ვერ ხერხდება. +document_colors_not_allowed=PDF-დოკუმენტებს არ აქვს საკუთარი ფერების გამოყენების ნებართვა: ბრაუზერში გამორთულია “გვერდებისთვის საკუთარი ფერების გამოყენების უფლება”. diff --git a/cps/static/locale/kab/viewer.properties b/cps/static/locale/kab/viewer.properties index 52ac0a55..db59ef71 100644 --- a/cps/static/locale/kab/viewer.properties +++ b/cps/static/locale/kab/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Afaylu PDF arameɣtu neɣ yexṣeṛ. missing_file_error=Ulac afaylu PDF. unexpected_response_error=Aqeddac yerra-d yir tiririt ur nettwaṛǧi ara. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/kk/viewer.properties b/cps/static/locale/kk/viewer.properties index 3f1e51a5..cc1b4f6a 100644 --- a/cps/static/locale/kk/viewer.properties +++ b/cps/static/locale/kk/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Зақымдалған немесе қате PDF файл. missing_file_error=PDF файлы жоқ. unexpected_response_error=Сервердің күтпеген жауабы. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/ko/viewer.properties b/cps/static/locale/ko/viewer.properties index db7da192..d173a242 100644 --- a/cps/static/locale/ko/viewer.properties +++ b/cps/static/locale/ko/viewer.properties @@ -26,23 +26,23 @@ of_pages=전체 {{pagesCount}} # LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" # will be replaced by a number representing the currently visible page, # respectively a number representing the total number of pages in the document. -page_of_pages=({{pagesCount}} 중 {{pageNumber}}) +page_of_pages=({{pageNumber}} / {{pagesCount}}) zoom_out.title=축소 zoom_out_label=축소 zoom_in.title=확대 zoom_in_label=확대 -zoom.title=크기 -presentation_mode.title=발표 모드로 전환 -presentation_mode_label=발표 모드 +zoom.title=확대/축소 +presentation_mode.title=프레젠테이션 모드로 전환 +presentation_mode_label=프레젠테이션 모드 open_file.title=파일 열기 open_file_label=열기 print.title=인쇄 print_label=인쇄 download.title=다운로드 download_label=다운로드 -bookmark.title=지금 보이는 그대로 (복사하거나 새 창에 열기) -bookmark_label=지금 보이는 그대로 +bookmark.title=현재 뷰 (복사하거나 새 창에 열기) +bookmark_label=현재 뷰 # Secondary toolbar and context menu tools.title=도구 @@ -83,7 +83,7 @@ spread_even_label=짝수 펼쳐짐 document_properties.title=문서 속성… document_properties_label=문서 속성… document_properties_file_name=파일 이름: -document_properties_file_size=파일 사이즈: +document_properties_file_size=파일 크기: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}}바이트) @@ -91,18 +91,18 @@ document_properties_kb={{size_kb}} KB ({{size_b}}바이트) # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}}바이트) document_properties_title=제목: -document_properties_author=저자: +document_properties_author=작성자: document_properties_subject=주제: document_properties_keywords=키워드: -document_properties_creation_date=생성일: -document_properties_modification_date=수정일: +document_properties_creation_date=작성 날짜: +document_properties_modification_date=수정 날짜: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} -document_properties_creator=생성자: -document_properties_producer=PDF 생성기: +document_properties_creator=작성 프로그램: +document_properties_producer=PDF 변환 소프트웨어: document_properties_version=PDF 버전: -document_properties_page_count=총 페이지: +document_properties_page_count=페이지 수: document_properties_page_size=페이지 크기: document_properties_page_size_unit_inches=in document_properties_page_size_unit_millimeters=mm @@ -127,7 +127,7 @@ document_properties_linearized_yes=예 document_properties_linearized_no=아니오 document_properties_close=닫기 -print_progress_message=문서 출력 준비중… +print_progress_message=인쇄 문서 준비중… # LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by # a numerical per cent value. print_progress_percent={{progress}}% @@ -151,10 +151,10 @@ findbar_label=검색 # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. -thumb_page_title={{page}}쪽 +thumb_page_title={{page}} 페이지 # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. -thumb_page_canvas={{page}}쪽 미리보기 +thumb_page_canvas={{page}} 페이지 미리보기 # Find panel button title and messages find_input.title=찾기 @@ -164,7 +164,7 @@ find_previous_label=이전 find_next.title=지정 문자열에 일치하는 다음 부분을 검색 find_next_label=다음 find_highlight=모두 강조 표시 -find_match_case_label=대문자/소문자 구별 +find_match_case_label=대/소문자 구분 find_entire_word_label=전체 단어 find_reached_top=문서 처음까지 검색하고 끝으로 돌아와 검색했습니다. find_reached_bottom=문서 끝까지 검색하고 앞으로 돌아와 검색했습니다. @@ -208,12 +208,12 @@ error_stack=스택: {{stack}} error_file=파일: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=줄 번호: {{line}} -rendering_error=페이지를 렌더링하다 오류가 났습니다. +rendering_error=페이지를 렌더링하는 중 오류가 발생했습니다. # Predefined zoom values page_scale_width=페이지 너비에 맞춤 page_scale_fit=페이지에 맞춤 -page_scale_auto=알아서 맞춤 +page_scale_auto=자동 맞춤 page_scale_actual=실제 크기에 맞춤 # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. @@ -221,22 +221,26 @@ page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=오류 -loading_error=PDF를 읽는 중 오류가 생겼습니다. +loading_error=PDF를 로드하는 중 오류가 발생했습니다. invalid_file_error=유효하지 않거나 파손된 PDF 파일 missing_file_error=PDF 파일이 없습니다. -unexpected_response_error=알 수 없는 서버 응답입니다. +unexpected_response_error=예상치 못한 서버 응답입니다. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}} {{time}} # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} 주석] -password_label=이 PDF 파일을 열 수 있는 암호를 입력하십시오. -password_invalid=잘못된 암호입니다. 다시 시도해 주십시오. +password_label=이 PDF 파일을 열 수 있는 비밀번호를 입력하십시오. +password_invalid=잘못된 비밀번호입니다. 다시 시도해 주십시오. password_ok=확인 password_cancel=취소 printing_not_supported=경고: 이 브라우저는 인쇄를 완전히 지원하지 않습니다. printing_not_ready=경고: 이 PDF를 인쇄를 할 수 있을 정도로 읽어들이지 못했습니다. -web_fonts_disabled=웹 폰트가 꺼져있음: 내장된 PDF 글꼴을 쓸 수 없습니다. -document_colors_not_allowed=PDF 문서의 색상을 쓰지 못하게 되어 있음: '웹 페이지 자체 색상 사용 허용'이 브라우저에서 꺼져 있습니다. +web_fonts_disabled=웹 폰트가 비활성화됨: 내장된 PDF 글꼴을 사용할 수 없습니다. +document_colors_not_allowed=PDF 문서의 자체 색상 허용 안됨: “페이지 자체 색상 허용”이 브라우저에서 비활성화 되어 있습니다. diff --git a/cps/static/locale/lij/viewer.properties b/cps/static/locale/lij/viewer.properties index f0a7771b..71a53062 100644 --- a/cps/static/locale/lij/viewer.properties +++ b/cps/static/locale/lij/viewer.properties @@ -45,8 +45,8 @@ bookmark.title=Vixon corente (còpia ò arvi inte 'n neuvo barcon) bookmark_label=Vixon corente # Secondary toolbar and context menu -tools.title=Strumenti -tools_label=Strumenti +tools.title=Atressi +tools_label=Atressi first_page.title=Vanni a-a primma pagina first_page.label=Vanni a-a primma pagina first_page_label=Vanni a-a primma pagina @@ -82,8 +82,8 @@ spread_even_label=Difuxon pari # Document properties dialog box document_properties.title=Propietæ do documento… document_properties_label=Propietæ do documento… -document_properties_file_name=Nomme file: -document_properties_file_size=Dimenscion file: +document_properties_file_name=Nomme schedaio: +document_properties_file_size=Dimenscion schedaio: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} kB ({{size_b}} byte) @@ -205,7 +205,7 @@ error_message=Mesaggio: {{message}} # trace. error_stack=Stack: {{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename -error_file=File: {{file}} +error_file=Schedaio: {{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Linia: {{line}} rendering_error=Gh'é stæto 'n'erô itno rendering da pagina. @@ -222,8 +222,8 @@ page_scale_percent={{scale}}% # Loading indicator messages loading_error_indicator=Erô loading_error=S'é verificou 'n'erô itno caregamento do PDF. -invalid_file_error=O file PDF o l'é no valido ò aroinou. -missing_file_error=O file PDF o no gh'é. +invalid_file_error=O schedaio PDF o l'é no valido ò aroinou. +missing_file_error=O schedaio PDF o no gh'é. unexpected_response_error=Risposta inprevista do-u server # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. @@ -231,7 +231,7 @@ unexpected_response_error=Risposta inprevista do-u server # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[Anotaçion: {{type}}] -password_label=Dimme a paròlla segreta pe arvî sto file PDF. +password_label=Dimme a paròlla segreta pe arvî sto schedaio PDF. password_invalid=Paròlla segreta sbalia. Preuva torna. password_ok=Va ben password_cancel=Anulla diff --git a/cps/static/locale/lt/viewer.properties b/cps/static/locale/lt/viewer.properties index 3cb76ed6..45ec3035 100644 --- a/cps/static/locale/lt/viewer.properties +++ b/cps/static/locale/lt/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Tai nėra PDF failas arba jis yra sugadintas. missing_file_error=PDF failas nerastas. unexpected_response_error=Netikėtas serverio atsakas. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/mr/viewer.properties b/cps/static/locale/mr/viewer.properties index c8069296..67e419ec 100644 --- a/cps/static/locale/mr/viewer.properties +++ b/cps/static/locale/mr/viewer.properties @@ -65,6 +65,10 @@ cursor_text_select_tool_label=मजकूर निवड साधन cursor_hand_tool.title=हात साधन कार्यान्वित करा cursor_hand_tool_label=हस्त साधन +scroll_vertical.title=अनुलंब स्क्रोलिंग वापरा +scroll_vertical_label=अनुलंब स्क्रोलिंग +scroll_horizontal.title=क्षैतिज स्क्रोलिंग वापरा +scroll_horizontal_label=क्षैतिज स्क्रोलिंग # Document properties dialog box @@ -95,6 +99,7 @@ document_properties_page_size=पृष्ठ आकार: document_properties_page_size_unit_inches=इंच document_properties_page_size_unit_millimeters=मीमी document_properties_page_size_orientation_portrait=उभी मांडणी +document_properties_page_size_orientation_landscape=आडवे document_properties_page_size_name_a3=A3 document_properties_page_size_name_a4=A4 document_properties_page_size_name_letter=Letter @@ -109,6 +114,7 @@ document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) # LOCALIZATION NOTE (document_properties_linearized): The linearization status of # the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=जलद वेब दृष्य: document_properties_linearized_yes=हो document_properties_linearized_no=नाही document_properties_close=बंद करा @@ -151,8 +157,23 @@ find_next.title=वाकप्रयोगची पुढील घटना find_next_label=पुढील find_highlight=सर्व ठळक करा find_match_case_label=आकार जुळवा +find_entire_word_label=संपूर्ण शब्द find_reached_top=दस्तऐवजाच्या शीर्षकास पोहचले, तळपासून पुढे find_reached_bottom=दस्तऐवजाच्या तळाला पोहचले, शीर्षकापासून पुढे +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit[zero]={{limit}} पेक्षा अधिक जुळण्या +find_match_count_limit[two]={{limit}} पेक्षा अधिक जुळण्या +find_match_count_limit[few]={{limit}} पेक्षा अधिक जुळण्या +find_match_count_limit[many]={{limit}} पेक्षा अधिक जुळण्या +find_match_count_limit[other]={{limit}} पेक्षा अधिक जुळण्या find_not_found=वाकप्रयोग आढळले नाही # Error panel labels diff --git a/cps/static/locale/nb-NO/viewer.properties b/cps/static/locale/nb-NO/viewer.properties index fc989828..8656cb4f 100644 --- a/cps/static/locale/nb-NO/viewer.properties +++ b/cps/static/locale/nb-NO/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Ugyldig eller skadet PDF-fil. missing_file_error=Manglende PDF-fil. unexpected_response_error=Uventet serverrespons. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/nl/viewer.properties b/cps/static/locale/nl/viewer.properties index 7422f849..c62110a4 100644 --- a/cps/static/locale/nl/viewer.properties +++ b/cps/static/locale/nl/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Ongeldig of beschadigd PDF-bestand. missing_file_error=PDF-bestand ontbreekt. unexpected_response_error=Onverwacht serverantwoord. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/nn-NO/viewer.properties b/cps/static/locale/nn-NO/viewer.properties index 27b4abb3..f0feeb40 100644 --- a/cps/static/locale/nn-NO/viewer.properties +++ b/cps/static/locale/nn-NO/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Ugyldig eller korrupt PDF-fil. missing_file_error=Manglande PDF-fil. unexpected_response_error=Uventa tenarrespons. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}} {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/pa-IN/viewer.properties b/cps/static/locale/pa-IN/viewer.properties index 436be51a..8c624375 100644 --- a/cps/static/locale/pa-IN/viewer.properties +++ b/cps/static/locale/pa-IN/viewer.properties @@ -168,10 +168,21 @@ find_reached_bottom=ਦਸਤਾਵੇਜ਼ ਦੇ ਅੰਤ ਉੱਤੇ ਆ ਗ # index of the currently active find result, respectively a number representing # the total number of matches in the document. find_match_count={[ plural(total) ]} +find_match_count[one]={{total}} ਵਿੱਚੋਂ {{current}} ਮੇਲ +find_match_count[two]={{total}} ਵਿੱਚੋਂ {{current}} ਮੇਲ +find_match_count[few]={{total}} ਵਿੱਚੋਂ {{current}} ਮੇਲ +find_match_count[many]={{total}} ਵਿੱਚੋਂ {{current}} ਮੇਲ +find_match_count[other]={{total}} ਵਿੱਚੋਂ {{current}} ਮੇਲ # LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are # [zero|one|two|few|many|other], with [other] as the default value. # "{{limit}}" will be replaced by a numerical value. find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]={{limit}} ਮੇਲਾਂ ਤੋਂ ਵੱਧ +find_match_count_limit[one]={{limit}} ਮੇਲ ਤੋਂ ਵੱਧ +find_match_count_limit[two]={{limit}} ਮੇਲਾਂ ਤੋਂ ਵੱਧ +find_match_count_limit[few]={{limit}} ਮੇਲਾਂ ਤੋਂ ਵੱਧ +find_match_count_limit[many]={{limit}} ਮੇਲਾਂ ਤੋਂ ਵੱਧ +find_match_count_limit[other]={{limit}} ਮੇਲਾਂ ਤੋਂ ਵੱਧ find_not_found=ਵਾਕ ਨਹੀਂ ਲੱਭਿਆ # Error panel labels diff --git a/cps/static/locale/pl/viewer.properties b/cps/static/locale/pl/viewer.properties index 50faadf2..64a6504f 100644 --- a/cps/static/locale/pl/viewer.properties +++ b/cps/static/locale/pl/viewer.properties @@ -12,13 +12,20 @@ # See the License for the specific language governing permissions and # limitations under the License. +# Main toolbar buttons (tooltips and alt text for images) previous.title=Poprzednia strona previous_label=Poprzednia next.title=Następna strona next_label=Następna -page.title==Strona: +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Strona +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. of_pages=z {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. page_of_pages=({{pageNumber}} z {{pagesCount}}) zoom_out.title=Pomniejszenie @@ -37,6 +44,7 @@ download_label=Pobierz bookmark.title=Bieżąca pozycja (skopiuj lub otwórz jako odnośnik w nowym oknie) bookmark_label=Bieżąca pozycja +# Secondary toolbar and context menu tools.title=Narzędzia tools_label=Narzędzia first_page.title=Przechodzenie do pierwszej strony @@ -59,30 +67,37 @@ cursor_hand_tool_label=Narzędzie rączka scroll_vertical.title=Przewijaj dokument w pionie scroll_vertical_label=Przewijanie pionowe -scroll_horizontal_label=Przewijanie poziome scroll_horizontal.title=Przewijaj dokument w poziomie -scroll_wrapped_label=Widok dwóch stron +scroll_horizontal_label=Przewijanie poziome scroll_wrapped.title=Strony dokumentu wyświetlaj i przewijaj w kolumnach +scroll_wrapped_label=Widok dwóch stron -spread_none_label=Brak kolumn spread_none.title=Nie ustawiaj stron obok siebie -spread_odd_label=Nieparzyste po lewej +spread_none_label=Brak kolumn spread_odd.title=Strony nieparzyste ustawiaj na lewo od parzystych -spread_even_label=Parzyste po lewej +spread_odd_label=Nieparzyste po lewej spread_even.title=Strony parzyste ustawiaj na lewo od nieparzystych +spread_even_label=Parzyste po lewej +# Document properties dialog box document_properties.title=Właściwości dokumentu… document_properties_label=Właściwości dokumentu… document_properties_file_name=Nazwa pliku: document_properties_file_size=Rozmiar pliku: -document_properties_kb={{size_kb}} KB ({{size_b}} b) -document_properties_mb={{size_mb}} MB ({{size_b}} b) +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} B) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} B) document_properties_title=Tytuł: document_properties_author=Autor: document_properties_subject=Temat: document_properties_keywords=Słowa kluczowe: document_properties_creation_date=Data utworzenia: document_properties_modification_date=Data modyfikacji: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=Utworzony przez: document_properties_producer=PDF wyprodukowany przez: @@ -97,17 +112,30 @@ document_properties_page_size_name_a3=A3 document_properties_page_size_name_a4=A4 document_properties_page_size_name_letter=US Letter document_properties_page_size_name_legal=US Legal -document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} (orientacja {{orientation}}) -document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, orientacja {{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}}×{{height}} {{unit}} (orientacja {{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}}×{{height}} {{unit}} ({{name}}, orientacja {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. document_properties_linearized=Szybki podgląd w Internecie: document_properties_linearized_yes=tak document_properties_linearized_no=nie document_properties_close=Zamknij print_progress_message=Przygotowywanie dokumentu do druku… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. print_progress_percent={{progress}}% print_progress_close=Anuluj +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) toggle_sidebar.title=Przełączanie panelu bocznego toggle_sidebar_notification.title=Przełączanie panelu bocznego (dokument zawiera konspekt/załączniki) toggle_sidebar_label=Przełącz panel boczny @@ -120,26 +148,40 @@ thumbs_label=Miniaturki findbar.title=Znajdź w dokumencie findbar_label=Znajdź +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. thumb_page_title=Strona {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. thumb_page_canvas=Miniaturka strony {{page}} +# Find panel button title and messages find_input.title=Wyszukiwanie -find_input.placeholder=Szukaj w dokumencie… +find_input.placeholder=Znajdź w dokumencie… find_previous.title=Znajdź poprzednie wystąpienie tekstu find_previous_label=Poprzednie find_next.title=Znajdź następne wystąpienie tekstu find_next_label=Następne -find_highlight=Podświetl wszystkie +find_highlight=Wyróżnianie wszystkich find_match_case_label=Rozróżnianie wielkości liter find_entire_word_label=Całe słowa find_reached_top=Początek dokumentu. Wyszukiwanie od końca. find_reached_bottom=Koniec dokumentu. Wyszukiwanie od początku. +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. find_match_count={[ plural(total) ]} find_match_count[one]=Pierwsze z {{total}} trafień find_match_count[two]=Drugie z {{total}} trafień find_match_count[few]={{current}}. z {{total}} trafień find_match_count[many]={{current}}. z {{total}} trafień find_match_count[other]={{current}}. z {{total}} trafień +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. find_match_count_limit={[ plural(limit) ]} find_match_count_limit[zero]=Brak trafień. find_match_count_limit[one]=Więcej niż jedno trafienie. @@ -149,28 +191,49 @@ find_match_count_limit[many]=Więcej niż {{limit}} trafień. find_match_count_limit[other]=Więcej niż {{limit}} trafień. find_not_found=Nie znaleziono tekstu +# Error panel labels error_more_info=Więcej informacji error_less_info=Mniej informacji error_close=Zamknij +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (kompilacja: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. error_message=Wiadomość: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. error_stack=Stos: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=Plik: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=Wiersz: {{line}} rendering_error=Podczas renderowania strony wystąpił błąd. +# Predefined zoom values page_scale_width=Szerokość strony page_scale_fit=Dopasowanie strony page_scale_auto=Skala automatyczna page_scale_actual=Rozmiar rzeczywisty +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. page_scale_percent={{scale}}% +# Loading indicator messages loading_error_indicator=Błąd loading_error=Podczas wczytywania dokumentu PDF wystąpił błąd. invalid_file_error=Nieprawidłowy lub uszkodzony plik PDF. missing_file_error=Brak pliku PDF. unexpected_response_error=Nieoczekiwana odpowiedź serwera. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[Adnotacja: {{type}}] password_label=Wprowadź hasło, aby otworzyć ten dokument PDF. password_invalid=Nieprawidłowe hasło. Proszę spróbować ponownie. diff --git a/cps/static/locale/pt-BR/viewer.properties b/cps/static/locale/pt-BR/viewer.properties index 078e5ada..d62dd5f9 100644 --- a/cps/static/locale/pt-BR/viewer.properties +++ b/cps/static/locale/pt-BR/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Arquivo PDF corrompido ou inválido. missing_file_error=Arquivo PDF ausente. unexpected_response_error=Resposta inesperada do servidor. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). @@ -238,5 +242,5 @@ password_cancel=Cancelar printing_not_supported=Aviso: a impressão não é totalmente suportada neste navegador. printing_not_ready=Aviso: o PDF não está totalmente carregado para impressão. -web_fonts_disabled=As fontes web estão desabilitadas: não foi possível usar fontes incorporadas do PDF. -document_colors_not_allowed=Os documentos em PDF não estão autorizados a usar suas próprias cores: “Permitir que as páginas escolham suas próprias cores” está desabilitado no navegador. +web_fonts_disabled=As fontes web estão desativadas: não foi possível usar fontes incorporadas do PDF. +document_colors_not_allowed=Documentos PDF não estão autorizados a usar as próprias cores: a opção “Permitir que as páginas escolham suas próprias cores” está desativada no navegador. diff --git a/cps/static/locale/pt-PT/viewer.properties b/cps/static/locale/pt-PT/viewer.properties index 591c0eff..6fec54d9 100644 --- a/cps/static/locale/pt-PT/viewer.properties +++ b/cps/static/locale/pt-PT/viewer.properties @@ -140,7 +140,7 @@ toggle_sidebar.title=Alternar barra lateral toggle_sidebar_notification.title=Alternar barra lateral (documento contém contorno/anexos) toggle_sidebar_label=Alternar barra lateral document_outline.title=Mostrar esquema do documento (duplo clique para expandir/colapsar todos os itens) -document_outline_label=Estrutura do documento +document_outline_label=Esquema do documento attachments.title=Mostrar anexos attachments_label=Anexos thumbs.title=Mostrar miniaturas @@ -226,6 +226,10 @@ invalid_file_error=Ficheiro PDF inválido ou danificado. missing_file_error=Ficheiro PDF inexistente. unexpected_response_error=Resposta inesperada do servidor. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/ro/viewer.properties b/cps/static/locale/ro/viewer.properties index 72a4a069..f3a6b83c 100644 --- a/cps/static/locale/ro/viewer.properties +++ b/cps/static/locale/ro/viewer.properties @@ -83,7 +83,7 @@ spread_even_label=Broșare pagini pare document_properties.title=Proprietățile documentului… document_properties_label=Proprietățile documentului… document_properties_file_name=Numele fișierului: -document_properties_file_size=Dimensiunea fișierului: +document_properties_file_size=Mărimea fișierului: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} byți) @@ -103,7 +103,7 @@ document_properties_creator=Autor: document_properties_producer=Producător PDF: document_properties_version=Versiune PDF: document_properties_page_count=Număr de pagini: -document_properties_page_size=Dimensiunea paginii: +document_properties_page_size=Mărimea paginii: document_properties_page_size_unit_inches=in document_properties_page_size_unit_millimeters=mm document_properties_page_size_orientation_portrait=portret @@ -214,7 +214,7 @@ rendering_error=A intervenit o eroare la randarea paginii. page_scale_width=Lățimea paginii page_scale_fit=Potrivire la pagină page_scale_auto=Zoom automat -page_scale_actual=Dimensiune reală +page_scale_actual=Mărime reală # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% @@ -226,6 +226,10 @@ invalid_file_error=Fișier PDF nevalid sau corupt. missing_file_error=Fișier PDF lipsă. unexpected_response_error=Răspuns neașteptat de la server. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/ru/viewer.properties b/cps/static/locale/ru/viewer.properties index 65eb8768..be8aa5b0 100644 --- a/cps/static/locale/ru/viewer.properties +++ b/cps/static/locale/ru/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Некорректный или повреждённый PDF- missing_file_error=PDF-файл отсутствует. unexpected_response_error=Неожиданный ответ сервера. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/si/viewer.properties b/cps/static/locale/si/viewer.properties index 4137ec1c..9a1d1e8b 100644 --- a/cps/static/locale/si/viewer.properties +++ b/cps/static/locale/si/viewer.properties @@ -58,6 +58,9 @@ page_rotate_ccw.title=වාමාවර්තව භ්‍රමණය page_rotate_ccw.label=වාමාවර්තව භ්‍රමණය page_rotate_ccw_label=වාමාවර්තව භ්‍රමණය +cursor_hand_tool_label=අත් මෙවලම + + # Document properties dialog box document_properties.title=ලේඛන වත්කම්... @@ -83,11 +86,32 @@ document_properties_creator=නිර්මාපක: document_properties_producer=PDF නිශ්පාදක: document_properties_version=PDF නිකුතුව: document_properties_page_count=පිටු ගණන: +document_properties_page_size=පිටුවේ විශාලත්වය: +document_properties_page_size_unit_inches=අඟල් +document_properties_page_size_unit_millimeters=මිමි +document_properties_page_size_orientation_portrait=සිරස් +document_properties_page_size_orientation_landscape=තිරස් +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}}×{{height}}{{unit}}{{name}}{{orientation}} +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=වේගවත් ජාල දසුන: +document_properties_linearized_yes=ඔව් +document_properties_linearized_no=නැහැ document_properties_close=වසන්න print_progress_message=ලේඛනය මුද්‍රණය සඳහා සූදානම් කරමින්… # LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by # a numerical per cent value. +print_progress_percent={{progress}}% print_progress_close=අවලංගු කරන්න # Tooltips and alt text for side panel toolbar buttons @@ -95,6 +119,7 @@ print_progress_close=අවලංගු කරන්න # tooltips) toggle_sidebar.title=පැති තීරුවට මාරුවන්න toggle_sidebar_label=පැති තීරුවට මාරුවන්න +document_outline_label=ලේඛනයේ පිට මායිම attachments.title=ඇමිණුම් පෙන්වන්න attachments_label=ඇමිණුම් thumbs.title=සිඟිති රූ පෙන්වන්න @@ -111,14 +136,25 @@ thumb_page_title=පිටුව {{page}} thumb_page_canvas=පිටුවෙ සිඟිත රූව {{page}} # Find panel button title and messages +find_input.title=සොයන්න find_previous.title=මේ වාක්‍ය ඛණ්ඩය මීට පෙර යෙදුණු ස්ථානය සොයන්න find_previous_label=පෙර: find_next.title=මේ වාක්‍ය ඛණ්ඩය මීළඟට යෙදෙන ස්ථානය සොයන්න find_next_label=මීළඟ find_highlight=සියල්ල උද්දීපනය find_match_case_label=අකුරු ගළපන්න +find_entire_word_label=සම්පූර්ණ වචන find_reached_top=පිටුවේ ඉහළ කෙළවරට ලගාවිය, පහළ සිට ඉදිරියට යමින් find_reached_bottom=පිටුවේ පහළ කෙළවරට ලගාවිය, ඉහළ සිට ඉදිරියට යමින් +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit[zero]=ගැලපුම් {{limit}} ට වඩා find_not_found=ඔබ සෙව් වචන හමු නොවීය # Error panel labels diff --git a/cps/static/locale/sk/viewer.properties b/cps/static/locale/sk/viewer.properties index f18c6334..00cf62e3 100644 --- a/cps/static/locale/sk/viewer.properties +++ b/cps/static/locale/sk/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Neplatný alebo poškodený súbor PDF. missing_file_error=Chýbajúci súbor PDF. unexpected_response_error=Neočakávaná odpoveď zo servera. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/sl/viewer.properties b/cps/static/locale/sl/viewer.properties index 073ea3a3..790205de 100644 --- a/cps/static/locale/sl/viewer.properties +++ b/cps/static/locale/sl/viewer.properties @@ -53,12 +53,12 @@ first_page_label=Pojdi na prvo stran last_page.title=Pojdi na zadnjo stran last_page.label=Pojdi na zadnjo stran last_page_label=Pojdi na zadnjo stran -page_rotate_cw.title=Zavrti v smeri urninega kazalca -page_rotate_cw.label=Zavrti v smeri urninega kazalca -page_rotate_cw_label=Zavrti v smeri urninega kazalca -page_rotate_ccw.title=Zavrti v nasprotni smeri urninega kazalca -page_rotate_ccw.label=Zavrti v nasprotni smeri urninega kazalca -page_rotate_ccw_label=Zavrti v nasprotni smeri urninega kazalca +page_rotate_cw.title=Zavrti v smeri urnega kazalca +page_rotate_cw.label=Zavrti v smeri urnega kazalca +page_rotate_cw_label=Zavrti v smeri urnega kazalca +page_rotate_ccw.title=Zavrti v nasprotni smeri urnega kazalca +page_rotate_ccw.label=Zavrti v nasprotni smeri urnega kazalca +page_rotate_ccw_label=Zavrti v nasprotni smeri urnega kazalca cursor_text_select_tool.title=Omogoči orodje za izbor besedila cursor_text_select_tool_label=Orodje za izbor besedila @@ -226,6 +226,10 @@ invalid_file_error=Neveljavna ali pokvarjena datoteka PDF. missing_file_error=Ni datoteke PDF. unexpected_response_error=Nepričakovan odgovor strežnika. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/sq/viewer.properties b/cps/static/locale/sq/viewer.properties index f4b91d1b..153ab56e 100644 --- a/cps/static/locale/sq/viewer.properties +++ b/cps/static/locale/sq/viewer.properties @@ -219,6 +219,10 @@ invalid_file_error=Kartelë PDF e pavlefshme ose e dëmtuar. missing_file_error=Kartelë PDF që mungon. unexpected_response_error=Përgjigje shërbyesi e papritur. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/sv-SE/viewer.properties b/cps/static/locale/sv-SE/viewer.properties index d0da9147..b1b60bd4 100644 --- a/cps/static/locale/sv-SE/viewer.properties +++ b/cps/static/locale/sv-SE/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Ogiltig eller korrupt PDF-fil. missing_file_error=Saknad PDF-fil. unexpected_response_error=Oväntat svar från servern. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}} {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/te/viewer.properties b/cps/static/locale/te/viewer.properties index c7bd7855..56f954d4 100644 --- a/cps/static/locale/te/viewer.properties +++ b/cps/static/locale/te/viewer.properties @@ -202,6 +202,10 @@ invalid_file_error=చెల్లని లేదా పాడైన PDF ఫై missing_file_error=దొరకని PDF ఫైలు. unexpected_response_error=అనుకోని సర్వర్ స్పందన. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/th/viewer.properties b/cps/static/locale/th/viewer.properties index 2f401e90..34d46147 100644 --- a/cps/static/locale/th/viewer.properties +++ b/cps/static/locale/th/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=ไฟล์ PDF ไม่ถูกต้องหรือ missing_file_error=ไฟล์ PDF หายไป unexpected_response_error=การตอบสนองของเซิร์ฟเวอร์ที่ไม่คาดคิด +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/tr/viewer.properties b/cps/static/locale/tr/viewer.properties index c1ed154c..792ea052 100644 --- a/cps/static/locale/tr/viewer.properties +++ b/cps/static/locale/tr/viewer.properties @@ -137,10 +137,10 @@ print_progress_close=İptal # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=Kenar çubuğunu aç/kapat -toggle_sidebar_notification.title=Kenar çubuğunu aç/kapat (Belge anahat/ekler içeriyor) +toggle_sidebar_notification.title=Kenar çubuğunu aç/kapat (Belge ana hat/ekler içeriyor) toggle_sidebar_label=Kenar çubuğunu aç/kapat -document_outline.title=Belge şemasını göster (Tüm öğeleri genişletmek/daraltmak için çift tıklayın) -document_outline_label=Belge şeması +document_outline.title=Belge ana hatlarını göster (Tüm öğeleri genişletmek/daraltmak için çift tıklayın) +document_outline_label=Belge ana hatları attachments.title=Ekleri göster attachments_label=Ekler thumbs.title=Küçük resimleri göster @@ -226,6 +226,10 @@ invalid_file_error=Geçersiz veya bozulmuş PDF dosyası. missing_file_error=PDF dosyası eksik. unexpected_response_error=Beklenmeyen sunucu yanıtı. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/uk/viewer.properties b/cps/static/locale/uk/viewer.properties index 01d02882..6eb22772 100644 --- a/cps/static/locale/uk/viewer.properties +++ b/cps/static/locale/uk/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=Недійсний або пошкоджений PDF-файл missing_file_error=Відсутній PDF-файл. unexpected_response_error=Неочікувана відповідь сервера. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/ur/viewer.properties b/cps/static/locale/ur/viewer.properties index ea6ba27c..31928bcb 100644 --- a/cps/static/locale/ur/viewer.properties +++ b/cps/static/locale/ur/viewer.properties @@ -93,6 +93,7 @@ document_properties_page_size_unit_millimeters=mm document_properties_page_size_orientation_portrait=عمودی انداز document_properties_page_size_name_a3=A3 document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=خط document_properties_page_size_name_legal=قانونی # LOCALIZATION NOTE (document_properties_page_size_dimension_string): # "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by @@ -191,6 +192,9 @@ invalid_file_error=ناجائز یا خراب PDF مسل missing_file_error=PDF مسل غائب ہے۔ unexpected_response_error=غیرمتوقع پیش کار جواب +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/vi/viewer.properties b/cps/static/locale/vi/viewer.properties index 0800f710..39d4b2bd 100644 --- a/cps/static/locale/vi/viewer.properties +++ b/cps/static/locale/vi/viewer.properties @@ -13,7 +13,7 @@ # limitations under the License. # Main toolbar buttons (tooltips and alt text for images) -previous.title=Trang Trước +previous.title=Trang trước previous_label=Trước next.title=Trang Sau next_label=Tiếp @@ -69,7 +69,15 @@ scroll_vertical.title=Sử dụng cuộn dọc scroll_vertical_label=Cuộn dọc scroll_horizontal.title=Sử dụng cuộn ngang scroll_horizontal_label=Cuộn ngang +scroll_wrapped.title=Sử dụng cuộn ngắt dòng +scroll_wrapped_label=Cuộn ngắt dòng +spread_none.title=Không nối rộng trang +spread_none_label=Không có phân cách +spread_odd.title=Nối trang bài bắt đầu với các trang được đánh số lẻ +spread_odd_label=Phân cách theo số lẻ +spread_even.title=Nối trang bài bắt đầu với các trang được đánh số chẵn +spread_even_label=Phân cách theo số chẵn # Document properties dialog box document_properties.title=Thuộc tính của tài liệu… @@ -102,6 +110,7 @@ document_properties_page_size_orientation_portrait=khổ dọc document_properties_page_size_orientation_landscape=khổ ngang document_properties_page_size_name_a3=A3 document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Thư document_properties_page_size_name_legal=Pháp lý # LOCALIZATION NOTE (document_properties_page_size_dimension_string): # "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by @@ -217,6 +226,10 @@ invalid_file_error=Tập tin PDF hỏng hoặc không hợp lệ. missing_file_error=Thiếu tập tin PDF. unexpected_response_error=Máy chủ có phản hồi lạ. +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/static/locale/zh-CN/viewer.properties b/cps/static/locale/zh-CN/viewer.properties index 463d9faa..5c4c5367 100644 --- a/cps/static/locale/zh-CN/viewer.properties +++ b/cps/static/locale/zh-CN/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=无效或损坏的 PDF 文件。 missing_file_error=缺少 PDF 文件。 unexpected_response_error=意外的服务器响应。 +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}},{{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). @@ -237,6 +241,6 @@ password_ok=确定 password_cancel=取消 printing_not_supported=警告:此浏览器尚未完整支持打印功能。 -printing_not_ready=警告:该 PDF 未完全载入以供打印。 +printing_not_ready=警告:此 PDF 未完成载入,无法打印。 web_fonts_disabled=Web 字体已被禁用:无法使用嵌入的 PDF 字体。 document_colors_not_allowed=PDF 文档无法使用自己的颜色:浏览器中“允许页面选择自己的颜色”的选项未被勾选。 diff --git a/cps/static/locale/zh-TW/viewer.properties b/cps/static/locale/zh-TW/viewer.properties index 79b8a5cb..70e7a456 100644 --- a/cps/static/locale/zh-TW/viewer.properties +++ b/cps/static/locale/zh-TW/viewer.properties @@ -226,6 +226,10 @@ invalid_file_error=無效或毀損的 PDF 檔案。 missing_file_error=找不到 PDF 檔案。 unexpected_response_error=伺服器回應未預期的內容。 +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}} {{time}} + # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). diff --git a/cps/subproc_wrapper.py b/cps/subproc_wrapper.py index 088cb3d5..4242a83e 100644 --- a/cps/subproc_wrapper.py +++ b/cps/subproc_wrapper.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- # This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) diff --git a/cps/templates/admin.html b/cps/templates/admin.html index a7770c59..5b2ad78c 100644 --- a/cps/templates/admin.html +++ b/cps/templates/admin.html @@ -6,16 +6,16 @@
-

{{_('User list')}}

+

{{_('Users')}}

- - - - + + + + - + @@ -35,20 +35,20 @@ {% endif %} {% endfor %}
{{_('Nickname')}}{{_('E-mail')}}{{_('Kindle')}}{{_('DLS')}}{{_('Username')}}{{_('E-mail Address')}}{{_('Send to Kindle E-mail Address')}}{{_('Downloads')}}
- +
-

{{_('SMTP e-mail server settings')}}

+

{{_('E-mail Server Settings')}}

- - - - - + + + + + @@ -67,11 +67,11 @@

{{_('Configuration')}}

-
{{_('Calibre DB dir')}}
+
{{_('Calibre Database Directory')}}
{{config.config_calibre_dir}}
-
{{_('Log level')}}
+
{{_('Log Level')}}
{{config.get_log_level()}}
@@ -81,27 +81,27 @@
-
{{_('Books per page')}}
+
{{_('Books per Page')}}
{{config.config_books_per_page}}
-
{{_('Uploading')}}
+
{{_('Uploads')}}
{{ display_bool_setting(config.config_uploading) }}
-
{{_('Anonymous browsing')}}
+
{{_('Anonymous Browsing')}}
{{ display_bool_setting(config.config_anonbrowse) }}
-
{{_('Public registration')}}
+
{{_('Public Registration')}}
{{ display_bool_setting(config.config_public_reg) }}
-
{{_('Remote login')}}
+
{{_('Magic Link Remote Login')}}
{{ display_bool_setting(config.config_remote_login) }}
-
{{_('Reverse proxy login')}}
+
{{_('Reverse Proxy Login')}}
{{ display_bool_setting(config.config_allow_reverse_proxy_header_login) }}
{% if config.config_allow_reverse_proxy_header_login %} @@ -111,18 +111,18 @@
{% endif %}
- - + +

{{_('Administration')}}

- -
{{_('Reconnect to Calibre DB')}}
-
{{_('Restart Calibre-Web')}}
-
{{_('Stop Calibre-Web')}}
+ +
{{_('Reconnect Calibre Database')}}
+
{{_('Restart')}}
+
{{_('Shutdown')}}
@@ -145,7 +145,7 @@
{{_('SMTP hostname')}}{{_('SMTP port')}}{{_('SSL')}}{{_('SMTP login')}}{{_('SMTP Hostname')}}{{_('SMTP Port')}}{{_('Encryption')}}{{_('SMTP Login')}}
{{email.mail_server}}
-
{{_('Check for update')}}
+
{{_('Check for Update')}}
@@ -158,13 +158,13 @@
@@ -176,9 +176,9 @@ @@ -188,7 +188,7 @@ diff --git a/cps/templates/book_edit.html b/cps/templates/book_edit.html index e734698a..9d6dac7d 100644 --- a/cps/templates/book_edit.html +++ b/cps/templates/book_edit.html @@ -1,8 +1,6 @@ {% extends "layout.html" %} {% block body %} {% if book %} - -
{{ book.title }} @@ -72,7 +70,7 @@
- +
@@ -80,16 +78,16 @@
- +
- +
- +
@@ -115,8 +113,8 @@ {% endif %} - {% if c.datatype == 'int' %} - + {% if c.datatype == 'int' or c.datatype == 'float' %} + {% endif %} {% if c.datatype in ['text', 'series'] and not c.is_multiple %} @@ -157,7 +155,7 @@ {% if g.user.role_upload() or g.user.role_admin()%} {% if g.allow_upload %}
- +
@@ -166,12 +164,12 @@
- {{_('Get metadata')}} - - {{_('Back')}} + {{_('Fetch Metadata')}} + + {{_('Cancel')}}
@@ -187,13 +185,13 @@ {{_('Are you really sure?')}}
@@ -205,13 +203,13 @@ @@ -78,7 +85,7 @@
- +
@@ -86,7 +93,7 @@
- +
@@ -98,7 +105,7 @@
- +
@@ -132,23 +139,23 @@ {% endfor %}
- -
-
- - +
+ {{_('Add Allowed/Denied Tags')}} + {{_('Add Allowed/Denied custom column values')}}
-
- - {{_('Back')}} + + {{_('Cancel')}}
{% endblock %} +{% block modal %} +{{ restrict_modal() }} +{% endblock %} {% block js %} + + + + {% endblock %} diff --git a/cps/templates/detail.html b/cps/templates/detail.html index b76a8afa..d84dbe61 100644 --- a/cps/templates/detail.html +++ b/cps/templates/detail.html @@ -56,7 +56,7 @@ {% if reader_list and g.user.role_viewer() %}
+ +{% endmacro %} diff --git a/cps/templates/osd.xml b/cps/templates/osd.xml index 5c35b764..674303c2 100644 --- a/cps/templates/osd.xml +++ b/cps/templates/osd.xml @@ -2,11 +2,11 @@ {{instance}} {{instance}} - {{_('Calibre-Web ebook catalog')}} + {{_('Calibre-Web eBook Catalog')}} Janeczku https://github.com/janeczku/calibre-web + template="{{url_for('opds.feed_cc_search')}}/{searchTerms}"/> open diff --git a/cps/templates/read.html b/cps/templates/read.html index b3caec49..a4361fa0 100644 --- a/cps/templates/read.html +++ b/cps/templates/read.html @@ -3,7 +3,7 @@ - ePubJS Reader + ePub Reader diff --git a/cps/templates/readpdf.html b/cps/templates/readpdf.html index cb415b12..ceee5127 100644 --- a/cps/templates/readpdf.html +++ b/cps/templates/readpdf.html @@ -31,20 +31,21 @@ See https://github.com/adobe-type-tools/cmap-resources - + - - + + + - + @@ -52,7 +53,7 @@ See https://github.com/adobe-type-tools/cmap-resources
-
+
- +{% if g.user.role_download() %} - +{% endif %} Current View @@ -219,15 +221,14 @@ See https://github.com/adobe-type-tools/cmap-resources - +{% if g.user.role_download() %} - - - +{% endif %} Current View diff --git a/cps/templates/register.html b/cps/templates/register.html index 90ba8f8e..0e218ec2 100644 --- a/cps/templates/register.html +++ b/cps/templates/register.html @@ -1,14 +1,14 @@ {% extends "layout.html" %} {% block body %}
-

{{_('Register a new account')}}

+

{{_('Register New Account')}}

- +
diff --git a/cps/templates/remote_login.html b/cps/templates/remote_login.html index a688ce62..ce755afd 100644 --- a/cps/templates/remote_login.html +++ b/cps/templates/remote_login.html @@ -1,15 +1,16 @@ {% extends "layout.html" %} {% block body %}
-

{{_('Remote login')}}

+

{{_('Magic Link - Authorise New Device')}}

- {{_('Use your other device, login and visit ')}} {{verify_url}}. -

+ {{_('On another device, login and visit:')}} +

{{verify_url}} +

- {{_('Once you do so, you will automatically get logged in on this device.')}} + {{_('Once verified, you will automatically be logged in on this device.')}}

- {{_('The link will expire after 10 minutes.')}} + {{_('This verification link will expire in 10 minutes.')}}

{% endblock %} diff --git a/cps/templates/search.html b/cps/templates/search.html index dfa42799..eb6e83d0 100644 --- a/cps/templates/search.html +++ b/cps/templates/search.html @@ -2,8 +2,8 @@ {% block body %}
{% if entries|length < 1 %} -

{{_('No Results for:')}} {{searchterm}}

-

{{_('Please try a different search')}}

+

{{_('No Results Found')}} {{searchterm}}

+

{{_('Search Term:')}} {{searchterm}}

{% else %}

{{entries|length}} {{_('Results for:')}} {{searchterm}}

{% if g.user.is_authenticated %} diff --git a/cps/templates/search_form.html b/cps/templates/search_form.html index 6a64085d..e53a1cc6 100644 --- a/cps/templates/search_form.html +++ b/cps/templates/search_form.html @@ -16,14 +16,14 @@
- +
- +
@@ -114,11 +114,11 @@
- +
- +
@@ -167,7 +167,7 @@ {% endfor %} {% endif %} - +
{% endblock %} diff --git a/cps/templates/shelf.html b/cps/templates/shelf.html index 7f3c03cf..f37661ce 100644 --- a/cps/templates/shelf.html +++ b/cps/templates/shelf.html @@ -64,13 +64,13 @@ diff --git a/cps/templates/shelf_edit.html b/cps/templates/shelf_edit.html index d7f32dc4..934efe2b 100644 --- a/cps/templates/shelf_edit.html +++ b/cps/templates/shelf_edit.html @@ -10,13 +10,13 @@ {% if g.user.role_edit_shelfs() %}
{% endif %} - + {% if shelf.id != None %} - {{_('Back')}} + {{_('Cancel')}} {% endif %}
diff --git a/cps/templates/shelf_order.html b/cps/templates/shelf_order.html index 26fa2e35..84fb0208 100644 --- a/cps/templates/shelf_order.html +++ b/cps/templates/shelf_order.html @@ -2,22 +2,22 @@ {% block body %}

{{title}}

-
{{_('Drag \'n drop to rearrange order')}}
+
{{_('Drag to Rearrange Order')}}
{% for entry in entries %} -
+
- {{entry.title}} - {% if entry.series|length > 0 %} + {{entry['title']}} + {% if entry['series']|length > 0 %}
- {{entry.series_index}} - {{entry.series[0].name}} + {{entry['series_index']}} - {{entry['series'][0].name}} {% endif %}
- {% for author in entry.authors %} + {% for author in entry['authors'] %} {{author.name.replace('|',',')}} {% if not loop.last %} & @@ -29,7 +29,7 @@ {% endfor %}
- {{_('Back')}} + {{_('Back')}}
{% endblock %} @@ -37,6 +37,3 @@ {% endblock %} - - - diff --git a/cps/templates/stats.html b/cps/templates/stats.html index 1c4692e4..0457e4b9 100644 --- a/cps/templates/stats.html +++ b/cps/templates/stats.html @@ -1,10 +1,10 @@ {% extends "layout.html" %} {% block body %} -

{{_('About')}}

+

{{_('About')}} {{instance}}

{{instance}} powered by Calibre-Web.

-

{{_('Calibre library statistics')}}

+

{{_('Library Statistics')}}

@@ -25,11 +25,11 @@
-

{{_('Linked libraries')}}

+

{{_('Linked Libraries')}}

- + diff --git a/cps/templates/tasks.html b/cps/templates/tasks.html index 2f2c37c5..4a755c82 100644 --- a/cps/templates/tasks.html +++ b/cps/templates/tasks.html @@ -4,7 +4,7 @@ {% endblock %} {% block body %}
-

{{_('Tasks list')}}

+

{{_('Tasks')}}

{{_('Program library')}}{{_('Program Library')}} {{_('Installed Version')}}
@@ -14,8 +14,8 @@ - - + + diff --git a/cps/templates/user_edit.html b/cps/templates/user_edit.html index 54adb537..2b1640c3 100644 --- a/cps/templates/user_edit.html +++ b/cps/templates/user_edit.html @@ -10,7 +10,7 @@ {% endif %}
- +
{% if ( g.user and g.user.role_passwd() or g.user.role_admin() ) and not content.role_anonymous() %} @@ -23,7 +23,7 @@ {% endif %}
- +
{% if not content.role_anonymous() %} @@ -38,15 +38,14 @@ {% endif %}
- +
- {% if registered_oauth.keys()| length > 0 %} {% for id, name in registered_oauth.items() %}
@@ -58,9 +57,14 @@ {% endif %} {% endfor %}
- {% endif %} - + {% if kobo_support and not new_user %} + +
+ {{_('Create/View')}} + +
+ {% endif %}
{% for element in sidebar %} {% if element['config_show'] %} @@ -73,28 +77,28 @@
- +
+ {% if ( g.user and g.user.role_admin() and not new_user ) %} + {{_('Add allowed/denied Tags')}} + {{_('Add allowed/denied custom column values')}} + {% endif %}
{% if g.user and g.user.role_admin() and not profile %} {% if not content.role_anonymous() %}
- +
{% endif %} -
- - -
- +
@@ -106,7 +110,7 @@
- +
{% if not content.role_anonymous() %}
@@ -122,15 +126,15 @@ {% if g.user and g.user.role_admin() and not profile and not new_user and not content.role_anonymous() %}
{% endif %}
- + {% if not profile %} - {{_('Back')}} + {{_('Cancel')}} {% endif %}
@@ -141,11 +145,49 @@ {% for entry in downloads %} {% endfor %}
{% endif %} + + + + +{% endblock %} +{% block modal %} +{{ restrict_modal() }} +{% endblock %} +{% block js %} + + + + {% endblock %} diff --git a/cps/tess.py b/cps/tess.py deleted file mode 100644 index e0120e1c..00000000 --- a/cps/tess.py +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) -# Copyright (C) 2018-2019 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 . - -from subproc_wrapper import process_open, cmdlineCall -import os -import sys -import re -import time - -def main(): - quotes = [1, 2] - format_new_ext = '.mobi' - format_old_ext = '.epub' - file_path = '/home/matthias/Dokumente/bücher/Bettina Szramah/Die Giftmischerin TCP_IP (10)/Die Giftmischerin TCP_IP - Bettina, Szrama' - command = ['/opt/calibre/ebook-convert', (file_path + format_old_ext), - (file_path + format_new_ext)] - - #print(command) - #p1 = cmdlineCall(command[0],command[1:]) - #time.sleep(10) - #print(p1) - - p = process_open(command, quotes) - while p.poll() is None: - 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(r"(\d+)%\s.*", nextline) - if progress: - print('Progress:' + str(progress)) - # self.UIqueue[index]['progress'] = progress.group(1) + ' % - - # process returncode - check = p.returncode - calibre_traceback = p.stderr.readlines() - for ele in calibre_traceback: - if sys.version_info < (3, 0): - ele = ele.decode('utf-8') - print(ele.strip('\n')) - if not ele.startswith('Traceback') and not ele.startswith(' File'): - print( "Calibre failed with error: %s" % ele.strip('\n')) - print(str(check)) - -if __name__ == '__main__': - main() diff --git a/cps/translations/cs/LC_MESSAGES/messages.mo b/cps/translations/cs/LC_MESSAGES/messages.mo index b928b086..bd22d7ca 100644 Binary files a/cps/translations/cs/LC_MESSAGES/messages.mo and b/cps/translations/cs/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/cs/LC_MESSAGES/messages.po b/cps/translations/cs/LC_MESSAGES/messages.po index 40d276b7..cf67c4ea 100644 --- a/cps/translations/cs/LC_MESSAGES/messages.po +++ b/cps/translations/cs/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: 2020-01-14 18:17+0100\n" +"POT-Creation-Date: 2020-03-12 20:31+0100\n" "PO-Revision-Date: 2020-01-08 11:37+0000\n" "Last-Translator: Lukas Heroudek \n" "Language: cs_CZ\n" @@ -15,7 +15,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.7.0\n" +"Generated-By: Babel 2.8.0\n" #: cps/about.py:42 msgid "installed" @@ -25,7 +25,7 @@ msgstr "nainstalováno" msgid "not installed" msgstr "není nainstalováno" -#: cps/about.py:84 +#: cps/about.py:87 msgid "Statistics" msgstr "Statistika" @@ -39,7 +39,7 @@ msgstr "Vypínám server, zavřete okno" #: cps/admin.py:110 cps/editbooks.py:410 cps/editbooks.py:419 #: cps/editbooks.py:539 cps/editbooks.py:541 cps/editbooks.py:594 -#: cps/updater.py:446 cps/uploader.py:97 cps/uploader.py:108 +#: cps/updater.py:456 cps/uploader.py:96 cps/uploader.py:107 msgid "Unknown" msgstr "Neznámý" @@ -47,155 +47,164 @@ msgstr "Neznámý" msgid "Admin page" msgstr "Stránka správce" -#: cps/admin.py:148 cps/templates/admin.html:115 +#: cps/admin.py:151 msgid "UI Configuration" msgstr "Konfigurace uživatelského rozhraní" -#: cps/admin.py:185 cps/admin.py:412 +#: cps/admin.py:187 cps/admin.py:637 msgid "Calibre-Web configuration updated" msgstr "Konfigurace Calibre-Web aktualizována" -#: cps/admin.py:442 cps/templates/admin.html:114 +#: cps/admin.py:434 cps/admin.py:440 cps/admin.py:451 cps/admin.py:462 +#: cps/templates/modal_restriction.html:29 +msgid "Deny" +msgstr "" + +#: cps/admin.py:436 cps/admin.py:442 cps/admin.py:453 cps/admin.py:464 +#: cps/templates/modal_restriction.html:28 +msgid "Allow" +msgstr "" + +#: cps/admin.py:667 msgid "Basic Configuration" msgstr "Základní konfigurace" -#: cps/admin.py:465 cps/web.py:1090 +#: cps/admin.py:691 cps/web.py:1089 msgid "Please fill out all fields!" msgstr "Vyplňte všechna pole!" -#: cps/admin.py:467 cps/admin.py:478 cps/admin.py:484 cps/admin.py:499 -#: cps/templates/admin.html:38 +#: cps/admin.py:694 cps/admin.py:706 cps/admin.py:712 cps/admin.py:730 msgid "Add new user" msgstr "Přidat nového uživatele" -#: cps/admin.py:476 cps/web.py:1315 +#: cps/admin.py:703 cps/web.py:1318 msgid "E-mail is not from valid domain" msgstr "E-mail není z platné domény" -#: cps/admin.py:482 cps/admin.py:493 +#: cps/admin.py:710 cps/admin.py:725 msgid "Found an existing account for this e-mail address or nickname." msgstr "Byl nalezen existující účet pro tuto e-mailovou adresu nebo přezdívku." -#: cps/admin.py:489 +#: cps/admin.py:721 #, python-format msgid "User '%(user)s' created" -msgstr "Uživatel ‘%(user)s’ vytvořen" +msgstr "Uživatel '%(user)s' vytvořen" -#: cps/admin.py:509 +#: cps/admin.py:740 msgid "Edit e-mail server settings" msgstr "Změnit nastavení e-mailového serveru" -#: cps/admin.py:535 +#: cps/admin.py:766 #, python-format msgid "Test e-mail successfully send to %(kindlemail)s" msgstr "Zkušební e-mail úspěšně odeslán na %(kindlemail)s" -#: cps/admin.py:538 +#: cps/admin.py:769 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Při odesílání zkušebního e-mailu došlo k chybě: %(res)s" -#: cps/admin.py:540 +#: cps/admin.py:771 msgid "Please configure your e-mail address first..." msgstr "Prvně nastavte svou e-mailovou adresu..." -#: cps/admin.py:542 +#: cps/admin.py:773 msgid "E-mail server settings updated" msgstr "Nastavení e-mailového serveru aktualizováno" -#: cps/admin.py:571 +#: cps/admin.py:803 #, python-format msgid "User '%(nick)s' deleted" msgstr "Uživatel '%(nick)s' smazán" -#: cps/admin.py:574 +#: cps/admin.py:806 msgid "No admin user remaining, can't delete user" msgstr "Nezbývá žádný správce, nemůžete jej odstranit" -#: cps/admin.py:612 cps/web.py:1356 +#: cps/admin.py:842 cps/web.py:1361 msgid "Found an existing account for this e-mail address." msgstr "Byl nalezen existující účet pro tuto e-mailovou adresu." -#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1331 +#: cps/admin.py:852 cps/admin.py:867 cps/admin.py:887 cps/web.py:1336 #, python-format msgid "Edit User %(nick)s" msgstr "Upravit uživatele %(nick)s" -#: cps/admin.py:622 cps/web.py:1324 +#: cps/admin.py:858 cps/web.py:1328 msgid "This username is already taken" msgstr "Toto uživatelské jméno je již použito" -#: cps/admin.py:637 +#: cps/admin.py:874 #, python-format msgid "User '%(nick)s' updated" -msgstr "Uživatel %(nick)s’ aktualizován" +msgstr "Uživatel '%(nick)s' aktualizován" -#: cps/admin.py:640 +#: cps/admin.py:877 msgid "An unknown error occured." msgstr "Došlo k neznámé chybě." -#: cps/admin.py:657 +#: cps/admin.py:900 #, python-format msgid "Password for user %(user)s reset" msgstr "Heslo pro uživatele %(user)s resetováno" -#: cps/admin.py:660 cps/web.py:1115 cps/web.py:1171 +#: cps/admin.py:903 cps/web.py:1114 cps/web.py:1170 msgid "An unknown error occurred. Please try again later." msgstr "Neznámá chyba. Opakujte prosím později." -#: cps/admin.py:663 cps/web.py:1059 +#: cps/admin.py:906 cps/web.py:1055 msgid "Please configure the SMTP mail settings first..." msgstr "Nejprve nakonfigurujte nastavení pošty SMTP..." -#: cps/admin.py:674 +#: cps/admin.py:918 msgid "Logfile viewer" msgstr "Prohlížeč log souborů" -#: cps/admin.py:710 +#: cps/admin.py:957 msgid "Requesting update package" msgstr "Požadování balíčku aktualizace" -#: cps/admin.py:711 +#: cps/admin.py:958 msgid "Downloading update package" msgstr "Stahování balíčku aktualizace" -#: cps/admin.py:712 +#: cps/admin.py:959 msgid "Unzipping update package" msgstr "Rozbalování balíčku aktualizace" -#: cps/admin.py:713 +#: cps/admin.py:960 msgid "Replacing files" msgstr "Nahrazování souborů" -#: cps/admin.py:714 +#: cps/admin.py:961 msgid "Database connections are closed" msgstr "Databázová připojení jsou uzavřena" -#: cps/admin.py:715 +#: cps/admin.py:962 msgid "Stopping server" msgstr "Zastavuji server" -#: cps/admin.py:716 +#: cps/admin.py:963 msgid "Update finished, please press okay and reload page" msgstr "Aktualizace dokončena, klepněte na tlačítko OK a znovu načtěte stránku" -#: cps/admin.py:717 cps/admin.py:718 cps/admin.py:719 cps/admin.py:720 +#: cps/admin.py:964 cps/admin.py:965 cps/admin.py:966 cps/admin.py:967 msgid "Update failed:" msgstr "Aktualizace selhala:" -#: cps/admin.py:717 cps/updater.py:272 cps/updater.py:457 cps/updater.py:459 +#: cps/admin.py:964 cps/updater.py:282 cps/updater.py:467 cps/updater.py:469 msgid "HTTP Error" msgstr "HTTP chyba" -#: cps/admin.py:718 cps/updater.py:274 cps/updater.py:461 +#: cps/admin.py:965 cps/updater.py:284 cps/updater.py:471 msgid "Connection error" msgstr "Chyba připojení" -#: cps/admin.py:719 cps/updater.py:276 cps/updater.py:463 +#: cps/admin.py:966 cps/updater.py:286 cps/updater.py:473 msgid "Timeout while establishing connection" msgstr "Vypršel časový limit při navazování spojení" -#: cps/admin.py:720 cps/updater.py:278 cps/updater.py:465 +#: cps/admin.py:967 cps/updater.py:288 cps/updater.py:475 msgid "General error" msgstr "Všeobecná chyba" @@ -205,7 +214,7 @@ msgstr "není nakonfigurováno" #: cps/editbooks.py:214 cps/editbooks.py:396 msgid "Error opening eBook. File does not exist or file is not accessible" -msgstr "Chyba otevírání eKnihy. Soubor neexistuje nebo není přístupný" +msgstr "Chyba otevírání eknihy. Soubor neexistuje nebo není přístupný" #: cps/editbooks.py:242 msgid "edit metadata" @@ -214,11 +223,11 @@ msgstr "upravit metadata" #: cps/editbooks.py:321 cps/editbooks.py:569 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" -msgstr "Soubor s příponou ‘%(ext)s’ nelze odeslat na tento server" +msgstr "Soubor s příponou '%(ext)s' nelze odeslat na tento server" #: cps/editbooks.py:325 cps/editbooks.py:573 msgid "File to be uploaded must have an extension" -msgstr "Soubor, který má být odeslán, musí mít příponu" +msgstr "Soubor, který má být odeslán musí mít příponu" #: cps/editbooks.py:337 cps/editbooks.py:607 #, python-format @@ -235,13 +244,9 @@ msgstr "Uložení souboru %(file)s se nezdařilo." msgid "File format %(ext)s added to %(book)s" msgstr "Formát souboru %(ext)s přidán do %(book)s" -#: cps/editbooks.py:376 -msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" -msgstr "Obal není v podporovaném formátu (jpg/png/webp), nelze uložit" - #: cps/editbooks.py:451 msgid "Cover is not a jpg file, can't save" -msgstr "Obal neni soubor jpg, nelze uložit" +msgstr "Obal není soubor jpg, nelze uložit" #: cps/editbooks.py:494 #, python-format @@ -275,30 +280,30 @@ msgstr "Nepodařilo se uložit soubor %(file)s (Oprávnění odepřeno)." msgid "Failed to delete file %(file)s (Permission denied)." msgstr "Nepodařilo se smazat soubor %(file)s (Oprávnění odepřeno)." -#: cps/editbooks.py:710 +#: cps/editbooks.py:709 #, python-format msgid "File %(file)s uploaded" msgstr "Soubor %(file)s nahrán" -#: cps/editbooks.py:739 +#: cps/editbooks.py:738 msgid "Source or destination format for conversion missing" msgstr "Chybí zdrojový nebo cílový formát pro převod" -#: cps/editbooks.py:747 +#: cps/editbooks.py:746 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Kniha byla úspěšně zařazena do fronty pro převod do %(book_format)s" -#: cps/editbooks.py:751 +#: cps/editbooks.py:750 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Při převodu této knihy došlo k chybě: %(res)s" -#: cps/gdrive.py:62 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" -msgstr "Google Drive nastavení nebylo dokončeno, zkuste znovu deaktivovat a aktivovat Google Drive" +msgstr "Google Drive nastavení nebylo dokončeno, zkuste znovu deaktivovat a aktivovat Google Drive" -#: cps/gdrive.py:104 +#: cps/gdrive.py:103 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Doména zpětného volání není ověřena, postupujte podle pokynů k ověření domény v konzole pro vývojáře google" @@ -366,17 +371,17 @@ msgstr "Požadovaný soubor nelze přečíst. Možná nesprávná oprávnění?" #: cps/helper.py:322 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" -msgstr "Přejmenování názvu z: ‘%(src)s‘ na ‘%(dest)s' selhalo chybou: %(error)s" +msgstr "Přejmenování názvu z: '%(src)s' na '%(dest)s' selhalo chybou: %(error)s" #: cps/helper.py:332 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" -msgstr "Přejmenovat autora z: ‘%(src)s‘ na ‘%(dest)s’ selhalo chybou: %(error)s" +msgstr "Přejmenovat autora z: '%(src)s' na '%(dest)s' selhalo chybou: %(error)s" #: cps/helper.py:346 #, python-format msgid "Rename file in path '%(src)s' to '%(dest)s' failed with error: %(error)s" -msgstr "Přejmenování souboru v cestě ‘%(src)s‘ na ‘%(dest)s‘ selhalo chybou: %(error)s" +msgstr "Přejmenování souboru v cestě '%(src)s' na '%(dest)s' selhalo chybou: %(error)s" #: cps/helper.py:372 cps/helper.py:382 cps/helper.py:390 #, python-format @@ -388,83 +393,111 @@ msgstr "Soubor %(file)s nenalezen na Google Drive" msgid "Book path %(path)s not found on Google Drive" msgstr "Cesta ke knize %(path)s nebyla nalezena na Google Drive" -#: cps/helper.py:643 +#: cps/helper.py:511 +msgid "Failed to create path for cover" +msgstr "" + +#: cps/helper.py:516 +msgid "Cover-file is not a valid image file" +msgstr "" + +#: cps/helper.py:519 +msgid "Failed to store cover-file" +msgstr "" + +#: cps/helper.py:530 +msgid "Only jpg/jpeg/png/webp files are supported as coverfile" +msgstr "" + +#: cps/helper.py:544 +msgid "Only jpg/jpeg files are supported as coverfile" +msgstr "" + +#: cps/helper.py:658 msgid "Waiting" msgstr "Čekám" -#: cps/helper.py:645 +#: cps/helper.py:660 msgid "Failed" msgstr "Selhalo" -#: cps/helper.py:647 +#: cps/helper.py:662 msgid "Started" msgstr "Spuštěno" -#: cps/helper.py:649 +#: cps/helper.py:664 msgid "Finished" msgstr "Dokončeno" -#: cps/helper.py:651 +#: cps/helper.py:666 msgid "Unknown Status" msgstr "Neznámý stav" -#: cps/helper.py:656 +#: cps/helper.py:671 msgid "E-mail: " msgstr "E-mail: " -#: cps/helper.py:658 cps/helper.py:662 +#: cps/helper.py:673 cps/helper.py:677 msgid "Convert: " msgstr "Převést:" -#: cps/helper.py:660 +#: cps/helper.py:675 msgid "Upload: " msgstr "Nahrát:" -#: cps/helper.py:664 +#: cps/helper.py:679 msgid "Unknown Task: " msgstr "Neznámá úloha:" -#: cps/oauth_bb.py:75 +#: cps/kobo_auth.py:127 +msgid "PLease access calibre-web from non localhost to get valid api_endpoint for kobo device" +msgstr "" + +#: cps/kobo_auth.py:130 cps/kobo_auth.py:150 +msgid "Kobo Setup" +msgstr "" + +#: cps/oauth_bb.py:74 #, python-format msgid "Register with %(provider)s" msgstr "Registrovat s %(provider)s" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:154 msgid "Failed to log in with GitHub." msgstr "Přihlášení pomocí GitHub selhalo" -#: cps/oauth_bb.py:160 +#: cps/oauth_bb.py:159 msgid "Failed to fetch user info from GitHub." msgstr "Nepodařilo se načíst informace o uživateli z GitHub" -#: cps/oauth_bb.py:171 +#: cps/oauth_bb.py:170 msgid "Failed to log in with Google." msgstr "Přihlášení pomocí Google selhalo" -#: cps/oauth_bb.py:176 +#: cps/oauth_bb.py:175 msgid "Failed to fetch user info from Google." msgstr "Nepodařilo se načíst informace o uživateli z Google" -#: cps/oauth_bb.py:274 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s success." msgstr "Odpojení %(oauth)s úspěšné." -#: cps/oauth_bb.py:278 +#: cps/oauth_bb.py:277 #, python-format msgid "Unlink to %(oauth)s failed." msgstr "Odpojení %(oauth)s neúspěšné." -#: cps/oauth_bb.py:281 +#: cps/oauth_bb.py:280 #, python-format msgid "Not linked to %(oauth)s." msgstr "Není propojeno s %(oauth)s." -#: cps/oauth_bb.py:309 +#: cps/oauth_bb.py:308 msgid "GitHub Oauth error, please retry later." msgstr "GitHub Oauth chyba, prosím opakujte později" -#: cps/oauth_bb.py:328 +#: cps/oauth_bb.py:327 msgid "Google Oauth error, please retry later." msgstr "Google Oauth chyba, prosím opakujte později" @@ -489,7 +522,7 @@ msgstr "Kniha je již součástí police: %(shelfname)s" #: cps/shelf.py:85 #, python-format msgid "Book has been added to shelf: %(sname)s" -msgstr "Kniha byla přidána do plice: %(sname)s" +msgstr "Kniha byla přidána do police: %(sname)s" #: cps/shelf.py:104 #, python-format @@ -515,403 +548,393 @@ msgstr "Knihy byly přidány do police: %(sname)s" msgid "Could not add books to shelf: %(sname)s" msgstr "Nelze přidat knihy do police: %(sname)s" -#: cps/shelf.py:180 +#: cps/shelf.py:181 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "Kniha byla odebrána z police: %(sname)s" -#: cps/shelf.py:186 +#: cps/shelf.py:190 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "Lituji, nejste oprávněni odebrat knihu z této police: %(sname)s" -#: cps/shelf.py:207 cps/shelf.py:231 +#: cps/shelf.py:211 cps/shelf.py:235 #, python-format msgid "A shelf with the name '%(title)s' already exists." -msgstr "Police s názvem ‘%(title)s’ již existuje." +msgstr "Police s názvem '%(title)s' již existuje." -#: cps/shelf.py:212 +#: cps/shelf.py:216 #, python-format msgid "Shelf %(title)s created" msgstr "Police %(title)s vytvořena" -#: cps/shelf.py:214 cps/shelf.py:242 +#: cps/shelf.py:218 cps/shelf.py:246 msgid "There was an error" msgstr "Došlo k chybě" -#: cps/shelf.py:215 cps/shelf.py:217 +#: cps/shelf.py:219 cps/shelf.py:221 msgid "create a shelf" msgstr "vytvořit polici" -#: cps/shelf.py:240 +#: cps/shelf.py:244 #, python-format msgid "Shelf %(title)s changed" msgstr "Police %(title)s změněna" -#: cps/shelf.py:243 cps/shelf.py:245 +#: cps/shelf.py:247 cps/shelf.py:249 msgid "Edit a shelf" msgstr "Upravit polici" -#: cps/shelf.py:289 +#: cps/shelf.py:301 #, python-format msgid "Shelf: '%(name)s'" -msgstr "Police: ’%(name)s’" +msgstr "Police: '%(name)s'" -#: cps/shelf.py:292 +#: cps/shelf.py:304 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Chyba otevírání police. Police neexistuje nebo není přístupná" -#: cps/shelf.py:323 +#: cps/shelf.py:342 +msgid "Hidden Book" +msgstr "" + +#: cps/shelf.py:347 #, python-format msgid "Change order of Shelf: '%(name)s'" -msgstr "Změnit pořadí Police: ‘%(name)s’" +msgstr "Změnit pořadí Police: '%(name)s'" -#: cps/ub.py:57 +#: cps/ub.py:56 msgid "Recently Added" msgstr "Nedávno přidáné" -#: cps/ub.py:59 +#: cps/ub.py:58 msgid "Show recent books" msgstr "Zobrazit nedávné knihy" -#: cps/templates/index.xml:17 cps/ub.py:60 +#: cps/templates/index.xml:17 cps/ub.py:59 msgid "Hot Books" msgstr "Žhavé knihy" -#: cps/ub.py:61 -msgid "Show hot books" -msgstr "Zobrazit žhavé knihy" +#: cps/ub.py:60 +msgid "Show Hot Books" +msgstr "" -#: cps/templates/index.xml:24 cps/ub.py:64 -msgid "Best rated Books" -msgstr "Nejlépe hodnocené knihy" +#: cps/templates/index.xml:24 cps/ub.py:63 cps/web.py:508 +msgid "Top Rated Books" +msgstr "" -#: cps/ub.py:66 -msgid "Show best rated books" -msgstr "Zobrazit nejlépe hodnocené knihy" +#: cps/ub.py:65 +msgid "Show Top Rated Books" +msgstr "" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67 -#: cps/web.py:1009 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:66 +#: cps/web.py:1005 msgid "Read Books" msgstr "Přečtené knihy" -#: cps/ub.py:69 +#: cps/ub.py:68 msgid "Show read and unread" msgstr "Zobrazit prečtené a nepřečtené" -#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71 -#: cps/web.py:1013 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:70 +#: cps/web.py:1009 msgid "Unread Books" msgstr "Nepřečtené knihy" -#: cps/ub.py:73 +#: cps/ub.py:72 msgid "Show unread" msgstr "Zobrazit nepřečtené" -#: cps/ub.py:74 +#: cps/ub.py:73 msgid "Discover" msgstr "Objevte" -#: cps/ub.py:76 +#: cps/ub.py:75 msgid "Show random books" msgstr "Zobrazit náhodné knihy" -#: cps/templates/index.xml:75 cps/ub.py:77 +#: cps/templates/index.xml:75 cps/ub.py:76 cps/web.py:787 msgid "Categories" msgstr "Kategorie" -#: cps/ub.py:79 +#: cps/ub.py:78 msgid "Show category selection" msgstr "Zobrazit výběr kategorie" -#: cps/templates/book_edit.html:71 cps/templates/index.xml:82 -#: cps/templates/search_form.html:53 cps/ub.py:80 +#: cps/templates/book_edit.html:69 cps/templates/index.xml:82 +#: cps/templates/search_form.html:53 cps/ub.py:79 cps/web.py:715 msgid "Series" msgstr "Série" -#: cps/ub.py:82 +#: cps/ub.py:81 msgid "Show series selection" msgstr "Zobrazit výběr sérií" -#: cps/templates/index.xml:61 cps/ub.py:83 +#: cps/templates/index.xml:61 cps/ub.py:82 msgid "Authors" msgstr "Autoři" -#: cps/ub.py:85 +#: cps/ub.py:84 msgid "Show author selection" msgstr "Zobrazit výběr autora" -#: cps/templates/index.xml:68 cps/ub.py:87 +#: cps/templates/index.xml:68 cps/ub.py:86 cps/web.py:699 msgid "Publishers" msgstr "Vydavatelé" -#: cps/ub.py:89 +#: cps/ub.py:88 msgid "Show publisher selection" msgstr "Zobrazit výběr vydavatele" -#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:90 +#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:89 +#: cps/web.py:770 msgid "Languages" msgstr "Jazyky" -#: cps/ub.py:93 +#: cps/ub.py:92 msgid "Show language selection" msgstr "Zobrazit výběr jazyka" -#: cps/ub.py:94 +#: cps/templates/index.xml:96 cps/ub.py:93 msgid "Ratings" msgstr "Hodnocení" -#: cps/ub.py:96 +#: cps/ub.py:95 msgid "Show ratings selection" msgstr "Zobrazit výběr hodnocení" -#: cps/templates/index.xml:96 cps/ub.py:97 +#: cps/templates/index.xml:104 cps/ub.py:96 msgid "File formats" msgstr "Formáty souborů" -#: cps/ub.py:99 +#: cps/ub.py:98 msgid "Show file formats selection" msgstr "Zobrazit výběr formátů" -#: cps/updater.py:252 cps/updater.py:359 cps/updater.py:372 +#: cps/updater.py:262 cps/updater.py:369 cps/updater.py:382 msgid "Unexpected data while reading update information" msgstr "Neočekávaná data při čtení informací o aktualizaci" -#: cps/updater.py:259 cps/updater.py:365 +#: cps/updater.py:269 cps/updater.py:375 msgid "No update available. You already have the latest version installed" msgstr "Aktualizace není k dispozici. Máte nainstalovanou nejnovější verzi" -#: cps/updater.py:285 +#: cps/updater.py:295 msgid "A new update is available. Click on the button below to update to the latest version." msgstr "Nová aktualizace k dispozici. Klepnutím na tlačítko níže aktualizujte na nejnovější verzi." -#: cps/updater.py:338 +#: cps/updater.py:348 msgid "Could not fetch update information" msgstr "Nelze získat informace o aktualizaci" -#: cps/updater.py:352 +#: cps/updater.py:362 msgid "No release information available" msgstr "Nejsou k dispozici žádné informace o verzi" -#: cps/updater.py:405 cps/updater.py:414 +#: cps/updater.py:415 cps/updater.py:424 #, python-format msgid "A new update is available. Click on the button below to update to version: %(version)s" msgstr "Nová aktualizace k dispozici. Klepnutím na tlačítko níže aktualizujte na verzi: %(version)s" -#: cps/updater.py:424 +#: cps/updater.py:434 msgid "Click on the button below to update to the latest stable version." msgstr "Klepnutím na tlačítko níže aktualizujte na nejnovější stabilní verzi." -#: cps/web.py:486 +#: cps/web.py:480 msgid "Recently Added Books" msgstr "Nedávno přidané knihy" -#: cps/web.py:514 -msgid "Best rated books" -msgstr "Nejlépe hodnocené knihy" - -#: cps/templates/index.xml:38 cps/web.py:522 -msgid "Random Books" -msgstr "Náhodné knihy" +#: cps/templates/index.html:5 cps/web.py:516 +msgid "Discover (Random Books)" +msgstr "Objevte (Náhodné knihy)" -#: cps/web.py:548 +#: cps/web.py:542 msgid "Books" msgstr "Knihy" -#: cps/web.py:575 -msgid "Hot Books (most downloaded)" -msgstr "Žhavé knihy (nejstahovanější)" +#: cps/web.py:569 +msgid "Hot Books (Most Downloaded)" +msgstr "" -#: cps/web.py:586 cps/web.py:1379 cps/web.py:1475 -msgid "Error opening eBook. File does not exist or file is not accessible:" -msgstr "Chyba při otevíraní eKnihy. Soubor neexistuje nebo neni přístupný:" +#: cps/web.py:580 +msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" +msgstr "" -#: cps/web.py:599 +#: cps/web.py:593 #, python-format msgid "Author: %(name)s" msgstr "Autoři: %(name)s" -#: cps/web.py:611 +#: cps/web.py:605 #, python-format msgid "Publisher: %(name)s" msgstr "Vydavatel: %(name)s" -#: cps/web.py:622 +#: cps/web.py:616 #, python-format msgid "Series: %(serie)s" msgstr "Série: %(serie)s" -#: cps/web.py:633 +#: cps/web.py:627 #, python-format msgid "Rating: %(rating)s stars" msgstr "Hodnocení: %(rating)s stars" -#: cps/web.py:644 +#: cps/web.py:638 #, python-format msgid "File format: %(format)s" msgstr "Soubor formátů: %(format)s" -#: cps/web.py:656 +#: cps/web.py:650 #, python-format msgid "Category: %(name)s" msgstr "Kategorie: %(name)s" -#: cps/web.py:673 +#: cps/web.py:667 #, python-format msgid "Language: %(name)s" msgstr "Jazyky: %(name)s" -#: cps/web.py:705 -msgid "Publisher list" -msgstr "Seznam vydavatelů" - -#: cps/web.py:721 -msgid "Series list" -msgstr "Seznam sérií" - -#: cps/web.py:735 +#: cps/web.py:729 msgid "Ratings list" msgstr "Seznam hodnocení" -#: cps/web.py:748 +#: cps/web.py:742 msgid "File formats list" msgstr "Seznam formátů" -#: cps/web.py:776 -msgid "Available languages" -msgstr "Dostupné jazyky" - -#: cps/web.py:793 -msgid "Category list" -msgstr "Seznam kategorií" - -#: cps/templates/layout.html:73 cps/web.py:807 +#: cps/templates/layout.html:73 cps/templates/tasks.html:7 cps/web.py:801 msgid "Tasks" msgstr "Úlohy" -#: cps/templates/feed.xml:33 cps/templates/layout.html:44 -#: cps/templates/layout.html:45 cps/web.py:827 cps/web.py:829 +#: cps/templates/book_edit.html:212 cps/templates/feed.xml:33 +#: cps/templates/layout.html:44 cps/templates/layout.html:47 +#: cps/templates/search_form.html:170 cps/web.py:821 cps/web.py:823 msgid "Search" msgstr "Hledat" -#: cps/web.py:879 +#: cps/web.py:873 msgid "Published after " msgstr "Vydáno po " -#: cps/web.py:886 +#: cps/web.py:880 msgid "Published before " msgstr "Vydáno před " -#: cps/web.py:900 +#: cps/web.py:894 #, python-format msgid "Rating <= %(rating)s" msgstr "Hodnocení <= %(rating)s" -#: cps/web.py:902 +#: cps/web.py:896 #, python-format msgid "Rating >= %(rating)s" -msgstr "Hodnocení >= %(rating)s" +msgstr "Hodnocení >= %(rating)s" -#: cps/web.py:968 cps/web.py:980 +#: cps/web.py:962 cps/web.py:976 msgid "search" msgstr "hledat" -#: cps/web.py:1064 +#: cps/web.py:1060 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Kniha byla úspěšně zařazena do fronty pro odeslání na %(kindlemail)s" -#: cps/web.py:1068 +#: cps/web.py:1064 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "Při odesílání této knihy došlo k chybě: %(res)s" -#: cps/web.py:1070 +#: cps/web.py:1066 msgid "Please configure your kindle e-mail address first..." msgstr "Nejprve nakonfigurujte vaši kindle e-mailovou adresu.." -#: cps/web.py:1084 +#: cps/web.py:1083 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "E-mailový server není nakonfigurován, kontaktujte svého správce!" -#: cps/web.py:1085 cps/web.py:1091 cps/web.py:1116 cps/web.py:1120 -#: cps/web.py:1125 cps/web.py:1129 +#: cps/web.py:1084 cps/web.py:1090 cps/web.py:1115 cps/web.py:1119 +#: cps/web.py:1124 cps/web.py:1128 msgid "register" msgstr "registrovat" -#: cps/web.py:1118 +#: cps/web.py:1117 msgid "Your e-mail is not allowed to register" msgstr "Váš e-mail nemá povolení k registraci" -#: cps/web.py:1121 +#: cps/web.py:1120 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Potvrzovací e-mail byl odeslán na váš účet." -#: cps/web.py:1124 +#: cps/web.py:1123 msgid "This username or e-mail address is already in use." msgstr "Toto uživatelské jméno nebo e-mailová adresa jsou již používány." -#: cps/web.py:1141 +#: cps/web.py:1140 msgid "Cannot activate LDAP authentication" msgstr "Nelze aktivovat ověření LDAP" -#: cps/web.py:1151 cps/web.py:1278 +#: cps/web.py:1150 cps/web.py:1277 #, python-format msgid "you are now logged in as: '%(nickname)s'" -msgstr "nyní jste přihlášeni jako: ‘%(nickname)s’" +msgstr "nyní jste přihlášeni jako: '%(nickname)s'" -#: cps/web.py:1156 +#: cps/web.py:1155 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "Nelze se přihlásit. LDAP server neodpovídá, kontaktujte svého správce" -#: cps/web.py:1160 cps/web.py:1183 +#: cps/web.py:1159 cps/web.py:1182 msgid "Wrong Username or Password" msgstr "Špatné uživatelské jméno nebo heslo" -#: cps/web.py:1167 +#: cps/web.py:1166 msgid "New Password was send to your email address" msgstr "Nové heslo bylo zasláno na váši emailovou adresu" -#: cps/web.py:1173 +#: cps/web.py:1172 msgid "Please enter valid username to reset password" msgstr "Zadejte platné uživatelské jméno pro obnovení hesla" -#: cps/web.py:1179 +#: cps/web.py:1178 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Nyní jste přihlášeni jako: '%(nickname)s'" -#: cps/web.py:1186 cps/web.py:1210 +#: cps/web.py:1185 cps/web.py:1209 msgid "login" msgstr "přihlásit se" -#: cps/web.py:1222 cps/web.py:1256 +#: cps/web.py:1221 cps/web.py:1255 msgid "Token not found" msgstr "Token nenalezen" -#: cps/web.py:1231 cps/web.py:1264 +#: cps/web.py:1230 cps/web.py:1263 msgid "Token has expired" msgstr "Token vypršel" -#: cps/web.py:1240 +#: cps/web.py:1239 msgid "Success! Please return to your device" msgstr "Úspěch! Vraťte se prosím do zařízení" -#: cps/web.py:1317 cps/web.py:1360 cps/web.py:1366 +#: cps/web.py:1320 cps/web.py:1365 cps/web.py:1371 #, python-format msgid "%(name)s's profile" msgstr "%(name)s profil" -#: cps/web.py:1362 +#: cps/web.py:1367 msgid "Profile updated" msgstr "Profil aktualizován" -#: cps/web.py:1391 cps/web.py:1394 cps/web.py:1397 cps/web.py:1404 -#: cps/web.py:1409 +#: cps/web.py:1384 cps/web.py:1480 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "Chyba při otevíraní eKnihy. Soubor neexistuje nebo neni přístupný:" + +#: cps/web.py:1396 cps/web.py:1399 cps/web.py:1402 cps/web.py:1409 +#: cps/web.py:1414 msgid "Read a Book" msgstr "Číst knihu" -#: cps/web.py:1420 +#: cps/web.py:1425 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "Chyba při otevírání eKnihy. Soubor neexistuje nebo není přístupný" @@ -926,23 +949,26 @@ msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Kindlegen selhal chybou %(error)s. Zpráva: %(message)s" #: cps/templates/admin.html:9 -msgid "User list" +msgid "Users" msgstr "Seznam uživatelů" -#: cps/templates/admin.html:12 -msgid "Nickname" +#: cps/templates/admin.html:12 cps/templates/login.html:8 +#: cps/templates/login.html:9 cps/templates/register.html:7 +#: cps/templates/user_edit.html:8 +msgid "Username" msgstr "Přezdívka" -#: cps/templates/admin.html:13 -msgid "E-mail" +#: cps/templates/admin.html:13 cps/templates/register.html:11 +#: cps/templates/user_edit.html:13 +msgid "E-mail Address" msgstr "E-mail" -#: cps/templates/admin.html:14 -msgid "Kindle" +#: cps/templates/admin.html:14 cps/templates/user_edit.html:26 +msgid "Send to Kindle E-mail Address" msgstr "Kindle" #: cps/templates/admin.html:15 -msgid "DLS" +msgid "Downloads" msgstr "Staženo" #: cps/templates/admin.html:16 cps/templates/layout.html:76 @@ -956,8 +982,8 @@ msgid "Download" msgstr "Stahovat" #: cps/templates/admin.html:18 -msgid "View Ebooks" -msgstr "Prohlížet eknihy" +msgid "View eBooks" +msgstr "" #: cps/templates/admin.html:19 cps/templates/layout.html:65 msgid "Upload" @@ -967,28 +993,32 @@ msgstr "Nahrávat" msgid "Edit" msgstr "Upravovat" +#: cps/templates/admin.html:38 +msgid "Add New User" +msgstr "" + #: cps/templates/admin.html:44 -msgid "SMTP e-mail server settings" +msgid "E-mail Server Settings" msgstr "Nastavení e-mailového serveru SMTP" #: cps/templates/admin.html:47 cps/templates/email_edit.html:11 -msgid "SMTP hostname" +msgid "SMTP Hostname" msgstr "SMTP hostitel" -#: cps/templates/admin.html:48 -msgid "SMTP port" +#: cps/templates/admin.html:48 cps/templates/email_edit.html:15 +msgid "SMTP Port" msgstr "SMTP port" -#: cps/templates/admin.html:49 -msgid "SSL" +#: cps/templates/admin.html:49 cps/templates/email_edit.html:19 +msgid "Encryption" msgstr "SSL" #: cps/templates/admin.html:50 cps/templates/email_edit.html:27 -msgid "SMTP login" +msgid "SMTP Login" msgstr "SMTP přihlášení" -#: cps/templates/admin.html:51 -msgid "From mail" +#: cps/templates/admin.html:51 cps/templates/email_edit.html:35 +msgid "From E-mail" msgstr "Z e-mailu" #: cps/templates/admin.html:61 @@ -1000,63 +1030,71 @@ msgid "Configuration" msgstr "Konfigurace" #: cps/templates/admin.html:70 -msgid "Calibre DB dir" +msgid "Calibre Database Directory" msgstr "Calibre DB adresář" -#: cps/templates/admin.html:74 -msgid "Log level" +#: cps/templates/admin.html:74 cps/templates/config_edit.html:122 +msgid "Log Level" msgstr "Úroveň logu" #: cps/templates/admin.html:78 msgid "Port" msgstr "Port" -#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:23 -msgid "Books per page" +#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:27 +msgid "Books per Page" msgstr "Knihy na stránku" #: cps/templates/admin.html:88 -msgid "Uploading" +msgid "Uploads" msgstr "Nahrávání" #: cps/templates/admin.html:92 -msgid "Anonymous browsing" +msgid "Anonymous Browsing" msgstr "Anonymní prohlížení" #: cps/templates/admin.html:96 -msgid "Public registration" +msgid "Public Registration" msgstr "Veřejná registrace" -#: cps/templates/admin.html:100 cps/templates/remote_login.html:4 -msgid "Remote login" +#: cps/templates/admin.html:100 +msgid "Magic Link Remote Login" msgstr "Vzdálené přihlášení" #: cps/templates/admin.html:104 -msgid "Reverse proxy login" +msgid "Reverse Proxy Login" msgstr "Reverzní proxy přihlášení" #: cps/templates/admin.html:109 msgid "Reverse proxy header name" msgstr "Název záhlaví reverzního prixy" +#: cps/templates/admin.html:114 +msgid "Edit Basic Configuration" +msgstr "" + +#: cps/templates/admin.html:115 +msgid "Edit UI Configuration" +msgstr "" + #: cps/templates/admin.html:121 msgid "Administration" msgstr "Správa" #: cps/templates/admin.html:122 -msgid "View Logfiles" +msgid "View Logs" msgstr "Zobrazit log" #: cps/templates/admin.html:123 -msgid "Reconnect to Calibre DB" +msgid "Reconnect Calibre Database" msgstr "Znovupřipojení ke Calibre DB" #: cps/templates/admin.html:124 -msgid "Restart Calibre-Web" +msgid "Restart" msgstr "Restartovat Calibre-Web" #: cps/templates/admin.html:125 -msgid "Stop Calibre-Web" +msgid "Shutdown" msgstr "Zastavit Calibre-Web" #: cps/templates/admin.html:131 @@ -1076,7 +1114,7 @@ msgid "Current version" msgstr "Současná verze" #: cps/templates/admin.html:148 -msgid "Check for update" +msgid "Check for Update" msgstr "Zkontrolovat aktualizace" #: cps/templates/admin.html:149 @@ -1084,30 +1122,29 @@ msgid "Perform Update" msgstr "Provést aktualizaci" #: cps/templates/admin.html:161 -msgid "Do you really want to restart Calibre-Web?" +msgid "Are you sure you want to restart?" msgstr "Opravdu chcete restartovat Calibre-Web?" #: cps/templates/admin.html:166 cps/templates/admin.html:180 #: cps/templates/admin.html:200 cps/templates/shelf.html:72 -msgid "Ok" -msgstr "Ok" +msgid "OK" +msgstr "OK" #: cps/templates/admin.html:167 cps/templates/admin.html:181 -#: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 +#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:194 +#: cps/templates/config_edit.html:346 cps/templates/config_view_edit.html:151 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92 -#: cps/templates/layout.html:28 cps/templates/shelf.html:73 -#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32 -#: cps/templates/user_edit.html:133 -msgid "Back" -msgstr "Zpět" +#: cps/templates/shelf.html:73 cps/templates/shelf_edit.html:19 +#: cps/templates/user_edit.html:137 +msgid "Cancel" +msgstr "" #: cps/templates/admin.html:179 -msgid "Do you really want to stop Calibre-Web?" +msgid "Are you sure you want to shutdown?" msgstr "Opravdu chcete zastavit Calibre-Web?" #: cps/templates/admin.html:191 -msgid "Updating, please do not reload page" +msgid "Updating, please do not reload this page" msgstr "Probíhá aktualizace, prosím nenačítejte stránku znovu" #: cps/templates/author.html:15 @@ -1134,161 +1171,159 @@ msgstr "redukovat" msgid "More by" msgstr "Více od" -#: cps/templates/book_edit.html:12 +#: cps/templates/book_edit.html:10 msgid "Delete Book" msgstr "Smazat knihu" -#: cps/templates/book_edit.html:15 +#: cps/templates/book_edit.html:13 msgid "Delete formats:" msgstr "Smazat formáty:" -#: cps/templates/book_edit.html:18 cps/templates/book_edit.html:195 -#: cps/templates/email_edit.html:91 +#: cps/templates/book_edit.html:16 cps/templates/book_edit.html:193 +#: cps/templates/email_edit.html:91 cps/templates/user_edit.html:65 +#: cps/templates/user_edit.html:177 msgid "Delete" msgstr "Smazat" -#: cps/templates/book_edit.html:26 +#: cps/templates/book_edit.html:24 msgid "Convert book format:" msgstr "Převést formát knihy:" -#: cps/templates/book_edit.html:30 +#: cps/templates/book_edit.html:28 msgid "Convert from:" -msgstr "Převest z:" +msgstr "Převést z:" -#: cps/templates/book_edit.html:32 cps/templates/book_edit.html:39 +#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:37 msgid "select an option" msgstr "vyberte možnost" -#: cps/templates/book_edit.html:37 +#: cps/templates/book_edit.html:35 msgid "Convert to:" msgstr "Převést do:" -#: cps/templates/book_edit.html:46 +#: cps/templates/book_edit.html:44 msgid "Convert book" -msgstr "Převest knihu" +msgstr "Převést knihu" -#: cps/templates/book_edit.html:55 cps/templates/search_form.html:6 +#: cps/templates/book_edit.html:53 cps/templates/search_form.html:6 msgid "Book Title" msgstr "Název knihy" -#: cps/templates/book_edit.html:59 cps/templates/book_edit.html:255 -#: cps/templates/book_edit.html:273 cps/templates/search_form.html:10 +#: cps/templates/book_edit.html:57 cps/templates/book_edit.html:256 +#: cps/templates/book_edit.html:274 cps/templates/search_form.html:10 msgid "Author" msgstr "Autor" -#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:260 -#: cps/templates/book_edit.html:275 cps/templates/search_form.html:126 +#: cps/templates/book_edit.html:61 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:276 cps/templates/search_form.html:126 msgid "Description" msgstr "Popis" -#: cps/templates/book_edit.html:67 cps/templates/search_form.html:33 +#: cps/templates/book_edit.html:65 cps/templates/search_form.html:33 msgid "Tags" msgstr "Štítky" -#: cps/templates/book_edit.html:75 -msgid "Series id" -msgstr "ID série" +#: cps/templates/book_edit.html:73 +msgid "Series ID" +msgstr "" -#: cps/templates/book_edit.html:79 +#: cps/templates/book_edit.html:77 msgid "Rating" msgstr "Hodnocení" -#: cps/templates/book_edit.html:83 -msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +#: cps/templates/book_edit.html:81 +msgid "Fetch Cover from URL (JPEG - Image will be downloaded and stored in database)" msgstr "Adresa URL obalu (jpg, obal je stažen a uložen v databázi, pole je potom opět prázdné)" -#: cps/templates/book_edit.html:87 -msgid "Upload Cover from local drive" +#: cps/templates/book_edit.html:85 +msgid "Upload Cover from Local Disk" msgstr "Nahrát obal z místní jednotky" -#: cps/templates/book_edit.html:92 cps/templates/detail.html:165 -msgid "Publishing date" +#: cps/templates/book_edit.html:90 +msgid "Published Date" msgstr "Datum vydání" -#: cps/templates/book_edit.html:99 cps/templates/book_edit.html:257 -#: cps/templates/book_edit.html:274 cps/templates/detail.html:156 +#: cps/templates/book_edit.html:97 cps/templates/book_edit.html:258 +#: cps/templates/book_edit.html:275 cps/templates/detail.html:156 #: cps/templates/search_form.html:14 msgid "Publisher" msgstr "Vydavatel" -#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:31 +#: cps/templates/book_edit.html:101 cps/templates/detail.html:123 +#: cps/templates/user_edit.html:31 msgid "Language" msgstr "Jazyk" -#: cps/templates/book_edit.html:113 cps/templates/search_form.html:137 +#: cps/templates/book_edit.html:111 cps/templates/search_form.html:137 msgid "Yes" msgstr "Ano" -#: cps/templates/book_edit.html:114 cps/templates/search_form.html:138 +#: cps/templates/book_edit.html:112 cps/templates/search_form.html:138 msgid "No" msgstr "Ne" -#: cps/templates/book_edit.html:160 -msgid "Upload format" +#: cps/templates/book_edit.html:158 +msgid "Upload Format" msgstr "Nahrát formát" -#: cps/templates/book_edit.html:169 -msgid "view book after edit" +#: cps/templates/book_edit.html:167 +msgid "View Book on Save" msgstr "zobrazit knihu po úpravě" -#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:208 -msgid "Get metadata" +#: cps/templates/book_edit.html:170 cps/templates/book_edit.html:206 +msgid "Fetch Metadata" msgstr "Získat metadata" -#: 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:170 cps/templates/shelf_edit.html:17 -#: cps/templates/user_edit.html:131 -msgid "Submit" -msgstr "Odeslat" +#: cps/templates/book_edit.html:171 cps/templates/config_edit.html:343 +#: cps/templates/config_view_edit.html:150 cps/templates/email_edit.html:38 +#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:135 +msgid "Save" +msgstr "" -#: cps/templates/book_edit.html:187 +#: cps/templates/book_edit.html:185 msgid "Are you really sure?" msgstr "Jste si opravdu jisti?" -#: cps/templates/book_edit.html:190 -msgid "Book will be deleted from Calibre database" +#: cps/templates/book_edit.html:188 +msgid "This book will be permanently erased from database" msgstr "Kniha bude smazána z Calibre databáze" -#: cps/templates/book_edit.html:191 -msgid "and from hard disk" +#: cps/templates/book_edit.html:189 +msgid "and hard disk" msgstr "a z hard disku" -#: cps/templates/book_edit.html:211 +#: cps/templates/book_edit.html:209 msgid "Keyword" msgstr "Klíčové slovo" -#: cps/templates/book_edit.html:212 +#: cps/templates/book_edit.html:210 msgid " Search keyword " msgstr "Hledat klíčové slovo" -#: cps/templates/book_edit.html:214 cps/templates/layout.html:47 -msgid "Go!" -msgstr "Go!" - -#: cps/templates/book_edit.html:218 +#: cps/templates/book_edit.html:216 msgid "Click the cover to load metadata to the form" msgstr "Klepnutím na obal načtěte metadata do formuláře" -#: cps/templates/book_edit.html:230 cps/templates/book_edit.html:270 +#: cps/templates/book_edit.html:231 cps/templates/book_edit.html:271 msgid "Loading..." msgstr "Načítání..." -#: cps/templates/book_edit.html:235 cps/templates/layout.html:192 -#: cps/templates/layout.html:224 +#: cps/templates/book_edit.html:236 cps/templates/layout.html:191 +#: cps/templates/layout.html:223 cps/templates/modal_restriction.html:34 +#: cps/templates/user_edit.html:164 msgid "Close" msgstr "Zavřít" -#: cps/templates/book_edit.html:262 cps/templates/book_edit.html:276 +#: cps/templates/book_edit.html:263 cps/templates/book_edit.html:277 msgid "Source" msgstr "Zdroj" -#: cps/templates/book_edit.html:271 +#: cps/templates/book_edit.html:272 msgid "Search error!" msgstr "Chyba vyhledávání!" -#: cps/templates/book_edit.html:272 -msgid "No Result(s) found! Please try aonther keyword." +#: cps/templates/book_edit.html:273 +msgid "No Result(s) found! Please try another keyword." msgstr "Nebyly nalezeny žádné výsledky! Zadejte jiné klíčové slovo." #: cps/templates/config_edit.html:12 @@ -1296,8 +1331,8 @@ msgid "Library Configuration" msgstr "Konfigurace knihovny" #: cps/templates/config_edit.html:19 -msgid "Location of Calibre database" -msgstr "Umístění Calibre databáze" +msgid "Location of Calibre Database" +msgstr "" #: cps/templates/config_edit.html:25 msgid "Use Google Drive?" @@ -1341,14 +1376,14 @@ msgstr "Server port" #: cps/templates/config_edit.html:91 msgid "SSL certfile location (leave it empty for non-SSL Servers)" -msgstr "Umístění certifikátu SSL (ponechejte prázdné u serverů jiných než SSL)" +msgstr "Umístění certifikátu SSL (ponechte prázdné pro servery jiné než SSL)" #: cps/templates/config_edit.html:95 msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "Umístění souboru s klíčem SSL (ponechte prázdné pro servery jiné než SSL)" #: cps/templates/config_edit.html:99 -msgid "Update channel" +msgid "Update Channel" msgstr "Aktualizovat kanál" #: cps/templates/config_edit.html:101 @@ -1371,10 +1406,6 @@ msgstr "Noční (Automaticky)" msgid "Logfile Configuration" msgstr "Konfigurace log souboru" -#: cps/templates/config_edit.html:122 -msgid "Log Level" -msgstr "Log Level" - #: cps/templates/config_edit.html:131 msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "Umístění a jméno log souboru (calibre-web.log pro žádnou položku)" @@ -1392,255 +1423,271 @@ msgid "Feature Configuration" msgstr "Konfigurace funkcí" #: cps/templates/config_edit.html:158 -msgid "Enable uploading" +msgid "Enable Uploads" msgstr "Povolit nahrávání" #: cps/templates/config_edit.html:162 -msgid "Enable anonymous browsing" +msgid "Enable Anonymous Browsing" msgstr "Povolit anonymní prohlížení" #: cps/templates/config_edit.html:166 -msgid "Enable public registration" +msgid "Enable Public Registration" msgstr "Povolit veřejnou registraci" #: cps/templates/config_edit.html:170 -msgid "Enable remote login (\"magic link\")" -msgstr "Povolit vzdálené přihlášení (\“magic link\”)" +msgid "Enable Magic Link Remote Login" +msgstr "Povolit vzdálené přihlášení (\\\"magic link\\\")" #: cps/templates/config_edit.html:175 +msgid "Enable Kobo sync" +msgstr "" + +#: cps/templates/config_edit.html:180 +msgid "Proxy unknown requests to Kobo Store" +msgstr "" + +#: cps/templates/config_edit.html:187 msgid "Use Goodreads" msgstr "Použít Goodreads" -#: cps/templates/config_edit.html:176 -msgid "Obtain an API Key" +#: cps/templates/config_edit.html:188 +msgid "Create an API Key" msgstr "Získat API klíč" -#: cps/templates/config_edit.html:180 +#: cps/templates/config_edit.html:192 msgid "Goodreads API Key" msgstr "Goodreads API Klíč" -#: cps/templates/config_edit.html:184 +#: cps/templates/config_edit.html:196 msgid "Goodreads API Secret" msgstr "Goodreads API Secret" -#: cps/templates/config_edit.html:191 +#: cps/templates/config_edit.html:203 msgid "Login type" msgstr "Typ přihlášení" -#: cps/templates/config_edit.html:193 -msgid "Use standard Authentication" +#: cps/templates/config_edit.html:205 +msgid "Use Standard Authentication" msgstr "Použít standartní ověření" -#: cps/templates/config_edit.html:195 +#: cps/templates/config_edit.html:207 msgid "Use LDAP Authentication" msgstr "Použít ověření LDAP" -#: cps/templates/config_edit.html:198 +#: cps/templates/config_edit.html:210 msgid "Use OAuth" msgstr "Použít OAuth" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:217 msgid "LDAP Server Host Name or IP Address" msgstr "Název hostitele serveru LDAP nebo IP adresa" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:221 msgid "LDAP Server Port" msgstr "LDAP Server Port" -#: cps/templates/config_edit.html:213 -msgid "LDAP schema (ldap or ldaps)" +#: cps/templates/config_edit.html:225 +msgid "LDAP Schema (LDAP or LPAPS)" msgstr "LDAP schéma (ldap nebo ldaps)" -#: cps/templates/config_edit.html:217 -msgid "LDAP Admin username" +#: cps/templates/config_edit.html:229 +msgid "LDAP Administrator Username" msgstr "Uživatelské jméno správce LDAP" -#: cps/templates/config_edit.html:221 -msgid "LDAP Admin password" +#: cps/templates/config_edit.html:233 +msgid "LDAP Administrator Password" msgstr "Heslo správce LDAP" -#: cps/templates/config_edit.html:226 -msgid "LDAP Server use SSL" +#: cps/templates/config_edit.html:238 +msgid "LDAP Server Enable SSL" msgstr "LDAP Server používá SSL" -#: cps/templates/config_edit.html:230 -msgid "LDAP Server use TLS" +#: cps/templates/config_edit.html:242 +msgid "LDAP Server Enable TLS" msgstr "LDAP Server používá TLS" -#: cps/templates/config_edit.html:234 +#: cps/templates/config_edit.html:246 msgid "LDAP Server Certificate" msgstr "Certifikát serveru LDAP" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:250 msgid "LDAP SSL Certificate Path" msgstr "Cesta certifikátu LDAP SSL" -#: cps/templates/config_edit.html:243 +#: cps/templates/config_edit.html:255 msgid "LDAP Distinguished Name (DN)" msgstr "Rozlišující název LDAP (DN)" -#: cps/templates/config_edit.html:247 -msgid "LDAP User object filter" +#: cps/templates/config_edit.html:259 +msgid "LDAP User Object Filter" msgstr "Filtr objektu uživatele LDAP" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:264 msgid "LDAP Server is OpenLDAP?" msgstr "Server LDAP je OpenLDAP?" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:272 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "Obtain %(provider)s OAuth Credential" -#: cps/templates/config_edit.html:263 +#: cps/templates/config_edit.html:275 #, python-format msgid "%(provider)s OAuth Client Id" -msgstr "%(provider)s OAuth Client Id" +msgstr "%(provider)s OAuth Klient Id" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:279 #, python-format msgid "%(provider)s OAuth Client Secret" -msgstr "%(provider)s OAuth Client Secret" +msgstr "%(provider)s OAuth Klient Tajemství" -#: cps/templates/config_edit.html:276 +#: cps/templates/config_edit.html:288 msgid "Allow Reverse Proxy Authentication" msgstr "Povolit reverzní ověření proxy" -#: cps/templates/config_edit.html:280 +#: cps/templates/config_edit.html:292 msgid "Reverse Proxy Header Name" msgstr "Název záhlaví reverzního proxy" -#: cps/templates/config_edit.html:292 +#: cps/templates/config_edit.html:304 msgid "External binaries" msgstr "Externí binární soubory" -#: cps/templates/config_edit.html:300 -msgid "No converter" +#: cps/templates/config_edit.html:312 +msgid "No Converter" msgstr "Žádný převaděč" -#: cps/templates/config_edit.html:302 +#: cps/templates/config_edit.html:314 msgid "Use Kindlegen" msgstr "Použít Kindlegen" -#: cps/templates/config_edit.html:304 +#: cps/templates/config_edit.html:316 msgid "Use calibre's ebook converter" msgstr "Použít calibre převaděč eknih" -#: cps/templates/config_edit.html:308 +#: cps/templates/config_edit.html:320 msgid "E-Book converter settings" msgstr "Nastavení převaděče eknih" -#: cps/templates/config_edit.html:312 +#: cps/templates/config_edit.html:324 msgid "Path to convertertool" -msgstr "Cesta k převáděči" +msgstr "Cesta k převaděči" -#: cps/templates/config_edit.html:318 +#: cps/templates/config_edit.html:330 msgid "Location of Unrar binary" msgstr "Umístění Unrar binarních souborů" -#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 -#: cps/templates/login.html:4 +#: cps/templates/config_edit.html:349 cps/templates/layout.html:84 +#: cps/templates/login.html:4 cps/templates/login.html:20 msgid "Login" msgstr "Přihlásit" -#: cps/templates/config_view_edit.html:12 +#: cps/templates/config_view_edit.html:16 msgid "View Configuration" msgstr "Prohlížet konfiguraci" -#: cps/templates/config_view_edit.html:19 cps/templates/shelf_edit.html:7 +#: cps/templates/config_view_edit.html:23 cps/templates/shelf_edit.html:7 msgid "Title" msgstr "Název" -#: cps/templates/config_view_edit.html:27 -msgid "No. of random books to show" +#: cps/templates/config_view_edit.html:31 +msgid "No. of Random Books to Display" msgstr "Počet náhodných knih k zobrazení" -#: cps/templates/config_view_edit.html:31 -msgid "No. of authors to show before hiding (0=disable hiding)" +#: cps/templates/config_view_edit.html:35 +msgid "No. of Authors to Display Before Hiding (0=Disable Hiding)" msgstr "Počet autorů k zobrazení před skrytím (0 = zakázat skrytí)" -#: cps/templates/config_view_edit.html:35 cps/templates/readcbr.html:112 +#: cps/templates/config_view_edit.html:39 cps/templates/readcbr.html:112 msgid "Theme" msgstr "Motiv" -#: cps/templates/config_view_edit.html:37 +#: cps/templates/config_view_edit.html:41 msgid "Standard Theme" msgstr "Standartní motiv" -#: cps/templates/config_view_edit.html:38 +#: cps/templates/config_view_edit.html:42 msgid "caliBlur! Dark Theme" msgstr "caliBlur! Tmavý motiv" -#: cps/templates/config_view_edit.html:42 -msgid "Regular expression for ignoring columns" -msgstr "Regulární výraz pro ignorování sloupců" - #: cps/templates/config_view_edit.html:46 -msgid "Link read/unread status to Calibre column" -msgstr "Propojit stav čtení/nepřečtení do sloupce Calibre" +msgid "Regular Expression for Ignoring Columns" +msgstr "Regulární výraz pro ignorování sloupců" -#: cps/templates/config_view_edit.html:55 -msgid "Regular expression for title sorting" -msgstr "Regulární výraz pro řazení názvů" +#: cps/templates/config_view_edit.html:50 +msgid "Link Read/Unread Status to Calibre Column" +msgstr "Propojit stav čtení/nepřečtení do sloupce Calibre" #: cps/templates/config_view_edit.html:59 -msgid "Tags for Mature Content" -msgstr "Štítky pro obsah pro dospělé" +msgid "View Restrictions based on Calibre column" +msgstr "" + +#: cps/templates/config_view_edit.html:61 cps/templates/email_edit.html:21 +msgid "None" +msgstr "Žádné" + +#: cps/templates/config_view_edit.html:68 +msgid "Regular Expression for Title Sorting" +msgstr "Regulární výraz pro řazení názvů" -#: cps/templates/config_view_edit.html:73 -msgid "Default settings for new users" +#: cps/templates/config_view_edit.html:80 +msgid "Default Settings for New Users" msgstr "Výchozí nastavení pro nového uživatele" -#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:84 -msgid "Admin user" +#: cps/templates/config_view_edit.html:88 cps/templates/user_edit.html:92 +msgid "Admin User" msgstr "Uživatel admin" -#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:93 +#: cps/templates/config_view_edit.html:92 cps/templates/user_edit.html:97 msgid "Allow Downloads" msgstr "Povolit stahování" -#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:97 -msgid "Allow book viewer" +#: cps/templates/config_view_edit.html:96 cps/templates/user_edit.html:101 +msgid "Allow eBook Viewer" msgstr "Povolit prohlížeč knih" -#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:101 +#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:105 msgid "Allow Uploads" msgstr "Povolit nahrávání" -#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:105 +#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:109 msgid "Allow Edit" msgstr "Povolit úpravy" -#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:109 -msgid "Allow Delete books" +#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:113 +msgid "Allow Delete Books" msgstr "Povolit mazání knih" -#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:114 +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:118 msgid "Allow Changing Password" msgstr "Povolit změnu hesla" -#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:118 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:122 msgid "Allow Editing Public Shelfs" msgstr "Povolit úpravy veřejných polic" -#: cps/templates/config_view_edit.html:119 -msgid "Default visibilities for new users" -msgstr "Výchozí viditelnosti pro nové uživatele" +#: cps/templates/config_view_edit.html:126 +msgid "Default Visibilities for New Users" +msgstr "Výchozí zobrazení pro nové uživatele" -#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:76 -msgid "Show random books in detail view" +#: cps/templates/config_view_edit.html:142 +msgid "Show Random Books in Detail View" msgstr "Zobrazit náhodné knihy v podrobném zobrazení" -#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:89 -msgid "Show mature content" -msgstr "Zobrazit obsah pro dospělé" +#: cps/templates/config_view_edit.html:144 +msgid "Add Allowed/Denied Tags" +msgstr "" + +#: cps/templates/config_view_edit.html:145 +msgid "Add Allowed/Denied custom column values" +msgstr "" #: cps/templates/detail.html:59 -msgid "Read in browser" +msgid "Read in Browser" msgstr "Číst v prohližeči" #: cps/templates/detail.html:72 -msgid "Listen in browser" +msgid "Listen in Browser" msgstr "Poslechnout v prohlížeči" #: cps/templates/detail.html:117 @@ -1651,9 +1698,9 @@ msgstr "Kniha" msgid "of" msgstr "z" -#: cps/templates/detail.html:123 -msgid "language" -msgstr "jazyk" +#: cps/templates/detail.html:165 +msgid "Published" +msgstr "" #: cps/templates/detail.html:200 msgid "Mark As Unread" @@ -1676,21 +1723,9 @@ msgid "Add to shelf" msgstr "Přidat do police" #: cps/templates/detail.html:286 -msgid "Edit metadata" +msgid "Edit Metadata" msgstr "Upravit metadata" -#: cps/templates/email_edit.html:15 -msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" -msgstr "SMTP port (obvykle 25 pro prostý SMTP a 465 pro SSL a 587 pro STARTTLS)" - -#: cps/templates/email_edit.html:19 -msgid "Encryption" -msgstr "Šifrování" - -#: cps/templates/email_edit.html:21 -msgid "None" -msgstr "Žádné" - #: cps/templates/email_edit.html:22 msgid "STARTTLS" msgstr "STARTTLS" @@ -1700,23 +1735,15 @@ msgid "SSL/TLS" msgstr "SSL/TLS" #: cps/templates/email_edit.html:31 -msgid "SMTP password" +msgid "SMTP Password" msgstr "SMTP heslo" -#: cps/templates/email_edit.html:35 -msgid "From e-mail" -msgstr "Z e-mailu" - -#: cps/templates/email_edit.html:38 -msgid "Save settings" -msgstr "Uložit nastavení" - #: cps/templates/email_edit.html:39 -msgid "Save settings and send Test E-Mail" +msgid "Save and Send Test E-mail" msgstr "Uložit nastavení a odeslat zkušební e-mail" #: cps/templates/email_edit.html:43 -msgid "Allowed domains for registering" +msgid "Allowed Domains (Whitelist)" msgstr "Povolené domény pro registraci" #: cps/templates/email_edit.html:46 cps/templates/email_edit.html:72 @@ -1732,29 +1759,29 @@ msgid "Enter domainname" msgstr "Zadejte jméno domény" #: cps/templates/email_edit.html:60 -msgid "Denied domains for registering" +msgid "Denied Domains (Blacklist)" msgstr "Zakázané domény pro registraci" #: cps/templates/email_edit.html:90 -msgid "Do you really want to delete this domain rule?" +msgid "Are you sure you want to delete this domain?" msgstr "Opravdu chcete odstranit toto pravidlo domény?" -#: cps/templates/feed.xml:21 cps/templates/layout.html:176 +#: cps/templates/feed.xml:21 cps/templates/layout.html:175 msgid "Next" msgstr "Další" -#: cps/templates/http_error.html:37 -msgid "Create issue" +#: cps/templates/generate_kobo_auth_url.html:5 +msgid "Open the .kobo/Kobo eReader.conf file in a text editor and add (or edit):" +msgstr "" + +#: cps/templates/http_error.html:38 +msgid "Create Issue" msgstr "Vytvořit problém" -#: cps/templates/http_error.html:44 -msgid "Back to home" +#: cps/templates/http_error.html:45 +msgid "Return to Home" msgstr "Zpět domů" -#: cps/templates/index.html:5 -msgid "Discover (Random Books)" -msgstr "Objevte (Náhodné knihy)" - #: cps/templates/index.html:64 msgid "Group by series" msgstr "Seřadit podle serií" @@ -1779,7 +1806,11 @@ msgstr "Nedávno přidané knihy" msgid "The latest Books" msgstr "Nejnovější knihy" -#: cps/templates/index.xml:42 +#: cps/templates/index.xml:38 +msgid "Random Books" +msgstr "Náhodné knihy" + +#: cps/templates/index.xml:42 cps/templates/user_edit.html:80 msgid "Show Random Books" msgstr "Zobrazit náhodné knihy" @@ -1804,22 +1835,26 @@ msgid "Books ordered by Languages" msgstr "Knihy seřazené podle jazyků" #: cps/templates/index.xml:100 +msgid "Books ordered by Rating" +msgstr "" + +#: cps/templates/index.xml:108 msgid "Books ordered by file formats" msgstr "Knihy seřazené podle soboru formátů" -#: cps/templates/index.xml:103 cps/templates/layout.html:137 +#: cps/templates/index.xml:111 cps/templates/layout.html:136 msgid "Public Shelves" msgstr "Veřejné police" -#: cps/templates/index.xml:107 +#: cps/templates/index.xml:115 msgid "Books organized in public shelfs, visible to everyone" msgstr "Knihy uspořádané do veřejných polic, viditelné všem" -#: cps/templates/index.xml:111 cps/templates/layout.html:141 +#: cps/templates/index.xml:119 cps/templates/layout.html:140 msgid "Your Shelves" msgstr "Vaše police" -#: cps/templates/index.xml:115 +#: cps/templates/index.xml:123 msgid "User's own shelfs, only visible to the current user himself" msgstr "Vlastní police uživatele, viditelné pouze pro aktuálního uživatele" @@ -1827,10 +1862,19 @@ msgstr "Vlastní police uživatele, viditelné pouze pro aktuálního uživatele msgid "Home" msgstr "Domů" +#: cps/templates/layout.html:28 cps/templates/shelf_order.html:32 +#: cps/templates/user_edit.html:178 +msgid "Back" +msgstr "Zpět" + #: cps/templates/layout.html:34 -msgid "Toggle navigation" +msgid "Toggle Navigation" msgstr "Přepnout navigaci" +#: cps/templates/layout.html:45 +msgid "Search Library" +msgstr "" + #: cps/templates/layout.html:55 msgid "Advanced Search" msgstr "Rozšířené hledání" @@ -1852,70 +1896,65 @@ msgstr "Odhlásit se" msgid "Register" msgstr "Registrovat" -#: cps/templates/layout.html:116 cps/templates/layout.html:223 +#: cps/templates/layout.html:116 cps/templates/layout.html:222 msgid "Uploading..." msgstr "Nahrávání..." #: cps/templates/layout.html:117 -msgid "please don't refresh the page" +msgid "Please do not refresh the page" msgstr "prosím neobnovujte stránku" #: cps/templates/layout.html:127 msgid "Browse" msgstr "Procházet" -#: cps/templates/layout.html:146 +#: cps/templates/layout.html:145 msgid "Create a Shelf" msgstr "Vytvořit polici" -#: cps/templates/layout.html:147 cps/templates/stats.html:3 +#: cps/templates/layout.html:146 cps/templates/stats.html:3 msgid "About" msgstr "O Calibre-Web" -#: cps/templates/layout.html:161 +#: cps/templates/layout.html:160 msgid "Previous" msgstr "Předchozí" -#: cps/templates/layout.html:188 +#: cps/templates/layout.html:187 msgid "Book Details" msgstr "Podrobnosti o knize" -#: cps/templates/layout.html:222 +#: cps/templates/layout.html:221 msgid "Upload done, processing, please wait..." msgstr "Nahrávání hotovo, zpracovávám, čekejte prosím..." -#: cps/templates/layout.html:225 +#: cps/templates/layout.html:224 msgid "Error" msgstr "Chyba" -#: cps/templates/login.html:8 cps/templates/login.html:9 -#: cps/templates/register.html:7 cps/templates/user_edit.html:8 -msgid "Username" -msgstr "Uživatelské jméno" - #: cps/templates/login.html:12 cps/templates/login.html:13 #: cps/templates/user_edit.html:21 msgid "Password" msgstr "Heslo" #: cps/templates/login.html:17 -msgid "Remember me" +msgid "Remember Me" msgstr "Zapamatovat si" #: cps/templates/login.html:22 -msgid "Forgot password" +msgid "Forgot Password?" msgstr "Zapomenuté heslo" #: cps/templates/login.html:25 -msgid "Log in with magic link" +msgid "Log in with Magic Link" msgstr "Přihlásit se pomocí magického odkazu" #: cps/templates/logviewer.html:6 -msgid "Show Calibre-Web log: " +msgid "Show Calibre-Web Log: " msgstr "Zobrazit Calibre-Web log: " #: cps/templates/logviewer.html:8 -msgid "Calibre-Web log: " +msgid "Calibre-Web Log: " msgstr "Calibre-Web log: " #: cps/templates/logviewer.html:8 @@ -1923,11 +1962,35 @@ msgid "Stream output, can't be displayed" msgstr "" #: cps/templates/logviewer.html:12 -msgid "Show access log: " +msgid "Show Access Log: " msgstr "Zobrazit log přístupu: " +#: cps/templates/modal_restriction.html:6 +msgid "Select allowed/denied Tags" +msgstr "" + +#: cps/templates/modal_restriction.html:7 +msgid "Select allowed/denied Custom Column values" +msgstr "" + +#: cps/templates/modal_restriction.html:8 +msgid "Select allowed/denied Tags of user" +msgstr "" + +#: cps/templates/modal_restriction.html:9 +msgid "Select allowed/denied Custom Column values of user" +msgstr "" + +#: cps/templates/modal_restriction.html:15 +msgid "Enter Tag" +msgstr "" + +#: cps/templates/modal_restriction.html:24 +msgid "Add View Restriction" +msgstr "" + #: cps/templates/osd.xml:5 -msgid "Calibre-Web ebook catalog" +msgid "Calibre-Web eBook Catalog" msgstr "Calibre-Web katalog eknih" #: cps/templates/read.html:74 @@ -1980,7 +2043,7 @@ msgstr "Světlý" #: cps/templates/readcbr.html:116 msgid "Dark" -msgstr "Tnavý" +msgstr "Tmavý" #: cps/templates/readcbr.html:121 msgid "Scale" @@ -2039,51 +2102,51 @@ msgid "Basic txt Reader" msgstr "Základní txt čtečka" #: cps/templates/register.html:4 -msgid "Register a new account" +msgid "Register New Account" msgstr "Založit nový účet" #: cps/templates/register.html:8 msgid "Choose a username" msgstr "Zvolte uživatelské jméno" -#: cps/templates/register.html:11 cps/templates/user_edit.html:13 -msgid "E-mail address" -msgstr "E-mailová adresa" - #: cps/templates/register.html:12 msgid "Your email address" msgstr "Vaše e-mailová adresa" +#: cps/templates/remote_login.html:4 +msgid "Magic Link - Authorise New Device" +msgstr "" + #: cps/templates/remote_login.html:6 -msgid "Use your other device, login and visit " +msgid "On another device, login and visit:" msgstr "Použijte své druhé zařízení, přihlaste se a navštivte" -#: cps/templates/remote_login.html:9 -msgid "Once you do so, you will automatically get logged in on this device." +#: cps/templates/remote_login.html:10 +msgid "Once verified, you will automatically be logged in on this device." msgstr "Jakmile tak učiníte, budete automaticky přihlášeni na tomto zařízení." -#: cps/templates/remote_login.html:12 -msgid "The link will expire after 10 minutes." +#: cps/templates/remote_login.html:13 +msgid "This verification link will expire in 10 minutes." msgstr "Odkaz vyprší za 10 minut" #: cps/templates/search.html:5 -msgid "No Results for:" +msgid "No Results Found" msgstr "Žádné výsledky pro:" #: cps/templates/search.html:6 -msgid "Please try a different search" -msgstr "Zkuste prosím jiné vyhledávání" +msgid "Search Term:" +msgstr "" #: cps/templates/search.html:8 msgid "Results for:" msgstr "Výsledky pro:" #: cps/templates/search_form.html:19 -msgid "Publishing date from" +msgid "Published Date From" msgstr "Datum vydání od" #: cps/templates/search_form.html:26 -msgid "Publishing date to" +msgid "Published Date To" msgstr "Datum vydání do" #: cps/templates/search_form.html:43 @@ -2107,11 +2170,11 @@ msgid "Exclude Extensions" msgstr "Vynechat přípony" #: cps/templates/search_form.html:117 -msgid "Rating bigger than" +msgid "Rating Above" msgstr "Hodnoceni více než" #: cps/templates/search_form.html:121 -msgid "Rating less than" +msgid "Rating Below" msgstr "Hodnocení méně než" #: cps/templates/shelf.html:10 @@ -2127,57 +2190,53 @@ msgid "Change order" msgstr "Změnit řazení" #: cps/templates/shelf.html:67 -msgid "Do you really want to delete the shelf?" -msgstr "Opravdu chcete odstranit polici?" +msgid "Are you sure you want to delete this shelf?" +msgstr "" #: cps/templates/shelf.html:70 -msgid "Shelf will be lost for everybody and forever!" +msgid "Shelf will be deleted for all users" msgstr "Police budou ztracena pro všechny a navždy!" #: cps/templates/shelf_edit.html:13 -msgid "should the shelf be public?" +msgid "Share with Everyone" msgstr "měla by být police veřejná?" #: cps/templates/shelf_order.html:5 -msgid "Drag 'n drop to rearrange order" +msgid "Drag to Rearrange Order" msgstr "Přetažením uspořádáte pořadí" #: cps/templates/stats.html:7 -msgid "Calibre library statistics" +msgid "Library Statistics" msgstr "Statistika knihovny Calibre" #: cps/templates/stats.html:12 msgid "Books in this Library" -msgstr "Knihy v této knihovně" +msgstr "Knih v této knihovně" #: cps/templates/stats.html:16 msgid "Authors in this Library" -msgstr "Autoři v této knihovně" +msgstr "Autorů v této knihovně" #: cps/templates/stats.html:20 msgid "Categories in this Library" -msgstr "Kategorie v této knihovně" +msgstr "Kategorií v této knihovně" #: cps/templates/stats.html:24 msgid "Series in this Library" -msgstr "Série v této knihovně" +msgstr "Sérií v této knihovně" #: cps/templates/stats.html:28 -msgid "Linked libraries" +msgid "Linked Libraries" msgstr "Propojené knihovny" #: cps/templates/stats.html:32 -msgid "Program library" +msgid "Program Library" msgstr "Knihovna programu" #: cps/templates/stats.html:33 msgid "Installed Version" msgstr "Nainstalovaná verze" -#: cps/templates/tasks.html:7 -msgid "Tasks list" -msgstr "Seznam úkolů" - #: cps/templates/tasks.html:12 msgid "User" msgstr "Uživatel" @@ -2195,11 +2254,11 @@ msgid "Progress" msgstr "Průběh" #: cps/templates/tasks.html:17 -msgid "Runtime" +msgid "Run Time" msgstr "Doba spuštění" #: cps/templates/tasks.html:18 -msgid "Starttime" +msgid "Start Time" msgstr "Čas spuštění" #: cps/templates/tasks.html:24 @@ -2214,1394 +2273,136 @@ msgstr "Skrýt všechny úkoly" msgid "Reset user Password" msgstr "Resetovat uživatelské heslo" -#: cps/templates/user_edit.html:26 -msgid "Kindle E-Mail" -msgstr "Kindle e-mail" - #: cps/templates/user_edit.html:41 -msgid "Show books with language" +msgid "Language of Books" msgstr "Zobrazit knihy s jazykem" #: cps/templates/user_edit.html:43 -msgid "Show all" +msgid "Show All" msgstr "Zobrazit vše" -#: cps/templates/user_edit.html:53 +#: cps/templates/user_edit.html:52 msgid "OAuth Settings" msgstr "Nastavení OAuth" -#: cps/templates/user_edit.html:55 +#: cps/templates/user_edit.html:54 msgid "Link" msgstr "Připojit" -#: cps/templates/user_edit.html:57 +#: cps/templates/user_edit.html:56 msgid "Unlink" msgstr "Odpojit" -#: cps/templates/user_edit.html:125 -msgid "Delete this user" -msgstr "Odstranit tohoto uživatele" - -#: cps/templates/user_edit.html:140 -msgid "Recent Downloads" -msgstr "Nedávná stahování" - -#~ msgid "Excecution permissions missing" -#~ msgstr "Chybí oprávnění k provedení" - -#~ msgid "Error excecuting UnRar" -#~ msgstr "Chyba při provádění UnRar" - -#~ msgid "Unrar binary file not found" -#~ msgstr "UnRar binární soubor nenalezen" - -#~ msgid "Newest Books" -#~ msgstr "Nejnovější knihy" - -#~ msgid "Oldest Books" -#~ msgstr "Nejstarší knihy" - -#~ msgid "Books (A-Z)" -#~ msgstr "Knihy (A-Z)" - -#~ msgid "Books (Z-A)" -#~ msgstr "Knihy (Z-A)" - -#~ msgid "successfully deleted shelf %(name)s" -#~ msgstr "police %(name)s úspěšně smazána" - -#~ msgid "Import of optional Google Drive requirements missing" -#~ msgstr "Chybí import volitelných požadavků Google Drive" - -#~ msgid "client_secrets.json is missing or not readable" -#~ msgstr "client_secrets.json chybí nebo je nečitelný" - -#~ msgid "client_secrets.json is not configured for web application" -#~ msgstr "client_secrets.json není nakonfigurován pro webovou aplikaci" - -#~ msgid "Keyfile location is not valid, please enter correct path" -#~ msgstr "Umístění souboru s klíčem není platné, zadejte prosím správnou cestu" - -#~ msgid "Certfile location is not valid, please enter correct path" -#~ msgstr "Umístění souboru certifikátu je neplatné, zadejte prosím správnou cestu" - -#~ msgid "Logfile location is not valid, please enter correct path" -#~ msgstr "Umístění log souboru není platné, zadejte prosím správnou cestu" - -#~ msgid "DB location is not valid, please enter correct path" -#~ msgstr "Umístění databáze je neplatné, zadejte prosím správnou cestu" - -#~ msgid "Failed to create path for cover %(path)s (Permission denied)." -#~ msgstr "Nepodařilo se vytvořit cestu pro obal %(path)s (Oprávnění odepřeno)." - -#~ msgid "Failed to store cover-file %(cover)s." -#~ msgstr "Uložení obalu %(cover)s se nezdařilo." - -#~ msgid "Cover-file is not a valid image file" -#~ msgstr "Soubor obalu není platným souborem obrázku" - -#~ msgid "unknown" -#~ msgstr "neznámý" - -#~ msgid "File %(title)s" -#~ msgstr "Soubor %(title)s" - -#~ msgid "Use" -#~ msgstr "Použít" - -#~ msgid "Show sorted books" -#~ msgstr "Zobrazit seřazené knihy" - -#~ msgid "New Books" -#~ msgstr "Nové knihy" - -#~ msgid "Sorted Books" -#~ msgstr "Seřazené knihy" - -#~ msgid "Sort By" -#~ msgstr "Seřadit podle" - -#~ msgid "Newest" -#~ msgstr "Nejnovější" - -#~ msgid "Oldest" -#~ msgstr "Nejstarší" - -#~ msgid "Ascending" -#~ msgstr "Vzestupně" - -#~ msgid "Descending" -#~ msgstr "Sestupně" - -#~ msgid "PDF.js viewer" -#~ msgstr "Prohlížeč PDF.js" - -#~ msgid "Preparing document for printing..." -#~ msgstr "Příprava dokumentu pro tisk …" - -#~ msgid "Using your another device, visit" -#~ msgstr "Pomocí jiného zařízení navštivte" - -#~ msgid "and log in" -#~ msgstr "a přihlašte se" - -#~ msgid "Afar" -#~ msgstr "Afar" - -#~ msgid "Abkhazian" -#~ msgstr "Abkhazian" - -#~ msgid "Achinese" -#~ msgstr "Achinese" - -#~ msgid "Acoli" -#~ msgstr "Acoli" - -#~ msgid "Adangme" -#~ msgstr "Adangme" - -#~ msgid "Adyghe" -#~ msgstr "Adyghe" - -#~ msgid "Afrihili" -#~ msgstr "Afrihili" - -#~ msgid "Afrikaans" -#~ msgstr "Afrikaans" - -#~ msgid "Ainu (Japan)" -#~ msgstr "Ainu (Giappone)" - -#~ msgid "Akan" -#~ msgstr "Akan" - -#~ msgid "Akkadian" -#~ msgstr "Accadico" - -#~ msgid "Aleut" -#~ msgstr "Aleut" - -#~ msgid "Altai; Southern" -#~ msgstr "Altai meridionale" - -#~ msgid "Amharic" -#~ msgstr "Amarico" - -#~ msgid "English; Old (ca. 450-1100)" -#~ msgstr "Inglese antico (ca. 450-1100)" - -#~ msgid "Angika" -#~ msgstr "Angika" - -#~ msgid "Arabic" -#~ msgstr "Arabo" - -#~ msgid "Aramaic; Official (700-300 BCE)" -#~ msgstr "Aramaico ufficiale (700-300 p.e.v.)" - -#~ msgid "Aragonese" -#~ msgstr "Aragonese" - -#~ msgid "Mapudungun" -#~ msgstr "Mapudungun" - -#~ msgid "Arapaho" -#~ msgstr "Arapaho" - -#~ msgid "Arawak" -#~ msgstr "Arawak" - -#~ msgid "Assamese" -#~ msgstr "Assamese" - -#~ msgid "Asturian" -#~ msgstr "Asturiano" - -#~ msgid "Avaric" -#~ msgstr "Avarico" - -#~ msgid "Avestan" -#~ msgstr "Avestano" - -#~ msgid "Awadhi" -#~ msgstr "Awadhi" - -#~ msgid "Aymara" -#~ msgstr "Aymara" - -#~ msgid "Azerbaijani" -#~ msgstr "Azerbaijano" - -#~ msgid "Bashkir" -#~ msgstr "Bashkir" - -#~ msgid "Baluchi" -#~ msgstr "Baluchi" - -#~ msgid "Bambara" -#~ msgstr "Bambara" - -#~ msgid "Balinese" -#~ msgstr "Balinese" - -#~ msgid "Basa (Cameroon)" -#~ msgstr "Basa (Cameru)" - -#~ msgid "Beja" -#~ msgstr "Beja" - -#~ msgid "Belarusian" -#~ msgstr "Bielorusso" - -#~ msgid "Bemba (Zambia)" -#~ msgstr "Bemba (Zambia)" - -#~ msgid "Bengali" -#~ msgstr "Bengalese" - -#~ msgid "Bhojpuri" -#~ msgstr "Bhojpuri" - -#~ msgid "Bikol" -#~ msgstr "Bikol" - -#~ msgid "Bini" -#~ msgstr "Bini" - -#~ msgid "Bislama" -#~ msgstr "Bislama" - -#~ msgid "Siksika" -#~ msgstr "Siksika" - -#~ msgid "Tibetan" -#~ msgstr "Tibetano" - -#~ msgid "Bosnian" -#~ msgstr "Bosniaco" - -#~ msgid "Braj" -#~ msgstr "Braj" - -#~ msgid "Breton" -#~ msgstr "Bretone" - -#~ msgid "Buriat" -#~ msgstr "Buriat" - -#~ msgid "Buginese" -#~ msgstr "Buginese" - -#~ msgid "Bulgarian" -#~ msgstr "Bulgaro" - -#~ msgid "Bilin" -#~ msgstr "Bilin" +#: cps/templates/user_edit.html:62 +msgid "Kobo Sync Token" +msgstr "" -#~ msgid "Caddo" -#~ msgstr "Caddo" +#: cps/templates/user_edit.html:64 +msgid "Create/View" +msgstr "" -#~ msgid "Carib; Galibi" -#~ msgstr "Carib (Galibi)" +#: cps/templates/user_edit.html:83 +msgid "Add allowed/denied Tags" +msgstr "" -#~ msgid "Catalan" -#~ msgstr "Catalano" +#: cps/templates/user_edit.html:84 +msgid "Add allowed/denied custom column values" +msgstr "" -#~ msgid "Cebuano" -#~ msgstr "Cebuano" +#: cps/templates/user_edit.html:129 +msgid "Delete User" +msgstr "Odstranit tohoto uživatele" -#~ msgid "Czech" -#~ msgstr "Ceco" +#: cps/templates/user_edit.html:144 +msgid "Recent Downloads" +msgstr "Nedávná stahování" -#~ msgid "Chamorro" -#~ msgstr "Chamorro" +#: cps/templates/user_edit.html:160 +msgid "Generate Kobo Auth URL" +msgstr "" -#~ msgid "Chibcha" -#~ msgstr "Chibcha" - -#~ msgid "Chechen" -#~ msgstr "Chechen" - -#~ msgid "Chagatai" -#~ msgstr "Ciagataico" - -#~ msgid "Chuukese" -#~ msgstr "Chuukese" - -#~ msgid "Mari (Russia)" -#~ msgstr "Mari (Russia)" - -#~ msgid "Chinook jargon" -#~ msgstr "Chinook jargon" - -#~ msgid "Choctaw" -#~ msgstr "Choctaw" - -#~ msgid "Chipewyan" -#~ msgstr "Chipewyan" - -#~ msgid "Cherokee" -#~ msgstr "Cherokee" - -#~ msgid "Slavonic; Old" -#~ msgstr "Slavo antico" - -#~ msgid "Chuvash" -#~ msgstr "Chuvash" - -#~ msgid "Cheyenne" -#~ msgstr "Cheyenne" - -#~ msgid "Coptic" -#~ msgstr "Copto" - -#~ msgid "Cornish" -#~ msgstr "Cornish" - -#~ msgid "Corsican" -#~ msgstr "Corso" - -#~ msgid "Cree" -#~ msgstr "Cree" - -#~ msgid "Turkish; Crimean" -#~ msgstr "Turco; Crimeo" - -#~ msgid "Kashubian" -#~ msgstr "Kashubian" - -#~ msgid "Welsh" -#~ msgstr "Gallese" - -#~ msgid "Dakota" -#~ msgstr "Dakota" - -#~ msgid "Danish" -#~ msgstr "Danese" - -#~ msgid "Dargwa" -#~ msgstr "Dargwa" - -#~ msgid "Delaware" -#~ msgstr "Delaware" - -#~ msgid "Slave (Athapascan)" -#~ msgstr "Slave (Athapascan)" - -#~ msgid "German" -#~ msgstr "Tedesco" - -#~ msgid "Dogrib" -#~ msgstr "Dogrib" - -#~ msgid "Dinka" -#~ msgstr "Dinca" - -#~ msgid "Dhivehi" -#~ msgstr "Dhivehi" - -#~ msgid "Dogri (macrolanguage)" -#~ msgstr "Dogri (macrolingua)" - -#~ msgid "Sorbian; Lower" -#~ msgstr "Lusaziano inferiore" - -#~ msgid "Duala" -#~ msgstr "Duala" - -#~ msgid "Dutch; Middle (ca. 1050-1350)" -#~ msgstr "Olandese medio (ca. 1050-1350)" - -#~ msgid "Dyula" -#~ msgstr "Diula" - -#~ msgid "Dzongkha" -#~ msgstr "Dzongkha" - -#~ msgid "Efik" -#~ msgstr "Efik" - -#~ msgid "Egyptian (Ancient)" -#~ msgstr "Egiziano antico" - -#~ msgid "Ekajuk" -#~ msgstr "Ekajuk" - -#~ msgid "Greek; Modern (1453-)" -#~ msgstr "Greco moderno (1453-)" - -#~ msgid "Elamite" -#~ msgstr "Elamitico" - -#~ msgid "English" -#~ msgstr "Inglese" - -#~ msgid "English; Middle (1100-1500)" -#~ msgstr "Inglese medio (1100-1500)" - -#~ msgid "Esperanto" -#~ msgstr "Esperanto" - -#~ msgid "Estonian" -#~ msgstr "Estone" - -#~ msgid "Basque" -#~ msgstr "Basco" - -#~ msgid "Ewe" -#~ msgstr "Ewe" - -#~ msgid "Ewondo" -#~ msgstr "Ewondo" - -#~ msgid "Fang (Equatorial Guinea)" -#~ msgstr "Fang (Guinea equatoriale)" - -#~ msgid "Faroese" -#~ msgstr "Faroese" - -#~ msgid "Persian" -#~ msgstr "Persiano" - -#~ msgid "Fanti" -#~ msgstr "Fanti" - -#~ msgid "Fijian" -#~ msgstr "Figiano" - -#~ msgid "Filipino" -#~ msgstr "Filippino" - -#~ msgid "Finnish" -#~ msgstr "Finlandese" - -#~ msgid "Fon" -#~ msgstr "Fon" - -#~ msgid "French" -#~ msgstr "Francese" - -#~ msgid "French; Middle (ca. 1400-1600)" -#~ msgstr "Francese medio (ca. 1400-1600)" - -#~ msgid "French; Old (842-ca. 1400)" -#~ msgstr "Francese antico (842-ca. 1400)" - -#~ msgid "Frisian; Northern" -#~ msgstr "Frisone settentrionale" - -#~ msgid "Frisian; Eastern" -#~ msgstr "Frisone orientale" - -#~ msgid "Frisian; Western" -#~ msgstr "Frisone occidentale" - -#~ msgid "Fulah" -#~ msgstr "Fulah" - -#~ msgid "Friulian" -#~ msgstr "Friulano" - -#~ msgid "Ga" -#~ msgstr "Ga" - -#~ msgid "Gayo" -#~ msgstr "Gayo" - -#~ msgid "Gbaya (Central African Republic)" -#~ msgstr "Gbaya (Repubblica centro africana)" - -#~ msgid "Geez" -#~ msgstr "Geez" - -#~ msgid "Gilbertese" -#~ msgstr "Gilbertese" - -#~ msgid "Gaelic; Scottish" -#~ msgstr "Gaelico (Scozzese)" - -#~ msgid "Irish" -#~ msgstr "Gaelico" - -#~ msgid "Galician" -#~ msgstr "Galiziano" - -#~ msgid "Manx" -#~ msgstr "Manx" - -#~ msgid "German; Middle High (ca. 1050-1500)" -#~ msgstr "Tedesco medio alto (ca. 1050-1500)" - -#~ msgid "German; Old High (ca. 750-1050)" -#~ msgstr "Tedesco antico alto (ca. 750-1050)" - -#~ msgid "Gondi" -#~ msgstr "Gondi" - -#~ msgid "Gorontalo" -#~ msgstr "Gorontalo" - -#~ msgid "Gothic" -#~ msgstr "Gotico" - -#~ msgid "Grebo" -#~ msgstr "Grebo" - -#~ msgid "Greek; Ancient (to 1453)" -#~ msgstr "Greco antico (fino al 1453)" - -#~ msgid "Guarani" -#~ msgstr "Guarani" - -#~ msgid "German; Swiss" -#~ msgstr "Tedesco (Svizzera)" - -#~ msgid "Gujarati" -#~ msgstr "Gujarati" - -#~ msgid "Gwichʼin" -#~ msgstr "Gwichʼin" - -#~ msgid "Haida" -#~ msgstr "Haida" - -#~ msgid "Creole; Haitian" -#~ msgstr "Creolo (Haitiano)" - -#~ msgid "Hausa" -#~ msgstr "Hausa" - -#~ msgid "Hawaiian" -#~ msgstr "Hawaiian" - -#~ msgid "Hebrew" -#~ msgstr "Ebraico" - -#~ msgid "Herero" -#~ msgstr "Herero" - -#~ msgid "Hiligaynon" -#~ msgstr "Hiligayna" - -#~ msgid "Hindi" -#~ msgstr "Hindi" - -#~ msgid "Hittite" -#~ msgstr "Hittite" - -#~ msgid "Hmong" -#~ msgstr "Hmong" - -#~ msgid "Hiri Motu" -#~ msgstr "Hiri motu" - -#~ msgid "Croatian" -#~ msgstr "Croato" - -#~ msgid "Sorbian; Upper" -#~ msgstr "Lusaziano superiore" - -#~ msgid "Hungarian" -#~ msgstr "Ungherese" - -#~ msgid "Hupa" -#~ msgstr "Hupa" - -#~ msgid "Armenian" -#~ msgstr "Armenian" - -#~ msgid "Iban" -#~ msgstr "Iban" - -#~ msgid "Igbo" -#~ msgstr "Igbo" - -#~ msgid "Ido" -#~ msgstr "Ido" - -#~ msgid "Yi; Sichuan" -#~ msgstr "Yi; Sichuan" - -#~ msgid "Inuktitut" -#~ msgstr "Inuktitut" - -#~ msgid "Interlingue" -#~ msgstr "Interlingua" - -#~ msgid "Iloko" -#~ msgstr "Ilocano" - -#~ msgid "Interlingua (International Auxiliary Language Association)" -#~ msgstr "Interlingua (International Auxiliary Language Association)" - -#~ msgid "Indonesian" -#~ msgstr "Indonesiano" - -#~ msgid "Ingush" -#~ msgstr "Ingush" - -#~ msgid "Inupiaq" -#~ msgstr "Inupiaq" - -#~ msgid "Icelandic" -#~ msgstr "Islandese" - -#~ msgid "Italian" -#~ msgstr "Italiano" - -#~ msgid "Javanese" -#~ msgstr "Javanese" - -#~ msgid "Lojban" -#~ msgstr "Lojban" - -#~ msgid "Japanese" -#~ msgstr "Giapponese" - -#~ msgid "Judeo-Persian" -#~ msgstr "Giudeo-persiano" - -#~ msgid "Judeo-Arabic" -#~ msgstr "Giudeo-arabo" - -#~ msgid "Kara-Kalpak" -#~ msgstr "Kara-Kalpak" - -#~ msgid "Kabyle" -#~ msgstr "Kabyle" - -#~ msgid "Kachin" -#~ msgstr "Kachin" - -#~ msgid "Kalaallisut" -#~ msgstr "Kalaallisut" - -#~ msgid "Kamba (Kenya)" -#~ msgstr "Kamba (Kenya)" - -#~ msgid "Kannada" -#~ msgstr "Kannada" - -#~ msgid "Kashmiri" -#~ msgstr "Kashmiri" - -#~ msgid "Georgian" -#~ msgstr "Georgiano" - -#~ msgid "Kanuri" -#~ msgstr "Kanuri" - -#~ msgid "Kawi" -#~ msgstr "Kawi" - -#~ msgid "Kazakh" -#~ msgstr "Kazako" - -#~ msgid "Kabardian" -#~ msgstr "Kabardia" - -#~ msgid "Khasi" -#~ msgstr "Khasi" - -#~ msgid "Khmer; Central" -#~ msgstr "Khmer centrale" - -#~ msgid "Khotanese" -#~ msgstr "Khotanese" - -#~ msgid "Kikuyu" -#~ msgstr "Kikuyu" - -#~ msgid "Kinyarwanda" -#~ msgstr "Kinyarwanda" - -#~ msgid "Kirghiz" -#~ msgstr "Kirghiso" - -#~ msgid "Kimbundu" -#~ msgstr "Kimbundu" - -#~ msgid "Konkani (macrolanguage)" -#~ msgstr "Konkani (macrolinguaggio)" - -#~ msgid "Komi" -#~ msgstr "Komi" - -#~ msgid "Kongo" -#~ msgstr "Kongo" - -#~ msgid "Korean" -#~ msgstr "Coreano" - -#~ msgid "Kosraean" -#~ msgstr "Kosraean" - -#~ msgid "Kpelle" -#~ msgstr "Kpelle" - -#~ msgid "Karachay-Balkar" -#~ msgstr "Karachay-Balkar" - -#~ msgid "Karelian" -#~ msgstr "Karelian" - -#~ msgid "Kurukh" -#~ msgstr "Kurukh" - -#~ msgid "Kuanyama" -#~ msgstr "Kuanyama" - -#~ msgid "Kumyk" -#~ msgstr "Kumyk" - -#~ msgid "Kurdish" -#~ msgstr "Curdo" - -#~ msgid "Kutenai" -#~ msgstr "Kutenai" - -#~ msgid "Ladino" -#~ msgstr "Ladino" - -#~ msgid "Lahnda" -#~ msgstr "Lahnda" - -#~ msgid "Lamba" -#~ msgstr "Lamba" - -#~ msgid "Lao" -#~ msgstr "Lao" - -#~ msgid "Latin" -#~ msgstr "Latino" - -#~ msgid "Latvian" -#~ msgstr "Lettone" - -#~ msgid "Lezghian" -#~ msgstr "Lezghian" - -#~ msgid "Limburgan" -#~ msgstr "Limburgan" - -#~ msgid "Lingala" -#~ msgstr "Lingala" - -#~ msgid "Lithuanian" -#~ msgstr "Lituano" - -#~ msgid "Mongo" -#~ msgstr "Mongo" - -#~ msgid "Lozi" -#~ msgstr "Lozi" - -#~ msgid "Luxembourgish" -#~ msgstr "Lussemburghese" - -#~ msgid "Luba-Lulua" -#~ msgstr "Luba-lulua" - -#~ msgid "Luba-Katanga" -#~ msgstr "Luba-katanga" - -#~ msgid "Ganda" -#~ msgstr "Ganda" - -#~ msgid "Luiseno" -#~ msgstr "Luiseno" - -#~ msgid "Lunda" -#~ msgstr "Lunda" - -#~ msgid "Luo (Kenya and Tanzania)" -#~ msgstr "Luo (Kenya e Tanzania)" - -#~ msgid "Lushai" -#~ msgstr "Lushai" - -#~ msgid "Madurese" -#~ msgstr "Madurese" - -#~ msgid "Magahi" -#~ msgstr "Magahi" - -#~ msgid "Marshallese" -#~ msgstr "Marshallese" - -#~ msgid "Maithili" -#~ msgstr "Maithili" - -#~ msgid "Makasar" -#~ msgstr "Makasar" - -#~ msgid "Malayalam" -#~ msgstr "Malayalam" - -#~ msgid "Mandingo" -#~ msgstr "Mandingo" - -#~ msgid "Marathi" -#~ msgstr "Marathi" - -#~ msgid "Masai" -#~ msgstr "Masai" - -#~ msgid "Moksha" -#~ msgstr "Moksha" - -#~ msgid "Mandar" -#~ msgstr "Mandar" - -#~ msgid "Mende (Sierra Leone)" -#~ msgstr "Mende (Sierra Leone)" - -#~ msgid "Irish; Middle (900-1200)" -#~ msgstr "Irlandese medio (900-1200)" - -#~ msgid "Mi'kmaq" -#~ msgstr "Mi'kmaq" - -#~ msgid "Minangkabau" -#~ msgstr "Minangkabau" - -#~ msgid "Uncoded languages" -#~ msgstr "Lingue non codificate" - -#~ msgid "Macedonian" -#~ msgstr "Macedone" - -#~ msgid "Malagasy" -#~ msgstr "Malagasy" - -#~ msgid "Maltese" -#~ msgstr "Maltese" - -#~ msgid "Manchu" -#~ msgstr "Manchu" - -#~ msgid "Manipuri" -#~ msgstr "Manipuri" - -#~ msgid "Mohawk" -#~ msgstr "Mohawk" - -#~ msgid "Mongolian" -#~ msgstr "Mongolo" - -#~ msgid "Mossi" -#~ msgstr "Mossi" - -#~ msgid "Maori" -#~ msgstr "Maori" - -#~ msgid "Malay (macrolanguage)" -#~ msgstr "Malay (macrolingua)" - -#~ msgid "Multiple languages" -#~ msgstr "Lingue multiple" - -#~ msgid "Creek" -#~ msgstr "Creek" - -#~ msgid "Mirandese" -#~ msgstr "Mirandese" - -#~ msgid "Marwari" -#~ msgstr "Marwari" - -#~ msgid "Burmese" -#~ msgstr "Burmese" - -#~ msgid "Erzya" -#~ msgstr "Erzya" - -#~ msgid "Neapolitan" -#~ msgstr "Napoletano" - -#~ msgid "Nauru" -#~ msgstr "Nauru" - -#~ msgid "Navajo" -#~ msgstr "Navajo" - -#~ msgid "Ndebele; South" -#~ msgstr "Ndebele del Sud" - -#~ msgid "Ndebele; North" -#~ msgstr "Ndebele del Nord" - -#~ msgid "Ndonga" -#~ msgstr "Ndonga" - -#~ msgid "German; Low" -#~ msgstr "Tedesco; Volgare" - -#~ msgid "Nepali" -#~ msgstr "Nepali" - -#~ msgid "Bhasa; Nepal" -#~ msgstr "Bhasa; Nepal" - -#~ msgid "Nias" -#~ msgstr "Nias" - -#~ msgid "Niuean" -#~ msgstr "Niuean" - -#~ msgid "Dutch" -#~ msgstr "Olandese" - -#~ msgid "Norwegian Nynorsk" -#~ msgstr "Norvegese nynorsk" - -#~ msgid "Norwegian Bokmål" -#~ msgstr "Norvegese bokmål" - -#~ msgid "Nogai" -#~ msgstr "Nogai" - -#~ msgid "Norse; Old" -#~ msgstr "Norse antico" - -#~ msgid "Norwegian" -#~ msgstr "Norvegese" - -#~ msgid "N'Ko" -#~ msgstr "N'Ko" - -#~ msgid "Sotho; Northern" -#~ msgstr "Sotho settentrionale" - -#~ msgid "Newari; Old" -#~ msgstr "Newari antico" - -#~ msgid "Nyanja" -#~ msgstr "Nyanja" - -#~ msgid "Nyamwezi" -#~ msgstr "Nyamwezi" - -#~ msgid "Nyankole" -#~ msgstr "Nyankole" - -#~ msgid "Nyoro" -#~ msgstr "Nyoro" - -#~ msgid "Nzima" -#~ msgstr "Nzima" - -#~ msgid "Occitan (post 1500)" -#~ msgstr "Occitan (post 1500)" - -#~ msgid "Ojibwa" -#~ msgstr "Ojibwa" - -#~ msgid "Oriya" -#~ msgstr "Oriya" - -#~ msgid "Oromo" -#~ msgstr "Oromo" - -#~ msgid "Osage" -#~ msgstr "Osage" - -#~ msgid "Ossetian" -#~ msgstr "Ossetian" - -#~ msgid "Turkish; Ottoman (1500-1928)" -#~ msgstr "Turco ottomano (1500-1928)" - -#~ msgid "Pangasinan" -#~ msgstr "Pangasinan" - -#~ msgid "Pahlavi" -#~ msgstr "Pahlavi" - -#~ msgid "Pampanga" -#~ msgstr "Pampanga" - -#~ msgid "Panjabi" -#~ msgstr "Panjabi" - -#~ msgid "Papiamento" -#~ msgstr "Papiamento" - -#~ msgid "Palauan" -#~ msgstr "Palauan" - -#~ msgid "Persian; Old (ca. 600-400 B.C.)" -#~ msgstr "Persiano antico (ca. 600-400 A.C.)" - -#~ msgid "Phoenician" -#~ msgstr "Fenicio" - -#~ msgid "Pali" -#~ msgstr "Pali" - -#~ msgid "Polish" -#~ msgstr "Polacco" - -#~ msgid "Pohnpeian" -#~ msgstr "Pohnpeian" - -#~ msgid "Portuguese" -#~ msgstr "Portoghese" - -#~ msgid "Provençal; Old (to 1500)" -#~ msgstr "Provençal antico (fino al 1500)" - -#~ msgid "Pushto" -#~ msgstr "Pushto" - -#~ msgid "Quechua" -#~ msgstr "Quechua" - -#~ msgid "Rajasthani" -#~ msgstr "Rajasthani" - -#~ msgid "Rapanui" -#~ msgstr "Rapanui" - -#~ msgid "Maori; Cook Islands" -#~ msgstr "Maori (Isole Cook)" - -#~ msgid "Romansh" -#~ msgstr "Romansh" - -#~ msgid "Romany" -#~ msgstr "Romany" - -#~ msgid "Romanian" -#~ msgstr "Rumeno" - -#~ msgid "Rundi" -#~ msgstr "Rundi" - -#~ msgid "Romanian; Macedo-" -#~ msgstr "Romanian; Macedo-" - -#~ msgid "Russian" -#~ msgstr "Russo" - -#~ msgid "Sandawe" -#~ msgstr "Sandawe" - -#~ msgid "Sango" -#~ msgstr "Sango" - -#~ msgid "Yakut" -#~ msgstr "Yakut" - -#~ msgid "Aramaic; Samaritan" -#~ msgstr "Aramaico samaritano" - -#~ msgid "Sanskrit" -#~ msgstr "Sanscrito" - -#~ msgid "Sasak" -#~ msgstr "Sasak" - -#~ msgid "Santali" -#~ msgstr "Santali" - -#~ msgid "Sicilian" -#~ msgstr "Siciliano" - -#~ msgid "Scots" -#~ msgstr "Scots" - -#~ msgid "Selkup" -#~ msgstr "Selkup" - -#~ msgid "Irish; Old (to 900)" -#~ msgstr "Irlandese antico (fino al ’900)" - -#~ msgid "Shan" -#~ msgstr "Shan" - -#~ msgid "Sidamo" -#~ msgstr "Sidamo" - -#~ msgid "Sinhala" -#~ msgstr "Sinhala" - -#~ msgid "Slovak" -#~ msgstr "Slovacco" - -#~ msgid "Slovenian" -#~ msgstr "Sloveno" - -#~ msgid "Sami; Southern" -#~ msgstr "Sami meridionale" - -#~ msgid "Sami; Northern" -#~ msgstr "Sami settentrionale" - -#~ msgid "Lule Sami" -#~ msgstr "Lule Sami" - -#~ msgid "Sami; Inari" -#~ msgstr "Sami; Inari" - -#~ msgid "Samoan" -#~ msgstr "Samoano" - -#~ msgid "Sami; Skolt" -#~ msgstr "Sami; Skolt" - -#~ msgid "Shona" -#~ msgstr "Shona" - -#~ msgid "Sindhi" -#~ msgstr "Sindhi" - -#~ msgid "Soninke" -#~ msgstr "Soninke" - -#~ msgid "Sogdian" -#~ msgstr "Sogdian" - -#~ msgid "Somali" -#~ msgstr "Somali" - -#~ msgid "Sotho; Southern" -#~ msgstr "Sotho meridionale" - -#~ msgid "Spanish" -#~ msgstr "Spagnolo" - -#~ msgid "Albanian" -#~ msgstr "Albanese" - -#~ msgid "Sardinian" -#~ msgstr "Sardo" - -#~ msgid "Sranan Tongo" -#~ msgstr "Sranan Tongo" - -#~ msgid "Serbian" -#~ msgstr "Serbo" - -#~ msgid "Serer" -#~ msgstr "Serer" - -#~ msgid "Swati" -#~ msgstr "Swati" - -#~ msgid "Sukuma" -#~ msgstr "Sukuma" - -#~ msgid "Sundanese" -#~ msgstr "Sundanese" - -#~ msgid "Susu" -#~ msgstr "Susu" - -#~ msgid "Sumerian" -#~ msgstr "Sumero" - -#~ msgid "Swahili (macrolanguage)" -#~ msgstr "Swahili (macro-lingua)" - -#~ msgid "Swedish" -#~ msgstr "Svedese" - -#~ msgid "Syriac; Classical" -#~ msgstr "Siriaco classico" - -#~ msgid "Syriac" -#~ msgstr "Siriaco" - -#~ msgid "Tahitian" -#~ msgstr "Tahitian" - -#~ msgid "Tamil" -#~ msgstr "Tamil" - -#~ msgid "Tatar" -#~ msgstr "Tatarico" - -#~ msgid "Telugu" -#~ msgstr "Telugu" - -#~ msgid "Timne" -#~ msgstr "Temne" - -#~ msgid "Tereno" -#~ msgstr "Tereno" - -#~ msgid "Tetum" -#~ msgstr "Tetum" - -#~ msgid "Tajik" -#~ msgstr "Tajik" - -#~ msgid "Tagalog" -#~ msgstr "Tagalog" - -#~ msgid "Thai" -#~ msgstr "Thailandese" - -#~ msgid "Tigre" -#~ msgstr "Tigre" - -#~ msgid "Tigrinya" -#~ msgstr "Tigrinya" - -#~ msgid "Tiv" -#~ msgstr "Tiv" - -#~ msgid "Tokelau" -#~ msgstr "Tokelau" - -#~ msgid "Klingon" -#~ msgstr "Klingon" - -#~ msgid "Tlingit" -#~ msgstr "Tlingit" - -#~ msgid "Tamashek" -#~ msgstr "Tamashek" - -#~ msgid "Tonga (Nyasa)" -#~ msgstr "Tonga (Nyasa)" - -#~ msgid "Tonga (Tonga Islands)" -#~ msgstr "Tonga (Isole Tonga)" - -#~ msgid "Tok Pisin" -#~ msgstr "Tok pisin" - -#~ msgid "Tsimshian" -#~ msgstr "Tsimshian" - -#~ msgid "Tswana" -#~ msgstr "Tswana" - -#~ msgid "Tsonga" -#~ msgstr "Tsonga" - -#~ msgid "Turkmen" -#~ msgstr "Turkmeno" - -#~ msgid "Tumbuka" -#~ msgstr "Tumbuka" - -#~ msgid "Turkish" -#~ msgstr "Turco" - -#~ msgid "Tuvalu" -#~ msgstr "Tuvalu" - -#~ msgid "Twi" -#~ msgstr "Twi" - -#~ msgid "Tuvinian" -#~ msgstr "Tuvinian" - -#~ msgid "Udmurt" -#~ msgstr "Udmurt" - -#~ msgid "Ugaritic" -#~ msgstr "Ugaritico" - -#~ msgid "Uighur" -#~ msgstr "Uighuro" - -#~ msgid "Ukrainian" -#~ msgstr "Ucraino" - -#~ msgid "Umbundu" -#~ msgstr "Umbundu" - -#~ msgid "Undetermined" -#~ msgstr "Non determinato" - -#~ msgid "Urdu" -#~ msgstr "Urdu" - -#~ msgid "Uzbek" -#~ msgstr "Usbeco" +#: cps/templates/user_edit.html:176 +msgid "Do you really want to delete the Kobo Token?" +msgstr "" -#~ msgid "Vai" -#~ msgstr "Vai" +#~ msgid "allow" +#~ msgstr "" -#~ msgid "Venda" -#~ msgstr "Venda" +#~ msgid "Show hot books" +#~ msgstr "Zobrazit žhavé knihy" -#~ msgid "Vietnamese" -#~ msgstr "Vietnamita" +#~ msgid "Best rated Books" +#~ msgstr "Nejlépe hodnocené knihy" -#~ msgid "Volapük" -#~ msgstr "Volapük" +#~ msgid "Show best rated books" +#~ msgstr "Zobrazit nejlépe hodnocené knihy" -#~ msgid "Votic" -#~ msgstr "Votic" +#~ msgid "Best rated books" +#~ msgstr "Nejlépe hodnocené knihy" -#~ msgid "Wolaytta" -#~ msgstr "Wolaytta" +#~ msgid "Hot Books (most downloaded)" +#~ msgstr "Žhavé knihy (nejstahovanější)" -#~ msgid "Waray (Philippines)" -#~ msgstr "Waray (Filippine)" +#~ msgid "Publisher list" +#~ msgstr "Seznam vydavatelů" -#~ msgid "Washo" -#~ msgstr "Washo" +#~ msgid "Series list" +#~ msgstr "Seznam sérií" -#~ msgid "Walloon" -#~ msgstr "Walloon" +#~ msgid "Available languages" +#~ msgstr "Dostupné jazyky" -#~ msgid "Wolof" -#~ msgstr "Wolof" +#~ msgid "Category list" +#~ msgstr "Seznam kategorií" -#~ msgid "Kalmyk" -#~ msgstr "Kalmyk" +#~ msgid "View Ebooks" +#~ msgstr "Prohlížet" -#~ msgid "Xhosa" -#~ msgstr "Xhosa" +#~ msgid "Series id" +#~ msgstr "ID série" -#~ msgid "Yao" -#~ msgstr "Yao" +#~ msgid "Submit" +#~ msgstr "Odeslat" -#~ msgid "Yapese" -#~ msgstr "Yapese" +#~ msgid "Go!" +#~ msgstr "Go!" -#~ msgid "Yiddish" -#~ msgstr "Yiddish" +#~ msgid "Location of Calibre database" +#~ msgstr "Umístění Calibre databáze" -#~ msgid "Yoruba" -#~ msgstr "Yoruba" +#~ msgid "language" +#~ msgstr "jazyk" -#~ msgid "Zapotec" -#~ msgstr "Zapoteco" +#~ msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" +#~ msgstr "SMTP port (obvykle 25 pro prostý SMTP a 465 pro SSL a 587 pro STARTTLS)" -#~ msgid "Blissymbols" -#~ msgstr "Blissymbols" +#~ msgid "From e-mail" +#~ msgstr "Z e-mailu" -#~ msgid "Zenaga" -#~ msgstr "Zenaga" +#~ msgid "Save settings" +#~ msgstr "Uložit nastavení" -#~ msgid "Zhuang" -#~ msgstr "Zhuang" +#~ msgid "api_endpoint=" +#~ msgstr "" -#~ msgid "Chinese" -#~ msgstr "Cinese" +#~ msgid "E-mail address" +#~ msgstr "E-mailová adresa" -#~ msgid "Zulu" -#~ msgstr "Zulu" +#~ msgid "Please try a different search" +#~ msgstr "Zkuste prosím jiné vyhledávání" -#~ msgid "Zuni" -#~ msgstr "Zuni" +#~ msgid "Do you really want to delete the shelf?" +#~ msgstr "Opravdu chcete odstranit polici?" -#~ msgid "No linguistic content" -#~ msgstr "Nessun contenuto linguistico" +#~ msgid "Tasks list" +#~ msgstr "Seznam úkolů" -#~ msgid "Zaza" -#~ msgstr "Zaza" +#~ msgid "Kindle E-Mail" +#~ msgstr "Kindle e-mail" -#~ msgid "Show Calibre-Web log" -#~ msgstr "Zobrazit Calibre-Web log" +#~ msgid "Please note that every visit to this current page invalidates any previously generated Authentication url for this user." +#~ msgstr "" -#~ msgid "Show access log" -#~ msgstr "Zobrazit log přístupu" +#~ msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" +#~ msgstr "Obal není v podporovaném formátu (jpg/png/webp), nelze uložit" diff --git a/cps/translations/de/LC_MESSAGES/messages.mo b/cps/translations/de/LC_MESSAGES/messages.mo index 21fc98e4..873cb6cc 100644 Binary files a/cps/translations/de/LC_MESSAGES/messages.mo and b/cps/translations/de/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/de/LC_MESSAGES/messages.po b/cps/translations/de/LC_MESSAGES/messages.po index 8cfe5280..6d6f00c5 100644 --- a/cps/translations/de/LC_MESSAGES/messages.po +++ b/cps/translations/de/LC_MESSAGES/messages.po @@ -5,19 +5,18 @@ # FIRST AUTHOR OzzieIsaacs, 2016. msgid "" msgstr "" -"Project-Id-Version: Calibre-Web\n" +"Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2020-01-12 13:57+0100\n" -"PO-Revision-Date: 2020-01-13 18:24+0100\n" +"POT-Creation-Date: 2020-03-12 20:31+0100\n" +"PO-Revision-Date: 2020-03-07 11:20+0100\n" "Last-Translator: Ozzie Isaacs\n" "Language: de\n" "Language-Team: \n" -"Plural-Forms: nplurals=2; plural=(n != 1);\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.7.0\n" -"X-Generator: Poedit 2.2.4\n" +"Generated-By: Babel 2.8.0\n" #: cps/about.py:42 msgid "installed" @@ -27,7 +26,7 @@ msgstr "Installiert" msgid "not installed" msgstr "Nicht installiert" -#: cps/about.py:84 +#: cps/about.py:87 msgid "Statistics" msgstr "Statistiken" @@ -41,7 +40,7 @@ msgstr "Server wird heruntergefahren, Fenster bitte schließen" #: cps/admin.py:110 cps/editbooks.py:410 cps/editbooks.py:419 #: cps/editbooks.py:539 cps/editbooks.py:541 cps/editbooks.py:594 -#: cps/updater.py:446 cps/uploader.py:97 cps/uploader.py:108 +#: cps/updater.py:456 cps/uploader.py:96 cps/uploader.py:107 msgid "Unknown" msgstr "Unbekannt" @@ -49,155 +48,164 @@ msgstr "Unbekannt" msgid "Admin page" msgstr "Admin Seite" -#: cps/admin.py:148 cps/templates/admin.html:115 +#: cps/admin.py:151 msgid "UI Configuration" msgstr "Benutzeroberflächenkonfiguration" -#: cps/admin.py:185 cps/admin.py:412 +#: cps/admin.py:187 cps/admin.py:637 msgid "Calibre-Web configuration updated" msgstr "Konfiguration von Calibre-Web wurde aktualisiert" -#: cps/admin.py:442 cps/templates/admin.html:114 +#: cps/admin.py:434 cps/admin.py:440 cps/admin.py:451 cps/admin.py:462 +#: cps/templates/modal_restriction.html:29 +msgid "Deny" +msgstr "Verbieten" + +#: cps/admin.py:436 cps/admin.py:442 cps/admin.py:453 cps/admin.py:464 +#: cps/templates/modal_restriction.html:28 +msgid "Allow" +msgstr "Erlauben" + +#: cps/admin.py:667 msgid "Basic Configuration" msgstr "Basiskonfiguration" -#: cps/admin.py:465 cps/web.py:1093 +#: cps/admin.py:691 cps/web.py:1089 msgid "Please fill out all fields!" msgstr "Bitte alle Felder ausfüllen!" -#: cps/admin.py:467 cps/admin.py:478 cps/admin.py:484 cps/admin.py:499 -#: cps/templates/admin.html:38 +#: cps/admin.py:694 cps/admin.py:706 cps/admin.py:712 cps/admin.py:730 msgid "Add new user" msgstr "Neuen Benutzer hinzufügen" -#: cps/admin.py:476 cps/web.py:1318 +#: cps/admin.py:703 cps/web.py:1318 msgid "E-mail is not from valid domain" msgstr "E-Mail bezieht sich nicht auf eine gültige Domain" -#: cps/admin.py:482 cps/admin.py:493 +#: cps/admin.py:710 cps/admin.py:725 msgid "Found an existing account for this e-mail address or nickname." msgstr "Es existiert bereits ein Account für diese E-Mailadresse oder diesen Benutzernamen." -#: cps/admin.py:489 +#: cps/admin.py:721 #, python-format msgid "User '%(user)s' created" msgstr "Benutzer '%(user)s' angelegt" -#: cps/admin.py:509 +#: cps/admin.py:740 msgid "Edit e-mail server settings" msgstr "Einstellungen des E-Mail-Servers bearbeiten" -#: cps/admin.py:535 +#: cps/admin.py:766 #, python-format msgid "Test e-mail successfully send to %(kindlemail)s" msgstr "Test-E-Mail wurde erfolgreich an %(kindlemail)s versendet" -#: cps/admin.py:538 +#: cps/admin.py:769 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Es trat ein Fehler beim Versenden der Test-E-Mail auf: %(res)s" -#: cps/admin.py:540 +#: cps/admin.py:771 msgid "Please configure your e-mail address first..." msgstr "Bitte zuerst E-Mail Adresse konfigurieren..." -#: cps/admin.py:542 +#: cps/admin.py:773 msgid "E-mail server settings updated" msgstr "Einstellungen des E-Mail-Servers aktualisiert" -#: cps/admin.py:571 +#: cps/admin.py:803 #, python-format msgid "User '%(nick)s' deleted" msgstr "Benutzer '%(nick)s' gelöscht" -#: cps/admin.py:574 +#: cps/admin.py:806 msgid "No admin user remaining, can't delete user" msgstr "Benutzer kann nicht gelöscht werden, es wäre kein Admin Benutzer übrig" -#: cps/admin.py:612 cps/web.py:1359 +#: cps/admin.py:842 cps/web.py:1361 msgid "Found an existing account for this e-mail address." msgstr "Es existiert bereits ein Benutzer für diese E-Mailadresse." -#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1334 +#: cps/admin.py:852 cps/admin.py:867 cps/admin.py:887 cps/web.py:1336 #, python-format msgid "Edit User %(nick)s" msgstr "Benutzer %(nick)s bearbeiten" -#: cps/admin.py:622 cps/web.py:1327 +#: cps/admin.py:858 cps/web.py:1328 msgid "This username is already taken" msgstr "Benutzername ist schon vorhanden" -#: cps/admin.py:637 +#: cps/admin.py:874 #, python-format msgid "User '%(nick)s' updated" msgstr "Benutzer '%(nick)s' aktualisiert" -#: cps/admin.py:640 +#: cps/admin.py:877 msgid "An unknown error occured." msgstr "Es ist ein unbekannter Fehler aufgetreten." -#: cps/admin.py:657 +#: cps/admin.py:900 #, python-format msgid "Password for user %(user)s reset" msgstr "Passwort für Benutzer %(user)s wurde zurückgesetzt" -#: cps/admin.py:660 cps/web.py:1118 cps/web.py:1174 +#: cps/admin.py:903 cps/web.py:1114 cps/web.py:1170 msgid "An unknown error occurred. Please try again later." msgstr "Es ist ein unbekannter Fehler aufgetreten. Bitte später erneut versuchen." -#: cps/admin.py:663 cps/web.py:1062 +#: cps/admin.py:906 cps/web.py:1055 msgid "Please configure the SMTP mail settings first..." msgstr "Bitte zuerst die SMTP-Einstellung konfigurieren ..." -#: cps/admin.py:674 +#: cps/admin.py:918 msgid "Logfile viewer" msgstr "Logdatei Anzeige" -#: cps/admin.py:710 +#: cps/admin.py:957 msgid "Requesting update package" msgstr "Frage Update an" -#: cps/admin.py:711 +#: cps/admin.py:958 msgid "Downloading update package" msgstr "Lade Update herunter" -#: cps/admin.py:712 +#: cps/admin.py:959 msgid "Unzipping update package" msgstr "Entpacke Update" -#: cps/admin.py:713 +#: cps/admin.py:960 msgid "Replacing files" msgstr "Ersetze Dateien" -#: cps/admin.py:714 +#: cps/admin.py:961 msgid "Database connections are closed" msgstr "Schließe Datenbankverbindungen" -#: cps/admin.py:715 +#: cps/admin.py:962 msgid "Stopping server" msgstr "Stoppe Server" -#: cps/admin.py:716 +#: cps/admin.py:963 msgid "Update finished, please press okay and reload page" msgstr "Update abgeschlossen, bitte okay drücken und Seite neu laden" -#: cps/admin.py:717 cps/admin.py:718 cps/admin.py:719 cps/admin.py:720 +#: cps/admin.py:964 cps/admin.py:965 cps/admin.py:966 cps/admin.py:967 msgid "Update failed:" msgstr "Update fehlgeschlagen:" -#: cps/admin.py:717 cps/updater.py:272 cps/updater.py:457 cps/updater.py:459 +#: cps/admin.py:964 cps/updater.py:282 cps/updater.py:467 cps/updater.py:469 msgid "HTTP Error" msgstr "HTTP Fehler" -#: cps/admin.py:718 cps/updater.py:274 cps/updater.py:461 +#: cps/admin.py:965 cps/updater.py:284 cps/updater.py:471 msgid "Connection error" msgstr "Verbindungsfehler" -#: cps/admin.py:719 cps/updater.py:276 cps/updater.py:463 +#: cps/admin.py:966 cps/updater.py:286 cps/updater.py:473 msgid "Timeout while establishing connection" msgstr "Timeout beim Verbindungsaufbau" -#: cps/admin.py:720 cps/updater.py:278 cps/updater.py:465 +#: cps/admin.py:967 cps/updater.py:288 cps/updater.py:475 msgid "General error" msgstr "Allgemeiner Fehler" @@ -237,10 +245,6 @@ msgstr "Fehler beim Speichern der Datei %(file)s." msgid "File format %(ext)s added to %(book)s" msgstr "Dateiformat %(ext)s zu %(book)s hinzugefügt" -#: cps/editbooks.py:376 -msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" -msgstr "Cover hat kein unterstütztes Bildformat (jpg/png/webp), kann nicht gespeichert werden" - #: cps/editbooks.py:451 msgid "Cover is not a jpg file, can't save" msgstr "Cover ist keine JPG Datei, konnte nicht gespeichert werden" @@ -277,30 +281,30 @@ msgstr "Fehler beim Speichern der Datei %(file)s (Zugriff verweigert)" msgid "Failed to delete file %(file)s (Permission denied)." msgstr "Fehler beim Löschen von Datei %(file)s (Zugriff verweigert)" -#: cps/editbooks.py:710 +#: cps/editbooks.py:709 #, python-format msgid "File %(file)s uploaded" msgstr "Datei %(file)s hochgeladen" -#: cps/editbooks.py:739 +#: cps/editbooks.py:738 msgid "Source or destination format for conversion missing" msgstr "Quell- oder Zielformat für Konvertierung fehlt" -#: cps/editbooks.py:747 +#: cps/editbooks.py:746 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Buch wurde erfolgreich für die Konvertierung nach %(book_format)s eingereiht" -#: cps/editbooks.py:751 +#: cps/editbooks.py:750 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Es trat ein Fehler beim Konvertieren des Buches auf: %(res)s" -#: cps/gdrive.py:62 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgstr "Google Drive Setup is nicht komplett, bitte versuche Google Drive zu deaktivieren und aktiviere es anschließend erneut" -#: cps/gdrive.py:104 +#: cps/gdrive.py:103 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Callback Domain ist nicht verifiziert, bitte Domain in der Google Developer Console verifizieren" @@ -390,83 +394,111 @@ msgstr "Datei %(file)s wurde nicht auf Google Drive gefunden" msgid "Book path %(path)s not found on Google Drive" msgstr "Buchpfad %(path)s wurde nicht auf Google Drive gefunden" -#: cps/helper.py:643 +#: cps/helper.py:511 +msgid "Failed to create path for cover" +msgstr "Fehler beim Erzeugen des Ordners für die Coverdatei" + +#: cps/helper.py:516 +msgid "Cover-file is not a valid image file" +msgstr "Cover Datei hat kein gültiges Bildformat" + +#: cps/helper.py:519 +msgid "Failed to store cover-file" +msgstr "Fehler beim speichern der Cover Datei" + +#: cps/helper.py:530 +msgid "Only jpg/jpeg/png/webp files are supported as coverfile" +msgstr "Es werden nur jpg/jpeg/png/webp Dateien als Cover untertützt" + +#: cps/helper.py:544 +msgid "Only jpg/jpeg files are supported as coverfile" +msgstr "Es werden nur jpg/jpeg Dateien als Cover untertützt" + +#: cps/helper.py:658 msgid "Waiting" msgstr "Wartend" -#: cps/helper.py:645 +#: cps/helper.py:660 msgid "Failed" msgstr "Fehlgeschlagen" -#: cps/helper.py:647 +#: cps/helper.py:662 msgid "Started" msgstr "Gestartet" -#: cps/helper.py:649 +#: cps/helper.py:664 msgid "Finished" msgstr "Beendet" -#: cps/helper.py:651 +#: cps/helper.py:666 msgid "Unknown Status" msgstr "Unbekannter Status" -#: cps/helper.py:656 +#: cps/helper.py:671 msgid "E-mail: " msgstr "E-Mail: " -#: cps/helper.py:658 cps/helper.py:662 +#: cps/helper.py:673 cps/helper.py:677 msgid "Convert: " msgstr "Konvertiere: " -#: cps/helper.py:660 +#: cps/helper.py:675 msgid "Upload: " msgstr "Upload: " -#: cps/helper.py:664 +#: cps/helper.py:679 msgid "Unknown Task: " msgstr "Unbekannte Aufgabe: " -#: cps/oauth_bb.py:75 +#: cps/kobo_auth.py:127 +msgid "PLease access calibre-web from non localhost to get valid api_endpoint for kobo device" +msgstr "Bitte nicht von \"localhost\" auf Calibre-Web zugreifen, um einen gültigen api_endpoint für Kobo Geräte zu erhalten" + +#: cps/kobo_auth.py:130 cps/kobo_auth.py:150 +msgid "Kobo Setup" +msgstr "Kobo Setup" + +#: cps/oauth_bb.py:74 #, python-format msgid "Register with %(provider)s" msgstr "Anmelden mit %(provider)s" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:154 msgid "Failed to log in with GitHub." msgstr "Login mit Github fehlgeschlagen." -#: cps/oauth_bb.py:160 +#: cps/oauth_bb.py:159 msgid "Failed to fetch user info from GitHub." msgstr "Laden der Benutzerinformationen von Github fehlgeschlagen." -#: cps/oauth_bb.py:171 +#: cps/oauth_bb.py:170 msgid "Failed to log in with Google." msgstr "Login mit Google fehlgeschlagen." -#: cps/oauth_bb.py:176 +#: cps/oauth_bb.py:175 msgid "Failed to fetch user info from Google." msgstr "Laden der Benutzerinformationen von Google fehlgeschlagen." -#: cps/oauth_bb.py:274 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s success." msgstr "Verbindung zu %(oauth)s erfolgreich getrennt." -#: cps/oauth_bb.py:278 +#: cps/oauth_bb.py:277 #, python-format msgid "Unlink to %(oauth)s failed." msgstr "Trennen der Verbindung zu %(oauth)s fehlgeschlagen." -#: cps/oauth_bb.py:281 +#: cps/oauth_bb.py:280 #, python-format msgid "Not linked to %(oauth)s." msgstr "Nicht verknüpft mit %(oauth)s." -#: cps/oauth_bb.py:309 +#: cps/oauth_bb.py:308 msgid "GitHub Oauth error, please retry later." msgstr "GitHub Oauth Fehler, bitte später erneut versuchen." -#: cps/oauth_bb.py:328 +#: cps/oauth_bb.py:327 msgid "Google Oauth error, please retry later." msgstr "Google Oauth Fehler, bitte später erneut versuchen." @@ -517,403 +549,393 @@ msgstr "Bücher wurden zum Bücherregal %(sname)s hinzugefügt" msgid "Could not add books to shelf: %(sname)s" msgstr "Bücher konnten nicht zum Bücherregal %(sname)s hinzugefügt werden" -#: cps/shelf.py:180 +#: cps/shelf.py:181 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "Das Buch wurde aus dem Bücherregal: %(sname)s entfernt" -#: cps/shelf.py:186 +#: cps/shelf.py:190 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "Dir ist es nicht erlaubt, Bücher aus dem Bücherregal %(sname)s zu entfernen" -#: cps/shelf.py:207 cps/shelf.py:231 +#: cps/shelf.py:211 cps/shelf.py:235 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "Es existiert bereits ein Bücheregal mit dem Namen '%(title)s'." -#: cps/shelf.py:212 +#: cps/shelf.py:216 #, python-format msgid "Shelf %(title)s created" msgstr "Bücherregal %(title)s erzeugt" -#: cps/shelf.py:214 cps/shelf.py:242 +#: cps/shelf.py:218 cps/shelf.py:246 msgid "There was an error" msgstr "Es trat ein Fehler auf" -#: cps/shelf.py:215 cps/shelf.py:217 +#: cps/shelf.py:219 cps/shelf.py:221 msgid "create a shelf" msgstr "Bücherregal erzeugen" -#: cps/shelf.py:240 +#: cps/shelf.py:244 #, python-format msgid "Shelf %(title)s changed" msgstr "Bücherregal %(title)s verändert" -#: cps/shelf.py:243 cps/shelf.py:245 +#: cps/shelf.py:247 cps/shelf.py:249 msgid "Edit a shelf" msgstr "Bücherregal editieren" -#: cps/shelf.py:289 +#: cps/shelf.py:301 #, python-format msgid "Shelf: '%(name)s'" msgstr "Bücherregal: '%(name)s'" -#: cps/shelf.py:292 +#: cps/shelf.py:304 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Fehler beim Öffnen des Bücherregals. Bücherregal exisitert nicht oder ist nicht zugänglich" -#: cps/shelf.py:323 +#: cps/shelf.py:342 +msgid "Hidden Book" +msgstr "Verstecktes Buch" + +#: cps/shelf.py:347 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Reihenfolge in Bücherregal '%(name)s' verändern" -#: cps/ub.py:57 +#: cps/ub.py:56 msgid "Recently Added" msgstr "Kürzlich hinzugefügt" -#: cps/ub.py:59 +#: cps/ub.py:58 msgid "Show recent books" msgstr "Zeige kürzlich hinzugefügte Bücher" -#: cps/templates/index.xml:17 cps/ub.py:60 +#: cps/templates/index.xml:17 cps/ub.py:59 msgid "Hot Books" msgstr "Beliebte Bücher" -#: cps/ub.py:61 -msgid "Show hot books" +#: cps/ub.py:60 +msgid "Show Hot Books" msgstr "Zeige beliebte Bücher" -#: cps/templates/index.xml:24 cps/ub.py:64 -msgid "Best rated Books" +#: cps/templates/index.xml:24 cps/ub.py:63 cps/web.py:508 +msgid "Top Rated Books" msgstr "Best bewertete Bücher" -#: cps/ub.py:66 -msgid "Show best rated books" -msgstr "Zeige am besten bewertete Bücher" +#: cps/ub.py:65 +msgid "Show Top Rated Books" +msgstr "Bestbewertete Bücher anzeigen" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67 -#: cps/web.py:1011 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:66 +#: cps/web.py:1005 msgid "Read Books" msgstr "Gelesene Bücher" -#: cps/ub.py:69 +#: cps/ub.py:68 msgid "Show read and unread" msgstr "Zeige gelesene/ungelesene Bücher" -#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71 -#: cps/web.py:1015 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:70 +#: cps/web.py:1009 msgid "Unread Books" msgstr "Ungelesene Bücher" -#: cps/ub.py:73 +#: cps/ub.py:72 msgid "Show unread" msgstr "Zeige Ungelesene" -#: cps/ub.py:74 +#: cps/ub.py:73 msgid "Discover" msgstr "Entdecke" -#: cps/ub.py:76 +#: cps/ub.py:75 msgid "Show random books" msgstr "Zeige zufällige Bücher" -#: cps/templates/index.xml:75 cps/ub.py:77 +#: cps/templates/index.xml:75 cps/ub.py:76 cps/web.py:787 msgid "Categories" msgstr "Kategorien" -#: cps/ub.py:79 +#: cps/ub.py:78 msgid "Show category selection" msgstr "Zeige Kategorienauswahl" -#: cps/templates/book_edit.html:71 cps/templates/index.xml:82 -#: cps/templates/search_form.html:53 cps/ub.py:80 +#: cps/templates/book_edit.html:69 cps/templates/index.xml:82 +#: cps/templates/search_form.html:53 cps/ub.py:79 cps/web.py:715 msgid "Series" msgstr "Serien" -#: cps/ub.py:82 +#: cps/ub.py:81 msgid "Show series selection" msgstr "Zeige Serienauswahl" -#: cps/templates/index.xml:61 cps/ub.py:83 +#: cps/templates/index.xml:61 cps/ub.py:82 msgid "Authors" msgstr "Autoren" -#: cps/ub.py:85 +#: cps/ub.py:84 msgid "Show author selection" msgstr "Zeige Autorenauswahl" -#: cps/templates/index.xml:68 cps/ub.py:87 +#: cps/templates/index.xml:68 cps/ub.py:86 cps/web.py:699 msgid "Publishers" msgstr "Verleger" -#: cps/ub.py:89 +#: cps/ub.py:88 msgid "Show publisher selection" msgstr "Zeige Verlegerauswahl" -#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:90 +#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:89 +#: cps/web.py:770 msgid "Languages" msgstr "Sprachen" -#: cps/ub.py:93 +#: cps/ub.py:92 msgid "Show language selection" msgstr "Zeige Sprachauswahl" -#: cps/ub.py:94 +#: cps/templates/index.xml:96 cps/ub.py:93 msgid "Ratings" msgstr "Bewertungen" -#: cps/ub.py:96 +#: cps/ub.py:95 msgid "Show ratings selection" msgstr "Zeige Bewertungsauswahl" -#: cps/templates/index.xml:96 cps/ub.py:97 +#: cps/templates/index.xml:104 cps/ub.py:96 msgid "File formats" msgstr "Dateiformate" -#: cps/ub.py:99 +#: cps/ub.py:98 msgid "Show file formats selection" msgstr "Zeige Dateiformatauswahl" -#: cps/updater.py:252 cps/updater.py:359 cps/updater.py:372 +#: cps/updater.py:262 cps/updater.py:369 cps/updater.py:382 msgid "Unexpected data while reading update information" msgstr "Updateinformationen enthalten unbekannte Daten" -#: cps/updater.py:259 cps/updater.py:365 +#: cps/updater.py:269 cps/updater.py:375 msgid "No update available. You already have the latest version installed" msgstr "Kein Update verfügbar. Es ist bereits die aktuellste Version installiert" -#: cps/updater.py:285 +#: cps/updater.py:295 msgid "A new update is available. Click on the button below to update to the latest version." msgstr "Es sind Updates verfügbar. Klicke auf den Button unten, um auf die aktuellste Version zu aktualisieren." -#: cps/updater.py:338 +#: cps/updater.py:348 msgid "Could not fetch update information" msgstr "Updateinformationen konnten nicht geladen werden" -#: cps/updater.py:352 +#: cps/updater.py:362 msgid "No release information available" msgstr "Keine Releaseinformationen verfügbar" -#: cps/updater.py:405 cps/updater.py:414 +#: cps/updater.py:415 cps/updater.py:424 #, python-format msgid "A new update is available. Click on the button below to update to version: %(version)s" msgstr "Ein neues Update ist verfügbar. Klicke auf den Button unten, um auf Version: %(version)s zu aktualisieren" -#: cps/updater.py:424 +#: cps/updater.py:434 msgid "Click on the button below to update to the latest stable version." msgstr "Klicke auf den Button unten, um auf die letzte stabile Version zu aktualisieren." -#: cps/web.py:486 +#: cps/web.py:480 msgid "Recently Added Books" msgstr "Kürzlich hinzugefügte Bücher" -#: cps/web.py:514 -msgid "Best rated books" -msgstr "Am besten bewertete Bücher" - -#: cps/templates/index.xml:38 cps/web.py:522 -msgid "Random Books" +#: cps/templates/index.html:5 cps/web.py:516 +msgid "Discover (Random Books)" msgstr "Zufällige Bücher" -#: cps/web.py:548 +#: cps/web.py:542 msgid "Books" msgstr "Bücher" -#: cps/web.py:575 -msgid "Hot Books (most downloaded)" +#: cps/web.py:569 +msgid "Hot Books (Most Downloaded)" msgstr "Beliebte Bücher (am meisten Downloads)" -#: cps/web.py:586 cps/web.py:1382 cps/web.py:1478 -msgid "Error opening eBook. File does not exist or file is not accessible:" -msgstr "Öffnen des Buchs fehlgeschlagen. Datei existiert nicht oder ist nicht zugänglich:" +#: cps/web.py:580 +msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" +msgstr "Öffnen des Buchs fehlgeschlagen. Datei existiert nicht oder ist nicht zugänglich" -#: cps/web.py:599 +#: cps/web.py:593 #, python-format msgid "Author: %(name)s" msgstr "Author: %(name)s" -#: cps/web.py:611 +#: cps/web.py:605 #, python-format msgid "Publisher: %(name)s" msgstr "Verleger: %(name)s" -#: cps/web.py:622 +#: cps/web.py:616 #, python-format msgid "Series: %(serie)s" msgstr "Serie: %(serie)s" -#: cps/web.py:633 +#: cps/web.py:627 #, python-format msgid "Rating: %(rating)s stars" msgstr "Bewertung: %(rating)s Sterne" -#: cps/web.py:644 +#: cps/web.py:638 #, python-format msgid "File format: %(format)s" msgstr "Dateiformat: %(format)s" -#: cps/web.py:656 +#: cps/web.py:650 #, python-format msgid "Category: %(name)s" msgstr "Kategorie: %(name)s" -#: cps/web.py:673 +#: cps/web.py:667 #, python-format msgid "Language: %(name)s" msgstr "Sprache: %(name)s" -#: cps/web.py:705 -msgid "Publisher list" -msgstr "Verlegerliste" - -#: cps/web.py:721 -msgid "Series list" -msgstr "Serienliste" - -#: cps/web.py:735 +#: cps/web.py:729 msgid "Ratings list" msgstr "Bewertungsliste" -#: cps/web.py:748 +#: cps/web.py:742 msgid "File formats list" msgstr "Liste der Dateiformate" -#: cps/web.py:776 -msgid "Available languages" -msgstr "Verfügbare Sprachen" - -#: cps/web.py:793 -msgid "Category list" -msgstr "Kategorienliste" - -#: cps/templates/layout.html:73 cps/web.py:807 +#: cps/templates/layout.html:73 cps/templates/tasks.html:7 cps/web.py:801 msgid "Tasks" msgstr "Aufgaben" -#: cps/templates/feed.xml:33 cps/templates/layout.html:44 -#: cps/templates/layout.html:45 cps/web.py:829 cps/web.py:831 +#: cps/templates/book_edit.html:212 cps/templates/feed.xml:33 +#: cps/templates/layout.html:44 cps/templates/layout.html:47 +#: cps/templates/search_form.html:170 cps/web.py:821 cps/web.py:823 msgid "Search" msgstr "Suche" -#: cps/web.py:881 +#: cps/web.py:873 msgid "Published after " msgstr "Herausgegeben nach dem " -#: cps/web.py:888 +#: cps/web.py:880 msgid "Published before " msgstr "Herausgegeben vor dem " -#: cps/web.py:902 +#: cps/web.py:894 #, python-format msgid "Rating <= %(rating)s" msgstr "Bewertung <= %(rating)s" -#: cps/web.py:904 +#: cps/web.py:896 #, python-format msgid "Rating >= %(rating)s" msgstr "Bewertung >= %(rating)s" -#: cps/web.py:970 cps/web.py:982 +#: cps/web.py:962 cps/web.py:976 msgid "search" msgstr "Suche" -#: cps/web.py:1067 +#: cps/web.py:1060 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Buch erfolgreich zum Senden an %(kindlemail)s eingereiht" -#: cps/web.py:1071 +#: cps/web.py:1064 #, 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:1073 +#: cps/web.py:1066 msgid "Please configure your kindle e-mail address first..." msgstr "Bitte zuerst die Kindle E-Mailadresse konfigurieren..." -#: cps/web.py:1087 +#: cps/web.py:1083 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "Der E-Mail Server ist nicht konfigurierte, bitte den Administrator kontaktieren!" -#: cps/web.py:1088 cps/web.py:1094 cps/web.py:1119 cps/web.py:1123 -#: cps/web.py:1128 cps/web.py:1132 +#: cps/web.py:1084 cps/web.py:1090 cps/web.py:1115 cps/web.py:1119 +#: cps/web.py:1124 cps/web.py:1128 msgid "register" msgstr "Registieren" -#: cps/web.py:1121 +#: cps/web.py:1117 msgid "Your e-mail is not allowed to register" msgstr "Diese E-Mail ist nicht für die Registrierung zugelassen" -#: cps/web.py:1124 +#: cps/web.py:1120 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Eine Bestätigungs-E-Mail wurde an deinen E-Mail Account versendet." -#: cps/web.py:1127 +#: cps/web.py:1123 msgid "This username or e-mail address is already in use." msgstr "Benutzername oder E-Mailadresse ist bereits in Verwendung." -#: cps/web.py:1144 +#: cps/web.py:1140 msgid "Cannot activate LDAP authentication" msgstr "LDAP-Authentifizierung kann nicht aktiviert werden" -#: cps/web.py:1154 cps/web.py:1281 +#: cps/web.py:1150 cps/web.py:1277 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "Du bist nun eingeloggt als '%(nickname)s'" -#: cps/web.py:1159 +#: cps/web.py:1155 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "Login nicht erfolgreich, LDAP Server nicht erreichbar, bitte Administrator kontaktieren" -#: cps/web.py:1163 cps/web.py:1186 +#: cps/web.py:1159 cps/web.py:1182 msgid "Wrong Username or Password" msgstr "Falscher Benutzername oder Passwort" -#: cps/web.py:1170 +#: cps/web.py:1166 msgid "New Password was send to your email address" msgstr "Das neue Passwort wurde an die E-Mail Adresse verschickt" -#: cps/web.py:1176 +#: cps/web.py:1172 msgid "Please enter valid username to reset password" msgstr "Bitte einen gültigen Benutzernamen zum Zurücksetzen des Passworts angeben" -#: cps/web.py:1182 +#: cps/web.py:1178 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Eingeloggt als: '%(nickname)s'" -#: cps/web.py:1189 cps/web.py:1213 +#: cps/web.py:1185 cps/web.py:1209 msgid "login" msgstr "Login" -#: cps/web.py:1225 cps/web.py:1259 +#: cps/web.py:1221 cps/web.py:1255 msgid "Token not found" msgstr "Token wurde nicht gefunden" -#: cps/web.py:1234 cps/web.py:1267 +#: cps/web.py:1230 cps/web.py:1263 msgid "Token has expired" -msgstr "Das Token ist abgelaufen" +msgstr "Token ist abgelaufen" -#: cps/web.py:1243 +#: cps/web.py:1239 msgid "Success! Please return to your device" msgstr "Erfolg! Bitte zum Gerät zurückkehren" -#: cps/web.py:1320 cps/web.py:1363 cps/web.py:1369 +#: cps/web.py:1320 cps/web.py:1365 cps/web.py:1371 #, python-format msgid "%(name)s's profile" msgstr "%(name)s's Profil" -#: cps/web.py:1365 +#: cps/web.py:1367 msgid "Profile updated" msgstr "Profil aktualisiert" -#: cps/web.py:1394 cps/web.py:1397 cps/web.py:1400 cps/web.py:1407 -#: cps/web.py:1412 +#: cps/web.py:1384 cps/web.py:1480 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "Fehler beim Öffnen des eBooks. Datei existiert nicht oder ist nicht zugänglich:" + +#: cps/web.py:1396 cps/web.py:1399 cps/web.py:1402 cps/web.py:1409 +#: cps/web.py:1414 msgid "Read a Book" msgstr "Lese ein Buch" -#: cps/web.py:1423 +#: cps/web.py:1425 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "Fehler beim Öffnen des eBooks. Datei existiert nicht oder ist nicht zugänglich." @@ -928,24 +950,27 @@ msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Kindlegen-Aufruf mit Fehler %(error)s. Text: %(message)s fehlgeschlagen" #: cps/templates/admin.html:9 -msgid "User list" +msgid "Users" msgstr "Benutzerliste" -#: cps/templates/admin.html:12 -msgid "Nickname" +#: cps/templates/admin.html:12 cps/templates/login.html:8 +#: cps/templates/login.html:9 cps/templates/register.html:7 +#: cps/templates/user_edit.html:8 +msgid "Username" msgstr "Benutzername" -#: cps/templates/admin.html:13 -msgid "E-mail" +#: cps/templates/admin.html:13 cps/templates/register.html:11 +#: cps/templates/user_edit.html:13 +msgid "E-mail Address" msgstr "E-Mail" -#: cps/templates/admin.html:14 -msgid "Kindle" +#: cps/templates/admin.html:14 cps/templates/user_edit.html:26 +msgid "Send to Kindle E-mail Address" msgstr "Kindle" #: cps/templates/admin.html:15 -msgid "DLS" -msgstr "DLS" +msgid "Downloads" +msgstr "Downloads" #: cps/templates/admin.html:16 cps/templates/layout.html:76 msgid "Admin" @@ -958,8 +983,8 @@ msgid "Download" msgstr "Download" #: cps/templates/admin.html:18 -msgid "View Ebooks" -msgstr "EBooks ansehen" +msgid "View eBooks" +msgstr "Bücher ansehen" #: cps/templates/admin.html:19 cps/templates/layout.html:65 msgid "Upload" @@ -969,28 +994,32 @@ msgstr "Upload" msgid "Edit" msgstr "Editieren" +#: cps/templates/admin.html:38 +msgid "Add New User" +msgstr "Neuen Benutzer hinzufügen" + #: cps/templates/admin.html:44 -msgid "SMTP e-mail server settings" +msgid "E-mail Server Settings" msgstr "Einstellungen des SMTP-Servers" #: cps/templates/admin.html:47 cps/templates/email_edit.html:11 -msgid "SMTP hostname" +msgid "SMTP Hostname" msgstr "SMTP-Hostname" -#: cps/templates/admin.html:48 -msgid "SMTP port" -msgstr "SMTP-Port" +#: cps/templates/admin.html:48 cps/templates/email_edit.html:15 +msgid "SMTP Port" +msgstr "SMTP Port" -#: cps/templates/admin.html:49 -msgid "SSL" -msgstr "SSL" +#: cps/templates/admin.html:49 cps/templates/email_edit.html:19 +msgid "Encryption" +msgstr "Verschlüsselung" #: cps/templates/admin.html:50 cps/templates/email_edit.html:27 -msgid "SMTP login" +msgid "SMTP Login" msgstr "SMTP-Login" -#: cps/templates/admin.html:51 -msgid "From mail" +#: cps/templates/admin.html:51 cps/templates/email_edit.html:35 +msgid "From E-mail" msgstr "Absenderadresse" #: cps/templates/admin.html:61 @@ -1002,64 +1031,72 @@ msgid "Configuration" msgstr "Konfiguration" #: cps/templates/admin.html:70 -msgid "Calibre DB dir" +msgid "Calibre Database Directory" msgstr "Ordner der Calibre-DB" -#: cps/templates/admin.html:74 -msgid "Log level" +#: cps/templates/admin.html:74 cps/templates/config_edit.html:122 +msgid "Log Level" msgstr "Loglevel" #: cps/templates/admin.html:78 msgid "Port" msgstr "Port" -#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:23 -msgid "Books per page" +#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:27 +msgid "Books per Page" msgstr "Bücher pro Seite" #: cps/templates/admin.html:88 -msgid "Uploading" +msgid "Uploads" msgstr "Lade hoch" #: cps/templates/admin.html:92 -msgid "Anonymous browsing" +msgid "Anonymous Browsing" msgstr "Anonymes Durchsuchen" #: cps/templates/admin.html:96 -msgid "Public registration" +msgid "Public Registration" msgstr "Öffentliche Registrierung" -#: cps/templates/admin.html:100 cps/templates/remote_login.html:4 -msgid "Remote login" -msgstr "Remotelogin" +#: cps/templates/admin.html:100 +msgid "Magic Link Remote Login" +msgstr "Remotelogin ('Magischer Link')" #: cps/templates/admin.html:104 -msgid "Reverse proxy login" +msgid "Reverse Proxy Login" msgstr "Reverse Proxy Login" #: cps/templates/admin.html:109 msgid "Reverse proxy header name" msgstr "Reverse Proxy Header Name" +#: cps/templates/admin.html:114 +msgid "Edit Basic Configuration" +msgstr "Basiskonfiguration" + +#: cps/templates/admin.html:115 +msgid "Edit UI Configuration" +msgstr "Benutzeroberflächenkonfiguration" + #: cps/templates/admin.html:121 msgid "Administration" msgstr "Administration" #: cps/templates/admin.html:122 -msgid "View Logfiles" +msgid "View Logs" msgstr "Logdateien ansehen" #: cps/templates/admin.html:123 -msgid "Reconnect to Calibre DB" +msgid "Reconnect Calibre Database" msgstr "Calibre-DB neu verbinden" #: cps/templates/admin.html:124 -msgid "Restart Calibre-Web" -msgstr "Calibre-Web neustarten" +msgid "Restart" +msgstr "Neustart" #: cps/templates/admin.html:125 -msgid "Stop Calibre-Web" -msgstr "Calibre-Web anhalten" +msgid "Shutdown" +msgstr "Calibre-Web beenden" #: cps/templates/admin.html:131 msgid "Update" @@ -1078,38 +1115,37 @@ msgid "Current version" msgstr "Aktuelle Version" #: cps/templates/admin.html:148 -msgid "Check for update" -msgstr "Suche nach Update" +msgid "Check for Update" +msgstr "Nach Update suchen" #: cps/templates/admin.html:149 msgid "Perform Update" msgstr "Update durchführen" #: cps/templates/admin.html:161 -msgid "Do you really want to restart Calibre-Web?" +msgid "Are you sure you want to restart?" msgstr "Calibre-Web wirklich neustarten?" #: cps/templates/admin.html:166 cps/templates/admin.html:180 #: cps/templates/admin.html:200 cps/templates/shelf.html:72 -msgid "Ok" +msgid "OK" msgstr "OK" #: cps/templates/admin.html:167 cps/templates/admin.html:181 -#: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 +#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:194 +#: cps/templates/config_edit.html:346 cps/templates/config_view_edit.html:151 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92 -#: cps/templates/layout.html:28 cps/templates/shelf.html:73 -#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32 -#: cps/templates/user_edit.html:131 -msgid "Back" -msgstr "Zurück" +#: cps/templates/shelf.html:73 cps/templates/shelf_edit.html:19 +#: cps/templates/user_edit.html:137 +msgid "Cancel" +msgstr "Abbruch" #: cps/templates/admin.html:179 -msgid "Do you really want to stop Calibre-Web?" +msgid "Are you sure you want to shutdown?" msgstr "Calibre-Web wirklich anhalten?" #: cps/templates/admin.html:191 -msgid "Updating, please do not reload page" +msgid "Updating, please do not reload this page" msgstr "Updatevorgang, Seite bitte nicht neu laden" #: cps/templates/author.html:15 @@ -1136,161 +1172,159 @@ msgstr "Reduzieren" msgid "More by" msgstr "Mehr von" -#: cps/templates/book_edit.html:12 +#: cps/templates/book_edit.html:10 msgid "Delete Book" msgstr "Buch löschen" -#: cps/templates/book_edit.html:15 +#: cps/templates/book_edit.html:13 msgid "Delete formats:" msgstr "Lösche Formate:" -#: cps/templates/book_edit.html:18 cps/templates/book_edit.html:195 -#: cps/templates/email_edit.html:91 +#: cps/templates/book_edit.html:16 cps/templates/book_edit.html:193 +#: cps/templates/email_edit.html:91 cps/templates/user_edit.html:65 +#: cps/templates/user_edit.html:177 msgid "Delete" msgstr "Löschen" -#: cps/templates/book_edit.html:26 +#: cps/templates/book_edit.html:24 msgid "Convert book format:" msgstr "Konvertiere Buchformat:" -#: cps/templates/book_edit.html:30 +#: cps/templates/book_edit.html:28 msgid "Convert from:" msgstr "Konvertiere von:" -#: cps/templates/book_edit.html:32 cps/templates/book_edit.html:39 +#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:37 msgid "select an option" msgstr "Wähle eine Option" -#: cps/templates/book_edit.html:37 +#: cps/templates/book_edit.html:35 msgid "Convert to:" msgstr "Konvertiere nach:" -#: cps/templates/book_edit.html:46 +#: cps/templates/book_edit.html:44 msgid "Convert book" msgstr "Konvertiere Buch" -#: cps/templates/book_edit.html:55 cps/templates/search_form.html:6 +#: cps/templates/book_edit.html:53 cps/templates/search_form.html:6 msgid "Book Title" msgstr "Buchtitel" -#: cps/templates/book_edit.html:59 cps/templates/book_edit.html:255 -#: cps/templates/book_edit.html:273 cps/templates/search_form.html:10 +#: cps/templates/book_edit.html:57 cps/templates/book_edit.html:256 +#: cps/templates/book_edit.html:274 cps/templates/search_form.html:10 msgid "Author" msgstr "Autor" -#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:260 -#: cps/templates/book_edit.html:275 cps/templates/search_form.html:126 +#: cps/templates/book_edit.html:61 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:276 cps/templates/search_form.html:126 msgid "Description" msgstr "Beschreibung" -#: cps/templates/book_edit.html:67 cps/templates/search_form.html:33 +#: cps/templates/book_edit.html:65 cps/templates/search_form.html:33 msgid "Tags" msgstr "Tags" -#: cps/templates/book_edit.html:75 -msgid "Series id" -msgstr "Serien-ID" +#: cps/templates/book_edit.html:73 +msgid "Series ID" +msgstr "Serien ID" -#: cps/templates/book_edit.html:79 +#: cps/templates/book_edit.html:77 msgid "Rating" msgstr "Bewertung" -#: cps/templates/book_edit.html:83 -msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +#: cps/templates/book_edit.html:81 +msgid "Fetch Cover from URL (JPEG - Image will be downloaded and stored in database)" msgstr "Cover-URL (jpg, Cover wird heruntergeladen und in der Datenbank gespeichert, Feld erscheint anschließend wieder leer)" -#: cps/templates/book_edit.html:87 -msgid "Upload Cover from local drive" -msgstr "Cover von lokalem Laufwerk hinzufügen" +#: cps/templates/book_edit.html:85 +msgid "Upload Cover from Local Disk" +msgstr "Coverdatei von Lokalem Laufwerk hochladen" -#: cps/templates/book_edit.html:92 cps/templates/detail.html:165 -msgid "Publishing date" +#: cps/templates/book_edit.html:90 +msgid "Published Date" msgstr "Herausgabedatum" -#: cps/templates/book_edit.html:99 cps/templates/book_edit.html:257 -#: cps/templates/book_edit.html:274 cps/templates/detail.html:156 +#: cps/templates/book_edit.html:97 cps/templates/book_edit.html:258 +#: cps/templates/book_edit.html:275 cps/templates/detail.html:156 #: cps/templates/search_form.html:14 msgid "Publisher" msgstr "Herausgeber" -#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:30 +#: cps/templates/book_edit.html:101 cps/templates/detail.html:123 +#: cps/templates/user_edit.html:31 msgid "Language" msgstr "Sprache" -#: cps/templates/book_edit.html:113 cps/templates/search_form.html:137 +#: cps/templates/book_edit.html:111 cps/templates/search_form.html:137 msgid "Yes" msgstr "Ja" -#: cps/templates/book_edit.html:114 cps/templates/search_form.html:138 +#: cps/templates/book_edit.html:112 cps/templates/search_form.html:138 msgid "No" msgstr "Nein" -#: cps/templates/book_edit.html:160 -msgid "Upload format" +#: cps/templates/book_edit.html:158 +msgid "Upload Format" msgstr "Format hochladen" -#: cps/templates/book_edit.html:169 -msgid "view book after edit" +#: cps/templates/book_edit.html:167 +msgid "View Book on Save" msgstr "Buch nach Bearbeitung ansehen" -#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:208 -msgid "Get metadata" +#: cps/templates/book_edit.html:170 cps/templates/book_edit.html:206 +msgid "Fetch Metadata" msgstr "Metadaten laden" -#: 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:170 cps/templates/shelf_edit.html:17 -#: cps/templates/user_edit.html:129 -msgid "Submit" -msgstr "Abschicken" +#: cps/templates/book_edit.html:171 cps/templates/config_edit.html:343 +#: cps/templates/config_view_edit.html:150 cps/templates/email_edit.html:38 +#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:135 +msgid "Save" +msgstr "Speichern" -#: cps/templates/book_edit.html:187 +#: cps/templates/book_edit.html:185 msgid "Are you really sure?" msgstr "Sicher?" -#: cps/templates/book_edit.html:190 -msgid "Book will be deleted from Calibre database" +#: cps/templates/book_edit.html:188 +msgid "This book will be permanently erased from database" msgstr "Das Buch wird aus der Calibre-Datenbank" -#: cps/templates/book_edit.html:191 -msgid "and from hard disk" +#: cps/templates/book_edit.html:189 +msgid "and hard disk" msgstr "und von der Festplatte gelöscht" -#: cps/templates/book_edit.html:211 +#: cps/templates/book_edit.html:209 msgid "Keyword" msgstr "Suchbegriff" -#: cps/templates/book_edit.html:212 +#: cps/templates/book_edit.html:210 msgid " Search keyword " msgstr " Suchbegriff " -#: cps/templates/book_edit.html:214 cps/templates/layout.html:47 -msgid "Go!" -msgstr "Los!" - -#: cps/templates/book_edit.html:218 +#: cps/templates/book_edit.html:216 msgid "Click the cover to load metadata to the form" msgstr "Klicke auf das Bild, um die Metadaten zu übertragen" -#: cps/templates/book_edit.html:230 cps/templates/book_edit.html:270 +#: cps/templates/book_edit.html:231 cps/templates/book_edit.html:271 msgid "Loading..." msgstr "Lade..." -#: cps/templates/book_edit.html:235 cps/templates/layout.html:192 -#: cps/templates/layout.html:224 +#: cps/templates/book_edit.html:236 cps/templates/layout.html:191 +#: cps/templates/layout.html:223 cps/templates/modal_restriction.html:34 +#: cps/templates/user_edit.html:164 msgid "Close" msgstr "Schließen" -#: cps/templates/book_edit.html:262 cps/templates/book_edit.html:276 +#: cps/templates/book_edit.html:263 cps/templates/book_edit.html:277 msgid "Source" msgstr "Quelle" -#: cps/templates/book_edit.html:271 +#: cps/templates/book_edit.html:272 msgid "Search error!" msgstr "Fehler bei der Suche!" -#: cps/templates/book_edit.html:272 -msgid "No Result(s) found! Please try aonther keyword." +#: cps/templates/book_edit.html:273 +msgid "No Result(s) found! Please try another keyword." msgstr "Keine Ergebnisse gefunden! Bitte ein anderes Schlüsselwort benutzen." #: cps/templates/config_edit.html:12 @@ -1298,7 +1332,7 @@ msgid "Library Configuration" msgstr "Bibliothekskonfiguration" #: cps/templates/config_edit.html:19 -msgid "Location of Calibre database" +msgid "Location of Calibre Database" msgstr "Speicherort der Calibre-Datenbank" #: cps/templates/config_edit.html:25 @@ -1339,7 +1373,7 @@ msgstr "Server-Konfiguration" #: cps/templates/config_edit.html:87 msgid "Server Port" -msgstr "Server-Port" +msgstr "Server Port" #: cps/templates/config_edit.html:91 msgid "SSL certfile location (leave it empty for non-SSL Servers)" @@ -1350,8 +1384,8 @@ msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "Speicherort der SSL-Keydatei (leerlassen, falls kein SSL-Server)" #: cps/templates/config_edit.html:99 -msgid "Update channel" -msgstr "Update-Kanal" +msgid "Update Channel" +msgstr "Update Kanal" #: cps/templates/config_edit.html:101 msgid "Stable" @@ -1373,10 +1407,6 @@ msgstr "Nightly (Automatisch)" msgid "Logfile Configuration" msgstr "Konfiguration der Logdatei" -#: cps/templates/config_edit.html:122 -msgid "Log Level" -msgstr "Loglevel" - #: cps/templates/config_edit.html:131 msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "Position und Name der Logdatei (calibre-web.log bei keiner Eingabe)" @@ -1394,255 +1424,271 @@ msgid "Feature Configuration" msgstr "Feature-Konfiguration" #: cps/templates/config_edit.html:158 -msgid "Enable uploading" +msgid "Enable Uploads" msgstr "Hochladen aktivieren" #: cps/templates/config_edit.html:162 -msgid "Enable anonymous browsing" +msgid "Enable Anonymous Browsing" msgstr "Anonymes Durchsuchen aktivieren" #: cps/templates/config_edit.html:166 -msgid "Enable public registration" +msgid "Enable Public Registration" msgstr "Öffentliche Registrierung aktivieren" #: cps/templates/config_edit.html:170 -msgid "Enable remote login (\"magic link\")" -msgstr "Remotelogin aktivieren ('Magischer Link')" +msgid "Enable Magic Link Remote Login" +msgstr "Remotelogin ('Magischer Link') aktivieren" #: cps/templates/config_edit.html:175 +msgid "Enable Kobo sync" +msgstr "Synchronisation mit Kobo aktivieren" + +#: cps/templates/config_edit.html:180 +msgid "Proxy unknown requests to Kobo Store" +msgstr "Unbekannte Anfragen an Kobo.com weiterleiten" + +#: cps/templates/config_edit.html:187 msgid "Use Goodreads" msgstr "Benutze Goodreads" -#: cps/templates/config_edit.html:176 -msgid "Obtain an API Key" +#: cps/templates/config_edit.html:188 +msgid "Create an API Key" msgstr "Einen API Schlüssel erhalten" -#: cps/templates/config_edit.html:180 +#: cps/templates/config_edit.html:192 msgid "Goodreads API Key" msgstr "Öffentlicher Goodreads API Schlüssel" -#: cps/templates/config_edit.html:184 +#: cps/templates/config_edit.html:196 msgid "Goodreads API Secret" msgstr "Geheimer Goodreads API Schlüssel" -#: cps/templates/config_edit.html:191 +#: cps/templates/config_edit.html:203 msgid "Login type" msgstr "Logintyp" -#: cps/templates/config_edit.html:193 -msgid "Use standard Authentication" -msgstr "Benutze Standardanmeldung" +#: cps/templates/config_edit.html:205 +msgid "Use Standard Authentication" +msgstr "Benutze Standard Authentifizierung" -#: cps/templates/config_edit.html:195 +#: cps/templates/config_edit.html:207 msgid "Use LDAP Authentication" msgstr "Benutze LDAP-Login" -#: cps/templates/config_edit.html:198 +#: cps/templates/config_edit.html:210 msgid "Use OAuth" msgstr "Benutze OAuth" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:217 msgid "LDAP Server Host Name or IP Address" msgstr "LDAP-Server Hostname oder IP-Adresse" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:221 msgid "LDAP Server Port" -msgstr "LDAP-Server Port" +msgstr "LDAP Server Port" -#: cps/templates/config_edit.html:213 -msgid "LDAP schema (ldap or ldaps)" +#: cps/templates/config_edit.html:225 +msgid "LDAP Schema (LDAP or LPAPS)" msgstr "LDAP-Schema (ldap oder ldaps)" -#: cps/templates/config_edit.html:217 -msgid "LDAP Admin username" -msgstr "Benutzername des LDAP-Admins" +#: cps/templates/config_edit.html:229 +msgid "LDAP Administrator Username" +msgstr "LDAP Administrator Benutzername" -#: cps/templates/config_edit.html:221 -msgid "LDAP Admin password" -msgstr "Passwort des LDAP-Admins" +#: cps/templates/config_edit.html:233 +msgid "LDAP Administrator Password" +msgstr "LDAP Administrator Passwort" -#: cps/templates/config_edit.html:226 -msgid "LDAP Server use SSL" +#: cps/templates/config_edit.html:238 +msgid "LDAP Server Enable SSL" msgstr "LDAP-Server benutzt SSL" -#: cps/templates/config_edit.html:230 -msgid "LDAP Server use TLS" +#: cps/templates/config_edit.html:242 +msgid "LDAP Server Enable TLS" msgstr "LDAP-Server benutzt TLS" -#: cps/templates/config_edit.html:234 +#: cps/templates/config_edit.html:246 msgid "LDAP Server Certificate" msgstr "Zertifikat des LDAP-Servers" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:250 msgid "LDAP SSL Certificate Path" msgstr "Pfad zum SSL-Zertifikat des LDAP-Servers" -#: cps/templates/config_edit.html:243 +#: cps/templates/config_edit.html:255 msgid "LDAP Distinguished Name (DN)" msgstr "LDAP Distinguished Name (DN)" -#: cps/templates/config_edit.html:247 -msgid "LDAP User object filter" +#: cps/templates/config_edit.html:259 +msgid "LDAP User Object Filter" msgstr "LDAP User Object Filter" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:264 msgid "LDAP Server is OpenLDAP?" msgstr "Ist der LDAP-Server ein OpenLDAP-Server?" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:272 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "Erhalte %(provider)s OAuth Berechtigungen" -#: cps/templates/config_edit.html:263 +#: cps/templates/config_edit.html:275 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "%(provider)s OAuth Client Id" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:279 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "%(provider)s OAuth Client Secret" -#: cps/templates/config_edit.html:276 +#: cps/templates/config_edit.html:288 msgid "Allow Reverse Proxy Authentication" msgstr "Reverse Proxy Authentifizierung zulassen" -#: cps/templates/config_edit.html:280 +#: cps/templates/config_edit.html:292 msgid "Reverse Proxy Header Name" msgstr "Reverse Proxy Header Name" -#: cps/templates/config_edit.html:292 +#: cps/templates/config_edit.html:304 msgid "External binaries" msgstr "Externe Programme" -#: cps/templates/config_edit.html:300 -msgid "No converter" +#: cps/templates/config_edit.html:312 +msgid "No Converter" msgstr "Kein Konverter" -#: cps/templates/config_edit.html:302 +#: cps/templates/config_edit.html:314 msgid "Use Kindlegen" msgstr "Kindlegen benutzen" -#: cps/templates/config_edit.html:304 +#: cps/templates/config_edit.html:316 msgid "Use calibre's ebook converter" msgstr "Benutze Calibres Ebook-Konverter" -#: cps/templates/config_edit.html:308 +#: cps/templates/config_edit.html:320 msgid "E-Book converter settings" msgstr "Einstellungen des E-Book Konverters" -#: cps/templates/config_edit.html:312 +#: cps/templates/config_edit.html:324 msgid "Path to convertertool" msgstr "Pfad zu Konvertertool" -#: cps/templates/config_edit.html:318 +#: cps/templates/config_edit.html:330 msgid "Location of Unrar binary" msgstr "Pfad zur UnRar-Binärdatei" -#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 -#: cps/templates/login.html:4 +#: cps/templates/config_edit.html:349 cps/templates/layout.html:84 +#: cps/templates/login.html:4 cps/templates/login.html:20 msgid "Login" msgstr "Login" -#: cps/templates/config_view_edit.html:12 +#: cps/templates/config_view_edit.html:16 msgid "View Configuration" msgstr "Ansichtskonfiguration" -#: cps/templates/config_view_edit.html:19 cps/templates/shelf_edit.html:7 +#: cps/templates/config_view_edit.html:23 cps/templates/shelf_edit.html:7 msgid "Title" msgstr "Titel" -#: cps/templates/config_view_edit.html:27 -msgid "No. of random books to show" +#: cps/templates/config_view_edit.html:31 +msgid "No. of Random Books to Display" msgstr "Anzahl anzuzeigender zufälliger Bücher" -#: cps/templates/config_view_edit.html:31 -msgid "No. of authors to show before hiding (0=disable hiding)" +#: cps/templates/config_view_edit.html:35 +msgid "No. of Authors to Display Before Hiding (0=Disable Hiding)" msgstr "Anzahl in Übersicht anzuzeigender Autoren (0=alle werden angezeigt)" -#: cps/templates/config_view_edit.html:35 cps/templates/readcbr.html:112 +#: cps/templates/config_view_edit.html:39 cps/templates/readcbr.html:112 msgid "Theme" msgstr "Theme" -#: cps/templates/config_view_edit.html:37 +#: cps/templates/config_view_edit.html:41 msgid "Standard Theme" msgstr "Standard-Thema" -#: cps/templates/config_view_edit.html:38 +#: cps/templates/config_view_edit.html:42 msgid "caliBlur! Dark Theme" msgstr "caliBlur! dunkles Thema" -#: cps/templates/config_view_edit.html:42 -msgid "Regular expression for ignoring columns" +#: cps/templates/config_view_edit.html:46 +msgid "Regular Expression for Ignoring Columns" msgstr "Regulärer Ausdruck, um Spalten zu ignorien" -#: cps/templates/config_view_edit.html:46 -msgid "Link read/unread status to Calibre column" +#: cps/templates/config_view_edit.html:50 +msgid "Link Read/Unread Status to Calibre Column" msgstr "Verknüpfe Gelesen/Ungelesen-Status mit Calibre-Spalte" -#: cps/templates/config_view_edit.html:55 -msgid "Regular expression for title sorting" -msgstr "Regulärer Ausdruck für die Titelsortierung" - #: cps/templates/config_view_edit.html:59 -msgid "Tags for Mature Content" -msgstr "Kategorien für Erwachseneninhalte" +msgid "View Restrictions based on Calibre column" +msgstr "Sichtbarkeitsbeschränkung basierend auf Calibre Spalte" + +#: cps/templates/config_view_edit.html:61 cps/templates/email_edit.html:21 +msgid "None" +msgstr "Keine" + +#: cps/templates/config_view_edit.html:68 +msgid "Regular Expression for Title Sorting" +msgstr "Regulärer Ausdruck für Titelsortierung" -#: cps/templates/config_view_edit.html:73 -msgid "Default settings for new users" +#: cps/templates/config_view_edit.html:80 +msgid "Default Settings for New Users" msgstr "Standard-Einstellungen für neue Benutzer" -#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:82 -msgid "Admin user" +#: cps/templates/config_view_edit.html:88 cps/templates/user_edit.html:92 +msgid "Admin User" msgstr "Administrator" -#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:91 +#: cps/templates/config_view_edit.html:92 cps/templates/user_edit.html:97 msgid "Allow Downloads" msgstr "Downloads erlauben" -#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:95 -msgid "Allow book viewer" +#: cps/templates/config_view_edit.html:96 cps/templates/user_edit.html:101 +msgid "Allow eBook Viewer" msgstr "Anzeige von Büchern erlauben" -#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:99 +#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:105 msgid "Allow Uploads" msgstr "Hochladen erlauben" -#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:103 +#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:109 msgid "Allow Edit" msgstr "Bearbeiten erlauben" -#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 -msgid "Allow Delete books" +#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:113 +msgid "Allow Delete Books" msgstr "Löschen von Büchern erlauben" -#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:112 +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:118 msgid "Allow Changing Password" msgstr "Ändern des Passworts erlauben" -#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:116 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:122 msgid "Allow Editing Public Shelfs" msgstr "Editieren öffentlicher Bücherregale erlauben" -#: cps/templates/config_view_edit.html:119 -msgid "Default visibilities for new users" +#: cps/templates/config_view_edit.html:126 +msgid "Default Visibilities for New Users" msgstr "Standard-Sichtbarkeiten für neue Benutzer" -#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:74 -msgid "Show random books in detail view" +#: cps/templates/config_view_edit.html:142 +msgid "Show Random Books in Detail View" msgstr "Zeige zufällige Bücher in der Detailansicht" -#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:87 -msgid "Show mature content" -msgstr "Erwachseneninhalte anzeigen" +#: cps/templates/config_view_edit.html:144 +msgid "Add Allowed/Denied Tags" +msgstr "Erlaubte/Verbotene Tags hinzufügen" + +#: cps/templates/config_view_edit.html:145 +msgid "Add Allowed/Denied custom column values" +msgstr "Erlaubte/Verbotene Calibre Spalten hinzufügen" #: cps/templates/detail.html:59 -msgid "Read in browser" +msgid "Read in Browser" msgstr "Im Browser lesen" #: cps/templates/detail.html:72 -msgid "Listen in browser" +msgid "Listen in Browser" msgstr "Im Browser anhören" #: cps/templates/detail.html:117 @@ -1653,9 +1699,9 @@ msgstr "Buch" msgid "of" msgstr "von" -#: cps/templates/detail.html:123 -msgid "language" -msgstr "Sprache" +#: cps/templates/detail.html:165 +msgid "Published" +msgstr "Herausgabedatum" #: cps/templates/detail.html:200 msgid "Mark As Unread" @@ -1678,21 +1724,9 @@ msgid "Add to shelf" msgstr "Zu Bücherregal hinzufügen" #: cps/templates/detail.html:286 -msgid "Edit metadata" +msgid "Edit Metadata" msgstr "Metadaten bearbeiten" -#: cps/templates/email_edit.html:15 -msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" -msgstr "SMTP-Port (normalerweise 25 für unverschlüsseltes SMTP, 465 für SSL und 587 für STARTTLS" - -#: cps/templates/email_edit.html:19 -msgid "Encryption" -msgstr "Verschlüsselung" - -#: cps/templates/email_edit.html:21 -msgid "None" -msgstr "Keine" - #: cps/templates/email_edit.html:22 msgid "STARTTLS" msgstr "STARTTLS" @@ -1702,23 +1736,15 @@ msgid "SSL/TLS" msgstr "SSL/TLS" #: cps/templates/email_edit.html:31 -msgid "SMTP password" +msgid "SMTP Password" msgstr "SMTP-Passwort" -#: cps/templates/email_edit.html:35 -msgid "From e-mail" -msgstr "Absenderadresse" - -#: cps/templates/email_edit.html:38 -msgid "Save settings" -msgstr "Einstellungen speichern" - #: cps/templates/email_edit.html:39 -msgid "Save settings and send Test E-Mail" +msgid "Save and Send Test E-mail" msgstr "Einstellungen speichern und Test-E-Mail versenden" #: cps/templates/email_edit.html:43 -msgid "Allowed domains for registering" +msgid "Allowed Domains (Whitelist)" msgstr "Erlaubte Domains für die Registrierung" #: cps/templates/email_edit.html:46 cps/templates/email_edit.html:72 @@ -1734,28 +1760,28 @@ msgid "Enter domainname" msgstr "Domainnamen eingeben" #: cps/templates/email_edit.html:60 -msgid "Denied domains for registering" +msgid "Denied Domains (Blacklist)" msgstr "Verbotene Domains für eine Registrierung" #: cps/templates/email_edit.html:90 -msgid "Do you really want to delete this domain rule?" +msgid "Are you sure you want to delete this domain?" msgstr "Soll diese Domain-Regel wirklich gelöscht werden?" -#: cps/templates/feed.xml:21 cps/templates/layout.html:176 +#: cps/templates/feed.xml:21 cps/templates/layout.html:175 msgid "Next" msgstr "Nächste" -#: cps/templates/http_error.html:37 -msgid "Create issue" -msgstr "Erzeuge Issue" +#: cps/templates/generate_kobo_auth_url.html:5 +msgid "Open the .kobo/Kobo eReader.conf file in a text editor and add (or edit):" +msgstr "Öffne ddie .kobo/Kobo eReader.conf Datei in einem Texteditor und füge hinzu (oder ersetze):" -#: cps/templates/http_error.html:44 -msgid "Back to home" -msgstr "Zurück zur Hauptseite" +#: cps/templates/http_error.html:38 +msgid "Create Issue" +msgstr "Issue erzeuge" -#: cps/templates/index.html:5 -msgid "Discover (Random Books)" -msgstr "Entdecke (Zufälliges Buch)" +#: cps/templates/http_error.html:45 +msgid "Return to Home" +msgstr "Zurück zur Hauptseite" #: cps/templates/index.html:64 msgid "Group by series" @@ -1781,7 +1807,11 @@ msgstr "Kürzlich hinzugefügte Bücher" msgid "The latest Books" msgstr "Die neuesten Bücher" -#: cps/templates/index.xml:42 +#: cps/templates/index.xml:38 +msgid "Random Books" +msgstr "Zufällige Bücher" + +#: cps/templates/index.xml:42 cps/templates/user_edit.html:80 msgid "Show Random Books" msgstr "Zeige zufällige Bücher" @@ -1806,22 +1836,26 @@ msgid "Books ordered by Languages" msgstr "Bücher nach Sprache sortiert" #: cps/templates/index.xml:100 +msgid "Books ordered by Rating" +msgstr "Bücher nach Bewertungen sortiert" + +#: cps/templates/index.xml:108 msgid "Books ordered by file formats" msgstr "Bücher nach Dateiformaten sortiert" -#: cps/templates/index.xml:103 cps/templates/layout.html:137 +#: cps/templates/index.xml:111 cps/templates/layout.html:136 msgid "Public Shelves" msgstr "Öffentliche Bücherregale" -#: cps/templates/index.xml:107 +#: cps/templates/index.xml:115 msgid "Books organized in public shelfs, visible to everyone" msgstr "Bücher, die in öffentlichen Bücherregal organisiert und für jedermann sichtbar sind" -#: cps/templates/index.xml:111 cps/templates/layout.html:141 +#: cps/templates/index.xml:119 cps/templates/layout.html:140 msgid "Your Shelves" msgstr "Deine Bücherregale" -#: cps/templates/index.xml:115 +#: cps/templates/index.xml:123 msgid "User's own shelfs, only visible to the current user himself" msgstr "Persönliches Bücherregal des Benutzers, nur sichtbar für den aktuellen Benutzer" @@ -1829,10 +1863,19 @@ msgstr "Persönliches Bücherregal des Benutzers, nur sichtbar für den aktuelle msgid "Home" msgstr "Home" +#: cps/templates/layout.html:28 cps/templates/shelf_order.html:32 +#: cps/templates/user_edit.html:178 +msgid "Back" +msgstr "Zurück" + #: cps/templates/layout.html:34 -msgid "Toggle navigation" +msgid "Toggle Navigation" msgstr "Nagivation umschalten" +#: cps/templates/layout.html:45 +msgid "Search Library" +msgstr "Bibiliothek durchsuchen" + #: cps/templates/layout.html:55 msgid "Advanced Search" msgstr "Erweiterte Suche" @@ -1854,74 +1897,101 @@ msgstr "Logout" msgid "Register" msgstr "Registrieren" -#: cps/templates/layout.html:116 cps/templates/layout.html:223 +#: cps/templates/layout.html:116 cps/templates/layout.html:222 msgid "Uploading..." msgstr "Lade hoch..." #: cps/templates/layout.html:117 -msgid "please don't refresh the page" +msgid "Please do not refresh the page" msgstr "Bitte die Seite nicht neu laden" #: cps/templates/layout.html:127 msgid "Browse" msgstr "Durchsuchen" -#: cps/templates/layout.html:146 +#: cps/templates/layout.html:145 msgid "Create a Shelf" msgstr "Bücherregal erzeugen" -#: cps/templates/layout.html:147 cps/templates/stats.html:3 +#: cps/templates/layout.html:146 cps/templates/stats.html:3 msgid "About" msgstr "Über" -#: cps/templates/layout.html:161 +#: cps/templates/layout.html:160 msgid "Previous" msgstr "Vorheriger Eintrag" -#: cps/templates/layout.html:188 +#: cps/templates/layout.html:187 msgid "Book Details" msgstr "Buchdetails" -#: cps/templates/layout.html:222 +#: cps/templates/layout.html:221 msgid "Upload done, processing, please wait..." msgstr "Hochladen beendet, verarbeite Daten, bitte warten..." -#: cps/templates/layout.html:225 +#: cps/templates/layout.html:224 msgid "Error" msgstr "Fehler" -#: cps/templates/login.html:8 cps/templates/login.html:9 -#: cps/templates/register.html:7 cps/templates/user_edit.html:8 -msgid "Username" -msgstr "Benutzername" - #: cps/templates/login.html:12 cps/templates/login.html:13 #: cps/templates/user_edit.html:21 msgid "Password" msgstr "Passwort" #: cps/templates/login.html:17 -msgid "Remember me" +msgid "Remember Me" msgstr "Merken" #: cps/templates/login.html:22 -msgid "Forgot password" -msgstr "Passwort vergessen" +msgid "Forgot Password?" +msgstr "Passwort vergessen?" #: cps/templates/login.html:25 -msgid "Log in with magic link" +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:6 +msgid "Show Calibre-Web Log: " +msgstr "Calibre-Web Logdatei anzeigen: " + +#: cps/templates/logviewer.html:8 +msgid "Calibre-Web Log: " +msgstr "Calibre-Web Logdatei: " #: cps/templates/logviewer.html:8 -msgid "Show access log" -msgstr "Zeige Zugriffslogdatei" +msgid "Stream output, can't be displayed" +msgstr "Stream Ausgabe, kann nicht angezeigt werden" + +#: cps/templates/logviewer.html:12 +msgid "Show Access Log: " +msgstr "Zugriffslogbuch anzeigen: " + +#: cps/templates/modal_restriction.html:6 +msgid "Select allowed/denied Tags" +msgstr "Erlaubte/verbotene Tags auswählen" + +#: cps/templates/modal_restriction.html:7 +msgid "Select allowed/denied Custom Column values" +msgstr "Erlaubte/Verbotene Calibre Spalten auswählen" + +#: cps/templates/modal_restriction.html:8 +msgid "Select allowed/denied Tags of user" +msgstr "Erlaubte/Verbotene Tags des Benutzers auswählen" + +#: cps/templates/modal_restriction.html:9 +msgid "Select allowed/denied Custom Column values of user" +msgstr "Erlaubte/Verbotene Calibre Spalten des Benutzers auswählen" + +#: cps/templates/modal_restriction.html:15 +msgid "Enter Tag" +msgstr "Tag eingeben" + +#: cps/templates/modal_restriction.html:24 +msgid "Add View Restriction" +msgstr "Sichtbeschränkung hinzufügen" #: cps/templates/osd.xml:5 -msgid "Calibre-Web ebook catalog" +msgid "Calibre-Web eBook Catalog" msgstr "Calibre-Web E-Book-Katalog" #: cps/templates/read.html:74 @@ -2033,51 +2103,51 @@ msgid "Basic txt Reader" msgstr "Einfacher TXT-Reader" #: cps/templates/register.html:4 -msgid "Register a new account" +msgid "Register New Account" msgstr "Neues Benutzerkonto registrieren" #: cps/templates/register.html:8 msgid "Choose a username" msgstr "Wähle einen Benutzernamen" -#: cps/templates/register.html:11 cps/templates/user_edit.html:13 -msgid "E-mail address" -msgstr "E-Mail-Adresse" - #: cps/templates/register.html:12 msgid "Your email address" msgstr "Deine E-Mail-Adresse" +#: cps/templates/remote_login.html:4 +msgid "Magic Link - Authorise New Device" +msgstr "Magischer Link - Neues Gerät autorisieren" + #: cps/templates/remote_login.html:6 -msgid "Use your other device, login and visit " -msgstr "Benutze dein anderes Gerät, logge dich ein und besuche " +msgid "On another device, login and visit:" +msgstr "Benutze dein anderes Gerät, logge dich ein und besuche:" -#: cps/templates/remote_login.html:9 -msgid "Once you do so, you will automatically get logged in on this device." +#: cps/templates/remote_login.html:10 +msgid "Once verified, you will automatically be logged in on this device." msgstr "Danach wirst du automatisch auf diesem Gerät eingeloggt sein." -#: cps/templates/remote_login.html:12 -msgid "The link will expire after 10 minutes." +#: cps/templates/remote_login.html:13 +msgid "This verification link will expire in 10 minutes." msgstr "Dieser Link wird in 10 Minuten ablaufen." #: cps/templates/search.html:5 -msgid "No Results for:" -msgstr "Keine Ergebnisse für:" +msgid "No Results Found" +msgstr "Keine Ergebnisse" #: cps/templates/search.html:6 -msgid "Please try a different search" -msgstr "Versuche eine andere Suche" +msgid "Search Term:" +msgstr "Suchbegriff:" #: cps/templates/search.html:8 msgid "Results for:" msgstr "Ergebnisse für:" #: cps/templates/search_form.html:19 -msgid "Publishing date from" +msgid "Published Date From" msgstr "Herausgabedatum von" #: cps/templates/search_form.html:26 -msgid "Publishing date to" +msgid "Published Date To" msgstr "Herausgabedatum bis" #: cps/templates/search_form.html:43 @@ -2101,11 +2171,11 @@ msgid "Exclude Extensions" msgstr "Erweiterungen ausschließen" #: cps/templates/search_form.html:117 -msgid "Rating bigger than" +msgid "Rating Above" msgstr "Bewertungen größer als" #: cps/templates/search_form.html:121 -msgid "Rating less than" +msgid "Rating Below" msgstr "Bewertungen kleiner als" #: cps/templates/shelf.html:10 @@ -2121,24 +2191,24 @@ msgid "Change order" msgstr "Reihenfolge ändern" #: cps/templates/shelf.html:67 -msgid "Do you really want to delete the shelf?" +msgid "Are you sure you want to delete this shelf?" msgstr "Wirklich das Bücherregal löschen?" #: cps/templates/shelf.html:70 -msgid "Shelf will be lost for everybody and forever!" -msgstr "Das Bücherregal wird für alle und für immer gelöscht!" +msgid "Shelf will be deleted for all users" +msgstr "Das Bücherregal wird für alle und für immer gelöscht" #: cps/templates/shelf_edit.html:13 -msgid "should the shelf be public?" -msgstr "Soll das Bücherregal öffentlich sein?" +msgid "Share with Everyone" +msgstr "Bücherregal mit anderen Benutzern teilen" #: cps/templates/shelf_order.html:5 -msgid "Drag 'n drop to rearrange order" +msgid "Drag to Rearrange Order" msgstr "Drag 'n drop um Reihenfolge zu ändern" #: cps/templates/stats.html:7 -msgid "Calibre library statistics" -msgstr "Statistiken der Calibre-Bibliothek" +msgid "Library Statistics" +msgstr "Bibiliotheksstatistiken" #: cps/templates/stats.html:12 msgid "Books in this Library" @@ -2157,21 +2227,17 @@ msgid "Series in this Library" msgstr "Serien in dieser Bibliothek" #: cps/templates/stats.html:28 -msgid "Linked libraries" +msgid "Linked Libraries" msgstr "Dynamische Bibliotheken" #: cps/templates/stats.html:32 -msgid "Program library" -msgstr "Programm-Bibliotheken" +msgid "Program Library" +msgstr "Programm Bibliothek" #: cps/templates/stats.html:33 msgid "Installed Version" msgstr "Installierte Version" -#: cps/templates/tasks.html:7 -msgid "Tasks list" -msgstr "Aufgabenliste" - #: cps/templates/tasks.html:12 msgid "User" msgstr "Benutzer" @@ -2189,11 +2255,11 @@ msgid "Progress" msgstr "Fortschritt" #: cps/templates/tasks.html:17 -msgid "Runtime" +msgid "Run Time" msgstr "Laufzeit" #: cps/templates/tasks.html:18 -msgid "Starttime" +msgid "Start Time" msgstr "Startzeitpunkt" #: cps/templates/tasks.html:24 @@ -2208,169 +2274,58 @@ msgstr "Alle Aufgaben verstecken" msgid "Reset user Password" msgstr "Benutzerpasswort zurücksetzen" -#: cps/templates/user_edit.html:26 -msgid "Kindle E-Mail" -msgstr "Kindle E-Mail" - -#: cps/templates/user_edit.html:39 -msgid "Show books with language" +#: cps/templates/user_edit.html:41 +msgid "Language of Books" msgstr "Zeige nur Bücher mit dieser Sprache" -#: cps/templates/user_edit.html:41 -msgid "Show all" +#: cps/templates/user_edit.html:43 +msgid "Show All" msgstr "Zeige alle" -#: cps/templates/user_edit.html:51 +#: cps/templates/user_edit.html:52 msgid "OAuth Settings" msgstr "Oauth Einstellungen" -#: cps/templates/user_edit.html:53 +#: cps/templates/user_edit.html:54 msgid "Link" msgstr "Verknüpfung herstellen" -#: cps/templates/user_edit.html:55 +#: cps/templates/user_edit.html:56 msgid "Unlink" msgstr "Verknüpfung entfernen" -#: cps/templates/user_edit.html:123 -msgid "Delete this user" -msgstr "Benutzer löschen" - -#: cps/templates/user_edit.html:138 -msgid "Recent Downloads" -msgstr "Letzte Downloads" - -#~ msgid "Show sorted books" -#~ msgstr "Zeige Bücher sortiert" - -#~ msgid "Newest Books" -#~ msgstr "Neueste Bücher" - -#~ msgid "Oldest Books" -#~ msgstr "Älteste Bücher" - -#~ msgid "Books (A-Z)" -#~ msgstr "Bücher (A-Z)" - -#~ msgid "Books (Z-A)" -#~ msgstr "Bücher (Z-A)" - -#~ msgid "Ratings: %(serie)s" -#~ msgstr "Bewertungen: %(serie)s" - -#~ msgid "Sorted Books" -#~ msgstr "Bücher sortiert" - -#~ msgid "Sort By" -#~ msgstr "Sortiert nach" - -#~ msgid "Newest" -#~ msgstr "Neueste" - -#~ msgid "Oldest" -#~ msgstr "Älteste" - -#~ msgid "Ascending" -#~ msgstr "Aufsteigend" - -#~ msgid "Descending" -#~ msgstr "Absteigend" - -#~ 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 "URL des LDAP-Anbieters" - -#~ msgid "Register with %s, " -#~ msgstr "Registrieren mit %s, " +#: cps/templates/user_edit.html:62 +msgid "Kobo Sync Token" +msgstr "Kobo Sync Token" -#~ msgid "Import of optional Google Drive requirements missing" -#~ msgstr "Optionale Abhängigkeiten für Google Drive fehlen" +#: cps/templates/user_edit.html:64 +msgid "Create/View" +msgstr "Erzeugen/Ansehen" -#~ msgid "client_secrets.json is missing or not readable" -#~ msgstr "client_secrets.json nicht vorhanden oder nicht lesbar" +#: cps/templates/user_edit.html:83 +msgid "Add allowed/denied Tags" +msgstr "Erlaubte/Verbotene Tags" -#~ msgid "client_secrets.json is not configured for web application" -#~ msgstr "client_secrets.json nicht für Webapplikationen konfiguriert" +#: cps/templates/user_edit.html:84 +msgid "Add allowed/denied custom column values" +msgstr "Erlaubte/Verbotene Calibre Spalten hinzufügen" -#~ msgid "Keyfile location is not valid, please enter correct path" -#~ msgstr "Ungültiger Speicherort der SSL-Keydatei, bitte gültigen Pfad angeben" - -#~ msgid "Certfile location is not valid, please enter correct path" -#~ msgstr "Ungültiger Speicherort des SSL-Zertifikats, bitte gültigen Pfad angeben" - -#~ msgid "Please enter a LDAP provider, port, DN and user object identifier" -#~ msgstr "Bitte LDAP-Provider, Port, DN und User Object Identifer eingeben" - -#~ msgid "Please enter a LDAP service account and password" -#~ msgstr "Bitte Account und Passwort des LDAP Services eingeben" - -#~ msgid "Please enter Github oauth credentials" -#~ msgstr "Bitte die Github Oauth Anmeldedaten eingeben" - -#~ msgid "Please enter Google oauth credentials" -#~ msgstr "Bitte die Google Oauth Anmeldedaten eingeben" - -#~ msgid "Logfile location is not valid, please enter correct path" -#~ msgstr "Ungültiger Speicherort der Logdatei, bitte gültigen Pfad angeben" - -#~ msgid "Access Logfile location is not valid, please enter correct path" -#~ msgstr "Ungültiger Speicherort der Zugriffs-Logdatei, bitte gültigen Pfad eingeben" - -#~ msgid "DB location is not valid, please enter correct path" -#~ msgstr "Ungültiger Speicherort der DB, bitte gültigen Pfad eingeben" - -#~ msgid "Excecution permissions missing" -#~ msgstr "Ausführungsberechtigung nicht vorhanden" - -#~ msgid "Error excecuting UnRar" -#~ msgstr "Fehler bei der Ausführung von UnRar" - -#~ msgid "Unrar binary file not found" -#~ msgstr "UnRar-Binärdatei nicht gefunden" - -#~ msgid "Use GitHub OAuth" -#~ msgstr "Benutze Github Oauth" - -#~ msgid "Use Google OAuth" -#~ msgstr "Benutze Google Oauth" - -#~ msgid "Obtain GitHub OAuth Credential" -#~ msgstr "GitHub OAuth Credential erhalten" - -#~ msgid "GitHub OAuth Client Id" -#~ msgstr "Github OAuth Client-ID" - -#~ msgid "GitHub OAuth Client Secret" -#~ msgstr "Github OAuth Client-Secret" - -#~ msgid "Obtain Google OAuth Credential" -#~ msgstr "Google OAuth Credential erhalten" +#: cps/templates/user_edit.html:129 +msgid "Delete User" +msgstr "Benutzer löschen" -#~ msgid "Google OAuth Client Id" -#~ msgstr "Google OAuth Client-ID" +#: cps/templates/user_edit.html:144 +msgid "Recent Downloads" +msgstr "Letzte Downloads" -#~ msgid "Google OAuth Client Secret" -#~ msgstr "Google OAuth Client-Secret" +#: cps/templates/user_edit.html:160 +msgid "Generate Kobo Auth URL" +msgstr "Kobo Auth URL erzeugen" -#~ msgid "Use" -#~ msgstr "Benutzen" +#: cps/templates/user_edit.html:176 +msgid "Do you really want to delete the Kobo Token?" +msgstr "Möchten Sie wirklich den Kobo Token löschen?" -#~ msgid "unknown" -#~ msgstr "Unbekannt" +#~ msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" +#~ msgstr "Cover hat kein unterstütztes Bildformat (jpg/png/webp), kann nicht gespeichert werden" -#~ msgid "New Books" -#~ msgstr "Neue Bücher" diff --git a/cps/translations/es/LC_MESSAGES/messages.mo b/cps/translations/es/LC_MESSAGES/messages.mo index 5a957324..1e20fd9d 100644 Binary files a/cps/translations/es/LC_MESSAGES/messages.mo and b/cps/translations/es/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/es/LC_MESSAGES/messages.po b/cps/translations/es/LC_MESSAGES/messages.po index 014467c0..b5603aec 100644 --- a/cps/translations/es/LC_MESSAGES/messages.po +++ b/cps/translations/es/LC_MESSAGES/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2020-01-12 13:57+0100\n" +"POT-Creation-Date: 2020-03-12 20:31+0100\n" "PO-Revision-Date: 2019-07-26 11:44+0100\n" "Last-Translator: minakmostoles \n" "Language: es\n" @@ -17,7 +17,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.7.0\n" +"Generated-By: Babel 2.8.0\n" #: cps/about.py:42 msgid "installed" @@ -28,7 +28,7 @@ msgid "not installed" msgstr "No instalado" # "Last-Translator: victorhck \n" -#: cps/about.py:84 +#: cps/about.py:87 msgid "Statistics" msgstr "Estadísticas" @@ -42,7 +42,7 @@ msgstr "Servidor en proceso de apagado. Por favor, cierre la ventana." #: cps/admin.py:110 cps/editbooks.py:410 cps/editbooks.py:419 #: cps/editbooks.py:539 cps/editbooks.py:541 cps/editbooks.py:594 -#: cps/updater.py:446 cps/uploader.py:97 cps/uploader.py:108 +#: cps/updater.py:456 cps/uploader.py:96 cps/uploader.py:107 msgid "Unknown" msgstr "Desconocido" @@ -50,155 +50,164 @@ msgstr "Desconocido" msgid "Admin page" msgstr "Página de administración" -#: cps/admin.py:148 cps/templates/admin.html:115 +#: cps/admin.py:151 msgid "UI Configuration" msgstr "Configuración de la interfaz del usuario" -#: cps/admin.py:185 cps/admin.py:412 +#: cps/admin.py:187 cps/admin.py:637 msgid "Calibre-Web configuration updated" msgstr "Configuración de Calibre-Web actualizada" -#: cps/admin.py:442 cps/templates/admin.html:114 +#: cps/admin.py:434 cps/admin.py:440 cps/admin.py:451 cps/admin.py:462 +#: cps/templates/modal_restriction.html:29 +msgid "Deny" +msgstr "" + +#: cps/admin.py:436 cps/admin.py:442 cps/admin.py:453 cps/admin.py:464 +#: cps/templates/modal_restriction.html:28 +msgid "Allow" +msgstr "" + +#: cps/admin.py:667 msgid "Basic Configuration" msgstr "Configuración básica" -#: cps/admin.py:465 cps/web.py:1093 +#: cps/admin.py:691 cps/web.py:1089 msgid "Please fill out all fields!" msgstr "¡Por favor completar todos los campos!" -#: cps/admin.py:467 cps/admin.py:478 cps/admin.py:484 cps/admin.py:499 -#: cps/templates/admin.html:38 +#: cps/admin.py:694 cps/admin.py:706 cps/admin.py:712 cps/admin.py:730 msgid "Add new user" msgstr "Agregar un nuevo usuario" -#: cps/admin.py:476 cps/web.py:1318 +#: cps/admin.py:703 cps/web.py:1318 msgid "E-mail is not from valid domain" msgstr "El correo electrónico no tiene un nombre de dominio válido" -#: cps/admin.py:482 cps/admin.py:493 +#: cps/admin.py:710 cps/admin.py:725 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:489 +#: cps/admin.py:721 #, python-format msgid "User '%(user)s' created" msgstr "Usuario '%(user)s' creado" -#: cps/admin.py:509 +#: cps/admin.py:740 msgid "Edit e-mail server settings" msgstr "Editar los ajustes del servidor de correo electrónico" -#: cps/admin.py:535 +#: cps/admin.py:766 #, 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:538 +#: cps/admin.py:769 #, 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:540 +#: cps/admin.py:771 msgid "Please configure your e-mail address first..." msgstr "" -#: cps/admin.py:542 +#: cps/admin.py:773 msgid "E-mail server settings updated" msgstr "Actualizados los ajustes del servidor de correo electrónico" -#: cps/admin.py:571 +#: cps/admin.py:803 #, python-format msgid "User '%(nick)s' deleted" msgstr "Usuario '%(nick)s' borrado" -#: cps/admin.py:574 +#: cps/admin.py:806 msgid "No admin user remaining, can't delete user" msgstr "No queda ningún usuario administrador, no se puede eliminar usuario" -#: cps/admin.py:612 cps/web.py:1359 +#: cps/admin.py:842 cps/web.py:1361 msgid "Found an existing account for this e-mail address." msgstr "Encontrada una cuenta existente para esa dirección de correo electrónico." -#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1334 +#: cps/admin.py:852 cps/admin.py:867 cps/admin.py:887 cps/web.py:1336 #, python-format msgid "Edit User %(nick)s" msgstr "Editar Usuario %(nick)s" -#: cps/admin.py:622 cps/web.py:1327 +#: cps/admin.py:858 cps/web.py:1328 msgid "This username is already taken" msgstr "" -#: cps/admin.py:637 +#: cps/admin.py:874 #, python-format msgid "User '%(nick)s' updated" msgstr "Usuario '%(nick)s' actualizado" -#: cps/admin.py:640 +#: cps/admin.py:877 msgid "An unknown error occured." msgstr "Ocurrió un error inesperado." -#: cps/admin.py:657 +#: cps/admin.py:900 #, python-format msgid "Password for user %(user)s reset" msgstr "Contraseña para el usuario %(user)s reinicializada" -#: cps/admin.py:660 cps/web.py:1118 cps/web.py:1174 +#: cps/admin.py:903 cps/web.py:1114 cps/web.py:1170 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:663 cps/web.py:1062 +#: cps/admin.py:906 cps/web.py:1055 msgid "Please configure the SMTP mail settings first..." msgstr "Configura primero los parámetros del servidor SMTP..." -#: cps/admin.py:674 +#: cps/admin.py:918 msgid "Logfile viewer" msgstr "Visor del fichero de log" -#: cps/admin.py:710 +#: cps/admin.py:957 msgid "Requesting update package" msgstr "Solicitando paquete de actualización" -#: cps/admin.py:711 +#: cps/admin.py:958 msgid "Downloading update package" msgstr "Descargando paquete de actualización" -#: cps/admin.py:712 +#: cps/admin.py:959 msgid "Unzipping update package" msgstr "Descomprimiendo paquete de actualización" -#: cps/admin.py:713 +#: cps/admin.py:960 msgid "Replacing files" msgstr "Remplazando ficheros" -#: cps/admin.py:714 +#: cps/admin.py:961 msgid "Database connections are closed" msgstr "Los conexiones de base datos están cerradas" -#: cps/admin.py:715 +#: cps/admin.py:962 msgid "Stopping server" msgstr "Parando servidor" -#: cps/admin.py:716 +#: cps/admin.py:963 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:717 cps/admin.py:718 cps/admin.py:719 cps/admin.py:720 +#: cps/admin.py:964 cps/admin.py:965 cps/admin.py:966 cps/admin.py:967 msgid "Update failed:" msgstr "Fallo al actualizar" -#: cps/admin.py:717 cps/updater.py:272 cps/updater.py:457 cps/updater.py:459 +#: cps/admin.py:964 cps/updater.py:282 cps/updater.py:467 cps/updater.py:469 msgid "HTTP Error" msgstr "Error HTTP" -#: cps/admin.py:718 cps/updater.py:274 cps/updater.py:461 +#: cps/admin.py:965 cps/updater.py:284 cps/updater.py:471 msgid "Connection error" msgstr "Error de conexión" -#: cps/admin.py:719 cps/updater.py:276 cps/updater.py:463 +#: cps/admin.py:966 cps/updater.py:286 cps/updater.py:473 msgid "Timeout while establishing connection" msgstr "Tiempo agotado mientras se trataba de establecer la conexión" -#: cps/admin.py:720 cps/updater.py:278 cps/updater.py:465 +#: cps/admin.py:967 cps/updater.py:288 cps/updater.py:475 msgid "General error" msgstr "Error general" @@ -238,10 +247,6 @@ msgstr "Falla al guardar el archivo %(file)s." msgid "File format %(ext)s added to %(book)s" msgstr "Fichero con formato %(ext)s añadido a %(book)s" -#: cps/editbooks.py:376 -msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" -msgstr "La portada no soporta es formato de imagen (jpg/png/webp), no se guardaron cambios" - #: cps/editbooks.py:451 msgid "Cover is not a jpg file, can't save" msgstr "La portada no es un fichero jpg, no se guardaron cambios" @@ -278,30 +283,30 @@ msgstr "Fallo al guardar el archivo %(file)s (permiso denegado)" msgid "Failed to delete file %(file)s (Permission denied)." msgstr "Fallo al borrar el archivo %(file)s (permiso denegado)" -#: cps/editbooks.py:710 +#: cps/editbooks.py:709 #, python-format msgid "File %(file)s uploaded" msgstr "El fichero %(file)s a sido subido" -#: cps/editbooks.py:739 +#: cps/editbooks.py:738 msgid "Source or destination format for conversion missing" msgstr "Falta la fuente o el formato de destino para la conversión" -#: cps/editbooks.py:747 +#: cps/editbooks.py:746 #, 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:751 +#: cps/editbooks.py:750 #, 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:62 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgstr "La instalación de Google Drive no se ha completado, intente desactivar y activar Google Drive nuevamente" -#: cps/gdrive.py:104 +#: cps/gdrive.py:103 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" @@ -391,83 +396,111 @@ msgstr "Fichero %(file)s no encontrado en Google Drive" 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:643 +#: cps/helper.py:511 +msgid "Failed to create path for cover" +msgstr "" + +#: cps/helper.py:516 +msgid "Cover-file is not a valid image file" +msgstr "" + +#: cps/helper.py:519 +msgid "Failed to store cover-file" +msgstr "" + +#: cps/helper.py:530 +msgid "Only jpg/jpeg/png/webp files are supported as coverfile" +msgstr "" + +#: cps/helper.py:544 +msgid "Only jpg/jpeg files are supported as coverfile" +msgstr "" + +#: cps/helper.py:658 msgid "Waiting" msgstr "Esperando" -#: cps/helper.py:645 +#: cps/helper.py:660 msgid "Failed" msgstr "Fallido" -#: cps/helper.py:647 +#: cps/helper.py:662 msgid "Started" msgstr "Comenzado" -#: cps/helper.py:649 +#: cps/helper.py:664 msgid "Finished" msgstr "Finalizado" -#: cps/helper.py:651 +#: cps/helper.py:666 msgid "Unknown Status" msgstr "Estado desconocido" -#: cps/helper.py:656 +#: cps/helper.py:671 msgid "E-mail: " msgstr "E-mail " -#: cps/helper.py:658 cps/helper.py:662 +#: cps/helper.py:673 cps/helper.py:677 msgid "Convert: " msgstr "Convertir: " -#: cps/helper.py:660 +#: cps/helper.py:675 msgid "Upload: " msgstr "Subir: " -#: cps/helper.py:664 +#: cps/helper.py:679 msgid "Unknown Task: " msgstr "Tarea desconocida" -#: cps/oauth_bb.py:75 +#: cps/kobo_auth.py:127 +msgid "PLease access calibre-web from non localhost to get valid api_endpoint for kobo device" +msgstr "" + +#: cps/kobo_auth.py:130 cps/kobo_auth.py:150 +msgid "Kobo Setup" +msgstr "" + +#: cps/oauth_bb.py:74 #, python-format msgid "Register with %(provider)s" msgstr "Registrado con %(provider)s" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:154 msgid "Failed to log in with GitHub." msgstr "Error al iniciar sesión con GitHub." -#: cps/oauth_bb.py:160 +#: cps/oauth_bb.py:159 msgid "Failed to fetch user info from GitHub." msgstr "Error al obtener información de usuario de GitHub." -#: cps/oauth_bb.py:171 +#: cps/oauth_bb.py:170 msgid "Failed to log in with Google." msgstr "Error al iniciar sesión con Google." -#: cps/oauth_bb.py:176 +#: cps/oauth_bb.py:175 msgid "Failed to fetch user info from Google." msgstr "Error al obtener información de usuario de Google." -#: cps/oauth_bb.py:274 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s success." msgstr "Desvinculado de %(oauth)s correctamente." -#: cps/oauth_bb.py:278 +#: cps/oauth_bb.py:277 #, python-format msgid "Unlink to %(oauth)s failed." msgstr "Error al desvincular de %(oauth)s." -#: cps/oauth_bb.py:281 +#: cps/oauth_bb.py:280 #, python-format msgid "Not linked to %(oauth)s." msgstr "No vinculado a %(oauth)s." -#: cps/oauth_bb.py:309 +#: cps/oauth_bb.py:308 msgid "GitHub Oauth error, please retry later." msgstr "Error en GitHub Oauth, por favor vuelva a intentarlo más tarde." -#: cps/oauth_bb.py:328 +#: cps/oauth_bb.py:327 msgid "Google Oauth error, please retry later." msgstr "Error en Google Oauth, por favor vuelva a intentarlo más tarde." @@ -518,403 +551,393 @@ msgstr "Los libros han sido añadidos al estante: %(sname)s" msgid "Could not add books to shelf: %(sname)s" msgstr "No se pudieron agregar libros al estante: %(sname)s" -#: cps/shelf.py:180 +#: cps/shelf.py:181 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "El libro fue eliminado del estante: %(sname)s" -#: cps/shelf.py:186 +#: cps/shelf.py:190 #, 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:207 cps/shelf.py:231 +#: cps/shelf.py:211 cps/shelf.py:235 #, 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:212 +#: cps/shelf.py:216 #, python-format msgid "Shelf %(title)s created" msgstr "Estante %(title)s creado" -#: cps/shelf.py:214 cps/shelf.py:242 +#: cps/shelf.py:218 cps/shelf.py:246 msgid "There was an error" msgstr "Ha sucedido un error" -#: cps/shelf.py:215 cps/shelf.py:217 +#: cps/shelf.py:219 cps/shelf.py:221 msgid "create a shelf" msgstr "crear un estante" -#: cps/shelf.py:240 +#: cps/shelf.py:244 #, python-format msgid "Shelf %(title)s changed" msgstr "Estante %(title)s cambiado" -#: cps/shelf.py:243 cps/shelf.py:245 +#: cps/shelf.py:247 cps/shelf.py:249 msgid "Edit a shelf" msgstr "Editar un estante" -#: cps/shelf.py:289 +#: cps/shelf.py:301 #, python-format msgid "Shelf: '%(name)s'" msgstr "Estante: '%(name)s'" -#: cps/shelf.py:292 +#: cps/shelf.py:304 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:323 +#: cps/shelf.py:342 +msgid "Hidden Book" +msgstr "" + +#: cps/shelf.py:347 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Cambiar orden del estante: '%(name)s'" -#: cps/ub.py:57 +#: cps/ub.py:56 msgid "Recently Added" msgstr "Añadido recientemente" -#: cps/ub.py:59 +#: cps/ub.py:58 msgid "Show recent books" msgstr "Mostrar libros recientes" -#: cps/templates/index.xml:17 cps/ub.py:60 +#: cps/templates/index.xml:17 cps/ub.py:59 msgid "Hot Books" msgstr "Libros populares" -#: cps/ub.py:61 -msgid "Show hot books" +#: cps/ub.py:60 +msgid "Show Hot Books" msgstr "Mostrar libros populares" -#: cps/templates/index.xml:24 cps/ub.py:64 -msgid "Best rated Books" +#: cps/templates/index.xml:24 cps/ub.py:63 cps/web.py:508 +msgid "Top Rated Books" msgstr "Libros mejor valorados" -#: cps/ub.py:66 -msgid "Show best rated books" +#: cps/ub.py:65 +msgid "Show Top Rated Books" msgstr "Mostrar libros mejor valorados" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67 -#: cps/web.py:1011 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:66 +#: cps/web.py:1005 msgid "Read Books" msgstr "Libros leídos" -#: cps/ub.py:69 +#: cps/ub.py:68 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:71 -#: cps/web.py:1015 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:70 +#: cps/web.py:1009 msgid "Unread Books" msgstr "Libros no leídos" -#: cps/ub.py:73 +#: cps/ub.py:72 msgid "Show unread" msgstr "Mostrar no leído" -#: cps/ub.py:74 +#: cps/ub.py:73 msgid "Discover" msgstr "Descubrir" -#: cps/ub.py:76 +#: cps/ub.py:75 msgid "Show random books" msgstr "Mostrar libros al azar" -#: cps/templates/index.xml:75 cps/ub.py:77 +#: cps/templates/index.xml:75 cps/ub.py:76 cps/web.py:787 msgid "Categories" msgstr "Categorías" -#: cps/ub.py:79 +#: cps/ub.py:78 msgid "Show category selection" msgstr "Mostrar selección de categorías" -#: cps/templates/book_edit.html:71 cps/templates/index.xml:82 -#: cps/templates/search_form.html:53 cps/ub.py:80 +#: cps/templates/book_edit.html:69 cps/templates/index.xml:82 +#: cps/templates/search_form.html:53 cps/ub.py:79 cps/web.py:715 msgid "Series" msgstr "Series" -#: cps/ub.py:82 +#: cps/ub.py:81 msgid "Show series selection" msgstr "Mostrar selección de series" -#: cps/templates/index.xml:61 cps/ub.py:83 +#: cps/templates/index.xml:61 cps/ub.py:82 msgid "Authors" msgstr "Autores" -#: cps/ub.py:85 +#: cps/ub.py:84 msgid "Show author selection" msgstr "Mostrar selección de autores" -#: cps/templates/index.xml:68 cps/ub.py:87 +#: cps/templates/index.xml:68 cps/ub.py:86 cps/web.py:699 msgid "Publishers" msgstr "Editoras" -#: cps/ub.py:89 +#: cps/ub.py:88 msgid "Show publisher selection" msgstr "Mostrar selección de editores" -#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:90 +#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:89 +#: cps/web.py:770 msgid "Languages" msgstr "Idioma" -#: cps/ub.py:93 +#: cps/ub.py:92 msgid "Show language selection" msgstr "Mostrar selección de idiomas" -#: cps/ub.py:94 +#: cps/templates/index.xml:96 cps/ub.py:93 msgid "Ratings" msgstr "Calificaciones" -#: cps/ub.py:96 +#: cps/ub.py:95 msgid "Show ratings selection" msgstr "Mostrar selección de calificaciones" -#: cps/templates/index.xml:96 cps/ub.py:97 +#: cps/templates/index.xml:104 cps/ub.py:96 msgid "File formats" msgstr "Formatos de archivo" -#: cps/ub.py:99 +#: cps/ub.py:98 msgid "Show file formats selection" msgstr "Mostrar selección de formatos de archivo" -#: cps/updater.py:252 cps/updater.py:359 cps/updater.py:372 +#: cps/updater.py:262 cps/updater.py:369 cps/updater.py:382 msgid "Unexpected data while reading update information" msgstr "Dato inesperado mientras se leía la información de actualización" -#: cps/updater.py:259 cps/updater.py:365 +#: cps/updater.py:269 cps/updater.py:375 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:285 +#: cps/updater.py:295 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:338 +#: cps/updater.py:348 msgid "Could not fetch update information" msgstr "No se puede conseguir información sobre la actualización" -#: cps/updater.py:352 +#: cps/updater.py:362 msgid "No release information available" msgstr "No hay información del lanzamiento disponible" -#: cps/updater.py:405 cps/updater.py:414 +#: cps/updater.py:415 cps/updater.py:424 #, python-format msgid "A new update is available. Click on the button below to update to version: %(version)s" msgstr "Hay una nueva actualización disponible. Haz clic en el botón de abajo para actualizar a la versión: %(version)s" -#: cps/updater.py:424 +#: cps/updater.py:434 msgid "Click on the button below to update to the latest stable version." msgstr "Haz clic en el botón de abajo para actualizar a la última versión estable." -#: cps/web.py:486 +#: cps/web.py:480 msgid "Recently Added Books" msgstr "Libros añadidos recientemente" -#: cps/web.py:514 -msgid "Best rated books" -msgstr "Libros mejor valorados" - -#: cps/templates/index.xml:38 cps/web.py:522 -msgid "Random Books" -msgstr "Libros al azar" +#: cps/templates/index.html:5 cps/web.py:516 +msgid "Discover (Random Books)" +msgstr "Descubrir (Libros al azar)" -#: cps/web.py:548 +#: cps/web.py:542 msgid "Books" msgstr "Libros" -#: cps/web.py:575 -msgid "Hot Books (most downloaded)" +#: cps/web.py:569 +msgid "Hot Books (Most Downloaded)" msgstr "Libros populares (los más descargados)" -#: cps/web.py:586 cps/web.py:1382 cps/web.py:1478 -msgid "Error opening eBook. File does not exist or file is not accessible:" +#: cps/web.py:580 +msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Error al abrir eBook. El archivo no existe o no es accesible:" -#: cps/web.py:599 +#: cps/web.py:593 #, python-format msgid "Author: %(name)s" msgstr "Autor/es: %(name)s" -#: cps/web.py:611 +#: cps/web.py:605 #, python-format msgid "Publisher: %(name)s" msgstr "Editor/es: " -#: cps/web.py:622 +#: cps/web.py:616 #, python-format msgid "Series: %(serie)s" msgstr "Series: %(serie)s" -#: cps/web.py:633 +#: cps/web.py:627 #, python-format msgid "Rating: %(rating)s stars" msgstr "Calificación: %(rating)s estrellas" -#: cps/web.py:644 +#: cps/web.py:638 #, python-format msgid "File format: %(format)s" msgstr "Formato del fichero: %(format)s" -#: cps/web.py:656 +#: cps/web.py:650 #, python-format msgid "Category: %(name)s" msgstr "Categoría : %(name)s" -#: cps/web.py:673 +#: cps/web.py:667 #, python-format msgid "Language: %(name)s" msgstr "Idioma: %(name)s" -#: cps/web.py:705 -msgid "Publisher list" -msgstr "Lista de editores" - -#: cps/web.py:721 -msgid "Series list" -msgstr "Lista de series" - -#: cps/web.py:735 +#: cps/web.py:729 msgid "Ratings list" msgstr "Lista de calificaciones" -#: cps/web.py:748 +#: cps/web.py:742 msgid "File formats list" msgstr "Lista de formatos" -#: cps/web.py:776 -msgid "Available languages" -msgstr "Idiomas disponibles" - -#: cps/web.py:793 -msgid "Category list" -msgstr "Lista de categorías" - -#: cps/templates/layout.html:73 cps/web.py:807 +#: cps/templates/layout.html:73 cps/templates/tasks.html:7 cps/web.py:801 msgid "Tasks" msgstr "Tareas" -#: cps/templates/feed.xml:33 cps/templates/layout.html:44 -#: cps/templates/layout.html:45 cps/web.py:829 cps/web.py:831 +#: cps/templates/book_edit.html:212 cps/templates/feed.xml:33 +#: cps/templates/layout.html:44 cps/templates/layout.html:47 +#: cps/templates/search_form.html:170 cps/web.py:821 cps/web.py:823 msgid "Search" msgstr "Buscar" -#: cps/web.py:881 +#: cps/web.py:873 msgid "Published after " msgstr "Publicado después de" -#: cps/web.py:888 +#: cps/web.py:880 msgid "Published before " msgstr "Publicado antes de" -#: cps/web.py:902 +#: cps/web.py:894 #, python-format msgid "Rating <= %(rating)s" msgstr "Calificación <= %(rating)s" -#: cps/web.py:904 +#: cps/web.py:896 #, python-format msgid "Rating >= %(rating)s" msgstr "Calificación >= %(rating)s" -#: cps/web.py:970 cps/web.py:982 +#: cps/web.py:962 cps/web.py:976 msgid "search" msgstr "búsqueda" -#: cps/web.py:1067 +#: cps/web.py:1060 #, 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:1071 +#: cps/web.py:1064 #, 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:1073 +#: cps/web.py:1066 msgid "Please configure your kindle e-mail address first..." msgstr "Por favor configure primero la dirección de correo de su kindle..." -#: cps/web.py:1087 +#: cps/web.py:1083 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "" -#: cps/web.py:1088 cps/web.py:1094 cps/web.py:1119 cps/web.py:1123 -#: cps/web.py:1128 cps/web.py:1132 +#: cps/web.py:1084 cps/web.py:1090 cps/web.py:1115 cps/web.py:1119 +#: cps/web.py:1124 cps/web.py:1128 msgid "register" msgstr "registrarse" -#: cps/web.py:1121 +#: cps/web.py:1117 msgid "Your e-mail is not allowed to register" msgstr "Su correo electrónico no está permitido para registrarse" -#: cps/web.py:1124 +#: cps/web.py:1120 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:1127 +#: cps/web.py:1123 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:1144 +#: cps/web.py:1140 msgid "Cannot activate LDAP authentication" msgstr "No se puede activar la autenticación LDAP" -#: cps/web.py:1154 cps/web.py:1281 +#: cps/web.py:1150 cps/web.py:1277 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "Sesión iniciada como : '%(nickname)s'" -#: cps/web.py:1159 +#: cps/web.py:1155 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "No pude entrar a la cuenta. El servidor LDAP está inactivo, por favor contacte a su administrador" -#: cps/web.py:1163 cps/web.py:1186 +#: cps/web.py:1159 cps/web.py:1182 msgid "Wrong Username or Password" msgstr "Usuario o contraseña inválido" -#: cps/web.py:1170 +#: cps/web.py:1166 msgid "New Password was send to your email address" msgstr "" -#: cps/web.py:1176 +#: cps/web.py:1172 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1182 +#: cps/web.py:1178 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Ahora estás conectado como: '%(nickname)s'" -#: cps/web.py:1189 cps/web.py:1213 +#: cps/web.py:1185 cps/web.py:1209 msgid "login" msgstr "Iniciar sesión" -#: cps/web.py:1225 cps/web.py:1259 +#: cps/web.py:1221 cps/web.py:1255 msgid "Token not found" msgstr "Token no encontrado" -#: cps/web.py:1234 cps/web.py:1267 +#: cps/web.py:1230 cps/web.py:1263 msgid "Token has expired" msgstr "El token ha expirado" -#: cps/web.py:1243 +#: cps/web.py:1239 msgid "Success! Please return to your device" msgstr "¡Correcto! Por favor regrese a su dispositivo" -#: cps/web.py:1320 cps/web.py:1363 cps/web.py:1369 +#: cps/web.py:1320 cps/web.py:1365 cps/web.py:1371 #, python-format msgid "%(name)s's profile" msgstr "Perfil de %(name)s" -#: cps/web.py:1365 +#: cps/web.py:1367 msgid "Profile updated" msgstr "Perfil actualizado" -#: cps/web.py:1394 cps/web.py:1397 cps/web.py:1400 cps/web.py:1407 -#: cps/web.py:1412 +#: cps/web.py:1384 cps/web.py:1480 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "" + +#: cps/web.py:1396 cps/web.py:1399 cps/web.py:1402 cps/web.py:1409 +#: cps/web.py:1414 msgid "Read a Book" msgstr "Leer un libro" -#: cps/web.py:1423 +#: cps/web.py:1425 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "Error al abrir el eBook. El archivo no existe o el archivo no es accesible." @@ -929,23 +952,26 @@ msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Kindlegen falló con error %(error)s. Mensaje: %(message)s" #: cps/templates/admin.html:9 -msgid "User list" +msgid "Users" msgstr "Lista de usuarios" -#: cps/templates/admin.html:12 -msgid "Nickname" +#: cps/templates/admin.html:12 cps/templates/login.html:8 +#: cps/templates/login.html:9 cps/templates/register.html:7 +#: cps/templates/user_edit.html:8 +msgid "Username" msgstr "Nickname" -#: cps/templates/admin.html:13 -msgid "E-mail" +#: cps/templates/admin.html:13 cps/templates/register.html:11 +#: cps/templates/user_edit.html:13 +msgid "E-mail Address" msgstr "Correo electrónico" -#: cps/templates/admin.html:14 -msgid "Kindle" +#: cps/templates/admin.html:14 cps/templates/user_edit.html:26 +msgid "Send to Kindle E-mail Address" msgstr "Kindle" #: cps/templates/admin.html:15 -msgid "DLS" +msgid "Downloads" msgstr "DLS" #: cps/templates/admin.html:16 cps/templates/layout.html:76 @@ -959,7 +985,7 @@ msgid "Download" msgstr "Descargar" #: cps/templates/admin.html:18 -msgid "View Ebooks" +msgid "View eBooks" msgstr "Ver libros electrónicos" #: cps/templates/admin.html:19 cps/templates/layout.html:65 @@ -970,28 +996,32 @@ msgstr "Subir archivo" msgid "Edit" msgstr "Editar" +#: cps/templates/admin.html:38 +msgid "Add New User" +msgstr "" + #: cps/templates/admin.html:44 -msgid "SMTP e-mail server settings" +msgid "E-mail Server Settings" msgstr "Ajustes SMTP del servidor de correo electrónico" #: cps/templates/admin.html:47 cps/templates/email_edit.html:11 -msgid "SMTP hostname" +msgid "SMTP Hostname" msgstr "Servidor SMTP" -#: cps/templates/admin.html:48 -msgid "SMTP port" +#: cps/templates/admin.html:48 cps/templates/email_edit.html:15 +msgid "SMTP Port" msgstr "Puerto SMTP" -#: cps/templates/admin.html:49 -msgid "SSL" +#: cps/templates/admin.html:49 cps/templates/email_edit.html:19 +msgid "Encryption" msgstr "SSL" #: cps/templates/admin.html:50 cps/templates/email_edit.html:27 -msgid "SMTP login" +msgid "SMTP Login" msgstr "Login SMTP" -#: cps/templates/admin.html:51 -msgid "From mail" +#: cps/templates/admin.html:51 cps/templates/email_edit.html:35 +msgid "From E-mail" msgstr "Desde el correo" #: cps/templates/admin.html:61 @@ -1003,63 +1033,71 @@ msgid "Configuration" msgstr "Configuración" #: cps/templates/admin.html:70 -msgid "Calibre DB dir" +msgid "Calibre Database Directory" msgstr "Dir DB Calibre" -#: cps/templates/admin.html:74 -msgid "Log level" +#: cps/templates/admin.html:74 cps/templates/config_edit.html:122 +msgid "Log Level" msgstr "Nivel de registro" #: cps/templates/admin.html:78 msgid "Port" msgstr "Puerto" -#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:23 -msgid "Books per page" +#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:27 +msgid "Books per Page" msgstr "Libros por página" #: cps/templates/admin.html:88 -msgid "Uploading" +msgid "Uploads" msgstr "Subiendo" #: cps/templates/admin.html:92 -msgid "Anonymous browsing" +msgid "Anonymous Browsing" msgstr "Navegación anónima" #: cps/templates/admin.html:96 -msgid "Public registration" +msgid "Public Registration" msgstr "Registro público" -#: cps/templates/admin.html:100 cps/templates/remote_login.html:4 -msgid "Remote login" +#: cps/templates/admin.html:100 +msgid "Magic Link Remote Login" msgstr "Inicio de sesión remoto" #: cps/templates/admin.html:104 -msgid "Reverse proxy login" +msgid "Reverse Proxy Login" msgstr "" #: cps/templates/admin.html:109 msgid "Reverse proxy header name" msgstr "" +#: cps/templates/admin.html:114 +msgid "Edit Basic Configuration" +msgstr "" + +#: cps/templates/admin.html:115 +msgid "Edit UI Configuration" +msgstr "" + #: cps/templates/admin.html:121 msgid "Administration" msgstr "Administración" #: cps/templates/admin.html:122 -msgid "View Logfiles" +msgid "View Logs" msgstr "Ver archivos de registro" #: cps/templates/admin.html:123 -msgid "Reconnect to Calibre DB" +msgid "Reconnect Calibre Database" msgstr "Reconectar a la BD Calibre" #: cps/templates/admin.html:124 -msgid "Restart Calibre-Web" +msgid "Restart" msgstr "Reiniciar Calibre-Web" #: cps/templates/admin.html:125 -msgid "Stop Calibre-Web" +msgid "Shutdown" msgstr "Detener Calibre-Web" #: cps/templates/admin.html:131 @@ -1079,7 +1117,7 @@ msgid "Current version" msgstr "Versión actual" #: cps/templates/admin.html:148 -msgid "Check for update" +msgid "Check for Update" msgstr "Comprobar actualizaciones" #: cps/templates/admin.html:149 @@ -1087,30 +1125,29 @@ msgid "Perform Update" msgstr "Realizar actualización" #: cps/templates/admin.html:161 -msgid "Do you really want to restart Calibre-Web?" +msgid "Are you sure you want to restart?" msgstr "¿Realmente quiere reiniciar Calibre-Web?" #: cps/templates/admin.html:166 cps/templates/admin.html:180 #: cps/templates/admin.html:200 cps/templates/shelf.html:72 -msgid "Ok" +msgid "OK" msgstr "Ok" #: cps/templates/admin.html:167 cps/templates/admin.html:181 -#: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 +#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:194 +#: cps/templates/config_edit.html:346 cps/templates/config_view_edit.html:151 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92 -#: cps/templates/layout.html:28 cps/templates/shelf.html:73 -#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32 -#: cps/templates/user_edit.html:131 -msgid "Back" -msgstr "Regresar" +#: cps/templates/shelf.html:73 cps/templates/shelf_edit.html:19 +#: cps/templates/user_edit.html:137 +msgid "Cancel" +msgstr "" #: cps/templates/admin.html:179 -msgid "Do you really want to stop Calibre-Web?" +msgid "Are you sure you want to shutdown?" msgstr "¿Realmente quiere detener Calibre-Web?" #: cps/templates/admin.html:191 -msgid "Updating, please do not reload page" +msgid "Updating, please do not reload this page" msgstr "Actualizando. Por favor, no recargue la página" #: cps/templates/author.html:15 @@ -1137,161 +1174,159 @@ msgstr "reducir" msgid "More by" msgstr "Más de" -#: cps/templates/book_edit.html:12 +#: cps/templates/book_edit.html:10 msgid "Delete Book" msgstr "Borrar libro" -#: cps/templates/book_edit.html:15 +#: cps/templates/book_edit.html:13 msgid "Delete formats:" msgstr "Borrar formatos:" -#: cps/templates/book_edit.html:18 cps/templates/book_edit.html:195 -#: cps/templates/email_edit.html:91 +#: cps/templates/book_edit.html:16 cps/templates/book_edit.html:193 +#: cps/templates/email_edit.html:91 cps/templates/user_edit.html:65 +#: cps/templates/user_edit.html:177 msgid "Delete" msgstr "Borrar" -#: cps/templates/book_edit.html:26 +#: cps/templates/book_edit.html:24 msgid "Convert book format:" msgstr "Convertir formato de libro:" -#: cps/templates/book_edit.html:30 +#: cps/templates/book_edit.html:28 msgid "Convert from:" msgstr "Convertir desde:" -#: cps/templates/book_edit.html:32 cps/templates/book_edit.html:39 +#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:37 msgid "select an option" msgstr "seleccionar una opción" -#: cps/templates/book_edit.html:37 +#: cps/templates/book_edit.html:35 msgid "Convert to:" msgstr "Convertir a:" -#: cps/templates/book_edit.html:46 +#: cps/templates/book_edit.html:44 msgid "Convert book" msgstr "Convertir libro" -#: cps/templates/book_edit.html:55 cps/templates/search_form.html:6 +#: cps/templates/book_edit.html:53 cps/templates/search_form.html:6 msgid "Book Title" msgstr "Título del libro" -#: cps/templates/book_edit.html:59 cps/templates/book_edit.html:255 -#: cps/templates/book_edit.html:273 cps/templates/search_form.html:10 +#: cps/templates/book_edit.html:57 cps/templates/book_edit.html:256 +#: cps/templates/book_edit.html:274 cps/templates/search_form.html:10 msgid "Author" msgstr "Autor" -#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:260 -#: cps/templates/book_edit.html:275 cps/templates/search_form.html:126 +#: cps/templates/book_edit.html:61 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:276 cps/templates/search_form.html:126 msgid "Description" msgstr "Descripción" -#: cps/templates/book_edit.html:67 cps/templates/search_form.html:33 +#: cps/templates/book_edit.html:65 cps/templates/search_form.html:33 msgid "Tags" msgstr "Etiquetas" -#: cps/templates/book_edit.html:75 -msgid "Series id" -msgstr "Id de las series" +#: cps/templates/book_edit.html:73 +msgid "Series ID" +msgstr "" -#: cps/templates/book_edit.html:79 +#: cps/templates/book_edit.html:77 msgid "Rating" msgstr "Clasificación" -#: cps/templates/book_edit.html:83 -msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +#: cps/templates/book_edit.html:81 +msgid "Fetch Cover from URL (JPEG - Image will be downloaded and stored in database)" msgstr "URL de la portada (jpg, la portada es descargada y almacenada en la base de datos, el campo está vacío de nuevo)" -#: cps/templates/book_edit.html:87 -msgid "Upload Cover from local drive" +#: cps/templates/book_edit.html:85 +msgid "Upload Cover from Local Disk" msgstr "Subir portada desde un medio de almacenamiento local" -#: cps/templates/book_edit.html:92 cps/templates/detail.html:165 -msgid "Publishing date" +#: cps/templates/book_edit.html:90 +msgid "Published Date" msgstr "Fecha de publicación" -#: cps/templates/book_edit.html:99 cps/templates/book_edit.html:257 -#: cps/templates/book_edit.html:274 cps/templates/detail.html:156 +#: cps/templates/book_edit.html:97 cps/templates/book_edit.html:258 +#: cps/templates/book_edit.html:275 cps/templates/detail.html:156 #: cps/templates/search_form.html:14 msgid "Publisher" msgstr "Editor" -#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:30 +#: cps/templates/book_edit.html:101 cps/templates/detail.html:123 +#: cps/templates/user_edit.html:31 msgid "Language" msgstr "Idioma" -#: cps/templates/book_edit.html:113 cps/templates/search_form.html:137 +#: cps/templates/book_edit.html:111 cps/templates/search_form.html:137 msgid "Yes" msgstr "Sí" -#: cps/templates/book_edit.html:114 cps/templates/search_form.html:138 +#: cps/templates/book_edit.html:112 cps/templates/search_form.html:138 msgid "No" msgstr "No" -#: cps/templates/book_edit.html:160 -msgid "Upload format" +#: cps/templates/book_edit.html:158 +msgid "Upload Format" msgstr "Subir formato" -#: cps/templates/book_edit.html:169 -msgid "view book after edit" +#: cps/templates/book_edit.html:167 +msgid "View Book on Save" msgstr "ver libro tras la edición" -#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:208 -msgid "Get metadata" +#: cps/templates/book_edit.html:170 cps/templates/book_edit.html:206 +msgid "Fetch Metadata" msgstr "Obtener metadatos" -#: 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:170 cps/templates/shelf_edit.html:17 -#: cps/templates/user_edit.html:129 -msgid "Submit" -msgstr "Enviar" +#: cps/templates/book_edit.html:171 cps/templates/config_edit.html:343 +#: cps/templates/config_view_edit.html:150 cps/templates/email_edit.html:38 +#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:135 +msgid "Save" +msgstr "" -#: cps/templates/book_edit.html:187 +#: cps/templates/book_edit.html:185 msgid "Are you really sure?" msgstr "¿Estás realmente seguro?" -#: cps/templates/book_edit.html:190 -msgid "Book will be deleted from Calibre database" +#: cps/templates/book_edit.html:188 +msgid "This book will be permanently erased from database" msgstr "El libro será eliminado de la base de datos de Calibre" -#: cps/templates/book_edit.html:191 -msgid "and from hard disk" +#: cps/templates/book_edit.html:189 +msgid "and hard disk" msgstr "y del disco duro" -#: cps/templates/book_edit.html:211 +#: cps/templates/book_edit.html:209 msgid "Keyword" msgstr "Palabra clave" -#: cps/templates/book_edit.html:212 +#: cps/templates/book_edit.html:210 msgid " Search keyword " msgstr "Buscar por palabras clave" -#: cps/templates/book_edit.html:214 cps/templates/layout.html:47 -msgid "Go!" -msgstr "¡Vamos!" - -#: cps/templates/book_edit.html:218 +#: cps/templates/book_edit.html:216 msgid "Click the cover to load metadata to the form" msgstr "Haz clic en la portada para cargar los metadatos en el formulario" -#: cps/templates/book_edit.html:230 cps/templates/book_edit.html:270 +#: cps/templates/book_edit.html:231 cps/templates/book_edit.html:271 msgid "Loading..." msgstr "Cargando..." -#: cps/templates/book_edit.html:235 cps/templates/layout.html:192 -#: cps/templates/layout.html:224 +#: cps/templates/book_edit.html:236 cps/templates/layout.html:191 +#: cps/templates/layout.html:223 cps/templates/modal_restriction.html:34 +#: cps/templates/user_edit.html:164 msgid "Close" msgstr "Cerrar" -#: cps/templates/book_edit.html:262 cps/templates/book_edit.html:276 +#: cps/templates/book_edit.html:263 cps/templates/book_edit.html:277 msgid "Source" msgstr "Origen" -#: cps/templates/book_edit.html:271 +#: cps/templates/book_edit.html:272 msgid "Search error!" msgstr "¡Error en la búsqueda!" -#: cps/templates/book_edit.html:272 -msgid "No Result(s) found! Please try aonther keyword." +#: cps/templates/book_edit.html:273 +msgid "No Result(s) found! Please try another keyword." msgstr "¡No se encontraron resultados! Por favor intenta con otra palabra clave." #: cps/templates/config_edit.html:12 @@ -1299,7 +1334,7 @@ msgid "Library Configuration" msgstr "Configuración de la librería" #: cps/templates/config_edit.html:19 -msgid "Location of Calibre database" +msgid "Location of Calibre Database" msgstr "Ubicación de la base de datos de Calibre" #: cps/templates/config_edit.html:25 @@ -1351,7 +1386,7 @@ msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "Ubicación del archivo clave SSL (dejar en blanco si no hay un servidor SSL)" #: cps/templates/config_edit.html:99 -msgid "Update channel" +msgid "Update Channel" msgstr "Actualizar canal" #: cps/templates/config_edit.html:101 @@ -1374,10 +1409,6 @@ msgstr "Nocturno (Automatico)" msgid "Logfile Configuration" msgstr "Configuración del archivo de registro" -#: cps/templates/config_edit.html:122 -msgid "Log Level" -msgstr "Nivel de registro" - #: cps/templates/config_edit.html:131 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)" @@ -1395,255 +1426,271 @@ msgid "Feature Configuration" msgstr "Configuración de características" #: cps/templates/config_edit.html:158 -msgid "Enable uploading" +msgid "Enable Uploads" msgstr "Permitir subida" #: cps/templates/config_edit.html:162 -msgid "Enable anonymous browsing" +msgid "Enable Anonymous Browsing" msgstr "Permitir navegación anónima" #: cps/templates/config_edit.html:166 -msgid "Enable public registration" +msgid "Enable Public Registration" msgstr "Permitir registro público" #: cps/templates/config_edit.html:170 -msgid "Enable remote login (\"magic link\")" +msgid "Enable Magic Link Remote Login" msgstr "Permitir inicio de sesión remoto (\"magic link\")" #: cps/templates/config_edit.html:175 +msgid "Enable Kobo sync" +msgstr "" + +#: cps/templates/config_edit.html:180 +msgid "Proxy unknown requests to Kobo Store" +msgstr "" + +#: cps/templates/config_edit.html:187 msgid "Use Goodreads" msgstr "" -#: cps/templates/config_edit.html:176 -msgid "Obtain an API Key" +#: cps/templates/config_edit.html:188 +msgid "Create an API Key" msgstr "Obtener una API Key" -#: cps/templates/config_edit.html:180 +#: cps/templates/config_edit.html:192 msgid "Goodreads API Key" msgstr "Goodreads API Key" -#: cps/templates/config_edit.html:184 +#: cps/templates/config_edit.html:196 msgid "Goodreads API Secret" msgstr "Goodreads API Secret" -#: cps/templates/config_edit.html:191 +#: cps/templates/config_edit.html:203 msgid "Login type" msgstr "Tipo de inicio de sesión" -#: cps/templates/config_edit.html:193 -msgid "Use standard Authentication" +#: cps/templates/config_edit.html:205 +msgid "Use Standard Authentication" msgstr "Usar autenticación estándar" -#: cps/templates/config_edit.html:195 +#: cps/templates/config_edit.html:207 msgid "Use LDAP Authentication" msgstr "Usar autenticación LDAP" -#: cps/templates/config_edit.html:198 +#: cps/templates/config_edit.html:210 msgid "Use OAuth" msgstr "Usar OAuth" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:217 msgid "LDAP Server Host Name or IP Address" msgstr "Nombre de host o dirección IP del servidor LDAP" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:221 msgid "LDAP Server Port" msgstr "Puerto del servidor LDAP" -#: cps/templates/config_edit.html:213 -msgid "LDAP schema (ldap or ldaps)" +#: cps/templates/config_edit.html:225 +msgid "LDAP Schema (LDAP or LPAPS)" msgstr "Esquema LDAP (ldap o ldaps)" -#: cps/templates/config_edit.html:217 -msgid "LDAP Admin username" +#: cps/templates/config_edit.html:229 +msgid "LDAP Administrator Username" msgstr "Nombre de usuario de administrador LDAP" -#: cps/templates/config_edit.html:221 -msgid "LDAP Admin password" +#: cps/templates/config_edit.html:233 +msgid "LDAP Administrator Password" msgstr "Contraseña de administrador LDAP" -#: cps/templates/config_edit.html:226 -msgid "LDAP Server use SSL" +#: cps/templates/config_edit.html:238 +msgid "LDAP Server Enable SSL" msgstr "Servidor LDAP utiliza SSL" -#: cps/templates/config_edit.html:230 -msgid "LDAP Server use TLS" +#: cps/templates/config_edit.html:242 +msgid "LDAP Server Enable TLS" msgstr "Servidor LDAP utiliza TLS" -#: cps/templates/config_edit.html:234 +#: cps/templates/config_edit.html:246 msgid "LDAP Server Certificate" msgstr "Certificado de servidor LDAP" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:250 msgid "LDAP SSL Certificate Path" msgstr "Certificado SSL de servidor LDAP" -#: cps/templates/config_edit.html:243 +#: cps/templates/config_edit.html:255 msgid "LDAP Distinguished Name (DN)" msgstr "Nombre distinguido LDAP (DN)" -#: cps/templates/config_edit.html:247 -msgid "LDAP User object filter" +#: cps/templates/config_edit.html:259 +msgid "LDAP User Object Filter" msgstr "Filtro de objetos de usuario LDAP" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:264 msgid "LDAP Server is OpenLDAP?" msgstr "¿El servidor LDAP es OpenLDAP?" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:272 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "Obtener la Credencial OAuth de %(proveedor)" -#: cps/templates/config_edit.html:263 +#: cps/templates/config_edit.html:275 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "Id. de cliente de OAuth de %(provider)" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:279 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "Secreto OAuth de Cliente de %(provider)" -#: cps/templates/config_edit.html:276 +#: cps/templates/config_edit.html:288 msgid "Allow Reverse Proxy Authentication" msgstr "" -#: cps/templates/config_edit.html:280 +#: cps/templates/config_edit.html:292 msgid "Reverse Proxy Header Name" msgstr "" -#: cps/templates/config_edit.html:292 +#: cps/templates/config_edit.html:304 msgid "External binaries" msgstr "Binarios externos" -#: cps/templates/config_edit.html:300 -msgid "No converter" +#: cps/templates/config_edit.html:312 +msgid "No Converter" msgstr "No convertir" -#: cps/templates/config_edit.html:302 +#: cps/templates/config_edit.html:314 msgid "Use Kindlegen" msgstr "Utilizar Kindlegen" -#: cps/templates/config_edit.html:304 +#: cps/templates/config_edit.html:316 msgid "Use calibre's ebook converter" msgstr "Utilizar el convertidor de libros de Calibre" -#: cps/templates/config_edit.html:308 +#: cps/templates/config_edit.html:320 msgid "E-Book converter settings" msgstr "Ajustes del convertidos E-Book" -#: cps/templates/config_edit.html:312 +#: cps/templates/config_edit.html:324 msgid "Path to convertertool" msgstr "Ruta para convertertool" -#: cps/templates/config_edit.html:318 +#: cps/templates/config_edit.html:330 msgid "Location of Unrar binary" msgstr "Ubicación del binario de Unrar" -#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 -#: cps/templates/login.html:4 +#: cps/templates/config_edit.html:349 cps/templates/layout.html:84 +#: cps/templates/login.html:4 cps/templates/login.html:20 msgid "Login" msgstr "Inicio de sesión" -#: cps/templates/config_view_edit.html:12 +#: cps/templates/config_view_edit.html:16 msgid "View Configuration" msgstr "Ver configuración" -#: cps/templates/config_view_edit.html:19 cps/templates/shelf_edit.html:7 +#: cps/templates/config_view_edit.html:23 cps/templates/shelf_edit.html:7 msgid "Title" msgstr "Título" -#: cps/templates/config_view_edit.html:27 -msgid "No. of random books to show" +#: cps/templates/config_view_edit.html:31 +msgid "No. of Random Books to Display" msgstr "Número de libros aleatorios a mostrar" -#: cps/templates/config_view_edit.html:31 -msgid "No. of authors to show before hiding (0=disable hiding)" +#: cps/templates/config_view_edit.html:35 +msgid "No. of Authors to Display Before Hiding (0=Disable Hiding)" msgstr "Número de autores para mostrar antes de ocultar (0 = desactivar la ocultación)" -#: cps/templates/config_view_edit.html:35 cps/templates/readcbr.html:112 +#: cps/templates/config_view_edit.html:39 cps/templates/readcbr.html:112 msgid "Theme" msgstr "Tema" -#: cps/templates/config_view_edit.html:37 +#: cps/templates/config_view_edit.html:41 msgid "Standard Theme" msgstr "Tema estándar" -#: cps/templates/config_view_edit.html:38 +#: cps/templates/config_view_edit.html:42 msgid "caliBlur! Dark Theme" msgstr "caliBlur! Tema Oscuro" -#: cps/templates/config_view_edit.html:42 -msgid "Regular expression for ignoring columns" +#: cps/templates/config_view_edit.html:46 +msgid "Regular Expression for Ignoring Columns" msgstr "Expresión regular para ignorar columnas" -#: cps/templates/config_view_edit.html:46 -msgid "Link read/unread status to Calibre column" +#: cps/templates/config_view_edit.html:50 +msgid "Link Read/Unread Status to Calibre Column" msgstr "Enlace del estado de la columna de Calibre de leído/sin leer" -#: cps/templates/config_view_edit.html:55 -msgid "Regular expression for title sorting" -msgstr "Expresión regular para ordenar títulos" - #: cps/templates/config_view_edit.html:59 -msgid "Tags for Mature Content" -msgstr "Etiquetas para contenido para adultos" +msgid "View Restrictions based on Calibre column" +msgstr "" + +#: cps/templates/config_view_edit.html:61 cps/templates/email_edit.html:21 +msgid "None" +msgstr "Ninguno" + +#: cps/templates/config_view_edit.html:68 +msgid "Regular Expression for Title Sorting" +msgstr "Expresión regular para ordenar títulos" -#: cps/templates/config_view_edit.html:73 -msgid "Default settings for new users" +#: cps/templates/config_view_edit.html:80 +msgid "Default Settings for New Users" msgstr "Ajustes por defecto para nuevos usuarios" -#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:82 -msgid "Admin user" +#: cps/templates/config_view_edit.html:88 cps/templates/user_edit.html:92 +msgid "Admin User" msgstr "Usuario administrador" -#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:91 +#: cps/templates/config_view_edit.html:92 cps/templates/user_edit.html:97 msgid "Allow Downloads" msgstr "Permitir descargas" -#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:95 -msgid "Allow book viewer" +#: cps/templates/config_view_edit.html:96 cps/templates/user_edit.html:101 +msgid "Allow eBook Viewer" msgstr "Permitir visor de libros" -#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:99 +#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:105 msgid "Allow Uploads" msgstr "Permitir subidas de archivos" -#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:103 +#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:109 msgid "Allow Edit" msgstr "Permitir editar" -#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 -msgid "Allow Delete books" -msgstr "Permitir eliminar libros" +#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:113 +msgid "Allow Delete Books" +msgstr "" -#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:112 +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:118 msgid "Allow Changing Password" msgstr "Permitir cambiar la contraseña" -#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:116 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:122 msgid "Allow Editing Public Shelfs" msgstr "Permitir editar estantes públicos" -#: cps/templates/config_view_edit.html:119 -msgid "Default visibilities for new users" +#: cps/templates/config_view_edit.html:126 +msgid "Default Visibilities for New Users" msgstr "Visibilidad predeterminada para nuevos usuarios" -#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:74 -msgid "Show random books in detail view" +#: cps/templates/config_view_edit.html:142 +msgid "Show Random Books in Detail View" msgstr "Mostrar libros aleatorios con vista detallada" -#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:87 -msgid "Show mature content" -msgstr "Mostrar contenido para adulto" +#: cps/templates/config_view_edit.html:144 +msgid "Add Allowed/Denied Tags" +msgstr "" + +#: cps/templates/config_view_edit.html:145 +msgid "Add Allowed/Denied custom column values" +msgstr "" #: cps/templates/detail.html:59 -msgid "Read in browser" +msgid "Read in Browser" msgstr "Ver en el navegador" #: cps/templates/detail.html:72 -msgid "Listen in browser" +msgid "Listen in Browser" msgstr "Escuchar en el navegador" #: cps/templates/detail.html:117 @@ -1654,9 +1701,9 @@ msgstr "Libro" msgid "of" msgstr "de" -#: cps/templates/detail.html:123 -msgid "language" -msgstr "idioma" +#: cps/templates/detail.html:165 +msgid "Published" +msgstr "" #: cps/templates/detail.html:200 msgid "Mark As Unread" @@ -1679,47 +1726,27 @@ msgid "Add to shelf" msgstr "Agregar al estante" #: cps/templates/detail.html:286 -msgid "Edit metadata" +msgid "Edit Metadata" msgstr "Editar metadatos" -#: cps/templates/email_edit.html:15 -msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" -msgstr "Puerto SMTP (por lo general 25 para SMTP plano, 465 para SSL y 587 para STARTTLS)" - -#: cps/templates/email_edit.html:19 -msgid "Encryption" -msgstr "Cifrado" - -#: cps/templates/email_edit.html:21 -msgid "None" -msgstr "Ninguno" - #: cps/templates/email_edit.html:22 msgid "STARTTLS" -msgstr "STATRTTLS" +msgstr "STARTTLS" #: cps/templates/email_edit.html:23 msgid "SSL/TLS" msgstr "SSL/TLS" #: cps/templates/email_edit.html:31 -msgid "SMTP password" +msgid "SMTP Password" msgstr "Contraseña SMTP" -#: cps/templates/email_edit.html:35 -msgid "From e-mail" -msgstr "Desde el correo electrónico" - -#: cps/templates/email_edit.html:38 -msgid "Save settings" -msgstr "Guardar ajustes" - #: cps/templates/email_edit.html:39 -msgid "Save settings and send Test E-Mail" +msgid "Save and Send Test E-mail" msgstr "Guardar ajustes y enviar un correo electrónico de prueba" #: cps/templates/email_edit.html:43 -msgid "Allowed domains for registering" +msgid "Allowed Domains (Whitelist)" msgstr "Permitir dominios para registrarse" #: cps/templates/email_edit.html:46 cps/templates/email_edit.html:72 @@ -1735,29 +1762,29 @@ msgid "Enter domainname" msgstr "Introducir nombre de dominio" #: cps/templates/email_edit.html:60 -msgid "Denied domains for registering" +msgid "Denied Domains (Blacklist)" msgstr "" #: cps/templates/email_edit.html:90 -msgid "Do you really want to delete this domain rule?" +msgid "Are you sure you want to delete this domain?" msgstr "¿Realmente quiere eliminar esta regla de dominio?" -#: cps/templates/feed.xml:21 cps/templates/layout.html:176 +#: cps/templates/feed.xml:21 cps/templates/layout.html:175 msgid "Next" msgstr "Siguiente" -#: cps/templates/http_error.html:37 -msgid "Create issue" +#: cps/templates/generate_kobo_auth_url.html:5 +msgid "Open the .kobo/Kobo eReader.conf file in a text editor and add (or edit):" +msgstr "" + +#: cps/templates/http_error.html:38 +msgid "Create Issue" msgstr "Abrir una incidencia" -#: cps/templates/http_error.html:44 -msgid "Back to home" +#: cps/templates/http_error.html:45 +msgid "Return to Home" msgstr "Volver al inicio" -#: cps/templates/index.html:5 -msgid "Discover (Random Books)" -msgstr "Descubrir (Libros al azar)" - #: cps/templates/index.html:64 msgid "Group by series" msgstr "Grupo por serie" @@ -1782,7 +1809,11 @@ msgstr "" msgid "The latest Books" msgstr "Libros recientes" -#: cps/templates/index.xml:42 +#: cps/templates/index.xml:38 +msgid "Random Books" +msgstr "Libros al azar" + +#: cps/templates/index.xml:42 cps/templates/user_edit.html:80 msgid "Show Random Books" msgstr "Mostrar libros al azar" @@ -1807,22 +1838,26 @@ msgid "Books ordered by Languages" msgstr "" #: cps/templates/index.xml:100 +msgid "Books ordered by Rating" +msgstr "" + +#: cps/templates/index.xml:108 msgid "Books ordered by file formats" msgstr "" -#: cps/templates/index.xml:103 cps/templates/layout.html:137 +#: cps/templates/index.xml:111 cps/templates/layout.html:136 msgid "Public Shelves" msgstr "Estantes públicos" -#: cps/templates/index.xml:107 +#: cps/templates/index.xml:115 msgid "Books organized in public shelfs, visible to everyone" msgstr "Libros organizados en estantes públicos, visibles para todo el mundo" -#: cps/templates/index.xml:111 cps/templates/layout.html:141 +#: cps/templates/index.xml:119 cps/templates/layout.html:140 msgid "Your Shelves" msgstr "Sus estantes" -#: cps/templates/index.xml:115 +#: cps/templates/index.xml:123 msgid "User's own shelfs, only visible to the current user himself" msgstr "Los estantes propios del usuario, solo visibles para el propio usuario actual" @@ -1830,10 +1865,19 @@ msgstr "Los estantes propios del usuario, solo visibles para el propio usuario a msgid "Home" msgstr "Inicio" +#: cps/templates/layout.html:28 cps/templates/shelf_order.html:32 +#: cps/templates/user_edit.html:178 +msgid "Back" +msgstr "Regresar" + #: cps/templates/layout.html:34 -msgid "Toggle navigation" +msgid "Toggle Navigation" msgstr "Alternar navegación" +#: cps/templates/layout.html:45 +msgid "Search Library" +msgstr "" + #: cps/templates/layout.html:55 msgid "Advanced Search" msgstr "Búsqueda avanzada" @@ -1855,74 +1899,101 @@ msgstr "Cerrar sesión" msgid "Register" msgstr "Registro" -#: cps/templates/layout.html:116 cps/templates/layout.html:223 +#: cps/templates/layout.html:116 cps/templates/layout.html:222 msgid "Uploading..." msgstr "Cargando..." #: cps/templates/layout.html:117 -msgid "please don't refresh the page" -msgstr "por favor no recargue la página" +msgid "Please do not refresh the page" +msgstr "" #: cps/templates/layout.html:127 msgid "Browse" msgstr "Navegar" -#: cps/templates/layout.html:146 +#: cps/templates/layout.html:145 msgid "Create a Shelf" msgstr "Crear un estante" -#: cps/templates/layout.html:147 cps/templates/stats.html:3 +#: cps/templates/layout.html:146 cps/templates/stats.html:3 msgid "About" msgstr "Acerca de" -#: cps/templates/layout.html:161 +#: cps/templates/layout.html:160 msgid "Previous" msgstr "Previo" -#: cps/templates/layout.html:188 +#: cps/templates/layout.html:187 msgid "Book Details" msgstr "Detalles del libro" -#: cps/templates/layout.html:222 +#: cps/templates/layout.html:221 msgid "Upload done, processing, please wait..." msgstr "Carga hecha, procesando, por favor espere ..." -#: cps/templates/layout.html:225 +#: cps/templates/layout.html:224 msgid "Error" msgstr "Error" -#: cps/templates/login.html:8 cps/templates/login.html:9 -#: cps/templates/register.html:7 cps/templates/user_edit.html:8 -msgid "Username" -msgstr "Nombre de usuario" - #: cps/templates/login.html:12 cps/templates/login.html:13 #: cps/templates/user_edit.html:21 msgid "Password" msgstr "Contraseña" #: cps/templates/login.html:17 -msgid "Remember me" +msgid "Remember Me" msgstr "Recordarme" #: cps/templates/login.html:22 -msgid "Forgot password" +msgid "Forgot Password?" msgstr "" #: cps/templates/login.html:25 -msgid "Log in with magic link" +msgid "Log in with Magic Link" msgstr "Iniciar sesión con \"magic link\"" -#: cps/templates/logviewer.html:5 -msgid "Show Calibre-Web log" -msgstr "Mostrar registro de Calibre-Web" +#: cps/templates/logviewer.html:6 +msgid "Show Calibre-Web Log: " +msgstr "" #: cps/templates/logviewer.html:8 -msgid "Show access log" -msgstr "Mostrar registro de acceso" +msgid "Calibre-Web Log: " +msgstr "" + +#: cps/templates/logviewer.html:8 +msgid "Stream output, can't be displayed" +msgstr "" + +#: cps/templates/logviewer.html:12 +msgid "Show Access Log: " +msgstr "" + +#: cps/templates/modal_restriction.html:6 +msgid "Select allowed/denied Tags" +msgstr "" + +#: cps/templates/modal_restriction.html:7 +msgid "Select allowed/denied Custom Column values" +msgstr "" + +#: cps/templates/modal_restriction.html:8 +msgid "Select allowed/denied Tags of user" +msgstr "" + +#: cps/templates/modal_restriction.html:9 +msgid "Select allowed/denied Custom Column values of user" +msgstr "" + +#: cps/templates/modal_restriction.html:15 +msgid "Enter Tag" +msgstr "" + +#: cps/templates/modal_restriction.html:24 +msgid "Add View Restriction" +msgstr "" #: cps/templates/osd.xml:5 -msgid "Calibre-Web ebook catalog" +msgid "Calibre-Web eBook Catalog" msgstr "Cátalogo de ebook de Calibre-Web" #: cps/templates/read.html:74 @@ -2034,51 +2105,51 @@ msgid "Basic txt Reader" msgstr "Lector básico de txt" #: cps/templates/register.html:4 -msgid "Register a new account" +msgid "Register New Account" msgstr "Registre una cuenta nueva" #: cps/templates/register.html:8 msgid "Choose a username" msgstr "Escoger un nombre de usuario" -#: cps/templates/register.html:11 cps/templates/user_edit.html:13 -msgid "E-mail address" -msgstr "Dirección de correo electrónico" - #: cps/templates/register.html:12 msgid "Your email address" msgstr "Tu dirección de correo" +#: cps/templates/remote_login.html:4 +msgid "Magic Link - Authorise New Device" +msgstr "" + #: cps/templates/remote_login.html:6 -msgid "Use your other device, login and visit " +msgid "On another device, login and visit:" msgstr "Utiliza tu otro dispositivo, inicia sesión y visita" -#: cps/templates/remote_login.html:9 -msgid "Once you do so, you will automatically get logged in on this device." +#: cps/templates/remote_login.html:10 +msgid "Once verified, you will automatically be logged in on this device." msgstr "Una vez que lo realice, iniciará sesión automáticamente en ese dispositivo." -#: cps/templates/remote_login.html:12 -msgid "The link will expire after 10 minutes." +#: cps/templates/remote_login.html:13 +msgid "This verification link will expire in 10 minutes." msgstr "El enlace expirará después de 10 minutos." #: cps/templates/search.html:5 -msgid "No Results for:" -msgstr "Sin resultados para:" +msgid "No Results Found" +msgstr "" #: cps/templates/search.html:6 -msgid "Please try a different search" -msgstr "Intente una búsqueda diferente" +msgid "Search Term:" +msgstr "" #: cps/templates/search.html:8 msgid "Results for:" msgstr "Resultados para:" #: cps/templates/search_form.html:19 -msgid "Publishing date from" +msgid "Published Date From" msgstr "Fecha de publicación desde" #: cps/templates/search_form.html:26 -msgid "Publishing date to" +msgid "Published Date To" msgstr "Fecha de publicación hasta" #: cps/templates/search_form.html:43 @@ -2102,11 +2173,11 @@ msgid "Exclude Extensions" msgstr "" #: cps/templates/search_form.html:117 -msgid "Rating bigger than" +msgid "Rating Above" msgstr "Clasificación mayor que" #: cps/templates/search_form.html:121 -msgid "Rating less than" +msgid "Rating Below" msgstr "Clasificación menor que" #: cps/templates/shelf.html:10 @@ -2122,23 +2193,23 @@ msgid "Change order" msgstr "Cambiar orden" #: cps/templates/shelf.html:67 -msgid "Do you really want to delete the shelf?" +msgid "Are you sure you want to delete this shelf?" msgstr "¿Realmente quiere eliminar este estante?" #: cps/templates/shelf.html:70 -msgid "Shelf will be lost for everybody and forever!" +msgid "Shelf will be deleted for all users" msgstr "¡El estante se perderá para todo el mundo y para siempre!" #: cps/templates/shelf_edit.html:13 -msgid "should the shelf be public?" +msgid "Share with Everyone" msgstr "¿Hacer público el estante?" #: cps/templates/shelf_order.html:5 -msgid "Drag 'n drop to rearrange order" +msgid "Drag to Rearrange Order" msgstr "Pinchar y arrastrar para reordenar" #: cps/templates/stats.html:7 -msgid "Calibre library statistics" +msgid "Library Statistics" msgstr "Estadísticas de la Biblioteca" #: cps/templates/stats.html:12 @@ -2158,21 +2229,17 @@ msgid "Series in this Library" msgstr "Series en esta biblioteca" #: cps/templates/stats.html:28 -msgid "Linked libraries" +msgid "Linked Libraries" msgstr "Bibliotecas vinculadas" #: cps/templates/stats.html:32 -msgid "Program library" +msgid "Program Library" msgstr "Bibliotecas del programa" #: cps/templates/stats.html:33 msgid "Installed Version" msgstr "Versión instalada" -#: cps/templates/tasks.html:7 -msgid "Tasks list" -msgstr "Lista de tareas" - #: cps/templates/tasks.html:12 msgid "User" msgstr "Usuario" @@ -2190,11 +2257,11 @@ msgid "Progress" msgstr "Progreso" #: cps/templates/tasks.html:17 -msgid "Runtime" +msgid "Run Time" msgstr "Tiempo de ejecución" #: cps/templates/tasks.html:18 -msgid "Starttime" +msgid "Start Time" msgstr "Fecha de inicio" #: cps/templates/tasks.html:24 @@ -2209,38 +2276,58 @@ msgstr "Ocultar todas las tareas" msgid "Reset user Password" msgstr "Resetear contraseña de usuario" -#: cps/templates/user_edit.html:26 -msgid "Kindle E-Mail" -msgstr "Correo del Kindle" - -#: cps/templates/user_edit.html:39 -msgid "Show books with language" +#: cps/templates/user_edit.html:41 +msgid "Language of Books" msgstr "Mostrar libros con idioma" -#: cps/templates/user_edit.html:41 -msgid "Show all" +#: cps/templates/user_edit.html:43 +msgid "Show All" msgstr "Mostrar todo" -#: cps/templates/user_edit.html:51 +#: cps/templates/user_edit.html:52 msgid "OAuth Settings" msgstr "Ajustes OAuth" -#: cps/templates/user_edit.html:53 +#: cps/templates/user_edit.html:54 msgid "Link" msgstr "Vincular" -#: cps/templates/user_edit.html:55 +#: cps/templates/user_edit.html:56 msgid "Unlink" msgstr "Desvincular" -#: cps/templates/user_edit.html:123 -msgid "Delete this user" +#: cps/templates/user_edit.html:62 +msgid "Kobo Sync Token" +msgstr "" + +#: cps/templates/user_edit.html:64 +msgid "Create/View" +msgstr "" + +#: cps/templates/user_edit.html:83 +msgid "Add allowed/denied Tags" +msgstr "" + +#: cps/templates/user_edit.html:84 +msgid "Add allowed/denied custom column values" +msgstr "" + +#: cps/templates/user_edit.html:129 +msgid "Delete User" msgstr "Borrar este usuario" -#: cps/templates/user_edit.html:138 +#: cps/templates/user_edit.html:144 msgid "Recent Downloads" msgstr "Descargas recientes" +#: cps/templates/user_edit.html:160 +msgid "Generate Kobo Auth URL" +msgstr "" + +#: cps/templates/user_edit.html:176 +msgid "Do you really want to delete the Kobo Token?" +msgstr "" + #~ msgid "%s: %s" #~ msgstr "%s: %s" @@ -2487,3 +2574,87 @@ msgstr "Descargas recientes" #~ msgid "New Books" #~ msgstr "Libros nuevos" +#~ msgid "Show Calibre-Web log" +#~ msgstr "Mostrar registro de Calibre-Web" + +#~ msgid "Show access log" +#~ msgstr "Mostrar registro de acceso" + +#~ msgid "Tags for Mature Content" +#~ msgstr "Etiquetas para contenido para adultos" + +#~ msgid "Show mature content" +#~ msgstr "Mostrar contenido para adulto" + +#~ msgid "deny" +#~ msgstr "" + +#~ msgid "allow" +#~ msgstr "" + +#~ msgid "Kobo Set-up" +#~ msgstr "" + +#~ msgid "Publisher list" +#~ msgstr "Lista de editores" + +#~ msgid "Series list" +#~ msgstr "Lista de series" + +#~ msgid "Available languages" +#~ msgstr "Idiomas disponibles" + +#~ msgid "Category list" +#~ msgstr "Lista de categorías" + +#~ msgid "Series id" +#~ msgstr "Id de las series" + +#~ msgid "Submit" +#~ msgstr "Enviar" + +#~ msgid "Go!" +#~ msgstr "¡Vamos!" + +#~ msgid "Allow Delete books" +#~ msgstr "Permitir eliminar libros" + +#~ msgid "language" +#~ msgstr "idioma" + +#~ msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" +#~ msgstr "Puerto SMTP (por lo general 25 para SMTP plano, 465 para SSL y 587 para STARTTLS)" + +#~ msgid "From e-mail" +#~ msgstr "Desde el correo electrónico" + +#~ msgid "Save settings" +#~ msgstr "Guardar ajustes" + +#~ msgid "api_endpoint=" +#~ msgstr "" + +#~ msgid "please don't refresh the page" +#~ msgstr "por favor no recargue la página" + +#~ msgid "E-mail address" +#~ msgstr "Dirección de correo electrónico" + +#~ msgid "No Results for:" +#~ msgstr "Sin resultados para:" + +#~ msgid "Please try a different search" +#~ msgstr "Intente una búsqueda diferente" + +#~ msgid "Tasks list" +#~ msgstr "Lista de tareas" + +#~ msgid "Kindle E-Mail" +#~ msgstr "Correo del Kindle" + +#~ msgid "Please note that every visit to this current page invalidates any previously generated Authentication url for this user." +#~ msgstr "" + +#~ msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" +#~ msgstr "La portada no soporta es formato de imagen (jpg/png/webp), no se guardaron cambios" + diff --git a/cps/translations/fi/LC_MESSAGES/messages.mo b/cps/translations/fi/LC_MESSAGES/messages.mo index 705aa0cb..16117163 100644 Binary files a/cps/translations/fi/LC_MESSAGES/messages.mo and b/cps/translations/fi/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/fi/LC_MESSAGES/messages.po b/cps/translations/fi/LC_MESSAGES/messages.po index 8bd72393..121dcd41 100644 --- a/cps/translations/fi/LC_MESSAGES/messages.po +++ b/cps/translations/fi/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: 2020-01-12 13:57+0100\n" +"POT-Creation-Date: 2020-03-12 20:31+0100\n" "PO-Revision-Date: 2020-01-12 13:56+0100\n" "Last-Translator: Samuli Valavuo \n" "Language: fi\n" @@ -16,7 +16,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.7.0\n" +"Generated-By: Babel 2.8.0\n" #: cps/about.py:42 msgid "installed" @@ -26,7 +26,7 @@ msgstr "asennettu" msgid "not installed" msgstr "ei asennettu" -#: cps/about.py:84 +#: cps/about.py:87 msgid "Statistics" msgstr "Tilastot" @@ -40,7 +40,7 @@ msgstr "Palvelinta sammutetaan, ole hyvä ja sulje sivu" #: cps/admin.py:110 cps/editbooks.py:410 cps/editbooks.py:419 #: cps/editbooks.py:539 cps/editbooks.py:541 cps/editbooks.py:594 -#: cps/updater.py:446 cps/uploader.py:97 cps/uploader.py:108 +#: cps/updater.py:456 cps/uploader.py:96 cps/uploader.py:107 msgid "Unknown" msgstr "Tuntematon" @@ -48,155 +48,164 @@ msgstr "Tuntematon" msgid "Admin page" msgstr "Ylläpitosivu" -#: cps/admin.py:148 cps/templates/admin.html:115 +#: cps/admin.py:151 msgid "UI Configuration" msgstr "Käyttöliittymän asetukset" -#: cps/admin.py:185 cps/admin.py:412 +#: cps/admin.py:187 cps/admin.py:637 msgid "Calibre-Web configuration updated" msgstr "Calibre-Web asetukset päivitetty" -#: cps/admin.py:442 cps/templates/admin.html:114 +#: cps/admin.py:434 cps/admin.py:440 cps/admin.py:451 cps/admin.py:462 +#: cps/templates/modal_restriction.html:29 +msgid "Deny" +msgstr "" + +#: cps/admin.py:436 cps/admin.py:442 cps/admin.py:453 cps/admin.py:464 +#: cps/templates/modal_restriction.html:28 +msgid "Allow" +msgstr "" + +#: cps/admin.py:667 msgid "Basic Configuration" msgstr "Perusasetukset" -#: cps/admin.py:465 cps/web.py:1093 +#: cps/admin.py:691 cps/web.py:1089 msgid "Please fill out all fields!" msgstr "Ole hyvä ja täytä kaikki kentät!" -#: cps/admin.py:467 cps/admin.py:478 cps/admin.py:484 cps/admin.py:499 -#: cps/templates/admin.html:38 +#: cps/admin.py:694 cps/admin.py:706 cps/admin.py:712 cps/admin.py:730 msgid "Add new user" msgstr "Lisää uusi käyttäjä" -#: cps/admin.py:476 cps/web.py:1318 +#: cps/admin.py:703 cps/web.py:1318 msgid "E-mail is not from valid domain" msgstr "Sähköpostiosoite ei ole toimivasta domainista" -#: cps/admin.py:482 cps/admin.py:493 +#: cps/admin.py:710 cps/admin.py:725 msgid "Found an existing account for this e-mail address or nickname." msgstr "Tälle sähköpostiosoitteelle tai tunnukselle löytyi jo tili." -#: cps/admin.py:489 +#: cps/admin.py:721 #, python-format msgid "User '%(user)s' created" msgstr "Käyttäjä '%(user)s' lisätty" -#: cps/admin.py:509 +#: cps/admin.py:740 msgid "Edit e-mail server settings" msgstr "Muuta sähköpostipalvelimen asetuksia" -#: cps/admin.py:535 +#: cps/admin.py:766 #, python-format msgid "Test e-mail successfully send to %(kindlemail)s" msgstr "Testisähköposti lähetetty onnistuneesti osoitteeseen %(kindlemail)s" -#: cps/admin.py:538 +#: cps/admin.py:769 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Testisähköpostin lähetyksessä tapahtui virhe: %(res)s" -#: cps/admin.py:540 +#: cps/admin.py:771 msgid "Please configure your e-mail address first..." msgstr "" -#: cps/admin.py:542 +#: cps/admin.py:773 msgid "E-mail server settings updated" msgstr "Sähköpostipalvelimen tiedot päivitetty" -#: cps/admin.py:571 +#: cps/admin.py:803 #, python-format msgid "User '%(nick)s' deleted" msgstr "Käyttäjä '%(nick)s' poistettu" -#: cps/admin.py:574 +#: cps/admin.py:806 msgid "No admin user remaining, can't delete user" msgstr "Pääkäyttäjiä ei jää jäljelle, käyttäjää ei voi poistaa" -#: cps/admin.py:612 cps/web.py:1359 +#: cps/admin.py:842 cps/web.py:1361 msgid "Found an existing account for this e-mail address." msgstr "Tälle sähköpostiosoitteelle läytyi jo käyttäjätunnus." -#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1334 +#: cps/admin.py:852 cps/admin.py:867 cps/admin.py:887 cps/web.py:1336 #, python-format msgid "Edit User %(nick)s" msgstr "Muokkaa käyttäjää %(nick)s" -#: cps/admin.py:622 cps/web.py:1327 +#: cps/admin.py:858 cps/web.py:1328 msgid "This username is already taken" msgstr "" -#: cps/admin.py:637 +#: cps/admin.py:874 #, python-format msgid "User '%(nick)s' updated" msgstr "Käyttäjä '%(nick)s' päivitetty" -#: cps/admin.py:640 +#: cps/admin.py:877 msgid "An unknown error occured." msgstr "Tapahtui tuntematon virhe." -#: cps/admin.py:657 +#: cps/admin.py:900 #, python-format msgid "Password for user %(user)s reset" msgstr "Käyttäjän %(user)s salasana palautettu" -#: cps/admin.py:660 cps/web.py:1118 cps/web.py:1174 +#: cps/admin.py:903 cps/web.py:1114 cps/web.py:1170 msgid "An unknown error occurred. Please try again later." msgstr "Tapahtui tuntematon virhe. Yritä myöhemmin uudelleen." -#: cps/admin.py:663 cps/web.py:1062 +#: cps/admin.py:906 cps/web.py:1055 msgid "Please configure the SMTP mail settings first..." msgstr "Ole hyvä ja aseta SMTP postiasetukset ensin..." -#: cps/admin.py:674 +#: cps/admin.py:918 msgid "Logfile viewer" msgstr "Lokitiedoston katselin" -#: cps/admin.py:710 +#: cps/admin.py:957 msgid "Requesting update package" msgstr "Haetaan päivitystiedostoa" -#: cps/admin.py:711 +#: cps/admin.py:958 msgid "Downloading update package" msgstr "Ladataan päivitystiedostoa" -#: cps/admin.py:712 +#: cps/admin.py:959 msgid "Unzipping update package" msgstr "Puretaan päivitystiedostoa" -#: cps/admin.py:713 +#: cps/admin.py:960 msgid "Replacing files" msgstr "Korvataan tiedostoja" -#: cps/admin.py:714 +#: cps/admin.py:961 msgid "Database connections are closed" msgstr "Tietokantayhteydet on katkaistu" -#: cps/admin.py:715 +#: cps/admin.py:962 msgid "Stopping server" msgstr "Sammutetaan palvelin" -#: cps/admin.py:716 +#: cps/admin.py:963 msgid "Update finished, please press okay and reload page" msgstr "Päivitys valmistui, ole hyvä ja paina OK ja lataa sivu uudelleen" -#: cps/admin.py:717 cps/admin.py:718 cps/admin.py:719 cps/admin.py:720 +#: cps/admin.py:964 cps/admin.py:965 cps/admin.py:966 cps/admin.py:967 msgid "Update failed:" msgstr "Päivitys epäonnistui:" -#: cps/admin.py:717 cps/updater.py:272 cps/updater.py:457 cps/updater.py:459 +#: cps/admin.py:964 cps/updater.py:282 cps/updater.py:467 cps/updater.py:469 msgid "HTTP Error" msgstr "HTTP virhe" -#: cps/admin.py:718 cps/updater.py:274 cps/updater.py:461 +#: cps/admin.py:965 cps/updater.py:284 cps/updater.py:471 msgid "Connection error" msgstr "Yhteysvirhe" -#: cps/admin.py:719 cps/updater.py:276 cps/updater.py:463 +#: cps/admin.py:966 cps/updater.py:286 cps/updater.py:473 msgid "Timeout while establishing connection" msgstr "Aikakatkaisu yhteyttä luotaessa" -#: cps/admin.py:720 cps/updater.py:278 cps/updater.py:465 +#: cps/admin.py:967 cps/updater.py:288 cps/updater.py:475 msgid "General error" msgstr "Yleinen virhe" @@ -236,10 +245,6 @@ msgstr "Tiedoston %(file)s tallennus epäonnistui." msgid "File format %(ext)s added to %(book)s" msgstr "Tiedostoformaatti %(ext)s lisätty %(book)s" -#: cps/editbooks.py:376 -msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" -msgstr "Kansi ei ole sallitussa tiedostomuodossa (jpg/png/webp), tallennus ei onnistu" - #: cps/editbooks.py:451 msgid "Cover is not a jpg file, can't save" msgstr "Kansi ei ole jpg tiedosto, tallennus ei onnistu" @@ -276,30 +281,30 @@ msgstr "Tiedoston %(file)s tallentamisessa tapahtui virhe (Ei oikeutta)." msgid "Failed to delete file %(file)s (Permission denied)." msgstr "Tiedoston %(file)s poisto epäonnistui (Ei oikeutta)." -#: cps/editbooks.py:710 +#: cps/editbooks.py:709 #, python-format msgid "File %(file)s uploaded" msgstr "Tiedosto %(file)s tallennettu" -#: cps/editbooks.py:739 +#: cps/editbooks.py:738 msgid "Source or destination format for conversion missing" msgstr "Lähteen tai kohteen tiedostomuoto puuttuu" -#: cps/editbooks.py:747 +#: cps/editbooks.py:746 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Kirja lisätty muutosjonoon muotoon %(book_format)s" -#: cps/editbooks.py:751 +#: cps/editbooks.py:750 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Kirjan muunnoksessa tapahtui virhe: %(res)s" -#: cps/gdrive.py:62 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgstr "Google Drive asetukset ei ole valmiit. Koita poistaa Google Drive käytöstä ja ottaa se uudelleen käyttöön" -#: cps/gdrive.py:104 +#: cps/gdrive.py:103 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Paluuosoitteen domain ei ole varmistettu, seuraa ohjeita vamistaaksesi sen googlen kehittäjäkonsolissa" @@ -389,83 +394,111 @@ msgstr "Tiedostoa %(file)s ei löytynyt Google Drivesta" msgid "Book path %(path)s not found on Google Drive" msgstr "Kirjan polkua %(path)s ei löytynyt Google Drivesta" -#: cps/helper.py:643 +#: cps/helper.py:511 +msgid "Failed to create path for cover" +msgstr "" + +#: cps/helper.py:516 +msgid "Cover-file is not a valid image file" +msgstr "" + +#: cps/helper.py:519 +msgid "Failed to store cover-file" +msgstr "" + +#: cps/helper.py:530 +msgid "Only jpg/jpeg/png/webp files are supported as coverfile" +msgstr "" + +#: cps/helper.py:544 +msgid "Only jpg/jpeg files are supported as coverfile" +msgstr "" + +#: cps/helper.py:658 msgid "Waiting" msgstr "Odottaa" -#: cps/helper.py:645 +#: cps/helper.py:660 msgid "Failed" msgstr "Epäonnistui" -#: cps/helper.py:647 +#: cps/helper.py:662 msgid "Started" msgstr "Aloitettu" -#: cps/helper.py:649 +#: cps/helper.py:664 msgid "Finished" msgstr "Valmistui" -#: cps/helper.py:651 +#: cps/helper.py:666 msgid "Unknown Status" msgstr "Tuntematon tila" -#: cps/helper.py:656 +#: cps/helper.py:671 msgid "E-mail: " msgstr "Sähköposti: " -#: cps/helper.py:658 cps/helper.py:662 +#: cps/helper.py:673 cps/helper.py:677 msgid "Convert: " msgstr "Muunna: " -#: cps/helper.py:660 +#: cps/helper.py:675 msgid "Upload: " msgstr "Lähetä: " -#: cps/helper.py:664 +#: cps/helper.py:679 msgid "Unknown Task: " msgstr "Tuntematon tehtävä: " -#: cps/oauth_bb.py:75 +#: cps/kobo_auth.py:127 +msgid "PLease access calibre-web from non localhost to get valid api_endpoint for kobo device" +msgstr "" + +#: cps/kobo_auth.py:130 cps/kobo_auth.py:150 +msgid "Kobo Setup" +msgstr "" + +#: cps/oauth_bb.py:74 #, python-format msgid "Register with %(provider)s" msgstr "Rekisteröi tuottajalle %(provider)s" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:154 msgid "Failed to log in with GitHub." msgstr "GitHubiin kirjautuminen epäonnistui." -#: cps/oauth_bb.py:160 +#: cps/oauth_bb.py:159 msgid "Failed to fetch user info from GitHub." msgstr "Käyttäjätietojen haku GitHubista epäonnistui" -#: cps/oauth_bb.py:171 +#: cps/oauth_bb.py:170 msgid "Failed to log in with Google." msgstr "Googleen kirjautuminen epäonnistui." -#: cps/oauth_bb.py:176 +#: cps/oauth_bb.py:175 msgid "Failed to fetch user info from Google." msgstr "Käyttäjätietojen haku Googlesta epäonnistui." -#: cps/oauth_bb.py:274 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s success." msgstr "Linkityksen purku kohteesta %(oauth)s onnistui." -#: cps/oauth_bb.py:278 +#: cps/oauth_bb.py:277 #, python-format msgid "Unlink to %(oauth)s failed." msgstr "Linkityksen purku kohteesta %(oauth)s epäonnistui." -#: cps/oauth_bb.py:281 +#: cps/oauth_bb.py:280 #, python-format msgid "Not linked to %(oauth)s." msgstr "Ei linkitetty kohteeseen %(oauth)s." -#: cps/oauth_bb.py:309 +#: cps/oauth_bb.py:308 msgid "GitHub Oauth error, please retry later." msgstr "GitHub Oauth virhe, yritä myöhemmin uudelleen." -#: cps/oauth_bb.py:328 +#: cps/oauth_bb.py:327 msgid "Google Oauth error, please retry later." msgstr "Google Oauth virhe, yritä myöhemmin uudelleen." @@ -516,403 +549,393 @@ msgstr "Kirjat on lisätty hyllyyn: %(sname)s" msgid "Could not add books to shelf: %(sname)s" msgstr "Kirjojen lisäys hyllyyn: %(sname)s epäonnistui" -#: cps/shelf.py:180 +#: cps/shelf.py:181 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "Kirja on poistettu hyllystä: %(sname)s" -#: cps/shelf.py:186 +#: cps/shelf.py:190 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "Valitettavsti sinulla ei ole oikeutta poistaa kirjaa hyllystä: %(sname)s" -#: cps/shelf.py:207 cps/shelf.py:231 +#: cps/shelf.py:211 cps/shelf.py:235 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "'%(title)s' niminen hylly on jo olemassa." -#: cps/shelf.py:212 +#: cps/shelf.py:216 #, python-format msgid "Shelf %(title)s created" msgstr "Hylly %(title)s luotu" -#: cps/shelf.py:214 cps/shelf.py:242 +#: cps/shelf.py:218 cps/shelf.py:246 msgid "There was an error" msgstr "Tapahtui virhe" -#: cps/shelf.py:215 cps/shelf.py:217 +#: cps/shelf.py:219 cps/shelf.py:221 msgid "create a shelf" msgstr "luo hylly" -#: cps/shelf.py:240 +#: cps/shelf.py:244 #, python-format msgid "Shelf %(title)s changed" msgstr "Hylly %(title)s muutettu" -#: cps/shelf.py:243 cps/shelf.py:245 +#: cps/shelf.py:247 cps/shelf.py:249 msgid "Edit a shelf" msgstr "Muokkaa hyllyä" -#: cps/shelf.py:289 +#: cps/shelf.py:301 #, python-format msgid "Shelf: '%(name)s'" msgstr "Hylly: '%(name)s'" -#: cps/shelf.py:292 +#: cps/shelf.py:304 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Virhe hyllyn avauksessa. Hyllyä ei ole tai se ei ole saatavilla" -#: cps/shelf.py:323 +#: cps/shelf.py:342 +msgid "Hidden Book" +msgstr "" + +#: cps/shelf.py:347 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Muuta hyllyn: '%(name)s' järjestystä" -#: cps/ub.py:57 +#: cps/ub.py:56 msgid "Recently Added" msgstr "Viimeksi lisätty" -#: cps/ub.py:59 +#: cps/ub.py:58 msgid "Show recent books" msgstr "Näytä viimeisimmät kirjat" -#: cps/templates/index.xml:17 cps/ub.py:60 +#: cps/templates/index.xml:17 cps/ub.py:59 msgid "Hot Books" msgstr "Kuumat kirjat" -#: cps/ub.py:61 -msgid "Show hot books" +#: cps/ub.py:60 +msgid "Show Hot Books" msgstr "Näytä kuumat kirjat" -#: cps/templates/index.xml:24 cps/ub.py:64 -msgid "Best rated Books" +#: cps/templates/index.xml:24 cps/ub.py:63 cps/web.py:508 +msgid "Top Rated Books" msgstr "Parhaiten arvioidut kirjat" -#: cps/ub.py:66 -msgid "Show best rated books" +#: cps/ub.py:65 +msgid "Show Top Rated Books" msgstr "Näytä parhaiten arvioidut kirjat" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67 -#: cps/web.py:1011 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:66 +#: cps/web.py:1005 msgid "Read Books" msgstr "Luetut kirjat" -#: cps/ub.py:69 +#: cps/ub.py:68 msgid "Show read and unread" msgstr "Näytä luetut ja lukemattomat" -#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71 -#: cps/web.py:1015 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:70 +#: cps/web.py:1009 msgid "Unread Books" msgstr "Lukemattomat kirjat" -#: cps/ub.py:73 +#: cps/ub.py:72 msgid "Show unread" msgstr "Näyt lukemattomat" -#: cps/ub.py:74 +#: cps/ub.py:73 msgid "Discover" msgstr "Löydä" -#: cps/ub.py:76 +#: cps/ub.py:75 msgid "Show random books" msgstr "Näytä satunnaisia kirjoja" -#: cps/templates/index.xml:75 cps/ub.py:77 +#: cps/templates/index.xml:75 cps/ub.py:76 cps/web.py:787 msgid "Categories" msgstr "Kategoriat" -#: cps/ub.py:79 +#: cps/ub.py:78 msgid "Show category selection" msgstr "Näytä kategoriavalinta" -#: cps/templates/book_edit.html:71 cps/templates/index.xml:82 -#: cps/templates/search_form.html:53 cps/ub.py:80 +#: cps/templates/book_edit.html:69 cps/templates/index.xml:82 +#: cps/templates/search_form.html:53 cps/ub.py:79 cps/web.py:715 msgid "Series" msgstr "Sarjat" -#: cps/ub.py:82 +#: cps/ub.py:81 msgid "Show series selection" msgstr "Näytä sarjavalinta" -#: cps/templates/index.xml:61 cps/ub.py:83 +#: cps/templates/index.xml:61 cps/ub.py:82 msgid "Authors" msgstr "Kirjailijat" -#: cps/ub.py:85 +#: cps/ub.py:84 msgid "Show author selection" msgstr "Näytä kirjailijavalinta" -#: cps/templates/index.xml:68 cps/ub.py:87 +#: cps/templates/index.xml:68 cps/ub.py:86 cps/web.py:699 msgid "Publishers" msgstr "Julkaisijat" -#: cps/ub.py:89 +#: cps/ub.py:88 msgid "Show publisher selection" msgstr "Näytä julkaisijavalinta" -#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:90 +#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:89 +#: cps/web.py:770 msgid "Languages" msgstr "Kielet" -#: cps/ub.py:93 +#: cps/ub.py:92 msgid "Show language selection" msgstr "Näytä keilivalinta" -#: cps/ub.py:94 +#: cps/templates/index.xml:96 cps/ub.py:93 msgid "Ratings" msgstr "Arvostelut" -#: cps/ub.py:96 +#: cps/ub.py:95 msgid "Show ratings selection" msgstr "Näytä arvosteluvalinta" -#: cps/templates/index.xml:96 cps/ub.py:97 +#: cps/templates/index.xml:104 cps/ub.py:96 msgid "File formats" msgstr "Tiedotomuodot" -#: cps/ub.py:99 +#: cps/ub.py:98 msgid "Show file formats selection" msgstr "Näytä tiedostomuotovalinta" -#: cps/updater.py:252 cps/updater.py:359 cps/updater.py:372 +#: cps/updater.py:262 cps/updater.py:369 cps/updater.py:382 msgid "Unexpected data while reading update information" msgstr "Odottamatonta tietoa luettaessa päivitystietoa" -#: cps/updater.py:259 cps/updater.py:365 +#: cps/updater.py:269 cps/updater.py:375 msgid "No update available. You already have the latest version installed" msgstr "Ei päivitystä saatavilla. Sinulla on jo uusin versio" -#: cps/updater.py:285 +#: cps/updater.py:295 msgid "A new update is available. Click on the button below to update to the latest version." msgstr "Uusi päivitys saatavilla. Paina alla olevaa nappia päivittääksesi uusimpaan versioon." -#: cps/updater.py:338 +#: cps/updater.py:348 msgid "Could not fetch update information" msgstr "Päivitystiedon hakeminen epäonnistui" -#: cps/updater.py:352 +#: cps/updater.py:362 msgid "No release information available" msgstr "Ei päivitystietoa saatavilla" -#: cps/updater.py:405 cps/updater.py:414 +#: cps/updater.py:415 cps/updater.py:424 #, python-format msgid "A new update is available. Click on the button below to update to version: %(version)s" msgstr "Uusi päivitys saatavilla. Paina alla olevaa nappia päivittääksesi versioon: %(version)s" -#: cps/updater.py:424 +#: cps/updater.py:434 msgid "Click on the button below to update to the latest stable version." msgstr "Paina alla olevaa nappia päivittääksesi uusimpaan vakaaseen versioon." -#: cps/web.py:486 +#: cps/web.py:480 msgid "Recently Added Books" msgstr "Viimeksi lisätyt kirjat" -#: cps/web.py:514 -msgid "Best rated books" -msgstr "Parhaiksi arvostellut kirjat" - -#: cps/templates/index.xml:38 cps/web.py:522 -msgid "Random Books" -msgstr "Satunnaisia kirjoja" +#: cps/templates/index.html:5 cps/web.py:516 +msgid "Discover (Random Books)" +msgstr "Löydä (satunnaiset kirjat)" -#: cps/web.py:548 +#: cps/web.py:542 msgid "Books" msgstr "Kirjat" -#: cps/web.py:575 -msgid "Hot Books (most downloaded)" +#: cps/web.py:569 +msgid "Hot Books (Most Downloaded)" msgstr "Kuumat kirjat (ladatuimmat)" -#: cps/web.py:586 cps/web.py:1382 cps/web.py:1478 -msgid "Error opening eBook. File does not exist or file is not accessible:" +#: cps/web.py:580 +msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Virhe eKirjan avaamisessa. Tiedostoa ei ole tai se ei ole saatavilla:" -#: cps/web.py:599 +#: cps/web.py:593 #, python-format msgid "Author: %(name)s" msgstr "Kirjailija: %(name)s" -#: cps/web.py:611 +#: cps/web.py:605 #, python-format msgid "Publisher: %(name)s" msgstr "Julkaisija: %(name)s" -#: cps/web.py:622 +#: cps/web.py:616 #, python-format msgid "Series: %(serie)s" msgstr "Sarja: %(serie)s" -#: cps/web.py:633 +#: cps/web.py:627 #, python-format msgid "Rating: %(rating)s stars" msgstr "Arvostelu: %(rating)s tähteä" -#: cps/web.py:644 +#: cps/web.py:638 #, python-format msgid "File format: %(format)s" msgstr "Tiedostomuoto: %(format)s" -#: cps/web.py:656 +#: cps/web.py:650 #, python-format msgid "Category: %(name)s" msgstr "Kategoria: %(name)s" -#: cps/web.py:673 +#: cps/web.py:667 #, python-format msgid "Language: %(name)s" msgstr "Kieli: %(name)s" -#: cps/web.py:705 -msgid "Publisher list" -msgstr "Julkaisjalistaus" - -#: cps/web.py:721 -msgid "Series list" -msgstr "Sarjalistaus" - -#: cps/web.py:735 +#: cps/web.py:729 msgid "Ratings list" msgstr "Arvostelulistaus" -#: cps/web.py:748 +#: cps/web.py:742 msgid "File formats list" msgstr "Tiedostomuotolistaus" -#: cps/web.py:776 -msgid "Available languages" -msgstr "Tillgängliga språk" - -#: cps/web.py:793 -msgid "Category list" -msgstr "Kategorilista" - -#: cps/templates/layout.html:73 cps/web.py:807 +#: cps/templates/layout.html:73 cps/templates/tasks.html:7 cps/web.py:801 msgid "Tasks" msgstr "Tehtävät" -#: cps/templates/feed.xml:33 cps/templates/layout.html:44 -#: cps/templates/layout.html:45 cps/web.py:829 cps/web.py:831 +#: cps/templates/book_edit.html:212 cps/templates/feed.xml:33 +#: cps/templates/layout.html:44 cps/templates/layout.html:47 +#: cps/templates/search_form.html:170 cps/web.py:821 cps/web.py:823 msgid "Search" msgstr "Hae" -#: cps/web.py:881 +#: cps/web.py:873 msgid "Published after " msgstr "Julkaistu alkaen " -#: cps/web.py:888 +#: cps/web.py:880 msgid "Published before " msgstr "Julkaisut ennen " -#: cps/web.py:902 +#: cps/web.py:894 #, python-format msgid "Rating <= %(rating)s" msgstr "Arvostelu <= %(rating)s" -#: cps/web.py:904 +#: cps/web.py:896 #, python-format msgid "Rating >= %(rating)s" msgstr "Arvostelu >= %(rating)s" -#: cps/web.py:970 cps/web.py:982 +#: cps/web.py:962 cps/web.py:976 msgid "search" msgstr "hae" -#: cps/web.py:1067 +#: cps/web.py:1060 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Kirja lisätty onnistuneeksi lähetettäväksi osoitteeseen %(kindlemail)s" -#: cps/web.py:1071 +#: cps/web.py:1064 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "Kirjan: %(res)s lähettämisessa tapahtui virhe" -#: cps/web.py:1073 +#: cps/web.py:1066 msgid "Please configure your kindle e-mail address first..." msgstr "Ole hyvä ja aseta Kindle sähköpostiosoite ensin..." -#: cps/web.py:1087 +#: cps/web.py:1083 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "" -#: cps/web.py:1088 cps/web.py:1094 cps/web.py:1119 cps/web.py:1123 -#: cps/web.py:1128 cps/web.py:1132 +#: cps/web.py:1084 cps/web.py:1090 cps/web.py:1115 cps/web.py:1119 +#: cps/web.py:1124 cps/web.py:1128 msgid "register" msgstr "rekisteröidy" -#: cps/web.py:1121 +#: cps/web.py:1117 msgid "Your e-mail is not allowed to register" msgstr "Sähköpostiosoitteellasi ei ole sallittua rekisteröityä" -#: cps/web.py:1124 +#: cps/web.py:1120 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Vahvistusviesti on lähetetty sähköpostiosoitteeseesi." -#: cps/web.py:1127 +#: cps/web.py:1123 msgid "This username or e-mail address is already in use." msgstr "Käyttäjätunnus tai sähköpostiosoite on jo käytössä." -#: cps/web.py:1144 +#: cps/web.py:1140 msgid "Cannot activate LDAP authentication" msgstr "LDAP autnetikoinnin aktivointi ei onnistu" -#: cps/web.py:1154 cps/web.py:1281 +#: cps/web.py:1150 cps/web.py:1277 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "olet nyt kirjautunut tunnuksella: \"%(nickname)s\"" -#: cps/web.py:1159 +#: cps/web.py:1155 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "Kirjautuminen epäonnistui. LDAP palvelin alhaalla, ot yhteyttä ylläpitoon" -#: cps/web.py:1163 cps/web.py:1186 +#: cps/web.py:1159 cps/web.py:1182 msgid "Wrong Username or Password" msgstr "Väärä käyttäjätunnus tai salasana" -#: cps/web.py:1170 +#: cps/web.py:1166 msgid "New Password was send to your email address" msgstr "" -#: cps/web.py:1176 +#: cps/web.py:1172 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1182 +#: cps/web.py:1178 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "olet kirjautunut tunnuksella: '%(nickname)s'" -#: cps/web.py:1189 cps/web.py:1213 +#: cps/web.py:1185 cps/web.py:1209 msgid "login" msgstr "kirjaudu" -#: cps/web.py:1225 cps/web.py:1259 +#: cps/web.py:1221 cps/web.py:1255 msgid "Token not found" msgstr "Valtuutusta ei löytynyt" -#: cps/web.py:1234 cps/web.py:1267 +#: cps/web.py:1230 cps/web.py:1263 msgid "Token has expired" msgstr "Valtuutus vanhentunut" -#: cps/web.py:1243 +#: cps/web.py:1239 msgid "Success! Please return to your device" msgstr "Onnistui! Ole hyvä ja palaa laitteellesi" -#: cps/web.py:1320 cps/web.py:1363 cps/web.py:1369 +#: cps/web.py:1320 cps/web.py:1365 cps/web.py:1371 #, python-format msgid "%(name)s's profile" msgstr "%(name)sn profiili" -#: cps/web.py:1365 +#: cps/web.py:1367 msgid "Profile updated" msgstr "Profiili päivitetty" -#: cps/web.py:1394 cps/web.py:1397 cps/web.py:1400 cps/web.py:1407 -#: cps/web.py:1412 +#: cps/web.py:1384 cps/web.py:1480 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "" + +#: cps/web.py:1396 cps/web.py:1399 cps/web.py:1402 cps/web.py:1409 +#: cps/web.py:1414 msgid "Read a Book" msgstr "Lue kirja" -#: cps/web.py:1423 +#: cps/web.py:1425 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "Virhe kirjan avaamisessa. Tiedostoa ei ole tai se ei ole saatavilla." @@ -927,23 +950,26 @@ msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Kindlegen epäonnistui virheeseen %(error)s. Viesti: %(message)s" #: cps/templates/admin.html:9 -msgid "User list" +msgid "Users" msgstr "Käyttäjälista" -#: cps/templates/admin.html:12 -msgid "Nickname" +#: cps/templates/admin.html:12 cps/templates/login.html:8 +#: cps/templates/login.html:9 cps/templates/register.html:7 +#: cps/templates/user_edit.html:8 +msgid "Username" msgstr "Lempinimi" -#: cps/templates/admin.html:13 -msgid "E-mail" +#: cps/templates/admin.html:13 cps/templates/register.html:11 +#: cps/templates/user_edit.html:13 +msgid "E-mail Address" msgstr "Sähköposti" -#: cps/templates/admin.html:14 -msgid "Kindle" +#: cps/templates/admin.html:14 cps/templates/user_edit.html:26 +msgid "Send to Kindle E-mail Address" msgstr "Kindle" #: cps/templates/admin.html:15 -msgid "DLS" +msgid "Downloads" msgstr "DLS" #: cps/templates/admin.html:16 cps/templates/layout.html:76 @@ -957,7 +983,7 @@ msgid "Download" msgstr "Lataa" #: cps/templates/admin.html:18 -msgid "View Ebooks" +msgid "View eBooks" msgstr "Näytä ekirjat" #: cps/templates/admin.html:19 cps/templates/layout.html:65 @@ -968,28 +994,32 @@ msgstr "Lähetä" msgid "Edit" msgstr "Muokkaa" +#: cps/templates/admin.html:38 +msgid "Add New User" +msgstr "" + #: cps/templates/admin.html:44 -msgid "SMTP e-mail server settings" +msgid "E-mail Server Settings" msgstr "SMTP sähköpostipalvelimen asetukset" #: cps/templates/admin.html:47 cps/templates/email_edit.html:11 -msgid "SMTP hostname" +msgid "SMTP Hostname" msgstr "SMTP palvein" -#: cps/templates/admin.html:48 -msgid "SMTP port" +#: cps/templates/admin.html:48 cps/templates/email_edit.html:15 +msgid "SMTP Port" msgstr "SMTP portti" -#: cps/templates/admin.html:49 -msgid "SSL" +#: cps/templates/admin.html:49 cps/templates/email_edit.html:19 +msgid "Encryption" msgstr "SSL" #: cps/templates/admin.html:50 cps/templates/email_edit.html:27 -msgid "SMTP login" +msgid "SMTP Login" msgstr "SMTP tunnus" -#: cps/templates/admin.html:51 -msgid "From mail" +#: cps/templates/admin.html:51 cps/templates/email_edit.html:35 +msgid "From E-mail" msgstr "Lähettäjän sähköposti" #: cps/templates/admin.html:61 @@ -1001,63 +1031,71 @@ msgid "Configuration" msgstr "Asetukset" #: cps/templates/admin.html:70 -msgid "Calibre DB dir" +msgid "Calibre Database Directory" msgstr "Calibre DB hakemisto" -#: cps/templates/admin.html:74 -msgid "Log level" +#: cps/templates/admin.html:74 cps/templates/config_edit.html:122 +msgid "Log Level" msgstr "Lokitaso" #: cps/templates/admin.html:78 msgid "Port" msgstr "Portti" -#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:23 -msgid "Books per page" +#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:27 +msgid "Books per Page" msgstr "Kirjaa sivulla" #: cps/templates/admin.html:88 -msgid "Uploading" +msgid "Uploads" msgstr "Lähetetään" #: cps/templates/admin.html:92 -msgid "Anonymous browsing" +msgid "Anonymous Browsing" msgstr "Nimetön selaus" #: cps/templates/admin.html:96 -msgid "Public registration" +msgid "Public Registration" msgstr "Julkinen rekisteröinti" -#: cps/templates/admin.html:100 cps/templates/remote_login.html:4 -msgid "Remote login" +#: cps/templates/admin.html:100 +msgid "Magic Link Remote Login" msgstr "Etäkirjautuminen" #: cps/templates/admin.html:104 -msgid "Reverse proxy login" +msgid "Reverse Proxy Login" msgstr "" #: cps/templates/admin.html:109 msgid "Reverse proxy header name" msgstr "" +#: cps/templates/admin.html:114 +msgid "Edit Basic Configuration" +msgstr "" + +#: cps/templates/admin.html:115 +msgid "Edit UI Configuration" +msgstr "" + #: cps/templates/admin.html:121 msgid "Administration" msgstr "Ylläpito" #: cps/templates/admin.html:122 -msgid "View Logfiles" +msgid "View Logs" msgstr "Katsele lokitiedostoja" #: cps/templates/admin.html:123 -msgid "Reconnect to Calibre DB" +msgid "Reconnect Calibre Database" msgstr "Uudelleenyhdistä Calibre DB" #: cps/templates/admin.html:124 -msgid "Restart Calibre-Web" +msgid "Restart" msgstr "Uudellenkäynnistä Calibre-Web" #: cps/templates/admin.html:125 -msgid "Stop Calibre-Web" +msgid "Shutdown" msgstr "Sammuta Calibre-Web" #: cps/templates/admin.html:131 @@ -1077,7 +1115,7 @@ msgid "Current version" msgstr "Nykyinen versio" #: cps/templates/admin.html:148 -msgid "Check for update" +msgid "Check for Update" msgstr "Tarkista päivitykset" #: cps/templates/admin.html:149 @@ -1085,30 +1123,29 @@ msgid "Perform Update" msgstr "Päivitä" #: cps/templates/admin.html:161 -msgid "Do you really want to restart Calibre-Web?" +msgid "Are you sure you want to restart?" msgstr "Haluatko varmasti uudelleenkäynnistää Calibre-Webin?" #: cps/templates/admin.html:166 cps/templates/admin.html:180 #: cps/templates/admin.html:200 cps/templates/shelf.html:72 -msgid "Ok" +msgid "OK" msgstr "Ok" #: cps/templates/admin.html:167 cps/templates/admin.html:181 -#: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 +#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:194 +#: cps/templates/config_edit.html:346 cps/templates/config_view_edit.html:151 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92 -#: cps/templates/layout.html:28 cps/templates/shelf.html:73 -#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32 -#: cps/templates/user_edit.html:131 -msgid "Back" -msgstr "Palaa" +#: cps/templates/shelf.html:73 cps/templates/shelf_edit.html:19 +#: cps/templates/user_edit.html:137 +msgid "Cancel" +msgstr "" #: cps/templates/admin.html:179 -msgid "Do you really want to stop Calibre-Web?" +msgid "Are you sure you want to shutdown?" msgstr "Haluatko varmasti pysäyttää Calibre-Webin?" #: cps/templates/admin.html:191 -msgid "Updating, please do not reload page" +msgid "Updating, please do not reload this page" msgstr "Päivitetään, älä päivitä sivua" #: cps/templates/author.html:15 @@ -1135,161 +1172,159 @@ msgstr "vähennä" msgid "More by" msgstr "Enemmän" -#: cps/templates/book_edit.html:12 +#: cps/templates/book_edit.html:10 msgid "Delete Book" msgstr "Poista kirja" -#: cps/templates/book_edit.html:15 +#: cps/templates/book_edit.html:13 msgid "Delete formats:" msgstr "Poista tiedostomuodot:" -#: cps/templates/book_edit.html:18 cps/templates/book_edit.html:195 -#: cps/templates/email_edit.html:91 +#: cps/templates/book_edit.html:16 cps/templates/book_edit.html:193 +#: cps/templates/email_edit.html:91 cps/templates/user_edit.html:65 +#: cps/templates/user_edit.html:177 msgid "Delete" msgstr "Poista" -#: cps/templates/book_edit.html:26 +#: cps/templates/book_edit.html:24 msgid "Convert book format:" msgstr "Muunna kirjan tiedostomuoto:" -#: cps/templates/book_edit.html:30 +#: cps/templates/book_edit.html:28 msgid "Convert from:" msgstr "Muunna muodosta:" -#: cps/templates/book_edit.html:32 cps/templates/book_edit.html:39 +#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:37 msgid "select an option" msgstr "valitse vaihtoehto" -#: cps/templates/book_edit.html:37 +#: cps/templates/book_edit.html:35 msgid "Convert to:" msgstr "Muunna muotoon:" -#: cps/templates/book_edit.html:46 +#: cps/templates/book_edit.html:44 msgid "Convert book" msgstr "Muunna kirja" -#: cps/templates/book_edit.html:55 cps/templates/search_form.html:6 +#: cps/templates/book_edit.html:53 cps/templates/search_form.html:6 msgid "Book Title" msgstr "Kirjan otsikko" -#: cps/templates/book_edit.html:59 cps/templates/book_edit.html:255 -#: cps/templates/book_edit.html:273 cps/templates/search_form.html:10 +#: cps/templates/book_edit.html:57 cps/templates/book_edit.html:256 +#: cps/templates/book_edit.html:274 cps/templates/search_form.html:10 msgid "Author" msgstr "Kirjailija" -#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:260 -#: cps/templates/book_edit.html:275 cps/templates/search_form.html:126 +#: cps/templates/book_edit.html:61 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:276 cps/templates/search_form.html:126 msgid "Description" msgstr "Kuvaus" -#: cps/templates/book_edit.html:67 cps/templates/search_form.html:33 +#: cps/templates/book_edit.html:65 cps/templates/search_form.html:33 msgid "Tags" msgstr "Tunnisteet" -#: cps/templates/book_edit.html:75 -msgid "Series id" -msgstr "Sarja-id" +#: cps/templates/book_edit.html:73 +msgid "Series ID" +msgstr "" -#: cps/templates/book_edit.html:79 +#: cps/templates/book_edit.html:77 msgid "Rating" msgstr "Arvostelu" -#: cps/templates/book_edit.html:83 -msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +#: cps/templates/book_edit.html:81 +msgid "Fetch Cover from URL (JPEG - Image will be downloaded and stored in database)" msgstr "Kannen osoite (jpg, kuva ladataan ja tallennetaan tietokantaan, kenttä jää uudelleen tyhjäksi)" -#: cps/templates/book_edit.html:87 -msgid "Upload Cover from local drive" +#: cps/templates/book_edit.html:85 +msgid "Upload Cover from Local Disk" msgstr "Lataa kuva paikalliselta levyltä" -#: cps/templates/book_edit.html:92 cps/templates/detail.html:165 -msgid "Publishing date" +#: cps/templates/book_edit.html:90 +msgid "Published Date" msgstr "Julkaisupäivä" -#: cps/templates/book_edit.html:99 cps/templates/book_edit.html:257 -#: cps/templates/book_edit.html:274 cps/templates/detail.html:156 +#: cps/templates/book_edit.html:97 cps/templates/book_edit.html:258 +#: cps/templates/book_edit.html:275 cps/templates/detail.html:156 #: cps/templates/search_form.html:14 msgid "Publisher" msgstr "Julkaisija" -#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:30 +#: cps/templates/book_edit.html:101 cps/templates/detail.html:123 +#: cps/templates/user_edit.html:31 msgid "Language" msgstr "Kieli" -#: cps/templates/book_edit.html:113 cps/templates/search_form.html:137 +#: cps/templates/book_edit.html:111 cps/templates/search_form.html:137 msgid "Yes" msgstr "Kyllä" -#: cps/templates/book_edit.html:114 cps/templates/search_form.html:138 +#: cps/templates/book_edit.html:112 cps/templates/search_form.html:138 msgid "No" msgstr "Ei" -#: cps/templates/book_edit.html:160 -msgid "Upload format" +#: cps/templates/book_edit.html:158 +msgid "Upload Format" msgstr "Lataa tiedostomuoto" -#: cps/templates/book_edit.html:169 -msgid "view book after edit" +#: cps/templates/book_edit.html:167 +msgid "View Book on Save" msgstr "katso kirjaa muokkauksen jälkeen" -#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:208 -msgid "Get metadata" +#: cps/templates/book_edit.html:170 cps/templates/book_edit.html:206 +msgid "Fetch Metadata" msgstr "Hae metadata" -#: 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:170 cps/templates/shelf_edit.html:17 -#: cps/templates/user_edit.html:129 -msgid "Submit" -msgstr "Lähetä" +#: cps/templates/book_edit.html:171 cps/templates/config_edit.html:343 +#: cps/templates/config_view_edit.html:150 cps/templates/email_edit.html:38 +#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:135 +msgid "Save" +msgstr "" -#: cps/templates/book_edit.html:187 +#: cps/templates/book_edit.html:185 msgid "Are you really sure?" msgstr "Oletko aivan varma?" -#: cps/templates/book_edit.html:190 -msgid "Book will be deleted from Calibre database" +#: cps/templates/book_edit.html:188 +msgid "This book will be permanently erased from database" msgstr "Kirja poistetaan Calibren tietokannasta" -#: cps/templates/book_edit.html:191 -msgid "and from hard disk" +#: cps/templates/book_edit.html:189 +msgid "and hard disk" msgstr "ja kiintolevyltä" -#: cps/templates/book_edit.html:211 +#: cps/templates/book_edit.html:209 msgid "Keyword" msgstr "Avainsana" -#: cps/templates/book_edit.html:212 +#: cps/templates/book_edit.html:210 msgid " Search keyword " msgstr " Hae avainsanaa " -#: cps/templates/book_edit.html:214 cps/templates/layout.html:47 -msgid "Go!" -msgstr "Mene!" - -#: cps/templates/book_edit.html:218 +#: cps/templates/book_edit.html:216 msgid "Click the cover to load metadata to the form" msgstr "Klikkaa kantta ladataksesi metadata lomakkeelle" -#: cps/templates/book_edit.html:230 cps/templates/book_edit.html:270 +#: cps/templates/book_edit.html:231 cps/templates/book_edit.html:271 msgid "Loading..." msgstr "Ladataan..." -#: cps/templates/book_edit.html:235 cps/templates/layout.html:192 -#: cps/templates/layout.html:224 +#: cps/templates/book_edit.html:236 cps/templates/layout.html:191 +#: cps/templates/layout.html:223 cps/templates/modal_restriction.html:34 +#: cps/templates/user_edit.html:164 msgid "Close" msgstr "Sulje" -#: cps/templates/book_edit.html:262 cps/templates/book_edit.html:276 +#: cps/templates/book_edit.html:263 cps/templates/book_edit.html:277 msgid "Source" msgstr "Lähde" -#: cps/templates/book_edit.html:271 +#: cps/templates/book_edit.html:272 msgid "Search error!" msgstr "Hakuvirhe!" -#: cps/templates/book_edit.html:272 -msgid "No Result(s) found! Please try aonther keyword." +#: cps/templates/book_edit.html:273 +msgid "No Result(s) found! Please try another keyword." msgstr "Ei osumia! Kokeile jotain tosita hakusanaa." #: cps/templates/config_edit.html:12 @@ -1297,7 +1332,7 @@ msgid "Library Configuration" msgstr "Kirjaston asetukset" #: cps/templates/config_edit.html:19 -msgid "Location of Calibre database" +msgid "Location of Calibre Database" msgstr "Calibre -tietokannan paikka" #: cps/templates/config_edit.html:25 @@ -1349,7 +1384,7 @@ msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "SSL avaintiedoston paikka (jätä tyhjäksi ei-SSL -palvelimella)" #: cps/templates/config_edit.html:99 -msgid "Update channel" +msgid "Update Channel" msgstr "Päivityskanava" #: cps/templates/config_edit.html:101 @@ -1372,10 +1407,6 @@ msgstr "Öinen (Automaattinen)" msgid "Logfile Configuration" msgstr "Lokitiedoston asetukset" -#: cps/templates/config_edit.html:122 -msgid "Log Level" -msgstr "Lokitaso" - #: cps/templates/config_edit.html:131 msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "Lokitiedoston nimi ja paikka (calibre-web.log jos ei asetettu)" @@ -1393,255 +1424,271 @@ msgid "Feature Configuration" msgstr "Ominaisuuksien asetukset" #: cps/templates/config_edit.html:158 -msgid "Enable uploading" +msgid "Enable Uploads" msgstr "Salli lähetys" #: cps/templates/config_edit.html:162 -msgid "Enable anonymous browsing" +msgid "Enable Anonymous Browsing" msgstr "Salli nimetön selailu" #: cps/templates/config_edit.html:166 -msgid "Enable public registration" +msgid "Enable Public Registration" msgstr "Salli julkinen rekisteröinti" #: cps/templates/config_edit.html:170 -msgid "Enable remote login (\"magic link\")" +msgid "Enable Magic Link Remote Login" msgstr "Salli etäkirjautuminen (\"magic link\")" #: cps/templates/config_edit.html:175 +msgid "Enable Kobo sync" +msgstr "" + +#: cps/templates/config_edit.html:180 +msgid "Proxy unknown requests to Kobo Store" +msgstr "" + +#: cps/templates/config_edit.html:187 msgid "Use Goodreads" msgstr "Käytä Goodreads -palvelua" -#: cps/templates/config_edit.html:176 -msgid "Obtain an API Key" +#: cps/templates/config_edit.html:188 +msgid "Create an API Key" msgstr "Hae API-avain" -#: cps/templates/config_edit.html:180 +#: cps/templates/config_edit.html:192 msgid "Goodreads API Key" msgstr "Goodreads API-avain" -#: cps/templates/config_edit.html:184 +#: cps/templates/config_edit.html:196 msgid "Goodreads API Secret" msgstr "Goodreads API-salaisuus" -#: cps/templates/config_edit.html:191 +#: cps/templates/config_edit.html:203 msgid "Login type" msgstr "Kirjautumisen tyyppi" -#: cps/templates/config_edit.html:193 -msgid "Use standard Authentication" +#: cps/templates/config_edit.html:205 +msgid "Use Standard Authentication" msgstr "Käytä oletuskirjautumista" -#: cps/templates/config_edit.html:195 +#: cps/templates/config_edit.html:207 msgid "Use LDAP Authentication" msgstr "Käytä LDAP kirjautumista" -#: cps/templates/config_edit.html:198 +#: cps/templates/config_edit.html:210 msgid "Use OAuth" msgstr "Käytä OAuth kirjautumista" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:217 msgid "LDAP Server Host Name or IP Address" msgstr "LDAP palvelimen nimi tai IP osoite" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:221 msgid "LDAP Server Port" msgstr "LDAP Palveimen portti" -#: cps/templates/config_edit.html:213 -msgid "LDAP schema (ldap or ldaps)" +#: cps/templates/config_edit.html:225 +msgid "LDAP Schema (LDAP or LPAPS)" msgstr "LDAP skeema (ldap tai ldaps)" -#: cps/templates/config_edit.html:217 -msgid "LDAP Admin username" +#: cps/templates/config_edit.html:229 +msgid "LDAP Administrator Username" msgstr "LDAP pääkäyttäjän käyttäjänimi" -#: cps/templates/config_edit.html:221 -msgid "LDAP Admin password" +#: cps/templates/config_edit.html:233 +msgid "LDAP Administrator Password" msgstr "LDAP pääkäyttäjän salasana" -#: cps/templates/config_edit.html:226 -msgid "LDAP Server use SSL" +#: cps/templates/config_edit.html:238 +msgid "LDAP Server Enable SSL" msgstr "LDAP palvelin käyttää SSL:ää" -#: cps/templates/config_edit.html:230 -msgid "LDAP Server use TLS" +#: cps/templates/config_edit.html:242 +msgid "LDAP Server Enable TLS" msgstr "LDAP palvelin käyttää TLS:ää" -#: cps/templates/config_edit.html:234 +#: cps/templates/config_edit.html:246 msgid "LDAP Server Certificate" msgstr "LDAP palvelimen sertifikaatti" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:250 msgid "LDAP SSL Certificate Path" msgstr "LDAP SSL sertifikaatin polku" -#: cps/templates/config_edit.html:243 +#: cps/templates/config_edit.html:255 msgid "LDAP Distinguished Name (DN)" msgstr "LDAP DN" -#: cps/templates/config_edit.html:247 -msgid "LDAP User object filter" +#: cps/templates/config_edit.html:259 +msgid "LDAP User Object Filter" msgstr "LDAP käyttäjä suodin (object filter)" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:264 msgid "LDAP Server is OpenLDAP?" msgstr "LDAP palvelin on OpenLDAP?" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:272 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "Hanki %(provider)s OAuth valtuutus" -#: cps/templates/config_edit.html:263 +#: cps/templates/config_edit.html:275 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "%(provider)s OAuth asiakas Id" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:279 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "%(provider)s OAuth asiakas salaisuus" -#: cps/templates/config_edit.html:276 +#: cps/templates/config_edit.html:288 msgid "Allow Reverse Proxy Authentication" msgstr "" -#: cps/templates/config_edit.html:280 +#: cps/templates/config_edit.html:292 msgid "Reverse Proxy Header Name" msgstr "" -#: cps/templates/config_edit.html:292 +#: cps/templates/config_edit.html:304 msgid "External binaries" msgstr "Ulkoiset binäärit" -#: cps/templates/config_edit.html:300 -msgid "No converter" +#: cps/templates/config_edit.html:312 +msgid "No Converter" msgstr "Ei muuntajaa" -#: cps/templates/config_edit.html:302 +#: cps/templates/config_edit.html:314 msgid "Use Kindlegen" msgstr "Käytä Kindlegen" -#: cps/templates/config_edit.html:304 +#: cps/templates/config_edit.html:316 msgid "Use calibre's ebook converter" msgstr "Käytä calibren e-kirjamuuntajaa" -#: cps/templates/config_edit.html:308 +#: cps/templates/config_edit.html:320 msgid "E-Book converter settings" msgstr "E-kirjamuuntajan asetukset" -#: cps/templates/config_edit.html:312 +#: cps/templates/config_edit.html:324 msgid "Path to convertertool" msgstr "Polku muunnintyökaluun" -#: cps/templates/config_edit.html:318 +#: cps/templates/config_edit.html:330 msgid "Location of Unrar binary" msgstr "Unrar binäärin paikka" -#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 -#: cps/templates/login.html:4 +#: cps/templates/config_edit.html:349 cps/templates/layout.html:84 +#: cps/templates/login.html:4 cps/templates/login.html:20 msgid "Login" msgstr "Kirjaudu sisään" -#: cps/templates/config_view_edit.html:12 +#: cps/templates/config_view_edit.html:16 msgid "View Configuration" msgstr "Näytä konfiguraatio" -#: cps/templates/config_view_edit.html:19 cps/templates/shelf_edit.html:7 +#: cps/templates/config_view_edit.html:23 cps/templates/shelf_edit.html:7 msgid "Title" msgstr "Otsikko" -#: cps/templates/config_view_edit.html:27 -msgid "No. of random books to show" +#: cps/templates/config_view_edit.html:31 +msgid "No. of Random Books to Display" msgstr "Satunnaisten kirjojen näytön lukumäärä" -#: cps/templates/config_view_edit.html:31 -msgid "No. of authors to show before hiding (0=disable hiding)" +#: cps/templates/config_view_edit.html:35 +msgid "No. of Authors to Display Before Hiding (0=Disable Hiding)" msgstr "Kirjailijoiden lukumäärä ennen piilotusta (0=poista piilotus)" -#: cps/templates/config_view_edit.html:35 cps/templates/readcbr.html:112 +#: cps/templates/config_view_edit.html:39 cps/templates/readcbr.html:112 msgid "Theme" msgstr "Teema" -#: cps/templates/config_view_edit.html:37 +#: cps/templates/config_view_edit.html:41 msgid "Standard Theme" msgstr "oletusteema" -#: cps/templates/config_view_edit.html:38 +#: cps/templates/config_view_edit.html:42 msgid "caliBlur! Dark Theme" msgstr "caliBlur! Tumma teema" -#: cps/templates/config_view_edit.html:42 -msgid "Regular expression for ignoring columns" +#: cps/templates/config_view_edit.html:46 +msgid "Regular Expression for Ignoring Columns" msgstr "Regular expression sarakkeiden poisjättämiseen" -#: cps/templates/config_view_edit.html:46 -msgid "Link read/unread status to Calibre column" +#: cps/templates/config_view_edit.html:50 +msgid "Link Read/Unread Status to Calibre Column" msgstr "Linkitä luettu/ei luettu -tieto Calibren sarakkeeseen" -#: cps/templates/config_view_edit.html:55 -msgid "Regular expression for title sorting" -msgstr "Regular expression nimikkeiden järjestämiseen" - #: cps/templates/config_view_edit.html:59 -msgid "Tags for Mature Content" -msgstr "Aikusimateriaalin merkinnät" +msgid "View Restrictions based on Calibre column" +msgstr "" -#: cps/templates/config_view_edit.html:73 -msgid "Default settings for new users" +#: cps/templates/config_view_edit.html:61 cps/templates/email_edit.html:21 +msgid "None" +msgstr "Ei mitään" + +#: cps/templates/config_view_edit.html:68 +msgid "Regular Expression for Title Sorting" +msgstr "Regular expression nimikkeiden järjestämiseen" + +#: cps/templates/config_view_edit.html:80 +msgid "Default Settings for New Users" msgstr "Uuden käyttäjän oletusasetukset" -#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:82 -msgid "Admin user" +#: cps/templates/config_view_edit.html:88 cps/templates/user_edit.html:92 +msgid "Admin User" msgstr "Pääkäyttäjä" -#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:91 +#: cps/templates/config_view_edit.html:92 cps/templates/user_edit.html:97 msgid "Allow Downloads" msgstr "Salli kirjojen lataukset" -#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:95 -msgid "Allow book viewer" +#: cps/templates/config_view_edit.html:96 cps/templates/user_edit.html:101 +msgid "Allow eBook Viewer" msgstr "Salli kirjojen luku" -#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:99 +#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:105 msgid "Allow Uploads" msgstr "Salli lisäykset" -#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:103 +#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:109 msgid "Allow Edit" msgstr "Salli muutokset" -#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 -msgid "Allow Delete books" -msgstr "Salli kirjojen poisto" +#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:113 +msgid "Allow Delete Books" +msgstr "" -#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:112 +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:118 msgid "Allow Changing Password" msgstr "Salli sananan vaihto" -#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:116 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:122 msgid "Allow Editing Public Shelfs" msgstr "Salli julkisten hyllyjen editointi" -#: cps/templates/config_view_edit.html:119 -msgid "Default visibilities for new users" +#: cps/templates/config_view_edit.html:126 +msgid "Default Visibilities for New Users" msgstr "Oletusnäkymä uusille käyttäjille" -#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:74 -msgid "Show random books in detail view" +#: cps/templates/config_view_edit.html:142 +msgid "Show Random Books in Detail View" msgstr "Näytä satunnaisia kirjoja näkymässä" -#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:87 -msgid "Show mature content" -msgstr "Näytä aikuismateriaali" +#: cps/templates/config_view_edit.html:144 +msgid "Add Allowed/Denied Tags" +msgstr "" + +#: cps/templates/config_view_edit.html:145 +msgid "Add Allowed/Denied custom column values" +msgstr "" #: cps/templates/detail.html:59 -msgid "Read in browser" +msgid "Read in Browser" msgstr "Lue selaimessa" #: cps/templates/detail.html:72 -msgid "Listen in browser" +msgid "Listen in Browser" msgstr "Kuuntele selaimessa" #: cps/templates/detail.html:117 @@ -1652,9 +1699,9 @@ msgstr "Kirja" msgid "of" msgstr "" -#: cps/templates/detail.html:123 -msgid "language" -msgstr "kieli" +#: cps/templates/detail.html:165 +msgid "Published" +msgstr "" #: cps/templates/detail.html:200 msgid "Mark As Unread" @@ -1677,21 +1724,9 @@ msgid "Add to shelf" msgstr "Lisää hyllyyn" #: cps/templates/detail.html:286 -msgid "Edit metadata" +msgid "Edit Metadata" msgstr "Muokkaa metadataa" -#: cps/templates/email_edit.html:15 -msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" -msgstr "SMTP-port (ylisimmin 25 normaalille SMTP:lle, 465 SSL:lle ja 587 STARTTLS:lle)" - -#: cps/templates/email_edit.html:19 -msgid "Encryption" -msgstr "Salaus" - -#: cps/templates/email_edit.html:21 -msgid "None" -msgstr "Ei mitään" - #: cps/templates/email_edit.html:22 msgid "STARTTLS" msgstr "STARTTLS" @@ -1701,23 +1736,15 @@ msgid "SSL/TLS" msgstr "SSL/TLS" #: cps/templates/email_edit.html:31 -msgid "SMTP password" +msgid "SMTP Password" msgstr "SMTP salasana" -#: cps/templates/email_edit.html:35 -msgid "From e-mail" -msgstr "Lähettäjän sähköpostiosoite" - -#: cps/templates/email_edit.html:38 -msgid "Save settings" -msgstr "Tallenna asetukset" - #: cps/templates/email_edit.html:39 -msgid "Save settings and send Test E-Mail" +msgid "Save and Send Test E-mail" msgstr "Tallenna asetukset ja testaa sähköpostia" #: cps/templates/email_edit.html:43 -msgid "Allowed domains for registering" +msgid "Allowed Domains (Whitelist)" msgstr "Rekisteröinnissä sallitut domainit" #: cps/templates/email_edit.html:46 cps/templates/email_edit.html:72 @@ -1733,29 +1760,29 @@ msgid "Enter domainname" msgstr "Syötä domainnimi" #: cps/templates/email_edit.html:60 -msgid "Denied domains for registering" +msgid "Denied Domains (Blacklist)" msgstr "" #: cps/templates/email_edit.html:90 -msgid "Do you really want to delete this domain rule?" +msgid "Are you sure you want to delete this domain?" msgstr "Haluatko todellakin poistaa tämän domainin säännön?" -#: cps/templates/feed.xml:21 cps/templates/layout.html:176 +#: cps/templates/feed.xml:21 cps/templates/layout.html:175 msgid "Next" msgstr "Seuraava" -#: cps/templates/http_error.html:37 -msgid "Create issue" +#: cps/templates/generate_kobo_auth_url.html:5 +msgid "Open the .kobo/Kobo eReader.conf file in a text editor and add (or edit):" +msgstr "" + +#: cps/templates/http_error.html:38 +msgid "Create Issue" msgstr "Luo virheilmoitus" -#: cps/templates/http_error.html:44 -msgid "Back to home" +#: cps/templates/http_error.html:45 +msgid "Return to Home" msgstr "Palaa kotiin" -#: cps/templates/index.html:5 -msgid "Discover (Random Books)" -msgstr "Löydä (satunnaiset kirjat)" - #: cps/templates/index.html:64 msgid "Group by series" msgstr "Ryhmitä sarjoittain" @@ -1780,7 +1807,11 @@ msgstr "" msgid "The latest Books" msgstr "Viimeisimmät kirjat" -#: cps/templates/index.xml:42 +#: cps/templates/index.xml:38 +msgid "Random Books" +msgstr "Satunnaisia kirjoja" + +#: cps/templates/index.xml:42 cps/templates/user_edit.html:80 msgid "Show Random Books" msgstr "Näytä satunnausia kirjoja" @@ -1805,22 +1836,26 @@ msgid "Books ordered by Languages" msgstr "" #: cps/templates/index.xml:100 +msgid "Books ordered by Rating" +msgstr "" + +#: cps/templates/index.xml:108 msgid "Books ordered by file formats" msgstr "" -#: cps/templates/index.xml:103 cps/templates/layout.html:137 +#: cps/templates/index.xml:111 cps/templates/layout.html:136 msgid "Public Shelves" msgstr "Julkiset hyllyt" -#: cps/templates/index.xml:107 +#: cps/templates/index.xml:115 msgid "Books organized in public shelfs, visible to everyone" msgstr "Kirjat julkisissa hyllyissä. Näkyy kaikille" -#: cps/templates/index.xml:111 cps/templates/layout.html:141 +#: cps/templates/index.xml:119 cps/templates/layout.html:140 msgid "Your Shelves" msgstr "Omat hyllysi" -#: cps/templates/index.xml:115 +#: cps/templates/index.xml:123 msgid "User's own shelfs, only visible to the current user himself" msgstr "Käyttäjän omat hyllyt. Näkyy vain käyttäjäll eitselleen" @@ -1828,10 +1863,19 @@ msgstr "Käyttäjän omat hyllyt. Näkyy vain käyttäjäll eitselleen" msgid "Home" msgstr "Koti" +#: cps/templates/layout.html:28 cps/templates/shelf_order.html:32 +#: cps/templates/user_edit.html:178 +msgid "Back" +msgstr "Palaa" + #: cps/templates/layout.html:34 -msgid "Toggle navigation" +msgid "Toggle Navigation" msgstr "Vaihda navigointi" +#: cps/templates/layout.html:45 +msgid "Search Library" +msgstr "" + #: cps/templates/layout.html:55 msgid "Advanced Search" msgstr "Edistynyt haku" @@ -1853,74 +1897,101 @@ msgstr "Kirjaudu ulos" msgid "Register" msgstr "Rekisteröi" -#: cps/templates/layout.html:116 cps/templates/layout.html:223 +#: cps/templates/layout.html:116 cps/templates/layout.html:222 msgid "Uploading..." msgstr "Ladataan..." #: cps/templates/layout.html:117 -msgid "please don't refresh the page" -msgstr "ole hyvä äläkä päivitä sivua" +msgid "Please do not refresh the page" +msgstr "" #: cps/templates/layout.html:127 msgid "Browse" msgstr "Selaa" -#: cps/templates/layout.html:146 +#: cps/templates/layout.html:145 msgid "Create a Shelf" msgstr "Luo hylly" -#: cps/templates/layout.html:147 cps/templates/stats.html:3 +#: cps/templates/layout.html:146 cps/templates/stats.html:3 msgid "About" msgstr "Tietoja" -#: cps/templates/layout.html:161 +#: cps/templates/layout.html:160 msgid "Previous" msgstr "Edellinen" -#: cps/templates/layout.html:188 +#: cps/templates/layout.html:187 msgid "Book Details" msgstr "Kirjan tiedot" -#: cps/templates/layout.html:222 +#: cps/templates/layout.html:221 msgid "Upload done, processing, please wait..." msgstr "Lataus tehty, prosessoidaan, ole hyvä ja odota..." -#: cps/templates/layout.html:225 +#: cps/templates/layout.html:224 msgid "Error" msgstr "Virhe" -#: cps/templates/login.html:8 cps/templates/login.html:9 -#: cps/templates/register.html:7 cps/templates/user_edit.html:8 -msgid "Username" -msgstr "Käyttäjänimi" - #: cps/templates/login.html:12 cps/templates/login.html:13 #: cps/templates/user_edit.html:21 msgid "Password" msgstr "Salasana" #: cps/templates/login.html:17 -msgid "Remember me" +msgid "Remember Me" msgstr "Muista minut" #: cps/templates/login.html:22 -msgid "Forgot password" +msgid "Forgot Password?" msgstr "" #: cps/templates/login.html:25 -msgid "Log in with magic link" +msgid "Log in with Magic Link" msgstr "Kirjadu käyttäen magic link" -#: cps/templates/logviewer.html:5 -msgid "Show Calibre-Web log" -msgstr "Näytä Calibre-Web loki" +#: cps/templates/logviewer.html:6 +msgid "Show Calibre-Web Log: " +msgstr "" + +#: cps/templates/logviewer.html:8 +msgid "Calibre-Web Log: " +msgstr "" #: cps/templates/logviewer.html:8 -msgid "Show access log" -msgstr "Näytä pääsyloki" +msgid "Stream output, can't be displayed" +msgstr "" + +#: cps/templates/logviewer.html:12 +msgid "Show Access Log: " +msgstr "" + +#: cps/templates/modal_restriction.html:6 +msgid "Select allowed/denied Tags" +msgstr "" + +#: cps/templates/modal_restriction.html:7 +msgid "Select allowed/denied Custom Column values" +msgstr "" + +#: cps/templates/modal_restriction.html:8 +msgid "Select allowed/denied Tags of user" +msgstr "" + +#: cps/templates/modal_restriction.html:9 +msgid "Select allowed/denied Custom Column values of user" +msgstr "" + +#: cps/templates/modal_restriction.html:15 +msgid "Enter Tag" +msgstr "" + +#: cps/templates/modal_restriction.html:24 +msgid "Add View Restriction" +msgstr "" #: cps/templates/osd.xml:5 -msgid "Calibre-Web ebook catalog" +msgid "Calibre-Web eBook Catalog" msgstr "Calibre-Web e-kirjaluettelo" #: cps/templates/read.html:74 @@ -2032,51 +2103,51 @@ msgid "Basic txt Reader" msgstr "Perus txt -lukija" #: cps/templates/register.html:4 -msgid "Register a new account" +msgid "Register New Account" msgstr "Rekisteröi uusi tili" #: cps/templates/register.html:8 msgid "Choose a username" msgstr "Valitse käyttäjänimi" -#: cps/templates/register.html:11 cps/templates/user_edit.html:13 -msgid "E-mail address" -msgstr "Sähköpostiosoite" - #: cps/templates/register.html:12 msgid "Your email address" msgstr "Sähköpostiosoitteesi" +#: cps/templates/remote_login.html:4 +msgid "Magic Link - Authorise New Device" +msgstr "" + #: cps/templates/remote_login.html:6 -msgid "Use your other device, login and visit " +msgid "On another device, login and visit:" msgstr "Käytä toista laitetta, kirjaudu ja käy osoitteessa " -#: cps/templates/remote_login.html:9 -msgid "Once you do so, you will automatically get logged in on this device." +#: cps/templates/remote_login.html:10 +msgid "Once verified, you will automatically be logged in on this device." msgstr "Kun teet näin, sinut kirjataan automaattisesti sisään tälle laitteelle." -#: cps/templates/remote_login.html:12 -msgid "The link will expire after 10 minutes." +#: cps/templates/remote_login.html:13 +msgid "This verification link will expire in 10 minutes." msgstr "Linkki vanhenee 10 minuutissa." #: cps/templates/search.html:5 -msgid "No Results for:" -msgstr "Ei tuloksia haulle:" +msgid "No Results Found" +msgstr "" #: cps/templates/search.html:6 -msgid "Please try a different search" -msgstr "Ole hyvä ja koita muuta hakua" +msgid "Search Term:" +msgstr "" #: cps/templates/search.html:8 msgid "Results for:" msgstr "Tulosket haulle:" #: cps/templates/search_form.html:19 -msgid "Publishing date from" +msgid "Published Date From" msgstr "Julkaisupäivästä" #: cps/templates/search_form.html:26 -msgid "Publishing date to" +msgid "Published Date To" msgstr "Julkaisupäivään" #: cps/templates/search_form.html:43 @@ -2100,11 +2171,11 @@ msgid "Exclude Extensions" msgstr "" #: cps/templates/search_form.html:117 -msgid "Rating bigger than" +msgid "Rating Above" msgstr "Arvio enemmän kun" #: cps/templates/search_form.html:121 -msgid "Rating less than" +msgid "Rating Below" msgstr "Arvio vähemmän kun" #: cps/templates/shelf.html:10 @@ -2120,23 +2191,23 @@ msgid "Change order" msgstr "Muuta järjestystä" #: cps/templates/shelf.html:67 -msgid "Do you really want to delete the shelf?" +msgid "Are you sure you want to delete this shelf?" msgstr "Oletko varma, että haluat poistaa hyllyn?" #: cps/templates/shelf.html:70 -msgid "Shelf will be lost for everybody and forever!" +msgid "Shelf will be deleted for all users" msgstr "Hylly poistetaan kaikilta ja ikuisesti!" #: cps/templates/shelf_edit.html:13 -msgid "should the shelf be public?" +msgid "Share with Everyone" msgstr "pitäisikö hyllyn olla julkinen?" #: cps/templates/shelf_order.html:5 -msgid "Drag 'n drop to rearrange order" +msgid "Drag to Rearrange Order" msgstr "Vedä ja pudota muuttaaksesi järjestystä" #: cps/templates/stats.html:7 -msgid "Calibre library statistics" +msgid "Library Statistics" msgstr "Calibre -kirjaston tilastot" #: cps/templates/stats.html:12 @@ -2156,21 +2227,17 @@ msgid "Series in this Library" msgstr "Sarjat kirjastossa" #: cps/templates/stats.html:28 -msgid "Linked libraries" +msgid "Linked Libraries" msgstr "Linkitetyt kirjastot" #: cps/templates/stats.html:32 -msgid "Program library" +msgid "Program Library" msgstr "Ohjelmiston luokka" #: cps/templates/stats.html:33 msgid "Installed Version" msgstr "Asennettu versio" -#: cps/templates/tasks.html:7 -msgid "Tasks list" -msgstr "Tehtävälista" - #: cps/templates/tasks.html:12 msgid "User" msgstr "Käyttäjä" @@ -2188,11 +2255,11 @@ msgid "Progress" msgstr "Edistyminen" #: cps/templates/tasks.html:17 -msgid "Runtime" +msgid "Run Time" msgstr "Ajoaika" #: cps/templates/tasks.html:18 -msgid "Starttime" +msgid "Start Time" msgstr "Käynnistysaika" #: cps/templates/tasks.html:24 @@ -2207,38 +2274,58 @@ msgstr "Piilota kaikki tehtävät" msgid "Reset user Password" msgstr "Nollaa käyttäjän salasana" -#: cps/templates/user_edit.html:26 -msgid "Kindle E-Mail" -msgstr "Kindle sähköposti" - -#: cps/templates/user_edit.html:39 -msgid "Show books with language" +#: cps/templates/user_edit.html:41 +msgid "Language of Books" msgstr "Näytä kirjat kielellä" -#: cps/templates/user_edit.html:41 -msgid "Show all" +#: cps/templates/user_edit.html:43 +msgid "Show All" msgstr "Näytä kaikki" -#: cps/templates/user_edit.html:51 +#: cps/templates/user_edit.html:52 msgid "OAuth Settings" msgstr "OAuth asetukset" -#: cps/templates/user_edit.html:53 +#: cps/templates/user_edit.html:54 msgid "Link" msgstr "Linkitä" -#: cps/templates/user_edit.html:55 +#: cps/templates/user_edit.html:56 msgid "Unlink" msgstr "Poista linkitys" -#: cps/templates/user_edit.html:123 -msgid "Delete this user" +#: cps/templates/user_edit.html:62 +msgid "Kobo Sync Token" +msgstr "" + +#: cps/templates/user_edit.html:64 +msgid "Create/View" +msgstr "" + +#: cps/templates/user_edit.html:83 +msgid "Add allowed/denied Tags" +msgstr "" + +#: cps/templates/user_edit.html:84 +msgid "Add allowed/denied custom column values" +msgstr "" + +#: cps/templates/user_edit.html:129 +msgid "Delete User" msgstr "Poista tämä käyttäjä" -#: cps/templates/user_edit.html:138 +#: cps/templates/user_edit.html:144 msgid "Recent Downloads" msgstr "Viimeisimmät lataukset" +#: cps/templates/user_edit.html:160 +msgid "Generate Kobo Auth URL" +msgstr "" + +#: cps/templates/user_edit.html:176 +msgid "Do you really want to delete the Kobo Token?" +msgstr "" + #~ msgid "Afar" #~ msgstr "afar" @@ -3493,3 +3580,87 @@ msgstr "Viimeisimmät lataukset" #~ msgid "Zaza" #~ msgstr "" +#~ msgid "Show Calibre-Web log" +#~ msgstr "Näytä Calibre-Web loki" + +#~ msgid "Show access log" +#~ msgstr "Näytä pääsyloki" + +#~ msgid "Tags for Mature Content" +#~ msgstr "Aikusimateriaalin merkinnät" + +#~ msgid "Show mature content" +#~ msgstr "Näytä aikuismateriaali" + +#~ msgid "deny" +#~ msgstr "" + +#~ msgid "allow" +#~ msgstr "" + +#~ msgid "Kobo Set-up" +#~ msgstr "" + +#~ msgid "Publisher list" +#~ msgstr "Julkaisjalistaus" + +#~ msgid "Series list" +#~ msgstr "Sarjalistaus" + +#~ msgid "Available languages" +#~ msgstr "Tillgängliga språk" + +#~ msgid "Category list" +#~ msgstr "Kategorilista" + +#~ msgid "Series id" +#~ msgstr "Sarja-id" + +#~ msgid "Submit" +#~ msgstr "Lähetä" + +#~ msgid "Go!" +#~ msgstr "Mene!" + +#~ msgid "Allow Delete books" +#~ msgstr "Salli kirjojen poisto" + +#~ msgid "language" +#~ msgstr "kieli" + +#~ msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" +#~ msgstr "SMTP-port (ylisimmin 25 normaalille SMTP:lle, 465 SSL:lle ja 587 STARTTLS:lle)" + +#~ msgid "From e-mail" +#~ msgstr "Lähettäjän sähköpostiosoite" + +#~ msgid "Save settings" +#~ msgstr "Tallenna asetukset" + +#~ msgid "api_endpoint=" +#~ msgstr "" + +#~ msgid "please don't refresh the page" +#~ msgstr "ole hyvä äläkä päivitä sivua" + +#~ msgid "E-mail address" +#~ msgstr "Sähköpostiosoite" + +#~ msgid "No Results for:" +#~ msgstr "Ei tuloksia haulle:" + +#~ msgid "Please try a different search" +#~ msgstr "Ole hyvä ja koita muuta hakua" + +#~ msgid "Tasks list" +#~ msgstr "Tehtävälista" + +#~ msgid "Kindle E-Mail" +#~ msgstr "Kindle sähköposti" + +#~ msgid "Please note that every visit to this current page invalidates any previously generated Authentication url for this user." +#~ msgstr "" + +#~ msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" +#~ msgstr "Kansi ei ole sallitussa tiedostomuodossa (jpg/png/webp), tallennus ei onnistu" + diff --git a/cps/translations/fr/LC_MESSAGES/messages.mo b/cps/translations/fr/LC_MESSAGES/messages.mo index d9f5d698..7585bf06 100644 Binary files a/cps/translations/fr/LC_MESSAGES/messages.mo and b/cps/translations/fr/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/fr/LC_MESSAGES/messages.po b/cps/translations/fr/LC_MESSAGES/messages.po index 7881362d..7169b68b 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: 2020-01-12 13:57+0100\n" +"POT-Creation-Date: 2020-03-12 20:31+0100\n" "PO-Revision-Date: 2019-08-21 15:20+0100\n" "Last-Translator: Nicolas Roudninski \n" "Language: fr\n" @@ -29,7 +29,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.7.0\n" +"Generated-By: Babel 2.8.0\n" #: cps/about.py:42 msgid "installed" @@ -39,7 +39,7 @@ msgstr "" msgid "not installed" msgstr "non installé" -#: cps/about.py:84 +#: cps/about.py:87 msgid "Statistics" msgstr "Statistiques" @@ -53,7 +53,7 @@ msgstr "Arrêt du serveur en cours, merci de fermer la fenêtre" #: cps/admin.py:110 cps/editbooks.py:410 cps/editbooks.py:419 #: cps/editbooks.py:539 cps/editbooks.py:541 cps/editbooks.py:594 -#: cps/updater.py:446 cps/uploader.py:97 cps/uploader.py:108 +#: cps/updater.py:456 cps/uploader.py:96 cps/uploader.py:107 msgid "Unknown" msgstr "Inconnu" @@ -61,155 +61,164 @@ msgstr "Inconnu" msgid "Admin page" msgstr "Page administrateur" -#: cps/admin.py:148 cps/templates/admin.html:115 +#: cps/admin.py:151 msgid "UI Configuration" msgstr "Configuration de l’interface utilisateur" -#: cps/admin.py:185 cps/admin.py:412 +#: cps/admin.py:187 cps/admin.py:637 msgid "Calibre-Web configuration updated" msgstr "Configuration de Calibre-Web mise à jour" -#: cps/admin.py:442 cps/templates/admin.html:114 +#: cps/admin.py:434 cps/admin.py:440 cps/admin.py:451 cps/admin.py:462 +#: cps/templates/modal_restriction.html:29 +msgid "Deny" +msgstr "" + +#: cps/admin.py:436 cps/admin.py:442 cps/admin.py:453 cps/admin.py:464 +#: cps/templates/modal_restriction.html:28 +msgid "Allow" +msgstr "" + +#: cps/admin.py:667 msgid "Basic Configuration" msgstr "Configuration principale" -#: cps/admin.py:465 cps/web.py:1093 +#: cps/admin.py:691 cps/web.py:1089 msgid "Please fill out all fields!" msgstr "SVP, complétez tous les champs !" -#: cps/admin.py:467 cps/admin.py:478 cps/admin.py:484 cps/admin.py:499 -#: cps/templates/admin.html:38 +#: cps/admin.py:694 cps/admin.py:706 cps/admin.py:712 cps/admin.py:730 msgid "Add new user" msgstr "Ajouter un nouvel utilisateur" -#: cps/admin.py:476 cps/web.py:1318 +#: cps/admin.py:703 cps/web.py:1318 msgid "E-mail is not from valid domain" msgstr "Cette adresse de courriel n’appartient pas à un domaine valide" -#: cps/admin.py:482 cps/admin.py:493 +#: cps/admin.py:710 cps/admin.py:725 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:489 +#: cps/admin.py:721 #, python-format msgid "User '%(user)s' created" msgstr "Utilisateur '%(user)s' créé" -#: cps/admin.py:509 +#: cps/admin.py:740 msgid "Edit e-mail server settings" msgstr "Modifier les paramètres du serveur de courriels" -#: cps/admin.py:535 +#: cps/admin.py:766 #, 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:538 +#: cps/admin.py:769 #, 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:540 +#: cps/admin.py:771 msgid "Please configure your e-mail address first..." msgstr "" -#: cps/admin.py:542 +#: cps/admin.py:773 msgid "E-mail server settings updated" msgstr "Les paramètres du serveur de courriels ont été mis à jour" -#: cps/admin.py:571 +#: cps/admin.py:803 #, python-format msgid "User '%(nick)s' deleted" msgstr "Utilisateur '%(nick)s' supprimé" -#: cps/admin.py:574 +#: cps/admin.py:806 msgid "No admin user remaining, can't delete user" msgstr "Aucun utilisateur admin restant, impossible de supprimer l’utilisateur" -#: cps/admin.py:612 cps/web.py:1359 +#: cps/admin.py:842 cps/web.py:1361 msgid "Found an existing account for this e-mail address." msgstr "Un compte existant a été trouvé pour cette adresse de courriel." -#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1334 +#: cps/admin.py:852 cps/admin.py:867 cps/admin.py:887 cps/web.py:1336 #, python-format msgid "Edit User %(nick)s" msgstr "Éditer l'utilisateur %(nick)s" -#: cps/admin.py:622 cps/web.py:1327 +#: cps/admin.py:858 cps/web.py:1328 msgid "This username is already taken" msgstr "" -#: cps/admin.py:637 +#: cps/admin.py:874 #, python-format msgid "User '%(nick)s' updated" msgstr "Utilisateur '%(nick)s' mis à jour" -#: cps/admin.py:640 +#: cps/admin.py:877 msgid "An unknown error occured." msgstr "Oups ! Une erreur inconnue a eu lieu." -#: cps/admin.py:657 +#: cps/admin.py:900 #, 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:660 cps/web.py:1118 cps/web.py:1174 +#: cps/admin.py:903 cps/web.py:1114 cps/web.py:1170 msgid "An unknown error occurred. Please try again later." msgstr "Une erreur inconnue est survenue. Veuillez réessayer plus tard." -#: cps/admin.py:663 cps/web.py:1062 +#: cps/admin.py:906 cps/web.py:1055 msgid "Please configure the SMTP mail settings first..." msgstr "Veuillez configurer les paramètres SMTP au préalable…" -#: cps/admin.py:674 +#: cps/admin.py:918 msgid "Logfile viewer" msgstr "Visualiseur de fichier journal" -#: cps/admin.py:710 +#: cps/admin.py:957 msgid "Requesting update package" msgstr "Demander une mise à jour" -#: cps/admin.py:711 +#: cps/admin.py:958 msgid "Downloading update package" msgstr "Téléchargement la mise à jour" -#: cps/admin.py:712 +#: cps/admin.py:959 msgid "Unzipping update package" msgstr "Décompression de la mise à jour" -#: cps/admin.py:713 +#: cps/admin.py:960 msgid "Replacing files" msgstr "Remplacement des fichiers" -#: cps/admin.py:714 +#: cps/admin.py:961 msgid "Database connections are closed" msgstr "Connexion à la base de donnée fermée" -#: cps/admin.py:715 +#: cps/admin.py:962 msgid "Stopping server" msgstr "Arrêt du serveur" -#: cps/admin.py:716 +#: cps/admin.py:963 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:717 cps/admin.py:718 cps/admin.py:719 cps/admin.py:720 +#: cps/admin.py:964 cps/admin.py:965 cps/admin.py:966 cps/admin.py:967 msgid "Update failed:" msgstr "La mise à jour a échoué :" -#: cps/admin.py:717 cps/updater.py:272 cps/updater.py:457 cps/updater.py:459 +#: cps/admin.py:964 cps/updater.py:282 cps/updater.py:467 cps/updater.py:469 msgid "HTTP Error" msgstr "Erreur HTTP" -#: cps/admin.py:718 cps/updater.py:274 cps/updater.py:461 +#: cps/admin.py:965 cps/updater.py:284 cps/updater.py:471 msgid "Connection error" msgstr "Erreur de connexion" -#: cps/admin.py:719 cps/updater.py:276 cps/updater.py:463 +#: cps/admin.py:966 cps/updater.py:286 cps/updater.py:473 msgid "Timeout while establishing connection" msgstr "Délai d'attente dépassé lors de l'établissement de connexion" -#: cps/admin.py:720 cps/updater.py:278 cps/updater.py:465 +#: cps/admin.py:967 cps/updater.py:288 cps/updater.py:475 msgid "General error" msgstr "Erreur générale" @@ -249,10 +258,6 @@ msgstr "Echec de la sauvegarde du fichier %(file)s." msgid "File format %(ext)s added to %(book)s" msgstr "Le format de fichier %(ext)s a été ajouté à %(book)s" -#: cps/editbooks.py:376 -msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" -msgstr "Le format d'image utilisé pour la couverture n'est pas supporté (jpg/png/webp uniquement). Sauvegarde impossible." - #: cps/editbooks.py:451 msgid "Cover is not a jpg file, can't save" msgstr "La couverture n’est pas un fichier jpg, je ne peux pas l’enregistrer" @@ -289,30 +294,30 @@ msgstr "Impossible d'enregistrer le fichier %(file)s (permission refusée)" msgid "Failed to delete file %(file)s (Permission denied)." msgstr "Impossible de supprimer le fichier %(file)s (permission refusée)" -#: cps/editbooks.py:710 +#: cps/editbooks.py:709 #, python-format msgid "File %(file)s uploaded" msgstr "" -#: cps/editbooks.py:739 +#: cps/editbooks.py:738 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:747 +#: cps/editbooks.py:746 #, 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:751 +#: cps/editbooks.py:750 #, 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:62 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgstr "La configuration de Google Drive n’est pas terminée, essayez de désactiver et d’activer à nouveau Google Drive." -#: cps/gdrive.py:104 +#: cps/gdrive.py:103 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" @@ -402,83 +407,111 @@ msgstr "" msgid "Book path %(path)s not found on Google Drive" msgstr "" -#: cps/helper.py:643 +#: cps/helper.py:511 +msgid "Failed to create path for cover" +msgstr "" + +#: cps/helper.py:516 +msgid "Cover-file is not a valid image file" +msgstr "" + +#: cps/helper.py:519 +msgid "Failed to store cover-file" +msgstr "" + +#: cps/helper.py:530 +msgid "Only jpg/jpeg/png/webp files are supported as coverfile" +msgstr "" + +#: cps/helper.py:544 +msgid "Only jpg/jpeg files are supported as coverfile" +msgstr "" + +#: cps/helper.py:658 msgid "Waiting" msgstr "Patienter" -#: cps/helper.py:645 +#: cps/helper.py:660 msgid "Failed" msgstr "Echoué" -#: cps/helper.py:647 +#: cps/helper.py:662 msgid "Started" msgstr "Débué" -#: cps/helper.py:649 +#: cps/helper.py:664 msgid "Finished" msgstr "Terminé" -#: cps/helper.py:651 +#: cps/helper.py:666 msgid "Unknown Status" msgstr "Statut inconnu" -#: cps/helper.py:656 +#: cps/helper.py:671 msgid "E-mail: " msgstr "Courriel : " -#: cps/helper.py:658 cps/helper.py:662 +#: cps/helper.py:673 cps/helper.py:677 msgid "Convert: " msgstr "Convertir vers : " -#: cps/helper.py:660 +#: cps/helper.py:675 msgid "Upload: " msgstr "Téléverser : " -#: cps/helper.py:664 +#: cps/helper.py:679 msgid "Unknown Task: " msgstr "Tâche inconnue : " -#: cps/oauth_bb.py:75 +#: cps/kobo_auth.py:127 +msgid "PLease access calibre-web from non localhost to get valid api_endpoint for kobo device" +msgstr "" + +#: cps/kobo_auth.py:130 cps/kobo_auth.py:150 +msgid "Kobo Setup" +msgstr "" + +#: cps/oauth_bb.py:74 #, python-format msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:154 msgid "Failed to log in with GitHub." msgstr "Échec de la connexion avec GitHub." -#: cps/oauth_bb.py:160 +#: cps/oauth_bb.py:159 msgid "Failed to fetch user info from GitHub." msgstr "Impossible d’obtenir les informations d’utilisateur à partir de GitHub." -#: cps/oauth_bb.py:171 +#: cps/oauth_bb.py:170 msgid "Failed to log in with Google." msgstr "N’a pas réussi à se connecter avec Google." -#: cps/oauth_bb.py:176 +#: cps/oauth_bb.py:175 msgid "Failed to fetch user info from Google." msgstr "Échec à récupérer les informations des utilisateurs sur Google." -#: cps/oauth_bb.py:274 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s success." msgstr "" -#: cps/oauth_bb.py:278 +#: cps/oauth_bb.py:277 #, python-format msgid "Unlink to %(oauth)s failed." msgstr "" -#: cps/oauth_bb.py:281 +#: cps/oauth_bb.py:280 #, python-format msgid "Not linked to %(oauth)s." msgstr "" -#: cps/oauth_bb.py:309 +#: cps/oauth_bb.py:308 msgid "GitHub Oauth error, please retry later." msgstr "Erreur GitHub Oauth, veuillez réessayer plus tard." -#: cps/oauth_bb.py:328 +#: cps/oauth_bb.py:327 msgid "Google Oauth error, please retry later." msgstr "Erreur Google Oauth, veuillez réessayer plus tard." @@ -529,403 +562,393 @@ msgstr "Les livres ont été ajoutés à l’étagère : %(sname)s" msgid "Could not add books to shelf: %(sname)s" msgstr "Impossible d’ajouter les livres à l’étagère : %(sname)s" -#: cps/shelf.py:180 +#: cps/shelf.py:181 #, 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:186 +#: cps/shelf.py:190 #, 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:207 cps/shelf.py:231 +#: cps/shelf.py:211 cps/shelf.py:235 #, 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:212 +#: cps/shelf.py:216 #, python-format msgid "Shelf %(title)s created" msgstr "Étagère %(title)s créée" -#: cps/shelf.py:214 cps/shelf.py:242 +#: cps/shelf.py:218 cps/shelf.py:246 msgid "There was an error" msgstr "Il y a eu une erreur" -#: cps/shelf.py:215 cps/shelf.py:217 +#: cps/shelf.py:219 cps/shelf.py:221 msgid "create a shelf" msgstr "créer une étagère" -#: cps/shelf.py:240 +#: cps/shelf.py:244 #, python-format msgid "Shelf %(title)s changed" msgstr "L’étagère %(title)s a été modifiée" -#: cps/shelf.py:243 cps/shelf.py:245 +#: cps/shelf.py:247 cps/shelf.py:249 msgid "Edit a shelf" msgstr "Modifier une étagère" -#: cps/shelf.py:289 +#: cps/shelf.py:301 #, python-format msgid "Shelf: '%(name)s'" msgstr "Étagère : '%(name)s'" -#: cps/shelf.py:292 +#: cps/shelf.py:304 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:323 +#: cps/shelf.py:342 +msgid "Hidden Book" +msgstr "" + +#: cps/shelf.py:347 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Modifier l’arrangement de l’étagère : ‘%(name)s’" -#: cps/ub.py:57 +#: cps/ub.py:56 msgid "Recently Added" msgstr "Ajouts récents" -#: cps/ub.py:59 +#: cps/ub.py:58 msgid "Show recent books" msgstr "Afficher les livres récents" -#: cps/templates/index.xml:17 cps/ub.py:60 +#: cps/templates/index.xml:17 cps/ub.py:59 msgid "Hot Books" msgstr "Livres populaires" -#: cps/ub.py:61 -msgid "Show hot books" +#: cps/ub.py:60 +msgid "Show Hot Books" msgstr "Montrer les livres populaires" -#: cps/templates/index.xml:24 cps/ub.py:64 -msgid "Best rated Books" +#: cps/templates/index.xml:24 cps/ub.py:63 cps/web.py:508 +msgid "Top Rated Books" msgstr "Livres les mieux notés" -#: cps/ub.py:66 -msgid "Show best rated books" +#: cps/ub.py:65 +msgid "Show Top Rated Books" msgstr "Montrer les livres les mieux notés" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67 -#: cps/web.py:1011 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:66 +#: cps/web.py:1005 msgid "Read Books" msgstr "Livres lus" -#: cps/ub.py:69 +#: cps/ub.py:68 msgid "Show read and unread" msgstr "Montrer lu et non-lu" -#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71 -#: cps/web.py:1015 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:70 +#: cps/web.py:1009 msgid "Unread Books" msgstr "Livres non-lus" -#: cps/ub.py:73 +#: cps/ub.py:72 msgid "Show unread" msgstr "Afficher non lu" -#: cps/ub.py:74 +#: cps/ub.py:73 msgid "Discover" msgstr "Découvrir" -#: cps/ub.py:76 +#: cps/ub.py:75 msgid "Show random books" msgstr "Montrer des livres au hasard" -#: cps/templates/index.xml:75 cps/ub.py:77 +#: cps/templates/index.xml:75 cps/ub.py:76 cps/web.py:787 msgid "Categories" msgstr "Catégories" -#: cps/ub.py:79 +#: cps/ub.py:78 msgid "Show category selection" msgstr "Montrer la sélection par catégories" -#: cps/templates/book_edit.html:71 cps/templates/index.xml:82 -#: cps/templates/search_form.html:53 cps/ub.py:80 +#: cps/templates/book_edit.html:69 cps/templates/index.xml:82 +#: cps/templates/search_form.html:53 cps/ub.py:79 cps/web.py:715 msgid "Series" msgstr "Séries" -#: cps/ub.py:82 +#: cps/ub.py:81 msgid "Show series selection" msgstr "Montrer la sélection par séries" -#: cps/templates/index.xml:61 cps/ub.py:83 +#: cps/templates/index.xml:61 cps/ub.py:82 msgid "Authors" msgstr "Auteurs" -#: cps/ub.py:85 +#: cps/ub.py:84 msgid "Show author selection" msgstr "Montrer la sélection par auteur" -#: cps/templates/index.xml:68 cps/ub.py:87 +#: cps/templates/index.xml:68 cps/ub.py:86 cps/web.py:699 msgid "Publishers" msgstr "Editeurs" -#: cps/ub.py:89 +#: cps/ub.py:88 msgid "Show publisher selection" msgstr "Montrer la sélection par éditeur" -#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:90 +#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:89 +#: cps/web.py:770 msgid "Languages" msgstr "Langues" -#: cps/ub.py:93 +#: cps/ub.py:92 msgid "Show language selection" msgstr "Montrer la sélection par langue" -#: cps/ub.py:94 +#: cps/templates/index.xml:96 cps/ub.py:93 msgid "Ratings" msgstr "Notes" -#: cps/ub.py:96 +#: cps/ub.py:95 msgid "Show ratings selection" msgstr "Afficher la sélection des notes" -#: cps/templates/index.xml:96 cps/ub.py:97 +#: cps/templates/index.xml:104 cps/ub.py:96 msgid "File formats" msgstr "Format de fichier" -#: cps/ub.py:99 +#: cps/ub.py:98 msgid "Show file formats selection" msgstr "Afficher la sélection des formats de fichiers" -#: cps/updater.py:252 cps/updater.py:359 cps/updater.py:372 +#: cps/updater.py:262 cps/updater.py:369 cps/updater.py:382 msgid "Unexpected data while reading update information" msgstr "Données inattendues lors de la lecture des informations de mise à jour" -#: cps/updater.py:259 cps/updater.py:365 +#: cps/updater.py:269 cps/updater.py:375 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:285 +#: cps/updater.py:295 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:338 +#: cps/updater.py:348 msgid "Could not fetch update information" msgstr "Impossible d'extraire les informations de mise à jour" -#: cps/updater.py:352 +#: cps/updater.py:362 msgid "No release information available" msgstr "Aucune information concernant cette version n’est disponible" -#: cps/updater.py:405 cps/updater.py:414 +#: cps/updater.py:415 cps/updater.py:424 #, 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/updater.py:424 +#: cps/updater.py:434 msgid "Click on the button below to update to the latest stable version." msgstr "Téléchargez la dernière version en cliquant sur le bouton ci-dessous." -#: cps/web.py:486 +#: cps/web.py:480 msgid "Recently Added Books" msgstr "Ajouts récents" -#: cps/web.py:514 -msgid "Best rated books" -msgstr "Livres les mieux notés" - -#: cps/templates/index.xml:38 cps/web.py:522 -msgid "Random Books" -msgstr "Livres au hasard" +#: cps/templates/index.html:5 cps/web.py:516 +msgid "Discover (Random Books)" +msgstr "Découverte (livres au hasard)" -#: cps/web.py:548 +#: cps/web.py:542 msgid "Books" msgstr "Livres" -#: cps/web.py:575 -msgid "Hot Books (most downloaded)" +#: cps/web.py:569 +msgid "Hot Books (Most Downloaded)" msgstr "Livres populaires (les plus téléchargés)" -#: cps/web.py:586 cps/web.py:1382 cps/web.py:1478 -msgid "Error opening eBook. File does not exist or file is not accessible:" +#: cps/web.py:580 +msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Erreur d'ouverture du livre numérique. Le fichier n'existe pas ou n'est pas accessible :" -#: cps/web.py:599 +#: cps/web.py:593 #, python-format msgid "Author: %(name)s" msgstr "Auteur: %(name)s" -#: cps/web.py:611 +#: cps/web.py:605 #, python-format msgid "Publisher: %(name)s" msgstr "Editeur : '%(name)s'" -#: cps/web.py:622 +#: cps/web.py:616 #, python-format msgid "Series: %(serie)s" msgstr "Séries : %(serie)s" -#: cps/web.py:633 +#: cps/web.py:627 #, python-format msgid "Rating: %(rating)s stars" msgstr "Note: %(rating)s étoiles" -#: cps/web.py:644 +#: cps/web.py:638 #, python-format msgid "File format: %(format)s" msgstr "Format de fichier: %(format)s" -#: cps/web.py:656 +#: cps/web.py:650 #, python-format msgid "Category: %(name)s" msgstr "Catégorie : %(name)s" -#: cps/web.py:673 +#: cps/web.py:667 #, python-format msgid "Language: %(name)s" msgstr "Langue : %(name)s" -#: cps/web.py:705 -msgid "Publisher list" -msgstr "Liste des éditeurs" - -#: cps/web.py:721 -msgid "Series list" -msgstr "Liste des séries" - -#: cps/web.py:735 +#: cps/web.py:729 msgid "Ratings list" msgstr "" -#: cps/web.py:748 +#: cps/web.py:742 msgid "File formats list" msgstr "" -#: cps/web.py:776 -msgid "Available languages" -msgstr "Langues disponibles" - -#: cps/web.py:793 -msgid "Category list" -msgstr "Liste des catégories" - -#: cps/templates/layout.html:73 cps/web.py:807 +#: cps/templates/layout.html:73 cps/templates/tasks.html:7 cps/web.py:801 msgid "Tasks" msgstr "Tâches" -#: cps/templates/feed.xml:33 cps/templates/layout.html:44 -#: cps/templates/layout.html:45 cps/web.py:829 cps/web.py:831 +#: cps/templates/book_edit.html:212 cps/templates/feed.xml:33 +#: cps/templates/layout.html:44 cps/templates/layout.html:47 +#: cps/templates/search_form.html:170 cps/web.py:821 cps/web.py:823 msgid "Search" msgstr "Chercher" -#: cps/web.py:881 +#: cps/web.py:873 msgid "Published after " msgstr "Publié après le " -#: cps/web.py:888 +#: cps/web.py:880 msgid "Published before " msgstr "Publié avant le " -#: cps/web.py:902 +#: cps/web.py:894 #, python-format msgid "Rating <= %(rating)s" msgstr "Évaluation <= %(rating)s" -#: cps/web.py:904 +#: cps/web.py:896 #, python-format msgid "Rating >= %(rating)s" msgstr "Évaluation >= %(rating)s" -#: cps/web.py:970 cps/web.py:982 +#: cps/web.py:962 cps/web.py:976 msgid "search" msgstr "recherche" -#: cps/web.py:1067 +#: cps/web.py:1060 #, 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:1071 +#: cps/web.py:1064 #, 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:1073 +#: cps/web.py:1066 msgid "Please configure your kindle e-mail address first..." msgstr "Veuillez configurer votre adresse de courriel Kindle en premier lieu…" -#: cps/web.py:1087 +#: cps/web.py:1083 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "" -#: cps/web.py:1088 cps/web.py:1094 cps/web.py:1119 cps/web.py:1123 -#: cps/web.py:1128 cps/web.py:1132 +#: cps/web.py:1084 cps/web.py:1090 cps/web.py:1115 cps/web.py:1119 +#: cps/web.py:1124 cps/web.py:1128 msgid "register" msgstr "s’enregistrer" -#: cps/web.py:1121 +#: cps/web.py:1117 msgid "Your e-mail is not allowed to register" msgstr "Votre adresse de courriel n’est pas autorisé pour une inscription" -#: cps/web.py:1124 +#: cps/web.py:1120 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Le courriel de confirmation a été envoyé à votre adresse." -#: cps/web.py:1127 +#: cps/web.py:1123 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:1144 +#: cps/web.py:1140 msgid "Cannot activate LDAP authentication" msgstr "Impossible d’activer l’authentification LDAP" -#: cps/web.py:1154 cps/web.py:1281 +#: cps/web.py:1150 cps/web.py:1277 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "vous êtes maintenant connecté sous : '%(nickname)s'" -#: cps/web.py:1159 +#: cps/web.py:1155 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "Impossible de se connecter. Serveur LDAP hors service, veuillez contacter votre administrateur" -#: cps/web.py:1163 cps/web.py:1186 +#: cps/web.py:1159 cps/web.py:1182 msgid "Wrong Username or Password" msgstr "Mauvais nom d'utilisateur ou mot de passe" -#: cps/web.py:1170 +#: cps/web.py:1166 msgid "New Password was send to your email address" msgstr "" -#: cps/web.py:1176 +#: cps/web.py:1172 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1182 +#: cps/web.py:1178 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Vous êtes maintenant connecté en tant que : ‘%(nickname)s’" -#: cps/web.py:1189 cps/web.py:1213 +#: cps/web.py:1185 cps/web.py:1209 msgid "login" msgstr "connexion" -#: cps/web.py:1225 cps/web.py:1259 +#: cps/web.py:1221 cps/web.py:1255 msgid "Token not found" msgstr "Jeton non trouvé" -#: cps/web.py:1234 cps/web.py:1267 +#: cps/web.py:1230 cps/web.py:1263 msgid "Token has expired" msgstr "Jeton expiré" -#: cps/web.py:1243 +#: cps/web.py:1239 msgid "Success! Please return to your device" msgstr "Réussite! Merci de vous tourner vers votre appareil" -#: cps/web.py:1320 cps/web.py:1363 cps/web.py:1369 +#: cps/web.py:1320 cps/web.py:1365 cps/web.py:1371 #, python-format msgid "%(name)s's profile" msgstr "Profil de %(name)s" -#: cps/web.py:1365 +#: cps/web.py:1367 msgid "Profile updated" msgstr "Profil mis à jour" -#: cps/web.py:1394 cps/web.py:1397 cps/web.py:1400 cps/web.py:1407 -#: cps/web.py:1412 +#: cps/web.py:1384 cps/web.py:1480 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "" + +#: cps/web.py:1396 cps/web.py:1399 cps/web.py:1402 cps/web.py:1409 +#: cps/web.py:1414 msgid "Read a Book" msgstr "Lire un livre" -#: cps/web.py:1423 +#: cps/web.py:1425 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "Erreur lors de l’ouverture d’un eBook. Le fichier n’existe pas ou le fichier n’est pas accessible." @@ -940,23 +963,26 @@ 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" #: cps/templates/admin.html:9 -msgid "User list" +msgid "Users" msgstr "Liste des utilisateurs" -#: cps/templates/admin.html:12 -msgid "Nickname" +#: cps/templates/admin.html:12 cps/templates/login.html:8 +#: cps/templates/login.html:9 cps/templates/register.html:7 +#: cps/templates/user_edit.html:8 +msgid "Username" msgstr "Surnom" -#: cps/templates/admin.html:13 -msgid "E-mail" +#: cps/templates/admin.html:13 cps/templates/register.html:11 +#: cps/templates/user_edit.html:13 +msgid "E-mail Address" msgstr "Courriel" -#: cps/templates/admin.html:14 -msgid "Kindle" +#: cps/templates/admin.html:14 cps/templates/user_edit.html:26 +msgid "Send to Kindle E-mail Address" msgstr "Kindle" #: cps/templates/admin.html:15 -msgid "DLS" +msgid "Downloads" msgstr "DLS" #: cps/templates/admin.html:16 cps/templates/layout.html:76 @@ -970,7 +996,7 @@ msgid "Download" msgstr "Télécharger" #: cps/templates/admin.html:18 -msgid "View Ebooks" +msgid "View eBooks" msgstr "Afficher les Ebooks" #: cps/templates/admin.html:19 cps/templates/layout.html:65 @@ -981,28 +1007,32 @@ msgstr "Téléverser" msgid "Edit" msgstr "Éditer" +#: cps/templates/admin.html:38 +msgid "Add New User" +msgstr "" + #: cps/templates/admin.html:44 -msgid "SMTP e-mail server settings" +msgid "E-mail Server Settings" msgstr "Paramètres du serveur SMTP" #: cps/templates/admin.html:47 cps/templates/email_edit.html:11 -msgid "SMTP hostname" +msgid "SMTP Hostname" msgstr "Adresse du serveur SMTP" -#: cps/templates/admin.html:48 -msgid "SMTP port" +#: cps/templates/admin.html:48 cps/templates/email_edit.html:15 +msgid "SMTP Port" msgstr "Port du serveur SMTP" -#: cps/templates/admin.html:49 -msgid "SSL" +#: cps/templates/admin.html:49 cps/templates/email_edit.html:19 +msgid "Encryption" msgstr "SSL" #: cps/templates/admin.html:50 cps/templates/email_edit.html:27 -msgid "SMTP login" +msgid "SMTP Login" msgstr "Compte utilisateur SMTP" -#: cps/templates/admin.html:51 -msgid "From mail" +#: cps/templates/admin.html:51 cps/templates/email_edit.html:35 +msgid "From E-mail" msgstr "Expéditeur des courriels" #: cps/templates/admin.html:61 @@ -1014,63 +1044,71 @@ msgid "Configuration" msgstr "Configuration" #: cps/templates/admin.html:70 -msgid "Calibre DB dir" +msgid "Calibre Database Directory" msgstr "Répertoire de la base de donnée Calibre" -#: cps/templates/admin.html:74 -msgid "Log level" +#: cps/templates/admin.html:74 cps/templates/config_edit.html:122 +msgid "Log Level" msgstr "Niveau de journalisation" #: cps/templates/admin.html:78 msgid "Port" msgstr "Port" -#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:23 -msgid "Books per page" +#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:27 +msgid "Books per Page" msgstr "Livres par page" #: cps/templates/admin.html:88 -msgid "Uploading" +msgid "Uploads" msgstr "Téléversement de fichier" #: cps/templates/admin.html:92 -msgid "Anonymous browsing" +msgid "Anonymous Browsing" msgstr "Navigation anonyme" #: cps/templates/admin.html:96 -msgid "Public registration" +msgid "Public Registration" msgstr "Inscription public" -#: cps/templates/admin.html:100 cps/templates/remote_login.html:4 -msgid "Remote login" +#: cps/templates/admin.html:100 +msgid "Magic Link Remote Login" msgstr "Connexion (\"magic link\")" #: cps/templates/admin.html:104 -msgid "Reverse proxy login" +msgid "Reverse Proxy Login" msgstr "" #: cps/templates/admin.html:109 msgid "Reverse proxy header name" msgstr "" +#: cps/templates/admin.html:114 +msgid "Edit Basic Configuration" +msgstr "" + +#: cps/templates/admin.html:115 +msgid "Edit UI Configuration" +msgstr "" + #: cps/templates/admin.html:121 msgid "Administration" msgstr "Administration" #: cps/templates/admin.html:122 -msgid "View Logfiles" +msgid "View Logs" msgstr "Afficher les fichiers journaux" #: cps/templates/admin.html:123 -msgid "Reconnect to Calibre DB" +msgid "Reconnect Calibre Database" msgstr "Se reconnecter à Calibre-Web" #: cps/templates/admin.html:124 -msgid "Restart Calibre-Web" +msgid "Restart" msgstr "Redémarrer Calibre-Web" #: cps/templates/admin.html:125 -msgid "Stop Calibre-Web" +msgid "Shutdown" msgstr "Arrêter Calibre-Web" #: cps/templates/admin.html:131 @@ -1090,7 +1128,7 @@ msgid "Current version" msgstr "Version actuellement installée" #: cps/templates/admin.html:148 -msgid "Check for update" +msgid "Check for Update" msgstr "Rechercher les mise à jour" #: cps/templates/admin.html:149 @@ -1098,30 +1136,29 @@ msgid "Perform Update" msgstr "Effectuer la mise à jour" #: cps/templates/admin.html:161 -msgid "Do you really want to restart Calibre-Web?" +msgid "Are you sure you want to restart?" msgstr "Voulez-vous vraiment redémarrer Calibre-Web?" #: cps/templates/admin.html:166 cps/templates/admin.html:180 #: cps/templates/admin.html:200 cps/templates/shelf.html:72 -msgid "Ok" +msgid "OK" msgstr "Oui" #: cps/templates/admin.html:167 cps/templates/admin.html:181 -#: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 +#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:194 +#: cps/templates/config_edit.html:346 cps/templates/config_view_edit.html:151 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92 -#: cps/templates/layout.html:28 cps/templates/shelf.html:73 -#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32 -#: cps/templates/user_edit.html:131 -msgid "Back" -msgstr "Retour" +#: cps/templates/shelf.html:73 cps/templates/shelf_edit.html:19 +#: cps/templates/user_edit.html:137 +msgid "Cancel" +msgstr "" #: cps/templates/admin.html:179 -msgid "Do you really want to stop Calibre-Web?" +msgid "Are you sure you want to shutdown?" msgstr "Voulez-Vous vraiment arrêter Calibre-Web?" #: cps/templates/admin.html:191 -msgid "Updating, please do not reload page" +msgid "Updating, please do not reload this page" msgstr "Mise à jour en cours, ne pas rafraîchir la page" #: cps/templates/author.html:15 @@ -1148,161 +1185,159 @@ msgstr "réduire" msgid "More by" msgstr "Plus de" -#: cps/templates/book_edit.html:12 +#: cps/templates/book_edit.html:10 msgid "Delete Book" msgstr "Effacer le livre" -#: cps/templates/book_edit.html:15 +#: cps/templates/book_edit.html:13 msgid "Delete formats:" msgstr "Supprimer les formats :" -#: cps/templates/book_edit.html:18 cps/templates/book_edit.html:195 -#: cps/templates/email_edit.html:91 +#: cps/templates/book_edit.html:16 cps/templates/book_edit.html:193 +#: cps/templates/email_edit.html:91 cps/templates/user_edit.html:65 +#: cps/templates/user_edit.html:177 msgid "Delete" msgstr "Supprimer" -#: cps/templates/book_edit.html:26 +#: cps/templates/book_edit.html:24 msgid "Convert book format:" msgstr "Convertir le format du livre :" -#: cps/templates/book_edit.html:30 +#: cps/templates/book_edit.html:28 msgid "Convert from:" msgstr "Convertir depuis :" -#: cps/templates/book_edit.html:32 cps/templates/book_edit.html:39 +#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:37 msgid "select an option" msgstr "choisissez un format" -#: cps/templates/book_edit.html:37 +#: cps/templates/book_edit.html:35 msgid "Convert to:" msgstr "Convertir vers :" -#: cps/templates/book_edit.html:46 +#: cps/templates/book_edit.html:44 msgid "Convert book" msgstr "Convertir le livre" -#: cps/templates/book_edit.html:55 cps/templates/search_form.html:6 +#: cps/templates/book_edit.html:53 cps/templates/search_form.html:6 msgid "Book Title" msgstr "Titre du livre" -#: cps/templates/book_edit.html:59 cps/templates/book_edit.html:255 -#: cps/templates/book_edit.html:273 cps/templates/search_form.html:10 +#: cps/templates/book_edit.html:57 cps/templates/book_edit.html:256 +#: cps/templates/book_edit.html:274 cps/templates/search_form.html:10 msgid "Author" msgstr "Auteur" -#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:260 -#: cps/templates/book_edit.html:275 cps/templates/search_form.html:126 +#: cps/templates/book_edit.html:61 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:276 cps/templates/search_form.html:126 msgid "Description" msgstr "Description" -#: cps/templates/book_edit.html:67 cps/templates/search_form.html:33 +#: cps/templates/book_edit.html:65 cps/templates/search_form.html:33 msgid "Tags" msgstr "Étiquette" -#: cps/templates/book_edit.html:75 -msgid "Series id" -msgstr "Numéro dans la série" +#: cps/templates/book_edit.html:73 +msgid "Series ID" +msgstr "" -#: cps/templates/book_edit.html:79 +#: cps/templates/book_edit.html:77 msgid "Rating" msgstr "Évaluation" -#: cps/templates/book_edit.html:83 -msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +#: cps/templates/book_edit.html:81 +msgid "Fetch Cover from URL (JPEG - Image will be downloaded and stored in database)" msgstr "URL de la couverture (jpg, la couverture est déposée sur le serveur et sauvegardée en base, ce champ est ensuite remis à vide)" -#: cps/templates/book_edit.html:87 -msgid "Upload Cover from local drive" +#: cps/templates/book_edit.html:85 +msgid "Upload Cover from Local Disk" msgstr "Téléverser la couverture depuis un fichier en local" -#: cps/templates/book_edit.html:92 cps/templates/detail.html:165 -msgid "Publishing date" +#: cps/templates/book_edit.html:90 +msgid "Published Date" msgstr "Date de publication" -#: cps/templates/book_edit.html:99 cps/templates/book_edit.html:257 -#: cps/templates/book_edit.html:274 cps/templates/detail.html:156 +#: cps/templates/book_edit.html:97 cps/templates/book_edit.html:258 +#: cps/templates/book_edit.html:275 cps/templates/detail.html:156 #: cps/templates/search_form.html:14 msgid "Publisher" msgstr "Editeur" -#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:30 +#: cps/templates/book_edit.html:101 cps/templates/detail.html:123 +#: cps/templates/user_edit.html:31 msgid "Language" msgstr "Langue" -#: cps/templates/book_edit.html:113 cps/templates/search_form.html:137 +#: cps/templates/book_edit.html:111 cps/templates/search_form.html:137 msgid "Yes" msgstr "Oui" -#: cps/templates/book_edit.html:114 cps/templates/search_form.html:138 +#: cps/templates/book_edit.html:112 cps/templates/search_form.html:138 msgid "No" msgstr "Non" -#: cps/templates/book_edit.html:160 -msgid "Upload format" +#: cps/templates/book_edit.html:158 +msgid "Upload Format" msgstr "Format du fichier téléversé" -#: cps/templates/book_edit.html:169 -msgid "view book after edit" +#: cps/templates/book_edit.html:167 +msgid "View Book on Save" msgstr "voir le livre après l'édition" -#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:208 -msgid "Get metadata" +#: cps/templates/book_edit.html:170 cps/templates/book_edit.html:206 +msgid "Fetch Metadata" msgstr "Obtenir les métadonnées" -#: 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:170 cps/templates/shelf_edit.html:17 -#: cps/templates/user_edit.html:129 -msgid "Submit" -msgstr "Soumettre" +#: cps/templates/book_edit.html:171 cps/templates/config_edit.html:343 +#: cps/templates/config_view_edit.html:150 cps/templates/email_edit.html:38 +#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:135 +msgid "Save" +msgstr "" -#: cps/templates/book_edit.html:187 +#: cps/templates/book_edit.html:185 msgid "Are you really sure?" msgstr "Etes-vous vraiment sur?" -#: cps/templates/book_edit.html:190 -msgid "Book will be deleted from Calibre database" +#: cps/templates/book_edit.html:188 +msgid "This book will be permanently erased from database" msgstr "Le livre va être supprimé de la base de données de Calibre" -#: cps/templates/book_edit.html:191 -msgid "and from hard disk" +#: cps/templates/book_edit.html:189 +msgid "and hard disk" msgstr "et du disque dur" -#: cps/templates/book_edit.html:211 +#: cps/templates/book_edit.html:209 msgid "Keyword" msgstr "Mot-clé" -#: cps/templates/book_edit.html:212 +#: cps/templates/book_edit.html:210 msgid " Search keyword " msgstr " Rechercher le mot-clé " -#: cps/templates/book_edit.html:214 cps/templates/layout.html:47 -msgid "Go!" -msgstr "Allez !" - -#: cps/templates/book_edit.html:218 +#: cps/templates/book_edit.html:216 msgid "Click the cover to load metadata to the form" msgstr "Cliquer sur la couverture pour importer les métadonnées dans le formulaire" -#: cps/templates/book_edit.html:230 cps/templates/book_edit.html:270 +#: cps/templates/book_edit.html:231 cps/templates/book_edit.html:271 msgid "Loading..." msgstr "Chargement…" -#: cps/templates/book_edit.html:235 cps/templates/layout.html:192 -#: cps/templates/layout.html:224 +#: cps/templates/book_edit.html:236 cps/templates/layout.html:191 +#: cps/templates/layout.html:223 cps/templates/modal_restriction.html:34 +#: cps/templates/user_edit.html:164 msgid "Close" msgstr "Fermer" -#: cps/templates/book_edit.html:262 cps/templates/book_edit.html:276 +#: cps/templates/book_edit.html:263 cps/templates/book_edit.html:277 msgid "Source" msgstr "Source" -#: cps/templates/book_edit.html:271 +#: cps/templates/book_edit.html:272 msgid "Search error!" msgstr "Rechercher les erreur!" -#: cps/templates/book_edit.html:272 -msgid "No Result(s) found! Please try aonther keyword." +#: cps/templates/book_edit.html:273 +msgid "No Result(s) found! Please try another keyword." msgstr "Aucun résultat. Veuillez essayer avec un nouveau mot clé." #: cps/templates/config_edit.html:12 @@ -1310,7 +1345,7 @@ msgid "Library Configuration" msgstr "Configuration de la Bibliothèque" #: cps/templates/config_edit.html:19 -msgid "Location of Calibre database" +msgid "Location of Calibre Database" msgstr "Emplacement de la base de donnée Calibre" #: cps/templates/config_edit.html:25 @@ -1362,7 +1397,7 @@ msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "Emplacement de la clé de chiffrement SSL (laisser vide pour les serveurs non SSL)" #: cps/templates/config_edit.html:99 -msgid "Update channel" +msgid "Update Channel" msgstr "Canal de mise à jour" #: cps/templates/config_edit.html:101 @@ -1385,10 +1420,6 @@ msgstr "Nightly (Automatique)" msgid "Logfile Configuration" msgstr "Configuration du journal d’évenements" -#: cps/templates/config_edit.html:122 -msgid "Log Level" -msgstr "Niveau de journalisation" - #: cps/templates/config_edit.html:131 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)" @@ -1406,255 +1437,271 @@ msgid "Feature Configuration" msgstr "Configuration des options" #: cps/templates/config_edit.html:158 -msgid "Enable uploading" +msgid "Enable Uploads" msgstr "Autoriser le téléversement de fichier" #: cps/templates/config_edit.html:162 -msgid "Enable anonymous browsing" +msgid "Enable Anonymous Browsing" msgstr "Autoriser la navigation anonyme" #: cps/templates/config_edit.html:166 -msgid "Enable public registration" +msgid "Enable Public Registration" msgstr "Autoriser l’inscription publique" #: cps/templates/config_edit.html:170 -msgid "Enable remote login (\"magic link\")" +msgid "Enable Magic Link Remote Login" msgstr "Activer la connexion (\"magic link\")" #: cps/templates/config_edit.html:175 +msgid "Enable Kobo sync" +msgstr "" + +#: cps/templates/config_edit.html:180 +msgid "Proxy unknown requests to Kobo Store" +msgstr "" + +#: cps/templates/config_edit.html:187 msgid "Use Goodreads" msgstr "" -#: cps/templates/config_edit.html:176 -msgid "Obtain an API Key" +#: cps/templates/config_edit.html:188 +msgid "Create an API Key" msgstr "Obtenir la clé API" -#: cps/templates/config_edit.html:180 +#: cps/templates/config_edit.html:192 msgid "Goodreads API Key" msgstr "Clé de l’API Goodreads" -#: cps/templates/config_edit.html:184 +#: cps/templates/config_edit.html:196 msgid "Goodreads API Secret" msgstr "Secret de l’API Goodreads" -#: cps/templates/config_edit.html:191 +#: cps/templates/config_edit.html:203 msgid "Login type" msgstr "Type d’authentification" -#: cps/templates/config_edit.html:193 -msgid "Use standard Authentication" +#: cps/templates/config_edit.html:205 +msgid "Use Standard Authentication" msgstr "Utiliser l’authentification standard" -#: cps/templates/config_edit.html:195 +#: cps/templates/config_edit.html:207 msgid "Use LDAP Authentication" msgstr "Utiliser l’authentification LDAP" -#: cps/templates/config_edit.html:198 +#: cps/templates/config_edit.html:210 msgid "Use OAuth" msgstr "Utiliser OAuth" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:217 msgid "LDAP Server Host Name or IP Address" msgstr "" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:221 msgid "LDAP Server Port" msgstr "" -#: cps/templates/config_edit.html:213 -msgid "LDAP schema (ldap or ldaps)" +#: cps/templates/config_edit.html:225 +msgid "LDAP Schema (LDAP or LPAPS)" msgstr "" -#: cps/templates/config_edit.html:217 -msgid "LDAP Admin username" +#: cps/templates/config_edit.html:229 +msgid "LDAP Administrator Username" msgstr "" -#: cps/templates/config_edit.html:221 -msgid "LDAP Admin password" +#: cps/templates/config_edit.html:233 +msgid "LDAP Administrator Password" msgstr "" -#: cps/templates/config_edit.html:226 -msgid "LDAP Server use SSL" +#: cps/templates/config_edit.html:238 +msgid "LDAP Server Enable SSL" msgstr "" -#: cps/templates/config_edit.html:230 -msgid "LDAP Server use TLS" +#: cps/templates/config_edit.html:242 +msgid "LDAP Server Enable TLS" msgstr "" -#: cps/templates/config_edit.html:234 +#: cps/templates/config_edit.html:246 msgid "LDAP Server Certificate" msgstr "" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:250 msgid "LDAP SSL Certificate Path" msgstr "" -#: cps/templates/config_edit.html:243 +#: cps/templates/config_edit.html:255 msgid "LDAP Distinguished Name (DN)" msgstr "" -#: cps/templates/config_edit.html:247 -msgid "LDAP User object filter" +#: cps/templates/config_edit.html:259 +msgid "LDAP User Object Filter" msgstr "" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:264 msgid "LDAP Server is OpenLDAP?" msgstr "" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:272 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:263 +#: cps/templates/config_edit.html:275 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:279 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:276 +#: cps/templates/config_edit.html:288 msgid "Allow Reverse Proxy Authentication" msgstr "" -#: cps/templates/config_edit.html:280 +#: cps/templates/config_edit.html:292 msgid "Reverse Proxy Header Name" msgstr "" -#: cps/templates/config_edit.html:292 +#: cps/templates/config_edit.html:304 msgid "External binaries" msgstr "Configuration des outils de conversion externes" -#: cps/templates/config_edit.html:300 -msgid "No converter" +#: cps/templates/config_edit.html:312 +msgid "No Converter" msgstr "Pas de convertisseur" -#: cps/templates/config_edit.html:302 +#: cps/templates/config_edit.html:314 msgid "Use Kindlegen" msgstr "Utiliser Kindlegen" -#: cps/templates/config_edit.html:304 +#: cps/templates/config_edit.html:316 msgid "Use calibre's ebook converter" msgstr "Utiliser Calibre ebook-convert" -#: cps/templates/config_edit.html:308 +#: cps/templates/config_edit.html:320 msgid "E-Book converter settings" msgstr "Paramètres de la commande de conversion de livres" -#: cps/templates/config_edit.html:312 +#: cps/templates/config_edit.html:324 msgid "Path to convertertool" msgstr "Chemin d’accès à la commande de conversion" -#: cps/templates/config_edit.html:318 +#: cps/templates/config_edit.html:330 msgid "Location of Unrar binary" msgstr "Chemin d’accès à la commande UnRar" -#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 -#: cps/templates/login.html:4 +#: cps/templates/config_edit.html:349 cps/templates/layout.html:84 +#: cps/templates/login.html:4 cps/templates/login.html:20 msgid "Login" msgstr "Connexion" -#: cps/templates/config_view_edit.html:12 +#: cps/templates/config_view_edit.html:16 msgid "View Configuration" msgstr "Configuration du mode d’affichage" -#: cps/templates/config_view_edit.html:19 cps/templates/shelf_edit.html:7 +#: cps/templates/config_view_edit.html:23 cps/templates/shelf_edit.html:7 msgid "Title" msgstr "Titre" -#: cps/templates/config_view_edit.html:27 -msgid "No. of random books to show" +#: cps/templates/config_view_edit.html:31 +msgid "No. of Random Books to Display" msgstr "Nombre de livres choisis au hasard à afficher" -#: cps/templates/config_view_edit.html:31 -msgid "No. of authors to show before hiding (0=disable hiding)" +#: cps/templates/config_view_edit.html:35 +msgid "No. of Authors to Display Before Hiding (0=Disable Hiding)" msgstr "Nombre d’auteurs à afficher avant de masquer (0=désactiver le masquage)" -#: cps/templates/config_view_edit.html:35 cps/templates/readcbr.html:112 +#: cps/templates/config_view_edit.html:39 cps/templates/readcbr.html:112 msgid "Theme" msgstr "Thème" -#: cps/templates/config_view_edit.html:37 +#: cps/templates/config_view_edit.html:41 msgid "Standard Theme" msgstr "Thème par défaut" -#: cps/templates/config_view_edit.html:38 +#: cps/templates/config_view_edit.html:42 msgid "caliBlur! Dark Theme" msgstr "thème caliBur! Dark Theme" -#: cps/templates/config_view_edit.html:42 -msgid "Regular expression for ignoring columns" +#: cps/templates/config_view_edit.html:46 +msgid "Regular Expression for Ignoring Columns" msgstr "Expression régulière à utiliser pour filtrer les colonnes" -#: cps/templates/config_view_edit.html:46 -msgid "Link read/unread status to Calibre column" +#: cps/templates/config_view_edit.html:50 +msgid "Link Read/Unread Status to Calibre Column" msgstr "Lier le statut lu/non lu à la colonne équivalente dans Calibre" -#: cps/templates/config_view_edit.html:55 -msgid "Regular expression for title sorting" -msgstr "Expression régulière à utiliser pour trier les titres" - #: cps/templates/config_view_edit.html:59 -msgid "Tags for Mature Content" -msgstr "Mots clés pour contenue pour adulte" +msgid "View Restrictions based on Calibre column" +msgstr "" + +#: cps/templates/config_view_edit.html:61 cps/templates/email_edit.html:21 +msgid "None" +msgstr "Aucun" + +#: cps/templates/config_view_edit.html:68 +msgid "Regular Expression for Title Sorting" +msgstr "Expression régulière à utiliser pour trier les titres" -#: cps/templates/config_view_edit.html:73 -msgid "Default settings for new users" +#: cps/templates/config_view_edit.html:80 +msgid "Default Settings for New Users" msgstr "Réglages par défaut pour les nouveaux utilisateurs" -#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:82 -msgid "Admin user" +#: cps/templates/config_view_edit.html:88 cps/templates/user_edit.html:92 +msgid "Admin User" msgstr "Utilisateur admin" -#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:91 +#: cps/templates/config_view_edit.html:92 cps/templates/user_edit.html:97 msgid "Allow Downloads" msgstr "Permettre les téléchargements" -#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:95 -msgid "Allow book viewer" +#: cps/templates/config_view_edit.html:96 cps/templates/user_edit.html:101 +msgid "Allow eBook Viewer" msgstr "Autoriser le visionneur de livres" -#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:99 +#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:105 msgid "Allow Uploads" msgstr "Permettre le téléversement de fichiers" -#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:103 +#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:109 msgid "Allow Edit" msgstr "Permettre l'édition" -#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 -msgid "Allow Delete books" -msgstr "Autoriser la suppression des livres" +#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:113 +msgid "Allow Delete Books" +msgstr "" -#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:112 +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:118 msgid "Allow Changing Password" msgstr "Permettre le changement de mot de passe" -#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:116 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:122 msgid "Allow Editing Public Shelfs" msgstr "Autoriser la modification d’étagères publiques" -#: cps/templates/config_view_edit.html:119 -msgid "Default visibilities for new users" +#: cps/templates/config_view_edit.html:126 +msgid "Default Visibilities for New Users" msgstr "Mode de visualisation par défaut pour les nouveaux utilisateurs" -#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:74 -msgid "Show random books in detail view" +#: cps/templates/config_view_edit.html:142 +msgid "Show Random Books in Detail View" msgstr "Montrer aléatoirement des livres dans la vue détaillée" -#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:87 -msgid "Show mature content" -msgstr "Montrer le contenu pour adulte" +#: cps/templates/config_view_edit.html:144 +msgid "Add Allowed/Denied Tags" +msgstr "" + +#: cps/templates/config_view_edit.html:145 +msgid "Add Allowed/Denied custom column values" +msgstr "" #: cps/templates/detail.html:59 -msgid "Read in browser" +msgid "Read in Browser" msgstr "Lire dans le navigateur" #: cps/templates/detail.html:72 -msgid "Listen in browser" +msgid "Listen in Browser" msgstr "Lire dans le navigateur" #: cps/templates/detail.html:117 @@ -1665,9 +1712,9 @@ msgstr "Livre" msgid "of" msgstr "de" -#: cps/templates/detail.html:123 -msgid "language" -msgstr "langue" +#: cps/templates/detail.html:165 +msgid "Published" +msgstr "" #: cps/templates/detail.html:200 msgid "Mark As Unread" @@ -1690,21 +1737,9 @@ msgid "Add to shelf" msgstr "Ajouter à l'étagère" #: cps/templates/detail.html:286 -msgid "Edit metadata" +msgid "Edit Metadata" msgstr "Éditer les métadonnées" -#: cps/templates/email_edit.html:15 -msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" -msgstr "Port SMTP (habituellement 25 pour strict SMTP et 465 pour SSL et 587 pour STARTTLS)" - -#: cps/templates/email_edit.html:19 -msgid "Encryption" -msgstr "Type de chiffrement" - -#: cps/templates/email_edit.html:21 -msgid "None" -msgstr "Aucun" - #: cps/templates/email_edit.html:22 msgid "STARTTLS" msgstr "STARTTLS" @@ -1714,23 +1749,15 @@ msgid "SSL/TLS" msgstr "SSL/TLS" #: cps/templates/email_edit.html:31 -msgid "SMTP password" +msgid "SMTP Password" msgstr "Mot de passe utilisateur SMTP" -#: cps/templates/email_edit.html:35 -msgid "From e-mail" -msgstr "Adresse de l’expéditeur des courriels" - -#: cps/templates/email_edit.html:38 -msgid "Save settings" -msgstr "Sauvegarder les réglages" - #: cps/templates/email_edit.html:39 -msgid "Save settings and send Test E-Mail" +msgid "Save and Send Test E-mail" msgstr "Sauvegarder les réglages et tester l’envoi d’un courriel" #: cps/templates/email_edit.html:43 -msgid "Allowed domains for registering" +msgid "Allowed Domains (Whitelist)" msgstr "Domaines autorisés pour l’inscription" #: cps/templates/email_edit.html:46 cps/templates/email_edit.html:72 @@ -1746,29 +1773,29 @@ msgid "Enter domainname" msgstr "Saisir le nom du domaine" #: cps/templates/email_edit.html:60 -msgid "Denied domains for registering" +msgid "Denied Domains (Blacklist)" msgstr "" #: cps/templates/email_edit.html:90 -msgid "Do you really want to delete this domain rule?" +msgid "Are you sure you want to delete this domain?" msgstr "Souhaitez-vous vraiment supprimer cette règle de domaine ?" -#: cps/templates/feed.xml:21 cps/templates/layout.html:176 +#: cps/templates/feed.xml:21 cps/templates/layout.html:175 msgid "Next" msgstr "Suivant" -#: cps/templates/http_error.html:37 -msgid "Create issue" +#: cps/templates/generate_kobo_auth_url.html:5 +msgid "Open the .kobo/Kobo eReader.conf file in a text editor and add (or edit):" +msgstr "" + +#: cps/templates/http_error.html:38 +msgid "Create Issue" msgstr "Signaler un problème" -#: cps/templates/http_error.html:44 -msgid "Back to home" +#: cps/templates/http_error.html:45 +msgid "Return to Home" msgstr "Retour à l’accueil" -#: cps/templates/index.html:5 -msgid "Discover (Random Books)" -msgstr "Découverte (livres au hasard)" - #: cps/templates/index.html:64 msgid "Group by series" msgstr "Grouper par série" @@ -1793,7 +1820,11 @@ msgstr "" msgid "The latest Books" msgstr "Les derniers livres" -#: cps/templates/index.xml:42 +#: cps/templates/index.xml:38 +msgid "Random Books" +msgstr "Livres au hasard" + +#: cps/templates/index.xml:42 cps/templates/user_edit.html:80 msgid "Show Random Books" msgstr "Montrer des livres au hasard" @@ -1818,22 +1849,26 @@ msgid "Books ordered by Languages" msgstr "" #: cps/templates/index.xml:100 +msgid "Books ordered by Rating" +msgstr "" + +#: cps/templates/index.xml:108 msgid "Books ordered by file formats" msgstr "" -#: cps/templates/index.xml:103 cps/templates/layout.html:137 +#: cps/templates/index.xml:111 cps/templates/layout.html:136 msgid "Public Shelves" msgstr "Étagères publiques" -#: cps/templates/index.xml:107 +#: cps/templates/index.xml:115 msgid "Books organized in public shelfs, visible to everyone" msgstr "Livres disponibles dans les étagères publiques, visibles par tous" -#: cps/templates/index.xml:111 cps/templates/layout.html:141 +#: cps/templates/index.xml:119 cps/templates/layout.html:140 msgid "Your Shelves" msgstr "Vos étagères" -#: cps/templates/index.xml:115 +#: cps/templates/index.xml:123 msgid "User's own shelfs, only visible to the current user himself" msgstr "Etagères personnelles, seulement visible de l’utilisateur propréitaire" @@ -1841,10 +1876,19 @@ msgstr "Etagères personnelles, seulement visible de l’utilisateur propréitai msgid "Home" msgstr "Accueil" +#: cps/templates/layout.html:28 cps/templates/shelf_order.html:32 +#: cps/templates/user_edit.html:178 +msgid "Back" +msgstr "Retour" + #: cps/templates/layout.html:34 -msgid "Toggle navigation" +msgid "Toggle Navigation" msgstr "Basculer la navigation" +#: cps/templates/layout.html:45 +msgid "Search Library" +msgstr "" + #: cps/templates/layout.html:55 msgid "Advanced Search" msgstr "Recherche avancée" @@ -1866,74 +1910,101 @@ msgstr "Déconnexion" msgid "Register" msgstr "Créer un compte" -#: cps/templates/layout.html:116 cps/templates/layout.html:223 +#: cps/templates/layout.html:116 cps/templates/layout.html:222 msgid "Uploading..." msgstr "Téléversement en cours…" #: cps/templates/layout.html:117 -msgid "please don't refresh the page" -msgstr "veuillez ne pas rafraîchir la page" +msgid "Please do not refresh the page" +msgstr "" #: cps/templates/layout.html:127 msgid "Browse" msgstr "Explorer" -#: cps/templates/layout.html:146 +#: cps/templates/layout.html:145 msgid "Create a Shelf" msgstr "Créer une étagère" -#: cps/templates/layout.html:147 cps/templates/stats.html:3 +#: cps/templates/layout.html:146 cps/templates/stats.html:3 msgid "About" msgstr "À propos" -#: cps/templates/layout.html:161 +#: cps/templates/layout.html:160 msgid "Previous" msgstr "Précédent" -#: cps/templates/layout.html:188 +#: cps/templates/layout.html:187 msgid "Book Details" msgstr "Détails du livre" -#: cps/templates/layout.html:222 +#: cps/templates/layout.html:221 msgid "Upload done, processing, please wait..." msgstr "Téléversement terminé, traitement en cours, veuillez patienter…." -#: cps/templates/layout.html:225 +#: cps/templates/layout.html:224 msgid "Error" msgstr "Erreur" -#: cps/templates/login.html:8 cps/templates/login.html:9 -#: cps/templates/register.html:7 cps/templates/user_edit.html:8 -msgid "Username" -msgstr "Nom d'utilisateur" - #: cps/templates/login.html:12 cps/templates/login.html:13 #: cps/templates/user_edit.html:21 msgid "Password" msgstr "Mot de passe" #: cps/templates/login.html:17 -msgid "Remember me" +msgid "Remember Me" msgstr "Se rappeler de moi" #: cps/templates/login.html:22 -msgid "Forgot password" +msgid "Forgot Password?" msgstr "" #: cps/templates/login.html:25 -msgid "Log in with magic link" +msgid "Log in with Magic Link" msgstr "Se connecter avec le (\"magic link\")" -#: cps/templates/logviewer.html:5 -msgid "Show Calibre-Web log" -msgstr "Afficher le journal Calibre-Web" +#: cps/templates/logviewer.html:6 +msgid "Show Calibre-Web Log: " +msgstr "" #: cps/templates/logviewer.html:8 -msgid "Show access log" -msgstr "Afficher le journal des accès" +msgid "Calibre-Web Log: " +msgstr "" + +#: cps/templates/logviewer.html:8 +msgid "Stream output, can't be displayed" +msgstr "" + +#: cps/templates/logviewer.html:12 +msgid "Show Access Log: " +msgstr "" + +#: cps/templates/modal_restriction.html:6 +msgid "Select allowed/denied Tags" +msgstr "" + +#: cps/templates/modal_restriction.html:7 +msgid "Select allowed/denied Custom Column values" +msgstr "" + +#: cps/templates/modal_restriction.html:8 +msgid "Select allowed/denied Tags of user" +msgstr "" + +#: cps/templates/modal_restriction.html:9 +msgid "Select allowed/denied Custom Column values of user" +msgstr "" + +#: cps/templates/modal_restriction.html:15 +msgid "Enter Tag" +msgstr "" + +#: cps/templates/modal_restriction.html:24 +msgid "Add View Restriction" +msgstr "" #: cps/templates/osd.xml:5 -msgid "Calibre-Web ebook catalog" +msgid "Calibre-Web eBook Catalog" msgstr "Catalogue de livres électroniques Calibre-Web" #: cps/templates/read.html:74 @@ -2045,51 +2116,51 @@ msgid "Basic txt Reader" msgstr "Lecteur de texte simple" #: cps/templates/register.html:4 -msgid "Register a new account" +msgid "Register New Account" msgstr "Enregistrer un nouveau compte" #: cps/templates/register.html:8 msgid "Choose a username" msgstr "Choisissez un nom d'utilisateur" -#: cps/templates/register.html:11 cps/templates/user_edit.html:13 -msgid "E-mail address" -msgstr "Adresse de courriel" - #: cps/templates/register.html:12 msgid "Your email address" msgstr "Votre adresse de courriel" +#: cps/templates/remote_login.html:4 +msgid "Magic Link - Authorise New Device" +msgstr "" + #: cps/templates/remote_login.html:6 -msgid "Use your other device, login and visit " +msgid "On another device, login and visit:" msgstr "Utilisez votre autre appareil, connectez-vous et visitez " -#: cps/templates/remote_login.html:9 -msgid "Once you do so, you will automatically get logged in on this device." +#: cps/templates/remote_login.html:10 +msgid "Once verified, you will automatically be logged in on this device." msgstr "Une fois fait, vous serez automatiquement connecté à cet appareil." -#: cps/templates/remote_login.html:12 -msgid "The link will expire after 10 minutes." +#: cps/templates/remote_login.html:13 +msgid "This verification link will expire in 10 minutes." msgstr "Le lien expirera après 10 minutes." #: cps/templates/search.html:5 -msgid "No Results for:" -msgstr "Aucun résultat pour :" +msgid "No Results Found" +msgstr "" #: cps/templates/search.html:6 -msgid "Please try a different search" -msgstr "Essayer une recherche différente" +msgid "Search Term:" +msgstr "" #: cps/templates/search.html:8 msgid "Results for:" msgstr "Résultats pour :" #: cps/templates/search_form.html:19 -msgid "Publishing date from" +msgid "Published Date From" msgstr "Date de publication (depuis)" #: cps/templates/search_form.html:26 -msgid "Publishing date to" +msgid "Published Date To" msgstr "Date de publication (jusqu’à)" #: cps/templates/search_form.html:43 @@ -2113,11 +2184,11 @@ msgid "Exclude Extensions" msgstr "" #: cps/templates/search_form.html:117 -msgid "Rating bigger than" +msgid "Rating Above" msgstr "Évaluation supérieure à" #: cps/templates/search_form.html:121 -msgid "Rating less than" +msgid "Rating Below" msgstr "Évaluation inférieure à" #: cps/templates/shelf.html:10 @@ -2133,23 +2204,23 @@ msgid "Change order" msgstr "Modifier l’ordre" #: cps/templates/shelf.html:67 -msgid "Do you really want to delete the shelf?" +msgid "Are you sure you want to delete this shelf?" msgstr "Voulez-vous vraiment supprimer l’étagère?" #: cps/templates/shelf.html:70 -msgid "Shelf will be lost for everybody and forever!" +msgid "Shelf will be deleted for all users" msgstr "L’étagère sera supprimée pour tout le monde et de façon définitive !" #: cps/templates/shelf_edit.html:13 -msgid "should the shelf be public?" +msgid "Share with Everyone" msgstr "cette étagère doit-elle être publique ?" #: cps/templates/shelf_order.html:5 -msgid "Drag 'n drop to rearrange order" +msgid "Drag to Rearrange Order" msgstr "Glisser-déposer pour modifier l’ordre" #: cps/templates/stats.html:7 -msgid "Calibre library statistics" +msgid "Library Statistics" msgstr "Statistiques de la librairie Calibre" #: cps/templates/stats.html:12 @@ -2169,21 +2240,17 @@ msgid "Series in this Library" msgstr "Séries dans la librairie" #: cps/templates/stats.html:28 -msgid "Linked libraries" +msgid "Linked Libraries" msgstr "Librairies liées" #: cps/templates/stats.html:32 -msgid "Program library" +msgid "Program Library" msgstr "Bibliothèque logiciel" #: cps/templates/stats.html:33 msgid "Installed Version" msgstr "Version installée" -#: cps/templates/tasks.html:7 -msgid "Tasks list" -msgstr "Liste des tâches" - #: cps/templates/tasks.html:12 msgid "User" msgstr "Utilisateur" @@ -2201,11 +2268,11 @@ msgid "Progress" msgstr "Avancement" #: cps/templates/tasks.html:17 -msgid "Runtime" +msgid "Run Time" msgstr "Durée" #: cps/templates/tasks.html:18 -msgid "Starttime" +msgid "Start Time" msgstr "Démarrage" #: cps/templates/tasks.html:24 @@ -2220,38 +2287,58 @@ msgstr "Masquer toutes les tâches" msgid "Reset user Password" msgstr "Réinitialiser le mot de passe de l’utilisateur" -#: cps/templates/user_edit.html:26 -msgid "Kindle E-Mail" -msgstr "Adresse de courriel Kindle" - -#: cps/templates/user_edit.html:39 -msgid "Show books with language" +#: cps/templates/user_edit.html:41 +msgid "Language of Books" msgstr "Montrer les livres dans la langue" -#: cps/templates/user_edit.html:41 -msgid "Show all" +#: cps/templates/user_edit.html:43 +msgid "Show All" msgstr "Montrer tout" -#: cps/templates/user_edit.html:51 +#: cps/templates/user_edit.html:52 msgid "OAuth Settings" msgstr "Réglages OAuth" -#: cps/templates/user_edit.html:53 +#: cps/templates/user_edit.html:54 msgid "Link" msgstr "Relier" -#: cps/templates/user_edit.html:55 +#: cps/templates/user_edit.html:56 msgid "Unlink" msgstr "Dissocier" -#: cps/templates/user_edit.html:123 -msgid "Delete this user" +#: cps/templates/user_edit.html:62 +msgid "Kobo Sync Token" +msgstr "" + +#: cps/templates/user_edit.html:64 +msgid "Create/View" +msgstr "" + +#: cps/templates/user_edit.html:83 +msgid "Add allowed/denied Tags" +msgstr "" + +#: cps/templates/user_edit.html:84 +msgid "Add allowed/denied custom column values" +msgstr "" + +#: cps/templates/user_edit.html:129 +msgid "Delete User" msgstr "Supprimer cet utilisateur" -#: cps/templates/user_edit.html:138 +#: cps/templates/user_edit.html:144 msgid "Recent Downloads" msgstr "Téléchargement récent" +#: cps/templates/user_edit.html:160 +msgid "Generate Kobo Auth URL" +msgstr "" + +#: cps/templates/user_edit.html:176 +msgid "Do you really want to delete the Kobo Token?" +msgstr "" + #~ msgid "Use" #~ msgstr "Utiliser" @@ -2267,3 +2354,87 @@ msgstr "Téléchargement récent" #~ msgid "New Books" #~ msgstr "Nouveaux livres" +#~ msgid "Show Calibre-Web log" +#~ msgstr "Afficher le journal Calibre-Web" + +#~ msgid "Show access log" +#~ msgstr "Afficher le journal des accès" + +#~ msgid "Tags for Mature Content" +#~ msgstr "Mots clés pour contenue pour adulte" + +#~ msgid "Show mature content" +#~ msgstr "Montrer le contenu pour adulte" + +#~ msgid "deny" +#~ msgstr "" + +#~ msgid "allow" +#~ msgstr "" + +#~ msgid "Kobo Set-up" +#~ msgstr "" + +#~ msgid "Publisher list" +#~ msgstr "Liste des éditeurs" + +#~ msgid "Series list" +#~ msgstr "Liste des séries" + +#~ msgid "Available languages" +#~ msgstr "Langues disponibles" + +#~ msgid "Category list" +#~ msgstr "Liste des catégories" + +#~ msgid "Series id" +#~ msgstr "Numéro dans la série" + +#~ msgid "Submit" +#~ msgstr "Soumettre" + +#~ msgid "Go!" +#~ msgstr "Allez !" + +#~ msgid "Allow Delete books" +#~ msgstr "Autoriser la suppression des livres" + +#~ msgid "language" +#~ msgstr "langue" + +#~ msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" +#~ msgstr "Port SMTP (habituellement 25 pour strict SMTP et 465 pour SSL et 587 pour STARTTLS)" + +#~ msgid "From e-mail" +#~ msgstr "Adresse de l’expéditeur des courriels" + +#~ msgid "Save settings" +#~ msgstr "Sauvegarder les réglages" + +#~ msgid "api_endpoint=" +#~ msgstr "" + +#~ msgid "please don't refresh the page" +#~ msgstr "veuillez ne pas rafraîchir la page" + +#~ msgid "E-mail address" +#~ msgstr "Adresse de courriel" + +#~ msgid "No Results for:" +#~ msgstr "Aucun résultat pour :" + +#~ msgid "Please try a different search" +#~ msgstr "Essayer une recherche différente" + +#~ msgid "Tasks list" +#~ msgstr "Liste des tâches" + +#~ msgid "Kindle E-Mail" +#~ msgstr "Adresse de courriel Kindle" + +#~ msgid "Please note that every visit to this current page invalidates any previously generated Authentication url for this user." +#~ msgstr "" + +#~ msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" +#~ msgstr "Le format d'image utilisé pour la couverture n'est pas supporté (jpg/png/webp uniquement). Sauvegarde impossible." + diff --git a/cps/translations/hu/LC_MESSAGES/messages.mo b/cps/translations/hu/LC_MESSAGES/messages.mo index 536b7284..7ac19ae6 100644 Binary files a/cps/translations/hu/LC_MESSAGES/messages.mo and b/cps/translations/hu/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/hu/LC_MESSAGES/messages.po b/cps/translations/hu/LC_MESSAGES/messages.po index 3891bb6d..b36ee07a 100644 --- a/cps/translations/hu/LC_MESSAGES/messages.po +++ b/cps/translations/hu/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2020-01-12 13:57+0100\n" +"POT-Creation-Date: 2020-03-12 20:31+0100\n" "PO-Revision-Date: 2019-04-06 23:36+0200\n" "Last-Translator: \n" "Language: hu\n" @@ -16,7 +16,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.7.0\n" +"Generated-By: Babel 2.8.0\n" #: cps/about.py:42 msgid "installed" @@ -26,7 +26,7 @@ msgstr "" msgid "not installed" msgstr "nincs telepítve" -#: cps/about.py:84 +#: cps/about.py:87 msgid "Statistics" msgstr "Statisztika" @@ -40,7 +40,7 @@ msgstr "A kiszolgáló leállítása folyamatban, zárd be ezt az ablakot" #: cps/admin.py:110 cps/editbooks.py:410 cps/editbooks.py:419 #: cps/editbooks.py:539 cps/editbooks.py:541 cps/editbooks.py:594 -#: cps/updater.py:446 cps/uploader.py:97 cps/uploader.py:108 +#: cps/updater.py:456 cps/uploader.py:96 cps/uploader.py:107 msgid "Unknown" msgstr "Ismeretlen" @@ -48,155 +48,164 @@ msgstr "Ismeretlen" msgid "Admin page" msgstr "Rendszergazda oldala" -#: cps/admin.py:148 cps/templates/admin.html:115 +#: cps/admin.py:151 msgid "UI Configuration" msgstr "Felhasználói felület beállításai" -#: cps/admin.py:185 cps/admin.py:412 +#: cps/admin.py:187 cps/admin.py:637 msgid "Calibre-Web configuration updated" msgstr "A Calibre-Web konfigurációja frissítve." -#: cps/admin.py:442 cps/templates/admin.html:114 +#: cps/admin.py:434 cps/admin.py:440 cps/admin.py:451 cps/admin.py:462 +#: cps/templates/modal_restriction.html:29 +msgid "Deny" +msgstr "" + +#: cps/admin.py:436 cps/admin.py:442 cps/admin.py:453 cps/admin.py:464 +#: cps/templates/modal_restriction.html:28 +msgid "Allow" +msgstr "" + +#: cps/admin.py:667 msgid "Basic Configuration" msgstr "Alapvető beállítások" -#: cps/admin.py:465 cps/web.py:1093 +#: cps/admin.py:691 cps/web.py:1089 msgid "Please fill out all fields!" msgstr "Az összes mezőt ki kell tölteni!" -#: cps/admin.py:467 cps/admin.py:478 cps/admin.py:484 cps/admin.py:499 -#: cps/templates/admin.html:38 +#: cps/admin.py:694 cps/admin.py:706 cps/admin.py:712 cps/admin.py:730 msgid "Add new user" msgstr "Új felhasználó hozzáadása" -#: cps/admin.py:476 cps/web.py:1318 +#: cps/admin.py:703 cps/web.py:1318 msgid "E-mail is not from valid domain" msgstr "Az e-mail tartománya nem érvényes." -#: cps/admin.py:482 cps/admin.py:493 +#: cps/admin.py:710 cps/admin.py:725 msgid "Found an existing account for this e-mail address or nickname." msgstr "Már létezik felhasználó ehhez az e-mail címhez vagy felhasználói névhez." -#: cps/admin.py:489 +#: cps/admin.py:721 #, python-format msgid "User '%(user)s' created" msgstr "A következő felhasználó létrehozva: %(user)s" -#: cps/admin.py:509 +#: cps/admin.py:740 msgid "Edit e-mail server settings" msgstr "Az e-mail kiszolgáló beállításainak módosítása" -#: cps/admin.py:535 +#: cps/admin.py:766 #, python-format msgid "Test e-mail successfully send to %(kindlemail)s" msgstr "A teszt levél sikeresen elküldve ide: %(kindlemail)s" -#: cps/admin.py:538 +#: cps/admin.py:769 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Hiba történt a teszt levél küldése során: %(res)s" -#: cps/admin.py:540 +#: cps/admin.py:771 msgid "Please configure your e-mail address first..." msgstr "" -#: cps/admin.py:542 +#: cps/admin.py:773 msgid "E-mail server settings updated" msgstr "Az e-mail kiszolgáló beállításai frissítve." -#: cps/admin.py:571 +#: cps/admin.py:803 #, python-format msgid "User '%(nick)s' deleted" msgstr "A felhasználó törölve: %(nick)s" -#: cps/admin.py:574 +#: cps/admin.py:806 msgid "No admin user remaining, can't delete user" msgstr "" -#: cps/admin.py:612 cps/web.py:1359 +#: cps/admin.py:842 cps/web.py:1361 msgid "Found an existing account for this e-mail address." msgstr "Már létezik felhasználó ehhez az e-mail címhez." -#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1334 +#: cps/admin.py:852 cps/admin.py:867 cps/admin.py:887 cps/web.py:1336 #, python-format msgid "Edit User %(nick)s" msgstr " A felhasználó szerkesztése: %(nick)s" -#: cps/admin.py:622 cps/web.py:1327 +#: cps/admin.py:858 cps/web.py:1328 msgid "This username is already taken" msgstr "" -#: cps/admin.py:637 +#: cps/admin.py:874 #, python-format msgid "User '%(nick)s' updated" msgstr "A felhasználó frissítve: %(nick)s" -#: cps/admin.py:640 +#: cps/admin.py:877 msgid "An unknown error occured." msgstr "Ismeretlen hiba történt." -#: cps/admin.py:657 +#: cps/admin.py:900 #, python-format msgid "Password for user %(user)s reset" msgstr "A(z) %(user)s felhasználó jelszavának alaphelyzetbe állítása" -#: cps/admin.py:660 cps/web.py:1118 cps/web.py:1174 +#: cps/admin.py:903 cps/web.py:1114 cps/web.py:1170 msgid "An unknown error occurred. Please try again later." msgstr "Ismeretlen hiba történt. Próbáld újra később!" -#: cps/admin.py:663 cps/web.py:1062 +#: cps/admin.py:906 cps/web.py:1055 msgid "Please configure the SMTP mail settings first..." msgstr "Először be kell állítani az SMTP levelező beállításokat..." -#: cps/admin.py:674 +#: cps/admin.py:918 msgid "Logfile viewer" msgstr "" -#: cps/admin.py:710 +#: cps/admin.py:957 msgid "Requesting update package" msgstr "Frissítési csomag kérése" -#: cps/admin.py:711 +#: cps/admin.py:958 msgid "Downloading update package" msgstr "Frissítési csomag letöltése" -#: cps/admin.py:712 +#: cps/admin.py:959 msgid "Unzipping update package" msgstr "Frissítési csomag kitömörítése" -#: cps/admin.py:713 +#: cps/admin.py:960 msgid "Replacing files" msgstr "Fájlok cserélése" -#: cps/admin.py:714 +#: cps/admin.py:961 msgid "Database connections are closed" msgstr "Adatbázis kapcsolatok lezárva" -#: cps/admin.py:715 +#: cps/admin.py:962 msgid "Stopping server" msgstr "Szerver leállítása" -#: cps/admin.py:716 +#: cps/admin.py:963 msgid "Update finished, please press okay and reload page" msgstr "A frissítés települt, kattints az OK-ra és újra tölt az oldal" -#: cps/admin.py:717 cps/admin.py:718 cps/admin.py:719 cps/admin.py:720 +#: cps/admin.py:964 cps/admin.py:965 cps/admin.py:966 cps/admin.py:967 msgid "Update failed:" msgstr "A frissítés nem sikerült:" -#: cps/admin.py:717 cps/updater.py:272 cps/updater.py:457 cps/updater.py:459 +#: cps/admin.py:964 cps/updater.py:282 cps/updater.py:467 cps/updater.py:469 msgid "HTTP Error" msgstr "HTTP hiba" -#: cps/admin.py:718 cps/updater.py:274 cps/updater.py:461 +#: cps/admin.py:965 cps/updater.py:284 cps/updater.py:471 msgid "Connection error" msgstr "Kapcsolódási hiba" -#: cps/admin.py:719 cps/updater.py:276 cps/updater.py:463 +#: cps/admin.py:966 cps/updater.py:286 cps/updater.py:473 msgid "Timeout while establishing connection" msgstr "Időtúllépés a kapcsolódás során" -#: cps/admin.py:720 cps/updater.py:278 cps/updater.py:465 +#: cps/admin.py:967 cps/updater.py:288 cps/updater.py:475 msgid "General error" msgstr "Általános hiba" @@ -236,10 +245,6 @@ msgstr "Nem sikerült elmenteni a %(file)s fájlt." msgid "File format %(ext)s added to %(book)s" msgstr "A(z) %(ext)s fájlformátum hozzáadva a könyvhez: %(book)s." -#: cps/editbooks.py:376 -msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" -msgstr "" - #: cps/editbooks.py:451 msgid "Cover is not a jpg file, can't save" msgstr "" @@ -276,30 +281,30 @@ msgstr "Nem sikerült elmenteni a %(file)s fájlt." msgid "Failed to delete file %(file)s (Permission denied)." msgstr "Nem sikerült törölni a %(file)s fájlt." -#: cps/editbooks.py:710 +#: cps/editbooks.py:709 #, python-format msgid "File %(file)s uploaded" msgstr "" -#: cps/editbooks.py:739 +#: cps/editbooks.py:738 msgid "Source or destination format for conversion missing" msgstr "Az átalakításhoz hiányzik a forrás- vagy a célformátum!" -#: cps/editbooks.py:747 +#: cps/editbooks.py:746 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "A könyv sikeresen átalakításra lett jelölve a következő formátumra: %(book_format)s" -#: cps/editbooks.py:751 +#: cps/editbooks.py:750 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Hiba történt a könyv átalakításakor: %(res)s" -#: cps/gdrive.py:62 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgstr "A Google Drive beállítása nem fejeződött be, próbáld kikapcsolni és újra aktíválni a Google Drive-ot." -#: cps/gdrive.py:104 +#: cps/gdrive.py:103 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "A visszahívási tartomány nem ellenőrzött, kövesd az alábbi lépéseket a tartomány ellenőrzéséhez a Google Developer Console-ban:" @@ -389,83 +394,111 @@ msgstr "A \"%(file)s\" fájl nem található a Google Drive-on" msgid "Book path %(path)s not found on Google Drive" msgstr "A könyv elérési útja (\"%(path)s\") nem található a Google Drive-on" -#: cps/helper.py:643 +#: cps/helper.py:511 +msgid "Failed to create path for cover" +msgstr "" + +#: cps/helper.py:516 +msgid "Cover-file is not a valid image file" +msgstr "" + +#: cps/helper.py:519 +msgid "Failed to store cover-file" +msgstr "" + +#: cps/helper.py:530 +msgid "Only jpg/jpeg/png/webp files are supported as coverfile" +msgstr "" + +#: cps/helper.py:544 +msgid "Only jpg/jpeg files are supported as coverfile" +msgstr "" + +#: cps/helper.py:658 msgid "Waiting" msgstr "Várakozás" -#: cps/helper.py:645 +#: cps/helper.py:660 msgid "Failed" msgstr "Nem sikerült" -#: cps/helper.py:647 +#: cps/helper.py:662 msgid "Started" msgstr "Elindítva" -#: cps/helper.py:649 +#: cps/helper.py:664 msgid "Finished" msgstr "Végrehajtva" -#: cps/helper.py:651 +#: cps/helper.py:666 msgid "Unknown Status" msgstr "Ismeretlen állapot" -#: cps/helper.py:656 +#: cps/helper.py:671 msgid "E-mail: " msgstr "E-mail cím: " -#: cps/helper.py:658 cps/helper.py:662 +#: cps/helper.py:673 cps/helper.py:677 msgid "Convert: " msgstr "Konvertálás:" -#: cps/helper.py:660 +#: cps/helper.py:675 msgid "Upload: " msgstr "Feltöltés:" -#: cps/helper.py:664 +#: cps/helper.py:679 msgid "Unknown Task: " msgstr "Ismeretlen feladat:" -#: cps/oauth_bb.py:75 +#: cps/kobo_auth.py:127 +msgid "PLease access calibre-web from non localhost to get valid api_endpoint for kobo device" +msgstr "" + +#: cps/kobo_auth.py:130 cps/kobo_auth.py:150 +msgid "Kobo Setup" +msgstr "" + +#: cps/oauth_bb.py:74 #, python-format msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:154 msgid "Failed to log in with GitHub." msgstr "" -#: cps/oauth_bb.py:160 +#: cps/oauth_bb.py:159 msgid "Failed to fetch user info from GitHub." msgstr "" -#: cps/oauth_bb.py:171 +#: cps/oauth_bb.py:170 msgid "Failed to log in with Google." msgstr "" -#: cps/oauth_bb.py:176 +#: cps/oauth_bb.py:175 msgid "Failed to fetch user info from Google." msgstr "" -#: cps/oauth_bb.py:274 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s success." msgstr "" -#: cps/oauth_bb.py:278 +#: cps/oauth_bb.py:277 #, python-format msgid "Unlink to %(oauth)s failed." msgstr "" -#: cps/oauth_bb.py:281 +#: cps/oauth_bb.py:280 #, python-format msgid "Not linked to %(oauth)s." msgstr "" -#: cps/oauth_bb.py:309 +#: cps/oauth_bb.py:308 msgid "GitHub Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:328 +#: cps/oauth_bb.py:327 msgid "Google Oauth error, please retry later." msgstr "" @@ -516,403 +549,393 @@ msgstr "A könyvek hozzá lettek adva a következő polchoz: %(sname)s" msgid "Could not add books to shelf: %(sname)s" msgstr "Nem sikerült hozzáadni a könyveket a polchoz: %(sname)s" -#: cps/shelf.py:180 +#: cps/shelf.py:181 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "A könyv el lett távolítva a polcról: %(sname)s" -#: cps/shelf.py:186 +#: cps/shelf.py:190 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "Sajnálom, nincs jogosultságot eltávolítani könyvet erről a polcról: %(sname)s" -#: cps/shelf.py:207 cps/shelf.py:231 +#: cps/shelf.py:211 cps/shelf.py:235 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "Már létezik \"%(title)s\" nevű polc!" -#: cps/shelf.py:212 +#: cps/shelf.py:216 #, python-format msgid "Shelf %(title)s created" msgstr "A következő polc létre lett hozva: %(title)s" -#: cps/shelf.py:214 cps/shelf.py:242 +#: cps/shelf.py:218 cps/shelf.py:246 msgid "There was an error" msgstr "Hiba történt" -#: cps/shelf.py:215 cps/shelf.py:217 +#: cps/shelf.py:219 cps/shelf.py:221 msgid "create a shelf" msgstr "Polc készítése" -#: cps/shelf.py:240 +#: cps/shelf.py:244 #, python-format msgid "Shelf %(title)s changed" msgstr "A következő polc megváltoztatva: %(title)s" -#: cps/shelf.py:243 cps/shelf.py:245 +#: cps/shelf.py:247 cps/shelf.py:249 msgid "Edit a shelf" msgstr "Polc szerkesztése" -#: cps/shelf.py:289 +#: cps/shelf.py:301 #, python-format msgid "Shelf: '%(name)s'" msgstr "Polc: '%(name)s'" -#: cps/shelf.py:292 +#: cps/shelf.py:304 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Hiba a polc megnyitásakor. A polc nem létezik vagy nem elérhető." -#: cps/shelf.py:323 +#: cps/shelf.py:342 +msgid "Hidden Book" +msgstr "" + +#: cps/shelf.py:347 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "A következő polc átrendezése: %(name)s" -#: cps/ub.py:57 +#: cps/ub.py:56 msgid "Recently Added" msgstr "Legutóbb hozzáadott" -#: cps/ub.py:59 +#: cps/ub.py:58 msgid "Show recent books" msgstr "Legutóbbi könyvek mutatása" -#: cps/templates/index.xml:17 cps/ub.py:60 +#: cps/templates/index.xml:17 cps/ub.py:59 msgid "Hot Books" msgstr "Kelendő könyvek" -#: cps/ub.py:61 -msgid "Show hot books" +#: cps/ub.py:60 +msgid "Show Hot Books" msgstr "Kelendő könyvek mutatása" -#: cps/templates/index.xml:24 cps/ub.py:64 -msgid "Best rated Books" +#: cps/templates/index.xml:24 cps/ub.py:63 cps/web.py:508 +msgid "Top Rated Books" msgstr "Legjobb könyvek" -#: cps/ub.py:66 -msgid "Show best rated books" +#: cps/ub.py:65 +msgid "Show Top Rated Books" msgstr "Legjobbra értékelt könyvek mutatása" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67 -#: cps/web.py:1011 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:66 +#: cps/web.py:1005 msgid "Read Books" msgstr "Olvasott könyvek" -#: cps/ub.py:69 +#: cps/ub.py:68 msgid "Show read and unread" msgstr "Mutassa az olvasva/olvasatlan állapotot" -#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71 -#: cps/web.py:1015 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:70 +#: cps/web.py:1009 msgid "Unread Books" msgstr "Olvasatlan könyvek" -#: cps/ub.py:73 +#: cps/ub.py:72 msgid "Show unread" msgstr "" -#: cps/ub.py:74 +#: cps/ub.py:73 msgid "Discover" msgstr "Felfedezés" -#: cps/ub.py:76 +#: cps/ub.py:75 msgid "Show random books" msgstr "Könyvek találomra mutatása" -#: cps/templates/index.xml:75 cps/ub.py:77 +#: cps/templates/index.xml:75 cps/ub.py:76 cps/web.py:787 msgid "Categories" msgstr "Címkék" -#: cps/ub.py:79 +#: cps/ub.py:78 msgid "Show category selection" msgstr "Címke választó mutatása" -#: cps/templates/book_edit.html:71 cps/templates/index.xml:82 -#: cps/templates/search_form.html:53 cps/ub.py:80 +#: cps/templates/book_edit.html:69 cps/templates/index.xml:82 +#: cps/templates/search_form.html:53 cps/ub.py:79 cps/web.py:715 msgid "Series" msgstr "Sorozatok" -#: cps/ub.py:82 +#: cps/ub.py:81 msgid "Show series selection" msgstr "Sorozat választó mutatása" -#: cps/templates/index.xml:61 cps/ub.py:83 +#: cps/templates/index.xml:61 cps/ub.py:82 msgid "Authors" msgstr "Szerzők" -#: cps/ub.py:85 +#: cps/ub.py:84 msgid "Show author selection" msgstr "Szerző választó mutatása" -#: cps/templates/index.xml:68 cps/ub.py:87 +#: cps/templates/index.xml:68 cps/ub.py:86 cps/web.py:699 msgid "Publishers" msgstr "Kiadók" -#: cps/ub.py:89 +#: cps/ub.py:88 msgid "Show publisher selection" msgstr "Kiadó választó mutatása" -#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:90 +#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:89 +#: cps/web.py:770 msgid "Languages" msgstr "Nyelvek" -#: cps/ub.py:93 +#: cps/ub.py:92 msgid "Show language selection" msgstr "Nyelv választó mutatása" -#: cps/ub.py:94 +#: cps/templates/index.xml:96 cps/ub.py:93 msgid "Ratings" msgstr "" -#: cps/ub.py:96 +#: cps/ub.py:95 msgid "Show ratings selection" msgstr "" -#: cps/templates/index.xml:96 cps/ub.py:97 +#: cps/templates/index.xml:104 cps/ub.py:96 msgid "File formats" msgstr "" -#: cps/ub.py:99 +#: cps/ub.py:98 msgid "Show file formats selection" msgstr "" -#: cps/updater.py:252 cps/updater.py:359 cps/updater.py:372 +#: cps/updater.py:262 cps/updater.py:369 cps/updater.py:382 msgid "Unexpected data while reading update information" msgstr "Ismeretlen adat a frissítési információk olvasásakor" -#: cps/updater.py:259 cps/updater.py:365 +#: cps/updater.py:269 cps/updater.py:375 msgid "No update available. You already have the latest version installed" msgstr "Nem érhető el újabb frissítés. Már a legújabb verzió van telepítve." -#: cps/updater.py:285 +#: cps/updater.py:295 msgid "A new update is available. Click on the button below to update to the latest version." msgstr "Egy új frissítés érhető el. Kattints a lenti gombra a legújabb verzió frissítésére" -#: cps/updater.py:338 +#: cps/updater.py:348 msgid "Could not fetch update information" msgstr "Nem lehetett begyűjteni a frissítési információkat" -#: cps/updater.py:352 +#: cps/updater.py:362 msgid "No release information available" msgstr "Nincs információ a kiadásról." -#: cps/updater.py:405 cps/updater.py:414 +#: cps/updater.py:415 cps/updater.py:424 #, python-format msgid "A new update is available. Click on the button below to update to version: %(version)s" msgstr "Új frissítés érhető el. Kattints az alábbi gombra a frissítéshez a következő verzióra: %(version)s" -#: cps/updater.py:424 +#: cps/updater.py:434 msgid "Click on the button below to update to the latest stable version." msgstr "" -#: cps/web.py:486 +#: cps/web.py:480 msgid "Recently Added Books" msgstr "Legutóbb hozzáadott könyvek" -#: cps/web.py:514 -msgid "Best rated books" -msgstr "Legjobbra értékelt könyvek" - -#: cps/templates/index.xml:38 cps/web.py:522 -msgid "Random Books" -msgstr "Könyvek találomra" +#: cps/templates/index.html:5 cps/web.py:516 +msgid "Discover (Random Books)" +msgstr "Felfedezés (könyvek találomra)" -#: cps/web.py:548 +#: cps/web.py:542 msgid "Books" msgstr "" -#: cps/web.py:575 -msgid "Hot Books (most downloaded)" +#: cps/web.py:569 +msgid "Hot Books (Most Downloaded)" msgstr "Kelendő könyvek (legtöbbet letöltöttek)" -#: cps/web.py:586 cps/web.py:1382 cps/web.py:1478 -msgid "Error opening eBook. File does not exist or file is not accessible:" +#: cps/web.py:580 +msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Hiba történt az e-könyv megnyitásakor. A fájl nem létezik vagy nem érhető el:" -#: cps/web.py:599 +#: cps/web.py:593 #, python-format msgid "Author: %(name)s" msgstr "" -#: cps/web.py:611 +#: cps/web.py:605 #, python-format msgid "Publisher: %(name)s" msgstr "Kiadó: %(name)s" -#: cps/web.py:622 +#: cps/web.py:616 #, python-format msgid "Series: %(serie)s" msgstr "Sorozat: %(serie)s" -#: cps/web.py:633 +#: cps/web.py:627 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:644 +#: cps/web.py:638 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:656 +#: cps/web.py:650 #, python-format msgid "Category: %(name)s" msgstr "Címke: %(name)s" -#: cps/web.py:673 +#: cps/web.py:667 #, python-format msgid "Language: %(name)s" msgstr "Nyelv: %(name)s" -#: cps/web.py:705 -msgid "Publisher list" -msgstr "Kiadók listája" - -#: cps/web.py:721 -msgid "Series list" -msgstr "Sorozatok listája" - -#: cps/web.py:735 +#: cps/web.py:729 msgid "Ratings list" msgstr "" -#: cps/web.py:748 +#: cps/web.py:742 msgid "File formats list" msgstr "" -#: cps/web.py:776 -msgid "Available languages" -msgstr "Elérhető nyelvek" - -#: cps/web.py:793 -msgid "Category list" -msgstr "Címkék listája" - -#: cps/templates/layout.html:73 cps/web.py:807 +#: cps/templates/layout.html:73 cps/templates/tasks.html:7 cps/web.py:801 msgid "Tasks" msgstr "Feladatok" -#: cps/templates/feed.xml:33 cps/templates/layout.html:44 -#: cps/templates/layout.html:45 cps/web.py:829 cps/web.py:831 +#: cps/templates/book_edit.html:212 cps/templates/feed.xml:33 +#: cps/templates/layout.html:44 cps/templates/layout.html:47 +#: cps/templates/search_form.html:170 cps/web.py:821 cps/web.py:823 msgid "Search" msgstr "Keresés" -#: cps/web.py:881 +#: cps/web.py:873 msgid "Published after " msgstr "Kiadva ezután: " -#: cps/web.py:888 +#: cps/web.py:880 msgid "Published before " msgstr "Kiadva ezelőtt: " -#: cps/web.py:902 +#: cps/web.py:894 #, python-format msgid "Rating <= %(rating)s" msgstr "Értékelés <= %(rating)s" -#: cps/web.py:904 +#: cps/web.py:896 #, python-format msgid "Rating >= %(rating)s" msgstr "Értékelés <= %(rating)s" -#: cps/web.py:970 cps/web.py:982 +#: cps/web.py:962 cps/web.py:976 msgid "search" msgstr "keresés" -#: cps/web.py:1067 +#: cps/web.py:1060 #, 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:1071 +#: cps/web.py:1064 #, 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:1073 +#: cps/web.py:1066 msgid "Please configure your kindle e-mail address first..." msgstr "Először be kell állítani a kindle e-mail címet..." -#: cps/web.py:1087 +#: cps/web.py:1083 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "" -#: cps/web.py:1088 cps/web.py:1094 cps/web.py:1119 cps/web.py:1123 -#: cps/web.py:1128 cps/web.py:1132 +#: cps/web.py:1084 cps/web.py:1090 cps/web.py:1115 cps/web.py:1119 +#: cps/web.py:1124 cps/web.py:1128 msgid "register" msgstr "regisztrálás" -#: cps/web.py:1121 +#: cps/web.py:1117 msgid "Your e-mail is not allowed to register" msgstr "Nem engedélyezett a megadott e-mail cím bejegyzése" -#: cps/web.py:1124 +#: cps/web.py:1120 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:1127 +#: cps/web.py:1123 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:1144 +#: cps/web.py:1140 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1154 cps/web.py:1281 +#: cps/web.py:1150 cps/web.py:1277 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "Be vagy jelentkezve mint: %(nickname)s" -#: cps/web.py:1159 +#: cps/web.py:1155 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "" -#: cps/web.py:1163 cps/web.py:1186 +#: cps/web.py:1159 cps/web.py:1182 msgid "Wrong Username or Password" msgstr "Rossz felhasználó név vagy jelszó!" -#: cps/web.py:1170 +#: cps/web.py:1166 msgid "New Password was send to your email address" msgstr "" -#: cps/web.py:1176 +#: cps/web.py:1172 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1182 +#: cps/web.py:1178 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1189 cps/web.py:1213 +#: cps/web.py:1185 cps/web.py:1209 msgid "login" msgstr "belépés" -#: cps/web.py:1225 cps/web.py:1259 +#: cps/web.py:1221 cps/web.py:1255 msgid "Token not found" msgstr "A token nem található." -#: cps/web.py:1234 cps/web.py:1267 +#: cps/web.py:1230 cps/web.py:1263 msgid "Token has expired" msgstr "A token érvényessége lejárt." -#: cps/web.py:1243 +#: cps/web.py:1239 msgid "Success! Please return to your device" msgstr "Sikerült! Újra használható az eszköz." -#: cps/web.py:1320 cps/web.py:1363 cps/web.py:1369 +#: cps/web.py:1320 cps/web.py:1365 cps/web.py:1371 #, python-format msgid "%(name)s's profile" msgstr "%(name)s profilja" -#: cps/web.py:1365 +#: cps/web.py:1367 msgid "Profile updated" msgstr "A profil frissítve." -#: cps/web.py:1394 cps/web.py:1397 cps/web.py:1400 cps/web.py:1407 -#: cps/web.py:1412 +#: cps/web.py:1384 cps/web.py:1480 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "" + +#: cps/web.py:1396 cps/web.py:1399 cps/web.py:1402 cps/web.py:1409 +#: cps/web.py:1414 msgid "Read a Book" msgstr "Egy olvasott könyv" -#: cps/web.py:1423 +#: cps/web.py:1425 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "" @@ -927,23 +950,26 @@ 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" #: cps/templates/admin.html:9 -msgid "User list" +msgid "Users" msgstr "Felhasználók listája" -#: cps/templates/admin.html:12 -msgid "Nickname" +#: cps/templates/admin.html:12 cps/templates/login.html:8 +#: cps/templates/login.html:9 cps/templates/register.html:7 +#: cps/templates/user_edit.html:8 +msgid "Username" msgstr "Felhasználói név" -#: cps/templates/admin.html:13 -msgid "E-mail" +#: cps/templates/admin.html:13 cps/templates/register.html:11 +#: cps/templates/user_edit.html:13 +msgid "E-mail Address" msgstr "E-mail" -#: cps/templates/admin.html:14 -msgid "Kindle" +#: cps/templates/admin.html:14 cps/templates/user_edit.html:26 +msgid "Send to Kindle E-mail Address" msgstr "Kindle" #: cps/templates/admin.html:15 -msgid "DLS" +msgid "Downloads" msgstr "Letöltések" #: cps/templates/admin.html:16 cps/templates/layout.html:76 @@ -957,7 +983,7 @@ msgid "Download" msgstr "Letöltés" #: cps/templates/admin.html:18 -msgid "View Ebooks" +msgid "View eBooks" msgstr "" #: cps/templates/admin.html:19 cps/templates/layout.html:65 @@ -968,28 +994,32 @@ msgstr "Feltöltés" msgid "Edit" msgstr "Szerkesztés" +#: cps/templates/admin.html:38 +msgid "Add New User" +msgstr "" + #: cps/templates/admin.html:44 -msgid "SMTP e-mail server settings" +msgid "E-mail Server Settings" msgstr "SMTP e-mail kiszolgáló beállítások" #: cps/templates/admin.html:47 cps/templates/email_edit.html:11 -msgid "SMTP hostname" +msgid "SMTP Hostname" msgstr "SMTP szervernév" -#: cps/templates/admin.html:48 -msgid "SMTP port" +#: cps/templates/admin.html:48 cps/templates/email_edit.html:15 +msgid "SMTP Port" msgstr "SMTP port" -#: cps/templates/admin.html:49 -msgid "SSL" +#: cps/templates/admin.html:49 cps/templates/email_edit.html:19 +msgid "Encryption" msgstr "SSL" #: cps/templates/admin.html:50 cps/templates/email_edit.html:27 -msgid "SMTP login" +msgid "SMTP Login" msgstr "SMTP felhasználó" -#: cps/templates/admin.html:51 -msgid "From mail" +#: cps/templates/admin.html:51 cps/templates/email_edit.html:35 +msgid "From E-mail" msgstr "Küldő e-mail cím" #: cps/templates/admin.html:61 @@ -1001,63 +1031,71 @@ msgid "Configuration" msgstr "Konfiguráció" #: cps/templates/admin.html:70 -msgid "Calibre DB dir" +msgid "Calibre Database Directory" msgstr "Calibre adatbázis mappája:" -#: cps/templates/admin.html:74 -msgid "Log level" +#: cps/templates/admin.html:74 cps/templates/config_edit.html:122 +msgid "Log Level" msgstr "Naplózás szintje:" #: cps/templates/admin.html:78 msgid "Port" msgstr "Port:" -#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:23 -msgid "Books per page" +#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:27 +msgid "Books per Page" msgstr "Könyvek oldalanként:" #: cps/templates/admin.html:88 -msgid "Uploading" +msgid "Uploads" msgstr "Feltöltés:" #: cps/templates/admin.html:92 -msgid "Anonymous browsing" +msgid "Anonymous Browsing" msgstr "Böngészés bejelentkezés nélkül:" #: cps/templates/admin.html:96 -msgid "Public registration" +msgid "Public Registration" msgstr "Nyílvános regisztráció:" -#: cps/templates/admin.html:100 cps/templates/remote_login.html:4 -msgid "Remote login" +#: cps/templates/admin.html:100 +msgid "Magic Link Remote Login" msgstr "Távoli belépés:" #: cps/templates/admin.html:104 -msgid "Reverse proxy login" +msgid "Reverse Proxy Login" msgstr "" #: cps/templates/admin.html:109 msgid "Reverse proxy header name" msgstr "" +#: cps/templates/admin.html:114 +msgid "Edit Basic Configuration" +msgstr "" + +#: cps/templates/admin.html:115 +msgid "Edit UI Configuration" +msgstr "" + #: cps/templates/admin.html:121 msgid "Administration" msgstr "Adminisztráció" #: cps/templates/admin.html:122 -msgid "View Logfiles" +msgid "View Logs" msgstr "" #: cps/templates/admin.html:123 -msgid "Reconnect to Calibre DB" +msgid "Reconnect Calibre Database" msgstr "Újracsatlakozás a Calibre adatbázishoz" #: cps/templates/admin.html:124 -msgid "Restart Calibre-Web" +msgid "Restart" msgstr "A Calibre adatbázis újraindítása" #: cps/templates/admin.html:125 -msgid "Stop Calibre-Web" +msgid "Shutdown" msgstr "A Calibre adatbázis leállítása" #: cps/templates/admin.html:131 @@ -1077,7 +1115,7 @@ msgid "Current version" msgstr "Jelenlegi verzió" #: cps/templates/admin.html:148 -msgid "Check for update" +msgid "Check for Update" msgstr "Frissítés keresése" #: cps/templates/admin.html:149 @@ -1085,30 +1123,29 @@ msgid "Perform Update" msgstr "Frissítés elkezdése" #: cps/templates/admin.html:161 -msgid "Do you really want to restart Calibre-Web?" +msgid "Are you sure you want to restart?" msgstr "Valóban újra akarod indítani a Calibre-Web-et?" #: cps/templates/admin.html:166 cps/templates/admin.html:180 #: cps/templates/admin.html:200 cps/templates/shelf.html:72 -msgid "Ok" +msgid "OK" msgstr "OK" #: cps/templates/admin.html:167 cps/templates/admin.html:181 -#: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 +#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:194 +#: cps/templates/config_edit.html:346 cps/templates/config_view_edit.html:151 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92 -#: cps/templates/layout.html:28 cps/templates/shelf.html:73 -#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32 -#: cps/templates/user_edit.html:131 -msgid "Back" -msgstr "Vissza" +#: cps/templates/shelf.html:73 cps/templates/shelf_edit.html:19 +#: cps/templates/user_edit.html:137 +msgid "Cancel" +msgstr "" #: cps/templates/admin.html:179 -msgid "Do you really want to stop Calibre-Web?" +msgid "Are you sure you want to shutdown?" msgstr "Valóban le akarod állítani a Calibre-Web-et?" #: cps/templates/admin.html:191 -msgid "Updating, please do not reload page" +msgid "Updating, please do not reload this page" msgstr "Frissítés folyamatban, ne töltsd újra az oldalt" #: cps/templates/author.html:15 @@ -1135,161 +1172,159 @@ msgstr "csökkentsd" msgid "More by" msgstr "Több eszerint:" -#: cps/templates/book_edit.html:12 +#: cps/templates/book_edit.html:10 msgid "Delete Book" msgstr "Könyv törlése" -#: cps/templates/book_edit.html:15 +#: cps/templates/book_edit.html:13 msgid "Delete formats:" msgstr "Formátumok törlése:" -#: cps/templates/book_edit.html:18 cps/templates/book_edit.html:195 -#: cps/templates/email_edit.html:91 +#: cps/templates/book_edit.html:16 cps/templates/book_edit.html:193 +#: cps/templates/email_edit.html:91 cps/templates/user_edit.html:65 +#: cps/templates/user_edit.html:177 msgid "Delete" msgstr "Törlés" -#: cps/templates/book_edit.html:26 +#: cps/templates/book_edit.html:24 msgid "Convert book format:" msgstr "Könyvformátum átalakítása:" -#: cps/templates/book_edit.html:30 +#: cps/templates/book_edit.html:28 msgid "Convert from:" msgstr "Konvertálás erről:" -#: cps/templates/book_edit.html:32 cps/templates/book_edit.html:39 +#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:37 msgid "select an option" msgstr "Válassz egy lehetőséget" -#: cps/templates/book_edit.html:37 +#: cps/templates/book_edit.html:35 msgid "Convert to:" msgstr "Konvertálás erre:" -#: cps/templates/book_edit.html:46 +#: cps/templates/book_edit.html:44 msgid "Convert book" msgstr "Könyv konvertálása" -#: cps/templates/book_edit.html:55 cps/templates/search_form.html:6 +#: cps/templates/book_edit.html:53 cps/templates/search_form.html:6 msgid "Book Title" msgstr "Könyv címe" -#: cps/templates/book_edit.html:59 cps/templates/book_edit.html:255 -#: cps/templates/book_edit.html:273 cps/templates/search_form.html:10 +#: cps/templates/book_edit.html:57 cps/templates/book_edit.html:256 +#: cps/templates/book_edit.html:274 cps/templates/search_form.html:10 msgid "Author" msgstr "Szerző" -#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:260 -#: cps/templates/book_edit.html:275 cps/templates/search_form.html:126 +#: cps/templates/book_edit.html:61 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:276 cps/templates/search_form.html:126 msgid "Description" msgstr "Leírás" -#: cps/templates/book_edit.html:67 cps/templates/search_form.html:33 +#: cps/templates/book_edit.html:65 cps/templates/search_form.html:33 msgid "Tags" msgstr "Címkék" -#: cps/templates/book_edit.html:75 -msgid "Series id" -msgstr "Sorozat azonosítója" +#: cps/templates/book_edit.html:73 +msgid "Series ID" +msgstr "" -#: cps/templates/book_edit.html:79 +#: cps/templates/book_edit.html:77 msgid "Rating" msgstr "Értékelés" -#: cps/templates/book_edit.html:83 -msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +#: cps/templates/book_edit.html:81 +msgid "Fetch Cover from URL (JPEG - Image will be downloaded and stored in database)" msgstr "Borító URL (jpg, borító letöltve és elmentve az adatbázisban, a mező újra üres lesz utána)" -#: cps/templates/book_edit.html:87 -msgid "Upload Cover from local drive" +#: cps/templates/book_edit.html:85 +msgid "Upload Cover from Local Disk" msgstr "Borító feltöltése helyi meghajtóról" -#: cps/templates/book_edit.html:92 cps/templates/detail.html:165 -msgid "Publishing date" +#: cps/templates/book_edit.html:90 +msgid "Published Date" msgstr "Kiadás éve" -#: cps/templates/book_edit.html:99 cps/templates/book_edit.html:257 -#: cps/templates/book_edit.html:274 cps/templates/detail.html:156 +#: cps/templates/book_edit.html:97 cps/templates/book_edit.html:258 +#: cps/templates/book_edit.html:275 cps/templates/detail.html:156 #: cps/templates/search_form.html:14 msgid "Publisher" msgstr "Kiadó" -#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:30 +#: cps/templates/book_edit.html:101 cps/templates/detail.html:123 +#: cps/templates/user_edit.html:31 msgid "Language" msgstr "Nyelv" -#: cps/templates/book_edit.html:113 cps/templates/search_form.html:137 +#: cps/templates/book_edit.html:111 cps/templates/search_form.html:137 msgid "Yes" msgstr "Igen" -#: cps/templates/book_edit.html:114 cps/templates/search_form.html:138 +#: cps/templates/book_edit.html:112 cps/templates/search_form.html:138 msgid "No" msgstr "Nem" -#: cps/templates/book_edit.html:160 -msgid "Upload format" +#: cps/templates/book_edit.html:158 +msgid "Upload Format" msgstr "Feltöltés formátuma" -#: cps/templates/book_edit.html:169 -msgid "view book after edit" +#: cps/templates/book_edit.html:167 +msgid "View Book on Save" msgstr "Könyv megnézése szerkesztés után" -#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:208 -msgid "Get metadata" +#: cps/templates/book_edit.html:170 cps/templates/book_edit.html:206 +msgid "Fetch Metadata" msgstr "Metaadatok beszerzése" -#: 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:170 cps/templates/shelf_edit.html:17 -#: cps/templates/user_edit.html:129 -msgid "Submit" -msgstr "Küldés" +#: cps/templates/book_edit.html:171 cps/templates/config_edit.html:343 +#: cps/templates/config_view_edit.html:150 cps/templates/email_edit.html:38 +#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:135 +msgid "Save" +msgstr "" -#: cps/templates/book_edit.html:187 +#: cps/templates/book_edit.html:185 msgid "Are you really sure?" msgstr "Biztosan?" -#: cps/templates/book_edit.html:190 -msgid "Book will be deleted from Calibre database" +#: cps/templates/book_edit.html:188 +msgid "This book will be permanently erased from database" msgstr "A könyv törölve lesz a Calibre adatbázisból" -#: cps/templates/book_edit.html:191 -msgid "and from hard disk" +#: cps/templates/book_edit.html:189 +msgid "and hard disk" msgstr " és a merevlemezről" -#: cps/templates/book_edit.html:211 +#: cps/templates/book_edit.html:209 msgid "Keyword" msgstr "Kulcsszó" -#: cps/templates/book_edit.html:212 +#: cps/templates/book_edit.html:210 msgid " Search keyword " msgstr " Keresési kulcsszó " -#: cps/templates/book_edit.html:214 cps/templates/layout.html:47 -msgid "Go!" -msgstr "Rajta!" - -#: cps/templates/book_edit.html:218 +#: cps/templates/book_edit.html:216 msgid "Click the cover to load metadata to the form" msgstr "Kattints a borítóra a metadatok betöltésére" -#: cps/templates/book_edit.html:230 cps/templates/book_edit.html:270 +#: cps/templates/book_edit.html:231 cps/templates/book_edit.html:271 msgid "Loading..." msgstr "Betöltés..." -#: cps/templates/book_edit.html:235 cps/templates/layout.html:192 -#: cps/templates/layout.html:224 +#: cps/templates/book_edit.html:236 cps/templates/layout.html:191 +#: cps/templates/layout.html:223 cps/templates/modal_restriction.html:34 +#: cps/templates/user_edit.html:164 msgid "Close" msgstr "Bezárás" -#: cps/templates/book_edit.html:262 cps/templates/book_edit.html:276 +#: cps/templates/book_edit.html:263 cps/templates/book_edit.html:277 msgid "Source" msgstr "Forrás" -#: cps/templates/book_edit.html:271 +#: cps/templates/book_edit.html:272 msgid "Search error!" msgstr "Keresési hiba!" -#: cps/templates/book_edit.html:272 -msgid "No Result(s) found! Please try aonther keyword." +#: cps/templates/book_edit.html:273 +msgid "No Result(s) found! Please try another keyword." msgstr "Nincs találat! Próbálj másik kulcsszót." #: cps/templates/config_edit.html:12 @@ -1297,7 +1332,7 @@ msgid "Library Configuration" msgstr "Könyvát beállításai" #: cps/templates/config_edit.html:19 -msgid "Location of Calibre database" +msgid "Location of Calibre Database" msgstr "Calibra adatbázis helye" #: cps/templates/config_edit.html:25 @@ -1349,7 +1384,7 @@ msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "SSL kulcsfájl helye (nem SSL szerverekhez üresen kell hagyni)" #: cps/templates/config_edit.html:99 -msgid "Update channel" +msgid "Update Channel" msgstr "Frissítési forrás" #: cps/templates/config_edit.html:101 @@ -1372,10 +1407,6 @@ msgstr "Éjszakai (automatikus)" msgid "Logfile Configuration" msgstr "Naplózási beállítások" -#: cps/templates/config_edit.html:122 -msgid "Log Level" -msgstr "Naplózás szintje" - #: cps/templates/config_edit.html:131 msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "Naplófájl helye és neve (üresen hagyva calibre-web.log)" @@ -1393,255 +1424,271 @@ msgid "Feature Configuration" msgstr "Funkciók beállítása" #: cps/templates/config_edit.html:158 -msgid "Enable uploading" +msgid "Enable Uploads" msgstr "Feltöltés engedélyezése" #: cps/templates/config_edit.html:162 -msgid "Enable anonymous browsing" +msgid "Enable Anonymous Browsing" msgstr "Böngészés bejelentkezés nélkül engedélyezése" #: cps/templates/config_edit.html:166 -msgid "Enable public registration" +msgid "Enable Public Registration" msgstr "Nyilvános regisztráció engedélyezése" #: cps/templates/config_edit.html:170 -msgid "Enable remote login (\"magic link\")" +msgid "Enable Magic Link Remote Login" msgstr "Távoli belépés engedélyezése (\"varázs-hivatkozás\")" #: cps/templates/config_edit.html:175 +msgid "Enable Kobo sync" +msgstr "" + +#: cps/templates/config_edit.html:180 +msgid "Proxy unknown requests to Kobo Store" +msgstr "" + +#: cps/templates/config_edit.html:187 msgid "Use Goodreads" msgstr "" -#: cps/templates/config_edit.html:176 -msgid "Obtain an API Key" +#: cps/templates/config_edit.html:188 +msgid "Create an API Key" msgstr "API-kulcs beszerzése" -#: cps/templates/config_edit.html:180 +#: cps/templates/config_edit.html:192 msgid "Goodreads API Key" msgstr "Goodreads API-kulcs" -#: cps/templates/config_edit.html:184 +#: cps/templates/config_edit.html:196 msgid "Goodreads API Secret" msgstr "Goodreads API titkos kód" -#: cps/templates/config_edit.html:191 +#: cps/templates/config_edit.html:203 msgid "Login type" msgstr "" -#: cps/templates/config_edit.html:193 -msgid "Use standard Authentication" +#: cps/templates/config_edit.html:205 +msgid "Use Standard Authentication" msgstr "" -#: cps/templates/config_edit.html:195 +#: cps/templates/config_edit.html:207 msgid "Use LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:198 +#: cps/templates/config_edit.html:210 msgid "Use OAuth" msgstr "" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:217 msgid "LDAP Server Host Name or IP Address" msgstr "" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:221 msgid "LDAP Server Port" msgstr "" -#: cps/templates/config_edit.html:213 -msgid "LDAP schema (ldap or ldaps)" +#: cps/templates/config_edit.html:225 +msgid "LDAP Schema (LDAP or LPAPS)" msgstr "" -#: cps/templates/config_edit.html:217 -msgid "LDAP Admin username" +#: cps/templates/config_edit.html:229 +msgid "LDAP Administrator Username" msgstr "" -#: cps/templates/config_edit.html:221 -msgid "LDAP Admin password" +#: cps/templates/config_edit.html:233 +msgid "LDAP Administrator Password" msgstr "" -#: cps/templates/config_edit.html:226 -msgid "LDAP Server use SSL" +#: cps/templates/config_edit.html:238 +msgid "LDAP Server Enable SSL" msgstr "" -#: cps/templates/config_edit.html:230 -msgid "LDAP Server use TLS" +#: cps/templates/config_edit.html:242 +msgid "LDAP Server Enable TLS" msgstr "" -#: cps/templates/config_edit.html:234 +#: cps/templates/config_edit.html:246 msgid "LDAP Server Certificate" msgstr "" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:250 msgid "LDAP SSL Certificate Path" msgstr "" -#: cps/templates/config_edit.html:243 +#: cps/templates/config_edit.html:255 msgid "LDAP Distinguished Name (DN)" msgstr "" -#: cps/templates/config_edit.html:247 -msgid "LDAP User object filter" +#: cps/templates/config_edit.html:259 +msgid "LDAP User Object Filter" msgstr "" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:264 msgid "LDAP Server is OpenLDAP?" msgstr "" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:272 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:263 +#: cps/templates/config_edit.html:275 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:279 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:276 +#: cps/templates/config_edit.html:288 msgid "Allow Reverse Proxy Authentication" msgstr "" -#: cps/templates/config_edit.html:280 +#: cps/templates/config_edit.html:292 msgid "Reverse Proxy Header Name" msgstr "" -#: cps/templates/config_edit.html:292 +#: cps/templates/config_edit.html:304 msgid "External binaries" msgstr "Külső futtatható fájlok" -#: cps/templates/config_edit.html:300 -msgid "No converter" +#: cps/templates/config_edit.html:312 +msgid "No Converter" msgstr "Átalakítás nélkül" -#: cps/templates/config_edit.html:302 +#: cps/templates/config_edit.html:314 msgid "Use Kindlegen" msgstr "Kindlegen használata" -#: cps/templates/config_edit.html:304 +#: cps/templates/config_edit.html:316 msgid "Use calibre's ebook converter" msgstr "Calibre e-könyv átalakító használata" -#: cps/templates/config_edit.html:308 +#: cps/templates/config_edit.html:320 msgid "E-Book converter settings" msgstr "E-könyv átalakító beállításai" -#: cps/templates/config_edit.html:312 +#: cps/templates/config_edit.html:324 msgid "Path to convertertool" msgstr "Elérési út az átalakító-eszközhöz" -#: cps/templates/config_edit.html:318 +#: cps/templates/config_edit.html:330 msgid "Location of Unrar binary" msgstr "Az Unrar futtatási állományának helye" -#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 -#: cps/templates/login.html:4 +#: cps/templates/config_edit.html:349 cps/templates/layout.html:84 +#: cps/templates/login.html:4 cps/templates/login.html:20 msgid "Login" msgstr "Belépés" -#: cps/templates/config_view_edit.html:12 +#: cps/templates/config_view_edit.html:16 msgid "View Configuration" msgstr "Általános beállítások" -#: cps/templates/config_view_edit.html:19 cps/templates/shelf_edit.html:7 +#: cps/templates/config_view_edit.html:23 cps/templates/shelf_edit.html:7 msgid "Title" msgstr "Név" -#: cps/templates/config_view_edit.html:27 -msgid "No. of random books to show" +#: cps/templates/config_view_edit.html:31 +msgid "No. of Random Books to Display" msgstr "Találomra mutatott könyvek száma" -#: cps/templates/config_view_edit.html:31 -msgid "No. of authors to show before hiding (0=disable hiding)" +#: cps/templates/config_view_edit.html:35 +msgid "No. of Authors to Display Before Hiding (0=Disable Hiding)" msgstr "Mutatott szerzők száma (0=elrejtés kikapcsolása)" -#: cps/templates/config_view_edit.html:35 cps/templates/readcbr.html:112 +#: cps/templates/config_view_edit.html:39 cps/templates/readcbr.html:112 msgid "Theme" msgstr "Téma" -#: cps/templates/config_view_edit.html:37 +#: cps/templates/config_view_edit.html:41 msgid "Standard Theme" msgstr "Alapértelmezett téma" -#: cps/templates/config_view_edit.html:38 +#: cps/templates/config_view_edit.html:42 msgid "caliBlur! Dark Theme" msgstr "caliBlur! sötét téma" -#: cps/templates/config_view_edit.html:42 -msgid "Regular expression for ignoring columns" +#: cps/templates/config_view_edit.html:46 +msgid "Regular Expression for Ignoring Columns" msgstr "Reguláris kifejezés oszlopok kihagyásához" -#: cps/templates/config_view_edit.html:46 -msgid "Link read/unread status to Calibre column" +#: cps/templates/config_view_edit.html:50 +msgid "Link Read/Unread Status to Calibre Column" msgstr "Olvasva/olvasatlan állapot hozzárendelése Calibre oszlophoz" -#: cps/templates/config_view_edit.html:55 -msgid "Regular expression for title sorting" -msgstr "Reguláris kifejezés címek sorbarendezéséhez" - #: cps/templates/config_view_edit.html:59 -msgid "Tags for Mature Content" -msgstr "Felnőtt tartalom címkéi" +msgid "View Restrictions based on Calibre column" +msgstr "" + +#: cps/templates/config_view_edit.html:61 cps/templates/email_edit.html:21 +msgid "None" +msgstr "Nincs" + +#: cps/templates/config_view_edit.html:68 +msgid "Regular Expression for Title Sorting" +msgstr "Reguláris kifejezés címek sorbarendezéséhez" -#: cps/templates/config_view_edit.html:73 -msgid "Default settings for new users" +#: cps/templates/config_view_edit.html:80 +msgid "Default Settings for New Users" msgstr "Új felhasználók alapértelmezett beállításai" -#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:82 -msgid "Admin user" +#: cps/templates/config_view_edit.html:88 cps/templates/user_edit.html:92 +msgid "Admin User" msgstr "Rendszergazda felhasználó" -#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:91 +#: cps/templates/config_view_edit.html:92 cps/templates/user_edit.html:97 msgid "Allow Downloads" msgstr "Letöltés engedélyezése" -#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:95 -msgid "Allow book viewer" +#: cps/templates/config_view_edit.html:96 cps/templates/user_edit.html:101 +msgid "Allow eBook Viewer" msgstr "" -#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:99 +#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:105 msgid "Allow Uploads" msgstr "Feltöltés engedélyezése" -#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:103 +#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:109 msgid "Allow Edit" msgstr "Szerkesztés engedélyezése" -#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 -msgid "Allow Delete books" -msgstr "Könyv törlés engedélyezése" +#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:113 +msgid "Allow Delete Books" +msgstr "" -#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:112 +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:118 msgid "Allow Changing Password" msgstr "Jelszó változtatásának engedélyezése" -#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:116 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:122 msgid "Allow Editing Public Shelfs" msgstr "Nyilvános polcok szerkesztésének engedélyezése" -#: cps/templates/config_view_edit.html:119 -msgid "Default visibilities for new users" +#: cps/templates/config_view_edit.html:126 +msgid "Default Visibilities for New Users" msgstr "Új felhasználók alapértelmezett látható elemei" -#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:74 -msgid "Show random books in detail view" +#: cps/templates/config_view_edit.html:142 +msgid "Show Random Books in Detail View" msgstr "Mutasson könyveket találomra a részletes nézetben" -#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:87 -msgid "Show mature content" -msgstr "Mutassa a felnőtt tartalmat" +#: cps/templates/config_view_edit.html:144 +msgid "Add Allowed/Denied Tags" +msgstr "" + +#: cps/templates/config_view_edit.html:145 +msgid "Add Allowed/Denied custom column values" +msgstr "" #: cps/templates/detail.html:59 -msgid "Read in browser" +msgid "Read in Browser" msgstr "Olvasás böngészőben" #: cps/templates/detail.html:72 -msgid "Listen in browser" +msgid "Listen in Browser" msgstr "" #: cps/templates/detail.html:117 @@ -1652,9 +1699,9 @@ msgstr " " msgid "of" msgstr "kötete a sorozatnak:" -#: cps/templates/detail.html:123 -msgid "language" -msgstr "nyelv" +#: cps/templates/detail.html:165 +msgid "Published" +msgstr "" #: cps/templates/detail.html:200 msgid "Mark As Unread" @@ -1677,21 +1724,9 @@ msgid "Add to shelf" msgstr "Hozzáadás polchoz" #: cps/templates/detail.html:286 -msgid "Edit metadata" +msgid "Edit Metadata" msgstr "Metaadatok szerkesztése" -#: cps/templates/email_edit.html:15 -msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" -msgstr "SMTP port (egyszerű SMTP-hez rendszerint 25, SSL-hez 465 és STARTTLS-hez 587)" - -#: cps/templates/email_edit.html:19 -msgid "Encryption" -msgstr "Titkosítás" - -#: cps/templates/email_edit.html:21 -msgid "None" -msgstr "Nincs" - #: cps/templates/email_edit.html:22 msgid "STARTTLS" msgstr "STARTTLS" @@ -1701,23 +1736,15 @@ msgid "SSL/TLS" msgstr "SSL/TLS" #: cps/templates/email_edit.html:31 -msgid "SMTP password" +msgid "SMTP Password" msgstr "SMTP jelszó" -#: cps/templates/email_edit.html:35 -msgid "From e-mail" -msgstr "E-mail-ből" - -#: cps/templates/email_edit.html:38 -msgid "Save settings" -msgstr "Beállítások mentése" - #: cps/templates/email_edit.html:39 -msgid "Save settings and send Test E-Mail" +msgid "Save and Send Test E-mail" msgstr "Beállítások mentése és teszt e-mail küldése" #: cps/templates/email_edit.html:43 -msgid "Allowed domains for registering" +msgid "Allowed Domains (Whitelist)" msgstr "Regisztráláshoz engedélyezett tartományok" #: cps/templates/email_edit.html:46 cps/templates/email_edit.html:72 @@ -1733,28 +1760,28 @@ msgid "Enter domainname" msgstr "Tartomány megadása" #: cps/templates/email_edit.html:60 -msgid "Denied domains for registering" +msgid "Denied Domains (Blacklist)" msgstr "" #: cps/templates/email_edit.html:90 -msgid "Do you really want to delete this domain rule?" +msgid "Are you sure you want to delete this domain?" msgstr "Valóban törölni akarod ezt a tartomány-szabályt?" -#: cps/templates/feed.xml:21 cps/templates/layout.html:176 +#: cps/templates/feed.xml:21 cps/templates/layout.html:175 msgid "Next" msgstr "Következő" -#: cps/templates/http_error.html:37 -msgid "Create issue" +#: cps/templates/generate_kobo_auth_url.html:5 +msgid "Open the .kobo/Kobo eReader.conf file in a text editor and add (or edit):" msgstr "" -#: cps/templates/http_error.html:44 -msgid "Back to home" -msgstr "Vissza a kezdőlapra" +#: cps/templates/http_error.html:38 +msgid "Create Issue" +msgstr "" -#: cps/templates/index.html:5 -msgid "Discover (Random Books)" -msgstr "Felfedezés (könyvek találomra)" +#: cps/templates/http_error.html:45 +msgid "Return to Home" +msgstr "Vissza a kezdőlapra" #: cps/templates/index.html:64 msgid "Group by series" @@ -1780,7 +1807,11 @@ msgstr "" msgid "The latest Books" msgstr "A legfrissebb könyvek" -#: cps/templates/index.xml:42 +#: cps/templates/index.xml:38 +msgid "Random Books" +msgstr "Könyvek találomra" + +#: cps/templates/index.xml:42 cps/templates/user_edit.html:80 msgid "Show Random Books" msgstr "Mutass könyveket találomra" @@ -1805,22 +1836,26 @@ msgid "Books ordered by Languages" msgstr "" #: cps/templates/index.xml:100 +msgid "Books ordered by Rating" +msgstr "" + +#: cps/templates/index.xml:108 msgid "Books ordered by file formats" msgstr "" -#: cps/templates/index.xml:103 cps/templates/layout.html:137 +#: cps/templates/index.xml:111 cps/templates/layout.html:136 msgid "Public Shelves" msgstr "Nyilvános polcok" -#: cps/templates/index.xml:107 +#: cps/templates/index.xml:115 msgid "Books organized in public shelfs, visible to everyone" msgstr "Könyvek nyilvános polcokra rakva, mindenkinek látható" -#: cps/templates/index.xml:111 cps/templates/layout.html:141 +#: cps/templates/index.xml:119 cps/templates/layout.html:140 msgid "Your Shelves" msgstr "Saját polcok" -#: cps/templates/index.xml:115 +#: cps/templates/index.xml:123 msgid "User's own shelfs, only visible to the current user himself" msgstr "A felhasználó saját polcai, csak a jelenlegi felhasználónak láthatóak" @@ -1828,10 +1863,19 @@ msgstr "A felhasználó saját polcai, csak a jelenlegi felhasználónak láthat msgid "Home" msgstr "Kezdőlap" +#: cps/templates/layout.html:28 cps/templates/shelf_order.html:32 +#: cps/templates/user_edit.html:178 +msgid "Back" +msgstr "Vissza" + #: cps/templates/layout.html:34 -msgid "Toggle navigation" +msgid "Toggle Navigation" msgstr "Navigáció átkapcsolása" +#: cps/templates/layout.html:45 +msgid "Search Library" +msgstr "" + #: cps/templates/layout.html:55 msgid "Advanced Search" msgstr "Részletes keresés" @@ -1853,74 +1897,101 @@ msgstr "Kilépés" msgid "Register" msgstr "Regisztrálás" -#: cps/templates/layout.html:116 cps/templates/layout.html:223 +#: cps/templates/layout.html:116 cps/templates/layout.html:222 msgid "Uploading..." msgstr "Feltöltés..." #: cps/templates/layout.html:117 -msgid "please don't refresh the page" -msgstr "Ne frissítsd az oldalt!" +msgid "Please do not refresh the page" +msgstr "" #: cps/templates/layout.html:127 msgid "Browse" msgstr "Böngészés" -#: cps/templates/layout.html:146 +#: cps/templates/layout.html:145 msgid "Create a Shelf" msgstr "Polc készítése" -#: cps/templates/layout.html:147 cps/templates/stats.html:3 +#: cps/templates/layout.html:146 cps/templates/stats.html:3 msgid "About" msgstr "Névjegy" -#: cps/templates/layout.html:161 +#: cps/templates/layout.html:160 msgid "Previous" msgstr "Előző" -#: cps/templates/layout.html:188 +#: cps/templates/layout.html:187 msgid "Book Details" msgstr "Könyv részletei" -#: cps/templates/layout.html:222 +#: cps/templates/layout.html:221 msgid "Upload done, processing, please wait..." msgstr "Feltöltés kész, feldolgozás alatt, kérlek várj..." -#: cps/templates/layout.html:225 +#: cps/templates/layout.html:224 msgid "Error" msgstr "Hiba" -#: cps/templates/login.html:8 cps/templates/login.html:9 -#: cps/templates/register.html:7 cps/templates/user_edit.html:8 -msgid "Username" -msgstr "Felhasználó név" - #: cps/templates/login.html:12 cps/templates/login.html:13 #: cps/templates/user_edit.html:21 msgid "Password" msgstr "Jelszó" #: cps/templates/login.html:17 -msgid "Remember me" +msgid "Remember Me" msgstr "Emlékezz rám" #: cps/templates/login.html:22 -msgid "Forgot password" +msgid "Forgot Password?" msgstr "" #: cps/templates/login.html:25 -msgid "Log in with magic link" +msgid "Log in with Magic Link" msgstr "Belépés varázshivatkozással" -#: cps/templates/logviewer.html:5 -msgid "Show Calibre-Web log" +#: cps/templates/logviewer.html:6 +msgid "Show Calibre-Web Log: " msgstr "" #: cps/templates/logviewer.html:8 -msgid "Show access log" +msgid "Calibre-Web Log: " +msgstr "" + +#: cps/templates/logviewer.html:8 +msgid "Stream output, can't be displayed" +msgstr "" + +#: cps/templates/logviewer.html:12 +msgid "Show Access Log: " +msgstr "" + +#: cps/templates/modal_restriction.html:6 +msgid "Select allowed/denied Tags" +msgstr "" + +#: cps/templates/modal_restriction.html:7 +msgid "Select allowed/denied Custom Column values" +msgstr "" + +#: cps/templates/modal_restriction.html:8 +msgid "Select allowed/denied Tags of user" +msgstr "" + +#: cps/templates/modal_restriction.html:9 +msgid "Select allowed/denied Custom Column values of user" +msgstr "" + +#: cps/templates/modal_restriction.html:15 +msgid "Enter Tag" +msgstr "" + +#: cps/templates/modal_restriction.html:24 +msgid "Add View Restriction" msgstr "" #: cps/templates/osd.xml:5 -msgid "Calibre-Web ebook catalog" +msgid "Calibre-Web eBook Catalog" msgstr "Calibre-Web e-könyv katalógus" #: cps/templates/read.html:74 @@ -2032,51 +2103,51 @@ msgid "Basic txt Reader" msgstr "Egyszerű txt olvasó" #: cps/templates/register.html:4 -msgid "Register a new account" +msgid "Register New Account" msgstr "Új felhasználó regisztrálása" #: cps/templates/register.html:8 msgid "Choose a username" msgstr "Válassz egy felhasználónevet" -#: cps/templates/register.html:11 cps/templates/user_edit.html:13 -msgid "E-mail address" -msgstr "E-mail cím" - #: cps/templates/register.html:12 msgid "Your email address" msgstr "Az e-mail címed" +#: cps/templates/remote_login.html:4 +msgid "Magic Link - Authorise New Device" +msgstr "" + #: cps/templates/remote_login.html:6 -msgid "Use your other device, login and visit " +msgid "On another device, login and visit:" msgstr "" -#: cps/templates/remote_login.html:9 -msgid "Once you do so, you will automatically get logged in on this device." +#: cps/templates/remote_login.html:10 +msgid "Once verified, you will automatically be logged in on this device." msgstr "Az első belépés után automatikusan be leszel léptetve ezen az eszközön." -#: cps/templates/remote_login.html:12 -msgid "The link will expire after 10 minutes." +#: cps/templates/remote_login.html:13 +msgid "This verification link will expire in 10 minutes." msgstr "" #: cps/templates/search.html:5 -msgid "No Results for:" -msgstr "Nincs találatok a következőhöz:" +msgid "No Results Found" +msgstr "" #: cps/templates/search.html:6 -msgid "Please try a different search" -msgstr "Próbálj másik keresést!" +msgid "Search Term:" +msgstr "" #: cps/templates/search.html:8 msgid "Results for:" msgstr "Találatok a következőhöz:" #: cps/templates/search_form.html:19 -msgid "Publishing date from" +msgid "Published Date From" msgstr "Kiadás éve ettől: " #: cps/templates/search_form.html:26 -msgid "Publishing date to" +msgid "Published Date To" msgstr "Kiadás éve eddig: " #: cps/templates/search_form.html:43 @@ -2100,11 +2171,11 @@ msgid "Exclude Extensions" msgstr "" #: cps/templates/search_form.html:117 -msgid "Rating bigger than" +msgid "Rating Above" msgstr "Értékelés nagyob mint" #: cps/templates/search_form.html:121 -msgid "Rating less than" +msgid "Rating Below" msgstr "Értékelés kisebb mint" #: cps/templates/shelf.html:10 @@ -2120,23 +2191,23 @@ msgid "Change order" msgstr "Sorrend változtatása" #: cps/templates/shelf.html:67 -msgid "Do you really want to delete the shelf?" +msgid "Are you sure you want to delete this shelf?" msgstr "Valóban törölni akarod a polcot?" #: cps/templates/shelf.html:70 -msgid "Shelf will be lost for everybody and forever!" +msgid "Shelf will be deleted for all users" msgstr "A polc el fog tűnni mindenki számára és örökké!" #: cps/templates/shelf_edit.html:13 -msgid "should the shelf be public?" +msgid "Share with Everyone" msgstr "Nyilvános polc" #: cps/templates/shelf_order.html:5 -msgid "Drag 'n drop to rearrange order" +msgid "Drag to Rearrange Order" msgstr "Húzd és dob a sorrend változtatásához" #: cps/templates/stats.html:7 -msgid "Calibre library statistics" +msgid "Library Statistics" msgstr "A Calibre könyvár statisztikái" #: cps/templates/stats.html:12 @@ -2156,21 +2227,17 @@ msgid "Series in this Library" msgstr "Sorozatok ebben a könyvtárban" #: cps/templates/stats.html:28 -msgid "Linked libraries" +msgid "Linked Libraries" msgstr "Hivatkozott könyvtárak" #: cps/templates/stats.html:32 -msgid "Program library" +msgid "Program Library" msgstr "Alkalmazás könyvtár" #: cps/templates/stats.html:33 msgid "Installed Version" msgstr "Telepített verzió" -#: cps/templates/tasks.html:7 -msgid "Tasks list" -msgstr "Feladatlista" - #: cps/templates/tasks.html:12 msgid "User" msgstr "Felhasználó" @@ -2188,11 +2255,11 @@ msgid "Progress" msgstr "Állapot" #: cps/templates/tasks.html:17 -msgid "Runtime" +msgid "Run Time" msgstr "Futásidő" #: cps/templates/tasks.html:18 -msgid "Starttime" +msgid "Start Time" msgstr "Indítás ideje" #: cps/templates/tasks.html:24 @@ -2207,38 +2274,58 @@ msgstr "Összes feladat elrejtése" msgid "Reset user Password" msgstr "Felhasználó jelszavának alaphelyzetbe állítása" -#: cps/templates/user_edit.html:26 -msgid "Kindle E-Mail" -msgstr "Kindle e-mail" - -#: cps/templates/user_edit.html:39 -msgid "Show books with language" +#: cps/templates/user_edit.html:41 +msgid "Language of Books" msgstr "Mutasd a könyveket a következő nyelvvel" -#: cps/templates/user_edit.html:41 -msgid "Show all" +#: cps/templates/user_edit.html:43 +msgid "Show All" msgstr "Mindent mutass" -#: cps/templates/user_edit.html:51 +#: cps/templates/user_edit.html:52 msgid "OAuth Settings" msgstr "" -#: cps/templates/user_edit.html:53 +#: cps/templates/user_edit.html:54 msgid "Link" msgstr "" -#: cps/templates/user_edit.html:55 +#: cps/templates/user_edit.html:56 msgid "Unlink" msgstr "" -#: cps/templates/user_edit.html:123 -msgid "Delete this user" +#: cps/templates/user_edit.html:62 +msgid "Kobo Sync Token" +msgstr "" + +#: cps/templates/user_edit.html:64 +msgid "Create/View" +msgstr "" + +#: cps/templates/user_edit.html:83 +msgid "Add allowed/denied Tags" +msgstr "" + +#: cps/templates/user_edit.html:84 +msgid "Add allowed/denied custom column values" +msgstr "" + +#: cps/templates/user_edit.html:129 +msgid "Delete User" msgstr "A felhasználó törlése" -#: cps/templates/user_edit.html:138 +#: cps/templates/user_edit.html:144 msgid "Recent Downloads" msgstr "Utolsó letöltések" +#: cps/templates/user_edit.html:160 +msgid "Generate Kobo Auth URL" +msgstr "" + +#: cps/templates/user_edit.html:176 +msgid "Do you really want to delete the Kobo Token?" +msgstr "" + #~ msgid "Afar" #~ msgstr "Afar" @@ -3463,3 +3550,87 @@ msgstr "Utolsó letöltések" #~ msgid "New Books" #~ msgstr "Új könyvek" +#~ msgid "Show Calibre-Web log" +#~ msgstr "" + +#~ msgid "Show access log" +#~ msgstr "" + +#~ msgid "Tags for Mature Content" +#~ msgstr "Felnőtt tartalom címkéi" + +#~ msgid "Show mature content" +#~ msgstr "Mutassa a felnőtt tartalmat" + +#~ msgid "deny" +#~ msgstr "" + +#~ msgid "allow" +#~ msgstr "" + +#~ msgid "Kobo Set-up" +#~ msgstr "" + +#~ msgid "Publisher list" +#~ msgstr "Kiadók listája" + +#~ msgid "Series list" +#~ msgstr "Sorozatok listája" + +#~ msgid "Available languages" +#~ msgstr "Elérhető nyelvek" + +#~ msgid "Category list" +#~ msgstr "Címkék listája" + +#~ msgid "Series id" +#~ msgstr "Sorozat azonosítója" + +#~ msgid "Submit" +#~ msgstr "Küldés" + +#~ msgid "Go!" +#~ msgstr "Rajta!" + +#~ msgid "Allow Delete books" +#~ msgstr "Könyv törlés engedélyezése" + +#~ msgid "language" +#~ msgstr "nyelv" + +#~ msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" +#~ msgstr "SMTP port (egyszerű SMTP-hez rendszerint 25, SSL-hez 465 és STARTTLS-hez 587)" + +#~ msgid "From e-mail" +#~ msgstr "E-mail-ből" + +#~ msgid "Save settings" +#~ msgstr "Beállítások mentése" + +#~ msgid "api_endpoint=" +#~ msgstr "" + +#~ msgid "please don't refresh the page" +#~ msgstr "Ne frissítsd az oldalt!" + +#~ msgid "E-mail address" +#~ msgstr "E-mail cím" + +#~ msgid "No Results for:" +#~ msgstr "Nincs találatok a következőhöz:" + +#~ msgid "Please try a different search" +#~ msgstr "Próbálj másik keresést!" + +#~ msgid "Tasks list" +#~ msgstr "Feladatlista" + +#~ msgid "Kindle E-Mail" +#~ msgstr "Kindle e-mail" + +#~ msgid "Please note that every visit to this current page invalidates any previously generated Authentication url for this user." +#~ msgstr "" + +#~ msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" +#~ msgstr "" + diff --git a/cps/translations/it/LC_MESSAGES/messages.mo b/cps/translations/it/LC_MESSAGES/messages.mo index 6df0b60c..2780e0c0 100644 Binary files a/cps/translations/it/LC_MESSAGES/messages.mo and b/cps/translations/it/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/it/LC_MESSAGES/messages.po b/cps/translations/it/LC_MESSAGES/messages.po index eb2de1fd..5806ae50 100644 --- a/cps/translations/it/LC_MESSAGES/messages.po +++ b/cps/translations/it/LC_MESSAGES/messages.po @@ -6,28 +6,28 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2020-01-12 13:57+0100\n" +"POT-Creation-Date: 2020-03-12 20:31+0100\n" "PO-Revision-Date: 2017-04-04 15:09+0200\n" -"Last-Translator: Marco Picone \n" +"Last-Translator: ElQuimm \n" "Language: it\n" "Language-Team: \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.7.0\n" +"Generated-By: Babel 2.8.0\n" #: cps/about.py:42 msgid "installed" -msgstr "" +msgstr "installato" #: cps/about.py:44 msgid "not installed" msgstr "non installato" -#: cps/about.py:84 +#: cps/about.py:87 msgid "Statistics" -msgstr "Statistica" +msgstr "Statistiche" #: cps/admin.py:89 msgid "Server restarted, please reload page" @@ -35,11 +35,11 @@ msgstr "Server riavviato, per favore ricarica la pagina" #: cps/admin.py:91 msgid "Performing shutdown of server, please close window" -msgstr "Eseguo l'arresto del server, per favore chiudi la finestra." +msgstr "Eseguo l'arresto del server, per favore chiudi la finestra" #: cps/admin.py:110 cps/editbooks.py:410 cps/editbooks.py:419 #: cps/editbooks.py:539 cps/editbooks.py:541 cps/editbooks.py:594 -#: cps/updater.py:446 cps/uploader.py:97 cps/uploader.py:108 +#: cps/updater.py:456 cps/uploader.py:96 cps/uploader.py:107 msgid "Unknown" msgstr "Sconosciuto" @@ -47,161 +47,170 @@ msgstr "Sconosciuto" msgid "Admin page" msgstr "Pagina di amministrazione" -#: cps/admin.py:148 cps/templates/admin.html:115 +#: cps/admin.py:151 msgid "UI Configuration" msgstr "Configurazione dell'interfaccia utente" -#: cps/admin.py:185 cps/admin.py:412 +#: cps/admin.py:187 cps/admin.py:637 msgid "Calibre-Web configuration updated" msgstr "Aggiornamento della configurazione di Calibre-Web" -#: cps/admin.py:442 cps/templates/admin.html:114 +#: cps/admin.py:434 cps/admin.py:440 cps/admin.py:451 cps/admin.py:462 +#: cps/templates/modal_restriction.html:29 +msgid "Deny" +msgstr "Nega" + +#: cps/admin.py:436 cps/admin.py:442 cps/admin.py:453 cps/admin.py:464 +#: cps/templates/modal_restriction.html:28 +msgid "Allow" +msgstr "Permetti" + +#: cps/admin.py:667 msgid "Basic Configuration" msgstr "Configurazione di base" -#: cps/admin.py:465 cps/web.py:1093 +#: cps/admin.py:691 cps/web.py:1089 msgid "Please fill out all fields!" msgstr "Per favore compila tutti i campi!" -#: cps/admin.py:467 cps/admin.py:478 cps/admin.py:484 cps/admin.py:499 -#: cps/templates/admin.html:38 +#: cps/admin.py:694 cps/admin.py:706 cps/admin.py:712 cps/admin.py:730 msgid "Add new user" msgstr "Aggiungi un nuovo utente" -#: cps/admin.py:476 cps/web.py:1318 +#: cps/admin.py:703 cps/web.py:1318 msgid "E-mail is not from valid domain" msgstr "L'e-mail non proviene da un dominio valido" -#: cps/admin.py:482 cps/admin.py:493 +#: cps/admin.py:710 cps/admin.py:725 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:489 +#: cps/admin.py:721 #, python-format msgid "User '%(user)s' created" msgstr "Utente '%(user)s' creato" -#: cps/admin.py:509 +#: cps/admin.py:740 msgid "Edit e-mail server settings" msgstr "Modifica la configurazione del server e-mail" -#: cps/admin.py:535 +#: cps/admin.py:766 #, 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:538 +#: cps/admin.py:769 #, 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:540 +#: cps/admin.py:771 msgid "Please configure your e-mail address first..." -msgstr "" +msgstr "Per favore prima configura il tuo indirizzo e-mail..." -#: cps/admin.py:542 +#: cps/admin.py:773 msgid "E-mail server settings updated" msgstr "Configurazione del server e-mail aggiornata" -#: cps/admin.py:571 +#: cps/admin.py:803 #, python-format msgid "User '%(nick)s' deleted" msgstr "Utente '%(nick)s' eliminato" -#: cps/admin.py:574 +#: cps/admin.py:806 msgid "No admin user remaining, can't delete user" -msgstr "" +msgstr "Non rimarrebbe nessun utente amministratore, non posso eliminare l'utente" -#: cps/admin.py:612 cps/web.py:1359 +#: cps/admin.py:842 cps/web.py:1361 msgid "Found an existing account for this e-mail address." msgstr "Ho trovato un account creato in precedenza con questo e-mail." -#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1334 +#: cps/admin.py:852 cps/admin.py:867 cps/admin.py:887 cps/web.py:1336 #, python-format msgid "Edit User %(nick)s" msgstr "Modifica utente %(nick)s" -#: cps/admin.py:622 cps/web.py:1327 +#: cps/admin.py:858 cps/web.py:1328 msgid "This username is already taken" -msgstr "" +msgstr "Questo nome di utente è già utilizzato" -#: cps/admin.py:637 +#: cps/admin.py:874 #, python-format msgid "User '%(nick)s' updated" msgstr "Utente '%(nick)s' aggiornato" -#: cps/admin.py:640 +#: cps/admin.py:877 msgid "An unknown error occured." msgstr "Si è verificato un errore imprevisto." -#: cps/admin.py:657 +#: cps/admin.py:900 #, python-format msgid "Password for user %(user)s reset" msgstr "La password dell'utente %(user)s è stata resettata" -#: cps/admin.py:660 cps/web.py:1118 cps/web.py:1174 +#: cps/admin.py:903 cps/web.py:1114 cps/web.py:1170 msgid "An unknown error occurred. Please try again later." msgstr "Si è verificato un errore sconosciuto: per favore riprova." -#: cps/admin.py:663 cps/web.py:1062 +#: cps/admin.py:906 cps/web.py:1055 msgid "Please configure the SMTP mail settings first..." -msgstr "Configurare dapprima le impostazioni del server SMTP..." +msgstr "Configura dapprima le impostazioni del server SMTP..." -#: cps/admin.py:674 +#: cps/admin.py:918 msgid "Logfile viewer" -msgstr "" +msgstr "Visualizzatore del Logfile" -#: cps/admin.py:710 +#: cps/admin.py:957 msgid "Requesting update package" -msgstr "Richiesta del pacchetto di aggiornamento" +msgstr "Richiedo il pacchetto di aggiornamento" -#: cps/admin.py:711 +#: cps/admin.py:958 msgid "Downloading update package" msgstr "Scarico il pacchetto di aggiornamento" -#: cps/admin.py:712 +#: cps/admin.py:959 msgid "Unzipping update package" msgstr "Decomprimo il pacchetto di aggiornamento" -#: cps/admin.py:713 +#: cps/admin.py:960 msgid "Replacing files" -msgstr "Sostituzione files" +msgstr "Sostituisco i file" -#: cps/admin.py:714 +#: cps/admin.py:961 msgid "Database connections are closed" msgstr "Le connessioni al database sono chiuse" -#: cps/admin.py:715 +#: cps/admin.py:962 msgid "Stopping server" -msgstr "Arresta il server" +msgstr "Arresto il server" -#: cps/admin.py:716 +#: cps/admin.py:963 msgid "Update finished, please press okay and reload page" -msgstr "Aggiornamento completato, prego premere ok e ricaricare la pagina" +msgstr "Aggiornamento completato, per favore premi ok e ricarica la pagina" -#: cps/admin.py:717 cps/admin.py:718 cps/admin.py:719 cps/admin.py:720 +#: cps/admin.py:964 cps/admin.py:965 cps/admin.py:966 cps/admin.py:967 msgid "Update failed:" msgstr "Aggiornamento fallito:" -#: cps/admin.py:717 cps/updater.py:272 cps/updater.py:457 cps/updater.py:459 +#: cps/admin.py:964 cps/updater.py:282 cps/updater.py:467 cps/updater.py:469 msgid "HTTP Error" -msgstr "HTTP Error" +msgstr "Errore HTTP" -#: cps/admin.py:718 cps/updater.py:274 cps/updater.py:461 +#: cps/admin.py:965 cps/updater.py:284 cps/updater.py:471 msgid "Connection error" msgstr "Errore di connessione" -#: cps/admin.py:719 cps/updater.py:276 cps/updater.py:463 +#: cps/admin.py:966 cps/updater.py:286 cps/updater.py:473 msgid "Timeout while establishing connection" msgstr "Tempo scaduto nello stabilire la connessione" -#: cps/admin.py:720 cps/updater.py:278 cps/updater.py:465 +#: cps/admin.py:967 cps/updater.py:288 cps/updater.py:475 msgid "General error" msgstr "Errore generale" #: cps/converter.py:31 msgid "not configured" -msgstr "" +msgstr "non configurato" #: cps/editbooks.py:214 cps/editbooks.py:396 msgid "Error opening eBook. File does not exist or file is not accessible" @@ -209,7 +218,7 @@ msgstr "Errore durante l'apertura del libro. Il file non esiste o il file non è #: cps/editbooks.py:242 msgid "edit metadata" -msgstr "modifica i metadati" +msgstr "Modifica i metadati" #: cps/editbooks.py:321 cps/editbooks.py:569 #, python-format @@ -235,13 +244,9 @@ msgstr "Il salvataggio del file %(file)s è fallito." msgid "File format %(ext)s added to %(book)s" msgstr "Ho aggiunto l'estensione %(ext)s al libro %(book)s" -#: cps/editbooks.py:376 -msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" -msgstr "" - #: cps/editbooks.py:451 msgid "Cover is not a jpg file, can't save" -msgstr "" +msgstr "La copertina non è un file jpg, non posso salvare" #: cps/editbooks.py:494 #, python-format @@ -259,53 +264,53 @@ msgstr "Errore nella modifica del libro. Per favore verifica i dettagli nel file #: cps/editbooks.py:581 #, python-format msgid "File %(filename)s could not saved to temp dir" -msgstr "" +msgstr "Il file %(filename)s non può essere salvato nella cartella temporanea" #: cps/editbooks.py:598 msgid "Uploaded book probably exists in the library, consider to change before upload new: " -msgstr "" +msgstr "Probabilmnete il libro caricato esiste già nella libreria; considera di cambiare prima di sottoporlo nuovamente: " #: cps/editbooks.py:613 #, python-format msgid "Failed to store file %(file)s (Permission denied)." -msgstr "Impossibile salvare il file %(file)s (autorizzazione negata)" +msgstr "Impossibile salvare il file %(file)s (autorizzazione negata)." #: cps/editbooks.py:619 #, python-format msgid "Failed to delete file %(file)s (Permission denied)." -msgstr "Impossibile eliminare il file %(file)s (autorizzazione negata)" +msgstr "Impossibile eliminare il file %(file)s (autorizzazione negata)." -#: cps/editbooks.py:710 +#: cps/editbooks.py:709 #, python-format msgid "File %(file)s uploaded" -msgstr "" +msgstr "Il file %(file)s è stato caricato" -#: cps/editbooks.py:739 +#: cps/editbooks.py:738 msgid "Source or destination format for conversion missing" -msgstr "Il formato sorgente o quello di destinazione per la conversione mancano" +msgstr "Il formato sorgente o quello di destinazione, necessari alla conversione, mancano" -#: cps/editbooks.py:747 +#: cps/editbooks.py:746 #, 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:751 +#: cps/editbooks.py:750 #, 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:62 +#: 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:104 +#: cps/gdrive.py:103 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:80 #, python-format msgid "%(format)s format not found for book id: %(book)d" -msgstr "%(format)s formato non trovato per il libro: %(book)d" +msgstr "Formato %(format)s non trovato per il libro: %(book)d" #: cps/helper.py:92 #, python-format @@ -341,7 +346,7 @@ msgstr "Inizia con Calibre-Web" #: cps/helper.py:135 #, python-format msgid "Registration e-mail for user: %(name)s" -msgstr "E-mail di registrazione per l'utente: %(name)s" +msgstr "E-mail di registrazione dell'utente: %(name)s" #: cps/helper.py:149 cps/helper.py:151 cps/helper.py:153 cps/helper.py:161 #: cps/helper.py:163 cps/helper.py:165 @@ -366,12 +371,12 @@ msgstr "Il file richiesto non può essere letto. I permessi sono corretti?" #: cps/helper.py:322 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" -msgstr "La modifica del titolo da: '%(src)s' a '%(dest)s' è terminata con l'errore: %(error)s" +msgstr "La modifica del titolo da '%(src)s' a '%(dest)s' è terminata con l'errore: %(error)s" #: cps/helper.py:332 #, 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" +msgstr "La modifica dell'autore da '%(src)s' a '%(dest)s' è terminata con l'errore: %(error)s" #: cps/helper.py:346 #, python-format @@ -386,91 +391,119 @@ msgstr "File %(file)s non trovato su Google Drive" #: cps/helper.py:411 #, python-format msgid "Book path %(path)s not found on Google Drive" -msgstr "Non ho trovato la cartella %(path)s su Google Drive" +msgstr "Non ho trovato la cartella %(path)s del libro su Google Drive" + +#: cps/helper.py:511 +msgid "Failed to create path for cover" +msgstr "Errore nel creare il percorso per la copertina" -#: cps/helper.py:643 +#: cps/helper.py:516 +msgid "Cover-file is not a valid image file" +msgstr "Il file della copertina non è in un formato immagine valido" + +#: cps/helper.py:519 +msgid "Failed to store cover-file" +msgstr "Errore nel salvare il file della copertina" + +#: cps/helper.py:530 +msgid "Only jpg/jpeg/png/webp files are supported as coverfile" +msgstr "Solamente i file nei formati jpg/jpeg/png/webp sono supportati per le copertine" + +#: cps/helper.py:544 +msgid "Only jpg/jpeg files are supported as coverfile" +msgstr "Solamente i file nei formati jpg/jpeg sono supportati per le copertine" + +#: cps/helper.py:658 msgid "Waiting" -msgstr "Attendere" +msgstr "Attendi" -#: cps/helper.py:645 +#: cps/helper.py:660 msgid "Failed" -msgstr "Fallito" +msgstr "Non riuscito" -#: cps/helper.py:647 +#: cps/helper.py:662 msgid "Started" msgstr "Avviato" -#: cps/helper.py:649 +#: cps/helper.py:664 msgid "Finished" msgstr "Terminato" -#: cps/helper.py:651 +#: cps/helper.py:666 msgid "Unknown Status" msgstr "Stato sconosciuto" -#: cps/helper.py:656 +#: cps/helper.py:671 msgid "E-mail: " msgstr "E-mail: " -#: cps/helper.py:658 cps/helper.py:662 +#: cps/helper.py:673 cps/helper.py:677 msgid "Convert: " msgstr "Conversione: " -#: cps/helper.py:660 +#: cps/helper.py:675 msgid "Upload: " msgstr "Upload: " -#: cps/helper.py:664 +#: cps/helper.py:679 msgid "Unknown Task: " msgstr "Processo sconosciuto: " -#: cps/oauth_bb.py:75 +#: cps/kobo_auth.py:127 +msgid "PLease access calibre-web from non localhost to get valid api_endpoint for kobo device" +msgstr "Per favore, per ottenere un valido api-endpoint per Kobo, accedi a Calibre-web non da localhost" + +#: cps/kobo_auth.py:130 cps/kobo_auth.py:150 +msgid "Kobo Setup" +msgstr "Configurazione di Kobo" + +#: cps/oauth_bb.py:74 #, python-format msgid "Register with %(provider)s" -msgstr "" +msgstr "Registra con %(provider)s" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:154 msgid "Failed to log in with GitHub." -msgstr "" +msgstr "Accesso con GitHub non riuscito." -#: cps/oauth_bb.py:160 +#: cps/oauth_bb.py:159 msgid "Failed to fetch user info from GitHub." -msgstr "" +msgstr "Fallito il recupero delle informazioni dell'utente da GitHub." -#: cps/oauth_bb.py:171 +#: cps/oauth_bb.py:170 msgid "Failed to log in with Google." -msgstr "" +msgstr "Fallito l'accesso con Google." -#: cps/oauth_bb.py:176 +#: cps/oauth_bb.py:175 msgid "Failed to fetch user info from Google." -msgstr "" +msgstr "Fallito il recupero delle informazioni dell'utente da Google." -#: cps/oauth_bb.py:274 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s success." -msgstr "" +msgstr "Scollegato da %(oauth)s con successo." -#: cps/oauth_bb.py:278 +#: cps/oauth_bb.py:277 #, python-format msgid "Unlink to %(oauth)s failed." -msgstr "" +msgstr "Scollegamento da %(oauth)s fallito." -#: cps/oauth_bb.py:281 +#: cps/oauth_bb.py:280 #, python-format msgid "Not linked to %(oauth)s." -msgstr "" +msgstr "Non collegato a %(oauth)s." -#: cps/oauth_bb.py:309 +#: cps/oauth_bb.py:308 msgid "GitHub Oauth error, please retry later." -msgstr "" +msgstr "GitHub errore Oauth, per favore riprova più tardi." -#: cps/oauth_bb.py:328 +#: cps/oauth_bb.py:327 msgid "Google Oauth error, please retry later." -msgstr "" +msgstr "Google errore Oauth, per favore riprova più tardi." #: cps/shelf.py:47 cps/shelf.py:99 msgid "Invalid shelf specified" -msgstr "Lo scaffale specificato non è valevole" +msgstr "Lo scaffale specificato non è valido" #: cps/shelf.py:54 #, python-format @@ -515,405 +548,395 @@ msgstr "I libri sono stati aggiunti allo scaffale: %(sname)s" msgid "Could not add books to shelf: %(sname)s" msgstr "Non posso aggiungere libri allo scaffale: %(sname)s" -#: cps/shelf.py:180 +#: cps/shelf.py:181 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "Il libro è stato rimosso dallo scaffale: %(sname)s" -#: cps/shelf.py:186 +#: cps/shelf.py:190 #, 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:207 cps/shelf.py:231 +#: cps/shelf.py:211 cps/shelf.py:235 #, 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:212 +#: cps/shelf.py:216 #, python-format msgid "Shelf %(title)s created" msgstr "Lo scaffale %(title)s è stato creato" -#: cps/shelf.py:214 cps/shelf.py:242 +#: cps/shelf.py:218 cps/shelf.py:246 msgid "There was an error" msgstr "C'era un errore" -#: cps/shelf.py:215 cps/shelf.py:217 +#: cps/shelf.py:219 cps/shelf.py:221 msgid "create a shelf" -msgstr "crea uno scaffale" +msgstr "Crea uno scaffale" -#: cps/shelf.py:240 +#: cps/shelf.py:244 #, python-format msgid "Shelf %(title)s changed" msgstr "Lo scaffale %(title)s è stato modificato" -#: cps/shelf.py:243 cps/shelf.py:245 +#: cps/shelf.py:247 cps/shelf.py:249 msgid "Edit a shelf" msgstr "Modifica uno scaffale" -#: cps/shelf.py:289 +#: cps/shelf.py:301 #, python-format msgid "Shelf: '%(name)s'" msgstr "Scaffale: '%(name)s'" -#: cps/shelf.py:292 +#: cps/shelf.py:304 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:323 +#: cps/shelf.py:342 +msgid "Hidden Book" +msgstr "Libro nascosto" + +#: cps/shelf.py:347 #, python-format msgid "Change order of Shelf: '%(name)s'" -msgstr "Modificare l'ordine dello scaffale: '%(name)s'" +msgstr "Modifica l'ordine dello scaffale: '%(name)s'" -#: cps/ub.py:57 +#: cps/ub.py:56 msgid "Recently Added" -msgstr "Aggiunto recentemente" +msgstr "Aggiunti recentemente" -#: cps/ub.py:59 +#: cps/ub.py:58 msgid "Show recent books" -msgstr "Mostra i libri recenti" +msgstr "Mostra l'opzione per la selezione dei libri più recenti" -#: cps/templates/index.xml:17 cps/ub.py:60 +#: cps/templates/index.xml:17 cps/ub.py:59 msgid "Hot Books" -msgstr "Hot Ebook" +msgstr "Libri popolari" -#: cps/ub.py:61 -msgid "Show hot books" -msgstr "Mostra libri popolari" +#: cps/ub.py:60 +msgid "Show Hot Books" +msgstr "Mostra l'opzione per la selezione dei libri più popolari" -#: cps/templates/index.xml:24 cps/ub.py:64 -msgid "Best rated Books" -msgstr "Libri più votati" +#: cps/templates/index.xml:24 cps/ub.py:63 cps/web.py:508 +msgid "Top Rated Books" +msgstr "Libri meglio valutati" -#: cps/ub.py:66 -msgid "Show best rated books" -msgstr "Mostra la sezione dei libri più votati" +#: cps/ub.py:65 +msgid "Show Top Rated Books" +msgstr "Mostra l'opzione per la selezione dei libri meglio valutati" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67 -#: cps/web.py:1011 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:66 +#: cps/web.py:1005 msgid "Read Books" msgstr "Libri da leggere" -#: cps/ub.py:69 +#: cps/ub.py:68 msgid "Show read and unread" -msgstr "Mostra letto e non letto" +msgstr "Mostra l'opzione per la selezione letto e non letto" -#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71 -#: cps/web.py:1015 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:70 +#: cps/web.py:1009 msgid "Unread Books" msgstr "Libri non letti" -#: cps/ub.py:73 +#: cps/ub.py:72 msgid "Show unread" -msgstr "" +msgstr "Mostra l'opzione per la selezione dei libri non letti" -#: cps/ub.py:74 +#: cps/ub.py:73 msgid "Discover" msgstr "Per scoprire" -#: cps/ub.py:76 +#: cps/ub.py:75 msgid "Show random books" -msgstr "Mostra libro a caso" +msgstr "Mostra l'opzione per presentare libri aleatoriamente" -#: cps/templates/index.xml:75 cps/ub.py:77 +#: cps/templates/index.xml:75 cps/ub.py:76 cps/web.py:787 msgid "Categories" -msgstr "Categoria" +msgstr "Categorie" -#: cps/ub.py:79 +#: cps/ub.py:78 msgid "Show category selection" -msgstr "Mostra la selezione delle categorie" +msgstr "Mostra l'opzione per la selezione delle categorie" -#: cps/templates/book_edit.html:71 cps/templates/index.xml:82 -#: cps/templates/search_form.html:53 cps/ub.py:80 +#: cps/templates/book_edit.html:69 cps/templates/index.xml:82 +#: cps/templates/search_form.html:53 cps/ub.py:79 cps/web.py:715 msgid "Series" msgstr "Serie" -#: cps/ub.py:82 +#: cps/ub.py:81 msgid "Show series selection" -msgstr "Mostra la selezione delle serie" +msgstr "Mostra l'opzione per la selezione delle serie" -#: cps/templates/index.xml:61 cps/ub.py:83 +#: cps/templates/index.xml:61 cps/ub.py:82 msgid "Authors" msgstr "Autori" -#: cps/ub.py:85 +#: cps/ub.py:84 msgid "Show author selection" -msgstr "Mostra la selezione dell'autore" +msgstr "Mostra l'opzione per la selezione degli autori" -#: cps/templates/index.xml:68 cps/ub.py:87 +#: cps/templates/index.xml:68 cps/ub.py:86 cps/web.py:699 msgid "Publishers" msgstr "Editori" -#: cps/ub.py:89 +#: cps/ub.py:88 msgid "Show publisher selection" -msgstr "Mostra la selezione dell'editore" +msgstr "Mostra l'opzione per la selezione degli editori" -#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:90 +#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:89 +#: cps/web.py:770 msgid "Languages" -msgstr "Lingua" +msgstr "Lingue" -#: cps/ub.py:93 +#: cps/ub.py:92 msgid "Show language selection" -msgstr "Mostra la selezione della lingua" +msgstr "Mostra l'opzione per la selezione delle lingue" -#: cps/ub.py:94 +#: cps/templates/index.xml:96 cps/ub.py:93 msgid "Ratings" -msgstr "" +msgstr "Valutazioni" -#: cps/ub.py:96 +#: cps/ub.py:95 msgid "Show ratings selection" -msgstr "" +msgstr "Mostra l'opzione per la selezione della valutazione" -#: cps/templates/index.xml:96 cps/ub.py:97 +#: cps/templates/index.xml:104 cps/ub.py:96 msgid "File formats" -msgstr "" +msgstr "Formati file" -#: cps/ub.py:99 +#: cps/ub.py:98 msgid "Show file formats selection" -msgstr "" +msgstr "Mostra la selezione del formato dei file" -#: cps/updater.py:252 cps/updater.py:359 cps/updater.py:372 +#: cps/updater.py:262 cps/updater.py:369 cps/updater.py:382 msgid "Unexpected data while reading update information" msgstr "Dati inattesi durante il processo di aggiornamento" -#: cps/updater.py:259 cps/updater.py:365 +#: cps/updater.py:269 cps/updater.py:375 msgid "No update available. You already have the latest version installed" -msgstr "Nessun aggiornamento disponibile. Hai già installato l'ultima versione disponibile" +msgstr "Nessun aggiornamento disponibile. L'ultima versione è già installata" -#: cps/updater.py:285 +#: cps/updater.py:295 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:338 +#: cps/updater.py:348 msgid "Could not fetch update information" -msgstr "Impossibile recuperare informazioni di aggiornamento" +msgstr "Impossibile recuperare le informazioni di aggiornamento" -#: cps/updater.py:352 +#: cps/updater.py:362 msgid "No release information available" msgstr "Non sono disponibili informazioni sulla versione" -#: cps/updater.py:405 cps/updater.py:414 +#: cps/updater.py:415 cps/updater.py:424 #, 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/updater.py:424 +#: cps/updater.py:434 msgid "Click on the button below to update to the latest stable version." -msgstr "" +msgstr "Clicca sul pulsante per aggiornare all'ultima versione stabile." -#: cps/web.py:486 +#: cps/web.py:480 msgid "Recently Added Books" msgstr "Libri aggiunti di recente" -#: cps/web.py:514 -msgid "Best rated books" -msgstr "I libri con le migliori valutazioni" - -#: cps/templates/index.xml:38 cps/web.py:522 -msgid "Random Books" -msgstr "Libri a caso" +#: cps/templates/index.html:5 cps/web.py:516 +msgid "Discover (Random Books)" +msgstr "Scopri (libri casuali)" -#: cps/web.py:548 +#: cps/web.py:542 msgid "Books" -msgstr "" +msgstr "Libri" -#: cps/web.py:575 -msgid "Hot Books (most downloaded)" +#: cps/web.py:569 +msgid "Hot Books (Most Downloaded)" msgstr "I libri più richiesti" -#: cps/web.py:586 cps/web.py:1382 cps/web.py:1478 -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 +msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" +msgstr "Oops! Errore durante l'apertura del libro selezionato. Il file non esiste o il file non è accessibile" -#: cps/web.py:599 +#: cps/web.py:593 #, python-format msgid "Author: %(name)s" -msgstr "" +msgstr "Autore: %(name)s" -#: cps/web.py:611 +#: cps/web.py:605 #, python-format msgid "Publisher: %(name)s" msgstr "Editore: %(name)s" -#: cps/web.py:622 +#: cps/web.py:616 #, python-format msgid "Series: %(serie)s" msgstr "Serie: %(serie)s" -#: cps/web.py:633 +#: cps/web.py:627 #, python-format msgid "Rating: %(rating)s stars" -msgstr "" +msgstr "Valutazione: %(rating)s stelle" -#: cps/web.py:644 +#: cps/web.py:638 #, python-format msgid "File format: %(format)s" -msgstr "" +msgstr "Formato del file: %(format)s" -#: cps/web.py:656 +#: cps/web.py:650 #, python-format msgid "Category: %(name)s" msgstr "Categoria: %(name)s" -#: cps/web.py:673 +#: cps/web.py:667 #, python-format msgid "Language: %(name)s" msgstr "Lingua: %(name)s" -#: cps/web.py:705 -msgid "Publisher list" -msgstr "Lista degli editori" - -#: cps/web.py:721 -msgid "Series list" -msgstr "Lista delle serie" - -#: cps/web.py:735 +#: cps/web.py:729 msgid "Ratings list" -msgstr "" +msgstr "Elenco delle valutazioni" -#: cps/web.py:748 +#: cps/web.py:742 msgid "File formats list" -msgstr "" - -#: cps/web.py:776 -msgid "Available languages" -msgstr "Lingue disponibili" +msgstr "Elenco dei formati" -#: cps/web.py:793 -msgid "Category list" -msgstr "Elenco categorie" - -#: cps/templates/layout.html:73 cps/web.py:807 +#: cps/templates/layout.html:73 cps/templates/tasks.html:7 cps/web.py:801 msgid "Tasks" msgstr "Compito" -#: cps/templates/feed.xml:33 cps/templates/layout.html:44 -#: cps/templates/layout.html:45 cps/web.py:829 cps/web.py:831 +#: cps/templates/book_edit.html:212 cps/templates/feed.xml:33 +#: cps/templates/layout.html:44 cps/templates/layout.html:47 +#: cps/templates/search_form.html:170 cps/web.py:821 cps/web.py:823 msgid "Search" msgstr "Cerca" -#: cps/web.py:881 +#: cps/web.py:873 msgid "Published after " msgstr "Pubblicato dopo " -#: cps/web.py:888 +#: cps/web.py:880 msgid "Published before " msgstr "Pubblicato prima " -#: cps/web.py:902 +#: cps/web.py:894 #, python-format msgid "Rating <= %(rating)s" msgstr "Valutazione <= %(rating)s" -#: cps/web.py:904 +#: cps/web.py:896 #, python-format msgid "Rating >= %(rating)s" msgstr "Valutazione >= %(rating)s" -#: cps/web.py:970 cps/web.py:982 +#: cps/web.py:962 cps/web.py:976 msgid "search" msgstr "ricerca" -#: cps/web.py:1067 +#: cps/web.py:1060 #, 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:1071 +#: cps/web.py:1064 #, 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:1073 +#: cps/web.py:1066 msgid "Please configure your kindle e-mail address first..." msgstr "Per favore configura dapprima il tuo indirizzo e-mail di Kindle..." -#: cps/web.py:1087 +#: cps/web.py:1083 msgid "E-Mail server is not configured, please contact your administrator!" -msgstr "" +msgstr "Il server e-mail non è configurato, per favore contatta l'amministratore" -#: cps/web.py:1088 cps/web.py:1094 cps/web.py:1119 cps/web.py:1123 -#: cps/web.py:1128 cps/web.py:1132 +#: cps/web.py:1084 cps/web.py:1090 cps/web.py:1115 cps/web.py:1119 +#: cps/web.py:1124 cps/web.py:1128 msgid "register" msgstr "registra" -#: cps/web.py:1121 +#: cps/web.py:1117 msgid "Your e-mail is not allowed to register" msgstr "Il tuo e-mail non può essere utilizzato per la registrazione" -#: cps/web.py:1124 +#: cps/web.py:1120 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:1127 +#: cps/web.py:1123 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:1144 +#: cps/web.py:1140 msgid "Cannot activate LDAP authentication" -msgstr "" +msgstr "Non posso attivare l'autenticazione LDAP" -#: cps/web.py:1154 cps/web.py:1281 +#: cps/web.py:1150 cps/web.py:1277 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "ora sei connesso come: '%(nickname)s'" -#: cps/web.py:1159 +#: cps/web.py:1155 msgid "Could not login. LDAP server down, please contact your administrator" -msgstr "" +msgstr "Non posso collegarmi. Il server LDAP non è raggiungibile, per favore contatta l'amministratore" -#: cps/web.py:1163 cps/web.py:1186 +#: cps/web.py:1159 cps/web.py:1182 msgid "Wrong Username or Password" msgstr "Nome utente o password errati" -#: cps/web.py:1170 +#: cps/web.py:1166 msgid "New Password was send to your email address" -msgstr "" +msgstr "Una nuova password è stata inviata al tuo recapito e-mail" -#: cps/web.py:1176 +#: cps/web.py:1172 msgid "Please enter valid username to reset password" -msgstr "" +msgstr "Per favore digita un nome di utente valido per resettare la password" -#: cps/web.py:1182 +#: cps/web.py:1178 #, python-format msgid "You are now logged in as: '%(nickname)s'" -msgstr "" +msgstr "Ora sei connesso come '%(nickname)s'" -#: cps/web.py:1189 cps/web.py:1213 +#: cps/web.py:1185 cps/web.py:1209 msgid "login" msgstr "accedi" -#: cps/web.py:1225 cps/web.py:1259 +#: cps/web.py:1221 cps/web.py:1255 msgid "Token not found" msgstr "Token non trovato" -#: cps/web.py:1234 cps/web.py:1267 +#: cps/web.py:1230 cps/web.py:1263 msgid "Token has expired" msgstr "Il token è scaduto" -#: cps/web.py:1243 +#: cps/web.py:1239 msgid "Success! Please return to your device" -msgstr "Successo! Torna al tuo dispositivo" +msgstr "Riuscito! Torna al tuo dispositivo" -#: cps/web.py:1320 cps/web.py:1363 cps/web.py:1369 +#: cps/web.py:1320 cps/web.py:1365 cps/web.py:1371 #, python-format msgid "%(name)s's profile" msgstr "Profilo di %(name)s" -#: cps/web.py:1365 +#: cps/web.py:1367 msgid "Profile updated" msgstr "Profilo aggiornato" -#: cps/web.py:1394 cps/web.py:1397 cps/web.py:1400 cps/web.py:1407 -#: cps/web.py:1412 +#: cps/web.py:1384 cps/web.py:1480 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "Errore nell'aprire il libro. Il file non esiste o il file non è accessibile:" + +#: cps/web.py:1396 cps/web.py:1399 cps/web.py:1402 cps/web.py:1409 +#: cps/web.py:1414 msgid "Read a Book" -msgstr "Leggere un libro" +msgstr "Leggi un libro" -#: cps/web.py:1423 +#: cps/web.py:1425 msgid "Error opening eBook. File does not exist or file is not accessible." -msgstr "" +msgstr "Errore nell'aprire il libro. Il file non esiste o il file non è accessibile." #: cps/worker.py:335 #, python-format @@ -926,24 +949,27 @@ msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Kindlegen ha restituito l'errore %(error)s. Messaggio: %(message)s" #: cps/templates/admin.html:9 -msgid "User list" +msgid "Users" msgstr "Elenco utenti" -#: cps/templates/admin.html:12 -msgid "Nickname" -msgstr "Nickname" +#: cps/templates/admin.html:12 cps/templates/login.html:8 +#: cps/templates/login.html:9 cps/templates/register.html:7 +#: cps/templates/user_edit.html:8 +msgid "Username" +msgstr "Utente" -#: cps/templates/admin.html:13 -msgid "E-mail" +#: cps/templates/admin.html:13 cps/templates/register.html:11 +#: cps/templates/user_edit.html:13 +msgid "E-mail Address" msgstr "E-mail" -#: cps/templates/admin.html:14 -msgid "Kindle" -msgstr "Kindle" +#: cps/templates/admin.html:14 cps/templates/user_edit.html:26 +msgid "Send to Kindle E-mail Address" +msgstr "Invia all'email di Kindle" #: cps/templates/admin.html:15 -msgid "DLS" -msgstr "DLS" +msgid "Downloads" +msgstr "Downloads" #: cps/templates/admin.html:16 cps/templates/layout.html:76 msgid "Admin" @@ -956,8 +982,8 @@ msgid "Download" msgstr "Download" #: cps/templates/admin.html:18 -msgid "View Ebooks" -msgstr "" +msgid "View eBooks" +msgstr "Vedi libri" #: cps/templates/admin.html:19 cps/templates/layout.html:65 msgid "Upload" @@ -967,96 +993,108 @@ msgstr "Upload" msgid "Edit" msgstr "Modifica" +#: cps/templates/admin.html:38 +msgid "Add New User" +msgstr "Aggiungi un nuovo utente" + #: cps/templates/admin.html:44 -msgid "SMTP e-mail server settings" +msgid "E-mail Server Settings" msgstr "Configurazione server SMTP" #: cps/templates/admin.html:47 cps/templates/email_edit.html:11 -msgid "SMTP hostname" +msgid "SMTP Hostname" msgstr "indirizzo server SMTP" -#: cps/templates/admin.html:48 -msgid "SMTP port" +#: cps/templates/admin.html:48 cps/templates/email_edit.html:15 +msgid "SMTP Port" msgstr "porta SMTP" -#: cps/templates/admin.html:49 -msgid "SSL" +#: cps/templates/admin.html:49 cps/templates/email_edit.html:19 +msgid "Encryption" msgstr "SSL" #: cps/templates/admin.html:50 cps/templates/email_edit.html:27 -msgid "SMTP login" +msgid "SMTP Login" msgstr "login SMTP" -#: cps/templates/admin.html:51 -msgid "From mail" +#: cps/templates/admin.html:51 cps/templates/email_edit.html:35 +msgid "From E-mail" msgstr "E-mail da" #: cps/templates/admin.html:61 msgid "Change SMTP settings" -msgstr "Modificare le impostazioni SMTP" +msgstr "Modifica le impostazioni SMTP" #: cps/templates/admin.html:67 msgid "Configuration" msgstr "Configurazione" #: cps/templates/admin.html:70 -msgid "Calibre DB dir" -msgstr "Cartella DB Calibre" +msgid "Calibre Database Directory" +msgstr "Cartella del database di Calibre" -#: cps/templates/admin.html:74 -msgid "Log level" +#: cps/templates/admin.html:74 cps/templates/config_edit.html:122 +msgid "Log Level" msgstr "Livello di log" #: cps/templates/admin.html:78 msgid "Port" msgstr "Porta" -#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:23 -msgid "Books per page" +#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:27 +msgid "Books per Page" msgstr "Libri per pagina" #: cps/templates/admin.html:88 -msgid "Uploading" -msgstr "Uploading" +msgid "Uploads" +msgstr "Uploads" #: cps/templates/admin.html:92 -msgid "Anonymous browsing" +msgid "Anonymous Browsing" msgstr "Navigazione anonima" #: cps/templates/admin.html:96 -msgid "Public registration" +msgid "Public Registration" msgstr "Registrazione pubblica" -#: cps/templates/admin.html:100 cps/templates/remote_login.html:4 -msgid "Remote login" -msgstr "Login remoto" +#: cps/templates/admin.html:100 +msgid "Magic Link Remote Login" +msgstr "Magic Link Login remoto" #: cps/templates/admin.html:104 -msgid "Reverse proxy login" -msgstr "" +msgid "Reverse Proxy Login" +msgstr "Login reverse proxy" #: cps/templates/admin.html:109 msgid "Reverse proxy header name" -msgstr "" +msgstr "Nome intestazione reverse proxy" + +#: cps/templates/admin.html:114 +msgid "Edit Basic Configuration" +msgstr "Edita la configurazione di base" + +#: cps/templates/admin.html:115 +msgid "Edit UI Configuration" +msgstr "Edita la configurazione dell'interfaccia utente" #: cps/templates/admin.html:121 msgid "Administration" msgstr "Amministrazione" #: cps/templates/admin.html:122 -msgid "View Logfiles" -msgstr "" +msgid "View Logs" +msgstr "Visualizza Logfile" #: cps/templates/admin.html:123 -msgid "Reconnect to Calibre DB" -msgstr "Ricollegare al DB Calibre" +msgid "Reconnect Calibre Database" +msgstr "Ricollega al database di Calibre" #: cps/templates/admin.html:124 -msgid "Restart Calibre-Web" +msgid "Restart" msgstr "Riavvia Calibre-Web" #: cps/templates/admin.html:125 -msgid "Stop Calibre-Web" +msgid "Shutdown" msgstr "Arresta Calibre-Web" #: cps/templates/admin.html:131 @@ -1076,38 +1114,37 @@ msgid "Current version" msgstr "Versione attuale" #: cps/templates/admin.html:148 -msgid "Check for update" +msgid "Check for Update" msgstr "Ricerca aggiornamenti" #: cps/templates/admin.html:149 msgid "Perform Update" -msgstr "Esegui aggiornamento" +msgstr "Esegui l'aggiornamento" #: cps/templates/admin.html:161 -msgid "Do you really want to restart Calibre-Web?" +msgid "Are you sure you want to restart?" msgstr "Vuoi veramente riavviare Calibre-Web?" #: cps/templates/admin.html:166 cps/templates/admin.html:180 #: cps/templates/admin.html:200 cps/templates/shelf.html:72 -msgid "Ok" +msgid "OK" msgstr "Ok" #: cps/templates/admin.html:167 cps/templates/admin.html:181 -#: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 +#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:194 +#: cps/templates/config_edit.html:346 cps/templates/config_view_edit.html:151 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92 -#: cps/templates/layout.html:28 cps/templates/shelf.html:73 -#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32 -#: cps/templates/user_edit.html:131 -msgid "Back" -msgstr "Indietro" +#: cps/templates/shelf.html:73 cps/templates/shelf_edit.html:19 +#: cps/templates/user_edit.html:137 +msgid "Cancel" +msgstr "Annulla" #: cps/templates/admin.html:179 -msgid "Do you really want to stop Calibre-Web?" +msgid "Are you sure you want to shutdown?" msgstr "Vuoi veramente arrestare Calibre-Web?" #: cps/templates/admin.html:191 -msgid "Updating, please do not reload page" +msgid "Updating, please do not reload this page" msgstr "Aggiornamento, non ricaricare la pagina." #: cps/templates/author.html:15 @@ -1121,7 +1158,7 @@ msgstr "Nella libreria" #: cps/templates/author.html:34 cps/templates/list.html:14 #: cps/templates/search.html:41 msgid "All" -msgstr "" +msgstr "Tutti" #: cps/templates/author.html:58 cps/templates/author.html:110 #: cps/templates/discover.html:27 cps/templates/index.html:26 @@ -1134,161 +1171,159 @@ msgstr "riduci" msgid "More by" msgstr "Altro da" -#: cps/templates/book_edit.html:12 +#: cps/templates/book_edit.html:10 msgid "Delete Book" msgstr "Elimina libro" -#: cps/templates/book_edit.html:15 +#: cps/templates/book_edit.html:13 msgid "Delete formats:" msgstr "Elimina i formati:" -#: cps/templates/book_edit.html:18 cps/templates/book_edit.html:195 -#: cps/templates/email_edit.html:91 +#: cps/templates/book_edit.html:16 cps/templates/book_edit.html:193 +#: cps/templates/email_edit.html:91 cps/templates/user_edit.html:65 +#: cps/templates/user_edit.html:177 msgid "Delete" msgstr "Elimina" -#: cps/templates/book_edit.html:26 +#: cps/templates/book_edit.html:24 msgid "Convert book format:" msgstr "Converti il libro nel formato:" -#: cps/templates/book_edit.html:30 +#: cps/templates/book_edit.html:28 msgid "Convert from:" msgstr "Converti da:" -#: cps/templates/book_edit.html:32 cps/templates/book_edit.html:39 +#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:37 msgid "select an option" -msgstr "seleziona un'opzione" +msgstr "seleziona un formato" -#: cps/templates/book_edit.html:37 +#: cps/templates/book_edit.html:35 msgid "Convert to:" msgstr "Converti in:" -#: cps/templates/book_edit.html:46 +#: cps/templates/book_edit.html:44 msgid "Convert book" msgstr "Converti libro" -#: cps/templates/book_edit.html:55 cps/templates/search_form.html:6 +#: cps/templates/book_edit.html:53 cps/templates/search_form.html:6 msgid "Book Title" msgstr "Titolo del libro" -#: cps/templates/book_edit.html:59 cps/templates/book_edit.html:255 -#: cps/templates/book_edit.html:273 cps/templates/search_form.html:10 +#: cps/templates/book_edit.html:57 cps/templates/book_edit.html:256 +#: cps/templates/book_edit.html:274 cps/templates/search_form.html:10 msgid "Author" msgstr "Autore" -#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:260 -#: cps/templates/book_edit.html:275 cps/templates/search_form.html:126 +#: cps/templates/book_edit.html:61 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:276 cps/templates/search_form.html:126 msgid "Description" msgstr "Descrizione" -#: cps/templates/book_edit.html:67 cps/templates/search_form.html:33 +#: cps/templates/book_edit.html:65 cps/templates/search_form.html:33 msgid "Tags" -msgstr "Tags" +msgstr "Categorie" -#: cps/templates/book_edit.html:75 -msgid "Series id" -msgstr "Serie id" +#: cps/templates/book_edit.html:73 +msgid "Series ID" +msgstr "ID della serie" -#: cps/templates/book_edit.html:79 +#: cps/templates/book_edit.html:77 msgid "Rating" msgstr "Valutazione" -#: cps/templates/book_edit.html:83 -msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" -msgstr "URL della copertina (jpg, la copertina viene caricata e salvata nel database, dopodiché il campo viene nuovamente svuotato)" +#: cps/templates/book_edit.html:81 +msgid "Fetch Cover from URL (JPEG - Image will be downloaded and stored in database)" +msgstr "Carica la copertina da URL (jpg, la copertina viene caricata e salvata nel database)" -#: cps/templates/book_edit.html:87 -msgid "Upload Cover from local drive" +#: cps/templates/book_edit.html:85 +msgid "Upload Cover from Local Disk" msgstr "Carica la copertina dal disco locale" -#: cps/templates/book_edit.html:92 cps/templates/detail.html:165 -msgid "Publishing date" +#: cps/templates/book_edit.html:90 +msgid "Published Date" msgstr "Data di pubblicazione" -#: cps/templates/book_edit.html:99 cps/templates/book_edit.html:257 -#: cps/templates/book_edit.html:274 cps/templates/detail.html:156 +#: cps/templates/book_edit.html:97 cps/templates/book_edit.html:258 +#: cps/templates/book_edit.html:275 cps/templates/detail.html:156 #: cps/templates/search_form.html:14 msgid "Publisher" msgstr "Editore" -#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:30 +#: cps/templates/book_edit.html:101 cps/templates/detail.html:123 +#: cps/templates/user_edit.html:31 msgid "Language" msgstr "Lingua" -#: cps/templates/book_edit.html:113 cps/templates/search_form.html:137 +#: cps/templates/book_edit.html:111 cps/templates/search_form.html:137 msgid "Yes" -msgstr "Si" +msgstr "Sì" -#: cps/templates/book_edit.html:114 cps/templates/search_form.html:138 +#: cps/templates/book_edit.html:112 cps/templates/search_form.html:138 msgid "No" msgstr "No" -#: cps/templates/book_edit.html:160 -msgid "Upload format" +#: cps/templates/book_edit.html:158 +msgid "Upload Format" msgstr "Carica formato" -#: cps/templates/book_edit.html:169 -msgid "view book after edit" -msgstr "visualizzare il libro dopo la modifica" +#: cps/templates/book_edit.html:167 +msgid "View Book on Save" +msgstr "visualizza il libro dopo la modifica" -#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:208 -msgid "Get metadata" +#: cps/templates/book_edit.html:170 cps/templates/book_edit.html:206 +msgid "Fetch Metadata" msgstr "Ottieni metadati" -#: 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:170 cps/templates/shelf_edit.html:17 -#: cps/templates/user_edit.html:129 -msgid "Submit" -msgstr "Invia" +#: cps/templates/book_edit.html:171 cps/templates/config_edit.html:343 +#: cps/templates/config_view_edit.html:150 cps/templates/email_edit.html:38 +#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:135 +msgid "Save" +msgstr "Salva" -#: cps/templates/book_edit.html:187 +#: cps/templates/book_edit.html:185 msgid "Are you really sure?" msgstr "Sei davvero sicuro?" -#: cps/templates/book_edit.html:190 -msgid "Book will be deleted from Calibre database" +#: cps/templates/book_edit.html:188 +msgid "This book will be permanently erased from database" msgstr "Il libro verrà cancellato dal database di Calibre" -#: cps/templates/book_edit.html:191 -msgid "and from hard disk" +#: cps/templates/book_edit.html:189 +msgid "and hard disk" msgstr "e dal disco rigido" -#: cps/templates/book_edit.html:211 +#: cps/templates/book_edit.html:209 msgid "Keyword" msgstr "Parola chiave" -#: cps/templates/book_edit.html:212 +#: cps/templates/book_edit.html:210 msgid " Search keyword " -msgstr "Cerca parola chiave" - -#: cps/templates/book_edit.html:214 cps/templates/layout.html:47 -msgid "Go!" -msgstr "Vai!" +msgstr " ricerca parola chiave " -#: cps/templates/book_edit.html:218 +#: cps/templates/book_edit.html:216 msgid "Click the cover to load metadata to the form" msgstr "Fai clic sulla copertina per caricare i metadati presenti nel modulo" -#: cps/templates/book_edit.html:230 cps/templates/book_edit.html:270 +#: cps/templates/book_edit.html:231 cps/templates/book_edit.html:271 msgid "Loading..." msgstr "Caricamento in corso..." -#: cps/templates/book_edit.html:235 cps/templates/layout.html:192 -#: cps/templates/layout.html:224 +#: cps/templates/book_edit.html:236 cps/templates/layout.html:191 +#: cps/templates/layout.html:223 cps/templates/modal_restriction.html:34 +#: cps/templates/user_edit.html:164 msgid "Close" msgstr "Chiudi" -#: cps/templates/book_edit.html:262 cps/templates/book_edit.html:276 +#: cps/templates/book_edit.html:263 cps/templates/book_edit.html:277 msgid "Source" msgstr "Fonte" -#: cps/templates/book_edit.html:271 +#: cps/templates/book_edit.html:272 msgid "Search error!" msgstr "Errore di ricerca!" -#: cps/templates/book_edit.html:272 -msgid "No Result(s) found! Please try aonther keyword." +#: cps/templates/book_edit.html:273 +msgid "No Result(s) found! Please try another keyword." msgstr "Nessun risultato! Prova con un altro criterio di ricerca." #: cps/templates/config_edit.html:12 @@ -1296,12 +1331,12 @@ msgid "Library Configuration" msgstr "Configurazione della libreria" #: cps/templates/config_edit.html:19 -msgid "Location of Calibre database" +msgid "Location of Calibre Database" msgstr "Posizione del database di Calibre" #: cps/templates/config_edit.html:25 msgid "Use Google Drive?" -msgstr "Usa Google Drive?" +msgstr "Utilizzo Google Drive?" #: cps/templates/config_edit.html:31 msgid "Google Drive config problem" @@ -1341,14 +1376,14 @@ msgstr "Porta del server" #: cps/templates/config_edit.html:91 msgid "SSL certfile location (leave it empty for non-SSL Servers)" -msgstr "Percorso del certfile SSL (lascia vuoto per una configurazione del server senza SSL)" +msgstr "Percorso del Certfile SSL (lascia vuoto per una configurazione del server senza SSL)" #: cps/templates/config_edit.html:95 msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "Percorso del Keyfile SSL (lascia vuoto per una configurazione del server senza SSL)" #: cps/templates/config_edit.html:99 -msgid "Update channel" +msgid "Update Channel" msgstr "Canale d'aggiornamento" #: cps/templates/config_edit.html:101 @@ -1371,277 +1406,289 @@ msgstr "Nightly (automatico)" msgid "Logfile Configuration" msgstr "Configurazione del Logfile" -#: cps/templates/config_edit.html:122 -msgid "Log Level" -msgstr "Livello di Log" - #: cps/templates/config_edit.html:131 msgid "Location and name of logfile (calibre-web.log for no entry)" -msgstr "Percorso e nome del logfile (senza indicazioni sarà calibre-web.log)" +msgstr "Percorso e nome del Logfile (senza indicazioni sarà calibre-web.log)" #: cps/templates/config_edit.html:136 msgid "Enable Access Log" -msgstr "" +msgstr "Abilita l'Access Log" #: cps/templates/config_edit.html:139 msgid "Location and name of access logfile (access.log for no entry)" -msgstr "" +msgstr "Percorso e nome del Logfile di accesso (senza indicazioni sarà access.log)" #: cps/templates/config_edit.html:150 msgid "Feature Configuration" -msgstr "Configurazione della caratteristica" +msgstr "Ulteriori opzioni" #: cps/templates/config_edit.html:158 -msgid "Enable uploading" +msgid "Enable Uploads" msgstr "Abilita il caricamento" #: cps/templates/config_edit.html:162 -msgid "Enable anonymous browsing" +msgid "Enable Anonymous Browsing" msgstr "Abilita la navigazione anonima" #: cps/templates/config_edit.html:166 -msgid "Enable public registration" +msgid "Enable Public Registration" msgstr "Abilita la registrazione pubblica" #: cps/templates/config_edit.html:170 -msgid "Enable remote login (\"magic link\")" -msgstr "Attiva login remoto (\"magic link\")" +msgid "Enable Magic Link Remote Login" +msgstr "Attiva login remoto Magic Link" #: cps/templates/config_edit.html:175 +msgid "Enable Kobo sync" +msgstr "Abilita la sincronia per Kobo" + +#: cps/templates/config_edit.html:180 +msgid "Proxy unknown requests to Kobo Store" +msgstr "Richieste proxy sconosciute allo store di Kobo" + +#: cps/templates/config_edit.html:187 msgid "Use Goodreads" -msgstr "" +msgstr "Utilizza Goodreads" -#: cps/templates/config_edit.html:176 -msgid "Obtain an API Key" -msgstr "Ottenere una chiave API" +#: cps/templates/config_edit.html:188 +msgid "Create an API Key" +msgstr "Otteni una chiave API" -#: cps/templates/config_edit.html:180 +#: cps/templates/config_edit.html:192 msgid "Goodreads API Key" msgstr "API di Goodreads" -#: cps/templates/config_edit.html:184 +#: cps/templates/config_edit.html:196 msgid "Goodreads API Secret" msgstr "Goodreads API Secret" -#: cps/templates/config_edit.html:191 +#: cps/templates/config_edit.html:203 msgid "Login type" -msgstr "" +msgstr "Tipo di login" -#: cps/templates/config_edit.html:193 -msgid "Use standard Authentication" -msgstr "" +#: cps/templates/config_edit.html:205 +msgid "Use Standard Authentication" +msgstr "Utilizza l'autenticazione standard" -#: cps/templates/config_edit.html:195 +#: cps/templates/config_edit.html:207 msgid "Use LDAP Authentication" -msgstr "" +msgstr "Utilizza l'autenticazione LDAP" -#: cps/templates/config_edit.html:198 +#: cps/templates/config_edit.html:210 msgid "Use OAuth" -msgstr "" +msgstr "Utilizza OAuth" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:217 msgid "LDAP Server Host Name or IP Address" -msgstr "" +msgstr "Nome o indirizzo IP del server LDAP" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:221 msgid "LDAP Server Port" -msgstr "" +msgstr "Porta del server LDAP" -#: cps/templates/config_edit.html:213 -msgid "LDAP schema (ldap or ldaps)" -msgstr "" +#: cps/templates/config_edit.html:225 +msgid "LDAP Schema (LDAP or LPAPS)" +msgstr "Schema LDAP (ldap o ldaps)" -#: cps/templates/config_edit.html:217 -msgid "LDAP Admin username" -msgstr "" +#: cps/templates/config_edit.html:229 +msgid "LDAP Administrator Username" +msgstr "Nome di utente dell'amministratore LDAP" -#: cps/templates/config_edit.html:221 -msgid "LDAP Admin password" -msgstr "" +#: cps/templates/config_edit.html:233 +msgid "LDAP Administrator Password" +msgstr "Password dell'amministratore LDAP" -#: cps/templates/config_edit.html:226 -msgid "LDAP Server use SSL" -msgstr "" +#: cps/templates/config_edit.html:238 +msgid "LDAP Server Enable SSL" +msgstr "Il server LDAP utilizza SSL" -#: cps/templates/config_edit.html:230 -msgid "LDAP Server use TLS" -msgstr "" +#: cps/templates/config_edit.html:242 +msgid "LDAP Server Enable TLS" +msgstr "Il server LDAP utilizza TLS" -#: cps/templates/config_edit.html:234 +#: cps/templates/config_edit.html:246 msgid "LDAP Server Certificate" -msgstr "" +msgstr "Certificato del server LDAP" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:250 msgid "LDAP SSL Certificate Path" -msgstr "" +msgstr "Percorso del certificato SSL del server LDAP" -#: cps/templates/config_edit.html:243 +#: cps/templates/config_edit.html:255 msgid "LDAP Distinguished Name (DN)" -msgstr "" +msgstr "LDAP Distinguished Name (DN)" -#: cps/templates/config_edit.html:247 -msgid "LDAP User object filter" -msgstr "" +#: cps/templates/config_edit.html:259 +msgid "LDAP User Object Filter" +msgstr "LDAP User object filter" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:264 msgid "LDAP Server is OpenLDAP?" -msgstr "" +msgstr "Il server LDAP è un server OpenLDAP?" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:272 #, python-format msgid "Obtain %(provider)s OAuth Credential" -msgstr "" +msgstr "Ottieni le credenziali OAuth di %(provider)s" -#: cps/templates/config_edit.html:263 +#: cps/templates/config_edit.html:275 #, python-format msgid "%(provider)s OAuth Client Id" -msgstr "" +msgstr "%(provider)s OAuth Client Id" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:279 #, python-format msgid "%(provider)s OAuth Client Secret" -msgstr "" +msgstr "%(provider)s OAuth Client Secret" -#: cps/templates/config_edit.html:276 +#: cps/templates/config_edit.html:288 msgid "Allow Reverse Proxy Authentication" -msgstr "" +msgstr "Permetti l'autenticazione Reverse Proxy" -#: cps/templates/config_edit.html:280 +#: cps/templates/config_edit.html:292 msgid "Reverse Proxy Header Name" -msgstr "" +msgstr "Nome dell'intestazione Reverse Proxy" -#: cps/templates/config_edit.html:292 +#: cps/templates/config_edit.html:304 msgid "External binaries" msgstr "Files binari esterni" -#: cps/templates/config_edit.html:300 -msgid "No converter" +#: cps/templates/config_edit.html:312 +msgid "No Converter" msgstr "Nessun convertitore" -#: cps/templates/config_edit.html:302 +#: cps/templates/config_edit.html:314 msgid "Use Kindlegen" msgstr "Utilizza Kindlegen" -#: cps/templates/config_edit.html:304 +#: cps/templates/config_edit.html:316 msgid "Use calibre's ebook converter" msgstr "Utilizza il convertitore di Calibre" -#: cps/templates/config_edit.html:308 +#: cps/templates/config_edit.html:320 msgid "E-Book converter settings" -msgstr "Configurazione del convertitore di e-book" +msgstr "Configurazione del convertitore di libri" -#: cps/templates/config_edit.html:312 +#: cps/templates/config_edit.html:324 msgid "Path to convertertool" msgstr "Percorso del convertitore" -#: cps/templates/config_edit.html:318 +#: cps/templates/config_edit.html:330 msgid "Location of Unrar binary" msgstr "Percorso di UnRar" -#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 -#: cps/templates/login.html:4 +#: cps/templates/config_edit.html:349 cps/templates/layout.html:84 +#: cps/templates/login.html:4 cps/templates/login.html:20 msgid "Login" msgstr "Accesso" -#: cps/templates/config_view_edit.html:12 +#: cps/templates/config_view_edit.html:16 msgid "View Configuration" -msgstr "Visualizza configurazione" +msgstr "Configurazione aspetto biblioteca" -#: cps/templates/config_view_edit.html:19 cps/templates/shelf_edit.html:7 +#: cps/templates/config_view_edit.html:23 cps/templates/shelf_edit.html:7 msgid "Title" msgstr "Titolo" -#: cps/templates/config_view_edit.html:27 -msgid "No. of random books to show" +#: cps/templates/config_view_edit.html:31 +msgid "No. of Random Books to Display" msgstr "Numero di libri casuali da mostrare" -#: cps/templates/config_view_edit.html:31 -msgid "No. of authors to show before hiding (0=disable hiding)" +#: cps/templates/config_view_edit.html:35 +msgid "No. of Authors to Display Before Hiding (0=Disable Hiding)" msgstr "Numero di autori da mostrare prima di nascondere (0=disabilita mascheramento)" -#: cps/templates/config_view_edit.html:35 cps/templates/readcbr.html:112 +#: cps/templates/config_view_edit.html:39 cps/templates/readcbr.html:112 msgid "Theme" msgstr "Tema" -#: cps/templates/config_view_edit.html:37 +#: cps/templates/config_view_edit.html:41 msgid "Standard Theme" msgstr "Tema standard" -#: cps/templates/config_view_edit.html:38 +#: cps/templates/config_view_edit.html:42 msgid "caliBlur! Dark Theme" -msgstr "caliBlur! Dark Theme" +msgstr "Tema caliBlur! Dark" -#: cps/templates/config_view_edit.html:42 -msgid "Regular expression for ignoring columns" +#: cps/templates/config_view_edit.html:46 +msgid "Regular Expression for Ignoring Columns" msgstr "Espressione regolare per ignorare le colonne" -#: cps/templates/config_view_edit.html:46 -msgid "Link read/unread status to Calibre column" +#: cps/templates/config_view_edit.html:50 +msgid "Link Read/Unread Status to Calibre Column" msgstr "Collega lo stato letto/non letto nella colonna di Calibre" -#: cps/templates/config_view_edit.html:55 -msgid "Regular expression for title sorting" -msgstr "Espressione regolare per 'ordine di visualizzazione del titolo" - #: cps/templates/config_view_edit.html:59 -msgid "Tags for Mature Content" -msgstr "Tags per libri per adulti" +msgid "View Restrictions based on Calibre column" +msgstr "Visualizza le restrizioni basate sulla colonna di Calibre" + +#: cps/templates/config_view_edit.html:61 cps/templates/email_edit.html:21 +msgid "None" +msgstr "Nessuna" + +#: cps/templates/config_view_edit.html:68 +msgid "Regular Expression for Title Sorting" +msgstr "Espressione regolare per ordinare la visualizzazione del titolo" -#: cps/templates/config_view_edit.html:73 -msgid "Default settings for new users" +#: cps/templates/config_view_edit.html:80 +msgid "Default Settings for New Users" msgstr "Impostazioni predefinite per i nuovi utenti" -#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:82 -msgid "Admin user" +#: cps/templates/config_view_edit.html:88 cps/templates/user_edit.html:92 +msgid "Admin User" msgstr "Utente amministratore" -#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:91 +#: cps/templates/config_view_edit.html:92 cps/templates/user_edit.html:97 msgid "Allow Downloads" -msgstr "Consenti download" +msgstr "Permetti il download" -#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:95 -msgid "Allow book viewer" -msgstr "" +#: cps/templates/config_view_edit.html:96 cps/templates/user_edit.html:101 +msgid "Allow eBook Viewer" +msgstr "Permetti l'utilizzo del visualizzatore di libri" -#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:99 +#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:105 msgid "Allow Uploads" -msgstr "Consenti caricamenti" +msgstr "Permetti l'upload" -#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:103 +#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:109 msgid "Allow Edit" -msgstr "Consenti modifica" +msgstr "Permetti la modifica" -#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 -msgid "Allow Delete books" -msgstr "Consenti l'eliminazione di libri" +#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:113 +msgid "Allow Delete Books" +msgstr "Permetti l'eliminazione di libri" -#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:112 +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:118 msgid "Allow Changing Password" -msgstr "Consenti la modifica della password" +msgstr "Permetti la modifica della password" -#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:116 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:122 msgid "Allow Editing Public Shelfs" -msgstr "Consenti la modifica degli scaffali pubblici" +msgstr "Permetti la modifica degli scaffali pubblici" -#: cps/templates/config_view_edit.html:119 -msgid "Default visibilities for new users" +#: cps/templates/config_view_edit.html:126 +msgid "Default Visibilities for New Users" msgstr "Visibilità di base per i nuovi utenti" -#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:74 -msgid "Show random books in detail view" -msgstr "Mostra libri a caso nella vista dettagliata" +#: cps/templates/config_view_edit.html:142 +msgid "Show Random Books in Detail View" +msgstr "Mostra libri scelti aleatoriamente nella vista dettagliata" + +#: cps/templates/config_view_edit.html:144 +msgid "Add Allowed/Denied Tags" +msgstr "Aggiungi categorie permesse/negate" -#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:87 -msgid "Show mature content" -msgstr "Mostra sezione adulti" +#: cps/templates/config_view_edit.html:145 +msgid "Add Allowed/Denied custom column values" +msgstr "Aggiungi valori personali nelle colonne permessi/negati" #: cps/templates/detail.html:59 -msgid "Read in browser" -msgstr "Leggere nel browser" +msgid "Read in Browser" +msgstr "Leggi nel navigatore" #: cps/templates/detail.html:72 -msgid "Listen in browser" -msgstr "" +msgid "Listen in Browser" +msgstr "Ascolta nel navigatore" #: cps/templates/detail.html:117 msgid "Book" @@ -1651,9 +1698,9 @@ msgstr "Libro" msgid "of" msgstr "di" -#: cps/templates/detail.html:123 -msgid "language" -msgstr "lingua" +#: cps/templates/detail.html:165 +msgid "Published" +msgstr "Pubblicato" #: cps/templates/detail.html:200 msgid "Mark As Unread" @@ -1665,7 +1712,7 @@ msgstr "Marca come letto" #: cps/templates/detail.html:201 msgid "Read" -msgstr "Leggere" +msgstr "da leggere" #: cps/templates/detail.html:211 msgid "Description:" @@ -1676,48 +1723,28 @@ msgid "Add to shelf" msgstr "Aggiungi allo scaffale" #: cps/templates/detail.html:286 -msgid "Edit metadata" +msgid "Edit Metadata" msgstr "Modifica metadati" -#: cps/templates/email_edit.html:15 -msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" -msgstr "Porta SMTP (normalmente 25 senza condifica, 465 per codifica SSL e 587 per STARTTLS)" - -#: cps/templates/email_edit.html:19 -msgid "Encryption" -msgstr "Crittografia" - -#: cps/templates/email_edit.html:21 -msgid "None" -msgstr "Nessuna" - #: cps/templates/email_edit.html:22 msgid "STARTTLS" -msgstr "STATRTTLS" +msgstr "STARTTLS" #: cps/templates/email_edit.html:23 msgid "SSL/TLS" msgstr "SSL/TLS" #: cps/templates/email_edit.html:31 -msgid "SMTP password" +msgid "SMTP Password" msgstr "password SMTP" -#: cps/templates/email_edit.html:35 -msgid "From e-mail" -msgstr "Dall'email" - -#: cps/templates/email_edit.html:38 -msgid "Save settings" -msgstr "Salva le impostazioni" - #: cps/templates/email_edit.html:39 -msgid "Save settings and send Test E-Mail" -msgstr "Salvare le impostazioni e inviare e-mail di test" +msgid "Save and Send Test E-mail" +msgstr "Salva le impostazioni e invia e-mail di test" #: cps/templates/email_edit.html:43 -msgid "Allowed domains for registering" -msgstr "Dominii autorizzti alla registrazione" +msgid "Allowed Domains (Whitelist)" +msgstr "Dominii autorizzati alla registrazione (Whitelist)" #: cps/templates/email_edit.html:46 cps/templates/email_edit.html:72 msgid "Add Domain" @@ -1732,32 +1759,32 @@ msgid "Enter domainname" msgstr "Digita il nome di dominio" #: cps/templates/email_edit.html:60 -msgid "Denied domains for registering" -msgstr "" +msgid "Denied Domains (Blacklist)" +msgstr "Dominii bloccati per la registrazione (Blacklist)" #: cps/templates/email_edit.html:90 -msgid "Do you really want to delete this domain rule?" +msgid "Are you sure you want to delete this domain?" msgstr "Vuoi veramente eliminare questa regola di dominio?" -#: cps/templates/feed.xml:21 cps/templates/layout.html:176 +#: cps/templates/feed.xml:21 cps/templates/layout.html:175 msgid "Next" msgstr "Prossimo" -#: cps/templates/http_error.html:37 -msgid "Create issue" -msgstr "" +#: cps/templates/generate_kobo_auth_url.html:5 +msgid "Open the .kobo/Kobo eReader.conf file in a text editor and add (or edit):" +msgstr "Apri il file .kobo/Kobo eReader.conf in un editore di testi e aggiungi (o edita):" -#: cps/templates/http_error.html:44 -msgid "Back to home" -msgstr "Ritorno alla pagina principale" +#: cps/templates/http_error.html:38 +msgid "Create Issue" +msgstr "Crea-segnala un problema" -#: cps/templates/index.html:5 -msgid "Discover (Random Books)" -msgstr "Scoprire (libri casuali)" +#: cps/templates/http_error.html:45 +msgid "Return to Home" +msgstr "Ritorna alla pagina principale" #: cps/templates/index.html:64 msgid "Group by series" -msgstr "" +msgstr "Raggruppa per serie" #: cps/templates/index.xml:6 msgid "Start" @@ -1769,19 +1796,23 @@ msgstr "Pubblicazioni popolari di questo catalogo in base ai download." #: cps/templates/index.xml:28 msgid "Popular publications from this catalog based on Rating." -msgstr "Pubblicazioni popolari di questo catalogo basate sui voti." +msgstr "Pubblicazioni popolari di questo catalogo in base alle valutazioni." #: cps/templates/index.xml:31 msgid "Recently added Books" -msgstr "" +msgstr "Libri aggiunti di recente" #: cps/templates/index.xml:35 msgid "The latest Books" -msgstr "Gli ultimi Libri" +msgstr "Gli ultimi libri" + +#: cps/templates/index.xml:38 +msgid "Random Books" +msgstr "Libri presentati aleatoriamente" -#: cps/templates/index.xml:42 +#: cps/templates/index.xml:42 cps/templates/user_edit.html:80 msgid "Show Random Books" -msgstr "Mostra libri casuali" +msgstr "Mostra libri casualmente" #: cps/templates/index.xml:65 msgid "Books ordered by Author" @@ -1789,7 +1820,7 @@ msgstr "Libri ordinati per autore" #: cps/templates/index.xml:72 msgid "Books ordered by publisher" -msgstr "Libri ordinati per editori" +msgstr "Libri ordinati per editore" #: cps/templates/index.xml:79 msgid "Books ordered by category" @@ -1801,25 +1832,29 @@ msgstr "Libri ordinati per serie" #: cps/templates/index.xml:93 msgid "Books ordered by Languages" -msgstr "" +msgstr "Libri ordinati per lingua" #: cps/templates/index.xml:100 +msgid "Books ordered by Rating" +msgstr "Libri ordinati per valutazione" + +#: cps/templates/index.xml:108 msgid "Books ordered by file formats" -msgstr "" +msgstr "Libri ordinati per formato" -#: cps/templates/index.xml:103 cps/templates/layout.html:137 +#: cps/templates/index.xml:111 cps/templates/layout.html:136 msgid "Public Shelves" msgstr "Scaffali pubblici" -#: cps/templates/index.xml:107 +#: cps/templates/index.xml:115 msgid "Books organized in public shelfs, visible to everyone" msgstr "Libri organizzati in scaffali pubblici, visibili a tutti" -#: cps/templates/index.xml:111 cps/templates/layout.html:141 +#: cps/templates/index.xml:119 cps/templates/layout.html:140 msgid "Your Shelves" msgstr "I tuoi scaffali" -#: cps/templates/index.xml:115 +#: cps/templates/index.xml:123 msgid "User's own shelfs, only visible to the current user himself" msgstr "Scaffali dell'utente, visibili unicamente all'utente stesso" @@ -1827,10 +1862,19 @@ msgstr "Scaffali dell'utente, visibili unicamente all'utente stesso" msgid "Home" msgstr "Home" +#: cps/templates/layout.html:28 cps/templates/shelf_order.html:32 +#: cps/templates/user_edit.html:178 +msgid "Back" +msgstr "Indietro" + #: cps/templates/layout.html:34 -msgid "Toggle navigation" +msgid "Toggle Navigation" msgstr "Alterna navigazione" +#: cps/templates/layout.html:45 +msgid "Search Library" +msgstr "Ricerca nella libreria" + #: cps/templates/layout.html:55 msgid "Advanced Search" msgstr "Ricerca avanzata" @@ -1850,76 +1894,103 @@ msgstr "Logout" #: cps/templates/layout.html:85 cps/templates/register.html:14 msgid "Register" -msgstr "Registrare" +msgstr "Registra" -#: cps/templates/layout.html:116 cps/templates/layout.html:223 +#: cps/templates/layout.html:116 cps/templates/layout.html:222 msgid "Uploading..." -msgstr "Caricare" +msgstr "Uploading..." #: cps/templates/layout.html:117 -msgid "please don't refresh the page" -msgstr "per favore non aggiornare la pagina" +msgid "Please do not refresh the page" +msgstr "Per favore non ricaricare la pagina" #: cps/templates/layout.html:127 msgid "Browse" -msgstr "Navigare" +msgstr "Naviga" -#: cps/templates/layout.html:146 +#: cps/templates/layout.html:145 msgid "Create a Shelf" msgstr "Crea uno scaffale" -#: cps/templates/layout.html:147 cps/templates/stats.html:3 +#: cps/templates/layout.html:146 cps/templates/stats.html:3 msgid "About" msgstr "Informazioni su" -#: cps/templates/layout.html:161 +#: cps/templates/layout.html:160 msgid "Previous" msgstr "Precedente" -#: cps/templates/layout.html:188 +#: cps/templates/layout.html:187 msgid "Book Details" -msgstr "Dettagli ebook" +msgstr "Dettagli del libro" -#: cps/templates/layout.html:222 +#: cps/templates/layout.html:221 msgid "Upload done, processing, please wait..." msgstr "Caricamento riuscito, sto elaborando, per favore aspetta..." -#: cps/templates/layout.html:225 +#: cps/templates/layout.html:224 msgid "Error" msgstr "Errore" -#: cps/templates/login.html:8 cps/templates/login.html:9 -#: cps/templates/register.html:7 cps/templates/user_edit.html:8 -msgid "Username" -msgstr "Nome utente" - #: cps/templates/login.html:12 cps/templates/login.html:13 #: cps/templates/user_edit.html:21 msgid "Password" msgstr "Password" #: cps/templates/login.html:17 -msgid "Remember me" +msgid "Remember Me" msgstr "Ricordami" #: cps/templates/login.html:22 -msgid "Forgot password" -msgstr "" +msgid "Forgot Password?" +msgstr "Password dimenticata?" #: cps/templates/login.html:25 -msgid "Log in with magic link" -msgstr "Accedi con magic link" +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:6 +msgid "Show Calibre-Web Log: " +msgstr "Mostra il log di Calibre-Web: " #: cps/templates/logviewer.html:8 -msgid "Show access log" -msgstr "" +msgid "Calibre-Web Log: " +msgstr "Calibre-Web log: " + +#: cps/templates/logviewer.html:8 +msgid "Stream output, can't be displayed" +msgstr "Flusso attivo, non può essere visualizzato" + +#: cps/templates/logviewer.html:12 +msgid "Show Access Log: " +msgstr "Mostra il log di accesso: " + +#: cps/templates/modal_restriction.html:6 +msgid "Select allowed/denied Tags" +msgstr "Seleziona le categorie consentite/negate" + +#: cps/templates/modal_restriction.html:7 +msgid "Select allowed/denied Custom Column values" +msgstr "Seleziona i valori personali per le colonne consentiti/negati" + +#: cps/templates/modal_restriction.html:8 +msgid "Select allowed/denied Tags of user" +msgstr "Seleziona le categorie consentite/negate per l'utente" + +#: cps/templates/modal_restriction.html:9 +msgid "Select allowed/denied Custom Column values of user" +msgstr "Seleziona i valori personali per le colonne consentiti/negati per l'utente" + +#: cps/templates/modal_restriction.html:15 +msgid "Enter Tag" +msgstr "Digita categorie" + +#: cps/templates/modal_restriction.html:24 +msgid "Add View Restriction" +msgstr "Aggiungi restrizioni di visualizzazione" #: cps/templates/osd.xml:5 -msgid "Calibre-Web ebook catalog" +msgid "Calibre-Web eBook Catalog" msgstr "Catalogo Calibre-Web" #: cps/templates/read.html:74 @@ -1988,7 +2059,7 @@ msgstr "Larghezza" #: cps/templates/readcbr.html:126 msgid "Height" -msgstr "Alteszza" +msgstr "Altezza" #: cps/templates/readcbr.html:127 msgid "Native" @@ -2012,75 +2083,75 @@ msgstr "Verticale" #: cps/templates/readcbr.html:152 msgid "Direction" -msgstr "" +msgstr "Orientamento" #: cps/templates/readcbr.html:155 msgid "Left to Right" -msgstr "" +msgstr "Da sinistra a destra" #: cps/templates/readcbr.html:156 msgid "Right to Left" -msgstr "" +msgstr "Da destra a sinistra" #: cps/templates/readpdf.html:29 msgid "PDF reader" -msgstr "" +msgstr "Lettore PDF" #: cps/templates/readtxt.html:6 msgid "Basic txt Reader" -msgstr "Lettore di base txt" +msgstr "Semplice lettore di file di testo (txt)" #: cps/templates/register.html:4 -msgid "Register a new account" +msgid "Register New Account" msgstr "Registra un nuovo account" #: cps/templates/register.html:8 msgid "Choose a username" msgstr "Scegli un nome utente" -#: cps/templates/register.html:11 cps/templates/user_edit.html:13 -msgid "E-mail address" -msgstr "Indirizzo e-mail" - #: cps/templates/register.html:12 msgid "Your email address" msgstr "Il tuo indirizzo e-mail" +#: cps/templates/remote_login.html:4 +msgid "Magic Link - Authorise New Device" +msgstr "Magic Link - Autorizza un nuovo apparecchio" + #: cps/templates/remote_login.html:6 -msgid "Use your other device, login and visit " -msgstr "" +msgid "On another device, login and visit:" +msgstr "Utilizza il tuo altro apparecchio, accedi e visita" -#: cps/templates/remote_login.html:9 -msgid "Once you do so, you will automatically get logged in on this device." -msgstr "Una volta fatto questo, verrai automaticamente connesso con questo dispositivo." +#: cps/templates/remote_login.html:10 +msgid "Once verified, you will automatically be logged in on this device." +msgstr "Una volta completato, verrai automaticamente connesso con questo dispositivo." -#: cps/templates/remote_login.html:12 -msgid "The link will expire after 10 minutes." -msgstr "" +#: cps/templates/remote_login.html:13 +msgid "This verification link will expire in 10 minutes." +msgstr "Il link scadrà tra 10 minuti." #: cps/templates/search.html:5 -msgid "No Results for:" -msgstr "Nessun risultato per:" +msgid "No Results Found" +msgstr "Nessun risultato" #: cps/templates/search.html:6 -msgid "Please try a different search" -msgstr "Prova una ricerca diversa" +msgid "Search Term:" +msgstr "Termine di ricerca:" #: cps/templates/search.html:8 msgid "Results for:" -msgstr "Risultati per:" +msgstr "risultati per:" #: cps/templates/search_form.html:19 -msgid "Publishing date from" +msgid "Published Date From" msgstr "Data di pubblicazione da" #: cps/templates/search_form.html:26 -msgid "Publishing date to" +msgid "Published Date To" msgstr "Data di pubblicazione fino a" #: cps/templates/search_form.html:43 msgid "Exclude Tags" -msgstr "Elimina i tag" +msgstr "Escludi categorie" #: cps/templates/search_form.html:63 msgid "Exclude Series" @@ -2088,27 +2159,27 @@ msgstr "Escludi serie" #: cps/templates/search_form.html:84 msgid "Exclude Languages" -msgstr "Elimina lingue" +msgstr "Escludi lingue" #: cps/templates/search_form.html:95 msgid "Extensions" -msgstr "" +msgstr "Estensioni" #: cps/templates/search_form.html:105 msgid "Exclude Extensions" -msgstr "" +msgstr "Escludi estensioni" #: cps/templates/search_form.html:117 -msgid "Rating bigger than" +msgid "Rating Above" msgstr "Valutazione superiore a" #: cps/templates/search_form.html:121 -msgid "Rating less than" +msgid "Rating Below" msgstr "Valutazione inferiore a" #: cps/templates/shelf.html:10 msgid "Delete this Shelf" -msgstr "Cancellare questo scaffale" +msgstr "Cancella questo scaffale" #: cps/templates/shelf.html:11 msgid "Edit Shelf" @@ -2119,24 +2190,24 @@ msgid "Change order" msgstr "Cambia ordine" #: cps/templates/shelf.html:67 -msgid "Do you really want to delete the shelf?" +msgid "Are you sure you want to delete this shelf?" msgstr "Vuoi davvero eliminare lo scaffale?" #: cps/templates/shelf.html:70 -msgid "Shelf will be lost for everybody and forever!" +msgid "Shelf will be deleted for all users" msgstr "Lo scaffale sarà perso per tutti e per sempre!" #: cps/templates/shelf_edit.html:13 -msgid "should the shelf be public?" -msgstr "questo scaffale deve essere pubblico?" +msgid "Share with Everyone" +msgstr "Condividi con tutti" #: cps/templates/shelf_order.html:5 -msgid "Drag 'n drop to rearrange order" -msgstr "Riordina tramite drag and drop" +msgid "Drag to Rearrange Order" +msgstr "Trascina per riordinare" #: cps/templates/stats.html:7 -msgid "Calibre library statistics" -msgstr "Statistiche libreria Calibre" +msgid "Library Statistics" +msgstr "Statistiche della libreria" #: cps/templates/stats.html:12 msgid "Books in this Library" @@ -2155,28 +2226,24 @@ msgid "Series in this Library" msgstr "Serie in questa libreria" #: cps/templates/stats.html:28 -msgid "Linked libraries" +msgid "Linked Libraries" msgstr "Librerie collegate" #: cps/templates/stats.html:32 -msgid "Program library" +msgid "Program Library" msgstr "Programma libreria" #: cps/templates/stats.html:33 msgid "Installed Version" msgstr "Versione installata" -#: cps/templates/tasks.html:7 -msgid "Tasks list" -msgstr "Lista delle operazioni" - #: cps/templates/tasks.html:12 msgid "User" msgstr "Utente" #: cps/templates/tasks.html:14 msgid "Task" -msgstr "Operazioni" +msgstr "Operazione" #: cps/templates/tasks.html:15 msgid "Status" @@ -2187,11 +2254,11 @@ msgid "Progress" msgstr "Avanzamento" #: cps/templates/tasks.html:17 -msgid "Runtime" +msgid "Run Time" msgstr "Tempo d'esecuzione" #: cps/templates/tasks.html:18 -msgid "Starttime" +msgid "Start Time" msgstr "Ora d'inizio" #: cps/templates/tasks.html:24 @@ -2206,1454 +2273,61 @@ msgstr "Nascondi tutte le operazioni" msgid "Reset user Password" msgstr "Resetta la password dell'utente" -#: cps/templates/user_edit.html:26 -msgid "Kindle E-Mail" -msgstr "E-mail di Kindle" - -#: cps/templates/user_edit.html:39 -msgid "Show books with language" -msgstr "Mostra libri per lingua" - #: cps/templates/user_edit.html:41 -msgid "Show all" -msgstr "Mostra tutto" +msgid "Language of Books" +msgstr "Mostra libri in" -#: cps/templates/user_edit.html:51 +#: cps/templates/user_edit.html:43 +msgid "Show All" +msgstr "tutte le lingue presenti" + +#: cps/templates/user_edit.html:52 msgid "OAuth Settings" -msgstr "" +msgstr "Configurazione OAuth" -#: cps/templates/user_edit.html:53 +#: cps/templates/user_edit.html:54 msgid "Link" -msgstr "" +msgstr "Collega" -#: cps/templates/user_edit.html:55 +#: cps/templates/user_edit.html:56 msgid "Unlink" -msgstr "" - -#: cps/templates/user_edit.html:123 -msgid "Delete this user" -msgstr "Elimina questo utente" - -#: cps/templates/user_edit.html:138 -msgid "Recent Downloads" -msgstr "Download Recenti" - -#~ msgid "Afar" -#~ msgstr "Afar" - -#~ msgid "Abkhazian" -#~ msgstr "Abkhazian" - -#~ msgid "Achinese" -#~ msgstr "Achinese" - -#~ msgid "Acoli" -#~ msgstr "Acoli" - -#~ msgid "Adangme" -#~ msgstr "Adangme" - -#~ msgid "Adyghe" -#~ msgstr "Adyghe" - -#~ msgid "Afrihili" -#~ msgstr "Afrihili" - -#~ msgid "Afrikaans" -#~ msgstr "Afrikaans" - -#~ msgid "Ainu (Japan)" -#~ msgstr "Ainu (Giappone)" - -#~ msgid "Akan" -#~ msgstr "Akan" - -#~ msgid "Akkadian" -#~ msgstr "Accadico" - -#~ msgid "Aleut" -#~ msgstr "Aleut" - -#~ msgid "Altai; Southern" -#~ msgstr "Altai meridionale" - -#~ msgid "Amharic" -#~ msgstr "Amarico" +msgstr "Scollega" -#~ msgid "English; Old (ca. 450-1100)" -#~ msgstr "Inglese antico (ca. 450-1100)" +#: cps/templates/user_edit.html:62 +msgid "Kobo Sync Token" +msgstr "Token Kobo Sync" -#~ msgid "Angika" -#~ msgstr "Angika" +#: cps/templates/user_edit.html:64 +msgid "Create/View" +msgstr "Crea/Visualizza" -#~ msgid "Arabic" -#~ msgstr "Arabo" +#: cps/templates/user_edit.html:83 +msgid "Add allowed/denied Tags" +msgstr "Aggiungi categorie permesse/negate" -#~ msgid "Aramaic; Official (700-300 BCE)" -#~ msgstr "Aramaico ufficiale (700-300 p.e.v.)" +#: cps/templates/user_edit.html:84 +msgid "Add allowed/denied custom column values" +msgstr "Aggiungi valori personali nelle colonne permessi/negati" -#~ msgid "Aragonese" -#~ msgstr "Aragonese" - -#~ msgid "Mapudungun" -#~ msgstr "Mapudungun" - -#~ msgid "Arapaho" -#~ msgstr "Arapaho" - -#~ msgid "Arawak" -#~ msgstr "Arawak" - -#~ msgid "Assamese" -#~ msgstr "Assamese" - -#~ msgid "Asturian" -#~ msgstr "Asturiano" - -#~ msgid "Avaric" -#~ msgstr "Avarico" - -#~ msgid "Avestan" -#~ msgstr "Avestano" - -#~ msgid "Awadhi" -#~ msgstr "Awadhi" - -#~ msgid "Aymara" -#~ msgstr "Aymara" - -#~ msgid "Azerbaijani" -#~ msgstr "Azerbaijano" - -#~ msgid "Bashkir" -#~ msgstr "Bashkir" - -#~ msgid "Baluchi" -#~ msgstr "Baluchi" - -#~ msgid "Bambara" -#~ msgstr "Bambara" - -#~ msgid "Balinese" -#~ msgstr "Balinese" - -#~ msgid "Basa (Cameroon)" -#~ msgstr "Basa (Cameru)" - -#~ msgid "Beja" -#~ msgstr "Beja" - -#~ msgid "Belarusian" -#~ msgstr "Bielorusso" - -#~ msgid "Bemba (Zambia)" -#~ msgstr "Bemba (Zambia)" - -#~ msgid "Bengali" -#~ msgstr "Bengalese" - -#~ msgid "Bhojpuri" -#~ msgstr "Bhojpuri" - -#~ msgid "Bikol" -#~ msgstr "bicol" - -#~ msgid "Bini" -#~ msgstr "Bini" - -#~ msgid "Bislama" -#~ msgstr "bislama" - -#~ msgid "Siksika" -#~ msgstr "Siksika" - -#~ msgid "Tibetan" -#~ msgstr "Tibetano" - -#~ msgid "Bosnian" -#~ msgstr "Bosniaco" - -#~ msgid "Braj" -#~ msgstr "braj" - -#~ msgid "Breton" -#~ msgstr "Bretone" - -#~ msgid "Buriat" -#~ msgstr "Buriat" - -#~ msgid "Buginese" -#~ msgstr "Buginese" +#: cps/templates/user_edit.html:129 +msgid "Delete User" +msgstr "Elimina questo utente" -#~ msgid "Bulgarian" -#~ msgstr "Bulgaro" - -#~ msgid "Bilin" -#~ msgstr "Bilin" - -#~ msgid "Caddo" -#~ msgstr "caddo" - -#~ msgid "Carib; Galibi" -#~ msgstr "Carib (Galibi)" - -#~ msgid "Catalan" -#~ msgstr "Catalano" - -#~ msgid "Cebuano" -#~ msgstr "Cebuano" - -#~ msgid "Czech" -#~ msgstr "Ceco" - -#~ msgid "Chamorro" -#~ msgstr "Chamorro" - -#~ msgid "Chibcha" -#~ msgstr "Chibcha" - -#~ msgid "Chechen" -#~ msgstr "Chechen" - -#~ msgid "Chagatai" -#~ msgstr "Ciagataico" - -#~ msgid "Chuukese" -#~ msgstr "Chuukese" - -#~ msgid "Mari (Russia)" -#~ msgstr "Mari (Russia)" - -#~ msgid "Chinook jargon" -#~ msgstr "Chinook jargon" - -#~ msgid "Choctaw" -#~ msgstr "Choctaw" - -#~ msgid "Chipewyan" -#~ msgstr "Chipewyan" - -#~ msgid "Cherokee" -#~ msgstr "Cherokee" - -#~ msgid "Slavonic; Old" -#~ msgstr "Slavo antico" - -#~ msgid "Chuvash" -#~ msgstr "Chuvash" - -#~ msgid "Cheyenne" -#~ msgstr "Cheyenne" - -#~ msgid "Coptic" -#~ msgstr "Copto" - -#~ msgid "Cornish" -#~ msgstr "Cornish" - -#~ msgid "Corsican" -#~ msgstr "Corso" - -#~ msgid "Cree" -#~ msgstr "Cree" - -#~ msgid "Turkish; Crimean" -#~ msgstr "Turco; Crimeo" - -#~ msgid "Kashubian" -#~ msgstr "kashubian" - -#~ msgid "Welsh" -#~ msgstr "Gallese" - -#~ msgid "Dakota" -#~ msgstr "Dakota" - -#~ msgid "Danish" -#~ msgstr "Danese" - -#~ msgid "Dargwa" -#~ msgstr "Dargwa" - -#~ msgid "Delaware" -#~ msgstr "delaware" - -#~ msgid "Slave (Athapascan)" -#~ msgstr "Slave (Athapascan)" - -#~ msgid "German" -#~ msgstr "Tedesco" - -#~ msgid "Dogrib" -#~ msgstr "Dogrib" - -#~ msgid "Dinka" -#~ msgstr "Dinca" - -#~ msgid "Dhivehi" -#~ msgstr "Dhivehi" - -#~ msgid "Dogri (macrolanguage)" -#~ msgstr "Dogri (macrolingua)" - -#~ msgid "Sorbian; Lower" -#~ msgstr "Lusaziano inferiore" - -#~ msgid "Duala" -#~ msgstr "Duala" - -#~ msgid "Dutch; Middle (ca. 1050-1350)" -#~ msgstr "Olandese medio (ca. 1050-1350)" - -#~ msgid "Dyula" -#~ msgstr "Diula" - -#~ msgid "Dzongkha" -#~ msgstr "Dzongkha" - -#~ msgid "Efik" -#~ msgstr "Efik" - -#~ msgid "Egyptian (Ancient)" -#~ msgstr "Egiziano antico" - -#~ msgid "Ekajuk" -#~ msgstr "Ekajuk" - -#~ msgid "Greek; Modern (1453-)" -#~ msgstr "Greco moderno (1453-)" - -#~ msgid "Elamite" -#~ msgstr "Elamitico" - -#~ msgid "English" -#~ msgstr "Inglese" - -#~ msgid "English; Middle (1100-1500)" -#~ msgstr "Inglese medio (1100-1500)" - -#~ msgid "Esperanto" -#~ msgstr "Esperanto" - -#~ msgid "Estonian" -#~ msgstr "Estone" - -#~ msgid "Basque" -#~ msgstr "Basco" - -#~ msgid "Ewe" -#~ msgstr "Ewe" - -#~ msgid "Ewondo" -#~ msgstr "Ewondo" - -#~ msgid "Fang (Equatorial Guinea)" -#~ msgstr "Fang (Guinea equatoriale)" - -#~ msgid "Faroese" -#~ msgstr "Faroese" - -#~ msgid "Persian" -#~ msgstr "Persiano" - -#~ msgid "Fanti" -#~ msgstr "Fanti" - -#~ msgid "Fijian" -#~ msgstr "Figiano" - -#~ msgid "Filipino" -#~ msgstr "Filippino" - -#~ msgid "Finnish" -#~ msgstr "Finlandese" - -#~ msgid "Fon" -#~ msgstr "Fon" - -#~ msgid "French" -#~ msgstr "Francese" - -#~ msgid "French; Middle (ca. 1400-1600)" -#~ msgstr "Francese medio (ca. 1400-1600)" - -#~ msgid "French; Old (842-ca. 1400)" -#~ msgstr "Francese antico (842-ca. 1400)" - -#~ msgid "Frisian; Northern" -#~ msgstr "Frisone settentrionale" - -#~ msgid "Frisian; Eastern" -#~ msgstr "Frisone orientale" - -#~ msgid "Frisian; Western" -#~ msgstr "Frisone occidentale" - -#~ msgid "Fulah" -#~ msgstr "Fulah" - -#~ msgid "Friulian" -#~ msgstr "Friulano" - -#~ msgid "Ga" -#~ msgstr "ga" - -#~ msgid "Gayo" -#~ msgstr "gayo" - -#~ msgid "Gbaya (Central African Republic)" -#~ msgstr "Gbaya (Repubblica centro africana)" - -#~ msgid "Geez" -#~ msgstr "Geez" - -#~ msgid "Gilbertese" -#~ msgstr "Gilbertese" - -#~ msgid "Gaelic; Scottish" -#~ msgstr "Gaelico (Scozzese)" - -#~ msgid "Irish" -#~ msgstr "Gaelico" - -#~ msgid "Galician" -#~ msgstr "Galiziano" - -#~ msgid "Manx" -#~ msgstr "Manx" - -#~ msgid "German; Middle High (ca. 1050-1500)" -#~ msgstr "Tedesco medio alto (ca. 1050-1500)" - -#~ msgid "German; Old High (ca. 750-1050)" -#~ msgstr "Tedesco antico alto (ca. 750-1050)" - -#~ msgid "Gondi" -#~ msgstr "Gondi" - -#~ msgid "Gorontalo" -#~ msgstr "Gorontalo" - -#~ msgid "Gothic" -#~ msgstr "Gotico" - -#~ msgid "Grebo" -#~ msgstr "Grebo" - -#~ msgid "Greek; Ancient (to 1453)" -#~ msgstr "Greco antico (fino al 1453)" - -#~ msgid "Guarani" -#~ msgstr "Guarani" - -#~ msgid "German; Swiss" -#~ msgstr "Tedesco (Svizzera)" - -#~ msgid "Gujarati" -#~ msgstr "Gujarati" - -#~ msgid "Gwichʼin" -#~ msgstr "Gwichʼin" - -#~ msgid "Haida" -#~ msgstr "Haida" - -#~ msgid "Creole; Haitian" -#~ msgstr "Creolo (Haitiano)" - -#~ msgid "Hausa" -#~ msgstr "Hausa" - -#~ msgid "Hawaiian" -#~ msgstr "hawaiano" - -#~ msgid "Hebrew" -#~ msgstr "Ebraico" - -#~ msgid "Herero" -#~ msgstr "Herero" - -#~ msgid "Hiligaynon" -#~ msgstr "Hiligayna" - -#~ msgid "Hindi" -#~ msgstr "Hindi" - -#~ msgid "Hittite" -#~ msgstr "hittite" - -#~ msgid "Hmong" -#~ msgstr "Hmong" - -#~ msgid "Hiri Motu" -#~ msgstr "Hiri motu" - -#~ msgid "Croatian" -#~ msgstr "Croato" - -#~ msgid "Sorbian; Upper" -#~ msgstr "Lusaziano superiore" - -#~ msgid "Hungarian" -#~ msgstr "Ungherese" - -#~ msgid "Hupa" -#~ msgstr "Hupa" - -#~ msgid "Armenian" -#~ msgstr "armeno" - -#~ msgid "Iban" -#~ msgstr "Iban" - -#~ msgid "Igbo" -#~ msgstr "Igbo" - -#~ msgid "Ido" -#~ msgstr "Ido" - -#~ msgid "Yi; Sichuan" -#~ msgstr "Yi; Sichuan" - -#~ msgid "Inuktitut" -#~ msgstr "inuktitut" - -#~ msgid "Interlingue" -#~ msgstr "Interlingua" - -#~ msgid "Iloko" -#~ msgstr "Ilocano" - -#~ msgid "Interlingua (International Auxiliary Language Association)" -#~ msgstr "Interlingua (International Auxiliary Language Association)" - -#~ msgid "Indonesian" -#~ msgstr "Indonesiano" - -#~ msgid "Ingush" -#~ msgstr "Ingush" - -#~ msgid "Inupiaq" -#~ msgstr "Inupiaq" - -#~ msgid "Icelandic" -#~ msgstr "Islandese" - -#~ msgid "Italian" -#~ msgstr "Italiano" - -#~ msgid "Javanese" -#~ msgstr "Javanese" - -#~ msgid "Lojban" -#~ msgstr "lojban" - -#~ msgid "Japanese" -#~ msgstr "Giapponese" - -#~ msgid "Judeo-Persian" -#~ msgstr "Giudeo-persiano" - -#~ msgid "Judeo-Arabic" -#~ msgstr "Giudeo-arabo" - -#~ msgid "Kara-Kalpak" -#~ msgstr "Kara-Kalpak" - -#~ msgid "Kabyle" -#~ msgstr "Kabyle" - -#~ msgid "Kachin" -#~ msgstr "Kachin" - -#~ msgid "Kalaallisut" -#~ msgstr "Kalaallisut" - -#~ msgid "Kamba (Kenya)" -#~ msgstr "Kamba (Kenya)" - -#~ msgid "Kannada" -#~ msgstr "kannada" - -#~ msgid "Kashmiri" -#~ msgstr "kashmiri" - -#~ msgid "Georgian" -#~ msgstr "Georgiano" - -#~ msgid "Kanuri" -#~ msgstr "Kanuri" - -#~ msgid "Kawi" -#~ msgstr "Kawi" - -#~ msgid "Kazakh" -#~ msgstr "Kazako" - -#~ msgid "Kabardian" -#~ msgstr "Kabardia" - -#~ msgid "Khasi" -#~ msgstr "Khasi" - -#~ msgid "Khmer; Central" -#~ msgstr "Khmer centrale" - -#~ msgid "Khotanese" -#~ msgstr "Khotanese" - -#~ msgid "Kikuyu" -#~ msgstr "Kikuyu" - -#~ msgid "Kinyarwanda" -#~ msgstr "Kinyarwanda" - -#~ msgid "Kirghiz" -#~ msgstr "Kirghiso" - -#~ msgid "Kimbundu" -#~ msgstr "Kimbundu" - -#~ msgid "Konkani (macrolanguage)" -#~ msgstr "Konkani (macrolinguaggio)" - -#~ msgid "Komi" -#~ msgstr "Komi" - -#~ msgid "Kongo" -#~ msgstr "Kongo" - -#~ msgid "Korean" -#~ msgstr "Coreano" - -#~ msgid "Kosraean" -#~ msgstr "Kosraean" - -#~ msgid "Kpelle" -#~ msgstr "Kpelle" - -#~ msgid "Karachay-Balkar" -#~ msgstr "karachay-Balkar" - -#~ msgid "Karelian" -#~ msgstr "Karelian" - -#~ msgid "Kurukh" -#~ msgstr "Kurukh" - -#~ msgid "Kuanyama" -#~ msgstr "Kuanyama" - -#~ msgid "Kumyk" -#~ msgstr "kumyk" - -#~ msgid "Kurdish" -#~ msgstr "Curdo" - -#~ msgid "Kutenai" -#~ msgstr "kutenai" - -#~ msgid "Ladino" -#~ msgstr "Ladino" - -#~ msgid "Lahnda" -#~ msgstr "lahnda" - -#~ msgid "Lamba" -#~ msgstr "Lamba" - -#~ msgid "Lao" -#~ msgstr "Lao" - -#~ msgid "Latin" -#~ msgstr "Latino" - -#~ msgid "Latvian" -#~ msgstr "Lettone" - -#~ msgid "Lezghian" -#~ msgstr "Lezghian" - -#~ msgid "Limburgan" -#~ msgstr "Limburgan" - -#~ msgid "Lingala" -#~ msgstr "Lingala" - -#~ msgid "Lithuanian" -#~ msgstr "Lituano" - -#~ msgid "Mongo" -#~ msgstr "Mongo" - -#~ msgid "Lozi" -#~ msgstr "Lozi" - -#~ msgid "Luxembourgish" -#~ msgstr "Lussemburghese" - -#~ msgid "Luba-Lulua" -#~ msgstr "Luba-lulua" - -#~ msgid "Luba-Katanga" -#~ msgstr "Luba-katanga" - -#~ msgid "Ganda" -#~ msgstr "Ganda" - -#~ msgid "Luiseno" -#~ msgstr "Luiseno" - -#~ msgid "Lunda" -#~ msgstr "Lunda" - -#~ msgid "Luo (Kenya and Tanzania)" -#~ msgstr "Luo (Kenya e Tanzania)" - -#~ msgid "Lushai" -#~ msgstr "Lushai" - -#~ msgid "Madurese" -#~ msgstr "Madurese" - -#~ msgid "Magahi" -#~ msgstr "Magahi" - -#~ msgid "Marshallese" -#~ msgstr "Marshallese" - -#~ msgid "Maithili" -#~ msgstr "Maithili" - -#~ msgid "Makasar" -#~ msgstr "Makasar" - -#~ msgid "Malayalam" -#~ msgstr "Malayalam" - -#~ msgid "Mandingo" -#~ msgstr "Mandingo" - -#~ msgid "Marathi" -#~ msgstr "Marathi" - -#~ msgid "Masai" -#~ msgstr "Masai" - -#~ msgid "Moksha" -#~ msgstr "Moksha" - -#~ msgid "Mandar" -#~ msgstr "Mandar" - -#~ msgid "Mende (Sierra Leone)" -#~ msgstr "Mende (Sierra Leone)" - -#~ msgid "Irish; Middle (900-1200)" -#~ msgstr "Irlandese medio (900-1200)" - -#~ msgid "Mi'kmaq" -#~ msgstr "Mi'kmaq" - -#~ msgid "Minangkabau" -#~ msgstr "Minangkabau" - -#~ msgid "Uncoded languages" -#~ msgstr "Lingue non codificate" - -#~ msgid "Macedonian" -#~ msgstr "Macedone" - -#~ msgid "Malagasy" -#~ msgstr "malagasy" - -#~ msgid "Maltese" -#~ msgstr "Maltese" - -#~ msgid "Manchu" -#~ msgstr "Manchu" - -#~ msgid "Manipuri" -#~ msgstr "Manipuri" - -#~ msgid "Mohawk" -#~ msgstr "mohawk" - -#~ msgid "Mongolian" -#~ msgstr "Mongolo" - -#~ msgid "Mossi" -#~ msgstr "Mossi" - -#~ msgid "Maori" -#~ msgstr "Maori" - -#~ msgid "Malay (macrolanguage)" -#~ msgstr "Malay (macrolingua)" - -#~ msgid "Multiple languages" -#~ msgstr "Lingue multiple" - -#~ msgid "Creek" -#~ msgstr "Creek" - -#~ msgid "Mirandese" -#~ msgstr "Mirandese" - -#~ msgid "Marwari" -#~ msgstr "Marwari" - -#~ msgid "Burmese" -#~ msgstr "Burmese" - -#~ msgid "Erzya" -#~ msgstr "Erzya" - -#~ msgid "Neapolitan" -#~ msgstr "Napoletano" - -#~ msgid "Nauru" -#~ msgstr "Nauru" - -#~ msgid "Navajo" -#~ msgstr "Navajo" - -#~ msgid "Ndebele; South" -#~ msgstr "Ndebele del Sud" - -#~ msgid "Ndebele; North" -#~ msgstr "Ndebele del Nord" - -#~ msgid "Ndonga" -#~ msgstr "Ndonga" - -#~ msgid "German; Low" -#~ msgstr "Tedesco; Volgare" - -#~ msgid "Nepali" -#~ msgstr "Nepali" - -#~ msgid "Bhasa; Nepal" -#~ msgstr "Bhasa; Nepal" - -#~ msgid "Nias" -#~ msgstr "Nias" - -#~ msgid "Niuean" -#~ msgstr "Niuean" - -#~ msgid "Dutch" -#~ msgstr "Olandese" - -#~ msgid "Norwegian Nynorsk" -#~ msgstr "Norvegese nynorsk" - -#~ msgid "Norwegian Bokmål" -#~ msgstr "Norvegese bokmål" - -#~ msgid "Nogai" -#~ msgstr "Nogai" - -#~ msgid "Norse; Old" -#~ msgstr "Norse antico" - -#~ msgid "Norwegian" -#~ msgstr "Norvegese" - -#~ msgid "N'Ko" -#~ msgstr "N'Ko" - -#~ msgid "Sotho; Northern" -#~ msgstr "Sotho settentrionale" - -#~ msgid "Newari; Old" -#~ msgstr "Newari antico" - -#~ msgid "Nyanja" -#~ msgstr "Nyanja" - -#~ msgid "Nyamwezi" -#~ msgstr "Nyamwezi" - -#~ msgid "Nyankole" -#~ msgstr "Nyankole" - -#~ msgid "Nyoro" -#~ msgstr "Nyoro" - -#~ msgid "Nzima" -#~ msgstr "Nzima" - -#~ msgid "Occitan (post 1500)" -#~ msgstr "Occitan (post 1500)" - -#~ msgid "Ojibwa" -#~ msgstr "Ojibwa" - -#~ msgid "Oriya" -#~ msgstr "Oriya" - -#~ msgid "Oromo" -#~ msgstr "Oromo" - -#~ msgid "Osage" -#~ msgstr "Osage" - -#~ msgid "Ossetian" -#~ msgstr "Ossetian" - -#~ msgid "Turkish; Ottoman (1500-1928)" -#~ msgstr "Turco ottomano (1500-1928)" - -#~ msgid "Pangasinan" -#~ msgstr "Pangasinan" - -#~ msgid "Pahlavi" -#~ msgstr "Pahlavi" - -#~ msgid "Pampanga" -#~ msgstr "pampanga" - -#~ msgid "Panjabi" -#~ msgstr "Panjabi" - -#~ msgid "Papiamento" -#~ msgstr "Papiamento" - -#~ msgid "Palauan" -#~ msgstr "Palauan" - -#~ msgid "Persian; Old (ca. 600-400 B.C.)" -#~ msgstr "Persiano antico (ca. 600-400 A.C.)" - -#~ msgid "Phoenician" -#~ msgstr "Fenicio" - -#~ msgid "Pali" -#~ msgstr "Pali" - -#~ msgid "Polish" -#~ msgstr "Polacco" - -#~ msgid "Pohnpeian" -#~ msgstr "Pohnpeian" - -#~ msgid "Portuguese" -#~ msgstr "Portoghese" - -#~ msgid "Provençal; Old (to 1500)" -#~ msgstr "Provençal antico (fino al 1500)" - -#~ msgid "Pushto" -#~ msgstr "Pushto" - -#~ msgid "Quechua" -#~ msgstr "Quechua" - -#~ msgid "Rajasthani" -#~ msgstr "rajasthani" - -#~ msgid "Rapanui" -#~ msgstr "Rapanui" - -#~ msgid "Maori; Cook Islands" -#~ msgstr "Maori (Isole Cook)" - -#~ msgid "Romansh" -#~ msgstr "Romansh" - -#~ msgid "Romany" -#~ msgstr "Romany" - -#~ msgid "Romanian" -#~ msgstr "Rumeno" - -#~ msgid "Rundi" -#~ msgstr "Rundi" - -#~ msgid "Romanian; Macedo-" -#~ msgstr "Rumeno macedone" - -#~ msgid "Russian" -#~ msgstr "Russo" - -#~ msgid "Sandawe" -#~ msgstr "Sandawe" - -#~ msgid "Sango" -#~ msgstr "Sango" - -#~ msgid "Yakut" -#~ msgstr "Yakut" - -#~ msgid "Aramaic; Samaritan" -#~ msgstr "Aramaico samaritano" - -#~ msgid "Sanskrit" -#~ msgstr "Sanscrito" - -#~ msgid "Sasak" -#~ msgstr "Sasak" - -#~ msgid "Santali" -#~ msgstr "Santali" - -#~ msgid "Sicilian" -#~ msgstr "Siciliano" - -#~ msgid "Scots" -#~ msgstr "Scots" - -#~ msgid "Selkup" -#~ msgstr "Selkup" - -#~ msgid "Irish; Old (to 900)" -#~ msgstr "Irlandese antico (fino al ’900)" - -#~ msgid "Shan" -#~ msgstr "Shan" - -#~ msgid "Sidamo" -#~ msgstr "Sidamo" - -#~ msgid "Sinhala" -#~ msgstr "Sinhala" - -#~ msgid "Slovak" -#~ msgstr "Slovacco" - -#~ msgid "Slovenian" -#~ msgstr "Sloveno" - -#~ msgid "Sami; Southern" -#~ msgstr "Sami meridionale" - -#~ msgid "Sami; Northern" -#~ msgstr "Sami settentrionale" - -#~ msgid "Lule Sami" -#~ msgstr "sami lule" - -#~ msgid "Sami; Inari" -#~ msgstr "Sami; Inari" - -#~ msgid "Samoan" -#~ msgstr "Samoano" - -#~ msgid "Sami; Skolt" -#~ msgstr "Sami; Skolt" - -#~ msgid "Shona" -#~ msgstr "Shona" - -#~ msgid "Sindhi" -#~ msgstr "Sindhi" - -#~ msgid "Soninke" -#~ msgstr "Soninke" - -#~ msgid "Sogdian" -#~ msgstr "Sogdian" - -#~ msgid "Somali" -#~ msgstr "Somali" - -#~ msgid "Sotho; Southern" -#~ msgstr "Sotho meridionale" - -#~ msgid "Spanish" -#~ msgstr "Spagnolo" - -#~ msgid "Albanian" -#~ msgstr "Albanese" - -#~ msgid "Sardinian" -#~ msgstr "Sardo" - -#~ msgid "Sranan Tongo" -#~ msgstr "Sranan Tongo" - -#~ msgid "Serbian" -#~ msgstr "Serbo" - -#~ msgid "Serer" -#~ msgstr "Serer" - -#~ msgid "Swati" -#~ msgstr "Swati" - -#~ msgid "Sukuma" -#~ msgstr "sukuma" - -#~ msgid "Sundanese" -#~ msgstr "Sundanese" - -#~ msgid "Susu" -#~ msgstr "Susu" - -#~ msgid "Sumerian" -#~ msgstr "Sumero" - -#~ msgid "Swahili (macrolanguage)" -#~ msgstr "Swahili (macro-lingua)" - -#~ msgid "Swedish" -#~ msgstr "Svedese" - -#~ msgid "Syriac; Classical" -#~ msgstr "Siriaco classico" - -#~ msgid "Syriac" -#~ msgstr "Siriaco" - -#~ msgid "Tahitian" -#~ msgstr "Tahitian" - -#~ msgid "Tamil" -#~ msgstr "Tamil" - -#~ msgid "Tatar" -#~ msgstr "Tatarico" - -#~ msgid "Telugu" -#~ msgstr "Telugu" - -#~ msgid "Timne" -#~ msgstr "Temne" - -#~ msgid "Tereno" -#~ msgstr "Tereno" - -#~ msgid "Tetum" -#~ msgstr "Tetum" - -#~ msgid "Tajik" -#~ msgstr "Tajik" - -#~ msgid "Tagalog" -#~ msgstr "Tagalog" - -#~ msgid "Thai" -#~ msgstr "Thailandese" - -#~ msgid "Tigre" -#~ msgstr "Tigre" - -#~ msgid "Tigrinya" -#~ msgstr "Tigrinya" - -#~ msgid "Tiv" -#~ msgstr "Tiv" - -#~ msgid "Tokelau" -#~ msgstr "Tokelau" - -#~ msgid "Klingon" -#~ msgstr "Klingon" - -#~ msgid "Tlingit" -#~ msgstr "Tlingit" - -#~ msgid "Tamashek" -#~ msgstr "Tamashek" - -#~ msgid "Tonga (Nyasa)" -#~ msgstr "Tonga (Nyasa)" - -#~ msgid "Tonga (Tonga Islands)" -#~ msgstr "Tonga (Isole Tonga)" - -#~ msgid "Tok Pisin" -#~ msgstr "Tok pisin" - -#~ msgid "Tsimshian" -#~ msgstr "Tsimshian" - -#~ msgid "Tswana" -#~ msgstr "Tswana" - -#~ msgid "Tsonga" -#~ msgstr "Tsonga" - -#~ msgid "Turkmen" -#~ msgstr "Turkmeno" - -#~ msgid "Tumbuka" -#~ msgstr "Tumbuka" - -#~ msgid "Turkish" -#~ msgstr "Turco" - -#~ msgid "Tuvalu" -#~ msgstr "Tuvalu" - -#~ msgid "Twi" -#~ msgstr "Twi" - -#~ msgid "Tuvinian" -#~ msgstr "Tuvinian" - -#~ msgid "Udmurt" -#~ msgstr "Udmurt" - -#~ msgid "Ugaritic" -#~ msgstr "Ugaritico" - -#~ msgid "Uighur" -#~ msgstr "Uighuro" - -#~ msgid "Ukrainian" -#~ msgstr "Ucraino" - -#~ msgid "Umbundu" -#~ msgstr "Umbundu" - -#~ msgid "Undetermined" -#~ msgstr "Non determinato" - -#~ msgid "Urdu" -#~ msgstr "Urdu" - -#~ msgid "Uzbek" -#~ msgstr "Usbeco" - -#~ msgid "Vai" -#~ msgstr "Vai" - -#~ msgid "Venda" -#~ msgstr "venda" - -#~ msgid "Vietnamese" -#~ msgstr "Vietnamita" - -#~ msgid "Volapük" -#~ msgstr "Volapük" - -#~ msgid "Votic" -#~ msgstr "Votic" - -#~ msgid "Wolaytta" -#~ msgstr "Wolaytta" - -#~ msgid "Waray (Philippines)" -#~ msgstr "Waray (Filippine)" - -#~ msgid "Washo" -#~ msgstr "Washo" - -#~ msgid "Walloon" -#~ msgstr "Walloon" - -#~ msgid "Wolof" -#~ msgstr "Wolof" - -#~ msgid "Kalmyk" -#~ msgstr "Kalmyk" - -#~ msgid "Xhosa" -#~ msgstr "Xhosa" - -#~ msgid "Yao" -#~ msgstr "Yao" - -#~ msgid "Yapese" -#~ msgstr "Yapese" - -#~ msgid "Yiddish" -#~ msgstr "Yiddish" - -#~ msgid "Yoruba" -#~ msgstr "Yoruba" - -#~ msgid "Zapotec" -#~ msgstr "Zapoteco" - -#~ msgid "Blissymbols" -#~ msgstr "Blissymbols" - -#~ msgid "Zenaga" -#~ msgstr "Zenaga" - -#~ msgid "Zhuang" -#~ msgstr "Zhuang" - -#~ msgid "Chinese" -#~ msgstr "Cinese" - -#~ msgid "Zulu" -#~ msgstr "Zulu" - -#~ msgid "Zuni" -#~ msgstr "Zuni" - -#~ msgid "No linguistic content" -#~ msgstr "Nessun contenuto linguistico" - -#~ msgid "Zaza" -#~ msgstr "Zaza" - -#~ msgid "Failed to create path for cover %(path)s (Permission denied)." -#~ msgstr "" - -#~ msgid "Failed to store cover-file %(cover)s." -#~ msgstr "" - -#~ msgid "Cover-file is not a valid image file" -#~ msgstr "" - -#~ msgid "Cover is not a jpg file, can't save" -#~ msgstr "La copertina non è un file in formato jpg: non posso salvare" - -#~ msgid "Preparing document for printing..." -#~ msgstr "Preparo documento per la stampa..." - -#~ msgid "Using your another device, visit" -#~ msgstr "Utilizzando il tuo altro dispositivo, visita" - -#~ msgid "and log in" -#~ msgstr "e accedi" - -#~ msgid "Using your another device, login and visit " -#~ msgstr "" - -#~ msgid "Newest Books" -#~ msgstr "I libri più nuovi" - -#~ msgid "Oldest Books" -#~ msgstr "I libri più vecchi" - -#~ msgid "Books (A-Z)" -#~ msgstr "Libri (A-Z)" - -#~ msgid "Books (Z-A)" -#~ msgstr "Libri (Z-A)" - -#~ msgid "Error opening eBook. Fileformat is not supported." -#~ msgstr "" - -#~ msgid "File %(title)s" -#~ msgstr "File %(title)s" - -#~ msgid "Show sorted books" -#~ msgstr "Mostra i libri ordinati" - -#~ msgid "Sorted Books" -#~ msgstr "Libri ordinati" - -#~ msgid "Sort By" -#~ msgstr "Ordina per" - -#~ msgid "Newest" -#~ msgstr "i più nuovi" - -#~ msgid "Oldest" -#~ msgstr "i più vecchi" - -#~ msgid "Ascending" -#~ msgstr "Ascendente" - -#~ msgid "Descending" -#~ msgstr "Discendente" - -#~ 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 "" - -#~ msgid "Import of optional Google Drive requirements missing" -#~ msgstr "Importa parametri mancanti per Google Drive" - -#~ msgid "client_secrets.json is missing or not readable" -#~ msgstr "client_secrets.json manca o è inaccessibile" - -#~ msgid "client_secrets.json is not configured for web application" -#~ msgstr "client_secrets.json non è configurato per questa applicazione web" - -#~ msgid "Keyfile location is not valid, please enter correct path" -#~ msgstr "La posizione del Keyfile non è corretta: per favore indica il percorso corretto" - -#~ msgid "Certfile location is not valid, please enter correct path" -#~ msgstr "La posizione del Cerfile non è corretta: per favore indica il percorso corretto" - -#~ msgid "Please enter a LDAP provider, port, DN and user object identifier" -#~ msgstr "" - -#~ msgid "Please enter a LDAP service account and password" -#~ msgstr "" - -#~ msgid "Please enter Github oauth credentials" -#~ msgstr "" - -#~ msgid "Please enter Google oauth credentials" -#~ msgstr "" - -#~ msgid "Logfile location is not valid, please enter correct path" -#~ msgstr "La posizione del Logfile non è corretta: per favore indica il percorso corretto" - -#~ msgid "Access Logfile location is not valid, please enter correct path" -#~ msgstr "" - -#~ msgid "DB location is not valid, please enter correct path" -#~ msgstr "La posizione DB non è corretta: per favore indica il percorso corretto" - -#~ msgid "Excecution permissions missing" -#~ msgstr "Mancano le autorizzazioni di esecuzione" - -#~ msgid "not configured" -#~ msgstr "non configurato" - -#~ msgid "Error excecuting UnRar" -#~ msgstr "Errore nell'esecuzione di UnRar" - -#~ msgid "Unrar binary file not found" -#~ msgstr "Non ho trovato il file binario di UnRar" - -#~ msgid "Use GitHub OAuth" -#~ msgstr "" - -#~ msgid "Use Google OAuth" -#~ msgstr "" - -#~ msgid "Obtain GitHub OAuth Credential" -#~ msgstr "" - -#~ msgid "GitHub OAuth Client Id" -#~ msgstr "" - -#~ msgid "GitHub OAuth Client Secret" -#~ msgstr "" - -#~ msgid "Obtain Google OAuth Credential" -#~ msgstr "" - -#~ msgid "Google OAuth Client Id" -#~ msgstr "" - -#~ msgid "Google OAuth Client Secret" -#~ msgstr "" - -#~ msgid "Use" -#~ msgstr "Uso" +#: cps/templates/user_edit.html:144 +msgid "Recent Downloads" +msgstr "Download recenti" -#~ msgid "Play / pause" -#~ msgstr "" +#: cps/templates/user_edit.html:160 +msgid "Generate Kobo Auth URL" +msgstr "Genera un URL di autenticazione per Kobo" -#~ msgid "volume" -#~ msgstr "" +#: cps/templates/user_edit.html:176 +msgid "Do you really want to delete the Kobo Token?" +msgstr "Vuoi veramente eliminare questo token di Kobo?" -#~ msgid "unknown" -#~ msgstr "sconosciuto" +#~ msgid "Please note that every visit to this current page invalidates any previously generated Authentication url for this user." +#~ msgstr "Prendi nota che ad ogni visita a questa pagina, l'url di autenticazione precedentemente generato viene invalidato" -#~ msgid "New Books" -#~ msgstr "Nuovi libri" +#~ msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" +#~ msgstr "La copertina non è in un formato immagine supportato (jpg/png/webp), non posso salvare" diff --git a/cps/translations/ja/LC_MESSAGES/messages.mo b/cps/translations/ja/LC_MESSAGES/messages.mo index f27a8336..23473190 100644 Binary files a/cps/translations/ja/LC_MESSAGES/messages.mo and b/cps/translations/ja/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/ja/LC_MESSAGES/messages.po b/cps/translations/ja/LC_MESSAGES/messages.po index b518d053..1b88bc50 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: 2020-01-12 13:57+0100\n" +"POT-Creation-Date: 2020-03-12 20:31+0100\n" "PO-Revision-Date: 2018-02-07 02:20-0500\n" "Last-Translator: white \n" "Language: ja\n" @@ -16,7 +16,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.7.0\n" +"Generated-By: Babel 2.8.0\n" #: cps/about.py:42 msgid "installed" @@ -26,7 +26,7 @@ msgstr "" msgid "not installed" msgstr "インストールされていません" -#: cps/about.py:84 +#: cps/about.py:87 msgid "Statistics" msgstr "統計" @@ -40,7 +40,7 @@ msgstr "サーバをシャットダウンしています。ページを閉じて #: cps/admin.py:110 cps/editbooks.py:410 cps/editbooks.py:419 #: cps/editbooks.py:539 cps/editbooks.py:541 cps/editbooks.py:594 -#: cps/updater.py:446 cps/uploader.py:97 cps/uploader.py:108 +#: cps/updater.py:456 cps/uploader.py:96 cps/uploader.py:107 msgid "Unknown" msgstr "不明" @@ -48,155 +48,164 @@ msgstr "不明" msgid "Admin page" msgstr "管理者ページ" -#: cps/admin.py:148 cps/templates/admin.html:115 +#: cps/admin.py:151 msgid "UI Configuration" msgstr "UI設定" -#: cps/admin.py:185 cps/admin.py:412 +#: cps/admin.py:187 cps/admin.py:637 msgid "Calibre-Web configuration updated" msgstr "Calibre-Web の設定を更新しました" -#: cps/admin.py:442 cps/templates/admin.html:114 +#: cps/admin.py:434 cps/admin.py:440 cps/admin.py:451 cps/admin.py:462 +#: cps/templates/modal_restriction.html:29 +msgid "Deny" +msgstr "" + +#: cps/admin.py:436 cps/admin.py:442 cps/admin.py:453 cps/admin.py:464 +#: cps/templates/modal_restriction.html:28 +msgid "Allow" +msgstr "" + +#: cps/admin.py:667 msgid "Basic Configuration" msgstr "基本設定" -#: cps/admin.py:465 cps/web.py:1093 +#: cps/admin.py:691 cps/web.py:1089 msgid "Please fill out all fields!" msgstr "全ての項目を入力してください" -#: cps/admin.py:467 cps/admin.py:478 cps/admin.py:484 cps/admin.py:499 -#: cps/templates/admin.html:38 +#: cps/admin.py:694 cps/admin.py:706 cps/admin.py:712 cps/admin.py:730 msgid "Add new user" msgstr "新規ユーザ追加" -#: cps/admin.py:476 cps/web.py:1318 +#: cps/admin.py:703 cps/web.py:1318 msgid "E-mail is not from valid domain" msgstr "このメールは有効なドメインからのものではありません" -#: cps/admin.py:482 cps/admin.py:493 +#: cps/admin.py:710 cps/admin.py:725 msgid "Found an existing account for this e-mail address or nickname." msgstr "このメールアドレスかニックネームで登録されたアカウントが見つかりました" -#: cps/admin.py:489 +#: cps/admin.py:721 #, python-format msgid "User '%(user)s' created" msgstr "ユーザ '%(user)s' を作成しました" -#: cps/admin.py:509 +#: cps/admin.py:740 msgid "Edit e-mail server settings" msgstr "メールサーバの設定を編集" -#: cps/admin.py:535 +#: cps/admin.py:766 #, python-format msgid "Test e-mail successfully send to %(kindlemail)s" msgstr "テストメールが %(kindlemail)s に送信されました" -#: cps/admin.py:538 +#: cps/admin.py:769 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "テストメールを %(res)s に送信中にエラーが発生しました" -#: cps/admin.py:540 +#: cps/admin.py:771 msgid "Please configure your e-mail address first..." msgstr "" -#: cps/admin.py:542 +#: cps/admin.py:773 msgid "E-mail server settings updated" msgstr "メールサーバの設定を更新しました" -#: cps/admin.py:571 +#: cps/admin.py:803 #, python-format msgid "User '%(nick)s' deleted" msgstr "ユーザ '%(nick)s' を削除しました" -#: cps/admin.py:574 +#: cps/admin.py:806 msgid "No admin user remaining, can't delete user" msgstr "" -#: cps/admin.py:612 cps/web.py:1359 +#: cps/admin.py:842 cps/web.py:1361 msgid "Found an existing account for this e-mail address." msgstr "このメールアドレスで登録されたアカウントがあります" -#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1334 +#: cps/admin.py:852 cps/admin.py:867 cps/admin.py:887 cps/web.py:1336 #, python-format msgid "Edit User %(nick)s" msgstr "%(nick)s を編集" -#: cps/admin.py:622 cps/web.py:1327 +#: cps/admin.py:858 cps/web.py:1328 msgid "This username is already taken" msgstr "" -#: cps/admin.py:637 +#: cps/admin.py:874 #, python-format msgid "User '%(nick)s' updated" msgstr "ユーザ '%(nick)s' を更新しました" -#: cps/admin.py:640 +#: cps/admin.py:877 msgid "An unknown error occured." msgstr "不明なエラーが発生しました。" -#: cps/admin.py:657 +#: cps/admin.py:900 #, python-format msgid "Password for user %(user)s reset" msgstr "%(user)s 用のパスワードをリセット" -#: cps/admin.py:660 cps/web.py:1118 cps/web.py:1174 +#: cps/admin.py:903 cps/web.py:1114 cps/web.py:1170 msgid "An unknown error occurred. Please try again later." msgstr "不明なエラーが発生しました。あとで再試行してください。" -#: cps/admin.py:663 cps/web.py:1062 +#: cps/admin.py:906 cps/web.py:1055 msgid "Please configure the SMTP mail settings first..." msgstr "初めにSMTPメールの設定をしてください" -#: cps/admin.py:674 +#: cps/admin.py:918 msgid "Logfile viewer" msgstr "" -#: cps/admin.py:710 +#: cps/admin.py:957 msgid "Requesting update package" msgstr "更新データを要求中" -#: cps/admin.py:711 +#: cps/admin.py:958 msgid "Downloading update package" msgstr "更新データをダウンロード中" -#: cps/admin.py:712 +#: cps/admin.py:959 msgid "Unzipping update package" msgstr "更新データを展開中" -#: cps/admin.py:713 +#: cps/admin.py:960 msgid "Replacing files" msgstr "ファイルを置換中" -#: cps/admin.py:714 +#: cps/admin.py:961 msgid "Database connections are closed" msgstr "データベースの接続を切断完了" -#: cps/admin.py:715 +#: cps/admin.py:962 msgid "Stopping server" msgstr "サーバ停止中" -#: cps/admin.py:716 +#: cps/admin.py:963 msgid "Update finished, please press okay and reload page" msgstr "アップデート完了、OKを押してページをリロードしてください" -#: cps/admin.py:717 cps/admin.py:718 cps/admin.py:719 cps/admin.py:720 +#: cps/admin.py:964 cps/admin.py:965 cps/admin.py:966 cps/admin.py:967 msgid "Update failed:" msgstr "アップデート失敗:" -#: cps/admin.py:717 cps/updater.py:272 cps/updater.py:457 cps/updater.py:459 +#: cps/admin.py:964 cps/updater.py:282 cps/updater.py:467 cps/updater.py:469 msgid "HTTP Error" msgstr "HTTPエラー" -#: cps/admin.py:718 cps/updater.py:274 cps/updater.py:461 +#: cps/admin.py:965 cps/updater.py:284 cps/updater.py:471 msgid "Connection error" msgstr "接続エラー" -#: cps/admin.py:719 cps/updater.py:276 cps/updater.py:463 +#: cps/admin.py:966 cps/updater.py:286 cps/updater.py:473 msgid "Timeout while establishing connection" msgstr "接続を確立中にタイムアウトしました" -#: cps/admin.py:720 cps/updater.py:278 cps/updater.py:465 +#: cps/admin.py:967 cps/updater.py:288 cps/updater.py:475 msgid "General error" msgstr "エラー発生" @@ -236,10 +245,6 @@ msgstr "%(file)s を保存できません。" msgid "File format %(ext)s added to %(book)s" msgstr "ファイル形式 %(ext)s が %(book)s に追加されました" -#: cps/editbooks.py:376 -msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" -msgstr "" - #: cps/editbooks.py:451 msgid "Cover is not a jpg file, can't save" msgstr "" @@ -276,30 +281,30 @@ msgstr "ファイル %(file)s の保存に失敗しました (Permission denied) msgid "Failed to delete file %(file)s (Permission denied)." msgstr "ファイル %(file)s の削除に失敗しました (Permission denied)。" -#: cps/editbooks.py:710 +#: cps/editbooks.py:709 #, python-format msgid "File %(file)s uploaded" msgstr "" -#: cps/editbooks.py:739 +#: cps/editbooks.py:738 msgid "Source or destination format for conversion missing" msgstr "変換元の形式または変換後の形式が指定されていません" -#: cps/editbooks.py:747 +#: cps/editbooks.py:746 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "本の %(book_format)s への変換がキューに追加されました" -#: cps/editbooks.py:751 +#: cps/editbooks.py:750 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "この本の変換中にエラーが発生しました: %(res)s" -#: cps/gdrive.py:62 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgstr "Googleドライブの設定が完了していません。Googleドライブを無効化してから再度有効にしてみてください" -#: cps/gdrive.py:104 +#: cps/gdrive.py:103 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "コールバックドメインが認証されていません。Google Developer Consoleでドメインを認証してください" @@ -389,83 +394,111 @@ msgstr "ファイル %(file)s はGoogleドライブ上にありません" msgid "Book path %(path)s not found on Google Drive" msgstr "本のパス %(path)s はGoogleドライブ上にありません" -#: cps/helper.py:643 +#: cps/helper.py:511 +msgid "Failed to create path for cover" +msgstr "" + +#: cps/helper.py:516 +msgid "Cover-file is not a valid image file" +msgstr "" + +#: cps/helper.py:519 +msgid "Failed to store cover-file" +msgstr "" + +#: cps/helper.py:530 +msgid "Only jpg/jpeg/png/webp files are supported as coverfile" +msgstr "" + +#: cps/helper.py:544 +msgid "Only jpg/jpeg files are supported as coverfile" +msgstr "" + +#: cps/helper.py:658 msgid "Waiting" msgstr "待機中" -#: cps/helper.py:645 +#: cps/helper.py:660 msgid "Failed" msgstr "失敗" -#: cps/helper.py:647 +#: cps/helper.py:662 msgid "Started" msgstr "開始" -#: cps/helper.py:649 +#: cps/helper.py:664 msgid "Finished" msgstr "終了" -#: cps/helper.py:651 +#: cps/helper.py:666 msgid "Unknown Status" msgstr "不明" -#: cps/helper.py:656 +#: cps/helper.py:671 msgid "E-mail: " msgstr "メール: " -#: cps/helper.py:658 cps/helper.py:662 +#: cps/helper.py:673 cps/helper.py:677 msgid "Convert: " msgstr "変換: " -#: cps/helper.py:660 +#: cps/helper.py:675 msgid "Upload: " msgstr "アップロード: " -#: cps/helper.py:664 +#: cps/helper.py:679 msgid "Unknown Task: " msgstr "不明なタスク: " -#: cps/oauth_bb.py:75 +#: cps/kobo_auth.py:127 +msgid "PLease access calibre-web from non localhost to get valid api_endpoint for kobo device" +msgstr "" + +#: cps/kobo_auth.py:130 cps/kobo_auth.py:150 +msgid "Kobo Setup" +msgstr "" + +#: cps/oauth_bb.py:74 #, python-format msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:154 msgid "Failed to log in with GitHub." msgstr "" -#: cps/oauth_bb.py:160 +#: cps/oauth_bb.py:159 msgid "Failed to fetch user info from GitHub." msgstr "" -#: cps/oauth_bb.py:171 +#: cps/oauth_bb.py:170 msgid "Failed to log in with Google." msgstr "" -#: cps/oauth_bb.py:176 +#: cps/oauth_bb.py:175 msgid "Failed to fetch user info from Google." msgstr "" -#: cps/oauth_bb.py:274 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s success." msgstr "" -#: cps/oauth_bb.py:278 +#: cps/oauth_bb.py:277 #, python-format msgid "Unlink to %(oauth)s failed." msgstr "" -#: cps/oauth_bb.py:281 +#: cps/oauth_bb.py:280 #, python-format msgid "Not linked to %(oauth)s." msgstr "" -#: cps/oauth_bb.py:309 +#: cps/oauth_bb.py:308 msgid "GitHub Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:328 +#: cps/oauth_bb.py:327 msgid "Google Oauth error, please retry later." msgstr "" @@ -516,403 +549,393 @@ msgstr "本が %(sname)s に追加されました" msgid "Could not add books to shelf: %(sname)s" msgstr "%(sname)s に本を追加できません" -#: cps/shelf.py:180 +#: cps/shelf.py:181 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "本が %(sname)s から削除されました" -#: cps/shelf.py:186 +#: cps/shelf.py:190 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "申し訳ありませんが、%(sname)s から本を削除することが許可されていません" -#: cps/shelf.py:207 cps/shelf.py:231 +#: cps/shelf.py:211 cps/shelf.py:235 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "'%(title)s'は既に存在します" -#: cps/shelf.py:212 +#: cps/shelf.py:216 #, python-format msgid "Shelf %(title)s created" msgstr "%(title)s を作成しました" -#: cps/shelf.py:214 cps/shelf.py:242 +#: cps/shelf.py:218 cps/shelf.py:246 msgid "There was an error" msgstr "エラーが発生しました" -#: cps/shelf.py:215 cps/shelf.py:217 +#: cps/shelf.py:219 cps/shelf.py:221 msgid "create a shelf" msgstr "本棚を作成する" -#: cps/shelf.py:240 +#: cps/shelf.py:244 #, python-format msgid "Shelf %(title)s changed" msgstr "%(title)s を変更しました" -#: cps/shelf.py:243 cps/shelf.py:245 +#: cps/shelf.py:247 cps/shelf.py:249 msgid "Edit a shelf" msgstr "本棚を編集する" -#: cps/shelf.py:289 +#: cps/shelf.py:301 #, python-format msgid "Shelf: '%(name)s'" msgstr "本棚: '%(name)s'" -#: cps/shelf.py:292 +#: cps/shelf.py:304 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "本棚を開けません。この本棚は存在しないかアクセスできません" -#: cps/shelf.py:323 +#: cps/shelf.py:342 +msgid "Hidden Book" +msgstr "" + +#: cps/shelf.py:347 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "'%(name)s' 内の本の順番を変更する" -#: cps/ub.py:57 +#: cps/ub.py:56 msgid "Recently Added" msgstr "最近追加した本" -#: cps/ub.py:59 +#: cps/ub.py:58 msgid "Show recent books" msgstr "最近追加された本を表示" -#: cps/templates/index.xml:17 cps/ub.py:60 +#: cps/templates/index.xml:17 cps/ub.py:59 msgid "Hot Books" msgstr "人気の本" -#: cps/ub.py:61 -msgid "Show hot books" -msgstr "人気な本を表示" +#: cps/ub.py:60 +msgid "Show Hot Books" +msgstr "" -#: cps/templates/index.xml:24 cps/ub.py:64 -msgid "Best rated Books" -msgstr "高評価の本" +#: cps/templates/index.xml:24 cps/ub.py:63 cps/web.py:508 +msgid "Top Rated Books" +msgstr "" -#: cps/ub.py:66 -msgid "Show best rated books" -msgstr "評価が高い本を表示" +#: cps/ub.py:65 +msgid "Show Top Rated Books" +msgstr "" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67 -#: cps/web.py:1011 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:66 +#: cps/web.py:1005 msgid "Read Books" msgstr "読んだ本" -#: cps/ub.py:69 +#: cps/ub.py:68 msgid "Show read and unread" msgstr "既読の本と未読の本を表示" -#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71 -#: cps/web.py:1015 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:70 +#: cps/web.py:1009 msgid "Unread Books" msgstr "未読の本" -#: cps/ub.py:73 +#: cps/ub.py:72 msgid "Show unread" msgstr "" -#: cps/ub.py:74 +#: cps/ub.py:73 msgid "Discover" msgstr "見つける" -#: cps/ub.py:76 +#: cps/ub.py:75 msgid "Show random books" msgstr "ランダムで本を表示" -#: cps/templates/index.xml:75 cps/ub.py:77 +#: cps/templates/index.xml:75 cps/ub.py:76 cps/web.py:787 msgid "Categories" msgstr "カテゴリ" -#: cps/ub.py:79 +#: cps/ub.py:78 msgid "Show category selection" msgstr "カテゴリ選択を表示" -#: cps/templates/book_edit.html:71 cps/templates/index.xml:82 -#: cps/templates/search_form.html:53 cps/ub.py:80 +#: cps/templates/book_edit.html:69 cps/templates/index.xml:82 +#: cps/templates/search_form.html:53 cps/ub.py:79 cps/web.py:715 msgid "Series" msgstr "シリーズ" -#: cps/ub.py:82 +#: cps/ub.py:81 msgid "Show series selection" msgstr "シリーズ選択を表示" -#: cps/templates/index.xml:61 cps/ub.py:83 +#: cps/templates/index.xml:61 cps/ub.py:82 msgid "Authors" msgstr "著者" -#: cps/ub.py:85 +#: cps/ub.py:84 msgid "Show author selection" msgstr "著者選択を表示" -#: cps/templates/index.xml:68 cps/ub.py:87 +#: cps/templates/index.xml:68 cps/ub.py:86 cps/web.py:699 msgid "Publishers" msgstr "出版社" -#: cps/ub.py:89 +#: cps/ub.py:88 msgid "Show publisher selection" msgstr "出版社選択を表示" -#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:90 +#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:89 +#: cps/web.py:770 msgid "Languages" msgstr "言語" -#: cps/ub.py:93 +#: cps/ub.py:92 msgid "Show language selection" msgstr "言語選択を表示" -#: cps/ub.py:94 +#: cps/templates/index.xml:96 cps/ub.py:93 msgid "Ratings" msgstr "" -#: cps/ub.py:96 +#: cps/ub.py:95 msgid "Show ratings selection" msgstr "" -#: cps/templates/index.xml:96 cps/ub.py:97 +#: cps/templates/index.xml:104 cps/ub.py:96 msgid "File formats" msgstr "" -#: cps/ub.py:99 +#: cps/ub.py:98 msgid "Show file formats selection" msgstr "" -#: cps/updater.py:252 cps/updater.py:359 cps/updater.py:372 +#: cps/updater.py:262 cps/updater.py:369 cps/updater.py:382 msgid "Unexpected data while reading update information" msgstr "アップデート情報を読み込み中に予期しないデータが見つかりました" -#: cps/updater.py:259 cps/updater.py:365 +#: cps/updater.py:269 cps/updater.py:375 msgid "No update available. You already have the latest version installed" msgstr "アップデートはありません。すでに最新バージョンがインストールされています" -#: cps/updater.py:285 +#: cps/updater.py:295 msgid "A new update is available. Click on the button below to update to the latest version." msgstr "アップデートが利用可能です。下のボタンをクリックして最新バージョンにアップデートしてください。" -#: cps/updater.py:338 +#: cps/updater.py:348 msgid "Could not fetch update information" msgstr "アップデート情報を取得できません" -#: cps/updater.py:352 +#: cps/updater.py:362 msgid "No release information available" msgstr "リリース情報がありません" -#: cps/updater.py:405 cps/updater.py:414 +#: cps/updater.py:415 cps/updater.py:424 #, python-format msgid "A new update is available. Click on the button below to update to version: %(version)s" msgstr "アップデートが利用可能です。下のボタンをクリックしてバージョン: %(version)s にアップデートしてください。" -#: cps/updater.py:424 +#: cps/updater.py:434 msgid "Click on the button below to update to the latest stable version." msgstr "" -#: cps/web.py:486 +#: cps/web.py:480 msgid "Recently Added Books" msgstr "最近追加された本" -#: cps/web.py:514 -msgid "Best rated books" -msgstr "高評価" - -#: cps/templates/index.xml:38 cps/web.py:522 -msgid "Random Books" -msgstr "ランダム" +#: cps/templates/index.html:5 cps/web.py:516 +msgid "Discover (Random Books)" +msgstr "本を見つける (ランダムで表示)" -#: cps/web.py:548 +#: cps/web.py:542 msgid "Books" msgstr "" -#: cps/web.py:575 -msgid "Hot Books (most downloaded)" -msgstr "話題(ダウンロード数順)" +#: cps/web.py:569 +msgid "Hot Books (Most Downloaded)" +msgstr "" -#: cps/web.py:586 cps/web.py:1382 cps/web.py:1478 -msgid "Error opening eBook. File does not exist or file is not accessible:" -msgstr "電子書籍を開けません。ファイルが存在しないかアクセスできません:" +#: cps/web.py:580 +msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" +msgstr "" -#: cps/web.py:599 +#: cps/web.py:593 #, python-format msgid "Author: %(name)s" msgstr "" -#: cps/web.py:611 +#: cps/web.py:605 #, python-format msgid "Publisher: %(name)s" msgstr "出版社: %(name)s" -#: cps/web.py:622 +#: cps/web.py:616 #, python-format msgid "Series: %(serie)s" msgstr "シリーズ: %(serie)s" -#: cps/web.py:633 +#: cps/web.py:627 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:644 +#: cps/web.py:638 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:656 +#: cps/web.py:650 #, python-format msgid "Category: %(name)s" msgstr "カテゴリ: %(name)s" -#: cps/web.py:673 +#: cps/web.py:667 #, python-format msgid "Language: %(name)s" msgstr "言語: %(name)s" -#: cps/web.py:705 -msgid "Publisher list" -msgstr "出版社一覧" - -#: cps/web.py:721 -msgid "Series list" -msgstr "シリーズ一覧" - -#: cps/web.py:735 +#: cps/web.py:729 msgid "Ratings list" msgstr "" -#: cps/web.py:748 +#: cps/web.py:742 msgid "File formats list" msgstr "" -#: cps/web.py:776 -msgid "Available languages" -msgstr "言語" - -#: cps/web.py:793 -msgid "Category list" -msgstr "カテゴリ一覧" - -#: cps/templates/layout.html:73 cps/web.py:807 +#: cps/templates/layout.html:73 cps/templates/tasks.html:7 cps/web.py:801 msgid "Tasks" msgstr "タスク" -#: cps/templates/feed.xml:33 cps/templates/layout.html:44 -#: cps/templates/layout.html:45 cps/web.py:829 cps/web.py:831 +#: cps/templates/book_edit.html:212 cps/templates/feed.xml:33 +#: cps/templates/layout.html:44 cps/templates/layout.html:47 +#: cps/templates/search_form.html:170 cps/web.py:821 cps/web.py:823 msgid "Search" msgstr "検索" -#: cps/web.py:881 +#: cps/web.py:873 msgid "Published after " msgstr "これ以降に出版 " -#: cps/web.py:888 +#: cps/web.py:880 msgid "Published before " msgstr "これ以前に出版 " -#: cps/web.py:902 +#: cps/web.py:894 #, python-format msgid "Rating <= %(rating)s" msgstr "評価 <= %(rating)s" -#: cps/web.py:904 +#: cps/web.py:896 #, python-format msgid "Rating >= %(rating)s" msgstr "評価 >= %(rating)s" -#: cps/web.py:970 cps/web.py:982 +#: cps/web.py:962 cps/web.py:976 msgid "search" msgstr "検索" -#: cps/web.py:1067 +#: cps/web.py:1060 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "本の %(kindlemail)s への送信がキューに追加されました" -#: cps/web.py:1071 +#: cps/web.py:1064 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "%(res)s を送信中にエラーが発生しました" -#: cps/web.py:1073 +#: cps/web.py:1066 msgid "Please configure your kindle e-mail address first..." msgstr "初めにKindleのメールアドレスを設定してください" -#: cps/web.py:1087 +#: cps/web.py:1083 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "" -#: cps/web.py:1088 cps/web.py:1094 cps/web.py:1119 cps/web.py:1123 -#: cps/web.py:1128 cps/web.py:1132 +#: cps/web.py:1084 cps/web.py:1090 cps/web.py:1115 cps/web.py:1119 +#: cps/web.py:1124 cps/web.py:1128 msgid "register" msgstr "登録" -#: cps/web.py:1121 +#: cps/web.py:1117 msgid "Your e-mail is not allowed to register" msgstr "このメールアドレスは登録が許可されていません" -#: cps/web.py:1124 +#: cps/web.py:1120 msgid "Confirmation e-mail was send to your e-mail account." msgstr "確認メールがこのメールアドレスに送信されました。" -#: cps/web.py:1127 +#: cps/web.py:1123 msgid "This username or e-mail address is already in use." msgstr "このユーザ名またはメールアドレスはすでに使われています。" -#: cps/web.py:1144 +#: cps/web.py:1140 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1154 cps/web.py:1281 +#: cps/web.py:1150 cps/web.py:1277 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "%(nickname)s としてログイン中" -#: cps/web.py:1159 +#: cps/web.py:1155 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "" -#: cps/web.py:1163 cps/web.py:1186 +#: cps/web.py:1159 cps/web.py:1182 msgid "Wrong Username or Password" msgstr "ユーザ名またはパスワードが違います" -#: cps/web.py:1170 +#: cps/web.py:1166 msgid "New Password was send to your email address" msgstr "" -#: cps/web.py:1176 +#: cps/web.py:1172 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1182 +#: cps/web.py:1178 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1189 cps/web.py:1213 +#: cps/web.py:1185 cps/web.py:1209 msgid "login" msgstr "ログイン" -#: cps/web.py:1225 cps/web.py:1259 +#: cps/web.py:1221 cps/web.py:1255 msgid "Token not found" msgstr "トークンが見つかりません" -#: cps/web.py:1234 cps/web.py:1267 +#: cps/web.py:1230 cps/web.py:1263 msgid "Token has expired" msgstr "トークンが無効です" -#: cps/web.py:1243 +#: cps/web.py:1239 msgid "Success! Please return to your device" msgstr "成功です!端末に戻ってください" -#: cps/web.py:1320 cps/web.py:1363 cps/web.py:1369 +#: cps/web.py:1320 cps/web.py:1365 cps/web.py:1371 #, python-format msgid "%(name)s's profile" msgstr "%(name)s のプロフィール" -#: cps/web.py:1365 +#: cps/web.py:1367 msgid "Profile updated" msgstr "プロフィールを更新しました" -#: cps/web.py:1394 cps/web.py:1397 cps/web.py:1400 cps/web.py:1407 -#: cps/web.py:1412 +#: cps/web.py:1384 cps/web.py:1480 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "電子書籍を開けません。ファイルが存在しないかアクセスできません:" + +#: cps/web.py:1396 cps/web.py:1399 cps/web.py:1402 cps/web.py:1409 +#: cps/web.py:1414 msgid "Read a Book" msgstr "本を読む" -#: cps/web.py:1423 +#: cps/web.py:1425 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "" @@ -927,24 +950,27 @@ msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Kindlegen が失敗しました。エラー: %(error)s, メッセージ: %(message)s" #: cps/templates/admin.html:9 -msgid "User list" -msgstr "ユーザ一覧" +msgid "Users" +msgstr "" -#: cps/templates/admin.html:12 -msgid "Nickname" -msgstr "ニックネーム" +#: cps/templates/admin.html:12 cps/templates/login.html:8 +#: cps/templates/login.html:9 cps/templates/register.html:7 +#: cps/templates/user_edit.html:8 +msgid "Username" +msgstr "ユーザ名" -#: cps/templates/admin.html:13 -msgid "E-mail" -msgstr "メールアドレス" +#: cps/templates/admin.html:13 cps/templates/register.html:11 +#: cps/templates/user_edit.html:13 +msgid "E-mail Address" +msgstr "" -#: cps/templates/admin.html:14 -msgid "Kindle" -msgstr "Kindle" +#: cps/templates/admin.html:14 cps/templates/user_edit.html:26 +msgid "Send to Kindle E-mail Address" +msgstr "" #: cps/templates/admin.html:15 -msgid "DLS" -msgstr "DLS" +msgid "Downloads" +msgstr "" #: cps/templates/admin.html:16 cps/templates/layout.html:76 msgid "Admin" @@ -957,7 +983,7 @@ msgid "Download" msgstr "ダウンロード" #: cps/templates/admin.html:18 -msgid "View Ebooks" +msgid "View eBooks" msgstr "" #: cps/templates/admin.html:19 cps/templates/layout.html:65 @@ -968,29 +994,33 @@ msgstr "アップロード" msgid "Edit" msgstr "編集" +#: cps/templates/admin.html:38 +msgid "Add New User" +msgstr "" + #: cps/templates/admin.html:44 -msgid "SMTP e-mail server settings" -msgstr "SMTPメールサーバ設定" +msgid "E-mail Server Settings" +msgstr "" #: cps/templates/admin.html:47 cps/templates/email_edit.html:11 -msgid "SMTP hostname" -msgstr "SMTPホスト名" +msgid "SMTP Hostname" +msgstr "" -#: cps/templates/admin.html:48 -msgid "SMTP port" -msgstr "SMTPポート" +#: cps/templates/admin.html:48 cps/templates/email_edit.html:15 +msgid "SMTP Port" +msgstr "" -#: cps/templates/admin.html:49 -msgid "SSL" -msgstr "SSL" +#: cps/templates/admin.html:49 cps/templates/email_edit.html:19 +msgid "Encryption" +msgstr "暗号化" #: cps/templates/admin.html:50 cps/templates/email_edit.html:27 -msgid "SMTP login" -msgstr "SMTPログイン" +msgid "SMTP Login" +msgstr "" -#: cps/templates/admin.html:51 -msgid "From mail" -msgstr "メールから" +#: cps/templates/admin.html:51 cps/templates/email_edit.html:35 +msgid "From E-mail" +msgstr "" #: cps/templates/admin.html:61 msgid "Change SMTP settings" @@ -1001,64 +1031,72 @@ msgid "Configuration" msgstr "設定" #: cps/templates/admin.html:70 -msgid "Calibre DB dir" -msgstr "Calibreデータベースのあるフォルダ" +msgid "Calibre Database Directory" +msgstr "" -#: cps/templates/admin.html:74 -msgid "Log level" +#: cps/templates/admin.html:74 cps/templates/config_edit.html:122 +msgid "Log Level" msgstr "ログレベル" #: cps/templates/admin.html:78 msgid "Port" msgstr "ポート番号" -#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:23 -msgid "Books per page" -msgstr "1ページに表示する本の冊数" +#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:27 +msgid "Books per Page" +msgstr "" #: cps/templates/admin.html:88 -msgid "Uploading" -msgstr "アップロード機能" +msgid "Uploads" +msgstr "" #: cps/templates/admin.html:92 -msgid "Anonymous browsing" -msgstr "匿名で閲覧" +msgid "Anonymous Browsing" +msgstr "" #: cps/templates/admin.html:96 -msgid "Public registration" -msgstr "誰でも新規登録可能" +msgid "Public Registration" +msgstr "" -#: cps/templates/admin.html:100 cps/templates/remote_login.html:4 -msgid "Remote login" -msgstr "リモートログイン" +#: cps/templates/admin.html:100 +msgid "Magic Link Remote Login" +msgstr "" #: cps/templates/admin.html:104 -msgid "Reverse proxy login" +msgid "Reverse Proxy Login" msgstr "" #: cps/templates/admin.html:109 msgid "Reverse proxy header name" msgstr "" +#: cps/templates/admin.html:114 +msgid "Edit Basic Configuration" +msgstr "" + +#: cps/templates/admin.html:115 +msgid "Edit UI Configuration" +msgstr "" + #: cps/templates/admin.html:121 msgid "Administration" msgstr "管理" #: cps/templates/admin.html:122 -msgid "View Logfiles" +msgid "View Logs" msgstr "" #: cps/templates/admin.html:123 -msgid "Reconnect to Calibre DB" -msgstr "Calibreデータベースに再接続" +msgid "Reconnect Calibre Database" +msgstr "" #: cps/templates/admin.html:124 -msgid "Restart Calibre-Web" -msgstr "Calibre-Webを再起動" +msgid "Restart" +msgstr "" #: cps/templates/admin.html:125 -msgid "Stop Calibre-Web" -msgstr "Calibre-Webを停止" +msgid "Shutdown" +msgstr "" #: cps/templates/admin.html:131 msgid "Update" @@ -1077,39 +1115,38 @@ msgid "Current version" msgstr "現在のバージョン" #: cps/templates/admin.html:148 -msgid "Check for update" -msgstr "更新を確認" +msgid "Check for Update" +msgstr "" #: cps/templates/admin.html:149 msgid "Perform Update" msgstr "更新を実行" #: cps/templates/admin.html:161 -msgid "Do you really want to restart Calibre-Web?" -msgstr "Calibre-Webを再起動します。よろしいですか?" +msgid "Are you sure you want to restart?" +msgstr "" #: cps/templates/admin.html:166 cps/templates/admin.html:180 #: cps/templates/admin.html:200 cps/templates/shelf.html:72 -msgid "Ok" -msgstr "はい" +msgid "OK" +msgstr "" #: cps/templates/admin.html:167 cps/templates/admin.html:181 -#: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 +#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:194 +#: cps/templates/config_edit.html:346 cps/templates/config_view_edit.html:151 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92 -#: cps/templates/layout.html:28 cps/templates/shelf.html:73 -#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32 -#: cps/templates/user_edit.html:131 -msgid "Back" -msgstr "戻る" +#: cps/templates/shelf.html:73 cps/templates/shelf_edit.html:19 +#: cps/templates/user_edit.html:137 +msgid "Cancel" +msgstr "" #: cps/templates/admin.html:179 -msgid "Do you really want to stop Calibre-Web?" -msgstr "Calibre-Webを停止します。よろしいですか?" +msgid "Are you sure you want to shutdown?" +msgstr "" #: cps/templates/admin.html:191 -msgid "Updating, please do not reload page" -msgstr "更新中です。ページ再読み込みしないでください" +msgid "Updating, please do not reload this page" +msgstr "" #: cps/templates/author.html:15 msgid "via" @@ -1135,161 +1172,159 @@ msgstr "減らす" msgid "More by" msgstr "" -#: cps/templates/book_edit.html:12 +#: cps/templates/book_edit.html:10 msgid "Delete Book" msgstr "本を削除" -#: cps/templates/book_edit.html:15 +#: cps/templates/book_edit.html:13 msgid "Delete formats:" msgstr "削除する形式:" -#: cps/templates/book_edit.html:18 cps/templates/book_edit.html:195 -#: cps/templates/email_edit.html:91 +#: cps/templates/book_edit.html:16 cps/templates/book_edit.html:193 +#: cps/templates/email_edit.html:91 cps/templates/user_edit.html:65 +#: cps/templates/user_edit.html:177 msgid "Delete" msgstr "削除" -#: cps/templates/book_edit.html:26 +#: cps/templates/book_edit.html:24 msgid "Convert book format:" msgstr "変換する形式:" -#: cps/templates/book_edit.html:30 +#: cps/templates/book_edit.html:28 msgid "Convert from:" msgstr "変換元:" -#: cps/templates/book_edit.html:32 cps/templates/book_edit.html:39 +#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:37 msgid "select an option" msgstr "選択肢を選ぶ" -#: cps/templates/book_edit.html:37 +#: cps/templates/book_edit.html:35 msgid "Convert to:" msgstr "変換先:" -#: cps/templates/book_edit.html:46 +#: cps/templates/book_edit.html:44 msgid "Convert book" msgstr "本を変換" -#: cps/templates/book_edit.html:55 cps/templates/search_form.html:6 +#: cps/templates/book_edit.html:53 cps/templates/search_form.html:6 msgid "Book Title" msgstr "本のタイトル" -#: cps/templates/book_edit.html:59 cps/templates/book_edit.html:255 -#: cps/templates/book_edit.html:273 cps/templates/search_form.html:10 +#: cps/templates/book_edit.html:57 cps/templates/book_edit.html:256 +#: cps/templates/book_edit.html:274 cps/templates/search_form.html:10 msgid "Author" msgstr "著者" -#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:260 -#: cps/templates/book_edit.html:275 cps/templates/search_form.html:126 +#: cps/templates/book_edit.html:61 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:276 cps/templates/search_form.html:126 msgid "Description" msgstr "詳細" -#: cps/templates/book_edit.html:67 cps/templates/search_form.html:33 +#: cps/templates/book_edit.html:65 cps/templates/search_form.html:33 msgid "Tags" msgstr "タグ" -#: cps/templates/book_edit.html:75 -msgid "Series id" -msgstr "シリーズID" +#: cps/templates/book_edit.html:73 +msgid "Series ID" +msgstr "" -#: cps/templates/book_edit.html:79 +#: cps/templates/book_edit.html:77 msgid "Rating" msgstr "評価" -#: cps/templates/book_edit.html:83 -msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" -msgstr "カバー画像のURL (カバー画像はjpg形式でダウンロードしてデータベースに保存され、ここは再度空欄になります)" +#: cps/templates/book_edit.html:81 +msgid "Fetch Cover from URL (JPEG - Image will be downloaded and stored in database)" +msgstr "" -#: cps/templates/book_edit.html:87 -msgid "Upload Cover from local drive" -msgstr "カバー画像をローカルからアップロード" +#: cps/templates/book_edit.html:85 +msgid "Upload Cover from Local Disk" +msgstr "" -#: cps/templates/book_edit.html:92 cps/templates/detail.html:165 -msgid "Publishing date" -msgstr "発行日" +#: cps/templates/book_edit.html:90 +msgid "Published Date" +msgstr "" -#: cps/templates/book_edit.html:99 cps/templates/book_edit.html:257 -#: cps/templates/book_edit.html:274 cps/templates/detail.html:156 +#: cps/templates/book_edit.html:97 cps/templates/book_edit.html:258 +#: cps/templates/book_edit.html:275 cps/templates/detail.html:156 #: cps/templates/search_form.html:14 msgid "Publisher" msgstr "出版社" -#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:30 +#: cps/templates/book_edit.html:101 cps/templates/detail.html:123 +#: cps/templates/user_edit.html:31 msgid "Language" msgstr "言語" -#: cps/templates/book_edit.html:113 cps/templates/search_form.html:137 +#: cps/templates/book_edit.html:111 cps/templates/search_form.html:137 msgid "Yes" msgstr "はい" -#: cps/templates/book_edit.html:114 cps/templates/search_form.html:138 +#: cps/templates/book_edit.html:112 cps/templates/search_form.html:138 msgid "No" msgstr "いいえ" -#: cps/templates/book_edit.html:160 -msgid "Upload format" -msgstr "アップロードする形式" +#: cps/templates/book_edit.html:158 +msgid "Upload Format" +msgstr "" -#: cps/templates/book_edit.html:169 -msgid "view book after edit" -msgstr "編集後に本を表示" +#: cps/templates/book_edit.html:167 +msgid "View Book on Save" +msgstr "" -#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:208 -msgid "Get metadata" -msgstr "メタデータを取得" +#: cps/templates/book_edit.html:170 cps/templates/book_edit.html:206 +msgid "Fetch Metadata" +msgstr "" -#: 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:170 cps/templates/shelf_edit.html:17 -#: cps/templates/user_edit.html:129 -msgid "Submit" -msgstr "決定" +#: cps/templates/book_edit.html:171 cps/templates/config_edit.html:343 +#: cps/templates/config_view_edit.html:150 cps/templates/email_edit.html:38 +#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:135 +msgid "Save" +msgstr "" -#: cps/templates/book_edit.html:187 +#: cps/templates/book_edit.html:185 msgid "Are you really sure?" msgstr "よろしいですか?" -#: cps/templates/book_edit.html:190 -msgid "Book will be deleted from Calibre database" -msgstr "この本はCalibreデータベースから削除されます" +#: cps/templates/book_edit.html:188 +msgid "This book will be permanently erased from database" +msgstr "" -#: cps/templates/book_edit.html:191 -msgid "and from hard disk" +#: cps/templates/book_edit.html:189 +msgid "and hard disk" msgstr "" -#: cps/templates/book_edit.html:211 +#: cps/templates/book_edit.html:209 msgid "Keyword" msgstr "キーワード" -#: cps/templates/book_edit.html:212 +#: cps/templates/book_edit.html:210 msgid " Search keyword " msgstr "キーワードを検索" -#: cps/templates/book_edit.html:214 cps/templates/layout.html:47 -msgid "Go!" -msgstr "決定" - -#: cps/templates/book_edit.html:218 +#: cps/templates/book_edit.html:216 msgid "Click the cover to load metadata to the form" msgstr "カバー画像をクリックしてメタデータをフォームに読み込んでください" -#: cps/templates/book_edit.html:230 cps/templates/book_edit.html:270 +#: cps/templates/book_edit.html:231 cps/templates/book_edit.html:271 msgid "Loading..." msgstr "読み込み中..." -#: cps/templates/book_edit.html:235 cps/templates/layout.html:192 -#: cps/templates/layout.html:224 +#: cps/templates/book_edit.html:236 cps/templates/layout.html:191 +#: cps/templates/layout.html:223 cps/templates/modal_restriction.html:34 +#: cps/templates/user_edit.html:164 msgid "Close" msgstr "閉じる" -#: cps/templates/book_edit.html:262 cps/templates/book_edit.html:276 +#: cps/templates/book_edit.html:263 cps/templates/book_edit.html:277 msgid "Source" msgstr "ソース" -#: cps/templates/book_edit.html:271 +#: cps/templates/book_edit.html:272 msgid "Search error!" msgstr "検索エラー" -#: cps/templates/book_edit.html:272 -msgid "No Result(s) found! Please try aonther keyword." +#: cps/templates/book_edit.html:273 +msgid "No Result(s) found! Please try another keyword." msgstr "検索結果が見つかりません。別のキーワードで検索してみてください。" #: cps/templates/config_edit.html:12 @@ -1297,8 +1332,8 @@ msgid "Library Configuration" msgstr "ライブラリ設定" #: cps/templates/config_edit.html:19 -msgid "Location of Calibre database" -msgstr "Calibreデータベースの場所" +msgid "Location of Calibre Database" +msgstr "" #: cps/templates/config_edit.html:25 msgid "Use Google Drive?" @@ -1349,8 +1384,8 @@ msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "SSL鍵ファイルの場所 (非SSLサーバでは空欄にしてください)" #: cps/templates/config_edit.html:99 -msgid "Update channel" -msgstr "チャンネルを更新" +msgid "Update Channel" +msgstr "" #: cps/templates/config_edit.html:101 msgid "Stable" @@ -1372,10 +1407,6 @@ msgstr "最新 (自動)" msgid "Logfile Configuration" msgstr "ログファイルの設定" -#: cps/templates/config_edit.html:122 -msgid "Log Level" -msgstr "ログレベル" - #: cps/templates/config_edit.html:131 msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "ログファイル名 (空欄の場合はcalibre-web.log)" @@ -1393,255 +1424,271 @@ msgid "Feature Configuration" msgstr "機能設定" #: cps/templates/config_edit.html:158 -msgid "Enable uploading" -msgstr "アップロードを有効にする" +msgid "Enable Uploads" +msgstr "" #: cps/templates/config_edit.html:162 -msgid "Enable anonymous browsing" -msgstr "匿名での閲覧を有効にする" +msgid "Enable Anonymous Browsing" +msgstr "" #: cps/templates/config_edit.html:166 -msgid "Enable public registration" -msgstr "誰でも新規登録を可能にする" +msgid "Enable Public Registration" +msgstr "" #: cps/templates/config_edit.html:170 -msgid "Enable remote login (\"magic link\")" -msgstr "リモートログインを有効する (\"マジックリンク\")" +msgid "Enable Magic Link Remote Login" +msgstr "" #: cps/templates/config_edit.html:175 +msgid "Enable Kobo sync" +msgstr "" + +#: cps/templates/config_edit.html:180 +msgid "Proxy unknown requests to Kobo Store" +msgstr "" + +#: cps/templates/config_edit.html:187 msgid "Use Goodreads" msgstr "" -#: cps/templates/config_edit.html:176 -msgid "Obtain an API Key" -msgstr "APIキーを取得" +#: cps/templates/config_edit.html:188 +msgid "Create an API Key" +msgstr "" -#: cps/templates/config_edit.html:180 +#: cps/templates/config_edit.html:192 msgid "Goodreads API Key" msgstr "GoodreadsのAPIキー" -#: cps/templates/config_edit.html:184 +#: cps/templates/config_edit.html:196 msgid "Goodreads API Secret" msgstr "GoodreadsのAPIシークレット" -#: cps/templates/config_edit.html:191 +#: cps/templates/config_edit.html:203 msgid "Login type" msgstr "" -#: cps/templates/config_edit.html:193 -msgid "Use standard Authentication" +#: cps/templates/config_edit.html:205 +msgid "Use Standard Authentication" msgstr "" -#: cps/templates/config_edit.html:195 +#: cps/templates/config_edit.html:207 msgid "Use LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:198 +#: cps/templates/config_edit.html:210 msgid "Use OAuth" msgstr "" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:217 msgid "LDAP Server Host Name or IP Address" msgstr "" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:221 msgid "LDAP Server Port" msgstr "" -#: cps/templates/config_edit.html:213 -msgid "LDAP schema (ldap or ldaps)" +#: cps/templates/config_edit.html:225 +msgid "LDAP Schema (LDAP or LPAPS)" msgstr "" -#: cps/templates/config_edit.html:217 -msgid "LDAP Admin username" +#: cps/templates/config_edit.html:229 +msgid "LDAP Administrator Username" msgstr "" -#: cps/templates/config_edit.html:221 -msgid "LDAP Admin password" +#: cps/templates/config_edit.html:233 +msgid "LDAP Administrator Password" msgstr "" -#: cps/templates/config_edit.html:226 -msgid "LDAP Server use SSL" +#: cps/templates/config_edit.html:238 +msgid "LDAP Server Enable SSL" msgstr "" -#: cps/templates/config_edit.html:230 -msgid "LDAP Server use TLS" +#: cps/templates/config_edit.html:242 +msgid "LDAP Server Enable TLS" msgstr "" -#: cps/templates/config_edit.html:234 +#: cps/templates/config_edit.html:246 msgid "LDAP Server Certificate" msgstr "" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:250 msgid "LDAP SSL Certificate Path" msgstr "" -#: cps/templates/config_edit.html:243 +#: cps/templates/config_edit.html:255 msgid "LDAP Distinguished Name (DN)" msgstr "" -#: cps/templates/config_edit.html:247 -msgid "LDAP User object filter" +#: cps/templates/config_edit.html:259 +msgid "LDAP User Object Filter" msgstr "" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:264 msgid "LDAP Server is OpenLDAP?" msgstr "" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:272 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:263 +#: cps/templates/config_edit.html:275 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:279 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:276 +#: cps/templates/config_edit.html:288 msgid "Allow Reverse Proxy Authentication" msgstr "" -#: cps/templates/config_edit.html:280 +#: cps/templates/config_edit.html:292 msgid "Reverse Proxy Header Name" msgstr "" -#: cps/templates/config_edit.html:292 +#: cps/templates/config_edit.html:304 msgid "External binaries" msgstr "外部バイナリ" -#: cps/templates/config_edit.html:300 -msgid "No converter" -msgstr "変換ソフトなし" +#: cps/templates/config_edit.html:312 +msgid "No Converter" +msgstr "" -#: cps/templates/config_edit.html:302 +#: cps/templates/config_edit.html:314 msgid "Use Kindlegen" msgstr "Kindlegenを使う" -#: cps/templates/config_edit.html:304 +#: cps/templates/config_edit.html:316 msgid "Use calibre's ebook converter" msgstr "calibreのebook converterを使う" -#: cps/templates/config_edit.html:308 +#: cps/templates/config_edit.html:320 msgid "E-Book converter settings" msgstr "E-Book converterの設定" -#: cps/templates/config_edit.html:312 +#: cps/templates/config_edit.html:324 msgid "Path to convertertool" msgstr "convertertoolのパス" -#: cps/templates/config_edit.html:318 +#: cps/templates/config_edit.html:330 msgid "Location of Unrar binary" msgstr "Unrarバイナリのパス" -#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 -#: cps/templates/login.html:4 +#: cps/templates/config_edit.html:349 cps/templates/layout.html:84 +#: cps/templates/login.html:4 cps/templates/login.html:20 msgid "Login" msgstr "ログイン" -#: cps/templates/config_view_edit.html:12 +#: cps/templates/config_view_edit.html:16 msgid "View Configuration" msgstr "表示設定" -#: cps/templates/config_view_edit.html:19 cps/templates/shelf_edit.html:7 +#: cps/templates/config_view_edit.html:23 cps/templates/shelf_edit.html:7 msgid "Title" msgstr "タイトル" -#: cps/templates/config_view_edit.html:27 -msgid "No. of random books to show" -msgstr "ランダムで表示する本の冊数" - #: cps/templates/config_view_edit.html:31 -msgid "No. of authors to show before hiding (0=disable hiding)" -msgstr "非表示にする前に表示する著者の人数 (0の場合は常に表示)" +msgid "No. of Random Books to Display" +msgstr "" -#: cps/templates/config_view_edit.html:35 cps/templates/readcbr.html:112 +#: cps/templates/config_view_edit.html:35 +msgid "No. of Authors to Display Before Hiding (0=Disable Hiding)" +msgstr "" + +#: cps/templates/config_view_edit.html:39 cps/templates/readcbr.html:112 msgid "Theme" msgstr "テーマ" -#: cps/templates/config_view_edit.html:37 +#: cps/templates/config_view_edit.html:41 msgid "Standard Theme" msgstr "通常テーマ" -#: cps/templates/config_view_edit.html:38 +#: cps/templates/config_view_edit.html:42 msgid "caliBlur! Dark Theme" msgstr "caliBlur! ダークテーマ" -#: cps/templates/config_view_edit.html:42 -msgid "Regular expression for ignoring columns" -msgstr "本を非表示にする際の正規表現" - #: cps/templates/config_view_edit.html:46 -msgid "Link read/unread status to Calibre column" -msgstr "Calibre上のデータと既読/未読のステータスを紐付ける" +msgid "Regular Expression for Ignoring Columns" +msgstr "" -#: cps/templates/config_view_edit.html:55 -msgid "Regular expression for title sorting" -msgstr "タイトルでソートする際の正規表現" +#: cps/templates/config_view_edit.html:50 +msgid "Link Read/Unread Status to Calibre Column" +msgstr "" #: cps/templates/config_view_edit.html:59 -msgid "Tags for Mature Content" -msgstr "成人向けのタグ" +msgid "View Restrictions based on Calibre column" +msgstr "" + +#: cps/templates/config_view_edit.html:61 cps/templates/email_edit.html:21 +msgid "None" +msgstr "なし" -#: cps/templates/config_view_edit.html:73 -msgid "Default settings for new users" -msgstr "新規ユーザのデフォルト設定" +#: cps/templates/config_view_edit.html:68 +msgid "Regular Expression for Title Sorting" +msgstr "" -#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:82 -msgid "Admin user" -msgstr "管理者ユーザ" +#: cps/templates/config_view_edit.html:80 +msgid "Default Settings for New Users" +msgstr "" -#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:91 +#: cps/templates/config_view_edit.html:88 cps/templates/user_edit.html:92 +msgid "Admin User" +msgstr "" + +#: cps/templates/config_view_edit.html:92 cps/templates/user_edit.html:97 msgid "Allow Downloads" msgstr "ダウンロードを許可" -#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:95 -msgid "Allow book viewer" +#: cps/templates/config_view_edit.html:96 cps/templates/user_edit.html:101 +msgid "Allow eBook Viewer" msgstr "" -#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:99 +#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:105 msgid "Allow Uploads" msgstr "アップロードを許可" -#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:103 +#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:109 msgid "Allow Edit" msgstr "編集を許可" -#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 -msgid "Allow Delete books" -msgstr "本の削除を許可" +#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:113 +msgid "Allow Delete Books" +msgstr "" -#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:112 +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:118 msgid "Allow Changing Password" msgstr "パスワード変更を許可" -#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:116 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:122 msgid "Allow Editing Public Shelfs" msgstr "みんなの本棚の編集を許可" -#: cps/templates/config_view_edit.html:119 -msgid "Default visibilities for new users" -msgstr "新規ユーザのデフォルト表示設定" +#: cps/templates/config_view_edit.html:126 +msgid "Default Visibilities for New Users" +msgstr "" -#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:74 -msgid "Show random books in detail view" -msgstr "詳細画面でランダムで本を表示" +#: cps/templates/config_view_edit.html:142 +msgid "Show Random Books in Detail View" +msgstr "" + +#: cps/templates/config_view_edit.html:144 +msgid "Add Allowed/Denied Tags" +msgstr "" -#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:87 -msgid "Show mature content" -msgstr "成人向けコンテンツを表示" +#: cps/templates/config_view_edit.html:145 +msgid "Add Allowed/Denied custom column values" +msgstr "" #: cps/templates/detail.html:59 -msgid "Read in browser" -msgstr "ブラウザで読む" +msgid "Read in Browser" +msgstr "" #: cps/templates/detail.html:72 -msgid "Listen in browser" +msgid "Listen in Browser" msgstr "" #: cps/templates/detail.html:117 @@ -1652,9 +1699,9 @@ msgstr "本" msgid "of" msgstr "の" -#: cps/templates/detail.html:123 -msgid "language" -msgstr "言語" +#: cps/templates/detail.html:165 +msgid "Published" +msgstr "" #: cps/templates/detail.html:200 msgid "Mark As Unread" @@ -1677,20 +1724,8 @@ msgid "Add to shelf" msgstr "本棚に追加" #: cps/templates/detail.html:286 -msgid "Edit metadata" -msgstr "メタデータを編集" - -#: cps/templates/email_edit.html:15 -msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" -msgstr "SMTPポート (多くの場合plain SMTPは25、SSLは465、STARTTLSは587)" - -#: cps/templates/email_edit.html:19 -msgid "Encryption" -msgstr "暗号化" - -#: cps/templates/email_edit.html:21 -msgid "None" -msgstr "なし" +msgid "Edit Metadata" +msgstr "" #: cps/templates/email_edit.html:22 msgid "STARTTLS" @@ -1701,24 +1736,16 @@ msgid "SSL/TLS" msgstr "SSL/TLS" #: cps/templates/email_edit.html:31 -msgid "SMTP password" -msgstr "SMTPパスワード" - -#: cps/templates/email_edit.html:35 -msgid "From e-mail" -msgstr "メールから" - -#: cps/templates/email_edit.html:38 -msgid "Save settings" -msgstr "設定を保存" +msgid "SMTP Password" +msgstr "" #: cps/templates/email_edit.html:39 -msgid "Save settings and send Test E-Mail" -msgstr "設定を保存してテストメールを送信する" +msgid "Save and Send Test E-mail" +msgstr "" #: cps/templates/email_edit.html:43 -msgid "Allowed domains for registering" -msgstr "登録を許可されたドメイン" +msgid "Allowed Domains (Whitelist)" +msgstr "" #: cps/templates/email_edit.html:46 cps/templates/email_edit.html:72 msgid "Add Domain" @@ -1733,28 +1760,28 @@ msgid "Enter domainname" msgstr "ドメイン名を入力" #: cps/templates/email_edit.html:60 -msgid "Denied domains for registering" +msgid "Denied Domains (Blacklist)" msgstr "" #: cps/templates/email_edit.html:90 -msgid "Do you really want to delete this domain rule?" -msgstr "このドメインルールを削除してもよろしいですか?" +msgid "Are you sure you want to delete this domain?" +msgstr "" -#: cps/templates/feed.xml:21 cps/templates/layout.html:176 +#: cps/templates/feed.xml:21 cps/templates/layout.html:175 msgid "Next" msgstr "次" -#: cps/templates/http_error.html:37 -msgid "Create issue" +#: cps/templates/generate_kobo_auth_url.html:5 +msgid "Open the .kobo/Kobo eReader.conf file in a text editor and add (or edit):" msgstr "" -#: cps/templates/http_error.html:44 -msgid "Back to home" -msgstr "ホームに戻る" +#: cps/templates/http_error.html:38 +msgid "Create Issue" +msgstr "" -#: cps/templates/index.html:5 -msgid "Discover (Random Books)" -msgstr "本を見つける (ランダムで表示)" +#: cps/templates/http_error.html:45 +msgid "Return to Home" +msgstr "" #: cps/templates/index.html:64 msgid "Group by series" @@ -1780,7 +1807,11 @@ msgstr "" msgid "The latest Books" msgstr "最新の本" -#: cps/templates/index.xml:42 +#: cps/templates/index.xml:38 +msgid "Random Books" +msgstr "ランダム" + +#: cps/templates/index.xml:42 cps/templates/user_edit.html:80 msgid "Show Random Books" msgstr "ランダムで本を表示" @@ -1805,22 +1836,26 @@ msgid "Books ordered by Languages" msgstr "" #: cps/templates/index.xml:100 +msgid "Books ordered by Rating" +msgstr "" + +#: cps/templates/index.xml:108 msgid "Books ordered by file formats" msgstr "" -#: cps/templates/index.xml:103 cps/templates/layout.html:137 +#: cps/templates/index.xml:111 cps/templates/layout.html:136 msgid "Public Shelves" msgstr "みんなの本棚" -#: cps/templates/index.xml:107 +#: cps/templates/index.xml:115 msgid "Books organized in public shelfs, visible to everyone" msgstr "みんなの本棚に入れた本棚は、他の人からも見えます" -#: cps/templates/index.xml:111 cps/templates/layout.html:141 +#: cps/templates/index.xml:119 cps/templates/layout.html:140 msgid "Your Shelves" msgstr "あなたの本棚" -#: cps/templates/index.xml:115 +#: cps/templates/index.xml:123 msgid "User's own shelfs, only visible to the current user himself" msgstr "ユーザ自身の本棚は、自分にのみ見えます" @@ -1828,9 +1863,18 @@ msgstr "ユーザ自身の本棚は、自分にのみ見えます" msgid "Home" msgstr "ホーム" +#: cps/templates/layout.html:28 cps/templates/shelf_order.html:32 +#: cps/templates/user_edit.html:178 +msgid "Back" +msgstr "戻る" + #: cps/templates/layout.html:34 -msgid "Toggle navigation" -msgstr "ナビゲーション" +msgid "Toggle Navigation" +msgstr "" + +#: cps/templates/layout.html:45 +msgid "Search Library" +msgstr "" #: cps/templates/layout.html:55 msgid "Advanced Search" @@ -1853,75 +1897,102 @@ msgstr "ログアウト" msgid "Register" msgstr "登録" -#: cps/templates/layout.html:116 cps/templates/layout.html:223 +#: cps/templates/layout.html:116 cps/templates/layout.html:222 msgid "Uploading..." msgstr "アップロード中..." #: cps/templates/layout.html:117 -msgid "please don't refresh the page" -msgstr "ページを更新しないでください" +msgid "Please do not refresh the page" +msgstr "" #: cps/templates/layout.html:127 msgid "Browse" msgstr "閲覧" -#: cps/templates/layout.html:146 +#: cps/templates/layout.html:145 msgid "Create a Shelf" msgstr "本棚を作成" -#: cps/templates/layout.html:147 cps/templates/stats.html:3 +#: cps/templates/layout.html:146 cps/templates/stats.html:3 msgid "About" msgstr "このサイトについて" -#: cps/templates/layout.html:161 +#: cps/templates/layout.html:160 msgid "Previous" msgstr "前" -#: cps/templates/layout.html:188 +#: cps/templates/layout.html:187 msgid "Book Details" msgstr "本の詳細" -#: cps/templates/layout.html:222 +#: cps/templates/layout.html:221 msgid "Upload done, processing, please wait..." msgstr "アップロード完了。現在処理中ですのでお待ち下さい..." -#: cps/templates/layout.html:225 +#: cps/templates/layout.html:224 msgid "Error" msgstr "エラー" -#: cps/templates/login.html:8 cps/templates/login.html:9 -#: cps/templates/register.html:7 cps/templates/user_edit.html:8 -msgid "Username" -msgstr "ユーザ名" - #: cps/templates/login.html:12 cps/templates/login.html:13 #: cps/templates/user_edit.html:21 msgid "Password" msgstr "パスワード" #: cps/templates/login.html:17 -msgid "Remember me" -msgstr "記憶する" +msgid "Remember Me" +msgstr "" #: cps/templates/login.html:22 -msgid "Forgot password" +msgid "Forgot Password?" msgstr "" #: cps/templates/login.html:25 -msgid "Log in with magic link" -msgstr "マジックリンクでログイン" +msgid "Log in with Magic Link" +msgstr "" + +#: cps/templates/logviewer.html:6 +msgid "Show Calibre-Web Log: " +msgstr "" -#: cps/templates/logviewer.html:5 -msgid "Show Calibre-Web log" +#: cps/templates/logviewer.html:8 +msgid "Calibre-Web Log: " msgstr "" #: cps/templates/logviewer.html:8 -msgid "Show access log" +msgid "Stream output, can't be displayed" +msgstr "" + +#: cps/templates/logviewer.html:12 +msgid "Show Access Log: " +msgstr "" + +#: cps/templates/modal_restriction.html:6 +msgid "Select allowed/denied Tags" +msgstr "" + +#: cps/templates/modal_restriction.html:7 +msgid "Select allowed/denied Custom Column values" +msgstr "" + +#: cps/templates/modal_restriction.html:8 +msgid "Select allowed/denied Tags of user" +msgstr "" + +#: cps/templates/modal_restriction.html:9 +msgid "Select allowed/denied Custom Column values of user" +msgstr "" + +#: cps/templates/modal_restriction.html:15 +msgid "Enter Tag" +msgstr "" + +#: cps/templates/modal_restriction.html:24 +msgid "Add View Restriction" msgstr "" #: cps/templates/osd.xml:5 -msgid "Calibre-Web ebook catalog" -msgstr "Calibre-Web 電子書籍カタログ" +msgid "Calibre-Web eBook Catalog" +msgstr "" #: cps/templates/read.html:74 msgid "Reflow text when sidebars are open." @@ -2032,52 +2103,52 @@ msgid "Basic txt Reader" msgstr "テキストリーダ" #: cps/templates/register.html:4 -msgid "Register a new account" -msgstr "新規アカウントを登録する" +msgid "Register New Account" +msgstr "" #: cps/templates/register.html:8 msgid "Choose a username" msgstr "ユーザ名を入力してください" -#: cps/templates/register.html:11 cps/templates/user_edit.html:13 -msgid "E-mail address" -msgstr "メールアドレス" - #: cps/templates/register.html:12 msgid "Your email address" msgstr "あなたのメールアドレス" +#: cps/templates/remote_login.html:4 +msgid "Magic Link - Authorise New Device" +msgstr "" + #: cps/templates/remote_login.html:6 -msgid "Use your other device, login and visit " +msgid "On another device, login and visit:" msgstr "" -#: cps/templates/remote_login.html:9 -msgid "Once you do so, you will automatically get logged in on this device." -msgstr "一度実行すれば、自動的にこの端末でログインします" +#: cps/templates/remote_login.html:10 +msgid "Once verified, you will automatically be logged in on this device." +msgstr "" -#: cps/templates/remote_login.html:12 -msgid "The link will expire after 10 minutes." +#: cps/templates/remote_login.html:13 +msgid "This verification link will expire in 10 minutes." msgstr "" #: cps/templates/search.html:5 -msgid "No Results for:" -msgstr "結果なし:" +msgid "No Results Found" +msgstr "" #: cps/templates/search.html:6 -msgid "Please try a different search" -msgstr "他の検索を試してくだい" +msgid "Search Term:" +msgstr "" #: cps/templates/search.html:8 msgid "Results for:" msgstr "結果:" #: cps/templates/search_form.html:19 -msgid "Publishing date from" -msgstr "これ以前の出版日:" +msgid "Published Date From" +msgstr "" #: cps/templates/search_form.html:26 -msgid "Publishing date to" -msgstr "これ以降の出版日:" +msgid "Published Date To" +msgstr "" #: cps/templates/search_form.html:43 msgid "Exclude Tags" @@ -2100,12 +2171,12 @@ msgid "Exclude Extensions" msgstr "" #: cps/templates/search_form.html:117 -msgid "Rating bigger than" -msgstr "これ以上の評価:" +msgid "Rating Above" +msgstr "" #: cps/templates/search_form.html:121 -msgid "Rating less than" -msgstr "これ未満の評価:" +msgid "Rating Below" +msgstr "" #: cps/templates/shelf.html:10 msgid "Delete this Shelf" @@ -2120,24 +2191,24 @@ msgid "Change order" msgstr "順番を変更" #: cps/templates/shelf.html:67 -msgid "Do you really want to delete the shelf?" -msgstr "この本棚を削除してもよろしいですか?" +msgid "Are you sure you want to delete this shelf?" +msgstr "" #: cps/templates/shelf.html:70 -msgid "Shelf will be lost for everybody and forever!" -msgstr "この本棚は誰にも見えなくなり、完全に消滅します" +msgid "Shelf will be deleted for all users" +msgstr "" #: cps/templates/shelf_edit.html:13 -msgid "should the shelf be public?" -msgstr "この本棚を他の人にも表示しますか?" +msgid "Share with Everyone" +msgstr "" #: cps/templates/shelf_order.html:5 -msgid "Drag 'n drop to rearrange order" -msgstr "ドラッグ&ドロップで並び替える" +msgid "Drag to Rearrange Order" +msgstr "" #: cps/templates/stats.html:7 -msgid "Calibre library statistics" -msgstr "Calibreライブラリの統計" +msgid "Library Statistics" +msgstr "" #: cps/templates/stats.html:12 msgid "Books in this Library" @@ -2156,21 +2227,17 @@ msgid "Series in this Library" msgstr "このライブラリ内のシリーズ" #: cps/templates/stats.html:28 -msgid "Linked libraries" -msgstr "紐付けられたライブラリ" +msgid "Linked Libraries" +msgstr "" #: cps/templates/stats.html:32 -msgid "Program library" -msgstr "プログラムのライブラリ" +msgid "Program Library" +msgstr "" #: cps/templates/stats.html:33 msgid "Installed Version" msgstr "インストールされたバージョン" -#: cps/templates/tasks.html:7 -msgid "Tasks list" -msgstr "タスク一覧" - #: cps/templates/tasks.html:12 msgid "User" msgstr "ユーザ" @@ -2188,12 +2255,12 @@ msgid "Progress" msgstr "進捗" #: cps/templates/tasks.html:17 -msgid "Runtime" -msgstr "実行時間" +msgid "Run Time" +msgstr "" #: cps/templates/tasks.html:18 -msgid "Starttime" -msgstr "開始時間" +msgid "Start Time" +msgstr "" #: cps/templates/tasks.html:24 msgid "Delete finished tasks" @@ -2207,38 +2274,58 @@ msgstr "すべてのタスクを非表示にする" msgid "Reset user Password" msgstr "ユーザパスワードをリセット" -#: cps/templates/user_edit.html:26 -msgid "Kindle E-Mail" -msgstr "Kindleのメールアドレス" - -#: cps/templates/user_edit.html:39 -msgid "Show books with language" -msgstr "この言語で本を表示" - #: cps/templates/user_edit.html:41 -msgid "Show all" -msgstr "全て表示" +msgid "Language of Books" +msgstr "" -#: cps/templates/user_edit.html:51 +#: cps/templates/user_edit.html:43 +msgid "Show All" +msgstr "" + +#: cps/templates/user_edit.html:52 msgid "OAuth Settings" msgstr "" -#: cps/templates/user_edit.html:53 +#: cps/templates/user_edit.html:54 msgid "Link" msgstr "" -#: cps/templates/user_edit.html:55 +#: cps/templates/user_edit.html:56 msgid "Unlink" msgstr "" -#: cps/templates/user_edit.html:123 -msgid "Delete this user" -msgstr "このユーザを削除" +#: cps/templates/user_edit.html:62 +msgid "Kobo Sync Token" +msgstr "" + +#: cps/templates/user_edit.html:64 +msgid "Create/View" +msgstr "" + +#: cps/templates/user_edit.html:83 +msgid "Add allowed/denied Tags" +msgstr "" + +#: cps/templates/user_edit.html:84 +msgid "Add allowed/denied custom column values" +msgstr "" + +#: cps/templates/user_edit.html:129 +msgid "Delete User" +msgstr "" -#: cps/templates/user_edit.html:138 +#: cps/templates/user_edit.html:144 msgid "Recent Downloads" msgstr "最近のダウンロード" +#: cps/templates/user_edit.html:160 +msgid "Generate Kobo Auth URL" +msgstr "" + +#: cps/templates/user_edit.html:176 +msgid "Do you really want to delete the Kobo Token?" +msgstr "" + #~ msgid "Failed to create path for cover %(path)s (Permission denied)." #~ msgstr "" @@ -2404,3 +2491,405 @@ msgstr "最近のダウンロード" #~ msgid "New Books" #~ msgstr "新着本" +#~ msgid "Show Calibre-Web log" +#~ msgstr "" + +#~ msgid "Show access log" +#~ msgstr "" + +#~ msgid "Tags for Mature Content" +#~ msgstr "成人向けのタグ" + +#~ msgid "Show mature content" +#~ msgstr "成人向けコンテンツを表示" + +#~ msgid "deny" +#~ msgstr "" + +#~ msgid "allow" +#~ msgstr "" + +#~ msgid "Kobo Set-up" +#~ msgstr "" + +#~ msgid "Show hot books" +#~ msgstr "人気な本を表示" + +#~ msgid "Best rated Books" +#~ msgstr "高評価の本" + +#~ msgid "Show best rated books" +#~ msgstr "評価が高い本を表示" + +#~ msgid "Best rated books" +#~ msgstr "高評価" + +#~ msgid "Hot Books (most downloaded)" +#~ msgstr "話題(ダウンロード数順)" + +#~ msgid "Publisher list" +#~ msgstr "出版社一覧" + +#~ msgid "Series list" +#~ msgstr "シリーズ一覧" + +#~ msgid "Available languages" +#~ msgstr "言語" + +#~ msgid "Category list" +#~ msgstr "カテゴリ一覧" + +#~ msgid "User list" +#~ msgstr "ユーザ一覧" + +#~ msgid "Nickname" +#~ msgstr "ニックネーム" + +#~ msgid "E-mail" +#~ msgstr "メールアドレス" + +#~ msgid "Kindle" +#~ msgstr "Kindle" + +#~ msgid "DLS" +#~ msgstr "DLS" + +#~ msgid "View Ebooks" +#~ msgstr "" + +#~ msgid "SMTP e-mail server settings" +#~ msgstr "SMTPメールサーバ設定" + +#~ msgid "SMTP hostname" +#~ msgstr "SMTPホスト名" + +#~ msgid "SMTP port" +#~ msgstr "SMTPポート" + +#~ msgid "SSL" +#~ msgstr "SSL" + +#~ msgid "SMTP login" +#~ msgstr "SMTPログイン" + +#~ msgid "From mail" +#~ msgstr "メールから" + +#~ msgid "Calibre DB dir" +#~ msgstr "Calibreデータベースのあるフォルダ" + +#~ msgid "Log level" +#~ msgstr "ログレベル" + +#~ msgid "Books per page" +#~ msgstr "1ページに表示する本の冊数" + +#~ msgid "Uploading" +#~ msgstr "アップロード機能" + +#~ msgid "Anonymous browsing" +#~ msgstr "匿名で閲覧" + +#~ msgid "Public registration" +#~ msgstr "誰でも新規登録可能" + +#~ msgid "Remote login" +#~ msgstr "リモートログイン" + +#~ msgid "Reverse proxy login" +#~ msgstr "" + +#~ msgid "View Logfiles" +#~ msgstr "" + +#~ msgid "Reconnect to Calibre DB" +#~ msgstr "Calibreデータベースに再接続" + +#~ msgid "Restart Calibre-Web" +#~ msgstr "Calibre-Webを再起動" + +#~ msgid "Stop Calibre-Web" +#~ msgstr "Calibre-Webを停止" + +#~ msgid "Check for update" +#~ msgstr "更新を確認" + +#~ msgid "Do you really want to restart Calibre-Web?" +#~ msgstr "Calibre-Webを再起動します。よろしいですか?" + +#~ msgid "Ok" +#~ msgstr "はい" + +#~ msgid "Do you really want to stop Calibre-Web?" +#~ msgstr "Calibre-Webを停止します。よろしいですか?" + +#~ msgid "Updating, please do not reload page" +#~ msgstr "更新中です。ページ再読み込みしないでください" + +#~ msgid "Series id" +#~ msgstr "シリーズID" + +#~ msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +#~ msgstr "カバー画像のURL (カバー画像はjpg形式でダウンロードしてデータベースに保存され、ここは再度空欄になります)" + +#~ msgid "Upload Cover from local drive" +#~ msgstr "カバー画像をローカルからアップロード" + +#~ msgid "Publishing date" +#~ msgstr "発行日" + +#~ msgid "Upload format" +#~ msgstr "アップロードする形式" + +#~ msgid "view book after edit" +#~ msgstr "編集後に本を表示" + +#~ msgid "Get metadata" +#~ msgstr "メタデータを取得" + +#~ msgid "Submit" +#~ msgstr "決定" + +#~ msgid "Book will be deleted from Calibre database" +#~ msgstr "この本はCalibreデータベースから削除されます" + +#~ msgid "and from hard disk" +#~ msgstr "" + +#~ msgid "Go!" +#~ msgstr "決定" + +#~ msgid "Location of Calibre database" +#~ msgstr "Calibreデータベースの場所" + +#~ msgid "Update channel" +#~ msgstr "チャンネルを更新" + +#~ msgid "Enable uploading" +#~ msgstr "アップロードを有効にする" + +#~ msgid "Enable anonymous browsing" +#~ msgstr "匿名での閲覧を有効にする" + +#~ msgid "Enable public registration" +#~ msgstr "誰でも新規登録を可能にする" + +#~ msgid "Enable remote login (\"magic link\")" +#~ msgstr "リモートログインを有効する (\"マジックリンク\")" + +#~ msgid "Obtain an API Key" +#~ msgstr "APIキーを取得" + +#~ msgid "Use standard Authentication" +#~ msgstr "" + +#~ msgid "LDAP schema (ldap or ldaps)" +#~ msgstr "" + +#~ msgid "LDAP Admin username" +#~ msgstr "" + +#~ msgid "LDAP Admin password" +#~ msgstr "" + +#~ msgid "LDAP Server use SSL" +#~ msgstr "" + +#~ msgid "LDAP Server use TLS" +#~ msgstr "" + +#~ msgid "LDAP User object filter" +#~ msgstr "" + +#~ msgid "No converter" +#~ msgstr "変換ソフトなし" + +#~ msgid "No. of random books to show" +#~ msgstr "ランダムで表示する本の冊数" + +#~ msgid "No. of authors to show before hiding (0=disable hiding)" +#~ msgstr "非表示にする前に表示する著者の人数 (0の場合は常に表示)" + +#~ msgid "Regular expression for ignoring columns" +#~ msgstr "本を非表示にする際の正規表現" + +#~ msgid "Link read/unread status to Calibre column" +#~ msgstr "Calibre上のデータと既読/未読のステータスを紐付ける" + +#~ msgid "View restriction based on Calibre column" +#~ msgstr "" + +#~ msgid "Regular expression for title sorting" +#~ msgstr "タイトルでソートする際の正規表現" + +#~ msgid "Default settings for new users" +#~ msgstr "新規ユーザのデフォルト設定" + +#~ msgid "Admin user" +#~ msgstr "管理者ユーザ" + +#~ msgid "Allow book viewer" +#~ msgstr "" + +#~ msgid "Allow Delete books" +#~ msgstr "本の削除を許可" + +#~ msgid "Default visibilities for new users" +#~ msgstr "新規ユーザのデフォルト表示設定" + +#~ msgid "Show random books in detail view" +#~ msgstr "詳細画面でランダムで本を表示" + +#~ msgid "Read in browser" +#~ msgstr "ブラウザで読む" + +#~ msgid "Listen in browser" +#~ msgstr "" + +#~ msgid "language" +#~ msgstr "言語" + +#~ msgid "Edit metadata" +#~ msgstr "メタデータを編集" + +#~ msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" +#~ msgstr "SMTPポート (多くの場合plain SMTPは25、SSLは465、STARTTLSは587)" + +#~ msgid "SMTP password" +#~ msgstr "SMTPパスワード" + +#~ msgid "From e-mail" +#~ msgstr "メールから" + +#~ msgid "Save settings" +#~ msgstr "設定を保存" + +#~ msgid "Save settings and send Test E-Mail" +#~ msgstr "設定を保存してテストメールを送信する" + +#~ msgid "Allowed domains for registering" +#~ msgstr "登録を許可されたドメイン" + +#~ msgid "Denied domains for registering" +#~ msgstr "" + +#~ msgid "Do you really want to delete this domain rule?" +#~ msgstr "このドメインルールを削除してもよろしいですか?" + +#~ msgid "api_endpoint=" +#~ msgstr "" + +#~ msgid "Create issue" +#~ msgstr "" + +#~ msgid "Back to home" +#~ msgstr "ホームに戻る" + +#~ msgid "Toggle navigation" +#~ msgstr "ナビゲーション" + +#~ msgid "please don't refresh the page" +#~ msgstr "ページを更新しないでください" + +#~ msgid "Remember me" +#~ msgstr "記憶する" + +#~ msgid "Forgot password" +#~ msgstr "" + +#~ msgid "Log in with magic link" +#~ msgstr "マジックリンクでログイン" + +#~ msgid "Show Calibre-Web log: " +#~ msgstr "" + +#~ msgid "Calibre-Web log: " +#~ msgstr "" + +#~ msgid "Show access log: " +#~ msgstr "" + +#~ msgid "Calibre-Web ebook catalog" +#~ msgstr "Calibre-Web 電子書籍カタログ" + +#~ msgid "Register a new account" +#~ msgstr "新規アカウントを登録する" + +#~ msgid "E-mail address" +#~ msgstr "メールアドレス" + +#~ msgid "Use your other device, login and visit " +#~ msgstr "" + +#~ msgid "Once you do so, you will automatically get logged in on this device." +#~ msgstr "一度実行すれば、自動的にこの端末でログインします" + +#~ msgid "The link will expire after 10 minutes." +#~ msgstr "" + +#~ msgid "No Results for:" +#~ msgstr "結果なし:" + +#~ msgid "Please try a different search" +#~ msgstr "他の検索を試してくだい" + +#~ msgid "Publishing date from" +#~ msgstr "これ以前の出版日:" + +#~ msgid "Publishing date to" +#~ msgstr "これ以降の出版日:" + +#~ msgid "Rating bigger than" +#~ msgstr "これ以上の評価:" + +#~ msgid "Rating less than" +#~ msgstr "これ未満の評価:" + +#~ msgid "Do you really want to delete the shelf?" +#~ msgstr "この本棚を削除してもよろしいですか?" + +#~ msgid "Shelf will be lost for everybody and forever!" +#~ msgstr "この本棚は誰にも見えなくなり、完全に消滅します" + +#~ msgid "should the shelf be public?" +#~ msgstr "この本棚を他の人にも表示しますか?" + +#~ msgid "Drag 'n drop to rearrange order" +#~ msgstr "ドラッグ&ドロップで並び替える" + +#~ msgid "Calibre library statistics" +#~ msgstr "Calibreライブラリの統計" + +#~ msgid "Linked libraries" +#~ msgstr "紐付けられたライブラリ" + +#~ msgid "Program library" +#~ msgstr "プログラムのライブラリ" + +#~ msgid "Tasks list" +#~ msgstr "タスク一覧" + +#~ msgid "Runtime" +#~ msgstr "実行時間" + +#~ msgid "Starttime" +#~ msgstr "開始時間" + +#~ msgid "Kindle E-Mail" +#~ msgstr "Kindleのメールアドレス" + +#~ msgid "Show books with language" +#~ msgstr "この言語で本を表示" + +#~ msgid "Show all" +#~ msgstr "全て表示" + +#~ msgid "Delete this user" +#~ msgstr "このユーザを削除" + +#~ msgid "Please note that every visit to this current page invalidates any previously generated Authentication url for this user." +#~ msgstr "" + +#~ msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" +#~ msgstr "" + diff --git a/cps/translations/km/LC_MESSAGES/messages.mo b/cps/translations/km/LC_MESSAGES/messages.mo index 90335407..2a6d0875 100644 Binary files a/cps/translations/km/LC_MESSAGES/messages.mo and b/cps/translations/km/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/km/LC_MESSAGES/messages.po b/cps/translations/km/LC_MESSAGES/messages.po index 2eb14fa0..fe34fa40 100644 --- a/cps/translations/km/LC_MESSAGES/messages.po +++ b/cps/translations/km/LC_MESSAGES/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2020-01-12 13:57+0100\n" +"POT-Creation-Date: 2020-03-12 20:31+0100\n" "PO-Revision-Date: 2018-08-27 17:06+0700\n" "Last-Translator: \n" "Language: km_KH\n" @@ -17,7 +17,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.7.0\n" +"Generated-By: Babel 2.8.0\n" #: cps/about.py:42 msgid "installed" @@ -27,7 +27,7 @@ msgstr "" msgid "not installed" msgstr "មិនបានតម្លើង" -#: cps/about.py:84 +#: cps/about.py:87 msgid "Statistics" msgstr "ស្ថិតិ" @@ -41,7 +41,7 @@ msgstr "កំពុងបិទម៉ាស៊ីន server សូមបិទ #: cps/admin.py:110 cps/editbooks.py:410 cps/editbooks.py:419 #: cps/editbooks.py:539 cps/editbooks.py:541 cps/editbooks.py:594 -#: cps/updater.py:446 cps/uploader.py:97 cps/uploader.py:108 +#: cps/updater.py:456 cps/uploader.py:96 cps/uploader.py:107 msgid "Unknown" msgstr "មិនដឹង" @@ -49,155 +49,164 @@ msgstr "មិនដឹង" msgid "Admin page" msgstr "ទំព័ររដ្ឋបាល" -#: cps/admin.py:148 cps/templates/admin.html:115 +#: cps/admin.py:151 msgid "UI Configuration" msgstr "ការកំណត់ផ្ទាំងប្រើប្រាស់" -#: cps/admin.py:185 cps/admin.py:412 +#: cps/admin.py:187 cps/admin.py:637 msgid "Calibre-Web configuration updated" msgstr "" -#: cps/admin.py:442 cps/templates/admin.html:114 +#: cps/admin.py:434 cps/admin.py:440 cps/admin.py:451 cps/admin.py:462 +#: cps/templates/modal_restriction.html:29 +msgid "Deny" +msgstr "" + +#: cps/admin.py:436 cps/admin.py:442 cps/admin.py:453 cps/admin.py:464 +#: cps/templates/modal_restriction.html:28 +msgid "Allow" +msgstr "" + +#: cps/admin.py:667 msgid "Basic Configuration" msgstr "ការកំណត់សាមញ្ញ" -#: cps/admin.py:465 cps/web.py:1093 +#: cps/admin.py:691 cps/web.py:1089 msgid "Please fill out all fields!" msgstr "សូមបំពេញចន្លោះទាំងអស់!" -#: cps/admin.py:467 cps/admin.py:478 cps/admin.py:484 cps/admin.py:499 -#: cps/templates/admin.html:38 +#: cps/admin.py:694 cps/admin.py:706 cps/admin.py:712 cps/admin.py:730 msgid "Add new user" msgstr "បន្ថែមអ្នកប្រើប្រាស់ថ្មី" -#: cps/admin.py:476 cps/web.py:1318 +#: cps/admin.py:703 cps/web.py:1318 msgid "E-mail is not from valid domain" msgstr "" -#: cps/admin.py:482 cps/admin.py:493 +#: cps/admin.py:710 cps/admin.py:725 msgid "Found an existing account for this e-mail address or nickname." msgstr "" -#: cps/admin.py:489 +#: cps/admin.py:721 #, python-format msgid "User '%(user)s' created" msgstr "បានបង្កើតអ្នកប្រើប្រាស់ ‘%(user)s’" -#: cps/admin.py:509 +#: cps/admin.py:740 msgid "Edit e-mail server settings" msgstr "" -#: cps/admin.py:535 +#: cps/admin.py:766 #, python-format msgid "Test e-mail successfully send to %(kindlemail)s" msgstr "" -#: cps/admin.py:538 +#: cps/admin.py:769 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "" -#: cps/admin.py:540 +#: cps/admin.py:771 msgid "Please configure your e-mail address first..." msgstr "" -#: cps/admin.py:542 +#: cps/admin.py:773 msgid "E-mail server settings updated" msgstr "" -#: cps/admin.py:571 +#: cps/admin.py:803 #, python-format msgid "User '%(nick)s' deleted" msgstr "អ្នកប្រើប្រាស់ ‘%(nick)s’ ត្រូវបានលុប" -#: cps/admin.py:574 +#: cps/admin.py:806 msgid "No admin user remaining, can't delete user" msgstr "" -#: cps/admin.py:612 cps/web.py:1359 +#: cps/admin.py:842 cps/web.py:1361 msgid "Found an existing account for this e-mail address." msgstr "" -#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1334 +#: cps/admin.py:852 cps/admin.py:867 cps/admin.py:887 cps/web.py:1336 #, python-format msgid "Edit User %(nick)s" msgstr "កែប្រែអ្នកប្រើប្រាស់ %(nick)s" -#: cps/admin.py:622 cps/web.py:1327 +#: cps/admin.py:858 cps/web.py:1328 msgid "This username is already taken" msgstr "" -#: cps/admin.py:637 +#: cps/admin.py:874 #, python-format msgid "User '%(nick)s' updated" msgstr "អ្នកប្រើប្រាស់ ‘%(nick)s’ ត្រូវបានកែប្រែ" -#: cps/admin.py:640 +#: cps/admin.py:877 msgid "An unknown error occured." msgstr "បញ្ហាដែលមិនដឹងបានកើតឡើង។" -#: cps/admin.py:657 +#: cps/admin.py:900 #, python-format msgid "Password for user %(user)s reset" msgstr "" -#: cps/admin.py:660 cps/web.py:1118 cps/web.py:1174 +#: cps/admin.py:903 cps/web.py:1114 cps/web.py:1170 msgid "An unknown error occurred. Please try again later." msgstr "" -#: cps/admin.py:663 cps/web.py:1062 +#: cps/admin.py:906 cps/web.py:1055 msgid "Please configure the SMTP mail settings first..." msgstr "សូមកំណត់អ៊ីមែល SMTP ជាមុនសិន" -#: cps/admin.py:674 +#: cps/admin.py:918 msgid "Logfile viewer" msgstr "" -#: cps/admin.py:710 +#: cps/admin.py:957 msgid "Requesting update package" msgstr "កំពុងស្នើសុំឯកសារបច្ចុប្បន្នភាព" -#: cps/admin.py:711 +#: cps/admin.py:958 msgid "Downloading update package" msgstr "កំពុងទាញយកឯកសារបច្ចុប្បន្នភាព" -#: cps/admin.py:712 +#: cps/admin.py:959 msgid "Unzipping update package" msgstr "កំពុងពន្លាឯកសារបច្ចុប្បន្នភាព" -#: cps/admin.py:713 +#: cps/admin.py:960 msgid "Replacing files" msgstr "" -#: cps/admin.py:714 +#: cps/admin.py:961 msgid "Database connections are closed" msgstr "ទំនាក់ទំនងទៅមូលដ្ឋានទិន្នន័យត្រូវបានផ្តាច់" -#: cps/admin.py:715 +#: cps/admin.py:962 msgid "Stopping server" msgstr "" -#: cps/admin.py:716 +#: cps/admin.py:963 msgid "Update finished, please press okay and reload page" msgstr "ការធ្វើបច្ចុប្បន្នភាពបានបញ្ចប់ សូមចុច okay រួចបើកទំព័រជាថ្មី" -#: cps/admin.py:717 cps/admin.py:718 cps/admin.py:719 cps/admin.py:720 +#: cps/admin.py:964 cps/admin.py:965 cps/admin.py:966 cps/admin.py:967 msgid "Update failed:" msgstr "" -#: cps/admin.py:717 cps/updater.py:272 cps/updater.py:457 cps/updater.py:459 +#: cps/admin.py:964 cps/updater.py:282 cps/updater.py:467 cps/updater.py:469 msgid "HTTP Error" msgstr "" -#: cps/admin.py:718 cps/updater.py:274 cps/updater.py:461 +#: cps/admin.py:965 cps/updater.py:284 cps/updater.py:471 msgid "Connection error" msgstr "" -#: cps/admin.py:719 cps/updater.py:276 cps/updater.py:463 +#: cps/admin.py:966 cps/updater.py:286 cps/updater.py:473 msgid "Timeout while establishing connection" msgstr "" -#: cps/admin.py:720 cps/updater.py:278 cps/updater.py:465 +#: cps/admin.py:967 cps/updater.py:288 cps/updater.py:475 msgid "General error" msgstr "" @@ -237,10 +246,6 @@ msgstr "មិនអាចរក្សាទុកឯកសារ %(file)s ។" msgid "File format %(ext)s added to %(book)s" msgstr "ឯកសារទម្រង់ %(ext)s ត្រូវបានបន្ថែមទៅ %(book)s" -#: cps/editbooks.py:376 -msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" -msgstr "" - #: cps/editbooks.py:451 msgid "Cover is not a jpg file, can't save" msgstr "" @@ -277,30 +282,30 @@ msgstr "មិនអាចរក្សាទុកឯកសារ %(file)s (ម msgid "Failed to delete file %(file)s (Permission denied)." msgstr "មិនអាចលុបឯកសារ %(file)s (មិនមានសិទ្ធិ)។" -#: cps/editbooks.py:710 +#: cps/editbooks.py:709 #, python-format msgid "File %(file)s uploaded" msgstr "" -#: cps/editbooks.py:739 +#: cps/editbooks.py:738 msgid "Source or destination format for conversion missing" msgstr "" -#: cps/editbooks.py:747 +#: cps/editbooks.py:746 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "" -#: cps/editbooks.py:751 +#: cps/editbooks.py:750 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "" -#: cps/gdrive.py:62 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgstr "" -#: cps/gdrive.py:104 +#: cps/gdrive.py:103 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Callback domain មិនទាន់បានផ្ទៀងផ្ទាត់ឲប្រើទេ សូមធ្វើតាមជំហានដើម្បីផ្ទៀងផ្ទាត់ domain នៅក្នុង Google Developer Console" @@ -390,83 +395,111 @@ msgstr "ឯកសារ %(file)s រកមិនឃើញក្នុង Google msgid "Book path %(path)s not found on Google Drive" msgstr "ទីតាំងសៀវភៅ %(path)s រកមិនឃើញក្នុង Google Drive" -#: cps/helper.py:643 +#: cps/helper.py:511 +msgid "Failed to create path for cover" +msgstr "" + +#: cps/helper.py:516 +msgid "Cover-file is not a valid image file" +msgstr "" + +#: cps/helper.py:519 +msgid "Failed to store cover-file" +msgstr "" + +#: cps/helper.py:530 +msgid "Only jpg/jpeg/png/webp files are supported as coverfile" +msgstr "" + +#: cps/helper.py:544 +msgid "Only jpg/jpeg files are supported as coverfile" +msgstr "" + +#: cps/helper.py:658 msgid "Waiting" msgstr "កំពុងរង់ចាំ" -#: cps/helper.py:645 +#: cps/helper.py:660 msgid "Failed" msgstr "បានបរាជ័យ" -#: cps/helper.py:647 +#: cps/helper.py:662 msgid "Started" msgstr "បានចាប់ផ្តើម" -#: cps/helper.py:649 +#: cps/helper.py:664 msgid "Finished" msgstr "បានបញ្ចប់" -#: cps/helper.py:651 +#: cps/helper.py:666 msgid "Unknown Status" msgstr "" -#: cps/helper.py:656 +#: cps/helper.py:671 msgid "E-mail: " msgstr "" -#: cps/helper.py:658 cps/helper.py:662 +#: cps/helper.py:673 cps/helper.py:677 msgid "Convert: " msgstr "" -#: cps/helper.py:660 +#: cps/helper.py:675 msgid "Upload: " msgstr "" -#: cps/helper.py:664 +#: cps/helper.py:679 msgid "Unknown Task: " msgstr "" -#: cps/oauth_bb.py:75 +#: cps/kobo_auth.py:127 +msgid "PLease access calibre-web from non localhost to get valid api_endpoint for kobo device" +msgstr "" + +#: cps/kobo_auth.py:130 cps/kobo_auth.py:150 +msgid "Kobo Setup" +msgstr "" + +#: cps/oauth_bb.py:74 #, python-format msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:154 msgid "Failed to log in with GitHub." msgstr "" -#: cps/oauth_bb.py:160 +#: cps/oauth_bb.py:159 msgid "Failed to fetch user info from GitHub." msgstr "" -#: cps/oauth_bb.py:171 +#: cps/oauth_bb.py:170 msgid "Failed to log in with Google." msgstr "" -#: cps/oauth_bb.py:176 +#: cps/oauth_bb.py:175 msgid "Failed to fetch user info from Google." msgstr "" -#: cps/oauth_bb.py:274 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s success." msgstr "" -#: cps/oauth_bb.py:278 +#: cps/oauth_bb.py:277 #, python-format msgid "Unlink to %(oauth)s failed." msgstr "" -#: cps/oauth_bb.py:281 +#: cps/oauth_bb.py:280 #, python-format msgid "Not linked to %(oauth)s." msgstr "" -#: cps/oauth_bb.py:309 +#: cps/oauth_bb.py:308 msgid "GitHub Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:328 +#: cps/oauth_bb.py:327 msgid "Google Oauth error, please retry later." msgstr "" @@ -517,403 +550,393 @@ msgstr "" msgid "Could not add books to shelf: %(sname)s" msgstr "" -#: cps/shelf.py:180 +#: cps/shelf.py:181 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "សៀវភៅត្រូវបានដកចេញពីធ្នើ៖ %(sname)s" -#: cps/shelf.py:186 +#: cps/shelf.py:190 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "សូមអភ័យទោស អ្នកមិនមានសិទ្ធិដកសៀវភៅចេញពីធ្នើនេះទេ៖ %(sname)s" -#: cps/shelf.py:207 cps/shelf.py:231 +#: cps/shelf.py:211 cps/shelf.py:235 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "មានធ្នើដែលមានឈ្មោះ ‘%(title)s’ រួចហើយ។" -#: cps/shelf.py:212 +#: cps/shelf.py:216 #, python-format msgid "Shelf %(title)s created" msgstr "ធ្នើឈ្មោះ %(title)s ត្រូវបានបង្កើត" -#: cps/shelf.py:214 cps/shelf.py:242 +#: cps/shelf.py:218 cps/shelf.py:246 msgid "There was an error" msgstr "មានបញ្ហា" -#: cps/shelf.py:215 cps/shelf.py:217 +#: cps/shelf.py:219 cps/shelf.py:221 msgid "create a shelf" msgstr "បង្កើតធ្នើ" -#: cps/shelf.py:240 +#: cps/shelf.py:244 #, python-format msgid "Shelf %(title)s changed" msgstr "ធ្នើឈ្មោះ %(title)s ត្រូវបានប្តូរ" -#: cps/shelf.py:243 cps/shelf.py:245 +#: cps/shelf.py:247 cps/shelf.py:249 msgid "Edit a shelf" msgstr "កែប្រែធ្នើ" -#: cps/shelf.py:289 +#: cps/shelf.py:301 #, python-format msgid "Shelf: '%(name)s'" msgstr "ធ្នើ៖ ‘%(name)s’" -#: cps/shelf.py:292 +#: cps/shelf.py:304 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "មានបញ្ហាពេលបើកធ្នើ។ ពុំមានធ្នើ ឬមិនអាចបើកបាន" -#: cps/shelf.py:323 +#: cps/shelf.py:342 +msgid "Hidden Book" +msgstr "" + +#: cps/shelf.py:347 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "ប្តូរលំដាប់ធ្នើ៖ ‘%(name)s’" -#: cps/ub.py:57 +#: cps/ub.py:56 msgid "Recently Added" msgstr "ទើបបន្ថែមថ្មីៗ" -#: cps/ub.py:59 +#: cps/ub.py:58 msgid "Show recent books" msgstr "បង្ហាញសៀវភៅមកថ្មី" -#: cps/templates/index.xml:17 cps/ub.py:60 +#: cps/templates/index.xml:17 cps/ub.py:59 msgid "Hot Books" msgstr "សៀវភៅដែលមានប្រជាប្រិយភាព" -#: cps/ub.py:61 -msgid "Show hot books" +#: cps/ub.py:60 +msgid "Show Hot Books" msgstr "បង្ហាញសៀវភៅដែលមានប្រជាប្រិយភាព" -#: cps/templates/index.xml:24 cps/ub.py:64 -msgid "Best rated Books" +#: cps/templates/index.xml:24 cps/ub.py:63 cps/web.py:508 +msgid "Top Rated Books" msgstr "សៀវភៅដែលមានការវាយតម្លៃល្អជាងគេ" -#: cps/ub.py:66 -msgid "Show best rated books" +#: cps/ub.py:65 +msgid "Show Top Rated Books" msgstr "បង្ហាញសៀវភៅដែលមានការវាយតម្លៃល្អជាងគេ" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67 -#: cps/web.py:1011 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:66 +#: cps/web.py:1005 msgid "Read Books" msgstr "សៀវភៅដែលបានអានរួច" -#: cps/ub.py:69 +#: cps/ub.py:68 msgid "Show read and unread" msgstr "បង្ហាញអានរួច និងមិនទាន់អាន" -#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71 -#: cps/web.py:1015 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:70 +#: cps/web.py:1009 msgid "Unread Books" msgstr "សៀវភៅដែលមិនទាន់បានអាន" -#: cps/ub.py:73 +#: cps/ub.py:72 msgid "Show unread" msgstr "" -#: cps/ub.py:74 +#: cps/ub.py:73 msgid "Discover" msgstr "ស្រាវជ្រាវ" -#: cps/ub.py:76 +#: cps/ub.py:75 msgid "Show random books" msgstr "បង្ហាញសៀវភៅចៃដន្យ" -#: cps/templates/index.xml:75 cps/ub.py:77 +#: cps/templates/index.xml:75 cps/ub.py:76 cps/web.py:787 msgid "Categories" msgstr "ប្រភេទនានា" -#: cps/ub.py:79 +#: cps/ub.py:78 msgid "Show category selection" msgstr "បង្ហាញជម្រើសប្រភេទ" -#: cps/templates/book_edit.html:71 cps/templates/index.xml:82 -#: cps/templates/search_form.html:53 cps/ub.py:80 +#: cps/templates/book_edit.html:69 cps/templates/index.xml:82 +#: cps/templates/search_form.html:53 cps/ub.py:79 cps/web.py:715 msgid "Series" msgstr "ស៊េរី" -#: cps/ub.py:82 +#: cps/ub.py:81 msgid "Show series selection" msgstr "បង្ហាញជម្រើសស៊េរី" -#: cps/templates/index.xml:61 cps/ub.py:83 +#: cps/templates/index.xml:61 cps/ub.py:82 msgid "Authors" msgstr "អ្នកនិពន្ធ" -#: cps/ub.py:85 +#: cps/ub.py:84 msgid "Show author selection" msgstr "បង្ហាញជម្រើសអ្នកនិពន្ធ" -#: cps/templates/index.xml:68 cps/ub.py:87 +#: cps/templates/index.xml:68 cps/ub.py:86 cps/web.py:699 msgid "Publishers" msgstr "" -#: cps/ub.py:89 +#: cps/ub.py:88 msgid "Show publisher selection" msgstr "" -#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:90 +#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:89 +#: cps/web.py:770 msgid "Languages" msgstr "ភាសានានា" -#: cps/ub.py:93 +#: cps/ub.py:92 msgid "Show language selection" msgstr "បង្ហាញផ្នែកភាសា" -#: cps/ub.py:94 +#: cps/templates/index.xml:96 cps/ub.py:93 msgid "Ratings" msgstr "" -#: cps/ub.py:96 +#: cps/ub.py:95 msgid "Show ratings selection" msgstr "" -#: cps/templates/index.xml:96 cps/ub.py:97 +#: cps/templates/index.xml:104 cps/ub.py:96 msgid "File formats" msgstr "" -#: cps/ub.py:99 +#: cps/ub.py:98 msgid "Show file formats selection" msgstr "" -#: cps/updater.py:252 cps/updater.py:359 cps/updater.py:372 +#: cps/updater.py:262 cps/updater.py:369 cps/updater.py:382 msgid "Unexpected data while reading update information" msgstr "" -#: cps/updater.py:259 cps/updater.py:365 +#: cps/updater.py:269 cps/updater.py:375 msgid "No update available. You already have the latest version installed" msgstr "" -#: cps/updater.py:285 +#: cps/updater.py:295 msgid "A new update is available. Click on the button below to update to the latest version." msgstr "" -#: cps/updater.py:338 +#: cps/updater.py:348 msgid "Could not fetch update information" msgstr "" -#: cps/updater.py:352 +#: cps/updater.py:362 msgid "No release information available" msgstr "" -#: cps/updater.py:405 cps/updater.py:414 +#: cps/updater.py:415 cps/updater.py:424 #, python-format msgid "A new update is available. Click on the button below to update to version: %(version)s" msgstr "" -#: cps/updater.py:424 +#: cps/updater.py:434 msgid "Click on the button below to update to the latest stable version." msgstr "" -#: cps/web.py:486 +#: cps/web.py:480 msgid "Recently Added Books" msgstr "សៀវភៅដែលទើបបានបន្ថែម" -#: cps/web.py:514 -msgid "Best rated books" -msgstr "សៀវភៅដែលត្រូវបានវាយតម្លៃល្អជាងគេ" - -#: cps/templates/index.xml:38 cps/web.py:522 -msgid "Random Books" -msgstr "សៀវភៅចៃដន្យ" +#: cps/templates/index.html:5 cps/web.py:516 +msgid "Discover (Random Books)" +msgstr "ស្រាវជ្រាវ (សៀវភៅចៃដន្យ)" -#: cps/web.py:548 +#: cps/web.py:542 msgid "Books" msgstr "" -#: cps/web.py:575 -msgid "Hot Books (most downloaded)" +#: cps/web.py:569 +msgid "Hot Books (Most Downloaded)" msgstr "សៀវភៅដែលត្រូវបានទាញយកច្រើនជាងគេ" -#: cps/web.py:586 cps/web.py:1382 cps/web.py:1478 -msgid "Error opening eBook. File does not exist or file is not accessible:" -msgstr "មានបញ្ហាពេលបើកឯកសារ eBook ។ មិនមានឯកសារនេះ ឬមិនអាចបើកបាន៖" +#: cps/web.py:580 +msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" +msgstr "" -#: cps/web.py:599 +#: cps/web.py:593 #, python-format msgid "Author: %(name)s" msgstr "" -#: cps/web.py:611 +#: cps/web.py:605 #, python-format msgid "Publisher: %(name)s" msgstr "" -#: cps/web.py:622 +#: cps/web.py:616 #, python-format msgid "Series: %(serie)s" msgstr "ស៊េរី៖ %(serie)s" -#: cps/web.py:633 +#: cps/web.py:627 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:644 +#: cps/web.py:638 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:656 +#: cps/web.py:650 #, python-format msgid "Category: %(name)s" msgstr "ប្រភេទ៖ %(name)s" -#: cps/web.py:673 +#: cps/web.py:667 #, python-format msgid "Language: %(name)s" msgstr "ភាសា៖ %(name)s" -#: cps/web.py:705 -msgid "Publisher list" -msgstr "" - -#: cps/web.py:721 -msgid "Series list" -msgstr "បញ្ជីស៊េរី" - -#: cps/web.py:735 +#: cps/web.py:729 msgid "Ratings list" msgstr "" -#: cps/web.py:748 +#: cps/web.py:742 msgid "File formats list" msgstr "" -#: cps/web.py:776 -msgid "Available languages" -msgstr "ភាសាដែលមាន" - -#: cps/web.py:793 -msgid "Category list" -msgstr "បញ្ជីប្រភេទ" - -#: cps/templates/layout.html:73 cps/web.py:807 +#: cps/templates/layout.html:73 cps/templates/tasks.html:7 cps/web.py:801 msgid "Tasks" msgstr "កិច្ចការនានា" -#: cps/templates/feed.xml:33 cps/templates/layout.html:44 -#: cps/templates/layout.html:45 cps/web.py:829 cps/web.py:831 +#: cps/templates/book_edit.html:212 cps/templates/feed.xml:33 +#: cps/templates/layout.html:44 cps/templates/layout.html:47 +#: cps/templates/search_form.html:170 cps/web.py:821 cps/web.py:823 msgid "Search" msgstr "ស្វែងរក" -#: cps/web.py:881 +#: cps/web.py:873 msgid "Published after " msgstr "បានបោះពុម្ភក្រោយ " -#: cps/web.py:888 +#: cps/web.py:880 msgid "Published before " msgstr "បានបោះពុម្ភមុន " -#: cps/web.py:902 +#: cps/web.py:894 #, python-format msgid "Rating <= %(rating)s" msgstr "ការវាយតម្លៃ <= %(rating)s" -#: cps/web.py:904 +#: cps/web.py:896 #, python-format msgid "Rating >= %(rating)s" msgstr "ការវាយតម្លៃ >= %(rating)s" -#: cps/web.py:970 cps/web.py:982 +#: cps/web.py:962 cps/web.py:976 msgid "search" msgstr "ស្វែងរក" -#: cps/web.py:1067 +#: cps/web.py:1060 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "សៀវភៅបានចូលជួរសម្រាប់ផ្ញើទៅ %(kindlemail)s ដោយជោគជ័យ" -#: cps/web.py:1071 +#: cps/web.py:1064 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "មានបញ្ហានៅពេលផ្ញើសៀវភៅនេះ៖ %(res)s" -#: cps/web.py:1073 +#: cps/web.py:1066 msgid "Please configure your kindle e-mail address first..." msgstr "" -#: cps/web.py:1087 +#: cps/web.py:1083 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "" -#: cps/web.py:1088 cps/web.py:1094 cps/web.py:1119 cps/web.py:1123 -#: cps/web.py:1128 cps/web.py:1132 +#: cps/web.py:1084 cps/web.py:1090 cps/web.py:1115 cps/web.py:1119 +#: cps/web.py:1124 cps/web.py:1128 msgid "register" msgstr "ចុះឈ្មោះ" -#: cps/web.py:1121 +#: cps/web.py:1117 msgid "Your e-mail is not allowed to register" msgstr "" -#: cps/web.py:1124 +#: cps/web.py:1120 msgid "Confirmation e-mail was send to your e-mail account." msgstr "" -#: cps/web.py:1127 +#: cps/web.py:1123 msgid "This username or e-mail address is already in use." msgstr "" -#: cps/web.py:1144 +#: cps/web.py:1140 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1154 cps/web.py:1281 +#: cps/web.py:1150 cps/web.py:1277 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "ឥឡូវអ្នកបានចូលដោយមានឈ្មោះថា៖ ‘%(nickname)s’" -#: cps/web.py:1159 +#: cps/web.py:1155 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "" -#: cps/web.py:1163 cps/web.py:1186 +#: cps/web.py:1159 cps/web.py:1182 msgid "Wrong Username or Password" msgstr "ខុសឈ្មោះអ្នកប្រើប្រាស់ ឬលេខសម្ងាត់" -#: cps/web.py:1170 +#: cps/web.py:1166 msgid "New Password was send to your email address" msgstr "" -#: cps/web.py:1176 +#: cps/web.py:1172 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1182 +#: cps/web.py:1178 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1189 cps/web.py:1213 +#: cps/web.py:1185 cps/web.py:1209 msgid "login" msgstr "ចូលប្រើ" -#: cps/web.py:1225 cps/web.py:1259 +#: cps/web.py:1221 cps/web.py:1255 msgid "Token not found" msgstr "រកមិនឃើញវត្ថុតាង" -#: cps/web.py:1234 cps/web.py:1267 +#: cps/web.py:1230 cps/web.py:1263 msgid "Token has expired" msgstr "វត្ថុតាងហួសពេលកំណត់" -#: cps/web.py:1243 +#: cps/web.py:1239 msgid "Success! Please return to your device" msgstr "ជោគជ័យ! សូមវិលមកឧបករណ៍អ្នកវិញ" -#: cps/web.py:1320 cps/web.py:1363 cps/web.py:1369 +#: cps/web.py:1320 cps/web.py:1365 cps/web.py:1371 #, python-format msgid "%(name)s's profile" msgstr "ព័ត៌មានសង្ខេបរបស់ %(name)s" -#: cps/web.py:1365 +#: cps/web.py:1367 msgid "Profile updated" msgstr "ព័ត៌មានសង្ខេបបានកែប្រែ" -#: cps/web.py:1394 cps/web.py:1397 cps/web.py:1400 cps/web.py:1407 -#: cps/web.py:1412 +#: cps/web.py:1384 cps/web.py:1480 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "មានបញ្ហាពេលបើកឯកសារ eBook ។ មិនមានឯកសារនេះ ឬមិនអាចបើកបាន៖" + +#: cps/web.py:1396 cps/web.py:1399 cps/web.py:1402 cps/web.py:1409 +#: cps/web.py:1414 msgid "Read a Book" msgstr "អានសៀវភៅ" -#: cps/web.py:1423 +#: cps/web.py:1425 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "" @@ -928,23 +951,26 @@ msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Kindlegen បានបរាជ័យដោយមានកំហុស %(error)s. សារ៖ %(message)s" #: cps/templates/admin.html:9 -msgid "User list" +msgid "Users" msgstr "បញ្ជីអ្នកប្រើប្រាស់" -#: cps/templates/admin.html:12 -msgid "Nickname" +#: cps/templates/admin.html:12 cps/templates/login.html:8 +#: cps/templates/login.html:9 cps/templates/register.html:7 +#: cps/templates/user_edit.html:8 +msgid "Username" msgstr "ឈ្មោះហៅក្រៅ" -#: cps/templates/admin.html:13 -msgid "E-mail" +#: cps/templates/admin.html:13 cps/templates/register.html:11 +#: cps/templates/user_edit.html:13 +msgid "E-mail Address" msgstr "" -#: cps/templates/admin.html:14 -msgid "Kindle" +#: cps/templates/admin.html:14 cps/templates/user_edit.html:26 +msgid "Send to Kindle E-mail Address" msgstr "ឧបករណ៍ Kindle" #: cps/templates/admin.html:15 -msgid "DLS" +msgid "Downloads" msgstr "ឯកសារ DLS" #: cps/templates/admin.html:16 cps/templates/layout.html:76 @@ -958,7 +984,7 @@ msgid "Download" msgstr "ទាញយក" #: cps/templates/admin.html:18 -msgid "View Ebooks" +msgid "View eBooks" msgstr "" #: cps/templates/admin.html:19 cps/templates/layout.html:65 @@ -969,28 +995,32 @@ msgstr "អាប់ឡូដ" msgid "Edit" msgstr "កែប្រែ" +#: cps/templates/admin.html:38 +msgid "Add New User" +msgstr "" + #: cps/templates/admin.html:44 -msgid "SMTP e-mail server settings" +msgid "E-mail Server Settings" msgstr "" #: cps/templates/admin.html:47 cps/templates/email_edit.html:11 -msgid "SMTP hostname" +msgid "SMTP Hostname" msgstr "ឈ្មោះម៉ាស៊ីន SMTP" -#: cps/templates/admin.html:48 -msgid "SMTP port" +#: cps/templates/admin.html:48 cps/templates/email_edit.html:15 +msgid "SMTP Port" msgstr "លេខ port SMTP" -#: cps/templates/admin.html:49 -msgid "SSL" +#: cps/templates/admin.html:49 cps/templates/email_edit.html:19 +msgid "Encryption" msgstr "SSL" #: cps/templates/admin.html:50 cps/templates/email_edit.html:27 -msgid "SMTP login" +msgid "SMTP Login" msgstr "អ្នកចូលប្រើ SMTP" -#: cps/templates/admin.html:51 -msgid "From mail" +#: cps/templates/admin.html:51 cps/templates/email_edit.html:35 +msgid "From E-mail" msgstr "ពីអ៊ីមែល" #: cps/templates/admin.html:61 @@ -1002,63 +1032,71 @@ msgid "Configuration" msgstr "ការកំណត់" #: cps/templates/admin.html:70 -msgid "Calibre DB dir" +msgid "Calibre Database Directory" msgstr "ទីតាំង database Calibre" -#: cps/templates/admin.html:74 -msgid "Log level" +#: cps/templates/admin.html:74 cps/templates/config_edit.html:122 +msgid "Log Level" msgstr "" #: cps/templates/admin.html:78 msgid "Port" msgstr "លេខ port" -#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:23 -msgid "Books per page" +#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:27 +msgid "Books per Page" msgstr "ចំនួនសៀវភៅក្នុងមួយទំព័រ" #: cps/templates/admin.html:88 -msgid "Uploading" +msgid "Uploads" msgstr "កំពុងអាប់ឡូដ" #: cps/templates/admin.html:92 -msgid "Anonymous browsing" +msgid "Anonymous Browsing" msgstr "" #: cps/templates/admin.html:96 -msgid "Public registration" +msgid "Public Registration" msgstr "ការចុះឈ្មាះសាធារណៈ" -#: cps/templates/admin.html:100 cps/templates/remote_login.html:4 -msgid "Remote login" +#: cps/templates/admin.html:100 +msgid "Magic Link Remote Login" msgstr "ការចូលប្រើប្រាស់ពីចម្ងាយ" #: cps/templates/admin.html:104 -msgid "Reverse proxy login" +msgid "Reverse Proxy Login" msgstr "" #: cps/templates/admin.html:109 msgid "Reverse proxy header name" msgstr "" +#: cps/templates/admin.html:114 +msgid "Edit Basic Configuration" +msgstr "" + +#: cps/templates/admin.html:115 +msgid "Edit UI Configuration" +msgstr "" + #: cps/templates/admin.html:121 msgid "Administration" msgstr "កិច្ចការរដ្ឋបាល" #: cps/templates/admin.html:122 -msgid "View Logfiles" +msgid "View Logs" msgstr "" #: cps/templates/admin.html:123 -msgid "Reconnect to Calibre DB" +msgid "Reconnect Calibre Database" msgstr "ភ្ជាប់ទៅ database Calibre ម្តងទៀត" #: cps/templates/admin.html:124 -msgid "Restart Calibre-Web" +msgid "Restart" msgstr "" #: cps/templates/admin.html:125 -msgid "Stop Calibre-Web" +msgid "Shutdown" msgstr "" #: cps/templates/admin.html:131 @@ -1078,7 +1116,7 @@ msgid "Current version" msgstr "" #: cps/templates/admin.html:148 -msgid "Check for update" +msgid "Check for Update" msgstr "រកមើលបច្ចុប្បន្នភាព" #: cps/templates/admin.html:149 @@ -1086,30 +1124,29 @@ msgid "Perform Update" msgstr "ធ្វើបច្ចុប្បន្នភាព" #: cps/templates/admin.html:161 -msgid "Do you really want to restart Calibre-Web?" +msgid "Are you sure you want to restart?" msgstr "" #: cps/templates/admin.html:166 cps/templates/admin.html:180 #: cps/templates/admin.html:200 cps/templates/shelf.html:72 -msgid "Ok" +msgid "OK" msgstr "បាទ/ចាស" #: cps/templates/admin.html:167 cps/templates/admin.html:181 -#: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 +#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:194 +#: cps/templates/config_edit.html:346 cps/templates/config_view_edit.html:151 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92 -#: cps/templates/layout.html:28 cps/templates/shelf.html:73 -#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32 -#: cps/templates/user_edit.html:131 -msgid "Back" -msgstr "មកក្រោយ" +#: cps/templates/shelf.html:73 cps/templates/shelf_edit.html:19 +#: cps/templates/user_edit.html:137 +msgid "Cancel" +msgstr "" #: cps/templates/admin.html:179 -msgid "Do you really want to stop Calibre-Web?" +msgid "Are you sure you want to shutdown?" msgstr "" #: cps/templates/admin.html:191 -msgid "Updating, please do not reload page" +msgid "Updating, please do not reload this page" msgstr "កំពុងធ្វើបច្ចុប្បន្នភាព សូមកុំបើកទំព័រជាថ្មី" #: cps/templates/author.html:15 @@ -1136,161 +1173,159 @@ msgstr "" msgid "More by" msgstr "បន្ថែមទៀតដោយ" -#: cps/templates/book_edit.html:12 +#: cps/templates/book_edit.html:10 msgid "Delete Book" msgstr "លុបសៀវភៅ" -#: cps/templates/book_edit.html:15 +#: cps/templates/book_edit.html:13 msgid "Delete formats:" msgstr "លុបឯកសារទម្រង់៖" -#: cps/templates/book_edit.html:18 cps/templates/book_edit.html:195 -#: cps/templates/email_edit.html:91 +#: cps/templates/book_edit.html:16 cps/templates/book_edit.html:193 +#: cps/templates/email_edit.html:91 cps/templates/user_edit.html:65 +#: cps/templates/user_edit.html:177 msgid "Delete" msgstr "លុប" -#: cps/templates/book_edit.html:26 +#: cps/templates/book_edit.html:24 msgid "Convert book format:" msgstr "" -#: cps/templates/book_edit.html:30 +#: cps/templates/book_edit.html:28 msgid "Convert from:" msgstr "" -#: cps/templates/book_edit.html:32 cps/templates/book_edit.html:39 +#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:37 msgid "select an option" msgstr "" -#: cps/templates/book_edit.html:37 +#: cps/templates/book_edit.html:35 msgid "Convert to:" msgstr "" -#: cps/templates/book_edit.html:46 +#: cps/templates/book_edit.html:44 msgid "Convert book" msgstr "" -#: cps/templates/book_edit.html:55 cps/templates/search_form.html:6 +#: cps/templates/book_edit.html:53 cps/templates/search_form.html:6 msgid "Book Title" msgstr "ចំណងជើងសៀវភៅ" -#: cps/templates/book_edit.html:59 cps/templates/book_edit.html:255 -#: cps/templates/book_edit.html:273 cps/templates/search_form.html:10 +#: cps/templates/book_edit.html:57 cps/templates/book_edit.html:256 +#: cps/templates/book_edit.html:274 cps/templates/search_form.html:10 msgid "Author" msgstr "អ្នកនិពន្ធ" -#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:260 -#: cps/templates/book_edit.html:275 cps/templates/search_form.html:126 +#: cps/templates/book_edit.html:61 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:276 cps/templates/search_form.html:126 msgid "Description" msgstr "ពិពណ៌នា" -#: cps/templates/book_edit.html:67 cps/templates/search_form.html:33 +#: cps/templates/book_edit.html:65 cps/templates/search_form.html:33 msgid "Tags" msgstr "Tag" -#: cps/templates/book_edit.html:75 -msgid "Series id" +#: cps/templates/book_edit.html:73 +msgid "Series ID" msgstr "លេខសម្គាល់ស៊េរី" -#: cps/templates/book_edit.html:79 +#: cps/templates/book_edit.html:77 msgid "Rating" msgstr "ការវាយតម្លៃ" -#: cps/templates/book_edit.html:83 -msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +#: cps/templates/book_edit.html:81 +msgid "Fetch Cover from URL (JPEG - Image will be downloaded and stored in database)" msgstr "URL របស់ក្របមុខ (ឯកសារ JPG ក្របមុខត្រូវបានទាញយក និងរក្សាទុកក្នុង database ក្រោយមកចន្លោះនេះទទេម្តងទៀត)" -#: cps/templates/book_edit.html:87 -msgid "Upload Cover from local drive" +#: cps/templates/book_edit.html:85 +msgid "Upload Cover from Local Disk" msgstr "" -#: cps/templates/book_edit.html:92 cps/templates/detail.html:165 -msgid "Publishing date" +#: cps/templates/book_edit.html:90 +msgid "Published Date" msgstr "ថ្ងៃបោះពុម្ភ" -#: cps/templates/book_edit.html:99 cps/templates/book_edit.html:257 -#: cps/templates/book_edit.html:274 cps/templates/detail.html:156 +#: cps/templates/book_edit.html:97 cps/templates/book_edit.html:258 +#: cps/templates/book_edit.html:275 cps/templates/detail.html:156 #: cps/templates/search_form.html:14 msgid "Publisher" msgstr "អ្នកបោះពុម្ភ" -#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:30 +#: cps/templates/book_edit.html:101 cps/templates/detail.html:123 +#: cps/templates/user_edit.html:31 msgid "Language" msgstr "ភាសា" -#: cps/templates/book_edit.html:113 cps/templates/search_form.html:137 +#: cps/templates/book_edit.html:111 cps/templates/search_form.html:137 msgid "Yes" msgstr "បាទ/ចាស" -#: cps/templates/book_edit.html:114 cps/templates/search_form.html:138 +#: cps/templates/book_edit.html:112 cps/templates/search_form.html:138 msgid "No" msgstr "ទេ" -#: cps/templates/book_edit.html:160 -msgid "Upload format" +#: cps/templates/book_edit.html:158 +msgid "Upload Format" msgstr "ទម្រង់អាប់ឡូដ" -#: cps/templates/book_edit.html:169 -msgid "view book after edit" +#: cps/templates/book_edit.html:167 +msgid "View Book on Save" msgstr "មើលសៀវភៅក្រោយពីកែប្រែ" -#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:208 -msgid "Get metadata" +#: cps/templates/book_edit.html:170 cps/templates/book_edit.html:206 +msgid "Fetch Metadata" msgstr "មើលទិន្នន័យមេតា" -#: 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:170 cps/templates/shelf_edit.html:17 -#: cps/templates/user_edit.html:129 -msgid "Submit" -msgstr "បញ្ចូល" +#: cps/templates/book_edit.html:171 cps/templates/config_edit.html:343 +#: cps/templates/config_view_edit.html:150 cps/templates/email_edit.html:38 +#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:135 +msgid "Save" +msgstr "" -#: cps/templates/book_edit.html:187 +#: cps/templates/book_edit.html:185 msgid "Are you really sure?" msgstr "" -#: cps/templates/book_edit.html:190 -msgid "Book will be deleted from Calibre database" +#: cps/templates/book_edit.html:188 +msgid "This book will be permanently erased from database" msgstr "សៀវភៅនឹងត្រូវលុបចេញពី database របស់ Calibre" -#: cps/templates/book_edit.html:191 -msgid "and from hard disk" +#: cps/templates/book_edit.html:189 +msgid "and hard disk" msgstr "និងពីថាសរឹង" -#: cps/templates/book_edit.html:211 +#: cps/templates/book_edit.html:209 msgid "Keyword" msgstr "ពាក្យគន្លឹះ" -#: cps/templates/book_edit.html:212 +#: cps/templates/book_edit.html:210 msgid " Search keyword " msgstr "ស្វែងរកពាក្យគន្លឹះ" -#: cps/templates/book_edit.html:214 cps/templates/layout.html:47 -msgid "Go!" -msgstr "ទៅ!" - -#: cps/templates/book_edit.html:218 +#: cps/templates/book_edit.html:216 msgid "Click the cover to load metadata to the form" msgstr "ចុចលើគម្របដើម្បីបញ្ចូលទិន្នន័យមេតាទៅក្នុង form" -#: cps/templates/book_edit.html:230 cps/templates/book_edit.html:270 +#: cps/templates/book_edit.html:231 cps/templates/book_edit.html:271 msgid "Loading..." msgstr "កំពុងដំណើរការ..." -#: cps/templates/book_edit.html:235 cps/templates/layout.html:192 -#: cps/templates/layout.html:224 +#: cps/templates/book_edit.html:236 cps/templates/layout.html:191 +#: cps/templates/layout.html:223 cps/templates/modal_restriction.html:34 +#: cps/templates/user_edit.html:164 msgid "Close" msgstr "បិទ" -#: cps/templates/book_edit.html:262 cps/templates/book_edit.html:276 +#: cps/templates/book_edit.html:263 cps/templates/book_edit.html:277 msgid "Source" msgstr "ប្រភព" -#: cps/templates/book_edit.html:271 +#: cps/templates/book_edit.html:272 msgid "Search error!" msgstr "ការស្វែងរកមានកំហុស!" -#: cps/templates/book_edit.html:272 -msgid "No Result(s) found! Please try aonther keyword." +#: cps/templates/book_edit.html:273 +msgid "No Result(s) found! Please try another keyword." msgstr "" #: cps/templates/config_edit.html:12 @@ -1298,7 +1333,7 @@ msgid "Library Configuration" msgstr "ការកំណត់បណ្ណាល័យ" #: cps/templates/config_edit.html:19 -msgid "Location of Calibre database" +msgid "Location of Calibre Database" msgstr "ទីតាំង database របស់ Calibre" #: cps/templates/config_edit.html:25 @@ -1350,7 +1385,7 @@ msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "ទីតាំង SSL keyfile (ទុកទទេសម្រាប់ម៉ាស៊ីន server ដែលមិនប្រើ SSL)" #: cps/templates/config_edit.html:99 -msgid "Update channel" +msgid "Update Channel" msgstr "" #: cps/templates/config_edit.html:101 @@ -1373,10 +1408,6 @@ msgstr "" msgid "Logfile Configuration" msgstr "ការកំណត់ logfile" -#: cps/templates/config_edit.html:122 -msgid "Log Level" -msgstr "កម្រិត log" - #: cps/templates/config_edit.html:131 msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "ទីតាំង និងឈ្មោះ logfile (calibre-web.log ប្រសិនបើទទេ)" @@ -1394,255 +1425,271 @@ msgid "Feature Configuration" msgstr "ការកំណត់មុខងារ" #: cps/templates/config_edit.html:158 -msgid "Enable uploading" -msgstr "អនុញ្ញាតការអាប់ឡូត" +msgid "Enable Uploads" +msgstr "" #: cps/templates/config_edit.html:162 -msgid "Enable anonymous browsing" +msgid "Enable Anonymous Browsing" msgstr "អនុញ្ញាតការរុករកដោយអនាមិក" #: cps/templates/config_edit.html:166 -msgid "Enable public registration" +msgid "Enable Public Registration" msgstr "អនុញ្ញាតការចុះឈ្មោះសាធារណៈ" #: cps/templates/config_edit.html:170 -msgid "Enable remote login (\"magic link\")" +msgid "Enable Magic Link Remote Login" msgstr "អនុញ្ញាតការ login ពីចម្ងាយ (ឬ “magic link”)" #: cps/templates/config_edit.html:175 +msgid "Enable Kobo sync" +msgstr "" + +#: cps/templates/config_edit.html:180 +msgid "Proxy unknown requests to Kobo Store" +msgstr "" + +#: cps/templates/config_edit.html:187 msgid "Use Goodreads" msgstr "" -#: cps/templates/config_edit.html:176 -msgid "Obtain an API Key" +#: cps/templates/config_edit.html:188 +msgid "Create an API Key" msgstr "ទាញយក API key" -#: cps/templates/config_edit.html:180 +#: cps/templates/config_edit.html:192 msgid "Goodreads API Key" msgstr "Goodreads API key" -#: cps/templates/config_edit.html:184 +#: cps/templates/config_edit.html:196 msgid "Goodreads API Secret" msgstr "Goodreads API secret" -#: cps/templates/config_edit.html:191 +#: cps/templates/config_edit.html:203 msgid "Login type" msgstr "" -#: cps/templates/config_edit.html:193 -msgid "Use standard Authentication" +#: cps/templates/config_edit.html:205 +msgid "Use Standard Authentication" msgstr "" -#: cps/templates/config_edit.html:195 +#: cps/templates/config_edit.html:207 msgid "Use LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:198 +#: cps/templates/config_edit.html:210 msgid "Use OAuth" msgstr "" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:217 msgid "LDAP Server Host Name or IP Address" msgstr "" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:221 msgid "LDAP Server Port" msgstr "" -#: cps/templates/config_edit.html:213 -msgid "LDAP schema (ldap or ldaps)" +#: cps/templates/config_edit.html:225 +msgid "LDAP Schema (LDAP or LPAPS)" msgstr "" -#: cps/templates/config_edit.html:217 -msgid "LDAP Admin username" +#: cps/templates/config_edit.html:229 +msgid "LDAP Administrator Username" msgstr "" -#: cps/templates/config_edit.html:221 -msgid "LDAP Admin password" +#: cps/templates/config_edit.html:233 +msgid "LDAP Administrator Password" msgstr "" -#: cps/templates/config_edit.html:226 -msgid "LDAP Server use SSL" +#: cps/templates/config_edit.html:238 +msgid "LDAP Server Enable SSL" msgstr "" -#: cps/templates/config_edit.html:230 -msgid "LDAP Server use TLS" +#: cps/templates/config_edit.html:242 +msgid "LDAP Server Enable TLS" msgstr "" -#: cps/templates/config_edit.html:234 +#: cps/templates/config_edit.html:246 msgid "LDAP Server Certificate" msgstr "" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:250 msgid "LDAP SSL Certificate Path" msgstr "" -#: cps/templates/config_edit.html:243 +#: cps/templates/config_edit.html:255 msgid "LDAP Distinguished Name (DN)" msgstr "" -#: cps/templates/config_edit.html:247 -msgid "LDAP User object filter" +#: cps/templates/config_edit.html:259 +msgid "LDAP User Object Filter" msgstr "" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:264 msgid "LDAP Server is OpenLDAP?" msgstr "" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:272 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:263 +#: cps/templates/config_edit.html:275 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:279 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:276 +#: cps/templates/config_edit.html:288 msgid "Allow Reverse Proxy Authentication" msgstr "" -#: cps/templates/config_edit.html:280 +#: cps/templates/config_edit.html:292 msgid "Reverse Proxy Header Name" msgstr "" -#: cps/templates/config_edit.html:292 +#: cps/templates/config_edit.html:304 msgid "External binaries" msgstr "" -#: cps/templates/config_edit.html:300 -msgid "No converter" +#: cps/templates/config_edit.html:312 +msgid "No Converter" msgstr "គ្មានកម្មវិធីបម្លែង" -#: cps/templates/config_edit.html:302 +#: cps/templates/config_edit.html:314 msgid "Use Kindlegen" msgstr "ប្រើ Kindlegen" -#: cps/templates/config_edit.html:304 +#: cps/templates/config_edit.html:316 msgid "Use calibre's ebook converter" msgstr "ប្រើកម្មវិធីបម្លែង eBook របស់ Calibre" -#: cps/templates/config_edit.html:308 +#: cps/templates/config_edit.html:320 msgid "E-Book converter settings" msgstr "ការកំណត់របស់កម្មវិធីបម្លែង eBook" -#: cps/templates/config_edit.html:312 +#: cps/templates/config_edit.html:324 msgid "Path to convertertool" msgstr "ទីតាំងរបស់កម្មវិធីបម្លែង" -#: cps/templates/config_edit.html:318 +#: cps/templates/config_edit.html:330 msgid "Location of Unrar binary" msgstr "" -#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 -#: cps/templates/login.html:4 +#: cps/templates/config_edit.html:349 cps/templates/layout.html:84 +#: cps/templates/login.html:4 cps/templates/login.html:20 msgid "Login" msgstr "ចូលប្រើប្រាស់" -#: cps/templates/config_view_edit.html:12 +#: cps/templates/config_view_edit.html:16 msgid "View Configuration" msgstr "មើលការកំណត់" -#: cps/templates/config_view_edit.html:19 cps/templates/shelf_edit.html:7 +#: cps/templates/config_view_edit.html:23 cps/templates/shelf_edit.html:7 msgid "Title" msgstr "ចំណងជើង" -#: cps/templates/config_view_edit.html:27 -msgid "No. of random books to show" +#: cps/templates/config_view_edit.html:31 +msgid "No. of Random Books to Display" msgstr "ចំនួនសៀវភៅចៃដន្យដើម្បីបង្ហាញ" -#: cps/templates/config_view_edit.html:31 -msgid "No. of authors to show before hiding (0=disable hiding)" +#: cps/templates/config_view_edit.html:35 +msgid "No. of Authors to Display Before Hiding (0=Disable Hiding)" msgstr "" -#: cps/templates/config_view_edit.html:35 cps/templates/readcbr.html:112 +#: cps/templates/config_view_edit.html:39 cps/templates/readcbr.html:112 msgid "Theme" msgstr "ការតុបតែង" -#: cps/templates/config_view_edit.html:37 +#: cps/templates/config_view_edit.html:41 msgid "Standard Theme" msgstr "ការតុបតែងសម្រាប់ប្រើ" -#: cps/templates/config_view_edit.html:38 +#: cps/templates/config_view_edit.html:42 msgid "caliBlur! Dark Theme" msgstr "ការតុបតែងពណ៌ងងឹត caliBlur!" -#: cps/templates/config_view_edit.html:42 -msgid "Regular expression for ignoring columns" +#: cps/templates/config_view_edit.html:46 +msgid "Regular Expression for Ignoring Columns" msgstr "Regular expression សម្រាប់រំលងជួរឈរ" -#: cps/templates/config_view_edit.html:46 -msgid "Link read/unread status to Calibre column" +#: cps/templates/config_view_edit.html:50 +msgid "Link Read/Unread Status to Calibre Column" msgstr "ភ្ជាប់ស្ថានភាពបានអាន/មិនទាន់បានអានទៅជួរឈររបស់ Calibre" -#: cps/templates/config_view_edit.html:55 -msgid "Regular expression for title sorting" -msgstr "Regular expression ដើម្បីរៀបចំណងជើងតាមលំដាប់" - #: cps/templates/config_view_edit.html:59 -msgid "Tags for Mature Content" -msgstr "Tag សម្រាប់មាតិកាសម្រាប់មនុស្សពេញវ័យ" +msgid "View Restrictions based on Calibre column" +msgstr "" -#: cps/templates/config_view_edit.html:73 -msgid "Default settings for new users" +#: cps/templates/config_view_edit.html:61 cps/templates/email_edit.html:21 +msgid "None" +msgstr "គ្មាន" + +#: cps/templates/config_view_edit.html:68 +msgid "Regular Expression for Title Sorting" +msgstr "Regular expression ដើម្បីរៀបចំណងជើងតាមលំដាប់" + +#: cps/templates/config_view_edit.html:80 +msgid "Default Settings for New Users" msgstr "ការកំណត់មកស្រាប់សម្រាប់អ្នកប្រើប្រាស់ថ្មី" -#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:82 -msgid "Admin user" +#: cps/templates/config_view_edit.html:88 cps/templates/user_edit.html:92 +msgid "Admin User" msgstr "អ្នកប្រើប្រាស់រដ្ឋបាល" -#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:91 +#: cps/templates/config_view_edit.html:92 cps/templates/user_edit.html:97 msgid "Allow Downloads" msgstr "អនុញ្ញាតឲទាញយក" -#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:95 -msgid "Allow book viewer" +#: cps/templates/config_view_edit.html:96 cps/templates/user_edit.html:101 +msgid "Allow eBook Viewer" msgstr "" -#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:99 +#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:105 msgid "Allow Uploads" msgstr "អនុញ្ញាតឲអាប់ឡូត" -#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:103 +#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:109 msgid "Allow Edit" msgstr "អនុញ្ញាតឲកែប្រែ" -#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 -msgid "Allow Delete books" +#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:113 +msgid "Allow Delete Books" msgstr "អនុញ្ញាតឲលុបសៀវភៅ" -#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:112 +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:118 msgid "Allow Changing Password" msgstr "អនុញ្ញាតឲប្តូរលេខសម្ងាត់" -#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:116 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:122 msgid "Allow Editing Public Shelfs" msgstr "អនុញ្ញាតឲកែប្រែធ្នើសាធារណៈ" -#: cps/templates/config_view_edit.html:119 -msgid "Default visibilities for new users" +#: cps/templates/config_view_edit.html:126 +msgid "Default Visibilities for New Users" msgstr "ភាពមើលឃើញដែលមកស្រាប់សម្រាប់អ្នកប្រើប្រាស់ថ្មី" -#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:74 -msgid "Show random books in detail view" +#: cps/templates/config_view_edit.html:142 +msgid "Show Random Books in Detail View" msgstr "បង្ហាញសៀវភៅចៃដន្យក្នុងការបង្ហាញជាពិស្តារ" -#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:87 -msgid "Show mature content" -msgstr "បង្ហាញមាតិកាសម្រាប់មនុស្សពេញវ័យ" +#: cps/templates/config_view_edit.html:144 +msgid "Add Allowed/Denied Tags" +msgstr "" + +#: cps/templates/config_view_edit.html:145 +msgid "Add Allowed/Denied custom column values" +msgstr "" #: cps/templates/detail.html:59 -msgid "Read in browser" +msgid "Read in Browser" msgstr "អានក្នុងកម្មវិធី browser" #: cps/templates/detail.html:72 -msgid "Listen in browser" +msgid "Listen in Browser" msgstr "" #: cps/templates/detail.html:117 @@ -1653,9 +1700,9 @@ msgstr "សៀវភៅ" msgid "of" msgstr "នៃ" -#: cps/templates/detail.html:123 -msgid "language" -msgstr "ភាសា" +#: cps/templates/detail.html:165 +msgid "Published" +msgstr "" #: cps/templates/detail.html:200 msgid "Mark As Unread" @@ -1678,21 +1725,9 @@ msgid "Add to shelf" msgstr "បន្ថែមទៅធ្នើ" #: cps/templates/detail.html:286 -msgid "Edit metadata" +msgid "Edit Metadata" msgstr "កែប្រែទិន្នន័យមេតា" -#: cps/templates/email_edit.html:15 -msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" -msgstr "លេខ port SMTP (ជាធម្មតាលេខ 25 សម្រាប់ SMTP ធម្មតា ឬ 465 សម្រាប់ SSL ឬ 587 សម្រាប់ STARTTLS)" - -#: cps/templates/email_edit.html:19 -msgid "Encryption" -msgstr "ការអ៊ិនគ្រីប" - -#: cps/templates/email_edit.html:21 -msgid "None" -msgstr "គ្មាន" - #: cps/templates/email_edit.html:22 msgid "STARTTLS" msgstr "STARTTLS" @@ -1702,23 +1737,15 @@ msgid "SSL/TLS" msgstr "SSL/TLS" #: cps/templates/email_edit.html:31 -msgid "SMTP password" +msgid "SMTP Password" msgstr "លេខសម្ងាត់ SMTP" -#: cps/templates/email_edit.html:35 -msgid "From e-mail" -msgstr "ពីអ៊ីមែល" - -#: cps/templates/email_edit.html:38 -msgid "Save settings" -msgstr "រក្សាទុកការកំណត់" - #: cps/templates/email_edit.html:39 -msgid "Save settings and send Test E-Mail" +msgid "Save and Send Test E-mail" msgstr "រក្សាទុកការកំណត់រួចផ្ញើអ៊ីមែលសាកល្បង" #: cps/templates/email_edit.html:43 -msgid "Allowed domains for registering" +msgid "Allowed Domains (Whitelist)" msgstr "" #: cps/templates/email_edit.html:46 cps/templates/email_edit.html:72 @@ -1734,28 +1761,28 @@ msgid "Enter domainname" msgstr "" #: cps/templates/email_edit.html:60 -msgid "Denied domains for registering" +msgid "Denied Domains (Blacklist)" msgstr "" #: cps/templates/email_edit.html:90 -msgid "Do you really want to delete this domain rule?" +msgid "Are you sure you want to delete this domain?" msgstr "" -#: cps/templates/feed.xml:21 cps/templates/layout.html:176 +#: cps/templates/feed.xml:21 cps/templates/layout.html:175 msgid "Next" msgstr "បន្ទាប់" -#: cps/templates/http_error.html:37 -msgid "Create issue" +#: cps/templates/generate_kobo_auth_url.html:5 +msgid "Open the .kobo/Kobo eReader.conf file in a text editor and add (or edit):" msgstr "" -#: cps/templates/http_error.html:44 -msgid "Back to home" +#: cps/templates/http_error.html:38 +msgid "Create Issue" msgstr "" -#: cps/templates/index.html:5 -msgid "Discover (Random Books)" -msgstr "ស្រាវជ្រាវ (សៀវភៅចៃដន្យ)" +#: cps/templates/http_error.html:45 +msgid "Return to Home" +msgstr "" #: cps/templates/index.html:64 msgid "Group by series" @@ -1781,7 +1808,11 @@ msgstr "" msgid "The latest Books" msgstr "សៀវភៅចុងក្រោយគេ" -#: cps/templates/index.xml:42 +#: cps/templates/index.xml:38 +msgid "Random Books" +msgstr "សៀវភៅចៃដន្យ" + +#: cps/templates/index.xml:42 cps/templates/user_edit.html:80 msgid "Show Random Books" msgstr "បង្ហាញសៀវភៅចៃដន្យ" @@ -1806,22 +1837,26 @@ msgid "Books ordered by Languages" msgstr "" #: cps/templates/index.xml:100 +msgid "Books ordered by Rating" +msgstr "" + +#: cps/templates/index.xml:108 msgid "Books ordered by file formats" msgstr "" -#: cps/templates/index.xml:103 cps/templates/layout.html:137 +#: cps/templates/index.xml:111 cps/templates/layout.html:136 msgid "Public Shelves" msgstr "ធ្នើសាធារណៈ" -#: cps/templates/index.xml:107 +#: cps/templates/index.xml:115 msgid "Books organized in public shelfs, visible to everyone" msgstr "សៀវភៅដែលរៀបចំនៅក្នុងធ្នើសាធារណៈ អាចមើលឃើញដោយគ្រប់គ្នា" -#: cps/templates/index.xml:111 cps/templates/layout.html:141 +#: cps/templates/index.xml:119 cps/templates/layout.html:140 msgid "Your Shelves" msgstr "ធ្នើរបស់អ្នក" -#: cps/templates/index.xml:115 +#: cps/templates/index.xml:123 msgid "User's own shelfs, only visible to the current user himself" msgstr "ធ្នើផ្ទាល់ខ្លួនរបស់អ្នកប្រើប្រាស់ អាចមើលឃើញដោយអ្នកប្រើប្រាស់នេះប៉ុណ្ណោះ" @@ -1829,10 +1864,19 @@ msgstr "ធ្នើផ្ទាល់ខ្លួនរបស់អ្នកប msgid "Home" msgstr "" +#: cps/templates/layout.html:28 cps/templates/shelf_order.html:32 +#: cps/templates/user_edit.html:178 +msgid "Back" +msgstr "មកក្រោយ" + #: cps/templates/layout.html:34 -msgid "Toggle navigation" +msgid "Toggle Navigation" msgstr "បិទ/បើកការរុករក" +#: cps/templates/layout.html:45 +msgid "Search Library" +msgstr "" + #: cps/templates/layout.html:55 msgid "Advanced Search" msgstr "ស្វែងរកកម្រិតខ្ពស់" @@ -1854,74 +1898,101 @@ msgstr "ចេញពីការប្រើប្រាស់" msgid "Register" msgstr "ចុះឈ្មោះ" -#: cps/templates/layout.html:116 cps/templates/layout.html:223 +#: cps/templates/layout.html:116 cps/templates/layout.html:222 msgid "Uploading..." msgstr "កំពុងអាប់ឡូត..." #: cps/templates/layout.html:117 -msgid "please don't refresh the page" -msgstr "សូមកុំបើកទំព័រជាថ្មី" +msgid "Please do not refresh the page" +msgstr "" #: cps/templates/layout.html:127 msgid "Browse" msgstr "រុករក" -#: cps/templates/layout.html:146 +#: cps/templates/layout.html:145 msgid "Create a Shelf" msgstr "បង្កើតធ្នើ" -#: cps/templates/layout.html:147 cps/templates/stats.html:3 +#: cps/templates/layout.html:146 cps/templates/stats.html:3 msgid "About" msgstr "អំពី" -#: cps/templates/layout.html:161 +#: cps/templates/layout.html:160 msgid "Previous" msgstr "មុន" -#: cps/templates/layout.html:188 +#: cps/templates/layout.html:187 msgid "Book Details" msgstr "ព័ត៌មានលម្អិតរបស់សៀវភៅ" -#: cps/templates/layout.html:222 +#: cps/templates/layout.html:221 msgid "Upload done, processing, please wait..." msgstr "" -#: cps/templates/layout.html:225 +#: cps/templates/layout.html:224 msgid "Error" msgstr "" -#: cps/templates/login.html:8 cps/templates/login.html:9 -#: cps/templates/register.html:7 cps/templates/user_edit.html:8 -msgid "Username" -msgstr "ឈ្មោះអ្នកប្រើប្រាស់" - #: cps/templates/login.html:12 cps/templates/login.html:13 #: cps/templates/user_edit.html:21 msgid "Password" msgstr "លេខសម្ងាត់" #: cps/templates/login.html:17 -msgid "Remember me" +msgid "Remember Me" msgstr "ចងចាំខ្ញុំ" #: cps/templates/login.html:22 -msgid "Forgot password" +msgid "Forgot Password?" msgstr "" #: cps/templates/login.html:25 -msgid "Log in with magic link" +msgid "Log in with Magic Link" msgstr "ចូលប្រើប្រាស់ដោយ magic link" -#: cps/templates/logviewer.html:5 -msgid "Show Calibre-Web log" +#: cps/templates/logviewer.html:6 +msgid "Show Calibre-Web Log: " +msgstr "" + +#: cps/templates/logviewer.html:8 +msgid "Calibre-Web Log: " msgstr "" #: cps/templates/logviewer.html:8 -msgid "Show access log" +msgid "Stream output, can't be displayed" +msgstr "" + +#: cps/templates/logviewer.html:12 +msgid "Show Access Log: " +msgstr "" + +#: cps/templates/modal_restriction.html:6 +msgid "Select allowed/denied Tags" +msgstr "" + +#: cps/templates/modal_restriction.html:7 +msgid "Select allowed/denied Custom Column values" +msgstr "" + +#: cps/templates/modal_restriction.html:8 +msgid "Select allowed/denied Tags of user" +msgstr "" + +#: cps/templates/modal_restriction.html:9 +msgid "Select allowed/denied Custom Column values of user" +msgstr "" + +#: cps/templates/modal_restriction.html:15 +msgid "Enter Tag" +msgstr "" + +#: cps/templates/modal_restriction.html:24 +msgid "Add View Restriction" msgstr "" #: cps/templates/osd.xml:5 -msgid "Calibre-Web ebook catalog" +msgid "Calibre-Web eBook Catalog" msgstr "" #: cps/templates/read.html:74 @@ -2033,51 +2104,51 @@ msgid "Basic txt Reader" msgstr "កម្មវិធីមើល txt សាមញ្ញ" #: cps/templates/register.html:4 -msgid "Register a new account" +msgid "Register New Account" msgstr "ចុះឈ្មោះបង្កើតគណនីថ្មី" #: cps/templates/register.html:8 msgid "Choose a username" msgstr "ជ្រើសរើសឈ្មោះអ្នកប្រើប្រាស់" -#: cps/templates/register.html:11 cps/templates/user_edit.html:13 -msgid "E-mail address" -msgstr "" - #: cps/templates/register.html:12 msgid "Your email address" msgstr "អាសយដ្ឋានអ៊ីមែលរបស់អ្នក" +#: cps/templates/remote_login.html:4 +msgid "Magic Link - Authorise New Device" +msgstr "" + #: cps/templates/remote_login.html:6 -msgid "Use your other device, login and visit " +msgid "On another device, login and visit:" msgstr "" -#: cps/templates/remote_login.html:9 -msgid "Once you do so, you will automatically get logged in on this device." +#: cps/templates/remote_login.html:10 +msgid "Once verified, you will automatically be logged in on this device." msgstr "ក្រោយពីនេះ អ្នកនឹងត្រូវបានឲចូលប្រើប្រាស់ក្នុងឧបករណ៍នេះដោយស្វ័យប្រវត្តិ។" -#: cps/templates/remote_login.html:12 -msgid "The link will expire after 10 minutes." +#: cps/templates/remote_login.html:13 +msgid "This verification link will expire in 10 minutes." msgstr "" #: cps/templates/search.html:5 -msgid "No Results for:" -msgstr "គ្មានលទ្ធផលសម្រាប់៖" +msgid "No Results Found" +msgstr "" #: cps/templates/search.html:6 -msgid "Please try a different search" -msgstr "សូមសាកល្បងស្វែងរកផ្សេងទៀត" +msgid "Search Term:" +msgstr "" #: cps/templates/search.html:8 msgid "Results for:" msgstr "លទ្ធផលសម្រាប់៖" #: cps/templates/search_form.html:19 -msgid "Publishing date from" +msgid "Published Date From" msgstr "ថ្ងៃបោះពុម្ភចាប់ពី" #: cps/templates/search_form.html:26 -msgid "Publishing date to" +msgid "Published Date To" msgstr "ថ្ងៃបោះពុម្ភរហូតដល់" #: cps/templates/search_form.html:43 @@ -2101,11 +2172,11 @@ msgid "Exclude Extensions" msgstr "" #: cps/templates/search_form.html:117 -msgid "Rating bigger than" +msgid "Rating Above" msgstr "ការវាយតម្លៃលើសពី" #: cps/templates/search_form.html:121 -msgid "Rating less than" +msgid "Rating Below" msgstr "ការវាយតម្លៃតិចជាង" #: cps/templates/shelf.html:10 @@ -2121,23 +2192,23 @@ msgid "Change order" msgstr "ប្តូរលំដាប់" #: cps/templates/shelf.html:67 -msgid "Do you really want to delete the shelf?" +msgid "Are you sure you want to delete this shelf?" msgstr "តើអ្នកពិតជាចង់លុបធ្នើនេះមែនទេ?" #: cps/templates/shelf.html:70 -msgid "Shelf will be lost for everybody and forever!" +msgid "Shelf will be deleted for all users" msgstr "ធ្នើនេះនឹងបាត់បង់ជាអចិន្ត្រៃយ៍សម្រាប់គ្រប់គ្នា!" #: cps/templates/shelf_edit.html:13 -msgid "should the shelf be public?" +msgid "Share with Everyone" msgstr "តើធ្នើនេះគួរជាសាធារណៈទេ?" #: cps/templates/shelf_order.html:5 -msgid "Drag 'n drop to rearrange order" +msgid "Drag to Rearrange Order" msgstr "ទាញដើម្បីប្តូរលំដាប់" #: cps/templates/stats.html:7 -msgid "Calibre library statistics" +msgid "Library Statistics" msgstr "ស្ថិតិបណ្ណាល័យ Calibre" #: cps/templates/stats.html:12 @@ -2157,21 +2228,17 @@ msgid "Series in this Library" msgstr "ស៊េរីនានាក្នុងបណ្ណាល័យនេះ" #: cps/templates/stats.html:28 -msgid "Linked libraries" +msgid "Linked Libraries" msgstr "បណ្ណាល័យដែលមានទំនាក់ទំនង" #: cps/templates/stats.html:32 -msgid "Program library" +msgid "Program Library" msgstr "Library របស់កម្មវិធី" #: cps/templates/stats.html:33 msgid "Installed Version" msgstr "លេខ version ដែលបានតម្លើង" -#: cps/templates/tasks.html:7 -msgid "Tasks list" -msgstr "បញ្ជីការងារ" - #: cps/templates/tasks.html:12 msgid "User" msgstr "អ្នកប្រើប្រាស់" @@ -2189,11 +2256,11 @@ msgid "Progress" msgstr "ដំណើរការ" #: cps/templates/tasks.html:17 -msgid "Runtime" +msgid "Run Time" msgstr "រយៈពេលដែលបានចាប់ផ្តើម" #: cps/templates/tasks.html:18 -msgid "Starttime" +msgid "Start Time" msgstr "ពេលចាប់ផ្តើម" #: cps/templates/tasks.html:24 @@ -2208,281 +2275,130 @@ msgstr "លាក់ការងារទាំងអស់" msgid "Reset user Password" msgstr "" -#: cps/templates/user_edit.html:26 -msgid "Kindle E-Mail" -msgstr "អ៊ីមែល Kindle" - -#: cps/templates/user_edit.html:39 -msgid "Show books with language" +#: cps/templates/user_edit.html:41 +msgid "Language of Books" msgstr "បង្ហាញសៀវភៅដែលមានភាសា" -#: cps/templates/user_edit.html:41 -msgid "Show all" +#: cps/templates/user_edit.html:43 +msgid "Show All" msgstr "បង្ហាញទាំងអស់" -#: cps/templates/user_edit.html:51 +#: cps/templates/user_edit.html:52 msgid "OAuth Settings" msgstr "" -#: cps/templates/user_edit.html:53 +#: cps/templates/user_edit.html:54 msgid "Link" msgstr "" -#: cps/templates/user_edit.html:55 +#: cps/templates/user_edit.html:56 msgid "Unlink" msgstr "" -#: cps/templates/user_edit.html:123 -msgid "Delete this user" -msgstr "លុបអ្នកប្រើប្រាស់នេះ" - -#: cps/templates/user_edit.html:138 -msgid "Recent Downloads" -msgstr "ការទាញយកថ្មីៗ" - -#~ msgid "%s: %s" -#~ msgstr "%s៖ %s" - -#~ msgid "E-Mail: %(book)s" -#~ msgstr "អ៊ីមែល៖ %(book)s" - -#~ msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" -#~ msgstr "ប្តូរចំណងជើងពី “%(src)s” ទៅជា “%(dest)s” បរាជ័យដោយបញ្ហា: %(error)s" - -#~ msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" -#~ msgstr "ប្តូរអ្នកនិពន្ធពី “%(src)s” ទៅជា “%(dest)s” បរាជ័យដោយបញ្ហា: %(error)s" - -#~ msgid "Password for user %(user)s reset" -#~ msgstr "" - -#~ msgid "Password for user %s reset" -#~ msgstr "" - -#~ msgid "Rename title from: '%(src)s' to '%(src)s' failed with error: %(error)s" -#~ msgstr "" - -#~ msgid "Rename author from: '%(src)s' to '%(src)s' failed with error: %(error)s" -#~ msgstr "" - -#~ msgid "Failed to create path for cover %(cover)s (Permission denied)." -#~ msgstr "" - -#~ msgid "File extension '%s' is not allowed to be uploaded to this server" -#~ msgstr "" - -#~ msgid "File extension \"%(ext)s\" is not allowed to be uploaded to this server" -#~ msgstr "ឯកសារប្រភេទ “%(ext)s” មិនត្រូវបានអនុញ្ញាតឲអាប់ឡូដទៅម៉ាស៊ីន server នេះទេ" - -#~ msgid "Current commit timestamp" -#~ msgstr "Commit timestamp បច្ចុប្បន្ន" - -#~ msgid "Newest commit timestamp" -#~ msgstr "Commit timestamp ចុងក្រោយគេ" - -#~ msgid "Convert: %(book)s" -#~ msgstr "បម្លែង៖ %(book)s" - -#~ msgid "Convert to %(format)s: %(book)s" -#~ msgstr "" - -#~ msgid "Files are replaced" -#~ msgstr "ឯកសារត្រូវបានផ្លាស់ប្តូរ" - -#~ msgid "Server is stopped" -#~ msgstr "ម៉ាស៊ីន server ត្រូវបានបញ្ឈប់" - -#~ msgid "Convertertool %(converter)s not found" -#~ msgstr "មិនអាចរកឃើញកម្មវិធីបម្លែង %(converter)s" - -#~ msgid "Choose a password" -#~ msgstr "ជ្រើសរើសលេខសម្ងាត់" - -#~ msgid "Could not find any formats suitable for sending by e-mail" -#~ msgstr "" - -#~ msgid "Author list" -#~ msgstr "បញ្ជីអ្នកនិពន្ធ" - -#~ msgid "File %(file)s uploaded" -#~ msgstr "ឯកសារ %(file)s ត្រូវបានអាប់ឡូដ" - -#~ msgid "Update done" -#~ msgstr "ការធ្វើបច្ចុប្បន្នភាពរួចរាល់" - -#~ msgid "Stable (Automatic))" -#~ msgstr "" - -#~ msgid "Nightly (Automatic))" -#~ msgstr "" - -#~ msgid "A new update is available. Click on the button below to update to version: " -#~ msgstr "" - -#~ msgid "A new update is available. Click on the button below to update to version: %(version)s" -#~ msgstr "" - -#~ msgid "Failed to create path for cover %(path)s (Permission denied)." -#~ msgstr "" - -#~ msgid "Failed to store cover-file %(cover)s." -#~ msgstr "" - -#~ msgid "Cover-file is not a valid image file" -#~ msgstr "" - -#~ msgid "Cover is not a jpg file, can't save" -#~ msgstr "គម្របមិនមែនជាឯកសារ JPG មិនអាចរក្សាទុក" - -#~ msgid "Preparing document for printing..." -#~ msgstr "" - -#~ msgid "Using your another device, visit" -#~ msgstr "ដោយប្រើប្រាស់ឧបករណ៍ផ្សេងទៀតរបស់អ្នក សូមចូលទៅ" +#: cps/templates/user_edit.html:62 +msgid "Kobo Sync Token" +msgstr "" -#~ msgid "and log in" -#~ msgstr "រួចចូលប្រើប្រាស់" +#: cps/templates/user_edit.html:64 +msgid "Create/View" +msgstr "" -#~ msgid "Using your another device, login and visit " -#~ msgstr "" +#: cps/templates/user_edit.html:83 +msgid "Add allowed/denied Tags" +msgstr "" -#~ msgid "Newest Books" -#~ msgstr "សៀវភៅថ្មីៗជាងគេ" +#: cps/templates/user_edit.html:84 +msgid "Add allowed/denied custom column values" +msgstr "" -#~ msgid "Oldest Books" -#~ msgstr "សៀវភៅចាស់ជាងគេ" +#: cps/templates/user_edit.html:129 +msgid "Delete User" +msgstr "លុបអ្នកប្រើប្រាស់នេះ" -#~ msgid "Books (A-Z)" -#~ msgstr "សៀវភៅពី A ទៅ Z" +#: cps/templates/user_edit.html:144 +msgid "Recent Downloads" +msgstr "ការទាញយកថ្មីៗ" -#~ msgid "Books (Z-A)" -#~ msgstr "សៀវភៅពី Z ទៅ A" +#: cps/templates/user_edit.html:160 +msgid "Generate Kobo Auth URL" +msgstr "" -#~ msgid "Error opening eBook. Fileformat is not supported." -#~ msgstr "" +#: cps/templates/user_edit.html:176 +msgid "Do you really want to delete the Kobo Token?" +msgstr "" -#~ msgid "File %(title)s" +#~ msgid "deny" #~ msgstr "" -#~ msgid "Show sorted books" -#~ msgstr "បង្ហាញសៀវភៅដែលរៀបតាមលំដាប់" - -#~ msgid "Sorted Books" -#~ msgstr "សៀវភៅរៀបតាមលំដាប់" - -#~ msgid "Sort By" -#~ msgstr "រៀបតាម" - -#~ msgid "Newest" -#~ msgstr "ថ្មីជាងគេ" - -#~ msgid "Oldest" -#~ msgstr "ចាស់ជាងគេ" - -#~ msgid "Ascending" -#~ msgstr "ពីតូចទៅធំ" - -#~ msgid "Descending" -#~ msgstr "ពីធំទៅតូច" - -#~ msgid "PDF.js viewer" -#~ msgstr "កម្មវិធីមើល PDF.js" - -#~ msgid "Please enter a LDAP provider and a DN" +#~ msgid "allow" #~ msgstr "" -#~ msgid "successfully deleted shelf %(name)s" -#~ msgstr "បានបង្កើតធ្នើឈ្មោះ %(name)s ដោយជោគជ័យ" - -#~ msgid "LDAP Provider URL" -#~ msgstr "" +#~ msgid "Best rated books" +#~ msgstr "សៀវភៅដែលត្រូវបានវាយតម្លៃល្អជាងគេ" -#~ msgid "Register with %s, " +#~ msgid "Publisher list" #~ msgstr "" -#~ msgid "Import of optional Google Drive requirements missing" -#~ msgstr "ខ្វះការនាំចូលតម្រូវការបន្ថែមរបស់ Google Drive" - -#~ msgid "client_secrets.json is missing or not readable" -#~ msgstr "មិនមានឯកសារ client_secrets.json ឬមិនអាចបើកបាន" - -#~ msgid "client_secrets.json is not configured for web application" -#~ msgstr "ឯកសារ client_secrets.json មិនទាន់បានកំណត់សម្រាប់កម្មវិធីវែប" - -#~ msgid "Keyfile location is not valid, please enter correct path" -#~ msgstr "ទីតាំងរបស់ keyfile មិនត្រឹមត្រូវ សូមបញ្ចូលទីតាំងត្រឹមត្រូវ" - -#~ msgid "Certfile location is not valid, please enter correct path" -#~ msgstr "ទីតាំងរបស់ certfile មិនត្រឹមត្រូវ សូមបញ្ចូលទីតាំងត្រឹមត្រូវ" +#~ msgid "Series list" +#~ msgstr "បញ្ជីស៊េរី" -#~ msgid "Please enter a LDAP provider, port, DN and user object identifier" -#~ msgstr "" - -#~ msgid "Please enter a LDAP service account and password" -#~ msgstr "" +#~ msgid "Available languages" +#~ msgstr "ភាសាដែលមាន" -#~ msgid "Please enter Github oauth credentials" -#~ msgstr "" +#~ msgid "Category list" +#~ msgstr "បញ្ជីប្រភេទ" -#~ msgid "Please enter Google oauth credentials" +#~ msgid "E-mail" #~ msgstr "" -#~ msgid "Logfile location is not valid, please enter correct path" -#~ msgstr "ទីតាំងរបស់ logfile មិនត្រឹមត្រូវ សូមបញ្ចូលទីតាំងត្រឹមត្រូវ" +#~ msgid "Submit" +#~ msgstr "បញ្ចូល" -#~ msgid "Access Logfile location is not valid, please enter correct path" -#~ msgstr "" - -#~ msgid "DB location is not valid, please enter correct path" -#~ msgstr "ទីតាំងរបស់ database មិនត្រឹមត្រូវ សូមបញ្ចូលទីតាំងត្រឹមត្រូវ" +#~ msgid "Go!" +#~ msgstr "ទៅ!" -#~ msgid "Excecution permissions missing" -#~ msgstr "ខ្វះសិទ្ធិប្រតិបត្តិការ" +#~ msgid "Enable uploading" +#~ msgstr "អនុញ្ញាតការអាប់ឡូត" -#~ msgid "not configured" +#~ msgid "View restriction based on Calibre column" #~ msgstr "" -#~ msgid "Error excecuting UnRar" -#~ msgstr "" +#~ msgid "language" +#~ msgstr "ភាសា" -#~ msgid "Unrar binary file not found" -#~ msgstr "" +#~ msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" +#~ msgstr "លេខ port SMTP (ជាធម្មតាលេខ 25 សម្រាប់ SMTP ធម្មតា ឬ 465 សម្រាប់ SSL ឬ 587 សម្រាប់ STARTTLS)" -#~ msgid "Use GitHub OAuth" -#~ msgstr "" +#~ msgid "From e-mail" +#~ msgstr "ពីអ៊ីមែល" -#~ msgid "Use Google OAuth" -#~ msgstr "" +#~ msgid "Save settings" +#~ msgstr "រក្សាទុកការកំណត់" -#~ msgid "Obtain GitHub OAuth Credential" +#~ msgid "api_endpoint=" #~ msgstr "" -#~ msgid "GitHub OAuth Client Id" -#~ msgstr "" +#~ msgid "please don't refresh the page" +#~ msgstr "សូមកុំបើកទំព័រជាថ្មី" -#~ msgid "GitHub OAuth Client Secret" +#~ msgid "E-mail address" #~ msgstr "" -#~ msgid "Obtain Google OAuth Credential" -#~ msgstr "" +#~ msgid "No Results for:" +#~ msgstr "គ្មានលទ្ធផលសម្រាប់៖" -#~ msgid "Google OAuth Client Id" -#~ msgstr "" +#~ msgid "Please try a different search" +#~ msgstr "សូមសាកល្បងស្វែងរកផ្សេងទៀត" -#~ msgid "Google OAuth Client Secret" -#~ msgstr "" +#~ msgid "Tasks list" +#~ msgstr "បញ្ជីការងារ" -#~ msgid "Use" -#~ msgstr "ប្រើប្រាស់" +#~ msgid "Kindle E-Mail" +#~ msgstr "អ៊ីមែល Kindle" -#~ msgid "Play / pause" +#~ msgid "Please note that every visit to this current page invalidates any previously generated Authentication url for this user." #~ msgstr "" -#~ msgid "volume" +#~ msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" #~ msgstr "" -#~ msgid "unknown" -#~ msgstr "មិនដឹង" - -#~ msgid "New Books" -#~ msgstr "សៀវភៅថ្មីៗ" - diff --git a/cps/translations/nl/LC_MESSAGES/messages.mo b/cps/translations/nl/LC_MESSAGES/messages.mo index 0bc25157..e9f5796e 100644 Binary files a/cps/translations/nl/LC_MESSAGES/messages.mo and b/cps/translations/nl/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/nl/LC_MESSAGES/messages.po b/cps/translations/nl/LC_MESSAGES/messages.po index 2420dee7..e40247e3 100644 --- a/cps/translations/nl/LC_MESSAGES/messages.po +++ b/cps/translations/nl/LC_MESSAGES/messages.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web (GPLV3)\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2020-01-12 13:57+0100\n" -"PO-Revision-Date: 2019-06-17 22:37+0200\n" +"POT-Creation-Date: 2020-03-12 20:31+0100\n" +"PO-Revision-Date: 2020-03-07 11:13+0100\n" "Last-Translator: Marcel Maas \n" "Language: nl\n" "Language-Team: ed.driesen@telenet.be\n" @@ -17,7 +17,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.7.0\n" +"Generated-By: Babel 2.8.0\n" #: cps/about.py:42 msgid "installed" @@ -27,7 +27,7 @@ msgstr "" msgid "not installed" msgstr "niet geïnstalleerd" -#: cps/about.py:84 +#: cps/about.py:87 msgid "Statistics" msgstr "Statistieken" @@ -41,7 +41,7 @@ msgstr "Bezig het stoppen van server; sluit het venster" #: cps/admin.py:110 cps/editbooks.py:410 cps/editbooks.py:419 #: cps/editbooks.py:539 cps/editbooks.py:541 cps/editbooks.py:594 -#: cps/updater.py:446 cps/uploader.py:97 cps/uploader.py:108 +#: cps/updater.py:456 cps/uploader.py:96 cps/uploader.py:107 msgid "Unknown" msgstr "Onbekend" @@ -49,155 +49,164 @@ msgstr "Onbekend" msgid "Admin page" msgstr "Systeembeheer" -#: cps/admin.py:148 cps/templates/admin.html:115 +#: cps/admin.py:151 msgid "UI Configuration" msgstr "Uiterlijk aanpassen" -#: cps/admin.py:185 cps/admin.py:412 +#: cps/admin.py:187 cps/admin.py:637 msgid "Calibre-Web configuration updated" msgstr "Calibre-Web-configuratie bijgewerkt" -#: cps/admin.py:442 cps/templates/admin.html:114 +#: cps/admin.py:434 cps/admin.py:440 cps/admin.py:451 cps/admin.py:462 +#: cps/templates/modal_restriction.html:29 +msgid "Deny" +msgstr "" + +#: cps/admin.py:436 cps/admin.py:442 cps/admin.py:453 cps/admin.py:464 +#: cps/templates/modal_restriction.html:28 +msgid "Allow" +msgstr "" + +#: cps/admin.py:667 msgid "Basic Configuration" msgstr "Basis configuratie" -#: cps/admin.py:465 cps/web.py:1093 +#: cps/admin.py:691 cps/web.py:1089 msgid "Please fill out all fields!" msgstr "Vul alle velden in!" -#: cps/admin.py:467 cps/admin.py:478 cps/admin.py:484 cps/admin.py:499 -#: cps/templates/admin.html:38 +#: cps/admin.py:694 cps/admin.py:706 cps/admin.py:712 cps/admin.py:730 msgid "Add new user" msgstr "Nieuwe gebruiker toevoegen" -#: cps/admin.py:476 cps/web.py:1318 +#: cps/admin.py:703 cps/web.py:1318 msgid "E-mail is not from valid domain" msgstr "Het e-mailadres bevat geen geldige domeinnaam" -#: cps/admin.py:482 cps/admin.py:493 +#: cps/admin.py:710 cps/admin.py:725 msgid "Found an existing account for this e-mail address or nickname." msgstr "Er is een bestaand account met dit e-mailadres of deze gebruikersnaam aangetroffen." -#: cps/admin.py:489 +#: cps/admin.py:721 #, python-format msgid "User '%(user)s' created" msgstr "Gebruiker '%(user)s' aangemaakt" -#: cps/admin.py:509 +#: cps/admin.py:740 msgid "Edit e-mail server settings" msgstr "E-mailserverinstellingen bewerken" -#: cps/admin.py:535 +#: cps/admin.py:766 #, python-format msgid "Test e-mail successfully send to %(kindlemail)s" msgstr "Test-e-mail verstuurd naar %(kindlemail)s" -#: cps/admin.py:538 +#: cps/admin.py:769 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Fout opgetreden bij het versturen van de test-e-mail: %(res)s" -#: cps/admin.py:540 +#: cps/admin.py:771 msgid "Please configure your e-mail address first..." msgstr "" -#: cps/admin.py:542 +#: cps/admin.py:773 msgid "E-mail server settings updated" msgstr "E-mailserverinstellingen bijgewerkt" -#: cps/admin.py:571 +#: cps/admin.py:803 #, python-format msgid "User '%(nick)s' deleted" msgstr "Gebruiker '%(nick)s' is verwijderd" -#: cps/admin.py:574 +#: cps/admin.py:806 msgid "No admin user remaining, can't delete user" msgstr "Kan laatste systeembeheerder niet verwijderen" -#: cps/admin.py:612 cps/web.py:1359 +#: cps/admin.py:842 cps/web.py:1361 msgid "Found an existing account for this e-mail address." msgstr "Bestaand account met dit e-mailadres aangetroffen." -#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1334 +#: cps/admin.py:852 cps/admin.py:867 cps/admin.py:887 cps/web.py:1336 #, python-format msgid "Edit User %(nick)s" msgstr "Gebruiker '%(nick)s' bewerken" -#: cps/admin.py:622 cps/web.py:1327 +#: cps/admin.py:858 cps/web.py:1328 msgid "This username is already taken" msgstr "" -#: cps/admin.py:637 +#: cps/admin.py:874 #, python-format msgid "User '%(nick)s' updated" msgstr "Gebruiker '%(nick)s' bijgewerkt" -#: cps/admin.py:640 +#: cps/admin.py:877 msgid "An unknown error occured." msgstr "Er is een onbekende fout opgetreden." -#: cps/admin.py:657 +#: cps/admin.py:900 #, python-format msgid "Password for user %(user)s reset" msgstr "Wachtwoord voor gebruiker %(user)s is hersteld" -#: cps/admin.py:660 cps/web.py:1118 cps/web.py:1174 +#: cps/admin.py:903 cps/web.py:1114 cps/web.py:1170 msgid "An unknown error occurred. Please try again later." msgstr "Onbekende fout opgetreden. Probeer het later nog eens." -#: cps/admin.py:663 cps/web.py:1062 +#: cps/admin.py:906 cps/web.py:1055 msgid "Please configure the SMTP mail settings first..." msgstr "Stel eerst SMTP-mail in..." -#: cps/admin.py:674 +#: cps/admin.py:918 msgid "Logfile viewer" msgstr "" -#: cps/admin.py:710 +#: cps/admin.py:957 msgid "Requesting update package" msgstr "Bezig met opvragen van updatepakket" -#: cps/admin.py:711 +#: cps/admin.py:958 msgid "Downloading update package" msgstr "Bezig met downloaden van updatepakket" -#: cps/admin.py:712 +#: cps/admin.py:959 msgid "Unzipping update package" msgstr "Bezig met uitpakken van updatepakket" -#: cps/admin.py:713 +#: cps/admin.py:960 msgid "Replacing files" msgstr "Bezig met bestandsvervanging" -#: cps/admin.py:714 +#: cps/admin.py:961 msgid "Database connections are closed" msgstr "Databankverbindingen zijn gesloten" -#: cps/admin.py:715 +#: cps/admin.py:962 msgid "Stopping server" msgstr "Bezig met stoppen van server" -#: cps/admin.py:716 +#: cps/admin.py:963 msgid "Update finished, please press okay and reload page" msgstr "Update voltooid; klik op 'Oké' en vernieuw de pagina" -#: cps/admin.py:717 cps/admin.py:718 cps/admin.py:719 cps/admin.py:720 +#: cps/admin.py:964 cps/admin.py:965 cps/admin.py:966 cps/admin.py:967 msgid "Update failed:" msgstr "Update mislukt:" -#: cps/admin.py:717 cps/updater.py:272 cps/updater.py:457 cps/updater.py:459 +#: cps/admin.py:964 cps/updater.py:282 cps/updater.py:467 cps/updater.py:469 msgid "HTTP Error" msgstr "HTTP-fout" -#: cps/admin.py:718 cps/updater.py:274 cps/updater.py:461 +#: cps/admin.py:965 cps/updater.py:284 cps/updater.py:471 msgid "Connection error" msgstr "Verbindingsfout" -#: cps/admin.py:719 cps/updater.py:276 cps/updater.py:463 +#: cps/admin.py:966 cps/updater.py:286 cps/updater.py:473 msgid "Timeout while establishing connection" msgstr "Time-out tijdens maken van verbinding" -#: cps/admin.py:720 cps/updater.py:278 cps/updater.py:465 +#: cps/admin.py:967 cps/updater.py:288 cps/updater.py:475 msgid "General error" msgstr "Algemene fout" @@ -237,10 +246,6 @@ msgstr "Kan %(file)s niet opslaan." msgid "File format %(ext)s added to %(book)s" msgstr "Bestandsformaat %(ext)s toegevoegd aan %(book)s" -#: cps/editbooks.py:376 -msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" -msgstr "Het omslagbestand is een niet-ondersteund afbeeldingsformaat (jpg/png/webp); kan niet opslaan" - #: cps/editbooks.py:451 msgid "Cover is not a jpg file, can't save" msgstr "Cover is geen jpg bestand, opslaan niet mogelijk" @@ -277,30 +282,30 @@ msgstr "Kan %(file)s niet opslaan (niet gemachtigd)." msgid "Failed to delete file %(file)s (Permission denied)." msgstr "Kan %(file)s niet verwijderen (niet gemachtigd)." -#: cps/editbooks.py:710 +#: cps/editbooks.py:709 #, python-format msgid "File %(file)s uploaded" msgstr "Bestand %(file)s geüpload" -#: cps/editbooks.py:739 +#: cps/editbooks.py:738 msgid "Source or destination format for conversion missing" msgstr "Bron- of doelformaat ontbreekt voor conversie" -#: cps/editbooks.py:747 +#: cps/editbooks.py:746 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Het boek is in de wachtrij geplaatst voor conversie naar %(book_format)s" -#: cps/editbooks.py:751 +#: cps/editbooks.py:750 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Er is een fout opgetreden bij het converteren van dit boek: %(res)s" -#: cps/gdrive.py:62 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgstr "Het instellen van Google Drive is niet afgerond; heractiveer Google Drive" -#: cps/gdrive.py:104 +#: cps/gdrive.py:103 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-ontwikkelaarsconsole om het domein te verifiëren." @@ -390,83 +395,111 @@ msgstr "Bestand '%(file)s' niet aangetroffen op Google Drive" msgid "Book path %(path)s not found on Google Drive" msgstr "Boekpad '%(path)s' niet aangetroffen op Google Drive" -#: cps/helper.py:643 +#: cps/helper.py:511 +msgid "Failed to create path for cover" +msgstr "" + +#: cps/helper.py:516 +msgid "Cover-file is not a valid image file" +msgstr "" + +#: cps/helper.py:519 +msgid "Failed to store cover-file" +msgstr "" + +#: cps/helper.py:530 +msgid "Only jpg/jpeg/png/webp files are supported as coverfile" +msgstr "" + +#: cps/helper.py:544 +msgid "Only jpg/jpeg files are supported as coverfile" +msgstr "" + +#: cps/helper.py:658 msgid "Waiting" msgstr "Aan het wachten" -#: cps/helper.py:645 +#: cps/helper.py:660 msgid "Failed" msgstr "Mislukt" -#: cps/helper.py:647 +#: cps/helper.py:662 msgid "Started" msgstr "Gestart" -#: cps/helper.py:649 +#: cps/helper.py:664 msgid "Finished" msgstr "Voltooid" -#: cps/helper.py:651 +#: cps/helper.py:666 msgid "Unknown Status" msgstr "Onbekende status" -#: cps/helper.py:656 +#: cps/helper.py:671 msgid "E-mail: " msgstr "E-mailadres: " -#: cps/helper.py:658 cps/helper.py:662 +#: cps/helper.py:673 cps/helper.py:677 msgid "Convert: " msgstr "Converteren: " -#: cps/helper.py:660 +#: cps/helper.py:675 msgid "Upload: " msgstr "Uploaden: " -#: cps/helper.py:664 +#: cps/helper.py:679 msgid "Unknown Task: " msgstr "Onbekende taak: " -#: cps/oauth_bb.py:75 +#: cps/kobo_auth.py:127 +msgid "PLease access calibre-web from non localhost to get valid api_endpoint for kobo device" +msgstr "" + +#: cps/kobo_auth.py:130 cps/kobo_auth.py:150 +msgid "Kobo Setup" +msgstr "" + +#: cps/oauth_bb.py:74 #, python-format msgid "Register with %(provider)s" msgstr "Aanmelden bij %(provider)s" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:154 msgid "Failed to log in with GitHub." msgstr "Aanmelden bij GitHub mislukt." -#: cps/oauth_bb.py:160 +#: cps/oauth_bb.py:159 msgid "Failed to fetch user info from GitHub." msgstr "Opvragen gebruikersinfo bij GitHub mislukt" -#: cps/oauth_bb.py:171 +#: cps/oauth_bb.py:170 msgid "Failed to log in with Google." msgstr "Aanmelden bij Google mislukt." -#: cps/oauth_bb.py:176 +#: cps/oauth_bb.py:175 msgid "Failed to fetch user info from Google." msgstr "Opvragen gebruikersinfo bij Google mislukt." -#: cps/oauth_bb.py:274 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s success." msgstr "" -#: cps/oauth_bb.py:278 +#: cps/oauth_bb.py:277 #, python-format msgid "Unlink to %(oauth)s failed." msgstr "" -#: cps/oauth_bb.py:281 +#: cps/oauth_bb.py:280 #, python-format msgid "Not linked to %(oauth)s." msgstr "" -#: cps/oauth_bb.py:309 +#: cps/oauth_bb.py:308 msgid "GitHub Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:328 +#: cps/oauth_bb.py:327 msgid "Google Oauth error, please retry later." msgstr "" @@ -517,403 +550,393 @@ msgstr "De boeken zijn toegevoegd aan de boekenplank '%(sname)s'" msgid "Could not add books to shelf: %(sname)s" msgstr "Kan boeken niet toevoegen aan boekenplank '%(sname)s'" -#: cps/shelf.py:180 +#: cps/shelf.py:181 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "Het boek werd verwijderd van de boekenplank '%(sname)s'" -#: cps/shelf.py:186 +#: cps/shelf.py:190 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "Sorry, je mag geen boeken verwijderen van deze boekenplank: %(sname)s" -#: cps/shelf.py:207 cps/shelf.py:231 +#: cps/shelf.py:211 cps/shelf.py:235 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "Er bestaat al een boekenplank met de naam '%(title)s'." -#: cps/shelf.py:212 +#: cps/shelf.py:216 #, python-format msgid "Shelf %(title)s created" msgstr "Boekenplank '%(title)s' is aangemaakt" -#: cps/shelf.py:214 cps/shelf.py:242 +#: cps/shelf.py:218 cps/shelf.py:246 msgid "There was an error" msgstr "Er is een fout opgetreden" -#: cps/shelf.py:215 cps/shelf.py:217 +#: cps/shelf.py:219 cps/shelf.py:221 msgid "create a shelf" msgstr "creëer een boekenplank" -#: cps/shelf.py:240 +#: cps/shelf.py:244 #, python-format msgid "Shelf %(title)s changed" msgstr "Boekenplank '%(title)s' is aangepast" -#: cps/shelf.py:243 cps/shelf.py:245 +#: cps/shelf.py:247 cps/shelf.py:249 msgid "Edit a shelf" msgstr "Pas een boekenplank aan" -#: cps/shelf.py:289 +#: cps/shelf.py:301 #, python-format msgid "Shelf: '%(name)s'" msgstr "Boekenplank: '%(name)s'" -#: cps/shelf.py:292 +#: cps/shelf.py:304 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Kan boekenplank niet openen: de boekenplank bestaat niet of is ontoegankelijk" -#: cps/shelf.py:323 +#: cps/shelf.py:342 +msgid "Hidden Book" +msgstr "" + +#: cps/shelf.py:347 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Volgorde bewerken van boekenplank '%(name)s'" -#: cps/ub.py:57 +#: cps/ub.py:56 msgid "Recently Added" msgstr "Recent toegevoegd" -#: cps/ub.py:59 +#: cps/ub.py:58 msgid "Show recent books" msgstr "Recent toegevoegde boeken tonen" -#: cps/templates/index.xml:17 cps/ub.py:60 +#: cps/templates/index.xml:17 cps/ub.py:59 msgid "Hot Books" msgstr "Populaire boeken" -#: cps/ub.py:61 -msgid "Show hot books" +#: cps/ub.py:60 +msgid "Show Hot Books" msgstr "Populaire boeken tonen" -#: cps/templates/index.xml:24 cps/ub.py:64 -msgid "Best rated Books" +#: cps/templates/index.xml:24 cps/ub.py:63 cps/web.py:508 +msgid "Top Rated Books" msgstr "Best beoordeelde boeken" -#: cps/ub.py:66 -msgid "Show best rated books" +#: cps/ub.py:65 +msgid "Show Top Rated Books" msgstr "Best beoordeelde boeken tonen" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67 -#: cps/web.py:1011 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:66 +#: cps/web.py:1005 msgid "Read Books" msgstr "Gelezen boeken" -#: cps/ub.py:69 +#: cps/ub.py:68 msgid "Show read and unread" msgstr "Gelezen/Ongelezen boeken tonen" -#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71 -#: cps/web.py:1015 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:70 +#: cps/web.py:1009 msgid "Unread Books" msgstr "Ongelezen boeken" -#: cps/ub.py:73 +#: cps/ub.py:72 msgid "Show unread" msgstr "Ongelezen boeken tonen" -#: cps/ub.py:74 +#: cps/ub.py:73 msgid "Discover" msgstr "Willekeurige boeken" -#: cps/ub.py:76 +#: cps/ub.py:75 msgid "Show random books" msgstr "Willekeurige boeken tonen" -#: cps/templates/index.xml:75 cps/ub.py:77 +#: cps/templates/index.xml:75 cps/ub.py:76 cps/web.py:787 msgid "Categories" msgstr "Categorieën" -#: cps/ub.py:79 +#: cps/ub.py:78 msgid "Show category selection" msgstr "Categoriekeuze tonen" -#: cps/templates/book_edit.html:71 cps/templates/index.xml:82 -#: cps/templates/search_form.html:53 cps/ub.py:80 +#: cps/templates/book_edit.html:69 cps/templates/index.xml:82 +#: cps/templates/search_form.html:53 cps/ub.py:79 cps/web.py:715 msgid "Series" msgstr "Boekenreeksen" -#: cps/ub.py:82 +#: cps/ub.py:81 msgid "Show series selection" msgstr "Boekenreeksen keuze tonen" -#: cps/templates/index.xml:61 cps/ub.py:83 +#: cps/templates/index.xml:61 cps/ub.py:82 msgid "Authors" msgstr "Auteurs" -#: cps/ub.py:85 +#: cps/ub.py:84 msgid "Show author selection" msgstr "Auteurkeuze tonen" -#: cps/templates/index.xml:68 cps/ub.py:87 +#: cps/templates/index.xml:68 cps/ub.py:86 cps/web.py:699 msgid "Publishers" msgstr "Uitgevers" -#: cps/ub.py:89 +#: cps/ub.py:88 msgid "Show publisher selection" msgstr "Uitgeverskeuze tonen" -#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:90 +#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:89 +#: cps/web.py:770 msgid "Languages" msgstr "Talen" -#: cps/ub.py:93 +#: cps/ub.py:92 msgid "Show language selection" msgstr "Taalkeuze tonen" -#: cps/ub.py:94 +#: cps/templates/index.xml:96 cps/ub.py:93 msgid "Ratings" msgstr "Beoordelingen" -#: cps/ub.py:96 +#: cps/ub.py:95 msgid "Show ratings selection" msgstr "Beoordelingen tonen" -#: cps/templates/index.xml:96 cps/ub.py:97 +#: cps/templates/index.xml:104 cps/ub.py:96 msgid "File formats" msgstr "Bestandsformaten" -#: cps/ub.py:99 +#: cps/ub.py:98 msgid "Show file formats selection" msgstr "Bestandsformaten tonen" -#: cps/updater.py:252 cps/updater.py:359 cps/updater.py:372 +#: cps/updater.py:262 cps/updater.py:369 cps/updater.py:382 msgid "Unexpected data while reading update information" msgstr "Onverwachte gegevens tijdens het uitlezen van de update-informatie" -#: cps/updater.py:259 cps/updater.py:365 +#: cps/updater.py:269 cps/updater.py:375 msgid "No update available. You already have the latest version installed" msgstr "Geen update beschikbaar. Je beschikt al over de nieuwste versie" -#: cps/updater.py:285 +#: cps/updater.py:295 msgid "A new update is available. Click on the button below to update to the latest version." msgstr "Er is een update beschikbaar. Klik op de knop hieronder om te updaten naar de nieuwste versie." -#: cps/updater.py:338 +#: cps/updater.py:348 msgid "Could not fetch update information" msgstr "De update-informatie kan niet worden opgehaald" -#: cps/updater.py:352 +#: cps/updater.py:362 msgid "No release information available" msgstr "Geen wijzigingslog beschikbaar" -#: cps/updater.py:405 cps/updater.py:414 +#: cps/updater.py:415 cps/updater.py:424 #, 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 versie: %(version)s" -#: cps/updater.py:424 +#: cps/updater.py:434 msgid "Click on the button below to update to the latest stable version." msgstr "Druk op onderstaande knop om de laatste stabiele versie te installeren." -#: cps/web.py:486 +#: cps/web.py:480 msgid "Recently Added Books" msgstr "Recent toegevoegde boeken" -#: cps/web.py:514 -msgid "Best rated books" -msgstr "Best beoordeelde boeken" - -#: cps/templates/index.xml:38 cps/web.py:522 -msgid "Random Books" -msgstr "Willekeurige boeken" +#: cps/templates/index.html:5 cps/web.py:516 +msgid "Discover (Random Books)" +msgstr "Verkennen (willekeurige boeken)" -#: cps/web.py:548 +#: cps/web.py:542 msgid "Books" msgstr "Boeken" -#: cps/web.py:575 -msgid "Hot Books (most downloaded)" +#: cps/web.py:569 +msgid "Hot Books (Most Downloaded)" msgstr "Populaire boeken (meest gedownload)" -#: cps/web.py:586 cps/web.py:1382 cps/web.py:1478 -msgid "Error opening eBook. File does not exist or file is not accessible:" +#: cps/web.py:580 +msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Kan e-boek niet openen. Het bestand bestaat niet of is niet toegankelijk:" -#: cps/web.py:599 +#: cps/web.py:593 #, python-format msgid "Author: %(name)s" msgstr "Auteur: %(name)s" -#: cps/web.py:611 +#: cps/web.py:605 #, python-format msgid "Publisher: %(name)s" msgstr "Uitgever: %(name)s" -#: cps/web.py:622 +#: cps/web.py:616 #, python-format msgid "Series: %(serie)s" msgstr "Reeks: %(serie)s" -#: cps/web.py:633 +#: cps/web.py:627 #, python-format msgid "Rating: %(rating)s stars" msgstr "Beoordeling: %(rating)s sterren" -#: cps/web.py:644 +#: cps/web.py:638 #, python-format msgid "File format: %(format)s" msgstr "Bestandsformaat: %(format)s" -#: cps/web.py:656 +#: cps/web.py:650 #, python-format msgid "Category: %(name)s" msgstr "Categorie: %(name)s" -#: cps/web.py:673 +#: cps/web.py:667 #, python-format msgid "Language: %(name)s" msgstr "Taal: %(name)s" -#: cps/web.py:705 -msgid "Publisher list" -msgstr "Uitgeverslijst" - -#: cps/web.py:721 -msgid "Series list" -msgstr "Boekenreeksen" - -#: cps/web.py:735 +#: cps/web.py:729 msgid "Ratings list" msgstr "Beoordelingen" -#: cps/web.py:748 +#: cps/web.py:742 msgid "File formats list" msgstr "Alle bestandsformaten" -#: cps/web.py:776 -msgid "Available languages" -msgstr "Beschikbare talen" - -#: cps/web.py:793 -msgid "Category list" -msgstr "Categorielijst" - -#: cps/templates/layout.html:73 cps/web.py:807 +#: cps/templates/layout.html:73 cps/templates/tasks.html:7 cps/web.py:801 msgid "Tasks" msgstr "Taken" -#: cps/templates/feed.xml:33 cps/templates/layout.html:44 -#: cps/templates/layout.html:45 cps/web.py:829 cps/web.py:831 +#: cps/templates/book_edit.html:212 cps/templates/feed.xml:33 +#: cps/templates/layout.html:44 cps/templates/layout.html:47 +#: cps/templates/search_form.html:170 cps/web.py:821 cps/web.py:823 msgid "Search" msgstr "Zoeken" -#: cps/web.py:881 +#: cps/web.py:873 msgid "Published after " msgstr "Gepubliceerd na " -#: cps/web.py:888 +#: cps/web.py:880 msgid "Published before " msgstr "Gepubliceerd vóór " -#: cps/web.py:902 +#: cps/web.py:894 #, python-format msgid "Rating <= %(rating)s" msgstr "Beoordeling <= %(rating)s" -#: cps/web.py:904 +#: cps/web.py:896 #, python-format msgid "Rating >= %(rating)s" msgstr "Beoordeling >= %(rating)s" -#: cps/web.py:970 cps/web.py:982 +#: cps/web.py:962 cps/web.py:976 msgid "search" msgstr "zoeken" -#: cps/web.py:1067 +#: cps/web.py:1060 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Het boek is in de wachtrij geplaatst om te worden verstuurd aan %(kindlemail)s" -#: cps/web.py:1071 +#: cps/web.py:1064 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "Fout opgetreden bij het versturen van dit boek: %(res)s" -#: cps/web.py:1073 +#: cps/web.py:1066 msgid "Please configure your kindle e-mail address first..." msgstr "Stel je kindle-e-mailadres in..." -#: cps/web.py:1087 +#: cps/web.py:1083 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "" -#: cps/web.py:1088 cps/web.py:1094 cps/web.py:1119 cps/web.py:1123 -#: cps/web.py:1128 cps/web.py:1132 +#: cps/web.py:1084 cps/web.py:1090 cps/web.py:1115 cps/web.py:1119 +#: cps/web.py:1124 cps/web.py:1128 msgid "register" msgstr "registreren" -#: cps/web.py:1121 +#: cps/web.py:1117 msgid "Your e-mail is not allowed to register" msgstr "Dit e-mailadres mag niet worden gebruikt voor registratie" -#: cps/web.py:1124 +#: cps/web.py:1120 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Er is een bevestigingse-mail verstuurd naar je e-mailadres." -#: cps/web.py:1127 +#: cps/web.py:1123 msgid "This username or e-mail address is already in use." msgstr "Deze gebruikersnaam of e-mailadres is al in gebruik." -#: cps/web.py:1144 +#: cps/web.py:1140 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1154 cps/web.py:1281 +#: cps/web.py:1150 cps/web.py:1277 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "je bent ingelogd als: '%(nickname)s'" -#: cps/web.py:1159 +#: cps/web.py:1155 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "Kan niet inloggen, LDAP server niet bereikbaar, contacteer de beheerder" -#: cps/web.py:1163 cps/web.py:1186 +#: cps/web.py:1159 cps/web.py:1182 msgid "Wrong Username or Password" msgstr "Verkeerde gebruikersnaam of wachtwoord" -#: cps/web.py:1170 +#: cps/web.py:1166 msgid "New Password was send to your email address" msgstr "" -#: cps/web.py:1176 +#: cps/web.py:1172 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1182 +#: cps/web.py:1178 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Je bent ingelogd als: '%(nickname)s'" -#: cps/web.py:1189 cps/web.py:1213 +#: cps/web.py:1185 cps/web.py:1209 msgid "login" msgstr "inloggen" -#: cps/web.py:1225 cps/web.py:1259 +#: cps/web.py:1221 cps/web.py:1255 msgid "Token not found" msgstr "Toegangssleutel niet gevonden" -#: cps/web.py:1234 cps/web.py:1267 +#: cps/web.py:1230 cps/web.py:1263 msgid "Token has expired" msgstr "Toegangssleutel is verlopen" -#: cps/web.py:1243 +#: cps/web.py:1239 msgid "Success! Please return to your device" msgstr "Gelukt! Ga terug naar je apparaat" -#: cps/web.py:1320 cps/web.py:1363 cps/web.py:1369 +#: cps/web.py:1320 cps/web.py:1365 cps/web.py:1371 #, python-format msgid "%(name)s's profile" msgstr "%(name)s's profiel" -#: cps/web.py:1365 +#: cps/web.py:1367 msgid "Profile updated" msgstr "Profiel bijgewerkt" -#: cps/web.py:1394 cps/web.py:1397 cps/web.py:1400 cps/web.py:1407 -#: cps/web.py:1412 +#: cps/web.py:1384 cps/web.py:1480 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "" + +#: cps/web.py:1396 cps/web.py:1399 cps/web.py:1402 cps/web.py:1409 +#: cps/web.py:1414 msgid "Read a Book" msgstr "Lees een boek" -#: cps/web.py:1423 +#: cps/web.py:1425 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "" @@ -928,23 +951,26 @@ msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "KindleGen mislukt; fout: %(error)s. Bericht: %(message)s" #: cps/templates/admin.html:9 -msgid "User list" +msgid "Users" msgstr "Gebruikerslijst" -#: cps/templates/admin.html:12 -msgid "Nickname" +#: cps/templates/admin.html:12 cps/templates/login.html:8 +#: cps/templates/login.html:9 cps/templates/register.html:7 +#: cps/templates/user_edit.html:8 +msgid "Username" msgstr "Gebruikersnaam" -#: cps/templates/admin.html:13 -msgid "E-mail" +#: cps/templates/admin.html:13 cps/templates/register.html:11 +#: cps/templates/user_edit.html:13 +msgid "E-mail Address" msgstr "e-mailadres" -#: cps/templates/admin.html:14 -msgid "Kindle" +#: cps/templates/admin.html:14 cps/templates/user_edit.html:26 +msgid "Send to Kindle E-mail Address" msgstr "Kindle-e-mailadres" #: cps/templates/admin.html:15 -msgid "DLS" +msgid "Downloads" msgstr "Downloads" #: cps/templates/admin.html:16 cps/templates/layout.html:76 @@ -958,7 +984,7 @@ msgid "Download" msgstr "Downloaden" #: cps/templates/admin.html:18 -msgid "View Ebooks" +msgid "View eBooks" msgstr "Boeken lezen" #: cps/templates/admin.html:19 cps/templates/layout.html:65 @@ -969,28 +995,32 @@ msgstr "Uploaden" msgid "Edit" msgstr "Bewerken" +#: cps/templates/admin.html:38 +msgid "Add New User" +msgstr "" + #: cps/templates/admin.html:44 -msgid "SMTP e-mail server settings" +msgid "E-mail Server Settings" msgstr "SMTP-serverinstellingen" #: cps/templates/admin.html:47 cps/templates/email_edit.html:11 -msgid "SMTP hostname" +msgid "SMTP Hostname" msgstr "SMTP-hostnaam" -#: cps/templates/admin.html:48 -msgid "SMTP port" +#: cps/templates/admin.html:48 cps/templates/email_edit.html:15 +msgid "SMTP Port" msgstr "SMTP-poort" -#: cps/templates/admin.html:49 -msgid "SSL" +#: cps/templates/admin.html:49 cps/templates/email_edit.html:19 +msgid "Encryption" msgstr "SSL" #: cps/templates/admin.html:50 cps/templates/email_edit.html:27 -msgid "SMTP login" +msgid "SMTP Login" msgstr "SMTP-gebruikersnaam" -#: cps/templates/admin.html:51 -msgid "From mail" +#: cps/templates/admin.html:51 cps/templates/email_edit.html:35 +msgid "From E-mail" msgstr "Van e-mail" #: cps/templates/admin.html:61 @@ -1002,63 +1032,71 @@ msgid "Configuration" msgstr "Instellingen" #: cps/templates/admin.html:70 -msgid "Calibre DB dir" +msgid "Calibre Database Directory" msgstr "Calibre DB-map" -#: cps/templates/admin.html:74 -msgid "Log level" +#: cps/templates/admin.html:74 cps/templates/config_edit.html:122 +msgid "Log Level" msgstr "Logniveau" #: cps/templates/admin.html:78 msgid "Port" msgstr "Poort" -#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:23 -msgid "Books per page" +#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:27 +msgid "Books per Page" msgstr "Aantal boeken per pagina" #: cps/templates/admin.html:88 -msgid "Uploading" +msgid "Uploads" msgstr "Uploaden toestaan" #: cps/templates/admin.html:92 -msgid "Anonymous browsing" +msgid "Anonymous Browsing" msgstr "Anoniem verkennen" #: cps/templates/admin.html:96 -msgid "Public registration" +msgid "Public Registration" msgstr "Openbare registratie" -#: cps/templates/admin.html:100 cps/templates/remote_login.html:4 -msgid "Remote login" +#: cps/templates/admin.html:100 +msgid "Magic Link Remote Login" msgstr "Inloggen op afstand" #: cps/templates/admin.html:104 -msgid "Reverse proxy login" +msgid "Reverse Proxy Login" msgstr "" #: cps/templates/admin.html:109 msgid "Reverse proxy header name" msgstr "" +#: cps/templates/admin.html:114 +msgid "Edit Basic Configuration" +msgstr "" + +#: cps/templates/admin.html:115 +msgid "Edit UI Configuration" +msgstr "" + #: cps/templates/admin.html:121 msgid "Administration" msgstr "Systeembeheer" #: cps/templates/admin.html:122 -msgid "View Logfiles" +msgid "View Logs" msgstr "Logboeken bekijken" #: cps/templates/admin.html:123 -msgid "Reconnect to Calibre DB" +msgid "Reconnect Calibre Database" msgstr "Opnieuw verbinden met Calibre DB" #: cps/templates/admin.html:124 -msgid "Restart Calibre-Web" +msgid "Restart" msgstr "Calibre-Web herstarten" #: cps/templates/admin.html:125 -msgid "Stop Calibre-Web" +msgid "Shutdown" msgstr "Calibre-Web stoppen" #: cps/templates/admin.html:131 @@ -1078,7 +1116,7 @@ msgid "Current version" msgstr "Huidige versie" #: cps/templates/admin.html:148 -msgid "Check for update" +msgid "Check for Update" msgstr "Controleren op updates" #: cps/templates/admin.html:149 @@ -1086,30 +1124,29 @@ msgid "Perform Update" msgstr "Update uitvoeren" #: cps/templates/admin.html:161 -msgid "Do you really want to restart Calibre-Web?" +msgid "Are you sure you want to restart?" msgstr "Weet je zeker dat je Calibre-Web wilt herstarten?" #: cps/templates/admin.html:166 cps/templates/admin.html:180 #: cps/templates/admin.html:200 cps/templates/shelf.html:72 -msgid "Ok" +msgid "OK" msgstr "Oké" #: cps/templates/admin.html:167 cps/templates/admin.html:181 -#: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 +#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:194 +#: cps/templates/config_edit.html:346 cps/templates/config_view_edit.html:151 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92 -#: cps/templates/layout.html:28 cps/templates/shelf.html:73 -#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32 -#: cps/templates/user_edit.html:131 -msgid "Back" -msgstr "Annuleren" +#: cps/templates/shelf.html:73 cps/templates/shelf_edit.html:19 +#: cps/templates/user_edit.html:137 +msgid "Cancel" +msgstr "" #: cps/templates/admin.html:179 -msgid "Do you really want to stop Calibre-Web?" +msgid "Are you sure you want to shutdown?" msgstr "Weet je zeker dat je Calibre-Web wilt stoppen?" #: cps/templates/admin.html:191 -msgid "Updating, please do not reload page" +msgid "Updating, please do not reload this page" msgstr "Bezig met bijwerken; vernieuw de pagina niet" #: cps/templates/author.html:15 @@ -1136,161 +1173,159 @@ msgstr "beperken" msgid "More by" msgstr "Meer van" -#: cps/templates/book_edit.html:12 +#: cps/templates/book_edit.html:10 msgid "Delete Book" msgstr "Boek verwijderen" -#: cps/templates/book_edit.html:15 +#: cps/templates/book_edit.html:13 msgid "Delete formats:" msgstr "Formaten verwijderen:" -#: cps/templates/book_edit.html:18 cps/templates/book_edit.html:195 -#: cps/templates/email_edit.html:91 +#: cps/templates/book_edit.html:16 cps/templates/book_edit.html:193 +#: cps/templates/email_edit.html:91 cps/templates/user_edit.html:65 +#: cps/templates/user_edit.html:177 msgid "Delete" msgstr "Verwijderen" -#: cps/templates/book_edit.html:26 +#: cps/templates/book_edit.html:24 msgid "Convert book format:" msgstr "Boekformaat converteren:" -#: cps/templates/book_edit.html:30 +#: cps/templates/book_edit.html:28 msgid "Convert from:" msgstr "Converteren van:" -#: cps/templates/book_edit.html:32 cps/templates/book_edit.html:39 +#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:37 msgid "select an option" msgstr "kies een optie" -#: cps/templates/book_edit.html:37 +#: cps/templates/book_edit.html:35 msgid "Convert to:" msgstr "Converteren naar:" -#: cps/templates/book_edit.html:46 +#: cps/templates/book_edit.html:44 msgid "Convert book" msgstr "Boek converteren" -#: cps/templates/book_edit.html:55 cps/templates/search_form.html:6 +#: cps/templates/book_edit.html:53 cps/templates/search_form.html:6 msgid "Book Title" 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 +#: cps/templates/book_edit.html:57 cps/templates/book_edit.html:256 +#: cps/templates/book_edit.html:274 cps/templates/search_form.html:10 msgid "Author" msgstr "Auteur" -#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:260 -#: cps/templates/book_edit.html:275 cps/templates/search_form.html:126 +#: cps/templates/book_edit.html:61 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:276 cps/templates/search_form.html:126 msgid "Description" msgstr "Omschrijving" -#: cps/templates/book_edit.html:67 cps/templates/search_form.html:33 +#: cps/templates/book_edit.html:65 cps/templates/search_form.html:33 msgid "Tags" msgstr "Labels" -#: cps/templates/book_edit.html:75 -msgid "Series id" -msgstr "Serie-id" +#: cps/templates/book_edit.html:73 +msgid "Series ID" +msgstr "" -#: cps/templates/book_edit.html:79 +#: cps/templates/book_edit.html:77 msgid "Rating" msgstr "Beoordeling" -#: cps/templates/book_edit.html:83 -msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +#: cps/templates/book_edit.html:81 +msgid "Fetch Cover from URL (JPEG - Image will be downloaded and stored in database)" 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" +#: cps/templates/book_edit.html:85 +msgid "Upload Cover from Local Disk" msgstr "Omslag uploaden vanaf computer" -#: cps/templates/book_edit.html:92 cps/templates/detail.html:165 -msgid "Publishing date" +#: cps/templates/book_edit.html:90 +msgid "Published Date" msgstr "Publicatiedatum" -#: cps/templates/book_edit.html:99 cps/templates/book_edit.html:257 -#: cps/templates/book_edit.html:274 cps/templates/detail.html:156 +#: cps/templates/book_edit.html:97 cps/templates/book_edit.html:258 +#: cps/templates/book_edit.html:275 cps/templates/detail.html:156 #: cps/templates/search_form.html:14 msgid "Publisher" msgstr "Uitgever" -#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:30 +#: cps/templates/book_edit.html:101 cps/templates/detail.html:123 +#: cps/templates/user_edit.html:31 msgid "Language" msgstr "Taal" -#: cps/templates/book_edit.html:113 cps/templates/search_form.html:137 +#: cps/templates/book_edit.html:111 cps/templates/search_form.html:137 msgid "Yes" msgstr "Ja" -#: cps/templates/book_edit.html:114 cps/templates/search_form.html:138 +#: cps/templates/book_edit.html:112 cps/templates/search_form.html:138 msgid "No" msgstr "Nee" -#: cps/templates/book_edit.html:160 -msgid "Upload format" +#: cps/templates/book_edit.html:158 +msgid "Upload Format" msgstr "Uploadformaat" -#: cps/templates/book_edit.html:169 -msgid "view book after edit" +#: cps/templates/book_edit.html:167 +msgid "View Book on Save" msgstr "boek inkijken na bewerking" -#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:208 -msgid "Get metadata" +#: cps/templates/book_edit.html:170 cps/templates/book_edit.html:206 +msgid "Fetch Metadata" msgstr "Metagegevens ophalen" -#: 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:170 cps/templates/shelf_edit.html:17 -#: cps/templates/user_edit.html:129 -msgid "Submit" -msgstr "Opslaan" +#: cps/templates/book_edit.html:171 cps/templates/config_edit.html:343 +#: cps/templates/config_view_edit.html:150 cps/templates/email_edit.html:38 +#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:135 +msgid "Save" +msgstr "" -#: cps/templates/book_edit.html:187 +#: cps/templates/book_edit.html:185 msgid "Are you really sure?" msgstr "Weet je het zeker?" -#: cps/templates/book_edit.html:190 -msgid "Book will be deleted from Calibre database" +#: cps/templates/book_edit.html:188 +msgid "This book will be permanently erased from database" msgstr "Het boek wordt verwijderd uit de Calibre-database" -#: cps/templates/book_edit.html:191 -msgid "and from hard disk" +#: cps/templates/book_edit.html:189 +msgid "and hard disk" msgstr "en van de harde schijf" -#: cps/templates/book_edit.html:211 +#: cps/templates/book_edit.html:209 msgid "Keyword" msgstr "Trefwoord" -#: cps/templates/book_edit.html:212 +#: cps/templates/book_edit.html:210 msgid " Search keyword " msgstr " Trefwoord zoeken " -#: cps/templates/book_edit.html:214 cps/templates/layout.html:47 -msgid "Go!" -msgstr "Ga!" - -#: cps/templates/book_edit.html:218 +#: cps/templates/book_edit.html:216 msgid "Click the cover to load metadata to the form" 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 +#: cps/templates/book_edit.html:231 cps/templates/book_edit.html:271 msgid "Loading..." msgstr "Bezig met laden..." -#: cps/templates/book_edit.html:235 cps/templates/layout.html:192 -#: cps/templates/layout.html:224 +#: cps/templates/book_edit.html:236 cps/templates/layout.html:191 +#: cps/templates/layout.html:223 cps/templates/modal_restriction.html:34 +#: cps/templates/user_edit.html:164 msgid "Close" msgstr "Sluiten" -#: cps/templates/book_edit.html:262 cps/templates/book_edit.html:276 +#: cps/templates/book_edit.html:263 cps/templates/book_edit.html:277 msgid "Source" msgstr "Bron" -#: cps/templates/book_edit.html:271 +#: cps/templates/book_edit.html:272 msgid "Search error!" msgstr "Zoekfout!" -#: cps/templates/book_edit.html:272 -msgid "No Result(s) found! Please try aonther keyword." +#: cps/templates/book_edit.html:273 +msgid "No Result(s) found! Please try another keyword." msgstr "Geen resultaten gevonden! Gebruik een ander trefwoord." #: cps/templates/config_edit.html:12 @@ -1298,7 +1333,7 @@ msgid "Library Configuration" msgstr "Bibliotheekinstellingen" #: cps/templates/config_edit.html:19 -msgid "Location of Calibre database" +msgid "Location of Calibre Database" msgstr "Locatie van de Calibre-database" #: cps/templates/config_edit.html:25 @@ -1350,7 +1385,7 @@ msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "SSL-sleutellocatie ('keyfile' - laat leeg voor niet-SSL-servers)" #: cps/templates/config_edit.html:99 -msgid "Update channel" +msgid "Update Channel" msgstr "Updatekanaal" #: cps/templates/config_edit.html:101 @@ -1373,10 +1408,6 @@ msgstr "Bèta (automatisch)" msgid "Logfile Configuration" msgstr "Logbestanden" -#: cps/templates/config_edit.html:122 -msgid "Log Level" -msgstr "Logniveau" - #: cps/templates/config_edit.html:131 msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "Locatie en naam van logbestand (calibre-web.log indien leeg)" @@ -1394,255 +1425,271 @@ msgid "Feature Configuration" msgstr "Geavanceerde opties" #: cps/templates/config_edit.html:158 -msgid "Enable uploading" +msgid "Enable Uploads" msgstr "Uploaden inschakelen" #: cps/templates/config_edit.html:162 -msgid "Enable anonymous browsing" +msgid "Enable Anonymous Browsing" msgstr "Anoniem verkennen inschakelen" #: cps/templates/config_edit.html:166 -msgid "Enable public registration" +msgid "Enable Public Registration" msgstr "Openbare registratie inschakelen" #: cps/templates/config_edit.html:170 -msgid "Enable remote login (\"magic link\")" +msgid "Enable Magic Link Remote Login" msgstr "Inloggen op afstand inschakelen ('magic link')" #: cps/templates/config_edit.html:175 +msgid "Enable Kobo sync" +msgstr "" + +#: cps/templates/config_edit.html:180 +msgid "Proxy unknown requests to Kobo Store" +msgstr "" + +#: cps/templates/config_edit.html:187 msgid "Use Goodreads" msgstr "" -#: cps/templates/config_edit.html:176 -msgid "Obtain an API Key" +#: cps/templates/config_edit.html:188 +msgid "Create an API Key" msgstr "API-sleutel verkrijgen" -#: cps/templates/config_edit.html:180 +#: cps/templates/config_edit.html:192 msgid "Goodreads API Key" msgstr "Goodreads API-sleutel" -#: cps/templates/config_edit.html:184 +#: cps/templates/config_edit.html:196 msgid "Goodreads API Secret" msgstr "Goodreads API-geheim" -#: cps/templates/config_edit.html:191 +#: cps/templates/config_edit.html:203 msgid "Login type" msgstr "" -#: cps/templates/config_edit.html:193 -msgid "Use standard Authentication" +#: cps/templates/config_edit.html:205 +msgid "Use Standard Authentication" msgstr "Gebruik standaard authenticatie" -#: cps/templates/config_edit.html:195 +#: cps/templates/config_edit.html:207 msgid "Use LDAP Authentication" msgstr "Gebruik LDAP authenticatie" -#: cps/templates/config_edit.html:198 +#: cps/templates/config_edit.html:210 msgid "Use OAuth" msgstr "Gebruik OAuth" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:217 msgid "LDAP Server Host Name or IP Address" msgstr "LDAP Server hostnaam of IP-adres" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:221 msgid "LDAP Server Port" msgstr "LDAP Server Poort" -#: cps/templates/config_edit.html:213 -msgid "LDAP schema (ldap or ldaps)" +#: cps/templates/config_edit.html:225 +msgid "LDAP Schema (LDAP or LPAPS)" msgstr "LDAP schema (ldap of ldaps)" -#: cps/templates/config_edit.html:217 -msgid "LDAP Admin username" +#: cps/templates/config_edit.html:229 +msgid "LDAP Administrator Username" msgstr "" -#: cps/templates/config_edit.html:221 -msgid "LDAP Admin password" +#: cps/templates/config_edit.html:233 +msgid "LDAP Administrator Password" msgstr "" -#: cps/templates/config_edit.html:226 -msgid "LDAP Server use SSL" +#: cps/templates/config_edit.html:238 +msgid "LDAP Server Enable SSL" msgstr "" -#: cps/templates/config_edit.html:230 -msgid "LDAP Server use TLS" +#: cps/templates/config_edit.html:242 +msgid "LDAP Server Enable TLS" msgstr "" -#: cps/templates/config_edit.html:234 +#: cps/templates/config_edit.html:246 msgid "LDAP Server Certificate" msgstr "" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:250 msgid "LDAP SSL Certificate Path" msgstr "" -#: cps/templates/config_edit.html:243 +#: cps/templates/config_edit.html:255 msgid "LDAP Distinguished Name (DN)" msgstr "" -#: cps/templates/config_edit.html:247 -msgid "LDAP User object filter" +#: cps/templates/config_edit.html:259 +msgid "LDAP User Object Filter" msgstr "" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:264 msgid "LDAP Server is OpenLDAP?" msgstr "" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:272 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:263 +#: cps/templates/config_edit.html:275 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:279 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:276 +#: cps/templates/config_edit.html:288 msgid "Allow Reverse Proxy Authentication" msgstr "" -#: cps/templates/config_edit.html:280 +#: cps/templates/config_edit.html:292 msgid "Reverse Proxy Header Name" msgstr "" -#: cps/templates/config_edit.html:292 +#: cps/templates/config_edit.html:304 msgid "External binaries" msgstr "Externe programma's" -#: cps/templates/config_edit.html:300 -msgid "No converter" +#: cps/templates/config_edit.html:312 +msgid "No Converter" msgstr "Geen conversieprogramma" -#: cps/templates/config_edit.html:302 +#: cps/templates/config_edit.html:314 msgid "Use Kindlegen" msgstr "KindleGen" -#: cps/templates/config_edit.html:304 +#: cps/templates/config_edit.html:316 msgid "Use calibre's ebook converter" msgstr "Calibre's e-boekconversie gebruiken" -#: cps/templates/config_edit.html:308 +#: cps/templates/config_edit.html:320 msgid "E-Book converter settings" msgstr "Conversie-instellingen" -#: cps/templates/config_edit.html:312 +#: cps/templates/config_edit.html:324 msgid "Path to convertertool" msgstr "Locatie van conversieprogramma" -#: cps/templates/config_edit.html:318 +#: cps/templates/config_edit.html:330 msgid "Location of Unrar binary" msgstr "Locatie van Unrar-programma" -#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 -#: cps/templates/login.html:4 +#: cps/templates/config_edit.html:349 cps/templates/layout.html:84 +#: cps/templates/login.html:4 cps/templates/login.html:20 msgid "Login" msgstr "Inloggen" -#: cps/templates/config_view_edit.html:12 +#: cps/templates/config_view_edit.html:16 msgid "View Configuration" msgstr "Instellingen bekijken" -#: cps/templates/config_view_edit.html:19 cps/templates/shelf_edit.html:7 +#: cps/templates/config_view_edit.html:23 cps/templates/shelf_edit.html:7 msgid "Title" msgstr "Titel" -#: cps/templates/config_view_edit.html:27 -msgid "No. of random books to show" +#: cps/templates/config_view_edit.html:31 +msgid "No. of Random Books to Display" msgstr "Aantal te tonen willekeurige boeken" -#: cps/templates/config_view_edit.html:31 -msgid "No. of authors to show before hiding (0=disable hiding)" +#: cps/templates/config_view_edit.html:35 +msgid "No. of Authors to Display Before Hiding (0=Disable Hiding)" msgstr "Aantal te tonen auteurs alvorens te verbergen (0=nooit verbergen)" -#: cps/templates/config_view_edit.html:35 cps/templates/readcbr.html:112 +#: cps/templates/config_view_edit.html:39 cps/templates/readcbr.html:112 msgid "Theme" msgstr "Thema" -#: cps/templates/config_view_edit.html:37 +#: cps/templates/config_view_edit.html:41 msgid "Standard Theme" msgstr "Standaard thema" -#: cps/templates/config_view_edit.html:38 +#: cps/templates/config_view_edit.html:42 msgid "caliBlur! Dark Theme" msgstr "caliBlur! donker thema" -#: cps/templates/config_view_edit.html:42 -msgid "Regular expression for ignoring columns" +#: cps/templates/config_view_edit.html:46 +msgid "Regular Expression for Ignoring Columns" msgstr "Reguliere expressie om kolommen te negeren" -#: cps/templates/config_view_edit.html:46 -msgid "Link read/unread status to Calibre column" +#: cps/templates/config_view_edit.html:50 +msgid "Link Read/Unread Status to Calibre Column" msgstr "Gelezen/Ongelezen-status koppelen aan Calibre-kolom" -#: cps/templates/config_view_edit.html:55 -msgid "Regular expression for title sorting" -msgstr "Reguliere expressie voor het sorteren op titel" - #: cps/templates/config_view_edit.html:59 -msgid "Tags for Mature Content" -msgstr "Labels voor 18+-inhoud" +msgid "View Restrictions based on Calibre column" +msgstr "" + +#: cps/templates/config_view_edit.html:61 cps/templates/email_edit.html:21 +msgid "None" +msgstr "Geen" + +#: cps/templates/config_view_edit.html:68 +msgid "Regular Expression for Title Sorting" +msgstr "Reguliere expressie voor het sorteren op titel" -#: cps/templates/config_view_edit.html:73 -msgid "Default settings for new users" +#: cps/templates/config_view_edit.html:80 +msgid "Default Settings for New Users" msgstr "Standaardinstellingen voor nieuwe gebruikers" -#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:82 -msgid "Admin user" +#: cps/templates/config_view_edit.html:88 cps/templates/user_edit.html:92 +msgid "Admin User" msgstr "Systeembeheerder" -#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:91 +#: cps/templates/config_view_edit.html:92 cps/templates/user_edit.html:97 msgid "Allow Downloads" msgstr "Downloads toestaan" -#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:95 -msgid "Allow book viewer" +#: cps/templates/config_view_edit.html:96 cps/templates/user_edit.html:101 +msgid "Allow eBook Viewer" msgstr "Boeken lezen toestaan" -#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:99 +#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:105 msgid "Allow Uploads" msgstr "Uploads toestaan" -#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:103 +#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:109 msgid "Allow Edit" msgstr "Bewerken toestaan" -#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 -msgid "Allow Delete books" -msgstr "Verwijderen van boeken toestaan" +#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:113 +msgid "Allow Delete Books" +msgstr "" -#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:112 +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:118 msgid "Allow Changing Password" msgstr "Wachtwoord wijzigen toestaan" -#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:116 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:122 msgid "Allow Editing Public Shelfs" msgstr "Bewerken van openbare boekenplanken toestaan" -#: cps/templates/config_view_edit.html:119 -msgid "Default visibilities for new users" +#: cps/templates/config_view_edit.html:126 +msgid "Default Visibilities for New Users" msgstr "Standaard zichtbaar voor nieuwe gebruikers" -#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:74 -msgid "Show random books in detail view" +#: cps/templates/config_view_edit.html:142 +msgid "Show Random Books in Detail View" msgstr "Willekeurige boeken tonen in gedetailleerde weergave" -#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:87 -msgid "Show mature content" -msgstr "18+-inhoud tonen" +#: cps/templates/config_view_edit.html:144 +msgid "Add Allowed/Denied Tags" +msgstr "" + +#: cps/templates/config_view_edit.html:145 +msgid "Add Allowed/Denied custom column values" +msgstr "" #: cps/templates/detail.html:59 -msgid "Read in browser" +msgid "Read in Browser" msgstr "Lezen in webbrowser" #: cps/templates/detail.html:72 -msgid "Listen in browser" +msgid "Listen in Browser" msgstr "Luisteren in webbrowser" #: cps/templates/detail.html:117 @@ -1653,9 +1700,9 @@ msgstr "Boek" msgid "of" msgstr "van" -#: cps/templates/detail.html:123 -msgid "language" -msgstr "taal" +#: cps/templates/detail.html:165 +msgid "Published" +msgstr "" #: cps/templates/detail.html:200 msgid "Mark As Unread" @@ -1678,21 +1725,9 @@ msgid "Add to shelf" msgstr "Toevoegen aan boekenplank" #: cps/templates/detail.html:286 -msgid "Edit metadata" +msgid "Edit 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, 465 voor SSL en 587 voor STARTTLS)" - -#: cps/templates/email_edit.html:19 -msgid "Encryption" -msgstr "Beveiliging" - -#: cps/templates/email_edit.html:21 -msgid "None" -msgstr "Geen" - #: cps/templates/email_edit.html:22 msgid "STARTTLS" msgstr "STARTTLS" @@ -1702,23 +1737,15 @@ msgid "SSL/TLS" msgstr "SSL/TLS" #: cps/templates/email_edit.html:31 -msgid "SMTP password" +msgid "SMTP Password" msgstr "SMTP-wachtwoord" -#: cps/templates/email_edit.html:35 -msgid "From e-mail" -msgstr "Van e-mailadres" - -#: cps/templates/email_edit.html:38 -msgid "Save settings" -msgstr "Instellingen opslaan" - #: cps/templates/email_edit.html:39 -msgid "Save settings and send Test E-Mail" +msgid "Save and Send Test E-mail" msgstr "Instellingen opslaan en test-e-mail versturen" #: cps/templates/email_edit.html:43 -msgid "Allowed domains for registering" +msgid "Allowed Domains (Whitelist)" msgstr "Toegelaten domeinen voor registratie" #: cps/templates/email_edit.html:46 cps/templates/email_edit.html:72 @@ -1734,29 +1761,29 @@ msgid "Enter domainname" msgstr "Voer domeinnaam in" #: cps/templates/email_edit.html:60 -msgid "Denied domains for registering" +msgid "Denied Domains (Blacklist)" msgstr "" #: cps/templates/email_edit.html:90 -msgid "Do you really want to delete this domain rule?" +msgid "Are you sure you want to delete this domain?" msgstr "Weet je zeker dat je deze domeinregel wilt verwijderen?" -#: cps/templates/feed.xml:21 cps/templates/layout.html:176 +#: cps/templates/feed.xml:21 cps/templates/layout.html:175 msgid "Next" msgstr "Volgende" -#: cps/templates/http_error.html:37 -msgid "Create issue" +#: cps/templates/generate_kobo_auth_url.html:5 +msgid "Open the .kobo/Kobo eReader.conf file in a text editor and add (or edit):" +msgstr "" + +#: cps/templates/http_error.html:38 +msgid "Create Issue" msgstr "Probleem melden" -#: cps/templates/http_error.html:44 -msgid "Back to home" +#: cps/templates/http_error.html:45 +msgid "Return to Home" msgstr "Terug naar startpagina" -#: cps/templates/index.html:5 -msgid "Discover (Random Books)" -msgstr "Verkennen (willekeurige boeken)" - #: cps/templates/index.html:64 msgid "Group by series" msgstr "Sorteren op reeks" @@ -1781,7 +1808,11 @@ msgstr "" msgid "The latest Books" msgstr "Recentste boeken" -#: cps/templates/index.xml:42 +#: cps/templates/index.xml:38 +msgid "Random Books" +msgstr "Willekeurige boeken" + +#: cps/templates/index.xml:42 cps/templates/user_edit.html:80 msgid "Show Random Books" msgstr "Willekeurige boeken tonen" @@ -1806,22 +1837,26 @@ msgid "Books ordered by Languages" msgstr "" #: cps/templates/index.xml:100 +msgid "Books ordered by Rating" +msgstr "" + +#: cps/templates/index.xml:108 msgid "Books ordered by file formats" msgstr "" -#: cps/templates/index.xml:103 cps/templates/layout.html:137 +#: cps/templates/index.xml:111 cps/templates/layout.html:136 msgid "Public Shelves" msgstr "Openbare boekenplanken" -#: cps/templates/index.xml:107 +#: cps/templates/index.xml:115 msgid "Books organized in public shelfs, visible to everyone" msgstr "Boeken georganiseerd op openbare boekenplanken, zichtbaar voor iedereen" -#: cps/templates/index.xml:111 cps/templates/layout.html:141 +#: cps/templates/index.xml:119 cps/templates/layout.html:140 msgid "Your Shelves" msgstr "Jouw boekenplanken" -#: cps/templates/index.xml:115 +#: cps/templates/index.xml:123 msgid "User's own shelfs, only visible to the current user himself" msgstr "Eigen boekenplanken, enkel zichtbaar voor huidige gebruiker" @@ -1829,10 +1864,19 @@ msgstr "Eigen boekenplanken, enkel zichtbaar voor huidige gebruiker" msgid "Home" msgstr "Startpagina" +#: cps/templates/layout.html:28 cps/templates/shelf_order.html:32 +#: cps/templates/user_edit.html:178 +msgid "Back" +msgstr "Annuleren" + #: cps/templates/layout.html:34 -msgid "Toggle navigation" +msgid "Toggle Navigation" msgstr "Navigatie aanpassen" +#: cps/templates/layout.html:45 +msgid "Search Library" +msgstr "" + #: cps/templates/layout.html:55 msgid "Advanced Search" msgstr "Geavanceerd zoeken" @@ -1854,74 +1898,101 @@ msgstr "Uitloggen" msgid "Register" msgstr "Registreren" -#: cps/templates/layout.html:116 cps/templates/layout.html:223 +#: cps/templates/layout.html:116 cps/templates/layout.html:222 msgid "Uploading..." msgstr "Bezig met uploaden..." #: cps/templates/layout.html:117 -msgid "please don't refresh the page" -msgstr "vernieuw de pagina niet" +msgid "Please do not refresh the page" +msgstr "" #: cps/templates/layout.html:127 msgid "Browse" msgstr "Verkennen" -#: cps/templates/layout.html:146 +#: cps/templates/layout.html:145 msgid "Create a Shelf" msgstr "Boekenplank aanmaken" -#: cps/templates/layout.html:147 cps/templates/stats.html:3 +#: cps/templates/layout.html:146 cps/templates/stats.html:3 msgid "About" msgstr "Informatie" -#: cps/templates/layout.html:161 +#: cps/templates/layout.html:160 msgid "Previous" msgstr "Vorige" -#: cps/templates/layout.html:188 +#: cps/templates/layout.html:187 msgid "Book Details" msgstr "Boekgegevens" -#: cps/templates/layout.html:222 +#: cps/templates/layout.html:221 msgid "Upload done, processing, please wait..." msgstr "Uploaden voltooid, bezig met verwerken..." -#: cps/templates/layout.html:225 +#: cps/templates/layout.html:224 msgid "Error" msgstr "Fout" -#: cps/templates/login.html:8 cps/templates/login.html:9 -#: cps/templates/register.html:7 cps/templates/user_edit.html:8 -msgid "Username" -msgstr "Gebruikersnaam" - #: cps/templates/login.html:12 cps/templates/login.html:13 #: cps/templates/user_edit.html:21 msgid "Password" msgstr "Wachtwoord" #: cps/templates/login.html:17 -msgid "Remember me" +msgid "Remember Me" msgstr "Mij onthouden" #: cps/templates/login.html:22 -msgid "Forgot password" +msgid "Forgot Password?" msgstr "" #: cps/templates/login.html:25 -msgid "Log in with magic link" +msgid "Log in with Magic Link" msgstr "Inloggen met magische koppeling" -#: cps/templates/logviewer.html:5 -msgid "Show Calibre-Web log" -msgstr "Calibre-Web log inzien" +#: cps/templates/logviewer.html:6 +msgid "Show Calibre-Web Log: " +msgstr "" + +#: cps/templates/logviewer.html:8 +msgid "Calibre-Web Log: " +msgstr "" #: cps/templates/logviewer.html:8 -msgid "Show access log" -msgstr "Toegangslogboek" +msgid "Stream output, can't be displayed" +msgstr "" + +#: cps/templates/logviewer.html:12 +msgid "Show Access Log: " +msgstr "" + +#: cps/templates/modal_restriction.html:6 +msgid "Select allowed/denied Tags" +msgstr "" + +#: cps/templates/modal_restriction.html:7 +msgid "Select allowed/denied Custom Column values" +msgstr "" + +#: cps/templates/modal_restriction.html:8 +msgid "Select allowed/denied Tags of user" +msgstr "" + +#: cps/templates/modal_restriction.html:9 +msgid "Select allowed/denied Custom Column values of user" +msgstr "" + +#: cps/templates/modal_restriction.html:15 +msgid "Enter Tag" +msgstr "" + +#: cps/templates/modal_restriction.html:24 +msgid "Add View Restriction" +msgstr "" #: cps/templates/osd.xml:5 -msgid "Calibre-Web ebook catalog" +msgid "Calibre-Web eBook Catalog" msgstr "Calibre-Web - e-boekcatalogus" #: cps/templates/read.html:74 @@ -2033,51 +2104,51 @@ msgid "Basic txt Reader" msgstr "Basis tekstlezer" #: cps/templates/register.html:4 -msgid "Register a new account" +msgid "Register New Account" msgstr "Nieuw account registreren" #: cps/templates/register.html:8 msgid "Choose a username" msgstr "Kies een gebruikersnaam" -#: cps/templates/register.html:11 cps/templates/user_edit.html:13 -msgid "E-mail address" -msgstr "e-mailadres" - #: cps/templates/register.html:12 msgid "Your email address" msgstr "Je e-mailadres" +#: cps/templates/remote_login.html:4 +msgid "Magic Link - Authorise New Device" +msgstr "" + #: cps/templates/remote_login.html:6 -msgid "Use your other device, login and visit " +msgid "On another device, login and visit:" 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." +#: cps/templates/remote_login.html:10 +msgid "Once verified, you will automatically be logged in on this device." msgstr "Daarna wordt je automatisch op dit apparaat ingelogd." -#: cps/templates/remote_login.html:12 -msgid "The link will expire after 10 minutes." +#: cps/templates/remote_login.html:13 +msgid "This verification link will expire in 10 minutes." msgstr "De link vervalt na 10 minuten." #: cps/templates/search.html:5 -msgid "No Results for:" -msgstr "Geen resultaten voor:" +msgid "No Results Found" +msgstr "" #: cps/templates/search.html:6 -msgid "Please try a different search" -msgstr "Probeer andere zoektermen" +msgid "Search Term:" +msgstr "" #: cps/templates/search.html:8 msgid "Results for:" msgstr "Resultaten voor:" #: cps/templates/search_form.html:19 -msgid "Publishing date from" +msgid "Published Date From" msgstr "Publicatiedatum van" #: cps/templates/search_form.html:26 -msgid "Publishing date to" +msgid "Published Date To" msgstr "Publicatiedatum tot" #: cps/templates/search_form.html:43 @@ -2101,11 +2172,11 @@ msgid "Exclude Extensions" msgstr "" #: cps/templates/search_form.html:117 -msgid "Rating bigger than" +msgid "Rating Above" msgstr "Met beoordeling hoger dan" #: cps/templates/search_form.html:121 -msgid "Rating less than" +msgid "Rating Below" msgstr "Met beoordeling lager dan" #: cps/templates/shelf.html:10 @@ -2121,23 +2192,23 @@ msgid "Change order" msgstr "Volgorde veranderen" #: cps/templates/shelf.html:67 -msgid "Do you really want to delete the shelf?" +msgid "Are you sure you want to delete this shelf?" msgstr "Weet je zeker dat je deze boekenplank wilt verwijderen?" #: cps/templates/shelf.html:70 -msgid "Shelf will be lost for everybody and forever!" +msgid "Shelf will be deleted for all users" msgstr "De boekenplank wordt permanent verwijderd voor iedereen!" #: cps/templates/shelf_edit.html:13 -msgid "should the shelf be public?" +msgid "Share with Everyone" msgstr "moet de boekenplank openbaar zijn?" #: cps/templates/shelf_order.html:5 -msgid "Drag 'n drop to rearrange order" +msgid "Drag to Rearrange Order" msgstr "Verander de volgorde middels slepen-en-neerzetten" #: cps/templates/stats.html:7 -msgid "Calibre library statistics" +msgid "Library Statistics" msgstr "Calibre bibliotheekstatistieken" #: cps/templates/stats.html:12 @@ -2157,21 +2228,17 @@ msgid "Series in this Library" msgstr "Boekenreeksen in deze bibliotheek" #: cps/templates/stats.html:28 -msgid "Linked libraries" +msgid "Linked Libraries" msgstr "Gekoppelde bibliotheken" #: cps/templates/stats.html:32 -msgid "Program library" +msgid "Program Library" msgstr "Programmabibliotheek" #: cps/templates/stats.html:33 msgid "Installed Version" msgstr "Versie" -#: cps/templates/tasks.html:7 -msgid "Tasks list" -msgstr "Takenlijst" - #: cps/templates/tasks.html:12 msgid "User" msgstr "Gebruiker" @@ -2189,11 +2256,11 @@ msgid "Progress" msgstr "Voortgang" #: cps/templates/tasks.html:17 -msgid "Runtime" +msgid "Run Time" msgstr "Looptijd" #: cps/templates/tasks.html:18 -msgid "Starttime" +msgid "Start Time" msgstr "Begintijd" #: cps/templates/tasks.html:24 @@ -2208,1442 +2275,58 @@ msgstr "Alle taken verbergen" msgid "Reset user Password" msgstr "Gebruikerswachtwoord herstellen" -#: cps/templates/user_edit.html:26 -msgid "Kindle E-Mail" -msgstr "Kindle-e-mailadres" - -#: cps/templates/user_edit.html:39 -msgid "Show books with language" +#: cps/templates/user_edit.html:41 +msgid "Language of Books" msgstr "Taal van boeken" -#: cps/templates/user_edit.html:41 -msgid "Show all" +#: cps/templates/user_edit.html:43 +msgid "Show All" msgstr "Alle talen" -#: cps/templates/user_edit.html:51 +#: cps/templates/user_edit.html:52 msgid "OAuth Settings" msgstr "OAuth Instellingen" -#: cps/templates/user_edit.html:53 +#: cps/templates/user_edit.html:54 msgid "Link" msgstr "Koppelen" -#: cps/templates/user_edit.html:55 +#: cps/templates/user_edit.html:56 msgid "Unlink" msgstr "Ontkoppelen" -#: cps/templates/user_edit.html:123 -msgid "Delete this user" -msgstr "Deze gebruiker verwijderen" - -#: cps/templates/user_edit.html:138 -msgid "Recent Downloads" -msgstr "Recente downloads" - -#~ msgid "Afar" -#~ msgstr "Afar; Hamitisch" - -#~ msgid "Abkhazian" -#~ msgstr "Abchazisch" - -#~ msgid "Achinese" -#~ msgstr "Achinees" - -#~ msgid "Acoli" -#~ msgstr "Acholi" - -#~ msgid "Adangme" -#~ msgstr "Adangme" - -#~ msgid "Adyghe" -#~ msgstr "Adyghe" - -#~ msgid "Afrihili" -#~ msgstr "Afrihili" - -#~ msgid "Afrikaans" -#~ msgstr "Afrikaans" - -#~ msgid "Ainu (Japan)" -#~ msgstr "Ainu (Japan)" - -#~ msgid "Akan" -#~ msgstr "Akaans" - -#~ msgid "Akkadian" -#~ msgstr "Akkadiaans" - -#~ msgid "Aleut" -#~ msgstr "Aleut" - -#~ msgid "Altai; Southern" -#~ msgstr "Altajs; zuidelijk" - -#~ msgid "Amharic" -#~ msgstr "Amhaars; Amharisch" - -#~ msgid "English; Old (ca. 450-1100)" -#~ msgstr "Engels; oud (ca. 450-1100)" - -#~ msgid "Angika" -#~ msgstr "Angika" - -#~ msgid "Arabic" -#~ msgstr "Arabisch" - -#~ msgid "Aramaic; Official (700-300 BCE)" -#~ msgstr "Aramees; officieel (700-300 B.C.)" - -#~ msgid "Aragonese" -#~ msgstr "Aragonees" - -#~ msgid "Mapudungun" -#~ msgstr "Mapudungun" - -#~ msgid "Arapaho" -#~ msgstr "Arapaho" - -#~ msgid "Arawak" -#~ msgstr "Arawak" - -#~ msgid "Assamese" -#~ msgstr "Assamees; Assami" - -#~ msgid "Asturian" -#~ msgstr "Asturisch" - -#~ msgid "Avaric" -#~ msgstr "Avaars; Awari" - -#~ msgid "Avestan" -#~ msgstr "Avestisch" - -#~ msgid "Awadhi" -#~ msgstr "Awadhi" - -#~ msgid "Aymara" -#~ msgstr "Aymara" - -#~ msgid "Azerbaijani" -#~ msgstr "Azerbeidzjaans" - -#~ msgid "Bashkir" -#~ msgstr "Basjkiers; Basjkirisch" - -#~ msgid "Baluchi" -#~ msgstr "Balutsji; Baluchi" - -#~ msgid "Bambara" -#~ msgstr "Bambara" - -#~ msgid "Balinese" -#~ msgstr "Balinees" - -#~ msgid "Basa (Cameroon)" -#~ msgstr "Basa (Kameroen)" - -#~ msgid "Beja" -#~ msgstr "Beja" - -#~ msgid "Belarusian" -#~ msgstr "Wit-Russisch; Belarussisch" - -#~ msgid "Bemba (Zambia)" -#~ msgstr "Bemba (Zambia)" - -#~ msgid "Bengali" -#~ msgstr "Bengaals" - -#~ msgid "Bhojpuri" -#~ msgstr "Bhojpuri" - -#~ msgid "Bikol" -#~ msgstr "Bikol" - -#~ msgid "Bini" -#~ msgstr "Bini; Edo" - -#~ msgid "Bislama" -#~ msgstr "Bislama" - -#~ msgid "Siksika" -#~ msgstr "Siksika" - -#~ msgid "Tibetan" -#~ msgstr "Tibetaans" - -#~ msgid "Bosnian" -#~ msgstr "Bosnisch" - -#~ msgid "Braj" -#~ msgstr "Braj" - -#~ msgid "Breton" -#~ msgstr "Bretons; Bretoens" - -#~ msgid "Buriat" -#~ msgstr "Boeriaats" - -#~ msgid "Buginese" -#~ msgstr "Buginees" - -#~ msgid "Bulgarian" -#~ msgstr "Bulgaars" - -#~ msgid "Bilin" -#~ msgstr "Bilin" - -#~ msgid "Caddo" -#~ msgstr "Caddo" - -#~ msgid "Carib; Galibi" -#~ msgstr "Caribische talen" - -#~ msgid "Catalan" -#~ msgstr "Catalaans" - -#~ msgid "Cebuano" -#~ msgstr "Cebuano" - -#~ msgid "Czech" -#~ msgstr "Tsjechisch" - -#~ msgid "Chamorro" -#~ msgstr "Chamorro" - -#~ msgid "Chibcha" -#~ msgstr "Tsjibtsja" - -#~ msgid "Chechen" -#~ msgstr "Tsjetsjeens" - -#~ msgid "Chagatai" -#~ msgstr "Chagatai" - -#~ msgid "Chuukese" -#~ msgstr "Chukees" - -#~ msgid "Mari (Russia)" -#~ msgstr "Mari (Rusland)" - -#~ msgid "Chinook jargon" -#~ msgstr "Chinook-jargon" - -#~ msgid "Choctaw" -#~ msgstr "Choctaw" - -#~ msgid "Chipewyan" -#~ msgstr "Chipewyaans" - -#~ msgid "Cherokee" -#~ msgstr "Cherokee" - -#~ msgid "Slavonic; Old" -#~ msgstr "Slavisch; oud (kerk)" - -#~ msgid "Chuvash" -#~ msgstr "Tsjoevasjisch" - -#~ msgid "Cheyenne" -#~ msgstr "Cheyenne" - -#~ msgid "Coptic" -#~ msgstr "Koptisch" - -#~ msgid "Cornish" -#~ msgstr "Cornisch" - -#~ msgid "Corsican" -#~ msgstr "Corsicaans" - -#~ msgid "Cree" -#~ msgstr "Cree" - -#~ msgid "Turkish; Crimean" -#~ msgstr "Turks; Crimean" - -#~ msgid "Kashubian" -#~ msgstr "Kasjoebiaans" - -#~ msgid "Welsh" -#~ msgstr "Welsh" - -#~ msgid "Dakota" -#~ msgstr "Dakota" - -#~ msgid "Danish" -#~ msgstr "Deens" +#: cps/templates/user_edit.html:62 +msgid "Kobo Sync Token" +msgstr "" -#~ msgid "Dargwa" -#~ msgstr "Dargwa" +#: cps/templates/user_edit.html:64 +msgid "Create/View" +msgstr "" -#~ msgid "Delaware" -#~ msgstr "Delaware" +#: cps/templates/user_edit.html:83 +msgid "Add allowed/denied Tags" +msgstr "" -#~ msgid "Slave (Athapascan)" -#~ msgstr "Slavisch (Athapascaans)" +#: cps/templates/user_edit.html:84 +msgid "Add allowed/denied custom column values" +msgstr "" -#~ msgid "German" -#~ msgstr "Duits" +#: cps/templates/user_edit.html:129 +msgid "Delete User" +msgstr "Deze gebruiker verwijderen" -#~ msgid "Dogrib" -#~ msgstr "Dogrib" +#: cps/templates/user_edit.html:144 +msgid "Recent Downloads" +msgstr "Recente downloads" -#~ msgid "Dinka" -#~ msgstr "Dinka" +#: cps/templates/user_edit.html:160 +msgid "Generate Kobo Auth URL" +msgstr "" -#~ msgid "Dhivehi" -#~ msgstr "Divehi" - -#~ msgid "Dogri (macrolanguage)" -#~ msgstr "Dogri" - -#~ msgid "Sorbian; Lower" -#~ msgstr "Sorbisch; lager" - -#~ msgid "Duala" -#~ msgstr "Duala" - -#~ msgid "Dutch; Middle (ca. 1050-1350)" -#~ msgstr "Nederlands; middel (ca. 1050-1350)" - -#~ msgid "Dyula" -#~ msgstr "Dyula" - -#~ msgid "Dzongkha" -#~ msgstr "Dzongkha" - -#~ msgid "Efik" -#~ msgstr "Efikisch" - -#~ msgid "Egyptian (Ancient)" -#~ msgstr "Egyptisch (antiek)" - -#~ msgid "Ekajuk" -#~ msgstr "Ekajuk" - -#~ msgid "Greek; Modern (1453-)" -#~ msgstr "Grieks; Modern (1453-)" - -#~ msgid "Elamite" -#~ msgstr "Elamitisch" - -#~ msgid "English" -#~ msgstr "Engels" - -#~ msgid "English; Middle (1100-1500)" -#~ msgstr "Engels; middel (1100-1500)" - -#~ msgid "Esperanto" -#~ msgstr "Esperanto" - -#~ msgid "Estonian" -#~ msgstr "Estlands" - -#~ msgid "Basque" -#~ msgstr "Baskisch" - -#~ msgid "Ewe" -#~ msgstr "Ewe" - -#~ msgid "Ewondo" -#~ msgstr "Ewondo" - -#~ msgid "Fang (Equatorial Guinea)" -#~ msgstr "Fang" - -#~ msgid "Faroese" -#~ msgstr "Faeröers" - -#~ msgid "Persian" -#~ msgstr "Perzisch" - -#~ msgid "Fanti" -#~ msgstr "Fanti" - -#~ msgid "Fijian" -#~ msgstr "Fijisch" - -#~ msgid "Filipino" -#~ msgstr "Filipijns" - -#~ msgid "Finnish" -#~ msgstr "Fins" - -#~ msgid "Fon" -#~ msgstr "Fon" - -#~ msgid "French" -#~ msgstr "Frans" - -#~ msgid "French; Middle (ca. 1400-1600)" -#~ msgstr "Frans; middel (ca. 1400-1600)" - -#~ msgid "French; Old (842-ca. 1400)" -#~ msgstr "Frans; oud (842-ca. 1400)" - -#~ msgid "Frisian; Northern" -#~ msgstr "Fries; noordelijk (Duitsland)" - -#~ msgid "Frisian; Eastern" -#~ msgstr "Fries; oostelijk (Duitsland)" - -#~ msgid "Frisian; Western" -#~ msgstr "Fries" - -#~ msgid "Fulah" -#~ msgstr "Fulah" - -#~ msgid "Friulian" -#~ msgstr "Friulisch" - -#~ msgid "Ga" -#~ msgstr "Ga" - -#~ msgid "Gayo" -#~ msgstr "Gayo" - -#~ msgid "Gbaya (Central African Republic)" -#~ msgstr "Gbaya (Centraal Afrikaanse Republiek)" - -#~ msgid "Geez" -#~ msgstr "Ge'ez" - -#~ msgid "Gilbertese" -#~ msgstr "Gilbertees" - -#~ msgid "Gaelic; Scottish" -#~ msgstr "Keltisch; schots" - -#~ msgid "Irish" -#~ msgstr "Iers" - -#~ msgid "Galician" -#~ msgstr "Galiciaans" - -#~ msgid "Manx" -#~ msgstr "Manx" - -#~ msgid "German; Middle High (ca. 1050-1500)" -#~ msgstr "Duits; middel hoog (ca. 1050-1500)" - -#~ msgid "German; Old High (ca. 750-1050)" -#~ msgstr "Duits; oud hoog (ca. 750-1050)" - -#~ msgid "Gondi" -#~ msgstr "Gondi" - -#~ msgid "Gorontalo" -#~ msgstr "Gorontalo" - -#~ msgid "Gothic" -#~ msgstr "Gothisch" - -#~ msgid "Grebo" -#~ msgstr "Grebo" - -#~ msgid "Greek; Ancient (to 1453)" -#~ msgstr "Grieks; antiek (tot 1453)" - -#~ msgid "Guarani" -#~ msgstr "Guarani" - -#~ msgid "German; Swiss" -#~ msgstr "Duits; Zwitserland" - -#~ msgid "Gujarati" -#~ msgstr "Gujarati" - -#~ msgid "Gwichʼin" -#~ msgstr "Gwichʼin" - -#~ msgid "Haida" -#~ msgstr "Haida" - -#~ msgid "Creole; Haitian" -#~ msgstr "Creools; Haïtiaans" - -#~ msgid "Hausa" -#~ msgstr "Hausa" - -#~ msgid "Hawaiian" -#~ msgstr "Hawaiiaans" - -#~ msgid "Hebrew" -#~ msgstr "Hebreeuws" - -#~ msgid "Herero" -#~ msgstr "Herero" - -#~ msgid "Hiligaynon" -#~ msgstr "Hiligainoons" - -#~ msgid "Hindi" -#~ msgstr "Hindi" - -#~ msgid "Hittite" -#~ msgstr "Hittitisch" - -#~ msgid "Hmong" -#~ msgstr "Hmong" - -#~ msgid "Hiri Motu" -#~ msgstr "Hiri Motu" - -#~ msgid "Croatian" -#~ msgstr "Kroatisch" - -#~ msgid "Sorbian; Upper" -#~ msgstr "Servisch; hoger" - -#~ msgid "Hungarian" -#~ msgstr "Hongaars" - -#~ msgid "Hupa" -#~ msgstr "Hupa" - -#~ msgid "Armenian" -#~ msgstr "Armeens" - -#~ msgid "Iban" -#~ msgstr "Ibaans" - -#~ msgid "Igbo" -#~ msgstr "Igbo" - -#~ msgid "Ido" -#~ msgstr "Ido" - -#~ msgid "Yi; Sichuan" -#~ msgstr "Yi; Sichuan - Nuosu" - -#~ msgid "Inuktitut" -#~ msgstr "Inuktitut" - -#~ msgid "Interlingue" -#~ msgstr "Interlingue" - -#~ msgid "Iloko" -#~ msgstr "Iloko" - -#~ msgid "Interlingua (International Auxiliary Language Association)" -#~ msgstr "Interlingua (International Auxiliary Language Association)" - -#~ msgid "Indonesian" -#~ msgstr "Indonesisch" - -#~ msgid "Ingush" -#~ msgstr "Ingoesjetisch" - -#~ msgid "Inupiaq" -#~ msgstr "Inupiak" - -#~ msgid "Icelandic" -#~ msgstr "IJslands" - -#~ msgid "Italian" -#~ msgstr "Italiaans" - -#~ msgid "Javanese" -#~ msgstr "Javaans" - -#~ msgid "Lojban" -#~ msgstr "Lojbaans" - -#~ msgid "Japanese" -#~ msgstr "Japans" - -#~ msgid "Judeo-Persian" -#~ msgstr "Joods-Perzisch" - -#~ msgid "Judeo-Arabic" -#~ msgstr "Joods-Arabisch" - -#~ msgid "Kara-Kalpak" -#~ msgstr "Kara-Kalpak" - -#~ msgid "Kabyle" -#~ msgstr "Kabyle" - -#~ msgid "Kachin" -#~ msgstr "Katsjin" - -#~ msgid "Kalaallisut" -#~ msgstr "Groenlands" - -#~ msgid "Kamba (Kenya)" -#~ msgstr "Kamba (Kenya)" - -#~ msgid "Kannada" -#~ msgstr "Kannada; Kanara; Kanarees" - -#~ msgid "Kashmiri" -#~ msgstr "Kashmiri" - -#~ msgid "Georgian" -#~ msgstr "Georgisch" - -#~ msgid "Kanuri" -#~ msgstr "Kanuri" - -#~ msgid "Kawi" -#~ msgstr "Kawi" - -#~ msgid "Kazakh" -#~ msgstr "Kazachs" - -#~ msgid "Kabardian" -#~ msgstr "Kabardisch; Tsjerkessisch" - -#~ msgid "Khasi" -#~ msgstr "Khasi" - -#~ msgid "Khmer; Central" -#~ msgstr "Khmer, Cambodjaans" - -#~ msgid "Khotanese" -#~ msgstr "Khotanees" - -#~ msgid "Kikuyu" -#~ msgstr "Kikuyu" - -#~ msgid "Kinyarwanda" -#~ msgstr "Kinyarwanda" - -#~ msgid "Kirghiz" -#~ msgstr "Kirgizisch" - -#~ msgid "Kimbundu" -#~ msgstr "Kimbundu" - -#~ msgid "Konkani (macrolanguage)" -#~ msgstr "Konkani" - -#~ msgid "Komi" -#~ msgstr "Komi" - -#~ msgid "Kongo" -#~ msgstr "Kikongo" - -#~ msgid "Korean" -#~ msgstr "Koreaans" - -#~ msgid "Kosraean" -#~ msgstr "Kosraeaans" - -#~ msgid "Kpelle" -#~ msgstr "Kpelle" - -#~ msgid "Karachay-Balkar" -#~ msgstr "Karatsjay-Balkar" - -#~ msgid "Karelian" -#~ msgstr "Karelisch" - -#~ msgid "Kurukh" -#~ msgstr "Kurukh" - -#~ msgid "Kuanyama" -#~ msgstr "Kuanyama" - -#~ msgid "Kumyk" -#~ msgstr "Kumyk" - -#~ msgid "Kurdish" -#~ msgstr "Koerdisch" - -#~ msgid "Kutenai" -#~ msgstr "Kutenaïsch" - -#~ msgid "Ladino" -#~ msgstr "Ladino" - -#~ msgid "Lahnda" -#~ msgstr "Lahnda" - -#~ msgid "Lamba" -#~ msgstr "Lamba" - -#~ msgid "Lao" -#~ msgstr "Laotiaans" - -#~ msgid "Latin" -#~ msgstr "Latijn" - -#~ msgid "Latvian" -#~ msgstr "Lets" - -#~ msgid "Lezghian" -#~ msgstr "Lezghiaans" - -#~ msgid "Limburgan" -#~ msgstr "Limburgs" - -#~ msgid "Lingala" -#~ msgstr "Lingala" - -#~ msgid "Lithuanian" -#~ msgstr "Litouws" - -#~ msgid "Mongo" -#~ msgstr "Mongo" - -#~ msgid "Lozi" -#~ msgstr "Lozi" - -#~ msgid "Luxembourgish" -#~ msgstr "Luxemburgs" - -#~ msgid "Luba-Lulua" -#~ msgstr "Luba-Lulua" - -#~ msgid "Luba-Katanga" -#~ msgstr "Luba-Katanga" - -#~ msgid "Ganda" -#~ msgstr "Luganda" - -#~ msgid "Luiseno" -#~ msgstr "Luiseno" - -#~ msgid "Lunda" -#~ msgstr "Lunda" - -#~ msgid "Luo (Kenya and Tanzania)" -#~ msgstr "Luo (Kenia en Tanzania)" - -#~ msgid "Lushai" -#~ msgstr "Lushai" - -#~ msgid "Madurese" -#~ msgstr "Madurees" - -#~ msgid "Magahi" -#~ msgstr "Magahisch" - -#~ msgid "Marshallese" -#~ msgstr "Marshallees" - -#~ msgid "Maithili" -#~ msgstr "Maithili" - -#~ msgid "Makasar" -#~ msgstr "Makasar" - -#~ msgid "Malayalam" -#~ msgstr "Malayalam" - -#~ msgid "Mandingo" -#~ msgstr "Mandingo" - -#~ msgid "Marathi" -#~ msgstr "Marathi" - -#~ msgid "Masai" -#~ msgstr "Masai" - -#~ msgid "Moksha" -#~ msgstr "Moksja" - -#~ msgid "Mandar" -#~ msgstr "Mandars" - -#~ msgid "Mende (Sierra Leone)" -#~ msgstr "Mende" - -#~ msgid "Irish; Middle (900-1200)" -#~ msgstr "Iers; middel (900-1200)" - -#~ msgid "Mi'kmaq" -#~ msgstr "Mi'kmaq; Micmac" - -#~ msgid "Minangkabau" -#~ msgstr "Minangkabau" - -#~ msgid "Uncoded languages" -#~ msgstr "Niet-gecodeerde talen" - -#~ msgid "Macedonian" -#~ msgstr "Macedonisch" - -#~ msgid "Malagasy" -#~ msgstr "Malagassisch" - -#~ msgid "Maltese" -#~ msgstr "Maltees" - -#~ msgid "Manchu" -#~ msgstr "Manchu" - -#~ msgid "Manipuri" -#~ msgstr "Manipuri" - -#~ msgid "Mohawk" -#~ msgstr "Mohawk" - -#~ msgid "Mongolian" -#~ msgstr "Mongools" - -#~ msgid "Mossi" -#~ msgstr "Mossisch" - -#~ msgid "Maori" -#~ msgstr "Maori" - -#~ msgid "Malay (macrolanguage)" -#~ msgstr "Maleis" - -#~ msgid "Multiple languages" -#~ msgstr "Meerdere talen" - -#~ msgid "Creek" -#~ msgstr "Creek" - -#~ msgid "Mirandese" -#~ msgstr "Mirandees" - -#~ msgid "Marwari" -#~ msgstr "Marwari" - -#~ msgid "Burmese" -#~ msgstr "Burmees" - -#~ msgid "Erzya" -#~ msgstr "Erzya" - -#~ msgid "Neapolitan" -#~ msgstr "Napolitaans" - -#~ msgid "Nauru" -#~ msgstr "Nauruaans" - -#~ msgid "Navajo" -#~ msgstr "Navajo" - -#~ msgid "Ndebele; South" -#~ msgstr "Ndebele; zuid" - -#~ msgid "Ndebele; North" -#~ msgstr "Ndebele; noord" - -#~ msgid "Ndonga" -#~ msgstr "Ndonga" - -#~ msgid "German; Low" -#~ msgstr "Duits; Laag" - -#~ msgid "Nepali" -#~ msgstr "Nepalees" - -#~ msgid "Bhasa; Nepal" -#~ msgstr "Newari; Nepal" - -#~ msgid "Nias" -#~ msgstr "Nias" - -#~ msgid "Niuean" -#~ msgstr "Niueaans" - -#~ msgid "Dutch" -#~ msgstr "Nederlands" - -#~ msgid "Norwegian Nynorsk" -#~ msgstr "Noors; Nynorsk" - -#~ msgid "Norwegian Bokmål" -#~ msgstr "Noors; Bokmål" - -#~ msgid "Nogai" -#~ msgstr "Nogai" - -#~ msgid "Norse; Old" -#~ msgstr "Noors; oud" - -#~ msgid "Norwegian" -#~ msgstr "Noors" - -#~ msgid "N'Ko" -#~ msgstr "N'Ko" - -#~ msgid "Sotho; Northern" -#~ msgstr "Pedi; Sepedi; Noord-Sothotisch" - -#~ msgid "Newari; Old" -#~ msgstr "Newari; Klassiek Nepal" - -#~ msgid "Nyanja" -#~ msgstr "Nyanja" - -#~ msgid "Nyamwezi" -#~ msgstr "Nyamwezi" - -#~ msgid "Nyankole" -#~ msgstr "Nyankools" - -#~ msgid "Nyoro" -#~ msgstr "Nyoro" - -#~ msgid "Nzima" -#~ msgstr "Nzima" - -#~ msgid "Occitan (post 1500)" -#~ msgstr "Occitaans (na 1500)" - -#~ msgid "Ojibwa" -#~ msgstr "Ojibwa" - -#~ msgid "Oriya" -#~ msgstr "Oriya" - -#~ msgid "Oromo" -#~ msgstr "Oromo" - -#~ msgid "Osage" -#~ msgstr "Osaags" - -#~ msgid "Ossetian" -#~ msgstr "Ossetisch" - -#~ msgid "Turkish; Ottoman (1500-1928)" -#~ msgstr "Turks; ottomaans (1500-1928)" - -#~ msgid "Pangasinan" -#~ msgstr "Pangasinaans" - -#~ msgid "Pahlavi" -#~ msgstr "Pehlevi" - -#~ msgid "Pampanga" -#~ msgstr "Pampanga" - -#~ msgid "Panjabi" -#~ msgstr "Punjabi" - -#~ msgid "Papiamento" -#~ msgstr "Papiamento" - -#~ msgid "Palauan" -#~ msgstr "Palauaans" - -#~ msgid "Persian; Old (ca. 600-400 B.C.)" -#~ msgstr "Perzisch; oud (ca. 600-400 B.C.)" - -#~ msgid "Phoenician" -#~ msgstr "Foenisisch" - -#~ msgid "Pali" -#~ msgstr "Pali" - -#~ msgid "Polish" -#~ msgstr "Pools" - -#~ msgid "Pohnpeian" -#~ msgstr "Pohnpeiaans" - -#~ msgid "Portuguese" -#~ msgstr "Portugees" - -#~ msgid "Provençal; Old (to 1500)" -#~ msgstr "Provençaals; oud (tot 1500)" - -#~ msgid "Pushto" -#~ msgstr "Poesjto" - -#~ msgid "Quechua" -#~ msgstr "Quechua" - -#~ msgid "Rajasthani" -#~ msgstr "Rajasthani" - -#~ msgid "Rapanui" -#~ msgstr "Rapanui" - -#~ msgid "Maori; Cook Islands" -#~ msgstr "Rarotongan; Cookeilanden Maori" - -#~ msgid "Romansh" -#~ msgstr "Reto-Romaans" - -#~ msgid "Romany" -#~ msgstr "Romani" - -#~ msgid "Romanian" -#~ msgstr "Roemeens" - -#~ msgid "Rundi" -#~ msgstr "Rundi" - -#~ msgid "Romanian; Macedo-" -#~ msgstr "Roemeens; Macedo-" - -#~ msgid "Russian" -#~ msgstr "Russisch" - -#~ msgid "Sandawe" -#~ msgstr "Sandawe" - -#~ msgid "Sango" -#~ msgstr "Sangho" - -#~ msgid "Yakut" -#~ msgstr "Jakoets" - -#~ msgid "Aramaic; Samaritan" -#~ msgstr "Aramees; Samaritaans" - -#~ msgid "Sanskrit" -#~ msgstr "Sanskriet" - -#~ msgid "Sasak" -#~ msgstr "Sasaaks" - -#~ msgid "Santali" -#~ msgstr "Santali" - -#~ msgid "Sicilian" -#~ msgstr "Siciliaans" - -#~ msgid "Scots" -#~ msgstr "Schots" - -#~ msgid "Selkup" -#~ msgstr "Sulkoeps" - -#~ msgid "Irish; Old (to 900)" -#~ msgstr "Iers; oud (tot 900)" - -#~ msgid "Shan" -#~ msgstr "Sjaans" - -#~ msgid "Sidamo" -#~ msgstr "Sidamo" - -#~ msgid "Sinhala" -#~ msgstr "Sinhala" - -#~ msgid "Slovak" -#~ msgstr "Slowaaks" - -#~ msgid "Slovenian" -#~ msgstr "Sloveens" - -#~ msgid "Sami; Southern" -#~ msgstr "Samisch; zuid, Laps; zuid" - -#~ msgid "Sami; Northern" -#~ msgstr "Samisch; noord, Laps; noord" - -#~ msgid "Lule Sami" -#~ msgstr "Lule Sami" - -#~ msgid "Sami; Inari" -#~ msgstr "Sami; Inari, Laps; Inari" - -#~ msgid "Samoan" -#~ msgstr "Samoaans" - -#~ msgid "Sami; Skolt" -#~ msgstr "Sami; Skolt, Laps; Skolt" - -#~ msgid "Shona" -#~ msgstr "Shona" - -#~ msgid "Sindhi" -#~ msgstr "Sindhi" - -#~ msgid "Soninke" -#~ msgstr "Soninke" - -#~ msgid "Sogdian" -#~ msgstr "Sogdiaans" - -#~ msgid "Somali" -#~ msgstr "Somalisch" - -#~ msgid "Sotho; Southern" -#~ msgstr "Sothaans; zuidelijk" - -#~ msgid "Spanish" -#~ msgstr "Spaans" - -#~ msgid "Albanian" -#~ msgstr "Albanees" - -#~ msgid "Sardinian" -#~ msgstr "Sardinisch" - -#~ msgid "Sranan Tongo" -#~ msgstr "Sranan Tongo" - -#~ msgid "Serbian" -#~ msgstr "Servisch" - -#~ msgid "Serer" -#~ msgstr "Serer" - -#~ msgid "Swati" -#~ msgstr "Swati" - -#~ msgid "Sukuma" -#~ msgstr "Sukuma" - -#~ msgid "Sundanese" -#~ msgstr "Soendanees; Sundanees" - -#~ msgid "Susu" -#~ msgstr "Susu" - -#~ msgid "Sumerian" -#~ msgstr "Sumerisch" - -#~ msgid "Swahili (macrolanguage)" -#~ msgstr "Swahili" - -#~ msgid "Swedish" -#~ msgstr "Zweeds" - -#~ msgid "Syriac; Classical" -#~ msgstr "Syriac; Klassiek" - -#~ msgid "Syriac" -#~ msgstr "Syrisch" - -#~ msgid "Tahitian" -#~ msgstr "Tahitisch" - -#~ msgid "Tamil" -#~ msgstr "Tamil" - -#~ msgid "Tatar" -#~ msgstr "Tataars" - -#~ msgid "Telugu" -#~ msgstr "Telugu" - -#~ msgid "Timne" -#~ msgstr "Timne" - -#~ msgid "Tereno" -#~ msgstr "Tereno" - -#~ msgid "Tetum" -#~ msgstr "Tetum" - -#~ msgid "Tajik" -#~ msgstr "Tadzjieks" - -#~ msgid "Tagalog" -#~ msgstr "Tagalog" - -#~ msgid "Thai" -#~ msgstr "Thai" - -#~ msgid "Tigre" -#~ msgstr "Tigre" - -#~ msgid "Tigrinya" -#~ msgstr "Tigrinya" - -#~ msgid "Tiv" -#~ msgstr "Tiv" - -#~ msgid "Tokelau" -#~ msgstr "Tokelau" - -#~ msgid "Klingon" -#~ msgstr "Klingon; tlhIngan-Hol" - -#~ msgid "Tlingit" -#~ msgstr "Tlingit" - -#~ msgid "Tamashek" -#~ msgstr "Tamasjek" - -#~ msgid "Tonga (Nyasa)" -#~ msgstr "Tonga (Nyasa)" - -#~ msgid "Tonga (Tonga Islands)" -#~ msgstr "Tonga (Tonga-eilanden)" - -#~ msgid "Tok Pisin" -#~ msgstr "Tok Pisin" - -#~ msgid "Tsimshian" -#~ msgstr "Tsimsjiaans" - -#~ msgid "Tswana" -#~ msgstr "Tswana" - -#~ msgid "Tsonga" -#~ msgstr "Tsonga" - -#~ msgid "Turkmen" -#~ msgstr "Turkmeens" - -#~ msgid "Tumbuka" -#~ msgstr "Tumbuka" - -#~ msgid "Turkish" -#~ msgstr "Turks" - -#~ msgid "Tuvalu" -#~ msgstr "Tuvalu" - -#~ msgid "Twi" -#~ msgstr "Twi" - -#~ msgid "Tuvinian" -#~ msgstr "Tuviniaans" - -#~ msgid "Udmurt" -#~ msgstr "Udmurts" - -#~ msgid "Ugaritic" -#~ msgstr "Ugaritisch" - -#~ msgid "Uighur" -#~ msgstr "Oeigoers; Oejgoers" - -#~ msgid "Ukrainian" -#~ msgstr "Oekraïens" - -#~ msgid "Umbundu" -#~ msgstr "Umbundu" - -#~ msgid "Undetermined" -#~ msgstr "Onbepaald" - -#~ msgid "Urdu" -#~ msgstr "Urdu" - -#~ msgid "Uzbek" -#~ msgstr "Oezbeeks" - -#~ msgid "Vai" -#~ msgstr "Vai" - -#~ msgid "Venda" -#~ msgstr "Venda" - -#~ msgid "Vietnamese" -#~ msgstr "Vietnamees" - -#~ msgid "Volapük" -#~ msgstr "Volapük" - -#~ msgid "Votic" -#~ msgstr "Votisch" - -#~ msgid "Wolaytta" -#~ msgstr "Walamo" - -#~ msgid "Waray (Philippines)" -#~ msgstr "Waray (Filipijns)" - -#~ msgid "Washo" -#~ msgstr "Wasjo" - -#~ msgid "Walloon" -#~ msgstr "Waals" - -#~ msgid "Wolof" -#~ msgstr "Wolof" - -#~ msgid "Kalmyk" -#~ msgstr "Kalmyk" - -#~ msgid "Xhosa" -#~ msgstr "Xhosa" - -#~ msgid "Yao" -#~ msgstr "Yao" - -#~ msgid "Yapese" -#~ msgstr "Yapees" - -#~ msgid "Yiddish" -#~ msgstr "Jiddisch" - -#~ msgid "Yoruba" -#~ msgstr "Yoruba" - -#~ msgid "Zapotec" -#~ msgstr "Zapotec" - -#~ msgid "Blissymbols" -#~ msgstr "Blissymbolen" - -#~ msgid "Zenaga" -#~ msgstr "Zenaga" - -#~ msgid "Zhuang" -#~ msgstr "Zhuang, Tsjoeang" - -#~ msgid "Chinese" -#~ msgstr "Chinees" - -#~ msgid "Zulu" -#~ msgstr "Zoeloe" - -#~ msgid "Zuni" -#~ msgstr "Zuni" - -#~ msgid "No linguistic content" -#~ msgstr "Geen linguïstische inhoud" - -#~ msgid "Zaza" -#~ msgstr "Zaza" - -#~ msgid "Failed to create path for cover %(path)s (Permission denied)." -#~ msgstr "Het pad %(path)s aanmaken voor boekomslag is mislukt (Geen toestemming)." - -#~ msgid "Failed to store cover-file %(cover)s." -#~ msgstr "Boekomslag %(cover)s opslaan mislukt." - -#~ msgid "Cover-file is not a valid image file" -#~ msgstr "Boekomslag bestand is geen geldig beeldbestand" - -#~ msgid "Cover is not a jpg file, can't save" -#~ msgstr "Boekomslag is geen jpg bestand, opslaan niet mogelijk" - -#~ msgid "Using your another device, visit" -#~ msgstr "Bezoek met je andere apparaat" - -#~ msgid "and log in" -#~ msgstr "en log in" - -#~ msgid "Newest Books" -#~ msgstr "Nieuwste boeken" - -#~ msgid "Oldest Books" -#~ msgstr "Oudste boeken" - -#~ msgid "Books (A-Z)" -#~ msgstr "Boeken (A-Z)" - -#~ msgid "Books (Z-A)" -#~ msgstr "Boeken (Z-A)" - -#~ msgid "Error opening eBook. Fileformat is not supported." -#~ 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 "Bestand %(title)s" - -#~ msgid "Show sorted books" -#~ msgstr "Gesorteerde boeken tonen" - -#~ msgid "Sorted Books" -#~ msgstr "Gesorteerde boeken" - -#~ msgid "Sort By" -#~ msgstr "Sorteren op" - -#~ msgid "Newest" -#~ msgstr "Nieuwste" - -#~ msgid "Oldest" -#~ msgstr "Oudste" - -#~ msgid "Ascending" -#~ msgstr "Oplopend" - -#~ msgid "Descending" -#~ msgstr "Aflopend" - -#~ msgid "PDF.js viewer" -#~ msgstr "PDF.js-weergave" - -#~ msgid "Register with %s, " -#~ msgstr "" - -#~ msgid "Import of optional Google Drive requirements missing" -#~ msgstr "De import van optionele Google Drive vereisten ontbreken" - -#~ msgid "client_secrets.json is missing or not readable" -#~ msgstr "client_secrets.json ontbreekt of is niet leesbaar" - -#~ msgid "client_secrets.json is not configured for web application" -#~ msgstr "client_secrets.json is niet geconfigureerd voor web applicaties" - -#~ msgid "Keyfile location is not valid, please enter correct path" -#~ msgstr "Sleutelbestand (\"keyfile\") locatie ongeldig, gelieve het correcte pad in te geven" - -#~ msgid "Certfile location is not valid, please enter correct path" -#~ msgstr "Certificatiebestand (\"certfile\") locatie ongeldig, gelieve het correcte pad in te geven" - -#~ msgid "Please enter a LDAP provider, port, DN and user object identifier" -#~ msgstr "" - -#~ msgid "Please enter a LDAP service account and password" -#~ msgstr "" - -#~ msgid "Please enter Github oauth credentials" -#~ msgstr "" - -#~ msgid "Please enter Google oauth credentials" -#~ msgstr "" - -#~ msgid "Logfile location is not valid, please enter correct path" -#~ msgstr "De locatie met logbestanden is ongeldig; geef het juiste pad op" - -#~ msgid "Access Logfile location is not valid, please enter correct path" -#~ msgstr "" - -#~ msgid "DB location is not valid, please enter correct path" -#~ msgstr "De DB-locatie is ongeldig; geef het juiste pad op" - -#~ msgid "Excecution permissions missing" -#~ msgstr "Machtigingen om uit te voeren ontbreken" - -#~ msgid "not configured" -#~ msgstr "niet ingesteld" - -#~ msgid "Error excecuting UnRar" -#~ msgstr "Kan UnRar niet uitvoeren" - -#~ msgid "Unrar binary file not found" -#~ msgstr "Kan uitvoerbaar bestand van UnRar niet vinden" - -#~ msgid "Use GitHub OAuth" -#~ msgstr "" - -#~ msgid "Use Google OAuth" -#~ msgstr "" - -#~ msgid "Obtain GitHub OAuth Credential" -#~ msgstr "" - -#~ msgid "GitHub OAuth Client Id" -#~ msgstr "" - -#~ msgid "GitHub OAuth Client Secret" -#~ msgstr "" - -#~ msgid "Obtain Google OAuth Credential" -#~ msgstr "" - -#~ msgid "Google OAuth Client Id" -#~ msgstr "" - -#~ msgid "Google OAuth Client Secret" -#~ msgstr "" - -#~ msgid "Use" -#~ msgstr "Gebruik" - -#~ msgid "Play / pause" -#~ msgstr "Afspelen / pauze" - -#~ msgid "volume" -#~ msgstr "volume" - -#~ msgid "unknown" -#~ msgstr "onbekend" +#: cps/templates/user_edit.html:176 +msgid "Do you really want to delete the Kobo Token?" +msgstr "" -#~ msgid "New Books" -#~ msgstr "Nieuwe boeken" +#~ msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" +#~ msgstr "Het omslagbestand is een niet-ondersteund afbeeldingsformaat (jpg/png/webp); kan niet opslaan" diff --git a/cps/translations/pl/LC_MESSAGES/messages.mo b/cps/translations/pl/LC_MESSAGES/messages.mo index 8a9f66c0..59fa5154 100644 Binary files a/cps/translations/pl/LC_MESSAGES/messages.mo and b/cps/translations/pl/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/pl/LC_MESSAGES/messages.po b/cps/translations/pl/LC_MESSAGES/messages.po index 1fc64d74..fbe4cb9c 100644 --- a/cps/translations/pl/LC_MESSAGES/messages.po +++ b/cps/translations/pl/LC_MESSAGES/messages.po @@ -8,16 +8,16 @@ msgid "" msgstr "" "Project-Id-Version: Calibre Web - polski (POT: 2019-08-06 18:35)\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2020-01-12 13:57+0100\n" +"POT-Creation-Date: 2020-03-12 20:31+0100\n" "PO-Revision-Date: 2019-08-18 22:06+0200\n" -"Last-Translator: Radosław Kierznowski \n" +"Last-Translator: Jerzy Piątek \n" "Language: pl\n" "Language-Team: \n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.7.0\n" +"Generated-By: Babel 2.8.0\n" #: cps/about.py:42 msgid "installed" @@ -27,7 +27,7 @@ msgstr "zainstalowane" msgid "not installed" msgstr "nie zainstalowane" -#: cps/about.py:84 +#: cps/about.py:87 msgid "Statistics" msgstr "Statystyki" @@ -42,171 +42,180 @@ msgstr "Wykonano wyłączenie serwera, proszę zamknąć okno" # ??? #: cps/admin.py:110 cps/editbooks.py:410 cps/editbooks.py:419 #: cps/editbooks.py:539 cps/editbooks.py:541 cps/editbooks.py:594 -#: cps/updater.py:446 cps/uploader.py:97 cps/uploader.py:108 +#: cps/updater.py:456 cps/uploader.py:96 cps/uploader.py:107 msgid "Unknown" msgstr "Nieznany" #: cps/admin.py:129 msgid "Admin page" -msgstr " Panel administratora" +msgstr "Panel administratora" -#: cps/admin.py:148 cps/templates/admin.html:115 +#: cps/admin.py:151 msgid "UI Configuration" msgstr "Konfiguracja Interfejsu (UI)" -#: cps/admin.py:185 cps/admin.py:412 +#: cps/admin.py:187 cps/admin.py:637 msgid "Calibre-Web configuration updated" msgstr "Konfiguracja Calibre-Web została zaktualizowana" -#: cps/admin.py:442 cps/templates/admin.html:114 +#: cps/admin.py:434 cps/admin.py:440 cps/admin.py:451 cps/admin.py:462 +#: cps/templates/modal_restriction.html:29 +msgid "Deny" +msgstr "" + +#: cps/admin.py:436 cps/admin.py:442 cps/admin.py:453 cps/admin.py:464 +#: cps/templates/modal_restriction.html:28 +msgid "Allow" +msgstr "" + +#: cps/admin.py:667 msgid "Basic Configuration" msgstr "Podstawowa konfiguracja" -#: cps/admin.py:465 cps/web.py:1093 +#: cps/admin.py:691 cps/web.py:1089 msgid "Please fill out all fields!" msgstr "Proszę wypełnić wszystkie pola!" -#: cps/admin.py:467 cps/admin.py:478 cps/admin.py:484 cps/admin.py:499 -#: cps/templates/admin.html:38 +#: cps/admin.py:694 cps/admin.py:706 cps/admin.py:712 cps/admin.py:730 msgid "Add new user" msgstr "Dodaj nowego użytkownika" -#: cps/admin.py:476 cps/web.py:1318 +#: cps/admin.py:703 cps/web.py:1318 msgid "E-mail is not from valid domain" msgstr "E-mail nie pochodzi z prawidłowej domeny" -#: cps/admin.py:482 cps/admin.py:493 +#: cps/admin.py:710 cps/admin.py:725 msgid "Found an existing account for this e-mail address or nickname." msgstr "Znaleziono istniejące konto dla tego adresu e-mail lub nickname" -#: cps/admin.py:489 +#: cps/admin.py:721 #, python-format msgid "User '%(user)s' created" msgstr "Użytkownik '%(user)s' został utworzony" -#: cps/admin.py:509 +#: cps/admin.py:740 msgid "Edit e-mail server settings" msgstr "Edycja ustawień serwera e-mail" -#: cps/admin.py:535 +#: cps/admin.py:766 #, python-format msgid "Test e-mail successfully send to %(kindlemail)s" msgstr "Test e-maila zakończony pomyślnie. Wysłano do %(kindlemail)s" -#: cps/admin.py:538 +#: cps/admin.py:769 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Wystąpił błąd podczas wysyłania e-maila testowego: %(res)s" -#: cps/admin.py:540 +#: cps/admin.py:771 msgid "Please configure your e-mail address first..." -msgstr "" +msgstr "Najpierw skonfiguruj swój adres e-mail..." -#: cps/admin.py:542 +#: cps/admin.py:773 msgid "E-mail server settings updated" msgstr "Zaktualizowano ustawienia serwera poczty e-mail" -#: cps/admin.py:571 +#: cps/admin.py:803 #, python-format msgid "User '%(nick)s' deleted" msgstr "Użytkownik '%(nick)s' został usunięty" -#: cps/admin.py:574 +#: cps/admin.py:806 msgid "No admin user remaining, can't delete user" msgstr "Nie można usunąć użytkownika. Brak na serwerze innego konta z prawami administratora" -#: cps/admin.py:612 cps/web.py:1359 +#: cps/admin.py:842 cps/web.py:1361 msgid "Found an existing account for this e-mail address." msgstr "Znaleziono istniejące konto dla tego adresu e-mail." -#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1334 +#: cps/admin.py:852 cps/admin.py:867 cps/admin.py:887 cps/web.py:1336 #, python-format msgid "Edit User %(nick)s" msgstr "Edytuj użytkownika %(nick)s" -#: cps/admin.py:622 cps/web.py:1327 +#: cps/admin.py:858 cps/web.py:1328 msgid "This username is already taken" -msgstr "" +msgstr "Nazwa użytkownika jest już zajęta" -#: cps/admin.py:637 +#: cps/admin.py:874 #, python-format msgid "User '%(nick)s' updated" msgstr "Użytkownik '%(nick)s' został zaktualizowany" -#: cps/admin.py:640 +#: cps/admin.py:877 msgid "An unknown error occured." msgstr "Wystąpił nieznany błąd." # ??? -#: cps/admin.py:657 +#: cps/admin.py:900 #, python-format msgid "Password for user %(user)s reset" msgstr "Zrestartowano hasło użytkownika %(user)s" -#: cps/admin.py:660 cps/web.py:1118 cps/web.py:1174 +#: cps/admin.py:903 cps/web.py:1114 cps/web.py:1170 msgid "An unknown error occurred. Please try again later." msgstr "Wystąpił nieznany błąd. Spróbuj ponownie później." -#: cps/admin.py:663 cps/web.py:1062 +#: cps/admin.py:906 cps/web.py:1055 msgid "Please configure the SMTP mail settings first..." msgstr "Proszę najpierw skonfigurować ustawienia SMTP poczty e-mail..." -#: cps/admin.py:674 +#: cps/admin.py:918 msgid "Logfile viewer" msgstr "Przeglądanie plików Logu" -#: cps/admin.py:710 +#: cps/admin.py:957 msgid "Requesting update package" msgstr "Żądanie o pakiet aktualizacji" -#: cps/admin.py:711 +#: cps/admin.py:958 msgid "Downloading update package" msgstr "Pobieranie pakietu aktualizacji" -#: cps/admin.py:712 +#: cps/admin.py:959 msgid "Unzipping update package" msgstr "Rozpakowywanie pakietu aktualizacji" # ??? -#: cps/admin.py:713 +#: cps/admin.py:960 msgid "Replacing files" msgstr "Zastępowanie plików" -#: cps/admin.py:714 +#: cps/admin.py:961 msgid "Database connections are closed" msgstr "Połączenia z bazą danych zostały zakończone" -#: cps/admin.py:715 +#: cps/admin.py:962 msgid "Stopping server" msgstr "Zatrzymywanie serwera" -#: cps/admin.py:716 +#: cps/admin.py:963 msgid "Update finished, please press okay and reload page" msgstr "Aktualizacja zakończona, proszę nacisnąć OK i odświeżyć stronę" -#: cps/admin.py:717 cps/admin.py:718 cps/admin.py:719 cps/admin.py:720 +#: cps/admin.py:964 cps/admin.py:965 cps/admin.py:966 cps/admin.py:967 msgid "Update failed:" msgstr "Aktualizacja nieudana:" -#: cps/admin.py:717 cps/updater.py:272 cps/updater.py:457 cps/updater.py:459 +#: cps/admin.py:964 cps/updater.py:282 cps/updater.py:467 cps/updater.py:469 msgid "HTTP Error" msgstr "" -#: cps/admin.py:718 cps/updater.py:274 cps/updater.py:461 +#: cps/admin.py:965 cps/updater.py:284 cps/updater.py:471 msgid "Connection error" -msgstr "" +msgstr "Błąd połączenia" -#: cps/admin.py:719 cps/updater.py:276 cps/updater.py:463 +#: cps/admin.py:966 cps/updater.py:286 cps/updater.py:473 msgid "Timeout while establishing connection" msgstr "Przekroczono limit czasu podczas nawiązywania połączenia" -#: cps/admin.py:720 cps/updater.py:278 cps/updater.py:465 +#: cps/admin.py:967 cps/updater.py:288 cps/updater.py:475 msgid "General error" msgstr "" #: cps/converter.py:31 msgid "not configured" -msgstr "" +msgstr "nie skonfigurowane" #: cps/editbooks.py:214 cps/editbooks.py:396 msgid "Error opening eBook. File does not exist or file is not accessible" @@ -240,11 +249,6 @@ msgstr "Nie można zapisać pliku %(file)s." msgid "File format %(ext)s added to %(book)s" msgstr "Format pliku %(ext)s dodany do %(book)s" -# ??? -#: cps/editbooks.py:376 -msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" -msgstr "Nie można zapisać. Okładka jest w niewspieranym formacie (jpg/png/webp)" - #: cps/editbooks.py:451 msgid "Cover is not a jpg file, can't save" msgstr "Okładka nie jest plikiem jpg, nie można zapisać" @@ -265,11 +269,11 @@ msgstr "Błąd podczas edycji książki, sprawdź plik logu, aby uzyskać szczeg #: cps/editbooks.py:581 #, python-format msgid "File %(filename)s could not saved to temp dir" -msgstr "" +msgstr "Nie można zapisać pliku %(filename)s w katalogu tymczasowym" #: cps/editbooks.py:598 msgid "Uploaded book probably exists in the library, consider to change before upload new: " -msgstr "" +msgstr "Przesłana książka prawdopodobnie istnieje w bibliotece, rozważ zmianę przed przesłaniem nowej: " #: cps/editbooks.py:613 #, python-format @@ -281,30 +285,30 @@ msgstr "Nie można przechowywać pliku %(file)s (Odmowa dostępu)." msgid "Failed to delete file %(file)s (Permission denied)." msgstr "Nie udało się usunąć pliku %(file)s (Odmowa dostępu)." -#: cps/editbooks.py:710 +#: cps/editbooks.py:709 #, python-format msgid "File %(file)s uploaded" msgstr "Załadowano plik %(file)s" -#: cps/editbooks.py:739 +#: cps/editbooks.py:738 msgid "Source or destination format for conversion missing" msgstr "Brak formatu źródłowego lub docelowego do konwersji" -#: cps/editbooks.py:747 +#: cps/editbooks.py:746 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Książka została pomyślnie umieszczona w zadaniach do konwersji %(book_format)s" -#: cps/editbooks.py:751 +#: cps/editbooks.py:750 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Podczas konwersji książki wystąpił błąd: %(res)s" -#: cps/gdrive.py:62 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgstr "" -#: cps/gdrive.py:104 +#: cps/gdrive.py:103 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "" @@ -396,90 +400,118 @@ msgstr "" msgid "Book path %(path)s not found on Google Drive" msgstr "" -#: cps/helper.py:643 +#: cps/helper.py:511 +msgid "Failed to create path for cover" +msgstr "" + +#: cps/helper.py:516 +msgid "Cover-file is not a valid image file" +msgstr "" + +#: cps/helper.py:519 +msgid "Failed to store cover-file" +msgstr "" + +#: cps/helper.py:530 +msgid "Only jpg/jpeg/png/webp files are supported as coverfile" +msgstr "" + +#: cps/helper.py:544 +msgid "Only jpg/jpeg files are supported as coverfile" +msgstr "" + +#: cps/helper.py:658 msgid "Waiting" msgstr "Oczekiwanie" -#: cps/helper.py:645 +#: cps/helper.py:660 msgid "Failed" msgstr "Nieudane" -#: cps/helper.py:647 +#: cps/helper.py:662 msgid "Started" msgstr "Rozpoczynanie" -#: cps/helper.py:649 +#: cps/helper.py:664 msgid "Finished" msgstr "" -#: cps/helper.py:651 +#: cps/helper.py:666 msgid "Unknown Status" msgstr "Ststus nieznany" -#: cps/helper.py:656 +#: cps/helper.py:671 msgid "E-mail: " msgstr "E-mail: " -#: cps/helper.py:658 cps/helper.py:662 +#: cps/helper.py:673 cps/helper.py:677 msgid "Convert: " msgstr "Konwertowanie: " -#: cps/helper.py:660 +#: cps/helper.py:675 msgid "Upload: " msgstr "Wgrywanie: " -#: cps/helper.py:664 +#: cps/helper.py:679 msgid "Unknown Task: " msgstr "Nieznane zadanie: " +#: cps/kobo_auth.py:127 +msgid "PLease access calibre-web from non localhost to get valid api_endpoint for kobo device" +msgstr "" + +#: cps/kobo_auth.py:130 cps/kobo_auth.py:150 +msgid "Kobo Setup" +msgstr "" + # ??? -#: cps/oauth_bb.py:75 +#: cps/oauth_bb.py:74 #, python-format msgid "Register with %(provider)s" msgstr "Zarejestruj się %(provider)s" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:154 msgid "Failed to log in with GitHub." msgstr "Nie udało się zalogować za pomocą GitHub." -#: cps/oauth_bb.py:160 +#: cps/oauth_bb.py:159 msgid "Failed to fetch user info from GitHub." msgstr "Nie udało się pobrać informacji o użytkowniku z GitHub." -#: cps/oauth_bb.py:171 +#: cps/oauth_bb.py:170 msgid "Failed to log in with Google." msgstr "Nie udało się zalogować do Google." -#: cps/oauth_bb.py:176 +#: cps/oauth_bb.py:175 msgid "Failed to fetch user info from Google." msgstr "Nie udało się pobrać informacji o użytkowniku z Google." -#: cps/oauth_bb.py:274 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s success." msgstr "" -#: cps/oauth_bb.py:278 +#: cps/oauth_bb.py:277 #, python-format msgid "Unlink to %(oauth)s failed." msgstr "" -#: cps/oauth_bb.py:281 +#: cps/oauth_bb.py:280 #, python-format msgid "Not linked to %(oauth)s." msgstr "" -#: cps/oauth_bb.py:309 +#: cps/oauth_bb.py:308 msgid "GitHub Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:328 +#: cps/oauth_bb.py:327 msgid "Google Oauth error, please retry later." msgstr "" #: cps/shelf.py:47 cps/shelf.py:99 msgid "Invalid shelf specified" -msgstr "" +msgstr "Podano niewłaściwą półkę" #: cps/shelf.py:54 #, python-format @@ -488,12 +520,12 @@ msgstr "" #: cps/shelf.py:62 msgid "You are not allowed to edit public shelves" -msgstr "" +msgstr "Nie masz uprawnień do edytowania publicznej półki" #: cps/shelf.py:71 #, python-format msgid "Book is already part of the shelf: %(shelfname)s" -msgstr "" +msgstr "Książka jest już dodana do półki" #: cps/shelf.py:85 #, python-format @@ -503,424 +535,414 @@ msgstr "Książka została dodana do półki: %(sname)s" #: cps/shelf.py:104 #, python-format msgid "You are not allowed to add a book to the the shelf: %(name)s" -msgstr "" +msgstr "Nie masz uprawnień do dodania ksiażki do półki: %(name)s" #: cps/shelf.py:109 msgid "User is not allowed to edit public shelves" -msgstr "" +msgstr "Użytkownik nie ma uprawnień do edytowania publicznych półek" #: cps/shelf.py:127 #, python-format msgid "Books are already part of the shelf: %(name)s" -msgstr "" +msgstr "Książki są już dodane do półki: %(name)s" #: cps/shelf.py:141 #, python-format msgid "Books have been added to shelf: %(sname)s" -msgstr "" +msgstr "Książki zostały dodane do półki %(sname)s" #: cps/shelf.py:143 #, python-format msgid "Could not add books to shelf: %(sname)s" -msgstr "" +msgstr "Nie można dodać książek do półki: %(sname)s" -#: cps/shelf.py:180 +#: cps/shelf.py:181 #, 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:186 +#: cps/shelf.py:190 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" -msgstr "" +msgstr "Niestety nie możesz usunąć książki z tej półki %(sname)s" -#: cps/shelf.py:207 cps/shelf.py:231 +#: cps/shelf.py:211 cps/shelf.py:235 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "Półka o nazwie '%(title)s' już istnieje." -#: cps/shelf.py:212 +#: cps/shelf.py:216 #, python-format msgid "Shelf %(title)s created" msgstr "Półka %(title)s została utworzona" -#: cps/shelf.py:214 cps/shelf.py:242 +#: cps/shelf.py:218 cps/shelf.py:246 msgid "There was an error" msgstr "Wystąpił błąd" -#: cps/shelf.py:215 cps/shelf.py:217 +#: cps/shelf.py:219 cps/shelf.py:221 msgid "create a shelf" msgstr "utwórz półkę" -#: cps/shelf.py:240 +#: cps/shelf.py:244 #, python-format msgid "Shelf %(title)s changed" msgstr "Półka %(title)s została zmieniona" -#: cps/shelf.py:243 cps/shelf.py:245 +#: cps/shelf.py:247 cps/shelf.py:249 msgid "Edit a shelf" msgstr "Edytuj półkę" -#: cps/shelf.py:289 +#: cps/shelf.py:301 #, python-format msgid "Shelf: '%(name)s'" msgstr "Półka: '%(name)s'" -#: cps/shelf.py:292 +#: cps/shelf.py:304 msgid "Error opening shelf. Shelf does not exist or is not accessible" +msgstr "Błąd otwierania półki. Półka nie istnieje lub jest niedostępna" + +#: cps/shelf.py:342 +msgid "Hidden Book" msgstr "" -#: cps/shelf.py:323 +#: cps/shelf.py:347 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Zmieniono kolejność półki: '%(name)s'" -#: cps/ub.py:57 +#: cps/ub.py:56 msgid "Recently Added" msgstr "Ostatnio dodane" -#: cps/ub.py:59 +#: cps/ub.py:58 msgid "Show recent books" msgstr "Pokaż menu ostatnio dodane" -#: cps/templates/index.xml:17 cps/ub.py:60 +#: cps/templates/index.xml:17 cps/ub.py:59 msgid "Hot Books" msgstr "Najpopularniejsze książki" -#: cps/ub.py:61 -msgid "Show hot books" +#: cps/ub.py:60 +msgid "Show Hot Books" msgstr "Pokaż menu najpopularniejsze książki" -#: cps/templates/index.xml:24 cps/ub.py:64 -msgid "Best rated Books" +#: cps/templates/index.xml:24 cps/ub.py:63 cps/web.py:508 +msgid "Top Rated Books" msgstr "Najlepiej ocenione książki" -#: cps/ub.py:66 -msgid "Show best rated books" +#: cps/ub.py:65 +msgid "Show Top Rated Books" msgstr "Pokaż menu najlepiej ocenione książki" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67 -#: cps/web.py:1011 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:66 +#: cps/web.py:1005 msgid "Read Books" msgstr "Przeczytane książki" -#: cps/ub.py:69 +#: cps/ub.py:68 msgid "Show read and unread" msgstr "Pokaż menu przeczytane i nieprzeczytane" -#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71 -#: cps/web.py:1015 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:70 +#: cps/web.py:1009 msgid "Unread Books" msgstr "Nieprzeczytane książki" -#: cps/ub.py:73 +#: cps/ub.py:72 msgid "Show unread" -msgstr "" +msgstr "Pokaż nieprzeczytane" -#: cps/ub.py:74 +#: cps/ub.py:73 msgid "Discover" msgstr "Odkrywaj" -#: cps/ub.py:76 +#: cps/ub.py:75 msgid "Show random books" msgstr "Pokaż menu odkrywaj" -#: cps/templates/index.xml:75 cps/ub.py:77 +#: cps/templates/index.xml:75 cps/ub.py:76 cps/web.py:787 msgid "Categories" msgstr "Kategorie" -#: cps/ub.py:79 +#: cps/ub.py:78 msgid "Show category selection" msgstr "Pokaż menu wyboru kategorii" -#: cps/templates/book_edit.html:71 cps/templates/index.xml:82 -#: cps/templates/search_form.html:53 cps/ub.py:80 +#: cps/templates/book_edit.html:69 cps/templates/index.xml:82 +#: cps/templates/search_form.html:53 cps/ub.py:79 cps/web.py:715 msgid "Series" msgstr "Seria" -#: cps/ub.py:82 +#: cps/ub.py:81 msgid "Show series selection" msgstr "Pokaż menu wyboru serii" -#: cps/templates/index.xml:61 cps/ub.py:83 +#: cps/templates/index.xml:61 cps/ub.py:82 msgid "Authors" msgstr "Autorzy" -#: cps/ub.py:85 +#: cps/ub.py:84 msgid "Show author selection" msgstr "Pokaż menu wyboru autora" -#: cps/templates/index.xml:68 cps/ub.py:87 +#: cps/templates/index.xml:68 cps/ub.py:86 cps/web.py:699 msgid "Publishers" msgstr "Wydawcy" -#: cps/ub.py:89 +#: cps/ub.py:88 msgid "Show publisher selection" msgstr "Pokaż menu wyboru wydawcy" -#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:90 +#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:89 +#: cps/web.py:770 msgid "Languages" msgstr "Języki" -#: cps/ub.py:93 +#: cps/ub.py:92 msgid "Show language selection" msgstr "Pokaż menu wyboru języka" -#: cps/ub.py:94 +#: cps/templates/index.xml:96 cps/ub.py:93 msgid "Ratings" msgstr "Ocena" -#: cps/ub.py:96 +#: cps/ub.py:95 msgid "Show ratings selection" msgstr "Pokaż menu listy ocen" -#: cps/templates/index.xml:96 cps/ub.py:97 +#: cps/templates/index.xml:104 cps/ub.py:96 msgid "File formats" msgstr "Format plików" -#: cps/ub.py:99 +#: cps/ub.py:98 msgid "Show file formats selection" msgstr "Pokaż menu formatu plików" -#: cps/updater.py:252 cps/updater.py:359 cps/updater.py:372 +#: cps/updater.py:262 cps/updater.py:369 cps/updater.py:382 msgid "Unexpected data while reading update information" msgstr "" -#: cps/updater.py:259 cps/updater.py:365 +#: cps/updater.py:269 cps/updater.py:375 msgid "No update available. You already have the latest version installed" -msgstr "" +msgstr "Brak dostępnej aktualizacji. Masz już zainstalowaną najnowszą wersję" -#: cps/updater.py:285 +#: cps/updater.py:295 msgid "A new update is available. Click on the button below to update to the latest version." -msgstr "" +msgstr "Dostępna jest nowa aktualizacja. Kliknij przycisk poniżej, aby zaktualizować do najnowszej wersji." -#: cps/updater.py:338 +#: cps/updater.py:348 msgid "Could not fetch update information" -msgstr "" +msgstr "Nie można pobrać informacji o aktualizacji" -#: cps/updater.py:352 +#: cps/updater.py:362 msgid "No release information available" -msgstr "" +msgstr "Brak dostępnych informacji o wersji" -#: cps/updater.py:405 cps/updater.py:414 +#: cps/updater.py:415 cps/updater.py:424 #, python-format msgid "A new update is available. Click on the button below to update to version: %(version)s" -msgstr "" +msgstr "Dostępna jest nowa aktualizacja. Kliknij przycisk poniżej, aby zaktualizować do wersji: %(version)s" -#: cps/updater.py:424 +#: cps/updater.py:434 msgid "Click on the button below to update to the latest stable version." -msgstr "" +msgstr "Kliknij przycisk poniżej, aby zaktualizować do najnowszej stabilnej wersji." -#: cps/web.py:486 +#: cps/web.py:480 msgid "Recently Added Books" msgstr "Ostatnio dodane książki" -#: cps/web.py:514 -msgid "Best rated books" -msgstr "Najlepiej oceniane książki" - -#: cps/templates/index.xml:38 cps/web.py:522 -msgid "Random Books" -msgstr "Losowe książki" +#: cps/templates/index.html:5 cps/web.py:516 +msgid "Discover (Random Books)" +msgstr "Odkrywaj (losowe książki)" -#: cps/web.py:548 +#: cps/web.py:542 msgid "Books" msgstr "Książki" -#: cps/web.py:575 -msgid "Hot Books (most downloaded)" +#: cps/web.py:569 +msgid "Hot Books (Most Downloaded)" msgstr "Najpopularniejsze książki (najczęściej pobierane)" -#: cps/web.py:586 cps/web.py:1382 cps/web.py:1478 -msgid "Error opening eBook. File does not exist or file is not accessible:" +#: cps/web.py:580 +msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Błąd otwierania e-booka. Plik nie istnieje lub plik nie jest dostępny:" -#: cps/web.py:599 +#: cps/web.py:593 #, python-format msgid "Author: %(name)s" msgstr "Autor: %(name)s" -#: cps/web.py:611 +#: cps/web.py:605 #, python-format msgid "Publisher: %(name)s" msgstr "Wydawca: %(name)s" -#: cps/web.py:622 +#: cps/web.py:616 #, python-format msgid "Series: %(serie)s" msgstr "Seria: %(serie)s" -#: cps/web.py:633 +#: cps/web.py:627 #, python-format msgid "Rating: %(rating)s stars" msgstr "Ocena: %(rating)s gwiazdek" -#: cps/web.py:644 +#: cps/web.py:638 #, python-format msgid "File format: %(format)s" msgstr "Format pliku: %(format)s" -#: cps/web.py:656 +#: cps/web.py:650 #, python-format msgid "Category: %(name)s" msgstr "Kategoria: %(name)s" -#: cps/web.py:673 +#: cps/web.py:667 #, python-format msgid "Language: %(name)s" msgstr "Język: %(name)s" -#: cps/web.py:705 -msgid "Publisher list" -msgstr "Lista wydawców" - -#: cps/web.py:721 -msgid "Series list" -msgstr "Lista serii" - -#: cps/web.py:735 +#: cps/web.py:729 msgid "Ratings list" msgstr "Lista z ocenami" -#: cps/web.py:748 +#: cps/web.py:742 msgid "File formats list" msgstr "Lista formatów" -#: cps/web.py:776 -msgid "Available languages" -msgstr "Dostępne języki" - -#: cps/web.py:793 -msgid "Category list" -msgstr "Lista kategorii" - -#: cps/templates/layout.html:73 cps/web.py:807 +#: cps/templates/layout.html:73 cps/templates/tasks.html:7 cps/web.py:801 msgid "Tasks" -msgstr " Zadania" +msgstr "Zadania" -#: cps/templates/feed.xml:33 cps/templates/layout.html:44 -#: cps/templates/layout.html:45 cps/web.py:829 cps/web.py:831 +#: cps/templates/book_edit.html:212 cps/templates/feed.xml:33 +#: cps/templates/layout.html:44 cps/templates/layout.html:47 +#: cps/templates/search_form.html:170 cps/web.py:821 cps/web.py:823 msgid "Search" msgstr "Szukaj" -#: cps/web.py:881 +#: cps/web.py:873 msgid "Published after " msgstr "Opublikowane po " -#: cps/web.py:888 +#: cps/web.py:880 msgid "Published before " msgstr "Opublikowane przed " -#: cps/web.py:902 +#: cps/web.py:894 #, python-format msgid "Rating <= %(rating)s" msgstr "Ocena <= %(rating)s" -#: cps/web.py:904 +#: cps/web.py:896 #, python-format msgid "Rating >= %(rating)s" msgstr "Ocena >= %(rating)s" -#: cps/web.py:970 cps/web.py:982 +#: cps/web.py:962 cps/web.py:976 msgid "search" msgstr "szukaj" -#: cps/web.py:1067 +#: cps/web.py:1060 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Książka została umieszczona w kolejce do wysłania do %(kindlemail)s" -#: cps/web.py:1071 +#: cps/web.py:1064 #, 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:1073 +#: cps/web.py:1066 msgid "Please configure your kindle e-mail address first..." msgstr "Najpierw skonfiguruj adres e-mail Kindla..." -#: cps/web.py:1087 +#: cps/web.py:1083 msgid "E-Mail server is not configured, please contact your administrator!" -msgstr "" +msgstr "Serwer e-mail nie jest skonfigurowany, skontaktuj się z administratorem!" -#: cps/web.py:1088 cps/web.py:1094 cps/web.py:1119 cps/web.py:1123 -#: cps/web.py:1128 cps/web.py:1132 +#: cps/web.py:1084 cps/web.py:1090 cps/web.py:1115 cps/web.py:1119 +#: cps/web.py:1124 cps/web.py:1128 msgid "register" msgstr "rejestracja" -#: cps/web.py:1121 +#: cps/web.py:1117 msgid "Your e-mail is not allowed to register" msgstr "Twój e-mail nie może się zarejestrować" -#: cps/web.py:1124 +#: cps/web.py:1120 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Wiadomość e-mail z potwierdzeniem została wysłana na Twoje konto e-mail." -#: cps/web.py:1127 +#: cps/web.py:1123 msgid "This username or e-mail address is already in use." msgstr "Ta nazwa użytkownika lub adres e-mail jest już używany." -#: cps/web.py:1144 +#: cps/web.py:1140 msgid "Cannot activate LDAP authentication" msgstr "Nie można aktywować uwierzytelniania LDAP" -#: cps/web.py:1154 cps/web.py:1281 +#: cps/web.py:1150 cps/web.py:1277 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "Zalogowałeś się jako: '%(nickname)s'" -#: cps/web.py:1159 +#: cps/web.py:1155 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "Brak możliwości zalogowania. Serwer LDAP jest niedostępny, skontaktuj się z administratorem" -#: cps/web.py:1163 cps/web.py:1186 +#: cps/web.py:1159 cps/web.py:1182 msgid "Wrong Username or Password" msgstr "Błędna nazwa użytkownika lub hasło" -#: cps/web.py:1170 +#: cps/web.py:1166 msgid "New Password was send to your email address" -msgstr "" +msgstr "Nowe hasło zostało wysłane na Twój adres e-mail" -#: cps/web.py:1176 +#: cps/web.py:1172 msgid "Please enter valid username to reset password" -msgstr "" +msgstr "Wprowadź prawidłową nazwę użytkownika, aby zresetować hasło" -#: cps/web.py:1182 +#: cps/web.py:1178 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Jesteś teraz zalogowany jako: '%(nickname)s'" -#: cps/web.py:1189 cps/web.py:1213 +#: cps/web.py:1185 cps/web.py:1209 msgid "login" msgstr "logowanie" -#: cps/web.py:1225 cps/web.py:1259 +#: cps/web.py:1221 cps/web.py:1255 msgid "Token not found" msgstr "Nie znaleziono tokenu" -#: cps/web.py:1234 cps/web.py:1267 +#: cps/web.py:1230 cps/web.py:1263 msgid "Token has expired" msgstr "Token wygasł" -#: cps/web.py:1243 +#: cps/web.py:1239 msgid "Success! Please return to your device" msgstr "Powodzenie! Wróć do swojego urządzenia" -#: cps/web.py:1320 cps/web.py:1363 cps/web.py:1369 +#: cps/web.py:1320 cps/web.py:1365 cps/web.py:1371 #, python-format msgid "%(name)s's profile" msgstr "Profil użytkownika %(name)s" -#: cps/web.py:1365 +#: cps/web.py:1367 msgid "Profile updated" msgstr "Zaktualizowano profil" -#: cps/web.py:1394 cps/web.py:1397 cps/web.py:1400 cps/web.py:1407 -#: cps/web.py:1412 +#: cps/web.py:1384 cps/web.py:1480 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "" + +#: cps/web.py:1396 cps/web.py:1399 cps/web.py:1402 cps/web.py:1409 +#: cps/web.py:1414 msgid "Read a Book" msgstr "Czytaj książkę" -#: cps/web.py:1423 +#: cps/web.py:1425 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "Błąd podczas otwierania eBooka. Plik nie istnieje lub plik jest niedostępny." @@ -935,29 +957,32 @@ msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Niepowodzenie! Bład Kindlegen %(error)s. Komunikat: %(message)s" #: cps/templates/admin.html:9 -msgid "User list" +msgid "Users" msgstr "Lista użytkowników" -#: cps/templates/admin.html:12 -msgid "Nickname" +#: cps/templates/admin.html:12 cps/templates/login.html:8 +#: cps/templates/login.html:9 cps/templates/register.html:7 +#: cps/templates/user_edit.html:8 +msgid "Username" msgstr "Nazwa użytkownika" -#: cps/templates/admin.html:13 -msgid "E-mail" +#: cps/templates/admin.html:13 cps/templates/register.html:11 +#: cps/templates/user_edit.html:13 +msgid "E-mail Address" msgstr "E-mail" -#: cps/templates/admin.html:14 -msgid "Kindle" +#: cps/templates/admin.html:14 cps/templates/user_edit.html:26 +msgid "Send to Kindle E-mail Address" msgstr "Kindle" #: cps/templates/admin.html:15 -msgid "DLS" +msgid "Downloads" msgstr "DLS" # ??? #: cps/templates/admin.html:16 cps/templates/layout.html:76 msgid "Admin" -msgstr " Panel administratora" +msgstr "Panel administratora" # ??? #: cps/templates/admin.html:17 cps/templates/detail.html:18 @@ -967,7 +992,7 @@ msgid "Download" msgstr "Pobieranie" #: cps/templates/admin.html:18 -msgid "View Ebooks" +msgid "View eBooks" msgstr "Wyświetl Ebooki" #: cps/templates/admin.html:19 cps/templates/layout.html:65 @@ -978,28 +1003,32 @@ msgstr "Wyślij" msgid "Edit" msgstr "Edytuj" +#: cps/templates/admin.html:38 +msgid "Add New User" +msgstr "" + #: cps/templates/admin.html:44 -msgid "SMTP e-mail server settings" +msgid "E-mail Server Settings" msgstr "Ustawienia serwera e-mail SMTP" #: cps/templates/admin.html:47 cps/templates/email_edit.html:11 -msgid "SMTP hostname" +msgid "SMTP Hostname" msgstr "Adres serwera SMTP" -#: cps/templates/admin.html:48 -msgid "SMTP port" +#: cps/templates/admin.html:48 cps/templates/email_edit.html:15 +msgid "SMTP Port" msgstr "Port serwera SMTP" -#: cps/templates/admin.html:49 -msgid "SSL" +#: cps/templates/admin.html:49 cps/templates/email_edit.html:19 +msgid "Encryption" msgstr "SSL" #: cps/templates/admin.html:50 cps/templates/email_edit.html:27 -msgid "SMTP login" +msgid "SMTP Login" msgstr "Nazwa użytkownika SMTP" -#: cps/templates/admin.html:51 -msgid "From mail" +#: cps/templates/admin.html:51 cps/templates/email_edit.html:35 +msgid "From E-mail" msgstr "Wyślij z adresu e-mail" #: cps/templates/admin.html:61 @@ -1011,43 +1040,51 @@ msgid "Configuration" msgstr "Konfiguracja" #: cps/templates/admin.html:70 -msgid "Calibre DB dir" +msgid "Calibre Database Directory" msgstr "Folder bazy danych Calibre" -#: cps/templates/admin.html:74 -msgid "Log level" +#: cps/templates/admin.html:74 cps/templates/config_edit.html:122 +msgid "Log Level" msgstr "Poziom Logu" #: cps/templates/admin.html:78 msgid "Port" msgstr "Port" -#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:23 -msgid "Books per page" +#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:27 +msgid "Books per Page" msgstr "Ilość książek na stronie" #: cps/templates/admin.html:88 -msgid "Uploading" +msgid "Uploads" msgstr "Wysyłanie" #: cps/templates/admin.html:92 -msgid "Anonymous browsing" +msgid "Anonymous Browsing" msgstr "Anonimowe przeglądanie" #: cps/templates/admin.html:96 -msgid "Public registration" +msgid "Public Registration" msgstr "Publiczna rejestracja" -#: cps/templates/admin.html:100 cps/templates/remote_login.html:4 -msgid "Remote login" -msgstr "" +#: cps/templates/admin.html:100 +msgid "Magic Link Remote Login" +msgstr "Zdalne logowanie" #: cps/templates/admin.html:104 -msgid "Reverse proxy login" +msgid "Reverse Proxy Login" msgstr "" #: cps/templates/admin.html:109 msgid "Reverse proxy header name" +msgstr "Nazwa nagłówka reverse proxy" + +#: cps/templates/admin.html:114 +msgid "Edit Basic Configuration" +msgstr "" + +#: cps/templates/admin.html:115 +msgid "Edit UI Configuration" msgstr "" #: cps/templates/admin.html:121 @@ -1055,19 +1092,19 @@ msgid "Administration" msgstr "Zarządzanie" #: cps/templates/admin.html:122 -msgid "View Logfiles" +msgid "View Logs" msgstr "Podgląd Logów" #: cps/templates/admin.html:123 -msgid "Reconnect to Calibre DB" +msgid "Reconnect Calibre Database" msgstr "Połącz ponownie z bazą danych Calibre" #: cps/templates/admin.html:124 -msgid "Restart Calibre-Web" +msgid "Restart" msgstr "Uruchom ponownie Calibre Web" #: cps/templates/admin.html:125 -msgid "Stop Calibre-Web" +msgid "Shutdown" msgstr "Zatrzymaj Calibre Web" #: cps/templates/admin.html:131 @@ -1087,7 +1124,7 @@ msgid "Current version" msgstr "Bieżąca wersja" #: cps/templates/admin.html:148 -msgid "Check for update" +msgid "Check for Update" msgstr "Sprawdź aktualizacje" #: cps/templates/admin.html:149 @@ -1095,30 +1132,29 @@ msgid "Perform Update" msgstr "Wykonaj aktualizację" #: cps/templates/admin.html:161 -msgid "Do you really want to restart Calibre-Web?" +msgid "Are you sure you want to restart?" msgstr "Na pewno chcesz uruchomić ponownie Calibre Web?" #: cps/templates/admin.html:166 cps/templates/admin.html:180 #: cps/templates/admin.html:200 cps/templates/shelf.html:72 -msgid "Ok" +msgid "OK" msgstr "OK" #: cps/templates/admin.html:167 cps/templates/admin.html:181 -#: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 +#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:194 +#: cps/templates/config_edit.html:346 cps/templates/config_view_edit.html:151 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92 -#: cps/templates/layout.html:28 cps/templates/shelf.html:73 -#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32 -#: cps/templates/user_edit.html:131 -msgid "Back" -msgstr "Wróć" +#: cps/templates/shelf.html:73 cps/templates/shelf_edit.html:19 +#: cps/templates/user_edit.html:137 +msgid "Cancel" +msgstr "" #: cps/templates/admin.html:179 -msgid "Do you really want to stop Calibre-Web?" +msgid "Are you sure you want to shutdown?" msgstr "Na pewno chcesz zatrzymać Calibre Web?" #: cps/templates/admin.html:191 -msgid "Updating, please do not reload page" +msgid "Updating, please do not reload this page" msgstr "Aktualizowanie, proszę nie odświeżać strony" #: cps/templates/author.html:15 @@ -1127,7 +1163,7 @@ msgstr "" #: cps/templates/author.html:23 msgid "In Library" -msgstr "" +msgstr "W Bibliotece" # ??? #: cps/templates/author.html:34 cps/templates/list.html:14 @@ -1144,166 +1180,164 @@ msgstr "" #: cps/templates/author.html:94 msgid "More by" -msgstr "" +msgstr "Więcej według" -#: cps/templates/book_edit.html:12 +#: cps/templates/book_edit.html:10 msgid "Delete Book" msgstr "Usuń książkę" -#: cps/templates/book_edit.html:15 +#: cps/templates/book_edit.html:13 msgid "Delete formats:" msgstr "Usuń formaty:" # ??? -#: cps/templates/book_edit.html:18 cps/templates/book_edit.html:195 -#: cps/templates/email_edit.html:91 +#: cps/templates/book_edit.html:16 cps/templates/book_edit.html:193 +#: cps/templates/email_edit.html:91 cps/templates/user_edit.html:65 +#: cps/templates/user_edit.html:177 msgid "Delete" msgstr "Usuń" -#: cps/templates/book_edit.html:26 +#: cps/templates/book_edit.html:24 msgid "Convert book format:" msgstr "Konwertuj format książki:" -#: cps/templates/book_edit.html:30 +#: cps/templates/book_edit.html:28 msgid "Convert from:" msgstr "Konwertuj z:" # ??? -#: cps/templates/book_edit.html:32 cps/templates/book_edit.html:39 +#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:37 msgid "select an option" msgstr "wybierz opcję" -#: cps/templates/book_edit.html:37 +#: cps/templates/book_edit.html:35 msgid "Convert to:" msgstr "Konwertuj na:" -#: cps/templates/book_edit.html:46 +#: cps/templates/book_edit.html:44 msgid "Convert book" msgstr "Konwertuj książkę" -#: cps/templates/book_edit.html:55 cps/templates/search_form.html:6 +#: cps/templates/book_edit.html:53 cps/templates/search_form.html:6 msgid "Book Title" msgstr "Tytuł książki" -#: cps/templates/book_edit.html:59 cps/templates/book_edit.html:255 -#: cps/templates/book_edit.html:273 cps/templates/search_form.html:10 +#: cps/templates/book_edit.html:57 cps/templates/book_edit.html:256 +#: cps/templates/book_edit.html:274 cps/templates/search_form.html:10 msgid "Author" msgstr "Autor" -#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:260 -#: cps/templates/book_edit.html:275 cps/templates/search_form.html:126 +#: cps/templates/book_edit.html:61 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:276 cps/templates/search_form.html:126 msgid "Description" msgstr "Opis" -#: cps/templates/book_edit.html:67 cps/templates/search_form.html:33 +#: cps/templates/book_edit.html:65 cps/templates/search_form.html:33 msgid "Tags" msgstr "Tagi" -#: cps/templates/book_edit.html:75 -msgid "Series id" -msgstr "ID serii" +#: cps/templates/book_edit.html:73 +msgid "Series ID" +msgstr "" -#: cps/templates/book_edit.html:79 +#: cps/templates/book_edit.html:77 msgid "Rating" msgstr "Ocena" -#: cps/templates/book_edit.html:83 -msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +#: cps/templates/book_edit.html:81 +msgid "Fetch Cover from URL (JPEG - Image will be downloaded and stored in database)" msgstr "" -#: cps/templates/book_edit.html:87 -msgid "Upload Cover from local drive" -msgstr "" +#: cps/templates/book_edit.html:85 +msgid "Upload Cover from Local Disk" +msgstr "Prześlij okładkę z dysku lokalnego" -#: cps/templates/book_edit.html:92 cps/templates/detail.html:165 -msgid "Publishing date" +#: cps/templates/book_edit.html:90 +msgid "Published Date" msgstr "Data publikacji" -#: cps/templates/book_edit.html:99 cps/templates/book_edit.html:257 -#: cps/templates/book_edit.html:274 cps/templates/detail.html:156 +#: cps/templates/book_edit.html:97 cps/templates/book_edit.html:258 +#: cps/templates/book_edit.html:275 cps/templates/detail.html:156 #: cps/templates/search_form.html:14 msgid "Publisher" msgstr "Wydawca" -#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:30 +#: cps/templates/book_edit.html:101 cps/templates/detail.html:123 +#: cps/templates/user_edit.html:31 msgid "Language" msgstr "Język" -#: cps/templates/book_edit.html:113 cps/templates/search_form.html:137 +#: cps/templates/book_edit.html:111 cps/templates/search_form.html:137 msgid "Yes" msgstr "Tak" -#: cps/templates/book_edit.html:114 cps/templates/search_form.html:138 +#: cps/templates/book_edit.html:112 cps/templates/search_form.html:138 msgid "No" msgstr "Nie" -#: cps/templates/book_edit.html:160 -msgid "Upload format" +#: cps/templates/book_edit.html:158 +msgid "Upload Format" msgstr "Prześli format" -#: cps/templates/book_edit.html:169 -msgid "view book after edit" +#: cps/templates/book_edit.html:167 +msgid "View Book on Save" msgstr "wyświetl książkę po edycji" -#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:208 -msgid "Get metadata" +#: cps/templates/book_edit.html:170 cps/templates/book_edit.html:206 +msgid "Fetch Metadata" msgstr "Uzyskaj metadane" -#: 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:170 cps/templates/shelf_edit.html:17 -#: cps/templates/user_edit.html:129 -msgid "Submit" -msgstr "Zatwierdź" +#: cps/templates/book_edit.html:171 cps/templates/config_edit.html:343 +#: cps/templates/config_view_edit.html:150 cps/templates/email_edit.html:38 +#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:135 +msgid "Save" +msgstr "" -#: cps/templates/book_edit.html:187 +#: cps/templates/book_edit.html:185 msgid "Are you really sure?" msgstr "Czy jesteś pewny?" -#: cps/templates/book_edit.html:190 -msgid "Book will be deleted from Calibre database" +#: cps/templates/book_edit.html:188 +msgid "This book will be permanently erased from database" msgstr "Książka zostanie usunięta z bazy danych Calibre" # ??? -#: cps/templates/book_edit.html:191 -msgid "and from hard disk" +#: cps/templates/book_edit.html:189 +msgid "and hard disk" msgstr "i z dysku twardego" -#: cps/templates/book_edit.html:211 +#: cps/templates/book_edit.html:209 msgid "Keyword" msgstr "Słowo kluczowe" -#: cps/templates/book_edit.html:212 +#: cps/templates/book_edit.html:210 msgid " Search keyword " msgstr " Szukaj słowa kluczowego " -#: cps/templates/book_edit.html:214 cps/templates/layout.html:47 -msgid "Go!" -msgstr "Idź!" - -#: cps/templates/book_edit.html:218 +#: cps/templates/book_edit.html:216 msgid "Click the cover to load metadata to the form" msgstr "Kliknij okładkę, aby załadować metadane do formularza" -#: cps/templates/book_edit.html:230 cps/templates/book_edit.html:270 +#: cps/templates/book_edit.html:231 cps/templates/book_edit.html:271 msgid "Loading..." msgstr "Ładowanie..." -#: cps/templates/book_edit.html:235 cps/templates/layout.html:192 -#: cps/templates/layout.html:224 +#: cps/templates/book_edit.html:236 cps/templates/layout.html:191 +#: cps/templates/layout.html:223 cps/templates/modal_restriction.html:34 +#: cps/templates/user_edit.html:164 msgid "Close" msgstr "Zamknij" -#: cps/templates/book_edit.html:262 cps/templates/book_edit.html:276 +#: cps/templates/book_edit.html:263 cps/templates/book_edit.html:277 msgid "Source" msgstr "Źródło" -#: cps/templates/book_edit.html:271 +#: cps/templates/book_edit.html:272 msgid "Search error!" msgstr "Błąd wyszukiwania!" -#: cps/templates/book_edit.html:272 -msgid "No Result(s) found! Please try aonther keyword." +#: cps/templates/book_edit.html:273 +msgid "No Result(s) found! Please try another keyword." msgstr "Nie znaleziono! Spróbuj użyć innego kluczowego słowa." #: cps/templates/config_edit.html:12 @@ -1311,7 +1345,7 @@ msgid "Library Configuration" msgstr "Konfiguracja biblioteki" #: cps/templates/config_edit.html:19 -msgid "Location of Calibre database" +msgid "Location of Calibre Database" msgstr "Lokalizacja bazy danych Calibre" #: cps/templates/config_edit.html:25 @@ -1320,15 +1354,15 @@ msgstr "Użyć dysku Google?" #: cps/templates/config_edit.html:31 msgid "Google Drive config problem" -msgstr "" +msgstr "Problem z konfiguracją Dysku Google" #: cps/templates/config_edit.html:37 msgid "Authenticate Google Drive" -msgstr "" +msgstr "Uwierzytelnij Dysk Google" #: cps/templates/config_edit.html:41 msgid "Please hit submit to continue with setup" -msgstr "" +msgstr "Kliknij przycisk, aby kontynuować instalację" #: cps/templates/config_edit.html:44 msgid "Please finish Google Drive setup after login" @@ -1364,16 +1398,16 @@ msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "Lokalizacja klucza SSL (pozostaw puste jeśli bez SSL)" #: cps/templates/config_edit.html:99 -msgid "Update channel" +msgid "Update Channel" msgstr "Kanał aktualizacji" #: cps/templates/config_edit.html:101 msgid "Stable" -msgstr "" +msgstr "Stabilna" #: cps/templates/config_edit.html:102 msgid "Stable (Automatic)" -msgstr "" +msgstr "Stablina (Automatycznie)" #: cps/templates/config_edit.html:103 msgid "Nightly" @@ -1387,10 +1421,6 @@ msgstr "" msgid "Logfile Configuration" msgstr "Konfiguracja Logów" -#: cps/templates/config_edit.html:122 -msgid "Log Level" -msgstr "Poziom logów" - #: cps/templates/config_edit.html:131 msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "Lokalizacja i nazwa pliku Logu (domyślnie calibre-web.log)" @@ -1408,256 +1438,272 @@ msgid "Feature Configuration" msgstr "Konfiguracja funkcjonalności" #: cps/templates/config_edit.html:158 -msgid "Enable uploading" +msgid "Enable Uploads" msgstr "Włącz wysyłanie" #: cps/templates/config_edit.html:162 -msgid "Enable anonymous browsing" +msgid "Enable Anonymous Browsing" msgstr "Włącz anonimowe przeglądanie" #: cps/templates/config_edit.html:166 -msgid "Enable public registration" +msgid "Enable Public Registration" msgstr "Włącz publiczną rejestrację" #: cps/templates/config_edit.html:170 -msgid "Enable remote login (\"magic link\")" +msgid "Enable Magic Link Remote Login" msgstr "Włącz zdalne logowanie (\"magic link\")" #: cps/templates/config_edit.html:175 -msgid "Use Goodreads" +msgid "Enable Kobo sync" msgstr "" -#: cps/templates/config_edit.html:176 -msgid "Obtain an API Key" +#: cps/templates/config_edit.html:180 +msgid "Proxy unknown requests to Kobo Store" msgstr "" -#: cps/templates/config_edit.html:180 +#: cps/templates/config_edit.html:187 +msgid "Use Goodreads" +msgstr "Użyj Goodreads" + +#: cps/templates/config_edit.html:188 +msgid "Create an API Key" +msgstr "Uzyskaj klucz API" + +#: cps/templates/config_edit.html:192 msgid "Goodreads API Key" -msgstr "" +msgstr "Klucz API Goodreads " -#: cps/templates/config_edit.html:184 +#: cps/templates/config_edit.html:196 msgid "Goodreads API Secret" msgstr "" -#: cps/templates/config_edit.html:191 +#: cps/templates/config_edit.html:203 msgid "Login type" -msgstr "" +msgstr "Rodzaj logowania" -#: cps/templates/config_edit.html:193 -msgid "Use standard Authentication" -msgstr "" +#: cps/templates/config_edit.html:205 +msgid "Use Standard Authentication" +msgstr "Użyj standardowego uwierzytelnienia" -#: cps/templates/config_edit.html:195 +#: cps/templates/config_edit.html:207 msgid "Use LDAP Authentication" -msgstr "" +msgstr "Użyj uwierzytelniania LDAP" -#: cps/templates/config_edit.html:198 +#: cps/templates/config_edit.html:210 msgid "Use OAuth" -msgstr "" +msgstr "Uzyj OAuth" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:217 msgid "LDAP Server Host Name or IP Address" -msgstr "" +msgstr "Nazwa hosta lub adres IP serwera LDAP" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:221 msgid "LDAP Server Port" -msgstr "" +msgstr "Port serwera LDAP" -#: cps/templates/config_edit.html:213 -msgid "LDAP schema (ldap or ldaps)" -msgstr "" +#: cps/templates/config_edit.html:225 +msgid "LDAP Schema (LDAP or LPAPS)" +msgstr "Schemat LDAP (ldap lub ldaps)" -#: cps/templates/config_edit.html:217 -msgid "LDAP Admin username" -msgstr "" +#: cps/templates/config_edit.html:229 +msgid "LDAP Administrator Username" +msgstr "Nazwa administratora LDAP" -#: cps/templates/config_edit.html:221 -msgid "LDAP Admin password" -msgstr "" +#: cps/templates/config_edit.html:233 +msgid "LDAP Administrator Password" +msgstr "Hasło administratora LDAP" -#: cps/templates/config_edit.html:226 -msgid "LDAP Server use SSL" -msgstr "" +#: cps/templates/config_edit.html:238 +msgid "LDAP Server Enable SSL" +msgstr "Serwer LDAP korzysta z protokołu SSL" -#: cps/templates/config_edit.html:230 -msgid "LDAP Server use TLS" -msgstr "" +#: cps/templates/config_edit.html:242 +msgid "LDAP Server Enable TLS" +msgstr "Serwer LDAP korzysta z TLS" -#: cps/templates/config_edit.html:234 +#: cps/templates/config_edit.html:246 msgid "LDAP Server Certificate" -msgstr "" +msgstr "Certyfikat serwera LDAP" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:250 msgid "LDAP SSL Certificate Path" -msgstr "" +msgstr "Ścieżka certyfikatu SSL LDAP" -#: cps/templates/config_edit.html:243 +#: cps/templates/config_edit.html:255 msgid "LDAP Distinguished Name (DN)" msgstr "" -#: cps/templates/config_edit.html:247 -msgid "LDAP User object filter" +#: cps/templates/config_edit.html:259 +msgid "LDAP User Object Filter" msgstr "" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:264 msgid "LDAP Server is OpenLDAP?" -msgstr "" +msgstr "Serwer LDAP to OpenLDAP?" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:272 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:263 +#: cps/templates/config_edit.html:275 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:279 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:276 +#: cps/templates/config_edit.html:288 msgid "Allow Reverse Proxy Authentication" msgstr "" -#: cps/templates/config_edit.html:280 +#: cps/templates/config_edit.html:292 msgid "Reverse Proxy Header Name" -msgstr "" +msgstr "Nazwa nagłowka reverse proxy" -#: cps/templates/config_edit.html:292 +#: cps/templates/config_edit.html:304 msgid "External binaries" msgstr "Zewnętrzne pliki" -#: cps/templates/config_edit.html:300 -msgid "No converter" +#: cps/templates/config_edit.html:312 +msgid "No Converter" msgstr "Brak konwertera" -#: cps/templates/config_edit.html:302 +#: cps/templates/config_edit.html:314 msgid "Use Kindlegen" msgstr "Użyj konwertera Kindlegen" -#: cps/templates/config_edit.html:304 +#: cps/templates/config_edit.html:316 msgid "Use calibre's ebook converter" msgstr "Użyj konwertera książek Calibre" -#: cps/templates/config_edit.html:308 +#: cps/templates/config_edit.html:320 msgid "E-Book converter settings" msgstr "Ustawienia konwertera e-booków (dodatkowe parametry)" -#: cps/templates/config_edit.html:312 +#: cps/templates/config_edit.html:324 msgid "Path to convertertool" msgstr "Lokalizacja do pliku konwertera" -#: cps/templates/config_edit.html:318 +#: cps/templates/config_edit.html:330 msgid "Location of Unrar binary" -msgstr "" +msgstr "Lokalizacja pliku binarnego Unrar" -#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 -#: cps/templates/login.html:4 +#: cps/templates/config_edit.html:349 cps/templates/layout.html:84 +#: cps/templates/login.html:4 cps/templates/login.html:20 msgid "Login" msgstr "Zaloguj się" -#: cps/templates/config_view_edit.html:12 +#: cps/templates/config_view_edit.html:16 msgid "View Configuration" msgstr "Konfiguracja Widoku" -#: cps/templates/config_view_edit.html:19 cps/templates/shelf_edit.html:7 +#: cps/templates/config_view_edit.html:23 cps/templates/shelf_edit.html:7 msgid "Title" -msgstr "Nazwa serwera" +msgstr "Nazwa" -#: cps/templates/config_view_edit.html:27 -msgid "No. of random books to show" +#: cps/templates/config_view_edit.html:31 +msgid "No. of Random Books to Display" msgstr "Liczba losowych książek do pokazania" -#: cps/templates/config_view_edit.html:31 -msgid "No. of authors to show before hiding (0=disable hiding)" -msgstr "" +#: cps/templates/config_view_edit.html:35 +msgid "No. of Authors to Display Before Hiding (0=Disable Hiding)" +msgstr "Liczba autorów do pokazania przed ukryciem (0=wyłącza ukrywanie)" -#: cps/templates/config_view_edit.html:35 cps/templates/readcbr.html:112 +#: cps/templates/config_view_edit.html:39 cps/templates/readcbr.html:112 msgid "Theme" msgstr "Motyw (Theme)" -#: cps/templates/config_view_edit.html:37 +#: cps/templates/config_view_edit.html:41 msgid "Standard Theme" msgstr "Motyw Standardowy" -#: cps/templates/config_view_edit.html:38 +#: cps/templates/config_view_edit.html:42 msgid "caliBlur! Dark Theme" msgstr "Motyw caliBlur! Dark" -#: cps/templates/config_view_edit.html:42 -msgid "Regular expression for ignoring columns" +#: cps/templates/config_view_edit.html:46 +msgid "Regular Expression for Ignoring Columns" msgstr "Wyrażenie regularne dla ignorowanych kolumn" -#: cps/templates/config_view_edit.html:46 -msgid "Link read/unread status to Calibre column" +#: cps/templates/config_view_edit.html:50 +msgid "Link Read/Unread Status to Calibre Column" msgstr "Link do statusu Przeczytanych/Nieprzeczytanych książek z kolumny Calibre (własna kolumna)" -#: cps/templates/config_view_edit.html:55 -msgid "Regular expression for title sorting" -msgstr "Wyrażenie regularne dla tytułu sortującego" - #: cps/templates/config_view_edit.html:59 -msgid "Tags for Mature Content" -msgstr "Tagi dla Treści dla dorosłych" +msgid "View Restrictions based on Calibre column" +msgstr "" + +#: cps/templates/config_view_edit.html:61 cps/templates/email_edit.html:21 +msgid "None" +msgstr "Nic" + +#: cps/templates/config_view_edit.html:68 +msgid "Regular Expression for Title Sorting" +msgstr "Wyrażenie regularne dla tytułu sortującego" -#: cps/templates/config_view_edit.html:73 -msgid "Default settings for new users" +#: cps/templates/config_view_edit.html:80 +msgid "Default Settings for New Users" msgstr "Domyślne ustawienia dla nowych użytkowników" -#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:82 -msgid "Admin user" +#: cps/templates/config_view_edit.html:88 cps/templates/user_edit.html:92 +msgid "Admin User" msgstr "Użytkownik z uprawnieniami administratora" -#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:91 +#: cps/templates/config_view_edit.html:92 cps/templates/user_edit.html:97 msgid "Allow Downloads" msgstr "Zezwalaj na pobieranie" -#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:95 -msgid "Allow book viewer" +#: cps/templates/config_view_edit.html:96 cps/templates/user_edit.html:101 +msgid "Allow eBook Viewer" msgstr "Zezwalaj na przeglądanie książek" -#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:99 +#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:105 msgid "Allow Uploads" msgstr "Zezwalaj na wysyłanie" -#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:103 +#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:109 msgid "Allow Edit" msgstr "Zezwalaj na edycję" -#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 -msgid "Allow Delete books" -msgstr "Zezwalaj na usuwanie książek" +#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:113 +msgid "Allow Delete Books" +msgstr "" -#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:112 +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:118 msgid "Allow Changing Password" msgstr "Zezwalaj na zmianę hasła" -#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:116 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:122 msgid "Allow Editing Public Shelfs" msgstr "Zezwalaj na edycję półek publicznych" -#: cps/templates/config_view_edit.html:119 -msgid "Default visibilities for new users" +#: cps/templates/config_view_edit.html:126 +msgid "Default Visibilities for New Users" msgstr "Domyślne ustawienia widoku dla nowych użytkowników" -#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:74 -msgid "Show random books in detail view" +#: cps/templates/config_view_edit.html:142 +msgid "Show Random Books in Detail View" msgstr "Pokaz losowe książki w widoku szczegółowym" -#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:87 -msgid "Show mature content" -msgstr "Pokaż Treści dla dorosłych" +#: cps/templates/config_view_edit.html:144 +msgid "Add Allowed/Denied Tags" +msgstr "" + +#: cps/templates/config_view_edit.html:145 +msgid "Add Allowed/Denied custom column values" +msgstr "" #: cps/templates/detail.html:59 -msgid "Read in browser" +msgid "Read in Browser" msgstr "Czytaj w przeglądarce" #: cps/templates/detail.html:72 -msgid "Listen in browser" -msgstr "" +msgid "Listen in Browser" +msgstr "Słuchaj w przeglądarce" #: cps/templates/detail.html:117 msgid "Book" @@ -1667,9 +1713,9 @@ msgstr "Książka" msgid "of" msgstr "z" -#: cps/templates/detail.html:123 -msgid "language" -msgstr "język" +#: cps/templates/detail.html:165 +msgid "Published" +msgstr "" #: cps/templates/detail.html:200 msgid "Mark As Unread" @@ -1692,21 +1738,9 @@ msgid "Add to shelf" msgstr "Dodaj do półki" #: cps/templates/detail.html:286 -msgid "Edit metadata" +msgid "Edit Metadata" msgstr "Edytuj metadane" -#: cps/templates/email_edit.html:15 -msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" -msgstr "Port serwera SMTP (używane 25 dla jawnego SMTP i 465 dla połączenia SSL i 587 dla połączenia STARTTLS)" - -#: cps/templates/email_edit.html:19 -msgid "Encryption" -msgstr "Szyfrowanie" - -#: cps/templates/email_edit.html:21 -msgid "None" -msgstr "Nic" - #: cps/templates/email_edit.html:22 msgid "STARTTLS" msgstr "STARTTLS" @@ -1716,64 +1750,56 @@ msgid "SSL/TLS" msgstr "SSL/TLS" #: cps/templates/email_edit.html:31 -msgid "SMTP password" +msgid "SMTP Password" msgstr "Hasło SMTP" -#: cps/templates/email_edit.html:35 -msgid "From e-mail" -msgstr "Z adresu e-mail" - -#: cps/templates/email_edit.html:38 -msgid "Save settings" -msgstr "Zapisz ustawienia" - #: cps/templates/email_edit.html:39 -msgid "Save settings and send Test E-Mail" +msgid "Save and Send Test E-mail" msgstr "Zapisz ustawienia i wyślij testową wiadomość e-mail" #: cps/templates/email_edit.html:43 -msgid "Allowed domains for registering" -msgstr "" +msgid "Allowed Domains (Whitelist)" +msgstr "Domeny dozwolone do rejestracji" #: cps/templates/email_edit.html:46 cps/templates/email_edit.html:72 msgid "Add Domain" -msgstr "" +msgstr "Dodaj domenę" #: cps/templates/email_edit.html:49 cps/templates/email_edit.html:75 msgid "Add" -msgstr "" +msgstr "Dodaj" #: cps/templates/email_edit.html:54 cps/templates/email_edit.html:64 msgid "Enter domainname" -msgstr "" +msgstr "Podaj nazwę domeny" #: cps/templates/email_edit.html:60 -msgid "Denied domains for registering" -msgstr "" +msgid "Denied Domains (Blacklist)" +msgstr "Nie można zarejestrowac domen" #: cps/templates/email_edit.html:90 -msgid "Do you really want to delete this domain rule?" -msgstr "" +msgid "Are you sure you want to delete this domain?" +msgstr "Czy naprawdę chcesz usunąć tę regułę domeny?" -#: cps/templates/feed.xml:21 cps/templates/layout.html:176 +#: cps/templates/feed.xml:21 cps/templates/layout.html:175 msgid "Next" msgstr "Następne" +#: cps/templates/generate_kobo_auth_url.html:5 +msgid "Open the .kobo/Kobo eReader.conf file in a text editor and add (or edit):" +msgstr "" + # | msgid "Create a Shelf" -#: cps/templates/http_error.html:37 +#: cps/templates/http_error.html:38 #, fuzzy -msgid "Create issue" +msgid "Create Issue" msgstr "Utwórz półkę" # ??? -#: cps/templates/http_error.html:44 -msgid "Back to home" +#: cps/templates/http_error.html:45 +msgid "Return to Home" msgstr "Powrót do głównego menu" -#: cps/templates/index.html:5 -msgid "Discover (Random Books)" -msgstr "Odkrywaj (losowe książki)" - #: cps/templates/index.html:64 msgid "Group by series" msgstr "Grupuj według serii" @@ -1792,13 +1818,17 @@ msgstr "Popularne publikacje z tego katalogu bazujące na ocenach." #: cps/templates/index.xml:31 msgid "Recently added Books" -msgstr "" +msgstr "Ostatnio dodane książki" #: cps/templates/index.xml:35 msgid "The latest Books" msgstr "Ostatnie książki" -#: cps/templates/index.xml:42 +#: cps/templates/index.xml:38 +msgid "Random Books" +msgstr "Losowe książki" + +#: cps/templates/index.xml:42 cps/templates/user_edit.html:80 msgid "Show Random Books" msgstr "Pokazuj losowe książki" @@ -1820,25 +1850,29 @@ msgstr "Książki sortowane według serii" #: cps/templates/index.xml:93 msgid "Books ordered by Languages" -msgstr "" +msgstr "Ksiązki posortowane według języka" #: cps/templates/index.xml:100 -msgid "Books ordered by file formats" +msgid "Books ordered by Rating" msgstr "" -#: cps/templates/index.xml:103 cps/templates/layout.html:137 +#: cps/templates/index.xml:108 +msgid "Books ordered by file formats" +msgstr "Ksiązki posortowane według formatu" + +#: cps/templates/index.xml:111 cps/templates/layout.html:136 msgid "Public Shelves" msgstr "Publiczne półki" -#: cps/templates/index.xml:107 +#: cps/templates/index.xml:115 msgid "Books organized in public shelfs, visible to everyone" msgstr "Książki na półkach publicznych, widoczne dla wszystkich" -#: cps/templates/index.xml:111 cps/templates/layout.html:141 +#: cps/templates/index.xml:119 cps/templates/layout.html:140 msgid "Your Shelves" msgstr "Twoje półki" -#: cps/templates/index.xml:115 +#: cps/templates/index.xml:123 msgid "User's own shelfs, only visible to the current user himself" msgstr "Własne półki, widoczne tylko dla bieżącego użytkownika" @@ -1846,10 +1880,19 @@ msgstr "Własne półki, widoczne tylko dla bieżącego użytkownika" msgid "Home" msgstr "" +#: cps/templates/layout.html:28 cps/templates/shelf_order.html:32 +#: cps/templates/user_edit.html:178 +msgid "Back" +msgstr "Wróć" + #: cps/templates/layout.html:34 -msgid "Toggle navigation" +msgid "Toggle Navigation" msgstr "Przełącz nawigację" +#: cps/templates/layout.html:45 +msgid "Search Library" +msgstr "" + #: cps/templates/layout.html:55 msgid "Advanced Search" msgstr "Zaawansowane wyszukiwanie" @@ -1871,76 +1914,103 @@ msgstr " Wyloguj się" msgid "Register" msgstr "Zarejestruj się" -#: cps/templates/layout.html:116 cps/templates/layout.html:223 +#: cps/templates/layout.html:116 cps/templates/layout.html:222 msgid "Uploading..." msgstr "" #: cps/templates/layout.html:117 -msgid "please don't refresh the page" -msgstr "proszę nie odświeżać strony" +msgid "Please do not refresh the page" +msgstr "" #: cps/templates/layout.html:127 msgid "Browse" msgstr "Przeglądaj" -#: cps/templates/layout.html:146 +#: cps/templates/layout.html:145 msgid "Create a Shelf" msgstr "Utwórz półkę" -#: cps/templates/layout.html:147 cps/templates/stats.html:3 +#: cps/templates/layout.html:146 cps/templates/stats.html:3 msgid "About" msgstr "O programie" # ??? -#: cps/templates/layout.html:161 +#: cps/templates/layout.html:160 msgid "Previous" msgstr "Poprzedni" -#: cps/templates/layout.html:188 +#: cps/templates/layout.html:187 msgid "Book Details" msgstr "Szczegóły książki" -#: cps/templates/layout.html:222 +#: cps/templates/layout.html:221 msgid "Upload done, processing, please wait..." msgstr "Ładowanie gotowe, przetwarzanie, proszę czekać ..." # ??? -#: cps/templates/layout.html:225 +#: cps/templates/layout.html:224 msgid "Error" msgstr "Błąd" -#: cps/templates/login.html:8 cps/templates/login.html:9 -#: cps/templates/register.html:7 cps/templates/user_edit.html:8 -msgid "Username" -msgstr "Nazwa użytkownika" - #: cps/templates/login.html:12 cps/templates/login.html:13 #: cps/templates/user_edit.html:21 msgid "Password" msgstr "Hasło" #: cps/templates/login.html:17 -msgid "Remember me" +msgid "Remember Me" msgstr "Zapamiętaj mnie" #: cps/templates/login.html:22 -msgid "Forgot password" -msgstr "" +msgid "Forgot Password?" +msgstr "Zapomniałem hasła" #: cps/templates/login.html:25 -msgid "Log in with magic link" +msgid "Log in with Magic Link" msgstr "Zaloguj się za pomocą \"magic link\"" -#: cps/templates/logviewer.html:5 -msgid "Show Calibre-Web log" -msgstr "Zdarzenia z logu Calibre-Web" +#: cps/templates/logviewer.html:6 +msgid "Show Calibre-Web Log: " +msgstr "Pokaż log Calibre-Web" + +#: cps/templates/logviewer.html:8 +msgid "Calibre-Web Log: " +msgstr "Log Calibre-Web" #: cps/templates/logviewer.html:8 -msgid "Show access log" -msgstr "Zdarzenia z logu Access" +msgid "Stream output, can't be displayed" +msgstr "Nie można wyświetlić wyjścia" + +#: cps/templates/logviewer.html:12 +msgid "Show Access Log: " +msgstr "Pokaż log dostępu" + +#: cps/templates/modal_restriction.html:6 +msgid "Select allowed/denied Tags" +msgstr "" + +#: cps/templates/modal_restriction.html:7 +msgid "Select allowed/denied Custom Column values" +msgstr "" + +#: cps/templates/modal_restriction.html:8 +msgid "Select allowed/denied Tags of user" +msgstr "" + +#: cps/templates/modal_restriction.html:9 +msgid "Select allowed/denied Custom Column values of user" +msgstr "" + +#: cps/templates/modal_restriction.html:15 +msgid "Enter Tag" +msgstr "" + +#: cps/templates/modal_restriction.html:24 +msgid "Add View Restriction" +msgstr "" #: cps/templates/osd.xml:5 -msgid "Calibre-Web ebook catalog" +msgid "Calibre-Web eBook Catalog" msgstr "Katalog e-booków Calibre-Web" #: cps/templates/read.html:74 @@ -1950,27 +2020,27 @@ msgstr "Tekst pływający, gdy paski boczne są otwarte." #: cps/templates/readcbr.html:88 msgid "Keyboard Shortcuts" -msgstr "" +msgstr "Skróty klawiaturowe" #: cps/templates/readcbr.html:91 msgid "Previous Page" -msgstr "" +msgstr "Poprzednia strona" #: cps/templates/readcbr.html:92 msgid "Next Page" -msgstr "" +msgstr "Następna strona" #: cps/templates/readcbr.html:93 msgid "Scale to Best" -msgstr "" +msgstr "Skaluj do najlepszego" #: cps/templates/readcbr.html:94 msgid "Scale to Width" -msgstr "" +msgstr "Skaluj do szerokości" #: cps/templates/readcbr.html:95 msgid "Scale to Height" -msgstr "" +msgstr "Skaluj do wysokości" #: cps/templates/readcbr.html:96 msgid "Scale to Native" @@ -1978,11 +2048,11 @@ msgstr "" #: cps/templates/readcbr.html:97 msgid "Rotate Right" -msgstr "" +msgstr "Obróć w prawo" #: cps/templates/readcbr.html:98 msgid "Rotate Left" -msgstr "" +msgstr "Obróć w lewo" #: cps/templates/readcbr.html:99 msgid "Flip Image" @@ -1990,27 +2060,27 @@ msgstr "" #: cps/templates/readcbr.html:115 msgid "Light" -msgstr "" +msgstr "Jasny" #: cps/templates/readcbr.html:116 msgid "Dark" -msgstr "" +msgstr "Ciemny" #: cps/templates/readcbr.html:121 msgid "Scale" -msgstr "" +msgstr "Skaluj" #: cps/templates/readcbr.html:124 msgid "Best" -msgstr "" +msgstr "Najlepszy" #: cps/templates/readcbr.html:125 msgid "Width" -msgstr "" +msgstr "Szerokość" #: cps/templates/readcbr.html:126 msgid "Height" -msgstr "" +msgstr "Wysokość" #: cps/templates/readcbr.html:127 msgid "Native" @@ -2018,7 +2088,7 @@ msgstr "" #: cps/templates/readcbr.html:132 msgid "Rotate" -msgstr "" +msgstr "Obrót" #: cps/templates/readcbr.html:143 msgid "Flip" @@ -2034,7 +2104,7 @@ msgstr "Pionowo" #: cps/templates/readcbr.html:152 msgid "Direction" -msgstr "" +msgstr "Kierunek" #: cps/templates/readcbr.html:155 msgid "Left to Right" @@ -2042,62 +2112,62 @@ msgstr "od lewej do prawej" #: cps/templates/readcbr.html:156 msgid "Right to Left" -msgstr "od prawej do lewej" +msgstr "Od prawej do lewej" #: cps/templates/readpdf.html:29 msgid "PDF reader" -msgstr "czytnik PDF" +msgstr "Czytnik PDF" #: cps/templates/readtxt.html:6 msgid "Basic txt Reader" msgstr "Podstawowy czytnik txt" #: cps/templates/register.html:4 -msgid "Register a new account" +msgid "Register New Account" msgstr "Zarejestruj nowe konto" #: cps/templates/register.html:8 msgid "Choose a username" msgstr "Wybierz nazwę użytkownika" -#: cps/templates/register.html:11 cps/templates/user_edit.html:13 -msgid "E-mail address" -msgstr "Adres e-mail" - #: cps/templates/register.html:12 msgid "Your email address" msgstr "Twój adres e-mail" -#: cps/templates/remote_login.html:6 -msgid "Use your other device, login and visit " +#: cps/templates/remote_login.html:4 +msgid "Magic Link - Authorise New Device" msgstr "" -#: cps/templates/remote_login.html:9 -msgid "Once you do so, you will automatically get logged in on this device." -msgstr "" +#: cps/templates/remote_login.html:6 +msgid "On another device, login and visit:" +msgstr "Użyj innego urządzenia, zaloguj się i odwiedź" -#: cps/templates/remote_login.html:12 -msgid "The link will expire after 10 minutes." +#: cps/templates/remote_login.html:10 +msgid "Once verified, you will automatically be logged in on this device." +msgstr "Gdy to zrobisz, automatycznie zalogujesz się na tym urządzeniu." + +#: cps/templates/remote_login.html:13 +msgid "This verification link will expire in 10 minutes." msgstr "Link wygaśnie po 10 minutach." #: cps/templates/search.html:5 -msgid "No Results for:" -msgstr "Brak wyników dla:" +msgid "No Results Found" +msgstr "" #: cps/templates/search.html:6 -msgid "Please try a different search" -msgstr "Proszę wypróbować podobne wyszukiwanie" +msgid "Search Term:" +msgstr "" #: cps/templates/search.html:8 msgid "Results for:" msgstr "Wyniki dla:" #: cps/templates/search_form.html:19 -msgid "Publishing date from" +msgid "Published Date From" msgstr "Data publikacji od" #: cps/templates/search_form.html:26 -msgid "Publishing date to" +msgid "Published Date To" msgstr "Data publikacji do" #: cps/templates/search_form.html:43 @@ -2114,18 +2184,18 @@ msgstr "Wyklucz języki" #: cps/templates/search_form.html:95 msgid "Extensions" -msgstr "" +msgstr "Rozszerzenia" #: cps/templates/search_form.html:105 msgid "Exclude Extensions" -msgstr "" +msgstr "Wyklucz rozszerzenia" #: cps/templates/search_form.html:117 -msgid "Rating bigger than" +msgid "Rating Above" msgstr "Ocena większa niż" #: cps/templates/search_form.html:121 -msgid "Rating less than" +msgid "Rating Below" msgstr "Ocena mniejsza niż" #: cps/templates/shelf.html:10 @@ -2141,23 +2211,23 @@ msgid "Change order" msgstr "Zmień sortowanie" #: cps/templates/shelf.html:67 -msgid "Do you really want to delete the shelf?" +msgid "Are you sure you want to delete this shelf?" msgstr "Czy na pewno chcesz usunąć półkę?" #: cps/templates/shelf.html:70 -msgid "Shelf will be lost for everybody and forever!" +msgid "Shelf will be deleted for all users" msgstr "Półka nie będzie dostępne dla wszystkich na zawsze!" #: cps/templates/shelf_edit.html:13 -msgid "should the shelf be public?" +msgid "Share with Everyone" msgstr "półka powinna być publiczna?" #: cps/templates/shelf_order.html:5 -msgid "Drag 'n drop to rearrange order" +msgid "Drag to Rearrange Order" msgstr "Przeciągnij i upuść, aby zmienić kolejność" #: cps/templates/stats.html:7 -msgid "Calibre library statistics" +msgid "Library Statistics" msgstr "Statystyki biblioteki Calibre" #: cps/templates/stats.html:12 @@ -2177,21 +2247,17 @@ msgid "Series in this Library" msgstr "Serie" #: cps/templates/stats.html:28 -msgid "Linked libraries" +msgid "Linked Libraries" msgstr "Załączone biblioteki" #: cps/templates/stats.html:32 -msgid "Program library" +msgid "Program Library" msgstr "Biblioteka programu" #: cps/templates/stats.html:33 msgid "Installed Version" msgstr "Zainstalowana wersja" -#: cps/templates/tasks.html:7 -msgid "Tasks list" -msgstr "Lista zadań" - #: cps/templates/tasks.html:12 msgid "User" msgstr "Użytkownik" @@ -2210,11 +2276,11 @@ msgstr "Postęp" # ??? #: cps/templates/tasks.html:17 -msgid "Runtime" +msgid "Run Time" msgstr "Czas wykonania" #: cps/templates/tasks.html:18 -msgid "Starttime" +msgid "Start Time" msgstr "Start" # ??? @@ -2230,78 +2296,60 @@ msgstr "Ukryj wszystkie zadania" msgid "Reset user Password" msgstr "Zresetuj hasło użytkownika" -#: cps/templates/user_edit.html:26 -msgid "Kindle E-Mail" -msgstr "Adres e-mail Kindle" - -#: cps/templates/user_edit.html:39 -msgid "Show books with language" +#: cps/templates/user_edit.html:41 +msgid "Language of Books" msgstr "Pokaż książki w języku" -#: cps/templates/user_edit.html:41 -msgid "Show all" +#: cps/templates/user_edit.html:43 +msgid "Show All" msgstr "Pokaż wszystko" -#: cps/templates/user_edit.html:51 +#: cps/templates/user_edit.html:52 msgid "OAuth Settings" msgstr "Ustawienia OAuth" -#: cps/templates/user_edit.html:53 +#: cps/templates/user_edit.html:54 msgid "Link" msgstr "Połącz" -#: cps/templates/user_edit.html:55 +#: cps/templates/user_edit.html:56 msgid "Unlink" msgstr "Rozłącz" -#: cps/templates/user_edit.html:123 -msgid "Delete this user" -msgstr "Usuń tego użytkownika" - -# ??? -#: cps/templates/user_edit.html:138 -msgid "Recent Downloads" -msgstr "Pobrane" - -#~ msgid "Keyfile location is not valid, please enter correct path" -#~ msgstr "Lokalizacja pliku kluczy jest nieprawidłowa, wprowadź poprawną ścieżkę" - -#~ msgid "Certfile location is not valid, please enter correct path" -#~ msgstr "Lokalizacja pliku certyfikatu jest nieprawidłowa, wprowadź poprawną ścieżkę" - -#~ msgid "Logfile location is not valid, please enter correct path" -#~ msgstr "Lokalizacja pliku loga jest nieprawidłowa, wprowadź poprawną ścieżkę" - -#~ msgid "Access Logfile location is not valid, please enter correct path" -#~ msgstr "Lokalizacja pliku Access loga jest nieprawidłowa, wprowadź poprawną ścieżkę" - -#~ msgid "DB location is not valid, please enter correct path" -#~ msgstr "Lokalizacja bazy danych jest nieprawidłowa, wpisz poprawną ścieżkę" - -#~ msgid "Excecution permissions missing" -#~ msgstr "Brak uprawnień do tego zadania" +#: cps/templates/user_edit.html:62 +msgid "Kobo Sync Token" +msgstr "" -#~ msgid "not configured" -#~ msgstr "nie skonfigurowane" +#: cps/templates/user_edit.html:64 +msgid "Create/View" +msgstr "" -#~ msgid "Installed" -#~ msgstr "Zainstalowane" +#: cps/templates/user_edit.html:83 +msgid "Add allowed/denied Tags" +msgstr "" -#~ msgid "Not installed" -#~ msgstr "Nie zainstalowane" +#: cps/templates/user_edit.html:84 +msgid "Add allowed/denied custom column values" +msgstr "" -#~ msgid "Use" -#~ msgstr "" +#: cps/templates/user_edit.html:129 +msgid "Delete User" +msgstr "Usuń tego użytkownika" -#~ msgid "Play / pause" -#~ msgstr "" +# ??? +#: cps/templates/user_edit.html:144 +msgid "Recent Downloads" +msgstr "Pobrane" -#~ msgid "volume" -#~ msgstr "" +#: cps/templates/user_edit.html:160 +msgid "Generate Kobo Auth URL" +msgstr "" -#~ msgid "unknown" -#~ msgstr "nieznany" +#: cps/templates/user_edit.html:176 +msgid "Do you really want to delete the Kobo Token?" +msgstr "" -#~ msgid "New Books" -#~ msgstr "Nowe książki" +# ??? +#~ msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" +#~ msgstr "Nie można zapisać. Okładka jest w niewspieranym formacie (jpg/png/webp)" diff --git a/cps/translations/ru/LC_MESSAGES/messages.mo b/cps/translations/ru/LC_MESSAGES/messages.mo index 90f8e142..a3cb520e 100644 Binary files a/cps/translations/ru/LC_MESSAGES/messages.mo and b/cps/translations/ru/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/ru/LC_MESSAGES/messages.po b/cps/translations/ru/LC_MESSAGES/messages.po index 3f786a75..a8302275 100644 --- a/cps/translations/ru/LC_MESSAGES/messages.po +++ b/cps/translations/ru/LC_MESSAGES/messages.po @@ -1,5 +1,6 @@ # Перевод на русский язык для Calibre-Web. # Copyright (C) 2017 Pavel Korovin +# Update by ZIZA 2020 # This file is distributed under the same license as the Calibre-Web project # Pavel Korovin , 2017. # @@ -7,32 +8,32 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2020-01-12 13:57+0100\n" -"PO-Revision-Date: 2018-12-14 16:26+0300\n" -"Last-Translator: Pavel Korovin \n" +"POT-Creation-Date: 2020-03-12 20:31+0100\n" +"PO-Revision-Date: 2020-03-07 11:12+0100\n" +"Last-Translator: ZIZA\n" "Language: ru\n" "Language-Team: \n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.7.0\n" +"Generated-By: Babel 2.8.0\n" #: cps/about.py:42 msgid "installed" -msgstr "" +msgstr "установлено" #: cps/about.py:44 msgid "not installed" msgstr "не установлено" -#: cps/about.py:84 +#: cps/about.py:87 msgid "Statistics" msgstr "Статистика" #: cps/admin.py:89 msgid "Server restarted, please reload page" -msgstr "Сервер перезагружен, пожалуйста, перезагрузите страницу" +msgstr "Сервер перезагружен, пожалуйста, обновите страницу" #: cps/admin.py:91 msgid "Performing shutdown of server, please close window" @@ -40,7 +41,7 @@ msgstr "Производится остановка сервера, пожалу #: cps/admin.py:110 cps/editbooks.py:410 cps/editbooks.py:419 #: cps/editbooks.py:539 cps/editbooks.py:541 cps/editbooks.py:594 -#: cps/updater.py:446 cps/uploader.py:97 cps/uploader.py:108 +#: cps/updater.py:456 cps/uploader.py:96 cps/uploader.py:107 msgid "Unknown" msgstr "Неизвестно" @@ -48,161 +49,170 @@ msgstr "Неизвестно" msgid "Admin page" msgstr "Администрирование" -#: cps/admin.py:148 cps/templates/admin.html:115 +#: cps/admin.py:151 msgid "UI Configuration" msgstr "Настройка интерфейса" -#: cps/admin.py:185 cps/admin.py:412 +#: cps/admin.py:187 cps/admin.py:637 msgid "Calibre-Web configuration updated" msgstr "Конфигурация Calibre-Web обновлена" -#: cps/admin.py:442 cps/templates/admin.html:114 +#: cps/admin.py:434 cps/admin.py:440 cps/admin.py:451 cps/admin.py:462 +#: cps/templates/modal_restriction.html:29 +msgid "Deny" +msgstr "Запретить" + +#: cps/admin.py:436 cps/admin.py:442 cps/admin.py:453 cps/admin.py:464 +#: cps/templates/modal_restriction.html:28 +msgid "Allow" +msgstr "Разрешить" + +#: cps/admin.py:667 msgid "Basic Configuration" msgstr "Настройки сервера" -#: cps/admin.py:465 cps/web.py:1093 +#: cps/admin.py:691 cps/web.py:1089 msgid "Please fill out all fields!" msgstr "Пожалуйста, заполните все поля!" -#: cps/admin.py:467 cps/admin.py:478 cps/admin.py:484 cps/admin.py:499 -#: cps/templates/admin.html:38 +#: cps/admin.py:694 cps/admin.py:706 cps/admin.py:712 cps/admin.py:730 msgid "Add new user" msgstr "Добавить пользователя" -#: cps/admin.py:476 cps/web.py:1318 +#: cps/admin.py:703 cps/web.py:1318 msgid "E-mail is not from valid domain" msgstr "E-mail не из существующей доменной зоны" -#: cps/admin.py:482 cps/admin.py:493 +#: cps/admin.py:710 cps/admin.py:725 msgid "Found an existing account for this e-mail address or nickname." -msgstr "Для этого адреса электронной почты или логина уже есть аккаунт." +msgstr "Для этого адреса электронной почты или логина уже есть учётная запись." -#: cps/admin.py:489 +#: cps/admin.py:721 #, python-format msgid "User '%(user)s' created" msgstr "Пользователь '%(user)s' добавлен" -#: cps/admin.py:509 +#: cps/admin.py:740 msgid "Edit e-mail server settings" msgstr "Изменить настройки e-mail сервера" -#: cps/admin.py:535 +#: cps/admin.py:766 #, python-format msgid "Test e-mail successfully send to %(kindlemail)s" msgstr "Тестовое письмо успешно отправлено на %(kindlemail)s" -#: cps/admin.py:538 +#: cps/admin.py:769 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Произошла ошибка при отправке тестового письма на: %(res)s" -#: cps/admin.py:540 +#: cps/admin.py:771 msgid "Please configure your e-mail address first..." -msgstr "" +msgstr "Пожалуйста, сначала настройте свой адрес электронной почты ..." -#: cps/admin.py:542 +#: cps/admin.py:773 msgid "E-mail server settings updated" msgstr "Настройки E-mail сервера обновлены" -#: cps/admin.py:571 +#: cps/admin.py:803 #, python-format msgid "User '%(nick)s' deleted" msgstr "Пользователь '%(nick)s' удалён" -#: cps/admin.py:574 +#: cps/admin.py:806 msgid "No admin user remaining, can't delete user" -msgstr "" +msgstr "Это последний администратор, невозможно удалить пользователя" -#: cps/admin.py:612 cps/web.py:1359 +#: cps/admin.py:842 cps/web.py:1361 msgid "Found an existing account for this e-mail address." msgstr "Этот адрес электронной почты уже зарегистрирован." -#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1334 +#: cps/admin.py:852 cps/admin.py:867 cps/admin.py:887 cps/web.py:1336 #, python-format msgid "Edit User %(nick)s" msgstr "Изменить пользователя %(nick)s" -#: cps/admin.py:622 cps/web.py:1327 +#: cps/admin.py:858 cps/web.py:1328 msgid "This username is already taken" -msgstr "" +msgstr "Это имя пользователя уже занято" -#: cps/admin.py:637 +#: cps/admin.py:874 #, python-format msgid "User '%(nick)s' updated" msgstr "Пользователь '%(nick)s' обновлён" -#: cps/admin.py:640 +#: cps/admin.py:877 msgid "An unknown error occured." msgstr "Произошла неизвестная ошибка." -#: cps/admin.py:657 +#: cps/admin.py:900 #, python-format msgid "Password for user %(user)s reset" msgstr "Пароль для пользователя %(user)s сброшен" -#: cps/admin.py:660 cps/web.py:1118 cps/web.py:1174 +#: cps/admin.py:903 cps/web.py:1114 cps/web.py:1170 msgid "An unknown error occurred. Please try again later." msgstr "Неизвестная ошибка. Попробуйте позже." -#: cps/admin.py:663 cps/web.py:1062 +#: cps/admin.py:906 cps/web.py:1055 msgid "Please configure the SMTP mail settings first..." -msgstr "Пожалуйста, сначала сконфигурируйте параметры SMTP" +msgstr "Пожалуйста, сперва настройте параметры SMTP" -#: cps/admin.py:674 +#: cps/admin.py:918 msgid "Logfile viewer" -msgstr "" +msgstr "Просмотр лога" -#: cps/admin.py:710 +#: cps/admin.py:957 msgid "Requesting update package" msgstr "Проверка обновлений" -#: cps/admin.py:711 +#: cps/admin.py:958 msgid "Downloading update package" msgstr "Загрузка обновлений" -#: cps/admin.py:712 +#: cps/admin.py:959 msgid "Unzipping update package" msgstr "Распаковка обновлений" -#: cps/admin.py:713 +#: cps/admin.py:960 msgid "Replacing files" msgstr "Замена файлов" -#: cps/admin.py:714 +#: cps/admin.py:961 msgid "Database connections are closed" -msgstr "Соеднинения с базой данных закрыты" +msgstr "Соединения с базой данных закрыты" -#: cps/admin.py:715 +#: cps/admin.py:962 msgid "Stopping server" msgstr "Остановка сервера" -#: cps/admin.py:716 +#: cps/admin.py:963 msgid "Update finished, please press okay and reload page" -msgstr "Обновления установлены, нажмите okay и перезагрузите страницу" +msgstr "Обновления установлены, нажмите ок и перезагрузите страницу" -#: cps/admin.py:717 cps/admin.py:718 cps/admin.py:719 cps/admin.py:720 +#: cps/admin.py:964 cps/admin.py:965 cps/admin.py:966 cps/admin.py:967 msgid "Update failed:" msgstr "Ошибка обновления:" -#: cps/admin.py:717 cps/updater.py:272 cps/updater.py:457 cps/updater.py:459 +#: cps/admin.py:964 cps/updater.py:282 cps/updater.py:467 cps/updater.py:469 msgid "HTTP Error" msgstr "Ошибка HTTP" -#: cps/admin.py:718 cps/updater.py:274 cps/updater.py:461 +#: cps/admin.py:965 cps/updater.py:284 cps/updater.py:471 msgid "Connection error" msgstr "Ошибка соединения" -#: cps/admin.py:719 cps/updater.py:276 cps/updater.py:463 +#: cps/admin.py:966 cps/updater.py:286 cps/updater.py:473 msgid "Timeout while establishing connection" -msgstr "Таймаут при установлении соединения" +msgstr "Тайм-аут при установлении соединения" -#: cps/admin.py:720 cps/updater.py:278 cps/updater.py:465 +#: cps/admin.py:967 cps/updater.py:288 cps/updater.py:475 msgid "General error" msgstr "Общая ошибка" #: cps/converter.py:31 msgid "not configured" -msgstr "" +msgstr "не настроено" #: cps/editbooks.py:214 cps/editbooks.py:396 msgid "Error opening eBook. File does not exist or file is not accessible" @@ -236,13 +246,9 @@ msgstr "Не удалось сохранить файл %(file)s." msgid "File format %(ext)s added to %(book)s" msgstr "Формат файла %(ext)s добавлен в %(book)s" -#: cps/editbooks.py:376 -msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" -msgstr "" - #: cps/editbooks.py:451 msgid "Cover is not a jpg file, can't save" -msgstr "" +msgstr "Обложка не в формате JPG, невозможно сохранить" #: cps/editbooks.py:494 #, python-format @@ -260,11 +266,11 @@ msgstr "Ошибка редактирования книги. Пожалуйст #: cps/editbooks.py:581 #, python-format msgid "File %(filename)s could not saved to temp dir" -msgstr "" +msgstr "Файл %(filename)s не удалось сохранить во временную папку" #: cps/editbooks.py:598 msgid "Uploaded book probably exists in the library, consider to change before upload new: " -msgstr "" +msgstr "Загруженная книга, вероятно, существует в библиотеке, перед тем как загрузить новую, рассмотрите возможность изменения:" #: cps/editbooks.py:613 #, python-format @@ -276,30 +282,30 @@ msgstr "Ошибка записи файла %(file)s (Доступ запрещ msgid "Failed to delete file %(file)s (Permission denied)." msgstr "Ошибка удаления файла %(file)s (Доступ запрещён)." -#: cps/editbooks.py:710 +#: cps/editbooks.py:709 #, python-format msgid "File %(file)s uploaded" -msgstr "" +msgstr "Файл %(file)s загружен" -#: cps/editbooks.py:739 +#: cps/editbooks.py:738 msgid "Source or destination format for conversion missing" msgstr "Исходный или целевой формат для конвертирования отсутствует" -#: cps/editbooks.py:747 +#: cps/editbooks.py:746 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Книга успешно поставлена в очередь для конвертирования в %(book_format)s" -#: cps/editbooks.py:751 +#: cps/editbooks.py:750 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Произошла ошибка при конвертирования этой книги: %(res)s" -#: cps/gdrive.py:62 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" -msgstr "" +msgstr "Настройка Google Drive не завершена, попробуйте деактивировать и снова активировать Google Drive" -#: cps/gdrive.py:104 +#: cps/gdrive.py:103 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Не удалось проверить домен обратного вызова, пожалуйста, выполните шаги для проверки домена в консоли разработчика Google." @@ -337,7 +343,7 @@ msgstr "Тестовый e-mail" #: cps/helper.py:133 msgid "Get Started with Calibre-Web" -msgstr "Начать работать с Calibre-Web" +msgstr "Начать работу с Calibre-Web" #: cps/helper.py:135 #, python-format @@ -348,12 +354,12 @@ msgstr "Регистрационный e-mail для пользователя: % #: cps/helper.py:163 cps/helper.py:165 #, python-format msgid "Send %(format)s to Kindle" -msgstr "" +msgstr "Отправить %(format)s в Kindle" #: cps/helper.py:169 cps/helper.py:173 #, python-format msgid "Convert %(orig)s to %(format)s and send to Kindle" -msgstr "" +msgstr "Преобразовать %(orig)s в %(format)s и отправить в Kindle" #: cps/helper.py:213 #, python-format @@ -362,7 +368,7 @@ msgstr "Эл. почта: %(book)s" #: cps/helper.py:215 msgid "The requested file could not be read. Maybe wrong permissions?" -msgstr "Запрашиваемый файл не может быть прочитан. Возможно не верные разрешения?" +msgstr "Запрашиваемый файл не может быть прочитан. Возможно у вас нет разрешения?" #: cps/helper.py:322 #, python-format @@ -377,7 +383,7 @@ msgstr "Переименовывание автора с: '%(src)s' на '%(dest #: cps/helper.py:346 #, python-format msgid "Rename file in path '%(src)s' to '%(dest)s' failed with error: %(error)s" -msgstr "" +msgstr "Не удалось переименовать файл по пути '%(src)s' to '%(dest)s' из-за ошибки: %(error)s" #: cps/helper.py:372 cps/helper.py:382 cps/helper.py:390 #, python-format @@ -389,85 +395,113 @@ msgstr "Файл %(file)s не найден на Google Drive" msgid "Book path %(path)s not found on Google Drive" msgstr "Путь книги %(path)s не найден на Google Drive" -#: cps/helper.py:643 +#: cps/helper.py:511 +msgid "Failed to create path for cover" +msgstr "" + +#: cps/helper.py:516 +msgid "Cover-file is not a valid image file" +msgstr "" + +#: cps/helper.py:519 +msgid "Failed to store cover-file" +msgstr "" + +#: cps/helper.py:530 +msgid "Only jpg/jpeg/png/webp files are supported as coverfile" +msgstr "" + +#: cps/helper.py:544 +msgid "Only jpg/jpeg files are supported as coverfile" +msgstr "" + +#: cps/helper.py:658 msgid "Waiting" msgstr "Ожидание" -#: cps/helper.py:645 +#: cps/helper.py:660 msgid "Failed" msgstr "Неудачно" -#: cps/helper.py:647 +#: cps/helper.py:662 msgid "Started" msgstr "Начало" -#: cps/helper.py:649 +#: cps/helper.py:664 msgid "Finished" -msgstr "Закончено" +msgstr "Завершено" -#: cps/helper.py:651 +#: cps/helper.py:666 msgid "Unknown Status" msgstr "Неизвестный статус" -#: cps/helper.py:656 +#: cps/helper.py:671 msgid "E-mail: " msgstr "E-mail: " -#: cps/helper.py:658 cps/helper.py:662 +#: cps/helper.py:673 cps/helper.py:677 msgid "Convert: " msgstr "Конвертировать:" -#: cps/helper.py:660 +#: cps/helper.py:675 msgid "Upload: " msgstr "Загрузить:" -#: cps/helper.py:664 +#: cps/helper.py:679 msgid "Unknown Task: " msgstr "Неизвестная задача:" -#: cps/oauth_bb.py:75 +#: cps/kobo_auth.py:127 +msgid "PLease access calibre-web from non localhost to get valid api_endpoint for kobo device" +msgstr "Пожалуйста, подключитесь к Calibre-Web не с локального хоста, чтобы получить действительный api_endpoint для устройства Kobo" + +#: cps/kobo_auth.py:130 cps/kobo_auth.py:150 +msgid "Kobo Setup" +msgstr "Настройка Kobo" + +#: cps/oauth_bb.py:74 #, python-format msgid "Register with %(provider)s" -msgstr "" +msgstr "Зарегистрируйтесь с %(provider)s" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:154 msgid "Failed to log in with GitHub." -msgstr "" +msgstr "Не удалось войти в систему с помощью GitHub" -#: cps/oauth_bb.py:160 +#: cps/oauth_bb.py:159 msgid "Failed to fetch user info from GitHub." -msgstr "" +msgstr "Не удалось получить информацию о пользователе из GitHub" -#: cps/oauth_bb.py:171 +#: cps/oauth_bb.py:170 msgid "Failed to log in with Google." -msgstr "" +msgstr "Не удалось войти в систему с помощью Google" -#: cps/oauth_bb.py:176 +#: cps/oauth_bb.py:175 msgid "Failed to fetch user info from Google." -msgstr "" +msgstr "Не удалось получить информацию о пользователе из Google" -#: cps/oauth_bb.py:274 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s success." -msgstr "" +msgstr "Связь с %(oauth)s успешно отменена" -#: cps/oauth_bb.py:278 +#: cps/oauth_bb.py:277 #, python-format msgid "Unlink to %(oauth)s failed." -msgstr "" +msgstr "Связь с %(oauth)s не удалось отмененить" -#: cps/oauth_bb.py:281 +#: cps/oauth_bb.py:280 #, python-format msgid "Not linked to %(oauth)s." -msgstr "" +msgstr "Не связано с %(oauth)s" -#: cps/oauth_bb.py:309 +#: cps/oauth_bb.py:308 msgid "GitHub Oauth error, please retry later." -msgstr "" +msgstr "Ошибка GitHub Oauth, пожалуйста попробуйте позже" -#: cps/oauth_bb.py:328 +#: cps/oauth_bb.py:327 msgid "Google Oauth error, please retry later." -msgstr "" +msgstr "Ошибка Google Oauth, пожалуйста попробуйте позже" #: cps/shelf.py:47 cps/shelf.py:99 msgid "Invalid shelf specified" @@ -476,7 +510,7 @@ msgstr "Указана неверная полка" #: cps/shelf.py:54 #, python-format msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" -msgstr "Извините, но вам не разрешено добавлять книгу на полку: %(shelfname)s" +msgstr "Извините, но вам не разрешено добавлять книги на полку: %(shelfname)s" #: cps/shelf.py:62 msgid "You are not allowed to edit public shelves" @@ -509,412 +543,402 @@ msgstr "Книги уже размещены на полке: %(name)s" #: cps/shelf.py:141 #, python-format msgid "Books have been added to shelf: %(sname)s" -msgstr "Книги добавлены в полку: %(sname)s" +msgstr "Книги добавлены на полку: %(sname)s" #: cps/shelf.py:143 #, python-format msgid "Could not add books to shelf: %(sname)s" msgstr "Не удалось добавить книги на полку: %(sname)s" -#: cps/shelf.py:180 +#: cps/shelf.py:181 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "Книга удалена с полки: %(sname)s" -#: cps/shelf.py:186 +#: cps/shelf.py:190 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "Извините, вы не можете удалить книгу с полки: %(sname)s" -#: cps/shelf.py:207 cps/shelf.py:231 +#: cps/shelf.py:211 cps/shelf.py:235 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "Полка с названием '%(title)s' уже существует." -#: cps/shelf.py:212 +#: cps/shelf.py:216 #, python-format msgid "Shelf %(title)s created" msgstr "Создана полка %(title)s" -#: cps/shelf.py:214 cps/shelf.py:242 +#: cps/shelf.py:218 cps/shelf.py:246 msgid "There was an error" msgstr "Произошла ошибка" -#: cps/shelf.py:215 cps/shelf.py:217 +#: cps/shelf.py:219 cps/shelf.py:221 msgid "create a shelf" msgstr "создать полку" -#: cps/shelf.py:240 +#: cps/shelf.py:244 #, python-format msgid "Shelf %(title)s changed" msgstr "Колка %(title)s изменена" -#: cps/shelf.py:243 cps/shelf.py:245 +#: cps/shelf.py:247 cps/shelf.py:249 msgid "Edit a shelf" msgstr "Изменить полку" -#: cps/shelf.py:289 +#: cps/shelf.py:301 #, python-format msgid "Shelf: '%(name)s'" msgstr "Полка: '%(name)s'" -#: cps/shelf.py:292 +#: cps/shelf.py:304 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Ошибка открытия Полки. Полка не существует или недоступна" -#: cps/shelf.py:323 +#: cps/shelf.py:342 +msgid "Hidden Book" +msgstr "Скрытая книга" + +#: cps/shelf.py:347 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Изменить расположение полки '%(name)s'" -#: cps/ub.py:57 +#: cps/ub.py:56 msgid "Recently Added" msgstr "Недавно Добавленные" -#: cps/ub.py:59 +#: cps/ub.py:58 msgid "Show recent books" msgstr "Показывать недавние книги" -#: cps/templates/index.xml:17 cps/ub.py:60 +#: cps/templates/index.xml:17 cps/ub.py:59 msgid "Hot Books" msgstr "Популярные Книги" -#: cps/ub.py:61 -msgid "Show hot books" +#: cps/ub.py:60 +msgid "Show Hot Books" msgstr "Показывать популярные книги" -#: cps/templates/index.xml:24 cps/ub.py:64 -msgid "Best rated Books" +#: cps/templates/index.xml:24 cps/ub.py:63 cps/web.py:508 +msgid "Top Rated Books" msgstr "Книги с наилучшим рейтингом" -#: cps/ub.py:66 -msgid "Show best rated books" +#: cps/ub.py:65 +msgid "Show Top Rated Books" msgstr "Показывать книги с наивысшим рейтингом" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67 -#: cps/web.py:1011 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:66 +#: cps/web.py:1005 msgid "Read Books" msgstr "Прочитанные Книги" -#: cps/ub.py:69 +#: cps/ub.py:68 msgid "Show read and unread" msgstr "Показывать прочитанные и непрочитанные" -#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71 -#: cps/web.py:1015 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:70 +#: cps/web.py:1009 msgid "Unread Books" msgstr "Непрочитанные Книги" -#: cps/ub.py:73 +#: cps/ub.py:72 msgid "Show unread" -msgstr "" +msgstr "Показать непрочитанное" -#: cps/ub.py:74 +#: cps/ub.py:73 msgid "Discover" msgstr "Обзор" -#: cps/ub.py:76 +#: cps/ub.py:75 msgid "Show random books" msgstr "Показывать случайные книги" -#: cps/templates/index.xml:75 cps/ub.py:77 +#: cps/templates/index.xml:75 cps/ub.py:76 cps/web.py:787 msgid "Categories" msgstr "Категории" -#: cps/ub.py:79 +#: cps/ub.py:78 msgid "Show category selection" msgstr "Показывать выбор категории" -#: cps/templates/book_edit.html:71 cps/templates/index.xml:82 -#: cps/templates/search_form.html:53 cps/ub.py:80 +#: cps/templates/book_edit.html:69 cps/templates/index.xml:82 +#: cps/templates/search_form.html:53 cps/ub.py:79 cps/web.py:715 msgid "Series" msgstr "Серии" -#: cps/ub.py:82 +#: cps/ub.py:81 msgid "Show series selection" msgstr "Показывать выбор серии" -#: cps/templates/index.xml:61 cps/ub.py:83 +#: cps/templates/index.xml:61 cps/ub.py:82 msgid "Authors" msgstr "Авторы" -#: cps/ub.py:85 +#: cps/ub.py:84 msgid "Show author selection" msgstr "Показывать выбор автора" -#: cps/templates/index.xml:68 cps/ub.py:87 +#: cps/templates/index.xml:68 cps/ub.py:86 cps/web.py:699 msgid "Publishers" msgstr "Издатели" -#: cps/ub.py:89 +#: cps/ub.py:88 msgid "Show publisher selection" msgstr "Показать выбор издателя" -#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:90 +#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:89 +#: cps/web.py:770 msgid "Languages" msgstr "Языки" -#: cps/ub.py:93 +#: cps/ub.py:92 msgid "Show language selection" msgstr "Показывать выбор языка" -#: cps/ub.py:94 +#: cps/templates/index.xml:96 cps/ub.py:93 msgid "Ratings" -msgstr "" +msgstr "Рейтинги" -#: cps/ub.py:96 +#: cps/ub.py:95 msgid "Show ratings selection" -msgstr "" +msgstr "Показать выбор рейтинга" -#: cps/templates/index.xml:96 cps/ub.py:97 +#: cps/templates/index.xml:104 cps/ub.py:96 msgid "File formats" -msgstr "" +msgstr "Форматы файлов" -#: cps/ub.py:99 +#: cps/ub.py:98 msgid "Show file formats selection" -msgstr "" +msgstr "Показать выбор форматов файлов" -#: cps/updater.py:252 cps/updater.py:359 cps/updater.py:372 +#: cps/updater.py:262 cps/updater.py:369 cps/updater.py:382 msgid "Unexpected data while reading update information" msgstr "Некорректные данные при чтении информации об обновлении" -#: cps/updater.py:259 cps/updater.py:365 +#: cps/updater.py:269 cps/updater.py:375 msgid "No update available. You already have the latest version installed" -msgstr "Обновление недоступно. Вы используете самую последнюю версию" +msgstr "Нет доступных обновлений. Вы используете последнюю версию" -#: cps/updater.py:285 +#: cps/updater.py:295 msgid "A new update is available. Click on the button below to update to the latest version." -msgstr "Доступно обновление. Нажмите на кнопку, что бы обновиться до последней версии." +msgstr "Новое обновление доступно. Нажмите на кнопку ниже, чтобы обновить до последней версии." -#: cps/updater.py:338 +#: cps/updater.py:348 msgid "Could not fetch update information" msgstr "Не удалось получить информацию об обновлении" -#: cps/updater.py:352 +#: cps/updater.py:362 msgid "No release information available" -msgstr "" +msgstr "Информация о выпуске недоступна" -#: cps/updater.py:405 cps/updater.py:414 +#: cps/updater.py:415 cps/updater.py:424 #, python-format msgid "A new update is available. Click on the button below to update to version: %(version)s" -msgstr "" +msgstr "Новое обновление доступно. Нажмите на кнопку ниже, чтобы обновиться до версии: %(version)s" -#: cps/updater.py:424 +#: cps/updater.py:434 msgid "Click on the button below to update to the latest stable version." -msgstr "" +msgstr "Нажмите на кнопку ниже для обновления до последней стабильной версии" -#: cps/web.py:486 +#: cps/web.py:480 msgid "Recently Added Books" msgstr "Недавно Добавленные Книги" -#: cps/web.py:514 -msgid "Best rated books" -msgstr "Книги с наивысшим рейтингом" - -#: cps/templates/index.xml:38 cps/web.py:522 -msgid "Random Books" -msgstr "Случайный выбор" +#: cps/templates/index.html:5 cps/web.py:516 +msgid "Discover (Random Books)" +msgstr "Обзор (Случайные Книги)" -#: cps/web.py:548 +#: cps/web.py:542 msgid "Books" -msgstr "" +msgstr "Книги" -#: cps/web.py:575 -msgid "Hot Books (most downloaded)" +#: cps/web.py:569 +msgid "Hot Books (Most Downloaded)" msgstr "Популярные книги (часто загружаемые)" -#: cps/web.py:586 cps/web.py:1382 cps/web.py:1478 -msgid "Error opening eBook. File does not exist or file is not accessible:" -msgstr "Невозможно открыть книгу. Файл не существует или недоступен." +#: cps/web.py:580 +msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" +msgstr "Невозможно открыть книгу. Файл не существует или недоступен" -#: cps/web.py:599 +#: cps/web.py:593 #, python-format msgid "Author: %(name)s" -msgstr "" +msgstr "Автор: %(name)s" -#: cps/web.py:611 +#: cps/web.py:605 #, python-format msgid "Publisher: %(name)s" msgstr "Издатель: %(name)s" -#: cps/web.py:622 +#: cps/web.py:616 #, python-format msgid "Series: %(serie)s" msgstr "Серии: %(serie)s" -#: cps/web.py:633 +#: cps/web.py:627 #, python-format msgid "Rating: %(rating)s stars" -msgstr "" +msgstr "Оценка: %(rating)s звезды(а)" -#: cps/web.py:644 +#: cps/web.py:638 #, python-format msgid "File format: %(format)s" -msgstr "" +msgstr "Формат файла: %(format)s" -#: cps/web.py:656 +#: cps/web.py:650 #, python-format msgid "Category: %(name)s" msgstr "Категория: %(name)s" -#: cps/web.py:673 +#: cps/web.py:667 #, python-format msgid "Language: %(name)s" msgstr "Язык: %(name)s" -#: cps/web.py:705 -msgid "Publisher list" -msgstr "Список издателей" - -#: cps/web.py:721 -msgid "Series list" -msgstr "Серии" - -#: cps/web.py:735 +#: cps/web.py:729 msgid "Ratings list" -msgstr "" +msgstr "Список рейтингов" -#: cps/web.py:748 +#: cps/web.py:742 msgid "File formats list" -msgstr "" - -#: cps/web.py:776 -msgid "Available languages" -msgstr "Доступные языки" +msgstr "Список форматов файлов" -#: cps/web.py:793 -msgid "Category list" -msgstr "Категории" - -#: cps/templates/layout.html:73 cps/web.py:807 +#: cps/templates/layout.html:73 cps/templates/tasks.html:7 cps/web.py:801 msgid "Tasks" msgstr "Задания" -#: cps/templates/feed.xml:33 cps/templates/layout.html:44 -#: cps/templates/layout.html:45 cps/web.py:829 cps/web.py:831 +#: cps/templates/book_edit.html:212 cps/templates/feed.xml:33 +#: cps/templates/layout.html:44 cps/templates/layout.html:47 +#: cps/templates/search_form.html:170 cps/web.py:821 cps/web.py:823 msgid "Search" msgstr "Поиск" -#: cps/web.py:881 +#: cps/web.py:873 msgid "Published after " -msgstr "Опубликовано до " +msgstr "Опубликовано после" -#: cps/web.py:888 +#: cps/web.py:880 msgid "Published before " -msgstr "Опубликовано после " +msgstr "Опубликовано до" -#: cps/web.py:902 +#: cps/web.py:894 #, python-format msgid "Rating <= %(rating)s" msgstr "Рейтинг <= %(rating)s" -#: cps/web.py:904 +#: cps/web.py:896 #, python-format msgid "Rating >= %(rating)s" msgstr "Рейтинг >= %(rating)s" -#: cps/web.py:970 cps/web.py:982 +#: cps/web.py:962 cps/web.py:976 msgid "search" msgstr "поиск" -#: cps/web.py:1067 +#: cps/web.py:1060 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Книга успешно поставлена в очередь для отправки на %(kindlemail)s" -#: cps/web.py:1071 +#: cps/web.py:1064 #, python-format msgid "There was an error sending this book: %(res)s" -msgstr "Ошибка при отправке книги: %(res)s" +msgstr "При отправке этой книги произошла ошибка: %(res)s" -#: cps/web.py:1073 +#: cps/web.py:1066 msgid "Please configure your kindle e-mail address first..." msgstr "Пожалуйста, сначала настройте e-mail на вашем kindle..." -#: cps/web.py:1087 +#: cps/web.py:1083 msgid "E-Mail server is not configured, please contact your administrator!" -msgstr "" +msgstr "Сервер электронной почты не настроен, обратитесь к администратору !" -#: cps/web.py:1088 cps/web.py:1094 cps/web.py:1119 cps/web.py:1123 -#: cps/web.py:1128 cps/web.py:1132 +#: cps/web.py:1084 cps/web.py:1090 cps/web.py:1115 cps/web.py:1119 +#: cps/web.py:1124 cps/web.py:1128 msgid "register" msgstr "регистрация" -#: cps/web.py:1121 +#: cps/web.py:1117 msgid "Your e-mail is not allowed to register" msgstr "Ваш e-mail не подходит для регистрации" -#: cps/web.py:1124 +#: cps/web.py:1120 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Письмо с подтверждением отправлено вам на e-mail" -#: cps/web.py:1127 +#: cps/web.py:1123 msgid "This username or e-mail address is already in use." msgstr "Этот никнейм или e-mail уже используются" -#: cps/web.py:1144 +#: cps/web.py:1140 msgid "Cannot activate LDAP authentication" -msgstr "" +msgstr "Не удается активировать LDAP аутентификацию" -#: cps/web.py:1154 cps/web.py:1281 +#: cps/web.py:1150 cps/web.py:1277 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "Вы вошли как пользователь '%(nickname)s'" -#: cps/web.py:1159 +#: cps/web.py:1155 msgid "Could not login. LDAP server down, please contact your administrator" -msgstr "" +msgstr "Не удалось войти. Сервер LDAP не работает, обратитесь к администратору" -#: cps/web.py:1163 cps/web.py:1186 +#: cps/web.py:1159 cps/web.py:1182 msgid "Wrong Username or Password" msgstr "Ошибка в имени пользователя или пароле" -#: cps/web.py:1170 +#: cps/web.py:1166 msgid "New Password was send to your email address" -msgstr "" +msgstr "Новый пароль был отправлен на ваш адрес электронной почты" -#: cps/web.py:1176 +#: cps/web.py:1172 msgid "Please enter valid username to reset password" -msgstr "" +msgstr "Пожалуйста, введите действительное имя пользователя для сброса пароля" -#: cps/web.py:1182 +#: cps/web.py:1178 #, python-format msgid "You are now logged in as: '%(nickname)s'" -msgstr "" +msgstr "Вы вошли как: '%(nickname)s'" -#: cps/web.py:1189 cps/web.py:1213 +#: cps/web.py:1185 cps/web.py:1209 msgid "login" msgstr "войти" -#: cps/web.py:1225 cps/web.py:1259 +#: cps/web.py:1221 cps/web.py:1255 msgid "Token not found" msgstr "Ключ не найден" -#: cps/web.py:1234 cps/web.py:1267 +#: cps/web.py:1230 cps/web.py:1263 msgid "Token has expired" msgstr "Ключ просрочен" -#: cps/web.py:1243 +#: cps/web.py:1239 msgid "Success! Please return to your device" msgstr "Успешно! Пожалуйста, проверьте свое устройство" -#: cps/web.py:1320 cps/web.py:1363 cps/web.py:1369 +#: cps/web.py:1320 cps/web.py:1365 cps/web.py:1371 #, python-format msgid "%(name)s's profile" -msgstr "Профиль %(name)s" +msgstr "Профиль %(name)s's" -#: cps/web.py:1365 +#: cps/web.py:1367 msgid "Profile updated" msgstr "Профиль обновлён" -#: cps/web.py:1394 cps/web.py:1397 cps/web.py:1400 cps/web.py:1407 -#: cps/web.py:1412 +#: cps/web.py:1384 cps/web.py:1480 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "Ошибка открытия электронной книги. Файл не существует или файл недоступен:" + +#: cps/web.py:1396 cps/web.py:1399 cps/web.py:1402 cps/web.py:1409 +#: cps/web.py:1414 msgid "Read a Book" msgstr "Читать Книгу" -#: cps/web.py:1423 +#: cps/web.py:1425 msgid "Error opening eBook. File does not exist or file is not accessible." -msgstr "" +msgstr "Ошибка открытия электронной книги. Файл не существует или файл недоступен" #: cps/worker.py:335 #, python-format @@ -924,27 +948,30 @@ msgstr "Ошибка Ebook-конвертора: %(error)s" #: cps/worker.py:346 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" -msgstr "Kindlegen - неудачно, с Ошибкой %(error)s. Сообщение: %(message)s" +msgstr "Kindlegen - неудачно, с ошибкой %(error)s. Сообщение: %(message)s" #: cps/templates/admin.html:9 -msgid "User list" +msgid "Users" msgstr "Список пользователей" -#: cps/templates/admin.html:12 -msgid "Nickname" +#: cps/templates/admin.html:12 cps/templates/login.html:8 +#: cps/templates/login.html:9 cps/templates/register.html:7 +#: cps/templates/user_edit.html:8 +msgid "Username" msgstr "Имя пользователя" -#: cps/templates/admin.html:13 -msgid "E-mail" -msgstr "Почта" +#: cps/templates/admin.html:13 cps/templates/register.html:11 +#: cps/templates/user_edit.html:13 +msgid "E-mail Address" +msgstr "Адрес электронной почты" -#: cps/templates/admin.html:14 -msgid "Kindle" -msgstr "Kindle" +#: cps/templates/admin.html:14 cps/templates/user_edit.html:26 +msgid "Send to Kindle E-mail Address" +msgstr "Отправить на Kindle Адрес электронной почты" #: cps/templates/admin.html:15 -msgid "DLS" -msgstr "DLS" +msgid "Downloads" +msgstr "Скачать" #: cps/templates/admin.html:16 cps/templates/layout.html:76 msgid "Admin" @@ -957,8 +984,8 @@ msgid "Download" msgstr "Скачать" #: cps/templates/admin.html:18 -msgid "View Ebooks" -msgstr "" +msgid "View eBooks" +msgstr "Посмотреть электронные книги" #: cps/templates/admin.html:19 cps/templates/layout.html:65 msgid "Upload" @@ -968,28 +995,32 @@ msgstr "Загрузить" msgid "Edit" msgstr "Редактировать" +#: cps/templates/admin.html:38 +msgid "Add New User" +msgstr "Добавить нового пользователя" + #: cps/templates/admin.html:44 -msgid "SMTP e-mail server settings" +msgid "E-mail Server Settings" msgstr "Настройки SMTP-сервера" #: cps/templates/admin.html:47 cps/templates/email_edit.html:11 -msgid "SMTP hostname" +msgid "SMTP Hostname" msgstr "SMTP-сервер" -#: cps/templates/admin.html:48 -msgid "SMTP port" +#: cps/templates/admin.html:48 cps/templates/email_edit.html:15 +msgid "SMTP Port" msgstr "SMTP-порт" -#: cps/templates/admin.html:49 -msgid "SSL" +#: cps/templates/admin.html:49 cps/templates/email_edit.html:19 +msgid "Encryption" msgstr "SSL" #: cps/templates/admin.html:50 cps/templates/email_edit.html:27 -msgid "SMTP login" +msgid "SMTP Login" msgstr "SMTP-логин" -#: cps/templates/admin.html:51 -msgid "From mail" +#: cps/templates/admin.html:51 cps/templates/email_edit.html:35 +msgid "From E-mail" msgstr "Отправитель" #: cps/templates/admin.html:61 @@ -1001,63 +1032,71 @@ msgid "Configuration" msgstr "Настройки сервера" #: cps/templates/admin.html:70 -msgid "Calibre DB dir" -msgstr "Папка Calibre DB" +msgid "Calibre Database Directory" +msgstr "Расположение базы данных Calibre" -#: cps/templates/admin.html:74 -msgid "Log level" -msgstr "Уровень лога" +#: cps/templates/admin.html:74 cps/templates/config_edit.html:122 +msgid "Log Level" +msgstr "Уровень логирования" #: cps/templates/admin.html:78 msgid "Port" msgstr "Порт" -#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:23 -msgid "Books per page" +#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:27 +msgid "Books per Page" msgstr "Количество книг на странице" #: cps/templates/admin.html:88 -msgid "Uploading" +msgid "Uploads" msgstr "Загрузка на сервер" #: cps/templates/admin.html:92 -msgid "Anonymous browsing" +msgid "Anonymous Browsing" msgstr "Анонимный просмотр" #: cps/templates/admin.html:96 -msgid "Public registration" +msgid "Public Registration" msgstr "Публичная регистрация" -#: cps/templates/admin.html:100 cps/templates/remote_login.html:4 -msgid "Remote login" +#: cps/templates/admin.html:100 +msgid "Magic Link Remote Login" msgstr "Удалённый логин" #: cps/templates/admin.html:104 -msgid "Reverse proxy login" -msgstr "" +msgid "Reverse Proxy Login" +msgstr "Логин обратного прокси" #: cps/templates/admin.html:109 msgid "Reverse proxy header name" -msgstr "" +msgstr "Имя заголовка обратного прокси" + +#: cps/templates/admin.html:114 +msgid "Edit Basic Configuration" +msgstr "Изменить основные настройки" + +#: cps/templates/admin.html:115 +msgid "Edit UI Configuration" +msgstr "Изменить настройки интерфейса" #: cps/templates/admin.html:121 msgid "Administration" msgstr "Управление" #: cps/templates/admin.html:122 -msgid "View Logfiles" -msgstr "" +msgid "View Logs" +msgstr "Просмотреть лог файл" #: cps/templates/admin.html:123 -msgid "Reconnect to Calibre DB" -msgstr "Переподключиться к БД Calibre" +msgid "Reconnect Calibre Database" +msgstr "Пере подключиться к базе жанных Calibre" #: cps/templates/admin.html:124 -msgid "Restart Calibre-Web" +msgid "Restart" msgstr "Перезагрузить Calibre-Web" #: cps/templates/admin.html:125 -msgid "Stop Calibre-Web" +msgid "Shutdown" msgstr "Остановить Calibre-Web" #: cps/templates/admin.html:131 @@ -1077,7 +1116,7 @@ msgid "Current version" msgstr "Текущая версия" #: cps/templates/admin.html:148 -msgid "Check for update" +msgid "Check for Update" msgstr "Проверка обновлений" #: cps/templates/admin.html:149 @@ -1085,30 +1124,29 @@ msgid "Perform Update" msgstr "Установить обновления" #: cps/templates/admin.html:161 -msgid "Do you really want to restart Calibre-Web?" +msgid "Are you sure you want to restart?" msgstr "Вы действительно хотите перезагрузить Calibre-Web?" #: cps/templates/admin.html:166 cps/templates/admin.html:180 #: cps/templates/admin.html:200 cps/templates/shelf.html:72 -msgid "Ok" +msgid "OK" msgstr "Ok" #: cps/templates/admin.html:167 cps/templates/admin.html:181 -#: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 +#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:194 +#: cps/templates/config_edit.html:346 cps/templates/config_view_edit.html:151 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92 -#: cps/templates/layout.html:28 cps/templates/shelf.html:73 -#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32 -#: cps/templates/user_edit.html:131 -msgid "Back" -msgstr "Назад" +#: cps/templates/shelf.html:73 cps/templates/shelf_edit.html:19 +#: cps/templates/user_edit.html:137 +msgid "Cancel" +msgstr "Отмена" #: cps/templates/admin.html:179 -msgid "Do you really want to stop Calibre-Web?" +msgid "Are you sure you want to shutdown?" msgstr "Вы действительно хотите остановить Calibre-Web?" #: cps/templates/admin.html:191 -msgid "Updating, please do not reload page" +msgid "Updating, please do not reload this page" msgstr "Установка обновлений, пожалуйста, не обновляйте страницу." #: cps/templates/author.html:15 @@ -1122,174 +1160,172 @@ msgstr "В библиотеке" #: cps/templates/author.html:34 cps/templates/list.html:14 #: cps/templates/search.html:41 msgid "All" -msgstr "" +msgstr "Все" #: cps/templates/author.html:58 cps/templates/author.html:110 #: cps/templates/discover.html:27 cps/templates/index.html:26 #: cps/templates/index.html:89 cps/templates/search.html:67 #: cps/templates/shelf.html:36 msgid "reduce" -msgstr "" +msgstr "уменьшить" #: cps/templates/author.html:94 msgid "More by" msgstr "Ещё от" -#: cps/templates/book_edit.html:12 +#: cps/templates/book_edit.html:10 msgid "Delete Book" msgstr "Удалить книгу" -#: cps/templates/book_edit.html:15 +#: cps/templates/book_edit.html:13 msgid "Delete formats:" msgstr "Удалить форматы:" -#: cps/templates/book_edit.html:18 cps/templates/book_edit.html:195 -#: cps/templates/email_edit.html:91 +#: cps/templates/book_edit.html:16 cps/templates/book_edit.html:193 +#: cps/templates/email_edit.html:91 cps/templates/user_edit.html:65 +#: cps/templates/user_edit.html:177 msgid "Delete" msgstr "Удалить" -#: cps/templates/book_edit.html:26 +#: cps/templates/book_edit.html:24 msgid "Convert book format:" msgstr "Конвертировать формат книги:" -#: cps/templates/book_edit.html:30 +#: cps/templates/book_edit.html:28 msgid "Convert from:" msgstr "Конвертировать из:" -#: cps/templates/book_edit.html:32 cps/templates/book_edit.html:39 +#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:37 msgid "select an option" msgstr "выбрать вариант" -#: cps/templates/book_edit.html:37 +#: cps/templates/book_edit.html:35 msgid "Convert to:" msgstr "Конвертировать в:" -#: cps/templates/book_edit.html:46 +#: cps/templates/book_edit.html:44 msgid "Convert book" msgstr "Конвертировать книгу" -#: cps/templates/book_edit.html:55 cps/templates/search_form.html:6 +#: cps/templates/book_edit.html:53 cps/templates/search_form.html:6 msgid "Book Title" msgstr "Название" -#: cps/templates/book_edit.html:59 cps/templates/book_edit.html:255 -#: cps/templates/book_edit.html:273 cps/templates/search_form.html:10 +#: cps/templates/book_edit.html:57 cps/templates/book_edit.html:256 +#: cps/templates/book_edit.html:274 cps/templates/search_form.html:10 msgid "Author" msgstr "Автор" -#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:260 -#: cps/templates/book_edit.html:275 cps/templates/search_form.html:126 +#: cps/templates/book_edit.html:61 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:276 cps/templates/search_form.html:126 msgid "Description" msgstr "Описание" -#: cps/templates/book_edit.html:67 cps/templates/search_form.html:33 +#: cps/templates/book_edit.html:65 cps/templates/search_form.html:33 msgid "Tags" msgstr "Теги" -#: cps/templates/book_edit.html:75 -msgid "Series id" -msgstr "Серия" +#: cps/templates/book_edit.html:73 +msgid "Series ID" +msgstr "ID Серии" -#: cps/templates/book_edit.html:79 +#: cps/templates/book_edit.html:77 msgid "Rating" msgstr "Рейтинг" -#: cps/templates/book_edit.html:83 -msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +#: cps/templates/book_edit.html:81 +msgid "Fetch Cover from URL (JPEG - Image will be downloaded and stored in database)" msgstr "URL обложки(jpg, обложка загружается и сохраняется в базе данных, после этого поле снова пустое)" -#: cps/templates/book_edit.html:87 -msgid "Upload Cover from local drive" +#: cps/templates/book_edit.html:85 +msgid "Upload Cover from Local Disk" msgstr "Загрузить обложку с диска" -#: cps/templates/book_edit.html:92 cps/templates/detail.html:165 -msgid "Publishing date" +#: cps/templates/book_edit.html:90 +msgid "Published Date" msgstr "Опубликовано" -#: cps/templates/book_edit.html:99 cps/templates/book_edit.html:257 -#: cps/templates/book_edit.html:274 cps/templates/detail.html:156 +#: cps/templates/book_edit.html:97 cps/templates/book_edit.html:258 +#: cps/templates/book_edit.html:275 cps/templates/detail.html:156 #: cps/templates/search_form.html:14 msgid "Publisher" msgstr "Издатель" -#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:30 +#: cps/templates/book_edit.html:101 cps/templates/detail.html:123 +#: cps/templates/user_edit.html:31 msgid "Language" msgstr "Язык" -#: cps/templates/book_edit.html:113 cps/templates/search_form.html:137 +#: cps/templates/book_edit.html:111 cps/templates/search_form.html:137 msgid "Yes" msgstr "Да" -#: cps/templates/book_edit.html:114 cps/templates/search_form.html:138 +#: cps/templates/book_edit.html:112 cps/templates/search_form.html:138 msgid "No" msgstr "Нет" -#: cps/templates/book_edit.html:160 -msgid "Upload format" +#: cps/templates/book_edit.html:158 +msgid "Upload Format" msgstr "Загружаемый формат" -#: cps/templates/book_edit.html:169 -msgid "view book after edit" +#: cps/templates/book_edit.html:167 +msgid "View Book on Save" msgstr "смотреть книгу после редактирования" -#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:208 -msgid "Get metadata" +#: cps/templates/book_edit.html:170 cps/templates/book_edit.html:206 +msgid "Fetch Metadata" msgstr "Получить метаданные" -#: 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:170 cps/templates/shelf_edit.html:17 -#: cps/templates/user_edit.html:129 -msgid "Submit" -msgstr "Отправить" +#: cps/templates/book_edit.html:171 cps/templates/config_edit.html:343 +#: cps/templates/config_view_edit.html:150 cps/templates/email_edit.html:38 +#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:135 +msgid "Save" +msgstr "Сохранить" -#: cps/templates/book_edit.html:187 +#: cps/templates/book_edit.html:185 msgid "Are you really sure?" msgstr "Вы действительно уверены?" -#: cps/templates/book_edit.html:190 -msgid "Book will be deleted from Calibre database" -msgstr "Книга будет удалена из БД Calibre" +#: cps/templates/book_edit.html:188 +msgid "This book will be permanently erased from database" +msgstr "Книга будет удалена из базы данных Calibre" -#: cps/templates/book_edit.html:191 -msgid "and from hard disk" +#: cps/templates/book_edit.html:189 +msgid "and hard disk" msgstr "и с диска" -#: cps/templates/book_edit.html:211 +#: cps/templates/book_edit.html:209 msgid "Keyword" msgstr "Ключевое слово" -#: cps/templates/book_edit.html:212 +#: cps/templates/book_edit.html:210 msgid " Search keyword " msgstr " Поиск по ключевому слову " -#: cps/templates/book_edit.html:214 cps/templates/layout.html:47 -msgid "Go!" -msgstr "Старт!" - -#: cps/templates/book_edit.html:218 +#: cps/templates/book_edit.html:216 msgid "Click the cover to load metadata to the form" msgstr "Нажмите на обложку, чтобы получить метаданные" -#: cps/templates/book_edit.html:230 cps/templates/book_edit.html:270 +#: cps/templates/book_edit.html:231 cps/templates/book_edit.html:271 msgid "Loading..." msgstr "Загрузка..." -#: cps/templates/book_edit.html:235 cps/templates/layout.html:192 -#: cps/templates/layout.html:224 +#: cps/templates/book_edit.html:236 cps/templates/layout.html:191 +#: cps/templates/layout.html:223 cps/templates/modal_restriction.html:34 +#: cps/templates/user_edit.html:164 msgid "Close" msgstr "Закрыть" -#: cps/templates/book_edit.html:262 cps/templates/book_edit.html:276 +#: cps/templates/book_edit.html:263 cps/templates/book_edit.html:277 msgid "Source" msgstr "Источник" -#: cps/templates/book_edit.html:271 +#: cps/templates/book_edit.html:272 msgid "Search error!" msgstr "Ошибка поиска!" -#: cps/templates/book_edit.html:272 -msgid "No Result(s) found! Please try aonther keyword." +#: cps/templates/book_edit.html:273 +msgid "No Result(s) found! Please try another keyword." msgstr "Результат(ы) не найдены! Попробуйте другое ключевое слово." #: cps/templates/config_edit.html:12 @@ -1297,8 +1333,8 @@ msgid "Library Configuration" msgstr "Настройки библотеки" #: cps/templates/config_edit.html:19 -msgid "Location of Calibre database" -msgstr "Расположение БД Calibre" +msgid "Location of Calibre Database" +msgstr "Расположение базы данных Calibre" #: cps/templates/config_edit.html:25 msgid "Use Google Drive?" @@ -1314,15 +1350,15 @@ msgstr "Аутентификация Google Drive" #: cps/templates/config_edit.html:41 msgid "Please hit submit to continue with setup" -msgstr "" +msgstr "Пожалуйста, нажмите «Отправить», чтобы продолжить настройку" #: cps/templates/config_edit.html:44 msgid "Please finish Google Drive setup after login" -msgstr "Завершите настройку Google Диска после входа в систему" +msgstr "Пожалуйста завершите настройку Google Диска после входа в систему" #: cps/templates/config_edit.html:49 msgid "Google Drive Calibre folder" -msgstr "Google Диск Calibre папка" +msgstr "Папка на Google Диске для Calibre" #: cps/templates/config_edit.html:57 msgid "Metadata Watch Channel ID" @@ -1349,300 +1385,312 @@ msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "Расположение SSL файла-ключа (оставьте его пустым для серверов без SSL)" #: cps/templates/config_edit.html:99 -msgid "Update channel" -msgstr "" +msgid "Update Channel" +msgstr "Ветка обновлений" #: cps/templates/config_edit.html:101 msgid "Stable" -msgstr "" +msgstr "Стабильная" #: cps/templates/config_edit.html:102 msgid "Stable (Automatic)" -msgstr "" +msgstr "Стабильная (Автоматически)" #: cps/templates/config_edit.html:103 msgid "Nightly" -msgstr "" +msgstr "Тестовая" #: cps/templates/config_edit.html:104 msgid "Nightly (Automatic)" -msgstr "" +msgstr "Тестовая (Автоматически)" #: cps/templates/config_edit.html:115 msgid "Logfile Configuration" msgstr "Настройки лог-файла" -#: cps/templates/config_edit.html:122 -msgid "Log Level" -msgstr "Уровень Логирования" - #: cps/templates/config_edit.html:131 msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "Расположение и имя лог-файла (не вводите calibre-web.log)" #: cps/templates/config_edit.html:136 msgid "Enable Access Log" -msgstr "" +msgstr "Включить журнал доступа" #: cps/templates/config_edit.html:139 msgid "Location and name of access logfile (access.log for no entry)" -msgstr "" +msgstr "Расположение и имя лог-файла доступа (access.log по умолчанию)" #: cps/templates/config_edit.html:150 msgid "Feature Configuration" msgstr "Дополнительный Настройки" #: cps/templates/config_edit.html:158 -msgid "Enable uploading" +msgid "Enable Uploads" msgstr "Разрешить загрузку на сервер" #: cps/templates/config_edit.html:162 -msgid "Enable anonymous browsing" +msgid "Enable Anonymous Browsing" msgstr "Разрешить анонимный просмотр" #: cps/templates/config_edit.html:166 -msgid "Enable public registration" +msgid "Enable Public Registration" msgstr "Разрешить публичную регистрацию" #: cps/templates/config_edit.html:170 -msgid "Enable remote login (\"magic link\")" +msgid "Enable Magic Link Remote Login" msgstr "Включить удаленный логин (\"magic link\")" #: cps/templates/config_edit.html:175 +msgid "Enable Kobo sync" +msgstr "Включить Kobo sync" + +#: cps/templates/config_edit.html:180 +msgid "Proxy unknown requests to Kobo Store" +msgstr "Неизвестный прокси запрос к Kobo Store" + +#: cps/templates/config_edit.html:187 msgid "Use Goodreads" -msgstr "" +msgstr "Использовать Goodreads" -#: cps/templates/config_edit.html:176 -msgid "Obtain an API Key" +#: cps/templates/config_edit.html:188 +msgid "Create an API Key" msgstr "Получить ключ API" -#: cps/templates/config_edit.html:180 +#: cps/templates/config_edit.html:192 msgid "Goodreads API Key" msgstr "Ключ API Goodreads" -#: cps/templates/config_edit.html:184 +#: cps/templates/config_edit.html:196 msgid "Goodreads API Secret" msgstr "Goodreads API Секрет" -#: cps/templates/config_edit.html:191 +#: cps/templates/config_edit.html:203 msgid "Login type" -msgstr "" +msgstr "Тип входа" -#: cps/templates/config_edit.html:193 -msgid "Use standard Authentication" -msgstr "" +#: cps/templates/config_edit.html:205 +msgid "Use Standard Authentication" +msgstr "Использовать стандартную аутентификацию" -#: cps/templates/config_edit.html:195 +#: cps/templates/config_edit.html:207 msgid "Use LDAP Authentication" -msgstr "" +msgstr "Использовать LDAP аутентификацию" -#: cps/templates/config_edit.html:198 +#: cps/templates/config_edit.html:210 msgid "Use OAuth" -msgstr "" +msgstr "Использовать OAuth" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:217 msgid "LDAP Server Host Name or IP Address" -msgstr "" +msgstr "Имя хоста или IP-адрес сервера LDAP" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:221 msgid "LDAP Server Port" -msgstr "" +msgstr "Порт сервера LDAP" -#: cps/templates/config_edit.html:213 -msgid "LDAP schema (ldap or ldaps)" -msgstr "" +#: cps/templates/config_edit.html:225 +msgid "LDAP Schema (LDAP or LPAPS)" +msgstr "Схема LDAP (ldap или ldaps)" -#: cps/templates/config_edit.html:217 -msgid "LDAP Admin username" -msgstr "" +#: cps/templates/config_edit.html:229 +msgid "LDAP Administrator Username" +msgstr "Имя администратора LDAP" -#: cps/templates/config_edit.html:221 -msgid "LDAP Admin password" -msgstr "" +#: cps/templates/config_edit.html:233 +msgid "LDAP Administrator Password" +msgstr "Пароль администратора LDAP" -#: cps/templates/config_edit.html:226 -msgid "LDAP Server use SSL" -msgstr "" +#: cps/templates/config_edit.html:238 +msgid "LDAP Server Enable SSL" +msgstr "Сервер LDAP использует SSL" -#: cps/templates/config_edit.html:230 -msgid "LDAP Server use TLS" -msgstr "" +#: cps/templates/config_edit.html:242 +msgid "LDAP Server Enable TLS" +msgstr "Сервер LDAP использует TLS" -#: cps/templates/config_edit.html:234 +#: cps/templates/config_edit.html:246 msgid "LDAP Server Certificate" -msgstr "" +msgstr "Сертификат сервера LDAP" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:250 msgid "LDAP SSL Certificate Path" -msgstr "" +msgstr "Путь к SSL сертификату LDAP" -#: cps/templates/config_edit.html:243 +#: cps/templates/config_edit.html:255 msgid "LDAP Distinguished Name (DN)" -msgstr "" +msgstr "Отличительное имя LDAP (DN)" -#: cps/templates/config_edit.html:247 -msgid "LDAP User object filter" -msgstr "" +#: cps/templates/config_edit.html:259 +msgid "LDAP User Object Filter" +msgstr "Фильтр объектов пользователя LDAP" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:264 msgid "LDAP Server is OpenLDAP?" -msgstr "" +msgstr "Сервер LDAP - это OpenLDAP ?" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:272 #, python-format msgid "Obtain %(provider)s OAuth Credential" -msgstr "" +msgstr "Получить %(provider)s OAuth Credential" -#: cps/templates/config_edit.html:263 +#: cps/templates/config_edit.html:275 #, python-format msgid "%(provider)s OAuth Client Id" -msgstr "" +msgstr "%(provider)s OAuth ID клиента" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:279 #, python-format msgid "%(provider)s OAuth Client Secret" -msgstr "" +msgstr "%(provider)s OAuth Секрет клиента" -#: cps/templates/config_edit.html:276 +#: cps/templates/config_edit.html:288 msgid "Allow Reverse Proxy Authentication" -msgstr "" +msgstr "Разрешить обратную аутентификацию прокси" -#: cps/templates/config_edit.html:280 +#: cps/templates/config_edit.html:292 msgid "Reverse Proxy Header Name" -msgstr "" +msgstr "Имя заголовка обратного прокси" -#: cps/templates/config_edit.html:292 +#: cps/templates/config_edit.html:304 msgid "External binaries" -msgstr "Внешние двоичные файлы" +msgstr "Внешний бинарный файл" -#: cps/templates/config_edit.html:300 -msgid "No converter" +#: cps/templates/config_edit.html:312 +msgid "No Converter" msgstr "Нет конвертера" -#: cps/templates/config_edit.html:302 +#: cps/templates/config_edit.html:314 msgid "Use Kindlegen" msgstr "Использовать Kindlegen" -#: cps/templates/config_edit.html:304 +#: cps/templates/config_edit.html:316 msgid "Use calibre's ebook converter" msgstr "Использовать конвертер calibre's ebook" -#: cps/templates/config_edit.html:308 +#: cps/templates/config_edit.html:320 msgid "E-Book converter settings" msgstr "Настройки конвертера E-Book" -#: cps/templates/config_edit.html:312 +#: cps/templates/config_edit.html:324 msgid "Path to convertertool" -msgstr "Путь к конвертеру" +msgstr "Путь к инструменту конвертации" -#: cps/templates/config_edit.html:318 +#: cps/templates/config_edit.html:330 msgid "Location of Unrar binary" -msgstr "Расположение двоичного файла Unrar" +msgstr "Расположение бинарного файла Unrar" -#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 -#: cps/templates/login.html:4 +#: cps/templates/config_edit.html:349 cps/templates/layout.html:84 +#: cps/templates/login.html:4 cps/templates/login.html:20 msgid "Login" msgstr "Логин" -#: cps/templates/config_view_edit.html:12 +#: cps/templates/config_view_edit.html:16 msgid "View Configuration" msgstr "Просмотреть Конфигурацию" -#: cps/templates/config_view_edit.html:19 cps/templates/shelf_edit.html:7 +#: cps/templates/config_view_edit.html:23 cps/templates/shelf_edit.html:7 msgid "Title" msgstr "Заголовок" -#: cps/templates/config_view_edit.html:27 -msgid "No. of random books to show" +#: cps/templates/config_view_edit.html:31 +msgid "No. of Random Books to Display" msgstr "Количество отображаемых случайных книг" -#: cps/templates/config_view_edit.html:31 -msgid "No. of authors to show before hiding (0=disable hiding)" -msgstr "" +#: cps/templates/config_view_edit.html:35 +msgid "No. of Authors to Display Before Hiding (0=Disable Hiding)" +msgstr "Количество авторов для отображения перед скрытием (0 = отключить скрытие)" -#: cps/templates/config_view_edit.html:35 cps/templates/readcbr.html:112 +#: cps/templates/config_view_edit.html:39 cps/templates/readcbr.html:112 msgid "Theme" msgstr "Тема" -#: cps/templates/config_view_edit.html:37 +#: cps/templates/config_view_edit.html:41 msgid "Standard Theme" msgstr "Стандартная тема" -#: cps/templates/config_view_edit.html:38 +#: cps/templates/config_view_edit.html:42 msgid "caliBlur! Dark Theme" msgstr "caliBlur! Темная тема" -#: cps/templates/config_view_edit.html:42 -msgid "Regular expression for ignoring columns" -msgstr "Regexp для игнорирования столбцов" - #: cps/templates/config_view_edit.html:46 -msgid "Link read/unread status to Calibre column" -msgstr "Ссылка на чтение/непрочитанный статус столбца Caliber" +msgid "Regular Expression for Ignoring Columns" +msgstr "Регулярное выражение для игнорирования столбцов" -#: cps/templates/config_view_edit.html:55 -msgid "Regular expression for title sorting" -msgstr "Regexp для сортировки по названию" +#: cps/templates/config_view_edit.html:50 +msgid "Link Read/Unread Status to Calibre Column" +msgstr "Ссылка на чтение/непрочитанный статус столбца Caliber" #: cps/templates/config_view_edit.html:59 -msgid "Tags for Mature Content" -msgstr "Теги для Зрелого Контента" +msgid "View Restrictions based on Calibre column" +msgstr "Просмотр ограничений на основе столбца Caliber" + +#: cps/templates/config_view_edit.html:61 cps/templates/email_edit.html:21 +msgid "None" +msgstr "Нет" -#: cps/templates/config_view_edit.html:73 -msgid "Default settings for new users" +#: cps/templates/config_view_edit.html:68 +msgid "Regular Expression for Title Sorting" +msgstr "Регулярное выражение для сортировки заголовков" + +#: cps/templates/config_view_edit.html:80 +msgid "Default Settings for New Users" msgstr "Настройки по умолчанию для новых пользователей" -#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:82 -msgid "Admin user" +#: cps/templates/config_view_edit.html:88 cps/templates/user_edit.html:92 +msgid "Admin User" msgstr "Управление сервером" -#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:91 +#: cps/templates/config_view_edit.html:92 cps/templates/user_edit.html:97 msgid "Allow Downloads" msgstr "Разрешить скачивание с сервера" -#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:95 -msgid "Allow book viewer" -msgstr "" +#: cps/templates/config_view_edit.html:96 cps/templates/user_edit.html:101 +msgid "Allow eBook Viewer" +msgstr "Разрешить чтение книг" -#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:99 +#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:105 msgid "Allow Uploads" msgstr "Разрешить загрузку на сервер" -#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:103 +#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:109 msgid "Allow Edit" msgstr "Разрешить редактирование книг" -#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 -msgid "Allow Delete books" +#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:113 +msgid "Allow Delete Books" msgstr "Разрешить удаление книг" -#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:112 +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:118 msgid "Allow Changing Password" msgstr "Разрешить смену пароля" -#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:116 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:122 msgid "Allow Editing Public Shelfs" msgstr "Разрешить редактирование публичных книжных полок" -#: cps/templates/config_view_edit.html:119 -msgid "Default visibilities for new users" +#: cps/templates/config_view_edit.html:126 +msgid "Default Visibilities for New Users" msgstr "Видимость для новых пользователей(по умолчанию)" -#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:74 -msgid "Show random books in detail view" +#: cps/templates/config_view_edit.html:142 +msgid "Show Random Books in Detail View" msgstr "Показывать случайные книги при просмотре деталей" -#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:87 -msgid "Show mature content" -msgstr "Показывать взрослый контент" +#: cps/templates/config_view_edit.html:144 +msgid "Add Allowed/Denied Tags" +msgstr "Добавить разрешенные / запрещенные теги" + +#: cps/templates/config_view_edit.html:145 +msgid "Add Allowed/Denied custom column values" +msgstr "Добавить разрешенные / запрещенные значения индивидуальных столбцов" #: cps/templates/detail.html:59 -msgid "Read in browser" -msgstr "Открыть в браузере" +msgid "Read in Browser" +msgstr "Читать" #: cps/templates/detail.html:72 -msgid "Listen in browser" -msgstr "" +msgid "Listen in Browser" +msgstr "Ждите сигнал от браузера" #: cps/templates/detail.html:117 msgid "Book" @@ -1652,21 +1700,21 @@ msgstr "Книга" msgid "of" msgstr "из" -#: cps/templates/detail.html:123 -msgid "language" -msgstr "Язык" +#: cps/templates/detail.html:165 +msgid "Published" +msgstr "Опубликованный" #: cps/templates/detail.html:200 msgid "Mark As Unread" -msgstr "" +msgstr "Отметить как непрочитанное" #: cps/templates/detail.html:200 msgid "Mark As Read" -msgstr "" +msgstr "Отметить как прочитанное" #: cps/templates/detail.html:201 msgid "Read" -msgstr "Прочитано" +msgstr "Прочесть" #: cps/templates/detail.html:211 msgid "Description:" @@ -1677,21 +1725,9 @@ msgid "Add to shelf" msgstr "Добавить на книжную полку" #: cps/templates/detail.html:286 -msgid "Edit metadata" +msgid "Edit Metadata" msgstr "Редактировать метаданные" -#: cps/templates/email_edit.html:15 -msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" -msgstr "SMTP-порт (обычно 25 для SMTP, 465 для SSL и 587 для STARTTLS)" - -#: cps/templates/email_edit.html:19 -msgid "Encryption" -msgstr "Шифрование" - -#: cps/templates/email_edit.html:21 -msgid "None" -msgstr "Нет" - #: cps/templates/email_edit.html:22 msgid "STARTTLS" msgstr "STARTTLS" @@ -1701,23 +1737,15 @@ msgid "SSL/TLS" msgstr "SSL/TLS" #: cps/templates/email_edit.html:31 -msgid "SMTP password" +msgid "SMTP Password" msgstr "Пароль SMTP" -#: cps/templates/email_edit.html:35 -msgid "From e-mail" -msgstr "Адрес отправителя" - -#: cps/templates/email_edit.html:38 -msgid "Save settings" -msgstr "Сохранить настройки" - #: cps/templates/email_edit.html:39 -msgid "Save settings and send Test E-Mail" +msgid "Save and Send Test E-mail" msgstr "Сохранить настройки и отправить тестовое письмо" #: cps/templates/email_edit.html:43 -msgid "Allowed domains for registering" +msgid "Allowed Domains (Whitelist)" msgstr "Допустимые домены для регистрации" #: cps/templates/email_edit.html:46 cps/templates/email_edit.html:72 @@ -1733,32 +1761,32 @@ msgid "Enter domainname" msgstr "Введите доменное имя" #: cps/templates/email_edit.html:60 -msgid "Denied domains for registering" -msgstr "" +msgid "Denied Domains (Blacklist)" +msgstr "Запрещенные домены (черный список)" #: cps/templates/email_edit.html:90 -msgid "Do you really want to delete this domain rule?" +msgid "Are you sure you want to delete this domain?" msgstr "Вы действительно желаете удалить это правило домена?" -#: cps/templates/feed.xml:21 cps/templates/layout.html:176 +#: cps/templates/feed.xml:21 cps/templates/layout.html:175 msgid "Next" -msgstr "Дальше" +msgstr "Далее" -#: cps/templates/http_error.html:37 -msgid "Create issue" -msgstr "" +#: cps/templates/generate_kobo_auth_url.html:5 +msgid "Open the .kobo/Kobo eReader.conf file in a text editor and add (or edit):" +msgstr "Откройте файл .kobo / Kobo eReader.conf в текстовом редакторе и добавьте (или отредактируйте):" -#: cps/templates/http_error.html:44 -msgid "Back to home" -msgstr "" +#: cps/templates/http_error.html:38 +msgid "Create Issue" +msgstr "Создать запись" -#: cps/templates/index.html:5 -msgid "Discover (Random Books)" -msgstr "Обзор (Случайные Книги)" +#: cps/templates/http_error.html:45 +msgid "Return to Home" +msgstr "Вернуться на главную" #: cps/templates/index.html:64 msgid "Group by series" -msgstr "" +msgstr "Сгрупировать по серии" #: cps/templates/index.xml:6 msgid "Start" @@ -1774,15 +1802,19 @@ msgstr "Популярные книги из этого каталога на о #: cps/templates/index.xml:31 msgid "Recently added Books" -msgstr "" +msgstr "Недавно добавленные книги" #: cps/templates/index.xml:35 msgid "The latest Books" msgstr "Последние Книги" -#: cps/templates/index.xml:42 +#: cps/templates/index.xml:38 +msgid "Random Books" +msgstr "Случайный выбор" + +#: cps/templates/index.xml:42 cps/templates/user_edit.html:80 msgid "Show Random Books" -msgstr "Показывать Случайные Сниги" +msgstr "Показывать Случайные Книги" #: cps/templates/index.xml:65 msgid "Books ordered by Author" @@ -1802,36 +1834,49 @@ msgstr "Книги, отсортированные по серии" #: cps/templates/index.xml:93 msgid "Books ordered by Languages" -msgstr "" +msgstr "Книги отсортированы по языкам" #: cps/templates/index.xml:100 -msgid "Books ordered by file formats" +msgid "Books ordered by Rating" msgstr "" -#: cps/templates/index.xml:103 cps/templates/layout.html:137 +#: cps/templates/index.xml:108 +msgid "Books ordered by file formats" +msgstr "Книги отсортированы по формату файла" + +#: cps/templates/index.xml:111 cps/templates/layout.html:136 msgid "Public Shelves" msgstr "Общие полки" -#: cps/templates/index.xml:107 +#: cps/templates/index.xml:115 msgid "Books organized in public shelfs, visible to everyone" msgstr "Книги размещены на полках, и доступны всем" -#: cps/templates/index.xml:111 cps/templates/layout.html:141 +#: cps/templates/index.xml:119 cps/templates/layout.html:140 msgid "Your Shelves" msgstr "Ваши полки" -#: cps/templates/index.xml:115 +#: cps/templates/index.xml:123 msgid "User's own shelfs, only visible to the current user himself" msgstr "Пользовательские полки, видимые только самому пользователю" #: cps/templates/layout.html:28 msgid "Home" -msgstr "" +msgstr "Главная" + +#: cps/templates/layout.html:28 cps/templates/shelf_order.html:32 +#: cps/templates/user_edit.html:178 +msgid "Back" +msgstr "Назад" #: cps/templates/layout.html:34 -msgid "Toggle navigation" +msgid "Toggle Navigation" msgstr "Включить навигацию" +#: cps/templates/layout.html:45 +msgid "Search Library" +msgstr "Поиск в библиотеке" + #: cps/templates/layout.html:55 msgid "Advanced Search" msgstr "Расширенный поиск" @@ -1843,7 +1888,7 @@ msgstr "Настройки" #: cps/templates/layout.html:78 msgid "Account" -msgstr "" +msgstr "Учетная запись" #: cps/templates/layout.html:80 msgid "Logout" @@ -1853,46 +1898,41 @@ msgstr "Выход" msgid "Register" msgstr "Зарегистрироваться" -#: cps/templates/layout.html:116 cps/templates/layout.html:223 +#: cps/templates/layout.html:116 cps/templates/layout.html:222 msgid "Uploading..." msgstr "Загружается..." #: cps/templates/layout.html:117 -msgid "please don't refresh the page" -msgstr "пожалуйста не обновляйте страницу" +msgid "Please do not refresh the page" +msgstr "Пожалуйста не обновляйте страницу" #: cps/templates/layout.html:127 msgid "Browse" msgstr "Просмотр" -#: cps/templates/layout.html:146 +#: cps/templates/layout.html:145 msgid "Create a Shelf" msgstr "Создать книжную полку" -#: cps/templates/layout.html:147 cps/templates/stats.html:3 +#: cps/templates/layout.html:146 cps/templates/stats.html:3 msgid "About" msgstr "О программе" -#: cps/templates/layout.html:161 +#: cps/templates/layout.html:160 msgid "Previous" msgstr "Предыдущий" -#: cps/templates/layout.html:188 +#: cps/templates/layout.html:187 msgid "Book Details" msgstr "Подробнее о книге" -#: cps/templates/layout.html:222 +#: cps/templates/layout.html:221 msgid "Upload done, processing, please wait..." -msgstr "" +msgstr "Загрузка завершена, обработка, пожалуйста, подождите..." -#: cps/templates/layout.html:225 +#: cps/templates/layout.html:224 msgid "Error" -msgstr "" - -#: cps/templates/login.html:8 cps/templates/login.html:9 -#: cps/templates/register.html:7 cps/templates/user_edit.html:8 -msgid "Username" -msgstr "Имя пользователя" +msgstr "Ошибка" #: cps/templates/login.html:12 cps/templates/login.html:13 #: cps/templates/user_edit.html:21 @@ -1900,27 +1940,59 @@ msgid "Password" msgstr "Пароль" #: cps/templates/login.html:17 -msgid "Remember me" +msgid "Remember Me" msgstr "Запомнить меня" #: cps/templates/login.html:22 -msgid "Forgot password" -msgstr "" +msgid "Forgot Password?" +msgstr "Забыли пароль ?" #: cps/templates/login.html:25 -msgid "Log in with magic link" +msgid "Log in with Magic Link" msgstr "Войти через магическую ссылку" -#: cps/templates/logviewer.html:5 -msgid "Show Calibre-Web log" -msgstr "" +#: cps/templates/logviewer.html:6 +msgid "Show Calibre-Web Log: " +msgstr "Показать журнал Caliber-Web:" #: cps/templates/logviewer.html:8 -msgid "Show access log" -msgstr "" +msgid "Calibre-Web Log: " +msgstr "Журнал Caliber-Web:" + +#: cps/templates/logviewer.html:8 +msgid "Stream output, can't be displayed" +msgstr "Выходной поток, не может быть отображен" + +#: cps/templates/logviewer.html:12 +msgid "Show Access Log: " +msgstr "Показать журнал доступа:" + +#: cps/templates/modal_restriction.html:6 +msgid "Select allowed/denied Tags" +msgstr "Выбрать разрешенные / запрещенные теги" + +#: cps/templates/modal_restriction.html:7 +msgid "Select allowed/denied Custom Column values" +msgstr "Выбрать разрешенные / запрещенные значения индивидуальных столбцов" + +#: cps/templates/modal_restriction.html:8 +msgid "Select allowed/denied Tags of user" +msgstr "Выбрать разрешенные / запрещенные теги пользователя" + +#: cps/templates/modal_restriction.html:9 +msgid "Select allowed/denied Custom Column values of user" +msgstr "Выбрать разрешенные / запрещенные значения индивидуальных столбцов пользователя" + +#: cps/templates/modal_restriction.html:15 +msgid "Enter Tag" +msgstr "Введите тег" + +#: cps/templates/modal_restriction.html:24 +msgid "Add View Restriction" +msgstr "Добавить ограничение просмотра" #: cps/templates/osd.xml:5 -msgid "Calibre-Web ebook catalog" +msgid "Calibre-Web eBook Catalog" msgstr "Каталог электронных книг Caliber-Web" #: cps/templates/read.html:74 @@ -2013,70 +2085,70 @@ msgstr "Вертикально" #: cps/templates/readcbr.html:152 msgid "Direction" -msgstr "" +msgstr "Направление" #: cps/templates/readcbr.html:155 msgid "Left to Right" -msgstr "" +msgstr "Слева направо" #: cps/templates/readcbr.html:156 msgid "Right to Left" -msgstr "" +msgstr "Справа налево" #: cps/templates/readpdf.html:29 msgid "PDF reader" -msgstr "" +msgstr "PDF reader" #: cps/templates/readtxt.html:6 msgid "Basic txt Reader" msgstr "Средство для чтения txt-файлов" #: cps/templates/register.html:4 -msgid "Register a new account" +msgid "Register New Account" msgstr "Зарегистрировать новую учётную запись" #: cps/templates/register.html:8 msgid "Choose a username" msgstr "Выберите имя пользователя" -#: cps/templates/register.html:11 cps/templates/user_edit.html:13 -msgid "E-mail address" -msgstr "E-mail адрес" - #: cps/templates/register.html:12 msgid "Your email address" msgstr "Ваш email-адрес" +#: cps/templates/remote_login.html:4 +msgid "Magic Link - Authorise New Device" +msgstr "Magic Link - авторизация нового устройства" + #: cps/templates/remote_login.html:6 -msgid "Use your other device, login and visit " -msgstr "" +msgid "On another device, login and visit:" +msgstr "Используйте другое устройство, войдите и посетите" -#: cps/templates/remote_login.html:9 -msgid "Once you do so, you will automatically get logged in on this device." +#: cps/templates/remote_login.html:10 +msgid "Once verified, you will automatically be logged in on this device." msgstr "После этого вы автоматически войдете в систему на этом устройстве." -#: cps/templates/remote_login.html:12 -msgid "The link will expire after 10 minutes." -msgstr "" +#: cps/templates/remote_login.html:13 +msgid "This verification link will expire in 10 minutes." +msgstr "Срок действия ссылки истекает через 10 минут" #: cps/templates/search.html:5 -msgid "No Results for:" -msgstr "Ничего не найдено по запросу:" +msgid "No Results Found" +msgstr "Результаты не найдены" #: cps/templates/search.html:6 -msgid "Please try a different search" -msgstr "Попробуйте изменить критерии поиск" +msgid "Search Term:" +msgstr "Выражение для поиска:" #: cps/templates/search.html:8 msgid "Results for:" msgstr "Результаты для:" #: cps/templates/search_form.html:19 -msgid "Publishing date from" +msgid "Published Date From" msgstr "Опубликовано от" #: cps/templates/search_form.html:26 -msgid "Publishing date to" +msgid "Published Date To" msgstr "Опубликовано до" #: cps/templates/search_form.html:43 @@ -2093,18 +2165,18 @@ msgstr "Исключить языки" #: cps/templates/search_form.html:95 msgid "Extensions" -msgstr "" +msgstr "Расширения" #: cps/templates/search_form.html:105 msgid "Exclude Extensions" -msgstr "" +msgstr "Исключить расширения" #: cps/templates/search_form.html:117 -msgid "Rating bigger than" +msgid "Rating Above" msgstr "Рейтинг больше чем" #: cps/templates/search_form.html:121 -msgid "Rating less than" +msgid "Rating Below" msgstr "Рейтинг меньше чем" #: cps/templates/shelf.html:10 @@ -2120,23 +2192,23 @@ msgid "Change order" msgstr "Изменить порядок" #: cps/templates/shelf.html:67 -msgid "Do you really want to delete the shelf?" +msgid "Are you sure you want to delete this shelf?" msgstr "Вы действительно хотите удалить эту книжную полку?" #: cps/templates/shelf.html:70 -msgid "Shelf will be lost for everybody and forever!" +msgid "Shelf will be deleted for all users" msgstr "Книжная полка будет безвозвратно удалена для всех" #: cps/templates/shelf_edit.html:13 -msgid "should the shelf be public?" -msgstr "сделать книжную полку доступной для всех?" +msgid "Share with Everyone" +msgstr "Сделать книжную полку доступной для всех?" #: cps/templates/shelf_order.html:5 -msgid "Drag 'n drop to rearrange order" +msgid "Drag to Rearrange Order" msgstr "Перетащите для изменения порядка" #: cps/templates/stats.html:7 -msgid "Calibre library statistics" +msgid "Library Statistics" msgstr "Статистика библиотеки Calibre" #: cps/templates/stats.html:12 @@ -2156,21 +2228,17 @@ msgid "Series in this Library" msgstr "Серий в этой Библиотеке" #: cps/templates/stats.html:28 -msgid "Linked libraries" -msgstr "Установленное ПО" +msgid "Linked Libraries" +msgstr "Связанные библиотеки" #: cps/templates/stats.html:32 -msgid "Program library" -msgstr "Название" +msgid "Program Library" +msgstr "Программа" #: cps/templates/stats.html:33 msgid "Installed Version" msgstr "Установленная версия" -#: cps/templates/tasks.html:7 -msgid "Tasks list" -msgstr "Список задач" - #: cps/templates/tasks.html:12 msgid "User" msgstr "Пользователь" @@ -2188,11 +2256,11 @@ msgid "Progress" msgstr "Прогресс" #: cps/templates/tasks.html:17 -msgid "Runtime" +msgid "Run Time" msgstr "Время выполнения" #: cps/templates/tasks.html:18 -msgid "Starttime" +msgid "Start Time" msgstr "Время начала" #: cps/templates/tasks.html:24 @@ -2207,1454 +2275,139 @@ msgstr "Скрыть все задачи" msgid "Reset user Password" msgstr "Сбросить пароль пользователя" -#: cps/templates/user_edit.html:26 -msgid "Kindle E-Mail" -msgstr "Адрес почты Kindle" - -#: cps/templates/user_edit.html:39 -msgid "Show books with language" +#: cps/templates/user_edit.html:41 +msgid "Language of Books" msgstr "Показать книги на языках" -#: cps/templates/user_edit.html:41 -msgid "Show all" +#: cps/templates/user_edit.html:43 +msgid "Show All" msgstr "Показать все" -#: cps/templates/user_edit.html:51 +#: cps/templates/user_edit.html:52 msgid "OAuth Settings" -msgstr "" +msgstr "Настройки OAuth" -#: cps/templates/user_edit.html:53 +#: cps/templates/user_edit.html:54 msgid "Link" -msgstr "" +msgstr "Связать" -#: cps/templates/user_edit.html:55 +#: cps/templates/user_edit.html:56 msgid "Unlink" -msgstr "" - -#: cps/templates/user_edit.html:123 -msgid "Delete this user" -msgstr "Удалить этого пользователя" - -#: cps/templates/user_edit.html:138 -msgid "Recent Downloads" -msgstr "Недавние скачивания" - -#~ msgid "Afar" -#~ msgstr "Афар" - -#~ msgid "Abkhazian" -#~ msgstr "Абхазский" - -#~ msgid "Achinese" -#~ msgstr "Ачехский" - -#~ msgid "Acoli" -#~ msgstr "Ачоли" - -#~ msgid "Adangme" -#~ msgstr "Адангме" +msgstr "Разъединить" -#~ msgid "Adyghe" -#~ msgstr "Адыгейский" +#: cps/templates/user_edit.html:62 +msgid "Kobo Sync Token" +msgstr "Kobo Sync Token" -#~ msgid "Afrihili" -#~ msgstr "Африхили" +#: cps/templates/user_edit.html:64 +msgid "Create/View" +msgstr "Создать/Просмотреть" -#~ msgid "Afrikaans" -#~ msgstr "Африкаанс" +#: cps/templates/user_edit.html:83 +msgid "Add allowed/denied Tags" +msgstr "Добавить разрешенные / запрещенные теги" -#~ msgid "Ainu (Japan)" -#~ msgstr "" +#: cps/templates/user_edit.html:84 +msgid "Add allowed/denied custom column values" +msgstr "Добавить разрешенные / запрещенные значения индивидуальных столбцов" -#~ msgid "Akan" -#~ msgstr "Акан" - -#~ msgid "Akkadian" -#~ msgstr "Аккадский" - -#~ msgid "Aleut" -#~ msgstr "Алеутский" - -#~ msgid "Altai; Southern" -#~ msgstr "" - -#~ msgid "Amharic" -#~ msgstr "Амхарский (Амаринья)" - -#~ msgid "English; Old (ca. 450-1100)" -#~ msgstr "" - -#~ msgid "Angika" -#~ msgstr "Анжика" +#: cps/templates/user_edit.html:129 +msgid "Delete User" +msgstr "Удалить этого пользователя" -#~ msgid "Arabic" -#~ msgstr "Арабский" - -#~ msgid "Aramaic; Official (700-300 BCE)" -#~ msgstr "Арамейский; Официальный" - -#~ msgid "Aragonese" -#~ msgstr "Арагонский" - -#~ msgid "Mapudungun" -#~ msgstr "" - -#~ msgid "Arapaho" -#~ msgstr "Арапахо" - -#~ msgid "Arawak" -#~ msgstr "Аравакский" - -#~ msgid "Assamese" -#~ msgstr "Ассамский" - -#~ msgid "Asturian" -#~ msgstr "Астурийский" - -#~ msgid "Avaric" -#~ msgstr "Аварский" - -#~ msgid "Avestan" -#~ msgstr "Авестийский" - -#~ msgid "Awadhi" -#~ msgstr "Авадхи" - -#~ msgid "Aymara" -#~ msgstr "Аймара" - -#~ msgid "Azerbaijani" -#~ msgstr "Азербайджанский" - -#~ msgid "Bashkir" -#~ msgstr "Башкирский" - -#~ msgid "Baluchi" -#~ msgstr "" - -#~ msgid "Bambara" -#~ msgstr "Бамбара" - -#~ msgid "Balinese" -#~ msgstr "Балийский" - -#~ msgid "Basa (Cameroon)" -#~ msgstr "Баса (Камерун)" - -#~ msgid "Beja" -#~ msgstr "Беджа" - -#~ msgid "Belarusian" -#~ msgstr "Белорусский" - -#~ msgid "Bemba (Zambia)" -#~ msgstr "Бемба (Замбия)" - -#~ msgid "Bengali" -#~ msgstr "Бенгальский" - -#~ msgid "Bhojpuri" -#~ msgstr "Бходжпури" - -#~ msgid "Bikol" -#~ msgstr "Бикольский" - -#~ msgid "Bini" -#~ msgstr "Бини" - -#~ msgid "Bislama" -#~ msgstr "Бислама" - -#~ msgid "Siksika" -#~ msgstr "Сиксика" - -#~ msgid "Tibetan" -#~ msgstr "Тибетский" - -#~ msgid "Bosnian" -#~ msgstr "Боснийский" - -#~ msgid "Braj" -#~ msgstr "Браун" - -#~ msgid "Breton" -#~ msgstr "Бретонский" - -#~ msgid "Buriat" -#~ msgstr "Бурятский" - -#~ msgid "Buginese" -#~ msgstr "Бугийский" - -#~ msgid "Bulgarian" -#~ msgstr "Болгарский" - -#~ msgid "Bilin" -#~ msgstr "" - -#~ msgid "Caddo" -#~ msgstr "Каддо" - -#~ msgid "Carib; Galibi" -#~ msgstr "" - -#~ msgid "Catalan" -#~ msgstr "Каталанский" - -#~ msgid "Cebuano" -#~ msgstr "Себуано" - -#~ msgid "Czech" -#~ msgstr "Чешский" - -#~ msgid "Chamorro" -#~ msgstr "Чаморро" - -#~ msgid "Chibcha" -#~ msgstr "Чибча" - -#~ msgid "Chechen" -#~ msgstr "Чеченский" - -#~ msgid "Chagatai" -#~ msgstr "Чагатайский" - -#~ msgid "Chuukese" -#~ msgstr "Трукский" - -#~ msgid "Mari (Russia)" -#~ msgstr "Марийский (Россия)" - -#~ msgid "Chinook jargon" -#~ msgstr "Чинук жаргон" - -#~ msgid "Choctaw" -#~ msgstr "Чоктав" - -#~ msgid "Chipewyan" -#~ msgstr "Чипевианский" - -#~ msgid "Cherokee" -#~ msgstr "Чероки" - -#~ msgid "Slavonic; Old" -#~ msgstr "" - -#~ msgid "Chuvash" -#~ msgstr "Чувашский" - -#~ msgid "Cheyenne" -#~ msgstr "Чейенн" - -#~ msgid "Coptic" -#~ msgstr "Коптский" - -#~ msgid "Cornish" -#~ msgstr "Корнский" - -#~ msgid "Corsican" -#~ msgstr "Корсиканский" - -#~ msgid "Cree" -#~ msgstr "Кри" - -#~ msgid "Turkish; Crimean" -#~ msgstr "" - -#~ msgid "Kashubian" -#~ msgstr "Кашубианский" - -#~ msgid "Welsh" -#~ msgstr "Уэльский (Валлийский)" - -#~ msgid "Dakota" -#~ msgstr "Дакота" - -#~ msgid "Danish" -#~ msgstr "Датский" - -#~ msgid "Dargwa" -#~ msgstr "Даргва" - -#~ msgid "Delaware" -#~ msgstr "Делаварский" - -#~ msgid "Slave (Athapascan)" -#~ msgstr "Атапачские языки" - -#~ msgid "German" -#~ msgstr "Немецкий" - -#~ msgid "Dogrib" -#~ msgstr "Догриб" - -#~ msgid "Dinka" -#~ msgstr "Динка" - -#~ msgid "Dhivehi" -#~ msgstr "" - -#~ msgid "Dogri (macrolanguage)" -#~ msgstr "" - -#~ msgid "Sorbian; Lower" -#~ msgstr "" - -#~ msgid "Duala" -#~ msgstr "Дуала" - -#~ msgid "Dutch; Middle (ca. 1050-1350)" -#~ msgstr "" - -#~ msgid "Dyula" -#~ msgstr "Диула (Дьюла)" - -#~ msgid "Dzongkha" -#~ msgstr "Дзонг-кэ" - -#~ msgid "Efik" -#~ msgstr "Эфик" - -#~ msgid "Egyptian (Ancient)" -#~ msgstr "Древнеегипетский" - -#~ msgid "Ekajuk" -#~ msgstr "Экаджук" - -#~ msgid "Greek; Modern (1453-)" -#~ msgstr "Новогреческий (с 1453)" - -#~ msgid "Elamite" -#~ msgstr "Эламский" - -#~ msgid "English" -#~ msgstr "Английский" - -#~ msgid "English; Middle (1100-1500)" -#~ msgstr "Среднеанглийский (1100-1500)" - -#~ msgid "Esperanto" -#~ msgstr "Эсперанто" - -#~ msgid "Estonian" -#~ msgstr "Эстонский" - -#~ msgid "Basque" -#~ msgstr "Баскский" - -#~ msgid "Ewe" -#~ msgstr "Эве" - -#~ msgid "Ewondo" -#~ msgstr "Эвондо" - -#~ msgid "Fang (Equatorial Guinea)" -#~ msgstr "" - -#~ msgid "Faroese" -#~ msgstr "Фарерский" - -#~ msgid "Persian" -#~ msgstr "Персидский" - -#~ msgid "Fanti" -#~ msgstr "Фанти" - -#~ msgid "Fijian" -#~ msgstr "Фиджийский" - -#~ msgid "Filipino" -#~ msgstr "" - -#~ msgid "Finnish" -#~ msgstr "Финский" - -#~ msgid "Fon" -#~ msgstr "Фон" - -#~ msgid "French" -#~ msgstr "Французский" - -#~ msgid "French; Middle (ca. 1400-1600)" -#~ msgstr "" - -#~ msgid "French; Old (842-ca. 1400)" -#~ msgstr "" - -#~ msgid "Frisian; Northern" -#~ msgstr "" - -#~ msgid "Frisian; Eastern" -#~ msgstr "" - -#~ msgid "Frisian; Western" -#~ msgstr "" - -#~ msgid "Fulah" -#~ msgstr "Фулах" - -#~ msgid "Friulian" -#~ msgstr "Фриулианский" - -#~ msgid "Ga" -#~ msgstr "Га" - -#~ msgid "Gayo" -#~ msgstr "Гайо" - -#~ msgid "Gbaya (Central African Republic)" -#~ msgstr "" - -#~ msgid "Geez" -#~ msgstr "Геэз" - -#~ msgid "Gilbertese" -#~ msgstr "Гильбертский" - -#~ msgid "Gaelic; Scottish" -#~ msgstr "" - -#~ msgid "Irish" -#~ msgstr "Ирландский" - -#~ msgid "Galician" -#~ msgstr "" - -#~ msgid "Manx" -#~ msgstr "Мэнкский" - -#~ msgid "German; Middle High (ca. 1050-1500)" -#~ msgstr "" - -#~ msgid "German; Old High (ca. 750-1050)" -#~ msgstr "" - -#~ msgid "Gondi" -#~ msgstr "Гонди" - -#~ msgid "Gorontalo" -#~ msgstr "Горонтало" - -#~ msgid "Gothic" -#~ msgstr "Готский" - -#~ msgid "Grebo" -#~ msgstr "Гребо" - -#~ msgid "Greek; Ancient (to 1453)" -#~ msgstr "Древнегреческий (по 1453)" - -#~ msgid "Guarani" -#~ msgstr "Гуарани" - -#~ msgid "German; Swiss" -#~ msgstr "" - -#~ msgid "Gujarati" -#~ msgstr "Гуджарати" - -#~ msgid "Gwichʼin" -#~ msgstr "" - -#~ msgid "Haida" -#~ msgstr "Хайда" - -#~ msgid "Creole; Haitian" -#~ msgstr "" - -#~ msgid "Hausa" -#~ msgstr "Хауса" - -#~ msgid "Hawaiian" -#~ msgstr "Гавайский" - -#~ msgid "Hebrew" -#~ msgstr "Иврит" - -#~ msgid "Herero" -#~ msgstr "Гереро" - -#~ msgid "Hiligaynon" -#~ msgstr "Хилигайнон" - -#~ msgid "Hindi" -#~ msgstr "Хинди" - -#~ msgid "Hittite" -#~ msgstr "Хиттит" - -#~ msgid "Hmong" -#~ msgstr "Хмонг" - -#~ msgid "Hiri Motu" -#~ msgstr "Хири Моту" - -#~ msgid "Croatian" -#~ msgstr "Хорватский" - -#~ msgid "Sorbian; Upper" -#~ msgstr "" - -#~ msgid "Hungarian" -#~ msgstr "Венгерский" - -#~ msgid "Hupa" -#~ msgstr "Хупа" - -#~ msgid "Armenian" -#~ msgstr "Армянский" - -#~ msgid "Iban" -#~ msgstr "Ибанский" - -#~ msgid "Igbo" -#~ msgstr "Игбо" - -#~ msgid "Ido" -#~ msgstr "Идо" - -#~ msgid "Yi; Sichuan" -#~ msgstr "" - -#~ msgid "Inuktitut" -#~ msgstr "Инуктитут" - -#~ msgid "Interlingue" -#~ msgstr "Интерлингве" - -#~ msgid "Iloko" -#~ msgstr "Илоко" - -#~ msgid "Interlingua (International Auxiliary Language Association)" -#~ msgstr "Интерлингва (Ассоциация международного вспомогательного языка)" - -#~ msgid "Indonesian" -#~ msgstr "Индонезийский" - -#~ msgid "Ingush" -#~ msgstr "Ингушский" - -#~ msgid "Inupiaq" -#~ msgstr "Инулиак" - -#~ msgid "Icelandic" -#~ msgstr "Исландский" - -#~ msgid "Italian" -#~ msgstr "Итальянский" - -#~ msgid "Javanese" -#~ msgstr "Яванский" - -#~ msgid "Lojban" -#~ msgstr "Лоджбан" - -#~ msgid "Japanese" -#~ msgstr "Японский" - -#~ msgid "Judeo-Persian" -#~ msgstr "Еврейско-персидский" - -#~ msgid "Judeo-Arabic" -#~ msgstr "Еврейско-арабский" - -#~ msgid "Kara-Kalpak" -#~ msgstr "Каракалпакский" - -#~ msgid "Kabyle" -#~ msgstr "Кабильский" - -#~ msgid "Kachin" -#~ msgstr "Качинский" - -#~ msgid "Kalaallisut" -#~ msgstr "" - -#~ msgid "Kamba (Kenya)" -#~ msgstr "" - -#~ msgid "Kannada" -#~ msgstr "Каннада" - -#~ msgid "Kashmiri" -#~ msgstr "Кашмири" - -#~ msgid "Georgian" -#~ msgstr "Грузинский" - -#~ msgid "Kanuri" -#~ msgstr "Канури" - -#~ msgid "Kawi" -#~ msgstr "Кави" - -#~ msgid "Kazakh" -#~ msgstr "Казахский" - -#~ msgid "Kabardian" -#~ msgstr "Кабардинский" - -#~ msgid "Khasi" -#~ msgstr "Кхаси" - -#~ msgid "Khmer; Central" -#~ msgstr "" - -#~ msgid "Khotanese" -#~ msgstr "Хотанский" - -#~ msgid "Kikuyu" -#~ msgstr "Кикуйю" - -#~ msgid "Kinyarwanda" -#~ msgstr "Киньяруанда" - -#~ msgid "Kirghiz" -#~ msgstr "Киргизский" - -#~ msgid "Kimbundu" -#~ msgstr "Кимбунду" - -#~ msgid "Konkani (macrolanguage)" -#~ msgstr "" - -#~ msgid "Komi" -#~ msgstr "Коми" - -#~ msgid "Kongo" -#~ msgstr "Конго" - -#~ msgid "Korean" -#~ msgstr "Корейский" - -#~ msgid "Kosraean" -#~ msgstr "Косраинский" - -#~ msgid "Kpelle" -#~ msgstr "Кпелле" - -#~ msgid "Karachay-Balkar" -#~ msgstr "Карачаево-балкарский" - -#~ msgid "Karelian" -#~ msgstr "Карельский" - -#~ msgid "Kurukh" -#~ msgstr "Курух" - -#~ msgid "Kuanyama" -#~ msgstr "Киньяма" - -#~ msgid "Kumyk" -#~ msgstr "Кумыкский" - -#~ msgid "Kurdish" -#~ msgstr "Курдский" - -#~ msgid "Kutenai" -#~ msgstr "Кутенаи" - -#~ msgid "Ladino" -#~ msgstr "Ладино" - -#~ msgid "Lahnda" -#~ msgstr "Лахнда" - -#~ msgid "Lamba" -#~ msgstr "Ламба" - -#~ msgid "Lao" -#~ msgstr "Лаосский" - -#~ msgid "Latin" -#~ msgstr "Латинский" - -#~ msgid "Latvian" -#~ msgstr "Латвийский" - -#~ msgid "Lezghian" -#~ msgstr "Лезгинский" - -#~ msgid "Limburgan" -#~ msgstr "" - -#~ msgid "Lingala" -#~ msgstr "Лингала" - -#~ msgid "Lithuanian" -#~ msgstr "Литовский" - -#~ msgid "Mongo" -#~ msgstr "Монго" - -#~ msgid "Lozi" -#~ msgstr "Лози" - -#~ msgid "Luxembourgish" -#~ msgstr "" - -#~ msgid "Luba-Lulua" -#~ msgstr "Луба-Лулуа" - -#~ msgid "Luba-Katanga" -#~ msgstr "Луба-Катанга" - -#~ msgid "Ganda" -#~ msgstr "Ганда" - -#~ msgid "Luiseno" -#~ msgstr "Луисеньо" - -#~ msgid "Lunda" -#~ msgstr "Лунда" - -#~ msgid "Luo (Kenya and Tanzania)" -#~ msgstr "Луо (Кения и Танзания)" - -#~ msgid "Lushai" -#~ msgstr "Лушай" - -#~ msgid "Madurese" -#~ msgstr "Мадурский" - -#~ msgid "Magahi" -#~ msgstr "Магахи" - -#~ msgid "Marshallese" -#~ msgstr "" - -#~ msgid "Maithili" -#~ msgstr "Майтхили" - -#~ msgid "Makasar" -#~ msgstr "Макассарский" - -#~ msgid "Malayalam" -#~ msgstr "Малаялам" - -#~ msgid "Mandingo" -#~ msgstr "Мандинго" - -#~ msgid "Marathi" -#~ msgstr "Маратхи" - -#~ msgid "Masai" -#~ msgstr "Масаи" - -#~ msgid "Moksha" -#~ msgstr "Мокшанский" - -#~ msgid "Mandar" -#~ msgstr "Мандарский" - -#~ msgid "Mende (Sierra Leone)" -#~ msgstr "" - -#~ msgid "Irish; Middle (900-1200)" -#~ msgstr "Среднеирландский (900-1200)" - -#~ msgid "Mi'kmaq" -#~ msgstr "" - -#~ msgid "Minangkabau" -#~ msgstr "Минангкабау" - -#~ msgid "Uncoded languages" -#~ msgstr "" - -#~ msgid "Macedonian" -#~ msgstr "Македонский" - -#~ msgid "Malagasy" -#~ msgstr "Малагаси" - -#~ msgid "Maltese" -#~ msgstr "Мальтийский" - -#~ msgid "Manchu" -#~ msgstr "Манчу" - -#~ msgid "Manipuri" -#~ msgstr "Манипури" - -#~ msgid "Mohawk" -#~ msgstr "Мохаук" - -#~ msgid "Mongolian" -#~ msgstr "Монгольский" - -#~ msgid "Mossi" -#~ msgstr "Моей" - -#~ msgid "Maori" -#~ msgstr "Маори" - -#~ msgid "Malay (macrolanguage)" -#~ msgstr "" - -#~ msgid "Multiple languages" -#~ msgstr "Разных семей языки" - -#~ msgid "Creek" -#~ msgstr "Крик" - -#~ msgid "Mirandese" -#~ msgstr "Мирандские" - -#~ msgid "Marwari" -#~ msgstr "Марвари" - -#~ msgid "Burmese" -#~ msgstr "Бирманский" - -#~ msgid "Erzya" -#~ msgstr "Эрзянский" - -#~ msgid "Neapolitan" -#~ msgstr "Неаполитанский" - -#~ msgid "Nauru" -#~ msgstr "Науру" - -#~ msgid "Navajo" -#~ msgstr "" - -#~ msgid "Ndebele; South" -#~ msgstr "Ндебеле южный" - -#~ msgid "Ndebele; North" -#~ msgstr "Ндебеле северный" - -#~ msgid "Ndonga" -#~ msgstr "Ндунга" - -#~ msgid "German; Low" -#~ msgstr "" - -#~ msgid "Nepali" -#~ msgstr "Непальский" - -#~ msgid "Bhasa; Nepal" -#~ msgstr "" - -#~ msgid "Nias" -#~ msgstr "Ниас" - -#~ msgid "Niuean" -#~ msgstr "Ниуэ" - -#~ msgid "Dutch" -#~ msgstr "Нидерландский" - -#~ msgid "Norwegian Nynorsk" -#~ msgstr "Норвежский Нюнорск" - -#~ msgid "Norwegian Bokmål" -#~ msgstr "" - -#~ msgid "Nogai" -#~ msgstr "Ногайский" - -#~ msgid "Norse; Old" -#~ msgstr "Старонорвежский" - -#~ msgid "Norwegian" -#~ msgstr "Норвежский" - -#~ msgid "N'Ko" -#~ msgstr "Н'ко" - -#~ msgid "Sotho; Northern" -#~ msgstr "" - -#~ msgid "Newari; Old" -#~ msgstr "" - -#~ msgid "Nyanja" -#~ msgstr "" - -#~ msgid "Nyamwezi" -#~ msgstr "Ньямвези" - -#~ msgid "Nyankole" -#~ msgstr "Ньянколе" - -#~ msgid "Nyoro" -#~ msgstr "Ньоро" - -#~ msgid "Nzima" -#~ msgstr "Нзима" - -#~ msgid "Occitan (post 1500)" -#~ msgstr "" - -#~ msgid "Ojibwa" -#~ msgstr "Оджибва" - -#~ msgid "Oriya" -#~ msgstr "Ория" - -#~ msgid "Oromo" -#~ msgstr "Оромо" - -#~ msgid "Osage" -#~ msgstr "Оседжи" - -#~ msgid "Ossetian" -#~ msgstr "" - -#~ msgid "Turkish; Ottoman (1500-1928)" -#~ msgstr "Турецкий; Отомангский (1500-1928)" - -#~ msgid "Pangasinan" -#~ msgstr "Пангасинан" - -#~ msgid "Pahlavi" -#~ msgstr "Пехлевийский" - -#~ msgid "Pampanga" -#~ msgstr "Пампанга" - -#~ msgid "Panjabi" -#~ msgstr "" - -#~ msgid "Papiamento" -#~ msgstr "Папьяменто" - -#~ msgid "Palauan" -#~ msgstr "Палау" - -#~ msgid "Persian; Old (ca. 600-400 B.C.)" -#~ msgstr "" - -#~ msgid "Phoenician" -#~ msgstr "Финикийский" - -#~ msgid "Pali" -#~ msgstr "Пали" - -#~ msgid "Polish" -#~ msgstr "Польский" - -#~ msgid "Pohnpeian" -#~ msgstr "Фонпейский" - -#~ msgid "Portuguese" -#~ msgstr "Португальский" - -#~ msgid "Provençal; Old (to 1500)" -#~ msgstr "Старопровансальский (по 1500)" - -#~ msgid "Pushto" -#~ msgstr "Пушту" - -#~ msgid "Quechua" -#~ msgstr "Кечуа" - -#~ msgid "Rajasthani" -#~ msgstr "Раджастхани" - -#~ msgid "Rapanui" -#~ msgstr "Рапаню" - -#~ msgid "Maori; Cook Islands" -#~ msgstr "" - -#~ msgid "Romansh" -#~ msgstr "" - -#~ msgid "Romany" -#~ msgstr "Цыганский" - -#~ msgid "Romanian" -#~ msgstr "Румынский" - -#~ msgid "Rundi" -#~ msgstr "Рунди" - -#~ msgid "Romanian; Macedo-" -#~ msgstr "" - -#~ msgid "Russian" -#~ msgstr "Русский" - -#~ msgid "Sandawe" -#~ msgstr "Сандаве" - -#~ msgid "Sango" -#~ msgstr "Санго" - -#~ msgid "Yakut" -#~ msgstr "Якутский" - -#~ msgid "Aramaic; Samaritan" -#~ msgstr "" - -#~ msgid "Sanskrit" -#~ msgstr "Санскрит" - -#~ msgid "Sasak" -#~ msgstr "Сасакский" - -#~ msgid "Santali" -#~ msgstr "Сантали" - -#~ msgid "Sicilian" -#~ msgstr "Сицилийский" - -#~ msgid "Scots" -#~ msgstr "Шотландский" - -#~ msgid "Selkup" -#~ msgstr "Селкапский" - -#~ msgid "Irish; Old (to 900)" -#~ msgstr "Староирландский (по 900)" - -#~ msgid "Shan" -#~ msgstr "Шанский" - -#~ msgid "Sidamo" -#~ msgstr "Сидама" - -#~ msgid "Sinhala" -#~ msgstr "Сингальский" - -#~ msgid "Slovak" -#~ msgstr "Словацкий" - -#~ msgid "Slovenian" -#~ msgstr "Словенский" - -#~ msgid "Sami; Southern" -#~ msgstr "" - -#~ msgid "Sami; Northern" -#~ msgstr "" - -#~ msgid "Lule Sami" -#~ msgstr "Люле-саамский" - -#~ msgid "Sami; Inari" -#~ msgstr "" - -#~ msgid "Samoan" -#~ msgstr "Самоанский" - -#~ msgid "Sami; Skolt" -#~ msgstr "" - -#~ msgid "Shona" -#~ msgstr "Шона" - -#~ msgid "Sindhi" -#~ msgstr "Синдхи" - -#~ msgid "Soninke" -#~ msgstr "Сонинк" - -#~ msgid "Sogdian" -#~ msgstr "Согдийский" - -#~ msgid "Somali" -#~ msgstr "Сомали" - -#~ msgid "Sotho; Southern" -#~ msgstr "Сото Южный" - -#~ msgid "Spanish" -#~ msgstr "Испанский" - -#~ msgid "Albanian" -#~ msgstr "Албанский" - -#~ msgid "Sardinian" -#~ msgstr "Сардинский" - -#~ msgid "Sranan Tongo" -#~ msgstr "" - -#~ msgid "Serbian" -#~ msgstr "Сербский" - -#~ msgid "Serer" -#~ msgstr "Серер" - -#~ msgid "Swati" -#~ msgstr "Свати" - -#~ msgid "Sukuma" -#~ msgstr "Сукума" - -#~ msgid "Sundanese" -#~ msgstr "Сунданский" - -#~ msgid "Susu" -#~ msgstr "Сусу" - -#~ msgid "Sumerian" -#~ msgstr "Шумерский" - -#~ msgid "Swahili (macrolanguage)" -#~ msgstr "" - -#~ msgid "Swedish" -#~ msgstr "Шведский" - -#~ msgid "Syriac; Classical" -#~ msgstr "" - -#~ msgid "Syriac" -#~ msgstr "Сирийский" - -#~ msgid "Tahitian" -#~ msgstr "Таитянский" - -#~ msgid "Tamil" -#~ msgstr "Тамильский" - -#~ msgid "Tatar" -#~ msgstr "Татарский" - -#~ msgid "Telugu" -#~ msgstr "Телугу" - -#~ msgid "Timne" -#~ msgstr "Темне" - -#~ msgid "Tereno" -#~ msgstr "Терено" - -#~ msgid "Tetum" -#~ msgstr "Тетумский" - -#~ msgid "Tajik" -#~ msgstr "Таджикский" - -#~ msgid "Tagalog" -#~ msgstr "Тагалог" - -#~ msgid "Thai" -#~ msgstr "Таи" - -#~ msgid "Tigre" -#~ msgstr "Тигре" - -#~ msgid "Tigrinya" -#~ msgstr "Тигринья" - -#~ msgid "Tiv" -#~ msgstr "Тив" - -#~ msgid "Tokelau" -#~ msgstr "Токелау" - -#~ msgid "Klingon" -#~ msgstr "" - -#~ msgid "Tlingit" -#~ msgstr "Тлингит" - -#~ msgid "Tamashek" -#~ msgstr "Тамашек" - -#~ msgid "Tonga (Nyasa)" -#~ msgstr "Тонга (Ньяса)" - -#~ msgid "Tonga (Tonga Islands)" -#~ msgstr "Тонга (острова Тонга)" - -#~ msgid "Tok Pisin" -#~ msgstr "Ток Писин" - -#~ msgid "Tsimshian" -#~ msgstr "Цимшиан" - -#~ msgid "Tswana" -#~ msgstr "Тсвана" - -#~ msgid "Tsonga" -#~ msgstr "Тсонга" - -#~ msgid "Turkmen" -#~ msgstr "Туркменский" - -#~ msgid "Tumbuka" -#~ msgstr "Тумбука" - -#~ msgid "Turkish" -#~ msgstr "Турецкий" - -#~ msgid "Tuvalu" -#~ msgstr "Тувалу" - -#~ msgid "Twi" -#~ msgstr "Тви" - -#~ msgid "Tuvinian" -#~ msgstr "Тувинский" - -#~ msgid "Udmurt" -#~ msgstr "Удмуртский" - -#~ msgid "Ugaritic" -#~ msgstr "Угаритский" - -#~ msgid "Uighur" -#~ msgstr "Уйгурский" - -#~ msgid "Ukrainian" -#~ msgstr "Украинский" - -#~ msgid "Umbundu" -#~ msgstr "Умбунду" - -#~ msgid "Undetermined" -#~ msgstr "Неидентифицированный" - -#~ msgid "Urdu" -#~ msgstr "Урду" - -#~ msgid "Uzbek" -#~ msgstr "Узбекский" - -#~ msgid "Vai" -#~ msgstr "Ваи" - -#~ msgid "Venda" -#~ msgstr "Венда" - -#~ msgid "Vietnamese" -#~ msgstr "Вьетнамский" - -#~ msgid "Volapük" -#~ msgstr "Волапюк" - -#~ msgid "Votic" -#~ msgstr "Вотик" - -#~ msgid "Wolaytta" -#~ msgstr "" - -#~ msgid "Waray (Philippines)" -#~ msgstr "" - -#~ msgid "Washo" -#~ msgstr "Вашо" - -#~ msgid "Walloon" -#~ msgstr "Валлун" - -#~ msgid "Wolof" -#~ msgstr "Волоф" - -#~ msgid "Kalmyk" -#~ msgstr "" - -#~ msgid "Xhosa" -#~ msgstr "Коса" - -#~ msgid "Yao" -#~ msgstr "Яо" - -#~ msgid "Yapese" -#~ msgstr "Яапийский" - -#~ msgid "Yiddish" -#~ msgstr "Идиш" - -#~ msgid "Yoruba" -#~ msgstr "Йоруба" - -#~ msgid "Zapotec" -#~ msgstr "Сапотекский" - -#~ msgid "Blissymbols" -#~ msgstr "" - -#~ msgid "Zenaga" -#~ msgstr "Зенагский" - -#~ msgid "Zhuang" -#~ msgstr "Чжуанский" - -#~ msgid "Chinese" -#~ msgstr "Китайский" - -#~ msgid "Zulu" -#~ msgstr "Зулусский" - -#~ msgid "Zuni" -#~ msgstr "Зуньи" - -#~ msgid "No linguistic content" -#~ msgstr "Нет языкового содержимого" - -#~ msgid "Zaza" -#~ msgstr "Зазаки" - -#~ msgid "Failed to create path for cover %(path)s (Permission denied)." -#~ msgstr "" - -#~ msgid "Failed to store cover-file %(cover)s." -#~ msgstr "" - -#~ msgid "Cover-file is not a valid image file" -#~ msgstr "" - -#~ msgid "Cover is not a jpg file, can't save" -#~ msgstr "Обложка не jpg файл, невозможно сохранить" - -#~ msgid "Preparing document for printing..." -#~ msgstr "" - -#~ msgid "Using your another device, visit" -#~ msgstr "Используйте другое устройство, посетите" - -#~ msgid "and log in" -#~ msgstr "и войти" - -#~ msgid "Using your another device, login and visit " -#~ msgstr "" - -#~ msgid "Newest Books" -#~ msgstr "Новые Книги" - -#~ msgid "Oldest Books" -#~ msgstr "Старые Книги" - -#~ msgid "Books (A-Z)" -#~ msgstr "Книги (А-Я)" - -#~ msgid "Books (Z-A)" -#~ msgstr "Книги (Я-А)" - -#~ msgid "Error opening eBook. Fileformat is not supported." -#~ msgstr "" - -#~ msgid "File %(title)s" -#~ msgstr "" - -#~ msgid "Show sorted books" -#~ msgstr "Показывать отсортированные книги" - -#~ msgid "Sorted Books" -#~ msgstr "Сортировка Книг" - -#~ msgid "Sort By" -#~ msgstr "Отсортировано по" - -#~ msgid "Newest" -#~ msgstr "Новинки" - -#~ msgid "Oldest" -#~ msgstr "Старое" - -#~ msgid "Ascending" -#~ msgstr "По возрастанию" - -#~ msgid "Descending" -#~ 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 "" +#: cps/templates/user_edit.html:144 +msgid "Recent Downloads" +msgstr "Последние загрузки" -#~ msgid "Register with %s, " -#~ msgstr "" +#: cps/templates/user_edit.html:160 +msgid "Generate Kobo Auth URL" +msgstr "Создать Kobo Auth URL" -#~ msgid "Import of optional Google Drive requirements missing" -#~ msgstr "Импорт дополнительных требований к Google Диску отсутствует" +#: cps/templates/user_edit.html:176 +msgid "Do you really want to delete the Kobo Token?" +msgstr "Вы действительно хотите удалить Kobo Token ?" -#~ msgid "client_secrets.json is missing or not readable" -#~ msgstr "client_secrets.json отсутствует или его невозможно прочесть" +#~ msgid "Best rated books" +#~ msgstr "Книги с наивысшим рейтингом" -#~ msgid "client_secrets.json is not configured for web application" -#~ msgstr "client_secrets.json не настроен для веб-приложения" +#~ msgid "Publisher list" +#~ msgstr "Список издателей" -#~ msgid "Keyfile location is not valid, please enter correct path" -#~ msgstr "Неверное расположение файла-ключа, введите правильный путь" +#~ msgid "Series list" +#~ msgstr "Серии" -#~ msgid "Certfile location is not valid, please enter correct path" -#~ msgstr "Неверное расположение сертификата, введите правильный путь" +#~ msgid "Available languages" +#~ msgstr "Доступные языки" -#~ msgid "Please enter a LDAP provider, port, DN and user object identifier" -#~ msgstr "" +#~ msgid "Category list" +#~ msgstr "Категории" -#~ msgid "Please enter a LDAP service account and password" -#~ msgstr "" +#~ msgid "Reverse proxy login" +#~ msgstr "Логин обратного прокси" -#~ msgid "Please enter Github oauth credentials" -#~ msgstr "" +#~ msgid "Series id" +#~ msgstr "Серия" -#~ msgid "Please enter Google oauth credentials" -#~ msgstr "" +#~ msgid "Go!" +#~ msgstr "Старт!" -#~ msgid "Logfile location is not valid, please enter correct path" -#~ msgstr "Неверное расположение лог-файла, введите правильный путь" +#~ msgid "No. of random books to show" +#~ msgstr "Количество отображаемых случайных книг" -#~ msgid "Access Logfile location is not valid, please enter correct path" -#~ msgstr "" +#~ msgid "Tags for Mature Content" +#~ msgstr "Теги для Взрослого Контента" -#~ msgid "DB location is not valid, please enter correct path" -#~ msgstr "Неверное расположение базы данных, введите правильный путь" +#~ msgid "Default settings for new users" +#~ msgstr "Настройки по умолчанию для новых пользователей" -#~ msgid "Excecution permissions missing" -#~ msgstr "Отсутствуют разрешения на выполнение" +#~ msgid "Allow Delete books" +#~ msgstr "Разрешить удаление книг" -#~ msgid "not configured" -#~ msgstr "не настроен" +#~ msgid "Show mature content" +#~ msgstr "Показывать взрослый контент" -#~ msgid "Error excecuting UnRar" -#~ msgstr "Ошибка извлечения UnRar" +#~ msgid "language" +#~ msgstr "Язык" -#~ msgid "Unrar binary file not found" -#~ msgstr "Unrar двочиный файл не найден" +#~ msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" +#~ msgstr "SMTP-порт (обычно 25 для SMTP, 465 для SSL и 587 для STARTTLS)" -#~ msgid "Use GitHub OAuth" -#~ msgstr "" +#~ msgid "From e-mail" +#~ msgstr "Адрес отправителя" -#~ msgid "Use Google OAuth" -#~ msgstr "" +#~ msgid "Save settings" +#~ msgstr "Сохранить настройки" -#~ msgid "Obtain GitHub OAuth Credential" -#~ msgstr "" +#~ msgid "Denied domains for registering" +#~ msgstr "Запрещённые домены для регистрации" -#~ msgid "GitHub OAuth Client Id" -#~ msgstr "" +#~ msgid "please don't refresh the page" +#~ msgstr "пожалуйста не обновляйте страницу" -#~ msgid "GitHub OAuth Client Secret" -#~ msgstr "" +#~ msgid "Forgot password" +#~ msgstr "Забыл пароль" -#~ msgid "Obtain Google OAuth Credential" -#~ msgstr "" +#~ msgid "Show Calibre-Web log: " +#~ msgstr "Показать журнал Caliber-Web:" -#~ msgid "Google OAuth Client Id" -#~ msgstr "" +#~ msgid "Calibre-Web log: " +#~ msgstr "Журнал Caliber-Web:" -#~ msgid "Google OAuth Client Secret" -#~ msgstr "" +#~ msgid "E-mail address" +#~ msgstr "E-mail адрес" -#~ msgid "Use" -#~ msgstr "Использовать" +#~ msgid "No Results for:" +#~ msgstr "Ничего не найдено по запросу:" -#~ msgid "Play / pause" -#~ msgstr "" +#~ msgid "Please try a different search" +#~ msgstr "Попробуйте изменить критерии поиска" -#~ msgid "volume" -#~ msgstr "" +#~ msgid "Tasks list" +#~ msgstr "Список задач" -#~ msgid "unknown" -#~ msgstr "неизвестно" +#~ msgid "Kindle E-Mail" +#~ msgstr "Адрес почты Kindle" -#~ msgid "New Books" -#~ msgstr "Новые Книги" +#~ msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" +#~ msgstr "Обложка не содержит поддерживаемый формат изображения (JPG / PNG / WebP), невозможно сохранить" diff --git a/cps/translations/sv/LC_MESSAGES/messages.mo b/cps/translations/sv/LC_MESSAGES/messages.mo index 589c9684..d46bdd60 100644 Binary files a/cps/translations/sv/LC_MESSAGES/messages.mo and b/cps/translations/sv/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/sv/LC_MESSAGES/messages.po b/cps/translations/sv/LC_MESSAGES/messages.po index 5ac5a0fc..4e3d7ece 100644 --- a/cps/translations/sv/LC_MESSAGES/messages.po +++ b/cps/translations/sv/LC_MESSAGES/messages.po @@ -5,19 +5,18 @@ # FIRST AUTHOR OzzieIsaacs, 2016. msgid "" msgstr "" -"Project-Id-Version: Calibre-Web\n" +"Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2020-01-12 13:57+0100\n" +"POT-Creation-Date: 2020-03-12 20:31+0100\n" "PO-Revision-Date: 2020-01-18 11:22+0100\n" "Last-Translator: Jonatan Nyberg \n" "Language: sv\n" "Language-Team: \n" -"Plural-Forms: nplurals=2; plural=(n != 1);\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.7.0\n" -"X-Generator: Poedit 2.2.4\n" +"Generated-By: Babel 2.8.0\n" #: cps/about.py:42 msgid "installed" @@ -27,7 +26,7 @@ msgstr "installerad" msgid "not installed" msgstr "inte installerad" -#: cps/about.py:84 +#: cps/about.py:87 msgid "Statistics" msgstr "Statistik" @@ -41,7 +40,7 @@ msgstr "Stänger servern, vänligen stäng fönstret" #: cps/admin.py:110 cps/editbooks.py:410 cps/editbooks.py:419 #: cps/editbooks.py:539 cps/editbooks.py:541 cps/editbooks.py:594 -#: cps/updater.py:446 cps/uploader.py:97 cps/uploader.py:108 +#: cps/updater.py:456 cps/uploader.py:96 cps/uploader.py:107 msgid "Unknown" msgstr "Okänd" @@ -49,155 +48,164 @@ msgstr "Okänd" msgid "Admin page" msgstr "Administrationssida" -#: cps/admin.py:148 cps/templates/admin.html:115 +#: cps/admin.py:151 msgid "UI Configuration" msgstr "Användargränssnitt konfiguration" -#: cps/admin.py:185 cps/admin.py:412 +#: cps/admin.py:187 cps/admin.py:637 msgid "Calibre-Web configuration updated" msgstr "Calibre-Web konfiguration uppdaterad" -#: cps/admin.py:442 cps/templates/admin.html:114 +#: cps/admin.py:434 cps/admin.py:440 cps/admin.py:451 cps/admin.py:462 +#: cps/templates/modal_restriction.html:29 +msgid "Deny" +msgstr "" + +#: cps/admin.py:436 cps/admin.py:442 cps/admin.py:453 cps/admin.py:464 +#: cps/templates/modal_restriction.html:28 +msgid "Allow" +msgstr "" + +#: cps/admin.py:667 msgid "Basic Configuration" msgstr "Grundläggande konfiguration" -#: cps/admin.py:465 cps/web.py:1093 +#: cps/admin.py:691 cps/web.py:1089 msgid "Please fill out all fields!" msgstr "Fyll i alla fält!" -#: cps/admin.py:467 cps/admin.py:478 cps/admin.py:484 cps/admin.py:499 -#: cps/templates/admin.html:38 +#: cps/admin.py:694 cps/admin.py:706 cps/admin.py:712 cps/admin.py:730 msgid "Add new user" msgstr "Lägg till ny användare" -#: cps/admin.py:476 cps/web.py:1318 +#: cps/admin.py:703 cps/web.py:1318 msgid "E-mail is not from valid domain" msgstr "E-posten är inte från giltig domän" -#: cps/admin.py:482 cps/admin.py:493 +#: cps/admin.py:710 cps/admin.py:725 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:489 +#: cps/admin.py:721 #, python-format msgid "User '%(user)s' created" msgstr "Användaren '%(user)s' skapad" -#: cps/admin.py:509 +#: cps/admin.py:740 msgid "Edit e-mail server settings" msgstr "Redigera inställningar för e-postserver" -#: cps/admin.py:535 +#: cps/admin.py:766 #, python-format msgid "Test e-mail successfully send to %(kindlemail)s" msgstr "Test-e-post skicka till %(kindlemail)s" -#: cps/admin.py:538 +#: cps/admin.py:769 #, 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:540 +#: cps/admin.py:771 msgid "Please configure your e-mail address first..." msgstr "Vänligen konfigurera din e-postadress först..." -#: cps/admin.py:542 +#: cps/admin.py:773 msgid "E-mail server settings updated" msgstr "E-postserverinställningar uppdaterade" -#: cps/admin.py:571 +#: cps/admin.py:803 #, python-format msgid "User '%(nick)s' deleted" msgstr "Användaren '%(nick)s' borttagen" -#: cps/admin.py:574 +#: cps/admin.py:806 msgid "No admin user remaining, can't delete user" msgstr "Ingen adminstratörsanvändare kvar, kan inte ta bort användaren" -#: cps/admin.py:612 cps/web.py:1359 +#: cps/admin.py:842 cps/web.py:1361 msgid "Found an existing account for this e-mail address." msgstr "Hittade ett befintligt konto för den här e-postadressen." -#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1334 +#: cps/admin.py:852 cps/admin.py:867 cps/admin.py:887 cps/web.py:1336 #, python-format msgid "Edit User %(nick)s" msgstr "Redigera användaren %(nick)s" -#: cps/admin.py:622 cps/web.py:1327 +#: cps/admin.py:858 cps/web.py:1328 msgid "This username is already taken" msgstr "Detta användarnamn är redan taget" -#: cps/admin.py:637 +#: cps/admin.py:874 #, python-format msgid "User '%(nick)s' updated" msgstr "Användaren '%(nick)s' uppdaterad" -#: cps/admin.py:640 +#: cps/admin.py:877 msgid "An unknown error occured." msgstr "Ett okänt fel uppstod." -#: cps/admin.py:657 +#: cps/admin.py:900 #, python-format msgid "Password for user %(user)s reset" msgstr "Lösenord för användaren %(user)s återställd" -#: cps/admin.py:660 cps/web.py:1118 cps/web.py:1174 +#: cps/admin.py:903 cps/web.py:1114 cps/web.py:1170 msgid "An unknown error occurred. Please try again later." msgstr "Ett okänt fel uppstod. Försök igen senare." -#: cps/admin.py:663 cps/web.py:1062 +#: cps/admin.py:906 cps/web.py:1055 msgid "Please configure the SMTP mail settings first..." msgstr "Konfigurera SMTP-postinställningarna först..." -#: cps/admin.py:674 +#: cps/admin.py:918 msgid "Logfile viewer" msgstr "Visaren för loggfil" -#: cps/admin.py:710 +#: cps/admin.py:957 msgid "Requesting update package" msgstr "Begär uppdateringspaketet" -#: cps/admin.py:711 +#: cps/admin.py:958 msgid "Downloading update package" msgstr "Hämtar uppdateringspaketet" -#: cps/admin.py:712 +#: cps/admin.py:959 msgid "Unzipping update package" msgstr "Packar upp uppdateringspaketet" -#: cps/admin.py:713 +#: cps/admin.py:960 msgid "Replacing files" msgstr "Ersätta filer" -#: cps/admin.py:714 +#: cps/admin.py:961 msgid "Database connections are closed" msgstr "Databasanslutningarna är stängda" -#: cps/admin.py:715 +#: cps/admin.py:962 msgid "Stopping server" msgstr "Stoppar server" -#: cps/admin.py:716 +#: cps/admin.py:963 msgid "Update finished, please press okay and reload page" msgstr "Uppdatering klar, tryck på okej och uppdatera sidan" -#: cps/admin.py:717 cps/admin.py:718 cps/admin.py:719 cps/admin.py:720 +#: cps/admin.py:964 cps/admin.py:965 cps/admin.py:966 cps/admin.py:967 msgid "Update failed:" msgstr "Uppdateringen misslyckades:" -#: cps/admin.py:717 cps/updater.py:272 cps/updater.py:457 cps/updater.py:459 +#: cps/admin.py:964 cps/updater.py:282 cps/updater.py:467 cps/updater.py:469 msgid "HTTP Error" msgstr "HTTP-fel" -#: cps/admin.py:718 cps/updater.py:274 cps/updater.py:461 +#: cps/admin.py:965 cps/updater.py:284 cps/updater.py:471 msgid "Connection error" msgstr "Anslutningsfel" -#: cps/admin.py:719 cps/updater.py:276 cps/updater.py:463 +#: cps/admin.py:966 cps/updater.py:286 cps/updater.py:473 msgid "Timeout while establishing connection" msgstr "Tiden ute när du etablerade anslutning" -#: cps/admin.py:720 cps/updater.py:278 cps/updater.py:465 +#: cps/admin.py:967 cps/updater.py:288 cps/updater.py:475 msgid "General error" msgstr "Allmänt fel" @@ -237,10 +245,6 @@ msgstr "Det gick inte att lagra filen %(file)s." msgid "File format %(ext)s added to %(book)s" msgstr "Filformatet %(ext)s lades till %(book)s" -#: cps/editbooks.py:376 -msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" -msgstr "Omslaget är inte ett bildformat som stöds (jpg/png/webp), kan inte spara" - #: cps/editbooks.py:451 msgid "Cover is not a jpg file, can't save" msgstr "Omslaget är inte en jpg-fil, kan inte spara" @@ -277,30 +281,30 @@ msgstr "Det gick inte att lagra filen %(file)s (behörighet nekad)." 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:710 +#: cps/editbooks.py:709 #, python-format msgid "File %(file)s uploaded" msgstr "Filen %(file)s uppladdad" -#: cps/editbooks.py:739 +#: cps/editbooks.py:738 msgid "Source or destination format for conversion missing" msgstr "Källa eller målformat för konvertering saknas" -#: cps/editbooks.py:747 +#: cps/editbooks.py:746 #, 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:751 +#: cps/editbooks.py:750 #, 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:62 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgstr "Installationen av Google Drive är inte klar, försök att inaktivera och aktivera Google Drive igen" -#: cps/gdrive.py:104 +#: cps/gdrive.py:103 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" @@ -390,83 +394,111 @@ msgstr "Filen %(file)s hittades inte på Google Drive" msgid "Book path %(path)s not found on Google Drive" msgstr "Boksökvägen %(path)s hittades inte på Google Drive" -#: cps/helper.py:643 +#: cps/helper.py:511 +msgid "Failed to create path for cover" +msgstr "" + +#: cps/helper.py:516 +msgid "Cover-file is not a valid image file" +msgstr "" + +#: cps/helper.py:519 +msgid "Failed to store cover-file" +msgstr "" + +#: cps/helper.py:530 +msgid "Only jpg/jpeg/png/webp files are supported as coverfile" +msgstr "" + +#: cps/helper.py:544 +msgid "Only jpg/jpeg files are supported as coverfile" +msgstr "" + +#: cps/helper.py:658 msgid "Waiting" msgstr "Väntar" -#: cps/helper.py:645 +#: cps/helper.py:660 msgid "Failed" msgstr "Misslyckades" -#: cps/helper.py:647 +#: cps/helper.py:662 msgid "Started" msgstr "Startad" -#: cps/helper.py:649 +#: cps/helper.py:664 msgid "Finished" msgstr "Klar" -#: cps/helper.py:651 +#: cps/helper.py:666 msgid "Unknown Status" msgstr "Okänd status" -#: cps/helper.py:656 +#: cps/helper.py:671 msgid "E-mail: " msgstr "E-post: " -#: cps/helper.py:658 cps/helper.py:662 +#: cps/helper.py:673 cps/helper.py:677 msgid "Convert: " msgstr "Konvertera: " -#: cps/helper.py:660 +#: cps/helper.py:675 msgid "Upload: " msgstr "Överför: " -#: cps/helper.py:664 +#: cps/helper.py:679 msgid "Unknown Task: " msgstr "Okänd uppgift: " -#: cps/oauth_bb.py:75 +#: cps/kobo_auth.py:127 +msgid "PLease access calibre-web from non localhost to get valid api_endpoint for kobo device" +msgstr "" + +#: cps/kobo_auth.py:130 cps/kobo_auth.py:150 +msgid "Kobo Setup" +msgstr "" + +#: cps/oauth_bb.py:74 #, python-format msgid "Register with %(provider)s" msgstr "Registrera dig med %(provider)s" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:154 msgid "Failed to log in with GitHub." msgstr "Det gick inte att logga in med GitHub." -#: cps/oauth_bb.py:160 +#: cps/oauth_bb.py:159 msgid "Failed to fetch user info from GitHub." msgstr "Det gick inte att hämta användarinformation från GitHub." -#: cps/oauth_bb.py:171 +#: cps/oauth_bb.py:170 msgid "Failed to log in with Google." msgstr "Det gick inte att logga in med Google." -#: cps/oauth_bb.py:176 +#: cps/oauth_bb.py:175 msgid "Failed to fetch user info from Google." msgstr "Det gick inte att hämta användarinformation från Google." -#: cps/oauth_bb.py:274 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s success." msgstr "Koppla bort till %(oauth)s lyckades." -#: cps/oauth_bb.py:278 +#: cps/oauth_bb.py:277 #, python-format msgid "Unlink to %(oauth)s failed." msgstr "Koppla bort till %(oauth)s misslyckades." -#: cps/oauth_bb.py:281 +#: cps/oauth_bb.py:280 #, python-format msgid "Not linked to %(oauth)s." msgstr "Inte kopplat till %(oauth) s." -#: cps/oauth_bb.py:309 +#: cps/oauth_bb.py:308 msgid "GitHub Oauth error, please retry later." msgstr "GitHub Oauth-fel, försök igen senare." -#: cps/oauth_bb.py:328 +#: cps/oauth_bb.py:327 msgid "Google Oauth error, please retry later." msgstr "Google Oauth-fel, försök igen senare." @@ -517,403 +549,393 @@ msgstr "Böcker har lagts till hyllan: %(sname)s" msgid "Could not add books to shelf: %(sname)s" msgstr "Kunde inte lägga till böcker till hyllan: %(sname)s" -#: cps/shelf.py:180 +#: cps/shelf.py:181 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "Boken har tagits bort från hyllan: %(sname)s" -#: cps/shelf.py:186 +#: cps/shelf.py:190 #, 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:207 cps/shelf.py:231 +#: cps/shelf.py:211 cps/shelf.py:235 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "En hylla med namnet '%(title)s' finns redan." -#: cps/shelf.py:212 +#: cps/shelf.py:216 #, python-format msgid "Shelf %(title)s created" msgstr "Hyllan %(title)s skapad" -#: cps/shelf.py:214 cps/shelf.py:242 +#: cps/shelf.py:218 cps/shelf.py:246 msgid "There was an error" msgstr "Det fanns ett fel" -#: cps/shelf.py:215 cps/shelf.py:217 +#: cps/shelf.py:219 cps/shelf.py:221 msgid "create a shelf" msgstr "skapa en hylla" -#: cps/shelf.py:240 +#: cps/shelf.py:244 #, python-format msgid "Shelf %(title)s changed" msgstr "Hyllan %(title)s ändrad" -#: cps/shelf.py:243 cps/shelf.py:245 +#: cps/shelf.py:247 cps/shelf.py:249 msgid "Edit a shelf" msgstr "Redigera en hylla" -#: cps/shelf.py:289 +#: cps/shelf.py:301 #, python-format msgid "Shelf: '%(name)s'" msgstr "Hylla: '%(name)s'" -#: cps/shelf.py:292 +#: cps/shelf.py:304 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:323 +#: cps/shelf.py:342 +msgid "Hidden Book" +msgstr "" + +#: cps/shelf.py:347 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Ändra ordning på hyllan: '%(name)s'" -#: cps/ub.py:57 +#: cps/ub.py:56 msgid "Recently Added" msgstr "Nyligen tillagda" -#: cps/ub.py:59 +#: cps/ub.py:58 msgid "Show recent books" msgstr "Visa senaste böcker" -#: cps/templates/index.xml:17 cps/ub.py:60 +#: cps/templates/index.xml:17 cps/ub.py:59 msgid "Hot Books" msgstr "Heta böcker" -#: cps/ub.py:61 -msgid "Show hot books" +#: cps/ub.py:60 +msgid "Show Hot Books" msgstr "Visa heta böcker" -#: cps/templates/index.xml:24 cps/ub.py:64 -msgid "Best rated Books" +#: cps/templates/index.xml:24 cps/ub.py:63 cps/web.py:508 +msgid "Top Rated Books" msgstr "Bäst rankade böcker" -#: cps/ub.py:66 -msgid "Show best rated books" +#: cps/ub.py:65 +msgid "Show Top Rated Books" msgstr "Visa böcker med bästa betyg" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67 -#: cps/web.py:1011 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:66 +#: cps/web.py:1005 msgid "Read Books" msgstr "Lästa böcker" -#: cps/ub.py:69 +#: cps/ub.py:68 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:71 -#: cps/web.py:1015 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:70 +#: cps/web.py:1009 msgid "Unread Books" msgstr "Olästa böcker" -#: cps/ub.py:73 +#: cps/ub.py:72 msgid "Show unread" msgstr "Visa olästa" -#: cps/ub.py:74 +#: cps/ub.py:73 msgid "Discover" msgstr "Upptäck" -#: cps/ub.py:76 +#: cps/ub.py:75 msgid "Show random books" msgstr "Visa slumpmässiga böcker" -#: cps/templates/index.xml:75 cps/ub.py:77 +#: cps/templates/index.xml:75 cps/ub.py:76 cps/web.py:787 msgid "Categories" msgstr "Kategorier" -#: cps/ub.py:79 +#: cps/ub.py:78 msgid "Show category selection" msgstr "Visa kategorival" -#: cps/templates/book_edit.html:71 cps/templates/index.xml:82 -#: cps/templates/search_form.html:53 cps/ub.py:80 +#: cps/templates/book_edit.html:69 cps/templates/index.xml:82 +#: cps/templates/search_form.html:53 cps/ub.py:79 cps/web.py:715 msgid "Series" msgstr "Serier" -#: cps/ub.py:82 +#: cps/ub.py:81 msgid "Show series selection" msgstr "Visa serieval" -#: cps/templates/index.xml:61 cps/ub.py:83 +#: cps/templates/index.xml:61 cps/ub.py:82 msgid "Authors" msgstr "Författare" -#: cps/ub.py:85 +#: cps/ub.py:84 msgid "Show author selection" msgstr "Visa författarval" -#: cps/templates/index.xml:68 cps/ub.py:87 +#: cps/templates/index.xml:68 cps/ub.py:86 cps/web.py:699 msgid "Publishers" msgstr "Förlag" -#: cps/ub.py:89 +#: cps/ub.py:88 msgid "Show publisher selection" msgstr "Visa urval av förlag" -#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:90 +#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:89 +#: cps/web.py:770 msgid "Languages" msgstr "Språk" -#: cps/ub.py:93 +#: cps/ub.py:92 msgid "Show language selection" msgstr "Visa språkval" -#: cps/ub.py:94 +#: cps/templates/index.xml:96 cps/ub.py:93 msgid "Ratings" msgstr "Betyg" -#: cps/ub.py:96 +#: cps/ub.py:95 msgid "Show ratings selection" msgstr "Visa val av betyg" -#: cps/templates/index.xml:96 cps/ub.py:97 +#: cps/templates/index.xml:104 cps/ub.py:96 msgid "File formats" msgstr "Filformat" -#: cps/ub.py:99 +#: cps/ub.py:98 msgid "Show file formats selection" msgstr "Visa val av filformat" -#: cps/updater.py:252 cps/updater.py:359 cps/updater.py:372 +#: cps/updater.py:262 cps/updater.py:369 cps/updater.py:382 msgid "Unexpected data while reading update information" msgstr "Oväntade data vid läsning av uppdateringsinformation" -#: cps/updater.py:259 cps/updater.py:365 +#: cps/updater.py:269 cps/updater.py:375 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:285 +#: cps/updater.py:295 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:338 +#: cps/updater.py:348 msgid "Could not fetch update information" msgstr "Kunde inte hämta uppdateringsinformation" -#: cps/updater.py:352 +#: cps/updater.py:362 msgid "No release information available" msgstr "Ingen versionsinformation tillgänglig" -#: cps/updater.py:405 cps/updater.py:414 +#: cps/updater.py:415 cps/updater.py:424 #, python-format msgid "A new update is available. Click on the button below to update to version: %(version)s" msgstr "En ny uppdatering är tillgänglig. Klicka på knappen nedan för att uppdatera till version: %(version)s" -#: cps/updater.py:424 +#: cps/updater.py:434 msgid "Click on the button below to update to the latest stable version." msgstr "Klicka på knappen nedan för att uppdatera till den senaste stabila versionen." -#: cps/web.py:486 +#: cps/web.py:480 msgid "Recently Added Books" msgstr "Nyligen tillagda böcker" -#: cps/web.py:514 -msgid "Best rated books" -msgstr "Bäst rankade böcker" - -#: cps/templates/index.xml:38 cps/web.py:522 -msgid "Random Books" -msgstr "Slumpmässiga böcker" +#: cps/templates/index.html:5 cps/web.py:516 +msgid "Discover (Random Books)" +msgstr "Upptäck (slumpmässiga böcker)" -#: cps/web.py:548 +#: cps/web.py:542 msgid "Books" msgstr "Böcker" -#: cps/web.py:575 -msgid "Hot Books (most downloaded)" +#: cps/web.py:569 +msgid "Hot Books (Most Downloaded)" msgstr "Heta böcker (mest hämtade)" -#: cps/web.py:586 cps/web.py:1382 cps/web.py:1478 -msgid "Error opening eBook. File does not exist or file is not accessible:" +#: cps/web.py:580 +msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Fel vid öppnande av e-bok. Filen finns inte eller filen är inte tillgänglig:" -#: cps/web.py:599 +#: cps/web.py:593 #, python-format msgid "Author: %(name)s" msgstr "Författare: %(name)s" -#: cps/web.py:611 +#: cps/web.py:605 #, python-format msgid "Publisher: %(name)s" msgstr "Förlag: %(name)s" -#: cps/web.py:622 +#: cps/web.py:616 #, python-format msgid "Series: %(serie)s" msgstr "Serier: %(serie)s" -#: cps/web.py:633 +#: cps/web.py:627 #, python-format msgid "Rating: %(rating)s stars" msgstr "Betyg: %(rating)s stars" -#: cps/web.py:644 +#: cps/web.py:638 #, python-format msgid "File format: %(format)s" msgstr "Filformat: %(format)s" -#: cps/web.py:656 +#: cps/web.py:650 #, python-format msgid "Category: %(name)s" msgstr "Kategori: %(name)s" -#: cps/web.py:673 +#: cps/web.py:667 #, python-format msgid "Language: %(name)s" msgstr "Språk: %(name)s" -#: cps/web.py:705 -msgid "Publisher list" -msgstr "Lista över förlag" - -#: cps/web.py:721 -msgid "Series list" -msgstr "Serielista" - -#: cps/web.py:735 +#: cps/web.py:729 msgid "Ratings list" msgstr "Betygslista" -#: cps/web.py:748 +#: cps/web.py:742 msgid "File formats list" msgstr "Lista över filformat" -#: cps/web.py:776 -msgid "Available languages" -msgstr "Tillgängliga språk" - -#: cps/web.py:793 -msgid "Category list" -msgstr "Kategorilista" - -#: cps/templates/layout.html:73 cps/web.py:807 +#: cps/templates/layout.html:73 cps/templates/tasks.html:7 cps/web.py:801 msgid "Tasks" msgstr "Uppgifter" -#: cps/templates/feed.xml:33 cps/templates/layout.html:44 -#: cps/templates/layout.html:45 cps/web.py:829 cps/web.py:831 +#: cps/templates/book_edit.html:212 cps/templates/feed.xml:33 +#: cps/templates/layout.html:44 cps/templates/layout.html:47 +#: cps/templates/search_form.html:170 cps/web.py:821 cps/web.py:823 msgid "Search" msgstr "Sök" -#: cps/web.py:881 +#: cps/web.py:873 msgid "Published after " msgstr "Publicerad efter " -#: cps/web.py:888 +#: cps/web.py:880 msgid "Published before " msgstr "Publicerad före " -#: cps/web.py:902 +#: cps/web.py:894 #, python-format msgid "Rating <= %(rating)s" msgstr "Betyg <= %(rating)s" -#: cps/web.py:904 +#: cps/web.py:896 #, python-format msgid "Rating >= %(rating)s" msgstr "Betyg >= %(rating)s" -#: cps/web.py:970 cps/web.py:982 +#: cps/web.py:962 cps/web.py:976 msgid "search" msgstr "sök" -#: cps/web.py:1067 +#: cps/web.py:1060 #, 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:1071 +#: cps/web.py:1064 #, 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:1073 +#: cps/web.py:1066 msgid "Please configure your kindle e-mail address first..." msgstr "Konfigurera din kindle-e-postadress först..." -#: cps/web.py:1087 +#: cps/web.py:1083 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "E-postservern är inte konfigurerad, kontakta din administratör!" -#: cps/web.py:1088 cps/web.py:1094 cps/web.py:1119 cps/web.py:1123 -#: cps/web.py:1128 cps/web.py:1132 +#: cps/web.py:1084 cps/web.py:1090 cps/web.py:1115 cps/web.py:1119 +#: cps/web.py:1124 cps/web.py:1128 msgid "register" msgstr "registrera" -#: cps/web.py:1121 +#: cps/web.py:1117 msgid "Your e-mail is not allowed to register" msgstr "Din e-post är inte tillåten att registrera" -#: cps/web.py:1124 +#: cps/web.py:1120 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Bekräftelsemail skickades till ditt e-postkonto." -#: cps/web.py:1127 +#: cps/web.py:1123 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:1144 +#: cps/web.py:1140 msgid "Cannot activate LDAP authentication" msgstr "Det går inte att aktivera LDAP-autentisering" -#: cps/web.py:1154 cps/web.py:1281 +#: cps/web.py:1150 cps/web.py:1277 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "du är nu inloggad som: \"%(nickname)s\"" -#: cps/web.py:1159 +#: cps/web.py:1155 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "Det gick inte att logga in. LDAP-servern är nere, kontakta din administratör" -#: cps/web.py:1163 cps/web.py:1186 +#: cps/web.py:1159 cps/web.py:1182 msgid "Wrong Username or Password" msgstr "Fel användarnamn eller lösenord" -#: cps/web.py:1170 +#: cps/web.py:1166 msgid "New Password was send to your email address" msgstr "Nytt lösenord skickades till din e-postadress" -#: cps/web.py:1176 +#: cps/web.py:1172 msgid "Please enter valid username to reset password" msgstr "Ange giltigt användarnamn för att återställa lösenordet" -#: cps/web.py:1182 +#: cps/web.py:1178 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Du är nu inloggad som: \"%(nickname)s\"" -#: cps/web.py:1189 cps/web.py:1213 +#: cps/web.py:1185 cps/web.py:1209 msgid "login" msgstr "logga in" -#: cps/web.py:1225 cps/web.py:1259 +#: cps/web.py:1221 cps/web.py:1255 msgid "Token not found" msgstr "Token hittades inte" -#: cps/web.py:1234 cps/web.py:1267 +#: cps/web.py:1230 cps/web.py:1263 msgid "Token has expired" msgstr "Token har löpt ut" -#: cps/web.py:1243 +#: cps/web.py:1239 msgid "Success! Please return to your device" msgstr "Lyckades! Vänligen återvänd till din enhet" -#: cps/web.py:1320 cps/web.py:1363 cps/web.py:1369 +#: cps/web.py:1320 cps/web.py:1365 cps/web.py:1371 #, python-format msgid "%(name)s's profile" msgstr "%(name)ss profil" -#: cps/web.py:1365 +#: cps/web.py:1367 msgid "Profile updated" msgstr "Profilen uppdaterad" -#: cps/web.py:1394 cps/web.py:1397 cps/web.py:1400 cps/web.py:1407 -#: cps/web.py:1412 +#: cps/web.py:1384 cps/web.py:1480 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "" + +#: cps/web.py:1396 cps/web.py:1399 cps/web.py:1402 cps/web.py:1409 +#: cps/web.py:1414 msgid "Read a Book" msgstr "Läs en bok" -#: cps/web.py:1423 +#: cps/web.py:1425 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "Fel vid öppningen av e-boken. Filen finns inte eller filen är inte tillgänglig." @@ -928,23 +950,26 @@ msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Kindlegen misslyckades med fel %(error)s. Meddelande: %(message)s" #: cps/templates/admin.html:9 -msgid "User list" +msgid "Users" msgstr "Användarlista" -#: cps/templates/admin.html:12 -msgid "Nickname" +#: cps/templates/admin.html:12 cps/templates/login.html:8 +#: cps/templates/login.html:9 cps/templates/register.html:7 +#: cps/templates/user_edit.html:8 +msgid "Username" msgstr "Smeknamn" -#: cps/templates/admin.html:13 -msgid "E-mail" +#: cps/templates/admin.html:13 cps/templates/register.html:11 +#: cps/templates/user_edit.html:13 +msgid "E-mail Address" msgstr "E-post" -#: cps/templates/admin.html:14 -msgid "Kindle" +#: cps/templates/admin.html:14 cps/templates/user_edit.html:26 +msgid "Send to Kindle E-mail Address" msgstr "Kindle" #: cps/templates/admin.html:15 -msgid "DLS" +msgid "Downloads" msgstr "DLS" #: cps/templates/admin.html:16 cps/templates/layout.html:76 @@ -958,7 +983,7 @@ msgid "Download" msgstr "Hämta" #: cps/templates/admin.html:18 -msgid "View Ebooks" +msgid "View eBooks" msgstr "Visa e-böcker" #: cps/templates/admin.html:19 cps/templates/layout.html:65 @@ -969,28 +994,32 @@ msgstr "Ladda upp" msgid "Edit" msgstr "Redigera" +#: cps/templates/admin.html:38 +msgid "Add New User" +msgstr "" + #: cps/templates/admin.html:44 -msgid "SMTP e-mail server settings" +msgid "E-mail Server Settings" msgstr "Inställningar för SMTP-e-postserver" #: cps/templates/admin.html:47 cps/templates/email_edit.html:11 -msgid "SMTP hostname" +msgid "SMTP Hostname" msgstr "SMTP-värdnamn" -#: cps/templates/admin.html:48 -msgid "SMTP port" +#: cps/templates/admin.html:48 cps/templates/email_edit.html:15 +msgid "SMTP Port" msgstr "SMTP-port" -#: cps/templates/admin.html:49 -msgid "SSL" +#: cps/templates/admin.html:49 cps/templates/email_edit.html:19 +msgid "Encryption" msgstr "SSL" #: cps/templates/admin.html:50 cps/templates/email_edit.html:27 -msgid "SMTP login" +msgid "SMTP Login" msgstr "SMTP-inloggning" -#: cps/templates/admin.html:51 -msgid "From mail" +#: cps/templates/admin.html:51 cps/templates/email_edit.html:35 +msgid "From E-mail" msgstr "Från meddelande" #: cps/templates/admin.html:61 @@ -1002,63 +1031,71 @@ msgid "Configuration" msgstr "Konfiguration" #: cps/templates/admin.html:70 -msgid "Calibre DB dir" +msgid "Calibre Database Directory" msgstr "Calibre DB dir" -#: cps/templates/admin.html:74 -msgid "Log level" +#: cps/templates/admin.html:74 cps/templates/config_edit.html:122 +msgid "Log Level" msgstr "Loggnivå" #: cps/templates/admin.html:78 msgid "Port" msgstr "Port" -#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:23 -msgid "Books per page" +#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:27 +msgid "Books per Page" msgstr "Böcker per sida" #: cps/templates/admin.html:88 -msgid "Uploading" +msgid "Uploads" msgstr "Laddar upp" #: cps/templates/admin.html:92 -msgid "Anonymous browsing" +msgid "Anonymous Browsing" msgstr "Anonym surfning" #: cps/templates/admin.html:96 -msgid "Public registration" +msgid "Public Registration" msgstr "Publik registrering" -#: cps/templates/admin.html:100 cps/templates/remote_login.html:4 -msgid "Remote login" +#: cps/templates/admin.html:100 +msgid "Magic Link Remote Login" msgstr "Fjärrinloggning" #: cps/templates/admin.html:104 -msgid "Reverse proxy login" +msgid "Reverse Proxy Login" msgstr "Omvänd proxy inloggning" #: cps/templates/admin.html:109 msgid "Reverse proxy header name" msgstr "Omvänt proxy rubriknamn" +#: cps/templates/admin.html:114 +msgid "Edit Basic Configuration" +msgstr "" + +#: cps/templates/admin.html:115 +msgid "Edit UI Configuration" +msgstr "" + #: cps/templates/admin.html:121 msgid "Administration" msgstr "Administration" #: cps/templates/admin.html:122 -msgid "View Logfiles" +msgid "View Logs" msgstr "Visa loggfiler" #: cps/templates/admin.html:123 -msgid "Reconnect to Calibre DB" +msgid "Reconnect Calibre Database" msgstr "Anslut till Calibre DB igen" #: cps/templates/admin.html:124 -msgid "Restart Calibre-Web" +msgid "Restart" msgstr "Starta om Calibre-Web" #: cps/templates/admin.html:125 -msgid "Stop Calibre-Web" +msgid "Shutdown" msgstr "Stoppa Calibre-Web" #: cps/templates/admin.html:131 @@ -1078,7 +1115,7 @@ msgid "Current version" msgstr "Aktuell version" #: cps/templates/admin.html:148 -msgid "Check for update" +msgid "Check for Update" msgstr "Sök efter uppdatering" #: cps/templates/admin.html:149 @@ -1086,30 +1123,29 @@ msgid "Perform Update" msgstr "Utför uppdatering" #: cps/templates/admin.html:161 -msgid "Do you really want to restart Calibre-Web?" +msgid "Are you sure you want to restart?" msgstr "Är du säker på att du vill starta om Calibre-Web?" #: cps/templates/admin.html:166 cps/templates/admin.html:180 #: cps/templates/admin.html:200 cps/templates/shelf.html:72 -msgid "Ok" +msgid "OK" msgstr "Ok" #: cps/templates/admin.html:167 cps/templates/admin.html:181 -#: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 +#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:194 +#: cps/templates/config_edit.html:346 cps/templates/config_view_edit.html:151 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92 -#: cps/templates/layout.html:28 cps/templates/shelf.html:73 -#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32 -#: cps/templates/user_edit.html:131 -msgid "Back" -msgstr "Tillbaka" +#: cps/templates/shelf.html:73 cps/templates/shelf_edit.html:19 +#: cps/templates/user_edit.html:137 +msgid "Cancel" +msgstr "" #: cps/templates/admin.html:179 -msgid "Do you really want to stop Calibre-Web?" +msgid "Are you sure you want to shutdown?" msgstr "Är du säker på att du vill stoppa Calibre-Web?" #: cps/templates/admin.html:191 -msgid "Updating, please do not reload page" +msgid "Updating, please do not reload this page" msgstr "Uppdaterar, vänligen uppdatera inte sidan" #: cps/templates/author.html:15 @@ -1136,161 +1172,159 @@ msgstr "minska" msgid "More by" msgstr "Mer av" -#: cps/templates/book_edit.html:12 +#: cps/templates/book_edit.html:10 msgid "Delete Book" msgstr "Ta bort boken" -#: cps/templates/book_edit.html:15 +#: cps/templates/book_edit.html:13 msgid "Delete formats:" msgstr "Ta bort format:" -#: cps/templates/book_edit.html:18 cps/templates/book_edit.html:195 -#: cps/templates/email_edit.html:91 +#: cps/templates/book_edit.html:16 cps/templates/book_edit.html:193 +#: cps/templates/email_edit.html:91 cps/templates/user_edit.html:65 +#: cps/templates/user_edit.html:177 msgid "Delete" msgstr "Ta bort" -#: cps/templates/book_edit.html:26 +#: cps/templates/book_edit.html:24 msgid "Convert book format:" msgstr "Konvertera bokformat:" -#: cps/templates/book_edit.html:30 +#: cps/templates/book_edit.html:28 msgid "Convert from:" msgstr "Konvertera från:" -#: cps/templates/book_edit.html:32 cps/templates/book_edit.html:39 +#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:37 msgid "select an option" msgstr "välj ett alternativ" -#: cps/templates/book_edit.html:37 +#: cps/templates/book_edit.html:35 msgid "Convert to:" msgstr "Konvertera till:" -#: cps/templates/book_edit.html:46 +#: cps/templates/book_edit.html:44 msgid "Convert book" msgstr "Konvertera boken" -#: cps/templates/book_edit.html:55 cps/templates/search_form.html:6 +#: cps/templates/book_edit.html:53 cps/templates/search_form.html:6 msgid "Book Title" msgstr "Boktitel" -#: cps/templates/book_edit.html:59 cps/templates/book_edit.html:255 -#: cps/templates/book_edit.html:273 cps/templates/search_form.html:10 +#: cps/templates/book_edit.html:57 cps/templates/book_edit.html:256 +#: cps/templates/book_edit.html:274 cps/templates/search_form.html:10 msgid "Author" msgstr "Författare" -#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:260 -#: cps/templates/book_edit.html:275 cps/templates/search_form.html:126 +#: cps/templates/book_edit.html:61 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:276 cps/templates/search_form.html:126 msgid "Description" msgstr "Beskrivning" -#: cps/templates/book_edit.html:67 cps/templates/search_form.html:33 +#: cps/templates/book_edit.html:65 cps/templates/search_form.html:33 msgid "Tags" msgstr "Taggar" -#: cps/templates/book_edit.html:75 -msgid "Series id" -msgstr "Serier-id" +#: cps/templates/book_edit.html:73 +msgid "Series ID" +msgstr "" -#: cps/templates/book_edit.html:79 +#: cps/templates/book_edit.html:77 msgid "Rating" msgstr "Betyg" -#: cps/templates/book_edit.html:83 -msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +#: cps/templates/book_edit.html:81 +msgid "Fetch Cover from URL (JPEG - Image will be downloaded and stored in database)" msgstr "Omslagswebbadress (jpg, omslag hämtas och lagras i databasen, fältet är efteråt tomt igen)" -#: cps/templates/book_edit.html:87 -msgid "Upload Cover from local drive" +#: cps/templates/book_edit.html:85 +msgid "Upload Cover from Local Disk" msgstr "Ladda upp omslag från lokal enhet" -#: cps/templates/book_edit.html:92 cps/templates/detail.html:165 -msgid "Publishing date" +#: cps/templates/book_edit.html:90 +msgid "Published Date" msgstr "Publiceringsdatum" -#: cps/templates/book_edit.html:99 cps/templates/book_edit.html:257 -#: cps/templates/book_edit.html:274 cps/templates/detail.html:156 +#: cps/templates/book_edit.html:97 cps/templates/book_edit.html:258 +#: cps/templates/book_edit.html:275 cps/templates/detail.html:156 #: cps/templates/search_form.html:14 msgid "Publisher" msgstr "Förlag" -#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:30 +#: cps/templates/book_edit.html:101 cps/templates/detail.html:123 +#: cps/templates/user_edit.html:31 msgid "Language" msgstr "Språk" -#: cps/templates/book_edit.html:113 cps/templates/search_form.html:137 +#: cps/templates/book_edit.html:111 cps/templates/search_form.html:137 msgid "Yes" msgstr "Ja" -#: cps/templates/book_edit.html:114 cps/templates/search_form.html:138 +#: cps/templates/book_edit.html:112 cps/templates/search_form.html:138 msgid "No" msgstr "Nej" -#: cps/templates/book_edit.html:160 -msgid "Upload format" +#: cps/templates/book_edit.html:158 +msgid "Upload Format" msgstr "Ladda upp format" -#: cps/templates/book_edit.html:169 -msgid "view book after edit" +#: cps/templates/book_edit.html:167 +msgid "View Book on Save" msgstr "visa bok efter redigering" -#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:208 -msgid "Get metadata" +#: cps/templates/book_edit.html:170 cps/templates/book_edit.html:206 +msgid "Fetch Metadata" msgstr "Hämta metadata" -#: 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:170 cps/templates/shelf_edit.html:17 -#: cps/templates/user_edit.html:129 -msgid "Submit" -msgstr "Skicka" +#: cps/templates/book_edit.html:171 cps/templates/config_edit.html:343 +#: cps/templates/config_view_edit.html:150 cps/templates/email_edit.html:38 +#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:135 +msgid "Save" +msgstr "" -#: cps/templates/book_edit.html:187 +#: cps/templates/book_edit.html:185 msgid "Are you really sure?" msgstr "Är du verkligen säker?" -#: cps/templates/book_edit.html:190 -msgid "Book will be deleted from Calibre database" +#: cps/templates/book_edit.html:188 +msgid "This book will be permanently erased from database" msgstr "Boken kommer att tas bort från Calibre-databasen" -#: cps/templates/book_edit.html:191 -msgid "and from hard disk" +#: cps/templates/book_edit.html:189 +msgid "and hard disk" msgstr "och från hårddisken" -#: cps/templates/book_edit.html:211 +#: cps/templates/book_edit.html:209 msgid "Keyword" msgstr "Sökord" -#: cps/templates/book_edit.html:212 +#: cps/templates/book_edit.html:210 msgid " Search keyword " msgstr " Sök sökord " -#: cps/templates/book_edit.html:214 cps/templates/layout.html:47 -msgid "Go!" -msgstr "Kör!" - -#: cps/templates/book_edit.html:218 +#: cps/templates/book_edit.html:216 msgid "Click the cover to load metadata to the form" msgstr "Klicka på omslaget för att läsa in metadata till formuläret" -#: cps/templates/book_edit.html:230 cps/templates/book_edit.html:270 +#: cps/templates/book_edit.html:231 cps/templates/book_edit.html:271 msgid "Loading..." msgstr "Läser in..." -#: cps/templates/book_edit.html:235 cps/templates/layout.html:192 -#: cps/templates/layout.html:224 +#: cps/templates/book_edit.html:236 cps/templates/layout.html:191 +#: cps/templates/layout.html:223 cps/templates/modal_restriction.html:34 +#: cps/templates/user_edit.html:164 msgid "Close" msgstr "Stäng" -#: cps/templates/book_edit.html:262 cps/templates/book_edit.html:276 +#: cps/templates/book_edit.html:263 cps/templates/book_edit.html:277 msgid "Source" msgstr "Källa" -#: cps/templates/book_edit.html:271 +#: cps/templates/book_edit.html:272 msgid "Search error!" msgstr "Sökningsfel!" -#: cps/templates/book_edit.html:272 -msgid "No Result(s) found! Please try aonther keyword." +#: cps/templates/book_edit.html:273 +msgid "No Result(s) found! Please try another keyword." msgstr "Inga resultat hittades! Försök med ett annat sökord." #: cps/templates/config_edit.html:12 @@ -1298,7 +1332,7 @@ msgid "Library Configuration" msgstr "Bibliotekets konfiguration" #: cps/templates/config_edit.html:19 -msgid "Location of Calibre database" +msgid "Location of Calibre Database" msgstr "Plats för Calibre-databasen" #: cps/templates/config_edit.html:25 @@ -1350,7 +1384,7 @@ msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "SSL Keyfile plats (lämna den tom för icke-SSL-servrar)" #: cps/templates/config_edit.html:99 -msgid "Update channel" +msgid "Update Channel" msgstr "Uppdatera kanal" #: cps/templates/config_edit.html:101 @@ -1373,10 +1407,6 @@ msgstr "Ostabil (automatisk)" msgid "Logfile Configuration" msgstr "Loggfil konfiguration" -#: cps/templates/config_edit.html:122 -msgid "Log Level" -msgstr "Loggnivå" - #: cps/templates/config_edit.html:131 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)" @@ -1394,255 +1424,271 @@ msgid "Feature Configuration" msgstr "Funktion konfiguration" #: cps/templates/config_edit.html:158 -msgid "Enable uploading" +msgid "Enable Uploads" msgstr "Aktivera uppladdning" #: cps/templates/config_edit.html:162 -msgid "Enable anonymous browsing" +msgid "Enable Anonymous Browsing" msgstr "Aktivera anonym surfning" #: cps/templates/config_edit.html:166 -msgid "Enable public registration" +msgid "Enable Public Registration" msgstr "Aktivera offentlig registrering" #: cps/templates/config_edit.html:170 -msgid "Enable remote login (\"magic link\")" +msgid "Enable Magic Link Remote Login" msgstr "Aktivera fjärrinloggning (\"magisk länk\")" #: cps/templates/config_edit.html:175 +msgid "Enable Kobo sync" +msgstr "" + +#: cps/templates/config_edit.html:180 +msgid "Proxy unknown requests to Kobo Store" +msgstr "" + +#: cps/templates/config_edit.html:187 msgid "Use Goodreads" msgstr "Använd Goodreads" -#: cps/templates/config_edit.html:176 -msgid "Obtain an API Key" +#: cps/templates/config_edit.html:188 +msgid "Create an API Key" msgstr "Hämta en API-nyckel" -#: cps/templates/config_edit.html:180 +#: cps/templates/config_edit.html:192 msgid "Goodreads API Key" msgstr "Goodreads API-nyckel" -#: cps/templates/config_edit.html:184 +#: cps/templates/config_edit.html:196 msgid "Goodreads API Secret" msgstr "Goodreads API-hemlighet" -#: cps/templates/config_edit.html:191 +#: cps/templates/config_edit.html:203 msgid "Login type" msgstr "Inloggningstyp" -#: cps/templates/config_edit.html:193 -msgid "Use standard Authentication" +#: cps/templates/config_edit.html:205 +msgid "Use Standard Authentication" msgstr "Använd standardautentisering" -#: cps/templates/config_edit.html:195 +#: cps/templates/config_edit.html:207 msgid "Use LDAP Authentication" msgstr "Använd LDAP-autentisering" -#: cps/templates/config_edit.html:198 +#: cps/templates/config_edit.html:210 msgid "Use OAuth" msgstr "Använd OAuth" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:217 msgid "LDAP Server Host Name or IP Address" msgstr "LDAP-serverns värdnamn eller IP-adress" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:221 msgid "LDAP Server Port" msgstr "LDAP-serverport" -#: cps/templates/config_edit.html:213 -msgid "LDAP schema (ldap or ldaps)" +#: cps/templates/config_edit.html:225 +msgid "LDAP Schema (LDAP or LPAPS)" msgstr "LDAP-schema (ldap eller ldaps)" -#: cps/templates/config_edit.html:217 -msgid "LDAP Admin username" +#: cps/templates/config_edit.html:229 +msgid "LDAP Administrator Username" msgstr "LDAP-adminstratörsanvändarnamn" -#: cps/templates/config_edit.html:221 -msgid "LDAP Admin password" +#: cps/templates/config_edit.html:233 +msgid "LDAP Administrator Password" msgstr "LDAP-adminstratörslösenord" -#: cps/templates/config_edit.html:226 -msgid "LDAP Server use SSL" +#: cps/templates/config_edit.html:238 +msgid "LDAP Server Enable SSL" msgstr "LDAP-server använder SSL" -#: cps/templates/config_edit.html:230 -msgid "LDAP Server use TLS" +#: cps/templates/config_edit.html:242 +msgid "LDAP Server Enable TLS" msgstr "LDAP-server använder TLS" -#: cps/templates/config_edit.html:234 +#: cps/templates/config_edit.html:246 msgid "LDAP Server Certificate" msgstr "LDAP-servercertifikat" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:250 msgid "LDAP SSL Certificate Path" msgstr "LDAP SSL-certifikatsökväg" -#: cps/templates/config_edit.html:243 +#: cps/templates/config_edit.html:255 msgid "LDAP Distinguished Name (DN)" msgstr "LDAP Distinguished Name (DN)" -#: cps/templates/config_edit.html:247 -msgid "LDAP User object filter" +#: cps/templates/config_edit.html:259 +msgid "LDAP User Object Filter" msgstr "LDAP-användarobjektfilter" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:264 msgid "LDAP Server is OpenLDAP?" msgstr "LDAP-server är OpenLDAP?" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:272 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "Skaffa %(provider)s OAuth-certifikat" -#: cps/templates/config_edit.html:263 +#: cps/templates/config_edit.html:275 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "%(provider)s OAuth-klient-id" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:279 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "%(provider)s OAuth-klient-hemlighet" -#: cps/templates/config_edit.html:276 +#: cps/templates/config_edit.html:288 msgid "Allow Reverse Proxy Authentication" msgstr "Tillåt omvänd proxyautentisering" -#: cps/templates/config_edit.html:280 +#: cps/templates/config_edit.html:292 msgid "Reverse Proxy Header Name" msgstr "Omvänt proxy rubriknamn" -#: cps/templates/config_edit.html:292 +#: cps/templates/config_edit.html:304 msgid "External binaries" msgstr "Externa binärer" -#: cps/templates/config_edit.html:300 -msgid "No converter" +#: cps/templates/config_edit.html:312 +msgid "No Converter" msgstr "Ingen konverterare" -#: cps/templates/config_edit.html:302 +#: cps/templates/config_edit.html:314 msgid "Use Kindlegen" msgstr "Använd Kindlegen" -#: cps/templates/config_edit.html:304 +#: cps/templates/config_edit.html:316 msgid "Use calibre's ebook converter" msgstr "Använd calibres e-bokkonverterare" -#: cps/templates/config_edit.html:308 +#: cps/templates/config_edit.html:320 msgid "E-Book converter settings" msgstr "Inställningar för e-bokkonverteraren" -#: cps/templates/config_edit.html:312 +#: cps/templates/config_edit.html:324 msgid "Path to convertertool" msgstr "Sökväg till convertertool" -#: cps/templates/config_edit.html:318 +#: cps/templates/config_edit.html:330 msgid "Location of Unrar binary" msgstr "Plats för Unrar-binär" -#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 -#: cps/templates/login.html:4 +#: cps/templates/config_edit.html:349 cps/templates/layout.html:84 +#: cps/templates/login.html:4 cps/templates/login.html:20 msgid "Login" msgstr "Logga in" -#: cps/templates/config_view_edit.html:12 +#: cps/templates/config_view_edit.html:16 msgid "View Configuration" msgstr "Visa konfiguration" -#: cps/templates/config_view_edit.html:19 cps/templates/shelf_edit.html:7 +#: cps/templates/config_view_edit.html:23 cps/templates/shelf_edit.html:7 msgid "Title" msgstr "Titel" -#: cps/templates/config_view_edit.html:27 -msgid "No. of random books to show" +#: cps/templates/config_view_edit.html:31 +msgid "No. of Random Books to Display" msgstr "Antal slumpmässiga böcker att visa" -#: cps/templates/config_view_edit.html:31 -msgid "No. of authors to show before hiding (0=disable hiding)" +#: cps/templates/config_view_edit.html:35 +msgid "No. of Authors to Display Before Hiding (0=Disable Hiding)" msgstr "Antal författare att visa innan de döljs (0 = inaktivera dölja)" -#: cps/templates/config_view_edit.html:35 cps/templates/readcbr.html:112 +#: cps/templates/config_view_edit.html:39 cps/templates/readcbr.html:112 msgid "Theme" msgstr "Tema" -#: cps/templates/config_view_edit.html:37 +#: cps/templates/config_view_edit.html:41 msgid "Standard Theme" msgstr "Standard tema" -#: cps/templates/config_view_edit.html:38 +#: cps/templates/config_view_edit.html:42 msgid "caliBlur! Dark Theme" msgstr "caliBlur! Mörkt tema" -#: cps/templates/config_view_edit.html:42 -msgid "Regular expression for ignoring columns" +#: cps/templates/config_view_edit.html:46 +msgid "Regular Expression for Ignoring Columns" msgstr "Reguljärt uttryck för att ignorera kolumner" -#: cps/templates/config_view_edit.html:46 -msgid "Link read/unread status to Calibre column" +#: cps/templates/config_view_edit.html:50 +msgid "Link Read/Unread Status to Calibre Column" msgstr "Länka läst/oläst-status till Calibre-kolumn" -#: cps/templates/config_view_edit.html:55 -msgid "Regular expression for title sorting" -msgstr "Reguljärt uttryck för titelsortering" - #: cps/templates/config_view_edit.html:59 -msgid "Tags for Mature Content" -msgstr "Taggar för vuxeninnehåll" +msgid "View Restrictions based on Calibre column" +msgstr "" + +#: cps/templates/config_view_edit.html:61 cps/templates/email_edit.html:21 +msgid "None" +msgstr "Ingen" -#: cps/templates/config_view_edit.html:73 -msgid "Default settings for new users" +#: cps/templates/config_view_edit.html:68 +msgid "Regular Expression for Title Sorting" +msgstr "Reguljärt uttryck för titelsortering" + +#: cps/templates/config_view_edit.html:80 +msgid "Default Settings for New Users" msgstr "Standardinställningar för nya användare" -#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:82 -msgid "Admin user" +#: cps/templates/config_view_edit.html:88 cps/templates/user_edit.html:92 +msgid "Admin User" msgstr "Adminstratör användare" -#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:91 +#: cps/templates/config_view_edit.html:92 cps/templates/user_edit.html:97 msgid "Allow Downloads" msgstr "Tillåt Hämtningar" -#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:95 -msgid "Allow book viewer" +#: cps/templates/config_view_edit.html:96 cps/templates/user_edit.html:101 +msgid "Allow eBook Viewer" msgstr "Tillåt bokvisare" -#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:99 +#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:105 msgid "Allow Uploads" msgstr "Tillåt Uppladdningar" -#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:103 +#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:109 msgid "Allow Edit" msgstr "Tillåt Redigera" -#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 -msgid "Allow Delete books" -msgstr "Tillåt Ta bort böcker" +#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:113 +msgid "Allow Delete Books" +msgstr "" -#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:112 +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:118 msgid "Allow Changing Password" msgstr "Tillåt Ändra lösenord" -#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:116 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:122 msgid "Allow Editing Public Shelfs" msgstr "Tillåt Redigering av offentliga hyllor" -#: cps/templates/config_view_edit.html:119 -msgid "Default visibilities for new users" +#: cps/templates/config_view_edit.html:126 +msgid "Default Visibilities for New Users" msgstr "Standardvisibiliteter för nya användare" -#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:74 -msgid "Show random books in detail view" +#: cps/templates/config_view_edit.html:142 +msgid "Show Random Books in Detail View" msgstr "Visa slumpmässiga böcker i detaljvyn" -#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:87 -msgid "Show mature content" -msgstr "Visa vuxeninnehåll" +#: cps/templates/config_view_edit.html:144 +msgid "Add Allowed/Denied Tags" +msgstr "" + +#: cps/templates/config_view_edit.html:145 +msgid "Add Allowed/Denied custom column values" +msgstr "" #: cps/templates/detail.html:59 -msgid "Read in browser" +msgid "Read in Browser" msgstr "Läs i webbläsaren" #: cps/templates/detail.html:72 -msgid "Listen in browser" +msgid "Listen in Browser" msgstr "Lyssna i webbläsaren" #: cps/templates/detail.html:117 @@ -1653,9 +1699,9 @@ msgstr "Bok" msgid "of" msgstr "av" -#: cps/templates/detail.html:123 -msgid "language" -msgstr "språk" +#: cps/templates/detail.html:165 +msgid "Published" +msgstr "" #: cps/templates/detail.html:200 msgid "Mark As Unread" @@ -1678,21 +1724,9 @@ msgid "Add to shelf" msgstr "Lägg till hyllan" #: cps/templates/detail.html:286 -msgid "Edit metadata" +msgid "Edit Metadata" msgstr "Redigera metadata" -#: cps/templates/email_edit.html:15 -msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" -msgstr "SMTP-port (vanligtvis 25 för vanlig SMTP och 465 för SSL och 587 för STARTTLS)" - -#: cps/templates/email_edit.html:19 -msgid "Encryption" -msgstr "Kryptering" - -#: cps/templates/email_edit.html:21 -msgid "None" -msgstr "Ingen" - #: cps/templates/email_edit.html:22 msgid "STARTTLS" msgstr "STARTTLS" @@ -1702,23 +1736,15 @@ msgid "SSL/TLS" msgstr "SSL/TLS" #: cps/templates/email_edit.html:31 -msgid "SMTP password" +msgid "SMTP Password" msgstr "SMTP-lösenord" -#: cps/templates/email_edit.html:35 -msgid "From e-mail" -msgstr "Från e-post" - -#: cps/templates/email_edit.html:38 -msgid "Save settings" -msgstr "Spara inställningarna" - #: cps/templates/email_edit.html:39 -msgid "Save settings and send Test E-Mail" +msgid "Save and Send Test E-mail" msgstr "Spara inställningarna och skicka test-e-post" #: cps/templates/email_edit.html:43 -msgid "Allowed domains for registering" +msgid "Allowed Domains (Whitelist)" msgstr "Tillåtna domäner för registrering" #: cps/templates/email_edit.html:46 cps/templates/email_edit.html:72 @@ -1734,29 +1760,29 @@ msgid "Enter domainname" msgstr "Ange domännamn" #: cps/templates/email_edit.html:60 -msgid "Denied domains for registering" +msgid "Denied Domains (Blacklist)" msgstr "Nekade domäner för registrering" #: cps/templates/email_edit.html:90 -msgid "Do you really want to delete this domain rule?" +msgid "Are you sure you want to delete this domain?" msgstr "Är du säker på att du vill ta bort den här domänregeln?" -#: cps/templates/feed.xml:21 cps/templates/layout.html:176 +#: cps/templates/feed.xml:21 cps/templates/layout.html:175 msgid "Next" msgstr "Nästa" -#: cps/templates/http_error.html:37 -msgid "Create issue" +#: cps/templates/generate_kobo_auth_url.html:5 +msgid "Open the .kobo/Kobo eReader.conf file in a text editor and add (or edit):" +msgstr "" + +#: cps/templates/http_error.html:38 +msgid "Create Issue" msgstr "Skapa ärende" -#: cps/templates/http_error.html:44 -msgid "Back to home" +#: cps/templates/http_error.html:45 +msgid "Return to Home" msgstr "Tillbaka till hemmet" -#: cps/templates/index.html:5 -msgid "Discover (Random Books)" -msgstr "Upptäck (slumpmässiga böcker)" - #: cps/templates/index.html:64 msgid "Group by series" msgstr "Gruppera efter serie" @@ -1781,7 +1807,11 @@ msgstr "Senaste tillagda böcker" msgid "The latest Books" msgstr "De senaste böckerna" -#: cps/templates/index.xml:42 +#: cps/templates/index.xml:38 +msgid "Random Books" +msgstr "Slumpmässiga böcker" + +#: cps/templates/index.xml:42 cps/templates/user_edit.html:80 msgid "Show Random Books" msgstr "Visa slumpmässiga böcker" @@ -1806,22 +1836,26 @@ msgid "Books ordered by Languages" msgstr "Böcker ordnade efter språk" #: cps/templates/index.xml:100 +msgid "Books ordered by Rating" +msgstr "" + +#: cps/templates/index.xml:108 msgid "Books ordered by file formats" msgstr "Böcker ordnade av filformat" -#: cps/templates/index.xml:103 cps/templates/layout.html:137 +#: cps/templates/index.xml:111 cps/templates/layout.html:136 msgid "Public Shelves" msgstr "Offentliga hyllor" -#: cps/templates/index.xml:107 +#: cps/templates/index.xml:115 msgid "Books organized in public shelfs, visible to everyone" msgstr "Böcker organiserade i offentliga hyllor, synliga för alla" -#: cps/templates/index.xml:111 cps/templates/layout.html:141 +#: cps/templates/index.xml:119 cps/templates/layout.html:140 msgid "Your Shelves" msgstr "Dina hyllor" -#: cps/templates/index.xml:115 +#: cps/templates/index.xml:123 msgid "User's own shelfs, only visible to the current user himself" msgstr "Användarens egna hyllor, endast synliga för den aktuella användaren själv" @@ -1829,10 +1863,19 @@ msgstr "Användarens egna hyllor, endast synliga för den aktuella användaren s msgid "Home" msgstr "Hem" +#: cps/templates/layout.html:28 cps/templates/shelf_order.html:32 +#: cps/templates/user_edit.html:178 +msgid "Back" +msgstr "Tillbaka" + #: cps/templates/layout.html:34 -msgid "Toggle navigation" +msgid "Toggle Navigation" msgstr "Växla navigering" +#: cps/templates/layout.html:45 +msgid "Search Library" +msgstr "" + #: cps/templates/layout.html:55 msgid "Advanced Search" msgstr "Avancerad sökning" @@ -1854,74 +1897,101 @@ msgstr "Logga ut" msgid "Register" msgstr "Registrera" -#: cps/templates/layout.html:116 cps/templates/layout.html:223 +#: cps/templates/layout.html:116 cps/templates/layout.html:222 msgid "Uploading..." msgstr "Laddar upp..." #: cps/templates/layout.html:117 -msgid "please don't refresh the page" -msgstr "uppdatera inte sidan" +msgid "Please do not refresh the page" +msgstr "" #: cps/templates/layout.html:127 msgid "Browse" msgstr "Bläddra" -#: cps/templates/layout.html:146 +#: cps/templates/layout.html:145 msgid "Create a Shelf" msgstr "Skapa en hylla" -#: cps/templates/layout.html:147 cps/templates/stats.html:3 +#: cps/templates/layout.html:146 cps/templates/stats.html:3 msgid "About" msgstr "Om" -#: cps/templates/layout.html:161 +#: cps/templates/layout.html:160 msgid "Previous" msgstr "Föregående" -#: cps/templates/layout.html:188 +#: cps/templates/layout.html:187 msgid "Book Details" msgstr "Bokdetaljer" -#: cps/templates/layout.html:222 +#: cps/templates/layout.html:221 msgid "Upload done, processing, please wait..." msgstr "Uppladdning klar, bearbetning, vänligen vänta ..." -#: cps/templates/layout.html:225 +#: cps/templates/layout.html:224 msgid "Error" msgstr "Fel" -#: cps/templates/login.html:8 cps/templates/login.html:9 -#: cps/templates/register.html:7 cps/templates/user_edit.html:8 -msgid "Username" -msgstr "Användarnamn" - #: cps/templates/login.html:12 cps/templates/login.html:13 #: cps/templates/user_edit.html:21 msgid "Password" msgstr "Lösenord" #: cps/templates/login.html:17 -msgid "Remember me" +msgid "Remember Me" msgstr "Kom ihåg mig" #: cps/templates/login.html:22 -msgid "Forgot password" +msgid "Forgot Password?" msgstr "Glömt lösenord" #: cps/templates/login.html:25 -msgid "Log in with magic link" +msgid "Log in with Magic Link" msgstr "Logga in med magisk länk" -#: cps/templates/logviewer.html:5 -msgid "Show Calibre-Web log" -msgstr "Visa Calibre-Web-logg" +#: cps/templates/logviewer.html:6 +msgid "Show Calibre-Web Log: " +msgstr "Visa Calibre-Web-logg: " #: cps/templates/logviewer.html:8 -msgid "Show access log" -msgstr "Visa åtkomstlogg" +msgid "Calibre-Web Log: " +msgstr "Visa åtkomstlogg: " + +#: cps/templates/logviewer.html:8 +msgid "Stream output, can't be displayed" +msgstr "Strömutmatning kan inte visas" + +#: cps/templates/logviewer.html:12 +msgid "Show Access Log: " +msgstr "Visa åtkomstlogg: " + +#: cps/templates/modal_restriction.html:6 +msgid "Select allowed/denied Tags" +msgstr "" + +#: cps/templates/modal_restriction.html:7 +msgid "Select allowed/denied Custom Column values" +msgstr "" + +#: cps/templates/modal_restriction.html:8 +msgid "Select allowed/denied Tags of user" +msgstr "" + +#: cps/templates/modal_restriction.html:9 +msgid "Select allowed/denied Custom Column values of user" +msgstr "" + +#: cps/templates/modal_restriction.html:15 +msgid "Enter Tag" +msgstr "" + +#: cps/templates/modal_restriction.html:24 +msgid "Add View Restriction" +msgstr "" #: cps/templates/osd.xml:5 -msgid "Calibre-Web ebook catalog" +msgid "Calibre-Web eBook Catalog" msgstr "Calibre-Web e-bokkatalog" #: cps/templates/read.html:74 @@ -2033,51 +2103,51 @@ msgid "Basic txt Reader" msgstr "Grundläggande txt-läsare" #: cps/templates/register.html:4 -msgid "Register a new account" +msgid "Register New Account" msgstr "Registrera ett nytt konto" #: cps/templates/register.html:8 msgid "Choose a username" msgstr "Välj ett användarnamn" -#: cps/templates/register.html:11 cps/templates/user_edit.html:13 -msgid "E-mail address" -msgstr "E-postadress" - #: cps/templates/register.html:12 msgid "Your email address" msgstr "Din e-postadress" +#: cps/templates/remote_login.html:4 +msgid "Magic Link - Authorise New Device" +msgstr "" + #: cps/templates/remote_login.html:6 -msgid "Use your other device, login and visit " +msgid "On another device, login and visit:" msgstr "Använd din andra enhet, logga in och besök " -#: cps/templates/remote_login.html:9 -msgid "Once you do so, you will automatically get logged in on this device." +#: cps/templates/remote_login.html:10 +msgid "Once verified, you will automatically be logged in on this device." msgstr "När du gör det kommer du automatiskt att logga in på den här enheten." -#: cps/templates/remote_login.html:12 -msgid "The link will expire after 10 minutes." +#: cps/templates/remote_login.html:13 +msgid "This verification link will expire in 10 minutes." msgstr "Länken går ut efter 10 minuter." #: cps/templates/search.html:5 -msgid "No Results for:" -msgstr "Inga resultat för:" +msgid "No Results Found" +msgstr "" #: cps/templates/search.html:6 -msgid "Please try a different search" -msgstr "Försök en annan sökning" +msgid "Search Term:" +msgstr "" #: cps/templates/search.html:8 msgid "Results for:" msgstr "Resultat för:" #: cps/templates/search_form.html:19 -msgid "Publishing date from" +msgid "Published Date From" msgstr "Publiceringsdatum från" #: cps/templates/search_form.html:26 -msgid "Publishing date to" +msgid "Published Date To" msgstr "Publiceringsdatum till" #: cps/templates/search_form.html:43 @@ -2101,11 +2171,11 @@ msgid "Exclude Extensions" msgstr "Uteslut tillägg" #: cps/templates/search_form.html:117 -msgid "Rating bigger than" +msgid "Rating Above" msgstr "Betyg större än" #: cps/templates/search_form.html:121 -msgid "Rating less than" +msgid "Rating Below" msgstr "Betyg mindre än" #: cps/templates/shelf.html:10 @@ -2121,23 +2191,23 @@ msgid "Change order" msgstr "Ändra ordningen" #: cps/templates/shelf.html:67 -msgid "Do you really want to delete the shelf?" +msgid "Are you sure you want to delete this shelf?" msgstr "Är du säker på att du vill ta bort hyllan?" #: cps/templates/shelf.html:70 -msgid "Shelf will be lost for everybody and forever!" +msgid "Shelf will be deleted for all users" msgstr "Hylla kommer att gå förlorad för alla och för alltid!" #: cps/templates/shelf_edit.html:13 -msgid "should the shelf be public?" +msgid "Share with Everyone" msgstr "ska hyllan vara offentlig?" #: cps/templates/shelf_order.html:5 -msgid "Drag 'n drop to rearrange order" +msgid "Drag to Rearrange Order" msgstr "Drag och släpp för att ändra ordning" #: cps/templates/stats.html:7 -msgid "Calibre library statistics" +msgid "Library Statistics" msgstr "Calibre-biblioteksstatistik" #: cps/templates/stats.html:12 @@ -2157,21 +2227,17 @@ msgid "Series in this Library" msgstr "Serier i detta bibliotek" #: cps/templates/stats.html:28 -msgid "Linked libraries" +msgid "Linked Libraries" msgstr "Kopplade bibliotek" #: cps/templates/stats.html:32 -msgid "Program library" +msgid "Program Library" msgstr "Programbibliotek" #: cps/templates/stats.html:33 msgid "Installed Version" msgstr "Installerad version" -#: cps/templates/tasks.html:7 -msgid "Tasks list" -msgstr "Uppgiftslista" - #: cps/templates/tasks.html:12 msgid "User" msgstr "Användare" @@ -2189,11 +2255,11 @@ msgid "Progress" msgstr "Förlopp" #: cps/templates/tasks.html:17 -msgid "Runtime" +msgid "Run Time" msgstr "Drifttid" #: cps/templates/tasks.html:18 -msgid "Starttime" +msgid "Start Time" msgstr "Starttid" #: cps/templates/tasks.html:24 @@ -2208,253 +2274,58 @@ msgstr "Dölj alla uppgifter" msgid "Reset user Password" msgstr "Återställ användarlösenordet" -#: cps/templates/user_edit.html:26 -msgid "Kindle E-Mail" -msgstr "Kindle e-post" - -#: cps/templates/user_edit.html:39 -msgid "Show books with language" +#: cps/templates/user_edit.html:41 +msgid "Language of Books" msgstr "Visa böcker med språk" -#: cps/templates/user_edit.html:41 -msgid "Show all" +#: cps/templates/user_edit.html:43 +msgid "Show All" msgstr "Visa alla" -#: cps/templates/user_edit.html:51 +#: cps/templates/user_edit.html:52 msgid "OAuth Settings" msgstr "OAuth-inställningar" -#: cps/templates/user_edit.html:53 +#: cps/templates/user_edit.html:54 msgid "Link" msgstr "Koppla" -#: cps/templates/user_edit.html:55 +#: cps/templates/user_edit.html:56 msgid "Unlink" msgstr "Koppla bort" -#: cps/templates/user_edit.html:123 -msgid "Delete this user" -msgstr "Ta bort den här användaren" - -#: cps/templates/user_edit.html:138 -msgid "Recent Downloads" -msgstr "Senaste hämtningar" - -#~ msgid "Current commit timestamp" -#~ msgstr "Aktuelles Commit Datum" - -#~ msgid "Newest commit timestamp" -#~ msgstr "Neuestes Commit Datum" - -#~ msgid "Convert: %(book)s" -#~ msgstr "Konvertera: %(book)s" - -#~ msgid "Convert to %(format)s: %(book)s" -#~ msgstr "Konvertera till %(format)s: %(book)s" - -#~ msgid "Files are replaced" -#~ msgstr "Filer ersätts" - -#~ msgid "Server is stopped" -#~ msgstr "Servern stoppas" - -#~ msgid "Convertertool %(converter)s not found" -#~ msgstr "Convertertool %(converter)s hittades inte" - -#~ msgid "Choose a password" -#~ msgstr "Välj ett lösenord" - -#~ msgid "Could not find any formats suitable for sending by e-mail" -#~ msgstr "Det gick inte att hitta några format som är lämpliga för att skicka via e-post" - -#~ msgid "Sorry you are not allowed to add a book to the shelf: %(shelfname)s" -#~ msgstr "Tyvärr får du inte lägga till en bok på hyllan: %(shelfname)s" - -#~ msgid "File %(file)s uploaded" -#~ msgstr "Filen %(file)s uppladdad" - -#~ msgid "Send %(format)s to Kkindle" -#~ msgstr "" - -#~ msgid "Author list" -#~ msgstr "Författarlista" - -#~ msgid "Update done" -#~ msgstr "Uppdatering klar" - -#~ msgid "Stable (Automatic))" -#~ msgstr "" - -#~ msgid "Nightly (Automatic))" -#~ msgstr "" - -#~ msgid "A new update is available. Click on the button below to update to version: " -#~ msgstr "" - -#~ msgid "A new update is available. Click on the button below to update to version: %(version)s" -#~ msgstr "" - -#~ msgid "Failed to create path for cover %(path)s (Permission denied)." -#~ msgstr "" - -#~ msgid "Failed to store cover-file %(cover)s." -#~ msgstr "" - -#~ msgid "Cover-file is not a valid image file" -#~ msgstr "" - -#~ msgid "Cover is not a jpg file, can't save" -#~ msgstr "Omslag är inte en jpg-fil, kan inte spara" - -#~ msgid "Preparing document for printing..." -#~ msgstr "" - -#~ msgid "Using your another device, visit" -#~ msgstr "Använda en annan enhet, besök" - -#~ msgid "and log in" -#~ msgstr "och logga in" - -#~ msgid "Using your another device, login and visit " -#~ msgstr "" - -#~ msgid "Newest Books" -#~ msgstr "Nyaste böcker" - -#~ msgid "Oldest Books" -#~ msgstr "Äldsta böcker" - -#~ msgid "Books (A-Z)" -#~ msgstr "Böcker (A-Ö)" - -#~ msgid "Books (Z-A)" -#~ msgstr "Böcker (Ö-A)" - -#~ msgid "Error opening eBook. Fileformat is not supported." -#~ msgstr "" - -#~ msgid "File %(title)s" -#~ msgstr "" - -#~ msgid "Show sorted books" -#~ msgstr "Visa sorterade böcker" - -#~ msgid "Sorted Books" -#~ msgstr "Sorterade böcker" - -#~ msgid "Sort By" -#~ msgstr "Sortera efter" - -#~ msgid "Newest" -#~ msgstr "Nyast" - -#~ msgid "Oldest" -#~ msgstr "Äldst" - -#~ msgid "Ascending" -#~ msgstr "Stigande" - -#~ msgid "Descending" -#~ msgstr "Fallande" - -#~ 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 "" - -#~ msgid "Import of optional Google Drive requirements missing" -#~ msgstr "Import av valfri Google Drive krav saknas" - -#~ msgid "client_secrets.json is missing or not readable" -#~ msgstr "client_secrets.json saknas eller inte kan läsas" - -#~ msgid "client_secrets.json is not configured for web application" -#~ msgstr "client_secrets.json är inte konfigurerad för webbapplikation" - -#~ msgid "Keyfile location is not valid, please enter correct path" -#~ msgstr "Platsen för Keyfile är inte giltig, ange rätt sökväg" - -#~ msgid "Certfile location is not valid, please enter correct path" -#~ msgstr "Platsen för Certfile är inte giltig, ange rätt sökväg" - -#~ msgid "Please enter a LDAP provider, port, DN and user object identifier" -#~ msgstr "" - -#~ msgid "Please enter a LDAP service account and password" -#~ msgstr "" - -#~ msgid "Please enter Github oauth credentials" -#~ msgstr "" - -#~ msgid "Please enter Google oauth credentials" -#~ msgstr "" - -#~ 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" - -#~ msgid "Access Logfile location is not valid, please enter correct path" -#~ msgstr "" - -#~ msgid "DB location is not valid, please enter correct path" -#~ msgstr "Platsen för DB är inte giltig, ange rätt sökväg" - -#~ msgid "Excecution permissions missing" -#~ msgstr "Utförande behörighet saknas" - -#~ msgid "not configured" -#~ msgstr "inte konfigurerad" - -#~ msgid "Error excecuting UnRar" -#~ msgstr "Fel vid körning av UnRar" - -#~ msgid "Unrar binary file not found" -#~ msgstr "Unrar binärfil hittades inte" - -#~ msgid "Use GitHub OAuth" -#~ msgstr "" - -#~ msgid "Use Google OAuth" -#~ msgstr "" - -#~ msgid "Obtain GitHub OAuth Credential" -#~ msgstr "" - -#~ msgid "GitHub OAuth Client Id" -#~ msgstr "" +#: cps/templates/user_edit.html:62 +msgid "Kobo Sync Token" +msgstr "" -#~ msgid "GitHub OAuth Client Secret" -#~ msgstr "" +#: cps/templates/user_edit.html:64 +msgid "Create/View" +msgstr "" -#~ msgid "Obtain Google OAuth Credential" -#~ msgstr "" +#: cps/templates/user_edit.html:83 +msgid "Add allowed/denied Tags" +msgstr "" -#~ msgid "Google OAuth Client Id" -#~ msgstr "" +#: cps/templates/user_edit.html:84 +msgid "Add allowed/denied custom column values" +msgstr "" -#~ msgid "Google OAuth Client Secret" -#~ msgstr "" +#: cps/templates/user_edit.html:129 +msgid "Delete User" +msgstr "Ta bort den här användaren" -#~ msgid "Use" -#~ msgstr "Använd" +#: cps/templates/user_edit.html:144 +msgid "Recent Downloads" +msgstr "Senaste hämtningar" -#~ msgid "Play / pause" -#~ msgstr "Spela / pausa" +#: cps/templates/user_edit.html:160 +msgid "Generate Kobo Auth URL" +msgstr "" -#~ msgid "volume" -#~ msgstr "volym" +#: cps/templates/user_edit.html:176 +msgid "Do you really want to delete the Kobo Token?" +msgstr "" -#~ msgid "unknown" -#~ msgstr "okänd" +#~ msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" +#~ msgstr "Omslaget är inte ett bildformat som stöds (jpg/png/webp), kan inte spara" -#~ msgid "New Books" -#~ msgstr "Nya böcker" diff --git a/cps/translations/uk/LC_MESSAGES/messages.mo b/cps/translations/uk/LC_MESSAGES/messages.mo index f141dc44..042dc5fd 100644 Binary files a/cps/translations/uk/LC_MESSAGES/messages.mo and b/cps/translations/uk/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/uk/LC_MESSAGES/messages.po b/cps/translations/uk/LC_MESSAGES/messages.po index f1f2bb94..71742d87 100644 --- a/cps/translations/uk/LC_MESSAGES/messages.po +++ b/cps/translations/uk/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: 2020-01-12 13:57+0100\n" +"POT-Creation-Date: 2020-03-12 20:31+0100\n" "PO-Revision-Date: 2017-04-30 00:47+0300\n" "Last-Translator: ABIS Team \n" "Language: uk\n" @@ -15,7 +15,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.7.0\n" +"Generated-By: Babel 2.8.0\n" #: cps/about.py:42 msgid "installed" @@ -25,7 +25,7 @@ msgstr "" msgid "not installed" msgstr "не встановлено" -#: cps/about.py:84 +#: cps/about.py:87 msgid "Statistics" msgstr "Статистика" @@ -39,7 +39,7 @@ msgstr "Виконується зупинка серверу, будь-ласк #: cps/admin.py:110 cps/editbooks.py:410 cps/editbooks.py:419 #: cps/editbooks.py:539 cps/editbooks.py:541 cps/editbooks.py:594 -#: cps/updater.py:446 cps/uploader.py:97 cps/uploader.py:108 +#: cps/updater.py:456 cps/uploader.py:96 cps/uploader.py:107 msgid "Unknown" msgstr "Невідомий" @@ -47,155 +47,164 @@ msgstr "Невідомий" msgid "Admin page" msgstr "Сторінка адміністратора" -#: cps/admin.py:148 cps/templates/admin.html:115 +#: cps/admin.py:151 msgid "UI Configuration" msgstr "Конфігурація інтерфейсу" -#: cps/admin.py:185 cps/admin.py:412 +#: cps/admin.py:187 cps/admin.py:637 msgid "Calibre-Web configuration updated" msgstr "" -#: cps/admin.py:442 cps/templates/admin.html:114 +#: cps/admin.py:434 cps/admin.py:440 cps/admin.py:451 cps/admin.py:462 +#: cps/templates/modal_restriction.html:29 +msgid "Deny" +msgstr "" + +#: cps/admin.py:436 cps/admin.py:442 cps/admin.py:453 cps/admin.py:464 +#: cps/templates/modal_restriction.html:28 +msgid "Allow" +msgstr "" + +#: cps/admin.py:667 msgid "Basic Configuration" msgstr "Настройки сервера" -#: cps/admin.py:465 cps/web.py:1093 +#: cps/admin.py:691 cps/web.py:1089 msgid "Please fill out all fields!" msgstr "Будь-ласка, заповніть всі поля!" -#: cps/admin.py:467 cps/admin.py:478 cps/admin.py:484 cps/admin.py:499 -#: cps/templates/admin.html:38 +#: cps/admin.py:694 cps/admin.py:706 cps/admin.py:712 cps/admin.py:730 msgid "Add new user" msgstr "Додати користувача" -#: cps/admin.py:476 cps/web.py:1318 +#: cps/admin.py:703 cps/web.py:1318 msgid "E-mail is not from valid domain" msgstr "" -#: cps/admin.py:482 cps/admin.py:493 +#: cps/admin.py:710 cps/admin.py:725 msgid "Found an existing account for this e-mail address or nickname." msgstr "" -#: cps/admin.py:489 +#: cps/admin.py:721 #, python-format msgid "User '%(user)s' created" msgstr "Користувач '%(user)s' додан" -#: cps/admin.py:509 +#: cps/admin.py:740 msgid "Edit e-mail server settings" msgstr "" -#: cps/admin.py:535 +#: cps/admin.py:766 #, python-format msgid "Test e-mail successfully send to %(kindlemail)s" msgstr "" -#: cps/admin.py:538 +#: cps/admin.py:769 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "" -#: cps/admin.py:540 +#: cps/admin.py:771 msgid "Please configure your e-mail address first..." msgstr "" -#: cps/admin.py:542 +#: cps/admin.py:773 msgid "E-mail server settings updated" msgstr "" -#: cps/admin.py:571 +#: cps/admin.py:803 #, python-format msgid "User '%(nick)s' deleted" msgstr "Користувача '%(nick)s' видалено" -#: cps/admin.py:574 +#: cps/admin.py:806 msgid "No admin user remaining, can't delete user" msgstr "" -#: cps/admin.py:612 cps/web.py:1359 +#: cps/admin.py:842 cps/web.py:1361 msgid "Found an existing account for this e-mail address." msgstr "" -#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1334 +#: cps/admin.py:852 cps/admin.py:867 cps/admin.py:887 cps/web.py:1336 #, python-format msgid "Edit User %(nick)s" msgstr "Змінити користувача %(nick)s" -#: cps/admin.py:622 cps/web.py:1327 +#: cps/admin.py:858 cps/web.py:1328 msgid "This username is already taken" msgstr "" -#: cps/admin.py:637 +#: cps/admin.py:874 #, python-format msgid "User '%(nick)s' updated" msgstr "Користувача '%(nick)s' оновлено" -#: cps/admin.py:640 +#: cps/admin.py:877 msgid "An unknown error occured." msgstr "Сталась невідома помилка" -#: cps/admin.py:657 +#: cps/admin.py:900 #, python-format msgid "Password for user %(user)s reset" msgstr "" -#: cps/admin.py:660 cps/web.py:1118 cps/web.py:1174 +#: cps/admin.py:903 cps/web.py:1114 cps/web.py:1170 msgid "An unknown error occurred. Please try again later." msgstr "" -#: cps/admin.py:663 cps/web.py:1062 +#: cps/admin.py:906 cps/web.py:1055 msgid "Please configure the SMTP mail settings first..." msgstr "Будь-ласка, спочатку сконфігуруйте параметри SMTP" -#: cps/admin.py:674 +#: cps/admin.py:918 msgid "Logfile viewer" msgstr "" -#: cps/admin.py:710 +#: cps/admin.py:957 msgid "Requesting update package" msgstr "Перевірка оновлень" -#: cps/admin.py:711 +#: cps/admin.py:958 msgid "Downloading update package" msgstr "Завантаження оновлень" -#: cps/admin.py:712 +#: cps/admin.py:959 msgid "Unzipping update package" msgstr "Розпакування оновлення" -#: cps/admin.py:713 +#: cps/admin.py:960 msgid "Replacing files" msgstr "" -#: cps/admin.py:714 +#: cps/admin.py:961 msgid "Database connections are closed" msgstr "З'єднання з базою даних закрите" -#: cps/admin.py:715 +#: cps/admin.py:962 msgid "Stopping server" msgstr "" -#: cps/admin.py:716 +#: cps/admin.py:963 msgid "Update finished, please press okay and reload page" msgstr "Оновлення встановлені, натисніть ok і перезавантажте сторінку" -#: cps/admin.py:717 cps/admin.py:718 cps/admin.py:719 cps/admin.py:720 +#: cps/admin.py:964 cps/admin.py:965 cps/admin.py:966 cps/admin.py:967 msgid "Update failed:" msgstr "" -#: cps/admin.py:717 cps/updater.py:272 cps/updater.py:457 cps/updater.py:459 +#: cps/admin.py:964 cps/updater.py:282 cps/updater.py:467 cps/updater.py:469 msgid "HTTP Error" msgstr "" -#: cps/admin.py:718 cps/updater.py:274 cps/updater.py:461 +#: cps/admin.py:965 cps/updater.py:284 cps/updater.py:471 msgid "Connection error" msgstr "" -#: cps/admin.py:719 cps/updater.py:276 cps/updater.py:463 +#: cps/admin.py:966 cps/updater.py:286 cps/updater.py:473 msgid "Timeout while establishing connection" msgstr "" -#: cps/admin.py:720 cps/updater.py:278 cps/updater.py:465 +#: cps/admin.py:967 cps/updater.py:288 cps/updater.py:475 msgid "General error" msgstr "" @@ -235,10 +244,6 @@ msgstr "" msgid "File format %(ext)s added to %(book)s" msgstr "" -#: cps/editbooks.py:376 -msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" -msgstr "" - #: cps/editbooks.py:451 msgid "Cover is not a jpg file, can't save" msgstr "" @@ -275,30 +280,30 @@ msgstr "" msgid "Failed to delete file %(file)s (Permission denied)." msgstr "" -#: cps/editbooks.py:710 +#: cps/editbooks.py:709 #, python-format msgid "File %(file)s uploaded" msgstr "" -#: cps/editbooks.py:739 +#: cps/editbooks.py:738 msgid "Source or destination format for conversion missing" msgstr "" -#: cps/editbooks.py:747 +#: cps/editbooks.py:746 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "" -#: cps/editbooks.py:751 +#: cps/editbooks.py:750 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "" -#: cps/gdrive.py:62 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgstr "" -#: cps/gdrive.py:104 +#: cps/gdrive.py:103 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Домен зворотнього зв'язку не підтверджено. Виконайте дії для підтвердження домену, будь-ласка" @@ -388,83 +393,111 @@ msgstr "" msgid "Book path %(path)s not found on Google Drive" msgstr "" -#: cps/helper.py:643 +#: cps/helper.py:511 +msgid "Failed to create path for cover" +msgstr "" + +#: cps/helper.py:516 +msgid "Cover-file is not a valid image file" +msgstr "" + +#: cps/helper.py:519 +msgid "Failed to store cover-file" +msgstr "" + +#: cps/helper.py:530 +msgid "Only jpg/jpeg/png/webp files are supported as coverfile" +msgstr "" + +#: cps/helper.py:544 +msgid "Only jpg/jpeg files are supported as coverfile" +msgstr "" + +#: cps/helper.py:658 msgid "Waiting" msgstr "" -#: cps/helper.py:645 +#: cps/helper.py:660 msgid "Failed" msgstr "" -#: cps/helper.py:647 +#: cps/helper.py:662 msgid "Started" msgstr "" -#: cps/helper.py:649 +#: cps/helper.py:664 msgid "Finished" msgstr "" -#: cps/helper.py:651 +#: cps/helper.py:666 msgid "Unknown Status" msgstr "" -#: cps/helper.py:656 +#: cps/helper.py:671 msgid "E-mail: " msgstr "" -#: cps/helper.py:658 cps/helper.py:662 +#: cps/helper.py:673 cps/helper.py:677 msgid "Convert: " msgstr "" -#: cps/helper.py:660 +#: cps/helper.py:675 msgid "Upload: " msgstr "" -#: cps/helper.py:664 +#: cps/helper.py:679 msgid "Unknown Task: " msgstr "" -#: cps/oauth_bb.py:75 +#: cps/kobo_auth.py:127 +msgid "PLease access calibre-web from non localhost to get valid api_endpoint for kobo device" +msgstr "" + +#: cps/kobo_auth.py:130 cps/kobo_auth.py:150 +msgid "Kobo Setup" +msgstr "" + +#: cps/oauth_bb.py:74 #, python-format msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:154 msgid "Failed to log in with GitHub." msgstr "" -#: cps/oauth_bb.py:160 +#: cps/oauth_bb.py:159 msgid "Failed to fetch user info from GitHub." msgstr "" -#: cps/oauth_bb.py:171 +#: cps/oauth_bb.py:170 msgid "Failed to log in with Google." msgstr "" -#: cps/oauth_bb.py:176 +#: cps/oauth_bb.py:175 msgid "Failed to fetch user info from Google." msgstr "" -#: cps/oauth_bb.py:274 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s success." msgstr "" -#: cps/oauth_bb.py:278 +#: cps/oauth_bb.py:277 #, python-format msgid "Unlink to %(oauth)s failed." msgstr "" -#: cps/oauth_bb.py:281 +#: cps/oauth_bb.py:280 #, python-format msgid "Not linked to %(oauth)s." msgstr "" -#: cps/oauth_bb.py:309 +#: cps/oauth_bb.py:308 msgid "GitHub Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:328 +#: cps/oauth_bb.py:327 msgid "Google Oauth error, please retry later." msgstr "" @@ -515,403 +548,393 @@ msgstr "" msgid "Could not add books to shelf: %(sname)s" msgstr "" -#: cps/shelf.py:180 +#: cps/shelf.py:181 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "Книга видалена з книжкової полиці: %(sname)s" -#: cps/shelf.py:186 +#: cps/shelf.py:190 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "Вибачте, але у вас немає дозволу для видалення книги з цієї полиці" -#: cps/shelf.py:207 cps/shelf.py:231 +#: cps/shelf.py:211 cps/shelf.py:235 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "Книжкова полиця з назвою '%(title)s' уже существует." -#: cps/shelf.py:212 +#: cps/shelf.py:216 #, python-format msgid "Shelf %(title)s created" msgstr "Створена книжкова полиця %(title)s" -#: cps/shelf.py:214 cps/shelf.py:242 +#: cps/shelf.py:218 cps/shelf.py:246 msgid "There was an error" msgstr "Сталась помилка" -#: cps/shelf.py:215 cps/shelf.py:217 +#: cps/shelf.py:219 cps/shelf.py:221 msgid "create a shelf" msgstr "створити книжкову полицю" -#: cps/shelf.py:240 +#: cps/shelf.py:244 #, python-format msgid "Shelf %(title)s changed" msgstr "Книжкова полиця %(title)s змінена" -#: cps/shelf.py:243 cps/shelf.py:245 +#: cps/shelf.py:247 cps/shelf.py:249 msgid "Edit a shelf" msgstr "Змінити книжкову полицю" -#: cps/shelf.py:289 +#: cps/shelf.py:301 #, python-format msgid "Shelf: '%(name)s'" msgstr "Книжкова полиця: '%(name)s'" -#: cps/shelf.py:292 +#: cps/shelf.py:304 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Помилка при відкриванні полиці. Полиця не існує або до неї відсутній доступ" -#: cps/shelf.py:323 +#: cps/shelf.py:342 +msgid "Hidden Book" +msgstr "" + +#: cps/shelf.py:347 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Змінити розташування книжкової полиці '%(name)s'" -#: cps/ub.py:57 +#: cps/ub.py:56 msgid "Recently Added" msgstr "Останні додані" -#: cps/ub.py:59 +#: cps/ub.py:58 msgid "Show recent books" msgstr "Показувати останні книги" -#: cps/templates/index.xml:17 cps/ub.py:60 +#: cps/templates/index.xml:17 cps/ub.py:59 msgid "Hot Books" msgstr "Популярні книги" -#: cps/ub.py:61 -msgid "Show hot books" +#: cps/ub.py:60 +msgid "Show Hot Books" msgstr "Показувати популярні книги" -#: cps/templates/index.xml:24 cps/ub.py:64 -msgid "Best rated Books" +#: cps/templates/index.xml:24 cps/ub.py:63 cps/web.py:508 +msgid "Top Rated Books" msgstr "Книги з найкращим рейтингом" -#: cps/ub.py:66 -msgid "Show best rated books" +#: cps/ub.py:65 +msgid "Show Top Rated Books" msgstr "Показувати книги з найвищим рейтингом" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67 -#: cps/web.py:1011 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:66 +#: cps/web.py:1005 msgid "Read Books" msgstr "Прочитані книги" -#: cps/ub.py:69 +#: cps/ub.py:68 msgid "Show read and unread" msgstr "Показувати прочитані та непрочитані книги" -#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71 -#: cps/web.py:1015 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:70 +#: cps/web.py:1009 msgid "Unread Books" msgstr "Непрочитані книги" -#: cps/ub.py:73 +#: cps/ub.py:72 msgid "Show unread" msgstr "" -#: cps/ub.py:74 +#: cps/ub.py:73 msgid "Discover" msgstr "Огляд" -#: cps/ub.py:76 +#: cps/ub.py:75 msgid "Show random books" msgstr "Показувати випадкові книги" -#: cps/templates/index.xml:75 cps/ub.py:77 +#: cps/templates/index.xml:75 cps/ub.py:76 cps/web.py:787 msgid "Categories" msgstr "Категорії" -#: cps/ub.py:79 +#: cps/ub.py:78 msgid "Show category selection" msgstr "Показувати вибір категорії" -#: cps/templates/book_edit.html:71 cps/templates/index.xml:82 -#: cps/templates/search_form.html:53 cps/ub.py:80 +#: cps/templates/book_edit.html:69 cps/templates/index.xml:82 +#: cps/templates/search_form.html:53 cps/ub.py:79 cps/web.py:715 msgid "Series" msgstr "Серії" -#: cps/ub.py:82 +#: cps/ub.py:81 msgid "Show series selection" msgstr "Показувати вибір серії" -#: cps/templates/index.xml:61 cps/ub.py:83 +#: cps/templates/index.xml:61 cps/ub.py:82 msgid "Authors" msgstr "Автори" -#: cps/ub.py:85 +#: cps/ub.py:84 msgid "Show author selection" msgstr "Показувати вибір автора" -#: cps/templates/index.xml:68 cps/ub.py:87 +#: cps/templates/index.xml:68 cps/ub.py:86 cps/web.py:699 msgid "Publishers" msgstr "" -#: cps/ub.py:89 +#: cps/ub.py:88 msgid "Show publisher selection" msgstr "" -#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:90 +#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:89 +#: cps/web.py:770 msgid "Languages" msgstr "Мови" -#: cps/ub.py:93 +#: cps/ub.py:92 msgid "Show language selection" msgstr "Показувати вибір мови" -#: cps/ub.py:94 +#: cps/templates/index.xml:96 cps/ub.py:93 msgid "Ratings" msgstr "" -#: cps/ub.py:96 +#: cps/ub.py:95 msgid "Show ratings selection" msgstr "" -#: cps/templates/index.xml:96 cps/ub.py:97 +#: cps/templates/index.xml:104 cps/ub.py:96 msgid "File formats" msgstr "" -#: cps/ub.py:99 +#: cps/ub.py:98 msgid "Show file formats selection" msgstr "" -#: cps/updater.py:252 cps/updater.py:359 cps/updater.py:372 +#: cps/updater.py:262 cps/updater.py:369 cps/updater.py:382 msgid "Unexpected data while reading update information" msgstr "" -#: cps/updater.py:259 cps/updater.py:365 +#: cps/updater.py:269 cps/updater.py:375 msgid "No update available. You already have the latest version installed" msgstr "" -#: cps/updater.py:285 +#: cps/updater.py:295 msgid "A new update is available. Click on the button below to update to the latest version." msgstr "" -#: cps/updater.py:338 +#: cps/updater.py:348 msgid "Could not fetch update information" msgstr "" -#: cps/updater.py:352 +#: cps/updater.py:362 msgid "No release information available" msgstr "" -#: cps/updater.py:405 cps/updater.py:414 +#: cps/updater.py:415 cps/updater.py:424 #, python-format msgid "A new update is available. Click on the button below to update to version: %(version)s" msgstr "" -#: cps/updater.py:424 +#: cps/updater.py:434 msgid "Click on the button below to update to the latest stable version." msgstr "" -#: cps/web.py:486 +#: cps/web.py:480 msgid "Recently Added Books" msgstr "Нещодавно додані книги" -#: cps/web.py:514 -msgid "Best rated books" -msgstr "Книги з найкращим рейтингом" - -#: cps/templates/index.xml:38 cps/web.py:522 -msgid "Random Books" -msgstr "Випадковий список книг" +#: cps/templates/index.html:5 cps/web.py:516 +msgid "Discover (Random Books)" +msgstr "Огляд (випадкові книги)" -#: cps/web.py:548 +#: cps/web.py:542 msgid "Books" msgstr "" -#: cps/web.py:575 -msgid "Hot Books (most downloaded)" +#: cps/web.py:569 +msgid "Hot Books (Most Downloaded)" msgstr "Популярні книги (найбільш завантажувані)" -#: cps/web.py:586 cps/web.py:1382 cps/web.py:1478 -msgid "Error opening eBook. File does not exist or file is not accessible:" +#: cps/web.py:580 +msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Неможливо відкрити книгу. Файл не існує або немає доступу." -#: cps/web.py:599 +#: cps/web.py:593 #, python-format msgid "Author: %(name)s" msgstr "" -#: cps/web.py:611 +#: cps/web.py:605 #, python-format msgid "Publisher: %(name)s" msgstr "" -#: cps/web.py:622 +#: cps/web.py:616 #, python-format msgid "Series: %(serie)s" msgstr "Серії: %(serie)s" -#: cps/web.py:633 +#: cps/web.py:627 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:644 +#: cps/web.py:638 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:656 +#: cps/web.py:650 #, python-format msgid "Category: %(name)s" msgstr "Категорія: %(name)s" -#: cps/web.py:673 +#: cps/web.py:667 #, python-format msgid "Language: %(name)s" msgstr "Мова: %(name)s" -#: cps/web.py:705 -msgid "Publisher list" -msgstr "" - -#: cps/web.py:721 -msgid "Series list" -msgstr "Список серій" - -#: cps/web.py:735 +#: cps/web.py:729 msgid "Ratings list" msgstr "" -#: cps/web.py:748 +#: cps/web.py:742 msgid "File formats list" msgstr "" -#: cps/web.py:776 -msgid "Available languages" -msgstr "Доступні мови" - -#: cps/web.py:793 -msgid "Category list" -msgstr "Список категорій" - -#: cps/templates/layout.html:73 cps/web.py:807 +#: cps/templates/layout.html:73 cps/templates/tasks.html:7 cps/web.py:801 msgid "Tasks" msgstr "" -#: cps/templates/feed.xml:33 cps/templates/layout.html:44 -#: cps/templates/layout.html:45 cps/web.py:829 cps/web.py:831 +#: cps/templates/book_edit.html:212 cps/templates/feed.xml:33 +#: cps/templates/layout.html:44 cps/templates/layout.html:47 +#: cps/templates/search_form.html:170 cps/web.py:821 cps/web.py:823 msgid "Search" msgstr "Пошук" -#: cps/web.py:881 +#: cps/web.py:873 msgid "Published after " msgstr "" -#: cps/web.py:888 +#: cps/web.py:880 msgid "Published before " msgstr "Опубліковано до" -#: cps/web.py:902 +#: cps/web.py:894 #, python-format msgid "Rating <= %(rating)s" msgstr "" -#: cps/web.py:904 +#: cps/web.py:896 #, python-format msgid "Rating >= %(rating)s" msgstr "" -#: cps/web.py:970 cps/web.py:982 +#: cps/web.py:962 cps/web.py:976 msgid "search" msgstr "пошук" -#: cps/web.py:1067 +#: cps/web.py:1060 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "" -#: cps/web.py:1071 +#: cps/web.py:1064 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "Помилка при відправці книги: %(res)s" -#: cps/web.py:1073 +#: cps/web.py:1066 msgid "Please configure your kindle e-mail address first..." msgstr "" -#: cps/web.py:1087 +#: cps/web.py:1083 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "" -#: cps/web.py:1088 cps/web.py:1094 cps/web.py:1119 cps/web.py:1123 -#: cps/web.py:1128 cps/web.py:1132 +#: cps/web.py:1084 cps/web.py:1090 cps/web.py:1115 cps/web.py:1119 +#: cps/web.py:1124 cps/web.py:1128 msgid "register" msgstr "зареєструватись" -#: cps/web.py:1121 +#: cps/web.py:1117 msgid "Your e-mail is not allowed to register" msgstr "" -#: cps/web.py:1124 +#: cps/web.py:1120 msgid "Confirmation e-mail was send to your e-mail account." msgstr "" -#: cps/web.py:1127 +#: cps/web.py:1123 msgid "This username or e-mail address is already in use." msgstr "" -#: cps/web.py:1144 +#: cps/web.py:1140 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1154 cps/web.py:1281 +#: cps/web.py:1150 cps/web.py:1277 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "Ви увійшли як користувач: '%(nickname)s'" -#: cps/web.py:1159 +#: cps/web.py:1155 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "" -#: cps/web.py:1163 cps/web.py:1186 +#: cps/web.py:1159 cps/web.py:1182 msgid "Wrong Username or Password" msgstr "Помилка в імені користувача або паролі" -#: cps/web.py:1170 +#: cps/web.py:1166 msgid "New Password was send to your email address" msgstr "" -#: cps/web.py:1176 +#: cps/web.py:1172 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1182 +#: cps/web.py:1178 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1189 cps/web.py:1213 +#: cps/web.py:1185 cps/web.py:1209 msgid "login" msgstr "увійти" -#: cps/web.py:1225 cps/web.py:1259 +#: cps/web.py:1221 cps/web.py:1255 msgid "Token not found" msgstr "Токен не знайдено" -#: cps/web.py:1234 cps/web.py:1267 +#: cps/web.py:1230 cps/web.py:1263 msgid "Token has expired" msgstr "Час дії токено вичерпано" -#: cps/web.py:1243 +#: cps/web.py:1239 msgid "Success! Please return to your device" msgstr "Вдалося! Будь-ласка, поверніться до вашого пристрою" -#: cps/web.py:1320 cps/web.py:1363 cps/web.py:1369 +#: cps/web.py:1320 cps/web.py:1365 cps/web.py:1371 #, python-format msgid "%(name)s's profile" msgstr "Профіль %(name)s" -#: cps/web.py:1365 +#: cps/web.py:1367 msgid "Profile updated" msgstr "Профіль оновлено" -#: cps/web.py:1394 cps/web.py:1397 cps/web.py:1400 cps/web.py:1407 -#: cps/web.py:1412 +#: cps/web.py:1384 cps/web.py:1480 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "" + +#: cps/web.py:1396 cps/web.py:1399 cps/web.py:1402 cps/web.py:1409 +#: cps/web.py:1414 msgid "Read a Book" msgstr "Читати книгу" -#: cps/web.py:1423 +#: cps/web.py:1425 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "" @@ -926,23 +949,26 @@ msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Kindlegen відхилено з помилкою %(error)s. Повідомлення: %(message)s " #: cps/templates/admin.html:9 -msgid "User list" +msgid "Users" msgstr "Список користувачів" -#: cps/templates/admin.html:12 -msgid "Nickname" +#: cps/templates/admin.html:12 cps/templates/login.html:8 +#: cps/templates/login.html:9 cps/templates/register.html:7 +#: cps/templates/user_edit.html:8 +msgid "Username" msgstr "Ім'я користувача" -#: cps/templates/admin.html:13 -msgid "E-mail" +#: cps/templates/admin.html:13 cps/templates/register.html:11 +#: cps/templates/user_edit.html:13 +msgid "E-mail Address" msgstr "" -#: cps/templates/admin.html:14 -msgid "Kindle" +#: cps/templates/admin.html:14 cps/templates/user_edit.html:26 +msgid "Send to Kindle E-mail Address" msgstr "Kindle" #: cps/templates/admin.html:15 -msgid "DLS" +msgid "Downloads" msgstr "DLS" #: cps/templates/admin.html:16 cps/templates/layout.html:76 @@ -956,7 +982,7 @@ msgid "Download" msgstr "Завантажити" #: cps/templates/admin.html:18 -msgid "View Ebooks" +msgid "View eBooks" msgstr "" #: cps/templates/admin.html:19 cps/templates/layout.html:65 @@ -967,28 +993,32 @@ msgstr "Додати нову книгу" msgid "Edit" msgstr "Редагувати" +#: cps/templates/admin.html:38 +msgid "Add New User" +msgstr "" + #: cps/templates/admin.html:44 -msgid "SMTP e-mail server settings" +msgid "E-mail Server Settings" msgstr "" #: cps/templates/admin.html:47 cps/templates/email_edit.html:11 -msgid "SMTP hostname" +msgid "SMTP Hostname" msgstr "SMTP-сервер" -#: cps/templates/admin.html:48 -msgid "SMTP port" +#: cps/templates/admin.html:48 cps/templates/email_edit.html:15 +msgid "SMTP Port" msgstr "SMTP-порт" -#: cps/templates/admin.html:49 -msgid "SSL" +#: cps/templates/admin.html:49 cps/templates/email_edit.html:19 +msgid "Encryption" msgstr "SSL" #: cps/templates/admin.html:50 cps/templates/email_edit.html:27 -msgid "SMTP login" +msgid "SMTP Login" msgstr "SMTP логін" -#: cps/templates/admin.html:51 -msgid "From mail" +#: cps/templates/admin.html:51 cps/templates/email_edit.html:35 +msgid "From E-mail" msgstr "Відправник" #: cps/templates/admin.html:61 @@ -1000,63 +1030,71 @@ msgid "Configuration" msgstr "Налаштування сервера" #: cps/templates/admin.html:70 -msgid "Calibre DB dir" +msgid "Calibre Database Directory" msgstr "Папка Calibre DB" -#: cps/templates/admin.html:74 -msgid "Log level" +#: cps/templates/admin.html:74 cps/templates/config_edit.html:122 +msgid "Log Level" msgstr "" #: cps/templates/admin.html:78 msgid "Port" msgstr "Порт" -#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:23 -msgid "Books per page" +#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:27 +msgid "Books per Page" msgstr "Кількість книг на сторінці" #: cps/templates/admin.html:88 -msgid "Uploading" +msgid "Uploads" msgstr "Загрузка на сервер" #: cps/templates/admin.html:92 -msgid "Anonymous browsing" +msgid "Anonymous Browsing" msgstr "Анонімний перегляд" #: cps/templates/admin.html:96 -msgid "Public registration" +msgid "Public Registration" msgstr "Публічна реєстрація" -#: cps/templates/admin.html:100 cps/templates/remote_login.html:4 -msgid "Remote login" +#: cps/templates/admin.html:100 +msgid "Magic Link Remote Login" msgstr "" #: cps/templates/admin.html:104 -msgid "Reverse proxy login" +msgid "Reverse Proxy Login" msgstr "" #: cps/templates/admin.html:109 msgid "Reverse proxy header name" msgstr "" +#: cps/templates/admin.html:114 +msgid "Edit Basic Configuration" +msgstr "" + +#: cps/templates/admin.html:115 +msgid "Edit UI Configuration" +msgstr "" + #: cps/templates/admin.html:121 msgid "Administration" msgstr "Адміністрування" #: cps/templates/admin.html:122 -msgid "View Logfiles" +msgid "View Logs" msgstr "" #: cps/templates/admin.html:123 -msgid "Reconnect to Calibre DB" +msgid "Reconnect Calibre Database" msgstr "Повторне підключення до БД Calibre" #: cps/templates/admin.html:124 -msgid "Restart Calibre-Web" +msgid "Restart" msgstr "" #: cps/templates/admin.html:125 -msgid "Stop Calibre-Web" +msgid "Shutdown" msgstr "" #: cps/templates/admin.html:131 @@ -1076,7 +1114,7 @@ msgid "Current version" msgstr "" #: cps/templates/admin.html:148 -msgid "Check for update" +msgid "Check for Update" msgstr "Перевірка оновлень" #: cps/templates/admin.html:149 @@ -1084,30 +1122,29 @@ msgid "Perform Update" msgstr "Встановити оновлення" #: cps/templates/admin.html:161 -msgid "Do you really want to restart Calibre-Web?" +msgid "Are you sure you want to restart?" msgstr "" #: cps/templates/admin.html:166 cps/templates/admin.html:180 #: cps/templates/admin.html:200 cps/templates/shelf.html:72 -msgid "Ok" +msgid "OK" msgstr "Ok" #: cps/templates/admin.html:167 cps/templates/admin.html:181 -#: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 +#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:194 +#: cps/templates/config_edit.html:346 cps/templates/config_view_edit.html:151 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92 -#: cps/templates/layout.html:28 cps/templates/shelf.html:73 -#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32 -#: cps/templates/user_edit.html:131 -msgid "Back" -msgstr "Назад" +#: cps/templates/shelf.html:73 cps/templates/shelf_edit.html:19 +#: cps/templates/user_edit.html:137 +msgid "Cancel" +msgstr "" #: cps/templates/admin.html:179 -msgid "Do you really want to stop Calibre-Web?" +msgid "Are you sure you want to shutdown?" msgstr "" #: cps/templates/admin.html:191 -msgid "Updating, please do not reload page" +msgid "Updating, please do not reload this page" msgstr "Встановлення оновлень, будь-ласка, не оновлюйте сторінку" #: cps/templates/author.html:15 @@ -1134,161 +1171,159 @@ msgstr "" msgid "More by" msgstr "Більше за" -#: cps/templates/book_edit.html:12 +#: cps/templates/book_edit.html:10 msgid "Delete Book" msgstr "Видалити книгу" -#: cps/templates/book_edit.html:15 +#: cps/templates/book_edit.html:13 msgid "Delete formats:" msgstr "" -#: cps/templates/book_edit.html:18 cps/templates/book_edit.html:195 -#: cps/templates/email_edit.html:91 +#: cps/templates/book_edit.html:16 cps/templates/book_edit.html:193 +#: cps/templates/email_edit.html:91 cps/templates/user_edit.html:65 +#: cps/templates/user_edit.html:177 msgid "Delete" msgstr "Видалити" -#: cps/templates/book_edit.html:26 +#: cps/templates/book_edit.html:24 msgid "Convert book format:" msgstr "" -#: cps/templates/book_edit.html:30 +#: cps/templates/book_edit.html:28 msgid "Convert from:" msgstr "" -#: cps/templates/book_edit.html:32 cps/templates/book_edit.html:39 +#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:37 msgid "select an option" msgstr "" -#: cps/templates/book_edit.html:37 +#: cps/templates/book_edit.html:35 msgid "Convert to:" msgstr "" -#: cps/templates/book_edit.html:46 +#: cps/templates/book_edit.html:44 msgid "Convert book" msgstr "" -#: cps/templates/book_edit.html:55 cps/templates/search_form.html:6 +#: cps/templates/book_edit.html:53 cps/templates/search_form.html:6 msgid "Book Title" msgstr "Назва книги" -#: cps/templates/book_edit.html:59 cps/templates/book_edit.html:255 -#: cps/templates/book_edit.html:273 cps/templates/search_form.html:10 +#: cps/templates/book_edit.html:57 cps/templates/book_edit.html:256 +#: cps/templates/book_edit.html:274 cps/templates/search_form.html:10 msgid "Author" msgstr "Автор" -#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:260 -#: cps/templates/book_edit.html:275 cps/templates/search_form.html:126 +#: cps/templates/book_edit.html:61 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:276 cps/templates/search_form.html:126 msgid "Description" msgstr "Опис" -#: cps/templates/book_edit.html:67 cps/templates/search_form.html:33 +#: cps/templates/book_edit.html:65 cps/templates/search_form.html:33 msgid "Tags" msgstr "Теги" -#: cps/templates/book_edit.html:75 -msgid "Series id" -msgstr "Серія" +#: cps/templates/book_edit.html:73 +msgid "Series ID" +msgstr "" -#: cps/templates/book_edit.html:79 +#: cps/templates/book_edit.html:77 msgid "Rating" msgstr "Рейтинг" -#: cps/templates/book_edit.html:83 -msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +#: cps/templates/book_edit.html:81 +msgid "Fetch Cover from URL (JPEG - Image will be downloaded and stored in database)" msgstr "" -#: cps/templates/book_edit.html:87 -msgid "Upload Cover from local drive" +#: cps/templates/book_edit.html:85 +msgid "Upload Cover from Local Disk" msgstr "" -#: cps/templates/book_edit.html:92 cps/templates/detail.html:165 -msgid "Publishing date" +#: cps/templates/book_edit.html:90 +msgid "Published Date" msgstr "Опубліковано" -#: cps/templates/book_edit.html:99 cps/templates/book_edit.html:257 -#: cps/templates/book_edit.html:274 cps/templates/detail.html:156 +#: cps/templates/book_edit.html:97 cps/templates/book_edit.html:258 +#: cps/templates/book_edit.html:275 cps/templates/detail.html:156 #: cps/templates/search_form.html:14 msgid "Publisher" msgstr "Видавець" -#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:30 +#: cps/templates/book_edit.html:101 cps/templates/detail.html:123 +#: cps/templates/user_edit.html:31 msgid "Language" msgstr "Мова" -#: cps/templates/book_edit.html:113 cps/templates/search_form.html:137 +#: cps/templates/book_edit.html:111 cps/templates/search_form.html:137 msgid "Yes" msgstr "Так" -#: cps/templates/book_edit.html:114 cps/templates/search_form.html:138 +#: cps/templates/book_edit.html:112 cps/templates/search_form.html:138 msgid "No" msgstr "Ні" -#: cps/templates/book_edit.html:160 -msgid "Upload format" +#: cps/templates/book_edit.html:158 +msgid "Upload Format" msgstr "Формат завантаження" -#: cps/templates/book_edit.html:169 -msgid "view book after edit" +#: cps/templates/book_edit.html:167 +msgid "View Book on Save" msgstr "переглянути книгу після редагування" -#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:208 -msgid "Get metadata" +#: cps/templates/book_edit.html:170 cps/templates/book_edit.html:206 +msgid "Fetch Metadata" msgstr "Отримати метадані" -#: 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:170 cps/templates/shelf_edit.html:17 -#: cps/templates/user_edit.html:129 -msgid "Submit" -msgstr "Зберегти" +#: cps/templates/book_edit.html:171 cps/templates/config_edit.html:343 +#: cps/templates/config_view_edit.html:150 cps/templates/email_edit.html:38 +#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:135 +msgid "Save" +msgstr "" -#: cps/templates/book_edit.html:187 +#: cps/templates/book_edit.html:185 msgid "Are you really sure?" msgstr "" -#: cps/templates/book_edit.html:190 -msgid "Book will be deleted from Calibre database" +#: cps/templates/book_edit.html:188 +msgid "This book will be permanently erased from database" msgstr "Книга буде видалена з БД Calibre" -#: cps/templates/book_edit.html:191 -msgid "and from hard disk" +#: cps/templates/book_edit.html:189 +msgid "and hard disk" msgstr "і з диску" -#: cps/templates/book_edit.html:211 +#: cps/templates/book_edit.html:209 msgid "Keyword" msgstr "Ключове слово" -#: cps/templates/book_edit.html:212 +#: cps/templates/book_edit.html:210 msgid " Search keyword " msgstr " Пошук по ключовому слову" -#: cps/templates/book_edit.html:214 cps/templates/layout.html:47 -msgid "Go!" -msgstr "Шукати" - -#: cps/templates/book_edit.html:218 +#: cps/templates/book_edit.html:216 msgid "Click the cover to load metadata to the form" msgstr "Натисніть на обкладинку, щоб отримати метадані" -#: cps/templates/book_edit.html:230 cps/templates/book_edit.html:270 +#: cps/templates/book_edit.html:231 cps/templates/book_edit.html:271 msgid "Loading..." msgstr "Завантаження..." -#: cps/templates/book_edit.html:235 cps/templates/layout.html:192 -#: cps/templates/layout.html:224 +#: cps/templates/book_edit.html:236 cps/templates/layout.html:191 +#: cps/templates/layout.html:223 cps/templates/modal_restriction.html:34 +#: cps/templates/user_edit.html:164 msgid "Close" msgstr "Закрити" -#: cps/templates/book_edit.html:262 cps/templates/book_edit.html:276 +#: cps/templates/book_edit.html:263 cps/templates/book_edit.html:277 msgid "Source" msgstr "Джерело" -#: cps/templates/book_edit.html:271 +#: cps/templates/book_edit.html:272 msgid "Search error!" msgstr "Помилка пошуку!" -#: cps/templates/book_edit.html:272 -msgid "No Result(s) found! Please try aonther keyword." +#: cps/templates/book_edit.html:273 +msgid "No Result(s) found! Please try another keyword." msgstr "" #: cps/templates/config_edit.html:12 @@ -1296,7 +1331,7 @@ msgid "Library Configuration" msgstr "Налаштування бібліотеки" #: cps/templates/config_edit.html:19 -msgid "Location of Calibre database" +msgid "Location of Calibre Database" msgstr "Розташування БД Calibre" #: cps/templates/config_edit.html:25 @@ -1348,7 +1383,7 @@ msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "Розташування ключових слів SSL (залиште його порожнім для серверів, які не використовують SSL)" #: cps/templates/config_edit.html:99 -msgid "Update channel" +msgid "Update Channel" msgstr "" #: cps/templates/config_edit.html:101 @@ -1371,10 +1406,6 @@ msgstr "" msgid "Logfile Configuration" msgstr "Logfile налаштування" -#: cps/templates/config_edit.html:122 -msgid "Log Level" -msgstr "Рівень логовання" - #: cps/templates/config_edit.html:131 msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "Розташування і назва логфайлу (calibre-web.log for no entry)" @@ -1392,255 +1423,271 @@ msgid "Feature Configuration" msgstr "Особливі налаштування" #: cps/templates/config_edit.html:158 -msgid "Enable uploading" +msgid "Enable Uploads" msgstr "Дозволити завантаження книг на сервер" #: cps/templates/config_edit.html:162 -msgid "Enable anonymous browsing" +msgid "Enable Anonymous Browsing" msgstr "Дозволити анонімний перегляд" #: cps/templates/config_edit.html:166 -msgid "Enable public registration" +msgid "Enable Public Registration" msgstr "Дозволити публічну реєстрацію" #: cps/templates/config_edit.html:170 -msgid "Enable remote login (\"magic link\")" +msgid "Enable Magic Link Remote Login" msgstr "Включити віддалений логін (\"magic link\")" #: cps/templates/config_edit.html:175 +msgid "Enable Kobo sync" +msgstr "" + +#: cps/templates/config_edit.html:180 +msgid "Proxy unknown requests to Kobo Store" +msgstr "" + +#: cps/templates/config_edit.html:187 msgid "Use Goodreads" msgstr "" -#: cps/templates/config_edit.html:176 -msgid "Obtain an API Key" +#: cps/templates/config_edit.html:188 +msgid "Create an API Key" msgstr "Отримати ключ API" -#: cps/templates/config_edit.html:180 +#: cps/templates/config_edit.html:192 msgid "Goodreads API Key" msgstr "" -#: cps/templates/config_edit.html:184 +#: cps/templates/config_edit.html:196 msgid "Goodreads API Secret" msgstr "" -#: cps/templates/config_edit.html:191 +#: cps/templates/config_edit.html:203 msgid "Login type" msgstr "" -#: cps/templates/config_edit.html:193 -msgid "Use standard Authentication" +#: cps/templates/config_edit.html:205 +msgid "Use Standard Authentication" msgstr "" -#: cps/templates/config_edit.html:195 +#: cps/templates/config_edit.html:207 msgid "Use LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:198 +#: cps/templates/config_edit.html:210 msgid "Use OAuth" msgstr "" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:217 msgid "LDAP Server Host Name or IP Address" msgstr "" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:221 msgid "LDAP Server Port" msgstr "" -#: cps/templates/config_edit.html:213 -msgid "LDAP schema (ldap or ldaps)" +#: cps/templates/config_edit.html:225 +msgid "LDAP Schema (LDAP or LPAPS)" msgstr "" -#: cps/templates/config_edit.html:217 -msgid "LDAP Admin username" +#: cps/templates/config_edit.html:229 +msgid "LDAP Administrator Username" msgstr "" -#: cps/templates/config_edit.html:221 -msgid "LDAP Admin password" +#: cps/templates/config_edit.html:233 +msgid "LDAP Administrator Password" msgstr "" -#: cps/templates/config_edit.html:226 -msgid "LDAP Server use SSL" +#: cps/templates/config_edit.html:238 +msgid "LDAP Server Enable SSL" msgstr "" -#: cps/templates/config_edit.html:230 -msgid "LDAP Server use TLS" +#: cps/templates/config_edit.html:242 +msgid "LDAP Server Enable TLS" msgstr "" -#: cps/templates/config_edit.html:234 +#: cps/templates/config_edit.html:246 msgid "LDAP Server Certificate" msgstr "" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:250 msgid "LDAP SSL Certificate Path" msgstr "" -#: cps/templates/config_edit.html:243 +#: cps/templates/config_edit.html:255 msgid "LDAP Distinguished Name (DN)" msgstr "" -#: cps/templates/config_edit.html:247 -msgid "LDAP User object filter" +#: cps/templates/config_edit.html:259 +msgid "LDAP User Object Filter" msgstr "" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:264 msgid "LDAP Server is OpenLDAP?" msgstr "" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:272 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:263 +#: cps/templates/config_edit.html:275 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:279 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:276 +#: cps/templates/config_edit.html:288 msgid "Allow Reverse Proxy Authentication" msgstr "" -#: cps/templates/config_edit.html:280 +#: cps/templates/config_edit.html:292 msgid "Reverse Proxy Header Name" msgstr "" -#: cps/templates/config_edit.html:292 +#: cps/templates/config_edit.html:304 msgid "External binaries" msgstr "" -#: cps/templates/config_edit.html:300 -msgid "No converter" +#: cps/templates/config_edit.html:312 +msgid "No Converter" msgstr "" -#: cps/templates/config_edit.html:302 +#: cps/templates/config_edit.html:314 msgid "Use Kindlegen" msgstr "" -#: cps/templates/config_edit.html:304 +#: cps/templates/config_edit.html:316 msgid "Use calibre's ebook converter" msgstr "" -#: cps/templates/config_edit.html:308 +#: cps/templates/config_edit.html:320 msgid "E-Book converter settings" msgstr "" -#: cps/templates/config_edit.html:312 +#: cps/templates/config_edit.html:324 msgid "Path to convertertool" msgstr "" -#: cps/templates/config_edit.html:318 +#: cps/templates/config_edit.html:330 msgid "Location of Unrar binary" msgstr "" -#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 -#: cps/templates/login.html:4 +#: cps/templates/config_edit.html:349 cps/templates/layout.html:84 +#: cps/templates/login.html:4 cps/templates/login.html:20 msgid "Login" msgstr "Ім'я користувача" -#: cps/templates/config_view_edit.html:12 +#: cps/templates/config_view_edit.html:16 msgid "View Configuration" msgstr "Переглянути налаштування" -#: cps/templates/config_view_edit.html:19 cps/templates/shelf_edit.html:7 +#: cps/templates/config_view_edit.html:23 cps/templates/shelf_edit.html:7 msgid "Title" msgstr "Заголовок" -#: cps/templates/config_view_edit.html:27 -msgid "No. of random books to show" +#: cps/templates/config_view_edit.html:31 +msgid "No. of Random Books to Display" msgstr "Кількість показаних випадкових книг" -#: cps/templates/config_view_edit.html:31 -msgid "No. of authors to show before hiding (0=disable hiding)" +#: cps/templates/config_view_edit.html:35 +msgid "No. of Authors to Display Before Hiding (0=Disable Hiding)" msgstr "" -#: cps/templates/config_view_edit.html:35 cps/templates/readcbr.html:112 +#: cps/templates/config_view_edit.html:39 cps/templates/readcbr.html:112 msgid "Theme" msgstr "Тема" -#: cps/templates/config_view_edit.html:37 +#: cps/templates/config_view_edit.html:41 msgid "Standard Theme" msgstr "Стандартна тема" -#: cps/templates/config_view_edit.html:38 +#: cps/templates/config_view_edit.html:42 msgid "caliBlur! Dark Theme" msgstr "" -#: cps/templates/config_view_edit.html:42 -msgid "Regular expression for ignoring columns" +#: cps/templates/config_view_edit.html:46 +msgid "Regular Expression for Ignoring Columns" msgstr "Regexp для ігнорування стовпців" -#: cps/templates/config_view_edit.html:46 -msgid "Link read/unread status to Calibre column" +#: cps/templates/config_view_edit.html:50 +msgid "Link Read/Unread Status to Calibre Column" msgstr "" -#: cps/templates/config_view_edit.html:55 -msgid "Regular expression for title sorting" -msgstr "Regexp для сортування по назві" - #: cps/templates/config_view_edit.html:59 -msgid "Tags for Mature Content" +msgid "View Restrictions based on Calibre column" msgstr "" -#: cps/templates/config_view_edit.html:73 -msgid "Default settings for new users" +#: cps/templates/config_view_edit.html:61 cps/templates/email_edit.html:21 +msgid "None" +msgstr "Ні" + +#: cps/templates/config_view_edit.html:68 +msgid "Regular Expression for Title Sorting" +msgstr "Regexp для сортування по назві" + +#: cps/templates/config_view_edit.html:80 +msgid "Default Settings for New Users" msgstr "Налаштування по замовчуванню для нових користувачів" -#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:82 -msgid "Admin user" +#: cps/templates/config_view_edit.html:88 cps/templates/user_edit.html:92 +msgid "Admin User" msgstr "Керування сервером" -#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:91 +#: cps/templates/config_view_edit.html:92 cps/templates/user_edit.html:97 msgid "Allow Downloads" msgstr "Дозволити завантажувати з сервера" -#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:95 -msgid "Allow book viewer" +#: cps/templates/config_view_edit.html:96 cps/templates/user_edit.html:101 +msgid "Allow eBook Viewer" msgstr "" -#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:99 +#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:105 msgid "Allow Uploads" msgstr "Дозволити завантаження на сервер" -#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:103 +#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:109 msgid "Allow Edit" msgstr "Дозволити редагування книг" -#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 -msgid "Allow Delete books" -msgstr "Дозволити видалення книг" +#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:113 +msgid "Allow Delete Books" +msgstr "" -#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:112 +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:118 msgid "Allow Changing Password" msgstr "Дозволити зміну пароля" -#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:116 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:122 msgid "Allow Editing Public Shelfs" msgstr "Дозволити редагування публічних книжкових полиць" -#: cps/templates/config_view_edit.html:119 -msgid "Default visibilities for new users" +#: cps/templates/config_view_edit.html:126 +msgid "Default Visibilities for New Users" msgstr "Можливості за замовчуванням для нових користувачів" -#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:74 -msgid "Show random books in detail view" +#: cps/templates/config_view_edit.html:142 +msgid "Show Random Books in Detail View" msgstr "Показувати випадкові книги при перегляді деталей" -#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:87 -msgid "Show mature content" +#: cps/templates/config_view_edit.html:144 +msgid "Add Allowed/Denied Tags" +msgstr "" + +#: cps/templates/config_view_edit.html:145 +msgid "Add Allowed/Denied custom column values" msgstr "" #: cps/templates/detail.html:59 -msgid "Read in browser" +msgid "Read in Browser" msgstr "Відкрити в браузері" #: cps/templates/detail.html:72 -msgid "Listen in browser" +msgid "Listen in Browser" msgstr "" #: cps/templates/detail.html:117 @@ -1651,9 +1698,9 @@ msgstr "Книга" msgid "of" msgstr "з" -#: cps/templates/detail.html:123 -msgid "language" -msgstr "Мова" +#: cps/templates/detail.html:165 +msgid "Published" +msgstr "" #: cps/templates/detail.html:200 msgid "Mark As Unread" @@ -1676,21 +1723,9 @@ msgid "Add to shelf" msgstr "Додати на книжкову полицю" #: cps/templates/detail.html:286 -msgid "Edit metadata" +msgid "Edit Metadata" msgstr "Редагувати метадані" -#: cps/templates/email_edit.html:15 -msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" -msgstr "SMTP-порт (зазвичай 25 для SMTP, 465 для SSL і 587 для STARTTLS)" - -#: cps/templates/email_edit.html:19 -msgid "Encryption" -msgstr "Шифрування" - -#: cps/templates/email_edit.html:21 -msgid "None" -msgstr "Ні" - #: cps/templates/email_edit.html:22 msgid "STARTTLS" msgstr "STARTTLS" @@ -1700,23 +1735,15 @@ msgid "SSL/TLS" msgstr "SSL/TLS" #: cps/templates/email_edit.html:31 -msgid "SMTP password" +msgid "SMTP Password" msgstr "Пароль SMTP" -#: cps/templates/email_edit.html:35 -msgid "From e-mail" -msgstr "Адрес відправника" - -#: cps/templates/email_edit.html:38 -msgid "Save settings" -msgstr "Зберегти налаштування" - #: cps/templates/email_edit.html:39 -msgid "Save settings and send Test E-Mail" +msgid "Save and Send Test E-mail" msgstr "Зберегти налаштування і відправити тестове повідомлення" #: cps/templates/email_edit.html:43 -msgid "Allowed domains for registering" +msgid "Allowed Domains (Whitelist)" msgstr "" #: cps/templates/email_edit.html:46 cps/templates/email_edit.html:72 @@ -1732,28 +1759,28 @@ msgid "Enter domainname" msgstr "" #: cps/templates/email_edit.html:60 -msgid "Denied domains for registering" +msgid "Denied Domains (Blacklist)" msgstr "" #: cps/templates/email_edit.html:90 -msgid "Do you really want to delete this domain rule?" +msgid "Are you sure you want to delete this domain?" msgstr "" -#: cps/templates/feed.xml:21 cps/templates/layout.html:176 +#: cps/templates/feed.xml:21 cps/templates/layout.html:175 msgid "Next" msgstr "Далі" -#: cps/templates/http_error.html:37 -msgid "Create issue" +#: cps/templates/generate_kobo_auth_url.html:5 +msgid "Open the .kobo/Kobo eReader.conf file in a text editor and add (or edit):" msgstr "" -#: cps/templates/http_error.html:44 -msgid "Back to home" +#: cps/templates/http_error.html:38 +msgid "Create Issue" msgstr "" -#: cps/templates/index.html:5 -msgid "Discover (Random Books)" -msgstr "Огляд (випадкові книги)" +#: cps/templates/http_error.html:45 +msgid "Return to Home" +msgstr "" #: cps/templates/index.html:64 msgid "Group by series" @@ -1779,7 +1806,11 @@ msgstr "" msgid "The latest Books" msgstr "Останні книги" -#: cps/templates/index.xml:42 +#: cps/templates/index.xml:38 +msgid "Random Books" +msgstr "Випадковий список книг" + +#: cps/templates/index.xml:42 cps/templates/user_edit.html:80 msgid "Show Random Books" msgstr "Показувати випадкові книги" @@ -1804,22 +1835,26 @@ msgid "Books ordered by Languages" msgstr "" #: cps/templates/index.xml:100 +msgid "Books ordered by Rating" +msgstr "" + +#: cps/templates/index.xml:108 msgid "Books ordered by file formats" msgstr "" -#: cps/templates/index.xml:103 cps/templates/layout.html:137 +#: cps/templates/index.xml:111 cps/templates/layout.html:136 msgid "Public Shelves" msgstr "Загальні книжкові полиці" -#: cps/templates/index.xml:107 +#: cps/templates/index.xml:115 msgid "Books organized in public shelfs, visible to everyone" msgstr "Книги, організовані на публічних полицях, видимі всім" -#: cps/templates/index.xml:111 cps/templates/layout.html:141 +#: cps/templates/index.xml:119 cps/templates/layout.html:140 msgid "Your Shelves" msgstr "Ваші книжкові полиці" -#: cps/templates/index.xml:115 +#: cps/templates/index.xml:123 msgid "User's own shelfs, only visible to the current user himself" msgstr "Власні полиці користувача, видимі тільки поточному користувачеві" @@ -1827,10 +1862,19 @@ msgstr "Власні полиці користувача, видимі тіль msgid "Home" msgstr "" +#: cps/templates/layout.html:28 cps/templates/shelf_order.html:32 +#: cps/templates/user_edit.html:178 +msgid "Back" +msgstr "Назад" + #: cps/templates/layout.html:34 -msgid "Toggle navigation" +msgid "Toggle Navigation" msgstr "Включити навігацію" +#: cps/templates/layout.html:45 +msgid "Search Library" +msgstr "" + #: cps/templates/layout.html:55 msgid "Advanced Search" msgstr "Розширений пошук" @@ -1852,74 +1896,101 @@ msgstr "Вийти" msgid "Register" msgstr "Зареєструватись" -#: cps/templates/layout.html:116 cps/templates/layout.html:223 +#: cps/templates/layout.html:116 cps/templates/layout.html:222 msgid "Uploading..." msgstr "Завантаження..." #: cps/templates/layout.html:117 -msgid "please don't refresh the page" -msgstr "будь ласка, не перезавантажуйте сторінку" +msgid "Please do not refresh the page" +msgstr "" #: cps/templates/layout.html:127 msgid "Browse" msgstr "Перегляд" -#: cps/templates/layout.html:146 +#: cps/templates/layout.html:145 msgid "Create a Shelf" msgstr "Створити книжкову полицю" -#: cps/templates/layout.html:147 cps/templates/stats.html:3 +#: cps/templates/layout.html:146 cps/templates/stats.html:3 msgid "About" msgstr "Про програму" -#: cps/templates/layout.html:161 +#: cps/templates/layout.html:160 msgid "Previous" msgstr "Попередній перегляд" -#: cps/templates/layout.html:188 +#: cps/templates/layout.html:187 msgid "Book Details" msgstr "Деталі" -#: cps/templates/layout.html:222 +#: cps/templates/layout.html:221 msgid "Upload done, processing, please wait..." msgstr "" -#: cps/templates/layout.html:225 +#: cps/templates/layout.html:224 msgid "Error" msgstr "" -#: cps/templates/login.html:8 cps/templates/login.html:9 -#: cps/templates/register.html:7 cps/templates/user_edit.html:8 -msgid "Username" -msgstr "Ім'я користувача" - #: cps/templates/login.html:12 cps/templates/login.html:13 #: cps/templates/user_edit.html:21 msgid "Password" msgstr "Пароль" #: cps/templates/login.html:17 -msgid "Remember me" +msgid "Remember Me" msgstr "Запам'ятати мене" #: cps/templates/login.html:22 -msgid "Forgot password" +msgid "Forgot Password?" msgstr "" #: cps/templates/login.html:25 -msgid "Log in with magic link" +msgid "Log in with Magic Link" msgstr "Увійдіть в систему за допомогою magic link" -#: cps/templates/logviewer.html:5 -msgid "Show Calibre-Web log" +#: cps/templates/logviewer.html:6 +msgid "Show Calibre-Web Log: " msgstr "" #: cps/templates/logviewer.html:8 -msgid "Show access log" +msgid "Calibre-Web Log: " +msgstr "" + +#: cps/templates/logviewer.html:8 +msgid "Stream output, can't be displayed" +msgstr "" + +#: cps/templates/logviewer.html:12 +msgid "Show Access Log: " +msgstr "" + +#: cps/templates/modal_restriction.html:6 +msgid "Select allowed/denied Tags" +msgstr "" + +#: cps/templates/modal_restriction.html:7 +msgid "Select allowed/denied Custom Column values" +msgstr "" + +#: cps/templates/modal_restriction.html:8 +msgid "Select allowed/denied Tags of user" +msgstr "" + +#: cps/templates/modal_restriction.html:9 +msgid "Select allowed/denied Custom Column values of user" +msgstr "" + +#: cps/templates/modal_restriction.html:15 +msgid "Enter Tag" +msgstr "" + +#: cps/templates/modal_restriction.html:24 +msgid "Add View Restriction" msgstr "" #: cps/templates/osd.xml:5 -msgid "Calibre-Web ebook catalog" +msgid "Calibre-Web eBook Catalog" msgstr "" #: cps/templates/read.html:74 @@ -2031,51 +2102,51 @@ msgid "Basic txt Reader" msgstr "Засіб для читання txt-файлів" #: cps/templates/register.html:4 -msgid "Register a new account" +msgid "Register New Account" msgstr "Зареєструвати нового користувача" #: cps/templates/register.html:8 msgid "Choose a username" msgstr "Виберіть ім'я користувача" -#: cps/templates/register.html:11 cps/templates/user_edit.html:13 -msgid "E-mail address" -msgstr "" - #: cps/templates/register.html:12 msgid "Your email address" msgstr "Ваш email-адрес" +#: cps/templates/remote_login.html:4 +msgid "Magic Link - Authorise New Device" +msgstr "" + #: cps/templates/remote_login.html:6 -msgid "Use your other device, login and visit " +msgid "On another device, login and visit:" msgstr "" -#: cps/templates/remote_login.html:9 -msgid "Once you do so, you will automatically get logged in on this device." +#: cps/templates/remote_login.html:10 +msgid "Once verified, you will automatically be logged in on this device." msgstr "Після цього ви автоматично ввійдете в систему на цьому пристрої." -#: cps/templates/remote_login.html:12 -msgid "The link will expire after 10 minutes." +#: cps/templates/remote_login.html:13 +msgid "This verification link will expire in 10 minutes." msgstr "" #: cps/templates/search.html:5 -msgid "No Results for:" -msgstr "Нічого не знайдено за запитом:" +msgid "No Results Found" +msgstr "" #: cps/templates/search.html:6 -msgid "Please try a different search" -msgstr "Спробуйте змінити критерії пошук" +msgid "Search Term:" +msgstr "" #: cps/templates/search.html:8 msgid "Results for:" msgstr "Результати для:" #: cps/templates/search_form.html:19 -msgid "Publishing date from" +msgid "Published Date From" msgstr "Дата публікації з" #: cps/templates/search_form.html:26 -msgid "Publishing date to" +msgid "Published Date To" msgstr "Дата публікації до" #: cps/templates/search_form.html:43 @@ -2099,11 +2170,11 @@ msgid "Exclude Extensions" msgstr "" #: cps/templates/search_form.html:117 -msgid "Rating bigger than" +msgid "Rating Above" msgstr "" #: cps/templates/search_form.html:121 -msgid "Rating less than" +msgid "Rating Below" msgstr "" #: cps/templates/shelf.html:10 @@ -2119,23 +2190,23 @@ msgid "Change order" msgstr "Змінити порядок" #: cps/templates/shelf.html:67 -msgid "Do you really want to delete the shelf?" +msgid "Are you sure you want to delete this shelf?" msgstr "Ви справді хочете видалити книжкову полицю?" #: cps/templates/shelf.html:70 -msgid "Shelf will be lost for everybody and forever!" +msgid "Shelf will be deleted for all users" msgstr "Книжкова полиця буде остаточно видалена для всіх" #: cps/templates/shelf_edit.html:13 -msgid "should the shelf be public?" +msgid "Share with Everyone" msgstr "зробити книжкову полицю доступною для всіх?" #: cps/templates/shelf_order.html:5 -msgid "Drag 'n drop to rearrange order" +msgid "Drag to Rearrange Order" msgstr "Перетягніть для змінення порядку" #: cps/templates/stats.html:7 -msgid "Calibre library statistics" +msgid "Library Statistics" msgstr "Статистика бібліотеки Calibre" #: cps/templates/stats.html:12 @@ -2155,21 +2226,17 @@ msgid "Series in this Library" msgstr "Серій в цій бібліотеці" #: cps/templates/stats.html:28 -msgid "Linked libraries" +msgid "Linked Libraries" msgstr "Встановлене ПЗ" #: cps/templates/stats.html:32 -msgid "Program library" +msgid "Program Library" msgstr "Назва" #: cps/templates/stats.html:33 msgid "Installed Version" msgstr "Встановлена версія" -#: cps/templates/tasks.html:7 -msgid "Tasks list" -msgstr "" - #: cps/templates/tasks.html:12 msgid "User" msgstr "" @@ -2187,11 +2254,11 @@ msgid "Progress" msgstr "" #: cps/templates/tasks.html:17 -msgid "Runtime" +msgid "Run Time" msgstr "" #: cps/templates/tasks.html:18 -msgid "Starttime" +msgid "Start Time" msgstr "" #: cps/templates/tasks.html:24 @@ -2206,350 +2273,58 @@ msgstr "" msgid "Reset user Password" msgstr "" -#: cps/templates/user_edit.html:26 -msgid "Kindle E-Mail" -msgstr "Електронний адрес Kindle" - -#: cps/templates/user_edit.html:39 -msgid "Show books with language" +#: cps/templates/user_edit.html:41 +msgid "Language of Books" msgstr "Показувати книги на мовах" -#: cps/templates/user_edit.html:41 -msgid "Show all" +#: cps/templates/user_edit.html:43 +msgid "Show All" msgstr "Показати всі" -#: cps/templates/user_edit.html:51 +#: cps/templates/user_edit.html:52 msgid "OAuth Settings" msgstr "" -#: cps/templates/user_edit.html:53 +#: cps/templates/user_edit.html:54 msgid "Link" msgstr "" -#: cps/templates/user_edit.html:55 +#: cps/templates/user_edit.html:56 msgid "Unlink" msgstr "" -#: cps/templates/user_edit.html:123 -msgid "Delete this user" -msgstr "Видалити цього користувача" - -#: cps/templates/user_edit.html:138 -msgid "Recent Downloads" -msgstr "Нещодавно переглянуті" - -#~ msgid "kindlegen binary %(kindlepath)s not found" -#~ msgstr "Бінарний %(kindlepath)s не знайдено " - -#~ msgid "epub format not found for book id: %(book)d" -#~ msgstr "Формат epub не знайдено для книги: %(book)d" - -#~ msgid "kindlegen failed, no execution permissions" -#~ msgstr "kindlegen відхилено, відсутній дозвіл на виконання" - -#~ msgid "Failed to send mail: %s" -#~ msgstr "Помилка відправлення листа: %s" - -#~ msgid "Calibre-web test email" -#~ msgstr "Тестове повідомлення від Calibre-web" - -#~ msgid "This email has been sent via calibre web." -#~ msgstr "Це повідомлення було відправлено через calibre web" - -#~ msgid "Could not find any formats suitable for sending by email" -#~ msgstr "Неможливо знайти формат, відповідний для відправки по email" - -#~ msgid "Rename title from: \"%s\" to \"%s\" failed with error: %s" -#~ msgstr "Не вдалося перейменувати заголовок з: \"%s\" на \"%s\". Помилка: %s" - -#~ msgid "Rename author from: \"%s\" to \"%s\" failed with error: %s" -#~ msgstr "Не вдалося перейменувати автора з: \"%s\" на \"%s\". Помилка: %s" - -#~ msgid "File %s not found on Google Drive" -#~ msgstr "Файл %s не знайдено на Google Drive" - -#~ msgid "Book path %s not found on Google Drive" -#~ msgstr "Шлях до книги %s не знайдено на Google Drive" - -#~ msgid "Files are replaced" -#~ msgstr "Файли замінені" - -#~ msgid "Server is stopped" -#~ msgstr "Сервер зупинено" - -#~ msgid "Author list" -#~ msgstr "Автори" - -#~ msgid "Update done" -#~ msgstr "Оновлення завершено" - -#~ msgid "Published after %s" -#~ msgstr "Опубліковано після %s" - -#~ msgid "An unknown error occured. Please try again later." -#~ msgstr "Невідома помилка. Будь-ласка, спробуйте пізніше." - -#~ msgid "This username or email address is already in use." -#~ msgstr "Ім'я користувача або адреса ел. пошти вже використовується" - -#~ msgid "Book successfully send to %(kindlemail)s" -#~ msgstr "Книга успішно відправлена на %(kindlemail)s" - -#~ msgid "Please configure your kindle email address first..." -#~ msgstr "Будь-ласка, спочатку вкажіть ваш kindle email..." - -#~ msgid "Found an existing account for this email address." -#~ msgstr "Знайден обліковий запис для даної адреси email." - -#~ msgid "Calibre-web configuration updated" -#~ msgstr "Конфігурація Calibre-web оновлена" - -#~ msgid "Found an existing account for this email address or nickname." -#~ msgstr "Для вказаної адреси або імені знайдено існуючий обліковий запис." - -#~ msgid "Mail settings updated" -#~ msgstr "Налаштування пошти змінено" - -#~ msgid "Test E-Mail successfully send to %(kindlemail)s" -#~ msgstr "Тестове повідомлення успішно відправлено на адресу %(kindlemail)s" - -#~ msgid "There was an error sending the Test E-Mail: %(res)s" -#~ msgstr "Помилка відправки тестового повідомлення: %(res)s" - -#~ msgid "E-Mail settings updated" -#~ msgstr "Оновлено налаштування e-mail" - -#~ msgid "Edit mail settings" -#~ msgstr "Змінити поштові налаштування" - -#~ msgid "File extension \"%s\" is not allowed to be uploaded to this server" -#~ msgstr "Заборонене завантаження файлів з розширенням \"%s\"" - -#~ msgid "Failed to store file %s." -#~ msgstr "Не вдалося зберегти файл" - -#~ msgid "Failed to create path %s (Permission denied)." -#~ msgstr "Помилка при створенні шляху %s (доступ відсутній)" - -#~ msgid "Failed to store file %s (Permission denied)." -#~ msgstr "Помилка запису файлу %s (доступ відсутній)" - -#~ msgid "Failed to delete file %s (Permission denied)." -#~ msgstr "Помилка видалення файлу %s (доступ відсутній)" - -#~ msgid "Email" -#~ msgstr "Імейл" - -#~ msgid "Passwd" -#~ msgstr "Змінити пароль" - -#~ msgid "SMTP mail settings" -#~ msgstr "Параметри SMTP" - -#~ msgid "Remote Login" -#~ msgstr "Віддалений логін" - -#~ msgid "Current commit timestamp" -#~ msgstr "Поточна мітка передачі" - -#~ msgid "Newest commit timestamp" -#~ msgstr "Найновіша мітка передачі" - -#~ msgid "Restart Calibre-web" -#~ msgstr "Перезавантажити Calibre-web" - -#~ msgid "Stop Calibre-web" -#~ msgstr "Зупинити Calibre-web" - -#~ msgid "Do you really want to restart Calibre-web?" -#~ msgstr "Ви дійсно бажаєте перезавантажити Calibre-web?" - -#~ msgid "Do you really want to stop Calibre-web?" -#~ msgstr "Ви дійсно бажаєте зупинити Calibre-web?" - -#~ msgid "Are really you sure?" -#~ msgstr "Ви впевнені?" - -#~ msgid "No Result! Please try anonther keyword." -#~ msgstr "Немає результатів. Будь ласка, спробуйте інше ключове слово" - -#~ msgid "Calibre Web ebook catalog" -#~ msgstr "Каталог електронних книг Calibre Web" - -#~ msgid "Choose a password" -#~ msgstr "Виберіть пароль" - -#~ msgid "Email address" -#~ msgstr "Електронна пошта" - -#~ msgid "Edit Shelf name" -#~ msgstr "Змінити ім'я книжкової полиці" - -#~ msgid "caliBlur! Dark Theme (Beta)" -#~ msgstr "caliBlur! Темна тема (тестова версія)" - -#~ msgid "Failed to create path for cover %(path)s (Permission denied)." -#~ msgstr "" - -#~ msgid "Failed to store cover-file %(cover)s." -#~ msgstr "" - -#~ msgid "Cover-file is not a valid image file" -#~ msgstr "" - -#~ msgid "Cover is not a jpg file, can't save" -#~ msgstr "Обкладинка не є .jpg файлом. Неможливо зберегти" - -#~ msgid "Preparing document for printing..." -#~ msgstr "" - -#~ msgid "Using your another device, visit" -#~ msgstr "" - -#~ msgid "and log in" -#~ msgstr "і логін" - -#~ msgid "Using your another device, login and visit " -#~ msgstr "" - -#~ msgid "Newest Books" -#~ msgstr "Найновіші книги" - -#~ msgid "Oldest Books" -#~ msgstr "Найстаріші книги" - -#~ msgid "Books (A-Z)" -#~ msgstr "Книги (А-Я)" - -#~ msgid "Books (Z-A)" -#~ msgstr "Книги (Я-А)" - -#~ msgid "Error opening eBook. Fileformat is not supported." -#~ msgstr "" - -#~ msgid "File %(title)s" -#~ msgstr "" - -#~ msgid "Show sorted books" -#~ msgstr "Показувати відсортовані книги" - -#~ msgid "Sorted Books" -#~ msgstr "Відсортовані книги" - -#~ msgid "Sort By" -#~ msgstr "Сортувати за" - -#~ msgid "Newest" -#~ msgstr "Найновіші" - -#~ msgid "Oldest" -#~ msgstr "Найстаріші" - -#~ msgid "Ascending" -#~ msgstr "За зростанням" - -#~ msgid "Descending" -#~ 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 "" - -#~ msgid "Import of optional Google Drive requirements missing" -#~ msgstr "Імпорт додаткових вимог Google Drive відсутній" - -#~ msgid "client_secrets.json is missing or not readable" -#~ msgstr "Неможливо зчитати client_secrets.json або він відсутній" - -#~ msgid "client_secrets.json is not configured for web application" -#~ msgstr "Неможливо зконфігурувати client_secrets.json для веб-додатку" - -#~ msgid "Keyfile location is not valid, please enter correct path" -#~ msgstr "Невідомий шлях до Keyfile. Будь-ласка введіть коректний" - -#~ msgid "Certfile location is not valid, please enter correct path" -#~ msgstr "Невідомий шлях до Certfile. Будь-ласка введіть коректний" - -#~ msgid "Please enter a LDAP provider, port, DN and user object identifier" -#~ msgstr "" - -#~ msgid "Please enter a LDAP service account and password" -#~ msgstr "" - -#~ msgid "Please enter Github oauth credentials" -#~ msgstr "" - -#~ msgid "Please enter Google oauth credentials" -#~ msgstr "" - -#~ msgid "Logfile location is not valid, please enter correct path" -#~ msgstr "Невідомий шлях до Logfile. Будь-ласка введіть коректний" - -#~ msgid "Access Logfile location is not valid, please enter correct path" -#~ msgstr "" - -#~ msgid "DB location is not valid, please enter correct path" -#~ msgstr "Невідомий шлях до БД. Будь-ласка введіть коректний" - -#~ msgid "Excecution permissions missing" -#~ msgstr "Відсутній дозвіл на виконання" - -#~ msgid "not configured" -#~ msgstr "" - -#~ msgid "Error excecuting UnRar" -#~ msgstr "" - -#~ msgid "Unrar binary file not found" -#~ msgstr "" - -#~ msgid "Use GitHub OAuth" -#~ msgstr "" - -#~ msgid "Use Google OAuth" -#~ msgstr "" - -#~ msgid "Obtain GitHub OAuth Credential" -#~ msgstr "" +#: cps/templates/user_edit.html:62 +msgid "Kobo Sync Token" +msgstr "" -#~ msgid "GitHub OAuth Client Id" -#~ msgstr "" +#: cps/templates/user_edit.html:64 +msgid "Create/View" +msgstr "" -#~ msgid "GitHub OAuth Client Secret" -#~ msgstr "" +#: cps/templates/user_edit.html:83 +msgid "Add allowed/denied Tags" +msgstr "" -#~ msgid "Obtain Google OAuth Credential" -#~ msgstr "" +#: cps/templates/user_edit.html:84 +msgid "Add allowed/denied custom column values" +msgstr "" -#~ msgid "Google OAuth Client Id" -#~ msgstr "" +#: cps/templates/user_edit.html:129 +msgid "Delete User" +msgstr "Видалити цього користувача" -#~ msgid "Google OAuth Client Secret" -#~ msgstr "" +#: cps/templates/user_edit.html:144 +msgid "Recent Downloads" +msgstr "Нещодавно переглянуті" -#~ msgid "Use" -#~ msgstr "Використовувати" +#: cps/templates/user_edit.html:160 +msgid "Generate Kobo Auth URL" +msgstr "" -#~ msgid "Play / pause" -#~ msgstr "" +#: cps/templates/user_edit.html:176 +msgid "Do you really want to delete the Kobo Token?" +msgstr "" -#~ msgid "volume" +#~ msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" #~ msgstr "" -#~ msgid "unknown" -#~ msgstr "невідомий" - -#~ msgid "New Books" -#~ msgstr "Нові книги" - diff --git a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo index e29213cb..cf021724 100644 Binary files a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo and b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po index cd69d605..3c5d19e4 100644 --- a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po +++ b/cps/translations/zh_Hans_CN/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: 2020-01-12 13:57+0100\n" +"POT-Creation-Date: 2020-03-12 20:31+0100\n" "PO-Revision-Date: 2017-01-06 17:00+0000\n" "Last-Translator: dalin \n" "Language: zh_Hans_CN\n" @@ -16,7 +16,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.7.0\n" +"Generated-By: Babel 2.8.0\n" #: cps/about.py:42 msgid "installed" @@ -26,7 +26,7 @@ msgstr "已安装" msgid "not installed" msgstr "未安装" -#: cps/about.py:84 +#: cps/about.py:87 msgid "Statistics" msgstr "统计" @@ -40,7 +40,7 @@ msgstr "正在关闭服务器,请关闭窗口" #: cps/admin.py:110 cps/editbooks.py:410 cps/editbooks.py:419 #: cps/editbooks.py:539 cps/editbooks.py:541 cps/editbooks.py:594 -#: cps/updater.py:446 cps/uploader.py:97 cps/uploader.py:108 +#: cps/updater.py:456 cps/uploader.py:96 cps/uploader.py:107 msgid "Unknown" msgstr "未知" @@ -48,161 +48,170 @@ msgstr "未知" msgid "Admin page" msgstr "管理页" -#: cps/admin.py:148 cps/templates/admin.html:115 +#: cps/admin.py:151 msgid "UI Configuration" msgstr "UI配置" -#: cps/admin.py:185 cps/admin.py:412 +#: cps/admin.py:187 cps/admin.py:637 msgid "Calibre-Web configuration updated" msgstr "Calibre-Web配置已更新" -#: cps/admin.py:442 cps/templates/admin.html:114 +#: cps/admin.py:434 cps/admin.py:440 cps/admin.py:451 cps/admin.py:462 +#: cps/templates/modal_restriction.html:29 +msgid "Deny" +msgstr "限制" + +#: cps/admin.py:436 cps/admin.py:442 cps/admin.py:453 cps/admin.py:464 +#: cps/templates/modal_restriction.html:28 +msgid "Allow" +msgstr "允许" + +#: cps/admin.py:667 msgid "Basic Configuration" msgstr "基本配置" -#: cps/admin.py:465 cps/web.py:1093 +#: cps/admin.py:691 cps/web.py:1089 msgid "Please fill out all fields!" msgstr "请填写所有字段" -#: cps/admin.py:467 cps/admin.py:478 cps/admin.py:484 cps/admin.py:499 -#: cps/templates/admin.html:38 +#: cps/admin.py:694 cps/admin.py:706 cps/admin.py:712 cps/admin.py:730 msgid "Add new user" msgstr "添加新用户" -#: cps/admin.py:476 cps/web.py:1318 +#: cps/admin.py:703 cps/web.py:1318 msgid "E-mail is not from valid domain" msgstr "邮箱不在有效域中'" -#: cps/admin.py:482 cps/admin.py:493 +#: cps/admin.py:710 cps/admin.py:725 msgid "Found an existing account for this e-mail address or nickname." msgstr "此邮箱或昵称的账号已经存在。" -#: cps/admin.py:489 +#: cps/admin.py:721 #, python-format msgid "User '%(user)s' created" msgstr "用户 '%(user)s' 已被创建" -#: cps/admin.py:509 +#: cps/admin.py:740 msgid "Edit e-mail server settings" msgstr "编辑邮箱服务器设置" -#: cps/admin.py:535 +#: cps/admin.py:766 #, python-format msgid "Test e-mail successfully send to %(kindlemail)s" msgstr "测试邮件已经被成功发到 %(kindlemail)s" -#: cps/admin.py:538 +#: cps/admin.py:769 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "发送测试邮件出错了: %(res)s" -#: cps/admin.py:540 +#: cps/admin.py:771 msgid "Please configure your e-mail address first..." -msgstr "" +msgstr "请先配置有效的邮箱地址..." -#: cps/admin.py:542 +#: cps/admin.py:773 msgid "E-mail server settings updated" msgstr "已更新邮件服务器设置" -#: cps/admin.py:571 +#: cps/admin.py:803 #, python-format msgid "User '%(nick)s' deleted" msgstr "用户 '%(nick)s' 已被删除" -#: cps/admin.py:574 +#: cps/admin.py:806 msgid "No admin user remaining, can't delete user" -msgstr "" +msgstr "admin账户不存在,无法删除用户" -#: cps/admin.py:612 cps/web.py:1359 +#: cps/admin.py:842 cps/web.py:1361 msgid "Found an existing account for this e-mail address." msgstr "找到一个已有账号使用这个邮箱。" -#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1334 +#: cps/admin.py:852 cps/admin.py:867 cps/admin.py:887 cps/web.py:1336 #, python-format msgid "Edit User %(nick)s" msgstr "编辑用户 %(nick)s" -#: cps/admin.py:622 cps/web.py:1327 +#: cps/admin.py:858 cps/web.py:1328 msgid "This username is already taken" msgstr "此用户名已被使用" -#: cps/admin.py:637 +#: cps/admin.py:874 #, python-format msgid "User '%(nick)s' updated" msgstr "用户 '%(nick)s' 已被更新" -#: cps/admin.py:640 +#: cps/admin.py:877 msgid "An unknown error occured." msgstr "发生未知错误。" -#: cps/admin.py:657 +#: cps/admin.py:900 #, python-format msgid "Password for user %(user)s reset" msgstr "用户 %(user)s 的密码已重置" -#: cps/admin.py:660 cps/web.py:1118 cps/web.py:1174 +#: cps/admin.py:903 cps/web.py:1114 cps/web.py:1170 msgid "An unknown error occurred. Please try again later." msgstr "发生一个未知错误,请稍后再试。" -#: cps/admin.py:663 cps/web.py:1062 +#: cps/admin.py:906 cps/web.py:1055 msgid "Please configure the SMTP mail settings first..." msgstr "请先配置SMTP邮箱..." -#: cps/admin.py:674 +#: cps/admin.py:918 msgid "Logfile viewer" -msgstr "" +msgstr "日志文件查看器" -#: cps/admin.py:710 +#: cps/admin.py:957 msgid "Requesting update package" msgstr "正在请求更新包" -#: cps/admin.py:711 +#: cps/admin.py:958 msgid "Downloading update package" msgstr "正在下载更新包" -#: cps/admin.py:712 +#: cps/admin.py:959 msgid "Unzipping update package" msgstr "正在解压更新包" -#: cps/admin.py:713 +#: cps/admin.py:960 msgid "Replacing files" msgstr "正在替换文件" -#: cps/admin.py:714 +#: cps/admin.py:961 msgid "Database connections are closed" msgstr "数据库连接已关闭" -#: cps/admin.py:715 +#: cps/admin.py:962 msgid "Stopping server" msgstr "正在停止服务器" -#: cps/admin.py:716 +#: cps/admin.py:963 msgid "Update finished, please press okay and reload page" msgstr "更新完成,请按确定并刷新页面" -#: cps/admin.py:717 cps/admin.py:718 cps/admin.py:719 cps/admin.py:720 +#: cps/admin.py:964 cps/admin.py:965 cps/admin.py:966 cps/admin.py:967 msgid "Update failed:" msgstr "更新失败:" -#: cps/admin.py:717 cps/updater.py:272 cps/updater.py:457 cps/updater.py:459 +#: cps/admin.py:964 cps/updater.py:282 cps/updater.py:467 cps/updater.py:469 msgid "HTTP Error" msgstr "HTTP错误" -#: cps/admin.py:718 cps/updater.py:274 cps/updater.py:461 +#: cps/admin.py:965 cps/updater.py:284 cps/updater.py:471 msgid "Connection error" msgstr "连接错误" -#: cps/admin.py:719 cps/updater.py:276 cps/updater.py:463 +#: cps/admin.py:966 cps/updater.py:286 cps/updater.py:473 msgid "Timeout while establishing connection" msgstr "建立连接超时" -#: cps/admin.py:720 cps/updater.py:278 cps/updater.py:465 +#: cps/admin.py:967 cps/updater.py:288 cps/updater.py:475 msgid "General error" msgstr "一般错误" #: cps/converter.py:31 msgid "not configured" -msgstr "" +msgstr "配置为空" #: cps/editbooks.py:214 cps/editbooks.py:396 msgid "Error opening eBook. File does not exist or file is not accessible" @@ -236,10 +245,6 @@ msgstr "保存文件 %(file)s 失败。" msgid "File format %(ext)s added to %(book)s" msgstr "已添加 %(ext)s 格式到 %(book)s" -#: cps/editbooks.py:376 -msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" -msgstr "封面不是一个被支持的图像格式(jpg/png/webp),无法保存" - #: cps/editbooks.py:451 msgid "Cover is not a jpg file, can't save" msgstr "封面不是一个jpg文件,无法保存" @@ -260,11 +265,11 @@ msgstr "编辑书籍出错,详情请检查日志文件" #: cps/editbooks.py:581 #, python-format msgid "File %(filename)s could not saved to temp dir" -msgstr "" +msgstr "文件 %(filename)s 无法保存到临时目录" #: cps/editbooks.py:598 msgid "Uploaded book probably exists in the library, consider to change before upload new: " -msgstr "" +msgstr "上传的书籍可能已经存在,建议修改后重新上传:" #: cps/editbooks.py:613 #, python-format @@ -276,30 +281,30 @@ msgstr "存储文件 %(file)s 失败(权限拒绝)。" msgid "Failed to delete file %(file)s (Permission denied)." msgstr "删除文件 %(file)s 失败(权限拒绝)。" -#: cps/editbooks.py:710 +#: cps/editbooks.py:709 #, python-format msgid "File %(file)s uploaded" msgstr "文件 %(file)s 已上传" -#: cps/editbooks.py:739 +#: cps/editbooks.py:738 msgid "Source or destination format for conversion missing" msgstr "转换的源或目的格式缺失" -#: cps/editbooks.py:747 +#: cps/editbooks.py:746 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "书籍已经被成功加入 %(book_format)s 的转换队列" -#: cps/editbooks.py:751 +#: cps/editbooks.py:750 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "转换此书时出现错误: %(res)s" -#: cps/gdrive.py:62 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgstr "Google Drive 没有完成,试试重新关闭Google Drive再开启" -#: cps/gdrive.py:104 +#: cps/gdrive.py:103 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "回调域名尚未被校验,请在google开发者控制台按步骤校验域名" @@ -377,7 +382,7 @@ msgstr "将作者从'%(src)s'改为'%(dest)s'时失败,出错信息: %(error)s #: cps/helper.py:346 #, python-format msgid "Rename file in path '%(src)s' to '%(dest)s' failed with error: %(error)s" -msgstr "" +msgstr "从 '%(src)s' 重命名为 '%(dest)s' 失败,报错信息: %(error)s" #: cps/helper.py:372 cps/helper.py:382 cps/helper.py:390 #, python-format @@ -389,83 +394,111 @@ msgstr "Google Drive上找不到文件 %(file)s" msgid "Book path %(path)s not found on Google Drive" msgstr "Google Drive上找不到书籍路径 %(path)s" -#: cps/helper.py:643 +#: cps/helper.py:511 +msgid "Failed to create path for cover" +msgstr "" + +#: cps/helper.py:516 +msgid "Cover-file is not a valid image file" +msgstr "" + +#: cps/helper.py:519 +msgid "Failed to store cover-file" +msgstr "" + +#: cps/helper.py:530 +msgid "Only jpg/jpeg/png/webp files are supported as coverfile" +msgstr "" + +#: cps/helper.py:544 +msgid "Only jpg/jpeg files are supported as coverfile" +msgstr "" + +#: cps/helper.py:658 msgid "Waiting" msgstr "等待中" -#: cps/helper.py:645 +#: cps/helper.py:660 msgid "Failed" msgstr "失败" -#: cps/helper.py:647 +#: cps/helper.py:662 msgid "Started" msgstr "已开始" -#: cps/helper.py:649 +#: cps/helper.py:664 msgid "Finished" msgstr "已完成" -#: cps/helper.py:651 +#: cps/helper.py:666 msgid "Unknown Status" msgstr "未知状态" -#: cps/helper.py:656 +#: cps/helper.py:671 msgid "E-mail: " msgstr "" -#: cps/helper.py:658 cps/helper.py:662 +#: cps/helper.py:673 cps/helper.py:677 msgid "Convert: " msgstr "转换:" -#: cps/helper.py:660 +#: cps/helper.py:675 msgid "Upload: " msgstr "上传:" -#: cps/helper.py:664 +#: cps/helper.py:679 msgid "Unknown Task: " msgstr "未知任务:" -#: cps/oauth_bb.py:75 +#: cps/kobo_auth.py:127 +msgid "PLease access calibre-web from non localhost to get valid api_endpoint for kobo device" +msgstr "请不要使用localhost访问calibre-web,以便kobo设备能获取有效的api_endpoint" + +#: cps/kobo_auth.py:130 cps/kobo_auth.py:150 +msgid "Kobo Setup" +msgstr "" + +#: cps/oauth_bb.py:74 #, python-format msgid "Register with %(provider)s" -msgstr "" +msgstr "使用 %(provider)s 注册" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:154 msgid "Failed to log in with GitHub." msgstr "使用Github登录失败。" -#: cps/oauth_bb.py:160 +#: cps/oauth_bb.py:159 msgid "Failed to fetch user info from GitHub." msgstr "从Github获取用户信息失败。" -#: cps/oauth_bb.py:171 +#: cps/oauth_bb.py:170 msgid "Failed to log in with Google." msgstr "使用Google登录失败。" -#: cps/oauth_bb.py:176 +#: cps/oauth_bb.py:175 msgid "Failed to fetch user info from Google." msgstr "从Google获取用户信息失败。" -#: cps/oauth_bb.py:274 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s success." -msgstr "" +msgstr "从 %(oauth)s 登出成功" -#: cps/oauth_bb.py:278 +#: cps/oauth_bb.py:277 #, python-format msgid "Unlink to %(oauth)s failed." -msgstr "" +msgstr "从 %(oauth)s 登出失败" -#: cps/oauth_bb.py:281 +#: cps/oauth_bb.py:280 #, python-format msgid "Not linked to %(oauth)s." -msgstr "" +msgstr "没有连接到 %(oauth)s." -#: cps/oauth_bb.py:309 +#: cps/oauth_bb.py:308 msgid "GitHub Oauth error, please retry later." msgstr "GitHub Oauth 错误,请重试。" -#: cps/oauth_bb.py:328 +#: cps/oauth_bb.py:327 msgid "Google Oauth error, please retry later." msgstr "Google Oauth 错误,请重试。" @@ -516,403 +549,393 @@ msgstr "书籍已经被添加到书架 %(sname)s 中'" msgid "Could not add books to shelf: %(sname)s" msgstr "无法添加书籍到书架: %(sname)s" -#: cps/shelf.py:180 +#: cps/shelf.py:181 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "此书已从书架 %(sname)s 中删除" -#: cps/shelf.py:186 +#: cps/shelf.py:190 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "对不起,您没有从书架 %(sname)s 中删除书籍的权限" -#: cps/shelf.py:207 cps/shelf.py:231 +#: cps/shelf.py:211 cps/shelf.py:235 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "已存在书架 '%(title)s'。" -#: cps/shelf.py:212 +#: cps/shelf.py:216 #, python-format msgid "Shelf %(title)s created" msgstr "书架 %(title)s 已被创建" -#: cps/shelf.py:214 cps/shelf.py:242 +#: cps/shelf.py:218 cps/shelf.py:246 msgid "There was an error" msgstr "发生错误" -#: cps/shelf.py:215 cps/shelf.py:217 +#: cps/shelf.py:219 cps/shelf.py:221 msgid "create a shelf" msgstr "创建书架" -#: cps/shelf.py:240 +#: cps/shelf.py:244 #, python-format msgid "Shelf %(title)s changed" msgstr "书架 %(title)s 已被修改" -#: cps/shelf.py:243 cps/shelf.py:245 +#: cps/shelf.py:247 cps/shelf.py:249 msgid "Edit a shelf" msgstr "编辑书架" -#: cps/shelf.py:289 +#: cps/shelf.py:301 #, python-format msgid "Shelf: '%(name)s'" msgstr "书架: '%(name)s'" -#: cps/shelf.py:292 +#: cps/shelf.py:304 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "打开书架出错。书架不存在或不可访问" -#: cps/shelf.py:323 +#: cps/shelf.py:342 +msgid "Hidden Book" +msgstr "隐藏书籍" + +#: cps/shelf.py:347 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "修改书架 '%(name)s' 顺序" -#: cps/ub.py:57 +#: cps/ub.py:56 msgid "Recently Added" msgstr "最近添加" -#: cps/ub.py:59 +#: cps/ub.py:58 msgid "Show recent books" msgstr "显示最近书籍" -#: cps/templates/index.xml:17 cps/ub.py:60 +#: cps/templates/index.xml:17 cps/ub.py:59 msgid "Hot Books" msgstr "热门书籍" -#: cps/ub.py:61 -msgid "Show hot books" +#: cps/ub.py:60 +msgid "Show Hot Books" msgstr "显示热门书籍" -#: cps/templates/index.xml:24 cps/ub.py:64 -msgid "Best rated Books" +#: cps/templates/index.xml:24 cps/ub.py:63 cps/web.py:508 +msgid "Top Rated Books" msgstr "最高评分书籍" -#: cps/ub.py:66 -msgid "Show best rated books" +#: cps/ub.py:65 +msgid "Show Top Rated Books" msgstr "显示最高评分书籍" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67 -#: cps/web.py:1011 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:66 +#: cps/web.py:1005 msgid "Read Books" msgstr "已读书籍" -#: cps/ub.py:69 +#: cps/ub.py:68 msgid "Show read and unread" msgstr "显示已读和未读" -#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71 -#: cps/web.py:1015 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:70 +#: cps/web.py:1009 msgid "Unread Books" msgstr "未读书籍" -#: cps/ub.py:73 +#: cps/ub.py:72 msgid "Show unread" msgstr "显示未读" -#: cps/ub.py:74 +#: cps/ub.py:73 msgid "Discover" msgstr "发现" -#: cps/ub.py:76 +#: cps/ub.py:75 msgid "Show random books" msgstr "显示随机书籍" -#: cps/templates/index.xml:75 cps/ub.py:77 +#: cps/templates/index.xml:75 cps/ub.py:76 cps/web.py:787 msgid "Categories" msgstr "分类" -#: cps/ub.py:79 +#: cps/ub.py:78 msgid "Show category selection" msgstr "显示分类选择" -#: cps/templates/book_edit.html:71 cps/templates/index.xml:82 -#: cps/templates/search_form.html:53 cps/ub.py:80 +#: cps/templates/book_edit.html:69 cps/templates/index.xml:82 +#: cps/templates/search_form.html:53 cps/ub.py:79 cps/web.py:715 msgid "Series" msgstr "丛书" -#: cps/ub.py:82 +#: cps/ub.py:81 msgid "Show series selection" msgstr "显示丛书选择" -#: cps/templates/index.xml:61 cps/ub.py:83 +#: cps/templates/index.xml:61 cps/ub.py:82 msgid "Authors" msgstr "作者" -#: cps/ub.py:85 +#: cps/ub.py:84 msgid "Show author selection" msgstr "显示作者选择" -#: cps/templates/index.xml:68 cps/ub.py:87 +#: cps/templates/index.xml:68 cps/ub.py:86 cps/web.py:699 msgid "Publishers" msgstr "出版社" -#: cps/ub.py:89 +#: cps/ub.py:88 msgid "Show publisher selection" msgstr "显示出版社选择" -#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:90 +#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:89 +#: cps/web.py:770 msgid "Languages" msgstr "语言" -#: cps/ub.py:93 +#: cps/ub.py:92 msgid "Show language selection" msgstr "显示语言选择" -#: cps/ub.py:94 +#: cps/templates/index.xml:96 cps/ub.py:93 msgid "Ratings" msgstr "评分" -#: cps/ub.py:96 +#: cps/ub.py:95 msgid "Show ratings selection" msgstr "显示评分选择" -#: cps/templates/index.xml:96 cps/ub.py:97 +#: cps/templates/index.xml:104 cps/ub.py:96 msgid "File formats" msgstr "文件格式" -#: cps/ub.py:99 +#: cps/ub.py:98 msgid "Show file formats selection" msgstr "显示文件格式选择" -#: cps/updater.py:252 cps/updater.py:359 cps/updater.py:372 +#: cps/updater.py:262 cps/updater.py:369 cps/updater.py:382 msgid "Unexpected data while reading update information" msgstr "读取更新信息时出现异常数据" -#: cps/updater.py:259 cps/updater.py:365 +#: cps/updater.py:269 cps/updater.py:375 msgid "No update available. You already have the latest version installed" msgstr "没有可用更新。您已经安装了最新版本" -#: cps/updater.py:285 +#: cps/updater.py:295 msgid "A new update is available. Click on the button below to update to the latest version." msgstr "有一个更新可用。点击正文按钮更新到最新版本。" -#: cps/updater.py:338 +#: cps/updater.py:348 msgid "Could not fetch update information" msgstr "无法获取更新信息" -#: cps/updater.py:352 +#: cps/updater.py:362 msgid "No release information available" msgstr "没有可用发布信息" -#: cps/updater.py:405 cps/updater.py:414 +#: cps/updater.py:415 cps/updater.py:424 #, python-format msgid "A new update is available. Click on the button below to update to version: %(version)s" msgstr "一个新的更新可用。点击下面按钮更新到版本: %(version)s" -#: cps/updater.py:424 +#: cps/updater.py:434 msgid "Click on the button below to update to the latest stable version." msgstr "点击下面按钮更新到最新稳定版本。" -#: cps/web.py:486 +#: cps/web.py:480 msgid "Recently Added Books" msgstr "最近添加的书籍" -#: cps/web.py:514 -msgid "Best rated books" -msgstr "最高评分书籍" - -#: cps/templates/index.xml:38 cps/web.py:522 -msgid "Random Books" -msgstr "随机书籍" +#: cps/templates/index.html:5 cps/web.py:516 +msgid "Discover (Random Books)" +msgstr "发现(随机书籍)" -#: cps/web.py:548 +#: cps/web.py:542 msgid "Books" msgstr "" -#: cps/web.py:575 -msgid "Hot Books (most downloaded)" -msgstr "热门书籍(最多下载)" +#: cps/web.py:569 +msgid "Hot Books (Most Downloaded)" +msgstr "热门书籍(最多下载)" -#: cps/web.py:586 cps/web.py:1382 cps/web.py:1478 -msgid "Error opening eBook. File does not exist or file is not accessible:" +#: cps/web.py:580 +msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "无法打开电子书。 文件不存在或者文件不可访问:" -#: cps/web.py:599 +#: cps/web.py:593 #, python-format msgid "Author: %(name)s" msgstr "作者: %(name)s" -#: cps/web.py:611 +#: cps/web.py:605 #, python-format msgid "Publisher: %(name)s" msgstr "出版社: %(name)s" -#: cps/web.py:622 +#: cps/web.py:616 #, python-format msgid "Series: %(serie)s" msgstr "丛书: %(serie)s" -#: cps/web.py:633 +#: cps/web.py:627 #, python-format msgid "Rating: %(rating)s stars" msgstr "评分: %(rating)s 星" -#: cps/web.py:644 +#: cps/web.py:638 #, python-format msgid "File format: %(format)s" msgstr "文件格式: %(format)s" -#: cps/web.py:656 +#: cps/web.py:650 #, python-format msgid "Category: %(name)s" msgstr "分类: %(name)s" -#: cps/web.py:673 +#: cps/web.py:667 #, python-format msgid "Language: %(name)s" msgstr "语言: %(name)s" -#: cps/web.py:705 -msgid "Publisher list" -msgstr "出版社列表" - -#: cps/web.py:721 -msgid "Series list" -msgstr "丛书列表" - -#: cps/web.py:735 +#: cps/web.py:729 msgid "Ratings list" msgstr "评分列表" -#: cps/web.py:748 +#: cps/web.py:742 msgid "File formats list" msgstr "文件格式列表" -#: cps/web.py:776 -msgid "Available languages" -msgstr "可用语言" - -#: cps/web.py:793 -msgid "Category list" -msgstr "分类列表" - -#: cps/templates/layout.html:73 cps/web.py:807 +#: cps/templates/layout.html:73 cps/templates/tasks.html:7 cps/web.py:801 msgid "Tasks" msgstr "任务" -#: cps/templates/feed.xml:33 cps/templates/layout.html:44 -#: cps/templates/layout.html:45 cps/web.py:829 cps/web.py:831 +#: cps/templates/book_edit.html:212 cps/templates/feed.xml:33 +#: cps/templates/layout.html:44 cps/templates/layout.html:47 +#: cps/templates/search_form.html:170 cps/web.py:821 cps/web.py:823 msgid "Search" msgstr "搜索" -#: cps/web.py:881 +#: cps/web.py:873 msgid "Published after " msgstr "出版时晚于 " -#: cps/web.py:888 +#: cps/web.py:880 msgid "Published before " msgstr "出版时早于 " -#: cps/web.py:902 +#: cps/web.py:894 #, python-format msgid "Rating <= %(rating)s" msgstr "评分 <= %(rating)s" -#: cps/web.py:904 +#: cps/web.py:896 #, python-format msgid "Rating >= %(rating)s" msgstr "评分 >= %(rating)s" -#: cps/web.py:970 cps/web.py:982 +#: cps/web.py:962 cps/web.py:976 msgid "search" msgstr "搜索" -#: cps/web.py:1067 +#: cps/web.py:1060 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "书籍已经被成功加入 %(kindlemail)s 的发送队列" -#: cps/web.py:1071 +#: cps/web.py:1064 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "发送这本书的时候出现错误: %(res)s" -#: cps/web.py:1073 +#: cps/web.py:1066 msgid "Please configure your kindle e-mail address first..." msgstr "请先配置您的kindle邮箱..." -#: cps/web.py:1087 +#: cps/web.py:1083 msgid "E-Mail server is not configured, please contact your administrator!" -msgstr "" +msgstr "邮件服务未配置,请联系网站管理员" -#: cps/web.py:1088 cps/web.py:1094 cps/web.py:1119 cps/web.py:1123 -#: cps/web.py:1128 cps/web.py:1132 +#: cps/web.py:1084 cps/web.py:1090 cps/web.py:1115 cps/web.py:1119 +#: cps/web.py:1124 cps/web.py:1128 msgid "register" msgstr "注册" -#: cps/web.py:1121 +#: cps/web.py:1117 msgid "Your e-mail is not allowed to register" msgstr "您的邮箱不能用来注册" -#: cps/web.py:1124 +#: cps/web.py:1120 msgid "Confirmation e-mail was send to your e-mail account." msgstr "确认邮件已经发送到您的邮箱。" -#: cps/web.py:1127 +#: cps/web.py:1123 msgid "This username or e-mail address is already in use." msgstr "这个用户名或者邮箱已经被使用。" -#: cps/web.py:1144 +#: cps/web.py:1140 msgid "Cannot activate LDAP authentication" msgstr "无法激活LDAP认证" -#: cps/web.py:1154 cps/web.py:1281 +#: cps/web.py:1150 cps/web.py:1277 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "您现在已以'%(nickname)s'身份登录" -#: cps/web.py:1159 +#: cps/web.py:1155 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "无法登录。LDAP服务器挂了,请联系您的管理员" -#: cps/web.py:1163 cps/web.py:1186 +#: cps/web.py:1159 cps/web.py:1182 msgid "Wrong Username or Password" msgstr "用户名或密码错误" -#: cps/web.py:1170 +#: cps/web.py:1166 msgid "New Password was send to your email address" -msgstr "" +msgstr "新密码已发送到您的邮箱" -#: cps/web.py:1176 +#: cps/web.py:1172 msgid "Please enter valid username to reset password" -msgstr "" +msgstr "请输入有效的用户名进行密码重置" -#: cps/web.py:1182 +#: cps/web.py:1178 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "您已以 '%(nickname)s' 登录" -#: cps/web.py:1189 cps/web.py:1213 +#: cps/web.py:1185 cps/web.py:1209 msgid "login" msgstr "登录" -#: cps/web.py:1225 cps/web.py:1259 +#: cps/web.py:1221 cps/web.py:1255 msgid "Token not found" msgstr "找不到Token" -#: cps/web.py:1234 cps/web.py:1267 +#: cps/web.py:1230 cps/web.py:1263 msgid "Token has expired" msgstr "Token已过期" -#: cps/web.py:1243 +#: cps/web.py:1239 msgid "Success! Please return to your device" msgstr "成功!请返回您的设备" -#: cps/web.py:1320 cps/web.py:1363 cps/web.py:1369 +#: cps/web.py:1320 cps/web.py:1365 cps/web.py:1371 #, python-format msgid "%(name)s's profile" msgstr "%(name)s 的资料" -#: cps/web.py:1365 +#: cps/web.py:1367 msgid "Profile updated" msgstr "资料已更新" -#: cps/web.py:1394 cps/web.py:1397 cps/web.py:1400 cps/web.py:1407 -#: cps/web.py:1412 +#: cps/web.py:1384 cps/web.py:1480 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "打开电子书错误。文件不存在或者无法访问:" + +#: cps/web.py:1396 cps/web.py:1399 cps/web.py:1402 cps/web.py:1409 +#: cps/web.py:1414 msgid "Read a Book" msgstr "阅读一本书" -#: cps/web.py:1423 +#: cps/web.py:1425 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "打开电子书错误。文件不存在或者无法访问。" @@ -927,24 +950,27 @@ msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Kindlegen 因为错误 %(error)s 失败。消息: %(message)s" #: cps/templates/admin.html:9 -msgid "User list" +msgid "Users" msgstr "用户列表" -#: cps/templates/admin.html:12 -msgid "Nickname" +#: cps/templates/admin.html:12 cps/templates/login.html:8 +#: cps/templates/login.html:9 cps/templates/register.html:7 +#: cps/templates/user_edit.html:8 +msgid "Username" msgstr "昵称" -#: cps/templates/admin.html:13 -msgid "E-mail" -msgstr "" +#: cps/templates/admin.html:13 cps/templates/register.html:11 +#: cps/templates/user_edit.html:13 +msgid "E-mail Address" +msgstr "邮箱" -#: cps/templates/admin.html:14 -msgid "Kindle" -msgstr "" +#: cps/templates/admin.html:14 cps/templates/user_edit.html:26 +msgid "Send to Kindle E-mail Address" +msgstr "Send to Kindle邮箱" #: cps/templates/admin.html:15 -msgid "DLS" -msgstr "" +msgid "Downloads" +msgstr "下载量" #: cps/templates/admin.html:16 cps/templates/layout.html:76 msgid "Admin" @@ -957,7 +983,7 @@ msgid "Download" msgstr "下载" #: cps/templates/admin.html:18 -msgid "View Ebooks" +msgid "View eBooks" msgstr "查看电子书" #: cps/templates/admin.html:19 cps/templates/layout.html:65 @@ -968,28 +994,32 @@ msgstr "上传" msgid "Edit" msgstr "编辑" +#: cps/templates/admin.html:38 +msgid "Add New User" +msgstr "新建用户" + #: cps/templates/admin.html:44 -msgid "SMTP e-mail server settings" +msgid "E-mail Server Settings" msgstr "SMTP邮件服务器设置" #: cps/templates/admin.html:47 cps/templates/email_edit.html:11 -msgid "SMTP hostname" +msgid "SMTP Hostname" msgstr "SMTP地址" -#: cps/templates/admin.html:48 -msgid "SMTP port" +#: cps/templates/admin.html:48 cps/templates/email_edit.html:15 +msgid "SMTP Port" msgstr "SMTP端口" -#: cps/templates/admin.html:49 -msgid "SSL" -msgstr "" +#: cps/templates/admin.html:49 cps/templates/email_edit.html:19 +msgid "Encryption" +msgstr "加密" #: cps/templates/admin.html:50 cps/templates/email_edit.html:27 -msgid "SMTP login" +msgid "SMTP Login" msgstr "SMTP用户名" -#: cps/templates/admin.html:51 -msgid "From mail" +#: cps/templates/admin.html:51 cps/templates/email_edit.html:35 +msgid "From E-mail" msgstr "来自邮箱" #: cps/templates/admin.html:61 @@ -1001,63 +1031,71 @@ msgid "Configuration" msgstr "配置" #: cps/templates/admin.html:70 -msgid "Calibre DB dir" +msgid "Calibre Database Directory" msgstr "Calibre DB目录" -#: cps/templates/admin.html:74 -msgid "Log level" +#: cps/templates/admin.html:74 cps/templates/config_edit.html:122 +msgid "Log Level" msgstr "日志级别" #: cps/templates/admin.html:78 msgid "Port" msgstr "端口" -#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:23 -msgid "Books per page" +#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:27 +msgid "Books per Page" msgstr "每页书籍数" #: cps/templates/admin.html:88 -msgid "Uploading" +msgid "Uploads" msgstr "上传" #: cps/templates/admin.html:92 -msgid "Anonymous browsing" +msgid "Anonymous Browsing" msgstr "匿名浏览" #: cps/templates/admin.html:96 -msgid "Public registration" +msgid "Public Registration" msgstr "开放注册" -#: cps/templates/admin.html:100 cps/templates/remote_login.html:4 -msgid "Remote login" +#: cps/templates/admin.html:100 +msgid "Magic Link Remote Login" msgstr "远程登录" #: cps/templates/admin.html:104 -msgid "Reverse proxy login" -msgstr "" +msgid "Reverse Proxy Login" +msgstr "反向代理登录" #: cps/templates/admin.html:109 msgid "Reverse proxy header name" -msgstr "" +msgstr "反向代理header name" + +#: cps/templates/admin.html:114 +msgid "Edit Basic Configuration" +msgstr "修改基本配置" + +#: cps/templates/admin.html:115 +msgid "Edit UI Configuration" +msgstr "修改界面配置" #: cps/templates/admin.html:121 msgid "Administration" msgstr "管理" #: cps/templates/admin.html:122 -msgid "View Logfiles" +msgid "View Logs" msgstr "查看日志文件" #: cps/templates/admin.html:123 -msgid "Reconnect to Calibre DB" +msgid "Reconnect Calibre Database" msgstr "重新连接到Calibre数据库" #: cps/templates/admin.html:124 -msgid "Restart Calibre-Web" +msgid "Restart" msgstr "重启 Calibre-Web" #: cps/templates/admin.html:125 -msgid "Stop Calibre-Web" +msgid "Shutdown" msgstr "停止 Calibre-Web" #: cps/templates/admin.html:131 @@ -1077,7 +1115,7 @@ msgid "Current version" msgstr "当前版本" #: cps/templates/admin.html:148 -msgid "Check for update" +msgid "Check for Update" msgstr "检查更新" #: cps/templates/admin.html:149 @@ -1085,30 +1123,29 @@ msgid "Perform Update" msgstr "执行更新" #: cps/templates/admin.html:161 -msgid "Do you really want to restart Calibre-Web?" +msgid "Are you sure you want to restart?" msgstr "您确定要重启 Calibre-Web 吗?" #: cps/templates/admin.html:166 cps/templates/admin.html:180 #: cps/templates/admin.html:200 cps/templates/shelf.html:72 -msgid "Ok" +msgid "OK" msgstr "确定" #: cps/templates/admin.html:167 cps/templates/admin.html:181 -#: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 +#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:194 +#: cps/templates/config_edit.html:346 cps/templates/config_view_edit.html:151 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92 -#: cps/templates/layout.html:28 cps/templates/shelf.html:73 -#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32 -#: cps/templates/user_edit.html:131 -msgid "Back" -msgstr "后退" +#: cps/templates/shelf.html:73 cps/templates/shelf_edit.html:19 +#: cps/templates/user_edit.html:137 +msgid "Cancel" +msgstr "取消" #: cps/templates/admin.html:179 -msgid "Do you really want to stop Calibre-Web?" +msgid "Are you sure you want to shutdown?" msgstr "您确定要关闭 Calibre-Web 吗?" #: cps/templates/admin.html:191 -msgid "Updating, please do not reload page" +msgid "Updating, please do not reload this page" msgstr "正在更新,请不要刷新页面" #: cps/templates/author.html:15 @@ -1122,7 +1159,7 @@ msgstr "" #: cps/templates/author.html:34 cps/templates/list.html:14 #: cps/templates/search.html:41 msgid "All" -msgstr "" +msgstr "全部" #: cps/templates/author.html:58 cps/templates/author.html:110 #: cps/templates/discover.html:27 cps/templates/index.html:26 @@ -1135,161 +1172,159 @@ msgstr "" msgid "More by" msgstr "" -#: cps/templates/book_edit.html:12 +#: cps/templates/book_edit.html:10 msgid "Delete Book" msgstr "删除书籍" -#: cps/templates/book_edit.html:15 +#: cps/templates/book_edit.html:13 msgid "Delete formats:" msgstr "删除格式:" -#: cps/templates/book_edit.html:18 cps/templates/book_edit.html:195 -#: cps/templates/email_edit.html:91 +#: cps/templates/book_edit.html:16 cps/templates/book_edit.html:193 +#: cps/templates/email_edit.html:91 cps/templates/user_edit.html:65 +#: cps/templates/user_edit.html:177 msgid "Delete" msgstr "删除" -#: cps/templates/book_edit.html:26 +#: cps/templates/book_edit.html:24 msgid "Convert book format:" msgstr "转换书籍格式:" -#: cps/templates/book_edit.html:30 +#: cps/templates/book_edit.html:28 msgid "Convert from:" msgstr "从格式转换:" -#: cps/templates/book_edit.html:32 cps/templates/book_edit.html:39 +#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:37 msgid "select an option" msgstr "选择一个选项" -#: cps/templates/book_edit.html:37 +#: cps/templates/book_edit.html:35 msgid "Convert to:" msgstr "转换到:" -#: cps/templates/book_edit.html:46 +#: cps/templates/book_edit.html:44 msgid "Convert book" msgstr "转换书籍" -#: cps/templates/book_edit.html:55 cps/templates/search_form.html:6 +#: cps/templates/book_edit.html:53 cps/templates/search_form.html:6 msgid "Book Title" msgstr "书名" -#: cps/templates/book_edit.html:59 cps/templates/book_edit.html:255 -#: cps/templates/book_edit.html:273 cps/templates/search_form.html:10 +#: cps/templates/book_edit.html:57 cps/templates/book_edit.html:256 +#: cps/templates/book_edit.html:274 cps/templates/search_form.html:10 msgid "Author" msgstr "作者" -#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:260 -#: cps/templates/book_edit.html:275 cps/templates/search_form.html:126 +#: cps/templates/book_edit.html:61 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:276 cps/templates/search_form.html:126 msgid "Description" msgstr "简介" -#: cps/templates/book_edit.html:67 cps/templates/search_form.html:33 +#: cps/templates/book_edit.html:65 cps/templates/search_form.html:33 msgid "Tags" msgstr "标签" -#: cps/templates/book_edit.html:75 -msgid "Series id" -msgstr "丛书ID" +#: cps/templates/book_edit.html:73 +msgid "Series ID" +msgstr "" -#: cps/templates/book_edit.html:79 +#: cps/templates/book_edit.html:77 msgid "Rating" msgstr "评分" -#: cps/templates/book_edit.html:83 -msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +#: cps/templates/book_edit.html:81 +msgid "Fetch Cover from URL (JPEG - Image will be downloaded and stored in database)" msgstr "封面URL(jpg,封面会被下载被保存在数据库中,然后字段会被重新清空)" -#: cps/templates/book_edit.html:87 -msgid "Upload Cover from local drive" +#: cps/templates/book_edit.html:85 +msgid "Upload Cover from Local Disk" msgstr "从本地磁盘上传封面" -#: cps/templates/book_edit.html:92 cps/templates/detail.html:165 -msgid "Publishing date" +#: cps/templates/book_edit.html:90 +msgid "Published Date" msgstr "出版日期" -#: cps/templates/book_edit.html:99 cps/templates/book_edit.html:257 -#: cps/templates/book_edit.html:274 cps/templates/detail.html:156 +#: cps/templates/book_edit.html:97 cps/templates/book_edit.html:258 +#: cps/templates/book_edit.html:275 cps/templates/detail.html:156 #: cps/templates/search_form.html:14 msgid "Publisher" msgstr "出版社" -#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:30 +#: cps/templates/book_edit.html:101 cps/templates/detail.html:123 +#: cps/templates/user_edit.html:31 msgid "Language" msgstr "语言" -#: cps/templates/book_edit.html:113 cps/templates/search_form.html:137 +#: cps/templates/book_edit.html:111 cps/templates/search_form.html:137 msgid "Yes" msgstr "确认" -#: cps/templates/book_edit.html:114 cps/templates/search_form.html:138 +#: cps/templates/book_edit.html:112 cps/templates/search_form.html:138 msgid "No" -msgstr "" +msgstr "无" -#: cps/templates/book_edit.html:160 -msgid "Upload format" +#: cps/templates/book_edit.html:158 +msgid "Upload Format" msgstr "上传格式" -#: cps/templates/book_edit.html:169 -msgid "view book after edit" +#: cps/templates/book_edit.html:167 +msgid "View Book on Save" msgstr "编辑后查看书籍" -#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:208 -msgid "Get metadata" +#: cps/templates/book_edit.html:170 cps/templates/book_edit.html:206 +msgid "Fetch Metadata" msgstr "获取元数据" -#: 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:170 cps/templates/shelf_edit.html:17 -#: cps/templates/user_edit.html:129 -msgid "Submit" -msgstr "提交" +#: cps/templates/book_edit.html:171 cps/templates/config_edit.html:343 +#: cps/templates/config_view_edit.html:150 cps/templates/email_edit.html:38 +#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:135 +msgid "Save" +msgstr "保存" -#: cps/templates/book_edit.html:187 +#: cps/templates/book_edit.html:185 msgid "Are you really sure?" msgstr "您真的确认?" -#: cps/templates/book_edit.html:190 -msgid "Book will be deleted from Calibre database" -msgstr "书籍会被从Calibre数据库和硬盘中删除" +#: cps/templates/book_edit.html:188 +msgid "This book will be permanently erased from database" +msgstr "书籍会从Calibre数据库中删除" -#: cps/templates/book_edit.html:191 -msgid "and from hard disk" -msgstr "" +#: cps/templates/book_edit.html:189 +msgid "and hard disk" +msgstr ",包括从硬盘中" -#: cps/templates/book_edit.html:211 +#: cps/templates/book_edit.html:209 msgid "Keyword" msgstr "关键字" -#: cps/templates/book_edit.html:212 +#: cps/templates/book_edit.html:210 msgid " Search keyword " msgstr "搜索关键字" -#: cps/templates/book_edit.html:214 cps/templates/layout.html:47 -msgid "Go!" -msgstr "走起!" - -#: cps/templates/book_edit.html:218 +#: cps/templates/book_edit.html:216 msgid "Click the cover to load metadata to the form" msgstr "点击封面加载元数据到表单" -#: cps/templates/book_edit.html:230 cps/templates/book_edit.html:270 +#: cps/templates/book_edit.html:231 cps/templates/book_edit.html:271 msgid "Loading..." msgstr "加载中..." -#: cps/templates/book_edit.html:235 cps/templates/layout.html:192 -#: cps/templates/layout.html:224 +#: cps/templates/book_edit.html:236 cps/templates/layout.html:191 +#: cps/templates/layout.html:223 cps/templates/modal_restriction.html:34 +#: cps/templates/user_edit.html:164 msgid "Close" msgstr "关闭" -#: cps/templates/book_edit.html:262 cps/templates/book_edit.html:276 +#: cps/templates/book_edit.html:263 cps/templates/book_edit.html:277 msgid "Source" msgstr "来源" -#: cps/templates/book_edit.html:271 +#: cps/templates/book_edit.html:272 msgid "Search error!" msgstr "搜索错误" -#: cps/templates/book_edit.html:272 -msgid "No Result(s) found! Please try aonther keyword." +#: cps/templates/book_edit.html:273 +msgid "No Result(s) found! Please try another keyword." msgstr "找不到结果。请尝试另一个关键字" #: cps/templates/config_edit.html:12 @@ -1297,7 +1332,7 @@ msgid "Library Configuration" msgstr "书库配置" #: cps/templates/config_edit.html:19 -msgid "Location of Calibre database" +msgid "Location of Calibre Database" msgstr "Calibre 数据库位置" #: cps/templates/config_edit.html:25 @@ -1349,8 +1384,8 @@ msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "SSL Key文件位置(非SSL服务器请留空)" #: cps/templates/config_edit.html:99 -msgid "Update channel" -msgstr "更新频道" +msgid "Update Channel" +msgstr "" #: cps/templates/config_edit.html:101 msgid "Stable" @@ -1372,10 +1407,6 @@ msgstr "Nightly (自动)" msgid "Logfile Configuration" msgstr "日志文件配置" -#: cps/templates/config_edit.html:122 -msgid "Log Level" -msgstr "日志级别" - #: cps/templates/config_edit.html:131 msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "日志文件位置和名称(默认为calibre-web.log)" @@ -1393,256 +1424,272 @@ msgid "Feature Configuration" msgstr "特性配置" #: cps/templates/config_edit.html:158 -msgid "Enable uploading" +msgid "Enable Uploads" msgstr "启用上传" #: cps/templates/config_edit.html:162 -msgid "Enable anonymous browsing" -msgstr "启用匿名浏览" +msgid "Enable Anonymous Browsing" +msgstr "允许匿名浏览" #: cps/templates/config_edit.html:166 -msgid "Enable public registration" +msgid "Enable Public Registration" msgstr "启用注册" #: cps/templates/config_edit.html:170 -msgid "Enable remote login (\"magic link\")" +msgid "Enable Magic Link Remote Login" msgstr "启用远程登录 ('魔法链接')" #: cps/templates/config_edit.html:175 +msgid "Enable Kobo sync" +msgstr "启用Kobo同步" + +#: cps/templates/config_edit.html:180 +msgid "Proxy unknown requests to Kobo Store" +msgstr "" + +#: cps/templates/config_edit.html:187 msgid "Use Goodreads" msgstr "使用Goodreads" -#: cps/templates/config_edit.html:176 -msgid "Obtain an API Key" +#: cps/templates/config_edit.html:188 +msgid "Create an API Key" msgstr "获取API Key" -#: cps/templates/config_edit.html:180 +#: cps/templates/config_edit.html:192 msgid "Goodreads API Key" msgstr "" -#: cps/templates/config_edit.html:184 +#: cps/templates/config_edit.html:196 msgid "Goodreads API Secret" msgstr "" -#: cps/templates/config_edit.html:191 +#: cps/templates/config_edit.html:203 msgid "Login type" msgstr "登录类型" -#: cps/templates/config_edit.html:193 -msgid "Use standard Authentication" +#: cps/templates/config_edit.html:205 +msgid "Use Standard Authentication" msgstr "使用标准认证" -#: cps/templates/config_edit.html:195 +#: cps/templates/config_edit.html:207 msgid "Use LDAP Authentication" msgstr "使用LDAP认证" -#: cps/templates/config_edit.html:198 +#: cps/templates/config_edit.html:210 msgid "Use OAuth" msgstr "使用OAuth" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:217 msgid "LDAP Server Host Name or IP Address" msgstr "LDAP服务器名称或IP地址" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:221 msgid "LDAP Server Port" msgstr "LDAP服务器端口" -#: cps/templates/config_edit.html:213 -msgid "LDAP schema (ldap or ldaps)" +#: cps/templates/config_edit.html:225 +msgid "LDAP Schema (LDAP or LPAPS)" msgstr "" -#: cps/templates/config_edit.html:217 -msgid "LDAP Admin username" -msgstr "LDAP Admin用户名" +#: cps/templates/config_edit.html:229 +msgid "LDAP Administrator Username" +msgstr "LDAP管理员用户名" -#: cps/templates/config_edit.html:221 -msgid "LDAP Admin password" -msgstr "LDAP Admin密码" +#: cps/templates/config_edit.html:233 +msgid "LDAP Administrator Password" +msgstr "LDAP管理员密码" -#: cps/templates/config_edit.html:226 -msgid "LDAP Server use SSL" +#: cps/templates/config_edit.html:238 +msgid "LDAP Server Enable SSL" msgstr "LDAP服务器使用SSL" -#: cps/templates/config_edit.html:230 -msgid "LDAP Server use TLS" +#: cps/templates/config_edit.html:242 +msgid "LDAP Server Enable TLS" msgstr "LDAP服务器使用TLS" -#: cps/templates/config_edit.html:234 +#: cps/templates/config_edit.html:246 msgid "LDAP Server Certificate" msgstr "LDAP服务器证书" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:250 msgid "LDAP SSL Certificate Path" msgstr "LDAP SSL证书路径" -#: cps/templates/config_edit.html:243 +#: cps/templates/config_edit.html:255 msgid "LDAP Distinguished Name (DN)" msgstr "" -#: cps/templates/config_edit.html:247 -msgid "LDAP User object filter" +#: cps/templates/config_edit.html:259 +msgid "LDAP User Object Filter" msgstr "" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:264 msgid "LDAP Server is OpenLDAP?" msgstr "" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:272 #, python-format msgid "Obtain %(provider)s OAuth Credential" -msgstr "" +msgstr "获取 %(provider)s OAuth Credential" -#: cps/templates/config_edit.html:263 +#: cps/templates/config_edit.html:275 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:279 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:276 +#: cps/templates/config_edit.html:288 msgid "Allow Reverse Proxy Authentication" -msgstr "" +msgstr "允许反向代理认证方式" -#: cps/templates/config_edit.html:280 +#: cps/templates/config_edit.html:292 msgid "Reverse Proxy Header Name" -msgstr "" +msgstr "反向代理Header Name" -#: cps/templates/config_edit.html:292 +#: cps/templates/config_edit.html:304 msgid "External binaries" msgstr "外部二进制" -#: cps/templates/config_edit.html:300 -msgid "No converter" +#: cps/templates/config_edit.html:312 +msgid "No Converter" msgstr "没有转换器" -#: cps/templates/config_edit.html:302 +#: cps/templates/config_edit.html:314 msgid "Use Kindlegen" msgstr "使用Kindlegen" -#: cps/templates/config_edit.html:304 +#: cps/templates/config_edit.html:316 msgid "Use calibre's ebook converter" msgstr "使用calibre的电子书转换器" -#: cps/templates/config_edit.html:308 +#: cps/templates/config_edit.html:320 msgid "E-Book converter settings" msgstr "电子书转换设置" -#: cps/templates/config_edit.html:312 +#: cps/templates/config_edit.html:324 msgid "Path to convertertool" msgstr "转换工具路径" -#: cps/templates/config_edit.html:318 +#: cps/templates/config_edit.html:330 msgid "Location of Unrar binary" msgstr "Unrar二进制位置" -#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 -#: cps/templates/login.html:4 +#: cps/templates/config_edit.html:349 cps/templates/layout.html:84 +#: cps/templates/login.html:4 cps/templates/login.html:20 msgid "Login" msgstr "登录" -#: cps/templates/config_view_edit.html:12 +#: cps/templates/config_view_edit.html:16 msgid "View Configuration" msgstr "查看配置" -#: cps/templates/config_view_edit.html:19 cps/templates/shelf_edit.html:7 +#: cps/templates/config_view_edit.html:23 cps/templates/shelf_edit.html:7 msgid "Title" msgstr "标题" -#: cps/templates/config_view_edit.html:27 -msgid "No. of random books to show" +#: cps/templates/config_view_edit.html:31 +msgid "No. of Random Books to Display" msgstr "随机书籍显示数量" -#: cps/templates/config_view_edit.html:31 -msgid "No. of authors to show before hiding (0=disable hiding)" -msgstr "" +#: cps/templates/config_view_edit.html:35 +msgid "No. of Authors to Display Before Hiding (0=Disable Hiding)" +msgstr "作者数量显示上限(0=不隐藏)" -#: cps/templates/config_view_edit.html:35 cps/templates/readcbr.html:112 +#: cps/templates/config_view_edit.html:39 cps/templates/readcbr.html:112 msgid "Theme" msgstr "主题" -#: cps/templates/config_view_edit.html:37 +#: cps/templates/config_view_edit.html:41 msgid "Standard Theme" msgstr "标准主题" -#: cps/templates/config_view_edit.html:38 +#: cps/templates/config_view_edit.html:42 msgid "caliBlur! Dark Theme" msgstr "" -#: cps/templates/config_view_edit.html:42 -msgid "Regular expression for ignoring columns" +#: cps/templates/config_view_edit.html:46 +msgid "Regular Expression for Ignoring Columns" msgstr "忽略列的正则表达式" -#: cps/templates/config_view_edit.html:46 -msgid "Link read/unread status to Calibre column" +#: cps/templates/config_view_edit.html:50 +msgid "Link Read/Unread Status to Calibre Column" msgstr "链接 已读/未读 状态到Calibre栏" -#: cps/templates/config_view_edit.html:55 -msgid "Regular expression for title sorting" -msgstr "标题排序的正则表达式" - #: cps/templates/config_view_edit.html:59 -msgid "Tags for Mature Content" -msgstr "成人内容标签" +msgid "View Restrictions based on Calibre column" +msgstr "根据Calibre column设定查看限制" + +#: cps/templates/config_view_edit.html:61 cps/templates/email_edit.html:21 +msgid "None" +msgstr "无" + +#: cps/templates/config_view_edit.html:68 +msgid "Regular Expression for Title Sorting" +msgstr "标题排序的正则表达式" -#: cps/templates/config_view_edit.html:73 -msgid "Default settings for new users" +#: cps/templates/config_view_edit.html:80 +msgid "Default Settings for New Users" msgstr "新用户默认设置" -#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:82 -msgid "Admin user" +#: cps/templates/config_view_edit.html:88 cps/templates/user_edit.html:92 +msgid "Admin User" msgstr "管理用户" -#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:91 +#: cps/templates/config_view_edit.html:92 cps/templates/user_edit.html:97 msgid "Allow Downloads" msgstr "允许下载" -#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:95 -msgid "Allow book viewer" -msgstr "" +#: cps/templates/config_view_edit.html:96 cps/templates/user_edit.html:101 +msgid "Allow eBook Viewer" +msgstr "允许eBook Viewer" -#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:99 +#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:105 msgid "Allow Uploads" msgstr "允许上传" -#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:103 +#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:109 msgid "Allow Edit" msgstr "允许编辑" -#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 -msgid "Allow Delete books" +#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:113 +msgid "Allow Delete Books" msgstr "允许删除书籍" -#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:112 +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:118 msgid "Allow Changing Password" msgstr "允许修改密码" -#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:116 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:122 msgid "Allow Editing Public Shelfs" msgstr "允许编辑公共书架" -#: cps/templates/config_view_edit.html:119 -msgid "Default visibilities for new users" +#: cps/templates/config_view_edit.html:126 +msgid "Default Visibilities for New Users" msgstr "新用户的默认显示权限" -#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:74 -msgid "Show random books in detail view" +#: cps/templates/config_view_edit.html:142 +msgid "Show Random Books in Detail View" msgstr "在详情页显示随机书籍" -#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:87 -msgid "Show mature content" -msgstr "显示成人内容" +#: cps/templates/config_view_edit.html:144 +msgid "Add Allowed/Denied Tags" +msgstr "添加(允许/禁止)标签" + +#: cps/templates/config_view_edit.html:145 +msgid "Add Allowed/Denied custom column values" +msgstr "添加(允许/禁止)自定义栏值" #: cps/templates/detail.html:59 -msgid "Read in browser" -msgstr "在浏览器中阅读" +msgid "Read in Browser" +msgstr "在线浏览" #: cps/templates/detail.html:72 -msgid "Listen in browser" -msgstr "" +msgid "Listen in Browser" +msgstr "在线听书" #: cps/templates/detail.html:117 msgid "Book" @@ -1652,9 +1699,9 @@ msgstr "" msgid "of" msgstr "" -#: cps/templates/detail.html:123 -msgid "language" -msgstr "语言" +#: cps/templates/detail.html:165 +msgid "Published" +msgstr "出版" #: cps/templates/detail.html:200 msgid "Mark As Unread" @@ -1666,7 +1713,7 @@ msgstr "标为已读" #: cps/templates/detail.html:201 msgid "Read" -msgstr "阅读" +msgstr "已读" #: cps/templates/detail.html:211 msgid "Description:" @@ -1677,21 +1724,9 @@ msgid "Add to shelf" msgstr "添加到书架" #: cps/templates/detail.html:286 -msgid "Edit metadata" +msgid "Edit Metadata" msgstr "编辑元数据" -#: cps/templates/email_edit.html:15 -msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" -msgstr "SMTP端口(无加密SMTP通常是25, SSL加密是465, STARTTLS加密是587)" - -#: cps/templates/email_edit.html:19 -msgid "Encryption" -msgstr "加密方式" - -#: cps/templates/email_edit.html:21 -msgid "None" -msgstr "无" - #: cps/templates/email_edit.html:22 msgid "STARTTLS" msgstr "" @@ -1701,23 +1736,15 @@ msgid "SSL/TLS" msgstr "" #: cps/templates/email_edit.html:31 -msgid "SMTP password" +msgid "SMTP Password" msgstr "SMTP密码" -#: cps/templates/email_edit.html:35 -msgid "From e-mail" -msgstr "来自邮箱" - -#: cps/templates/email_edit.html:38 -msgid "Save settings" -msgstr "保存设置" - #: cps/templates/email_edit.html:39 -msgid "Save settings and send Test E-Mail" +msgid "Save and Send Test E-mail" msgstr "保存设置并发送测试邮件" #: cps/templates/email_edit.html:43 -msgid "Allowed domains for registering" +msgid "Allowed Domains (Whitelist)" msgstr "允许注册的域名" #: cps/templates/email_edit.html:46 cps/templates/email_edit.html:72 @@ -1733,32 +1760,32 @@ msgid "Enter domainname" msgstr "输入域名" #: cps/templates/email_edit.html:60 -msgid "Denied domains for registering" -msgstr "" +msgid "Denied Domains (Blacklist)" +msgstr "禁用的域名(黑名单)" #: cps/templates/email_edit.html:90 -msgid "Do you really want to delete this domain rule?" +msgid "Are you sure you want to delete this domain?" msgstr "您确定要删除这条域名规则吗?" -#: cps/templates/feed.xml:21 cps/templates/layout.html:176 +#: cps/templates/feed.xml:21 cps/templates/layout.html:175 msgid "Next" msgstr "下一个" -#: cps/templates/http_error.html:37 -msgid "Create issue" +#: cps/templates/generate_kobo_auth_url.html:5 +msgid "Open the .kobo/Kobo eReader.conf file in a text editor and add (or edit):" +msgstr "在文本编辑器中打开.kobo/Kobo eReader.conf,增加(修改为):" + +#: cps/templates/http_error.html:38 +msgid "Create Issue" msgstr "创建issue" -#: cps/templates/http_error.html:44 -msgid "Back to home" +#: cps/templates/http_error.html:45 +msgid "Return to Home" msgstr "回到首页" -#: cps/templates/index.html:5 -msgid "Discover (Random Books)" -msgstr "发现(随机书籍)" - #: cps/templates/index.html:64 msgid "Group by series" -msgstr "" +msgstr "根据系列分组" #: cps/templates/index.xml:6 msgid "Start" @@ -1774,13 +1801,17 @@ msgstr "基于评分的热门书籍" #: cps/templates/index.xml:31 msgid "Recently added Books" -msgstr "" +msgstr "最近添加的书籍" #: cps/templates/index.xml:35 msgid "The latest Books" msgstr "最新书籍" -#: cps/templates/index.xml:42 +#: cps/templates/index.xml:38 +msgid "Random Books" +msgstr "随机书籍" + +#: cps/templates/index.xml:42 cps/templates/user_edit.html:80 msgid "Show Random Books" msgstr "显示随机书籍" @@ -1802,25 +1833,29 @@ msgstr "书籍按丛书排序" #: cps/templates/index.xml:93 msgid "Books ordered by Languages" -msgstr "" +msgstr "根据语言排序书籍" #: cps/templates/index.xml:100 -msgid "Books ordered by file formats" +msgid "Books ordered by Rating" msgstr "" -#: cps/templates/index.xml:103 cps/templates/layout.html:137 +#: cps/templates/index.xml:108 +msgid "Books ordered by file formats" +msgstr "根据文件类型排序书籍" + +#: cps/templates/index.xml:111 cps/templates/layout.html:136 msgid "Public Shelves" msgstr "公开书架" -#: cps/templates/index.xml:107 +#: cps/templates/index.xml:115 msgid "Books organized in public shelfs, visible to everyone" msgstr "公开书架中的书籍,对所有人都可见" -#: cps/templates/index.xml:111 cps/templates/layout.html:141 +#: cps/templates/index.xml:119 cps/templates/layout.html:140 msgid "Your Shelves" msgstr "您的书架" -#: cps/templates/index.xml:115 +#: cps/templates/index.xml:123 msgid "User's own shelfs, only visible to the current user himself" msgstr "用户私有书架,只对当前用户本身可见" @@ -1828,10 +1863,19 @@ msgstr "用户私有书架,只对当前用户本身可见" msgid "Home" msgstr "首页" +#: cps/templates/layout.html:28 cps/templates/shelf_order.html:32 +#: cps/templates/user_edit.html:178 +msgid "Back" +msgstr "后退" + #: cps/templates/layout.html:34 -msgid "Toggle navigation" +msgid "Toggle Navigation" msgstr "切换导航" +#: cps/templates/layout.html:45 +msgid "Search Library" +msgstr "搜索书库" + #: cps/templates/layout.html:55 msgid "Advanced Search" msgstr "高级搜索" @@ -1853,79 +1897,106 @@ msgstr "注销" msgid "Register" msgstr "注册" -#: cps/templates/layout.html:116 cps/templates/layout.html:223 +#: cps/templates/layout.html:116 cps/templates/layout.html:222 msgid "Uploading..." msgstr "上传中..." #: cps/templates/layout.html:117 -msgid "please don't refresh the page" +msgid "Please do not refresh the page" msgstr "请不要刷新页面" #: cps/templates/layout.html:127 msgid "Browse" msgstr "浏览" -#: cps/templates/layout.html:146 +#: cps/templates/layout.html:145 msgid "Create a Shelf" msgstr "创建书架" -#: cps/templates/layout.html:147 cps/templates/stats.html:3 +#: cps/templates/layout.html:146 cps/templates/stats.html:3 msgid "About" msgstr "关于" -#: cps/templates/layout.html:161 +#: cps/templates/layout.html:160 msgid "Previous" msgstr "上一个" -#: cps/templates/layout.html:188 +#: cps/templates/layout.html:187 msgid "Book Details" msgstr "书籍详情" -#: cps/templates/layout.html:222 +#: cps/templates/layout.html:221 msgid "Upload done, processing, please wait..." msgstr "上传完成,正在处理,请稍候..." -#: cps/templates/layout.html:225 +#: cps/templates/layout.html:224 msgid "Error" msgstr "错误" -#: cps/templates/login.html:8 cps/templates/login.html:9 -#: cps/templates/register.html:7 cps/templates/user_edit.html:8 -msgid "Username" -msgstr "用户名" - #: cps/templates/login.html:12 cps/templates/login.html:13 #: cps/templates/user_edit.html:21 msgid "Password" msgstr "密码" #: cps/templates/login.html:17 -msgid "Remember me" +msgid "Remember Me" msgstr "记住我" #: cps/templates/login.html:22 -msgid "Forgot password" -msgstr "" +msgid "Forgot Password?" +msgstr "忘记密码?" #: cps/templates/login.html:25 -msgid "Log in with magic link" +msgid "Log in with Magic Link" msgstr "通过魔法链接登录" -#: cps/templates/logviewer.html:5 -msgid "Show Calibre-Web log" -msgstr "显示Calibre-Web日志" +#: cps/templates/logviewer.html:6 +msgid "Show Calibre-Web Log: " +msgstr "显示Calibre-Web Log" + +#: cps/templates/logviewer.html:8 +msgid "Calibre-Web Log: " +msgstr "" #: cps/templates/logviewer.html:8 -msgid "Show access log" -msgstr "显示访问日志" +msgid "Stream output, can't be displayed" +msgstr "" + +#: cps/templates/logviewer.html:12 +msgid "Show Access Log: " +msgstr "显示Access Log: " + +#: cps/templates/modal_restriction.html:6 +msgid "Select allowed/denied Tags" +msgstr "选择(允许/禁止)标签" + +#: cps/templates/modal_restriction.html:7 +msgid "Select allowed/denied Custom Column values" +msgstr "选择(允许/禁止)自定义栏值" + +#: cps/templates/modal_restriction.html:8 +msgid "Select allowed/denied Tags of user" +msgstr "选择(允许/禁止)用户标签" + +#: cps/templates/modal_restriction.html:9 +msgid "Select allowed/denied Custom Column values of user" +msgstr "选择(允许/禁止)用户自定义栏值" + +#: cps/templates/modal_restriction.html:15 +msgid "Enter Tag" +msgstr "输入标签" + +#: cps/templates/modal_restriction.html:24 +msgid "Add View Restriction" +msgstr "输入查看限制" #: cps/templates/osd.xml:5 -msgid "Calibre-Web ebook catalog" +msgid "Calibre-Web eBook Catalog" msgstr "Caliebre-Web电子书目录" #: cps/templates/read.html:74 msgid "Reflow text when sidebars are open." -msgstr "" +msgstr "侧栏打开时重排文本" #: cps/templates/readcbr.html:88 msgid "Keyboard Shortcuts" @@ -1953,7 +2024,7 @@ msgstr "按高度缩放" #: cps/templates/readcbr.html:96 msgid "Scale to Native" -msgstr "" +msgstr "缩放到原始大小" #: cps/templates/readcbr.html:97 msgid "Rotate Right" @@ -1993,7 +2064,7 @@ msgstr "高度" #: cps/templates/readcbr.html:127 msgid "Native" -msgstr "" +msgstr "原始" #: cps/templates/readcbr.html:132 msgid "Rotate" @@ -2032,52 +2103,52 @@ msgid "Basic txt Reader" msgstr "简单txt阅读器" #: cps/templates/register.html:4 -msgid "Register a new account" +msgid "Register New Account" msgstr "注册新用户" #: cps/templates/register.html:8 msgid "Choose a username" msgstr "选择一个用户名" -#: cps/templates/register.html:11 cps/templates/user_edit.html:13 -msgid "E-mail address" -msgstr "邮箱地址" - #: cps/templates/register.html:12 msgid "Your email address" msgstr "您的邮箱地址" +#: cps/templates/remote_login.html:4 +msgid "Magic Link - Authorise New Device" +msgstr "魔法链接 - 授权新设备" + #: cps/templates/remote_login.html:6 -msgid "Use your other device, login and visit " -msgstr "" +msgid "On another device, login and visit:" +msgstr "在另一个设备上,登录并访问:" -#: cps/templates/remote_login.html:9 -msgid "Once you do so, you will automatically get logged in on this device." -msgstr "一旦您这样做了,您在这个设备上会自动登录。" +#: cps/templates/remote_login.html:10 +msgid "Once verified, you will automatically be logged in on this device." +msgstr "验证后,您将自动在新设备上登录。" -#: cps/templates/remote_login.html:12 -msgid "The link will expire after 10 minutes." -msgstr "" +#: cps/templates/remote_login.html:13 +msgid "This verification link will expire in 10 minutes." +msgstr "此验证链接将在10分钟后失效。" #: cps/templates/search.html:5 -msgid "No Results for:" -msgstr "找不到结果:" +msgid "No Results Found" +msgstr "搜索无结果" #: cps/templates/search.html:6 -msgid "Please try a different search" -msgstr "请尝试别的关键字" +msgid "Search Term:" +msgstr "搜索项:" #: cps/templates/search.html:8 msgid "Results for:" msgstr "结果:" #: cps/templates/search_form.html:19 -msgid "Publishing date from" -msgstr "" +msgid "Published Date From" +msgstr "出版日期从" #: cps/templates/search_form.html:26 -msgid "Publishing date to" -msgstr "" +msgid "Published Date To" +msgstr "出版日期到" #: cps/templates/search_form.html:43 msgid "Exclude Tags" @@ -2093,18 +2164,18 @@ msgstr "排除语言" #: cps/templates/search_form.html:95 msgid "Extensions" -msgstr "" +msgstr "后缀名" #: cps/templates/search_form.html:105 msgid "Exclude Extensions" -msgstr "" +msgstr "排除后缀名" #: cps/templates/search_form.html:117 -msgid "Rating bigger than" +msgid "Rating Above" msgstr "评分大于" #: cps/templates/search_form.html:121 -msgid "Rating less than" +msgid "Rating Below" msgstr "评分小于" #: cps/templates/shelf.html:10 @@ -2120,23 +2191,23 @@ msgid "Change order" msgstr "修改顺序" #: cps/templates/shelf.html:67 -msgid "Do you really want to delete the shelf?" +msgid "Are you sure you want to delete this shelf?" msgstr "您真的想要删除这个书架吗?" #: cps/templates/shelf.html:70 -msgid "Shelf will be lost for everybody and forever!" +msgid "Shelf will be deleted for all users" msgstr "书架将会永远丢失!" #: cps/templates/shelf_edit.html:13 -msgid "should the shelf be public?" +msgid "Share with Everyone" msgstr "要公开此书架吗?" #: cps/templates/shelf_order.html:5 -msgid "Drag 'n drop to rearrange order" +msgid "Drag to Rearrange Order" msgstr "拖拽以重新排序" #: cps/templates/stats.html:7 -msgid "Calibre library statistics" +msgid "Library Statistics" msgstr "Calibre书库统计" #: cps/templates/stats.html:12 @@ -2156,21 +2227,17 @@ msgid "Series in this Library" msgstr "个丛书在此书库" #: cps/templates/stats.html:28 -msgid "Linked libraries" +msgid "Linked Libraries" msgstr "链接库" #: cps/templates/stats.html:32 -msgid "Program library" +msgid "Program Library" msgstr "程序库" #: cps/templates/stats.html:33 msgid "Installed Version" msgstr "已安装版本" -#: cps/templates/tasks.html:7 -msgid "Tasks list" -msgstr "任务列表" - #: cps/templates/tasks.html:12 msgid "User" msgstr "用户" @@ -2188,11 +2255,11 @@ msgid "Progress" msgstr "进展" #: cps/templates/tasks.html:17 -msgid "Runtime" +msgid "Run Time" msgstr "运行时间" #: cps/templates/tasks.html:18 -msgid "Starttime" +msgid "Start Time" msgstr "开始时间" #: cps/templates/tasks.html:24 @@ -2207,1454 +2274,58 @@ msgstr "隐藏所有任务" msgid "Reset user Password" msgstr "重置用户密码" -#: cps/templates/user_edit.html:26 -msgid "Kindle E-Mail" -msgstr "" - -#: cps/templates/user_edit.html:39 -msgid "Show books with language" +#: cps/templates/user_edit.html:41 +msgid "Language of Books" msgstr "按语言显示书籍" -#: cps/templates/user_edit.html:41 -msgid "Show all" +#: cps/templates/user_edit.html:43 +msgid "Show All" msgstr "显示全部" -#: cps/templates/user_edit.html:51 +#: cps/templates/user_edit.html:52 msgid "OAuth Settings" msgstr "OAuth设置" -#: cps/templates/user_edit.html:53 +#: cps/templates/user_edit.html:54 msgid "Link" msgstr "链接" -#: cps/templates/user_edit.html:55 +#: cps/templates/user_edit.html:56 msgid "Unlink" msgstr "取消链接" -#: cps/templates/user_edit.html:123 -msgid "Delete this user" -msgstr "删除此用户" - -#: cps/templates/user_edit.html:138 -msgid "Recent Downloads" -msgstr "最近下载" - -#~ msgid "Afar" -#~ msgstr "阿法尔语" - -#~ msgid "Abkhazian" -#~ msgstr "阿布哈兹语" - -#~ msgid "Achinese" -#~ msgstr "亚齐语" - -#~ msgid "Acoli" -#~ msgstr "阿乔利语" - -#~ msgid "Adangme" -#~ msgstr "阿当梅语" - -#~ msgid "Adyghe" -#~ msgstr "阿迪格语" - -#~ msgid "Afrihili" -#~ msgstr "阿弗里希利语" - -#~ msgid "Afrikaans" -#~ msgstr "南非荷兰语" - -#~ msgid "Ainu (Japan)" -#~ msgstr "阿伊努语(日本)" - -#~ msgid "Akan" -#~ msgstr "阿坎语" - -#~ msgid "Akkadian" -#~ msgstr "阿卡德语" - -#~ msgid "Aleut" -#~ msgstr "阿留申语" - -#~ msgid "Altai; Southern" -#~ msgstr "阿尔泰语(南)" - -#~ msgid "Amharic" -#~ msgstr "阿姆哈拉语" - -#~ msgid "English; Old (ca. 450-1100)" -#~ msgstr "英语(上古,约 450-1100)" - -#~ msgid "Angika" -#~ msgstr "安吉卡语" - -#~ msgid "Arabic" -#~ msgstr "阿拉伯语" - -#~ msgid "Aramaic; Official (700-300 BCE)" -#~ msgstr "阿拉米语(官方,公元前 700-300)" - -#~ msgid "Aragonese" -#~ msgstr "阿拉贡语" - -#~ msgid "Mapudungun" -#~ msgstr "阿劳坎语" - -#~ msgid "Arapaho" -#~ msgstr "阿拉帕霍语" - -#~ msgid "Arawak" -#~ msgstr "阿拉瓦克语" - -#~ msgid "Assamese" -#~ msgstr "阿萨姆语" - -#~ msgid "Asturian" -#~ msgstr "阿斯图里亚斯语" - -#~ msgid "Avaric" -#~ msgstr "阿瓦尔语" - -#~ msgid "Avestan" -#~ msgstr "阿维斯陀语" - -#~ msgid "Awadhi" -#~ msgstr "阿瓦德语" - -#~ msgid "Aymara" -#~ msgstr "艾马拉语" - -#~ msgid "Azerbaijani" -#~ msgstr "阿塞拜疆语" - -#~ msgid "Bashkir" -#~ msgstr "巴什基尔语" - -#~ msgid "Baluchi" -#~ msgstr "俾路支语" - -#~ msgid "Bambara" -#~ msgstr "班巴拉语" - -#~ msgid "Balinese" -#~ msgstr "巴厘语" - -#~ msgid "Basa (Cameroon)" -#~ msgstr "巴萨语(喀麦隆)" - -#~ msgid "Beja" -#~ msgstr "贝扎语" - -#~ msgid "Belarusian" -#~ msgstr "白俄罗斯语" - -#~ msgid "Bemba (Zambia)" -#~ msgstr "本巴语(赞比亚)" - -#~ msgid "Bengali" -#~ msgstr "孟加拉语" - -#~ msgid "Bhojpuri" -#~ msgstr "博杰普尔语" - -#~ msgid "Bikol" -#~ msgstr "比科尔语" - -#~ msgid "Bini" -#~ msgstr "比尼语" - -#~ msgid "Bislama" -#~ msgstr "比斯拉马语" - -#~ msgid "Siksika" -#~ msgstr "西克西卡语" - -#~ msgid "Tibetan" -#~ msgstr "藏语" - -#~ msgid "Bosnian" -#~ msgstr "波斯尼亚语" - -#~ msgid "Braj" -#~ msgstr "布拉吉语" - -#~ msgid "Breton" -#~ msgstr "布列塔尼语" - -#~ msgid "Buriat" -#~ msgstr "布里亚特语" - -#~ msgid "Buginese" -#~ msgstr "布吉语" - -#~ msgid "Bulgarian" -#~ msgstr "保加利亚语" - -#~ msgid "Bilin" -#~ msgstr "比林语" - -#~ msgid "Caddo" -#~ msgstr "卡多语" - -#~ msgid "Carib; Galibi" -#~ msgstr "加勒比语" - -#~ msgid "Catalan" -#~ msgstr "加泰罗尼亚语" - -#~ msgid "Cebuano" -#~ msgstr "宿务语" - -#~ msgid "Czech" -#~ msgstr "捷克语" - -#~ msgid "Chamorro" -#~ msgstr "查莫罗语" - -#~ msgid "Chibcha" -#~ msgstr "奇布查语" - -#~ msgid "Chechen" -#~ msgstr "车臣语" - -#~ msgid "Chagatai" -#~ msgstr "察合台语" - -#~ msgid "Chuukese" -#~ msgstr "丘克语" - -#~ msgid "Mari (Russia)" -#~ msgstr "马里语(俄罗斯)" - -#~ msgid "Chinook jargon" -#~ msgstr "奇努克混合语" - -#~ msgid "Choctaw" -#~ msgstr "乔克托语" - -#~ msgid "Chipewyan" -#~ msgstr "奇佩维安语" - -#~ msgid "Cherokee" -#~ msgstr "切罗基语" - -#~ msgid "Slavonic; Old" -#~ msgstr "斯拉夫语(古教会)" - -#~ msgid "Chuvash" -#~ msgstr "楚瓦什语" +#: cps/templates/user_edit.html:62 +msgid "Kobo Sync Token" +msgstr "" -#~ msgid "Cheyenne" -#~ msgstr "夏延语" +#: cps/templates/user_edit.html:64 +msgid "Create/View" +msgstr "新建/查看" -#~ msgid "Coptic" -#~ msgstr "科普特语" +#: cps/templates/user_edit.html:83 +msgid "Add allowed/denied Tags" +msgstr "添加(允许/禁止)标签" -#~ msgid "Cornish" -#~ msgstr "康沃尔语" +#: cps/templates/user_edit.html:84 +msgid "Add allowed/denied custom column values" +msgstr "添加(允许/禁止)自定义栏值" -#~ msgid "Corsican" -#~ msgstr "科西嘉语" +#: cps/templates/user_edit.html:129 +msgid "Delete User" +msgstr "删除此用户" -#~ msgid "Cree" -#~ msgstr "克里语" - -#~ msgid "Turkish; Crimean" -#~ msgstr "鞑靼语(克里米亚)" - -#~ msgid "Kashubian" -#~ msgstr "卡舒比语" - -#~ msgid "Welsh" -#~ msgstr "威尔士语" - -#~ msgid "Dakota" -#~ msgstr "达科他语" - -#~ msgid "Danish" -#~ msgstr "丹麦语" - -#~ msgid "Dargwa" -#~ msgstr "达尔格瓦语" - -#~ msgid "Delaware" -#~ msgstr "特拉华语" - -#~ msgid "Slave (Athapascan)" -#~ msgstr "史拉维语(阿沙巴斯甘)" - -#~ msgid "German" -#~ msgstr "德语" - -#~ msgid "Dogrib" -#~ msgstr "多格里布语" - -#~ msgid "Dinka" -#~ msgstr "丁卡语" - -#~ msgid "Dhivehi" -#~ msgstr "迪维希语" - -#~ msgid "Dogri (macrolanguage)" -#~ msgstr "多格拉语" - -#~ msgid "Sorbian; Lower" -#~ msgstr "索布语(下)" - -#~ msgid "Duala" -#~ msgstr "杜亚拉语" - -#~ msgid "Dutch; Middle (ca. 1050-1350)" -#~ msgstr "荷兰语(中古,约 1050-1350)" - -#~ msgid "Dyula" -#~ msgstr "迪尤拉语" - -#~ msgid "Dzongkha" -#~ msgstr "宗喀语" - -#~ msgid "Efik" -#~ msgstr "埃菲克语" - -#~ msgid "Egyptian (Ancient)" -#~ msgstr "埃及语(古)" - -#~ msgid "Ekajuk" -#~ msgstr "埃克丘克语" - -#~ msgid "Greek; Modern (1453-)" -#~ msgstr "希腊语(现代,1453-)" - -#~ msgid "Elamite" -#~ msgstr "埃兰语" - -#~ msgid "English" -#~ msgstr "英语" - -#~ msgid "English; Middle (1100-1500)" -#~ msgstr "英语(中古,1100-1500)" - -#~ msgid "Esperanto" -#~ msgstr "世界语" - -#~ msgid "Estonian" -#~ msgstr "爱沙尼亚语" - -#~ msgid "Basque" -#~ msgstr "巴斯克语" - -#~ msgid "Ewe" -#~ msgstr "埃维语" - -#~ msgid "Ewondo" -#~ msgstr "埃翁多语" - -#~ msgid "Fang (Equatorial Guinea)" -#~ msgstr "芳语(赤道几内亚)" - -#~ msgid "Faroese" -#~ msgstr "法罗语" - -#~ msgid "Persian" -#~ msgstr "波斯语" - -#~ msgid "Fanti" -#~ msgstr "芳蒂语" - -#~ msgid "Fijian" -#~ msgstr "斐济语" - -#~ msgid "Filipino" -#~ msgstr "菲律宾语" - -#~ msgid "Finnish" -#~ msgstr "芬兰语" - -#~ msgid "Fon" -#~ msgstr "丰语" - -#~ msgid "French" -#~ msgstr "法语" - -#~ msgid "French; Middle (ca. 1400-1600)" -#~ msgstr "法语(中古,约 1400-1600)" - -#~ msgid "French; Old (842-ca. 1400)" -#~ msgstr "法语(上古,842-约 1400)" - -#~ msgid "Frisian; Northern" -#~ msgstr "弗里西语(北)" - -#~ msgid "Frisian; Eastern" -#~ msgstr "弗里西亚语(东)" - -#~ msgid "Frisian; Western" -#~ msgstr "弗里西亚语(西)" - -#~ msgid "Fulah" -#~ msgstr "富拉语" - -#~ msgid "Friulian" -#~ msgstr "弗留利语" - -#~ msgid "Ga" -#~ msgstr "加语" - -#~ msgid "Gayo" -#~ msgstr "卡约语" - -#~ msgid "Gbaya (Central African Republic)" -#~ msgstr "巴亚语(中非共和国)" - -#~ msgid "Geez" -#~ msgstr "吉兹语" - -#~ msgid "Gilbertese" -#~ msgstr "吉尔伯特语" - -#~ msgid "Gaelic; Scottish" -#~ msgstr "盖尔语(苏格兰)" - -#~ msgid "Irish" -#~ msgstr "爱尔兰语" - -#~ msgid "Galician" -#~ msgstr "加利西亚语" - -#~ msgid "Manx" -#~ msgstr "马恩岛语" - -#~ msgid "German; Middle High (ca. 1050-1500)" -#~ msgstr "德语(中古高地,约 1050-1500)" - -#~ msgid "German; Old High (ca. 750-1050)" -#~ msgstr "德语(上古高地,约 750-1050)" - -#~ msgid "Gondi" -#~ msgstr "贡德语" - -#~ msgid "Gorontalo" -#~ msgstr "哥伦打洛语" - -#~ msgid "Gothic" -#~ msgstr "哥特语" - -#~ msgid "Grebo" -#~ msgstr "格列博语" - -#~ msgid "Greek; Ancient (to 1453)" -#~ msgstr "希腊语(古典,直到 1453)" - -#~ msgid "Guarani" -#~ msgstr "瓜拉尼语" - -#~ msgid "German; Swiss" -#~ msgstr "德语(瑞士)" - -#~ msgid "Gujarati" -#~ msgstr "古吉拉特语" - -#~ msgid "Gwichʼin" -#~ msgstr "库臣语" - -#~ msgid "Haida" -#~ msgstr "海达语" - -#~ msgid "Creole; Haitian" -#~ msgstr "克里奥尔语(海地)" - -#~ msgid "Hausa" -#~ msgstr "豪萨语" - -#~ msgid "Hawaiian" -#~ msgstr "夏威夷语" - -#~ msgid "Hebrew" -#~ msgstr "希伯来语" - -#~ msgid "Herero" -#~ msgstr "赫雷罗语" - -#~ msgid "Hiligaynon" -#~ msgstr "希利盖农语" - -#~ msgid "Hindi" -#~ msgstr "印地语" - -#~ msgid "Hittite" -#~ msgstr "赫梯语" - -#~ msgid "Hmong" -#~ msgstr "苗语" - -#~ msgid "Hiri Motu" -#~ msgstr "希里莫图语" - -#~ msgid "Croatian" -#~ msgstr "克罗地亚语" - -#~ msgid "Sorbian; Upper" -#~ msgstr "索布语(上)" - -#~ msgid "Hungarian" -#~ msgstr "匈牙利语" - -#~ msgid "Hupa" -#~ msgstr "胡帕语" - -#~ msgid "Armenian" -#~ msgstr "亚美尼亚语" - -#~ msgid "Iban" -#~ msgstr "伊班语" - -#~ msgid "Igbo" -#~ msgstr "伊博语" - -#~ msgid "Ido" -#~ msgstr "伊多语" - -#~ msgid "Yi; Sichuan" -#~ msgstr "彝语(四川)" - -#~ msgid "Inuktitut" -#~ msgstr "伊努伊特语" - -#~ msgid "Interlingue" -#~ msgstr "国际语(西方)" - -#~ msgid "Iloko" -#~ msgstr "伊洛卡诺语" - -#~ msgid "Interlingua (International Auxiliary Language Association)" -#~ msgstr "国际语" - -#~ msgid "Indonesian" -#~ msgstr "印尼语" - -#~ msgid "Ingush" -#~ msgstr "印古什语" - -#~ msgid "Inupiaq" -#~ msgstr "依努庇克语" - -#~ msgid "Icelandic" -#~ msgstr "冰岛语" - -#~ msgid "Italian" -#~ msgstr "意大利语" - -#~ msgid "Javanese" -#~ msgstr "爪哇语" - -#~ msgid "Lojban" -#~ msgstr "逻辑语" - -#~ msgid "Japanese" -#~ msgstr "日语" - -#~ msgid "Judeo-Persian" -#~ msgstr "犹太-波斯语" - -#~ msgid "Judeo-Arabic" -#~ msgstr "犹太-阿拉伯语" - -#~ msgid "Kara-Kalpak" -#~ msgstr "卡拉卡尔帕克语" - -#~ msgid "Kabyle" -#~ msgstr "卡布列语" - -#~ msgid "Kachin" -#~ msgstr "景颇语" - -#~ msgid "Kalaallisut" -#~ msgstr "格陵兰语" - -#~ msgid "Kamba (Kenya)" -#~ msgstr "坎巴语(肯尼亚)" - -#~ msgid "Kannada" -#~ msgstr "卡纳达语" - -#~ msgid "Kashmiri" -#~ msgstr "克什米尔语" - -#~ msgid "Georgian" -#~ msgstr "格鲁吉亚语" - -#~ msgid "Kanuri" -#~ msgstr "卡努里语" - -#~ msgid "Kawi" -#~ msgstr "卡威语" - -#~ msgid "Kazakh" -#~ msgstr "哈萨克语" - -#~ msgid "Kabardian" -#~ msgstr "卡巴尔达语" - -#~ msgid "Khasi" -#~ msgstr "卡西语" - -#~ msgid "Khmer; Central" -#~ msgstr "高棉语" - -#~ msgid "Khotanese" -#~ msgstr "和田语" - -#~ msgid "Kikuyu" -#~ msgstr "基库尤语" - -#~ msgid "Kinyarwanda" -#~ msgstr "基尼阿万达语" - -#~ msgid "Kirghiz" -#~ msgstr "吉尔吉斯语" - -#~ msgid "Kimbundu" -#~ msgstr "金本杜语" - -#~ msgid "Konkani (macrolanguage)" -#~ msgstr "孔卡尼语" - -#~ msgid "Komi" -#~ msgstr "科米语" - -#~ msgid "Kongo" -#~ msgstr "刚果语" - -#~ msgid "Korean" -#~ msgstr "朝鲜语" - -#~ msgid "Kosraean" -#~ msgstr "科斯拉伊语" - -#~ msgid "Kpelle" -#~ msgstr "克佩勒语" - -#~ msgid "Karachay-Balkar" -#~ msgstr "卡拉恰伊-巴尔卡尔语" - -#~ msgid "Karelian" -#~ msgstr "卡累利阿语" - -#~ msgid "Kurukh" -#~ msgstr "库卢克语" - -#~ msgid "Kuanyama" -#~ msgstr "宽亚玛语" - -#~ msgid "Kumyk" -#~ msgstr "库梅克语" - -#~ msgid "Kurdish" -#~ msgstr "库尔德语" - -#~ msgid "Kutenai" -#~ msgstr "库特内语" - -#~ msgid "Ladino" -#~ msgstr "拉迪诺语" - -#~ msgid "Lahnda" -#~ msgstr "拉亨达语" - -#~ msgid "Lamba" -#~ msgstr "兰巴语" - -#~ msgid "Lao" -#~ msgstr "老挝语" - -#~ msgid "Latin" -#~ msgstr "拉丁语" - -#~ msgid "Latvian" -#~ msgstr "拉脱维亚语" - -#~ msgid "Lezghian" -#~ msgstr "列兹金语" - -#~ msgid "Limburgan" -#~ msgstr "林堡语" - -#~ msgid "Lingala" -#~ msgstr "林加拉语" - -#~ msgid "Lithuanian" -#~ msgstr "立陶宛语" - -#~ msgid "Mongo" -#~ msgstr "芒戈语" - -#~ msgid "Lozi" -#~ msgstr "洛齐语" - -#~ msgid "Luxembourgish" -#~ msgstr "卢森堡语" - -#~ msgid "Luba-Lulua" -#~ msgstr "卢巴-卢拉语" - -#~ msgid "Luba-Katanga" -#~ msgstr "卢巴-加丹加语" - -#~ msgid "Ganda" -#~ msgstr "干达语" - -#~ msgid "Luiseno" -#~ msgstr "卢伊塞诺语" - -#~ msgid "Lunda" -#~ msgstr "隆达语" - -#~ msgid "Luo (Kenya and Tanzania)" -#~ msgstr "卢奥语(肯尼亚和坦桑尼亚)" - -#~ msgid "Lushai" -#~ msgstr "卢萨语" - -#~ msgid "Madurese" -#~ msgstr "马都拉语" - -#~ msgid "Magahi" -#~ msgstr "摩揭陀语" - -#~ msgid "Marshallese" -#~ msgstr "马绍尔语" - -#~ msgid "Maithili" -#~ msgstr "米德勒语" - -#~ msgid "Makasar" -#~ msgstr "望加锡语" - -#~ msgid "Malayalam" -#~ msgstr "马拉雅拉姆语" - -#~ msgid "Mandingo" -#~ msgstr "曼丁哥语" - -#~ msgid "Marathi" -#~ msgstr "马拉地语" - -#~ msgid "Masai" -#~ msgstr "马萨伊语" - -#~ msgid "Moksha" -#~ msgstr "莫克沙语" - -#~ msgid "Mandar" -#~ msgstr "曼达语" - -#~ msgid "Mende (Sierra Leone)" -#~ msgstr "门德语(塞拉利昂)" - -#~ msgid "Irish; Middle (900-1200)" -#~ msgstr "爱尔兰语(中古,900-1200)" - -#~ msgid "Mi'kmaq" -#~ msgstr "米克马克语" - -#~ msgid "Minangkabau" -#~ msgstr "米南卡保语" - -#~ msgid "Uncoded languages" -#~ msgstr "未被编码的语言" - -#~ msgid "Macedonian" -#~ msgstr "马其顿语" - -#~ msgid "Malagasy" -#~ msgstr "马达加斯加语" - -#~ msgid "Maltese" -#~ msgstr "马耳他语" - -#~ msgid "Manchu" -#~ msgstr "满语" - -#~ msgid "Manipuri" -#~ msgstr "曼尼普尔语" - -#~ msgid "Mohawk" -#~ msgstr "莫霍克语" - -#~ msgid "Mongolian" -#~ msgstr "蒙古语" - -#~ msgid "Mossi" -#~ msgstr "莫西语" - -#~ msgid "Maori" -#~ msgstr "毛利语" - -#~ msgid "Malay (macrolanguage)" -#~ msgstr "马来语族" - -#~ msgid "Multiple languages" -#~ msgstr "多种语言" - -#~ msgid "Creek" -#~ msgstr "克里克语" - -#~ msgid "Mirandese" -#~ msgstr "米兰德斯语" - -#~ msgid "Marwari" -#~ msgstr "马尔瓦利语" - -#~ msgid "Burmese" -#~ msgstr "缅甸语" - -#~ msgid "Erzya" -#~ msgstr "厄尔兹亚语" - -#~ msgid "Neapolitan" -#~ msgstr "拿坡里语" - -#~ msgid "Nauru" -#~ msgstr "瑙鲁语" - -#~ msgid "Navajo" -#~ msgstr "纳瓦霍语" - -#~ msgid "Ndebele; South" -#~ msgstr "恩德贝勒语(南)" - -#~ msgid "Ndebele; North" -#~ msgstr "恩德贝勒语(北)" - -#~ msgid "Ndonga" -#~ msgstr "恩敦加语" - -#~ msgid "German; Low" -#~ msgstr "撒克逊语(低地)" - -#~ msgid "Nepali" -#~ msgstr "尼泊尔语" - -#~ msgid "Bhasa; Nepal" -#~ msgstr "尼瓦尔语" - -#~ msgid "Nias" -#~ msgstr "尼亚斯语" - -#~ msgid "Niuean" -#~ msgstr "纽埃语" - -#~ msgid "Dutch" -#~ msgstr "荷兰语" - -#~ msgid "Norwegian Nynorsk" -#~ msgstr "新挪威语" - -#~ msgid "Norwegian Bokmål" -#~ msgstr "挪威布克莫尔语" - -#~ msgid "Nogai" -#~ msgstr "诺盖语" - -#~ msgid "Norse; Old" -#~ msgstr "诺尔斯语(古)" - -#~ msgid "Norwegian" -#~ msgstr "挪威语" - -#~ msgid "N'Ko" -#~ msgstr "西非书面语言字母" - -#~ msgid "Sotho; Northern" -#~ msgstr "索托语(北)" - -#~ msgid "Newari; Old" -#~ msgstr "尼瓦尔语(古典)" - -#~ msgid "Nyanja" -#~ msgstr "尼扬贾语" - -#~ msgid "Nyamwezi" -#~ msgstr "尼扬韦齐语" - -#~ msgid "Nyankole" -#~ msgstr "尼扬科勒语" - -#~ msgid "Nyoro" -#~ msgstr "尼奥罗语" - -#~ msgid "Nzima" -#~ msgstr "恩济马语" - -#~ msgid "Occitan (post 1500)" -#~ msgstr "奥克西唐语(1500 后)" - -#~ msgid "Ojibwa" -#~ msgstr "奥吉布瓦语" - -#~ msgid "Oriya" -#~ msgstr "奥利亚语" - -#~ msgid "Oromo" -#~ msgstr "奥罗莫语" - -#~ msgid "Osage" -#~ msgstr "奥萨格语" - -#~ msgid "Ossetian" -#~ msgstr "奥塞梯语" - -#~ msgid "Turkish; Ottoman (1500-1928)" -#~ msgstr "土耳其语(奥斯曼,1500-1928)" - -#~ msgid "Pangasinan" -#~ msgstr "邦阿西楠语" - -#~ msgid "Pahlavi" -#~ msgstr "钵罗钵语" - -#~ msgid "Pampanga" -#~ msgstr "邦板牙语" - -#~ msgid "Panjabi" -#~ msgstr "旁遮普语" - -#~ msgid "Papiamento" -#~ msgstr "帕皮亚门托语" - -#~ msgid "Palauan" -#~ msgstr "帕劳语" - -#~ msgid "Persian; Old (ca. 600-400 B.C.)" -#~ msgstr "波斯语(古,公元前约 600-400)" - -#~ msgid "Phoenician" -#~ msgstr "腓尼基语" - -#~ msgid "Pali" -#~ msgstr "巴利语" - -#~ msgid "Polish" -#~ msgstr "波兰语" - -#~ msgid "Pohnpeian" -#~ msgstr "波纳佩语" - -#~ msgid "Portuguese" -#~ msgstr "葡萄牙语" - -#~ msgid "Provençal; Old (to 1500)" -#~ msgstr "普罗旺斯语(古,至 1500)" - -#~ msgid "Pushto" -#~ msgstr "普什图语" - -#~ msgid "Quechua" -#~ msgstr "克丘亚语" - -#~ msgid "Rajasthani" -#~ msgstr "拉贾斯坦语" - -#~ msgid "Rapanui" -#~ msgstr "拉帕努伊语" - -#~ msgid "Maori; Cook Islands" -#~ msgstr "拉罗汤加语" - -#~ msgid "Romansh" -#~ msgstr "罗曼什语" - -#~ msgid "Romany" -#~ msgstr "罗姆语" - -#~ msgid "Romanian" -#~ msgstr "罗马尼亚语" - -#~ msgid "Rundi" -#~ msgstr "基隆迪语" - -#~ msgid "Romanian; Macedo-" -#~ msgstr "阿罗马尼亚语" - -#~ msgid "Russian" -#~ msgstr "俄语" - -#~ msgid "Sandawe" -#~ msgstr "桑达韦语" - -#~ msgid "Sango" -#~ msgstr "桑戈语" - -#~ msgid "Yakut" -#~ msgstr "雅库特语" - -#~ msgid "Aramaic; Samaritan" -#~ msgstr "阿拉米语(萨马利亚)" - -#~ msgid "Sanskrit" -#~ msgstr "梵语" - -#~ msgid "Sasak" -#~ msgstr "萨萨克语" - -#~ msgid "Santali" -#~ msgstr "桑塔利语" - -#~ msgid "Sicilian" -#~ msgstr "西西里语" - -#~ msgid "Scots" -#~ msgstr "苏格兰语" - -#~ msgid "Selkup" -#~ msgstr "塞尔库普语" - -#~ msgid "Irish; Old (to 900)" -#~ msgstr "爱尔兰语(古,至 900)" - -#~ msgid "Shan" -#~ msgstr "掸语" - -#~ msgid "Sidamo" -#~ msgstr "锡达莫语" - -#~ msgid "Sinhala" -#~ msgstr "僧加罗语" - -#~ msgid "Slovak" -#~ msgstr "斯洛伐克语" - -#~ msgid "Slovenian" -#~ msgstr "斯洛文尼亚语" - -#~ msgid "Sami; Southern" -#~ msgstr "萨米语(南)" - -#~ msgid "Sami; Northern" -#~ msgstr "萨米语(北)" - -#~ msgid "Lule Sami" -#~ msgstr "律勒欧-萨米语" - -#~ msgid "Sami; Inari" -#~ msgstr "伊纳里-萨米语" - -#~ msgid "Samoan" -#~ msgstr "萨摩亚语" - -#~ msgid "Sami; Skolt" -#~ msgstr "斯科特-萨米语" - -#~ msgid "Shona" -#~ msgstr "修纳语" - -#~ msgid "Sindhi" -#~ msgstr "信德语" - -#~ msgid "Soninke" -#~ msgstr "索宁克语" - -#~ msgid "Sogdian" -#~ msgstr "粟特语" - -#~ msgid "Somali" -#~ msgstr "索马里语" - -#~ msgid "Sotho; Southern" -#~ msgstr "索托语(南)" - -#~ msgid "Spanish" -#~ msgstr "西班牙语" - -#~ msgid "Albanian" -#~ msgstr "阿尔巴尼亚语" - -#~ msgid "Sardinian" -#~ msgstr "撒丁语" - -#~ msgid "Sranan Tongo" -#~ msgstr "苏里南汤加语" - -#~ msgid "Serbian" -#~ msgstr "塞尔维亚语" - -#~ msgid "Serer" -#~ msgstr "塞雷尔语" - -#~ msgid "Swati" -#~ msgstr "斯瓦特语" - -#~ msgid "Sukuma" -#~ msgstr "苏库马语" - -#~ msgid "Sundanese" -#~ msgstr "巽他语" - -#~ msgid "Susu" -#~ msgstr "苏苏语" - -#~ msgid "Sumerian" -#~ msgstr "苏美尔语" - -#~ msgid "Swahili (macrolanguage)" -#~ msgstr "斯瓦希里语族" - -#~ msgid "Swedish" -#~ msgstr "瑞典语" - -#~ msgid "Syriac; Classical" -#~ msgstr "叙利亚语(古典)" - -#~ msgid "Syriac" -#~ msgstr "古叙利亚语" - -#~ msgid "Tahitian" -#~ msgstr "塔希提语" - -#~ msgid "Tamil" -#~ msgstr "泰米尔语" - -#~ msgid "Tatar" -#~ msgstr "塔塔尔语" - -#~ msgid "Telugu" -#~ msgstr "泰卢固语" - -#~ msgid "Timne" -#~ msgstr "滕内语" - -#~ msgid "Tereno" -#~ msgstr "特列纳语" - -#~ msgid "Tetum" -#~ msgstr "特塔姆语" - -#~ msgid "Tajik" -#~ msgstr "塔吉克语" - -#~ msgid "Tagalog" -#~ msgstr "塔加洛语" - -#~ msgid "Thai" -#~ msgstr "泰语" - -#~ msgid "Tigre" -#~ msgstr "提格雷语" - -#~ msgid "Tigrinya" -#~ msgstr "提格里尼亚语" - -#~ msgid "Tiv" -#~ msgstr "蒂夫语" - -#~ msgid "Tokelau" -#~ msgstr "托克劳语" - -#~ msgid "Klingon" -#~ msgstr "克林贡语" - -#~ msgid "Tlingit" -#~ msgstr "特林吉特语" - -#~ msgid "Tamashek" -#~ msgstr "塔马舍克语" - -#~ msgid "Tonga (Nyasa)" -#~ msgstr "汤加语 (尼亚萨)" - -#~ msgid "Tonga (Tonga Islands)" -#~ msgstr "汤加语(汤加岛)" - -#~ msgid "Tok Pisin" -#~ msgstr "托克皮辛语" - -#~ msgid "Tsimshian" -#~ msgstr "钦西安语" - -#~ msgid "Tswana" -#~ msgstr "茨瓦纳语" - -#~ msgid "Tsonga" -#~ msgstr "聪加语" - -#~ msgid "Turkmen" -#~ msgstr "土库曼语" - -#~ msgid "Tumbuka" -#~ msgstr "奇图姆布卡语" - -#~ msgid "Turkish" -#~ msgstr "土耳其语" - -#~ msgid "Tuvalu" -#~ msgstr "图瓦卢语" - -#~ msgid "Twi" -#~ msgstr "契维语" - -#~ msgid "Tuvinian" -#~ msgstr "图瓦语" - -#~ msgid "Udmurt" -#~ msgstr "乌德穆尔特语" - -#~ msgid "Ugaritic" -#~ msgstr "乌加里特语" - -#~ msgid "Uighur" -#~ msgstr "维吾尔语" - -#~ msgid "Ukrainian" -#~ msgstr "乌克兰语" - -#~ msgid "Umbundu" -#~ msgstr "翁本杜语" - -#~ msgid "Undetermined" -#~ msgstr "未确定的语言" - -#~ msgid "Urdu" -#~ msgstr "乌尔都语" - -#~ msgid "Uzbek" -#~ msgstr "乌兹别克语" - -#~ msgid "Vai" -#~ msgstr "瓦伊语" - -#~ msgid "Venda" -#~ msgstr "文达语" - -#~ msgid "Vietnamese" -#~ msgstr "越南语" - -#~ msgid "Volapük" -#~ msgstr "沃拉普克语" - -#~ msgid "Votic" -#~ msgstr "沃提克语" - -#~ msgid "Wolaytta" -#~ msgstr "瓦拉莫语" - -#~ msgid "Waray (Philippines)" -#~ msgstr "瓦赖语(菲律宾)" - -#~ msgid "Washo" -#~ msgstr "瓦肖语" - -#~ msgid "Walloon" -#~ msgstr "瓦龙语" - -#~ msgid "Wolof" -#~ msgstr "沃洛夫语" - -#~ msgid "Kalmyk" -#~ msgstr "卡尔梅克语" - -#~ msgid "Xhosa" -#~ msgstr "科萨语" - -#~ msgid "Yao" -#~ msgstr "瑶语" - -#~ msgid "Yapese" -#~ msgstr "雅浦语" - -#~ msgid "Yiddish" -#~ msgstr "依地语" - -#~ msgid "Yoruba" -#~ msgstr "约鲁巴语" - -#~ msgid "Zapotec" -#~ msgstr "萨波特克语" - -#~ msgid "Blissymbols" -#~ msgstr "布利斯符号" - -#~ msgid "Zenaga" -#~ msgstr "哲纳加语" - -#~ msgid "Zhuang" -#~ msgstr "壮语" - -#~ msgid "Chinese" -#~ msgstr "中文" - -#~ msgid "Zulu" -#~ msgstr "祖鲁语" - -#~ msgid "Zuni" -#~ msgstr "祖尼语" - -#~ msgid "No linguistic content" -#~ msgstr "" - -#~ msgid "Zaza" -#~ msgstr "扎扎其语" - -#~ msgid "Failed to create path for cover %(path)s (Permission denied)." -#~ msgstr "" - -#~ msgid "Failed to store cover-file %(cover)s." -#~ msgstr "" - -#~ msgid "Cover-file is not a valid image file" -#~ msgstr "" - -#~ msgid "Cover is not a jpg file, can't save" -#~ msgstr "封面不是一个jpg文件,无法保存" - -#~ msgid "Preparing document for printing..." -#~ msgstr "" - -#~ msgid "Using your another device, visit" -#~ msgstr "使用您的另一个设备访问" - -#~ msgid "and log in" -#~ msgstr "和登录" - -#~ msgid "Using your another device, login and visit " -#~ msgstr "" - -#~ msgid "Newest Books" -#~ msgstr "最新书籍" - -#~ msgid "Oldest Books" -#~ msgstr "最旧书籍" - -#~ msgid "Books (A-Z)" -#~ msgstr "书籍 (A-Z)" - -#~ msgid "Books (Z-A)" -#~ msgstr "书籍 (Z-A)" - -#~ msgid "Error opening eBook. Fileformat is not supported." -#~ msgstr "" - -#~ msgid "File %(title)s" -#~ msgstr "" - -#~ msgid "Show sorted books" -#~ msgstr "显示已排序书籍" - -#~ msgid "Sorted Books" -#~ msgstr "已排序书籍" - -#~ msgid "Sort By" -#~ msgstr "排序" - -#~ msgid "Newest" -#~ msgstr "最新" - -#~ msgid "Oldest" -#~ msgstr "最旧" - -#~ msgid "Ascending" -#~ msgstr "升序" - -#~ msgid "Descending" -#~ 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 "" - -#~ msgid "Import of optional Google Drive requirements missing" -#~ msgstr "可选的Google Drive依赖导入缺失" - -#~ msgid "client_secrets.json is missing or not readable" -#~ msgstr "client_secrets.json文件缺失或不可读" - -#~ msgid "client_secrets.json is not configured for web application" -#~ msgstr "没有为web应用配置client_secrets.json" - -#~ msgid "Keyfile location is not valid, please enter correct path" -#~ msgstr "key文件位置无效,请输入正确路径" - -#~ msgid "Certfile location is not valid, please enter correct path" -#~ msgstr "证书文件位置无效,请输入正确路径" - -#~ msgid "Please enter a LDAP provider, port, DN and user object identifier" -#~ msgstr "" - -#~ msgid "Please enter a LDAP service account and password" -#~ msgstr "" - -#~ msgid "Please enter Github oauth credentials" -#~ msgstr "" - -#~ msgid "Please enter Google oauth credentials" -#~ msgstr "" - -#~ msgid "Logfile location is not valid, please enter correct path" -#~ msgstr "日志文件位置无效,请输入正确路径" - -#~ msgid "Access Logfile location is not valid, please enter correct path" -#~ msgstr "" - -#~ msgid "DB location is not valid, please enter correct path" -#~ msgstr "DB位置无效,请输入正确路径" - -#~ msgid "Excecution permissions missing" -#~ msgstr "可执行权限缺失" - -#~ msgid "not configured" -#~ msgstr "未配置" - -#~ msgid "Error excecuting UnRar" -#~ msgstr "执行UnRar时出错" - -#~ msgid "Unrar binary file not found" -#~ msgstr "找不到Unrar二进制文件" - -#~ msgid "Use GitHub OAuth" -#~ msgstr "" - -#~ msgid "Use Google OAuth" -#~ msgstr "" - -#~ msgid "Obtain GitHub OAuth Credential" -#~ msgstr "" - -#~ msgid "GitHub OAuth Client Id" -#~ msgstr "" - -#~ msgid "GitHub OAuth Client Secret" -#~ msgstr "" - -#~ msgid "Obtain Google OAuth Credential" -#~ msgstr "" - -#~ msgid "Google OAuth Client Id" -#~ msgstr "" - -#~ msgid "Google OAuth Client Secret" -#~ msgstr "" - -#~ msgid "Use" -#~ msgstr "使用" - -#~ msgid "Play / pause" -#~ msgstr "播放 / 暂停" +#: cps/templates/user_edit.html:144 +msgid "Recent Downloads" +msgstr "最近下载" -#~ msgid "volume" -#~ msgstr "音量" +#: cps/templates/user_edit.html:160 +msgid "Generate Kobo Auth URL" +msgstr "生成Kobo Auth URL" -#~ msgid "unknown" -#~ msgstr "未知" +#: cps/templates/user_edit.html:176 +msgid "Do you really want to delete the Kobo Token?" +msgstr "您确定删除Kobo Token吗?" -#~ msgid "New Books" -#~ msgstr "新书" +#~ msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" +#~ msgstr "封面不是一个被支持的图像格式(jpg/png/webp),无法保存" diff --git a/cps/ub.py b/cps/ub.py index 85ed1127..21dc6e3c 100644 --- a/cps/ub.py +++ b/cps/ub.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- # This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) @@ -58,12 +57,12 @@ def get_sidebar_config(kwargs=None): "visibility": constants.SIDEBAR_RECENT, 'public': True, "page": "root", "show_text": _('Show recent books'), "config_show":True}) sidebar.append({"glyph": "glyphicon-fire", "text": _('Hot Books'), "link": 'web.books_list', "id": "hot", - "visibility": constants.SIDEBAR_HOT, 'public': True, "page": "hot", "show_text": _('Show hot books'), + "visibility": constants.SIDEBAR_HOT, 'public': True, "page": "hot", "show_text": _('Show Hot Books'), "config_show":True}) sidebar.append( - {"glyph": "glyphicon-star", "text": _('Best rated Books'), "link": 'web.books_list', "id": "rated", + {"glyph": "glyphicon-star", "text": _('Top Rated Books'), "link": 'web.books_list', "id": "rated", "visibility": constants.SIDEBAR_BEST_RATED, 'public': True, "page": "rated", - "show_text": _('Show best rated books'), "config_show":True}) + "show_text": _('Show Top Rated Books'), "config_show":True}) sidebar.append({"glyph": "glyphicon-eye-open", "text": _('Read Books'), "link": 'web.books_list', "id": "read", "visibility": constants.SIDEBAR_READ_AND_UNREAD, 'public': (not g.user.is_anonymous), "page": "read", "show_text": _('Show read and unread'), "config_show": content}) @@ -157,6 +156,22 @@ class UserBase: def show_detail_random(self): return self.check_visibility(constants.DETAIL_RANDOM) + def list_denied_tags(self): + mct = self.denied_tags.split(",") + return [t.strip() for t in mct] + + def list_allowed_tags(self): + mct = self.allowed_tags.split(",") + return [t.strip() for t in mct] + + def list_denied_column_values(self): + mct = self.denied_column_value.split(",") + return [t.strip() for t in mct] + + def list_allowed_column_values(self): + mct = self.allowed_column_value.split(",") + return [t.strip() for t in mct] + def __repr__(self): return '' % self.nickname @@ -179,6 +194,11 @@ class User(UserBase, Base): sidebar_view = Column(Integer, default=1) default_language = Column(String(3), default="all") mature_content = Column(Boolean, default=True) + denied_tags = Column(String, default="") + allowed_tags = Column(String, default="") + denied_column_value = Column(String, default="") + allowed_column_value = Column(String, default="") + remote_auth_token = relationship('RemoteAuthToken', backref='user', lazy='dynamic') if oauth_support: @@ -214,9 +234,10 @@ class Anonymous(AnonymousUserMixin, UserBase): self.locale = data.locale self.mature_content = data.mature_content self.kindle_mail = data.kindle_mail - - # settings = session.query(config).first() - # self.anon_browse = settings.config_anonbrowse + self.denied_tags = data.denied_tags + self.allowed_tags = data.allowed_tags + self.denied_column_value = data.denied_column_value + self.allowed_column_value = data.allowed_column_value def role_admin(self): return False @@ -308,10 +329,11 @@ class RemoteAuthToken(Base): __tablename__ = 'remote_auth_token' id = Column(Integer, primary_key=True) - auth_token = Column(String(8), unique=True) + auth_token = Column(String, unique=True) user_id = Column(Integer, ForeignKey('user.id')) verified = Column(Boolean, default=False) expiration = Column(DateTime) + token_type = Column(Integer, default=0) def __init__(self): self.auth_token = (hexlify(os.urandom(4))).decode('utf-8') @@ -343,6 +365,15 @@ def migrate_Database(session): conn.execute("ALTER TABLE registration ADD column 'allow' INTEGER") conn.execute("update registration set 'allow' = 1") session.commit() + try: + session.query(exists().where(RemoteAuthToken.token_type)).scalar() + session.commit() + except exc.OperationalError: # Database is not compatible, some columns are missing + conn = engine.connect() + conn.execute("ALTER TABLE remote_auth_token ADD column 'token_type' INTEGER DEFAULT 0") + conn.execute("update remote_auth_token set 'token_type' = 0") + session.commit() + # Handle table exists, but no content cnt = session.query(Registration).count() if not cnt: @@ -379,12 +410,19 @@ def migrate_Database(session): 'side_autor': constants.SIDEBAR_AUTHOR, 'detail_random': constants.DETAIL_RANDOM}) session.commit() - try: + '''try: session.query(exists().where(User.mature_content)).scalar() except exc.OperationalError: conn = engine.connect() - conn.execute("ALTER TABLE user ADD column `mature_content` INTEGER DEFAULT 1") - + conn.execute("ALTER TABLE user ADD column `mature_content` INTEGER DEFAULT 1")''' + try: + session.query(exists().where(User.denied_tags)).scalar() + except exc.OperationalError: # Database is not compatible, some columns are missing + conn = engine.connect() + conn.execute("ALTER TABLE user ADD column `denied_tags` String DEFAULT ''") + conn.execute("ALTER TABLE user ADD column `allowed_tags` String DEFAULT ''") + conn.execute("ALTER TABLE user ADD column `denied_column_value` DEFAULT ''") + conn.execute("ALTER TABLE user ADD column `allowed_column_value` DEFAULT ''") if session.query(User).filter(User.role.op('&')(constants.ROLE_ANONYMOUS) == constants.ROLE_ANONYMOUS).first() is None: create_anonymous_user(session) try: @@ -425,7 +463,8 @@ def migrate_Database(session): def clean_database(session): # Remove expired remote login tokens now = datetime.datetime.now() - session.query(RemoteAuthToken).filter(now > RemoteAuthToken.expiration).delete() + session.query(RemoteAuthToken).filter(now > RemoteAuthToken.expiration).\ + filter(RemoteAuthToken.token_type !=1 ).delete() session.commit() diff --git a/cps/updater.py b/cps/updater.py index 10d1995e..7af8649c 100644 --- a/cps/updater.py +++ b/cps/updater.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- # This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) @@ -194,7 +193,12 @@ class Updater(threading.Thread): exclude = ( os.sep + 'app.db', os.sep + 'calibre-web.log1', os.sep + 'calibre-web.log2', os.sep + 'gdrive.db', os.sep + 'vendor', os.sep + 'calibre-web.log', os.sep + '.git', os.sep + 'client_secrets.json', - os.sep + 'gdrive_credentials', os.sep + 'settings.yaml') + os.sep + 'gdrive_credentials', os.sep + 'settings.yaml', os.sep + 'venv', os.sep + 'virtualenv', + os.sep + 'access.log', os.sep + 'access.log1', os.sep + 'access.log2', + ) + additional_path = self.is_venv() + if additional_path: + exclude = exclude + (additional_path,) for root, dirs, files in os.walk(destination, topdown=True): for name in files: old_list.append(os.path.join(root, name).replace(destination, '')) @@ -230,6 +234,12 @@ class Updater(threading.Thread): logger.debug("Could not remove: %s", item_path) shutil.rmtree(source, ignore_errors=True) + def is_venv(self): + if (hasattr(sys, 'real_prefix')) or (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix): + return os.sep + os.path.relpath(sys.prefix,constants.BASE_DIR) + else: + return False + @classmethod def _nightly_version_info(cls): if is_sha1(constants.NIGHTLY_VERSION[0]) and len(constants.NIGHTLY_VERSION[1]) > 0: diff --git a/cps/uploader.py b/cps/uploader.py index 6dc6636a..d84f7daf 100644 --- a/cps/uploader.py +++ b/cps/uploader.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- # This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) diff --git a/cps/web.py b/cps/web.py index 000c23fd..8f273faf 100644 --- a/cps/web.py +++ b/cps/web.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- # This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) @@ -28,7 +27,7 @@ import datetime import json import mimetypes import traceback -import sys +import binascii from babel import Locale as LC from babel.dates import format_date @@ -43,7 +42,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, config, logger, isoLanguages, services, worker +from . import constants, logger, isoLanguages, services, worker from . import searched_ids, lm, babel, db, ub, config, get_locale, app from .gdriveutils import getFileFromEbooksFolder, do_gdrive_download from .helper import common_filters, get_search_results, fill_indexpage, speaking_language, check_valid_domain, \ @@ -55,7 +54,8 @@ from .redirect import redirect_back feature_support = { 'ldap': False, # bool(services.ldap), - 'goodreads': bool(services.goodreads_support) + 'goodreads': bool(services.goodreads_support), + 'kobo': bool(services.kobo) } try: @@ -124,12 +124,6 @@ def load_user(user_id): @lm.request_loader def load_user_from_request(request): - auth_header = request.headers.get("Authorization") - if auth_header: - user = load_user_from_auth_header(auth_header) - if user: - return user - if config.config_allow_reverse_proxy_header_login: rp_header_name = config.config_reverse_proxy_login_header_name if rp_header_name: @@ -139,6 +133,12 @@ def load_user_from_request(request): if user: return user + auth_header = request.headers.get("Authorization") + if auth_header: + user = load_user_from_auth_header(auth_header) + if user: + return user + return @@ -150,7 +150,7 @@ def load_user_from_auth_header(header_val): header_val = base64.b64decode(header_val).decode('utf-8') basic_username = header_val.split(':')[0] basic_password = header_val.split(':')[1] - except TypeError: + except (TypeError, UnicodeDecodeError, binascii.Error): pass user = _fetch_user_by_name(basic_username) if user and check_password_hash(str(user.password), basic_password): @@ -172,7 +172,7 @@ def remote_login_required(f): def inner(*args, **kwargs): if config.config_remote_login: return f(*args, **kwargs) - if request.is_xhr: + if request.headers.get('X-Requested-With') == 'XMLHttpRequest': data = {'status': 'error', 'message': 'Forbidden'} response = make_response(json.dumps(data, ensure_ascii=False)) response.headers["Content-Type"] = "application/json; charset=utf-8" @@ -460,12 +460,6 @@ def get_matching_tags(): if len(exclude_tag_inputs) > 0: for tag in exclude_tag_inputs: q = q.filter(not_(db.Books.tags.any(db.Tags.id == tag))) - '''if len(include_extension_inputs) > 0: - for tag in exclude_tag_inputs: - q = q.filter(not_(db.Books.tags.any(db.Tags.id == tag))) - if len(exclude_extension_inputs) > 0: - for tag in exclude_tag_inputs: - q = q.filter(not_(db.Books.tags.any(db.Tags.id == tag)))''' for book in q: for tag in book.tags: if tag.id not in tag_dict['tags']: @@ -511,7 +505,7 @@ def books_list(data, sort, book_id, page): entries, random, pagination = fill_indexpage(page, db.Books, db.Books.ratings.any(db.Ratings.rating > 9), order) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, - id=book_id, title=_(u"Best rated books"), page="rated") + id=book_id, title=_(u"Top Rated Books"), page="rated") else: abort(404) elif data == "discover": @@ -519,7 +513,7 @@ def books_list(data, sort, book_id, page): entries, __, pagination = fill_indexpage(page, db.Books, True, [func.randomblob(2)]) pagination = Pagination(1, config.config_books_per_page, config.config_books_per_page) return render_title_template('discover.html', entries=entries, pagination=pagination, id=book_id, - title=_(u"Random Books"), page="discover") + title=_(u"Discover (Random Books)"), page="discover") else: abort(404) elif data == "unread": @@ -572,7 +566,7 @@ def render_hot_books(page): numBooks = entries.__len__() pagination = Pagination(page, config.config_books_per_page, numBooks) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, - title=_(u"Hot Books (most downloaded)"), page="hot") + title=_(u"Hot Books (Most Downloaded)"), page="hot") else: abort(404) @@ -583,7 +577,7 @@ def render_author_books(page, author_id, order): [order[0], db.Series.name, db.Books.series_index], db.books_series_link, db.Series) if entries is None or not len(entries): - flash(_(u"Error opening eBook. File does not exist or file is not accessible:"), category="error") + flash(_(u"Oops! Selected book title is unavailable. File does not exist or is not accessible"), category="error") return redirect(url_for("web.index")) author = db.session.query(db.Authors).get(author_id) @@ -686,7 +680,7 @@ def author_list(): for entry in entries: entry.Authors.name = entry.Authors.name.replace('|', ',') return render_title_template('list.html', entries=entries, folder='web.books_list', charlist=charlist, - title=u"Author list", page="authorlist", data='author') + title=u"Authors", page="authorlist", data='author') else: abort(404) @@ -702,7 +696,7 @@ def publisher_list(): .join(db.books_publishers_link).join(db.Books).filter(common_filters()) \ .group_by(func.upper(func.substr(db.Publishers.name,1,1))).all() return render_title_template('list.html', entries=entries, folder='web.books_list', charlist=charlist, - title=_(u"Publisher list"), page="publisherlist", data="publisher") + title=_(u"Publishers"), page="publisherlist", data="publisher") else: abort(404) @@ -718,7 +712,7 @@ def series_list(): .join(db.books_series_link).join(db.Books).filter(common_filters()) \ .group_by(func.upper(func.substr(db.Series.sort,1,1))).all() return render_title_template('list.html', entries=entries, folder='web.books_list', charlist=charlist, - title=_(u"Series list"), page="serieslist", data="series") + title=_(u"Series"), page="serieslist", data="series") else: abort(404) @@ -773,7 +767,7 @@ def language_overview(): func.count('books_languages_link.book').label('bookcount')).group_by( text('books_languages_link.lang_code')).all() return render_title_template('languages.html', languages=languages, lang_counter=lang_counter, - charlist=charlist, title=_(u"Available languages"), page="langlist", + charlist=charlist, title=_(u"Languages"), page="langlist", data="language") else: abort(404) @@ -790,7 +784,7 @@ def category_list(): .join(db.books_tags_link).join(db.Books).filter(common_filters()) \ .group_by(func.upper(func.substr(db.Tags.name,1,1))).all() return render_title_template('list.html', entries=entries, folder='web.books_list', charlist=charlist, - title=_(u"Category list"), page="catlist", data="category") + title=_(u"Categories"), page="catlist", data="category") else: abort(404) @@ -967,11 +961,13 @@ def advanced_search(): return render_title_template('search.html', searchterm=searchterm, entries=q, title=_(u"search"), page="search") # prepare data for search-form - # tags = db.session.query(db.Tags).order_by(db.Tags.name).all() - tags = db.session.query(db.Tags).filter(tags_filters()).order_by(db.Tags.name).all() - series = db.session.query(db.Series).order_by(db.Series.name).all() - extensions = db.session.query(db.Data) \ + tags = db.session.query(db.Tags).join(db.books_tags_link).join(db.Books).filter(common_filters())\ + .group_by(text('books_tags_link.tag')).order_by(db.Tags.name).all() + series = db.session.query(db.Series).join(db.books_series_link).join(db.Books).filter(common_filters())\ + .group_by(text('books_series_link.series')).order_by(db.Series.name).filter(common_filters()).all() + extensions = db.session.query(db.Data).join(db.Books).filter(common_filters())\ .group_by(db.Data.format).order_by(db.Data.format).all() + if current_user.filter_language() == u"all": languages = speaking_language() else: @@ -1048,7 +1044,7 @@ def serve_book(book_id, book_format, anyname): @login_required_if_no_ano @download_required def download_link(book_id, book_format): - return get_download_link(book_id, book_format) + return get_download_link(book_id, book_format.lower()) @web.route('/send///') @@ -1068,7 +1064,10 @@ def send_to_kindle(book_id, book_format, convert): flash(_(u"There was an error sending this book: %(res)s", res=result), category="error") else: flash(_(u"Please configure your kindle e-mail address first..."), category="error") - return redirect(request.environ["HTTP_REFERER"]) + if "HTTP_REFERER" in request.environ: + return redirect(request.environ["HTTP_REFERER"]) + else: + return redirect(url_for('web.index')) # ################################### Login Logout ################################################################## @@ -1089,10 +1088,10 @@ def register(): if not to_save["nickname"] or not to_save["email"]: flash(_(u"Please fill out all fields!"), category="error") return render_title_template('register.html', title=_(u"register"), page="register") + existing_user = ub.session.query(ub.User).filter(func.lower(ub.User.nickname) == to_save["nickname"] .lower()).first() existing_email = ub.session.query(ub.User).filter(ub.User.email == to_save["email"].lower()).first() - if not existing_user and not existing_email: content = ub.User() # content.password = generate_password_hash(to_save["password"]) @@ -1103,7 +1102,7 @@ def register(): content.password = generate_password_hash(password) content.role = config.config_default_role content.sidebar_view = config.config_default_show - content.mature_content = bool(config.config_default_show & constants.MATURE_CONTENT) + #content.mature_content = bool(config.config_default_show & constants.MATURE_CONTENT) try: ub.session.add(content) ub.session.commit() @@ -1292,10 +1291,12 @@ def profile(): downloads = list() languages = speaking_language() translations = babel.list_translations() + [LC('en')] + kobo_support = feature_support['kobo'] and config.config_kobo_sync if feature_support['oauth']: oauth_status = get_oauth_status() else: oauth_status = None + for book in current_user.downloads: downloadBook = db.session.query(db.Books).filter(db.Books.id == book.book_id).first() if downloadBook: @@ -1310,11 +1311,14 @@ def profile(): current_user.password = generate_password_hash(to_save["password"]) if "kindle_mail" in to_save and to_save["kindle_mail"] != current_user.kindle_mail: current_user.kindle_mail = to_save["kindle_mail"] + if "allowed_tags" in to_save and to_save["allowed_tags"] != current_user.allowed_tags: + current_user.allowed_tags = to_save["allowed_tags"].strip() if to_save["email"] and to_save["email"] != current_user.email: if config.config_public_reg and not check_valid_domain(to_save["email"]): flash(_(u"E-mail is not from valid domain"), category="error") return render_title_template("user_edit.html", content=current_user, downloads=downloads, title=_(u"%(name)s's profile", name=current_user.nickname), page="me", + kobo_support=kobo_support, registered_oauth=oauth_check, oauth_status=oauth_status) if "nickname" in to_save and to_save["nickname"] != current_user.nickname: # Query User nickname, if not existing, change @@ -1325,6 +1329,7 @@ def profile(): return render_title_template("user_edit.html", translations=translations, languages=languages, + kobo_support=kobo_support, new_user=0, content=current_user, downloads=downloads, registered_oauth=oauth_check, @@ -1347,7 +1352,7 @@ def profile(): if "Show_detail_random" in to_save: current_user.sidebar_view += constants.DETAIL_RANDOM - current_user.mature_content = "Show_mature_content" in to_save + #current_user.mature_content = "Show_mature_content" in to_save try: ub.session.commit() @@ -1356,13 +1361,13 @@ def profile(): flash(_(u"Found an existing account for this e-mail address."), category="error") log.debug(u"Found an existing account for this e-mail address.") return render_title_template("user_edit.html", content=current_user, downloads=downloads, - translations=translations, + translations=translations, kobo_support=kobo_support, title=_(u"%(name)s's profile", name=current_user.nickname), page="me", registered_oauth=oauth_check, oauth_status=oauth_status) flash(_(u"Profile updated"), category="success") log.debug(u"Profile updated") return render_title_template("user_edit.html", translations=translations, profile=1, languages=languages, - content=current_user, downloads=downloads, + content=current_user, downloads=downloads, kobo_support=kobo_support, title= _(u"%(name)s's profile", name=current_user.nickname), page="me", registered_oauth=oauth_check, oauth_status=oauth_status) @@ -1468,7 +1473,7 @@ def show_book(book_id): audioentries.append(media_format.format.lower()) return render_title_template('detail.html', entry=entries, audioentries=audioentries, cc=cc, - is_xhr=request.is_xhr, title=entries.title, books_shelfs=book_in_shelfs, + is_xhr=request.headers.get('X-Requested-With')=='XMLHttpRequest', title=entries.title, books_shelfs=book_in_shelfs, have_read=have_read, kindle_list=kindle_list, reader_list=reader_list, page="book") else: log.debug(u"Error opening eBook. File does not exist or file is not accessible:") diff --git a/messages.pot b/messages.pot index 5b546ff8..de652a16 100644 --- a/messages.pot +++ b/messages.pot @@ -8,14 +8,14 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2020-01-12 13:57+0100\n" +"POT-Creation-Date: 2020-03-12 20:31+0100\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.7.0\n" +"Generated-By: Babel 2.8.0\n" #: cps/about.py:42 msgid "installed" @@ -25,7 +25,7 @@ msgstr "" msgid "not installed" msgstr "" -#: cps/about.py:84 +#: cps/about.py:87 msgid "Statistics" msgstr "" @@ -39,7 +39,7 @@ msgstr "" #: cps/admin.py:110 cps/editbooks.py:410 cps/editbooks.py:419 #: cps/editbooks.py:539 cps/editbooks.py:541 cps/editbooks.py:594 -#: cps/updater.py:446 cps/uploader.py:97 cps/uploader.py:108 +#: cps/updater.py:456 cps/uploader.py:96 cps/uploader.py:107 msgid "Unknown" msgstr "" @@ -47,155 +47,164 @@ msgstr "" msgid "Admin page" msgstr "" -#: cps/admin.py:148 cps/templates/admin.html:115 +#: cps/admin.py:151 msgid "UI Configuration" msgstr "" -#: cps/admin.py:185 cps/admin.py:412 +#: cps/admin.py:187 cps/admin.py:637 msgid "Calibre-Web configuration updated" msgstr "" -#: cps/admin.py:442 cps/templates/admin.html:114 +#: cps/admin.py:434 cps/admin.py:440 cps/admin.py:451 cps/admin.py:462 +#: cps/templates/modal_restriction.html:29 +msgid "Deny" +msgstr "" + +#: cps/admin.py:436 cps/admin.py:442 cps/admin.py:453 cps/admin.py:464 +#: cps/templates/modal_restriction.html:28 +msgid "Allow" +msgstr "" + +#: cps/admin.py:667 msgid "Basic Configuration" msgstr "" -#: cps/admin.py:465 cps/web.py:1093 +#: cps/admin.py:691 cps/web.py:1089 msgid "Please fill out all fields!" msgstr "" -#: cps/admin.py:467 cps/admin.py:478 cps/admin.py:484 cps/admin.py:499 -#: cps/templates/admin.html:38 +#: cps/admin.py:694 cps/admin.py:706 cps/admin.py:712 cps/admin.py:730 msgid "Add new user" msgstr "" -#: cps/admin.py:476 cps/web.py:1318 +#: cps/admin.py:703 cps/web.py:1318 msgid "E-mail is not from valid domain" msgstr "" -#: cps/admin.py:482 cps/admin.py:493 +#: cps/admin.py:710 cps/admin.py:725 msgid "Found an existing account for this e-mail address or nickname." msgstr "" -#: cps/admin.py:489 +#: cps/admin.py:721 #, python-format msgid "User '%(user)s' created" msgstr "" -#: cps/admin.py:509 +#: cps/admin.py:740 msgid "Edit e-mail server settings" msgstr "" -#: cps/admin.py:535 +#: cps/admin.py:766 #, python-format msgid "Test e-mail successfully send to %(kindlemail)s" msgstr "" -#: cps/admin.py:538 +#: cps/admin.py:769 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "" -#: cps/admin.py:540 +#: cps/admin.py:771 msgid "Please configure your e-mail address first..." msgstr "" -#: cps/admin.py:542 +#: cps/admin.py:773 msgid "E-mail server settings updated" msgstr "" -#: cps/admin.py:571 +#: cps/admin.py:803 #, python-format msgid "User '%(nick)s' deleted" msgstr "" -#: cps/admin.py:574 +#: cps/admin.py:806 msgid "No admin user remaining, can't delete user" msgstr "" -#: cps/admin.py:612 cps/web.py:1359 +#: cps/admin.py:842 cps/web.py:1361 msgid "Found an existing account for this e-mail address." msgstr "" -#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1334 +#: cps/admin.py:852 cps/admin.py:867 cps/admin.py:887 cps/web.py:1336 #, python-format msgid "Edit User %(nick)s" msgstr "" -#: cps/admin.py:622 cps/web.py:1327 +#: cps/admin.py:858 cps/web.py:1328 msgid "This username is already taken" msgstr "" -#: cps/admin.py:637 +#: cps/admin.py:874 #, python-format msgid "User '%(nick)s' updated" msgstr "" -#: cps/admin.py:640 +#: cps/admin.py:877 msgid "An unknown error occured." msgstr "" -#: cps/admin.py:657 +#: cps/admin.py:900 #, python-format msgid "Password for user %(user)s reset" msgstr "" -#: cps/admin.py:660 cps/web.py:1118 cps/web.py:1174 +#: cps/admin.py:903 cps/web.py:1114 cps/web.py:1170 msgid "An unknown error occurred. Please try again later." msgstr "" -#: cps/admin.py:663 cps/web.py:1062 +#: cps/admin.py:906 cps/web.py:1055 msgid "Please configure the SMTP mail settings first..." msgstr "" -#: cps/admin.py:674 +#: cps/admin.py:918 msgid "Logfile viewer" msgstr "" -#: cps/admin.py:710 +#: cps/admin.py:957 msgid "Requesting update package" msgstr "" -#: cps/admin.py:711 +#: cps/admin.py:958 msgid "Downloading update package" msgstr "" -#: cps/admin.py:712 +#: cps/admin.py:959 msgid "Unzipping update package" msgstr "" -#: cps/admin.py:713 +#: cps/admin.py:960 msgid "Replacing files" msgstr "" -#: cps/admin.py:714 +#: cps/admin.py:961 msgid "Database connections are closed" msgstr "" -#: cps/admin.py:715 +#: cps/admin.py:962 msgid "Stopping server" msgstr "" -#: cps/admin.py:716 +#: cps/admin.py:963 msgid "Update finished, please press okay and reload page" msgstr "" -#: cps/admin.py:717 cps/admin.py:718 cps/admin.py:719 cps/admin.py:720 +#: cps/admin.py:964 cps/admin.py:965 cps/admin.py:966 cps/admin.py:967 msgid "Update failed:" msgstr "" -#: cps/admin.py:717 cps/updater.py:272 cps/updater.py:457 cps/updater.py:459 +#: cps/admin.py:964 cps/updater.py:282 cps/updater.py:467 cps/updater.py:469 msgid "HTTP Error" msgstr "" -#: cps/admin.py:718 cps/updater.py:274 cps/updater.py:461 +#: cps/admin.py:965 cps/updater.py:284 cps/updater.py:471 msgid "Connection error" msgstr "" -#: cps/admin.py:719 cps/updater.py:276 cps/updater.py:463 +#: cps/admin.py:966 cps/updater.py:286 cps/updater.py:473 msgid "Timeout while establishing connection" msgstr "" -#: cps/admin.py:720 cps/updater.py:278 cps/updater.py:465 +#: cps/admin.py:967 cps/updater.py:288 cps/updater.py:475 msgid "General error" msgstr "" @@ -235,10 +244,6 @@ msgstr "" msgid "File format %(ext)s added to %(book)s" msgstr "" -#: cps/editbooks.py:376 -msgid "Cover is not a supported imageformat (jpg/png/webp), can't save" -msgstr "" - #: cps/editbooks.py:451 msgid "Cover is not a jpg file, can't save" msgstr "" @@ -275,30 +280,30 @@ msgstr "" msgid "Failed to delete file %(file)s (Permission denied)." msgstr "" -#: cps/editbooks.py:710 +#: cps/editbooks.py:709 #, python-format msgid "File %(file)s uploaded" msgstr "" -#: cps/editbooks.py:739 +#: cps/editbooks.py:738 msgid "Source or destination format for conversion missing" msgstr "" -#: cps/editbooks.py:747 +#: cps/editbooks.py:746 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "" -#: cps/editbooks.py:751 +#: cps/editbooks.py:750 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "" -#: cps/gdrive.py:62 +#: cps/gdrive.py:61 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgstr "" -#: cps/gdrive.py:104 +#: cps/gdrive.py:103 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "" @@ -388,83 +393,111 @@ msgstr "" msgid "Book path %(path)s not found on Google Drive" msgstr "" -#: cps/helper.py:643 +#: cps/helper.py:511 +msgid "Failed to create path for cover" +msgstr "" + +#: cps/helper.py:516 +msgid "Cover-file is not a valid image file" +msgstr "" + +#: cps/helper.py:519 +msgid "Failed to store cover-file" +msgstr "" + +#: cps/helper.py:530 +msgid "Only jpg/jpeg/png/webp files are supported as coverfile" +msgstr "" + +#: cps/helper.py:544 +msgid "Only jpg/jpeg files are supported as coverfile" +msgstr "" + +#: cps/helper.py:658 msgid "Waiting" msgstr "" -#: cps/helper.py:645 +#: cps/helper.py:660 msgid "Failed" msgstr "" -#: cps/helper.py:647 +#: cps/helper.py:662 msgid "Started" msgstr "" -#: cps/helper.py:649 +#: cps/helper.py:664 msgid "Finished" msgstr "" -#: cps/helper.py:651 +#: cps/helper.py:666 msgid "Unknown Status" msgstr "" -#: cps/helper.py:656 +#: cps/helper.py:671 msgid "E-mail: " msgstr "" -#: cps/helper.py:658 cps/helper.py:662 +#: cps/helper.py:673 cps/helper.py:677 msgid "Convert: " msgstr "" -#: cps/helper.py:660 +#: cps/helper.py:675 msgid "Upload: " msgstr "" -#: cps/helper.py:664 +#: cps/helper.py:679 msgid "Unknown Task: " msgstr "" -#: cps/oauth_bb.py:75 +#: cps/kobo_auth.py:127 +msgid "PLease access calibre-web from non localhost to get valid api_endpoint for kobo device" +msgstr "" + +#: cps/kobo_auth.py:130 cps/kobo_auth.py:150 +msgid "Kobo Setup" +msgstr "" + +#: cps/oauth_bb.py:74 #, python-format msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:154 msgid "Failed to log in with GitHub." msgstr "" -#: cps/oauth_bb.py:160 +#: cps/oauth_bb.py:159 msgid "Failed to fetch user info from GitHub." msgstr "" -#: cps/oauth_bb.py:171 +#: cps/oauth_bb.py:170 msgid "Failed to log in with Google." msgstr "" -#: cps/oauth_bb.py:176 +#: cps/oauth_bb.py:175 msgid "Failed to fetch user info from Google." msgstr "" -#: cps/oauth_bb.py:274 +#: cps/oauth_bb.py:273 #, python-format msgid "Unlink to %(oauth)s success." msgstr "" -#: cps/oauth_bb.py:278 +#: cps/oauth_bb.py:277 #, python-format msgid "Unlink to %(oauth)s failed." msgstr "" -#: cps/oauth_bb.py:281 +#: cps/oauth_bb.py:280 #, python-format msgid "Not linked to %(oauth)s." msgstr "" -#: cps/oauth_bb.py:309 +#: cps/oauth_bb.py:308 msgid "GitHub Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:328 +#: cps/oauth_bb.py:327 msgid "Google Oauth error, please retry later." msgstr "" @@ -515,403 +548,393 @@ msgstr "" msgid "Could not add books to shelf: %(sname)s" msgstr "" -#: cps/shelf.py:180 +#: cps/shelf.py:181 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "" -#: cps/shelf.py:186 +#: cps/shelf.py:190 #, python-format msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" msgstr "" -#: cps/shelf.py:207 cps/shelf.py:231 +#: cps/shelf.py:211 cps/shelf.py:235 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:212 +#: cps/shelf.py:216 #, python-format msgid "Shelf %(title)s created" msgstr "" -#: cps/shelf.py:214 cps/shelf.py:242 +#: cps/shelf.py:218 cps/shelf.py:246 msgid "There was an error" msgstr "" -#: cps/shelf.py:215 cps/shelf.py:217 +#: cps/shelf.py:219 cps/shelf.py:221 msgid "create a shelf" msgstr "" -#: cps/shelf.py:240 +#: cps/shelf.py:244 #, python-format msgid "Shelf %(title)s changed" msgstr "" -#: cps/shelf.py:243 cps/shelf.py:245 +#: cps/shelf.py:247 cps/shelf.py:249 msgid "Edit a shelf" msgstr "" -#: cps/shelf.py:289 +#: cps/shelf.py:301 #, python-format msgid "Shelf: '%(name)s'" msgstr "" -#: cps/shelf.py:292 +#: cps/shelf.py:304 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "" -#: cps/shelf.py:323 +#: cps/shelf.py:342 +msgid "Hidden Book" +msgstr "" + +#: cps/shelf.py:347 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "" -#: cps/ub.py:57 +#: cps/ub.py:56 msgid "Recently Added" msgstr "" -#: cps/ub.py:59 +#: cps/ub.py:58 msgid "Show recent books" msgstr "" -#: cps/templates/index.xml:17 cps/ub.py:60 +#: cps/templates/index.xml:17 cps/ub.py:59 msgid "Hot Books" msgstr "" -#: cps/ub.py:61 -msgid "Show hot books" +#: cps/ub.py:60 +msgid "Show Hot Books" msgstr "" -#: cps/templates/index.xml:24 cps/ub.py:64 -msgid "Best rated Books" +#: cps/templates/index.xml:24 cps/ub.py:63 cps/web.py:508 +msgid "Top Rated Books" msgstr "" -#: cps/ub.py:66 -msgid "Show best rated books" +#: cps/ub.py:65 +msgid "Show Top Rated Books" msgstr "" -#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67 -#: cps/web.py:1011 +#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:66 +#: cps/web.py:1005 msgid "Read Books" msgstr "" -#: cps/ub.py:69 +#: cps/ub.py:68 msgid "Show read and unread" msgstr "" -#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71 -#: cps/web.py:1015 +#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:70 +#: cps/web.py:1009 msgid "Unread Books" msgstr "" -#: cps/ub.py:73 +#: cps/ub.py:72 msgid "Show unread" msgstr "" -#: cps/ub.py:74 +#: cps/ub.py:73 msgid "Discover" msgstr "" -#: cps/ub.py:76 +#: cps/ub.py:75 msgid "Show random books" msgstr "" -#: cps/templates/index.xml:75 cps/ub.py:77 +#: cps/templates/index.xml:75 cps/ub.py:76 cps/web.py:787 msgid "Categories" msgstr "" -#: cps/ub.py:79 +#: cps/ub.py:78 msgid "Show category selection" msgstr "" -#: cps/templates/book_edit.html:71 cps/templates/index.xml:82 -#: cps/templates/search_form.html:53 cps/ub.py:80 +#: cps/templates/book_edit.html:69 cps/templates/index.xml:82 +#: cps/templates/search_form.html:53 cps/ub.py:79 cps/web.py:715 msgid "Series" msgstr "" -#: cps/ub.py:82 +#: cps/ub.py:81 msgid "Show series selection" msgstr "" -#: cps/templates/index.xml:61 cps/ub.py:83 +#: cps/templates/index.xml:61 cps/ub.py:82 msgid "Authors" msgstr "" -#: cps/ub.py:85 +#: cps/ub.py:84 msgid "Show author selection" msgstr "" -#: cps/templates/index.xml:68 cps/ub.py:87 +#: cps/templates/index.xml:68 cps/ub.py:86 cps/web.py:699 msgid "Publishers" msgstr "" -#: cps/ub.py:89 +#: cps/ub.py:88 msgid "Show publisher selection" msgstr "" -#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:90 +#: cps/templates/index.xml:89 cps/templates/search_form.html:74 cps/ub.py:89 +#: cps/web.py:770 msgid "Languages" msgstr "" -#: cps/ub.py:93 +#: cps/ub.py:92 msgid "Show language selection" msgstr "" -#: cps/ub.py:94 +#: cps/templates/index.xml:96 cps/ub.py:93 msgid "Ratings" msgstr "" -#: cps/ub.py:96 +#: cps/ub.py:95 msgid "Show ratings selection" msgstr "" -#: cps/templates/index.xml:96 cps/ub.py:97 +#: cps/templates/index.xml:104 cps/ub.py:96 msgid "File formats" msgstr "" -#: cps/ub.py:99 +#: cps/ub.py:98 msgid "Show file formats selection" msgstr "" -#: cps/updater.py:252 cps/updater.py:359 cps/updater.py:372 +#: cps/updater.py:262 cps/updater.py:369 cps/updater.py:382 msgid "Unexpected data while reading update information" msgstr "" -#: cps/updater.py:259 cps/updater.py:365 +#: cps/updater.py:269 cps/updater.py:375 msgid "No update available. You already have the latest version installed" msgstr "" -#: cps/updater.py:285 +#: cps/updater.py:295 msgid "A new update is available. Click on the button below to update to the latest version." msgstr "" -#: cps/updater.py:338 +#: cps/updater.py:348 msgid "Could not fetch update information" msgstr "" -#: cps/updater.py:352 +#: cps/updater.py:362 msgid "No release information available" msgstr "" -#: cps/updater.py:405 cps/updater.py:414 +#: cps/updater.py:415 cps/updater.py:424 #, python-format msgid "A new update is available. Click on the button below to update to version: %(version)s" msgstr "" -#: cps/updater.py:424 +#: cps/updater.py:434 msgid "Click on the button below to update to the latest stable version." msgstr "" -#: cps/web.py:486 +#: cps/web.py:480 msgid "Recently Added Books" msgstr "" -#: cps/web.py:514 -msgid "Best rated books" -msgstr "" - -#: cps/templates/index.xml:38 cps/web.py:522 -msgid "Random Books" +#: cps/templates/index.html:5 cps/web.py:516 +msgid "Discover (Random Books)" msgstr "" -#: cps/web.py:548 +#: cps/web.py:542 msgid "Books" msgstr "" -#: cps/web.py:575 -msgid "Hot Books (most downloaded)" +#: cps/web.py:569 +msgid "Hot Books (Most Downloaded)" msgstr "" -#: cps/web.py:586 cps/web.py:1382 cps/web.py:1478 -msgid "Error opening eBook. File does not exist or file is not accessible:" +#: cps/web.py:580 +msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "" -#: cps/web.py:599 +#: cps/web.py:593 #, python-format msgid "Author: %(name)s" msgstr "" -#: cps/web.py:611 +#: cps/web.py:605 #, python-format msgid "Publisher: %(name)s" msgstr "" -#: cps/web.py:622 +#: cps/web.py:616 #, python-format msgid "Series: %(serie)s" msgstr "" -#: cps/web.py:633 +#: cps/web.py:627 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:644 +#: cps/web.py:638 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:656 +#: cps/web.py:650 #, python-format msgid "Category: %(name)s" msgstr "" -#: cps/web.py:673 +#: cps/web.py:667 #, python-format msgid "Language: %(name)s" msgstr "" -#: cps/web.py:705 -msgid "Publisher list" -msgstr "" - -#: cps/web.py:721 -msgid "Series list" -msgstr "" - -#: cps/web.py:735 +#: cps/web.py:729 msgid "Ratings list" msgstr "" -#: cps/web.py:748 +#: cps/web.py:742 msgid "File formats list" msgstr "" -#: cps/web.py:776 -msgid "Available languages" -msgstr "" - -#: cps/web.py:793 -msgid "Category list" -msgstr "" - -#: cps/templates/layout.html:73 cps/web.py:807 +#: cps/templates/layout.html:73 cps/templates/tasks.html:7 cps/web.py:801 msgid "Tasks" msgstr "" -#: cps/templates/feed.xml:33 cps/templates/layout.html:44 -#: cps/templates/layout.html:45 cps/web.py:829 cps/web.py:831 +#: cps/templates/book_edit.html:212 cps/templates/feed.xml:33 +#: cps/templates/layout.html:44 cps/templates/layout.html:47 +#: cps/templates/search_form.html:170 cps/web.py:821 cps/web.py:823 msgid "Search" msgstr "" -#: cps/web.py:881 +#: cps/web.py:873 msgid "Published after " msgstr "" -#: cps/web.py:888 +#: cps/web.py:880 msgid "Published before " msgstr "" -#: cps/web.py:902 +#: cps/web.py:894 #, python-format msgid "Rating <= %(rating)s" msgstr "" -#: cps/web.py:904 +#: cps/web.py:896 #, python-format msgid "Rating >= %(rating)s" msgstr "" -#: cps/web.py:970 cps/web.py:982 +#: cps/web.py:962 cps/web.py:976 msgid "search" msgstr "" -#: cps/web.py:1067 +#: cps/web.py:1060 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "" -#: cps/web.py:1071 +#: cps/web.py:1064 #, python-format msgid "There was an error sending this book: %(res)s" msgstr "" -#: cps/web.py:1073 +#: cps/web.py:1066 msgid "Please configure your kindle e-mail address first..." msgstr "" -#: cps/web.py:1087 +#: cps/web.py:1083 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "" -#: cps/web.py:1088 cps/web.py:1094 cps/web.py:1119 cps/web.py:1123 -#: cps/web.py:1128 cps/web.py:1132 +#: cps/web.py:1084 cps/web.py:1090 cps/web.py:1115 cps/web.py:1119 +#: cps/web.py:1124 cps/web.py:1128 msgid "register" msgstr "" -#: cps/web.py:1121 +#: cps/web.py:1117 msgid "Your e-mail is not allowed to register" msgstr "" -#: cps/web.py:1124 +#: cps/web.py:1120 msgid "Confirmation e-mail was send to your e-mail account." msgstr "" -#: cps/web.py:1127 +#: cps/web.py:1123 msgid "This username or e-mail address is already in use." msgstr "" -#: cps/web.py:1144 +#: cps/web.py:1140 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1154 cps/web.py:1281 +#: cps/web.py:1150 cps/web.py:1277 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1159 +#: cps/web.py:1155 msgid "Could not login. LDAP server down, please contact your administrator" msgstr "" -#: cps/web.py:1163 cps/web.py:1186 +#: cps/web.py:1159 cps/web.py:1182 msgid "Wrong Username or Password" msgstr "" -#: cps/web.py:1170 +#: cps/web.py:1166 msgid "New Password was send to your email address" msgstr "" -#: cps/web.py:1176 +#: cps/web.py:1172 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1182 +#: cps/web.py:1178 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1189 cps/web.py:1213 +#: cps/web.py:1185 cps/web.py:1209 msgid "login" msgstr "" -#: cps/web.py:1225 cps/web.py:1259 +#: cps/web.py:1221 cps/web.py:1255 msgid "Token not found" msgstr "" -#: cps/web.py:1234 cps/web.py:1267 +#: cps/web.py:1230 cps/web.py:1263 msgid "Token has expired" msgstr "" -#: cps/web.py:1243 +#: cps/web.py:1239 msgid "Success! Please return to your device" msgstr "" -#: cps/web.py:1320 cps/web.py:1363 cps/web.py:1369 +#: cps/web.py:1320 cps/web.py:1365 cps/web.py:1371 #, python-format msgid "%(name)s's profile" msgstr "" -#: cps/web.py:1365 +#: cps/web.py:1367 msgid "Profile updated" msgstr "" -#: cps/web.py:1394 cps/web.py:1397 cps/web.py:1400 cps/web.py:1407 -#: cps/web.py:1412 +#: cps/web.py:1384 cps/web.py:1480 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "" + +#: cps/web.py:1396 cps/web.py:1399 cps/web.py:1402 cps/web.py:1409 +#: cps/web.py:1414 msgid "Read a Book" msgstr "" -#: cps/web.py:1423 +#: cps/web.py:1425 msgid "Error opening eBook. File does not exist or file is not accessible." msgstr "" @@ -926,23 +949,26 @@ msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "" #: cps/templates/admin.html:9 -msgid "User list" +msgid "Users" msgstr "" -#: cps/templates/admin.html:12 -msgid "Nickname" +#: cps/templates/admin.html:12 cps/templates/login.html:8 +#: cps/templates/login.html:9 cps/templates/register.html:7 +#: cps/templates/user_edit.html:8 +msgid "Username" msgstr "" -#: cps/templates/admin.html:13 -msgid "E-mail" +#: cps/templates/admin.html:13 cps/templates/register.html:11 +#: cps/templates/user_edit.html:13 +msgid "E-mail Address" msgstr "" -#: cps/templates/admin.html:14 -msgid "Kindle" +#: cps/templates/admin.html:14 cps/templates/user_edit.html:26 +msgid "Send to Kindle E-mail Address" msgstr "" #: cps/templates/admin.html:15 -msgid "DLS" +msgid "Downloads" msgstr "" #: cps/templates/admin.html:16 cps/templates/layout.html:76 @@ -956,7 +982,7 @@ msgid "Download" msgstr "" #: cps/templates/admin.html:18 -msgid "View Ebooks" +msgid "View eBooks" msgstr "" #: cps/templates/admin.html:19 cps/templates/layout.html:65 @@ -967,28 +993,32 @@ msgstr "" msgid "Edit" msgstr "" +#: cps/templates/admin.html:38 +msgid "Add New User" +msgstr "" + #: cps/templates/admin.html:44 -msgid "SMTP e-mail server settings" +msgid "E-mail Server Settings" msgstr "" #: cps/templates/admin.html:47 cps/templates/email_edit.html:11 -msgid "SMTP hostname" +msgid "SMTP Hostname" msgstr "" -#: cps/templates/admin.html:48 -msgid "SMTP port" +#: cps/templates/admin.html:48 cps/templates/email_edit.html:15 +msgid "SMTP Port" msgstr "" -#: cps/templates/admin.html:49 -msgid "SSL" +#: cps/templates/admin.html:49 cps/templates/email_edit.html:19 +msgid "Encryption" msgstr "" #: cps/templates/admin.html:50 cps/templates/email_edit.html:27 -msgid "SMTP login" +msgid "SMTP Login" msgstr "" -#: cps/templates/admin.html:51 -msgid "From mail" +#: cps/templates/admin.html:51 cps/templates/email_edit.html:35 +msgid "From E-mail" msgstr "" #: cps/templates/admin.html:61 @@ -1000,63 +1030,71 @@ msgid "Configuration" msgstr "" #: cps/templates/admin.html:70 -msgid "Calibre DB dir" +msgid "Calibre Database Directory" msgstr "" -#: cps/templates/admin.html:74 -msgid "Log level" +#: cps/templates/admin.html:74 cps/templates/config_edit.html:122 +msgid "Log Level" msgstr "" #: cps/templates/admin.html:78 msgid "Port" msgstr "" -#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:23 -msgid "Books per page" +#: cps/templates/admin.html:84 cps/templates/config_view_edit.html:27 +msgid "Books per Page" msgstr "" #: cps/templates/admin.html:88 -msgid "Uploading" +msgid "Uploads" msgstr "" #: cps/templates/admin.html:92 -msgid "Anonymous browsing" +msgid "Anonymous Browsing" msgstr "" #: cps/templates/admin.html:96 -msgid "Public registration" +msgid "Public Registration" msgstr "" -#: cps/templates/admin.html:100 cps/templates/remote_login.html:4 -msgid "Remote login" +#: cps/templates/admin.html:100 +msgid "Magic Link Remote Login" msgstr "" #: cps/templates/admin.html:104 -msgid "Reverse proxy login" +msgid "Reverse Proxy Login" msgstr "" #: cps/templates/admin.html:109 msgid "Reverse proxy header name" msgstr "" +#: cps/templates/admin.html:114 +msgid "Edit Basic Configuration" +msgstr "" + +#: cps/templates/admin.html:115 +msgid "Edit UI Configuration" +msgstr "" + #: cps/templates/admin.html:121 msgid "Administration" msgstr "" #: cps/templates/admin.html:122 -msgid "View Logfiles" +msgid "View Logs" msgstr "" #: cps/templates/admin.html:123 -msgid "Reconnect to Calibre DB" +msgid "Reconnect Calibre Database" msgstr "" #: cps/templates/admin.html:124 -msgid "Restart Calibre-Web" +msgid "Restart" msgstr "" #: cps/templates/admin.html:125 -msgid "Stop Calibre-Web" +msgid "Shutdown" msgstr "" #: cps/templates/admin.html:131 @@ -1076,7 +1114,7 @@ msgid "Current version" msgstr "" #: cps/templates/admin.html:148 -msgid "Check for update" +msgid "Check for Update" msgstr "" #: cps/templates/admin.html:149 @@ -1084,30 +1122,29 @@ msgid "Perform Update" msgstr "" #: cps/templates/admin.html:161 -msgid "Do you really want to restart Calibre-Web?" +msgid "Are you sure you want to restart?" msgstr "" #: cps/templates/admin.html:166 cps/templates/admin.html:180 #: cps/templates/admin.html:200 cps/templates/shelf.html:72 -msgid "Ok" +msgid "OK" msgstr "" #: cps/templates/admin.html:167 cps/templates/admin.html:181 -#: cps/templates/book_edit.html:174 cps/templates/book_edit.html:196 -#: cps/templates/config_edit.html:331 cps/templates/config_view_edit.html:147 +#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:194 +#: cps/templates/config_edit.html:346 cps/templates/config_view_edit.html:151 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92 -#: cps/templates/layout.html:28 cps/templates/shelf.html:73 -#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32 -#: cps/templates/user_edit.html:131 -msgid "Back" +#: cps/templates/shelf.html:73 cps/templates/shelf_edit.html:19 +#: cps/templates/user_edit.html:137 +msgid "Cancel" msgstr "" #: cps/templates/admin.html:179 -msgid "Do you really want to stop Calibre-Web?" +msgid "Are you sure you want to shutdown?" msgstr "" #: cps/templates/admin.html:191 -msgid "Updating, please do not reload page" +msgid "Updating, please do not reload this page" msgstr "" #: cps/templates/author.html:15 @@ -1134,161 +1171,159 @@ msgstr "" msgid "More by" msgstr "" -#: cps/templates/book_edit.html:12 +#: cps/templates/book_edit.html:10 msgid "Delete Book" msgstr "" -#: cps/templates/book_edit.html:15 +#: cps/templates/book_edit.html:13 msgid "Delete formats:" msgstr "" -#: cps/templates/book_edit.html:18 cps/templates/book_edit.html:195 -#: cps/templates/email_edit.html:91 +#: cps/templates/book_edit.html:16 cps/templates/book_edit.html:193 +#: cps/templates/email_edit.html:91 cps/templates/user_edit.html:65 +#: cps/templates/user_edit.html:177 msgid "Delete" msgstr "" -#: cps/templates/book_edit.html:26 +#: cps/templates/book_edit.html:24 msgid "Convert book format:" msgstr "" -#: cps/templates/book_edit.html:30 +#: cps/templates/book_edit.html:28 msgid "Convert from:" msgstr "" -#: cps/templates/book_edit.html:32 cps/templates/book_edit.html:39 +#: cps/templates/book_edit.html:30 cps/templates/book_edit.html:37 msgid "select an option" msgstr "" -#: cps/templates/book_edit.html:37 +#: cps/templates/book_edit.html:35 msgid "Convert to:" msgstr "" -#: cps/templates/book_edit.html:46 +#: cps/templates/book_edit.html:44 msgid "Convert book" msgstr "" -#: cps/templates/book_edit.html:55 cps/templates/search_form.html:6 +#: cps/templates/book_edit.html:53 cps/templates/search_form.html:6 msgid "Book Title" msgstr "" -#: cps/templates/book_edit.html:59 cps/templates/book_edit.html:255 -#: cps/templates/book_edit.html:273 cps/templates/search_form.html:10 +#: cps/templates/book_edit.html:57 cps/templates/book_edit.html:256 +#: cps/templates/book_edit.html:274 cps/templates/search_form.html:10 msgid "Author" msgstr "" -#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:260 -#: cps/templates/book_edit.html:275 cps/templates/search_form.html:126 +#: cps/templates/book_edit.html:61 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:276 cps/templates/search_form.html:126 msgid "Description" msgstr "" -#: cps/templates/book_edit.html:67 cps/templates/search_form.html:33 +#: cps/templates/book_edit.html:65 cps/templates/search_form.html:33 msgid "Tags" msgstr "" -#: cps/templates/book_edit.html:75 -msgid "Series id" +#: cps/templates/book_edit.html:73 +msgid "Series ID" msgstr "" -#: cps/templates/book_edit.html:79 +#: cps/templates/book_edit.html:77 msgid "Rating" msgstr "" -#: cps/templates/book_edit.html:83 -msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +#: cps/templates/book_edit.html:81 +msgid "Fetch Cover from URL (JPEG - Image will be downloaded and stored in database)" msgstr "" -#: cps/templates/book_edit.html:87 -msgid "Upload Cover from local drive" +#: cps/templates/book_edit.html:85 +msgid "Upload Cover from Local Disk" msgstr "" -#: cps/templates/book_edit.html:92 cps/templates/detail.html:165 -msgid "Publishing date" +#: cps/templates/book_edit.html:90 +msgid "Published Date" msgstr "" -#: cps/templates/book_edit.html:99 cps/templates/book_edit.html:257 -#: cps/templates/book_edit.html:274 cps/templates/detail.html:156 +#: cps/templates/book_edit.html:97 cps/templates/book_edit.html:258 +#: cps/templates/book_edit.html:275 cps/templates/detail.html:156 #: cps/templates/search_form.html:14 msgid "Publisher" msgstr "" -#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:30 +#: cps/templates/book_edit.html:101 cps/templates/detail.html:123 +#: cps/templates/user_edit.html:31 msgid "Language" msgstr "" -#: cps/templates/book_edit.html:113 cps/templates/search_form.html:137 +#: cps/templates/book_edit.html:111 cps/templates/search_form.html:137 msgid "Yes" msgstr "" -#: cps/templates/book_edit.html:114 cps/templates/search_form.html:138 +#: cps/templates/book_edit.html:112 cps/templates/search_form.html:138 msgid "No" msgstr "" -#: cps/templates/book_edit.html:160 -msgid "Upload format" +#: cps/templates/book_edit.html:158 +msgid "Upload Format" msgstr "" -#: cps/templates/book_edit.html:169 -msgid "view book after edit" +#: cps/templates/book_edit.html:167 +msgid "View Book on Save" msgstr "" -#: cps/templates/book_edit.html:172 cps/templates/book_edit.html:208 -msgid "Get metadata" +#: cps/templates/book_edit.html:170 cps/templates/book_edit.html:206 +msgid "Fetch Metadata" msgstr "" -#: 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:170 cps/templates/shelf_edit.html:17 -#: cps/templates/user_edit.html:129 -msgid "Submit" +#: cps/templates/book_edit.html:171 cps/templates/config_edit.html:343 +#: cps/templates/config_view_edit.html:150 cps/templates/email_edit.html:38 +#: cps/templates/shelf_edit.html:17 cps/templates/user_edit.html:135 +msgid "Save" msgstr "" -#: cps/templates/book_edit.html:187 +#: cps/templates/book_edit.html:185 msgid "Are you really sure?" msgstr "" -#: cps/templates/book_edit.html:190 -msgid "Book will be deleted from Calibre database" +#: cps/templates/book_edit.html:188 +msgid "This book will be permanently erased from database" msgstr "" -#: cps/templates/book_edit.html:191 -msgid "and from hard disk" +#: cps/templates/book_edit.html:189 +msgid "and hard disk" msgstr "" -#: cps/templates/book_edit.html:211 +#: cps/templates/book_edit.html:209 msgid "Keyword" msgstr "" -#: cps/templates/book_edit.html:212 +#: cps/templates/book_edit.html:210 msgid " Search keyword " msgstr "" -#: cps/templates/book_edit.html:214 cps/templates/layout.html:47 -msgid "Go!" -msgstr "" - -#: cps/templates/book_edit.html:218 +#: cps/templates/book_edit.html:216 msgid "Click the cover to load metadata to the form" msgstr "" -#: cps/templates/book_edit.html:230 cps/templates/book_edit.html:270 +#: cps/templates/book_edit.html:231 cps/templates/book_edit.html:271 msgid "Loading..." msgstr "" -#: cps/templates/book_edit.html:235 cps/templates/layout.html:192 -#: cps/templates/layout.html:224 +#: cps/templates/book_edit.html:236 cps/templates/layout.html:191 +#: cps/templates/layout.html:223 cps/templates/modal_restriction.html:34 +#: cps/templates/user_edit.html:164 msgid "Close" msgstr "" -#: cps/templates/book_edit.html:262 cps/templates/book_edit.html:276 +#: cps/templates/book_edit.html:263 cps/templates/book_edit.html:277 msgid "Source" msgstr "" -#: cps/templates/book_edit.html:271 +#: cps/templates/book_edit.html:272 msgid "Search error!" msgstr "" -#: cps/templates/book_edit.html:272 -msgid "No Result(s) found! Please try aonther keyword." +#: cps/templates/book_edit.html:273 +msgid "No Result(s) found! Please try another keyword." msgstr "" #: cps/templates/config_edit.html:12 @@ -1296,7 +1331,7 @@ msgid "Library Configuration" msgstr "" #: cps/templates/config_edit.html:19 -msgid "Location of Calibre database" +msgid "Location of Calibre Database" msgstr "" #: cps/templates/config_edit.html:25 @@ -1348,7 +1383,7 @@ msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" msgstr "" #: cps/templates/config_edit.html:99 -msgid "Update channel" +msgid "Update Channel" msgstr "" #: cps/templates/config_edit.html:101 @@ -1371,10 +1406,6 @@ msgstr "" msgid "Logfile Configuration" msgstr "" -#: cps/templates/config_edit.html:122 -msgid "Log Level" -msgstr "" - #: cps/templates/config_edit.html:131 msgid "Location and name of logfile (calibre-web.log for no entry)" msgstr "" @@ -1392,255 +1423,271 @@ msgid "Feature Configuration" msgstr "" #: cps/templates/config_edit.html:158 -msgid "Enable uploading" +msgid "Enable Uploads" msgstr "" #: cps/templates/config_edit.html:162 -msgid "Enable anonymous browsing" +msgid "Enable Anonymous Browsing" msgstr "" #: cps/templates/config_edit.html:166 -msgid "Enable public registration" +msgid "Enable Public Registration" msgstr "" #: cps/templates/config_edit.html:170 -msgid "Enable remote login (\"magic link\")" +msgid "Enable Magic Link Remote Login" msgstr "" #: cps/templates/config_edit.html:175 +msgid "Enable Kobo sync" +msgstr "" + +#: cps/templates/config_edit.html:180 +msgid "Proxy unknown requests to Kobo Store" +msgstr "" + +#: cps/templates/config_edit.html:187 msgid "Use Goodreads" msgstr "" -#: cps/templates/config_edit.html:176 -msgid "Obtain an API Key" +#: cps/templates/config_edit.html:188 +msgid "Create an API Key" msgstr "" -#: cps/templates/config_edit.html:180 +#: cps/templates/config_edit.html:192 msgid "Goodreads API Key" msgstr "" -#: cps/templates/config_edit.html:184 +#: cps/templates/config_edit.html:196 msgid "Goodreads API Secret" msgstr "" -#: cps/templates/config_edit.html:191 +#: cps/templates/config_edit.html:203 msgid "Login type" msgstr "" -#: cps/templates/config_edit.html:193 -msgid "Use standard Authentication" +#: cps/templates/config_edit.html:205 +msgid "Use Standard Authentication" msgstr "" -#: cps/templates/config_edit.html:195 +#: cps/templates/config_edit.html:207 msgid "Use LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:198 +#: cps/templates/config_edit.html:210 msgid "Use OAuth" msgstr "" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:217 msgid "LDAP Server Host Name or IP Address" msgstr "" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:221 msgid "LDAP Server Port" msgstr "" -#: cps/templates/config_edit.html:213 -msgid "LDAP schema (ldap or ldaps)" +#: cps/templates/config_edit.html:225 +msgid "LDAP Schema (LDAP or LPAPS)" msgstr "" -#: cps/templates/config_edit.html:217 -msgid "LDAP Admin username" +#: cps/templates/config_edit.html:229 +msgid "LDAP Administrator Username" msgstr "" -#: cps/templates/config_edit.html:221 -msgid "LDAP Admin password" +#: cps/templates/config_edit.html:233 +msgid "LDAP Administrator Password" msgstr "" -#: cps/templates/config_edit.html:226 -msgid "LDAP Server use SSL" +#: cps/templates/config_edit.html:238 +msgid "LDAP Server Enable SSL" msgstr "" -#: cps/templates/config_edit.html:230 -msgid "LDAP Server use TLS" +#: cps/templates/config_edit.html:242 +msgid "LDAP Server Enable TLS" msgstr "" -#: cps/templates/config_edit.html:234 +#: cps/templates/config_edit.html:246 msgid "LDAP Server Certificate" msgstr "" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:250 msgid "LDAP SSL Certificate Path" msgstr "" -#: cps/templates/config_edit.html:243 +#: cps/templates/config_edit.html:255 msgid "LDAP Distinguished Name (DN)" msgstr "" -#: cps/templates/config_edit.html:247 -msgid "LDAP User object filter" +#: cps/templates/config_edit.html:259 +msgid "LDAP User Object Filter" msgstr "" -#: cps/templates/config_edit.html:252 +#: cps/templates/config_edit.html:264 msgid "LDAP Server is OpenLDAP?" msgstr "" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:272 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:263 +#: cps/templates/config_edit.html:275 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:279 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:276 +#: cps/templates/config_edit.html:288 msgid "Allow Reverse Proxy Authentication" msgstr "" -#: cps/templates/config_edit.html:280 +#: cps/templates/config_edit.html:292 msgid "Reverse Proxy Header Name" msgstr "" -#: cps/templates/config_edit.html:292 +#: cps/templates/config_edit.html:304 msgid "External binaries" msgstr "" -#: cps/templates/config_edit.html:300 -msgid "No converter" +#: cps/templates/config_edit.html:312 +msgid "No Converter" msgstr "" -#: cps/templates/config_edit.html:302 +#: cps/templates/config_edit.html:314 msgid "Use Kindlegen" msgstr "" -#: cps/templates/config_edit.html:304 +#: cps/templates/config_edit.html:316 msgid "Use calibre's ebook converter" msgstr "" -#: cps/templates/config_edit.html:308 +#: cps/templates/config_edit.html:320 msgid "E-Book converter settings" msgstr "" -#: cps/templates/config_edit.html:312 +#: cps/templates/config_edit.html:324 msgid "Path to convertertool" msgstr "" -#: cps/templates/config_edit.html:318 +#: cps/templates/config_edit.html:330 msgid "Location of Unrar binary" msgstr "" -#: cps/templates/config_edit.html:334 cps/templates/layout.html:84 -#: cps/templates/login.html:4 +#: cps/templates/config_edit.html:349 cps/templates/layout.html:84 +#: cps/templates/login.html:4 cps/templates/login.html:20 msgid "Login" msgstr "" -#: cps/templates/config_view_edit.html:12 +#: cps/templates/config_view_edit.html:16 msgid "View Configuration" msgstr "" -#: cps/templates/config_view_edit.html:19 cps/templates/shelf_edit.html:7 +#: cps/templates/config_view_edit.html:23 cps/templates/shelf_edit.html:7 msgid "Title" msgstr "" -#: cps/templates/config_view_edit.html:27 -msgid "No. of random books to show" +#: cps/templates/config_view_edit.html:31 +msgid "No. of Random Books to Display" msgstr "" -#: cps/templates/config_view_edit.html:31 -msgid "No. of authors to show before hiding (0=disable hiding)" +#: cps/templates/config_view_edit.html:35 +msgid "No. of Authors to Display Before Hiding (0=Disable Hiding)" msgstr "" -#: cps/templates/config_view_edit.html:35 cps/templates/readcbr.html:112 +#: cps/templates/config_view_edit.html:39 cps/templates/readcbr.html:112 msgid "Theme" msgstr "" -#: cps/templates/config_view_edit.html:37 +#: cps/templates/config_view_edit.html:41 msgid "Standard Theme" msgstr "" -#: cps/templates/config_view_edit.html:38 -msgid "caliBlur! Dark Theme" -msgstr "" - #: cps/templates/config_view_edit.html:42 -msgid "Regular expression for ignoring columns" +msgid "caliBlur! Dark Theme" msgstr "" #: cps/templates/config_view_edit.html:46 -msgid "Link read/unread status to Calibre column" +msgid "Regular Expression for Ignoring Columns" msgstr "" -#: cps/templates/config_view_edit.html:55 -msgid "Regular expression for title sorting" +#: cps/templates/config_view_edit.html:50 +msgid "Link Read/Unread Status to Calibre Column" msgstr "" #: cps/templates/config_view_edit.html:59 -msgid "Tags for Mature Content" +msgid "View Restrictions based on Calibre column" msgstr "" -#: cps/templates/config_view_edit.html:73 -msgid "Default settings for new users" +#: cps/templates/config_view_edit.html:61 cps/templates/email_edit.html:21 +msgid "None" msgstr "" -#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:82 -msgid "Admin user" +#: cps/templates/config_view_edit.html:68 +msgid "Regular Expression for Title Sorting" msgstr "" -#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:91 +#: cps/templates/config_view_edit.html:80 +msgid "Default Settings for New Users" +msgstr "" + +#: cps/templates/config_view_edit.html:88 cps/templates/user_edit.html:92 +msgid "Admin User" +msgstr "" + +#: cps/templates/config_view_edit.html:92 cps/templates/user_edit.html:97 msgid "Allow Downloads" msgstr "" -#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:95 -msgid "Allow book viewer" +#: cps/templates/config_view_edit.html:96 cps/templates/user_edit.html:101 +msgid "Allow eBook Viewer" msgstr "" -#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:99 +#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:105 msgid "Allow Uploads" msgstr "" -#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:103 +#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:109 msgid "Allow Edit" msgstr "" -#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 -msgid "Allow Delete books" +#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:113 +msgid "Allow Delete Books" msgstr "" -#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:112 +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:118 msgid "Allow Changing Password" msgstr "" -#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:116 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:122 msgid "Allow Editing Public Shelfs" msgstr "" -#: cps/templates/config_view_edit.html:119 -msgid "Default visibilities for new users" +#: cps/templates/config_view_edit.html:126 +msgid "Default Visibilities for New Users" +msgstr "" + +#: cps/templates/config_view_edit.html:142 +msgid "Show Random Books in Detail View" msgstr "" -#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:74 -msgid "Show random books in detail view" +#: cps/templates/config_view_edit.html:144 +msgid "Add Allowed/Denied Tags" msgstr "" -#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:87 -msgid "Show mature content" +#: cps/templates/config_view_edit.html:145 +msgid "Add Allowed/Denied custom column values" msgstr "" #: cps/templates/detail.html:59 -msgid "Read in browser" +msgid "Read in Browser" msgstr "" #: cps/templates/detail.html:72 -msgid "Listen in browser" +msgid "Listen in Browser" msgstr "" #: cps/templates/detail.html:117 @@ -1651,8 +1698,8 @@ msgstr "" msgid "of" msgstr "" -#: cps/templates/detail.html:123 -msgid "language" +#: cps/templates/detail.html:165 +msgid "Published" msgstr "" #: cps/templates/detail.html:200 @@ -1676,19 +1723,7 @@ msgid "Add to shelf" msgstr "" #: cps/templates/detail.html:286 -msgid "Edit metadata" -msgstr "" - -#: cps/templates/email_edit.html:15 -msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" -msgstr "" - -#: cps/templates/email_edit.html:19 -msgid "Encryption" -msgstr "" - -#: cps/templates/email_edit.html:21 -msgid "None" +msgid "Edit Metadata" msgstr "" #: cps/templates/email_edit.html:22 @@ -1700,23 +1735,15 @@ msgid "SSL/TLS" msgstr "" #: cps/templates/email_edit.html:31 -msgid "SMTP password" -msgstr "" - -#: cps/templates/email_edit.html:35 -msgid "From e-mail" -msgstr "" - -#: cps/templates/email_edit.html:38 -msgid "Save settings" +msgid "SMTP Password" msgstr "" #: cps/templates/email_edit.html:39 -msgid "Save settings and send Test E-Mail" +msgid "Save and Send Test E-mail" msgstr "" #: cps/templates/email_edit.html:43 -msgid "Allowed domains for registering" +msgid "Allowed Domains (Whitelist)" msgstr "" #: cps/templates/email_edit.html:46 cps/templates/email_edit.html:72 @@ -1732,27 +1759,27 @@ msgid "Enter domainname" msgstr "" #: cps/templates/email_edit.html:60 -msgid "Denied domains for registering" +msgid "Denied Domains (Blacklist)" msgstr "" #: cps/templates/email_edit.html:90 -msgid "Do you really want to delete this domain rule?" +msgid "Are you sure you want to delete this domain?" msgstr "" -#: cps/templates/feed.xml:21 cps/templates/layout.html:176 +#: cps/templates/feed.xml:21 cps/templates/layout.html:175 msgid "Next" msgstr "" -#: cps/templates/http_error.html:37 -msgid "Create issue" +#: cps/templates/generate_kobo_auth_url.html:5 +msgid "Open the .kobo/Kobo eReader.conf file in a text editor and add (or edit):" msgstr "" -#: cps/templates/http_error.html:44 -msgid "Back to home" +#: cps/templates/http_error.html:38 +msgid "Create Issue" msgstr "" -#: cps/templates/index.html:5 -msgid "Discover (Random Books)" +#: cps/templates/http_error.html:45 +msgid "Return to Home" msgstr "" #: cps/templates/index.html:64 @@ -1779,7 +1806,11 @@ msgstr "" msgid "The latest Books" msgstr "" -#: cps/templates/index.xml:42 +#: cps/templates/index.xml:38 +msgid "Random Books" +msgstr "" + +#: cps/templates/index.xml:42 cps/templates/user_edit.html:80 msgid "Show Random Books" msgstr "" @@ -1804,22 +1835,26 @@ msgid "Books ordered by Languages" msgstr "" #: cps/templates/index.xml:100 +msgid "Books ordered by Rating" +msgstr "" + +#: cps/templates/index.xml:108 msgid "Books ordered by file formats" msgstr "" -#: cps/templates/index.xml:103 cps/templates/layout.html:137 +#: cps/templates/index.xml:111 cps/templates/layout.html:136 msgid "Public Shelves" msgstr "" -#: cps/templates/index.xml:107 +#: cps/templates/index.xml:115 msgid "Books organized in public shelfs, visible to everyone" msgstr "" -#: cps/templates/index.xml:111 cps/templates/layout.html:141 +#: cps/templates/index.xml:119 cps/templates/layout.html:140 msgid "Your Shelves" msgstr "" -#: cps/templates/index.xml:115 +#: cps/templates/index.xml:123 msgid "User's own shelfs, only visible to the current user himself" msgstr "" @@ -1827,8 +1862,17 @@ msgstr "" msgid "Home" msgstr "" +#: cps/templates/layout.html:28 cps/templates/shelf_order.html:32 +#: cps/templates/user_edit.html:178 +msgid "Back" +msgstr "" + #: cps/templates/layout.html:34 -msgid "Toggle navigation" +msgid "Toggle Navigation" +msgstr "" + +#: cps/templates/layout.html:45 +msgid "Search Library" msgstr "" #: cps/templates/layout.html:55 @@ -1852,74 +1896,101 @@ msgstr "" msgid "Register" msgstr "" -#: cps/templates/layout.html:116 cps/templates/layout.html:223 +#: cps/templates/layout.html:116 cps/templates/layout.html:222 msgid "Uploading..." msgstr "" #: cps/templates/layout.html:117 -msgid "please don't refresh the page" +msgid "Please do not refresh the page" msgstr "" #: cps/templates/layout.html:127 msgid "Browse" msgstr "" -#: cps/templates/layout.html:146 +#: cps/templates/layout.html:145 msgid "Create a Shelf" msgstr "" -#: cps/templates/layout.html:147 cps/templates/stats.html:3 +#: cps/templates/layout.html:146 cps/templates/stats.html:3 msgid "About" msgstr "" -#: cps/templates/layout.html:161 +#: cps/templates/layout.html:160 msgid "Previous" msgstr "" -#: cps/templates/layout.html:188 +#: cps/templates/layout.html:187 msgid "Book Details" msgstr "" -#: cps/templates/layout.html:222 +#: cps/templates/layout.html:221 msgid "Upload done, processing, please wait..." msgstr "" -#: cps/templates/layout.html:225 +#: cps/templates/layout.html:224 msgid "Error" msgstr "" -#: cps/templates/login.html:8 cps/templates/login.html:9 -#: cps/templates/register.html:7 cps/templates/user_edit.html:8 -msgid "Username" -msgstr "" - #: cps/templates/login.html:12 cps/templates/login.html:13 #: cps/templates/user_edit.html:21 msgid "Password" msgstr "" #: cps/templates/login.html:17 -msgid "Remember me" +msgid "Remember Me" msgstr "" #: cps/templates/login.html:22 -msgid "Forgot password" +msgid "Forgot Password?" msgstr "" #: cps/templates/login.html:25 -msgid "Log in with magic link" +msgid "Log in with Magic Link" +msgstr "" + +#: cps/templates/logviewer.html:6 +msgid "Show Calibre-Web Log: " msgstr "" -#: cps/templates/logviewer.html:5 -msgid "Show Calibre-Web log" +#: cps/templates/logviewer.html:8 +msgid "Calibre-Web Log: " msgstr "" #: cps/templates/logviewer.html:8 -msgid "Show access log" +msgid "Stream output, can't be displayed" +msgstr "" + +#: cps/templates/logviewer.html:12 +msgid "Show Access Log: " +msgstr "" + +#: cps/templates/modal_restriction.html:6 +msgid "Select allowed/denied Tags" +msgstr "" + +#: cps/templates/modal_restriction.html:7 +msgid "Select allowed/denied Custom Column values" +msgstr "" + +#: cps/templates/modal_restriction.html:8 +msgid "Select allowed/denied Tags of user" +msgstr "" + +#: cps/templates/modal_restriction.html:9 +msgid "Select allowed/denied Custom Column values of user" +msgstr "" + +#: cps/templates/modal_restriction.html:15 +msgid "Enter Tag" +msgstr "" + +#: cps/templates/modal_restriction.html:24 +msgid "Add View Restriction" msgstr "" #: cps/templates/osd.xml:5 -msgid "Calibre-Web ebook catalog" +msgid "Calibre-Web eBook Catalog" msgstr "" #: cps/templates/read.html:74 @@ -2031,39 +2102,39 @@ msgid "Basic txt Reader" msgstr "" #: cps/templates/register.html:4 -msgid "Register a new account" +msgid "Register New Account" msgstr "" #: cps/templates/register.html:8 msgid "Choose a username" msgstr "" -#: cps/templates/register.html:11 cps/templates/user_edit.html:13 -msgid "E-mail address" -msgstr "" - #: cps/templates/register.html:12 msgid "Your email address" msgstr "" +#: cps/templates/remote_login.html:4 +msgid "Magic Link - Authorise New Device" +msgstr "" + #: cps/templates/remote_login.html:6 -msgid "Use your other device, login and visit " +msgid "On another device, login and visit:" msgstr "" -#: cps/templates/remote_login.html:9 -msgid "Once you do so, you will automatically get logged in on this device." +#: cps/templates/remote_login.html:10 +msgid "Once verified, you will automatically be logged in on this device." msgstr "" -#: cps/templates/remote_login.html:12 -msgid "The link will expire after 10 minutes." +#: cps/templates/remote_login.html:13 +msgid "This verification link will expire in 10 minutes." msgstr "" #: cps/templates/search.html:5 -msgid "No Results for:" +msgid "No Results Found" msgstr "" #: cps/templates/search.html:6 -msgid "Please try a different search" +msgid "Search Term:" msgstr "" #: cps/templates/search.html:8 @@ -2071,11 +2142,11 @@ msgid "Results for:" msgstr "" #: cps/templates/search_form.html:19 -msgid "Publishing date from" +msgid "Published Date From" msgstr "" #: cps/templates/search_form.html:26 -msgid "Publishing date to" +msgid "Published Date To" msgstr "" #: cps/templates/search_form.html:43 @@ -2099,11 +2170,11 @@ msgid "Exclude Extensions" msgstr "" #: cps/templates/search_form.html:117 -msgid "Rating bigger than" +msgid "Rating Above" msgstr "" #: cps/templates/search_form.html:121 -msgid "Rating less than" +msgid "Rating Below" msgstr "" #: cps/templates/shelf.html:10 @@ -2119,23 +2190,23 @@ msgid "Change order" msgstr "" #: cps/templates/shelf.html:67 -msgid "Do you really want to delete the shelf?" +msgid "Are you sure you want to delete this shelf?" msgstr "" #: cps/templates/shelf.html:70 -msgid "Shelf will be lost for everybody and forever!" +msgid "Shelf will be deleted for all users" msgstr "" #: cps/templates/shelf_edit.html:13 -msgid "should the shelf be public?" +msgid "Share with Everyone" msgstr "" #: cps/templates/shelf_order.html:5 -msgid "Drag 'n drop to rearrange order" +msgid "Drag to Rearrange Order" msgstr "" #: cps/templates/stats.html:7 -msgid "Calibre library statistics" +msgid "Library Statistics" msgstr "" #: cps/templates/stats.html:12 @@ -2155,21 +2226,17 @@ msgid "Series in this Library" msgstr "" #: cps/templates/stats.html:28 -msgid "Linked libraries" +msgid "Linked Libraries" msgstr "" #: cps/templates/stats.html:32 -msgid "Program library" +msgid "Program Library" msgstr "" #: cps/templates/stats.html:33 msgid "Installed Version" msgstr "" -#: cps/templates/tasks.html:7 -msgid "Tasks list" -msgstr "" - #: cps/templates/tasks.html:12 msgid "User" msgstr "" @@ -2187,11 +2254,11 @@ msgid "Progress" msgstr "" #: cps/templates/tasks.html:17 -msgid "Runtime" +msgid "Run Time" msgstr "" #: cps/templates/tasks.html:18 -msgid "Starttime" +msgid "Start Time" msgstr "" #: cps/templates/tasks.html:24 @@ -2206,35 +2273,55 @@ msgstr "" msgid "Reset user Password" msgstr "" -#: cps/templates/user_edit.html:26 -msgid "Kindle E-Mail" -msgstr "" - -#: cps/templates/user_edit.html:39 -msgid "Show books with language" +#: cps/templates/user_edit.html:41 +msgid "Language of Books" msgstr "" -#: cps/templates/user_edit.html:41 -msgid "Show all" +#: cps/templates/user_edit.html:43 +msgid "Show All" msgstr "" -#: cps/templates/user_edit.html:51 +#: cps/templates/user_edit.html:52 msgid "OAuth Settings" msgstr "" -#: cps/templates/user_edit.html:53 +#: cps/templates/user_edit.html:54 msgid "Link" msgstr "" -#: cps/templates/user_edit.html:55 +#: cps/templates/user_edit.html:56 msgid "Unlink" msgstr "" -#: cps/templates/user_edit.html:123 -msgid "Delete this user" +#: cps/templates/user_edit.html:62 +msgid "Kobo Sync Token" +msgstr "" + +#: cps/templates/user_edit.html:64 +msgid "Create/View" +msgstr "" + +#: cps/templates/user_edit.html:83 +msgid "Add allowed/denied Tags" +msgstr "" + +#: cps/templates/user_edit.html:84 +msgid "Add allowed/denied custom column values" +msgstr "" + +#: cps/templates/user_edit.html:129 +msgid "Delete User" msgstr "" -#: cps/templates/user_edit.html:138 +#: cps/templates/user_edit.html:144 msgid "Recent Downloads" msgstr "" +#: cps/templates/user_edit.html:160 +msgid "Generate Kobo Auth URL" +msgstr "" + +#: cps/templates/user_edit.html:176 +msgid "Do you really want to delete the Kobo Token?" +msgstr "" + diff --git a/optional-requirements.txt b/optional-requirements.txt index 605667d2..5bacdd69 100644 --- a/optional-requirements.txt +++ b/optional-requirements.txt @@ -1,34 +1,38 @@ # GDrive Integration -google-api-python-client==1.7.11 -gevent>=1.2.1 -greenlet>=0.4.12 -httplib2>=0.9.2 -oauth2client>=4.0.0 -uritemplate>=3.0.0 -pyasn1-modules>=0.0.8 -pyasn1>=0.1.9 -PyDrive>=1.3.1 +google-api-python-client==1.7.11,<1.8.0 +gevent>=1.2.1,<1.5.0 +greenlet>=0.4.12,<0.5.0 +httplib2>=0.9.2,<0.18.0 +oauth2client>=4.0.0,<4.14.0 +uritemplate>=3.0.0,<3.1.0 +pyasn1-modules>=0.0.8,<0.3.0 +pyasn1>=0.1.9,<0.5.0 +PyDrive>=1.3.1,<1.14.0 PyYAML>=3.12 -rsa==3.4.2 -six==1.10.0 +rsa==3.4.2,<4.1.0 +six>=1.10.0,<1.14.0 # goodreads -goodreads>=0.3.2 -python-Levenshtein>=0.12.0 +goodreads>=0.3.2,<0.4.0 +python-Levenshtein>=0.12.0,<0.13.0 # ldap login -python_ldap>=3.0.0 -flask-simpleldap>1.3.0 +python_ldap>=3.0.0,<3.3.0 +flask-simpleldap>1.3.0,<1.5.0 #oauth flask-dance>=0.13.0 -sqlalchemy_utils>=0.33.5 +sqlalchemy_utils>=0.33.5,<0.37.0 # extracting metadata -lxml>=3.8.0 -Pillow>=4.0.0 +lxml>=3.8.0,<4.6.0 +Pillow>=4.0.0,<7.1.0 rarfile>=2.7 # other -natsort>=2.2.0 -git+https://github.com/OzzieIsaacs/comicapi.git@5346716578b2843f54d522f44d01bc8d25001d24#egg=comicapi +natsort>=2.2.0,<7.1.0 +git+https://github.com/OzzieIsaacs/comicapi.git@ad8bfe5a1c31db882480433f86db2c5c57634a3f#egg=comicapi + +#Kobo integration +jsonschema>=3.2.0,<3.3.0 + diff --git a/requirements.txt b/requirements.txt index daf2538d..bec3a1d4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,15 +1,15 @@ -Babel>=1.3 -Flask-Babel>=0.11.1 -Flask-Login>=0.3.2 -Flask-Principal>=0.3.2 -singledispatch>=3.4.0.0 +Babel>=1.3, <2.9 +Flask-Babel>=0.11.1,<1.1.0 +Flask-Login>=0.3.2,<0.5.1 +Flask-Principal>=0.3.2,<0.5.0 +singledispatch>=3.4.0.0,<3.5.0.0 backports_abc>=0.4 -Flask>=1.0.2 -iso-639>=0.4.5 -PyPDF2==1.26.0 +Flask>=1.0.2,<1.2.0 +iso-639>=0.4.5,<0.5.0 +PyPDF2==1.26.0,<1.27.0 pytz>=2016.10 -requests>=2.11.1 -SQLAlchemy>=1.1.0 -tornado>=4.1 -Wand>=0.4.4 -unidecode>=0.04.19 +requests>=2.11.1,<2.23.0 +SQLAlchemy>=1.1.0,<1.4.0 +tornado>=4.1,<6.1 +Wand>=0.4.4,<0.6.0 +unidecode>=0.04.19,<1.2.0 diff --git a/test/Calibre-Web TestSummary.html b/test/Calibre-Web TestSummary.html index 51db76cb..e06b7639 100644 --- a/test/Calibre-Web TestSummary.html +++ b/test/Calibre-Web TestSummary.html @@ -1,67 +1,69 @@ - - Test Report - - + Calibre-Web Tests + + - - - - - - - - - - - + + + + + + + + + -
-
-

Test Report

-
- -
-
-

Start Time: 2019-12-29 09:32:57.266265

+
+

Calibre-Web Tests

-
-

Stop Time: 2019-12-29 10:08:09.098085

- +
+
+
+
+
+ +
+
+
+
+
+
+

Start Time: 2020-03-08 06:43:07

+
+
+
+
+

Stop Time: 2020-03-08 07:47:49

+
+
+
+
+

Duration: 3600.91 s

+
+
+
-
-

Duration: 0:35:11.831820

+
+
+
-
- -
-
- -
-
- -
-
All Calibre-Web tests
-
- - -
+
+ @@ -76,7 +78,6 @@
-
{{_('Task')}} {{_('Status')}} {{_('Progress')}}{{_('Runtime')}}{{_('Starttime')}}{{_('Run Time')}}{{_('Start Time')}}
@@ -95,2698 +96,2490 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + +
Skip View
test_anonymous.test_anonymous1010000 - 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_cli.test_cli65001 - Detail -
-
test_already_started
-
PASS
-
test_cli_SSL_files
-
PASS
-
test_cli_different_folder
-
PASS
-
test_cli_different_settings_database
-
PASS
-
test_cli_gdrive_location
-
-
- SKIP -
- - - -
-
test_environ_port_setting
-
PASS
test_ebook_convert.test_ebook_convert1111000 - Detail -
-
test_SSL_smtp_setup_error
-
PASS
-
test_STARTTLS_smtp_setup_error
-
PASS
-
test_convert_deactivate
-
PASS
-
test_convert_email
-
-
- PASS -
- - - -
-
test_convert_failed_and_email
-
-
- PASS -
- - - -
-
test_convert_only
-
PASS
-
test_convert_parameter
-
PASS
-
test_convert_wrong_excecutable
-
PASS
-
test_email_failed
-
-
- PASS -
- - - -
-
test_email_only
-
-
- PASS -
- - - -
-
test_kindle_send_not_configured
-
PASS
test_edit_books.test_edit_books23120011 - Detail -
-
test_database_errors
-
-
- SKIP -
- - - -
-
test_delete_book
-
-
- SKIP -
- - - -
-
test_delete_format
-
-
- SKIP -
- - - -
-
test_edit_author
-
PASS
-
test_edit_category
-
PASS
-
test_edit_comments
-
PASS
-
test_edit_custom_bool
-
PASS
-
test_edit_custom_rating
-
PASS
-
test_edit_custom_single_select
-
PASS
-
test_edit_custom_text
-
PASS
-
test_edit_language
-
PASS
-
test_edit_publisher
-
PASS
-
test_edit_publishing_date
-
-
- SKIP -
- - - -
-
test_edit_rating
-
PASS
-
test_edit_series
-
PASS
-
test_edit_title
-
PASS
-
test_rename_uppercase_lowercase
-
-
- SKIP -
- - - -
-
test_typeahead_author
-
-
- SKIP -
- - - -
-
test_typeahead_language
-
-
- SKIP -
- - - -
-
test_typeahead_publisher
-
-
- SKIP -
- - - -
-
test_typeahead_series
-
-
- SKIP -
- - - -
-
test_typeahead_tag
-
-
- SKIP -
- - - -
-
test_upload_cover_hdd
-
-
- SKIP -
- - - -
test_edit_books_gdrive.test_edit_books_gdrive2200022 - Detail -
-
test_database_errors
-
-
- SKIP -
- - - -
-
test_delete_book
-
-
- SKIP -
- - - -
-
test_delete_format
-
-
- SKIP -
- - - -
-
test_edit_author
-
-
- SKIP -
- - - -
-
test_edit_category
-
-
- SKIP -
- - - -
-
test_edit_comments
-
-
- SKIP -
- - - -
-
test_edit_custom_bool
-
-
- SKIP -
- - - -
-
test_edit_custom_rating
-
-
- SKIP -
- - - -
-
test_edit_custom_single_select
-
-
- SKIP -
- - - -
-
test_edit_custom_text
-
-
- SKIP -
- - - -
-
test_edit_language
-
-
- SKIP -
- - - -
-
test_edit_publisher
-
-
- SKIP -
- - - -
-
test_edit_publishing_date
-
-
- SKIP -
- - - -
-
test_edit_rating
-
-
- SKIP -
- - - -
-
test_edit_series
-
-
- SKIP -
- - - -
-
test_edit_title
-
-
- SKIP -
- - - -
-
test_typeahead_author
-
-
- SKIP -
- - - -
-
test_typeahead_language
-
-
- SKIP -
- - - -
-
test_typeahead_publisher
-
-
- SKIP -
- - - -
-
test_typeahead_series
-
-
- SKIP -
- - - -
-
test_typeahead_tag
-
-
- SKIP -
- - - -
-
test_upload_cover_hdd
-
-
- SKIP -
- - - -
test_email_STARTTLS.test_STARTTLS22000 - Detail -
-
test_STARTTLS
-
-
- PASS -
- - - -
-
test_STARTTLS_SSL_setup_error
-
PASS
test_email_ssl.test_SSL42002 - Detail -
-
test_SSL_None_setup_error
-
-
- SKIP -
- - - -
-
test_SSL_STARTTLS_setup_error
-
-
- SKIP -
- - - -
-
test_SSL_logging_email
-
-
- PASS -
- - - -
-
test_SSL_only
-
-
- PASS -
- - - -
test_helper.calibre_helper1313000 - Detail -
-
test_author_sort
-
PASS
-
test_author_sort_comma
-
PASS
-
test_author_sort_junior
-
PASS
-
test_author_sort_oneword
-
PASS
-
test_author_sort_roman
-
PASS
-
test_check_Limit_Length
-
PASS
-
test_check_char_replacement
-
PASS
-
test_check_chinese_Characters
-
PASS
-
test_check_degEUR_replacement
-
PASS
-
test_check_doubleS
-
PASS
-
test_check_finish_Dot
-
PASS
-
test_check_high23
-
PASS
-
test_check_umlauts
-
PASS
test_logging.test_logging53101 - Detail -
-
test_debug_log
-
PASS
-
test_failed_login
-
PASS
-
test_failed_register
-
-
- SKIP -
- - - -
-
test_logfile_change
-
PASS
-
test_logfile_recover
-
-
- FAIL -
- -
test_anonymous.test_anonymous1111000 + Detail +
+
test_check_locale_guest
+
PASS
+
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_cli.test_cli65001 + Detail +
+
test_already_started
+
PASS
+
test_cli_SSL_files
+
PASS
+
test_cli_different_folder
+
PASS
+
test_cli_different_settings_database
+
PASS
+
test_cli_gdrive_location
+
+
+ SKIP +
+ + + +
+
test_environ_port_setting
+
PASS
test_ebook_convert.test_ebook_convert1111000 + Detail +
+
test_SSL_smtp_setup_error
+
PASS
+
test_STARTTLS_smtp_setup_error
+
PASS
+
test_convert_deactivate
+
PASS
+
test_convert_email
+
PASS
+
test_convert_failed_and_email
+
PASS
+
test_convert_only
+
PASS
+
test_convert_parameter
+
PASS
+
test_convert_wrong_excecutable
+
PASS
+
test_email_failed
+
PASS
+
test_email_only
+
PASS
+
test_kindle_send_not_configured
+
PASS
test_edit_books.test_edit_books3018093 + Detail +
+
test_delete_book
+
+
+ SKIP +
+ + + +
+
test_download_book
+
PASS
+
test_edit_author
+
PASS
+
test_edit_category
+
PASS
+
test_edit_comments
+
PASS
+
test_edit_custom_bool
+
PASS
+
test_edit_custom_rating
+
PASS
+
test_edit_custom_single_select
+
PASS
+
test_edit_custom_text
+
PASS
+
test_edit_language
+
PASS
+
test_edit_publisher
+
PASS
+
test_edit_publishing_date
+
+
+ SKIP +
+ + + +
+
test_edit_rating
+
PASS
+
test_edit_series
+
PASS
+
test_edit_title
+
PASS
+
test_rename_uppercase_lowercase
+
+
+ SKIP +
+ + + +
+
test_typeahead_author
+
PASS
+
test_typeahead_language
+
PASS
+
test_typeahead_publisher
+
PASS
+
test_typeahead_series
+
PASS
+
test_typeahead_tag
+
PASS
+
test_upload_book_cbr
+
+
+ ERROR +
+ + + +
+
test_upload_book_cbt
+
+
+ ERROR +
+ + + +
+
test_upload_book_cbz
+
+
+ ERROR +
+ + + +
+
test_upload_book_epub
+
+
+ ERROR +
+ + + +
+
test_upload_book_fb2
+
+
+ ERROR +
+ + + +
+
test_upload_book_lit
+
+
+ ERROR +
+ + + +
+
test_upload_book_mobi
+
+
+ ERROR +
+ + + +
+
test_upload_book_pdf
+
+
+ ERROR +
+ + + +
+
test_upload_cover_hdd
+
+
+ ERROR +
+ + + +
test_edit_books_gdrive.test_edit_books_gdrive20002 + Detail +
+
test_database_errors
+
+
+ SKIP +
+ + + +
+
test_delete_book
+
+
+ SKIP +
+ + + +
test_email_STARTTLS.test_STARTTLS22000 + Detail +
+
test_STARTTLS
+
PASS
+
test_STARTTLS_SSL_setup_error
+
PASS
test_email_ssl.test_SSL44000 + Detail +
+
test_SSL_None_setup_error
+
PASS
+
test_SSL_STARTTLS_setup_error
+
PASS
+
test_SSL_logging_email
+
PASS
+
test_SSL_only
+
PASS
test_helper.calibre_helper1313000 + Detail +
+
test_author_sort
+
PASS
+
test_author_sort_comma
+
PASS
+
test_author_sort_junior
+
PASS
+
test_author_sort_oneword
+
PASS
+
test_author_sort_roman
+
PASS
+
test_check_Limit_Length
+
PASS
+
test_check_char_replacement
+
PASS
+
test_check_chinese_Characters
+
PASS
+
test_check_degEUR_replacement
+
PASS
+
test_check_doubleS
+
PASS
+
test_check_finish_Dot
+
PASS
+
test_check_high23
+
PASS
+
test_check_umlauts
+
PASS
test_kobo_sync.test_kobo_sync22000 + Detail +
+
test_check_sync
+
PASS
+
test_sync_invalid
+
PASS
test_logging.test_logging63201 + Detail +
+
test_debug_log
+
PASS
+
test_failed_login
+
PASS
+
test_failed_register
+
+
+ SKIP +
+ + + +
+
test_logfile_change
+
PASS
+
test_logfile_recover
+
+
+ FAIL +
+ + - -
test_login.test_login77000 - Detail -
-
test_login_capital_letters_user_unicode_password_passwort
-
PASS
-
test_login_delete_admin
-
PASS
-
test_login_empty_password
-
PASS
-
test_login_locale_select
-
PASS
-
test_login_protected
-
PASS
-
test_login_unicode_user_space_end_passwort
-
PASS
-
test_login_user_with_space_passwort_end_space
-
PASS
test_opds_feed.test_opds_feed1620014 - Detail -
-
test_opds
-
PASS
-
test_opds_author
-
-
- SKIP -
- - - -
-
test_opds_calibre_companion
-
-
- SKIP -
- - - -
-
test_opds_cover
-
-
- SKIP -
- - - -
-
test_opds_download_book
-
-
- SKIP -
- - - -
-
test_opds_guest_user
-
PASS
-
test_opds_hot
-
-
- SKIP -
- - - -
-
test_opds_language
-
-
- SKIP -
- - - -
-
test_opds_non_admin
-
-
- SKIP -
- - - -
-
test_opds_paging
-
-
- SKIP -
- - - -
-
test_opds_publisher
-
-
- SKIP -
- - - -
-
test_opds_random
-
-
- SKIP -
- - - -
-
test_opds_read_unread
-
-
- SKIP -
- - - -
-
test_opds_search
-
-
- SKIP -
- - - -
-
test_opds_series
-
-
- SKIP -
- - - -
-
test_opds_shelf_access
-
-
- SKIP -
- - - -
test_register.test_register54001 - Detail -
-
test_limit_domain
-
-
- SKIP -
- - - -
-
test_register_no_server
-
PASS
-
test_registering_user
-
-
- PASS -
- - - -
-
test_registering_user_fail
-
-
- PASS -
- - - -
-
test_user_change_password
-
-
- PASS -
- - - -
test_shelf.test_shelf75200 - Detail -
-
test_delete_book_of_shelf
-
PASS
-
test_private_shelf
-
PASS
-
test_public_private_shelf
-
PASS
-
test_public_shelf
-
-
- FAIL -
- - + +
+
test_logviewer
+
+
+ FAIL +
+ + + +
test_login.test_login88000 + Detail +
+
test_digest_login
+
PASS
+
test_login_capital_letters_user_unicode_password_passwort
+
PASS
+
test_login_delete_admin
+
PASS
+
test_login_empty_password
+
PASS
+
test_login_locale_select
+
PASS
+
test_login_protected
+
PASS
+
test_login_unicode_user_space_end_passwort
+
PASS
+
test_login_user_with_space_passwort_end_space
+
PASS
test_opds_feed.test_opds_feed2020000 + Detail +
+
test_opds
+
PASS
+
test_opds_author
+
PASS
+
test_opds_calibre_companion
+
PASS
+
test_opds_cover
+
PASS
+
test_opds_download_book
+
PASS
+
test_opds_formats
+
PASS
+
test_opds_guest_user
+
PASS
+
test_opds_hot
+
PASS
+
test_opds_language
+
PASS
+
test_opds_non_admin
+
PASS
+
test_opds_publisher
+
PASS
+
test_opds_random
+
PASS
+
test_opds_ratings
+
PASS
+
test_opds_read_unread
+
PASS
+
test_opds_search
+
PASS
+
test_opds_series
+
PASS
+
test_opds_shelf_access
+
PASS
+
test_opds_tags
+
PASS
+
test_opds_top_rated
+
PASS
+
test_recently_added
+
PASS
test_register.test_register66000 + Detail +
+
test_forgot_password
+
PASS
+
test_limit_domain
+
PASS
+
test_register_no_server
+
PASS
+
test_registering_user
+
PASS
+
test_registering_user_fail
+
PASS
+
test_user_change_password
+
PASS
test_shelf.test_shelf86101 + Detail +
+
test_arrange_shelf
+
PASS
+
test_delete_book_of_shelf
+
PASS
+
test_private_shelf
+
PASS
+
test_public_private_shelf
+
PASS
+
test_public_shelf
+
+
+ FAIL +
+ + - -
-
test_rename_shelf
-
PASS
-
test_shelf_database_change
-
-
- FAIL -
- - - -
-
test_shelf_long_name
-
PASS
test_updater.test_updater10001 - Detail -
-
test_updater
-
-
- SKIP -
- - - -
test_user_template.test_user_template1411003 - 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 -
- - - -
-
test_mature_content_settings
-
-
- SKIP -
- - - -
-
test_publisher_user_template
-
PASS
-
test_random_user_template
-
PASS
-
test_read_user_template
-
PASS
-
test_recent_user_template
-
PASS
-
test_series_user_template
-
PASS
-
test_ui_language_settings
-
-
- SKIP -
- - - -
test_visiblilitys.calibre_web_visibilitys1616000 - Detail -
-
test_about
-
-
- PASS -
- - - -
-
test_admin_SMTP_Settings
-
-
- PASS -
- - - -
-
test_admin_add_user
-
-
- PASS -
- - - -
-
test_admin_change_password
-
-
- PASS -
- - - -
-
test_admin_change_visibility_authors
-
-
- PASS -
- - - -
-
test_admin_change_visibility_category
-
-
- PASS -
- - - -
-
test_admin_change_visibility_hot
-
-
- PASS -
- - - -
-
test_admin_change_visibility_language
-
-
- PASS -
- - - -
-
test_admin_change_visibility_publisher
-
-
- PASS -
- - - -
-
test_admin_change_visibility_rated
-
-
- PASS -
- - - -
-
test_admin_change_visibility_read
-
-
- PASS -
- - - -
-
test_admin_change_visibility_series
-
-
- PASS -
- - - -
-
test_checked_logged_in
-
-
- PASS -
- - - -
-
test_random_books_available
-
-
- PASS -
- - - -
-
test_user_email_available
-
-
- PASS -
- - - -
-
test_user_visibility_sidebar
-
-
- PASS -
- - - -
+
test_rename_shelf
+
PASS
+
test_shelf_database_change
+
+
+ SKIP +
+ + + +
+
test_shelf_long_name
+
PASS
test_updater.test_updater10001 + Detail +
+
test_updater
+
+
+ SKIP +
+ + + +
test_user_template.test_user_template1717000 + Detail +
+
test_allow_column_restriction
+
PASS
+
test_allow_tag_restriction
+
PASS
+
test_author_user_template
+
PASS
+
test_best_user_template
+
PASS
+
test_category_user_template
+
PASS
+
test_deny_column_restriction
+
PASS
+
test_deny_tag_restriction
+
PASS
+
test_detail_random_user_template
+
PASS
+
test_hot_user_template
+
PASS
+
test_language_user_template
+
PASS
+
test_limit_book_languages
+
PASS
+
test_publisher_user_template
+
PASS
+
test_random_user_template
+
PASS
+
test_read_user_template
+
PASS
+
test_recent_user_template
+
PASS
+
test_series_user_template
+
PASS
+
test_ui_language_settings
+
PASS
test_visiblilitys.calibre_web_visibilitys2222000 + Detail +
+
test_about
+
PASS
+
test_admin_SMTP_Settings
+
PASS
+
test_admin_add_user
+
PASS
+
test_admin_change_password
+
PASS
+
test_admin_change_visibility_authors
+
PASS
+
test_admin_change_visibility_category
+
PASS
+
test_admin_change_visibility_file_formats
+
PASS
+
test_admin_change_visibility_hot
+
PASS
+
test_admin_change_visibility_language
+
PASS
+
test_admin_change_visibility_publisher
+
PASS
+
test_admin_change_visibility_rated
+
PASS
+
test_admin_change_visibility_rating
+
PASS
+
test_admin_change_visibility_read
+
PASS
+
test_admin_change_visibility_series
+
PASS
+
test_allow_columns
+
PASS
+
test_allow_tags
+
PASS
+
test_checked_logged_in
+
PASS
+
test_random_books_available
+
PASS
+
test_restrict_columns
+
PASS
+
test_restrict_tags
+
PASS
+
test_user_email_available
+
PASS
+
test_user_visibility_sidebar
+
PASS
Total162103169148 305699  
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Program libraryInstalled VersionTest class
PlatformLinux 5.3.0-40-generic #32~18.04.1-Ubuntu SMP Mon Feb 3 14:05:59 UTC 2020 x86_64 x86_64Basic
Python3.7.5Basic
Babel2.8.0basic
Flask1.1.1basic
Flask-Babel1.0.0basic
Flask-Login0.5.0basic
Flask-Principal0.4.0basic
iso-6390.4.5basic
PyPDF21.26.0basic
pytz2019.3basic
requests2.22.0basic
singledispatch3.4.0.3basic
six1.14.0basic
SQLAlchemy1.3.13basic
tornado6.0.4basic
Wand0.5.9basic
test_edit_booksPillow>=4.0.0,<7.1.0
test_edit_bookslxml>=3.8.0,<4.6.0
test_kobo_syncjsonschema>=3.2.0,<3.3.0
+
+
+
+
- + \ No newline at end of file