From abf0a053d725641c264b38318bf664aed7acc668 Mon Sep 17 00:00:00 2001 From: lb803 <47544021+lb803@users.noreply.github.com> Date: Sat, 20 Dec 2025 11:15:11 +0000 Subject: [PATCH 01/29] use natsort in cps/comic.py (when available) --- cps/comic.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/cps/comic.py b/cps/comic.py index f0a81b4a0..1fa4e63dc 100644 --- a/cps/comic.py +++ b/cps/comic.py @@ -29,6 +29,13 @@ except (ImportError, RuntimeError) as e: log = logger.create() +try: + from natsort import natsorted as sort +except ImportError: + log.debug("Natural sorting unavailable: using standard " + "sorted() method instead.") + sort = sorted + try: from comicapi.comicarchive import ComicArchive, MetaDataStyle use_comic_meta = True @@ -65,7 +72,7 @@ def _extract_cover_from_archive(original_file_extension, tmp_file_name, rar_exec cover_data = extension = None if original_file_extension.upper() == '.CBZ': cf = zipfile.ZipFile(tmp_file_name) - for name in sorted(cf.namelist()): + for name in sort(cf.namelist()): ext = os.path.splitext(name) if len(ext) > 1: extension = ext[1].lower() @@ -74,7 +81,7 @@ def _extract_cover_from_archive(original_file_extension, tmp_file_name, rar_exec break elif original_file_extension.upper() == '.CBT': cf = tarfile.TarFile(tmp_file_name) - for name in sorted(cf.getnames()): + for name in sort(cf.getnames()): ext = os.path.splitext(name) if len(ext) > 1: extension = ext[1].lower() @@ -85,7 +92,7 @@ def _extract_cover_from_archive(original_file_extension, tmp_file_name, rar_exec try: rarfile.UNRAR_TOOL = rar_executable cf = rarfile.RarFile(tmp_file_name) - for name in sorted(cf.namelist()): + for name in sort(cf.namelist()): ext = os.path.splitext(name) if len(ext) > 1: extension = ext[1].lower() @@ -96,7 +103,7 @@ def _extract_cover_from_archive(original_file_extension, tmp_file_name, rar_exec log.error('Rarfile failed with error: {}'.format(ex)) elif original_file_extension.upper() == '.CB7' and use_7zip: cf = py7zr.SevenZipFile(tmp_file_name) - for name in sorted(cf.getnames()): + for name in sort(cf.getnames()): ext = os.path.splitext(name) if len(ext) > 1: extension = ext[1].lower() From 24ea1328491af96db708a51dd7d25ed105e13ea5 Mon Sep 17 00:00:00 2001 From: Martin Grzeslowski Date: Sun, 5 Jul 2026 10:57:52 +0200 Subject: [PATCH 02/29] Add MOBI upload metadata extraction --- cps/mobi.py | 326 ++++++++++++++++++++++++++++++++++++++++++++++++ cps/uploader.py | 9 ++ 2 files changed, 335 insertions(+) create mode 100644 cps/mobi.py diff --git a/cps/mobi.py b/cps/mobi.py new file mode 100644 index 000000000..8a99dc803 --- /dev/null +++ b/cps/mobi.py @@ -0,0 +1,326 @@ +# -*- coding: utf-8 -*- + +# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) +# Copyright (C) 2026 Martin Grzeslowski +# +# 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 os +import re +import struct + +from . import cover, isoLanguages, logger +from .constants import BookMeta +from .string_helper import strip_whitespaces + +log = logger.create() + +PDB_HEADER_LEN = 78 +PDB_RECORD_INFO_LEN = 8 +PALMDOC_HEADER_LEN = 16 +MOBI_HEADER_START = PALMDOC_HEADER_LEN +MOBI_FULL_NAME_OFFSET = 0x44 +MOBI_FULL_NAME_LENGTH = 0x48 +MOBI_FIRST_IMAGE_INDEX = 0x5C +UNKNOWN_INDEX = 0xFFFFFFFF + +EXTH_AUTHOR = 100 +EXTH_PUBLISHER = 101 +EXTH_DESCRIPTION = 103 +EXTH_ISBN = 104 +EXTH_SUBJECT = 105 +EXTH_PUBLISH_DATE = 106 +EXTH_COVER_OFFSET = 201 +EXTH_THUMBNAIL_OFFSET = 202 +EXTH_TITLE = 503 +EXTH_LANGUAGE = 524 + + +def get_mobi_info(tmp_file_path, original_file_name, original_file_extension, no_cover_processing): + data = _read_file(tmp_file_path) + record_offsets = _read_record_offsets(data) + record0 = _record(data, record_offsets, 0) + _ensure_mobi_record(record0) + + encoding = _text_encoding(record0) + exth_records = _read_exth_records(record0) + + title = _book_title(record0, encoding) or _first_text(exth_records, EXTH_TITLE, encoding) or original_file_name + author = _author_string(_texts(exth_records, EXTH_AUTHOR, encoding)) + publisher = _first_text(exth_records, EXTH_PUBLISHER, encoding) + description = _first_text(exth_records, EXTH_DESCRIPTION, encoding) + tags = ', '.join(_unique(_texts(exth_records, EXTH_SUBJECT, encoding))) + pubdate = _first_text(exth_records, EXTH_PUBLISH_DATE, encoding)[:10] + languages = _language_code(_first_text(exth_records, EXTH_LANGUAGE, encoding)) + + identifiers = [] + isbn = _first_text(exth_records, EXTH_ISBN, encoding) + if isbn: + identifiers.append(['isbn', isbn]) + + cover_file = None + if not no_cover_processing: + cover_file = _extract_cover(data, record_offsets, record0, exth_records, tmp_file_path) + + return BookMeta( + file_path=tmp_file_path, + extension=original_file_extension, + title=title, + author=author or 'Unknown', + cover=cover_file, + description=description, + tags=tags, + series="", + series_id="", + languages=languages, + publisher=publisher, + pubdate=pubdate, + identifiers=identifiers) + + +def _read_file(file_path): + with open(file_path, 'rb') as mobi_file: + return mobi_file.read() + + +def _u16(data, offset): + return struct.unpack('>H', data[offset:offset + 2])[0] + + +def _u32(data, offset): + return struct.unpack('>I', data[offset:offset + 4])[0] + + +def _read_record_offsets(data): + if len(data) < PDB_HEADER_LEN: + raise ValueError('MOBI file is shorter than the Palm database header') + + record_count = _u16(data, 76) + table_end = PDB_HEADER_LEN + record_count * PDB_RECORD_INFO_LEN + if record_count < 1 or table_end > len(data): + raise ValueError('Invalid Palm database record table') + + offsets = [_u32(data, PDB_HEADER_LEN + index * PDB_RECORD_INFO_LEN) for index in range(record_count)] + offsets.append(len(data)) + + previous = table_end + for offset in offsets[:-1]: + if offset < previous or offset > len(data): + raise ValueError('Invalid Palm database record offset') + previous = offset + return offsets + + +def _record(data, record_offsets, index): + if index < 0 or index >= len(record_offsets) - 1: + return b'' + return data[record_offsets[index]:record_offsets[index + 1]] + + +def _ensure_mobi_record(record0): + if len(record0) < MOBI_HEADER_START + 8 or record0[MOBI_HEADER_START:MOBI_HEADER_START + 4] != b'MOBI': + raise ValueError('File does not contain a MOBI header') + + +def _mobi_header_len(record0): + return _u32(record0, MOBI_HEADER_START + 4) + + +def _text_encoding(record0): + encoding = _u32(record0, MOBI_HEADER_START + 12) + if encoding == 1252: + return 'cp1252' + if encoding == 65001: + return 'utf-8' + return 'utf-8' + + +def _read_exth_records(record0): + header_len = _mobi_header_len(record0) + exth_start = MOBI_HEADER_START + header_len + + if record0[exth_start:exth_start + 4] != b'EXTH': + exth_start = record0.find(b'EXTH', MOBI_HEADER_START) + if exth_start < 0: + return {} + + exth_len = _u32(record0, exth_start + 4) + record_count = _u32(record0, exth_start + 8) + exth_end = min(len(record0), exth_start + exth_len) + position = exth_start + 12 + records = {} + + for __ in range(record_count): + if position + 8 > exth_end: + break + record_type = _u32(record0, position) + record_len = _u32(record0, position + 4) + if record_len < 8 or position + record_len > exth_end: + break + records.setdefault(record_type, []).append(record0[position + 8:position + record_len]) + position += record_len + + return records + + +def _decode_text(value, encoding): + value = value.rstrip(b'\0') + for candidate in (encoding, 'utf-8', 'cp1252', 'latin-1'): + try: + return strip_whitespaces(value.decode(candidate)) + except UnicodeDecodeError: + pass + return '' + + +def _texts(exth_records, record_type, encoding): + return [text for text in (_decode_text(value, encoding) for value in exth_records.get(record_type, [])) if text] + + +def _first_text(exth_records, record_type, encoding): + values = _texts(exth_records, record_type, encoding) + return values[0] if values else '' + + +def _book_title(record0, encoding): + header_len = _mobi_header_len(record0) + if header_len < MOBI_FULL_NAME_LENGTH + 4: + return '' + + name_offset = _u32(record0, MOBI_HEADER_START + MOBI_FULL_NAME_OFFSET) + name_length = _u32(record0, MOBI_HEADER_START + MOBI_FULL_NAME_LENGTH) + if name_length and name_offset + name_length <= len(record0): + return _decode_text(record0[name_offset:name_offset + name_length], encoding) + + alternate_offset = MOBI_HEADER_START + name_offset + if name_length and alternate_offset + name_length <= len(record0): + return _decode_text(record0[alternate_offset:alternate_offset + name_length], encoding) + return '' + + +def _author_string(authors): + normalized = [] + for value in authors: + normalized.extend(_split_author_value(value)) + + return ' & '.join(_unique(normalized)) + + +def _split_author_value(value): + authors = [] + for part in re.split('[&;]', value): + part = strip_whitespaces(part) + if not part: + continue + + if part.count(',') == 1: + left, right = [strip_whitespaces(item) for item in part.split(',', 1)] + if ' ' in left and ' ' in right: + authors.extend([left, right]) + else: + authors.append(strip_whitespaces('%s %s' % (right, left))) + elif part.count(',') > 1: + authors.extend([strip_whitespaces(item) for item in part.split(',') if strip_whitespaces(item)]) + else: + authors.append(part) + return authors + + +def _unique(values): + seen = set() + result = [] + for value in values: + if value not in seen: + seen.add(value) + result.append(value) + return result + + +def _language_code(language): + if not language: + return '' + language = language.split('-', 1)[0].lower() + return isoLanguages.get_lang3(language) + + +def _first_image_index(record0): + header_len = _mobi_header_len(record0) + if header_len < MOBI_FIRST_IMAGE_INDEX + 4: + return None + index = _u32(record0, MOBI_HEADER_START + MOBI_FIRST_IMAGE_INDEX) + return None if index == UNKNOWN_INDEX else index + + +def _exth_int(exth_records, record_type): + values = exth_records.get(record_type, []) + if not values or len(values[0]) < 4: + return None + return _u32(values[0], 0) + + +def _extract_cover(data, record_offsets, record0, exth_records, tmp_file_path): + first_image_index = _first_image_index(record0) + candidates = [] + if first_image_index is not None: + for record_type in (EXTH_COVER_OFFSET, EXTH_THUMBNAIL_OFFSET): + image_offset = _exth_int(exth_records, record_type) + if image_offset is not None: + candidates.append(first_image_index + image_offset) + + for index in candidates: + cover_file = _cover_from_record(data, record_offsets, index, tmp_file_path) + if cover_file: + return cover_file + + return _largest_image_cover(data, record_offsets, first_image_index, tmp_file_path) + + +def _cover_from_record(data, record_offsets, index, tmp_file_path): + blob = _record(data, record_offsets, index) + extension = _image_extension(blob) + if not extension: + return None + try: + return cover.cover_processing(tmp_file_path, blob, extension) + except Exception as ex: + log.warning('Cannot extract MOBI cover image, using default: %s', ex) + return None + + +def _largest_image_cover(data, record_offsets, first_image_index, tmp_file_path): + start = first_image_index if first_image_index is not None else 1 + images = [] + for index in range(start, len(record_offsets) - 1): + blob = _record(data, record_offsets, index) + extension = _image_extension(blob) + if extension: + images.append((len(blob), index)) + + for __, index in sorted(images, reverse=True): + cover_file = _cover_from_record(data, record_offsets, index, tmp_file_path) + if cover_file: + return cover_file + return None + + +def _image_extension(blob): + if blob.startswith(b'\xff\xd8\xff'): + return '.jpg' + if blob.startswith(b'\x89PNG\r\n\x1a\n'): + return '.png' + if blob.startswith(b'RIFF') and blob[8:12] == b'WEBP': + return '.webp' + if blob.startswith(b'BM'): + return '.bmp' + return None diff --git a/cps/uploader.py b/cps/uploader.py index b991049b7..a0fb5f422 100644 --- a/cps/uploader.py +++ b/cps/uploader.py @@ -65,6 +65,13 @@ except ImportError as e: log.debug('Cannot import epub, extracting epub metadata will not work: %s', e) use_epub_meta = False +try: + from . import mobi + use_mobi_meta = True +except ImportError as e: + log.debug('Cannot import mobi, extracting mobi metadata will not work: %s', e) + use_mobi_meta = False + try: from . import fb2 use_fb2_meta = True @@ -88,6 +95,8 @@ def process(tmp_file_path, original_file_name, original_file_extension, rar_exec meta = pdf_meta(tmp_file_path, original_file_name, original_file_extension, no_cover) elif extension_upper in [".KEPUB", ".EPUB"] and use_epub_meta is True: meta = epub.get_epub_info(tmp_file_path, original_file_name, original_file_extension, no_cover) + elif extension_upper in [".MOBI", ".AZW", ".AZW3", ".PRC", ".POBI"] and use_mobi_meta is True: + meta = mobi.get_mobi_info(tmp_file_path, original_file_name, original_file_extension, no_cover) elif ".FB2" == extension_upper and use_fb2_meta is True: meta = fb2.get_fb2_info(tmp_file_path, original_file_extension) elif extension_upper in ['.CBZ', '.CBT', '.CBR', ".CB7"]: From b947a1decf1ddabdce98d22896e23999b2f5ea1e Mon Sep 17 00:00:00 2001 From: Ashay Date: Tue, 7 Jul 2026 16:54:16 +0530 Subject: [PATCH 03/29] Fix infinite scroll not triggering on mobile browsers The scroll detection comparison was too strict for mobile browsers that render subpixel scroll positions. Added 5px tolerance so the infinite scroll triggers reliably on mobile devices. Refs: #3664 --- cps/static/js/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cps/static/js/main.js b/cps/static/js/main.js index 9138d80e6..bba191fc0 100644 --- a/cps/static/js/main.js +++ b/cps/static/js/main.js @@ -414,7 +414,7 @@ $(function() { $(".col-sm-10").bind("scroll", function () { if ( $(this).scrollTop() + $(this).innerHeight() >= - $(this)[0].scrollHeight + $(this)[0].scrollHeight - 5 ) { $loadMore.infiniteScroll("loadNextPage"); window.history.replaceState({}, null, $loadMore.infiniteScroll("getAbsolutePath")); From 1a00f70e62f4cde37682354d3e666ec35fe2bdfe Mon Sep 17 00:00:00 2001 From: Ashay Date: Tue, 7 Jul 2026 17:02:59 +0530 Subject: [PATCH 04/29] Fix crash when User-Agent header is missing The download_link endpoint called .lower() on the User-Agent header value without providing a default, causing AttributeError when the header is absent. This matches the safe pattern already used in render_template.py --- cps/web.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cps/web.py b/cps/web.py index fc5288591..9e465796e 100644 --- a/cps/web.py +++ b/cps/web.py @@ -1247,9 +1247,9 @@ def serve_book(book_id, book_format, anyname): @login_required_if_no_ano @download_required def download_link(book_id, book_format, anyname): - if "kindle" in request.headers.get('User-Agent').lower(): + if "kindle" in request.headers.get('User-Agent', "").lower(): client = "kindle" - elif "Kobo" in request.headers.get('User-Agent').lower(): + elif "Kobo" in request.headers.get('User-Agent', "").lower(): client = "kobo" else: client = "" From 77265abfccafa3baae08734c01ad7252a03aee6a Mon Sep 17 00:00:00 2001 From: TowyTowy Date: Fri, 10 Jul 2026 12:33:37 +0200 Subject: [PATCH 05/29] Fix UNIQUE constraint crash on transliteration-twin authors The custom lower() SQL function registered in cps/db.py transliterates author names via unidecode, so the case-insensitive lookup in prepare_authors() also matched authors whose names are genuinely different but collapse to the same ASCII string (accented vs. plain Latin names, or Chinese homophones). The code then renamed that matched author onto the freshly entered name, overwriting a distinct existing author row and raising: (sqlite3.IntegrityError) UNIQUE constraint failed: authors.name Restrict the case-rename branch to matches that are equal ignoring case only (casefold), so distinct authors are left untouched. Genuine case-only renames (e.g. "stephen king" -> "Stephen King") still work. Fixes #3403 Fixes #3170 Co-Authored-By: Claude Fable 5 --- cps/editbooks.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cps/editbooks.py b/cps/editbooks.py index 218f249d6..a79356230 100644 --- a/cps/editbooks.py +++ b/cps/editbooks.py @@ -809,7 +809,13 @@ def prepare_authors(authr, calibre_path, gdrive=False): for in_aut in input_authors: renamed_author = calibre_db.session.query(db.Authors).filter(func.lower(db.Authors.name).ilike(in_aut)).first() - if renamed_author and in_aut != renamed_author.name: + # The custom lower() SQL function transliterates via unidecode (see cps.db.lcase), so the + # case-insensitive lookup above also matches accent- or homophone-twins with a genuinely + # different name (e.g. "José Luis Corral"/"Jose Luis Corral", "姚尧"/"妖妖"). Only treat the + # match as a case-rename when the names are equal ignoring case; otherwise the rename below + # would overwrite a distinct author and hit the authors.name UNIQUE constraint (#3403, #3170). + if renamed_author and in_aut != renamed_author.name \ + and in_aut.casefold() == renamed_author.name.casefold(): old_author_name = renamed_author.name # rename author in Database create_objects_for_addition(renamed_author, in_aut,"author") From 0e83d01bee17b6837cee6c25e5f2c03bdca506dc Mon Sep 17 00:00:00 2001 From: iceout Date: Sat, 11 Jul 2026 00:12:18 +0800 Subject: [PATCH 06/29] Fix case-insensitive duplicate tags --- cps/editbooks.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/cps/editbooks.py b/cps/editbooks.py index 218f249d6..632e5c593 100644 --- a/cps/editbooks.py +++ b/cps/editbooks.py @@ -1212,8 +1212,17 @@ def edit_book_tags(tags, book): if tags is not None: input_tags = tags.split(',') input_tags = list(map(lambda it: strip_whitespaces(it), input_tags)) - # Remove duplicates input_tags = helper.uniq(input_tags) + # Tag names are unique with NOCASE collation in the database. Remove + # case-insensitive duplicates before creating book-tag associations. + unique_tags = [] + seen_tags = set() + for tag in input_tags: + normalized_tag = tag.casefold() + if normalized_tag not in seen_tags: + seen_tags.add(normalized_tag) + unique_tags.append(tag) + input_tags = unique_tags return modify_database_object(input_tags, book.tags, db.Tags, calibre_db.session, 'tags') return False From 7502e3953e6d951682629bc1a5c7cbc160f03297 Mon Sep 17 00:00:00 2001 From: Evaldas Date: Sat, 18 Jul 2026 10:38:52 +0000 Subject: [PATCH 07/29] Fix Caliblur eReader toolbar dropdown --- cps/static/css/caliBlur.css | 14 +++++++------- cps/static/js/caliBlur.js | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cps/static/css/caliBlur.css b/cps/static/css/caliBlur.css index cc22ae2c7..79a1e0301 100644 --- a/cps/static/css/caliBlur.css +++ b/cps/static/css/caliBlur.css @@ -477,7 +477,7 @@ body.shelforder > div.container-fluid > div.row-fluid > div.col-sm-10:before { color: #fff !important } -#have_read_form span, div[aria-label="Download, send to Kindle, reading"] > .btn-group:first-child > p:first-child, div[aria-label="Download, send to Kindle, reading"] > .btn-group:first-child > p:last-child { +#have_read_form span, div[aria-label^="Download, send"] > .btn-group:first-child > p:first-child, div[aria-label^="Download, send"] > .btn-group:first-child > p:last-child { display: none } @@ -538,7 +538,7 @@ body.shelforder > div.container-fluid > div.row-fluid > div.col-sm-10:before { color: #fff !important } -#archived_form span, div[aria-label="Download, send to Kindle, reading"] > .btn-group:first-child > p:first-child, div[aria-label="Download, send to Kindle, reading"] > .btn-group:first-child > p:last-child { +#archived_form span, div[aria-label^="Download, send"] > .btn-group:first-child > p:first-child, div[aria-label^="Download, send"] > .btn-group:first-child > p:last-child { display: none } @@ -3160,14 +3160,14 @@ body.book .author { margin-left: 0 } -div.btn-group[role=group][aria-label="Download, send to Kindle, reading"] { +div.btn-group[role=group][aria-label^="Download, send"] { white-space: nowrap; display: -webkit-box; display: -ms-flexbox; display: flex } -div.btn-group[role=group][aria-label="Download, send to Kindle, reading"] > div.btn-group[role=group] > p { +div.btn-group[role=group][aria-label^="Download, send"] > div.btn-group[role=group] > p { display: none } @@ -3314,7 +3314,7 @@ ul.dropdown-menu.offscreen { margin: 2px -160px 0 } -div.btn-group[role=group][aria-label="Download, send to Kindle, reading"] .dropdown-menu.offscreen { +div.btn-group[role=group][aria-label^="Download, send"] .dropdown-menu.offscreen { position: fixed; top: 120px; right: 5px @@ -6927,7 +6927,7 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div. width: 50px } - div.btn-group[role=group][aria-label="Download, send to Kindle, reading"] { + div.btn-group[role=group][aria-label^="Download, send"] { display: block } @@ -6935,7 +6935,7 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div. display: none } - div.btn-group[role=group][aria-label="Download, send to Kindle, reading"] > .downloadBtn { + div.btn-group[role=group][aria-label^="Download, send"] > .downloadBtn { border-left: 0 } diff --git a/cps/static/js/caliBlur.js b/cps/static/js/caliBlur.js index 48bb26e6c..deb0b683e 100644 --- a/cps/static/js/caliBlur.js +++ b/cps/static/js/caliBlur.js @@ -154,7 +154,7 @@ if ($("body.book").length > 0) { // Move dropdown lists higher in dom, replace bootstrap toggle with own toggle. $('ul[aria-labelledby="read-in-browser"]').insertBefore(".blur-wrapper").addClass("readinbrowser-drop"); $('ul[aria-labelledby="listen-in-browser"]').insertBefore(".blur-wrapper").addClass("readinbrowser-drop"); - $('ul[aria-labelledby="send-to-kereader"]').insertBefore(".blur-wrapper").addClass("sendtoereader-drop"); + $('ul[aria-labelledby="send-to-ereader"]').insertBefore(".blur-wrapper").addClass("sendtoereader-drop"); $(".leramslist").insertBefore(".blur-wrapper"); $('ul[aria-labelledby="btnGroupDrop1"]').insertBefore(".blur-wrapper").addClass("leramslist"); $("#add-to-shelves").insertBefore(".blur-wrapper"); From d30bfbd348ba4a7fc98a3d8224679e579c2921c5 Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Sat, 1 Aug 2026 13:40:29 +0200 Subject: [PATCH 08/29] Unrar names are limited, better restriction of external binary names --- cps/admin.py | 11 + cps/binary_helper.py | 32 ++ cps/config_sql.py | 13 +- cps/converter.py | 14 +- cps/editbooks.py | 6 +- cps/embed_helper.py | 2 +- cps/helper.py | 10 +- cps/tasks/convert.py | 717 ++++++++++++++++++++++--------------------- cps/web.py | 4 +- 9 files changed, 437 insertions(+), 372 deletions(-) create mode 100644 cps/binary_helper.py diff --git a/cps/admin.py b/cps/admin.py index 1a1b1389c..3c108b7c4 100644 --- a/cps/admin.py +++ b/cps/admin.py @@ -50,6 +50,7 @@ from .helper import check_valid_domain, send_test_mail, reset_password, generate valid_email, check_username from .embed_helper import get_calibre_binarypath from .gdriveutils import is_gdrive_ready, gdrive_support +from .binary_helper import resolve_binary_path, SUPPORTED_KEPUBIFY_BINARIES, SUPPORTED_UNRAR_BINARIES from .render_template import render_title_template, get_sidebar_config from .services.worker import WorkerThread from .usermanagement import user_login_required @@ -1811,6 +1812,12 @@ def _configuration_update_helper(): _config_string(to_save, "config_calibre") _config_string(to_save, "config_binariesdir") _config_string(to_save, "config_kepubifypath") + if "config_kepubifypath" in to_save: + kepubify_binary = resolve_binary_path(config.config_kepubifypath, SUPPORTED_KEPUBIFY_BINARIES) + if not kepubify_binary: + return _configuration_result(_('Kepubify binary not found')) + config.config_kepubifypath = os.path.dirname(kepubify_binary) + if "config_binariesdir" in to_save: calibre_status = helper.check_calibre(config.config_binariesdir) if calibre_status: @@ -1878,6 +1885,10 @@ def _configuration_update_helper(): # Rarfile Content configuration _config_string(to_save, "config_rarfile_location") if "config_rarfile_location" in to_save: + unrar_binary = resolve_binary_path(config.config_rarfile_location, SUPPORTED_UNRAR_BINARIES) + if not unrar_binary: + return _configuration_result(_('Please specify a valid UnRar directory')) + config.config_rarfile_location = os.path.dirname(unrar_binary) unrar_status = helper.check_unrar(config.config_rarfile_location) if unrar_status: return _configuration_result(unrar_status) diff --git a/cps/binary_helper.py b/cps/binary_helper.py new file mode 100644 index 000000000..e568bffd5 --- /dev/null +++ b/cps/binary_helper.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- + +import os +import sys + +if sys.platform == "win32": + SUPPORTED_UNRAR_BINARIES = ("unRAR.exe", "unrar.exe") + SUPPORTED_KEPUBIFY_BINARIES = ("kepubify-windows-64Bit.exe",) +elif sys.platform.startswith("freebsd"): + SUPPORTED_UNRAR_BINARIES = ("unrar",) + SUPPORTED_KEPUBIFY_BINARIES = ("kepubify",) +else: + SUPPORTED_UNRAR_BINARIES = ("unrar",) + SUPPORTED_KEPUBIFY_BINARIES = ("kepubify-linux-64bit", "kepubify-linux-32bit") + + +def resolve_binary_path(configured_path, binary_names): + if not configured_path: + return "" + + allowed_names = {binary_name.lower() for binary_name in binary_names} + if os.path.isfile(configured_path) and os.access(configured_path, os.X_OK): + if os.path.basename(os.path.realpath(configured_path)).lower() in allowed_names: + return configured_path + return "" + + if os.path.isdir(configured_path): + for binary_name in binary_names: + binary_path = os.path.join(configured_path, binary_name) + if os.path.isfile(binary_path) and os.access(binary_path, os.X_OK): + return binary_path + return "" diff --git a/cps/config_sql.py b/cps/config_sql.py index 7638afcce..1856b3dc9 100644 --- a/cps/config_sql.py +++ b/cps/config_sql.py @@ -34,6 +34,7 @@ except ImportError: from sqlalchemy.ext.declarative import declarative_base from . import constants, logger +from .binary_helper import resolve_binary_path, SUPPORTED_KEPUBIFY_BINARIES, SUPPORTED_UNRAR_BINARIES from .subproc_wrapper import process_wait from .string_helper import strip_whitespaces @@ -204,10 +205,18 @@ class ConfigSQL(object): if self.config_kepubifypath is None: change = True self.config_kepubifypath = autodetect_kepubify_binary() + elif self.config_kepubifypath and os.path.isfile(self.config_kepubifypath): + if resolve_binary_path(self.config_kepubifypath, SUPPORTED_KEPUBIFY_BINARIES): + change = True + self.config_kepubifypath = os.path.dirname(self.config_kepubifypath) if self.config_rarfile_location is None: change = True self.config_rarfile_location = autodetect_unrar_binary() + elif self.config_rarfile_location and os.path.isfile(self.config_rarfile_location): + if resolve_binary_path(self.config_rarfile_location, SUPPORTED_UNRAR_BINARIES): + change = True + self.config_rarfile_location = os.path.dirname(self.config_rarfile_location) if change: self.save() @@ -526,7 +535,7 @@ def autodetect_unrar_binary(): calibre_path = ["/usr/bin/unrar"] for element in calibre_path: if os.path.isfile(element) and os.access(element, os.X_OK): - return element + return os.path.dirname(element) return "" @@ -540,7 +549,7 @@ def autodetect_kepubify_binary(): calibre_path = ["/opt/kepubify/kepubify-linux-64bit", "/opt/kepubify/kepubify-linux-32bit"] for element in calibre_path: if os.path.isfile(element) and os.access(element, os.X_OK): - return element + return os.path.dirname(element) return "" diff --git a/cps/converter.py b/cps/converter.py index 981b39097..4d5154f01 100644 --- a/cps/converter.py +++ b/cps/converter.py @@ -22,6 +22,7 @@ import re from flask_babel import lazy_gettext as N_ from . import config, logger +from .binary_helper import resolve_binary_path, SUPPORTED_KEPUBIFY_BINARIES, SUPPORTED_UNRAR_BINARIES from .subproc_wrapper import process_wait @@ -33,7 +34,7 @@ _EXECUTION_ERROR = N_('Execution permissions missing') def _get_command_version(path, pattern, argument=None): - if os.path.exists(path): + if path and os.path.isfile(path) and os.access(path, os.X_OK): command = [path] if argument: command.append(argument) @@ -52,11 +53,16 @@ def get_calibre_version(): def get_unrar_version(): - unrar_version = _get_command_version(config.config_rarfile_location, r'UNRAR.*\d') + unrar_binary = resolve_binary_path(config.config_rarfile_location, SUPPORTED_UNRAR_BINARIES) + if not unrar_binary: + return _NOT_INSTALLED + + unrar_version = _get_command_version(unrar_binary, r'UNRAR.*\d') if unrar_version == "not installed": - unrar_version = _get_command_version(config.config_rarfile_location, r'unrar.*\d', '-V') + unrar_version = _get_command_version(unrar_binary, r'unrar.*\d', '-V') return unrar_version def get_kepubify_version(): - return _get_command_version(config.config_kepubifypath, r'kepubify\s', '--version') + kepubify_binary = resolve_binary_path(config.config_kepubifypath, SUPPORTED_KEPUBIFY_BINARIES) + return _get_command_version(kepubify_binary, r'kepubify\s', '--version') diff --git a/cps/editbooks.py b/cps/editbooks.py index 218f249d6..8359bc4e9 100644 --- a/cps/editbooks.py +++ b/cps/editbooks.py @@ -43,6 +43,7 @@ from . import config, ub, db, calibre_db from .services.worker import WorkerThread from .tasks.upload import TaskUpload from .render_template import render_title_template +from .binary_helper import resolve_binary_path, SUPPORTED_UNRAR_BINARIES from .kobo_sync_status import change_archived_books from .redirect import get_redirect_location from .file_helper import validate_mime_type @@ -962,7 +963,8 @@ def file_handling_on_upload(requested_file): # extract metadata from file try: - meta = uploader.upload(requested_file, config.config_rarfile_location) + meta = uploader.upload(requested_file, + resolve_binary_path(config.config_rarfile_location, SUPPORTED_UNRAR_BINARIES)) except (IOError, OSError): log.error("File %s could not saved to temp dir", requested_file.filename) flash(_("File %(filename)s could not saved to temp dir", @@ -1483,7 +1485,7 @@ def upload_book_formats(requested_files, book, book_id, no_cover=True): meta = uploader.process( saved_filename, *os.path.splitext(current_filename), - rar_executable=config.config_rarfile_location, + rar_executable=resolve_binary_path(config.config_rarfile_location, SUPPORTED_UNRAR_BINARIES), no_cover=no_cover) merge_metadata(book, meta, to_save) #if to_save.get('languages'): diff --git a/cps/embed_helper.py b/cps/embed_helper.py index 6a815889e..d34f58027 100644 --- a/cps/embed_helper.py +++ b/cps/embed_helper.py @@ -38,7 +38,7 @@ def do_calibre_export(book_id, book_format): library_path = config.get_book_path() opf_command = [calibredb_binarypath, 'export', '--dont-write-opf', '--dont-save-cover', '--with-library', library_path, - '--to-dir', tmp_dir, '--formats', book_format, "--template", "{}".format(temp_file_name), + '--to-dir', tmp_dir, '--formatcalibredbs', book_format, "--template", "{}".format(temp_file_name), str(book_id)] p = process_open(opf_command, quotes, my_env) _, err = p.communicate() diff --git a/cps/helper.py b/cps/helper.py index 9f59e8313..4fb47afbf 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -59,6 +59,7 @@ from . import logger, config, db, ub, fs from . import gdriveutils as gd from .constants import (STATIC_DIR as _STATIC_DIR, CACHE_TYPE_THUMBNAILS, THUMBNAIL_TYPE_COVER, THUMBNAIL_TYPE_SERIES, SUPPORTED_CALIBRE_BINARIES) +from .binary_helper import resolve_binary_path, SUPPORTED_UNRAR_BINARIES from .subproc_wrapper import process_wait from .services.worker import WorkerThread from .tasks.mail import TaskEmail @@ -69,7 +70,6 @@ from .epub_helper import get_content_opf, create_new_metadata_backup, updateEpub from .embed_helper import do_calibre_export log = logger.create() - try: from wand.image import Image from wand.exceptions import MissingDelegateError, BlobError @@ -1002,12 +1002,12 @@ def check_unrar(unrar_location): if not unrar_location: return - if not os.path.exists(unrar_location): - return _('UnRar binary file not found') + unrar_binary = resolve_binary_path(unrar_location, SUPPORTED_UNRAR_BINARIES) + if not unrar_binary: + return _('Please specify a valid UnRar directory') try: - unrar_location = [unrar_location] - value = process_wait(unrar_location, pattern='UNRAR (.*) freeware') + value = process_wait([unrar_binary], pattern='UNRAR (.*) freeware') if value: version = value.group(1) log.debug("UnRar version %s", version) diff --git a/cps/tasks/convert.py b/cps/tasks/convert.py index 9e9fbb4a6..18a590001 100644 --- a/cps/tasks/convert.py +++ b/cps/tasks/convert.py @@ -1,357 +1,360 @@ -# -*- coding: utf-8 -*- - -# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) -# Copyright (C) 2020 pwr -# -# 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 os -import re -import glob -from shutil import copyfile, copyfileobj -from markupsafe import escape -from time import time -from uuid import uuid4 - -from sqlalchemy.exc import SQLAlchemyError -from flask_babel import lazy_gettext as N_ - -from cps.services.worker import CalibreTask -from cps import db, app -from cps import logger, config -from cps.subproc_wrapper import process_open -from flask_babel import gettext as _ -from cps.kobo_sync_status import remove_synced_book -from cps.ub import init_db_thread -from cps.file_helper import get_temp_dir - -from cps.tasks.mail import TaskEmail -from cps import gdriveutils, helper -from cps.constants import SUPPORTED_CALIBRE_BINARIES -from cps.string_helper import strip_whitespaces - -log = logger.create() - -current_milli_time = lambda: int(round(time() * 1000)) - - -class TaskConvert(CalibreTask): - def __init__(self, file_path, book_id, task_message, settings, ereader_mail, user=None): - super(TaskConvert, self).__init__(task_message) - self.worker_thread = None - self.file_path = file_path - self.book_id = book_id - self.title = "" - self.settings = settings - self.ereader_mail = ereader_mail - self.user = user - - self.results = dict() - - def run(self, worker_thread): - df_cover = None - cur_book = None - self.worker_thread = worker_thread - if config.config_use_google_drive: - with app.app_context(): - worker_db = db.CalibreDB(app) - cur_book = worker_db.get_book(self.book_id) - self.title = cur_book.title - data = worker_db.get_book_format(self.book_id, self.settings['old_book_format']) - df = gdriveutils.getFileFromEbooksFolder(cur_book.path, - data.name + "." + self.settings['old_book_format'].lower()) - df_cover = gdriveutils.getFileFromEbooksFolder(cur_book.path, "cover.jpg") - if df: - datafile_cover = None - datafile = os.path.join(config.get_book_path(), - cur_book.path, - data.name + "." + self.settings['old_book_format'].lower()) - if df_cover: - datafile_cover = os.path.join(config.get_book_path(), - cur_book.path, "cover.jpg") - if not os.path.exists(os.path.join(config.get_book_path(), cur_book.path)): - os.makedirs(os.path.join(config.get_book_path(), cur_book.path)) - df.GetContentFile(datafile) - if df_cover: - df_cover.GetContentFile(datafile_cover) - # worker_db.session.close() - else: - # ToDo Include cover in error handling - error_message = _("%(format)s not found on Google Drive: %(fn)s", - format=self.settings['old_book_format'], - fn=data.name + "." + self.settings['old_book_format'].lower()) - # worker_db.session.close() - return self._handleError(error_message) - - filename = self._convert_ebook_format() - if config.config_use_google_drive: - os.remove(self.file_path + '.' + self.settings['old_book_format'].lower()) - if df_cover: - os.remove(os.path.join(config.config_calibre_dir, cur_book.path, "cover.jpg")) - - if filename: - if config.config_use_google_drive: - # Upload files to gdrive - gdriveutils.updateGdriveCalibreFromLocal() - self._handleSuccess() - if self.ereader_mail: - # if we're sending to E-Reader after converting, create a one-off task and run it immediately - # todo: figure out how to incorporate this into the progress - try: - EmailText = N_(u"%(book)s send to E-Reader", book=escape(self.title)) - for email in self.ereader_mail.split(','): - email = strip_whitespaces(email) - worker_thread.add(self.user, TaskEmail(self.settings['subject'], - self.results["path"], - filename, - self.settings, - email, - EmailText, - self.settings['body'], - id=self.book_id, - internal=True) - ) - except Exception as ex: - return self._handleError(str(ex)) - - def _convert_ebook_format(self): - error_message = None - with app.app_context(): - local_db = db.CalibreDB(app) - file_path = self.file_path - book_id = self.book_id - format_old_ext = '.' + self.settings['old_book_format'].lower() - format_new_ext = '.' + self.settings['new_book_format'].lower() - - # check to see if destination format already exists - or if book is in database - # if it does - mark the conversion task as complete and return a success - # this will allow to send to E-Reader workflow to continue to work - if os.path.isfile(file_path + format_new_ext) or\ - local_db.get_book_format(self.book_id, self.settings['new_book_format']): - log.info("Book id %d already converted to %s", book_id, format_new_ext) - cur_book = local_db.get_book(book_id) - self.title = cur_book.title - self.results['path'] = cur_book.path - self.results['title'] = self.title - new_format = local_db.session.query(db.Data).filter(db.Data.book == book_id)\ - .filter(db.Data.format == self.settings['new_book_format'].upper()).one_or_none() - if not new_format: - new_format = db.Data(name=os.path.basename(file_path), - book_format=self.settings['new_book_format'].upper(), - book=book_id, uncompressed_size=os.path.getsize(file_path + format_new_ext)) - try: - local_db.session.merge(new_format) - local_db.session.commit() - except SQLAlchemyError as e: - local_db.session.rollback() - log.error("Database error: %s", e) - local_db.session.close() - self._handleError(N_("Oops! Database Error: %(error)s.", error=e)) - return - self._handleSuccess() - local_db.session.close() - return os.path.basename(file_path + format_new_ext) - else: - log.info("Book id %d - target format of %s does not exist. Moving forward with convert.", - book_id, - format_new_ext) - - if config.config_kepubifypath and format_old_ext == '.epub' and format_new_ext == '.kepub': - check, error_message = self._convert_kepubify(file_path, - format_old_ext, - format_new_ext) - else: - # check if calibre converter-executable is existing - if not os.path.exists(config.config_converterpath): - self._handleError(N_("Calibre ebook-convert %(tool)s not found", tool=config.config_converterpath)) - return - has_cover = local_db.get_book(book_id).has_cover - check, error_message = self._convert_calibre(file_path, format_old_ext, format_new_ext, has_cover) - - if check == 0: - cur_book = local_db.get_book(book_id) - if os.path.isfile(file_path + format_new_ext): - new_format = local_db.session.query(db.Data).filter(db.Data.book == book_id) \ - .filter(db.Data.format == self.settings['new_book_format'].upper()).one_or_none() - if not new_format: - new_format = db.Data(name=cur_book.data[0].name, - book_format=self.settings['new_book_format'].upper(), - book=book_id, uncompressed_size=os.path.getsize(file_path + format_new_ext)) - try: - local_db.session.merge(new_format) - local_db.session.commit() - if self.settings['new_book_format'].upper() in ['KEPUB', 'EPUB', 'EPUB3']: - ub_session = init_db_thread() - remove_synced_book(book_id, True, ub_session) - ub_session.close() - except SQLAlchemyError as e: - local_db.session.rollback() - log.error("Database error: %s", e) - local_db.session.close() - self._handleError(error_message) - return - self.results['path'] = cur_book.path - self.title = cur_book.title - self.results['title'] = self.title - if not config.config_use_google_drive: - self._handleSuccess() - return os.path.basename(file_path + format_new_ext) - else: - error_message = N_('%(format)s format not found on disk', format=format_new_ext.upper()) - local_db.session.close() - log.info("ebook converter failed with error while converting book") - if not error_message: - error_message = N_('Ebook converter failed with unknown error') - else: - log.error(error_message) - self._handleError(error_message) - return - - def _convert_kepubify(self, file_path, format_old_ext, format_new_ext): - if config.config_embed_metadata and config.config_binariesdir: - tmp_dir, temp_file_name = helper.do_calibre_export(self.book_id, format_old_ext[1:]) - filename = os.path.join(tmp_dir, temp_file_name + format_old_ext) - temp_file_path = tmp_dir - else: - filename = file_path + format_old_ext - temp_file_path = os.path.dirname(file_path) - quotes = [1, 3] - command = [config.config_kepubifypath, filename, '-o', temp_file_path, '-i'] - try: - p = process_open(command, quotes) - except OSError as e: - return 1, N_("Kepubify-converter failed: %(error)s", error=e) - self.progress = 0.01 - while True: - nextline = p.stdout.readlines() - nextline = [x.strip('\n') for x in nextline if x != '\n'] - for line in nextline: - log.debug(line) - if p.poll() is not None: - break - - # process returncode - check = p.returncode - - # move file - if check == 0: - converted_file = glob.glob(glob.escape(os.path.splitext(filename)[0]) + "*.kepub.epub") - if len(converted_file) == 1: - copyfile(converted_file[0], (file_path + format_new_ext)) - os.unlink(converted_file[0]) - else: - return 1, N_("Converted file not found or more than one file in folder %(folder)s", - folder=os.path.dirname(file_path)) - return check, None - - def _convert_calibre(self, file_path, format_old_ext, format_new_ext, has_cover): - path_tmp_opf = None - try: - # path_tmp_opf = self._embed_metadata() - if config.config_embed_metadata: - quotes = [5] - tmp_dir = get_temp_dir() - calibredb_binarypath = os.path.join(config.config_binariesdir, SUPPORTED_CALIBRE_BINARIES["calibredb"]) - my_env = os.environ.copy() - if config.config_calibre_split: - my_env['CALIBRE_OVERRIDE_DATABASE_PATH'] = os.path.join(config.config_calibre_dir, "metadata.db") - library_path = config.config_calibre_split_dir - else: - library_path = config.config_calibre_dir - - opf_command = [calibredb_binarypath, 'show_metadata', '--as-opf', str(self.book_id), - '--with-library', library_path] - p = process_open(opf_command, quotes, my_env, newlines=False) - lines = list() - while p.poll() is None: - lines.append(p.stdout.readline()) - check = p.returncode - calibre_traceback = p.stderr.readlines() - if check == 0: - path_tmp_opf = os.path.join(tmp_dir, "metadata_" + str(uuid4()) + ".opf") - with open(path_tmp_opf, 'wb') as fd: - fd.write(b''.join(lines)) - else: - error_message = "" - for ele in calibre_traceback: - ele = ele.decode('utf-8', errors="ignore").strip('\n') - log.debug(ele) - if not ele.startswith('Traceback') and not ele.startswith(' File'): - error_message = N_("Calibre failed with error: %(error)s", error=ele) - return check, error_message - quotes = [1, 2] - quotes_index = 3 - command = [config.config_converterpath, (file_path + format_old_ext), - (file_path + format_new_ext)] - if config.config_embed_metadata: - quotes.append(4) - quotes_index = 5 - command.extend(['--from-opf', path_tmp_opf]) - if has_cover: - quotes.append(6) - command.extend(['--cover', os.path.join(os.path.dirname(file_path), 'cover.jpg')]) - quotes_index = 7 - if config.config_calibre: - parameters = re.findall(r"(--[\w-]+)(?:(\s(?:(\".+\")|(?:.+?)))(?:\s|$))?", - config.config_calibre, re.IGNORECASE | re.UNICODE) - if parameters: - for param in parameters: - command.append(strip_whitespaces(param[0])) - quotes_index += 1 - if param[1] != "": - parsed = strip_whitespaces(param[1]).strip("\"") - command.append(parsed) - quotes.append(quotes_index) - quotes_index += 1 - p = process_open(command, quotes, newlines=False) - except OSError as e: - return 1, N_("Ebook-converter failed: %(error)s", error=e) - - while p.poll() is None: - nextline = p.stdout.readline() - if isinstance(nextline, bytes): - nextline = nextline.decode('utf-8', errors="ignore").strip('\r\n') - if nextline: - log.debug(nextline) - # parse progress string from calibre-converter - progress = re.search(r"(\d+)%\s.*", nextline) - if progress: - self.progress = int(progress.group(1)) / 100 - if config.config_use_google_drive: - self.progress *= 0.9 - - # process returncode - check = p.returncode - calibre_traceback = p.stderr.readlines() - error_message = "" - for ele in calibre_traceback: - ele = ele.decode('utf-8', errors="ignore").strip('\n') - log.debug(ele) - if not ele.startswith('Traceback') and not ele.startswith(' File'): - error_message = N_("Calibre failed with error: %(error)s", error=ele) - return check, error_message - - @property - def name(self): - return N_("Convert") - - def __str__(self): - if self.ereader_mail: - return "Convert Book {} and mail it to {}".format(self.book_id, self.ereader_mail) - else: - return "Convert Book {}".format(self.book_id) - - @property - def is_cancellable(self): - return False +# -*- coding: utf-8 -*- + +# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) +# Copyright (C) 2020 pwr +# +# 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 os +import re +import glob +from shutil import copyfile, copyfileobj +from markupsafe import escape +from time import time +from uuid import uuid4 + +from sqlalchemy.exc import SQLAlchemyError +from flask_babel import lazy_gettext as N_ + +from cps.services.worker import CalibreTask +from cps import db, app +from cps import logger, config +from cps.subproc_wrapper import process_open +from flask_babel import gettext as _ +from cps.kobo_sync_status import remove_synced_book +from cps.ub import init_db_thread +from cps.file_helper import get_temp_dir +from cps.binary_helper import resolve_binary_path, SUPPORTED_KEPUBIFY_BINARIES + +from cps.tasks.mail import TaskEmail +from cps import gdriveutils, helper +from cps.constants import SUPPORTED_CALIBRE_BINARIES +from cps.string_helper import strip_whitespaces + +log = logger.create() + +current_milli_time = lambda: int(round(time() * 1000)) + + +class TaskConvert(CalibreTask): + def __init__(self, file_path, book_id, task_message, settings, ereader_mail, user=None): + super(TaskConvert, self).__init__(task_message) + self.worker_thread = None + self.file_path = file_path + self.book_id = book_id + self.title = "" + self.settings = settings + self.ereader_mail = ereader_mail + self.user = user + + self.results = dict() + + def run(self, worker_thread): + df_cover = None + cur_book = None + self.worker_thread = worker_thread + if config.config_use_google_drive: + with app.app_context(): + worker_db = db.CalibreDB(app) + cur_book = worker_db.get_book(self.book_id) + self.title = cur_book.title + data = worker_db.get_book_format(self.book_id, self.settings['old_book_format']) + df = gdriveutils.getFileFromEbooksFolder(cur_book.path, + data.name + "." + self.settings['old_book_format'].lower()) + df_cover = gdriveutils.getFileFromEbooksFolder(cur_book.path, "cover.jpg") + if df: + datafile_cover = None + datafile = os.path.join(config.get_book_path(), + cur_book.path, + data.name + "." + self.settings['old_book_format'].lower()) + if df_cover: + datafile_cover = os.path.join(config.get_book_path(), + cur_book.path, "cover.jpg") + if not os.path.exists(os.path.join(config.get_book_path(), cur_book.path)): + os.makedirs(os.path.join(config.get_book_path(), cur_book.path)) + df.GetContentFile(datafile) + if df_cover: + df_cover.GetContentFile(datafile_cover) + # worker_db.session.close() + else: + # ToDo Include cover in error handling + error_message = _("%(format)s not found on Google Drive: %(fn)s", + format=self.settings['old_book_format'], + fn=data.name + "." + self.settings['old_book_format'].lower()) + # worker_db.session.close() + return self._handleError(error_message) + + filename = self._convert_ebook_format() + if config.config_use_google_drive: + os.remove(self.file_path + '.' + self.settings['old_book_format'].lower()) + if df_cover: + os.remove(os.path.join(config.config_calibre_dir, cur_book.path, "cover.jpg")) + + if filename: + if config.config_use_google_drive: + # Upload files to gdrive + gdriveutils.updateGdriveCalibreFromLocal() + self._handleSuccess() + if self.ereader_mail: + # if we're sending to E-Reader after converting, create a one-off task and run it immediately + # todo: figure out how to incorporate this into the progress + try: + EmailText = N_(u"%(book)s send to E-Reader", book=escape(self.title)) + for email in self.ereader_mail.split(','): + email = strip_whitespaces(email) + worker_thread.add(self.user, TaskEmail(self.settings['subject'], + self.results["path"], + filename, + self.settings, + email, + EmailText, + self.settings['body'], + id=self.book_id, + internal=True) + ) + except Exception as ex: + return self._handleError(str(ex)) + + def _convert_ebook_format(self): + error_message = None + with app.app_context(): + local_db = db.CalibreDB(app) + file_path = self.file_path + book_id = self.book_id + format_old_ext = '.' + self.settings['old_book_format'].lower() + format_new_ext = '.' + self.settings['new_book_format'].lower() + + # check to see if destination format already exists - or if book is in database + # if it does - mark the conversion task as complete and return a success + # this will allow to send to E-Reader workflow to continue to work + if os.path.isfile(file_path + format_new_ext) or\ + local_db.get_book_format(self.book_id, self.settings['new_book_format']): + log.info("Book id %d already converted to %s", book_id, format_new_ext) + cur_book = local_db.get_book(book_id) + self.title = cur_book.title + self.results['path'] = cur_book.path + self.results['title'] = self.title + new_format = local_db.session.query(db.Data).filter(db.Data.book == book_id)\ + .filter(db.Data.format == self.settings['new_book_format'].upper()).one_or_none() + if not new_format: + new_format = db.Data(name=os.path.basename(file_path), + book_format=self.settings['new_book_format'].upper(), + book=book_id, uncompressed_size=os.path.getsize(file_path + format_new_ext)) + try: + local_db.session.merge(new_format) + local_db.session.commit() + except SQLAlchemyError as e: + local_db.session.rollback() + log.error("Database error: %s", e) + local_db.session.close() + self._handleError(N_("Oops! Database Error: %(error)s.", error=e)) + return + self._handleSuccess() + local_db.session.close() + return os.path.basename(file_path + format_new_ext) + else: + log.info("Book id %d - target format of %s does not exist. Moving forward with convert.", + book_id, + format_new_ext) + + kepubify_binary = resolve_binary_path(config.config_kepubifypath, SUPPORTED_KEPUBIFY_BINARIES) + if kepubify_binary and format_old_ext == '.epub' and format_new_ext == '.kepub': + check, error_message = self._convert_kepubify(file_path, + format_old_ext, + format_new_ext, + kepubify_binary) + else: + # check if calibre converter-executable is existing + if not os.path.exists(config.config_converterpath): + self._handleError(N_("Calibre ebook-convert %(tool)s not found", tool=config.config_converterpath)) + return + has_cover = local_db.get_book(book_id).has_cover + check, error_message = self._convert_calibre(file_path, format_old_ext, format_new_ext, has_cover) + + if check == 0: + cur_book = local_db.get_book(book_id) + if os.path.isfile(file_path + format_new_ext): + new_format = local_db.session.query(db.Data).filter(db.Data.book == book_id) \ + .filter(db.Data.format == self.settings['new_book_format'].upper()).one_or_none() + if not new_format: + new_format = db.Data(name=cur_book.data[0].name, + book_format=self.settings['new_book_format'].upper(), + book=book_id, uncompressed_size=os.path.getsize(file_path + format_new_ext)) + try: + local_db.session.merge(new_format) + local_db.session.commit() + if self.settings['new_book_format'].upper() in ['KEPUB', 'EPUB', 'EPUB3']: + ub_session = init_db_thread() + remove_synced_book(book_id, True, ub_session) + ub_session.close() + except SQLAlchemyError as e: + local_db.session.rollback() + log.error("Database error: %s", e) + local_db.session.close() + self._handleError(error_message) + return + self.results['path'] = cur_book.path + self.title = cur_book.title + self.results['title'] = self.title + if not config.config_use_google_drive: + self._handleSuccess() + return os.path.basename(file_path + format_new_ext) + else: + error_message = N_('%(format)s format not found on disk', format=format_new_ext.upper()) + local_db.session.close() + log.info("ebook converter failed with error while converting book") + if not error_message: + error_message = N_('Ebook converter failed with unknown error') + else: + log.error(error_message) + self._handleError(error_message) + return + + def _convert_kepubify(self, file_path, format_old_ext, format_new_ext, kepubify_binary): + if config.config_embed_metadata and config.config_binariesdir: + tmp_dir, temp_file_name = helper.do_calibre_export(self.book_id, format_old_ext[1:]) + filename = os.path.join(tmp_dir, temp_file_name + format_old_ext) + temp_file_path = tmp_dir + else: + filename = file_path + format_old_ext + temp_file_path = os.path.dirname(file_path) + quotes = [1, 3] + command = [kepubify_binary, filename, '-o', temp_file_path, '-i'] + try: + p = process_open(command, quotes) + except OSError as e: + return 1, N_("Kepubify-converter failed: %(error)s", error=e) + self.progress = 0.01 + while True: + nextline = p.stdout.readlines() + nextline = [x.strip('\n') for x in nextline if x != '\n'] + for line in nextline: + log.debug(line) + if p.poll() is not None: + break + + # process returncode + check = p.returncode + + # move file + if check == 0: + converted_file = glob.glob(glob.escape(os.path.splitext(filename)[0]) + "*.kepub.epub") + if len(converted_file) == 1: + copyfile(converted_file[0], (file_path + format_new_ext)) + os.unlink(converted_file[0]) + else: + return 1, N_("Converted file not found or more than one file in folder %(folder)s", + folder=os.path.dirname(file_path)) + return check, None + + def _convert_calibre(self, file_path, format_old_ext, format_new_ext, has_cover): + path_tmp_opf = None + try: + # path_tmp_opf = self._embed_metadata() + if config.config_embed_metadata: + quotes = [5] + tmp_dir = get_temp_dir() + calibredb_binarypath = os.path.join(config.config_binariesdir, SUPPORTED_CALIBRE_BINARIES["calibredb"]) + my_env = os.environ.copy() + if config.config_calibre_split: + my_env['CALIBRE_OVERRIDE_DATABASE_PATH'] = os.path.join(config.config_calibre_dir, "metadata.db") + library_path = config.config_calibre_split_dir + else: + library_path = config.config_calibre_dir + + opf_command = [calibredb_binarypath, 'show_metadata', '--as-opf', str(self.book_id), + '--with-library', library_path] + p = process_open(opf_command, quotes, my_env, newlines=False) + lines = list() + while p.poll() is None: + lines.append(p.stdout.readline()) + check = p.returncode + calibre_traceback = p.stderr.readlines() + if check == 0: + path_tmp_opf = os.path.join(tmp_dir, "metadata_" + str(uuid4()) + ".opf") + with open(path_tmp_opf, 'wb') as fd: + fd.write(b''.join(lines)) + else: + error_message = "" + for ele in calibre_traceback: + ele = ele.decode('utf-8', errors="ignore").strip('\n') + log.debug(ele) + if not ele.startswith('Traceback') and not ele.startswith(' File'): + error_message = N_("Calibre failed with error: %(error)s", error=ele) + return check, error_message + quotes = [1, 2] + quotes_index = 3 + command = [config.config_converterpath, (file_path + format_old_ext), + (file_path + format_new_ext)] + if config.config_embed_metadata: + quotes.append(4) + quotes_index = 5 + command.extend(['--from-opf', path_tmp_opf]) + if has_cover: + quotes.append(6) + command.extend(['--cover', os.path.join(os.path.dirname(file_path), 'cover.jpg')]) + quotes_index = 7 + if config.config_calibre: + parameters = re.findall(r"(--[\w-]+)(?:(\s(?:(\".+\")|(?:.+?)))(?:\s|$))?", + config.config_calibre, re.IGNORECASE | re.UNICODE) + if parameters: + for param in parameters: + command.append(strip_whitespaces(param[0])) + quotes_index += 1 + if param[1] != "": + parsed = strip_whitespaces(param[1]).strip("\"") + command.append(parsed) + quotes.append(quotes_index) + quotes_index += 1 + p = process_open(command, quotes, newlines=False) + except OSError as e: + return 1, N_("Ebook-converter failed: %(error)s", error=e) + + while p.poll() is None: + nextline = p.stdout.readline() + if isinstance(nextline, bytes): + nextline = nextline.decode('utf-8', errors="ignore").strip('\r\n') + if nextline: + log.debug(nextline) + # parse progress string from calibre-converter + progress = re.search(r"(\d+)%\s.*", nextline) + if progress: + self.progress = int(progress.group(1)) / 100 + if config.config_use_google_drive: + self.progress *= 0.9 + + # process returncode + check = p.returncode + calibre_traceback = p.stderr.readlines() + error_message = "" + for ele in calibre_traceback: + ele = ele.decode('utf-8', errors="ignore").strip('\n') + log.debug(ele) + if not ele.startswith('Traceback') and not ele.startswith(' File'): + error_message = N_("Calibre failed with error: %(error)s", error=ele) + return check, error_message + + @property + def name(self): + return N_("Convert") + + def __str__(self): + if self.ereader_mail: + return "Convert Book {} and mail it to {}".format(self.book_id, self.ereader_mail) + else: + return "Convert Book {}".format(self.book_id) + + @property + def is_cancellable(self): + return False diff --git a/cps/web.py b/cps/web.py index 340df6fa5..5ef407636 100644 --- a/cps/web.py +++ b/cps/web.py @@ -47,6 +47,7 @@ from .helper import check_valid_domain, check_email, check_username, \ get_book_cover, get_series_cover_thumbnail, get_download_link, send_mail, generate_random_password, \ send_registration_mail, check_send_to_ereader, check_read_formats, tags_filters, reset_password, valid_email, \ edit_book_read_status, valid_password +from .binary_helper import resolve_binary_path, SUPPORTED_UNRAR_BINARIES from .pagination import Pagination from .redirect import get_redirect_location from .cw_babel import get_available_locale @@ -218,7 +219,8 @@ def get_comic_book(book_id, book_format, page): cbr_file = os.path.join(config.config_calibre_dir, book.path, bookformat.name) + "." + book_format if book_format in ("cbr", "rar"): if feature_support['rar'] == True: - rarfile.UNRAR_TOOL = config.config_rarfile_location + rarfile.UNRAR_TOOL = resolve_binary_path(config.config_rarfile_location, + SUPPORTED_UNRAR_BINARIES) try: rf = rarfile.RarFile(cbr_file) names = sort(rf.namelist()) From 5b0d30123e43dfc4dc7daf588fb99024819e7723 Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Sat, 1 Aug 2026 14:49:49 +0200 Subject: [PATCH 09/29] Improve speed of whitespace stripping --- cps/string_helper.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/cps/string_helper.py b/cps/string_helper.py index d263dd2f2..29ac2a3e5 100644 --- a/cps/string_helper.py +++ b/cps/string_helper.py @@ -15,9 +15,23 @@ # # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import re +_SPECIAL_WHITESPACE_CHARS = {"\x00", "\u200b", "\u200c", "\u200d", "\ufeff"} def strip_whitespaces(text): - return re.sub(r"(^[\s\u200B-\u200D\ufeff]+)|([\s\u200B-\u200D\ufeff]+$)","", text) + if text is None: + return "" + if not isinstance(text, str): + return text + + start = 0 + end = len(text) + + while start < end and (text[start].isspace() or text[start] in _SPECIAL_WHITESPACE_CHARS): + start += 1 + + while end > start and (text[end - 1].isspace() or text[end - 1] in _SPECIAL_WHITESPACE_CHARS): + end -= 1 + + return text[start:end] From 81a2825587da7e630e3e2a1ae4edb83e5a98628b Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Sat, 1 Aug 2026 15:26:50 +0200 Subject: [PATCH 10/29] Fix typo --- cps/embed_helper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cps/embed_helper.py b/cps/embed_helper.py index d34f58027..6a815889e 100644 --- a/cps/embed_helper.py +++ b/cps/embed_helper.py @@ -38,7 +38,7 @@ def do_calibre_export(book_id, book_format): library_path = config.get_book_path() opf_command = [calibredb_binarypath, 'export', '--dont-write-opf', '--dont-save-cover', '--with-library', library_path, - '--to-dir', tmp_dir, '--formatcalibredbs', book_format, "--template", "{}".format(temp_file_name), + '--to-dir', tmp_dir, '--formats', book_format, "--template", "{}".format(temp_file_name), str(book_id)] p = process_open(opf_command, quotes, my_env) _, err = p.communicate() From 11b23cef7d294da4385a6af113cf8bb3430f6c4d Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Sat, 1 Aug 2026 16:05:53 +0200 Subject: [PATCH 11/29] Removed deprecated findAll call --- cps/metadata_provider/amazon.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cps/metadata_provider/amazon.py b/cps/metadata_provider/amazon.py index 5b07819cb..1d57a8b1b 100644 --- a/cps/metadata_provider/amazon.py +++ b/cps/metadata_provider/amazon.py @@ -97,8 +97,8 @@ class Amazon(Metadata): try: match.authors = [next( filter(lambda i: i != " " and i != "\n" and not i.startswith("{"), - x.findAll(string=True))).strip() - for x in soup2.findAll("span", attrs={"class": "author"})] + x.find_all(string=True))).strip() + for x in soup2.find_all("span", attrs={"class": "author"})] except (AttributeError, TypeError, StopIteration): match.authors = "" try: @@ -131,8 +131,8 @@ class Amazon(Metadata): log.warning(e) return [] soup = BS(results.text, 'html.parser') - links_list = [next(filter(lambda i: "digital-text" in i["href"], x.findAll("a")))["href"] for x in - soup.findAll("div", attrs={"data-component-type": "s-search-result"})] + links_list = [next(filter(lambda i: "digital-text" in i["href"], x.find_all("a")))["href"] for x in + soup.find_all("div", attrs={"data-component-type": "s-search-result"})] with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor: fut = {executor.submit(inner, link, index) for index, link in enumerate(links_list[:3])} val = list(map(lambda x : x.result(), concurrent.futures.as_completed(fut))) From e41a139c063782e4cf94de453151f759b6b3bb11 Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Sat, 1 Aug 2026 16:25:52 +0200 Subject: [PATCH 12/29] Updated requirements --- optional-requirements.txt | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/optional-requirements.txt b/optional-requirements.txt index 5d0da2197..d6665f895 100644 --- a/optional-requirements.txt +++ b/optional-requirements.txt @@ -1,7 +1,7 @@ # GDrive Integration google-api-python-client>=2.73.00,<2.200.0 gevent>20.6.0,<25.9.2 -greenlet>=0.4.17,<3.4.0 +greenlet>=0.4.17,<3.6.0 httplib2>=0.9.2,<0.32.0 oauth2client>=4.0.0,<4.1.4 uritemplate>=3.0.0,<4.3.0 diff --git a/requirements.txt b/requirements.txt index 80060e288..320c8d8c2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -24,4 +24,4 @@ python-magic>=0.4.27,<0.5.0 python-magic-bin>=0.4.0,<0.5.0;sys_platform=='win32' flask-httpAuth>=4.4.0,<5.0.0 cryptography>=39.0.0,<48.0.0 -certifi>=2024.7.4,<2026.1.5 +certifi>=2024.7.4,<2026.5.21 From a07affbd1284d66755a494c36dd1d7450217fbf2 Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Sat, 1 Aug 2026 17:55:30 +0200 Subject: [PATCH 13/29] Fix for xss on author page --- cps/search_metadata.py | 36 ++++++++++++++++++++++++++++++++++-- cps/templates/author.html | 2 +- cps/templates/book_edit.html | 14 +++++++------- cps/templates/detail.html | 1 + 4 files changed, 43 insertions(+), 10 deletions(-) diff --git a/cps/search_metadata.py b/cps/search_metadata.py index da7ac8324..9694676ef 100644 --- a/cps/search_metadata.py +++ b/cps/search_metadata.py @@ -22,6 +22,7 @@ import inspect import json import os import sys +from urllib.parse import urlsplit from flask import Blueprint, request, url_for, make_response, jsonify from .cw_login import current_user @@ -38,6 +39,37 @@ meta = Blueprint("metadata", __name__) log = logger.create() + +def _safe_metadata_url(value): + if not isinstance(value, str): + return "" + value = value.strip() + if not value: + return "" + parsed = urlsplit(value) + if parsed.scheme in ("http", "https"): + return value + if not parsed.scheme and value.startswith("/"): + return value + return "" + + +def _sanitize_metadata_record(record): + record["url"] = _safe_metadata_url(record.get("url")) + record["cover"] = _safe_metadata_url(record.get("cover")) + source = record.get("source") + if isinstance(source, dict): + source["link"] = _safe_metadata_url(source.get("link")) + return record + + +def _serialize_metadata_records(records): + return [ + _sanitize_metadata_record(asdict(record)) + for record in (records or []) + if record + ] + try: from dataclasses import asdict except ImportError: @@ -114,7 +146,7 @@ def metadata_change_active_provider(prov_name): provider = next((c for c in cl if c.__id__ == prov_name), None) if provider is not None: data = provider.search(new_state.get("query", "")) - return make_response(jsonify([asdict(x) for x in data])) + return make_response(jsonify(_serialize_metadata_records(data))) return "" @@ -135,5 +167,5 @@ def metadata_search(): if active.get(c.__id__, True) } for future in concurrent.futures.as_completed(meta): - data.extend([asdict(x) for x in (future.result() or []) if x]) + data.extend(_serialize_metadata_records(future.result())) return make_response(jsonify(data)) diff --git a/cps/templates/author.html b/cps/templates/author.html index a01bb40bf..fe326e238 100644 --- a/cps/templates/author.html +++ b/cps/templates/author.html @@ -36,7 +36,7 @@
- {{ image.book_cover(entry.Books, alt=author.name|safe) }} + {{ image.book_cover(entry.Books, alt=author.name) }} {% if entry[2] == True %}{% endif %} diff --git a/cps/templates/book_edit.html b/cps/templates/book_edit.html index 615b40c2e..23d548e06 100644 --- a/cps/templates/book_edit.html +++ b/cps/templates/book_edit.html @@ -263,26 +263,26 @@ {% block js %} -
-
-

Made with HTMLTestRunner from https://github.com/oldani/HtmlTestRunner

-
-
- \ No newline at end of file From aaff639231b681d4cd3714d7cc24246d94c901e7 Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Mon, 3 Aug 2026 17:35:17 +0200 Subject: [PATCH 17/29] Update search metadata --- cps/metadata_provider/amazon.py | 2 +- cps/search_metadata.py | 2 +- cps/static/js/get_meta.js | 3 +- requirements.txt | 2 +- test/Calibre-Web TestSummary_Linux.html | 338 +++++++++++++++--------- 5 files changed, 223 insertions(+), 124 deletions(-) diff --git a/cps/metadata_provider/amazon.py b/cps/metadata_provider/amazon.py index 1d57a8b1b..26a8910d1 100644 --- a/cps/metadata_provider/amazon.py +++ b/cps/metadata_provider/amazon.py @@ -64,7 +64,7 @@ class Amazon(Metadata): log.warning(ex) return [] long_soup = BS(r.text, "lxml") #~4sec :/ - soup2 = long_soup.find("div", attrs={"cel_widget_id": "dpx-ppd_csm_instrumentation_wrapper"}) + soup2 = long_soup.find("div", attrs={"id": "dp-container"}) if soup2 is None: return [] try: diff --git a/cps/search_metadata.py b/cps/search_metadata.py index 9694676ef..d8a12983d 100644 --- a/cps/search_metadata.py +++ b/cps/search_metadata.py @@ -168,4 +168,4 @@ def metadata_search(): } for future in concurrent.futures.as_completed(meta): data.extend(_serialize_metadata_records(future.result())) - return make_response(jsonify(data)) + return make_response(jsonify(data)) diff --git a/cps/static/js/get_meta.js b/cps/static/js/get_meta.js index ce1fbfd20..918ed83d9 100644 --- a/cps/static/js/get_meta.js +++ b/cps/static/js/get_meta.js @@ -135,9 +135,10 @@ $(function () { $(document).on("change", ".pill", function () { var element = $(this); var id = element.data("control"); - var initial = element.data("initial"); + var initial = String(element.data("initial")) === "true"; var val = element.prop('checked'); var params = {id : id, value: val}; + $('[data-related="' + id + '"]').toggle(val); if (!initial) { params['initial'] = initial; params['query'] = keyword; diff --git a/requirements.txt b/requirements.txt index e04b5f2f8..e881a34ec 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,7 +13,7 @@ tornado>=6.4.2,<6.6 Wand>=0.4.4,<0.8.0 unidecode>=0.04.19,<1.5.0 lxml>=4.9.1,<6.2.0 -flask-wtf>=0.14.2,<1.3.0 +flask-wtf>=0.14.2,<1.4.0 chardet>=3.0.0,<5.3.0 netifaces-plus>=0.12.0,<0.13.0 urllib3>=1.22,<3.0 diff --git a/test/Calibre-Web TestSummary_Linux.html b/test/Calibre-Web TestSummary_Linux.html index bdfd9ed87..b76f8ec3b 100644 --- a/test/Calibre-Web TestSummary_Linux.html +++ b/test/Calibre-Web TestSummary_Linux.html @@ -37,20 +37,20 @@
-

Start Time: 2026-08-02T18:39:27.000001

+

Start Time: 2026-08-03T13:49:52.000001

-

Stop Time: 2026-08-02T21:02:03.000001

+

Stop Time: 2026-08-03T16:20:35.000001

-

Duration: 8h 37 min

+

Duration: 7h 50 min

@@ -1266,12 +1266,12 @@ - + TestCliGdrivedb 4 4 0 - 0 + 1 0 Detail @@ -1315,13 +1315,60 @@ + + + +
TestCliGdrivedb - _ErrorHolder
+ + +
+ ERROR +
+ + + + + + + - + TestCoverEditBooks 2 - 1 - 1 + 2 + 0 0 0 @@ -1340,32 +1387,11 @@ - +
TestCoverEditBooks - test_upload_jpg
- -
- FAIL -
- - - - + PASS @@ -1438,7 +1464,7 @@ AssertionError: <selenium.webdriver.remote.webelement.WebElement (session= ^^^^^^^^^^^^^^^ File "/usr/lib/python3.12/asyncio/base_events.py", line 1572, in create_server raise OSError(err.errno, msg) from None -OSError: [Errno 98] error while attempting to bind on address ('127.0.0.1', 8004): address already in use +OSError: [Errno 98] error while attempting to bind on address ('127.0.0.1', 8003): address already in use
@@ -1499,8 +1525,8 @@ OSError: [Errno 98] error while attempting to bind on address ('127.0.0.1
Traceback (most recent call last):
-  File "/home/ozzie/Development/calibre-web-test/test/test_ebook_convert_gdrive.py", line 305, in test_convert_only
-    self.assertEqual(ret[-1]['result'], 'Finished')
+  File "/home/ozzie/Development/calibre-web-test/test/test_ebook_convert_gdrive.py", line 287, in test_convert_only
+    self.assertEqual(ret[-2]['result'], 'Finished')
 AssertionError: 'Failed' != 'Finished'
 - Failed
 + Finished
@@ -1822,11 +1848,11 @@ AssertionError: 'Failed' != 'Finished'
     
 
 
-    
+    
         TestEditAuthors
         10
-        10
-        0
+        9
+        1
         0
         0
         
@@ -1881,11 +1907,32 @@ AssertionError: 'Failed' != 'Finished'
     
     
     
-        
+        
             
                 
TestEditAuthors - test_change_capital_rename_two_co_authors
- PASS + +
+ FAIL +
+ + + + @@ -2866,7 +2913,7 @@ AssertionError: 'Failed' != 'Finished'
Traceback (most recent call last):
   File "/home/ozzie/Development/calibre-web-test/test/test_edit_ebooks_gdrive.py", line 911, in test_watch_metadata
     self.assertNotIn('series', book)
-AssertionError: 'series' unexpectedly found in {'id': 5, 'reader': [], 'title': 'testbook', 'author': ['John Döe'], 'rating': 0, 'languages': ['English'], 'identifier': [], 'cover': '/cover/5/og?c=1785686872', 'tag': [], 'publisher': ['Randomhäus'], 'pubdate': 'Jan 19, 2017', 'comment': 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Aenean commodo ligula eget dolor.Aenean massa.Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.Nulla consequat massa quis enim.Donec pede justo, fringilla vel, aliquet nec, vulputate', 'add_shelf': [], 'del_shelf': [], 'edit_enable': True, 'kindle': None, 'kindlebtn': None, 'download': ['EPUB\n                                            (6.7 kB)'], 'read': False, 'archived': False, 'series_all': 'Book 1 of test', 'series_index': '1', 'series': 'test', 'cust_columns': []}
+AssertionError: 'series' unexpectedly found in {'id': 5, 'reader': [], 'title': 'testbook', 'author': ['John Döe'], 'rating': 0, 'languages': ['English'], 'identifier': [], 'cover': '/cover/5/og?c=1785757394', 'tag': [], 'publisher': ['Randomhäus'], 'pubdate': 'Jan 19, 2017', 'comment': 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Aenean commodo ligula eget dolor.Aenean massa.Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.Nulla consequat massa quis enim.Donec pede justo, fringilla vel, aliquet nec, vulputate', 'add_shelf': [], 'del_shelf': [], 'edit_enable': True, 'kindle': None, 'kindlebtn': None, 'download': ['EPUB\n                                            (6.7 kB)'], 'read': False, 'archived': False, 'series_all': 'Book 1 of test', 'series_index': '1', 'series': 'test', 'cust_columns': []}
 
@@ -2878,12 +2925,12 @@ AssertionError: 'series' unexpectedly found in {'id': 5, 're - + TestEmbedMetadata 6 - 6 - 0 + 5 0 + 1 0 Detail @@ -2901,11 +2948,36 @@ AssertionError: 'series' unexpectedly found in {'id': 5, 're - +
TestEmbedMetadata - test_convert_kepub_embed_metadata
- PASS + +
+ ERROR +
+ + + + @@ -3115,11 +3187,11 @@ AssertionError: 'series' unexpectedly found in {'id': 5, 're - + TestKoboSync 12 - 12 - 0 + 11 + 1 0 0 @@ -3210,11 +3282,32 @@ AssertionError: 'series' unexpectedly found in {'id': 5, 're - +
TestKoboSync - test_sync_shelf
- PASS + +
+ FAIL +
+ + + + @@ -3307,11 +3400,11 @@ AssertionError: 'series' unexpectedly found in {'id': 5, 're - + TestLdapLogin 13 - 13 - 0 + 12 + 1 0 0 @@ -3420,11 +3513,32 @@ AssertionError: 'series' unexpectedly found in {'id': 5, 're - +
TestLdapLogin - test_ldap_opds_anonymous
- PASS + +
+ FAIL +
+ + + + @@ -3439,11 +3553,11 @@ AssertionError: 'series' unexpectedly found in {'id': 5, 're - + TestLoadMetadata 1 - 1 0 + 1 0 0 @@ -3453,66 +3567,71 @@ AssertionError: 'series' unexpectedly found in {'id': 5, 're - +
TestLoadMetadata - test_load_metadata
- PASS + +
+ FAIL +
+ + + + - + TestLoadMetadataScholar - 0 - 0 + 1 0 1 0 + 0 - Detail + Detail - + -
TestLoadMetadataScholar - _ErrorHolder
+
TestLoadMetadataScholar - test_load_metadata
- ERROR + FAIL
- From 89bbc16761f9bc6a86627ce6a4f3580813096eea Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Mon, 3 Aug 2026 20:01:32 +0200 Subject: [PATCH 18/29] Limit modal file size height --- cps/static/css/style.css | 15 ++++++++++++++ cps/templates/config_edit.html | 6 +++--- cps/templates/modal_dialogs.html | 34 +++++++++++++++++--------------- 3 files changed, 36 insertions(+), 19 deletions(-) diff --git a/cps/static/css/style.css b/cps/static/css/style.css index 9d5a8f6a2..0d3248008 100644 --- a/cps/static/css/style.css +++ b/cps/static/css/style.css @@ -422,6 +422,21 @@ input.pill:not(:checked) + label .glyphicon { display: none; } overflow-y: auto; } +#fileModal .modal-content { + max-height: calc(100vh - 60px); + display: flex; + flex-direction: column; +} + +#fileModal .modal-body { + overflow: hidden; +} + +#file_table_wrapper { + max-height: calc(100vh - 220px); + overflow-y: auto; +} + div.log { font-family: Courier New, serif; font-size: 12px; diff --git a/cps/templates/config_edit.html b/cps/templates/config_edit.html index c8b77d8c6..62b7a63c5 100644 --- a/cps/templates/config_edit.html +++ b/cps/templates/config_edit.html @@ -214,21 +214,21 @@
- +
- +
- +
diff --git a/cps/templates/modal_dialogs.html b/cps/templates/modal_dialogs.html index c3d975dd9..6f69c3c8f 100644 --- a/cps/templates/modal_dialogs.html +++ b/cps/templates/modal_dialogs.html @@ -75,22 +75,24 @@ {{_('Choose File Location')}} +
+
{{_('Reverse Proxy Trusted IPs/CIDRs')}}
+
{{ config.config_reverse_proxy_trusted_ips }}
+
+
+
{{_('Reverse Proxy Shared Secret Header Name')}}
+
{{ config.config_reverse_proxy_login_secret_header_name }}
+
+
+
{{_('Reverse Proxy Shared Secret Header')}}
+
{{ display_bool_setting(config.config_reverse_proxy_use_shared_secret) }}
+
+
+
{{_('Reverse Proxy Shared Secret Configured')}}
+
{{ display_bool_setting(config.config_reverse_proxy_login_header_secret_e) }}
+
{% endif %} {{_('Edit Calibre Database Configuration')}} diff --git a/cps/templates/config_edit.html b/cps/templates/config_edit.html index 62b7a63c5..0fa65e2bd 100644 --- a/cps/templates/config_edit.html +++ b/cps/templates/config_edit.html @@ -176,6 +176,24 @@ +
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+
{% if not config.config_is_initial %} {% if feature_support['ldap'] or feature_support['oauth'] %} diff --git a/cps/usermanagement.py b/cps/usermanagement.py index e9f0776be..68825a513 100644 --- a/cps/usermanagement.py +++ b/cps/usermanagement.py @@ -27,6 +27,7 @@ from werkzeug.datastructures import Authorization from werkzeug.security import check_password_hash from . import lm, ub, config, logger, limiter, constants, services +from .reverse_proxy_auth import is_shared_secret_valid, is_trusted_proxy_source log = logger.create() @@ -113,11 +114,37 @@ def user_login_required(func): return decorated_view +def _is_request_from_trusted_reverse_proxy(req): + remote_addr = req.remote_addr + trusted_proxy_config = config.config_reverse_proxy_trusted_ips or "" + return is_trusted_proxy_source(remote_addr, trusted_proxy_config) + + +def _has_valid_reverse_proxy_shared_secret(req): + if not config.config_reverse_proxy_use_shared_secret: + return True + + secret_header_name = config.config_reverse_proxy_login_secret_header_name or "" + expected_secret = config.config_reverse_proxy_login_header_secret_e or "" + if not secret_header_name or not expected_secret: + log.warning("Reverse proxy shared secret is partially configured, rejecting reverse proxy login") + return False + + return is_shared_secret_valid(req.headers.get(secret_header_name), expected_secret) + + def load_user_from_reverse_proxy_header(req): rp_header_name = config.config_reverse_proxy_login_header_name if rp_header_name: rp_header_username = req.headers.get(rp_header_name) if rp_header_username: + if not _is_request_from_trusted_reverse_proxy(req): + log.warning('Rejected reverse proxy authentication header from untrusted source IP-address: %s', + req.remote_addr) + return None + if not _has_valid_reverse_proxy_shared_secret(req): + log.warning('Rejected reverse proxy authentication header due to missing or invalid shared secret') + return None user = ub.session.query(ub.User).filter(func.lower(ub.User.name) == rp_header_username.lower()).first() if user: [limiter.limiter.clear(limit.limit, *limit.request_args) for limit in limiter.current_limits] @@ -138,4 +165,3 @@ def load_user(user_id, random, session_key): if not entry or entry.user_id != user.id: return None return user - From 89d828bd0c43eba9b0e8c22645fcde76409f40f3 Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Mon, 3 Aug 2026 20:37:12 +0200 Subject: [PATCH 20/29] Deactivate Rate limiter reset for reverse proxy header login --- cps/usermanagement.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cps/usermanagement.py b/cps/usermanagement.py index 68825a513..13783a452 100644 --- a/cps/usermanagement.py +++ b/cps/usermanagement.py @@ -147,7 +147,6 @@ def load_user_from_reverse_proxy_header(req): return None user = ub.session.query(ub.User).filter(func.lower(ub.User.name) == rp_header_username.lower()).first() if user: - [limiter.limiter.clear(limit.limit, *limit.request_args) for limit in limiter.current_limits] return user return None From 8b8fc6e2f731ac4d1472c341f8a57083706f3f53 Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Mon, 3 Aug 2026 20:39:03 +0200 Subject: [PATCH 21/29] User warning for reverse proxy login --- cps/templates/config_edit.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cps/templates/config_edit.html b/cps/templates/config_edit.html index 0fa65e2bd..b455e358f 100644 --- a/cps/templates/config_edit.html +++ b/cps/templates/config_edit.html @@ -172,6 +172,10 @@
+
+ {{_('Security Warning')}} + {{_('Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled.')}} +
From f00c77d87c8b5beff99bf63432791daf5a09ff1b Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Fri, 7 Aug 2026 19:04:59 +0200 Subject: [PATCH 22/29] Added check for conversion format check --- cps/editbooks.py | 8 + cps/web.py | 2 + pyproject.toml | 2 +- test/Calibre-Web TestSummary_Linux.html | 353 +++++++++++------------- 4 files changed, 177 insertions(+), 188 deletions(-) diff --git a/cps/editbooks.py b/cps/editbooks.py index c13870df9..fb7d52fab 100644 --- a/cps/editbooks.py +++ b/cps/editbooks.py @@ -185,6 +185,14 @@ def convert_bookformat(book_id): flash(_("Source or destination format for conversion missing"), category="error") return redirect(url_for('edit-book.show_edit_book', book_id=book_id)) + if book_format_from.lower() not in constants.EXTENSIONS_CONVERT_FROM: + flash(_("Source format for conversion not supported"), category="error") + return redirect(url_for('edit-book.show_edit_book', book_id=book_id)) + + if book_format_to.lower() not in constants.EXTENSIONS_CONVERT_TO: + flash(_("Destination format for conversion not supported"), category="error") + return redirect(url_for('edit-book.show_edit_book', book_id=book_id)) + log.info('converting: book id: %s from: %s to: %s', book_id, book_format_from, book_format_to) rtn = helper.convert_book_format(book_id, config.get_book_path(), book_format_from.upper(), book_format_to.upper(), current_user.name) diff --git a/cps/web.py b/cps/web.py index 5ef407636..e171971b6 100644 --- a/cps/web.py +++ b/cps/web.py @@ -1262,6 +1262,8 @@ def download_link(book_id, book_format, anyname): @login_required_if_no_ano @download_required def send_to_ereader(book_id, book_format, convert): + if book_format.lower() not in constants.EXTENSIONS_UPLOAD: + return make_response(jsonify(type="danger", message=_("Book format not supported"))) if not config.get_mail_server_configured(): return make_response(jsonify(type="danger", message=_("Please configure the SMTP mail settings first..."))) elif current_user.kindle_mail: diff --git a/pyproject.toml b/pyproject.toml index 5e70986e2..ef1f4e9b6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,7 +43,7 @@ dependencies = [ "Wand>=0.4.4,<0.8.0", "unidecode>=0.04.19,<1.5.0", "lxml>=4.9.1,<6.2.0", - "flask-wtf>=0.14.2,<1.3.0", + "flask-wtf>=0.14.2,<1.4.0", "chardet>=3.0.0,<5.3.0", "netifaces-plus>=0.12.0,<0.13.0", "urllib3>=1.22,<3.0", diff --git a/test/Calibre-Web TestSummary_Linux.html b/test/Calibre-Web TestSummary_Linux.html index b76f8ec3b..58a41b777 100644 --- a/test/Calibre-Web TestSummary_Linux.html +++ b/test/Calibre-Web TestSummary_Linux.html @@ -37,20 +37,20 @@
-

Start Time: 2026-08-03T13:49:52.000001

+

Start Time: 2026-08-06T21:12:45.000001

-

Stop Time: 2026-08-03T16:20:35.000001

+

Stop Time: 2026-08-06T23:19:03.000001

-

Duration: 7h 50 min

+

Duration: 7h 43 min

@@ -1266,12 +1266,12 @@ - + TestCliGdrivedb 4 4 0 - 1 + 0 0 Detail @@ -1315,53 +1315,6 @@ - - - -
TestCliGdrivedb - _ErrorHolder
- - -
- ERROR -
- - - - - - - @@ -1452,7 +1405,7 @@ json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Traceback (most recent call last):
-  File "/home/ozzie/Development/calibre-web-test/test/test_ebook_convert.py", line 38, in setUpClass
+  File "/home/ozzie/Development/calibre-web-test/test/test_ebook_convert.py", line 37, in setUpClass
     cls.email_server.start()
   File "/home/ozzie/Development/calibre-web-test/test/aiosmtpd/controller.py", line 274, in start
     raise self._thread_exception
@@ -1464,7 +1417,7 @@ json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
            ^^^^^^^^^^^^^^^
   File "/usr/lib/python3.12/asyncio/base_events.py", line 1572, in create_server
     raise OSError(err.errno, msg) from None
-OSError: [Errno 98] error while attempting to bind on address ('127.0.0.1', 8003): address already in use
+OSError: [Errno 98] error while attempting to bind on address ('127.0.0.1', 8004): address already in use
 
@@ -1526,7 +1479,7 @@ OSError: [Errno 98] error while attempting to bind on address ('127.0.0.1
Traceback (most recent call last):
   File "/home/ozzie/Development/calibre-web-test/test/test_ebook_convert_gdrive.py", line 287, in test_convert_only
-    self.assertEqual(ret[-2]['result'], 'Finished')
+    self.assertEqual(ret[-1]['result'], 'Finished')
 AssertionError: 'Failed' != 'Finished'
 - Failed
 + Finished
@@ -1848,11 +1801,11 @@ AssertionError: 'Failed' != 'Finished'
     
 
 
-    
+    
         TestEditAuthors
         10
-        9
-        1
+        10
+        0
         0
         0
         
@@ -1907,32 +1860,11 @@ AssertionError: 'Failed' != 'Finished'
     
     
     
-        
+        
             
                 
TestEditAuthors - test_change_capital_rename_two_co_authors
- -
- FAIL -
- - - - + PASS @@ -2913,7 +2845,7 @@ AssertionError: 200 != 404
Traceback (most recent call last):
   File "/home/ozzie/Development/calibre-web-test/test/test_edit_ebooks_gdrive.py", line 911, in test_watch_metadata
     self.assertNotIn('series', book)
-AssertionError: 'series' unexpectedly found in {'id': 5, 'reader': [], 'title': 'testbook', 'author': ['John Döe'], 'rating': 0, 'languages': ['English'], 'identifier': [], 'cover': '/cover/5/og?c=1785757394', 'tag': [], 'publisher': ['Randomhäus'], 'pubdate': 'Jan 19, 2017', 'comment': 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Aenean commodo ligula eget dolor.Aenean massa.Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.Nulla consequat massa quis enim.Donec pede justo, fringilla vel, aliquet nec, vulputate', 'add_shelf': [], 'del_shelf': [], 'edit_enable': True, 'kindle': None, 'kindlebtn': None, 'download': ['EPUB\n                                            (6.7 kB)'], 'read': False, 'archived': False, 'series_all': 'Book 1 of test', 'series_index': '1', 'series': 'test', 'cust_columns': []}
+AssertionError: 'series' unexpectedly found in {'id': 5, 'reader': [], 'title': 'testbook', 'author': ['John Döe'], 'rating': 0, 'languages': ['English'], 'identifier': [], 'cover': '/cover/5/og?c=1786042712', 'tag': [], 'publisher': ['Randomhäus'], 'pubdate': 'Jan 19, 2017', 'comment': 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Aenean commodo ligula eget dolor.Aenean massa.Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.Nulla consequat massa quis enim.Donec pede justo, fringilla vel, aliquet nec, vulputate', 'add_shelf': [], 'del_shelf': [], 'edit_enable': True, 'kindle': None, 'kindlebtn': None, 'download': ['EPUB\n                                            (6.7 kB)'], 'read': False, 'archived': False, 'series_all': 'Book 1 of test', 'series_index': '1', 'series': 'test', 'cust_columns': []}
 
@@ -2925,12 +2857,12 @@ AssertionError: 'series' unexpectedly found in {'id': 5, 're - + TestEmbedMetadata 6 - 5 + 6 + 0 0 - 1 0 Detail @@ -2948,36 +2880,11 @@ AssertionError: 'series' unexpectedly found in {'id': 5, 're - +
TestEmbedMetadata - test_convert_kepub_embed_metadata
- -
- ERROR -
- - - - + PASS @@ -3187,11 +3094,11 @@ FileNotFoundError: [Errno 2] No such file or directory: '/home/ozzie/Develop - + TestKoboSync 12 - 11 - 1 + 12 + 0 0 0 @@ -3282,32 +3189,11 @@ FileNotFoundError: [Errno 2] No such file or directory: '/home/ozzie/Develop - +
TestKoboSync - test_sync_shelf
- -
- FAIL -
- - - - + PASS @@ -3331,11 +3217,11 @@ AssertionError: 1 != 0 : [] - + TestKoboSyncBig 6 - 6 - 0 + 5 + 1 0 0 @@ -3345,11 +3231,32 @@ AssertionError: 1 != 0 : [] - +
TestKoboSyncBig - test_download_cover
- PASS + +
+ FAIL +
+ + + + @@ -3400,11 +3307,11 @@ AssertionError: 1 != 0 : [] - + TestLdapLogin 13 - 12 - 1 + 13 + 0 0 0 @@ -3513,32 +3420,11 @@ AssertionError: 1 != 0 : [] - +
TestLdapLogin - test_ldap_opds_anonymous
- -
- FAIL -
- - - - + PASS @@ -3584,9 +3470,9 @@ AssertionError: False is not true
Traceback (most recent call last):
-  File "/home/ozzie/Development/calibre-web-test/test/test_edit_books_metadata.py", line 52, in test_load_metadata
-    self.assertTrue(len(results) > 0, "Error, No results for metadata query")
-AssertionError: False is not true : Error, No results for metadata query
+  File "/home/ozzie/Development/calibre-web-test/test/test_edit_books_metadata.py", line 105, in test_load_metadata
+    self.assertGreater(len(results), 0, "Error, No results for metadata query")
+AssertionError: 0 not greater than 0 : Error, No results for metadata query
 
@@ -4623,13 +4509,13 @@ AssertionError: 10 != 0 TestReverseProxy - 4 - 4 + 12 + 12 0 0 0 - Detail + Detail @@ -4663,6 +4549,78 @@ AssertionError: 10 != 0 + +
TestReverseProxy - test_proxy_auth_01_trusted_proxy_valid_user_header
+ + PASS + + + + + + +
TestReverseProxy - test_proxy_auth_02_direct_access_header_denied
+ + PASS + + + + + + +
TestReverseProxy - test_proxy_auth_03_trusted_proxy_unknown_user_denied
+ + PASS + + + + + + +
TestReverseProxy - test_proxy_auth_04_shared_secret_disabled_does_not_block_login
+ + PASS + + + + + + +
TestReverseProxy - test_proxy_auth_05_shared_secret_enabled_missing_secret_denied
+ + PASS + + + + + + +
TestReverseProxy - test_proxy_auth_06_shared_secret_enabled_wrong_secret_denied
+ + PASS + + + + + + +
TestReverseProxy - test_proxy_auth_07_shared_secret_enabled_correct_secret_allows_login
+ + PASS + + + + + + +
TestReverseProxy - test_proxy_auth_08_direct_access_with_secret_still_denied
+ + PASS + + + + +
TestReverseProxy - test_reverse_about
@@ -4675,8 +4633,8 @@ AssertionError: 10 != 0 TestSSL 7 - 6 - 1 + 5 + 2 0 0 @@ -4731,11 +4689,32 @@ AssertionError: 10 != 0 - +
TestSSL - test_email_limit
- PASS + +
+ FAIL +
+ + + + @@ -4757,9 +4736,9 @@ AssertionError: 10 != 0
Traceback (most recent call last):
-  File "/home/ozzie/Development/calibre-web-test/test/test_email_ssl.py", line 203, in test_filepicker_two_file
-    self.assertTrue(found, "files folder not found")
-AssertionError: False is not true : files folder not found
+  File "/home/ozzie/Development/calibre-web-test/test/test_email_ssl.py", line 119, in test_email_limit
+    self.assertTrue(self.check_element_on_page((By.ID, 'flash_success'), timeout=BOOT_TIME))
+AssertionError: False is not true
 
@@ -6056,10 +6035,10 @@ AssertionError: False is not true : files folder not found Total - 530 - 510 - 8 - 3 + 538 + 520 + 7 + 1 11   @@ -6268,7 +6247,7 @@ AssertionError: False is not true : files folder not found From 02cf9c229480e4299c3871737ed83e1ad9da7cd3 Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Fri, 7 Aug 2026 21:10:58 +0200 Subject: [PATCH 23/29] Make tempfolder instance specific --- cps/file_helper.py | 12 ++++++++---- cps/helper.py | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/cps/file_helper.py b/cps/file_helper.py index 361709f84..2295b0bc2 100644 --- a/cps/file_helper.py +++ b/cps/file_helper.py @@ -21,9 +21,10 @@ import os import shutil import zipfile import mimetypes +import hashlib from io import BytesIO -from . import logger +from . import logger, config log = logger.create() @@ -44,14 +45,17 @@ def get_mimetype(ext): def get_temp_dir(): - tmp_dir = os.path.join(gettempdir(), 'calibre_web') + base_tmp_dir = os.path.join(gettempdir(), 'calibre_web') + instance_value = "{}|{}".format(config.config_calibre_dir or "", config.config_port or "") + instance_key = hashlib.md5(instance_value.encode('utf-8')).hexdigest() # nosec + tmp_dir = os.path.join(base_tmp_dir, "instance_{}".format(instance_key[:12])) if not os.path.isdir(tmp_dir): - os.mkdir(tmp_dir) + os.makedirs(tmp_dir) return tmp_dir def del_temp_dir(): - tmp_dir = os.path.join(gettempdir(), 'calibre_web') + tmp_dir = get_temp_dir() shutil.rmtree(tmp_dir) diff --git a/cps/helper.py b/cps/helper.py index 4fb47afbf..d813c1e34 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -959,7 +959,7 @@ def do_download_file(book, book_format, client, data, headers): else: download_name = book_name - # Clean up staged copies in /tmp/calibre_web after the response is sent + # Clean up staged copies in the instance temp directory after the response is sent # (kepubify / calibre-export branches) so the temp dir does not grow unbounded. if filename == get_temp_dir(): _tmp_path = os.path.join(filename, download_name + "." + book_format) From ec521c07bab1e023ecbfe7b342fb8efcd589b2c0 Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Fri, 7 Aug 2026 21:46:37 +0200 Subject: [PATCH 24/29] Fix for circular import --- test/Calibre-Web TestSummary_Linux.html | 44026 +++++++++++++++++++++- 1 file changed, 42267 insertions(+), 1759 deletions(-) diff --git a/test/Calibre-Web TestSummary_Linux.html b/test/Calibre-Web TestSummary_Linux.html index 58a41b777..528a5d28e 100644 --- a/test/Calibre-Web TestSummary_Linux.html +++ b/test/Calibre-Web TestSummary_Linux.html @@ -37,20 +37,20 @@
-

Start Time: 2026-08-06T21:12:45.000001

+

Start Time: 2026-08-07T21:12:03.000001

-

Stop Time: 2026-08-06T23:19:03.000001

+

Stop Time: 2026-08-07T21:39:58.000001

-

Duration: 7h 43 min

+

Duration: 1h 47 min

@@ -102,12 +102,12 @@ - + TestAnonymous 13 - 13 - 0 0 + 11 + 2 0 Detail @@ -116,131 +116,406 @@ - +
TestAnonymous - test_check_locale_guest
- PASS + +
+ FAIL +
+ + + + - +
TestAnonymous - test_guest_about
- PASS + +
+ ERROR +
+ + + + - +
TestAnonymous - test_guest_change_visibility_category
- PASS + +
+ FAIL +
+ + + + - +
TestAnonymous - test_guest_change_visibility_format
- PASS + +
+ FAIL +
+ + + + - +
TestAnonymous - test_guest_change_visibility_hot
- PASS + +
+ FAIL +
+ + + + - +
TestAnonymous - test_guest_change_visibility_language
- PASS + +
+ FAIL +
+ + + + - +
TestAnonymous - test_guest_change_visibility_publisher
- PASS + +
+ FAIL +
+ + + + - +
TestAnonymous - test_guest_change_visibility_rated
- PASS + +
+ FAIL +
+ + + + - +
TestAnonymous - test_guest_change_visibility_rating
- PASS + +
+ FAIL +
+ + + + - +
TestAnonymous - test_guest_change_visibility_series
- PASS + +
+ FAIL +
+ + + + - +
TestAnonymous - test_guest_random_books_available
- PASS + +
+ FAIL +
+ + + + - +
TestAnonymous - test_guest_restricted_settings_visibility
- PASS + +
+ ERROR +
+ + + + - +
TestAnonymous - test_guest_visibility_sidebar
- PASS + +
+ FAIL +
+ + + + - + TestBackupMetadata 21 + 0 + 0 21 0 - 0 - 0 Detail @@ -248,203 +523,2390 @@ - +
TestBackupMetadata - test_backup_all
- PASS + +
+ ERROR +
+ + + + - +
TestBackupMetadata - test_backup_change_book_author
- PASS + +
+ ERROR +
+ + + + - +
TestBackupMetadata - test_backup_change_book_description
- PASS + +
+ ERROR +
+ + + + - +
TestBackupMetadata - test_backup_change_book_identifier
- PASS + +
+ ERROR +
+ + + + - +
TestBackupMetadata - test_backup_change_book_language
- PASS + +
+ ERROR +
+ + + + - +
TestBackupMetadata - test_backup_change_book_publisher
- PASS + +
+ ERROR +
+ + + + - +
TestBackupMetadata - test_backup_change_book_publishing_date
- PASS + +
+ ERROR +
+ + + + - +
TestBackupMetadata - test_backup_change_book_rating
- PASS + +
+ ERROR +
+ + + + - +
TestBackupMetadata - test_backup_change_book_series_index
- PASS + +
+ ERROR +
+ + + + - +
TestBackupMetadata - test_backup_change_book_tags
- PASS + +
+ ERROR +
+ + + + - +
TestBackupMetadata - test_backup_change_book_title
- PASS + +
+ ERROR +
+ + + + - +
TestBackupMetadata - test_backup_change_custom_Comment
- PASS + +
+ ERROR +
+ + + + - +
TestBackupMetadata - test_backup_change_custom_Enum
- PASS + +
+ ERROR +
+ + + + - +
TestBackupMetadata - test_backup_change_custom_bool
- PASS + +
+ ERROR +
+ + + + - +
TestBackupMetadata - test_backup_change_custom_categories
- PASS + +
+ ERROR +
+ + + + - +
TestBackupMetadata - test_backup_change_custom_date
- PASS + +
+ ERROR +
+ + + + - +
TestBackupMetadata - test_backup_change_custom_float
- PASS + +
+ ERROR +
+ + + + - +
TestBackupMetadata - test_backup_change_custom_int
- PASS + +
+ ERROR +
+ + + + - +
TestBackupMetadata - test_backup_change_custom_rating
- PASS + +
+ ERROR +
+ + + + - +
TestBackupMetadata - test_backup_change_custom_text
- PASS + +
+ ERROR +
+ + + + - +
TestBackupMetadata - test_upload_book
- PASS + +
+ ERROR +
+ + + + - + TestBackupMetadataGdrive 1 + 0 + 0 1 0 - 0 - 0 Detail @@ -452,23 +2914,127 @@ - +
TestBackupMetadataGdrive - test_backup_gdrive
- PASS + +
+ ERROR +
+ + + + - + TestBookDatabase 1 + 0 + 0 1 0 - 0 - 0 Detail @@ -476,182 +3042,169 @@ - +
TestBookDatabase - test_invalid_book_path
- PASS + +
+ ERROR +
+ + + + - + TestCalibreHelper - 16 - 16 0 0 0 + 1 + 0 - Detail + Detail - + -
TestCalibreHelper - test_author_sort
+
TestCalibreHelper - _ErrorHolder
- PASS - - - - - - -
TestCalibreHelper - test_author_sort_comma
+ +
+ ERROR +
+ + + - PASS - - - - - - -
TestCalibreHelper - test_author_sort_junior
- - PASS - - - - - - -
TestCalibreHelper - test_author_sort_oneword
- - PASS - - - - - - -
TestCalibreHelper - test_author_sort_roman
- - PASS - - - - - - -
TestCalibreHelper - test_check_Limit_Length
- - PASS - - - - - - -
TestCalibreHelper - test_check_char_replacement
- - PASS - - - - - - -
TestCalibreHelper - test_check_chinese_Characters
- - PASS - - - - - - -
TestCalibreHelper - test_check_deg_eur_replacement
- - PASS - - - - - - -
TestCalibreHelper - test_check_doubleS
- - PASS - - - - - - -
TestCalibreHelper - test_check_finish_Dot
- - PASS - - - - - - -
TestCalibreHelper - test_check_high23
- - PASS - - - - - - -
TestCalibreHelper - test_check_umlauts
- - PASS - - - - - - -
TestCalibreHelper - test_random_password
- - PASS - - - - - - -
TestCalibreHelper - test_split_authors
- - PASS - - - - - - -
TestCalibreHelper - test_whitespaces
- - PASS - + TestCalibreWebListOrders 16 + 0 + 0 16 0 - 0 - 0 Detail @@ -659,158 +3212,1781 @@ - +
TestCalibreWebListOrders - test_author_sort
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebListOrders - test_download_sort
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebListOrders - test_format_sort
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebListOrders - test_formats_click_none
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebListOrders - test_lang_sort
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebListOrders - test_language_click_none
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebListOrders - test_order_authors_all_links
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebListOrders - test_order_series_all_links
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebListOrders - test_publisher_click_none
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebListOrders - test_publisher_sort
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebListOrders - test_ratings_click_none
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebListOrders - test_ratings_sort
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebListOrders - test_series_click_none
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebListOrders - test_series_sort
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebListOrders - test_tags_click_none
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebListOrders - test_tags_sort
- PASS + +
+ ERROR +
+ + + + - + TestCalibreWebVisibilitys 35 + 0 + 0 35 0 - 0 - 0 Detail @@ -818,328 +4994,3551 @@ - +
TestCalibreWebVisibilitys - test_about
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_admin_SMTP_Settings
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_admin_add_user
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_admin_change_password
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_admin_change_visibility_archived
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_admin_change_visibility_authors
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_admin_change_visibility_category
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_admin_change_visibility_file_formats
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_admin_change_visibility_hot
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_admin_change_visibility_language
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_admin_change_visibility_publisher
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_admin_change_visibility_random
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_admin_change_visibility_rated
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_admin_change_visibility_rating
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_admin_change_visibility_read
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_admin_change_visibility_series
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_allow_columns
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_allow_tags
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_archive_books
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_authors_max_settings
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_change_title
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_checked_logged_in
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_hide_custom_column
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_link_column_to_read_status
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_random_books_available
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_read_status_visible
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_request_link_column_to_read_status
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_restrict_columns
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_restrict_tags
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_save_views_recent
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_search_functions
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_search_order
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_search_string
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_user_email_available
- PASS + +
+ ERROR +
+ + + + - +
TestCalibreWebVisibilitys - test_user_visibility_sidebar
- PASS + +
+ ERROR +
+ + + + - + TestCli 13 - 12 - 0 - 0 + 2 + 6 + 4 1 Detail @@ -1157,29 +8556,116 @@ - +
TestCli - test_bind_to_single_interface
- PASS + +
+ FAIL +
+ + + + - +
TestCli - test_change_password
- PASS + +
+ FAIL +
+ + + + - +
TestCli - test_cli_SSL_files
- PASS + +
+ FAIL +
+ + + + @@ -1193,85 +8679,329 @@ - +
TestCli - test_cli_different_settings_database
- PASS + +
+ ERROR +
+ + + + - +
TestCli - test_dryrun_update
- PASS + +
+ FAIL +
+ + + + - +
TestCli - test_enable_reconnect
- PASS + +
+ ERROR +
+ + + + - +
TestCli - test_environ_port_setting
- SKIP + +
+ SKIP +
+ + + + - +
TestCli - test_logfile
- PASS + +
+ FAIL +
+ + + + - +
TestCli - test_no_database
- PASS + +
+ FAIL +
+ + + + - +
TestCli - test_settingsdb_not_writeable
- PASS + +
+ ERROR +
+ + + + - +
TestCli - test_writeonly_static_files
- PASS + +
+ ERROR +
+ + + + - + TestCliGdrivedb 4 - 4 - 0 0 + 1 + 3 0 Detail @@ -1280,50 +9010,207 @@ - +
TestCliGdrivedb - test_cli_gdrive_folder
- PASS + +
+ ERROR +
+ + + + - +
TestCliGdrivedb - test_cli_gdrive_location
- PASS + +
+ ERROR +
+ + + + - +
TestCliGdrivedb - test_gdrive_db_nonwrite
- PASS + +
+ ERROR +
+ + + + - +
TestCliGdrivedb - test_no_database
- PASS + +
+ FAIL +
+ + + + - + TestCoverEditBooks 2 + 0 + 0 2 0 - 0 - 0 Detail @@ -1331,32 +9218,220 @@ - +
TestCoverEditBooks - test_invalid_jpg_hdd
- PASS + +
+ ERROR +
+ + + + - +
TestCoverEditBooks - test_upload_jpg
- PASS + +
+ ERROR +
+ + + + - + TestDeleteDatabase 1 + 0 + 0 1 0 - 0 - 0 Detail @@ -1364,11 +9439,106 @@ - +
TestDeleteDatabase - test_delete_books_in_database
- PASS + +
+ ERROR +
+ + + + @@ -1405,7 +9575,7 @@
Traceback (most recent call last):
-  File "/home/ozzie/Development/calibre-web-test/test/test_ebook_convert.py", line 37, in setUpClass
+  File "/home/ozzie/Development/calibre-web-test/test/test_ebook_convert.py", line 36, in setUpClass
     cls.email_server.start()
   File "/home/ozzie/Development/calibre-web-test/test/aiosmtpd/controller.py", line 274, in start
     raise self._thread_exception
@@ -1429,12 +9599,12 @@ OSError: [Errno 98] error while attempting to bind on address ('127.0.0.1
     
 
 
-    
+    
         TestEbookConvertCalibreGDrive
         7
-        6
-        1
         0
+        1
+        6
         0
         
             Detail
@@ -1443,47 +9613,100 @@ OSError: [Errno 98] error while attempting to bind on address ('127.0.0.1
 
     
     
-        
+        
             
                 
TestEbookConvertCalibreGDrive - test_convert_email
- PASS - - - - - - -
TestEbookConvertCalibreGDrive - test_convert_failed_and_email
- - PASS - - - - - - -
TestEbookConvertCalibreGDrive - test_convert_only
-
- FAIL + ERROR
-
@@ -38189,7 +5430,7 @@ Traceback (most recent call last): ^^^^^^^^^^^^^^^^ File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.12/site-packages/urllib3/connection.py", line 219, in _new_conn raise NewConnectionError( -urllib3.exceptions.NewConnectionError: HTTPConnection(host='localhost', port=34303): Failed to establish a new connection: [Errno 111] Connection refused +urllib3.exceptions.NewConnectionError: HTTPConnection(host='localhost', port=34451): Failed to establish a new connection: [Errno 111] Connection refused The above exception was the direct cause of the following exception: @@ -38234,7 +5475,7 @@ Traceback (most recent call last): File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.12/site-packages/urllib3/util/retry.py", line 543, in increment raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=34303): Max retries exceeded with url: /session/321979b5-408e-4e9e-83dd-2ef54d7435ac/url (Caused by NewConnectionError("HTTPConnection(host='localhost', port=34303): Failed to establish a new connection: [Errno 111] Connection refused")) +urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=34451): Max retries exceeded with url: /session/7f7e78ce-e8a3-430e-9753-5330c22141d0/url (Caused by NewConnectionError("HTTPConnection(host='localhost', port=34451): Failed to establish a new connection: [Errno 111] Connection refused"))
@@ -38292,7 +5533,7 @@ Traceback (most recent call last): ^^^^^^^^^^^^^^^^ File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.12/site-packages/urllib3/connection.py", line 219, in _new_conn raise NewConnectionError( -urllib3.exceptions.NewConnectionError: HTTPConnection(host='localhost', port=34303): Failed to establish a new connection: [Errno 111] Connection refused +urllib3.exceptions.NewConnectionError: HTTPConnection(host='localhost', port=34451): Failed to establish a new connection: [Errno 111] Connection refused The above exception was the direct cause of the following exception: @@ -38350,7 +5591,7 @@ Traceback (most recent call last): File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.12/site-packages/urllib3/util/retry.py", line 543, in increment raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=34303): Max retries exceeded with url: /session/321979b5-408e-4e9e-83dd-2ef54d7435ac/element (Caused by NewConnectionError("HTTPConnection(host='localhost', port=34303): Failed to establish a new connection: [Errno 111] Connection refused")) +urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=34451): Max retries exceeded with url: /session/7f7e78ce-e8a3-430e-9753-5330c22141d0/element (Caused by NewConnectionError("HTTPConnection(host='localhost', port=34451): Failed to establish a new connection: [Errno 111] Connection refused"))
@@ -38408,7 +5649,7 @@ Traceback (most recent call last): ^^^^^^^^^^^^^^^^ File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.12/site-packages/urllib3/connection.py", line 219, in _new_conn raise NewConnectionError( -urllib3.exceptions.NewConnectionError: HTTPConnection(host='localhost', port=34303): Failed to establish a new connection: [Errno 111] Connection refused +urllib3.exceptions.NewConnectionError: HTTPConnection(host='localhost', port=34451): Failed to establish a new connection: [Errno 111] Connection refused The above exception was the direct cause of the following exception: @@ -38457,7 +5698,7 @@ Traceback (most recent call last): File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.12/site-packages/urllib3/util/retry.py", line 543, in increment raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=34303): Max retries exceeded with url: /session/321979b5-408e-4e9e-83dd-2ef54d7435ac/elements (Caused by NewConnectionError("HTTPConnection(host='localhost', port=34303): Failed to establish a new connection: [Errno 111] Connection refused")) +urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=34451): Max retries exceeded with url: /session/7f7e78ce-e8a3-430e-9753-5330c22141d0/elements (Caused by NewConnectionError("HTTPConnection(host='localhost', port=34451): Failed to establish a new connection: [Errno 111] Connection refused"))
@@ -38541,7 +5782,7 @@ Traceback (most recent call last): ^^^^^^^^^^^^^^^^ File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.12/site-packages/urllib3/connection.py", line 219, in _new_conn raise NewConnectionError( -urllib3.exceptions.NewConnectionError: HTTPConnection(host='localhost', port=34303): Failed to establish a new connection: [Errno 111] Connection refused +urllib3.exceptions.NewConnectionError: HTTPConnection(host='localhost', port=34451): Failed to establish a new connection: [Errno 111] Connection refused The above exception was the direct cause of the following exception: @@ -38587,7 +5828,7 @@ Traceback (most recent call last): File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.12/site-packages/urllib3/util/retry.py", line 543, in increment raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=34303): Max retries exceeded with url: /session/321979b5-408e-4e9e-83dd-2ef54d7435ac/element (Caused by NewConnectionError("HTTPConnection(host='localhost', port=34303): Failed to establish a new connection: [Errno 111] Connection refused")) +urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=34451): Max retries exceeded with url: /session/7f7e78ce-e8a3-430e-9753-5330c22141d0/element (Caused by NewConnectionError("HTTPConnection(host='localhost', port=34451): Failed to establish a new connection: [Errno 111] Connection refused"))
@@ -38645,7 +5886,7 @@ Traceback (most recent call last): ^^^^^^^^^^^^^^^^ File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.12/site-packages/urllib3/connection.py", line 219, in _new_conn raise NewConnectionError( -urllib3.exceptions.NewConnectionError: HTTPConnection(host='localhost', port=34303): Failed to establish a new connection: [Errno 111] Connection refused +urllib3.exceptions.NewConnectionError: HTTPConnection(host='localhost', port=34451): Failed to establish a new connection: [Errno 111] Connection refused The above exception was the direct cause of the following exception: @@ -38703,7 +5944,7 @@ Traceback (most recent call last): File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.12/site-packages/urllib3/util/retry.py", line 543, in increment raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=34303): Max retries exceeded with url: /session/321979b5-408e-4e9e-83dd-2ef54d7435ac/element (Caused by NewConnectionError("HTTPConnection(host='localhost', port=34303): Failed to establish a new connection: [Errno 111] Connection refused")) +urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=34451): Max retries exceeded with url: /session/7f7e78ce-e8a3-430e-9753-5330c22141d0/element (Caused by NewConnectionError("HTTPConnection(host='localhost', port=34451): Failed to establish a new connection: [Errno 111] Connection refused"))
@@ -38787,7 +6028,7 @@ Traceback (most recent call last): ^^^^^^^^^^^^^^^^ File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.12/site-packages/urllib3/connection.py", line 219, in _new_conn raise NewConnectionError( -urllib3.exceptions.NewConnectionError: HTTPConnection(host='localhost', port=34303): Failed to establish a new connection: [Errno 111] Connection refused +urllib3.exceptions.NewConnectionError: HTTPConnection(host='localhost', port=34451): Failed to establish a new connection: [Errno 111] Connection refused The above exception was the direct cause of the following exception: @@ -38845,7 +6086,7 @@ Traceback (most recent call last): File "/home/ozzie/Development/calibre-web-test/venv/lib/python3.12/site-packages/urllib3/util/retry.py", line 543, in increment raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=34303): Max retries exceeded with url: /session/321979b5-408e-4e9e-83dd-2ef54d7435ac/element (Caused by NewConnectionError("HTTPConnection(host='localhost', port=34303): Failed to establish a new connection: [Errno 111] Connection refused")) +urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=34451): Max retries exceeded with url: /session/7f7e78ce-e8a3-430e-9753-5330c22141d0/element (Caused by NewConnectionError("HTTPConnection(host='localhost', port=34451): Failed to establish a new connection: [Errno 111] Connection refused"))
@@ -38857,13 +6098,13 @@ urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', p - + TestSystemdActivation 1 - 0 - 0 1 0 + 0 + 0 Detail @@ -38871,55 +6112,22 @@ urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', p - +
TestSystemdActivation - test_systemd_activation
- -
- ERROR -
- - - - + PASS - + TestThumbnails 8 - 0 - 0 7 + 0 + 0 1 Detail @@ -38928,430 +6136,38 @@ dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:137:16 - +
TestThumbnails - test_cache_non_writable
- -
- ERROR -
- - - - + PASS - +
TestThumbnails - test_cache_of_deleted_book
- -
- ERROR -
- - - - + PASS - +
TestThumbnails - test_cover_cache_on_database_change
- -
- ERROR -
- - - - + PASS - +
TestThumbnails - test_cover_change_on_upload_new_cover
- -
- ERROR -
- - - - + PASS @@ -39365,324 +6181,41 @@ urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', p - +
TestThumbnails - test_cover_on_upload_book
- -
- ERROR -
- - - - + PASS - +
TestThumbnails - test_remove_cover_from_cache
- -
- ERROR -
- - - - + PASS - +
TestThumbnails - test_sideloaded_book
- -
- ERROR -
- - - - + PASS - + TestThumbnailsEnv 1 - 0 - 0 1 0 + 0 + 0 Detail @@ -39690,163 +6223,101 @@ urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', p - +
TestThumbnailsEnv - test_cover_cache_env_on_database_change
- -
- ERROR -
- - - - + PASS - + TestUpdater - 0 + 9 + 8 0 0 1 - 0 - Detail + Detail - + -
TestUpdater - _ErrorHolder
+
TestUpdater - test_check_update_nightly_errors
+ + PASS + + + + + + +
TestUpdater - test_check_update_nightly_request_errors
+ + PASS + + + + + + +
TestUpdater - test_check_update_stable_errors
+ + PASS + + + + + + +
TestUpdater - test_check_update_stable_versions
+ + PASS + + + + + + +
TestUpdater - test_perform_update
+ + PASS + + + + + + +
TestUpdater - test_perform_update_stable_errors
+ + PASS + + + + + + +
TestUpdater - test_perform_update_timeout
- ERROR + SKIP
- From 31f82a2690c608f57666564dd6a8795daa966f82 Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Sat, 8 Aug 2026 16:04:19 +0200 Subject: [PATCH 26/29] Testrun --- test/Calibre-Web TestSummary_Linux.html | 1351 +++++------------------ 1 file changed, 287 insertions(+), 1064 deletions(-) diff --git a/test/Calibre-Web TestSummary_Linux.html b/test/Calibre-Web TestSummary_Linux.html index 414cf8db3..90f349509 100644 --- a/test/Calibre-Web TestSummary_Linux.html +++ b/test/Calibre-Web TestSummary_Linux.html @@ -37,20 +37,20 @@
-

Start Time: 2026-08-07T21:47:56.000001

+

Start Time: 2026-08-08T11:08:24.000001

-

Stop Time: 2026-08-07T23:56:36.000001

+

Stop Time: 2026-08-08T12:58:11.000001

-

Duration: 7h 46 min

+

Duration: 6h 1 min

@@ -234,11 +234,11 @@ - + TestBackupMetadata 21 - 21 - 0 + 20 + 1 0 0 @@ -356,11 +356,32 @@ - +
TestBackupMetadata - test_backup_change_custom_Enum
- PASS + +
+ FAIL +
+ + + + @@ -1391,56 +1412,160 @@ - + TestEbookConvertCalibre + 16 + 16 0 0 0 - 1 - 0 - Detail + Detail - + -
TestEbookConvertCalibre - _ErrorHolder
+
TestEbookConvertCalibre - test_calibre_log
- -
- ERROR -
- - - + PASS + + + + + + +
TestEbookConvertCalibre - test_convert_deactivate
+ PASS + + + + + + +
TestEbookConvertCalibre - test_convert_email
+ + PASS + + + + + + +
TestEbookConvertCalibre - test_convert_failed_and_email
+ + PASS + + + + + + +
TestEbookConvertCalibre - test_convert_format_allowlist
+ + PASS + + + + + + +
TestEbookConvertCalibre - test_convert_only
+ + PASS + + + + + + +
TestEbookConvertCalibre - test_convert_options
+ + PASS + + + + + + +
TestEbookConvertCalibre - test_convert_parameter
+ + PASS + + + + + + +
TestEbookConvertCalibre - test_convert_wrong_excecutable
+ + PASS + + + + + + +
TestEbookConvertCalibre - test_convert_xss
+ + PASS + + + + + + +
TestEbookConvertCalibre - test_email_failed
+ + PASS + + + + + + +
TestEbookConvertCalibre - test_email_only
+ + PASS + + + + + + +
TestEbookConvertCalibre - test_kindle_send_not_configured
+ + PASS + + + + + + +
TestEbookConvertCalibre - test_ssl_smtp_setup_error
+ + PASS + + + + + + +
TestEbookConvertCalibre - test_starttls_smtp_setup_error
+ + PASS + + + + + + +
TestEbookConvertCalibre - test_user_convert_xss
+ + PASS @@ -1524,11 +1649,11 @@ OSError: [Errno 98] error while attempting to bind on address ('127.0.0.1 - + TestEbookConvertGDriveKepubify 3 - 2 - 1 + 3 + 0 0 0 @@ -1547,32 +1672,11 @@ OSError: [Errno 98] error while attempting to bind on address ('127.0.0.1 - +
TestEbookConvertGDriveKepubify - test_convert_only
- -
- FAIL -
- - - - + PASS @@ -1587,11 +1691,11 @@ AssertionError: False is not true - + TestEbookConvertKepubify 4 - 2 - 2 + 4 + 0 0 0 @@ -1610,32 +1714,11 @@ AssertionError: False is not true - +
TestEbookConvertKepubify - test_convert_only
- -
- FAIL -
- - - - + PASS @@ -1649,32 +1732,11 @@ AssertionError: False is not true - +
TestEbookConvertKepubify - test_kobo_kepub_formats
- -
- FAIL -
- - - - + PASS @@ -1857,11 +1919,11 @@ AssertionError: False is not true - + TestEditAuthors 10 - 10 - 0 + 9 + 1 0 0 @@ -1916,11 +1978,32 @@ AssertionError: False is not true - +
TestEditAuthors - test_change_capital_rename_two_co_authors
- PASS + +
+ FAIL +
+ + + + @@ -1962,11 +2045,11 @@ AssertionError: False is not true - + TestEditAuthorsGdrive 7 - 6 - 1 + 7 + 0 0 0 @@ -2003,43 +2086,11 @@ AssertionError: False is not true - +
TestEditAuthorsGdrive - test_change_capital_one_author_two_books_coauthor
- -
- FAIL -
- - - - + PASS @@ -2950,7 +3001,7 @@ First differing element 0:
Traceback (most recent call last):
   File "/home/ozzie/Development/calibre-web-test/test/test_edit_ebooks_gdrive.py", line 911, in test_watch_metadata
     self.assertNotIn('series', book)
-AssertionError: 'series' unexpectedly found in {'id': 5, 'reader': [], 'title': 'testbook', 'author': ['John Döe'], 'rating': 0, 'languages': ['English'], 'identifier': [], 'cover': '/cover/5/og?c=1786130330', 'tag': [], 'publisher': ['Randomhäus'], 'pubdate': 'Jan 19, 2017', 'comment': 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Aenean commodo ligula eget dolor.Aenean massa.Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.Nulla consequat massa quis enim.Donec pede justo, fringilla vel, aliquet nec, vulputate', 'add_shelf': [], 'del_shelf': [], 'edit_enable': True, 'kindle': None, 'kindlebtn': None, 'download': ['EPUB\n                                            (6.7 kB)'], 'read': False, 'archived': False, 'series_all': 'Book 1 of test', 'series_index': '1', 'series': 'test', 'cust_columns': []}
+AssertionError: 'series' unexpectedly found in {'id': 5, 'reader': [], 'title': 'testbook', 'author': ['John Döe'], 'rating': 0, 'languages': ['English'], 'identifier': [], 'cover': '/cover/5/og?c=1786178654', 'tag': [], 'publisher': ['Randomhäus'], 'pubdate': 'Jan 19, 2017', 'comment': 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Aenean commodo ligula eget dolor.Aenean massa.Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.Nulla consequat massa quis enim.Donec pede justo, fringilla vel, aliquet nec, vulputate', 'add_shelf': [], 'del_shelf': [], 'edit_enable': True, 'kindle': None, 'kindlebtn': None, 'download': ['EPUB\n                                            (6.7 kB)'], 'read': False, 'archived': False, 'series_all': 'Book 1 of test', 'series_index': '1', 'series': 'test', 'cust_columns': []}
 
@@ -2962,11 +3013,11 @@ AssertionError: 'series' unexpectedly found in {'id': 5, 're - + TestEmbedMetadata 6 - 3 - 3 + 6 + 0 0 0 @@ -2985,32 +3036,11 @@ AssertionError: 'series' unexpectedly found in {'id': 5, 're - +
TestEmbedMetadata - test_convert_kepub_embed_metadata
- -
- FAIL -
- - - - + PASS @@ -3024,62 +3054,20 @@ AssertionError: False is not true - +
TestEmbedMetadata - test_download_kepub_embed_metadata
- -
- FAIL -
- - - - + PASS - +
TestEmbedMetadata - test_download_permissions_missing_file
- -
- FAIL -
- - - - + PASS @@ -3094,51 +3082,52 @@ AssertionError: 6971 != 5954 - + TestEmbedMetadataGdrive + 4 + 4 0 0 0 - 1 - 0 - Detail + Detail - + -
TestEmbedMetadataGdrive - _ErrorHolder
+
TestEmbedMetadataGdrive - test_convert_file_embed_metadata
- -
- ERROR -
- - - + PASS + + + + + + +
TestEmbedMetadataGdrive - test_convert_kepub_embed_metadata
+ PASS + + + + + + +
TestEmbedMetadataGdrive - test_download_check_metadata
+ + PASS + + + + + + +
TestEmbedMetadataGdrive - test_download_kepub_embed_metadata
+ + PASS @@ -3626,13 +3615,13 @@ FileNotFoundError: [Errno 2] No such file or directory: '/home/ozzie/Develop - + TestLoadMetadataScholar 1 - 0 1 0 0 + 0 Detail @@ -3640,32 +3629,11 @@ FileNotFoundError: [Errno 2] No such file or directory: '/home/ozzie/Develop - +
TestLoadMetadataScholar - test_load_metadata
- -
- FAIL -
- - - - + PASS @@ -4483,11 +4451,11 @@ AssertionError: 10 != 0 - + TestReader 9 - 7 - 1 + 8 + 0 0 1 @@ -4533,32 +4501,11 @@ AssertionError: 10 != 0 - +
TestReader - test_kepub_reader
- -
- FAIL -
- - - - + PASS @@ -4895,9 +4842,9 @@ AssertionError: False is not true
Traceback (most recent call last):
-  File "/home/ozzie/Development/calibre-web-test/test/test_email_ssl.py", line 206, in test_filepicker_two_file
-    self.assertTrue(found, "files folder not found")
-AssertionError: False is not true : files folder not found
+  File "/home/ozzie/Development/calibre-web-test/test/test_email_ssl.py", line 207, in test_filepicker_two_file
+    self.assertTrue(found, f"files folder not found in {elements}")
+AssertionError: False is not true : files folder not found in ['..', '.git', '.idea', '__pycache__', 'build_release', 'test', 'test_reports', 'venv', '.gitignore', '01_08_.log', 'aiosmtd.log', 'combine_results.py', 'gdrive.db', 'lauf_vorher.log', 'ldaptor.log', 'main.py', 'report_template.html', 'result.py']
 
@@ -5253,12 +5200,12 @@ AssertionError: False is not true : files folder not found - + TestSplitLibrary 8 + 6 0 0 - 7 2 Detail @@ -5267,444 +5214,38 @@ AssertionError: False is not true : files folder not found - +
TestSplitLibrary - test_change_ebook
- -
- ERROR -
- - - - + PASS - +
TestSplitLibrary - test_convert_ebook
- -
- ERROR -
- - - - + PASS - +
TestSplitLibrary - test_download_book
- -
- ERROR -
- - - - + PASS - +
TestSplitLibrary - test_email_ebook
- -
- ERROR -
- - - - + PASS @@ -5735,222 +5276,20 @@ urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', p - +
TestSplitLibrary - test_thumbnails
- -
- ERROR -
- - - - + PASS - +
TestSplitLibrary - test_upload_ebook
- -
- ERROR -
- - - - + PASS @@ -5980,122 +5319,6 @@ urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', p - - - -
TestSplitLibrary - TestSplitLibrary
- - -
- ERROR -
- - - - - - - @@ -6986,10 +6209,10 @@ urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', p Total - 534 - 506 - 11 - 9 + 554 + 539 + 4 + 0 11   @@ -7198,7 +6421,7 @@ urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', p From 0c1fba8dded1ad5af1d023b9daa00f260269d1bd Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Sat, 8 Aug 2026 16:09:44 +0200 Subject: [PATCH 27/29] !!! ATTENTION: 'nh3' instead of the deprecated bleach is needed, please install it using pip !!! Updated translation --- cps/translations/ar/LC_MESSAGES/messages.mo | Bin 75354 -> 75264 bytes cps/translations/ar/LC_MESSAGES/messages.po | 771 +++--- cps/translations/cs/LC_MESSAGES/messages.mo | Bin 35143 -> 35066 bytes cps/translations/cs/LC_MESSAGES/messages.po | 771 +++--- cps/translations/de/LC_MESSAGES/messages.mo | Bin 66880 -> 66806 bytes cps/translations/de/LC_MESSAGES/messages.po | 771 +++--- cps/translations/el/LC_MESSAGES/messages.mo | Bin 51454 -> 51354 bytes cps/translations/el/LC_MESSAGES/messages.po | 771 +++--- cps/translations/es/LC_MESSAGES/messages.mo | Bin 68672 -> 68583 bytes cps/translations/es/LC_MESSAGES/messages.po | 771 +++--- cps/translations/fi/LC_MESSAGES/messages.mo | Bin 24224 -> 24224 bytes cps/translations/fi/LC_MESSAGES/messages.po | 771 +++--- cps/translations/fr/LC_MESSAGES/messages.mo | Bin 72001 -> 71923 bytes cps/translations/fr/LC_MESSAGES/messages.po | 771 +++--- cps/translations/gl/LC_MESSAGES/messages.mo | Bin 68031 -> 67948 bytes cps/translations/gl/LC_MESSAGES/messages.po | 771 +++--- cps/translations/hu/LC_MESSAGES/messages.mo | Bin 22150 -> 22150 bytes cps/translations/hu/LC_MESSAGES/messages.po | 789 +++--- cps/translations/id/LC_MESSAGES/messages.mo | Bin 52769 -> 52690 bytes cps/translations/id/LC_MESSAGES/messages.po | 771 +++--- cps/translations/it/LC_MESSAGES/messages.mo | Bin 68454 -> 68379 bytes cps/translations/it/LC_MESSAGES/messages.po | 773 +++--- cps/translations/ja/LC_MESSAGES/messages.mo | Bin 58319 -> 58218 bytes cps/translations/ja/LC_MESSAGES/messages.po | 771 +++--- cps/translations/km/LC_MESSAGES/messages.mo | Bin 21926 -> 21926 bytes cps/translations/km/LC_MESSAGES/messages.po | 789 +++--- cps/translations/ko/LC_MESSAGES/messages.mo | Bin 66518 -> 66420 bytes cps/translations/ko/LC_MESSAGES/messages.po | 771 +++--- cps/translations/nl/LC_MESSAGES/messages.mo | Bin 53703 -> 53628 bytes cps/translations/nl/LC_MESSAGES/messages.po | 771 +++--- cps/translations/no/LC_MESSAGES/messages.mo | Bin 35671 -> 35598 bytes cps/translations/no/LC_MESSAGES/messages.po | 771 +++--- cps/translations/pl/LC_MESSAGES/messages.mo | Bin 67607 -> 67516 bytes cps/translations/pl/LC_MESSAGES/messages.po | 771 +++--- cps/translations/pt/LC_MESSAGES/messages.mo | Bin 57707 -> 57632 bytes cps/translations/pt/LC_MESSAGES/messages.po | 771 +++--- .../pt_BR/LC_MESSAGES/messages.mo | Bin 67888 -> 67813 bytes .../pt_BR/LC_MESSAGES/messages.po | 771 +++--- cps/translations/ru/LC_MESSAGES/messages.mo | Bin 42528 -> 42528 bytes cps/translations/ru/LC_MESSAGES/messages.po | 771 +++--- cps/translations/sk/LC_MESSAGES/messages.mo | Bin 61313 -> 61230 bytes cps/translations/sk/LC_MESSAGES/messages.po | 771 +++--- cps/translations/sl/LC_MESSAGES/messages.mo | Bin 63171 -> 63088 bytes cps/translations/sl/LC_MESSAGES/messages.po | 771 +++--- cps/translations/sv/LC_MESSAGES/messages.mo | Bin 43915 -> 43840 bytes cps/translations/sv/LC_MESSAGES/messages.po | 771 +++--- cps/translations/tr/LC_MESSAGES/messages.mo | Bin 20029 -> 20029 bytes cps/translations/tr/LC_MESSAGES/messages.po | 771 +++--- cps/translations/uk/LC_MESSAGES/messages.mo | Bin 22242 -> 86865 bytes cps/translations/uk/LC_MESSAGES/messages.po | 2379 +++++++++-------- cps/translations/vi/LC_MESSAGES/messages.mo | Bin 29285 -> 29285 bytes cps/translations/vi/LC_MESSAGES/messages.po | 795 +++--- .../zh_Hans_CN/LC_MESSAGES/messages.mo | Bin 60715 -> 60642 bytes .../zh_Hans_CN/LC_MESSAGES/messages.po | 771 +++--- .../zh_Hant_TW/LC_MESSAGES/messages.mo | Bin 52248 -> 52177 bytes .../zh_Hant_TW/LC_MESSAGES/messages.po | 771 +++--- messages.pot | 789 +++--- 57 files changed, 13626 insertions(+), 10421 deletions(-) diff --git a/cps/translations/ar/LC_MESSAGES/messages.mo b/cps/translations/ar/LC_MESSAGES/messages.mo index a5177319e05fc27cf96c4eb403a3dd38edb0641a..26a09bd5aecf013f20d5fd23c2b8448128db7ff7 100644 GIT binary patch delta 13647 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 H*uVn-L%P?= diff --git a/cps/translations/ar/LC_MESSAGES/messages.po b/cps/translations/ar/LC_MESSAGES/messages.po index e0ee51a75..edd7ef681 100644 --- a/cps/translations/ar/LC_MESSAGES/messages.po +++ b/cps/translations/ar/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: 2026-08-01 11:42+0200\n" +"POT-Creation-Date: 2026-08-08 16:08+0200\n" "PO-Revision-Date: 2025-06-07 14:44+0300\n" "Last-Translator: UsamaFoad \n" "Language: ar\n" @@ -16,519 +16,558 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" +"Generated-By: Babel 2.18.0\n" #: cps/about.py:85 msgid "Statistics" msgstr "الإحصائيات" -#: cps/admin.py:151 +#: cps/admin.py:154 msgid "Server restarted, please reload page." msgstr "تم إعادة تشغيل الخادم، يرجى إعادة تحميل الصفحة." -#: cps/admin.py:153 +#: cps/admin.py:156 msgid "Performing Server shutdown, please close window." msgstr "جاري إيقاف تشغيل الخادم، الرجاء إغلاق النافذة." -#: cps/admin.py:161 +#: cps/admin.py:164 msgid "Success! Database Reconnected" msgstr "تم بنجاح! تم إعادة ربط قاعدة البيانات" -#: cps/admin.py:164 +#: cps/admin.py:167 msgid "Unknown command" msgstr "أمر غير معروف" -#: cps/admin.py:175 +#: cps/admin.py:178 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "تم بنجاح! الكتب في قائمة انتظار النسخ الاحتياطي للبيانات الوصفية، يُرجى مراجعة \"المهام\" لمعرفة النتيجة" -#: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 -#: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 -#: cps/uploader.py:117 +#: cps/admin.py:211 cps/editbooks.py:825 cps/editbooks.py:875 +#: cps/editbooks.py:1564 cps/templates/remote_login_verify.html:8 +#: cps/templates/remote_login_verify.html:10 cps/updater.py:615 +#: cps/uploader.py:117 cps/uploader.py:126 msgid "Unknown" msgstr "غير معروف" -#: cps/admin.py:233 +#: cps/admin.py:236 msgid "Admin page" msgstr "صفحة المسؤول" -#: cps/admin.py:253 +#: cps/admin.py:256 msgid "Basic Configuration" msgstr "الاعدادات الأساسية" -#: cps/admin.py:291 +#: cps/admin.py:294 msgid "UI Configuration" msgstr "إعدادات واجهة المستخدم" -#: cps/admin.py:315 cps/admin.py:1002 cps/db.py:809 cps/search.py:150 -#: cps/web.py:750 +#: cps/admin.py:318 cps/admin.py:1005 cps/db.py:809 cps/search.py:150 +#: cps/web.py:752 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "لا يوجد عمود مخصص رقم %(column)d في قاعدة بيانات Calibre" -#: cps/admin.py:333 cps/templates/admin.html:51 +#: cps/admin.py:336 cps/templates/admin.html:51 msgid "Edit Users" msgstr "تحرير المستخدمين" -#: cps/admin.py:378 cps/opds.py:559 cps/templates/grid.html:14 +#: cps/admin.py:381 cps/opds.py:559 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "الكل" -#: cps/admin.py:401 cps/admin.py:1432 +#: cps/admin.py:404 cps/admin.py:1460 msgid "User not found" msgstr "لم يتم العثور على المستخدم" -#: cps/admin.py:415 +#: cps/admin.py:418 #, python-brace-format msgid "{} users deleted successfully" msgstr "تم حذف {} مستخدم(ين) بنجاح" -#: cps/admin.py:438 cps/templates/config_view_edit.html:133 +#: cps/admin.py:441 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "إظهار الكل" -#: cps/admin.py:459 cps/admin.py:465 +#: cps/admin.py:462 cps/admin.py:468 msgid "Malformed request" msgstr "طلب مشوه" -#: cps/admin.py:477 cps/admin.py:2078 +#: cps/admin.py:480 cps/admin.py:2156 msgid "Guest Name can't be changed" msgstr "لا يمكن تغيير اسم الضيف" -#: cps/admin.py:489 +#: cps/admin.py:492 msgid "Guest can't have this role" msgstr "لا يمكن للضيف الحصول على هذا الدور" -#: cps/admin.py:501 cps/admin.py:2032 +#: cps/admin.py:504 cps/admin.py:2110 msgid "No admin user remaining, can't remove admin role" msgstr "لم يتبق مستخدم مسؤول، ولا يمكن إزالة دور المسؤول" -#: cps/admin.py:505 cps/admin.py:519 +#: cps/admin.py:508 cps/admin.py:522 msgid "Value has to be true or false" msgstr "القيمة يجب أن تكون صحيحة أو خاطئة" -#: cps/admin.py:507 +#: cps/admin.py:510 msgid "Invalid role" msgstr "دور غير صالح" -#: cps/admin.py:511 +#: cps/admin.py:514 msgid "Guest can't have this view" msgstr "لا يمكن للضيف الحصول على هذا العرض" -#: cps/admin.py:521 +#: cps/admin.py:524 msgid "Invalid view" msgstr "عرض غير صالح" -#: cps/admin.py:524 +#: cps/admin.py:527 msgid "Guest's Locale is determined automatically and can't be set" msgstr "يتم تحديد موقع الضيف تلقائيًا ولا يمكن تعيينه" -#: cps/admin.py:528 +#: cps/admin.py:531 msgid "No Valid Locale Given" msgstr "لم يتم تحديد موقع صالح" -#: cps/admin.py:539 +#: cps/admin.py:542 msgid "No Valid Book Language Given" msgstr "لم يتم تقديم لغة الكتاب الصالحة" -#: cps/admin.py:541 cps/editbooks.py:243 cps/editbooks.py:428 -#: cps/editbooks.py:430 +#: cps/admin.py:544 cps/editbooks.py:260 cps/editbooks.py:445 +#: cps/editbooks.py:447 msgid "Parameter not found" msgstr "لم يتم العثور على المُتغير" -#: cps/admin.py:578 +#: cps/admin.py:581 msgid "Invalid Read Column" msgstr "عمود قراءة خاطئ" -#: cps/admin.py:584 +#: cps/admin.py:587 msgid "Invalid Restricted Column" msgstr "عمود مقيد خاطئ" -#: cps/admin.py:604 cps/admin.py:1903 +#: cps/admin.py:607 cps/admin.py:1981 msgid "Calibre-Web configuration updated" msgstr "تم تحديث تكوين Calibre-Web" -#: cps/admin.py:616 +#: cps/admin.py:619 msgid "Do you really want to delete the Kobo Token?" msgstr "هل تريد حقًا حذف رمز Kobo؟" -#: cps/admin.py:618 +#: cps/admin.py:621 msgid "Do you really want to delete this domain?" msgstr "هل تريد حقًا حذف هذا النطاق؟" -#: cps/admin.py:620 +#: cps/admin.py:623 msgid "Do you really want to delete this user?" msgstr "هل تريد حقًا حذف هذا المستخدم؟" -#: cps/admin.py:622 +#: cps/admin.py:625 msgid "Do you really want to delete this book?" msgstr "" -#: cps/admin.py:624 +#: cps/admin.py:627 msgid "Are you sure you want to delete this shelf?" msgstr "هل أنت متأكد أنك تريد حذف هذا الرف؟" -#: cps/admin.py:626 +#: cps/admin.py:629 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "هل أنت متأكد أنك تريد تغيير الإعدادات المحلية للمستخدم (المستخدمين) المحدد(ين)؟" -#: cps/admin.py:628 +#: cps/admin.py:631 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "هل أنت متأكد أنك تريد تغيير لغات الكتاب المرئية للمستخدم (للمستخدمين) المحدد(ين)؟" -#: cps/admin.py:630 +#: cps/admin.py:633 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "هل أنت متأكد أنك تريد تغيير الدور المحدد للمستخدم (المستخدمين) المحدد(ين)؟" -#: cps/admin.py:632 +#: cps/admin.py:635 msgid "Are you sure you want to change the archive status for the selected book(s)?" msgstr "" -#: cps/admin.py:634 +#: cps/admin.py:637 msgid "Are you sure you want to change the read status for the selected book(s)?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:639 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "هل أنت متأكد أنك تريد تغيير القيود المحددة للمستخدم(ين) المحدد(ين)؟" -#: cps/admin.py:638 +#: cps/admin.py:641 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "هل أنت متأكد أنك تريد تغيير قيود الرؤية المحددة للمستخدم (المستخدمين) المحدد(ين)؟" -#: cps/admin.py:641 +#: cps/admin.py:644 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "هل أنت متأكد أنك تريد تغيير سلوك مزامنة الرف للمستخدم (المستخدمين) المحدد(ين)؟" -#: cps/admin.py:643 +#: cps/admin.py:646 msgid "Are you sure you want to change Calibre library location?" msgstr "هل أنت متأكد أنك تريد تغيير موقع مكتبة Calibre؟" -#: cps/admin.py:645 +#: cps/admin.py:648 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "سيقوم Calibre-Web بالبحث عن أغلفة محدثة وتحديث صور الغلاف المصغرة، وقد يستغرق هذا بعض الوقت؟" -#: cps/admin.py:648 +#: cps/admin.py:651 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "هل أنت متأكد أنك تريد حذف قاعدة بيانات مزامنة Calibre-Web لفرض المزامنة الكاملة مع قارئ Kobo الخاص بك؟" -#: cps/admin.py:891 cps/admin.py:897 cps/admin.py:907 cps/admin.py:917 +#: cps/admin.py:894 cps/admin.py:900 cps/admin.py:910 cps/admin.py:920 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "منع" -#: cps/admin.py:893 cps/admin.py:899 cps/admin.py:909 cps/admin.py:919 +#: cps/admin.py:896 cps/admin.py:902 cps/admin.py:912 cps/admin.py:922 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "سماح" -#: cps/admin.py:952 +#: cps/admin.py:955 #, python-brace-format msgid "{} sync entries deleted" msgstr "تم حذف {} إدخالات المزامنة" -#: cps/admin.py:993 +#: cps/admin.py:996 msgid "Tag not found" msgstr "لم يتم العثور على العلامة" -#: cps/admin.py:1011 +#: cps/admin.py:1014 msgid "Invalid Action" msgstr "إجراء غير صالح" -#: cps/admin.py:1138 +#: cps/admin.py:1137 +#, python-format +msgid "Invalid reverse proxy trusted IP/CIDR entry: %(entry)s" +msgstr "" + +#: cps/admin.py:1148 +#, python-format +msgid "Invalid %(label)s: %(value)s" +msgstr "" + +#: cps/admin.py:1166 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "لم يتم تكوين ملف client_secrets.json لتطبيق الويب" -#: cps/admin.py:1183 +#: cps/admin.py:1211 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "موقع ملف السجل غير صالح، يرجى إدخال المسار الصحيح" -#: cps/admin.py:1189 +#: cps/admin.py:1217 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "موقع ملف سجل الوصول غير صالح، يرجى إدخال المسار الصحيح" -#: cps/admin.py:1223 +#: cps/admin.py:1251 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "الرجاء إدخال موفر LDAP والمنفذ والاسم المميز ومعرف كائن المستخدم" -#: cps/admin.py:1229 +#: cps/admin.py:1257 msgid "Please Enter a LDAP Service Account and Password" msgstr "الرجاء إدخال حساب خدمة LDAP وكلمة المرور" -#: cps/admin.py:1232 +#: cps/admin.py:1260 msgid "Please Enter a LDAP Service Account" msgstr "الرجاء إدخال حساب خدمة LDAP" -#: cps/admin.py:1237 +#: cps/admin.py:1265 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "يجب أن يحتوي مرشح كائن مجموعة LDAP على معرف تنسيق \"%s\" واحد" -#: cps/admin.py:1239 +#: cps/admin.py:1267 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "مرشح كائن مجموعة LDAP يحتوي على أقواس غير متطابقة" -#: cps/admin.py:1243 +#: cps/admin.py:1271 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "يجب أن يحتوي مرشح كائن مستخدم LDAP على معرف تنسيق \"%s\" واحد" -#: cps/admin.py:1245 +#: cps/admin.py:1273 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "مرشح كائن مستخدم LDAP يحتوي على أقواس غير متطابقة" -#: cps/admin.py:1252 +#: cps/admin.py:1280 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "يجب أن يحتوي مرشح مستخدم عضو LDAP على معرف تنسيق \"%s\" واحد" -#: cps/admin.py:1254 +#: cps/admin.py:1282 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "مرشح مستخدم عضو LDAP لديه أقواس غير متطابقة" -#: cps/admin.py:1261 +#: cps/admin.py:1289 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "شهادة LDAP CAC أو الشهادة أو موقع المفتاح غير صالح، يرجى إدخال المسار الصحيح" -#: cps/admin.py:1292 cps/templates/admin.html:53 +#: cps/admin.py:1320 cps/templates/admin.html:53 msgid "Add New User" msgstr "إضافة مستخدم جديد" -#: cps/admin.py:1301 cps/templates/admin.html:100 +#: cps/admin.py:1329 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "تعديل إعدادات خادم البريد الإلكتروني" -#: cps/admin.py:1320 +#: cps/admin.py:1348 msgid "Success! Gmail Account Verified." msgstr "تم التحقق بنجاح! تم التحقق من حساب Gmail." -#: cps/admin.py:1340 cps/admin.py:1343 cps/admin.py:1728 cps/admin.py:1887 -#: cps/admin.py:1985 cps/admin.py:2106 cps/editbooks.py:169 -#: cps/editbooks.py:755 cps/editbooks.py:1474 cps/shelf.py:90 cps/shelf.py:144 +#: cps/admin.py:1368 cps/admin.py:1371 cps/admin.py:1756 cps/admin.py:1965 +#: cps/admin.py:2063 cps/admin.py:2184 cps/editbooks.py:170 +#: cps/editbooks.py:772 cps/editbooks.py:1518 cps/shelf.py:90 cps/shelf.py:144 #: cps/shelf.py:194 cps/shelf.py:237 cps/shelf.py:287 cps/shelf.py:327 -#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:160 cps/web.py:1526 +#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:161 cps/web.py:1536 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "عفواً! خطأ في قاعدة البيانات: %(error)s." -#: cps/admin.py:1350 +#: cps/admin.py:1378 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "تم وضع البريد الإلكتروني التجريبي في قائمة الانتظار لإرساله إلى %(email)s، يرجى التحقق من المهام للحصول على النتيجة" -#: cps/admin.py:1353 +#: cps/admin.py:1381 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "حدث خطأ أثناء إرسال البريد الإلكتروني الاختباري: %(res)s" -#: cps/admin.py:1355 +#: cps/admin.py:1383 msgid "Please configure your e-mail address first..." msgstr "يرجى تكوين عنوان بريدك الإلكتروني أولاً..." -#: cps/admin.py:1357 +#: cps/admin.py:1385 msgid "Email Server Settings updated" msgstr "تم تحديث إعدادات خادم البريد الإلكتروني" -#: cps/admin.py:1380 cps/templates/admin.html:195 +#: cps/admin.py:1408 cps/templates/admin.html:211 msgid "Edit Scheduled Tasks Settings" msgstr "تحرير إعدادات المهام المجدولة" -#: cps/admin.py:1392 +#: cps/admin.py:1420 msgid "Invalid start time for task specified" msgstr "وقت بدء غير صالح للمهمة المحددة" -#: cps/admin.py:1397 +#: cps/admin.py:1425 msgid "Invalid duration for task specified" msgstr "مدة غير صالحة للمهمة المحددة" -#: cps/admin.py:1407 +#: cps/admin.py:1435 msgid "Scheduled tasks settings updated" msgstr "تم تحديث إعدادات المهام المجدولة" -#: cps/admin.py:1417 cps/admin.py:1466 cps/admin.py:2102 cps/web.py:1325 +#: cps/admin.py:1445 cps/admin.py:1494 cps/admin.py:2180 cps/web.py:1335 msgid "Oops! An unknown error occurred. Please try again later." msgstr "عفواً! حدث خطأ غير معروف. يُرجى المحاولة لاحقًا." -#: cps/admin.py:1421 +#: cps/admin.py:1449 msgid "Settings DB is not Writeable" msgstr "قاعدة بيانات الإعدادات غير قابلة للكتابة" -#: cps/admin.py:1451 cps/admin.py:2094 +#: cps/admin.py:1479 cps/admin.py:2172 #, python-format msgid "Edit User %(nick)s" msgstr "تعديل المستخدم %(nick)s" -#: cps/admin.py:1463 +#: cps/admin.py:1491 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "تم بنجاح! تم إعادة تعيين كلمة المرور للمستخدم %(user)s" -#: cps/admin.py:1469 +#: cps/admin.py:1497 msgid "Oops! Please configure the SMTP mail settings." msgstr "عفواً! يُرجى ضبط إعدادات بريد SMTP." -#: cps/admin.py:1480 +#: cps/admin.py:1508 msgid "Logfile viewer" msgstr "عارض ملف السجل" -#: cps/admin.py:1546 +#: cps/admin.py:1574 msgid "Requesting update package" msgstr "طلب حزمة التحديث" -#: cps/admin.py:1547 +#: cps/admin.py:1575 msgid "Downloading update package" msgstr "تنزيل حزمة التحديث" -#: cps/admin.py:1548 +#: cps/admin.py:1576 msgid "Unzipping update package" msgstr "فك ضغط حزمة التحديث" -#: cps/admin.py:1549 +#: cps/admin.py:1577 msgid "Replacing files" msgstr "استبدال الملفات" -#: cps/admin.py:1550 +#: cps/admin.py:1578 msgid "Database connections are closed" msgstr "تم إغلاق اتصالات قاعدة البيانات" -#: cps/admin.py:1551 +#: cps/admin.py:1579 msgid "Stopping server" msgstr "إيقاف الخادم" -#: cps/admin.py:1552 +#: cps/admin.py:1580 msgid "Update finished, please press okay and reload page" msgstr "إيقاف الخادم تم الانتهاء من التحديث، الرجاء الضغط على موافق وإعادة تحميل الصفحة" -#: cps/admin.py:1553 cps/admin.py:1554 cps/admin.py:1555 cps/admin.py:1556 -#: cps/admin.py:1557 cps/admin.py:1558 +#: cps/admin.py:1581 cps/admin.py:1582 cps/admin.py:1583 cps/admin.py:1584 +#: cps/admin.py:1585 cps/admin.py:1586 msgid "Update failed:" msgstr "فشل التحديث:" -#: cps/admin.py:1553 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1581 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "خطأ HTTP" -#: cps/admin.py:1554 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1582 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "خطأ في الاتصال" -#: cps/admin.py:1555 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1583 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "انتهاء المهلة أثناء إنشاء الاتصال" -#: cps/admin.py:1556 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1584 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "خطأ عام" -#: cps/admin.py:1557 +#: cps/admin.py:1585 msgid "Update file could not be saved in temp dir" msgstr "لم يتم حفظ ملف التحديث في الدليل المؤقت" -#: cps/admin.py:1558 +#: cps/admin.py:1586 msgid "Files could not be replaced during update" msgstr "لم يكن من الممكن استبدال الملفات أثناء التحديث" -#: cps/admin.py:1582 +#: cps/admin.py:1610 msgid "Failed to extract at least One LDAP User" msgstr "فشل استخراج مستخدم LDAP واحد على الأقل" -#: cps/admin.py:1627 +#: cps/admin.py:1655 msgid "Failed to Create at Least One LDAP User" msgstr "فشل إنشاء مستخدم LDAP واحد على الأقل" -#: cps/admin.py:1640 +#: cps/admin.py:1668 #, python-format msgid "Error: %(ldaperror)s" msgstr "خطأ: %(ldaperror)s" -#: cps/admin.py:1644 +#: cps/admin.py:1672 msgid "Error: No user returned in response of LDAP server" msgstr "خطأ: لم يتم إرجاع أي مستخدم استجابةً لخادم LDAP" -#: cps/admin.py:1680 +#: cps/admin.py:1708 msgid "At Least One LDAP User Not Found in Database" msgstr "لم يتم العثور على مستخدم LDAP واحد على الأقل في قاعدة البيانات" -#: cps/admin.py:1682 +#: cps/admin.py:1710 #, python-brace-format msgid "{} User Successfully Imported" msgstr "{} تم استيراد المستخدم بنجاح" -#: cps/admin.py:1740 +#: cps/admin.py:1768 msgid "Books path not valid" msgstr "مسار الكتب غير صالح" -#: cps/admin.py:1746 +#: cps/admin.py:1774 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "موقع قاعدة البيانات غير صالح، يرجى إدخال المسار الصحيح" -#: cps/admin.py:1774 +#: cps/admin.py:1802 msgid "DB is not Writeable" msgstr "قاعدة البيانات غير قابلة للكتابة" -#: cps/admin.py:1788 +#: cps/admin.py:1816 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "موقع الملف الرئيسي غير صالح، يرجى إدخال المسار الصحيح" -#: cps/admin.py:1792 +#: cps/admin.py:1820 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "موقع ملف الشهادة غير صالح، يرجى إدخال المسار الصحيح" -#: cps/admin.py:1872 +#: cps/admin.py:1846 +msgid "Kepubify binary not found" +msgstr "" + +#: cps/admin.py:1894 +msgid "reverse proxy login header name" +msgstr "" + +#: cps/admin.py:1904 +msgid "reverse proxy shared secret header name" +msgstr "" + +#: cps/admin.py:1913 +msgid "Please configure both reverse proxy shared secret header name and secret" +msgstr "" + +#: cps/admin.py:1917 +msgid "Please configure reverse proxy shared secret header name and secret or disable the feature" +msgstr "" + +#: cps/admin.py:1922 +msgid "Please configure at least one trusted reverse proxy IP or CIDR" +msgstr "" + +#: cps/admin.py:1946 msgid "Password length has to be between 1 and 40" msgstr "يجب أن يكون طول كلمة المرور بين 1 و 40" -#: cps/admin.py:1926 +#: cps/admin.py:1957 cps/helper.py:1007 +msgid "Please specify a valid UnRar directory" +msgstr "" + +#: cps/admin.py:2004 msgid "Database Settings updated" msgstr "تم تحديث إعدادات قاعدة البيانات" -#: cps/admin.py:1934 +#: cps/admin.py:2012 msgid "Database Configuration" msgstr "تكوين قاعدة البيانات" -#: cps/admin.py:1949 cps/web.py:1295 +#: cps/admin.py:2027 cps/web.py:1305 msgid "Oops! Please complete all fields." msgstr "عفواً! الرجاء تعبئة جميع الحقول." -#: cps/admin.py:1958 +#: cps/admin.py:2036 msgid "E-mail is not from valid domain" msgstr "البريد الإلكتروني ليس من نطاق صالح" -#: cps/admin.py:1964 +#: cps/admin.py:2042 msgid "Add new user" msgstr "إضافة مستخدم جديد" -#: cps/admin.py:1975 +#: cps/admin.py:2053 #, python-format msgid "User '%(user)s' created" msgstr "تم إنشاء المستخدم '%(user)s'" -#: cps/admin.py:1981 +#: cps/admin.py:2059 msgid "Oops! An account already exists for this Email. or name." msgstr "عفواً! يوجد حساب بالفعل لهذا البريد الإلكتروني أو الاسم." -#: cps/admin.py:2011 +#: cps/admin.py:2089 #, python-format msgid "User '%(nick)s' deleted" msgstr "تم حذف المستخدم '%(nick)s'" -#: cps/admin.py:2014 +#: cps/admin.py:2092 msgid "Can't delete Guest User" msgstr "لا يمكن حذف المستخدم الضيف" -#: cps/admin.py:2017 +#: cps/admin.py:2095 msgid "No admin user remaining, can't delete user" msgstr "لم يتبق مستخدم مسؤول، لا يمكن حذف المستخدم" -#: cps/admin.py:2072 cps/web.py:1475 +#: cps/admin.py:2150 cps/web.py:1485 msgid "Email can't be empty and has to be a valid Email" msgstr "لا يمكن أن يكون البريد الإلكتروني فارغًا ويجب أن يكون بريدًا إلكترونيًا صالحًا" -#: cps/admin.py:2098 +#: cps/admin.py:2176 #, python-format msgid "User '%(nick)s' updated" msgstr "تم تحديث المستخدم '%(nick)s'" @@ -541,145 +580,153 @@ msgstr "تم تحديث المستخدم '%(nick)s'" msgid "Search" msgstr "بحث" -#: cps/converter.py:31 +#: cps/converter.py:32 msgid "not installed" msgstr "غير مثبت" -#: cps/converter.py:32 +#: cps/converter.py:33 msgid "Execution permissions missing" msgstr "أذونات التنفيذ مفقودة" -#: cps/db.py:1129 cps/templates/config_edit.html:207 +#: cps/db.py:1129 cps/templates/config_edit.html:229 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:565 cps/web.py:599 cps/web.py:644 cps/web.py:684 cps/web.py:711 -#: cps/web.py:998 cps/web.py:1028 cps/web.py:1073 cps/web.py:1101 -#: cps/web.py:1140 +#: cps/web.py:567 cps/web.py:601 cps/web.py:646 cps/web.py:686 cps/web.py:713 +#: cps/web.py:1000 cps/web.py:1030 cps/web.py:1075 cps/web.py:1103 +#: cps/web.py:1142 msgid "None" msgstr "غير موجود" -#: cps/editbooks.py:155 +#: cps/editbooks.py:156 #, python-format msgid "File %(file)s uploaded" msgstr "تم تحميل الملف %(file)s" -#: cps/editbooks.py:184 +#: cps/editbooks.py:185 msgid "Source or destination format for conversion missing" msgstr "تنسيق المصدر أو الوجهة للتحويل مفقود" -#: cps/editbooks.py:192 +#: cps/editbooks.py:189 cps/editbooks.py:197 +msgid "Source format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:201 +msgid "Destination format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:209 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "تم وضع الكتاب في قائمة الانتظار بنجاح للتحويل إلى %(book_format)s" -#: cps/editbooks.py:196 +#: cps/editbooks.py:213 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "حدث خطأ أثناء تحويل هذا الكتاب: %(res)s" -#: cps/editbooks.py:297 +#: cps/editbooks.py:314 msgid "Changes successfully applied" msgstr "" -#: cps/editbooks.py:317 +#: cps/editbooks.py:334 msgid "Value is missing on request" msgstr "" -#: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 -#: cps/editbooks.py:1146 cps/web.py:532 cps/web.py:1567 cps/web.py:1613 -#: cps/web.py:1663 +#: cps/editbooks.py:336 cps/editbooks.py:343 cps/editbooks.py:644 +#: cps/editbooks.py:1170 cps/web.py:534 cps/web.py:1577 cps/web.py:1623 +#: cps/web.py:1673 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "عفواً! الكتاب المحدد غير متوفر. الملف غير موجود أو غير قابل للوصول" -#: cps/editbooks.py:673 cps/editbooks.py:1503 +#: cps/editbooks.py:690 cps/editbooks.py:1547 msgid "User has no rights to upload cover" msgstr "ليس لدى المستخدم الحق في تحميل الغلاف" -#: cps/editbooks.py:694 cps/editbooks.py:938 +#: cps/editbooks.py:711 cps/editbooks.py:961 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "المعرفات ليست حساسة لحالة الأحرف، مما يؤدي إلى استبدال المعرف القديم" -#: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 +#: cps/editbooks.py:726 cps/editbooks.py:935 cps/editbooks.py:1306 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "'%(langname)s' ليست لغة صالحة" -#: cps/editbooks.py:737 +#: cps/editbooks.py:754 msgid "Metadata successfully updated" msgstr "تم تحديث البيانات الوصفية بنجاح" -#: cps/editbooks.py:760 +#: cps/editbooks.py:777 #, python-brace-format msgid "Error editing book: {}" msgstr "خطأ في تحرير الكتاب: {}" -#: cps/editbooks.py:856 +#: cps/editbooks.py:879 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "من المحتمل أن يكون الكتاب الذي تم تحميله موجودًا في المكتبة، لذا فكر في التغيير قبل تحميل كتاب جديد: " -#: cps/editbooks.py:950 cps/editbooks.py:1420 +#: cps/editbooks.py:973 cps/editbooks.py:1464 msgid "File type isn't allowed to be uploaded to this server" msgstr "لا يُسمح بتحميل نوع الملف إلى هذا الخادم" -#: cps/editbooks.py:956 cps/editbooks.py:1431 +#: cps/editbooks.py:979 cps/editbooks.py:1475 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "لا يُسمح بتحميل ملحق الملف '%(ext)s' إلى هذا الخادم" -#: cps/editbooks.py:960 cps/editbooks.py:1436 +#: cps/editbooks.py:983 cps/editbooks.py:1480 msgid "File to be uploaded must have an extension" msgstr "يجب أن يكون للملف المراد تحميله امتداد" -#: cps/editbooks.py:968 +#: cps/editbooks.py:992 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "لم يتم حفظ الملف %(filename)s في الدليل المؤقت" -#: cps/editbooks.py:988 +#: cps/editbooks.py:1012 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "فشل نقل ملف الغلاف %(file)s: %(error)s" -#: cps/editbooks.py:1041 +#: cps/editbooks.py:1065 msgid "Book Format Successfully Deleted" msgstr "تم حذف تنسيق الكتاب بنجاح" -#: cps/editbooks.py:1044 cps/editbooks.py:1061 +#: cps/editbooks.py:1068 cps/editbooks.py:1085 msgid "Book Successfully Deleted" msgstr "تم حذف الكتاب بنجاح" -#: cps/editbooks.py:1065 +#: cps/editbooks.py:1089 msgid "You are missing permissions to delete books" msgstr "أنت تفتقد الأذونات اللازمة لحذف الكتب" -#: cps/editbooks.py:1139 +#: cps/editbooks.py:1163 #, python-brace-format msgid "Book with id \"{}\" could not be deleted: not found" msgstr "" -#: cps/editbooks.py:1181 +#: cps/editbooks.py:1205 msgid "edit metadata" msgstr "تحرير البيانات الوصفية" -#: cps/editbooks.py:1234 +#: cps/editbooks.py:1267 #, python-format msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "مؤشر السلسلة: %(seriesindex)s ليس رقمًا صالحًا، تخطي" -#: cps/editbooks.py:1425 +#: cps/editbooks.py:1469 msgid "User has no rights to upload additional file formats" msgstr "ليس للمستخدم الحق في تحميل تنسيقات ملفات إضافية" -#: cps/editbooks.py:1449 +#: cps/editbooks.py:1493 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "فشل إنشاء المسار %(path)s (تم رفض الإذن)." -#: cps/editbooks.py:1456 +#: cps/editbooks.py:1500 #, python-format msgid "Failed to store file %(file)s." msgstr "فشل تخزين الملف %(file)s." -#: cps/editbooks.py:1481 +#: cps/editbooks.py:1525 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "تمت إضافة تنسيق الملف %(ext)s إلى %(book)s" @@ -690,9 +737,9 @@ msgstr "يرجى الانتظار دقيقة واحدة لتسجيل مستخد #: cps/error_handler.py:108 cps/templates/layout.html:69 #: cps/templates/layout.html:104 cps/templates/login.html:27 -#: cps/templates/register.html:17 cps/web.py:1292 cps/web.py:1296 -#: cps/web.py:1302 cps/web.py:1326 cps/web.py:1330 cps/web.py:1343 -#: cps/web.py:1346 +#: cps/templates/register.html:17 cps/web.py:1302 cps/web.py:1306 +#: cps/web.py:1312 cps/web.py:1336 cps/web.py:1340 cps/web.py:1353 +#: cps/web.py:1356 msgid "Register" msgstr "تسجيل" @@ -713,7 +760,7 @@ msgstr "لم يتم التحقق من نطاق الاتصال، يرجى اتب msgid "%(format)s format not found for book id: %(book)d" msgstr "لم يتم العثور على تنسيق %(format)s لمعرف الكتاب: %(book)d" -#: cps/helper.py:94 cps/tasks/convert.py:91 +#: cps/helper.py:94 cps/tasks/convert.py:92 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "لم يتم العثور على %(format)s على Google Drive: %(fn)s" @@ -899,10 +946,6 @@ msgstr "ملفات jpg/jpeg فقط مدعومة كملفات غلاف" msgid "Cover" msgstr "الغلاف" -#: cps/helper.py:1006 -msgid "UnRar binary file not found" -msgstr "ملف UnRar الثنائي غير موجود" - #: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "خطأ في تنفيذ UnRar" @@ -933,7 +976,7 @@ msgstr "أذونات التنفيذ مفقودة: %(missing)s" msgid "Error executing Calibre" msgstr "خطأ في تنفيذ Calibre" -#: cps/helper.py:1154 cps/templates/admin.html:216 +#: cps/helper.py:1154 cps/templates/admin.html:232 msgid "Queue all books for metadata backup" msgstr "وضع جميع الكتب في قائمة الانتظار لنسخ البيانات الوصفية احتياطيًا" @@ -955,7 +998,7 @@ msgstr "التسجيل باستخدام %(provider)s" msgid "This %(oauth)s account is already linked to a different user" msgstr "" -#: cps/oauth_bb.py:147 cps/remotelogin.py:131 +#: cps/oauth_bb.py:147 cps/remotelogin.py:150 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "تم بنجاح! أنت الآن مسجل الدخول باسم: %(nickname)s" @@ -1023,25 +1066,29 @@ msgstr "خطأ في OAuth الخاص بـ Google: {}" msgid "{} Stars" msgstr "{} نجوم" -#: cps/remotelogin.py:63 cps/templates/layout.html:68 -#: cps/templates/layout.html:103 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1361 -msgid "Login" -msgstr "تسجيل الدخول" - -#: cps/remotelogin.py:75 cps/remotelogin.py:109 +#: cps/remotelogin.py:46 cps/remotelogin.py:128 msgid "Token not found" msgstr "لم يتم العثور على الرمز" -#: cps/remotelogin.py:84 cps/remotelogin.py:117 +#: cps/remotelogin.py:55 cps/remotelogin.py:136 msgid "Token has expired" msgstr "انتهت صلاحية الرمز" -#: cps/remotelogin.py:93 +#: cps/remotelogin.py:86 cps/remotelogin.py:112 cps/templates/layout.html:68 +#: cps/templates/layout.html:103 cps/templates/login.html:4 +#: cps/templates/login.html:21 cps/web.py:1371 +msgid "Login" +msgstr "تسجيل الدخول" + +#: cps/remotelogin.py:100 +msgid "Token already approved" +msgstr "" + +#: cps/remotelogin.py:108 msgid "Success! Please return to your device" msgstr "نجاح! يرجى العودة إلى جهازك" -#: cps/render_template.py:41 cps/web.py:421 +#: cps/render_template.py:41 cps/web.py:423 msgid "Books" msgstr "الكتب" @@ -1066,7 +1113,7 @@ msgstr "الكتب المحملة" msgid "Show Downloaded Books" msgstr "عرض الكتب المحملة" -#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:436 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:438 msgid "Top Rated Books" msgstr "الكتب الأعلى تقييمًا" @@ -1075,7 +1122,7 @@ msgid "Show Top Rated Books" msgstr "عرض الكتب الأعلى تقييمًا" #: cps/render_template.py:61 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:769 +#: cps/templates/index.xml:67 cps/web.py:771 msgid "Read Books" msgstr "الكتب المقروءة" @@ -1084,7 +1131,7 @@ msgid "Show Read and Unread" msgstr "عرض المقروء وغير المقروء" #: cps/render_template.py:65 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:772 +#: cps/templates/index.xml:74 cps/web.py:774 msgid "Unread Books" msgstr "الكتب غير المقروءة" @@ -1102,7 +1149,7 @@ msgid "Show Random Books" msgstr "عرض الكتب العشوائية" #: cps/render_template.py:71 cps/templates/book_table.html:93 -#: cps/templates/index.xml:97 cps/web.py:1144 +#: cps/templates/index.xml:97 cps/web.py:1146 msgid "Categories" msgstr "الفئات" @@ -1112,7 +1159,7 @@ msgstr "عرض قسم الفئات" #: cps/render_template.py:74 cps/templates/book_edit.html:86 #: cps/templates/book_table.html:94 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1034 cps/web.py:1046 +#: cps/templates/search_form.html:70 cps/web.py:1036 cps/web.py:1048 msgid "Series" msgstr "السلاسل" @@ -1130,7 +1177,7 @@ msgid "Show Author Section" msgstr "عرض قسم المؤلفين" #: cps/render_template.py:81 cps/templates/book_table.html:98 -#: cps/templates/index.xml:88 cps/web.py:1002 +#: cps/templates/index.xml:88 cps/web.py:1004 msgid "Publishers" msgstr "الناشرون" @@ -1140,7 +1187,7 @@ msgstr "عرض قسم الناشرين" #: cps/render_template.py:84 cps/templates/book_table.html:96 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1116 +#: cps/web.py:1118 msgid "Languages" msgstr "اللغات" @@ -1164,7 +1211,7 @@ msgstr "تنسيقات الملفات" msgid "Show File Formats Section" msgstr "عرض قسم تنسيقات الملفات" -#: cps/render_template.py:95 cps/web.py:795 +#: cps/render_template.py:95 cps/web.py:797 msgid "Archived Books" msgstr "الكتب المؤرشفة" @@ -1172,7 +1219,7 @@ msgstr "الكتب المؤرشفة" msgid "Show Archived Books" msgstr "عرض الكتب المؤرشفة" -#: cps/render_template.py:100 cps/web.py:831 +#: cps/render_template.py:100 cps/web.py:833 msgid "Books List" msgstr "قائمة الكتب" @@ -1405,150 +1452,154 @@ msgstr "يتوفر تحديث جديد. انقر على الزر أدناه لل msgid "No release information available" msgstr "لا توجد معلومات إصدار متاحة" -#: cps/templates/index.html:6 cps/web.py:448 +#: cps/templates/index.html:6 cps/web.py:450 msgid "Discover (Random Books)" msgstr "اكتشف (كتب عشوائية)" -#: cps/web.py:484 +#: cps/web.py:486 msgid "Hot Books (Most Downloaded)" msgstr "الكتب الرائجة (الأكثر تحميلًا)" -#: cps/web.py:515 +#: cps/web.py:517 #, python-format msgid "Downloaded books by %(user)s" msgstr "الكتب المحملة بواسطة %(user)s" -#: cps/web.py:548 +#: cps/web.py:550 #, python-format msgid "Author: %(name)s" msgstr "المؤلف: %(name)s" -#: cps/web.py:584 +#: cps/web.py:586 #, python-format msgid "Publisher: %(name)s" msgstr "الناشر: %(name)s" -#: cps/web.py:612 +#: cps/web.py:614 #, python-format msgid "Series: %(serie)s" msgstr "السلسلة: %(serie)s" -#: cps/web.py:626 +#: cps/web.py:628 msgid "Rating: None" msgstr "التقييم: لا يوجد" -#: cps/web.py:635 +#: cps/web.py:637 #, python-format msgid "Rating: %(rating)s stars" msgstr "التقييم: %(rating)s نجوم" -#: cps/web.py:666 +#: cps/web.py:668 #, python-format msgid "File format: %(format)s" msgstr "تنسيق الملف: %(format)s" -#: cps/web.py:701 +#: cps/web.py:703 #, python-format msgid "Category: %(name)s" msgstr "الفئة: %(name)s" -#: cps/web.py:730 +#: cps/web.py:732 #, python-format msgid "Language: %(name)s" msgstr "اللغة: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:974 +#: cps/templates/admin.html:16 cps/web.py:976 msgid "Downloads" msgstr "التحميلات" -#: cps/web.py:1076 +#: cps/web.py:1078 msgid "Ratings list" msgstr "قائمة التقييمات" -#: cps/web.py:1103 +#: cps/web.py:1105 msgid "File formats list" msgstr "قائمة تنسيقات الملفات" -#: cps/web.py:1264 +#: cps/web.py:1272 +msgid "Book format not supported" +msgstr "" + +#: cps/web.py:1274 msgid "Please configure the SMTP mail settings first..." msgstr "يرجى تهيئة إعدادات بريد SMTP أولاً..." -#: cps/web.py:1270 +#: cps/web.py:1280 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "نجاح! تم وضع الكتاب في قائمة الانتظار للإرسال إلى %(eReadermail)s" -#: cps/web.py:1273 +#: cps/web.py:1283 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "عفوًا! حدث خطأ أثناء إرسال الكتاب: %(res)s" -#: cps/web.py:1275 +#: cps/web.py:1285 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "عفوًا! يرجى تحديث ملفك الشخصي ببريد إلكتروني صالح للقارئ الإلكتروني." -#: cps/web.py:1291 cps/web.py:1342 +#: cps/web.py:1301 cps/web.py:1352 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "عفوًا! خادم البريد الإلكتروني غير مهيأ، يرجى الاتصال بمسؤول النظام." -#: cps/web.py:1328 +#: cps/web.py:1338 msgid "Oops! Your Email is not allowed." msgstr "عفوًا! بريدك الإلكتروني غير مسموح به." -#: cps/web.py:1331 +#: cps/web.py:1341 msgid "Success! Confirmation Email has been sent." msgstr "نجاح! تم إرسال بريد إلكتروني للتأكيد." -#: cps/web.py:1376 cps/web.py:1390 +#: cps/web.py:1386 cps/web.py:1400 msgid "Cannot activate LDAP authentication" msgstr "لا يمكن تفعيل مصادقة LDAP" -#: cps/web.py:1399 +#: cps/web.py:1409 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "لقد قمت الآن بتسجيل الدخول باسم: '%(nickname)s'" -#: cps/web.py:1406 +#: cps/web.py:1416 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "تسجيل دخول احتياطي باسم: '%(nickname)s'، خادم LDAP غير قابل للوصول، أو المستخدم غير معروف" -#: cps/web.py:1411 +#: cps/web.py:1421 #, python-format msgid "Could not login: %(message)s" msgstr "تعذر تسجيل الدخول: %(message)s" -#: cps/web.py:1415 cps/web.py:1440 +#: cps/web.py:1425 cps/web.py:1450 msgid "Wrong Username or Password" msgstr "اسم المستخدم أو كلمة المرور خاطئة" -#: cps/web.py:1422 +#: cps/web.py:1432 msgid "New Password was sent to your email address" msgstr "تم إرسال كلمة مرور جديدة إلى عنوان بريدك الإلكتروني" -#: cps/web.py:1426 +#: cps/web.py:1436 msgid "An unknown error occurred. Please try again later." msgstr "حدث خطأ غير معروف. يرجى المحاولة مرة أخرى لاحقًا." -#: cps/web.py:1428 +#: cps/web.py:1438 msgid "Please enter valid username to reset password" msgstr "يرجى إدخال اسم مستخدم صالح لإعادة تعيين كلمة المرور" -#: cps/web.py:1436 +#: cps/web.py:1446 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "لقد قمت الآن بتسجيل الدخول باسم: '%(nickname)s'" -#: cps/web.py:1501 cps/web.py:1551 +#: cps/web.py:1511 cps/web.py:1561 #, python-format msgid "%(name)s's Profile" msgstr "ملف %(name)s الشخصي" -#: cps/web.py:1517 +#: cps/web.py:1527 msgid "Success! Profile Updated" msgstr "نجاح! تم تحديث الملف الشخصي" -#: cps/web.py:1521 +#: cps/web.py:1531 msgid "Oops! An account already exists for this Email." msgstr "عفوًا! يوجد حساب بالفعل لهذا البريد الإلكتروني." @@ -1560,46 +1611,46 @@ msgstr "لم يتم العثور على ملف gmail.json صالح بمعلوم msgid "Delete temp folder contents" msgstr "حذف محتويات المجلد المؤقت" -#: cps/tasks/convert.py:112 +#: cps/tasks/convert.py:113 #, python-format msgid "%(book)s send to E-Reader" msgstr "تم إرسال %(book)s إلى القارئ الإلكتروني" -#: cps/tasks/convert.py:177 +#: cps/tasks/convert.py:180 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "لم يتم العثور على Calibre ebook-convert %(tool)s" -#: cps/tasks/convert.py:211 +#: cps/tasks/convert.py:214 #, python-format msgid "%(format)s format not found on disk" msgstr "لم يتم العثور على تنسيق %(format)s على القرص" -#: cps/tasks/convert.py:215 +#: cps/tasks/convert.py:218 msgid "Ebook converter failed with unknown error" msgstr "فشل محول الكتب الإلكترونية بخطأ غير معروف" -#: cps/tasks/convert.py:234 +#: cps/tasks/convert.py:237 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "فشل محول Kepubify: %(error)s" -#: cps/tasks/convert.py:254 +#: cps/tasks/convert.py:257 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "لم يتم العثور على الملف المحول أو أكثر من ملف واحد في المجلد %(folder)s" -#: cps/tasks/convert.py:291 cps/tasks/convert.py:342 +#: cps/tasks/convert.py:294 cps/tasks/convert.py:345 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "فشل Calibre مع الخطأ: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:322 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "فشل محول الكتب الإلكترونية: %(error)s" -#: cps/tasks/convert.py:347 +#: cps/tasks/convert.py:350 msgid "Convert" msgstr "تحويل" @@ -1685,7 +1736,7 @@ msgstr "تحرير" #: cps/templates/admin.html:25 cps/templates/book_edit.html:17 #: cps/templates/book_table.html:131 cps/templates/book_table.html:180 -#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:115 +#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:117 #: cps/templates/user_edit.html:67 cps/templates/user_table.html:149 msgid "Delete" msgstr "حذف" @@ -1775,128 +1826,145 @@ msgstr "تسجيل الدخول عن بعد بالرابط السحري" msgid "Reverse Proxy Login" msgstr "تسجيل الدخول بالوكيل العكسي" -#: cps/templates/admin.html:154 cps/templates/config_edit.html:176 +#: cps/templates/admin.html:154 cps/templates/config_edit.html:180 msgid "Reverse Proxy Header Name" msgstr "اسم رأس الوكيل العكسي" -#: cps/templates/admin.html:159 +#: cps/templates/admin.html:158 +msgid "Reverse Proxy Trusted IPs/CIDRs" +msgstr "" + +#: cps/templates/admin.html:162 cps/templates/config_edit.html:193 +msgid "Reverse Proxy Shared Secret Header Name" +msgstr "" + +#: cps/templates/admin.html:166 +msgid "Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/admin.html:170 +msgid "Reverse Proxy Shared Secret Configured" +msgstr "" + +#: cps/templates/admin.html:175 msgid "Edit Calibre Database Configuration" msgstr "تحرير تهيئة قاعدة بيانات Calibre" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:176 msgid "Edit Basic Configuration" msgstr "تحرير التهيئة الأساسية" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:177 msgid "Edit UI Configuration" msgstr "تحرير تهيئة واجهة المستخدم" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:183 msgid "Scheduled Tasks" msgstr "المهام المجدولة" -#: cps/templates/admin.html:170 cps/templates/schedule_edit.html:12 +#: cps/templates/admin.html:186 cps/templates/schedule_edit.html:12 #: cps/templates/tasks.html:18 msgid "Start Time" msgstr "وقت البدء" -#: cps/templates/admin.html:174 cps/templates/schedule_edit.html:20 +#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:20 msgid "Maximum Duration" msgstr "الحد الأقصى للمدة" -#: cps/templates/admin.html:178 cps/templates/schedule_edit.html:29 +#: cps/templates/admin.html:194 cps/templates/schedule_edit.html:29 msgid "Generate Thumbnails" msgstr "إنشاء صور مصغرة" -#: cps/templates/admin.html:182 +#: cps/templates/admin.html:198 msgid "Generate series cover thumbnails" msgstr "إنشاء صور مصغرة لأغلفة السلاسل" -#: cps/templates/admin.html:186 cps/templates/admin.html:208 +#: cps/templates/admin.html:202 cps/templates/admin.html:224 #: cps/templates/schedule_edit.html:37 msgid "Reconnect Calibre Database" msgstr "إعادة الاتصال بقاعدة بيانات Calibre" -#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 +#: cps/templates/admin.html:206 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" msgstr "إنشاء ملفات النسخ الاحتياطي للبيانات الوصفية" -#: cps/templates/admin.html:197 +#: cps/templates/admin.html:213 msgid "Refresh Thumbnail Cache" msgstr "تحديث ذاكرة التخزين المؤقت للصور المصغرة" -#: cps/templates/admin.html:203 +#: cps/templates/admin.html:219 msgid "Administration" msgstr "الإدارة" -#: cps/templates/admin.html:204 +#: cps/templates/admin.html:220 msgid "Download Debug Package" msgstr "تنزيل حزمة التصحيح" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:221 msgid "View Logs" msgstr "عرض السجلات" -#: cps/templates/admin.html:211 +#: cps/templates/admin.html:227 msgid "Restart" msgstr "إعادة تشغيل" -#: cps/templates/admin.html:212 +#: cps/templates/admin.html:228 msgid "Shutdown" msgstr "إيقاف التشغيل" -#: cps/templates/admin.html:221 +#: cps/templates/admin.html:237 msgid "Version Information" msgstr "معلومات الإصدار" -#: cps/templates/admin.html:225 +#: cps/templates/admin.html:241 msgid "Version" msgstr "الإصدار" -#: cps/templates/admin.html:226 +#: cps/templates/admin.html:242 msgid "Details" msgstr "التفاصيل" -#: cps/templates/admin.html:232 +#: cps/templates/admin.html:248 msgid "Current Version" msgstr "الإصدار الحالي" -#: cps/templates/admin.html:239 +#: cps/templates/admin.html:255 msgid "Check for Update" msgstr "التحقق من التحديث" -#: cps/templates/admin.html:240 +#: cps/templates/admin.html:256 msgid "Perform Update" msgstr "إجراء التحديث" -#: cps/templates/admin.html:253 +#: cps/templates/admin.html:269 msgid "Are you sure you want to restart?" msgstr "هل أنت متأكد أنك تريد إعادة التشغيل؟" -#: cps/templates/admin.html:258 cps/templates/admin.html:272 -#: cps/templates/admin.html:292 cps/templates/config_db.html:82 +#: cps/templates/admin.html:274 cps/templates/admin.html:288 +#: cps/templates/admin.html:308 cps/templates/config_db.html:82 msgid "OK" msgstr "موافق" -#: cps/templates/admin.html:259 cps/templates/admin.html:273 +#: cps/templates/admin.html:275 cps/templates/admin.html:289 #: cps/templates/book_edit.html:220 cps/templates/book_table.html:162 #: cps/templates/book_table.html:181 cps/templates/book_table.html:201 #: cps/templates/book_table.html:221 cps/templates/book_table.html:241 #: cps/templates/book_table.html:261 cps/templates/book_table.html:316 -#: cps/templates/config_db.html:66 cps/templates/config_edit.html:431 +#: cps/templates/config_db.html:66 cps/templates/config_edit.html:453 #: cps/templates/config_view_edit.html:175 cps/templates/detail.html:350 -#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:98 -#: cps/templates/modal_dialogs.html:116 cps/templates/modal_dialogs.html:134 +#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:100 +#: cps/templates/modal_dialogs.html:118 cps/templates/modal_dialogs.html:136 +#: cps/templates/remote_login_verify.html:16 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 #: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "إلغاء" -#: cps/templates/admin.html:271 +#: cps/templates/admin.html:287 msgid "Are you sure you want to shutdown?" msgstr "هل أنت متأكد أنك تريد إيقاف التشغيل؟" -#: cps/templates/admin.html:283 +#: cps/templates/admin.html:299 msgid "Updating, please do not reload this page" msgstr "جاري التحديث، يرجى عدم إعادة تحميل هذه الصفحة" @@ -2137,7 +2205,7 @@ msgid "Fetch Metadata" msgstr "جلب البيانات الوصفية" #: cps/templates/book_edit.html:219 cps/templates/config_db.html:65 -#: cps/templates/config_edit.html:430 cps/templates/config_view_edit.html:174 +#: cps/templates/config_edit.html:452 cps/templates/config_view_edit.html:174 #: cps/templates/email_edit.html:65 cps/templates/schedule_edit.html:44 #: cps/templates/shelf_edit.html:25 cps/templates/shelf_order.html:41 #: cps/templates/user_edit.html:142 @@ -2509,214 +2577,234 @@ msgstr "" msgid "Allow Reverse Proxy Authentication" msgstr "السماح بمصادقة الوكيل العكسي" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:176 +msgid "Security Warning" +msgstr "" + +#: cps/templates/config_edit.html:177 +msgid "Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled." +msgstr "" + +#: cps/templates/config_edit.html:184 +msgid "Reverse Proxy Trusted IPs/CIDRs (Comma Separated)" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "Enable Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/config_edit.html:197 +msgid "Reverse Proxy Shared Secret" +msgstr "" + +#: cps/templates/config_edit.html:205 msgid "Login type" msgstr "نوع تسجيل الدخول" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:207 msgid "Use Standard Authentication" msgstr "استخدام المصادقة القياسية" -#: cps/templates/config_edit.html:187 +#: cps/templates/config_edit.html:209 msgid "Use LDAP Authentication" msgstr "استخدام مصادقة LDAP" -#: cps/templates/config_edit.html:190 +#: cps/templates/config_edit.html:212 msgid "Use OAuth" msgstr "استخدام OAuth" -#: cps/templates/config_edit.html:197 +#: cps/templates/config_edit.html:219 msgid "LDAP Server Host Name or IP Address" msgstr "اسم مضيف خادم LDAP أو عنوان IP" -#: cps/templates/config_edit.html:201 +#: cps/templates/config_edit.html:223 msgid "LDAP Server Port" msgstr "منفذ خادم LDAP" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:227 msgid "LDAP Encryption" msgstr "تشفير LDAP" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:230 msgid "TLS" msgstr "TLS" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:231 msgid "SSL" msgstr "SSL" -#: cps/templates/config_edit.html:213 +#: cps/templates/config_edit.html:235 msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" msgstr "مسار شهادة LDAP CA (مطلوب فقط لمصادقة شهادة العميل)" -#: cps/templates/config_edit.html:220 +#: cps/templates/config_edit.html:242 msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" msgstr "مسار شهادة LDAP (مطلوب فقط لمصادقة شهادة العميل)" -#: cps/templates/config_edit.html:227 +#: cps/templates/config_edit.html:249 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" msgstr "مسار ملف مفتاح LDAP (مطلوب فقط لمصادقة شهادة العميل)" -#: cps/templates/config_edit.html:236 +#: cps/templates/config_edit.html:258 msgid "LDAP Authentication" msgstr "مصادقة LDAP" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:260 msgid "Anonymous" msgstr "مجهول" -#: cps/templates/config_edit.html:239 +#: cps/templates/config_edit.html:261 msgid "Unauthenticated" msgstr "غير مصادق عليه" -#: cps/templates/config_edit.html:240 +#: cps/templates/config_edit.html:262 msgid "Simple" msgstr "بسيط" -#: cps/templates/config_edit.html:245 +#: cps/templates/config_edit.html:267 msgid "LDAP Administrator Username" msgstr "اسم مستخدم مسؤول LDAP" -#: cps/templates/config_edit.html:251 +#: cps/templates/config_edit.html:273 msgid "LDAP Administrator Password" msgstr "كلمة مرور مسؤول LDAP" -#: cps/templates/config_edit.html:256 +#: cps/templates/config_edit.html:278 msgid "LDAP Distinguished Name (DN)" msgstr "الاسم المميز لـ LDAP (DN)" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:282 msgid "LDAP User Object Filter" msgstr "مرشح كائن مستخدم LDAP" -#: cps/templates/config_edit.html:265 +#: cps/templates/config_edit.html:287 msgid "LDAP Server is OpenLDAP?" msgstr "هل خادم LDAP هو OpenLDAP؟" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:289 msgid "Following Settings are Needed For User Import" msgstr "الإعدادات التالية مطلوبة لاستيراد المستخدمين" -#: cps/templates/config_edit.html:269 +#: cps/templates/config_edit.html:291 msgid "LDAP Group Object Filter" msgstr "مرشح كائن مجموعة LDAP" -#: cps/templates/config_edit.html:273 +#: cps/templates/config_edit.html:295 msgid "LDAP Group Name" msgstr "اسم مجموعة LDAP" -#: cps/templates/config_edit.html:277 +#: cps/templates/config_edit.html:299 msgid "LDAP Group Members Field" msgstr "حقل أعضاء مجموعة LDAP" -#: cps/templates/config_edit.html:281 +#: cps/templates/config_edit.html:303 msgid "LDAP Member User Filter Detection" msgstr "اكتشاف مرشح مستخدم عضو LDAP" -#: cps/templates/config_edit.html:283 +#: cps/templates/config_edit.html:305 msgid "Autodetect" msgstr "اكتشاف تلقائي" -#: cps/templates/config_edit.html:284 +#: cps/templates/config_edit.html:306 msgid "Custom Filter" msgstr "مرشح مخصص" -#: cps/templates/config_edit.html:289 +#: cps/templates/config_edit.html:311 msgid "LDAP Member User Filter" msgstr "مرشح مستخدم عضو LDAP" -#: cps/templates/config_edit.html:300 +#: cps/templates/config_edit.html:322 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "الحصول على بيانات اعتماد OAuth لـ %(provider)s" -#: cps/templates/config_edit.html:303 +#: cps/templates/config_edit.html:325 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "معرف عميل OAuth لـ %(provider)s" -#: cps/templates/config_edit.html:307 +#: cps/templates/config_edit.html:329 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "سر عميل OAuth لـ %(provider)s" -#: cps/templates/config_edit.html:323 +#: cps/templates/config_edit.html:345 msgid "External binaries" msgstr "الملفات الثنائية الخارجية" -#: cps/templates/config_edit.html:329 +#: cps/templates/config_edit.html:351 msgid "Path to Calibre Binaries" msgstr "مسار ملفات Calibre الثنائية" -#: cps/templates/config_edit.html:337 +#: cps/templates/config_edit.html:359 msgid "Calibre E-Book Converter Settings" msgstr "إعدادات محول الكتب الإلكترونية Calibre" -#: cps/templates/config_edit.html:340 +#: cps/templates/config_edit.html:362 msgid "Path to Kepubify E-Book Converter" msgstr "مسار محول الكتب الإلكترونية Kepubify" -#: cps/templates/config_edit.html:348 +#: cps/templates/config_edit.html:370 msgid "Location of Unrar binary" msgstr "موقع ملف Unrar الثنائي" -#: cps/templates/config_edit.html:364 +#: cps/templates/config_edit.html:386 msgid "Security Settings" msgstr "إعدادات الأمان" -#: cps/templates/config_edit.html:372 +#: cps/templates/config_edit.html:394 msgid "Limit failed login attempts" msgstr "تحديد محاولات تسجيل الدخول الفاشلة" -#: cps/templates/config_edit.html:376 +#: cps/templates/config_edit.html:398 msgid "Configure Backend for Limiter" msgstr "تهيئة الواجهة الخلفية للمُحدد" -#: cps/templates/config_edit.html:380 +#: cps/templates/config_edit.html:402 msgid "Options for Limiter Backend" msgstr "خيارات الواجهة الخلفية للمُحدد" -#: cps/templates/config_edit.html:386 +#: cps/templates/config_edit.html:408 msgid "Check if file extensions matches file content on upload" msgstr "التحقق مما إذا كانت امتدادات الملفات تتطابق مع محتوى الملف عند التحميل" -#: cps/templates/config_edit.html:389 +#: cps/templates/config_edit.html:411 msgid "Session protection" msgstr "حماية الجلسة" -#: cps/templates/config_edit.html:391 +#: cps/templates/config_edit.html:413 msgid "Basic" msgstr "أساسي" -#: cps/templates/config_edit.html:392 +#: cps/templates/config_edit.html:414 msgid "Strong" msgstr "قوي" -#: cps/templates/config_edit.html:397 +#: cps/templates/config_edit.html:419 msgid "User Password policy" msgstr "سياسة كلمة مرور المستخدم" -#: cps/templates/config_edit.html:401 +#: cps/templates/config_edit.html:423 msgid "Minimum password length" msgstr "الحد الأدنى لطول كلمة المرور" -#: cps/templates/config_edit.html:406 +#: cps/templates/config_edit.html:428 msgid "Enforce number" msgstr "فرض الأرقام" -#: cps/templates/config_edit.html:410 +#: cps/templates/config_edit.html:432 msgid "Enforce lowercase characters" msgstr "فرض الأحرف الصغيرة" -#: cps/templates/config_edit.html:414 +#: cps/templates/config_edit.html:436 msgid "Enforce uppercase characters" msgstr "فرض الأحرف الكبيرة" -#: cps/templates/config_edit.html:418 +#: cps/templates/config_edit.html:440 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" msgstr "فرض الأحرف (مطلوب للأحرف الصينية/اليابانية/الكورية)" -#: cps/templates/config_edit.html:422 +#: cps/templates/config_edit.html:444 msgid "Enforce special characters" msgstr "فرض الأحرف الخاصة" @@ -3183,27 +3271,27 @@ msgstr "يجب أولاً أرشفة الكتب ومزامنة الجهاز قب msgid "Choose File Location" msgstr "اختر موقع الملف" -#: cps/templates/modal_dialogs.html:81 +#: cps/templates/modal_dialogs.html:82 msgid "type" msgstr "النوع" -#: cps/templates/modal_dialogs.html:82 +#: cps/templates/modal_dialogs.html:83 msgid "name" msgstr "الاسم" -#: cps/templates/modal_dialogs.html:83 +#: cps/templates/modal_dialogs.html:84 msgid "size" msgstr "الحجم" -#: cps/templates/modal_dialogs.html:89 +#: cps/templates/modal_dialogs.html:90 msgid "Parent Directory" msgstr "الدليل الأصل" -#: cps/templates/modal_dialogs.html:97 +#: cps/templates/modal_dialogs.html:99 msgid "Select" msgstr "تحديد" -#: cps/templates/modal_dialogs.html:133 cps/templates/tasks.html:46 +#: cps/templates/modal_dialogs.html:135 cps/templates/tasks.html:46 msgid "Ok" msgstr "موافق" @@ -3459,6 +3547,31 @@ msgstr "بمجرد التحقق، سيتم تسجيل دخولك تلقائيً msgid "This verification link will expire in 10 minutes." msgstr "سينتهي صلاحية رابط التحقق هذا في غضون 10 دقائق." +#: cps/templates/remote_login_verify.html:4 +msgid "Approve Magic Link Login" +msgstr "" + +#: cps/templates/remote_login_verify.html:5 +msgid "Review the device that requested access before approving this login." +msgstr "" + +#: cps/templates/remote_login_verify.html:7 +msgid "IP address" +msgstr "" + +#: cps/templates/remote_login_verify.html:9 +msgid "Browser" +msgstr "" + +#: cps/templates/remote_login_verify.html:12 +#, python-format +msgid "If you approve this request, the device that started it will be logged in as %(username)s." +msgstr "" + +#: cps/templates/remote_login_verify.html:15 +msgid "Approve Login" +msgstr "" + #: cps/templates/schedule_edit.html:33 msgid "Generate Series Cover Thumbnails" msgstr "إنشاء صور مصغرة لأغلفة السلاسل" diff --git a/cps/translations/cs/LC_MESSAGES/messages.mo b/cps/translations/cs/LC_MESSAGES/messages.mo index 4b81a862a0641b66e7b543f63f6d555b4fad80e3..8c0c24b3c885c0eecf071832d26e2d3f68b885d3 100644 GIT binary patch delta 8131 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 ZIKMP0zepi3H7_wIwJJ4l^ZjONRsaCW<2C>Q diff --git a/cps/translations/cs/LC_MESSAGES/messages.po b/cps/translations/cs/LC_MESSAGES/messages.po index 001939d2f..4991bf054 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: 2026-08-01 11:42+0200\n" +"POT-Creation-Date: 2026-08-08 16:08+0200\n" "PO-Revision-Date: 2020-06-09 21:11+0100\n" "Last-Translator: Lukas Heroudek \n" "Language: cs_CZ\n" @@ -15,519 +15,558 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" +"Generated-By: Babel 2.18.0\n" #: cps/about.py:85 msgid "Statistics" msgstr "Statistika" -#: cps/admin.py:151 +#: cps/admin.py:154 msgid "Server restarted, please reload page." msgstr "" -#: cps/admin.py:153 +#: cps/admin.py:156 msgid "Performing Server shutdown, please close window." msgstr "" -#: cps/admin.py:161 +#: cps/admin.py:164 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:164 +#: cps/admin.py:167 msgid "Unknown command" msgstr "Neznámý příkaz" -#: cps/admin.py:175 +#: cps/admin.py:178 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "" -#: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 -#: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 -#: cps/uploader.py:117 +#: cps/admin.py:211 cps/editbooks.py:825 cps/editbooks.py:875 +#: cps/editbooks.py:1564 cps/templates/remote_login_verify.html:8 +#: cps/templates/remote_login_verify.html:10 cps/updater.py:615 +#: cps/uploader.py:117 cps/uploader.py:126 msgid "Unknown" msgstr "Neznámý" -#: cps/admin.py:233 +#: cps/admin.py:236 msgid "Admin page" msgstr "Stránka správce" -#: cps/admin.py:253 +#: cps/admin.py:256 msgid "Basic Configuration" msgstr "Základní konfigurace" -#: cps/admin.py:291 +#: cps/admin.py:294 msgid "UI Configuration" msgstr "Konfigurace uživatelského rozhraní" -#: cps/admin.py:315 cps/admin.py:1002 cps/db.py:809 cps/search.py:150 -#: cps/web.py:750 +#: cps/admin.py:318 cps/admin.py:1005 cps/db.py:809 cps/search.py:150 +#: cps/web.py:752 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "" -#: cps/admin.py:333 cps/templates/admin.html:51 +#: cps/admin.py:336 cps/templates/admin.html:51 msgid "Edit Users" msgstr "" -#: cps/admin.py:378 cps/opds.py:559 cps/templates/grid.html:14 +#: cps/admin.py:381 cps/opds.py:559 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Vše" -#: cps/admin.py:401 cps/admin.py:1432 +#: cps/admin.py:404 cps/admin.py:1460 msgid "User not found" msgstr "Uživatel nenalezen" -#: cps/admin.py:415 +#: cps/admin.py:418 #, python-brace-format msgid "{} users deleted successfully" msgstr "" -#: cps/admin.py:438 cps/templates/config_view_edit.html:133 +#: cps/admin.py:441 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Zobrazit vše" -#: cps/admin.py:459 cps/admin.py:465 +#: cps/admin.py:462 cps/admin.py:468 msgid "Malformed request" msgstr "" -#: cps/admin.py:477 cps/admin.py:2078 +#: cps/admin.py:480 cps/admin.py:2156 msgid "Guest Name can't be changed" msgstr "" -#: cps/admin.py:489 +#: cps/admin.py:492 msgid "Guest can't have this role" msgstr "" -#: cps/admin.py:501 cps/admin.py:2032 +#: cps/admin.py:504 cps/admin.py:2110 msgid "No admin user remaining, can't remove admin role" msgstr "Nezbývá žádný správce, nelze odebrat roli správce" -#: cps/admin.py:505 cps/admin.py:519 +#: cps/admin.py:508 cps/admin.py:522 msgid "Value has to be true or false" msgstr "" -#: cps/admin.py:507 +#: cps/admin.py:510 msgid "Invalid role" msgstr "" -#: cps/admin.py:511 +#: cps/admin.py:514 msgid "Guest can't have this view" msgstr "" -#: cps/admin.py:521 +#: cps/admin.py:524 msgid "Invalid view" msgstr "" -#: cps/admin.py:524 +#: cps/admin.py:527 msgid "Guest's Locale is determined automatically and can't be set" msgstr "" -#: cps/admin.py:528 +#: cps/admin.py:531 msgid "No Valid Locale Given" msgstr "" -#: cps/admin.py:539 +#: cps/admin.py:542 msgid "No Valid Book Language Given" msgstr "" -#: cps/admin.py:541 cps/editbooks.py:243 cps/editbooks.py:428 -#: cps/editbooks.py:430 +#: cps/admin.py:544 cps/editbooks.py:260 cps/editbooks.py:445 +#: cps/editbooks.py:447 msgid "Parameter not found" msgstr "" -#: cps/admin.py:578 +#: cps/admin.py:581 msgid "Invalid Read Column" msgstr "" -#: cps/admin.py:584 +#: cps/admin.py:587 msgid "Invalid Restricted Column" msgstr "" -#: cps/admin.py:604 cps/admin.py:1903 +#: cps/admin.py:607 cps/admin.py:1981 msgid "Calibre-Web configuration updated" msgstr "Konfigurace Calibre-Web aktualizována" -#: cps/admin.py:616 +#: cps/admin.py:619 msgid "Do you really want to delete the Kobo Token?" msgstr "Opravdu chcete odstranit Kobo token?" -#: cps/admin.py:618 +#: cps/admin.py:621 msgid "Do you really want to delete this domain?" msgstr "" -#: cps/admin.py:620 +#: cps/admin.py:623 msgid "Do you really want to delete this user?" msgstr "" -#: cps/admin.py:622 +#: cps/admin.py:625 msgid "Do you really want to delete this book?" msgstr "" -#: cps/admin.py:624 +#: cps/admin.py:627 msgid "Are you sure you want to delete this shelf?" msgstr "Jste si jisti, že chcete odstranit tuto polici?" -#: cps/admin.py:626 +#: cps/admin.py:629 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "" -#: cps/admin.py:628 +#: cps/admin.py:631 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "" -#: cps/admin.py:630 +#: cps/admin.py:633 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "" -#: cps/admin.py:632 +#: cps/admin.py:635 msgid "Are you sure you want to change the archive status for the selected book(s)?" msgstr "" -#: cps/admin.py:634 +#: cps/admin.py:637 msgid "Are you sure you want to change the read status for the selected book(s)?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:639 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "" -#: cps/admin.py:638 +#: cps/admin.py:641 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "" -#: cps/admin.py:641 +#: cps/admin.py:644 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "" -#: cps/admin.py:643 +#: cps/admin.py:646 msgid "Are you sure you want to change Calibre library location?" msgstr "" -#: cps/admin.py:645 +#: cps/admin.py:648 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "" -#: cps/admin.py:648 +#: cps/admin.py:651 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "" -#: cps/admin.py:891 cps/admin.py:897 cps/admin.py:907 cps/admin.py:917 +#: cps/admin.py:894 cps/admin.py:900 cps/admin.py:910 cps/admin.py:920 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Zakázat" -#: cps/admin.py:893 cps/admin.py:899 cps/admin.py:909 cps/admin.py:919 +#: cps/admin.py:896 cps/admin.py:902 cps/admin.py:912 cps/admin.py:922 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Povolit" -#: cps/admin.py:952 +#: cps/admin.py:955 #, python-brace-format msgid "{} sync entries deleted" msgstr "" -#: cps/admin.py:993 +#: cps/admin.py:996 msgid "Tag not found" msgstr "" -#: cps/admin.py:1011 +#: cps/admin.py:1014 msgid "Invalid Action" msgstr "" -#: cps/admin.py:1138 +#: cps/admin.py:1137 +#, python-format +msgid "Invalid reverse proxy trusted IP/CIDR entry: %(entry)s" +msgstr "" + +#: cps/admin.py:1148 +#, python-format +msgid "Invalid %(label)s: %(value)s" +msgstr "" + +#: cps/admin.py:1166 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json není nakonfigurováno pro webové aplikace" -#: cps/admin.py:1183 +#: cps/admin.py:1211 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "Umístění zápisového souboru není platné. Určete prosím platnou polohu" -#: cps/admin.py:1189 +#: cps/admin.py:1217 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "Umístění zápisového souboru pro přístup není platné. Určete prosím platnou polohu" -#: cps/admin.py:1223 +#: cps/admin.py:1251 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Prosím zadejte LDAP poskytovatele, port, DN a Identifikátor objektu uživatele" -#: cps/admin.py:1229 +#: cps/admin.py:1257 msgid "Please Enter a LDAP Service Account and Password" msgstr "" -#: cps/admin.py:1232 +#: cps/admin.py:1260 msgid "Please Enter a LDAP Service Account" msgstr "" -#: cps/admin.py:1237 +#: cps/admin.py:1265 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "Filtr objektů skupiny LDAP musí mít jeden “%s” formátový identifikátor" -#: cps/admin.py:1239 +#: cps/admin.py:1267 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "Filtr objektů skupiny LDAP má nesrovnatelnou závorku" -#: cps/admin.py:1243 +#: cps/admin.py:1271 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "Filtr uživatelských objektů LDAP musí mít jeden “%s” formátový identifikátor" -#: cps/admin.py:1245 +#: cps/admin.py:1273 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "Filtr uživatelských objektů LDAP má nesrovnatelnou závorku" -#: cps/admin.py:1252 +#: cps/admin.py:1280 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1254 +#: cps/admin.py:1282 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1261 +#: cps/admin.py:1289 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1292 cps/templates/admin.html:53 +#: cps/admin.py:1320 cps/templates/admin.html:53 msgid "Add New User" msgstr "Přidat nového uživatele" -#: cps/admin.py:1301 cps/templates/admin.html:100 +#: cps/admin.py:1329 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Změnit SMTP nastavení" -#: cps/admin.py:1320 +#: cps/admin.py:1348 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1340 cps/admin.py:1343 cps/admin.py:1728 cps/admin.py:1887 -#: cps/admin.py:1985 cps/admin.py:2106 cps/editbooks.py:169 -#: cps/editbooks.py:755 cps/editbooks.py:1474 cps/shelf.py:90 cps/shelf.py:144 +#: cps/admin.py:1368 cps/admin.py:1371 cps/admin.py:1756 cps/admin.py:1965 +#: cps/admin.py:2063 cps/admin.py:2184 cps/editbooks.py:170 +#: cps/editbooks.py:772 cps/editbooks.py:1518 cps/shelf.py:90 cps/shelf.py:144 #: cps/shelf.py:194 cps/shelf.py:237 cps/shelf.py:287 cps/shelf.py:327 -#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:160 cps/web.py:1526 +#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:161 cps/web.py:1536 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Chyba databáze: %(error)s." -#: cps/admin.py:1350 +#: cps/admin.py:1378 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1353 +#: cps/admin.py:1381 #, 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:1355 +#: cps/admin.py:1383 msgid "Please configure your e-mail address first..." msgstr "Prvně nastavte svou e-mailovou adresu..." -#: cps/admin.py:1357 +#: cps/admin.py:1385 msgid "Email Server Settings updated" msgstr "Nastavení e-mailového serveru aktualizováno" -#: cps/admin.py:1380 cps/templates/admin.html:195 +#: cps/admin.py:1408 cps/templates/admin.html:211 msgid "Edit Scheduled Tasks Settings" msgstr "" -#: cps/admin.py:1392 +#: cps/admin.py:1420 msgid "Invalid start time for task specified" msgstr "" -#: cps/admin.py:1397 +#: cps/admin.py:1425 msgid "Invalid duration for task specified" msgstr "" -#: cps/admin.py:1407 +#: cps/admin.py:1435 msgid "Scheduled tasks settings updated" msgstr "" -#: cps/admin.py:1417 cps/admin.py:1466 cps/admin.py:2102 cps/web.py:1325 +#: cps/admin.py:1445 cps/admin.py:1494 cps/admin.py:2180 cps/web.py:1335 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Neznámá chyba. Opakujte prosím později." -#: cps/admin.py:1421 +#: cps/admin.py:1449 msgid "Settings DB is not Writeable" msgstr "" -#: cps/admin.py:1451 cps/admin.py:2094 +#: cps/admin.py:1479 cps/admin.py:2172 #, python-format msgid "Edit User %(nick)s" msgstr "Upravit uživatele %(nick)s" -#: cps/admin.py:1463 +#: cps/admin.py:1491 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "" -#: cps/admin.py:1469 +#: cps/admin.py:1497 msgid "Oops! Please configure the SMTP mail settings." msgstr "" -#: cps/admin.py:1480 +#: cps/admin.py:1508 msgid "Logfile viewer" msgstr "Prohlížeč log souborů" -#: cps/admin.py:1546 +#: cps/admin.py:1574 msgid "Requesting update package" msgstr "Požadování balíčku aktualizace" -#: cps/admin.py:1547 +#: cps/admin.py:1575 msgid "Downloading update package" msgstr "Stahování balíčku aktualizace" -#: cps/admin.py:1548 +#: cps/admin.py:1576 msgid "Unzipping update package" msgstr "Rozbalování balíčku aktualizace" -#: cps/admin.py:1549 +#: cps/admin.py:1577 msgid "Replacing files" msgstr "Nahrazování souborů" -#: cps/admin.py:1550 +#: cps/admin.py:1578 msgid "Database connections are closed" msgstr "Databázová připojení jsou uzavřena" -#: cps/admin.py:1551 +#: cps/admin.py:1579 msgid "Stopping server" msgstr "Zastavuji server" -#: cps/admin.py:1552 +#: cps/admin.py:1580 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:1553 cps/admin.py:1554 cps/admin.py:1555 cps/admin.py:1556 -#: cps/admin.py:1557 cps/admin.py:1558 +#: cps/admin.py:1581 cps/admin.py:1582 cps/admin.py:1583 cps/admin.py:1584 +#: cps/admin.py:1585 cps/admin.py:1586 msgid "Update failed:" msgstr "Aktualizace selhala:" -#: cps/admin.py:1553 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1581 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP chyba" -#: cps/admin.py:1554 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1582 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Chyba připojení" -#: cps/admin.py:1555 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1583 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Vypršel časový limit při navazování spojení" -#: cps/admin.py:1556 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1584 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Všeobecná chyba" -#: cps/admin.py:1557 +#: cps/admin.py:1585 msgid "Update file could not be saved in temp dir" msgstr "" -#: cps/admin.py:1558 +#: cps/admin.py:1586 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1582 +#: cps/admin.py:1610 msgid "Failed to extract at least One LDAP User" msgstr "" -#: cps/admin.py:1627 +#: cps/admin.py:1655 msgid "Failed to Create at Least One LDAP User" msgstr "Nepodařilo se vytvořit nejméně jednoho uživatele LDAP" -#: cps/admin.py:1640 +#: cps/admin.py:1668 #, python-format msgid "Error: %(ldaperror)s" msgstr "Chyba: %(ldaperror)s" -#: cps/admin.py:1644 +#: cps/admin.py:1672 msgid "Error: No user returned in response of LDAP server" msgstr "Chyba: Žádná reakce od uživatele LDAP serveru" -#: cps/admin.py:1680 +#: cps/admin.py:1708 msgid "At Least One LDAP User Not Found in Database" msgstr "Nejméně jeden uživatel LDAP nenalezen v databázi" -#: cps/admin.py:1682 +#: cps/admin.py:1710 #, python-brace-format msgid "{} User Successfully Imported" msgstr "" -#: cps/admin.py:1740 +#: cps/admin.py:1768 msgid "Books path not valid" msgstr "" -#: cps/admin.py:1746 +#: cps/admin.py:1774 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "Umístění databáze není platné, opravte prosím cestu" -#: cps/admin.py:1774 +#: cps/admin.py:1802 msgid "DB is not Writeable" msgstr "Databáze není zapisovatelná" -#: cps/admin.py:1788 +#: cps/admin.py:1816 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "Umístění souboru klíčů není platné, zadejte prosím správnou cestu" -#: cps/admin.py:1792 +#: cps/admin.py:1820 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "Umístění certifikátu není platné, zadejte prosím správnou cestu" -#: cps/admin.py:1872 +#: cps/admin.py:1846 +msgid "Kepubify binary not found" +msgstr "" + +#: cps/admin.py:1894 +msgid "reverse proxy login header name" +msgstr "" + +#: cps/admin.py:1904 +msgid "reverse proxy shared secret header name" +msgstr "" + +#: cps/admin.py:1913 +msgid "Please configure both reverse proxy shared secret header name and secret" +msgstr "" + +#: cps/admin.py:1917 +msgid "Please configure reverse proxy shared secret header name and secret or disable the feature" +msgstr "" + +#: cps/admin.py:1922 +msgid "Please configure at least one trusted reverse proxy IP or CIDR" +msgstr "" + +#: cps/admin.py:1946 msgid "Password length has to be between 1 and 40" msgstr "" -#: cps/admin.py:1926 +#: cps/admin.py:1957 cps/helper.py:1007 +msgid "Please specify a valid UnRar directory" +msgstr "" + +#: cps/admin.py:2004 msgid "Database Settings updated" msgstr "" -#: cps/admin.py:1934 +#: cps/admin.py:2012 msgid "Database Configuration" msgstr "" -#: cps/admin.py:1949 cps/web.py:1295 +#: cps/admin.py:2027 cps/web.py:1305 msgid "Oops! Please complete all fields." msgstr "Vyplňte všechna pole!" -#: cps/admin.py:1958 +#: cps/admin.py:2036 msgid "E-mail is not from valid domain" msgstr "E-mail není z platné domény" -#: cps/admin.py:1964 +#: cps/admin.py:2042 msgid "Add new user" msgstr "Přidat nového uživatele" -#: cps/admin.py:1975 +#: cps/admin.py:2053 #, python-format msgid "User '%(user)s' created" msgstr "Uživatel '%(user)s' vytvořen" -#: cps/admin.py:1981 +#: cps/admin.py:2059 msgid "Oops! An account already exists for this Email. or name." msgstr "" -#: cps/admin.py:2011 +#: cps/admin.py:2089 #, python-format msgid "User '%(nick)s' deleted" msgstr "Uživatel '%(nick)s' smazán" -#: cps/admin.py:2014 +#: cps/admin.py:2092 msgid "Can't delete Guest User" msgstr "" -#: cps/admin.py:2017 +#: cps/admin.py:2095 msgid "No admin user remaining, can't delete user" msgstr "Nezbývá žádný správce, nemůžete jej odstranit" -#: cps/admin.py:2072 cps/web.py:1475 +#: cps/admin.py:2150 cps/web.py:1485 msgid "Email can't be empty and has to be a valid Email" msgstr "" -#: cps/admin.py:2098 +#: cps/admin.py:2176 #, python-format msgid "User '%(nick)s' updated" msgstr "Uživatel '%(nick)s' aktualizován" @@ -540,145 +579,153 @@ msgstr "Uživatel '%(nick)s' aktualizován" msgid "Search" msgstr "Hledat" -#: cps/converter.py:31 +#: cps/converter.py:32 msgid "not installed" msgstr "není nainstalováno" -#: cps/converter.py:32 +#: cps/converter.py:33 msgid "Execution permissions missing" msgstr "Chybí povolení k exekuci" -#: cps/db.py:1129 cps/templates/config_edit.html:207 +#: cps/db.py:1129 cps/templates/config_edit.html:229 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:565 cps/web.py:599 cps/web.py:644 cps/web.py:684 cps/web.py:711 -#: cps/web.py:998 cps/web.py:1028 cps/web.py:1073 cps/web.py:1101 -#: cps/web.py:1140 +#: cps/web.py:567 cps/web.py:601 cps/web.py:646 cps/web.py:686 cps/web.py:713 +#: cps/web.py:1000 cps/web.py:1030 cps/web.py:1075 cps/web.py:1103 +#: cps/web.py:1142 msgid "None" msgstr "Žádné" -#: cps/editbooks.py:155 +#: cps/editbooks.py:156 #, python-format msgid "File %(file)s uploaded" msgstr "Soubor %(file)s nahrán" -#: cps/editbooks.py:184 +#: cps/editbooks.py:185 msgid "Source or destination format for conversion missing" msgstr "Chybí zdrojový nebo cílový formát pro převod" -#: cps/editbooks.py:192 +#: cps/editbooks.py:189 cps/editbooks.py:197 +msgid "Source format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:201 +msgid "Destination format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:209 #, 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:196 +#: cps/editbooks.py:213 #, 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/editbooks.py:297 +#: cps/editbooks.py:314 msgid "Changes successfully applied" msgstr "" -#: cps/editbooks.py:317 +#: cps/editbooks.py:334 msgid "Value is missing on request" msgstr "" -#: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 -#: cps/editbooks.py:1146 cps/web.py:532 cps/web.py:1567 cps/web.py:1613 -#: cps/web.py:1663 +#: cps/editbooks.py:336 cps/editbooks.py:343 cps/editbooks.py:644 +#: cps/editbooks.py:1170 cps/web.py:534 cps/web.py:1577 cps/web.py:1623 +#: cps/web.py:1673 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Jejda! Vybraná kniha není k dispozici. Soubor neexistuje nebo není přístupný" -#: cps/editbooks.py:673 cps/editbooks.py:1503 +#: cps/editbooks.py:690 cps/editbooks.py:1547 msgid "User has no rights to upload cover" msgstr "" -#: cps/editbooks.py:694 cps/editbooks.py:938 +#: cps/editbooks.py:711 cps/editbooks.py:961 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "" -#: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 +#: cps/editbooks.py:726 cps/editbooks.py:935 cps/editbooks.py:1306 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "" -#: cps/editbooks.py:737 +#: cps/editbooks.py:754 msgid "Metadata successfully updated" msgstr "Metadata úspěšně aktualizována" -#: cps/editbooks.py:760 +#: cps/editbooks.py:777 #, python-brace-format msgid "Error editing book: {}" msgstr "" -#: cps/editbooks.py:856 +#: cps/editbooks.py:879 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "Nahraná kniha pravděpodobně existuje v knihovně, zvažte prosím změnu před nahráním nové: " -#: cps/editbooks.py:950 cps/editbooks.py:1420 +#: cps/editbooks.py:973 cps/editbooks.py:1464 msgid "File type isn't allowed to be uploaded to this server" msgstr "" -#: cps/editbooks.py:956 cps/editbooks.py:1431 +#: cps/editbooks.py:979 cps/editbooks.py:1475 #, 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" -#: cps/editbooks.py:960 cps/editbooks.py:1436 +#: cps/editbooks.py:983 cps/editbooks.py:1480 msgid "File to be uploaded must have an extension" msgstr "Soubor, který má být odeslán musí mít příponu" -#: cps/editbooks.py:968 +#: cps/editbooks.py:992 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "Soubor %(filename)s nemohl být uložen do dočasného adresáře" -#: cps/editbooks.py:988 +#: cps/editbooks.py:1012 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Nepodařilo se přesunout soubor obalu %(file)s: %(error)s" -#: cps/editbooks.py:1041 +#: cps/editbooks.py:1065 msgid "Book Format Successfully Deleted" msgstr "Formát knihy úspěšně smazán" -#: cps/editbooks.py:1044 cps/editbooks.py:1061 +#: cps/editbooks.py:1068 cps/editbooks.py:1085 msgid "Book Successfully Deleted" msgstr "Kniha úspěšně smazána" -#: cps/editbooks.py:1065 +#: cps/editbooks.py:1089 msgid "You are missing permissions to delete books" msgstr "" -#: cps/editbooks.py:1139 +#: cps/editbooks.py:1163 #, python-brace-format msgid "Book with id \"{}\" could not be deleted: not found" msgstr "" -#: cps/editbooks.py:1181 +#: cps/editbooks.py:1205 msgid "edit metadata" msgstr "upravit metadata" -#: cps/editbooks.py:1234 +#: cps/editbooks.py:1267 #, python-format msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1425 +#: cps/editbooks.py:1469 msgid "User has no rights to upload additional file formats" msgstr "" -#: cps/editbooks.py:1449 +#: cps/editbooks.py:1493 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Nepodařilo se vytvořit cestu %(path)s (oprávnění odepřeno)." -#: cps/editbooks.py:1456 +#: cps/editbooks.py:1500 #, python-format msgid "Failed to store file %(file)s." msgstr "Uložení souboru %(file)s se nezdařilo." -#: cps/editbooks.py:1481 +#: cps/editbooks.py:1525 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Formát souboru %(ext)s přidán do %(book)s" @@ -689,9 +736,9 @@ msgstr "" #: cps/error_handler.py:108 cps/templates/layout.html:69 #: cps/templates/layout.html:104 cps/templates/login.html:27 -#: cps/templates/register.html:17 cps/web.py:1292 cps/web.py:1296 -#: cps/web.py:1302 cps/web.py:1326 cps/web.py:1330 cps/web.py:1343 -#: cps/web.py:1346 +#: cps/templates/register.html:17 cps/web.py:1302 cps/web.py:1306 +#: cps/web.py:1312 cps/web.py:1336 cps/web.py:1340 cps/web.py:1353 +#: cps/web.py:1356 msgid "Register" msgstr "Registrovat" @@ -712,7 +759,7 @@ msgstr "Doména zpětného volání není ověřena, postupujte podle pokynů k msgid "%(format)s format not found for book id: %(book)d" msgstr "%(format)s formát pro knihu: %(book)d nenalezen" -#: cps/helper.py:94 cps/tasks/convert.py:91 +#: cps/helper.py:94 cps/tasks/convert.py:92 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s nenalezen na Google Drive: %(fn)s" @@ -898,10 +945,6 @@ msgstr "Pouze jpg/jpeg jsou podporované soubory pro obal" msgid "Cover" msgstr "" -#: cps/helper.py:1006 -msgid "UnRar binary file not found" -msgstr "UnRar binární soubor nenalezen" - #: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "" @@ -932,7 +975,7 @@ msgstr "" msgid "Error executing Calibre" msgstr "" -#: cps/helper.py:1154 cps/templates/admin.html:216 +#: cps/helper.py:1154 cps/templates/admin.html:232 msgid "Queue all books for metadata backup" msgstr "" @@ -954,7 +997,7 @@ msgstr "Registrovat s %(provider)s" msgid "This %(oauth)s account is already linked to a different user" msgstr "" -#: cps/oauth_bb.py:147 cps/remotelogin.py:131 +#: cps/oauth_bb.py:147 cps/remotelogin.py:150 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "nyní jste přihlášen jako: '%(nickname)s'" @@ -1022,25 +1065,29 @@ msgstr "" msgid "{} Stars" msgstr "" -#: cps/remotelogin.py:63 cps/templates/layout.html:68 -#: cps/templates/layout.html:103 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1361 -msgid "Login" -msgstr "Přihlásit" - -#: cps/remotelogin.py:75 cps/remotelogin.py:109 +#: cps/remotelogin.py:46 cps/remotelogin.py:128 msgid "Token not found" msgstr "Token nenalezen" -#: cps/remotelogin.py:84 cps/remotelogin.py:117 +#: cps/remotelogin.py:55 cps/remotelogin.py:136 msgid "Token has expired" msgstr "Token vypršel" -#: cps/remotelogin.py:93 +#: cps/remotelogin.py:86 cps/remotelogin.py:112 cps/templates/layout.html:68 +#: cps/templates/layout.html:103 cps/templates/login.html:4 +#: cps/templates/login.html:21 cps/web.py:1371 +msgid "Login" +msgstr "Přihlásit" + +#: cps/remotelogin.py:100 +msgid "Token already approved" +msgstr "" + +#: cps/remotelogin.py:108 msgid "Success! Please return to your device" msgstr "Úspěch! Vraťte se prosím do zařízení" -#: cps/render_template.py:41 cps/web.py:421 +#: cps/render_template.py:41 cps/web.py:423 msgid "Books" msgstr "Knihy" @@ -1065,7 +1112,7 @@ msgstr "" msgid "Show Downloaded Books" msgstr "" -#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:436 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:438 msgid "Top Rated Books" msgstr "Nejlépe hodnocené knihy" @@ -1074,7 +1121,7 @@ msgid "Show Top Rated Books" msgstr "Zobrazit nejlépe hodnocené knihy" #: cps/render_template.py:61 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:769 +#: cps/templates/index.xml:67 cps/web.py:771 msgid "Read Books" msgstr "Přečtené knihy" @@ -1083,7 +1130,7 @@ msgid "Show Read and Unread" msgstr "" #: cps/render_template.py:65 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:772 +#: cps/templates/index.xml:74 cps/web.py:774 msgid "Unread Books" msgstr "Nepřečtené knihy" @@ -1101,7 +1148,7 @@ msgid "Show Random Books" msgstr "Zobrazit náhodné knihy" #: cps/render_template.py:71 cps/templates/book_table.html:93 -#: cps/templates/index.xml:97 cps/web.py:1144 +#: cps/templates/index.xml:97 cps/web.py:1146 msgid "Categories" msgstr "Kategorie" @@ -1111,7 +1158,7 @@ msgstr "" #: cps/render_template.py:74 cps/templates/book_edit.html:86 #: cps/templates/book_table.html:94 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1034 cps/web.py:1046 +#: cps/templates/search_form.html:70 cps/web.py:1036 cps/web.py:1048 msgid "Series" msgstr "Série" @@ -1129,7 +1176,7 @@ msgid "Show Author Section" msgstr "" #: cps/render_template.py:81 cps/templates/book_table.html:98 -#: cps/templates/index.xml:88 cps/web.py:1002 +#: cps/templates/index.xml:88 cps/web.py:1004 msgid "Publishers" msgstr "Vydavatelé" @@ -1139,7 +1186,7 @@ msgstr "" #: cps/render_template.py:84 cps/templates/book_table.html:96 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1116 +#: cps/web.py:1118 msgid "Languages" msgstr "Jazyky" @@ -1163,7 +1210,7 @@ msgstr "Formáty souborů" msgid "Show File Formats Section" msgstr "" -#: cps/render_template.py:95 cps/web.py:795 +#: cps/render_template.py:95 cps/web.py:797 msgid "Archived Books" msgstr "Archivované knihy" @@ -1171,7 +1218,7 @@ msgstr "Archivované knihy" msgid "Show Archived Books" msgstr "" -#: cps/render_template.py:100 cps/web.py:831 +#: cps/render_template.py:100 cps/web.py:833 msgid "Books List" msgstr "" @@ -1404,150 +1451,154 @@ msgstr "Nová aktualizace k dispozici. Klepnutím na tlačítko níže aktualizu msgid "No release information available" msgstr "Nejsou k dispozici žádné informace o verzi" -#: cps/templates/index.html:6 cps/web.py:448 +#: cps/templates/index.html:6 cps/web.py:450 msgid "Discover (Random Books)" msgstr "Objevte (Náhodné knihy)" -#: cps/web.py:484 +#: cps/web.py:486 msgid "Hot Books (Most Downloaded)" msgstr "Žhavé knihy (Nejstahovanější)" -#: cps/web.py:515 +#: cps/web.py:517 #, python-format msgid "Downloaded books by %(user)s" msgstr "" -#: cps/web.py:548 +#: cps/web.py:550 #, python-format msgid "Author: %(name)s" msgstr "Autoři: %(name)s" -#: cps/web.py:584 +#: cps/web.py:586 #, python-format msgid "Publisher: %(name)s" msgstr "Vydavatel: %(name)s" -#: cps/web.py:612 +#: cps/web.py:614 #, python-format msgid "Series: %(serie)s" msgstr "Série: %(serie)s" -#: cps/web.py:626 +#: cps/web.py:628 msgid "Rating: None" msgstr "" -#: cps/web.py:635 +#: cps/web.py:637 #, python-format msgid "Rating: %(rating)s stars" msgstr "Hodnocení: %(rating)s stars" -#: cps/web.py:666 +#: cps/web.py:668 #, python-format msgid "File format: %(format)s" msgstr "Soubor formátů: %(format)s" -#: cps/web.py:701 +#: cps/web.py:703 #, python-format msgid "Category: %(name)s" msgstr "Kategorie: %(name)s" -#: cps/web.py:730 +#: cps/web.py:732 #, python-format msgid "Language: %(name)s" msgstr "Jazyky: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:974 +#: cps/templates/admin.html:16 cps/web.py:976 msgid "Downloads" msgstr "Stáhnutí" -#: cps/web.py:1076 +#: cps/web.py:1078 msgid "Ratings list" msgstr "Seznam hodnocení" -#: cps/web.py:1103 +#: cps/web.py:1105 msgid "File formats list" msgstr "Seznam formátů" -#: cps/web.py:1264 +#: cps/web.py:1272 +msgid "Book format not supported" +msgstr "" + +#: cps/web.py:1274 msgid "Please configure the SMTP mail settings first..." msgstr "" -#: cps/web.py:1270 +#: cps/web.py:1280 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Kniha byla úspěšně zařazena do fronty pro odeslání na %(eReadermail)s" -#: cps/web.py:1273 +#: cps/web.py:1283 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Při odesílání této knihy došlo k chybě: %(res)s" -#: cps/web.py:1275 +#: cps/web.py:1285 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "" -#: cps/web.py:1291 cps/web.py:1342 +#: cps/web.py:1301 cps/web.py:1352 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "E-mailový server není nakonfigurován, kontaktujte svého správce!" -#: cps/web.py:1328 +#: cps/web.py:1338 msgid "Oops! Your Email is not allowed." msgstr "Váš e-mail nemá povolení k registraci" -#: cps/web.py:1331 +#: cps/web.py:1341 msgid "Success! Confirmation Email has been sent." msgstr "Potvrzovací e-mail byl odeslán na váš účet." -#: cps/web.py:1376 cps/web.py:1390 +#: cps/web.py:1386 cps/web.py:1400 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1399 +#: cps/web.py:1409 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1406 +#: cps/web.py:1416 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1411 +#: cps/web.py:1421 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1415 cps/web.py:1440 +#: cps/web.py:1425 cps/web.py:1450 msgid "Wrong Username or Password" msgstr "" -#: cps/web.py:1422 +#: cps/web.py:1432 msgid "New Password was sent to your email address" msgstr "" -#: cps/web.py:1426 +#: cps/web.py:1436 msgid "An unknown error occurred. Please try again later." msgstr "" -#: cps/web.py:1428 +#: cps/web.py:1438 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1436 +#: cps/web.py:1446 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1501 cps/web.py:1551 +#: cps/web.py:1511 cps/web.py:1561 #, python-format msgid "%(name)s's Profile" msgstr "%(name)s profil" -#: cps/web.py:1517 +#: cps/web.py:1527 msgid "Success! Profile Updated" msgstr "" -#: cps/web.py:1521 +#: cps/web.py:1531 msgid "Oops! An account already exists for this Email." msgstr "" @@ -1559,46 +1610,46 @@ msgstr "" msgid "Delete temp folder contents" msgstr "" -#: cps/tasks/convert.py:112 +#: cps/tasks/convert.py:113 #, python-format msgid "%(book)s send to E-Reader" msgstr "" -#: cps/tasks/convert.py:177 +#: cps/tasks/convert.py:180 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre převaděč %(tool)s nenalezen" -#: cps/tasks/convert.py:211 +#: cps/tasks/convert.py:214 #, python-format msgid "%(format)s format not found on disk" msgstr "" -#: cps/tasks/convert.py:215 +#: cps/tasks/convert.py:218 msgid "Ebook converter failed with unknown error" msgstr "" -#: cps/tasks/convert.py:234 +#: cps/tasks/convert.py:237 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify-převaděč selhal: %(error)s" -#: cps/tasks/convert.py:254 +#: cps/tasks/convert.py:257 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Převedený soubor nebyl nalezen nebo více než jeden soubor ve složce %(folder)s" -#: cps/tasks/convert.py:291 cps/tasks/convert.py:342 +#: cps/tasks/convert.py:294 cps/tasks/convert.py:345 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:322 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Převaděč eknih selhal: %(error)s" -#: cps/tasks/convert.py:347 +#: cps/tasks/convert.py:350 msgid "Convert" msgstr "" @@ -1684,7 +1735,7 @@ msgstr "Upravovat" #: cps/templates/admin.html:25 cps/templates/book_edit.html:17 #: cps/templates/book_table.html:131 cps/templates/book_table.html:180 -#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:115 +#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:117 #: cps/templates/user_edit.html:67 cps/templates/user_table.html:149 msgid "Delete" msgstr "Smazat" @@ -1774,128 +1825,145 @@ msgstr "Magic Link vzdálené přihlášení" msgid "Reverse Proxy Login" msgstr "Reverzní proxy přihlášení" -#: cps/templates/admin.html:154 cps/templates/config_edit.html:176 +#: cps/templates/admin.html:154 cps/templates/config_edit.html:180 msgid "Reverse Proxy Header Name" msgstr "Název záhlaví reverzního proxy" -#: cps/templates/admin.html:159 +#: cps/templates/admin.html:158 +msgid "Reverse Proxy Trusted IPs/CIDRs" +msgstr "" + +#: cps/templates/admin.html:162 cps/templates/config_edit.html:193 +msgid "Reverse Proxy Shared Secret Header Name" +msgstr "" + +#: cps/templates/admin.html:166 +msgid "Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/admin.html:170 +msgid "Reverse Proxy Shared Secret Configured" +msgstr "" + +#: cps/templates/admin.html:175 msgid "Edit Calibre Database Configuration" msgstr "" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:176 msgid "Edit Basic Configuration" msgstr "Upravit základní konfiguraci" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:177 msgid "Edit UI Configuration" msgstr "Upravit konfiguraci uživatelského rozhraní" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:183 msgid "Scheduled Tasks" msgstr "" -#: cps/templates/admin.html:170 cps/templates/schedule_edit.html:12 +#: cps/templates/admin.html:186 cps/templates/schedule_edit.html:12 #: cps/templates/tasks.html:18 msgid "Start Time" msgstr "" -#: cps/templates/admin.html:174 cps/templates/schedule_edit.html:20 +#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:20 msgid "Maximum Duration" msgstr "" -#: cps/templates/admin.html:178 cps/templates/schedule_edit.html:29 +#: cps/templates/admin.html:194 cps/templates/schedule_edit.html:29 msgid "Generate Thumbnails" msgstr "" -#: cps/templates/admin.html:182 +#: cps/templates/admin.html:198 msgid "Generate series cover thumbnails" msgstr "" -#: cps/templates/admin.html:186 cps/templates/admin.html:208 +#: cps/templates/admin.html:202 cps/templates/admin.html:224 #: cps/templates/schedule_edit.html:37 msgid "Reconnect Calibre Database" msgstr "" -#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 +#: cps/templates/admin.html:206 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" msgstr "" -#: cps/templates/admin.html:197 +#: cps/templates/admin.html:213 msgid "Refresh Thumbnail Cache" msgstr "" -#: cps/templates/admin.html:203 +#: cps/templates/admin.html:219 msgid "Administration" msgstr "Správa" -#: cps/templates/admin.html:204 +#: cps/templates/admin.html:220 msgid "Download Debug Package" msgstr "" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:221 msgid "View Logs" msgstr "Zobrazit log" -#: cps/templates/admin.html:211 +#: cps/templates/admin.html:227 msgid "Restart" msgstr "Restartovat" -#: cps/templates/admin.html:212 +#: cps/templates/admin.html:228 msgid "Shutdown" msgstr "Vypnout" -#: cps/templates/admin.html:221 +#: cps/templates/admin.html:237 msgid "Version Information" msgstr "" -#: cps/templates/admin.html:225 +#: cps/templates/admin.html:241 msgid "Version" msgstr "Verze" -#: cps/templates/admin.html:226 +#: cps/templates/admin.html:242 msgid "Details" msgstr "Detaily" -#: cps/templates/admin.html:232 +#: cps/templates/admin.html:248 msgid "Current Version" msgstr "Současná verze" -#: cps/templates/admin.html:239 +#: cps/templates/admin.html:255 msgid "Check for Update" msgstr "Zkontrolovat aktualizace" -#: cps/templates/admin.html:240 +#: cps/templates/admin.html:256 msgid "Perform Update" msgstr "Provést aktualizaci" -#: cps/templates/admin.html:253 +#: cps/templates/admin.html:269 msgid "Are you sure you want to restart?" msgstr "Opravdu chcete restartovat?" -#: cps/templates/admin.html:258 cps/templates/admin.html:272 -#: cps/templates/admin.html:292 cps/templates/config_db.html:82 +#: cps/templates/admin.html:274 cps/templates/admin.html:288 +#: cps/templates/admin.html:308 cps/templates/config_db.html:82 msgid "OK" msgstr "OK" -#: cps/templates/admin.html:259 cps/templates/admin.html:273 +#: cps/templates/admin.html:275 cps/templates/admin.html:289 #: cps/templates/book_edit.html:220 cps/templates/book_table.html:162 #: cps/templates/book_table.html:181 cps/templates/book_table.html:201 #: cps/templates/book_table.html:221 cps/templates/book_table.html:241 #: cps/templates/book_table.html:261 cps/templates/book_table.html:316 -#: cps/templates/config_db.html:66 cps/templates/config_edit.html:431 +#: cps/templates/config_db.html:66 cps/templates/config_edit.html:453 #: cps/templates/config_view_edit.html:175 cps/templates/detail.html:350 -#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:98 -#: cps/templates/modal_dialogs.html:116 cps/templates/modal_dialogs.html:134 +#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:100 +#: cps/templates/modal_dialogs.html:118 cps/templates/modal_dialogs.html:136 +#: cps/templates/remote_login_verify.html:16 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 #: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Zrušit" -#: cps/templates/admin.html:271 +#: cps/templates/admin.html:287 msgid "Are you sure you want to shutdown?" msgstr "Opravdu chcete vypnout?" -#: cps/templates/admin.html:283 +#: cps/templates/admin.html:299 msgid "Updating, please do not reload this page" msgstr "Probíhá aktualizace, prosím nenačítejte stránku znovu" @@ -2136,7 +2204,7 @@ msgid "Fetch Metadata" msgstr "Získat metadata" #: cps/templates/book_edit.html:219 cps/templates/config_db.html:65 -#: cps/templates/config_edit.html:430 cps/templates/config_view_edit.html:174 +#: cps/templates/config_edit.html:452 cps/templates/config_view_edit.html:174 #: cps/templates/email_edit.html:65 cps/templates/schedule_edit.html:44 #: cps/templates/shelf_edit.html:25 cps/templates/shelf_order.html:41 #: cps/templates/user_edit.html:142 @@ -2508,214 +2576,234 @@ msgstr "" msgid "Allow Reverse Proxy Authentication" msgstr "Povolit reverzní ověření proxy" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:176 +msgid "Security Warning" +msgstr "" + +#: cps/templates/config_edit.html:177 +msgid "Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled." +msgstr "" + +#: cps/templates/config_edit.html:184 +msgid "Reverse Proxy Trusted IPs/CIDRs (Comma Separated)" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "Enable Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/config_edit.html:197 +msgid "Reverse Proxy Shared Secret" +msgstr "" + +#: cps/templates/config_edit.html:205 msgid "Login type" msgstr "Typ přihlášení" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:207 msgid "Use Standard Authentication" msgstr "Použít standartní ověření" -#: cps/templates/config_edit.html:187 +#: cps/templates/config_edit.html:209 msgid "Use LDAP Authentication" msgstr "Použít ověření LDAP" -#: cps/templates/config_edit.html:190 +#: cps/templates/config_edit.html:212 msgid "Use OAuth" msgstr "Použít OAuth" -#: cps/templates/config_edit.html:197 +#: cps/templates/config_edit.html:219 msgid "LDAP Server Host Name or IP Address" msgstr "Název hostitele serveru LDAP nebo IP adresa" -#: cps/templates/config_edit.html:201 +#: cps/templates/config_edit.html:223 msgid "LDAP Server Port" msgstr "LDAP Server Port" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:227 msgid "LDAP Encryption" msgstr "LDAP Šifrování" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:230 msgid "TLS" msgstr "TLS" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:231 msgid "SSL" msgstr "SSL" -#: cps/templates/config_edit.html:213 +#: cps/templates/config_edit.html:235 msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" msgstr "" -#: cps/templates/config_edit.html:220 +#: cps/templates/config_edit.html:242 msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" msgstr "" -#: cps/templates/config_edit.html:227 +#: cps/templates/config_edit.html:249 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" msgstr "" -#: cps/templates/config_edit.html:236 +#: cps/templates/config_edit.html:258 msgid "LDAP Authentication" msgstr "LDAP Ověření" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:260 msgid "Anonymous" msgstr "Anonymní" -#: cps/templates/config_edit.html:239 +#: cps/templates/config_edit.html:261 msgid "Unauthenticated" msgstr "Neověřeno" -#: cps/templates/config_edit.html:240 +#: cps/templates/config_edit.html:262 msgid "Simple" msgstr "Jednoduché" -#: cps/templates/config_edit.html:245 +#: cps/templates/config_edit.html:267 msgid "LDAP Administrator Username" msgstr "Uživatelské jméno správce LDAP" -#: cps/templates/config_edit.html:251 +#: cps/templates/config_edit.html:273 msgid "LDAP Administrator Password" msgstr "Heslo správce LDAP" -#: cps/templates/config_edit.html:256 +#: cps/templates/config_edit.html:278 msgid "LDAP Distinguished Name (DN)" msgstr "Rozlišující název LDAP (DN)" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:282 msgid "LDAP User Object Filter" msgstr "Filtr objektu uživatele LDAP" -#: cps/templates/config_edit.html:265 +#: cps/templates/config_edit.html:287 msgid "LDAP Server is OpenLDAP?" msgstr "Server LDAP je OpenLDAP?" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:289 msgid "Following Settings are Needed For User Import" msgstr "Následující nastavení jsou potřeba pro import uživatele" -#: cps/templates/config_edit.html:269 +#: cps/templates/config_edit.html:291 msgid "LDAP Group Object Filter" msgstr "Filtr objektů skupiny LDAP" -#: cps/templates/config_edit.html:273 +#: cps/templates/config_edit.html:295 msgid "LDAP Group Name" msgstr "Jméno skupiny LDAP" -#: cps/templates/config_edit.html:277 +#: cps/templates/config_edit.html:299 msgid "LDAP Group Members Field" msgstr "Pole členů skupiny LDAP" -#: cps/templates/config_edit.html:281 +#: cps/templates/config_edit.html:303 msgid "LDAP Member User Filter Detection" msgstr "" -#: cps/templates/config_edit.html:283 +#: cps/templates/config_edit.html:305 msgid "Autodetect" msgstr "" -#: cps/templates/config_edit.html:284 +#: cps/templates/config_edit.html:306 msgid "Custom Filter" msgstr "" -#: cps/templates/config_edit.html:289 +#: cps/templates/config_edit.html:311 msgid "LDAP Member User Filter" msgstr "" -#: cps/templates/config_edit.html:300 +#: cps/templates/config_edit.html:322 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "Získat %(provider)s OAuth pověření" -#: cps/templates/config_edit.html:303 +#: cps/templates/config_edit.html:325 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "%(provider)s OAuth Klient Id" -#: cps/templates/config_edit.html:307 +#: cps/templates/config_edit.html:329 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "%(provider)s OAuth Klient Tajemství" -#: cps/templates/config_edit.html:323 +#: cps/templates/config_edit.html:345 msgid "External binaries" msgstr "Externí binární soubory" -#: cps/templates/config_edit.html:329 +#: cps/templates/config_edit.html:351 msgid "Path to Calibre Binaries" msgstr "" -#: cps/templates/config_edit.html:337 +#: cps/templates/config_edit.html:359 msgid "Calibre E-Book Converter Settings" msgstr "Nastavení převaděče e-knih Calibre" -#: cps/templates/config_edit.html:340 +#: cps/templates/config_edit.html:362 msgid "Path to Kepubify E-Book Converter" msgstr "Cesta k převaděči e-knih Kepubify" -#: cps/templates/config_edit.html:348 +#: cps/templates/config_edit.html:370 msgid "Location of Unrar binary" msgstr "" -#: cps/templates/config_edit.html:364 +#: cps/templates/config_edit.html:386 msgid "Security Settings" msgstr "" -#: cps/templates/config_edit.html:372 +#: cps/templates/config_edit.html:394 msgid "Limit failed login attempts" msgstr "" -#: cps/templates/config_edit.html:376 +#: cps/templates/config_edit.html:398 msgid "Configure Backend for Limiter" msgstr "" -#: cps/templates/config_edit.html:380 +#: cps/templates/config_edit.html:402 msgid "Options for Limiter Backend" msgstr "" -#: cps/templates/config_edit.html:386 +#: cps/templates/config_edit.html:408 msgid "Check if file extensions matches file content on upload" msgstr "" -#: cps/templates/config_edit.html:389 +#: cps/templates/config_edit.html:411 msgid "Session protection" msgstr "" -#: cps/templates/config_edit.html:391 +#: cps/templates/config_edit.html:413 msgid "Basic" msgstr "" -#: cps/templates/config_edit.html:392 +#: cps/templates/config_edit.html:414 msgid "Strong" msgstr "" -#: cps/templates/config_edit.html:397 +#: cps/templates/config_edit.html:419 msgid "User Password policy" msgstr "" -#: cps/templates/config_edit.html:401 +#: cps/templates/config_edit.html:423 msgid "Minimum password length" msgstr "" -#: cps/templates/config_edit.html:406 +#: cps/templates/config_edit.html:428 msgid "Enforce number" msgstr "" -#: cps/templates/config_edit.html:410 +#: cps/templates/config_edit.html:432 msgid "Enforce lowercase characters" msgstr "" -#: cps/templates/config_edit.html:414 +#: cps/templates/config_edit.html:436 msgid "Enforce uppercase characters" msgstr "" -#: cps/templates/config_edit.html:418 +#: cps/templates/config_edit.html:440 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" msgstr "" -#: cps/templates/config_edit.html:422 +#: cps/templates/config_edit.html:444 msgid "Enforce special characters" msgstr "" @@ -3182,27 +3270,27 @@ msgstr "Knihy musí být nejprve archivovány a zařízení musí být synchroni msgid "Choose File Location" msgstr "" -#: cps/templates/modal_dialogs.html:81 +#: cps/templates/modal_dialogs.html:82 msgid "type" msgstr "" -#: cps/templates/modal_dialogs.html:82 +#: cps/templates/modal_dialogs.html:83 msgid "name" msgstr "" -#: cps/templates/modal_dialogs.html:83 +#: cps/templates/modal_dialogs.html:84 msgid "size" msgstr "" -#: cps/templates/modal_dialogs.html:89 +#: cps/templates/modal_dialogs.html:90 msgid "Parent Directory" msgstr "" -#: cps/templates/modal_dialogs.html:97 +#: cps/templates/modal_dialogs.html:99 msgid "Select" msgstr "" -#: cps/templates/modal_dialogs.html:133 cps/templates/tasks.html:46 +#: cps/templates/modal_dialogs.html:135 cps/templates/tasks.html:46 msgid "Ok" msgstr "" @@ -3458,6 +3546,31 @@ msgstr "Jakmile tak učiníte, budete automaticky přihlášeni na tomto zaříz msgid "This verification link will expire in 10 minutes." msgstr "Tento ověřovací odkaz vyprší za 10 minut." +#: cps/templates/remote_login_verify.html:4 +msgid "Approve Magic Link Login" +msgstr "" + +#: cps/templates/remote_login_verify.html:5 +msgid "Review the device that requested access before approving this login." +msgstr "" + +#: cps/templates/remote_login_verify.html:7 +msgid "IP address" +msgstr "" + +#: cps/templates/remote_login_verify.html:9 +msgid "Browser" +msgstr "" + +#: cps/templates/remote_login_verify.html:12 +#, python-format +msgid "If you approve this request, the device that started it will be logged in as %(username)s." +msgstr "" + +#: cps/templates/remote_login_verify.html:15 +msgid "Approve Login" +msgstr "" + #: cps/templates/schedule_edit.html:33 msgid "Generate Series Cover Thumbnails" msgstr "" diff --git a/cps/translations/de/LC_MESSAGES/messages.mo b/cps/translations/de/LC_MESSAGES/messages.mo index ccde7686e84ef5f1de12f7303068bd2ecbf7b5c2..4c1837b7f5e8f465b5e9b5ad520c81d2fca0a0e4 100644 GIT binary patch delta 14096 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 OY?`t-WAnj3^&9|)f?nMK delta 14176 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 diff --git a/cps/translations/de/LC_MESSAGES/messages.po b/cps/translations/de/LC_MESSAGES/messages.po index e303c0ac8..25cddcf81 100644 --- a/cps/translations/de/LC_MESSAGES/messages.po +++ b/cps/translations/de/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: 2026-08-01 11:42+0200\n" +"POT-Creation-Date: 2026-08-08 16:08+0200\n" "PO-Revision-Date: 2025-10-22 19:56+0200\n" "Last-Translator: Sebastian Holzer\n" "Language: de\n" @@ -16,519 +16,558 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" +"Generated-By: Babel 2.18.0\n" #: cps/about.py:85 msgid "Statistics" msgstr "Statistiken" -#: cps/admin.py:151 +#: cps/admin.py:154 msgid "Server restarted, please reload page." msgstr "Server neu gestartet, Seite bitte neu laden." -#: cps/admin.py:153 +#: cps/admin.py:156 msgid "Performing Server shutdown, please close window." msgstr "Server wird heruntergefahren, Fenster bitte schließen." -#: cps/admin.py:161 +#: cps/admin.py:164 msgid "Success! Database Reconnected" msgstr "Datenbank wurde erneut verbunden" -#: cps/admin.py:164 +#: cps/admin.py:167 msgid "Unknown command" msgstr "Unbekannter Befehl" -#: cps/admin.py:175 +#: cps/admin.py:178 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "Bücher wurden für Metadaten Backup eingereiht, für das Ergebnis bitte Aufgaben überprüfen" -#: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 -#: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 -#: cps/uploader.py:117 +#: cps/admin.py:211 cps/editbooks.py:825 cps/editbooks.py:875 +#: cps/editbooks.py:1564 cps/templates/remote_login_verify.html:8 +#: cps/templates/remote_login_verify.html:10 cps/updater.py:615 +#: cps/uploader.py:117 cps/uploader.py:126 msgid "Unknown" msgstr "Unbekannt" -#: cps/admin.py:233 +#: cps/admin.py:236 msgid "Admin page" msgstr "Admin Seite" -#: cps/admin.py:253 +#: cps/admin.py:256 msgid "Basic Configuration" msgstr "Basiskonfiguration" -#: cps/admin.py:291 +#: cps/admin.py:294 msgid "UI Configuration" msgstr "Benutzeroberflächenkonfiguration" -#: cps/admin.py:315 cps/admin.py:1002 cps/db.py:809 cps/search.py:150 -#: cps/web.py:750 +#: cps/admin.py:318 cps/admin.py:1005 cps/db.py:809 cps/search.py:150 +#: cps/web.py:752 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "Benutzerdefinierte Spalte Nr. %(column)d ist nicht in Calibre Datenbank vorhanden" -#: cps/admin.py:333 cps/templates/admin.html:51 +#: cps/admin.py:336 cps/templates/admin.html:51 msgid "Edit Users" msgstr "Benutzer bearbeiten" -#: cps/admin.py:378 cps/opds.py:559 cps/templates/grid.html:14 +#: cps/admin.py:381 cps/opds.py:559 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Alle" -#: cps/admin.py:401 cps/admin.py:1432 +#: cps/admin.py:404 cps/admin.py:1460 msgid "User not found" msgstr "Benutzer nicht gefunden" -#: cps/admin.py:415 +#: cps/admin.py:418 #, python-brace-format msgid "{} users deleted successfully" msgstr "{} Benutzer erfolgreich gelöscht" -#: cps/admin.py:438 cps/templates/config_view_edit.html:133 +#: cps/admin.py:441 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Zeige alle" -#: cps/admin.py:459 cps/admin.py:465 +#: cps/admin.py:462 cps/admin.py:468 msgid "Malformed request" msgstr "Ungültige Anfrage" -#: cps/admin.py:477 cps/admin.py:2078 +#: cps/admin.py:480 cps/admin.py:2156 msgid "Guest Name can't be changed" msgstr "Name 'Guest' kann nicht geändert werden" -#: cps/admin.py:489 +#: cps/admin.py:492 msgid "Guest can't have this role" msgstr "Benutzer 'Guest' kann diese Rolle nicht haben" -#: cps/admin.py:501 cps/admin.py:2032 +#: cps/admin.py:504 cps/admin.py:2110 msgid "No admin user remaining, can't remove admin role" msgstr "Kein Admin Benutzer verblieben, Admin Berechtigung kann nicht entfernt werden" -#: cps/admin.py:505 cps/admin.py:519 +#: cps/admin.py:508 cps/admin.py:522 msgid "Value has to be true or false" msgstr "Wert muss true oder false sein" -#: cps/admin.py:507 +#: cps/admin.py:510 msgid "Invalid role" msgstr "Ungültige Rolle" -#: cps/admin.py:511 +#: cps/admin.py:514 msgid "Guest can't have this view" msgstr "Benutzer 'Guest' kann diese Ansicht nicht haben" -#: cps/admin.py:521 +#: cps/admin.py:524 msgid "Invalid view" msgstr "Ungültige Ansicht" -#: cps/admin.py:524 +#: cps/admin.py:527 msgid "Guest's Locale is determined automatically and can't be set" msgstr "Sprache von 'Guest' wird automatisch bestimmt und kann nicht eingestellt werden" -#: cps/admin.py:528 +#: cps/admin.py:531 msgid "No Valid Locale Given" msgstr "Keine gültige Sprache gewählt" -#: cps/admin.py:539 +#: cps/admin.py:542 msgid "No Valid Book Language Given" msgstr "Keine gültige Buchsprache gewählt" -#: cps/admin.py:541 cps/editbooks.py:243 cps/editbooks.py:428 -#: cps/editbooks.py:430 +#: cps/admin.py:544 cps/editbooks.py:260 cps/editbooks.py:445 +#: cps/editbooks.py:447 msgid "Parameter not found" msgstr "Parameter wurde nicht gefunden" -#: cps/admin.py:578 +#: cps/admin.py:581 msgid "Invalid Read Column" msgstr "Ungültige Gelesen Spalte" -#: cps/admin.py:584 +#: cps/admin.py:587 msgid "Invalid Restricted Column" msgstr "Ungültiger Spaltenname für Einschränkung" -#: cps/admin.py:604 cps/admin.py:1903 +#: cps/admin.py:607 cps/admin.py:1981 msgid "Calibre-Web configuration updated" msgstr "Konfiguration von Calibre-Web wurde aktualisiert" -#: cps/admin.py:616 +#: cps/admin.py:619 msgid "Do you really want to delete the Kobo Token?" msgstr "Möchten Sie den Kobo Token wirklich löschen?" -#: cps/admin.py:618 +#: cps/admin.py:621 msgid "Do you really want to delete this domain?" msgstr "Möchten Sie diese Domain wirklich löschen?" -#: cps/admin.py:620 +#: cps/admin.py:623 msgid "Do you really want to delete this user?" msgstr "Möchten Sie diesen Benutzer wirklich löschen?" -#: cps/admin.py:622 +#: cps/admin.py:625 msgid "Do you really want to delete this book?" msgstr "Möchten Sie dieses Buch wirklich löschen?" -#: cps/admin.py:624 +#: cps/admin.py:627 msgid "Are you sure you want to delete this shelf?" msgstr "Möchten Sie dieses Bücherregal wirklich löschen?" -#: cps/admin.py:626 +#: cps/admin.py:629 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Möchten Sie die Anzeigesprache der ausgewählten Benutzer wirklich ändern?" -#: cps/admin.py:628 +#: cps/admin.py:631 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "Möchten Sie die sichtbare Büchersprachen für die ausgewählten Benutzer wirklich ändern?" -#: cps/admin.py:630 +#: cps/admin.py:633 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "Möchten Sie die ausgewählte Rolle für die ausgewählten Benutzer wirklich verändern?" -#: cps/admin.py:632 +#: cps/admin.py:635 msgid "Are you sure you want to change the archive status for the selected book(s)?" msgstr "Möchten Sie den Archivierungsstatus für die ausgewählten Bücher wirklich ändern?" -#: cps/admin.py:634 +#: cps/admin.py:637 msgid "Are you sure you want to change the read status for the selected book(s)?" msgstr "Möchten Sie den Lesestatus für die ausgewählten Bücher wirklich ändern?" -#: cps/admin.py:636 +#: cps/admin.py:639 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Möchten Sie die ausgewählten Restriktionen für die ausgewählten Benutzer wirklich ändern?" -#: cps/admin.py:638 +#: cps/admin.py:641 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "Möchten Sie die Sichtbarkeitsrestriktionen für die ausgewählten Benutzer wirklich verändern?" -#: cps/admin.py:641 +#: cps/admin.py:644 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Möchten Sie die Synchronisation von Bücherregalen für die ausgewählten Benutzer wirklich verändern?" -#: cps/admin.py:643 +#: cps/admin.py:646 msgid "Are you sure you want to change Calibre library location?" msgstr "Ort der Calibre Datenbank editieren?" -#: cps/admin.py:645 +#: cps/admin.py:648 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "Calibre-Web wird nach neuen Covern suchen und Cover Miniaturansichten aktualisieren, dies kann eine Weile dauern?" -#: cps/admin.py:648 +#: cps/admin.py:651 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Möchten Sie die Synchronisationsdatenbank von Calibre-Web wirklich löschen, um eine komplette Synchronisation zu erzwingen?" -#: cps/admin.py:891 cps/admin.py:897 cps/admin.py:907 cps/admin.py:917 +#: cps/admin.py:894 cps/admin.py:900 cps/admin.py:910 cps/admin.py:920 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Verbieten" -#: cps/admin.py:893 cps/admin.py:899 cps/admin.py:909 cps/admin.py:919 +#: cps/admin.py:896 cps/admin.py:902 cps/admin.py:912 cps/admin.py:922 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Erlauben" -#: cps/admin.py:952 +#: cps/admin.py:955 #, python-brace-format msgid "{} sync entries deleted" msgstr "{} Synchronisationseinträge gelöscht" -#: cps/admin.py:993 +#: cps/admin.py:996 msgid "Tag not found" msgstr "Tag nicht gefunden" -#: cps/admin.py:1011 +#: cps/admin.py:1014 msgid "Invalid Action" msgstr "Ungültige Aktion" -#: cps/admin.py:1138 +#: cps/admin.py:1137 +#, python-format +msgid "Invalid reverse proxy trusted IP/CIDR entry: %(entry)s" +msgstr "" + +#: cps/admin.py:1148 +#, python-format +msgid "Invalid %(label)s: %(value)s" +msgstr "" + +#: cps/admin.py:1166 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json ist nicht für Web Anwendungen konfiguriert" -#: cps/admin.py:1183 +#: cps/admin.py:1211 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "Logdatei Pfad ist ungültig, bitte einen gültigen Pfad angeben" -#: cps/admin.py:1189 +#: cps/admin.py:1217 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "Zugriffs-Logdatei Pfad ist ungültig, bitte einen gültigen Pfad angeben" -#: cps/admin.py:1223 +#: cps/admin.py:1251 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Bitte einen LDAP Server, Port, DN und Benutzer Objekt Identifikator angeben" -#: cps/admin.py:1229 +#: cps/admin.py:1257 msgid "Please Enter a LDAP Service Account and Password" msgstr "Bitte einen LDAP Service Account und Passwort eingeben" -#: cps/admin.py:1232 +#: cps/admin.py:1260 msgid "Please Enter a LDAP Service Account" msgstr "Bitte einen LDAP Service Account eingeben" -#: cps/admin.py:1237 +#: cps/admin.py:1265 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "LDAP Gruppen Objekt Filter benötigt genau eine \"%s\" Format Kennung" -#: cps/admin.py:1239 +#: cps/admin.py:1267 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "LDAP Gruppen Objekt Filter hat ungleiche Anzahl von Klammern" -#: cps/admin.py:1243 +#: cps/admin.py:1271 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP Benutzer Objekt Filter benötigt genau eine \"%s\" Format Kennung" -#: cps/admin.py:1245 +#: cps/admin.py:1273 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "LDAP Benutzer Objekt Filter hat ungleiche Anzahl von Klammern" -#: cps/admin.py:1252 +#: cps/admin.py:1280 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "Der LDAP Member User Filter benötigt genau eine \"%s\" Formatierungsmarkierung" -#: cps/admin.py:1254 +#: cps/admin.py:1282 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "LDAP Member User Filter hat eine ungleiche Anzahl von geöffneten und geschlossenen Klammern" -#: cps/admin.py:1261 +#: cps/admin.py:1289 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP CA-Zertifikat, Zertifikat oder Key Datei ist kein gültiger Pfad" -#: cps/admin.py:1292 cps/templates/admin.html:53 +#: cps/admin.py:1320 cps/templates/admin.html:53 msgid "Add New User" msgstr "Neuen Benutzer hinzufügen" -#: cps/admin.py:1301 cps/templates/admin.html:100 +#: cps/admin.py:1329 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "SMTP-Einstellungen ändern" -#: cps/admin.py:1320 +#: cps/admin.py:1348 msgid "Success! Gmail Account Verified." msgstr "G-Mail Konto verifiziert." -#: cps/admin.py:1340 cps/admin.py:1343 cps/admin.py:1728 cps/admin.py:1887 -#: cps/admin.py:1985 cps/admin.py:2106 cps/editbooks.py:169 -#: cps/editbooks.py:755 cps/editbooks.py:1474 cps/shelf.py:90 cps/shelf.py:144 +#: cps/admin.py:1368 cps/admin.py:1371 cps/admin.py:1756 cps/admin.py:1965 +#: cps/admin.py:2063 cps/admin.py:2184 cps/editbooks.py:170 +#: cps/editbooks.py:772 cps/editbooks.py:1518 cps/shelf.py:90 cps/shelf.py:144 #: cps/shelf.py:194 cps/shelf.py:237 cps/shelf.py:287 cps/shelf.py:327 -#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:160 cps/web.py:1526 +#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:161 cps/web.py:1536 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Datenbankfehler: %(error)s." -#: cps/admin.py:1350 +#: cps/admin.py:1378 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Test E-Mail an %(email)s wurde zum Senden in die Warteschlange eingereiht, für das Ergebnis bitte Aufgaben überprüfen" -#: cps/admin.py:1353 +#: cps/admin.py:1381 #, 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:1355 +#: cps/admin.py:1383 msgid "Please configure your e-mail address first..." msgstr "Bitte zuerst E-Mail Adresse konfigurieren..." -#: cps/admin.py:1357 +#: cps/admin.py:1385 msgid "Email Server Settings updated" msgstr "Einstellungen des E-Mail-Servers aktualisiert" -#: cps/admin.py:1380 cps/templates/admin.html:195 +#: cps/admin.py:1408 cps/templates/admin.html:211 msgid "Edit Scheduled Tasks Settings" msgstr "Einstellungen für Geplante Aufgaben" -#: cps/admin.py:1392 +#: cps/admin.py:1420 msgid "Invalid start time for task specified" msgstr "Ungültigen Startzeitpunkt für Aufgaben spezifiziert" -#: cps/admin.py:1397 +#: cps/admin.py:1425 msgid "Invalid duration for task specified" msgstr "Ungültige Laufzeit für Aufgaben spezifiziert" -#: cps/admin.py:1407 +#: cps/admin.py:1435 msgid "Scheduled tasks settings updated" msgstr "Einstellungen für Geplante Aufgaben aktualisiert" -#: cps/admin.py:1417 cps/admin.py:1466 cps/admin.py:2102 cps/web.py:1325 +#: cps/admin.py:1445 cps/admin.py:1494 cps/admin.py:2180 cps/web.py:1335 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Es ist ein unbekannter Fehler aufgetreten. Bitte später erneut versuchen." -#: cps/admin.py:1421 +#: cps/admin.py:1449 msgid "Settings DB is not Writeable" msgstr "Einstellungsdatenbank ist nicht schreibbar" -#: cps/admin.py:1451 cps/admin.py:2094 +#: cps/admin.py:1479 cps/admin.py:2172 #, python-format msgid "Edit User %(nick)s" msgstr "Benutzer %(nick)s bearbeiten" -#: cps/admin.py:1463 +#: cps/admin.py:1491 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "Passwort für Benutzer %(user)s wurde zurückgesetzt" -#: cps/admin.py:1469 +#: cps/admin.py:1497 msgid "Oops! Please configure the SMTP mail settings." msgstr "Bitte zuerst die SMTP-Einstellungen konfigurieren." -#: cps/admin.py:1480 +#: cps/admin.py:1508 msgid "Logfile viewer" msgstr "Logdatei Anzeige" -#: cps/admin.py:1546 +#: cps/admin.py:1574 msgid "Requesting update package" msgstr "Frage Update an" -#: cps/admin.py:1547 +#: cps/admin.py:1575 msgid "Downloading update package" msgstr "Lade Update herunter" -#: cps/admin.py:1548 +#: cps/admin.py:1576 msgid "Unzipping update package" msgstr "Entpacke Update" -#: cps/admin.py:1549 +#: cps/admin.py:1577 msgid "Replacing files" msgstr "Ersetze Dateien" -#: cps/admin.py:1550 +#: cps/admin.py:1578 msgid "Database connections are closed" msgstr "Schließe Datenbankverbindungen" -#: cps/admin.py:1551 +#: cps/admin.py:1579 msgid "Stopping server" msgstr "Stoppe Server" -#: cps/admin.py:1552 +#: cps/admin.py:1580 msgid "Update finished, please press okay and reload page" msgstr "Update abgeschlossen, bitte okay drücken und Seite neu laden" -#: cps/admin.py:1553 cps/admin.py:1554 cps/admin.py:1555 cps/admin.py:1556 -#: cps/admin.py:1557 cps/admin.py:1558 +#: cps/admin.py:1581 cps/admin.py:1582 cps/admin.py:1583 cps/admin.py:1584 +#: cps/admin.py:1585 cps/admin.py:1586 msgid "Update failed:" msgstr "Update fehlgeschlagen:" -#: cps/admin.py:1553 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1581 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP Fehler" -#: cps/admin.py:1554 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1582 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Verbindungsfehler" -#: cps/admin.py:1555 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1583 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Timeout beim Verbindungsaufbau" -#: cps/admin.py:1556 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1584 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Allgemeiner Fehler" -#: cps/admin.py:1557 +#: cps/admin.py:1585 msgid "Update file could not be saved in temp dir" msgstr "Updatedatei konnte nicht in temporärem Ordner gespeichert werden" -#: cps/admin.py:1558 +#: cps/admin.py:1586 msgid "Files could not be replaced during update" msgstr "Dateien konnten während des Updates nicht ausgetauscht werden" -#: cps/admin.py:1582 +#: cps/admin.py:1610 msgid "Failed to extract at least One LDAP User" msgstr "Mindestens ein LDAP Benutzer konnte nicht extrahiert werden" -#: cps/admin.py:1627 +#: cps/admin.py:1655 msgid "Failed to Create at Least One LDAP User" msgstr "Mindestens ein LDAP Benutzer konnte nicht erzeugt werden" -#: cps/admin.py:1640 +#: cps/admin.py:1668 #, python-format msgid "Error: %(ldaperror)s" msgstr "Fehler: %(ldaperror)s" -#: cps/admin.py:1644 +#: cps/admin.py:1672 msgid "Error: No user returned in response of LDAP server" msgstr "Fehler: Keine Benutzerinformationen von LDAP Server empfangen" -#: cps/admin.py:1680 +#: cps/admin.py:1708 msgid "At Least One LDAP User Not Found in Database" msgstr "Mindestens ein LDAP Benutzer wurde nicht in der Datenbank gefudnen" -#: cps/admin.py:1682 +#: cps/admin.py:1710 #, python-brace-format msgid "{} User Successfully Imported" msgstr "{} Benutzer erfolgreich importiert" -#: cps/admin.py:1740 +#: cps/admin.py:1768 msgid "Books path not valid" msgstr "Bücherpfad ungültig" -#: cps/admin.py:1746 +#: cps/admin.py:1774 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "DB Pfad ist nicht gültig, bitte einen gültigen Pfad angeben" -#: cps/admin.py:1774 +#: cps/admin.py:1802 msgid "DB is not Writeable" msgstr "Datenbank ist nicht schreibbar" -#: cps/admin.py:1788 +#: cps/admin.py:1816 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "Schlüsseldatei ist ungültig, bitte einen gültigen Pfad angeben" -#: cps/admin.py:1792 +#: cps/admin.py:1820 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "Zertifikatsdatei ist ungültig, bitte einen gültigen Pfad angeben" -#: cps/admin.py:1872 +#: cps/admin.py:1846 +msgid "Kepubify binary not found" +msgstr "" + +#: cps/admin.py:1894 +msgid "reverse proxy login header name" +msgstr "" + +#: cps/admin.py:1904 +msgid "reverse proxy shared secret header name" +msgstr "" + +#: cps/admin.py:1913 +msgid "Please configure both reverse proxy shared secret header name and secret" +msgstr "" + +#: cps/admin.py:1917 +msgid "Please configure reverse proxy shared secret header name and secret or disable the feature" +msgstr "" + +#: cps/admin.py:1922 +msgid "Please configure at least one trusted reverse proxy IP or CIDR" +msgstr "" + +#: cps/admin.py:1946 msgid "Password length has to be between 1 and 40" msgstr "Passwortlänge muss zwischen 1 und 40 Zeichen liegen" -#: cps/admin.py:1926 +#: cps/admin.py:1957 cps/helper.py:1007 +msgid "Please specify a valid UnRar directory" +msgstr "" + +#: cps/admin.py:2004 msgid "Database Settings updated" msgstr "Datenbankeinstellung aktualisiert" -#: cps/admin.py:1934 +#: cps/admin.py:2012 msgid "Database Configuration" msgstr "Datenbank-Konfiguration" -#: cps/admin.py:1949 cps/web.py:1295 +#: cps/admin.py:2027 cps/web.py:1305 msgid "Oops! Please complete all fields." msgstr "Bitte alle Felder ausfüllen." -#: cps/admin.py:1958 +#: cps/admin.py:2036 msgid "E-mail is not from valid domain" msgstr "E-Mail bezieht sich nicht auf eine gültige Domain" -#: cps/admin.py:1964 +#: cps/admin.py:2042 msgid "Add new user" msgstr "Neuen Benutzer hinzufügen" -#: cps/admin.py:1975 +#: cps/admin.py:2053 #, python-format msgid "User '%(user)s' created" msgstr "Benutzer '%(user)s' angelegt" -#: cps/admin.py:1981 +#: cps/admin.py:2059 msgid "Oops! An account already exists for this Email. or name." msgstr "Es existiert bereits ein Account für diese E-Mail Adresse oder diesen Benutzernamen." -#: cps/admin.py:2011 +#: cps/admin.py:2089 #, python-format msgid "User '%(nick)s' deleted" msgstr "Benutzer '%(nick)s' gelöscht" -#: cps/admin.py:2014 +#: cps/admin.py:2092 msgid "Can't delete Guest User" msgstr "Benutzer 'Guest' kann nicht gelöscht werden" -#: cps/admin.py:2017 +#: cps/admin.py:2095 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:2072 cps/web.py:1475 +#: cps/admin.py:2150 cps/web.py:1485 msgid "Email can't be empty and has to be a valid Email" msgstr "E-Mail kann nicht leer sein und muss gültig sein" -#: cps/admin.py:2098 +#: cps/admin.py:2176 #, python-format msgid "User '%(nick)s' updated" msgstr "Benutzer '%(nick)s' aktualisiert" @@ -541,145 +580,153 @@ msgstr "Benutzer '%(nick)s' aktualisiert" msgid "Search" msgstr "Suchen" -#: cps/converter.py:31 +#: cps/converter.py:32 msgid "not installed" msgstr "Nicht installiert" -#: cps/converter.py:32 +#: cps/converter.py:33 msgid "Execution permissions missing" msgstr "Ausführberechtigung fehlt" -#: cps/db.py:1129 cps/templates/config_edit.html:207 +#: cps/db.py:1129 cps/templates/config_edit.html:229 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:565 cps/web.py:599 cps/web.py:644 cps/web.py:684 cps/web.py:711 -#: cps/web.py:998 cps/web.py:1028 cps/web.py:1073 cps/web.py:1101 -#: cps/web.py:1140 +#: cps/web.py:567 cps/web.py:601 cps/web.py:646 cps/web.py:686 cps/web.py:713 +#: cps/web.py:1000 cps/web.py:1030 cps/web.py:1075 cps/web.py:1103 +#: cps/web.py:1142 msgid "None" msgstr "Keine" -#: cps/editbooks.py:155 +#: cps/editbooks.py:156 #, python-format msgid "File %(file)s uploaded" msgstr "Datei %(file)s hochgeladen" -#: cps/editbooks.py:184 +#: cps/editbooks.py:185 msgid "Source or destination format for conversion missing" msgstr "Quell- oder Zielformat für Konvertierung fehlt" -#: cps/editbooks.py:192 +#: cps/editbooks.py:189 cps/editbooks.py:197 +msgid "Source format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:201 +msgid "Destination format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:209 #, 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:196 +#: cps/editbooks.py:213 #, 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/editbooks.py:297 +#: cps/editbooks.py:314 msgid "Changes successfully applied" msgstr "Änderungen erfolgreich durchgeführt" -#: cps/editbooks.py:317 +#: cps/editbooks.py:334 msgid "Value is missing on request" msgstr "Wert fehlt bei Anfrage" -#: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 -#: cps/editbooks.py:1146 cps/web.py:532 cps/web.py:1567 cps/web.py:1613 -#: cps/web.py:1663 +#: cps/editbooks.py:336 cps/editbooks.py:343 cps/editbooks.py:644 +#: cps/editbooks.py:1170 cps/web.py:534 cps/web.py:1577 cps/web.py:1623 +#: cps/web.py:1673 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Öffnen des Buches fehlgeschlagen. Datei existiert nicht oder ist nicht zugänglich" -#: cps/editbooks.py:673 cps/editbooks.py:1503 +#: cps/editbooks.py:690 cps/editbooks.py:1547 msgid "User has no rights to upload cover" msgstr "Benutzer hat keine Berechtigung Cover hochzuladen" -#: cps/editbooks.py:694 cps/editbooks.py:938 +#: cps/editbooks.py:711 cps/editbooks.py:961 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "IDs unterscheiden nicht zwischen Groß- und Kleinschreibung, alte ID wird überschrieben" -#: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 +#: cps/editbooks.py:726 cps/editbooks.py:935 cps/editbooks.py:1306 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "'%(langname)s' ist keine gültige Sprache" -#: cps/editbooks.py:737 +#: cps/editbooks.py:754 msgid "Metadata successfully updated" msgstr "Metadaten wurden erfolgreich aktualisiert" -#: cps/editbooks.py:760 +#: cps/editbooks.py:777 #, python-brace-format msgid "Error editing book: {}" msgstr "Fehler beim Editieren des Buches: {}" -#: cps/editbooks.py:856 +#: cps/editbooks.py:879 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "Das hochgeladene Buch existiert evtl. schon in der Bibliothek: " -#: cps/editbooks.py:950 cps/editbooks.py:1420 +#: cps/editbooks.py:973 cps/editbooks.py:1464 msgid "File type isn't allowed to be uploaded to this server" msgstr "Dateityp kann nicht auf diesen Server hochgeladen werden" -#: cps/editbooks.py:956 cps/editbooks.py:1431 +#: cps/editbooks.py:979 cps/editbooks.py:1475 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "Dateiendung '%(ext)s' kann nicht auf diesen Server hochgeladen werden" -#: cps/editbooks.py:960 cps/editbooks.py:1436 +#: cps/editbooks.py:983 cps/editbooks.py:1480 msgid "File to be uploaded must have an extension" msgstr "Dateien müssen eine Dateiendung haben, um hochgeladen zu werden" -#: cps/editbooks.py:968 +#: cps/editbooks.py:992 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "Die Datei %(filename)s konnte nicht im temporären Ordner gespeichert werden" -#: cps/editbooks.py:988 +#: cps/editbooks.py:1012 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Fehler beim Verschieben der Cover Datei %(file)s: %(error)s" -#: cps/editbooks.py:1041 +#: cps/editbooks.py:1065 msgid "Book Format Successfully Deleted" msgstr "Buch Format erfolgreich gelöscht" -#: cps/editbooks.py:1044 cps/editbooks.py:1061 +#: cps/editbooks.py:1068 cps/editbooks.py:1085 msgid "Book Successfully Deleted" msgstr "Buch erfolgreich gelöscht" -#: cps/editbooks.py:1065 +#: cps/editbooks.py:1089 msgid "You are missing permissions to delete books" msgstr "Keine Berechtigung zum Löschen von Büchern" -#: cps/editbooks.py:1139 +#: cps/editbooks.py:1163 #, python-brace-format msgid "Book with id \"{}\" could not be deleted: not found" msgstr "Das Buch mit der ID \"{}\" konnte nicht gelöscht werden: nicht gefunden" -#: cps/editbooks.py:1181 +#: cps/editbooks.py:1205 msgid "edit metadata" msgstr "Metadaten editieren" -#: cps/editbooks.py:1234 +#: cps/editbooks.py:1267 #, python-format msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "Serienindex %(seriesindex)s ist keine gültige Zahl, Eintrag wird ignoriert" -#: cps/editbooks.py:1425 +#: cps/editbooks.py:1469 msgid "User has no rights to upload additional file formats" msgstr "Benutzer hat kein Recht zusätzliche Dateiformate hochzuladen" -#: cps/editbooks.py:1449 +#: cps/editbooks.py:1493 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Fehler beim Erzeugen des Pfads %(path)s (Zugriff verweigert)" -#: cps/editbooks.py:1456 +#: cps/editbooks.py:1500 #, python-format msgid "Failed to store file %(file)s." msgstr "Fehler beim Speichern der Datei %(file)s." -#: cps/editbooks.py:1481 +#: cps/editbooks.py:1525 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Dateiformat %(ext)s zu %(book)s hinzugefügt" @@ -690,9 +737,9 @@ msgstr "Bitte eine Minute warten vor der Registrierung des nächsten Benutzers" #: cps/error_handler.py:108 cps/templates/layout.html:69 #: cps/templates/layout.html:104 cps/templates/login.html:27 -#: cps/templates/register.html:17 cps/web.py:1292 cps/web.py:1296 -#: cps/web.py:1302 cps/web.py:1326 cps/web.py:1330 cps/web.py:1343 -#: cps/web.py:1346 +#: cps/templates/register.html:17 cps/web.py:1302 cps/web.py:1306 +#: cps/web.py:1312 cps/web.py:1336 cps/web.py:1340 cps/web.py:1353 +#: cps/web.py:1356 msgid "Register" msgstr "Registrieren" @@ -713,7 +760,7 @@ msgstr "Callback Domain ist nicht verifiziert, bitte Domain in der Google Develo msgid "%(format)s format not found for book id: %(book)d" msgstr "%(format)s Format für Buch-ID %(book)d nicht gefunden" -#: cps/helper.py:94 cps/tasks/convert.py:91 +#: cps/helper.py:94 cps/tasks/convert.py:92 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s von Buch %(fn)s nicht auf Google Drive gefunden" @@ -899,10 +946,6 @@ msgstr "Es werden nur jpg/jpeg Dateien als Cover unterstützt" msgid "Cover" msgstr "Titelbild" -#: cps/helper.py:1006 -msgid "UnRar binary file not found" -msgstr "UnRar Programm nicht gefunden" - #: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "Fehler beim Ausführen von UnRar" @@ -933,7 +976,7 @@ msgstr "Ausführberechtigung fehlt: %(missing)s" msgid "Error executing Calibre" msgstr "Fehler beim Ausführen von Calibre" -#: cps/helper.py:1154 cps/templates/admin.html:216 +#: cps/helper.py:1154 cps/templates/admin.html:232 msgid "Queue all books for metadata backup" msgstr "Alle Bücher für Metadaten Backup einreihen" @@ -955,7 +998,7 @@ msgstr "Anmelden mit %(provider)s" msgid "This %(oauth)s account is already linked to a different user" msgstr "" -#: cps/oauth_bb.py:147 cps/remotelogin.py:131 +#: cps/oauth_bb.py:147 cps/remotelogin.py:150 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "Du bist nun eingeloggt als '%(nickname)s'" @@ -1023,25 +1066,29 @@ msgstr "Google OAuth Fehler: {}" msgid "{} Stars" msgstr "{} Sterne" -#: cps/remotelogin.py:63 cps/templates/layout.html:68 -#: cps/templates/layout.html:103 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1361 -msgid "Login" -msgstr "Login" - -#: cps/remotelogin.py:75 cps/remotelogin.py:109 +#: cps/remotelogin.py:46 cps/remotelogin.py:128 msgid "Token not found" msgstr "Token wurde nicht gefunden" -#: cps/remotelogin.py:84 cps/remotelogin.py:117 +#: cps/remotelogin.py:55 cps/remotelogin.py:136 msgid "Token has expired" msgstr "Token ist abgelaufen" -#: cps/remotelogin.py:93 +#: cps/remotelogin.py:86 cps/remotelogin.py:112 cps/templates/layout.html:68 +#: cps/templates/layout.html:103 cps/templates/login.html:4 +#: cps/templates/login.html:21 cps/web.py:1371 +msgid "Login" +msgstr "Login" + +#: cps/remotelogin.py:100 +msgid "Token already approved" +msgstr "" + +#: cps/remotelogin.py:108 msgid "Success! Please return to your device" msgstr "Erfolg! Bitte zum Gerät zurückkehren" -#: cps/render_template.py:41 cps/web.py:421 +#: cps/render_template.py:41 cps/web.py:423 msgid "Books" msgstr "Bücher" @@ -1066,7 +1113,7 @@ msgstr "Heruntergeladene Bücher" msgid "Show Downloaded Books" msgstr "Zeige heruntergeladene Bücher" -#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:436 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:438 msgid "Top Rated Books" msgstr "Am besten bewertete Bücher" @@ -1075,7 +1122,7 @@ msgid "Show Top Rated Books" msgstr "Zeige am besten bewertete Bücher" #: cps/render_template.py:61 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:769 +#: cps/templates/index.xml:67 cps/web.py:771 msgid "Read Books" msgstr "Gelesene Bücher" @@ -1084,7 +1131,7 @@ msgid "Show Read and Unread" msgstr "Zeige gelesene/ungelesene Bücher" #: cps/render_template.py:65 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:772 +#: cps/templates/index.xml:74 cps/web.py:774 msgid "Unread Books" msgstr "Ungelesene Bücher" @@ -1102,7 +1149,7 @@ msgid "Show Random Books" msgstr "Zeige zufällige Bücher" #: cps/render_template.py:71 cps/templates/book_table.html:93 -#: cps/templates/index.xml:97 cps/web.py:1144 +#: cps/templates/index.xml:97 cps/web.py:1146 msgid "Categories" msgstr "Kategorien" @@ -1112,7 +1159,7 @@ msgstr "Zeige Abschnitt Kategorien" #: cps/render_template.py:74 cps/templates/book_edit.html:86 #: cps/templates/book_table.html:94 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1034 cps/web.py:1046 +#: cps/templates/search_form.html:70 cps/web.py:1036 cps/web.py:1048 msgid "Series" msgstr "Serien" @@ -1130,7 +1177,7 @@ msgid "Show Author Section" msgstr "Zeige Abschnitt Autoren" #: cps/render_template.py:81 cps/templates/book_table.html:98 -#: cps/templates/index.xml:88 cps/web.py:1002 +#: cps/templates/index.xml:88 cps/web.py:1004 msgid "Publishers" msgstr "Verleger" @@ -1140,7 +1187,7 @@ msgstr "Zeige Abschnitt Verleger" #: cps/render_template.py:84 cps/templates/book_table.html:96 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1116 +#: cps/web.py:1118 msgid "Languages" msgstr "Sprachen" @@ -1164,7 +1211,7 @@ msgstr "Dateiformate" msgid "Show File Formats Section" msgstr "Zeige Abschnitt Dateiformate" -#: cps/render_template.py:95 cps/web.py:795 +#: cps/render_template.py:95 cps/web.py:797 msgid "Archived Books" msgstr "Archivierte Bücher" @@ -1172,7 +1219,7 @@ msgstr "Archivierte Bücher" msgid "Show Archived Books" msgstr "Zeige archivierte Bücher" -#: cps/render_template.py:100 cps/web.py:831 +#: cps/render_template.py:100 cps/web.py:833 msgid "Books List" msgstr "Bücherliste" @@ -1405,150 +1452,154 @@ msgstr "Ein neues Update ist verfügbar. Klicke auf den Button unten, um auf Ver msgid "No release information available" msgstr "Keine Releaseinformationen verfügbar" -#: cps/templates/index.html:6 cps/web.py:448 +#: cps/templates/index.html:6 cps/web.py:450 msgid "Discover (Random Books)" msgstr "Entdecken (Zufällige Bücher)" -#: cps/web.py:484 +#: cps/web.py:486 msgid "Hot Books (Most Downloaded)" msgstr "Beliebte Bücher (meiste Downloads)" -#: cps/web.py:515 +#: cps/web.py:517 #, python-format msgid "Downloaded books by %(user)s" msgstr "Von %(user)s heruntergeladene Bücher" -#: cps/web.py:548 +#: cps/web.py:550 #, python-format msgid "Author: %(name)s" msgstr "Author: %(name)s" -#: cps/web.py:584 +#: cps/web.py:586 #, python-format msgid "Publisher: %(name)s" msgstr "Verleger: %(name)s" -#: cps/web.py:612 +#: cps/web.py:614 #, python-format msgid "Series: %(serie)s" msgstr "Serie: %(serie)s" -#: cps/web.py:626 +#: cps/web.py:628 msgid "Rating: None" msgstr "Bewertung: Keine" -#: cps/web.py:635 +#: cps/web.py:637 #, python-format msgid "Rating: %(rating)s stars" msgstr "Bewertung: %(rating)s Sterne" -#: cps/web.py:666 +#: cps/web.py:668 #, python-format msgid "File format: %(format)s" msgstr "Dateiformat: %(format)s" -#: cps/web.py:701 +#: cps/web.py:703 #, python-format msgid "Category: %(name)s" msgstr "Kategorie: %(name)s" -#: cps/web.py:730 +#: cps/web.py:732 #, python-format msgid "Language: %(name)s" msgstr "Sprache: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:974 +#: cps/templates/admin.html:16 cps/web.py:976 msgid "Downloads" msgstr "Downloads" -#: cps/web.py:1076 +#: cps/web.py:1078 msgid "Ratings list" msgstr "Bewertungsliste" -#: cps/web.py:1103 +#: cps/web.py:1105 msgid "File formats list" msgstr "Liste der Dateiformate" -#: cps/web.py:1264 +#: cps/web.py:1272 +msgid "Book format not supported" +msgstr "" + +#: cps/web.py:1274 msgid "Please configure the SMTP mail settings first..." msgstr "Bitte zuerst die SMTP-Einstellung konfigurieren..." -#: cps/web.py:1270 +#: cps/web.py:1280 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Buch erfolgreich zum Senden an %(eReadermail)s eingereiht" -#: cps/web.py:1273 +#: cps/web.py:1283 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Beim Senden des Buches trat ein Fehler auf: %(res)s" -#: cps/web.py:1275 +#: cps/web.py:1285 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Bitte zuerst die E-Reader E-Mailadresse konfigurieren." -#: cps/web.py:1291 cps/web.py:1342 +#: cps/web.py:1301 cps/web.py:1352 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "Der E-Mail Server ist nicht konfiguriert, bitte den Administrator kontaktieren." -#: cps/web.py:1328 +#: cps/web.py:1338 msgid "Oops! Your Email is not allowed." msgstr "Diese E-Mail ist nicht für die Registrierung zugelassen." -#: cps/web.py:1331 +#: cps/web.py:1341 msgid "Success! Confirmation Email has been sent." msgstr "Eine Bestätigungs-E-Mail wurde an deinen E-Mail Account versendet." -#: cps/web.py:1376 cps/web.py:1390 +#: cps/web.py:1386 cps/web.py:1400 msgid "Cannot activate LDAP authentication" msgstr "LDAP-Authentifizierung kann nicht aktiviert werden" -#: cps/web.py:1399 +#: cps/web.py:1409 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "Du bist nun eingeloggt als '%(nickname)s'" -#: cps/web.py:1406 +#: cps/web.py:1416 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Fallback Login als: '%(nickname)s', LDAP Server ist nicht erreichbar, oder der Nutzer ist unbekannt" -#: cps/web.py:1411 +#: cps/web.py:1421 #, python-format msgid "Could not login: %(message)s" msgstr "Login nicht erfolgreich: %(message)s" -#: cps/web.py:1415 cps/web.py:1440 +#: cps/web.py:1425 cps/web.py:1450 msgid "Wrong Username or Password" msgstr "Falscher Benutzername oder Passwort" -#: cps/web.py:1422 +#: cps/web.py:1432 msgid "New Password was sent to your email address" msgstr "Das neue Passwort wurde an die E-Mail Adresse verschickt" -#: cps/web.py:1426 +#: cps/web.py:1436 msgid "An unknown error occurred. Please try again later." msgstr "Es ist ein unbekannter Fehler aufgetreten. Bitte später erneut versuchen." -#: cps/web.py:1428 +#: cps/web.py:1438 msgid "Please enter valid username to reset password" msgstr "Bitte einen gültigen Benutzernamen zum Zurücksetzen des Passworts angeben" -#: cps/web.py:1436 +#: cps/web.py:1446 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Du bist nun eingeloggt als: '%(nickname)s'" -#: cps/web.py:1501 cps/web.py:1551 +#: cps/web.py:1511 cps/web.py:1561 #, python-format msgid "%(name)s's Profile" msgstr "%(name)s's Profil" -#: cps/web.py:1517 +#: cps/web.py:1527 msgid "Success! Profile Updated" msgstr "Profil aktualisiert" -#: cps/web.py:1521 +#: cps/web.py:1531 msgid "Oops! An account already exists for this Email." msgstr "Es existiert bereits ein Benutzer für diese E-Mailadresse." @@ -1560,46 +1611,46 @@ msgstr "Keine gültige gmail.json Datei mit OAuth informationen gefunden" msgid "Delete temp folder contents" msgstr "Temp Ordner Inhalt löschen" -#: cps/tasks/convert.py:112 +#: cps/tasks/convert.py:113 #, python-format msgid "%(book)s send to E-Reader" msgstr "%(book)s an E-Reader gesendet" -#: cps/tasks/convert.py:177 +#: cps/tasks/convert.py:180 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre E-Book Konverter %(tool)s nicht gefunden" -#: cps/tasks/convert.py:211 +#: cps/tasks/convert.py:214 #, python-format msgid "%(format)s format not found on disk" msgstr "%(format)s Format nicht gefunden" -#: cps/tasks/convert.py:215 +#: cps/tasks/convert.py:218 msgid "Ebook converter failed with unknown error" msgstr "E-Book Converter mit unbekanntem Fehler fehlgeschlagen" -#: cps/tasks/convert.py:234 +#: cps/tasks/convert.py:237 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify Konverter Aufruf fehlgeschlagen: %(error)s" -#: cps/tasks/convert.py:254 +#: cps/tasks/convert.py:257 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Konvertierte Datei nicht gefunden, oder mehr als eine Datei im Pfad %(folder)s" -#: cps/tasks/convert.py:291 cps/tasks/convert.py:342 +#: cps/tasks/convert.py:294 cps/tasks/convert.py:345 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre fehlgeschlagen mit Fehler: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:322 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Fehler des E-Book-Converters: %(error)s" -#: cps/tasks/convert.py:347 +#: cps/tasks/convert.py:350 msgid "Convert" msgstr "Konvertiere" @@ -1685,7 +1736,7 @@ msgstr "Editieren" #: cps/templates/admin.html:25 cps/templates/book_edit.html:17 #: cps/templates/book_table.html:131 cps/templates/book_table.html:180 -#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:115 +#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:117 #: cps/templates/user_edit.html:67 cps/templates/user_table.html:149 msgid "Delete" msgstr "Löschen" @@ -1775,128 +1826,145 @@ msgstr "Remotelogin ('Magischer Link')" msgid "Reverse Proxy Login" msgstr "Reverse Proxy Login" -#: cps/templates/admin.html:154 cps/templates/config_edit.html:176 +#: cps/templates/admin.html:154 cps/templates/config_edit.html:180 msgid "Reverse Proxy Header Name" msgstr "Reverse Proxy Header Name" -#: cps/templates/admin.html:159 +#: cps/templates/admin.html:158 +msgid "Reverse Proxy Trusted IPs/CIDRs" +msgstr "" + +#: cps/templates/admin.html:162 cps/templates/config_edit.html:193 +msgid "Reverse Proxy Shared Secret Header Name" +msgstr "" + +#: cps/templates/admin.html:166 +msgid "Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/admin.html:170 +msgid "Reverse Proxy Shared Secret Configured" +msgstr "" + +#: cps/templates/admin.html:175 msgid "Edit Calibre Database Configuration" msgstr "Calibre Datenbank Konfiguration editieren" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:176 msgid "Edit Basic Configuration" msgstr "Basis-Einstellungen editieren" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:177 msgid "Edit UI Configuration" msgstr "Benutzeroberfläche editieren" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:183 msgid "Scheduled Tasks" msgstr "Geplante Aufgaben" -#: cps/templates/admin.html:170 cps/templates/schedule_edit.html:12 +#: cps/templates/admin.html:186 cps/templates/schedule_edit.html:12 #: cps/templates/tasks.html:18 msgid "Start Time" msgstr "Startzeit" -#: cps/templates/admin.html:174 cps/templates/schedule_edit.html:20 +#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:20 msgid "Maximum Duration" msgstr "Maximale Aufgabendauer" -#: cps/templates/admin.html:178 cps/templates/schedule_edit.html:29 +#: cps/templates/admin.html:194 cps/templates/schedule_edit.html:29 msgid "Generate Thumbnails" msgstr "Buchcover Miniaturansichten erzeugen" -#: cps/templates/admin.html:182 +#: cps/templates/admin.html:198 msgid "Generate series cover thumbnails" msgstr "Seriencover Miniaturansichten erzeugen" -#: cps/templates/admin.html:186 cps/templates/admin.html:208 +#: cps/templates/admin.html:202 cps/templates/admin.html:224 #: cps/templates/schedule_edit.html:37 msgid "Reconnect Calibre Database" msgstr "Mit Calibre Bibliothek neu verbinden" -#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 +#: cps/templates/admin.html:206 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" msgstr "Metadaten Backup Datei erzeugen" -#: cps/templates/admin.html:197 +#: cps/templates/admin.html:213 msgid "Refresh Thumbnail Cache" msgstr "Cover Miniaturansichten aktualisieren" -#: cps/templates/admin.html:203 +#: cps/templates/admin.html:219 msgid "Administration" msgstr "Administration" -#: cps/templates/admin.html:204 +#: cps/templates/admin.html:220 msgid "Download Debug Package" msgstr "Debug Daten herunterladen" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:221 msgid "View Logs" msgstr "Logdateien ansehen" -#: cps/templates/admin.html:211 +#: cps/templates/admin.html:227 msgid "Restart" msgstr "Neustart" -#: cps/templates/admin.html:212 +#: cps/templates/admin.html:228 msgid "Shutdown" msgstr "Calibre-Web beenden" -#: cps/templates/admin.html:221 +#: cps/templates/admin.html:237 msgid "Version Information" msgstr "Versionsinformation" -#: cps/templates/admin.html:225 +#: cps/templates/admin.html:241 msgid "Version" msgstr "Version" -#: cps/templates/admin.html:226 +#: cps/templates/admin.html:242 msgid "Details" msgstr "Details" -#: cps/templates/admin.html:232 +#: cps/templates/admin.html:248 msgid "Current Version" msgstr "Aktuelle Version" -#: cps/templates/admin.html:239 +#: cps/templates/admin.html:255 msgid "Check for Update" msgstr "Nach Update suchen" -#: cps/templates/admin.html:240 +#: cps/templates/admin.html:256 msgid "Perform Update" msgstr "Update durchführen" -#: cps/templates/admin.html:253 +#: cps/templates/admin.html:269 msgid "Are you sure you want to restart?" msgstr "Calibre-Web wirklich neustarten?" -#: cps/templates/admin.html:258 cps/templates/admin.html:272 -#: cps/templates/admin.html:292 cps/templates/config_db.html:82 +#: cps/templates/admin.html:274 cps/templates/admin.html:288 +#: cps/templates/admin.html:308 cps/templates/config_db.html:82 msgid "OK" msgstr "OK" -#: cps/templates/admin.html:259 cps/templates/admin.html:273 +#: cps/templates/admin.html:275 cps/templates/admin.html:289 #: cps/templates/book_edit.html:220 cps/templates/book_table.html:162 #: cps/templates/book_table.html:181 cps/templates/book_table.html:201 #: cps/templates/book_table.html:221 cps/templates/book_table.html:241 #: cps/templates/book_table.html:261 cps/templates/book_table.html:316 -#: cps/templates/config_db.html:66 cps/templates/config_edit.html:431 +#: cps/templates/config_db.html:66 cps/templates/config_edit.html:453 #: cps/templates/config_view_edit.html:175 cps/templates/detail.html:350 -#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:98 -#: cps/templates/modal_dialogs.html:116 cps/templates/modal_dialogs.html:134 +#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:100 +#: cps/templates/modal_dialogs.html:118 cps/templates/modal_dialogs.html:136 +#: cps/templates/remote_login_verify.html:16 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 #: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Abbruch" -#: cps/templates/admin.html:271 +#: cps/templates/admin.html:287 msgid "Are you sure you want to shutdown?" msgstr "Calibre-Web wirklich anhalten?" -#: cps/templates/admin.html:283 +#: cps/templates/admin.html:299 msgid "Updating, please do not reload this page" msgstr "Updatevorgang, Seite bitte nicht neu laden" @@ -2137,7 +2205,7 @@ msgid "Fetch Metadata" msgstr "Metadaten laden" #: cps/templates/book_edit.html:219 cps/templates/config_db.html:65 -#: cps/templates/config_edit.html:430 cps/templates/config_view_edit.html:174 +#: cps/templates/config_edit.html:452 cps/templates/config_view_edit.html:174 #: cps/templates/email_edit.html:65 cps/templates/schedule_edit.html:44 #: cps/templates/shelf_edit.html:25 cps/templates/shelf_order.html:41 #: cps/templates/user_edit.html:142 @@ -2509,214 +2577,234 @@ msgstr "Google Books API Schlüssel" msgid "Allow Reverse Proxy Authentication" msgstr "Reverse Proxy Authentifizierung zulassen" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:176 +msgid "Security Warning" +msgstr "" + +#: cps/templates/config_edit.html:177 +msgid "Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled." +msgstr "" + +#: cps/templates/config_edit.html:184 +msgid "Reverse Proxy Trusted IPs/CIDRs (Comma Separated)" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "Enable Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/config_edit.html:197 +msgid "Reverse Proxy Shared Secret" +msgstr "" + +#: cps/templates/config_edit.html:205 msgid "Login type" msgstr "Logintyp" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:207 msgid "Use Standard Authentication" msgstr "Benutze Standard Authentifizierung" -#: cps/templates/config_edit.html:187 +#: cps/templates/config_edit.html:209 msgid "Use LDAP Authentication" msgstr "Benutze LDAP-Login" -#: cps/templates/config_edit.html:190 +#: cps/templates/config_edit.html:212 msgid "Use OAuth" msgstr "Benutze OAuth" -#: cps/templates/config_edit.html:197 +#: cps/templates/config_edit.html:219 msgid "LDAP Server Host Name or IP Address" msgstr "LDAP-Server Hostname oder IP-Adresse" -#: cps/templates/config_edit.html:201 +#: cps/templates/config_edit.html:223 msgid "LDAP Server Port" msgstr "LDAP Server Port" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:227 msgid "LDAP Encryption" msgstr "LDAP Verschlüsselung" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:230 msgid "TLS" msgstr "TLS" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:231 msgid "SSL" msgstr "SSL" -#: cps/templates/config_edit.html:213 +#: cps/templates/config_edit.html:235 msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" msgstr "LDAP CA-Zertifikat Pfad (Nur für Client Zertifikat Authentifizierung benötigt)" -#: cps/templates/config_edit.html:220 +#: cps/templates/config_edit.html:242 msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" msgstr "LDAP Zertifikat Pfad (Nur für Client Zertifikat Authentifizierung benötigt)" -#: cps/templates/config_edit.html:227 +#: cps/templates/config_edit.html:249 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" msgstr "LDAP Keyfile Pfad (Nur für Client Zertifikat Authentifizierung benötigt)" -#: cps/templates/config_edit.html:236 +#: cps/templates/config_edit.html:258 msgid "LDAP Authentication" msgstr "LDAP Authentifizierung" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:260 msgid "Anonymous" msgstr "Anonym" -#: cps/templates/config_edit.html:239 +#: cps/templates/config_edit.html:261 msgid "Unauthenticated" msgstr "Unauthentifiziert" -#: cps/templates/config_edit.html:240 +#: cps/templates/config_edit.html:262 msgid "Simple" msgstr "Einfach" -#: cps/templates/config_edit.html:245 +#: cps/templates/config_edit.html:267 msgid "LDAP Administrator Username" msgstr "LDAP Administrator Benutzername" -#: cps/templates/config_edit.html:251 +#: cps/templates/config_edit.html:273 msgid "LDAP Administrator Password" msgstr "LDAP Administrator Passwort" -#: cps/templates/config_edit.html:256 +#: cps/templates/config_edit.html:278 msgid "LDAP Distinguished Name (DN)" msgstr "LDAP Distinguished Name (DN)" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:282 msgid "LDAP User Object Filter" msgstr "LDAP User Object Filter" -#: cps/templates/config_edit.html:265 +#: cps/templates/config_edit.html:287 msgid "LDAP Server is OpenLDAP?" msgstr "Ist der LDAP-Server ein OpenLDAP-Server?" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:289 msgid "Following Settings are Needed For User Import" msgstr "Die nachfolgenden Einstellungen werden nur für den Benutzerimport benötigt" -#: cps/templates/config_edit.html:269 +#: cps/templates/config_edit.html:291 msgid "LDAP Group Object Filter" msgstr "LDAP Gruppen Objekt Filter" -#: cps/templates/config_edit.html:273 +#: cps/templates/config_edit.html:295 msgid "LDAP Group Name" msgstr "LDAP Gruppen Name" -#: cps/templates/config_edit.html:277 +#: cps/templates/config_edit.html:299 msgid "LDAP Group Members Field" msgstr "LDAP Gruppen Mitglieds Feld" -#: cps/templates/config_edit.html:281 +#: cps/templates/config_edit.html:303 msgid "LDAP Member User Filter Detection" msgstr "LDAP Member User Filter Erkennung" -#: cps/templates/config_edit.html:283 +#: cps/templates/config_edit.html:305 msgid "Autodetect" msgstr "Automatisch erkennen" -#: cps/templates/config_edit.html:284 +#: cps/templates/config_edit.html:306 msgid "Custom Filter" msgstr "Benutzerdefinierter Filter" -#: cps/templates/config_edit.html:289 +#: cps/templates/config_edit.html:311 msgid "LDAP Member User Filter" msgstr "LDAP Member User Filter" -#: cps/templates/config_edit.html:300 +#: cps/templates/config_edit.html:322 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "Erhalte %(provider)s OAuth Berechtigungen" -#: cps/templates/config_edit.html:303 +#: cps/templates/config_edit.html:325 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "%(provider)s OAuth Client Id" -#: cps/templates/config_edit.html:307 +#: cps/templates/config_edit.html:329 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "%(provider)s OAuth Client Secret" -#: cps/templates/config_edit.html:323 +#: cps/templates/config_edit.html:345 msgid "External binaries" msgstr "Externe Programme" -#: cps/templates/config_edit.html:329 +#: cps/templates/config_edit.html:351 msgid "Path to Calibre Binaries" msgstr "Pfad zu Calibre Dateien" -#: cps/templates/config_edit.html:337 +#: cps/templates/config_edit.html:359 msgid "Calibre E-Book Converter Settings" msgstr "Calibre E-Book Konverter Einstellungen" -#: cps/templates/config_edit.html:340 +#: cps/templates/config_edit.html:362 msgid "Path to Kepubify E-Book Converter" msgstr "Pfad zum Kepubify E-Book Konverter" -#: cps/templates/config_edit.html:348 +#: cps/templates/config_edit.html:370 msgid "Location of Unrar binary" msgstr "Pfad zur UnRar-Binärdatei" -#: cps/templates/config_edit.html:364 +#: cps/templates/config_edit.html:386 msgid "Security Settings" msgstr "Sicherheitseinstellungen" -#: cps/templates/config_edit.html:372 +#: cps/templates/config_edit.html:394 msgid "Limit failed login attempts" msgstr "Login Fehlversuche begrenzen" -#: cps/templates/config_edit.html:376 +#: cps/templates/config_edit.html:398 msgid "Configure Backend for Limiter" msgstr "Backend für Limiter konfigurieren" -#: cps/templates/config_edit.html:380 +#: cps/templates/config_edit.html:402 msgid "Options for Limiter Backend" msgstr "Optionen für Limiter Backend" -#: cps/templates/config_edit.html:386 +#: cps/templates/config_edit.html:408 msgid "Check if file extensions matches file content on upload" msgstr "Überprüfe bei Upload ob Dateiinhalt zur Endung passt" -#: cps/templates/config_edit.html:389 +#: cps/templates/config_edit.html:411 msgid "Session protection" msgstr "Sessionschutz" -#: cps/templates/config_edit.html:391 +#: cps/templates/config_edit.html:413 msgid "Basic" msgstr "Einfach" -#: cps/templates/config_edit.html:392 +#: cps/templates/config_edit.html:414 msgid "Strong" msgstr "Stark" -#: cps/templates/config_edit.html:397 +#: cps/templates/config_edit.html:419 msgid "User Password policy" msgstr "Passwortregeln" -#: cps/templates/config_edit.html:401 +#: cps/templates/config_edit.html:423 msgid "Minimum password length" msgstr "Minimale Passwortlänge" -#: cps/templates/config_edit.html:406 +#: cps/templates/config_edit.html:428 msgid "Enforce number" msgstr "Erzwinge Zahl" -#: cps/templates/config_edit.html:410 +#: cps/templates/config_edit.html:432 msgid "Enforce lowercase characters" msgstr "Erzwinge Kleinbuchstaben" -#: cps/templates/config_edit.html:414 +#: cps/templates/config_edit.html:436 msgid "Enforce uppercase characters" msgstr "Erzwinge Großbuchstaben" -#: cps/templates/config_edit.html:418 +#: cps/templates/config_edit.html:440 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" msgstr "Zeichen erzwingen (erforderlich für chinesische/japanische/koreanische Zeichen)" -#: cps/templates/config_edit.html:422 +#: cps/templates/config_edit.html:444 msgid "Enforce special characters" msgstr "Erzwinge Spezialzeichen" @@ -3183,27 +3271,27 @@ msgstr "Bücher müssen zuerst archiviert werden und dann mit dem Gerät synchro msgid "Choose File Location" msgstr "Dateispeicherort auswählen" -#: cps/templates/modal_dialogs.html:81 +#: cps/templates/modal_dialogs.html:82 msgid "type" msgstr "Typ" -#: cps/templates/modal_dialogs.html:82 +#: cps/templates/modal_dialogs.html:83 msgid "name" msgstr "Name" -#: cps/templates/modal_dialogs.html:83 +#: cps/templates/modal_dialogs.html:84 msgid "size" msgstr "Größe" -#: cps/templates/modal_dialogs.html:89 +#: cps/templates/modal_dialogs.html:90 msgid "Parent Directory" msgstr "Übergeordnetes Verzeichnis" -#: cps/templates/modal_dialogs.html:97 +#: cps/templates/modal_dialogs.html:99 msgid "Select" msgstr "Auswahl" -#: cps/templates/modal_dialogs.html:133 cps/templates/tasks.html:46 +#: cps/templates/modal_dialogs.html:135 cps/templates/tasks.html:46 msgid "Ok" msgstr "Ok" @@ -3459,6 +3547,31 @@ msgstr "Danach wirst du automatisch auf diesem Gerät eingeloggt sein." msgid "This verification link will expire in 10 minutes." msgstr "Dieser Link wird in 10 Minuten ablaufen." +#: cps/templates/remote_login_verify.html:4 +msgid "Approve Magic Link Login" +msgstr "" + +#: cps/templates/remote_login_verify.html:5 +msgid "Review the device that requested access before approving this login." +msgstr "" + +#: cps/templates/remote_login_verify.html:7 +msgid "IP address" +msgstr "" + +#: cps/templates/remote_login_verify.html:9 +msgid "Browser" +msgstr "" + +#: cps/templates/remote_login_verify.html:12 +#, python-format +msgid "If you approve this request, the device that started it will be logged in as %(username)s." +msgstr "" + +#: cps/templates/remote_login_verify.html:15 +msgid "Approve Login" +msgstr "" + #: cps/templates/schedule_edit.html:33 msgid "Generate Series Cover Thumbnails" msgstr "Thumbnails für Serien Cover erzeugen" diff --git a/cps/translations/el/LC_MESSAGES/messages.mo b/cps/translations/el/LC_MESSAGES/messages.mo index 6feffa6c72cbc698a0bc0869017e2c63091e4ec6..d9b7056b2a6e0704b891cc6276a46b182a23e20c 100644 GIT binary patch delta 8669 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 delta 8751 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 PLi2(Wi#G4r_lOe!^(nKx diff --git a/cps/translations/el/LC_MESSAGES/messages.po b/cps/translations/el/LC_MESSAGES/messages.po index 29137b52c..efac41954 100644 --- a/cps/translations/el/LC_MESSAGES/messages.po +++ b/cps/translations/el/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: 2026-08-01 11:42+0200\n" +"POT-Creation-Date: 2026-08-08 16:08+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Depountis Georgios\n" "Language: el\n" @@ -15,519 +15,558 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" +"Generated-By: Babel 2.18.0\n" #: cps/about.py:85 msgid "Statistics" msgstr "Στατιστικά" -#: cps/admin.py:151 +#: cps/admin.py:154 msgid "Server restarted, please reload page." msgstr "" -#: cps/admin.py:153 +#: cps/admin.py:156 msgid "Performing Server shutdown, please close window." msgstr "" -#: cps/admin.py:161 +#: cps/admin.py:164 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:164 +#: cps/admin.py:167 msgid "Unknown command" msgstr "Άγνωστη εντολή" -#: cps/admin.py:175 +#: cps/admin.py:178 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "" -#: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 -#: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 -#: cps/uploader.py:117 +#: cps/admin.py:211 cps/editbooks.py:825 cps/editbooks.py:875 +#: cps/editbooks.py:1564 cps/templates/remote_login_verify.html:8 +#: cps/templates/remote_login_verify.html:10 cps/updater.py:615 +#: cps/uploader.py:117 cps/uploader.py:126 msgid "Unknown" msgstr "ʼΑγνωστο" -#: cps/admin.py:233 +#: cps/admin.py:236 msgid "Admin page" msgstr "Σελίδα διαχειριστή" -#: cps/admin.py:253 +#: cps/admin.py:256 msgid "Basic Configuration" msgstr "Βασική Διαμόρφωση" -#: cps/admin.py:291 +#: cps/admin.py:294 msgid "UI Configuration" msgstr "UI Διαμόρφωση" -#: cps/admin.py:315 cps/admin.py:1002 cps/db.py:809 cps/search.py:150 -#: cps/web.py:750 +#: cps/admin.py:318 cps/admin.py:1005 cps/db.py:809 cps/search.py:150 +#: cps/web.py:752 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "" -#: cps/admin.py:333 cps/templates/admin.html:51 +#: cps/admin.py:336 cps/templates/admin.html:51 msgid "Edit Users" msgstr "" -#: cps/admin.py:378 cps/opds.py:559 cps/templates/grid.html:14 +#: cps/admin.py:381 cps/opds.py:559 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Όλα" -#: cps/admin.py:401 cps/admin.py:1432 +#: cps/admin.py:404 cps/admin.py:1460 msgid "User not found" msgstr "Δεν βρέθηκε χρήστης" -#: cps/admin.py:415 +#: cps/admin.py:418 #, python-brace-format msgid "{} users deleted successfully" msgstr "" -#: cps/admin.py:438 cps/templates/config_view_edit.html:133 +#: cps/admin.py:441 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Προβολή Όλων" -#: cps/admin.py:459 cps/admin.py:465 +#: cps/admin.py:462 cps/admin.py:468 msgid "Malformed request" msgstr "" -#: cps/admin.py:477 cps/admin.py:2078 +#: cps/admin.py:480 cps/admin.py:2156 msgid "Guest Name can't be changed" msgstr "" -#: cps/admin.py:489 +#: cps/admin.py:492 msgid "Guest can't have this role" msgstr "" -#: cps/admin.py:501 cps/admin.py:2032 +#: cps/admin.py:504 cps/admin.py:2110 msgid "No admin user remaining, can't remove admin role" msgstr "Δεν έχει απομείνει χρήστης διαχειριστής, δεν μπορεί να αφαιρεθεί ο ρόλος διαχειριστή" -#: cps/admin.py:505 cps/admin.py:519 +#: cps/admin.py:508 cps/admin.py:522 msgid "Value has to be true or false" msgstr "" -#: cps/admin.py:507 +#: cps/admin.py:510 msgid "Invalid role" msgstr "" -#: cps/admin.py:511 +#: cps/admin.py:514 msgid "Guest can't have this view" msgstr "" -#: cps/admin.py:521 +#: cps/admin.py:524 msgid "Invalid view" msgstr "" -#: cps/admin.py:524 +#: cps/admin.py:527 msgid "Guest's Locale is determined automatically and can't be set" msgstr "" -#: cps/admin.py:528 +#: cps/admin.py:531 msgid "No Valid Locale Given" msgstr "" -#: cps/admin.py:539 +#: cps/admin.py:542 msgid "No Valid Book Language Given" msgstr "" -#: cps/admin.py:541 cps/editbooks.py:243 cps/editbooks.py:428 -#: cps/editbooks.py:430 +#: cps/admin.py:544 cps/editbooks.py:260 cps/editbooks.py:445 +#: cps/editbooks.py:447 msgid "Parameter not found" msgstr "" -#: cps/admin.py:578 +#: cps/admin.py:581 msgid "Invalid Read Column" msgstr "" -#: cps/admin.py:584 +#: cps/admin.py:587 msgid "Invalid Restricted Column" msgstr "" -#: cps/admin.py:604 cps/admin.py:1903 +#: cps/admin.py:607 cps/admin.py:1981 msgid "Calibre-Web configuration updated" msgstr "Ενημερώθηκε η διαμόρφωση Calibre-Web" -#: cps/admin.py:616 +#: cps/admin.py:619 msgid "Do you really want to delete the Kobo Token?" msgstr "Θέλεις πραγματικά να διαγράψεις τη Μονάδα Kobo;" -#: cps/admin.py:618 +#: cps/admin.py:621 msgid "Do you really want to delete this domain?" msgstr "" -#: cps/admin.py:620 +#: cps/admin.py:623 msgid "Do you really want to delete this user?" msgstr "" -#: cps/admin.py:622 +#: cps/admin.py:625 msgid "Do you really want to delete this book?" msgstr "" -#: cps/admin.py:624 +#: cps/admin.py:627 msgid "Are you sure you want to delete this shelf?" msgstr "Είσαι σίγουρος/η πως θέλεις να διαγράψεις αυτό το ράφι;" -#: cps/admin.py:626 +#: cps/admin.py:629 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "" -#: cps/admin.py:628 +#: cps/admin.py:631 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "" -#: cps/admin.py:630 +#: cps/admin.py:633 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "" -#: cps/admin.py:632 +#: cps/admin.py:635 msgid "Are you sure you want to change the archive status for the selected book(s)?" msgstr "" -#: cps/admin.py:634 +#: cps/admin.py:637 msgid "Are you sure you want to change the read status for the selected book(s)?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:639 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "" -#: cps/admin.py:638 +#: cps/admin.py:641 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "" -#: cps/admin.py:641 +#: cps/admin.py:644 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "" -#: cps/admin.py:643 +#: cps/admin.py:646 msgid "Are you sure you want to change Calibre library location?" msgstr "" -#: cps/admin.py:645 +#: cps/admin.py:648 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "" -#: cps/admin.py:648 +#: cps/admin.py:651 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "" -#: cps/admin.py:891 cps/admin.py:897 cps/admin.py:907 cps/admin.py:917 +#: cps/admin.py:894 cps/admin.py:900 cps/admin.py:910 cps/admin.py:920 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Απόρριψη" -#: cps/admin.py:893 cps/admin.py:899 cps/admin.py:909 cps/admin.py:919 +#: cps/admin.py:896 cps/admin.py:902 cps/admin.py:912 cps/admin.py:922 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Επιτρέπεται" -#: cps/admin.py:952 +#: cps/admin.py:955 #, python-brace-format msgid "{} sync entries deleted" msgstr "" -#: cps/admin.py:993 +#: cps/admin.py:996 msgid "Tag not found" msgstr "" -#: cps/admin.py:1011 +#: cps/admin.py:1014 msgid "Invalid Action" msgstr "" -#: cps/admin.py:1138 +#: cps/admin.py:1137 +#, python-format +msgid "Invalid reverse proxy trusted IP/CIDR entry: %(entry)s" +msgstr "" + +#: cps/admin.py:1148 +#, python-format +msgid "Invalid %(label)s: %(value)s" +msgstr "" + +#: cps/admin.py:1166 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json Δεν Έχει Διαμορφωθεί Για Διαδικτυακή Εφαρμογή" -#: cps/admin.py:1183 +#: cps/admin.py:1211 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "Το Φύλλο Καταγραφής Τοποθεσίας δεν είναι Έγκυρο, Παρακαλούμε Συμπλήρωσε Τη Σωστή Πορεία" -#: cps/admin.py:1189 +#: cps/admin.py:1217 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "Η Πρόσβαση Φύλλου Καταγραφης Τοποθεσίας δεν είναι έγκυρη, Παρακαλούμε Συμπλήρωσε Τη Σωστή Πορεία" -#: cps/admin.py:1223 +#: cps/admin.py:1251 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Παρακαλούμε Συμπλήρωσε ένα Πάροχο LDAP, Θύρα, DN και Αντικείμενο Αναγνώρισης Χρήστη" -#: cps/admin.py:1229 +#: cps/admin.py:1257 msgid "Please Enter a LDAP Service Account and Password" msgstr "" -#: cps/admin.py:1232 +#: cps/admin.py:1260 msgid "Please Enter a LDAP Service Account" msgstr "" -#: cps/admin.py:1237 +#: cps/admin.py:1265 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "Το Αντικείμενο Φίλτρου Ομάδας LDAP Πρέπει να Έχει Μια \"%s\" Αναγνώριση Μορφής" -#: cps/admin.py:1239 +#: cps/admin.py:1267 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "Το Αντικείμενο Φίλτρου Ομάδας LDAP Έχει Παρενθέσεις Που Δεν Ταιριάζουν" -#: cps/admin.py:1243 +#: cps/admin.py:1271 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "Το Αντικείμενο Φίλτρου Χρήστη LDAP πρέπει να Έχει Μια \"%s\" Αναγνώριση Μορφής" -#: cps/admin.py:1245 +#: cps/admin.py:1273 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "Το Αντικείμενο Φίλτρου Χρήστη LDAP Έχει Παρενθέσεις Που Δεν Ταιριάζουν" -#: cps/admin.py:1252 +#: cps/admin.py:1280 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1254 +#: cps/admin.py:1282 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1261 +#: cps/admin.py:1289 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1292 cps/templates/admin.html:53 +#: cps/admin.py:1320 cps/templates/admin.html:53 msgid "Add New User" msgstr "Προσθήκη Νέου Χρήστη" -#: cps/admin.py:1301 cps/templates/admin.html:100 +#: cps/admin.py:1329 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Επεξεργασία Ρυθμίσεων E-mail Διακομιστή" -#: cps/admin.py:1320 +#: cps/admin.py:1348 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1340 cps/admin.py:1343 cps/admin.py:1728 cps/admin.py:1887 -#: cps/admin.py:1985 cps/admin.py:2106 cps/editbooks.py:169 -#: cps/editbooks.py:755 cps/editbooks.py:1474 cps/shelf.py:90 cps/shelf.py:144 +#: cps/admin.py:1368 cps/admin.py:1371 cps/admin.py:1756 cps/admin.py:1965 +#: cps/admin.py:2063 cps/admin.py:2184 cps/editbooks.py:170 +#: cps/editbooks.py:772 cps/editbooks.py:1518 cps/shelf.py:90 cps/shelf.py:144 #: cps/shelf.py:194 cps/shelf.py:237 cps/shelf.py:287 cps/shelf.py:327 -#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:160 cps/web.py:1526 +#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:161 cps/web.py:1536 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Σφάλμα βάσης δεδομένων: %(error)s." -#: cps/admin.py:1350 +#: cps/admin.py:1378 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1353 +#: cps/admin.py:1381 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Παρουσιάστηκε σφάλμα κατά την αποστολή του δοκιμαστικού e-mail:% (res)s" -#: cps/admin.py:1355 +#: cps/admin.py:1383 msgid "Please configure your e-mail address first..." msgstr "Παρακαλούμε ρύθμισε πρώτα τη διεύθυνση e-mail σου..." -#: cps/admin.py:1357 +#: cps/admin.py:1385 msgid "Email Server Settings updated" msgstr "Ενημερώθηκαν οι ρυθμίσεις E-mail διακομιστή" -#: cps/admin.py:1380 cps/templates/admin.html:195 +#: cps/admin.py:1408 cps/templates/admin.html:211 msgid "Edit Scheduled Tasks Settings" msgstr "" -#: cps/admin.py:1392 +#: cps/admin.py:1420 msgid "Invalid start time for task specified" msgstr "" -#: cps/admin.py:1397 +#: cps/admin.py:1425 msgid "Invalid duration for task specified" msgstr "" -#: cps/admin.py:1407 +#: cps/admin.py:1435 msgid "Scheduled tasks settings updated" msgstr "" -#: cps/admin.py:1417 cps/admin.py:1466 cps/admin.py:2102 cps/web.py:1325 +#: cps/admin.py:1445 cps/admin.py:1494 cps/admin.py:2180 cps/web.py:1335 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Προέκυψε ένα άγνωστο σφάλμα. Παρακαλούμε δοκίμασε ξανά αργότερα." -#: cps/admin.py:1421 +#: cps/admin.py:1449 msgid "Settings DB is not Writeable" msgstr "" -#: cps/admin.py:1451 cps/admin.py:2094 +#: cps/admin.py:1479 cps/admin.py:2172 #, python-format msgid "Edit User %(nick)s" msgstr "Επεξεργασία χρήστη %(nick)s" -#: cps/admin.py:1463 +#: cps/admin.py:1491 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "" -#: cps/admin.py:1469 +#: cps/admin.py:1497 msgid "Oops! Please configure the SMTP mail settings." msgstr "" -#: cps/admin.py:1480 +#: cps/admin.py:1508 msgid "Logfile viewer" msgstr "Προβολέας αρχείου φύλλου καταγραφής" -#: cps/admin.py:1546 +#: cps/admin.py:1574 msgid "Requesting update package" msgstr "Αίτημα πακέτου ενημέρωσης" -#: cps/admin.py:1547 +#: cps/admin.py:1575 msgid "Downloading update package" msgstr "Κατεβάζει πακέτο ενημέρωσης" -#: cps/admin.py:1548 +#: cps/admin.py:1576 msgid "Unzipping update package" msgstr "Ανοίγει πακέτο ενημέρωσης" -#: cps/admin.py:1549 +#: cps/admin.py:1577 msgid "Replacing files" msgstr "Αντικατάσταση αρχείων" -#: cps/admin.py:1550 +#: cps/admin.py:1578 msgid "Database connections are closed" msgstr "Οι συνδέσεις βάσης δεδομένων είναι κλειστές" -#: cps/admin.py:1551 +#: cps/admin.py:1579 msgid "Stopping server" msgstr "Σταματάει το διακομιστή" -#: cps/admin.py:1552 +#: cps/admin.py:1580 msgid "Update finished, please press okay and reload page" msgstr "Η ενημέρωση τελειώσε, παρακαλούμε πιέστε το εντάξει και φορτώστε ξανά τη σελίδα" -#: cps/admin.py:1553 cps/admin.py:1554 cps/admin.py:1555 cps/admin.py:1556 -#: cps/admin.py:1557 cps/admin.py:1558 +#: cps/admin.py:1581 cps/admin.py:1582 cps/admin.py:1583 cps/admin.py:1584 +#: cps/admin.py:1585 cps/admin.py:1586 msgid "Update failed:" msgstr "Η ενημέρωση απέτυχε:" -#: cps/admin.py:1553 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1581 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP Σφάλμα" -#: cps/admin.py:1554 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1582 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Σφάλμα σύνδεσης" -#: cps/admin.py:1555 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1583 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Τελείωσε ο χρόνος κατά την προσπάθεια δημιουργίας σύνδεσης" -#: cps/admin.py:1556 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1584 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Γενικό σφάλμα" -#: cps/admin.py:1557 +#: cps/admin.py:1585 msgid "Update file could not be saved in temp dir" msgstr "" -#: cps/admin.py:1558 +#: cps/admin.py:1586 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1582 +#: cps/admin.py:1610 msgid "Failed to extract at least One LDAP User" msgstr "" -#: cps/admin.py:1627 +#: cps/admin.py:1655 msgid "Failed to Create at Least One LDAP User" msgstr "Αποτυχία Δημιουργίας Τουλάχιστον Ενός Χρήστη LDAP" -#: cps/admin.py:1640 +#: cps/admin.py:1668 #, python-format msgid "Error: %(ldaperror)s" msgstr "Σφάλμα: %(ldaperror)s" -#: cps/admin.py:1644 +#: cps/admin.py:1672 msgid "Error: No user returned in response of LDAP server" msgstr "Σφάλμα: Δεν επιστράφηκε χρήστης σε απάντηση του διακομιστή LDAP" -#: cps/admin.py:1680 +#: cps/admin.py:1708 msgid "At Least One LDAP User Not Found in Database" msgstr "Τουλάχιστον Ένας Χρήστης LDAP Δεν Βρέθηκε Στη Βάση Δεδομένων" -#: cps/admin.py:1682 +#: cps/admin.py:1710 #, python-brace-format msgid "{} User Successfully Imported" msgstr "" -#: cps/admin.py:1740 +#: cps/admin.py:1768 msgid "Books path not valid" msgstr "" -#: cps/admin.py:1746 +#: cps/admin.py:1774 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "Η Τοποθεσία DB δεν είναι Έγκυρη, Παρακαλούμε Συμπληρώστε Τη Σωστή Πορεία" -#: cps/admin.py:1774 +#: cps/admin.py:1802 msgid "DB is not Writeable" msgstr "Η DB δεν μπορεί να Γραφτεί" -#: cps/admin.py:1788 +#: cps/admin.py:1816 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "Το Αρχειο Κλειδί Τοποθεσίας δεν είναι Έγκυρο, Παρακαλούμε Συμπληρώστε Τη Σωστή Πορεία" -#: cps/admin.py:1792 +#: cps/admin.py:1820 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "Η Τοποθεσία Certfile δεν είναι Έγκυρη, Παρακαλούμε Συμπληρώστε Τη Σωστή Πορεία" -#: cps/admin.py:1872 +#: cps/admin.py:1846 +msgid "Kepubify binary not found" +msgstr "" + +#: cps/admin.py:1894 +msgid "reverse proxy login header name" +msgstr "" + +#: cps/admin.py:1904 +msgid "reverse proxy shared secret header name" +msgstr "" + +#: cps/admin.py:1913 +msgid "Please configure both reverse proxy shared secret header name and secret" +msgstr "" + +#: cps/admin.py:1917 +msgid "Please configure reverse proxy shared secret header name and secret or disable the feature" +msgstr "" + +#: cps/admin.py:1922 +msgid "Please configure at least one trusted reverse proxy IP or CIDR" +msgstr "" + +#: cps/admin.py:1946 msgid "Password length has to be between 1 and 40" msgstr "" -#: cps/admin.py:1926 +#: cps/admin.py:1957 cps/helper.py:1007 +msgid "Please specify a valid UnRar directory" +msgstr "" + +#: cps/admin.py:2004 msgid "Database Settings updated" msgstr "" -#: cps/admin.py:1934 +#: cps/admin.py:2012 msgid "Database Configuration" msgstr "" -#: cps/admin.py:1949 cps/web.py:1295 +#: cps/admin.py:2027 cps/web.py:1305 msgid "Oops! Please complete all fields." msgstr "Παρακαλούμε συμπλήρωσε όλα τα πεδία!" -#: cps/admin.py:1958 +#: cps/admin.py:2036 msgid "E-mail is not from valid domain" msgstr "Το E-mail δεν είναι από έγκυρο domain" -#: cps/admin.py:1964 +#: cps/admin.py:2042 msgid "Add new user" msgstr "Προσθήκη νέου χρήστη" -#: cps/admin.py:1975 +#: cps/admin.py:2053 #, python-format msgid "User '%(user)s' created" msgstr "Χρήστης/ες '%(user)s' δημιουργήθηκαν" -#: cps/admin.py:1981 +#: cps/admin.py:2059 msgid "Oops! An account already exists for this Email. or name." msgstr "" -#: cps/admin.py:2011 +#: cps/admin.py:2089 #, python-format msgid "User '%(nick)s' deleted" msgstr "Χρήστης/ες '%(nick)s' διαγράφηκαν" -#: cps/admin.py:2014 +#: cps/admin.py:2092 msgid "Can't delete Guest User" msgstr "" -#: cps/admin.py:2017 +#: cps/admin.py:2095 msgid "No admin user remaining, can't delete user" msgstr "Δεν έχει απομείνει χρήστης διαχειριστής, δεν μπορεί να διαγραφεί ο χρήστης" -#: cps/admin.py:2072 cps/web.py:1475 +#: cps/admin.py:2150 cps/web.py:1485 msgid "Email can't be empty and has to be a valid Email" msgstr "" -#: cps/admin.py:2098 +#: cps/admin.py:2176 #, python-format msgid "User '%(nick)s' updated" msgstr "Χρήστης/ες '%(nick)s' ενημερώθηκαν" @@ -540,145 +579,153 @@ msgstr "Χρήστης/ες '%(nick)s' ενημερώθηκαν" msgid "Search" msgstr "Αναζήτηση" -#: cps/converter.py:31 +#: cps/converter.py:32 msgid "not installed" msgstr "δεν εγκαταστάθηκε" -#: cps/converter.py:32 +#: cps/converter.py:33 msgid "Execution permissions missing" msgstr "Λείπουν άδειες εκτέλεσης" -#: cps/db.py:1129 cps/templates/config_edit.html:207 +#: cps/db.py:1129 cps/templates/config_edit.html:229 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:565 cps/web.py:599 cps/web.py:644 cps/web.py:684 cps/web.py:711 -#: cps/web.py:998 cps/web.py:1028 cps/web.py:1073 cps/web.py:1101 -#: cps/web.py:1140 +#: cps/web.py:567 cps/web.py:601 cps/web.py:646 cps/web.py:686 cps/web.py:713 +#: cps/web.py:1000 cps/web.py:1030 cps/web.py:1075 cps/web.py:1103 +#: cps/web.py:1142 msgid "None" msgstr "Κανένα" -#: cps/editbooks.py:155 +#: cps/editbooks.py:156 #, python-format msgid "File %(file)s uploaded" msgstr "Το αρχείο %(file)s ανέβηκε" -#: cps/editbooks.py:184 +#: cps/editbooks.py:185 msgid "Source or destination format for conversion missing" msgstr "Η δομή πηγής ή προορισμού για μετατροπή λείπει" -#: cps/editbooks.py:192 +#: cps/editbooks.py:189 cps/editbooks.py:197 +msgid "Source format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:201 +msgid "Destination format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:209 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Το βιβλίο είναι σε σειρά επιτυχώς για μετατροπή σε %(book_format)s" -#: cps/editbooks.py:196 +#: cps/editbooks.py:213 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Υπήρξε ένα σφάλμα στη μετατροπή αυτού του βιβλίου: %(res)s" -#: cps/editbooks.py:297 +#: cps/editbooks.py:314 msgid "Changes successfully applied" msgstr "" -#: cps/editbooks.py:317 +#: cps/editbooks.py:334 msgid "Value is missing on request" msgstr "" -#: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 -#: cps/editbooks.py:1146 cps/web.py:532 cps/web.py:1567 cps/web.py:1613 -#: cps/web.py:1663 +#: cps/editbooks.py:336 cps/editbooks.py:343 cps/editbooks.py:644 +#: cps/editbooks.py:1170 cps/web.py:534 cps/web.py:1577 cps/web.py:1623 +#: cps/web.py:1673 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Oυπς! Ο επιλεγμένος τίτλος βιβλίου δεν είναι διαθέσιμος. Το αρχείο δεν υπάρχει ή δεν είναι προσβάσιμο" -#: cps/editbooks.py:673 cps/editbooks.py:1503 +#: cps/editbooks.py:690 cps/editbooks.py:1547 msgid "User has no rights to upload cover" msgstr "" -#: cps/editbooks.py:694 cps/editbooks.py:938 +#: cps/editbooks.py:711 cps/editbooks.py:961 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "Τα αναγνωριστικά δεν έχουν Διάκριση Πεζών-Κεφαλαίων Γραμμάτων, Αντικατάσταση Παλιού Αναγνωριστικού" -#: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 +#: cps/editbooks.py:726 cps/editbooks.py:935 cps/editbooks.py:1306 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "" -#: cps/editbooks.py:737 +#: cps/editbooks.py:754 msgid "Metadata successfully updated" msgstr "Τα μεταδεδομένα ενημερώθηκαν επιτυχώς" -#: cps/editbooks.py:760 +#: cps/editbooks.py:777 #, python-brace-format msgid "Error editing book: {}" msgstr "" -#: cps/editbooks.py:856 +#: cps/editbooks.py:879 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "Το βιβλίο που ανέβηκε πιθανόν να υπάρχει στη βιβλιοθήκη, σκέψου να το αλλάξεις πριν ανεβάσεις νέο: " -#: cps/editbooks.py:950 cps/editbooks.py:1420 +#: cps/editbooks.py:973 cps/editbooks.py:1464 msgid "File type isn't allowed to be uploaded to this server" msgstr "" -#: cps/editbooks.py:956 cps/editbooks.py:1431 +#: cps/editbooks.py:979 cps/editbooks.py:1475 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "Η επέκταση αρχείου '%(ext)s' δεν επιτρέπεται να ανέβει σε αυτό το διακομιστή" -#: cps/editbooks.py:960 cps/editbooks.py:1436 +#: cps/editbooks.py:983 cps/editbooks.py:1480 msgid "File to be uploaded must have an extension" msgstr "Το αρχείο προς ανέβασμα πρέπει να έχει μια επέκταση" -#: cps/editbooks.py:968 +#: cps/editbooks.py:992 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "Το αρχείο %(filename)s δεν μπόρεσε να αποθηκευτεί σε temp dir" -#: cps/editbooks.py:988 +#: cps/editbooks.py:1012 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Αποτυχία Μετακίνησης Αρχείου Φόντου %(file)s: %(error)s" -#: cps/editbooks.py:1041 +#: cps/editbooks.py:1065 msgid "Book Format Successfully Deleted" msgstr "Η μορφή βιβλίου Διαγράφηκε Επιτυχώς" -#: cps/editbooks.py:1044 cps/editbooks.py:1061 +#: cps/editbooks.py:1068 cps/editbooks.py:1085 msgid "Book Successfully Deleted" msgstr "Το Βιβλίο Διαγράφηκε Επιτυχώς" -#: cps/editbooks.py:1065 +#: cps/editbooks.py:1089 msgid "You are missing permissions to delete books" msgstr "" -#: cps/editbooks.py:1139 +#: cps/editbooks.py:1163 #, python-brace-format msgid "Book with id \"{}\" could not be deleted: not found" msgstr "" -#: cps/editbooks.py:1181 +#: cps/editbooks.py:1205 msgid "edit metadata" msgstr "επεξεργασία μεταδεδομένων" -#: cps/editbooks.py:1234 +#: cps/editbooks.py:1267 #, python-format msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1425 +#: cps/editbooks.py:1469 msgid "User has no rights to upload additional file formats" msgstr "" -#: cps/editbooks.py:1449 +#: cps/editbooks.py:1493 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Αποτυχεία δημιουργίας πορείας %(path)s (Η άδεια απορρήφθηκε)." -#: cps/editbooks.py:1456 +#: cps/editbooks.py:1500 #, python-format msgid "Failed to store file %(file)s." msgstr "Αποτυχία αποθήκευσης αρχείου %(file)s." -#: cps/editbooks.py:1481 +#: cps/editbooks.py:1525 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Μορφή αρχείου %(ext)s προστέθηκε σε %(book)s" @@ -689,9 +736,9 @@ msgstr "" #: cps/error_handler.py:108 cps/templates/layout.html:69 #: cps/templates/layout.html:104 cps/templates/login.html:27 -#: cps/templates/register.html:17 cps/web.py:1292 cps/web.py:1296 -#: cps/web.py:1302 cps/web.py:1326 cps/web.py:1330 cps/web.py:1343 -#: cps/web.py:1346 +#: cps/templates/register.html:17 cps/web.py:1302 cps/web.py:1306 +#: cps/web.py:1312 cps/web.py:1336 cps/web.py:1340 cps/web.py:1353 +#: cps/web.py:1356 msgid "Register" msgstr "Εγγραφή" @@ -712,7 +759,7 @@ msgstr "Η ανάκληση ονόματος δεν έχει επαληθευτ msgid "%(format)s format not found for book id: %(book)d" msgstr "%(format)s η δομή δεν βρέθηκε για την ταυτότητα βιβλίου: %(book)d" -#: cps/helper.py:94 cps/tasks/convert.py:91 +#: cps/helper.py:94 cps/tasks/convert.py:92 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s δεν βρέθηκε στο Google Drive: %(fn)s" @@ -898,10 +945,6 @@ msgstr "Μόνο jpg/jpeg αρχεία υποστηρίζονται ως αρχ msgid "Cover" msgstr "" -#: cps/helper.py:1006 -msgid "UnRar binary file not found" -msgstr "Δεν βρέθηκε δυαδικό αρχείο UnRar" - #: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "" @@ -932,7 +975,7 @@ msgstr "" msgid "Error executing Calibre" msgstr "" -#: cps/helper.py:1154 cps/templates/admin.html:216 +#: cps/helper.py:1154 cps/templates/admin.html:232 msgid "Queue all books for metadata backup" msgstr "" @@ -954,7 +997,7 @@ msgstr "Εγγραφή με %(provider)s" msgid "This %(oauth)s account is already linked to a different user" msgstr "" -#: cps/oauth_bb.py:147 cps/remotelogin.py:131 +#: cps/oauth_bb.py:147 cps/remotelogin.py:150 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "τώρα έχεις συνδεθεί ως: '%(nickname)s'" @@ -1022,25 +1065,29 @@ msgstr "" msgid "{} Stars" msgstr "" -#: cps/remotelogin.py:63 cps/templates/layout.html:68 -#: cps/templates/layout.html:103 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1361 -msgid "Login" -msgstr "Σύνδεση" - -#: cps/remotelogin.py:75 cps/remotelogin.py:109 +#: cps/remotelogin.py:46 cps/remotelogin.py:128 msgid "Token not found" msgstr "Η μάρκα δεν βρέθηκε" -#: cps/remotelogin.py:84 cps/remotelogin.py:117 +#: cps/remotelogin.py:55 cps/remotelogin.py:136 msgid "Token has expired" msgstr "Η μάρκα έχει λήξει" -#: cps/remotelogin.py:93 +#: cps/remotelogin.py:86 cps/remotelogin.py:112 cps/templates/layout.html:68 +#: cps/templates/layout.html:103 cps/templates/login.html:4 +#: cps/templates/login.html:21 cps/web.py:1371 +msgid "Login" +msgstr "Σύνδεση" + +#: cps/remotelogin.py:100 +msgid "Token already approved" +msgstr "" + +#: cps/remotelogin.py:108 msgid "Success! Please return to your device" msgstr "Επιτυχία! Παρακαλούμε επέστρεψε στη συσκευή σου" -#: cps/render_template.py:41 cps/web.py:421 +#: cps/render_template.py:41 cps/web.py:423 msgid "Books" msgstr "Βιβλία" @@ -1065,7 +1112,7 @@ msgstr "Κατεβασμένα Βιβλία" msgid "Show Downloaded Books" msgstr "Προβολή Κατεβασμένων Βιβλίων" -#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:436 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:438 msgid "Top Rated Books" msgstr "Βιβλία με Κορυφαία Αξιολόγηση" @@ -1074,7 +1121,7 @@ msgid "Show Top Rated Books" msgstr "Προβολή Βιβλίων με Κορυφαία Αξιολόγηση" #: cps/render_template.py:61 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:769 +#: cps/templates/index.xml:67 cps/web.py:771 msgid "Read Books" msgstr "Βιβλία που Διαβάστηκαν" @@ -1083,7 +1130,7 @@ msgid "Show Read and Unread" msgstr "" #: cps/render_template.py:65 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:772 +#: cps/templates/index.xml:74 cps/web.py:774 msgid "Unread Books" msgstr "Βιβλία που δεν Διαβάστηκαν" @@ -1101,7 +1148,7 @@ msgid "Show Random Books" msgstr "Προβολή Τυχαίων Βιβλίων" #: cps/render_template.py:71 cps/templates/book_table.html:93 -#: cps/templates/index.xml:97 cps/web.py:1144 +#: cps/templates/index.xml:97 cps/web.py:1146 msgid "Categories" msgstr "Κατηγορίες" @@ -1111,7 +1158,7 @@ msgstr "" #: cps/render_template.py:74 cps/templates/book_edit.html:86 #: cps/templates/book_table.html:94 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1034 cps/web.py:1046 +#: cps/templates/search_form.html:70 cps/web.py:1036 cps/web.py:1048 msgid "Series" msgstr "Σειρές" @@ -1129,7 +1176,7 @@ msgid "Show Author Section" msgstr "" #: cps/render_template.py:81 cps/templates/book_table.html:98 -#: cps/templates/index.xml:88 cps/web.py:1002 +#: cps/templates/index.xml:88 cps/web.py:1004 msgid "Publishers" msgstr "Εκδότες" @@ -1139,7 +1186,7 @@ msgstr "" #: cps/render_template.py:84 cps/templates/book_table.html:96 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1116 +#: cps/web.py:1118 msgid "Languages" msgstr "Γλώσσες" @@ -1163,7 +1210,7 @@ msgstr "Μορφές αρχείου" msgid "Show File Formats Section" msgstr "" -#: cps/render_template.py:95 cps/web.py:795 +#: cps/render_template.py:95 cps/web.py:797 msgid "Archived Books" msgstr "Αρχειοθετημένα Βιβλία" @@ -1171,7 +1218,7 @@ msgstr "Αρχειοθετημένα Βιβλία" msgid "Show Archived Books" msgstr "" -#: cps/render_template.py:100 cps/web.py:831 +#: cps/render_template.py:100 cps/web.py:833 msgid "Books List" msgstr "Λίστα Βιβλίων" @@ -1404,150 +1451,154 @@ msgstr "Μια νέα ενημέρωση είναι διαθέσιμη. Κάνε msgid "No release information available" msgstr "Δεν υπάρχουν διαθέσιμες πληροφορίες αποδέσμευσης" -#: cps/templates/index.html:6 cps/web.py:448 +#: cps/templates/index.html:6 cps/web.py:450 msgid "Discover (Random Books)" msgstr "Ανακάλυψε (Τυχαία Βιβλία)" -#: cps/web.py:484 +#: cps/web.py:486 msgid "Hot Books (Most Downloaded)" msgstr "Βιβλία στη Μόδα (Με τα περισσότερα κατεβάσματα)" -#: cps/web.py:515 +#: cps/web.py:517 #, python-format msgid "Downloaded books by %(user)s" msgstr "Κατεβασμένα βιβλία από %(user)s" -#: cps/web.py:548 +#: cps/web.py:550 #, python-format msgid "Author: %(name)s" msgstr "Συγγραφέας: %(name)s" -#: cps/web.py:584 +#: cps/web.py:586 #, python-format msgid "Publisher: %(name)s" msgstr "Εκδότης: %(name)s" -#: cps/web.py:612 +#: cps/web.py:614 #, python-format msgid "Series: %(serie)s" msgstr "Σειρές: %(serie)s" -#: cps/web.py:626 +#: cps/web.py:628 msgid "Rating: None" msgstr "" -#: cps/web.py:635 +#: cps/web.py:637 #, python-format msgid "Rating: %(rating)s stars" msgstr "Αξιολόγηση: %(rating)s stars" -#: cps/web.py:666 +#: cps/web.py:668 #, python-format msgid "File format: %(format)s" msgstr "Μορφή αρχείου: %(format)s" -#: cps/web.py:701 +#: cps/web.py:703 #, python-format msgid "Category: %(name)s" msgstr "Κατηγορία: %(name)s" -#: cps/web.py:730 +#: cps/web.py:732 #, python-format msgid "Language: %(name)s" msgstr "Γλώσσα: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:974 +#: cps/templates/admin.html:16 cps/web.py:976 msgid "Downloads" msgstr "Κατεβασμένα" -#: cps/web.py:1076 +#: cps/web.py:1078 msgid "Ratings list" msgstr "Λίστα αξιολογήσεων" -#: cps/web.py:1103 +#: cps/web.py:1105 msgid "File formats list" msgstr "Λίστα μορφών αρχείου" -#: cps/web.py:1264 +#: cps/web.py:1272 +msgid "Book format not supported" +msgstr "" + +#: cps/web.py:1274 msgid "Please configure the SMTP mail settings first..." msgstr "" -#: cps/web.py:1270 +#: cps/web.py:1280 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Το βιβλίο έχει επιτυχώς μπει σε σειρά για αποστολή στο %(eReadermail)s" -#: cps/web.py:1273 +#: cps/web.py:1283 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Oυπς! Υπήρξε ένα σφάλμα κατά την αποστολή αυτού του βιβλίου: %(res)s" -#: cps/web.py:1275 +#: cps/web.py:1285 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "" -#: cps/web.py:1291 cps/web.py:1342 +#: cps/web.py:1301 cps/web.py:1352 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "Ο διακομιστής E-Mail δεν έχει διαμορφωθεί, παρακαλούμε επικοινώνησε με το διαχειριστή σου!" -#: cps/web.py:1328 +#: cps/web.py:1338 msgid "Oops! Your Email is not allowed." msgstr "Η διεύθυνση e-mail σου δεν επιτρέπεται να εγγραφεί" -#: cps/web.py:1331 +#: cps/web.py:1341 msgid "Success! Confirmation Email has been sent." msgstr "Το e-mail επιβεβαίωσης έχει σταλεί στον e-mail λογαριασμό σου." -#: cps/web.py:1376 cps/web.py:1390 +#: cps/web.py:1386 cps/web.py:1400 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1399 +#: cps/web.py:1409 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1406 +#: cps/web.py:1416 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1411 +#: cps/web.py:1421 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1415 cps/web.py:1440 +#: cps/web.py:1425 cps/web.py:1450 msgid "Wrong Username or Password" msgstr "" -#: cps/web.py:1422 +#: cps/web.py:1432 msgid "New Password was sent to your email address" msgstr "" -#: cps/web.py:1426 +#: cps/web.py:1436 msgid "An unknown error occurred. Please try again later." msgstr "" -#: cps/web.py:1428 +#: cps/web.py:1438 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1436 +#: cps/web.py:1446 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1501 cps/web.py:1551 +#: cps/web.py:1511 cps/web.py:1561 #, python-format msgid "%(name)s's Profile" msgstr "%(name)s's προφίλ" -#: cps/web.py:1517 +#: cps/web.py:1527 msgid "Success! Profile Updated" msgstr "" -#: cps/web.py:1521 +#: cps/web.py:1531 msgid "Oops! An account already exists for this Email." msgstr "" @@ -1559,46 +1610,46 @@ msgstr "" msgid "Delete temp folder contents" msgstr "" -#: cps/tasks/convert.py:112 +#: cps/tasks/convert.py:113 #, python-format msgid "%(book)s send to E-Reader" msgstr "" -#: cps/tasks/convert.py:177 +#: cps/tasks/convert.py:180 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Το εργαλείο μετατροπής Calibre ebook %(tool)s δεν βρέθηκε" -#: cps/tasks/convert.py:211 +#: cps/tasks/convert.py:214 #, python-format msgid "%(format)s format not found on disk" msgstr "%(format)s μορφή δεν βρέθηκε σε δίσκο" -#: cps/tasks/convert.py:215 +#: cps/tasks/convert.py:218 msgid "Ebook converter failed with unknown error" msgstr "Ο μετατροπέας Ebook απέτυχε με άγνωστο σφάλμα" -#: cps/tasks/convert.py:234 +#: cps/tasks/convert.py:237 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Ο μετατροπέας Kepubify απέτυχε: %(error)s" -#: cps/tasks/convert.py:254 +#: cps/tasks/convert.py:257 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Το τροποποιημένο αρχείο δεν βρέθηκε ή υπάρχουν περισσότερα από ένα αρχεία στο φάκελο %(folder)s" -#: cps/tasks/convert.py:291 cps/tasks/convert.py:342 +#: cps/tasks/convert.py:294 cps/tasks/convert.py:345 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Το Calibre απέτυχε με σφάλμα: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:322 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Ο μετατροπέας Ebook απέτυχε: %(error)s" -#: cps/tasks/convert.py:347 +#: cps/tasks/convert.py:350 msgid "Convert" msgstr "" @@ -1684,7 +1735,7 @@ msgstr "Επεξεργασία" #: cps/templates/admin.html:25 cps/templates/book_edit.html:17 #: cps/templates/book_table.html:131 cps/templates/book_table.html:180 -#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:115 +#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:117 #: cps/templates/user_edit.html:67 cps/templates/user_table.html:149 msgid "Delete" msgstr "Διαγραφή" @@ -1774,128 +1825,145 @@ msgstr "Μαγικός Σύνδεσμος Απομακρυσμένης Σύνδ msgid "Reverse Proxy Login" msgstr "Αναστροφή Σύνδεσης Διακομιστή Μεσολάβησης" -#: cps/templates/admin.html:154 cps/templates/config_edit.html:176 +#: cps/templates/admin.html:154 cps/templates/config_edit.html:180 msgid "Reverse Proxy Header Name" msgstr "Αναστροφή Proxy Όνομα Επικεφαλίδας" -#: cps/templates/admin.html:159 +#: cps/templates/admin.html:158 +msgid "Reverse Proxy Trusted IPs/CIDRs" +msgstr "" + +#: cps/templates/admin.html:162 cps/templates/config_edit.html:193 +msgid "Reverse Proxy Shared Secret Header Name" +msgstr "" + +#: cps/templates/admin.html:166 +msgid "Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/admin.html:170 +msgid "Reverse Proxy Shared Secret Configured" +msgstr "" + +#: cps/templates/admin.html:175 msgid "Edit Calibre Database Configuration" msgstr "" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:176 msgid "Edit Basic Configuration" msgstr "Επεξεργασία Βασικής Διαμόρφωσης" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:177 msgid "Edit UI Configuration" msgstr "Επεξεργασία Διαμόρφωσης UI" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:183 msgid "Scheduled Tasks" msgstr "" -#: cps/templates/admin.html:170 cps/templates/schedule_edit.html:12 +#: cps/templates/admin.html:186 cps/templates/schedule_edit.html:12 #: cps/templates/tasks.html:18 msgid "Start Time" msgstr "" -#: cps/templates/admin.html:174 cps/templates/schedule_edit.html:20 +#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:20 msgid "Maximum Duration" msgstr "" -#: cps/templates/admin.html:178 cps/templates/schedule_edit.html:29 +#: cps/templates/admin.html:194 cps/templates/schedule_edit.html:29 msgid "Generate Thumbnails" msgstr "" -#: cps/templates/admin.html:182 +#: cps/templates/admin.html:198 msgid "Generate series cover thumbnails" msgstr "" -#: cps/templates/admin.html:186 cps/templates/admin.html:208 +#: cps/templates/admin.html:202 cps/templates/admin.html:224 #: cps/templates/schedule_edit.html:37 msgid "Reconnect Calibre Database" msgstr "" -#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 +#: cps/templates/admin.html:206 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" msgstr "" -#: cps/templates/admin.html:197 +#: cps/templates/admin.html:213 msgid "Refresh Thumbnail Cache" msgstr "" -#: cps/templates/admin.html:203 +#: cps/templates/admin.html:219 msgid "Administration" msgstr "Διοίκηση" -#: cps/templates/admin.html:204 +#: cps/templates/admin.html:220 msgid "Download Debug Package" msgstr "" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:221 msgid "View Logs" msgstr "Προβολή Φύλλων Καταγραφής" -#: cps/templates/admin.html:211 +#: cps/templates/admin.html:227 msgid "Restart" msgstr "Επανεκκίνηση" -#: cps/templates/admin.html:212 +#: cps/templates/admin.html:228 msgid "Shutdown" msgstr "Κλείσιμο" -#: cps/templates/admin.html:221 +#: cps/templates/admin.html:237 msgid "Version Information" msgstr "" -#: cps/templates/admin.html:225 +#: cps/templates/admin.html:241 msgid "Version" msgstr "Έκδοση" -#: cps/templates/admin.html:226 +#: cps/templates/admin.html:242 msgid "Details" msgstr "Λεπτομέρειες" -#: cps/templates/admin.html:232 +#: cps/templates/admin.html:248 msgid "Current Version" msgstr "Τρέχουσα έκδοση" -#: cps/templates/admin.html:239 +#: cps/templates/admin.html:255 msgid "Check for Update" msgstr "Έλεγχος για Ενημέρωση" -#: cps/templates/admin.html:240 +#: cps/templates/admin.html:256 msgid "Perform Update" msgstr "Πραγματοποίηση Ενημέρωσης" -#: cps/templates/admin.html:253 +#: cps/templates/admin.html:269 msgid "Are you sure you want to restart?" msgstr "Είσαι σίγουρος/η πως θέλεις να κάνεις επανεκκίνηση" -#: cps/templates/admin.html:258 cps/templates/admin.html:272 -#: cps/templates/admin.html:292 cps/templates/config_db.html:82 +#: cps/templates/admin.html:274 cps/templates/admin.html:288 +#: cps/templates/admin.html:308 cps/templates/config_db.html:82 msgid "OK" msgstr "OK" -#: cps/templates/admin.html:259 cps/templates/admin.html:273 +#: cps/templates/admin.html:275 cps/templates/admin.html:289 #: cps/templates/book_edit.html:220 cps/templates/book_table.html:162 #: cps/templates/book_table.html:181 cps/templates/book_table.html:201 #: cps/templates/book_table.html:221 cps/templates/book_table.html:241 #: cps/templates/book_table.html:261 cps/templates/book_table.html:316 -#: cps/templates/config_db.html:66 cps/templates/config_edit.html:431 +#: cps/templates/config_db.html:66 cps/templates/config_edit.html:453 #: cps/templates/config_view_edit.html:175 cps/templates/detail.html:350 -#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:98 -#: cps/templates/modal_dialogs.html:116 cps/templates/modal_dialogs.html:134 +#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:100 +#: cps/templates/modal_dialogs.html:118 cps/templates/modal_dialogs.html:136 +#: cps/templates/remote_login_verify.html:16 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 #: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Ακύρωση" -#: cps/templates/admin.html:271 +#: cps/templates/admin.html:287 msgid "Are you sure you want to shutdown?" msgstr "Είσαι σίγουρος/η πως θέλεις να κάνεις κλείσιμο;" -#: cps/templates/admin.html:283 +#: cps/templates/admin.html:299 msgid "Updating, please do not reload this page" msgstr "Γίνεται ενημέρωση, παρακαλούμε μη φορτώσεις ξανά αυτή τη σελίδα" @@ -2136,7 +2204,7 @@ msgid "Fetch Metadata" msgstr "Συγκέντρωση Μεταδεδομένων" #: cps/templates/book_edit.html:219 cps/templates/config_db.html:65 -#: cps/templates/config_edit.html:430 cps/templates/config_view_edit.html:174 +#: cps/templates/config_edit.html:452 cps/templates/config_view_edit.html:174 #: cps/templates/email_edit.html:65 cps/templates/schedule_edit.html:44 #: cps/templates/shelf_edit.html:25 cps/templates/shelf_order.html:41 #: cps/templates/user_edit.html:142 @@ -2508,214 +2576,234 @@ msgstr "" msgid "Allow Reverse Proxy Authentication" msgstr "Να Επιτραπεί η Αναστροφή Επαλήθευσης Proxy" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:176 +msgid "Security Warning" +msgstr "" + +#: cps/templates/config_edit.html:177 +msgid "Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled." +msgstr "" + +#: cps/templates/config_edit.html:184 +msgid "Reverse Proxy Trusted IPs/CIDRs (Comma Separated)" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "Enable Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/config_edit.html:197 +msgid "Reverse Proxy Shared Secret" +msgstr "" + +#: cps/templates/config_edit.html:205 msgid "Login type" msgstr "Είδος σύνδεσης" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:207 msgid "Use Standard Authentication" msgstr "Χρήση Στεθερής Επαλήθευσης" -#: cps/templates/config_edit.html:187 +#: cps/templates/config_edit.html:209 msgid "Use LDAP Authentication" msgstr "Χρήση Επαλήθευσης LDAP" -#: cps/templates/config_edit.html:190 +#: cps/templates/config_edit.html:212 msgid "Use OAuth" msgstr "Χρήση OAuth" -#: cps/templates/config_edit.html:197 +#: cps/templates/config_edit.html:219 msgid "LDAP Server Host Name or IP Address" msgstr "Όνομα Διακομιστή Φιλοξενίας LDAP ή Διεύθυνση IP" -#: cps/templates/config_edit.html:201 +#: cps/templates/config_edit.html:223 msgid "LDAP Server Port" msgstr "Θύρα Διακομιστή LDAP" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:227 msgid "LDAP Encryption" msgstr "LDAP Αποκρυπτογράφηση" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:230 msgid "TLS" msgstr "TLS" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:231 msgid "SSL" msgstr "SSL" -#: cps/templates/config_edit.html:213 +#: cps/templates/config_edit.html:235 msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" msgstr "" -#: cps/templates/config_edit.html:220 +#: cps/templates/config_edit.html:242 msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" msgstr "" -#: cps/templates/config_edit.html:227 +#: cps/templates/config_edit.html:249 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" msgstr "" -#: cps/templates/config_edit.html:236 +#: cps/templates/config_edit.html:258 msgid "LDAP Authentication" msgstr "LDAP Επαλήθευση" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:260 msgid "Anonymous" msgstr "Ανώνυμοι" -#: cps/templates/config_edit.html:239 +#: cps/templates/config_edit.html:261 msgid "Unauthenticated" msgstr "Μη επαληθεύσιμο" -#: cps/templates/config_edit.html:240 +#: cps/templates/config_edit.html:262 msgid "Simple" msgstr "Απλό" -#: cps/templates/config_edit.html:245 +#: cps/templates/config_edit.html:267 msgid "LDAP Administrator Username" msgstr "LDAP Όνομα Χρήστη Διαχειριστή" -#: cps/templates/config_edit.html:251 +#: cps/templates/config_edit.html:273 msgid "LDAP Administrator Password" msgstr "LDAP Κωδικός Διαχειριστή" -#: cps/templates/config_edit.html:256 +#: cps/templates/config_edit.html:278 msgid "LDAP Distinguished Name (DN)" msgstr "LDAP Χαρακτηριστικό Όνομα (ΧΟ)" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:282 msgid "LDAP User Object Filter" msgstr "LDAP Αντικείμενο Φίλτρου Χρήστη" -#: cps/templates/config_edit.html:265 +#: cps/templates/config_edit.html:287 msgid "LDAP Server is OpenLDAP?" msgstr "Είναι ο Διακομιστής LDAP OpenLDAP;" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:289 msgid "Following Settings are Needed For User Import" msgstr "Χρειάζονται οι Ακόλουθες Ρυθμίσεις για Εισαγωγη Χρήστη" -#: cps/templates/config_edit.html:269 +#: cps/templates/config_edit.html:291 msgid "LDAP Group Object Filter" msgstr "Αντικείμενο Φίλτρου Ομάδας LDAP" -#: cps/templates/config_edit.html:273 +#: cps/templates/config_edit.html:295 msgid "LDAP Group Name" msgstr "LDAP Όνομα Ομάδας" -#: cps/templates/config_edit.html:277 +#: cps/templates/config_edit.html:299 msgid "LDAP Group Members Field" msgstr "LDAP Πεδίο Μελών Ομάδας" -#: cps/templates/config_edit.html:281 +#: cps/templates/config_edit.html:303 msgid "LDAP Member User Filter Detection" msgstr "" -#: cps/templates/config_edit.html:283 +#: cps/templates/config_edit.html:305 msgid "Autodetect" msgstr "" -#: cps/templates/config_edit.html:284 +#: cps/templates/config_edit.html:306 msgid "Custom Filter" msgstr "" -#: cps/templates/config_edit.html:289 +#: cps/templates/config_edit.html:311 msgid "LDAP Member User Filter" msgstr "" -#: cps/templates/config_edit.html:300 +#: cps/templates/config_edit.html:322 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "Απόκτηση %(provider)s OAuth Διαπιστευτήρια" -#: cps/templates/config_edit.html:303 +#: cps/templates/config_edit.html:325 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "%(provider)s OAuth Ταυτότητα Πελάτη" -#: cps/templates/config_edit.html:307 +#: cps/templates/config_edit.html:329 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "%(provider)s OAuth Μυστικό Πελάτη" -#: cps/templates/config_edit.html:323 +#: cps/templates/config_edit.html:345 msgid "External binaries" msgstr "Εξωτερικοί Δυαδικοί" -#: cps/templates/config_edit.html:329 +#: cps/templates/config_edit.html:351 msgid "Path to Calibre Binaries" msgstr "" -#: cps/templates/config_edit.html:337 +#: cps/templates/config_edit.html:359 msgid "Calibre E-Book Converter Settings" msgstr "Calibre E-Book Ρυθμίσεις Μετατροπέα" -#: cps/templates/config_edit.html:340 +#: cps/templates/config_edit.html:362 msgid "Path to Kepubify E-Book Converter" msgstr "Πορεία για Μετατροπέα Kepubify E-Book" -#: cps/templates/config_edit.html:348 +#: cps/templates/config_edit.html:370 msgid "Location of Unrar binary" msgstr "" -#: cps/templates/config_edit.html:364 +#: cps/templates/config_edit.html:386 msgid "Security Settings" msgstr "" -#: cps/templates/config_edit.html:372 +#: cps/templates/config_edit.html:394 msgid "Limit failed login attempts" msgstr "" -#: cps/templates/config_edit.html:376 +#: cps/templates/config_edit.html:398 msgid "Configure Backend for Limiter" msgstr "" -#: cps/templates/config_edit.html:380 +#: cps/templates/config_edit.html:402 msgid "Options for Limiter Backend" msgstr "" -#: cps/templates/config_edit.html:386 +#: cps/templates/config_edit.html:408 msgid "Check if file extensions matches file content on upload" msgstr "" -#: cps/templates/config_edit.html:389 +#: cps/templates/config_edit.html:411 msgid "Session protection" msgstr "" -#: cps/templates/config_edit.html:391 +#: cps/templates/config_edit.html:413 msgid "Basic" msgstr "" -#: cps/templates/config_edit.html:392 +#: cps/templates/config_edit.html:414 msgid "Strong" msgstr "" -#: cps/templates/config_edit.html:397 +#: cps/templates/config_edit.html:419 msgid "User Password policy" msgstr "" -#: cps/templates/config_edit.html:401 +#: cps/templates/config_edit.html:423 msgid "Minimum password length" msgstr "" -#: cps/templates/config_edit.html:406 +#: cps/templates/config_edit.html:428 msgid "Enforce number" msgstr "" -#: cps/templates/config_edit.html:410 +#: cps/templates/config_edit.html:432 msgid "Enforce lowercase characters" msgstr "" -#: cps/templates/config_edit.html:414 +#: cps/templates/config_edit.html:436 msgid "Enforce uppercase characters" msgstr "" -#: cps/templates/config_edit.html:418 +#: cps/templates/config_edit.html:440 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" msgstr "" -#: cps/templates/config_edit.html:422 +#: cps/templates/config_edit.html:444 msgid "Enforce special characters" msgstr "" @@ -3182,27 +3270,27 @@ msgstr "Τα βιβλία πρέπει πρώτα να αρχειοθετηθο msgid "Choose File Location" msgstr "" -#: cps/templates/modal_dialogs.html:81 +#: cps/templates/modal_dialogs.html:82 msgid "type" msgstr "" -#: cps/templates/modal_dialogs.html:82 +#: cps/templates/modal_dialogs.html:83 msgid "name" msgstr "" -#: cps/templates/modal_dialogs.html:83 +#: cps/templates/modal_dialogs.html:84 msgid "size" msgstr "" -#: cps/templates/modal_dialogs.html:89 +#: cps/templates/modal_dialogs.html:90 msgid "Parent Directory" msgstr "" -#: cps/templates/modal_dialogs.html:97 +#: cps/templates/modal_dialogs.html:99 msgid "Select" msgstr "" -#: cps/templates/modal_dialogs.html:133 cps/templates/tasks.html:46 +#: cps/templates/modal_dialogs.html:135 cps/templates/tasks.html:46 msgid "Ok" msgstr "" @@ -3458,6 +3546,31 @@ msgstr "Με την επαλήθευση, θα συνδεθείτε αυτόμα msgid "This verification link will expire in 10 minutes." msgstr "Αυτός ο σύνδεσμος επαλήθευσης θα λήξει σε 10 λεπτά." +#: cps/templates/remote_login_verify.html:4 +msgid "Approve Magic Link Login" +msgstr "" + +#: cps/templates/remote_login_verify.html:5 +msgid "Review the device that requested access before approving this login." +msgstr "" + +#: cps/templates/remote_login_verify.html:7 +msgid "IP address" +msgstr "" + +#: cps/templates/remote_login_verify.html:9 +msgid "Browser" +msgstr "" + +#: cps/templates/remote_login_verify.html:12 +#, python-format +msgid "If you approve this request, the device that started it will be logged in as %(username)s." +msgstr "" + +#: cps/templates/remote_login_verify.html:15 +msgid "Approve Login" +msgstr "" + #: cps/templates/schedule_edit.html:33 msgid "Generate Series Cover Thumbnails" msgstr "" diff --git a/cps/translations/es/LC_MESSAGES/messages.mo b/cps/translations/es/LC_MESSAGES/messages.mo index 379176a5960dafffa3317411b51e53360013bdb0..1f847d06ee41364c0a4135a4d846111ffb9f67b9 100644 GIT binary patch delta 14034 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 delta 14121 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\n" "Language: es\n" @@ -19,519 +19,558 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" +"Generated-By: Babel 2.18.0\n" #: cps/about.py:85 msgid "Statistics" msgstr "Estadísticas" -#: cps/admin.py:151 +#: cps/admin.py:154 msgid "Server restarted, please reload page." msgstr "Servidor reiniciado. Por favor, recarga la página." -#: cps/admin.py:153 +#: cps/admin.py:156 msgid "Performing Server shutdown, please close window." msgstr "El servidor se está apagando. Por favor, cierra la ventana." -#: cps/admin.py:161 +#: cps/admin.py:164 msgid "Success! Database Reconnected" msgstr "Se ha reconectado la base de datos" -#: cps/admin.py:164 +#: cps/admin.py:167 msgid "Unknown command" msgstr "Comando desconocido" -#: cps/admin.py:175 +#: cps/admin.py:178 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "Libros en cola para la copia de seguridad de metadatos, por favor verifica las tareas para ver el resultado" -#: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 -#: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 -#: cps/uploader.py:117 +#: cps/admin.py:211 cps/editbooks.py:825 cps/editbooks.py:875 +#: cps/editbooks.py:1564 cps/templates/remote_login_verify.html:8 +#: cps/templates/remote_login_verify.html:10 cps/updater.py:615 +#: cps/uploader.py:117 cps/uploader.py:126 msgid "Unknown" msgstr "Desconocido" -#: cps/admin.py:233 +#: cps/admin.py:236 msgid "Admin page" msgstr "Página de administración" -#: cps/admin.py:253 +#: cps/admin.py:256 msgid "Basic Configuration" msgstr "Configuración básica" -#: cps/admin.py:291 +#: cps/admin.py:294 msgid "UI Configuration" msgstr "Configuración de la interfaz de usuario" -#: cps/admin.py:315 cps/admin.py:1002 cps/db.py:809 cps/search.py:150 -#: cps/web.py:750 +#: cps/admin.py:318 cps/admin.py:1005 cps/db.py:809 cps/search.py:150 +#: cps/web.py:752 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "La columna personalizada n.º %(column)d no existe en la base de datos calibre" -#: cps/admin.py:333 cps/templates/admin.html:51 +#: cps/admin.py:336 cps/templates/admin.html:51 msgid "Edit Users" msgstr "Editar usuarios" -#: cps/admin.py:378 cps/opds.py:559 cps/templates/grid.html:14 +#: cps/admin.py:381 cps/opds.py:559 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Todo" -#: cps/admin.py:401 cps/admin.py:1432 +#: cps/admin.py:404 cps/admin.py:1460 msgid "User not found" msgstr "Usuario no encontrado" -#: cps/admin.py:415 +#: cps/admin.py:418 #, python-brace-format msgid "{} users deleted successfully" msgstr "{} usuarios eliminados con éxito" -#: cps/admin.py:438 cps/templates/config_view_edit.html:133 +#: cps/admin.py:441 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Mostrar todo" -#: cps/admin.py:459 cps/admin.py:465 +#: cps/admin.py:462 cps/admin.py:468 msgid "Malformed request" msgstr "Petición malformada" -#: cps/admin.py:477 cps/admin.py:2078 +#: cps/admin.py:480 cps/admin.py:2156 msgid "Guest Name can't be changed" msgstr "El nombre de invitado no se puede cambiar" -#: cps/admin.py:489 +#: cps/admin.py:492 msgid "Guest can't have this role" msgstr "El invitado no puede tener ese rol" -#: cps/admin.py:501 cps/admin.py:2032 +#: cps/admin.py:504 cps/admin.py:2110 msgid "No admin user remaining, can't remove admin role" msgstr "No queda ningún usuario administrador, no se puede eliminar al usuario" -#: cps/admin.py:505 cps/admin.py:519 +#: cps/admin.py:508 cps/admin.py:522 msgid "Value has to be true or false" msgstr "Valor tiene que ser verdadero o falso" -#: cps/admin.py:507 +#: cps/admin.py:510 msgid "Invalid role" msgstr "Rol inválido" -#: cps/admin.py:511 +#: cps/admin.py:514 msgid "Guest can't have this view" msgstr "El invitado no puede tener esta vista" -#: cps/admin.py:521 +#: cps/admin.py:524 msgid "Invalid view" msgstr "Vista no válida" -#: cps/admin.py:524 +#: cps/admin.py:527 msgid "Guest's Locale is determined automatically and can't be set" msgstr "El idioma del invitado se determina automáticamente y no puede ser cambiado" -#: cps/admin.py:528 +#: cps/admin.py:531 msgid "No Valid Locale Given" msgstr "No hay un idioma válido" -#: cps/admin.py:539 +#: cps/admin.py:542 msgid "No Valid Book Language Given" msgstr "No se ha indicado un idioma válido para el libro" -#: cps/admin.py:541 cps/editbooks.py:243 cps/editbooks.py:428 -#: cps/editbooks.py:430 +#: cps/admin.py:544 cps/editbooks.py:260 cps/editbooks.py:445 +#: cps/editbooks.py:447 msgid "Parameter not found" msgstr "Parámetro no encontrado" -#: cps/admin.py:578 +#: cps/admin.py:581 msgid "Invalid Read Column" msgstr "Columna de lectura no válida" -#: cps/admin.py:584 +#: cps/admin.py:587 msgid "Invalid Restricted Column" msgstr "Columna restringida no válida" -#: cps/admin.py:604 cps/admin.py:1903 +#: cps/admin.py:607 cps/admin.py:1981 msgid "Calibre-Web configuration updated" msgstr "Configuración de Calibre-Web actualizada" -#: cps/admin.py:616 +#: cps/admin.py:619 msgid "Do you really want to delete the Kobo Token?" msgstr "¿Seguro que quieres eliminar el Token de Kobo?" -#: cps/admin.py:618 +#: cps/admin.py:621 msgid "Do you really want to delete this domain?" msgstr "¿Seguro que deseas borrar este dominio?" -#: cps/admin.py:620 +#: cps/admin.py:623 msgid "Do you really want to delete this user?" msgstr "¿Seguro que quieres borrar este usuario?" -#: cps/admin.py:622 +#: cps/admin.py:625 msgid "Do you really want to delete this book?" msgstr "¿Seguro que quieres borrar este libro" -#: cps/admin.py:624 +#: cps/admin.py:627 msgid "Are you sure you want to delete this shelf?" msgstr "¿Estas seguro de que deseas eliminar este estante?" -#: cps/admin.py:626 +#: cps/admin.py:629 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "¿Estas seguro de que deseas quieres cambiar el idioma de los usuarios seleccionados?" -#: cps/admin.py:628 +#: cps/admin.py:631 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "¿Estas seguro de que deseas cambiar los idiomas visibles del libro de los usuarios seleccionados?" -#: cps/admin.py:630 +#: cps/admin.py:633 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "¿Estas seguro de que deseas cambiar el rol seleccionado de el usuario seleccionado?" -#: cps/admin.py:632 +#: cps/admin.py:635 msgid "Are you sure you want to change the archive status for the selected book(s)?" msgstr "¿Estás seguro de que deseas cambiar el estado de archivado del(los) libro(s) seleccionados?" -#: cps/admin.py:634 +#: cps/admin.py:637 msgid "Are you sure you want to change the read status for the selected book(s)?" msgstr "¿Estás seguro de que deseas cambiar el estado de lectura del(los) libro(s) libros seleccionados?" -#: cps/admin.py:636 +#: cps/admin.py:639 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "¿Estas seguro de que deseas cambiar las restricciones de los usuarios seleccionados?" -#: cps/admin.py:638 +#: cps/admin.py:641 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "¿Estas seguro de que deseas cambiar las restricciones de visibilidad de los usuarios seleccionados?" -#: cps/admin.py:641 +#: cps/admin.py:644 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "¿Estas seguro de que deseas cambiar el comportamiento de sincronización de estante del usuario seleccionado?" -#: cps/admin.py:643 +#: cps/admin.py:646 msgid "Are you sure you want to change Calibre library location?" msgstr "¿Estas seguro de que deseas cambiar la ubicación de la biblioteca de Calibre?" -#: cps/admin.py:645 +#: cps/admin.py:648 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "Calibre-Web buscará portadas actualizadas y actualizará las miniaturas de las portadas, esto puede tardar un tiempo" -#: cps/admin.py:648 +#: cps/admin.py:651 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "¿Estas seguro de que deseas eliminar la base de datos de sincronización de Calibre-Web para forzar una sincronización completa con tu lector Kobo?" -#: cps/admin.py:891 cps/admin.py:897 cps/admin.py:907 cps/admin.py:917 +#: cps/admin.py:894 cps/admin.py:900 cps/admin.py:910 cps/admin.py:920 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Prohibir" -#: cps/admin.py:893 cps/admin.py:899 cps/admin.py:909 cps/admin.py:919 +#: cps/admin.py:896 cps/admin.py:902 cps/admin.py:912 cps/admin.py:922 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Permitir" -#: cps/admin.py:952 +#: cps/admin.py:955 #, python-brace-format msgid "{} sync entries deleted" msgstr "{} entradas de sincronización eliminadas" -#: cps/admin.py:993 +#: cps/admin.py:996 msgid "Tag not found" msgstr "Etiqueta no encontrada" -#: cps/admin.py:1011 +#: cps/admin.py:1014 msgid "Invalid Action" msgstr "Acción no válida" -#: cps/admin.py:1138 +#: cps/admin.py:1137 +#, python-format +msgid "Invalid reverse proxy trusted IP/CIDR entry: %(entry)s" +msgstr "" + +#: cps/admin.py:1148 +#, python-format +msgid "Invalid %(label)s: %(value)s" +msgstr "" + +#: cps/admin.py:1166 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json no está configurado para la aplicación web" -#: cps/admin.py:1183 +#: cps/admin.py:1211 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "La ruta del Logfile no es válida. Por favor, Introduce la ruta correcta" -#: cps/admin.py:1189 +#: cps/admin.py:1217 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "La ruta del Access Logfile no es válida. Por favor, Introduce la ruta correcta" -#: cps/admin.py:1223 +#: cps/admin.py:1251 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Por favor, Introduce un proveedor LDAP, puerto, DN y el User Object Identifier" -#: cps/admin.py:1229 +#: cps/admin.py:1257 msgid "Please Enter a LDAP Service Account and Password" msgstr "Por favor, introduce una cuenta de servicio LDAP y su contraseña" -#: cps/admin.py:1232 +#: cps/admin.py:1260 msgid "Please Enter a LDAP Service Account" msgstr "Por favor, introduce una cuenta de servicio LDAP" -#: cps/admin.py:1237 +#: cps/admin.py:1265 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "LDAP Group Object Filter necesita tener un identificador de formato \"%s\"" -#: cps/admin.py:1239 +#: cps/admin.py:1267 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "El LDAP Group Object Filter tiene un paréntesis diferente" -#: cps/admin.py:1243 +#: cps/admin.py:1271 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP Group Object Filter necesita tener un identificador de formato \"%s\"" -#: cps/admin.py:1245 +#: cps/admin.py:1273 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "El LDAP Group Object Filter tiene un paréntesis diferente" -#: cps/admin.py:1252 +#: cps/admin.py:1280 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "El filtro de usuarios LDAP necesita tener un identificador de formato \"%s\"" -#: cps/admin.py:1254 +#: cps/admin.py:1282 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "El filtro de LDAP \"Member User\" tiene paréntesis no coincidentes" -#: cps/admin.py:1261 +#: cps/admin.py:1289 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "Ubicaciones del certificado de la CA del LDAP, del certificado o de la clave no válidos. Por favor introduce la ruta correcta" -#: cps/admin.py:1292 cps/templates/admin.html:53 +#: cps/admin.py:1320 cps/templates/admin.html:53 msgid "Add New User" msgstr "Añadir nuevo usuario" -#: cps/admin.py:1301 cps/templates/admin.html:100 +#: cps/admin.py:1329 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Cambiar parámetros de correo" -#: cps/admin.py:1320 +#: cps/admin.py:1348 msgid "Success! Gmail Account Verified." msgstr "Cuenta de Gmail verificada." -#: cps/admin.py:1340 cps/admin.py:1343 cps/admin.py:1728 cps/admin.py:1887 -#: cps/admin.py:1985 cps/admin.py:2106 cps/editbooks.py:169 -#: cps/editbooks.py:755 cps/editbooks.py:1474 cps/shelf.py:90 cps/shelf.py:144 +#: cps/admin.py:1368 cps/admin.py:1371 cps/admin.py:1756 cps/admin.py:1965 +#: cps/admin.py:2063 cps/admin.py:2184 cps/editbooks.py:170 +#: cps/editbooks.py:772 cps/editbooks.py:1518 cps/shelf.py:90 cps/shelf.py:144 #: cps/shelf.py:194 cps/shelf.py:237 cps/shelf.py:287 cps/shelf.py:327 -#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:160 cps/web.py:1526 +#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:161 cps/web.py:1536 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Error en la base de datos: %(error)s." -#: cps/admin.py:1350 +#: cps/admin.py:1378 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Puesto en cola un correo electrónico de prueba enviado a %(email)s, por favor, comprueba el resultado en Tareas" -#: cps/admin.py:1353 +#: cps/admin.py:1381 #, 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:1355 +#: cps/admin.py:1383 msgid "Please configure your e-mail address first..." msgstr "Por favor, configura tu correo electrónico primero..." -#: cps/admin.py:1357 +#: cps/admin.py:1385 msgid "Email Server Settings updated" msgstr "Actualizados los ajustes del servidor de correo electrónico" -#: cps/admin.py:1380 cps/templates/admin.html:195 +#: cps/admin.py:1408 cps/templates/admin.html:211 msgid "Edit Scheduled Tasks Settings" msgstr "Editar la configuración de tareas programadas" -#: cps/admin.py:1392 +#: cps/admin.py:1420 msgid "Invalid start time for task specified" msgstr "Hora de inicio no válida para la tarea especificada" -#: cps/admin.py:1397 +#: cps/admin.py:1425 msgid "Invalid duration for task specified" msgstr "Duración no válida para la tarea especificada" -#: cps/admin.py:1407 +#: cps/admin.py:1435 msgid "Scheduled tasks settings updated" msgstr "Configuración de tareas programadas actualizada" -#: cps/admin.py:1417 cps/admin.py:1466 cps/admin.py:2102 cps/web.py:1325 +#: cps/admin.py:1445 cps/admin.py:1494 cps/admin.py:2180 cps/web.py:1335 msgid "Oops! 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:1421 +#: cps/admin.py:1449 msgid "Settings DB is not Writeable" msgstr "La base de datos de configuraciones no es modificable" -#: cps/admin.py:1451 cps/admin.py:2094 +#: cps/admin.py:1479 cps/admin.py:2172 #, python-format msgid "Edit User %(nick)s" msgstr "Editar usuario %(nick)s" -#: cps/admin.py:1463 +#: cps/admin.py:1491 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "Restablecida contraseña para el usuario %(user)s" -#: cps/admin.py:1469 +#: cps/admin.py:1497 msgid "Oops! Please configure the SMTP mail settings." msgstr "Por favor, configura los ajustes de correo SMTP." -#: cps/admin.py:1480 +#: cps/admin.py:1508 msgid "Logfile viewer" msgstr "Visor del fichero de log" -#: cps/admin.py:1546 +#: cps/admin.py:1574 msgid "Requesting update package" msgstr "Solicitando paquete de actualización" -#: cps/admin.py:1547 +#: cps/admin.py:1575 msgid "Downloading update package" msgstr "Descargando paquete de actualización" -#: cps/admin.py:1548 +#: cps/admin.py:1576 msgid "Unzipping update package" msgstr "Descomprimiendo paquete de actualización" -#: cps/admin.py:1549 +#: cps/admin.py:1577 msgid "Replacing files" msgstr "Remplazando archivos" -#: cps/admin.py:1550 +#: cps/admin.py:1578 msgid "Database connections are closed" msgstr "Los conexiones con la base datos están cerradas" -#: cps/admin.py:1551 +#: cps/admin.py:1579 msgid "Stopping server" msgstr "Parando el servidor" -#: cps/admin.py:1552 +#: cps/admin.py:1580 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:1553 cps/admin.py:1554 cps/admin.py:1555 cps/admin.py:1556 -#: cps/admin.py:1557 cps/admin.py:1558 +#: cps/admin.py:1581 cps/admin.py:1582 cps/admin.py:1583 cps/admin.py:1584 +#: cps/admin.py:1585 cps/admin.py:1586 msgid "Update failed:" msgstr "Falló la actualización:" -#: cps/admin.py:1553 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1581 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "Error HTTP" -#: cps/admin.py:1554 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1582 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Error de conexión" -#: cps/admin.py:1555 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1583 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Tiempo agotado mientras se trataba de establecer la conexión" -#: cps/admin.py:1556 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1584 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Error general" -#: cps/admin.py:1557 +#: cps/admin.py:1585 msgid "Update file could not be saved in temp dir" msgstr "La actualización del archivo no pudo guardarse en el directorio temporal" -#: cps/admin.py:1558 +#: cps/admin.py:1586 msgid "Files could not be replaced during update" msgstr "Los archivos no se pudieron reemplazar durante la actualización" -#: cps/admin.py:1582 +#: cps/admin.py:1610 msgid "Failed to extract at least One LDAP User" msgstr "Error al extraer al menos un usuario LDAP" -#: cps/admin.py:1627 +#: cps/admin.py:1655 msgid "Failed to Create at Least One LDAP User" msgstr "Error al crear al menos un usuario LDAP" -#: cps/admin.py:1640 +#: cps/admin.py:1668 #, python-format msgid "Error: %(ldaperror)s" msgstr "Error: %(ldaperror)s" -#: cps/admin.py:1644 +#: cps/admin.py:1672 msgid "Error: No user returned in response of LDAP server" msgstr "Error: el servidor LDAP no ha devuelto ningún usuario" -#: cps/admin.py:1680 +#: cps/admin.py:1708 msgid "At Least One LDAP User Not Found in Database" msgstr "Al menos, un usuario LDAP no se ha encontrado en la base de datos" -#: cps/admin.py:1682 +#: cps/admin.py:1710 #, python-brace-format msgid "{} User Successfully Imported" msgstr "{} Usuario importado con éxito" -#: cps/admin.py:1740 +#: cps/admin.py:1768 msgid "Books path not valid" msgstr "La ruta de los libros no es válida" -#: cps/admin.py:1746 +#: cps/admin.py:1774 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "La ruta de la base de datos no es válida. Por favor, Introduce la ruta correcta" -#: cps/admin.py:1774 +#: cps/admin.py:1802 msgid "DB is not Writeable" msgstr "La base de datos no es modificable" -#: cps/admin.py:1788 +#: cps/admin.py:1816 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "La ruta del Keyfile no es válida, por favor, Introduce la ruta correcta" -#: cps/admin.py:1792 +#: cps/admin.py:1820 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "La ruta de Certfile no es válida, por favor, Introduce la ruta correcta" -#: cps/admin.py:1872 +#: cps/admin.py:1846 +msgid "Kepubify binary not found" +msgstr "" + +#: cps/admin.py:1894 +msgid "reverse proxy login header name" +msgstr "" + +#: cps/admin.py:1904 +msgid "reverse proxy shared secret header name" +msgstr "" + +#: cps/admin.py:1913 +msgid "Please configure both reverse proxy shared secret header name and secret" +msgstr "" + +#: cps/admin.py:1917 +msgid "Please configure reverse proxy shared secret header name and secret or disable the feature" +msgstr "" + +#: cps/admin.py:1922 +msgid "Please configure at least one trusted reverse proxy IP or CIDR" +msgstr "" + +#: cps/admin.py:1946 msgid "Password length has to be between 1 and 40" msgstr "La longitud de la contraseña debe estar entre 1 y 40 caracteres" -#: cps/admin.py:1926 +#: cps/admin.py:1957 cps/helper.py:1007 +msgid "Please specify a valid UnRar directory" +msgstr "" + +#: cps/admin.py:2004 msgid "Database Settings updated" msgstr "Actualizados los ajustes de la base de datos" -#: cps/admin.py:1934 +#: cps/admin.py:2012 msgid "Database Configuration" msgstr "Configuración de la base de datos" -#: cps/admin.py:1949 cps/web.py:1295 +#: cps/admin.py:2027 cps/web.py:1305 msgid "Oops! Please complete all fields." msgstr "Por favor, rellena todos los campos." -#: cps/admin.py:1958 +#: cps/admin.py:2036 msgid "E-mail is not from valid domain" msgstr "El correo electrónico no tiene un dominio válido" -#: cps/admin.py:1964 +#: cps/admin.py:2042 msgid "Add new user" msgstr "Añadir un nuevo usuario" -#: cps/admin.py:1975 +#: cps/admin.py:2053 #, python-format msgid "User '%(user)s' created" msgstr "Usuario '%(user)s' creado" -#: cps/admin.py:1981 +#: cps/admin.py:2059 msgid "Oops! An account already exists for this Email. or name." msgstr "Ya existe una cuenta para este correo electrónico o nombre." -#: cps/admin.py:2011 +#: cps/admin.py:2089 #, python-format msgid "User '%(nick)s' deleted" msgstr "Usuario '%(nick)s' eliminado" -#: cps/admin.py:2014 +#: cps/admin.py:2092 msgid "Can't delete Guest User" msgstr "No puedes borrar al Usuario Invitado" -#: cps/admin.py:2017 +#: cps/admin.py:2095 msgid "No admin user remaining, can't delete user" msgstr "No queda ningún usuario administrador, no se puede borrar al usuario" -#: cps/admin.py:2072 cps/web.py:1475 +#: cps/admin.py:2150 cps/web.py:1485 msgid "Email can't be empty and has to be a valid Email" msgstr "El correo electrónico no puede estar vacío y debe ser un correo electrónico válido" -#: cps/admin.py:2098 +#: cps/admin.py:2176 #, python-format msgid "User '%(nick)s' updated" msgstr "Usuario '%(nick)s' actualizado" @@ -544,145 +583,153 @@ msgstr "Usuario '%(nick)s' actualizado" msgid "Search" msgstr "Buscar" -#: cps/converter.py:31 +#: cps/converter.py:32 msgid "not installed" msgstr "no instalado" -#: cps/converter.py:32 +#: cps/converter.py:33 msgid "Execution permissions missing" msgstr "Faltan permisos de ejecución" -#: cps/db.py:1129 cps/templates/config_edit.html:207 +#: cps/db.py:1129 cps/templates/config_edit.html:229 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:565 cps/web.py:599 cps/web.py:644 cps/web.py:684 cps/web.py:711 -#: cps/web.py:998 cps/web.py:1028 cps/web.py:1073 cps/web.py:1101 -#: cps/web.py:1140 +#: cps/web.py:567 cps/web.py:601 cps/web.py:646 cps/web.py:686 cps/web.py:713 +#: cps/web.py:1000 cps/web.py:1030 cps/web.py:1075 cps/web.py:1103 +#: cps/web.py:1142 msgid "None" msgstr "Ninguna" -#: cps/editbooks.py:155 +#: cps/editbooks.py:156 #, python-format msgid "File %(file)s uploaded" msgstr "El fichero %(file)s ha sido subido" -#: cps/editbooks.py:184 +#: cps/editbooks.py:185 msgid "Source or destination format for conversion missing" msgstr "Falta la fuente o el formato de destino para la conversión" -#: cps/editbooks.py:192 +#: cps/editbooks.py:189 cps/editbooks.py:197 +msgid "Source format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:201 +msgid "Destination format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:209 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Libro puesto a la cola para su conversión a %(book_format)s" -#: cps/editbooks.py:196 +#: cps/editbooks.py:213 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Ocurrió un error al convertir este libro: %(res)s" -#: cps/editbooks.py:297 +#: cps/editbooks.py:314 msgid "Changes successfully applied" msgstr "Cambios aplicados con éxito" -#: cps/editbooks.py:317 +#: cps/editbooks.py:334 msgid "Value is missing on request" msgstr "Falta el valor en la solicitud" -#: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 -#: cps/editbooks.py:1146 cps/web.py:532 cps/web.py:1567 cps/web.py:1613 -#: cps/web.py:1663 +#: cps/editbooks.py:336 cps/editbooks.py:343 cps/editbooks.py:644 +#: cps/editbooks.py:1170 cps/web.py:534 cps/web.py:1577 cps/web.py:1623 +#: cps/web.py:1673 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "El libro seleccionado no está disponible. El archivo no existe o no es accesible" -#: cps/editbooks.py:673 cps/editbooks.py:1503 +#: cps/editbooks.py:690 cps/editbooks.py:1547 msgid "User has no rights to upload cover" msgstr "El usuario no tiene derechos para subir la portada" -#: cps/editbooks.py:694 cps/editbooks.py:938 +#: cps/editbooks.py:711 cps/editbooks.py:961 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "Los identificadores no distinguen entre mayúsculas y minúsculas, sobrescribiendo el identificador antiguo" -#: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 +#: cps/editbooks.py:726 cps/editbooks.py:935 cps/editbooks.py:1306 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "'%(langname)s' no es un idioma válido" -#: cps/editbooks.py:737 +#: cps/editbooks.py:754 msgid "Metadata successfully updated" msgstr "Metadatos actualizados con éxito" -#: cps/editbooks.py:760 +#: cps/editbooks.py:777 #, python-brace-format msgid "Error editing book: {}" msgstr "Error al editar el libro: {}" -#: cps/editbooks.py:856 +#: cps/editbooks.py:879 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "El libro subido probablemente ya existe en la biblioteca, considera cambiarlo antes de subir uno nuevo: " -#: cps/editbooks.py:950 cps/editbooks.py:1420 +#: cps/editbooks.py:973 cps/editbooks.py:1464 msgid "File type isn't allowed to be uploaded to this server" msgstr "No se permite subir este tipo de archivo a este servidor" -#: cps/editbooks.py:956 cps/editbooks.py:1431 +#: cps/editbooks.py:979 cps/editbooks.py:1475 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "No se permite subir archivos con la extensión '%(ext)s' a este servidor" -#: cps/editbooks.py:960 cps/editbooks.py:1436 +#: cps/editbooks.py:983 cps/editbooks.py:1480 msgid "File to be uploaded must have an extension" msgstr "El archivo a subir debe tener una extensión" -#: cps/editbooks.py:968 +#: cps/editbooks.py:992 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "El archivo %(filename)s no pudo salvarse en el directorio temporal (Temp Dir)" -#: cps/editbooks.py:988 +#: cps/editbooks.py:1012 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Fallo al mover el archivo de portada %(file)s: %(error)s" -#: cps/editbooks.py:1041 +#: cps/editbooks.py:1065 msgid "Book Format Successfully Deleted" msgstr "Formato de libro eliminado con éxito" -#: cps/editbooks.py:1044 cps/editbooks.py:1061 +#: cps/editbooks.py:1068 cps/editbooks.py:1085 msgid "Book Successfully Deleted" msgstr "Libro eliminado con éxito" -#: cps/editbooks.py:1065 +#: cps/editbooks.py:1089 msgid "You are missing permissions to delete books" msgstr "Te faltan permisos para eliminar libros" -#: cps/editbooks.py:1139 +#: cps/editbooks.py:1163 #, python-brace-format msgid "Book with id \"{}\" could not be deleted: not found" msgstr "El libro con id \"{}\" no pudo ser eliminado: no encontrado" -#: cps/editbooks.py:1181 +#: cps/editbooks.py:1205 msgid "edit metadata" msgstr "editar metadatos" -#: cps/editbooks.py:1234 +#: cps/editbooks.py:1267 #, python-format msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "Seriesindex: %(seriesindex)s no es un número válido, saltando" -#: cps/editbooks.py:1425 +#: cps/editbooks.py:1469 msgid "User has no rights to upload additional file formats" msgstr "El usuario no tiene derechos para subir formatos de archivo adicionales" -#: cps/editbooks.py:1449 +#: cps/editbooks.py:1493 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Error al crear la ruta %(path)s (permiso denegado)" -#: cps/editbooks.py:1456 +#: cps/editbooks.py:1500 #, python-format msgid "Failed to store file %(file)s." msgstr "Error al guardar el archivo %(file)s." -#: cps/editbooks.py:1481 +#: cps/editbooks.py:1525 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Archivo con formato %(ext)s añadido a %(book)s" @@ -693,9 +740,9 @@ msgstr "Por favor, espera un minuto para registrar el siguiente usuario" #: cps/error_handler.py:108 cps/templates/layout.html:69 #: cps/templates/layout.html:104 cps/templates/login.html:27 -#: cps/templates/register.html:17 cps/web.py:1292 cps/web.py:1296 -#: cps/web.py:1302 cps/web.py:1326 cps/web.py:1330 cps/web.py:1343 -#: cps/web.py:1346 +#: cps/templates/register.html:17 cps/web.py:1302 cps/web.py:1306 +#: cps/web.py:1312 cps/web.py:1336 cps/web.py:1340 cps/web.py:1353 +#: cps/web.py:1356 msgid "Register" msgstr "Registro" @@ -716,7 +763,7 @@ msgstr "El dominio de retorno (callback) no está verificado, por favor sigue lo msgid "%(format)s format not found for book id: %(book)d" msgstr "%(format)s formato no encontrado para el id del libro: %(book)d" -#: cps/helper.py:94 cps/tasks/convert.py:91 +#: cps/helper.py:94 cps/tasks/convert.py:92 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s no encontrado en Google Drive: %(fn)s" @@ -902,10 +949,6 @@ msgstr "Sólo se admiten como portada los archivos jpg/jpeg" msgid "Cover" msgstr "Portada" -#: cps/helper.py:1006 -msgid "UnRar binary file not found" -msgstr "No se encontró el archivo binario de UnRar." - #: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "Error ejecutando UnRar" @@ -936,7 +979,7 @@ msgstr "Faltan permisos de ejecución: %(missing)s" msgid "Error executing Calibre" msgstr "Error ejecutando Calibre" -#: cps/helper.py:1154 cps/templates/admin.html:216 +#: cps/helper.py:1154 cps/templates/admin.html:232 msgid "Queue all books for metadata backup" msgstr "Poner en cola todos los libros para la copia de seguridad de metadatos" @@ -958,7 +1001,7 @@ msgstr "Registrado con %(provider)s" msgid "This %(oauth)s account is already linked to a different user" msgstr "" -#: cps/oauth_bb.py:147 cps/remotelogin.py:131 +#: cps/oauth_bb.py:147 cps/remotelogin.py:150 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "Has iniciado sesión como : '%(nickname)s'" @@ -1026,25 +1069,29 @@ msgstr "Error Google Oauth {}" msgid "{} Stars" msgstr "{} estrellas" -#: cps/remotelogin.py:63 cps/templates/layout.html:68 -#: cps/templates/layout.html:103 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1361 -msgid "Login" -msgstr "Inicio de sesión" - -#: cps/remotelogin.py:75 cps/remotelogin.py:109 +#: cps/remotelogin.py:46 cps/remotelogin.py:128 msgid "Token not found" msgstr "Token no encontrado" -#: cps/remotelogin.py:84 cps/remotelogin.py:117 +#: cps/remotelogin.py:55 cps/remotelogin.py:136 msgid "Token has expired" msgstr "El token ha expirado" -#: cps/remotelogin.py:93 +#: cps/remotelogin.py:86 cps/remotelogin.py:112 cps/templates/layout.html:68 +#: cps/templates/layout.html:103 cps/templates/login.html:4 +#: cps/templates/login.html:21 cps/web.py:1371 +msgid "Login" +msgstr "Inicio de sesión" + +#: cps/remotelogin.py:100 +msgid "Token already approved" +msgstr "" + +#: cps/remotelogin.py:108 msgid "Success! Please return to your device" msgstr "¡Hecho! Por favor regresa a tu dispositivo" -#: cps/render_template.py:41 cps/web.py:421 +#: cps/render_template.py:41 cps/web.py:423 msgid "Books" msgstr "Libros" @@ -1069,7 +1116,7 @@ msgstr "Libros descargados" msgid "Show Downloaded Books" msgstr "Mostrar libros descargados" -#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:436 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:438 msgid "Top Rated Books" msgstr "Libros mejor valorados" @@ -1078,7 +1125,7 @@ msgid "Show Top Rated Books" msgstr "Mostrar libros mejor valorados" #: cps/render_template.py:61 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:769 +#: cps/templates/index.xml:67 cps/web.py:771 msgid "Read Books" msgstr "Libros leídos" @@ -1087,7 +1134,7 @@ msgid "Show Read and Unread" msgstr "Mostrar leídos y no leídos" #: cps/render_template.py:65 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:772 +#: cps/templates/index.xml:74 cps/web.py:774 msgid "Unread Books" msgstr "Libros no leídos" @@ -1105,7 +1152,7 @@ msgid "Show Random Books" msgstr "Mostrar libros al azar" #: cps/render_template.py:71 cps/templates/book_table.html:93 -#: cps/templates/index.xml:97 cps/web.py:1144 +#: cps/templates/index.xml:97 cps/web.py:1146 msgid "Categories" msgstr "Categorías" @@ -1115,7 +1162,7 @@ msgstr "Mostrar sección de categorías" #: cps/render_template.py:74 cps/templates/book_edit.html:86 #: cps/templates/book_table.html:94 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1034 cps/web.py:1046 +#: cps/templates/search_form.html:70 cps/web.py:1036 cps/web.py:1048 msgid "Series" msgstr "Series" @@ -1133,7 +1180,7 @@ msgid "Show Author Section" msgstr "Mostrar sección de autores" #: cps/render_template.py:81 cps/templates/book_table.html:98 -#: cps/templates/index.xml:88 cps/web.py:1002 +#: cps/templates/index.xml:88 cps/web.py:1004 msgid "Publishers" msgstr "Editores" @@ -1143,7 +1190,7 @@ msgstr "Mostrar sección de editores" #: cps/render_template.py:84 cps/templates/book_table.html:96 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1116 +#: cps/web.py:1118 msgid "Languages" msgstr "Idiomas" @@ -1167,7 +1214,7 @@ msgstr "Formatos de archivo" msgid "Show File Formats Section" msgstr "Mostrar sección de formatos de archivo" -#: cps/render_template.py:95 cps/web.py:795 +#: cps/render_template.py:95 cps/web.py:797 msgid "Archived Books" msgstr "Libros archivados" @@ -1175,7 +1222,7 @@ msgstr "Libros archivados" msgid "Show Archived Books" msgstr "Mostrar libros archivados" -#: cps/render_template.py:100 cps/web.py:831 +#: cps/render_template.py:100 cps/web.py:833 msgid "Books List" msgstr "Lista de libros" @@ -1408,150 +1455,154 @@ msgstr "Hay una nueva actualización disponible. Haz clic en el botón de abajo msgid "No release information available" msgstr "No hay información de lanzamiento disponible" -#: cps/templates/index.html:6 cps/web.py:448 +#: cps/templates/index.html:6 cps/web.py:450 msgid "Discover (Random Books)" msgstr "Descubrir (Libros al azar)" -#: cps/web.py:484 +#: cps/web.py:486 msgid "Hot Books (Most Downloaded)" msgstr "Libros populares (los más descargados)" -#: cps/web.py:515 +#: cps/web.py:517 #, python-format msgid "Downloaded books by %(user)s" msgstr "Libros descargados por %(user)s" -#: cps/web.py:548 +#: cps/web.py:550 #, python-format msgid "Author: %(name)s" msgstr "Autor/es: %(name)s" -#: cps/web.py:584 +#: cps/web.py:586 #, python-format msgid "Publisher: %(name)s" msgstr "Editor/es: %(name)s" -#: cps/web.py:612 +#: cps/web.py:614 #, python-format msgid "Series: %(serie)s" msgstr "Series: %(serie)s" -#: cps/web.py:626 +#: cps/web.py:628 msgid "Rating: None" msgstr "Valoración: Ninguna estrella" -#: cps/web.py:635 +#: cps/web.py:637 #, python-format msgid "Rating: %(rating)s stars" msgstr "Valoración: %(rating)s estrellas" -#: cps/web.py:666 +#: cps/web.py:668 #, python-format msgid "File format: %(format)s" msgstr "Formato del archivo: %(format)s" -#: cps/web.py:701 +#: cps/web.py:703 #, python-format msgid "Category: %(name)s" msgstr "Categoría : %(name)s" -#: cps/web.py:730 +#: cps/web.py:732 #, python-format msgid "Language: %(name)s" msgstr "Idioma: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:974 +#: cps/templates/admin.html:16 cps/web.py:976 msgid "Downloads" msgstr "Descargas" -#: cps/web.py:1076 +#: cps/web.py:1078 msgid "Ratings list" msgstr "Lista de valoraciones" -#: cps/web.py:1103 +#: cps/web.py:1105 msgid "File formats list" msgstr "Lista de formatos" -#: cps/web.py:1264 +#: cps/web.py:1272 +msgid "Book format not supported" +msgstr "" + +#: cps/web.py:1274 msgid "Please configure the SMTP mail settings first..." msgstr "Por favor, configura primero los ajustes de correo SMTP..." -#: cps/web.py:1270 +#: cps/web.py:1280 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Libro puesto en la cola de envío a %(eReadermail)s" -#: cps/web.py:1273 +#: cps/web.py:1283 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Hubo un error en el envío del libro: %(res)s" -#: cps/web.py:1275 +#: cps/web.py:1285 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Por favor, actualiza tu perfil con un correo electrónico de eReader válido." -#: cps/web.py:1291 cps/web.py:1342 +#: cps/web.py:1301 cps/web.py:1352 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "El servidor de correo no está configurado, por favor contacta con tu administrador." -#: cps/web.py:1328 +#: cps/web.py:1338 msgid "Oops! Your Email is not allowed." msgstr "Su correo electrónico no está permitido para registrarse." -#: cps/web.py:1331 +#: cps/web.py:1341 msgid "Success! Confirmation Email has been sent." msgstr "Se ha enviado un correo electrónico de verificación a su cuenta de correo." -#: cps/web.py:1376 cps/web.py:1390 +#: cps/web.py:1386 cps/web.py:1400 msgid "Cannot activate LDAP authentication" msgstr "No se puede activar la autenticación LDAP" -#: cps/web.py:1399 +#: cps/web.py:1409 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "estás ahora conectado como: '%(nickname)s'" -#: cps/web.py:1406 +#: cps/web.py:1416 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Inicio de sesión alternativo como: '%(nickname)s', servidor LDAP no accesible o usuario no conocido" -#: cps/web.py:1411 +#: cps/web.py:1421 #, python-format msgid "Could not login: %(message)s" msgstr "No se pudo iniciar sesión: %(message)s" -#: cps/web.py:1415 cps/web.py:1440 +#: cps/web.py:1425 cps/web.py:1450 msgid "Wrong Username or Password" msgstr "Nombre de usuario o contraseña incorrectos" -#: cps/web.py:1422 +#: cps/web.py:1432 msgid "New Password was sent to your email address" msgstr "Se envió una nueva contraseña a tu dirección de correo electrónico" -#: cps/web.py:1426 +#: cps/web.py:1436 msgid "An unknown error occurred. Please try again later." msgstr "Ha ocurrido un error desconocido. Por favor vuelva a intentarlo más tarde." -#: cps/web.py:1428 +#: cps/web.py:1438 msgid "Please enter valid username to reset password" msgstr "Por favor, introduce un nombre de usuario válido para restablecer la contraseña" -#: cps/web.py:1436 +#: cps/web.py:1446 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Ahora estás conectado como: '%(nickname)s'" -#: cps/web.py:1501 cps/web.py:1551 +#: cps/web.py:1511 cps/web.py:1561 #, python-format msgid "%(name)s's Profile" msgstr "Perfil de %(name)s" -#: cps/web.py:1517 +#: cps/web.py:1527 msgid "Success! Profile Updated" msgstr "Perfil actualizado" -#: cps/web.py:1521 +#: cps/web.py:1531 msgid "Oops! An account already exists for this Email." msgstr "Ya existe una cuenta creada para ese correo electrónico." @@ -1563,46 +1614,46 @@ msgstr "No se ha encontrado ningún archivo gmail.json válido con información msgid "Delete temp folder contents" msgstr "Eliminar el contenido de la carpeta temporal" -#: cps/tasks/convert.py:112 +#: cps/tasks/convert.py:113 #, python-format msgid "%(book)s send to E-Reader" msgstr "%(book)s enviado al eReader" -#: cps/tasks/convert.py:177 +#: cps/tasks/convert.py:180 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre ebook-convert %(tool)s no encontrado" -#: cps/tasks/convert.py:211 +#: cps/tasks/convert.py:214 #, python-format msgid "%(format)s format not found on disk" msgstr "%(format)s format no encontrado en disco" -#: cps/tasks/convert.py:215 +#: cps/tasks/convert.py:218 msgid "Ebook converter failed with unknown error" msgstr "El conversor de ebook falló con un error desconocido" -#: cps/tasks/convert.py:234 +#: cps/tasks/convert.py:237 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify-converter falló: %(error)s" -#: cps/tasks/convert.py:254 +#: cps/tasks/convert.py:257 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Archivo convertido no encontrado, o hay más de un archivo en la carpeta %(folder)s" -#: cps/tasks/convert.py:291 cps/tasks/convert.py:342 +#: cps/tasks/convert.py:294 cps/tasks/convert.py:345 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre falló con el error: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:322 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Falló Ebook-converter: %(error)s" -#: cps/tasks/convert.py:347 +#: cps/tasks/convert.py:350 msgid "Convert" msgstr "Convertir fichero" @@ -1688,7 +1739,7 @@ msgstr "Editar" #: cps/templates/admin.html:25 cps/templates/book_edit.html:17 #: cps/templates/book_table.html:131 cps/templates/book_table.html:180 -#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:115 +#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:117 #: cps/templates/user_edit.html:67 cps/templates/user_table.html:149 msgid "Delete" msgstr "Borrar" @@ -1778,128 +1829,145 @@ msgstr "Acceso remoto mediante enlace mágico" msgid "Reverse Proxy Login" msgstr "Acceso mediante Proxy inverso" -#: cps/templates/admin.html:154 cps/templates/config_edit.html:176 +#: cps/templates/admin.html:154 cps/templates/config_edit.html:180 msgid "Reverse Proxy Header Name" msgstr "Nombre de cabecera de Proxy inverso" -#: cps/templates/admin.html:159 +#: cps/templates/admin.html:158 +msgid "Reverse Proxy Trusted IPs/CIDRs" +msgstr "" + +#: cps/templates/admin.html:162 cps/templates/config_edit.html:193 +msgid "Reverse Proxy Shared Secret Header Name" +msgstr "" + +#: cps/templates/admin.html:166 +msgid "Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/admin.html:170 +msgid "Reverse Proxy Shared Secret Configured" +msgstr "" + +#: cps/templates/admin.html:175 msgid "Edit Calibre Database Configuration" msgstr "Editar la configuración de la base de datos de Calibre" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:176 msgid "Edit Basic Configuration" msgstr "Editar la configuración básica" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:177 msgid "Edit UI Configuration" msgstr "Editar la configuración de la interfaz de usuario" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:183 msgid "Scheduled Tasks" msgstr "Tareas programadas" -#: cps/templates/admin.html:170 cps/templates/schedule_edit.html:12 +#: cps/templates/admin.html:186 cps/templates/schedule_edit.html:12 #: cps/templates/tasks.html:18 msgid "Start Time" msgstr "Hora de inicio" -#: cps/templates/admin.html:174 cps/templates/schedule_edit.html:20 +#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:20 msgid "Maximum Duration" msgstr "Duración maxima" -#: cps/templates/admin.html:178 cps/templates/schedule_edit.html:29 +#: cps/templates/admin.html:194 cps/templates/schedule_edit.html:29 msgid "Generate Thumbnails" msgstr "Generar miniaturas" -#: cps/templates/admin.html:182 +#: cps/templates/admin.html:198 msgid "Generate series cover thumbnails" msgstr "Generar miniaturas de portada de series" -#: cps/templates/admin.html:186 cps/templates/admin.html:208 +#: cps/templates/admin.html:202 cps/templates/admin.html:224 #: cps/templates/schedule_edit.html:37 msgid "Reconnect Calibre Database" msgstr "Reconectar la base de datos de Calibre" -#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 +#: cps/templates/admin.html:206 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" msgstr "Generar archivos de copia de seguridad de metadatos" -#: cps/templates/admin.html:197 +#: cps/templates/admin.html:213 msgid "Refresh Thumbnail Cache" msgstr "Actualizar la caché de miniaturas" -#: cps/templates/admin.html:203 +#: cps/templates/admin.html:219 msgid "Administration" msgstr "Administración" -#: cps/templates/admin.html:204 +#: cps/templates/admin.html:220 msgid "Download Debug Package" msgstr "Descargar paquete de debug" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:221 msgid "View Logs" msgstr "Ver archivos de registro" -#: cps/templates/admin.html:211 +#: cps/templates/admin.html:227 msgid "Restart" msgstr "Reiniciar" -#: cps/templates/admin.html:212 +#: cps/templates/admin.html:228 msgid "Shutdown" msgstr "Apagar" -#: cps/templates/admin.html:221 +#: cps/templates/admin.html:237 msgid "Version Information" msgstr "Información de versión" -#: cps/templates/admin.html:225 +#: cps/templates/admin.html:241 msgid "Version" msgstr "Versión" -#: cps/templates/admin.html:226 +#: cps/templates/admin.html:242 msgid "Details" msgstr "Detalles" -#: cps/templates/admin.html:232 +#: cps/templates/admin.html:248 msgid "Current Version" msgstr "Versión actual" -#: cps/templates/admin.html:239 +#: cps/templates/admin.html:255 msgid "Check for Update" msgstr "Comprobar actualizaciones" -#: cps/templates/admin.html:240 +#: cps/templates/admin.html:256 msgid "Perform Update" msgstr "Realizar actualización" -#: cps/templates/admin.html:253 +#: cps/templates/admin.html:269 msgid "Are you sure you want to restart?" msgstr "¿Estás seguro de que deseas reiniciar?" -#: cps/templates/admin.html:258 cps/templates/admin.html:272 -#: cps/templates/admin.html:292 cps/templates/config_db.html:82 +#: cps/templates/admin.html:274 cps/templates/admin.html:288 +#: cps/templates/admin.html:308 cps/templates/config_db.html:82 msgid "OK" msgstr "OK" -#: cps/templates/admin.html:259 cps/templates/admin.html:273 +#: cps/templates/admin.html:275 cps/templates/admin.html:289 #: cps/templates/book_edit.html:220 cps/templates/book_table.html:162 #: cps/templates/book_table.html:181 cps/templates/book_table.html:201 #: cps/templates/book_table.html:221 cps/templates/book_table.html:241 #: cps/templates/book_table.html:261 cps/templates/book_table.html:316 -#: cps/templates/config_db.html:66 cps/templates/config_edit.html:431 +#: cps/templates/config_db.html:66 cps/templates/config_edit.html:453 #: cps/templates/config_view_edit.html:175 cps/templates/detail.html:350 -#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:98 -#: cps/templates/modal_dialogs.html:116 cps/templates/modal_dialogs.html:134 +#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:100 +#: cps/templates/modal_dialogs.html:118 cps/templates/modal_dialogs.html:136 +#: cps/templates/remote_login_verify.html:16 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 #: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Cancelar" -#: cps/templates/admin.html:271 +#: cps/templates/admin.html:287 msgid "Are you sure you want to shutdown?" msgstr "¿Estás seguro de que deseas apagar?" -#: cps/templates/admin.html:283 +#: cps/templates/admin.html:299 msgid "Updating, please do not reload this page" msgstr "Actualizando, por favor no recargues esta página" @@ -2140,7 +2208,7 @@ msgid "Fetch Metadata" msgstr "Obtener metadatos" #: cps/templates/book_edit.html:219 cps/templates/config_db.html:65 -#: cps/templates/config_edit.html:430 cps/templates/config_view_edit.html:174 +#: cps/templates/config_edit.html:452 cps/templates/config_view_edit.html:174 #: cps/templates/email_edit.html:65 cps/templates/schedule_edit.html:44 #: cps/templates/shelf_edit.html:25 cps/templates/shelf_order.html:41 #: cps/templates/user_edit.html:142 @@ -2512,214 +2580,234 @@ msgstr "Clave de la API de Google Books" msgid "Allow Reverse Proxy Authentication" msgstr "Permitir autenticación de proxy inverso" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:176 +msgid "Security Warning" +msgstr "" + +#: cps/templates/config_edit.html:177 +msgid "Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled." +msgstr "" + +#: cps/templates/config_edit.html:184 +msgid "Reverse Proxy Trusted IPs/CIDRs (Comma Separated)" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "Enable Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/config_edit.html:197 +msgid "Reverse Proxy Shared Secret" +msgstr "" + +#: cps/templates/config_edit.html:205 msgid "Login type" msgstr "Tipo de inicio de sesión" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:207 msgid "Use Standard Authentication" msgstr "Usar autenticación estándar" -#: cps/templates/config_edit.html:187 +#: cps/templates/config_edit.html:209 msgid "Use LDAP Authentication" msgstr "Usar autenticación LDAP" -#: cps/templates/config_edit.html:190 +#: cps/templates/config_edit.html:212 msgid "Use OAuth" msgstr "Usar OAuth" -#: cps/templates/config_edit.html:197 +#: cps/templates/config_edit.html:219 msgid "LDAP Server Host Name or IP Address" msgstr "Nombre de host o dirección IP del servidor LDAP" -#: cps/templates/config_edit.html:201 +#: cps/templates/config_edit.html:223 msgid "LDAP Server Port" msgstr "Puerto del servidor LDAP" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:227 msgid "LDAP Encryption" msgstr "Cifrado LDAP" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:230 msgid "TLS" msgstr "TLS" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:231 msgid "SSL" msgstr "SSL" -#: cps/templates/config_edit.html:213 +#: cps/templates/config_edit.html:235 msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" msgstr "Ruta del certificado CA de LDAP (solo necesario para la autenticación con certificado de cliente)" -#: cps/templates/config_edit.html:220 +#: cps/templates/config_edit.html:242 msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" msgstr "Ruta del certificado de LDAP (solo necesario para la autenticación con certificado de cliente)" -#: cps/templates/config_edit.html:227 +#: cps/templates/config_edit.html:249 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" msgstr "Ruta del archivo de clave LDAP (solo necesario para la autenticación con certificado de cliente)" -#: cps/templates/config_edit.html:236 +#: cps/templates/config_edit.html:258 msgid "LDAP Authentication" msgstr "Autenticación LDAP" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:260 msgid "Anonymous" msgstr "Anónimo" -#: cps/templates/config_edit.html:239 +#: cps/templates/config_edit.html:261 msgid "Unauthenticated" msgstr "No autenticado" -#: cps/templates/config_edit.html:240 +#: cps/templates/config_edit.html:262 msgid "Simple" msgstr "Simple" -#: cps/templates/config_edit.html:245 +#: cps/templates/config_edit.html:267 msgid "LDAP Administrator Username" msgstr "Nombre de usuario de administrador LDAP" -#: cps/templates/config_edit.html:251 +#: cps/templates/config_edit.html:273 msgid "LDAP Administrator Password" msgstr "Contraseña de administrador LDAP" -#: cps/templates/config_edit.html:256 +#: cps/templates/config_edit.html:278 msgid "LDAP Distinguished Name (DN)" msgstr "Nombre distintivo LDAP (DN)" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:282 msgid "LDAP User Object Filter" msgstr "Filtro de objetos de usuario LDAP" -#: cps/templates/config_edit.html:265 +#: cps/templates/config_edit.html:287 msgid "LDAP Server is OpenLDAP?" msgstr "¿El servidor LDAP es OpenLDAP?" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:289 msgid "Following Settings are Needed For User Import" msgstr "Se necesitan las siguientes configuraciones para la importación de usuarios" -#: cps/templates/config_edit.html:269 +#: cps/templates/config_edit.html:291 msgid "LDAP Group Object Filter" msgstr "Filtro de objetos de grupo LDAP" -#: cps/templates/config_edit.html:273 +#: cps/templates/config_edit.html:295 msgid "LDAP Group Name" msgstr "Nombre de grupo LDAP" -#: cps/templates/config_edit.html:277 +#: cps/templates/config_edit.html:299 msgid "LDAP Group Members Field" msgstr "Campo de miembros de grupo LDAP" -#: cps/templates/config_edit.html:281 +#: cps/templates/config_edit.html:303 msgid "LDAP Member User Filter Detection" msgstr "Detección de filtro de usuarios miembros de LDAP" -#: cps/templates/config_edit.html:283 +#: cps/templates/config_edit.html:305 msgid "Autodetect" msgstr "Auto detectar" -#: cps/templates/config_edit.html:284 +#: cps/templates/config_edit.html:306 msgid "Custom Filter" msgstr "Filtro personalizado" -#: cps/templates/config_edit.html:289 +#: cps/templates/config_edit.html:311 msgid "LDAP Member User Filter" msgstr "Filtro de usuarios miembros de LDAP" -#: cps/templates/config_edit.html:300 +#: cps/templates/config_edit.html:322 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "Obtener las credenciales OAuth de %(provider)s" -#: cps/templates/config_edit.html:303 +#: cps/templates/config_edit.html:325 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "ID de cliente OAuth de %(provider)s" -#: cps/templates/config_edit.html:307 +#: cps/templates/config_edit.html:329 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "Secreto de cliente OAuth (OAuth Client Secret) de %(provider)s" -#: cps/templates/config_edit.html:323 +#: cps/templates/config_edit.html:345 msgid "External binaries" msgstr "Binarios externos" -#: cps/templates/config_edit.html:329 +#: cps/templates/config_edit.html:351 msgid "Path to Calibre Binaries" msgstr "Ruta a los binarios de Calibre" -#: cps/templates/config_edit.html:337 +#: cps/templates/config_edit.html:359 msgid "Calibre E-Book Converter Settings" msgstr "Configuración de Calibre E-Book Converter" -#: cps/templates/config_edit.html:340 +#: cps/templates/config_edit.html:362 msgid "Path to Kepubify E-Book Converter" msgstr "Ruta para Kepubify E-Book Converter" -#: cps/templates/config_edit.html:348 +#: cps/templates/config_edit.html:370 msgid "Location of Unrar binary" msgstr "Ubicación del binario de UnRar" -#: cps/templates/config_edit.html:364 +#: cps/templates/config_edit.html:386 msgid "Security Settings" msgstr "Configuraciones de seguridad" -#: cps/templates/config_edit.html:372 +#: cps/templates/config_edit.html:394 msgid "Limit failed login attempts" msgstr "Limitar los intentos de inicio de sesión fallidos" -#: cps/templates/config_edit.html:376 +#: cps/templates/config_edit.html:398 msgid "Configure Backend for Limiter" msgstr "Configurar backend para Limiter" -#: cps/templates/config_edit.html:380 +#: cps/templates/config_edit.html:402 msgid "Options for Limiter Backend" msgstr "Opciones del backend de Limiter" -#: cps/templates/config_edit.html:386 +#: cps/templates/config_edit.html:408 msgid "Check if file extensions matches file content on upload" msgstr "Verificar si las extensiones de archivo coinciden con el contenido del archivo al cargar" -#: cps/templates/config_edit.html:389 +#: cps/templates/config_edit.html:411 msgid "Session protection" msgstr "Protección de sesión" -#: cps/templates/config_edit.html:391 +#: cps/templates/config_edit.html:413 msgid "Basic" msgstr "Débil" -#: cps/templates/config_edit.html:392 +#: cps/templates/config_edit.html:414 msgid "Strong" msgstr "Fuerte" -#: cps/templates/config_edit.html:397 +#: cps/templates/config_edit.html:419 msgid "User Password policy" msgstr "Política de contraseñas de usuario" -#: cps/templates/config_edit.html:401 +#: cps/templates/config_edit.html:423 msgid "Minimum password length" msgstr "Longitud mínima de la contraseña" -#: cps/templates/config_edit.html:406 +#: cps/templates/config_edit.html:428 msgid "Enforce number" msgstr "Forzar números" -#: cps/templates/config_edit.html:410 +#: cps/templates/config_edit.html:432 msgid "Enforce lowercase characters" msgstr "Forzar caracteres en minúscula" -#: cps/templates/config_edit.html:414 +#: cps/templates/config_edit.html:436 msgid "Enforce uppercase characters" msgstr "Forzar caracteres en mayuscula" -#: cps/templates/config_edit.html:418 +#: cps/templates/config_edit.html:440 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" msgstr "Forzar caracteres (necesario para caracteres chinos/japoneses/coreanos)" -#: cps/templates/config_edit.html:422 +#: cps/templates/config_edit.html:444 msgid "Enforce special characters" msgstr "Forzar caracteres especiales" @@ -3186,27 +3274,27 @@ msgstr "Antes de que un libro pueda ser eliminado con seguridad debe ser archiva msgid "Choose File Location" msgstr "Escoga la ubicación del archivo" -#: cps/templates/modal_dialogs.html:81 +#: cps/templates/modal_dialogs.html:82 msgid "type" msgstr "tipo" -#: cps/templates/modal_dialogs.html:82 +#: cps/templates/modal_dialogs.html:83 msgid "name" msgstr "nombre" -#: cps/templates/modal_dialogs.html:83 +#: cps/templates/modal_dialogs.html:84 msgid "size" msgstr "tamaño" -#: cps/templates/modal_dialogs.html:89 +#: cps/templates/modal_dialogs.html:90 msgid "Parent Directory" msgstr "Directorio padre" -#: cps/templates/modal_dialogs.html:97 +#: cps/templates/modal_dialogs.html:99 msgid "Select" msgstr "Seleccionar" -#: cps/templates/modal_dialogs.html:133 cps/templates/tasks.html:46 +#: cps/templates/modal_dialogs.html:135 cps/templates/tasks.html:46 msgid "Ok" msgstr "Ok" @@ -3462,6 +3550,31 @@ msgstr "Una vez verificado, iniciarás sesión automáticamente en este disposit msgid "This verification link will expire in 10 minutes." msgstr "Este enlace de verificación expirará en 10 minutos." +#: cps/templates/remote_login_verify.html:4 +msgid "Approve Magic Link Login" +msgstr "" + +#: cps/templates/remote_login_verify.html:5 +msgid "Review the device that requested access before approving this login." +msgstr "" + +#: cps/templates/remote_login_verify.html:7 +msgid "IP address" +msgstr "" + +#: cps/templates/remote_login_verify.html:9 +msgid "Browser" +msgstr "" + +#: cps/templates/remote_login_verify.html:12 +#, python-format +msgid "If you approve this request, the device that started it will be logged in as %(username)s." +msgstr "" + +#: cps/templates/remote_login_verify.html:15 +msgid "Approve Login" +msgstr "" + #: cps/templates/schedule_edit.html:33 msgid "Generate Series Cover Thumbnails" msgstr "Generar miniaturas de portada de series" diff --git a/cps/translations/fi/LC_MESSAGES/messages.mo b/cps/translations/fi/LC_MESSAGES/messages.mo index 671aa7acdb642909c36e5d2c8aaa11808ac6821d..f8cc8d7da21386ff32fb15033378ecad6f167726 100644 GIT binary patch delta 29 lcmZ3mmvO;f#tm8)>=p`!W>y9kn++{w7#S@#`&kC50sxJD2wDID delta 29 lcmZ3mmvO;f#tm8)?1l=4hE^s\n" "Language: fi\n" @@ -16,519 +16,558 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" +"Generated-By: Babel 2.18.0\n" #: cps/about.py:85 msgid "Statistics" msgstr "Tilastot" -#: cps/admin.py:151 +#: cps/admin.py:154 msgid "Server restarted, please reload page." msgstr "" -#: cps/admin.py:153 +#: cps/admin.py:156 msgid "Performing Server shutdown, please close window." msgstr "" -#: cps/admin.py:161 +#: cps/admin.py:164 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:164 +#: cps/admin.py:167 msgid "Unknown command" msgstr "" -#: cps/admin.py:175 +#: cps/admin.py:178 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "" -#: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 -#: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 -#: cps/uploader.py:117 +#: cps/admin.py:211 cps/editbooks.py:825 cps/editbooks.py:875 +#: cps/editbooks.py:1564 cps/templates/remote_login_verify.html:8 +#: cps/templates/remote_login_verify.html:10 cps/updater.py:615 +#: cps/uploader.py:117 cps/uploader.py:126 msgid "Unknown" msgstr "Tuntematon" -#: cps/admin.py:233 +#: cps/admin.py:236 msgid "Admin page" msgstr "Ylläpitosivu" -#: cps/admin.py:253 +#: cps/admin.py:256 msgid "Basic Configuration" msgstr "Perusasetukset" -#: cps/admin.py:291 +#: cps/admin.py:294 msgid "UI Configuration" msgstr "Käyttöliittymän asetukset" -#: cps/admin.py:315 cps/admin.py:1002 cps/db.py:809 cps/search.py:150 -#: cps/web.py:750 +#: cps/admin.py:318 cps/admin.py:1005 cps/db.py:809 cps/search.py:150 +#: cps/web.py:752 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "" -#: cps/admin.py:333 cps/templates/admin.html:51 +#: cps/admin.py:336 cps/templates/admin.html:51 msgid "Edit Users" msgstr "" -#: cps/admin.py:378 cps/opds.py:559 cps/templates/grid.html:14 +#: cps/admin.py:381 cps/opds.py:559 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Kaikki" -#: cps/admin.py:401 cps/admin.py:1432 +#: cps/admin.py:404 cps/admin.py:1460 msgid "User not found" msgstr "" -#: cps/admin.py:415 +#: cps/admin.py:418 #, python-brace-format msgid "{} users deleted successfully" msgstr "" -#: cps/admin.py:438 cps/templates/config_view_edit.html:133 +#: cps/admin.py:441 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Näytä kaikki" -#: cps/admin.py:459 cps/admin.py:465 +#: cps/admin.py:462 cps/admin.py:468 msgid "Malformed request" msgstr "" -#: cps/admin.py:477 cps/admin.py:2078 +#: cps/admin.py:480 cps/admin.py:2156 msgid "Guest Name can't be changed" msgstr "" -#: cps/admin.py:489 +#: cps/admin.py:492 msgid "Guest can't have this role" msgstr "" -#: cps/admin.py:501 cps/admin.py:2032 +#: cps/admin.py:504 cps/admin.py:2110 msgid "No admin user remaining, can't remove admin role" msgstr "" -#: cps/admin.py:505 cps/admin.py:519 +#: cps/admin.py:508 cps/admin.py:522 msgid "Value has to be true or false" msgstr "" -#: cps/admin.py:507 +#: cps/admin.py:510 msgid "Invalid role" msgstr "" -#: cps/admin.py:511 +#: cps/admin.py:514 msgid "Guest can't have this view" msgstr "" -#: cps/admin.py:521 +#: cps/admin.py:524 msgid "Invalid view" msgstr "" -#: cps/admin.py:524 +#: cps/admin.py:527 msgid "Guest's Locale is determined automatically and can't be set" msgstr "" -#: cps/admin.py:528 +#: cps/admin.py:531 msgid "No Valid Locale Given" msgstr "" -#: cps/admin.py:539 +#: cps/admin.py:542 msgid "No Valid Book Language Given" msgstr "" -#: cps/admin.py:541 cps/editbooks.py:243 cps/editbooks.py:428 -#: cps/editbooks.py:430 +#: cps/admin.py:544 cps/editbooks.py:260 cps/editbooks.py:445 +#: cps/editbooks.py:447 msgid "Parameter not found" msgstr "" -#: cps/admin.py:578 +#: cps/admin.py:581 msgid "Invalid Read Column" msgstr "" -#: cps/admin.py:584 +#: cps/admin.py:587 msgid "Invalid Restricted Column" msgstr "" -#: cps/admin.py:604 cps/admin.py:1903 +#: cps/admin.py:607 cps/admin.py:1981 msgid "Calibre-Web configuration updated" msgstr "Calibre-Web asetukset päivitetty" -#: cps/admin.py:616 +#: cps/admin.py:619 msgid "Do you really want to delete the Kobo Token?" msgstr "" -#: cps/admin.py:618 +#: cps/admin.py:621 msgid "Do you really want to delete this domain?" msgstr "" -#: cps/admin.py:620 +#: cps/admin.py:623 msgid "Do you really want to delete this user?" msgstr "" -#: cps/admin.py:622 +#: cps/admin.py:625 msgid "Do you really want to delete this book?" msgstr "" -#: cps/admin.py:624 +#: cps/admin.py:627 msgid "Are you sure you want to delete this shelf?" msgstr "Oletko varma, että haluat poistaa hyllyn?" -#: cps/admin.py:626 +#: cps/admin.py:629 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "" -#: cps/admin.py:628 +#: cps/admin.py:631 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "" -#: cps/admin.py:630 +#: cps/admin.py:633 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "" -#: cps/admin.py:632 +#: cps/admin.py:635 msgid "Are you sure you want to change the archive status for the selected book(s)?" msgstr "" -#: cps/admin.py:634 +#: cps/admin.py:637 msgid "Are you sure you want to change the read status for the selected book(s)?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:639 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "" -#: cps/admin.py:638 +#: cps/admin.py:641 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "" -#: cps/admin.py:641 +#: cps/admin.py:644 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "" -#: cps/admin.py:643 +#: cps/admin.py:646 msgid "Are you sure you want to change Calibre library location?" msgstr "" -#: cps/admin.py:645 +#: cps/admin.py:648 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "" -#: cps/admin.py:648 +#: cps/admin.py:651 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "" -#: cps/admin.py:891 cps/admin.py:897 cps/admin.py:907 cps/admin.py:917 +#: cps/admin.py:894 cps/admin.py:900 cps/admin.py:910 cps/admin.py:920 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "" -#: cps/admin.py:893 cps/admin.py:899 cps/admin.py:909 cps/admin.py:919 +#: cps/admin.py:896 cps/admin.py:902 cps/admin.py:912 cps/admin.py:922 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "" -#: cps/admin.py:952 +#: cps/admin.py:955 #, python-brace-format msgid "{} sync entries deleted" msgstr "" -#: cps/admin.py:993 +#: cps/admin.py:996 msgid "Tag not found" msgstr "" -#: cps/admin.py:1011 +#: cps/admin.py:1014 msgid "Invalid Action" msgstr "" -#: cps/admin.py:1138 +#: cps/admin.py:1137 +#, python-format +msgid "Invalid reverse proxy trusted IP/CIDR entry: %(entry)s" +msgstr "" + +#: cps/admin.py:1148 +#, python-format +msgid "Invalid %(label)s: %(value)s" +msgstr "" + +#: cps/admin.py:1166 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "" -#: cps/admin.py:1183 +#: cps/admin.py:1211 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1189 +#: cps/admin.py:1217 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1223 +#: cps/admin.py:1251 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "" -#: cps/admin.py:1229 +#: cps/admin.py:1257 msgid "Please Enter a LDAP Service Account and Password" msgstr "" -#: cps/admin.py:1232 +#: cps/admin.py:1260 msgid "Please Enter a LDAP Service Account" msgstr "" -#: cps/admin.py:1237 +#: cps/admin.py:1265 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1239 +#: cps/admin.py:1267 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1243 +#: cps/admin.py:1271 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1245 +#: cps/admin.py:1273 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1252 +#: cps/admin.py:1280 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1254 +#: cps/admin.py:1282 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1261 +#: cps/admin.py:1289 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1292 cps/templates/admin.html:53 +#: cps/admin.py:1320 cps/templates/admin.html:53 msgid "Add New User" msgstr "" -#: cps/admin.py:1301 cps/templates/admin.html:100 +#: cps/admin.py:1329 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Muuta SMTP asetuksia" -#: cps/admin.py:1320 +#: cps/admin.py:1348 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1340 cps/admin.py:1343 cps/admin.py:1728 cps/admin.py:1887 -#: cps/admin.py:1985 cps/admin.py:2106 cps/editbooks.py:169 -#: cps/editbooks.py:755 cps/editbooks.py:1474 cps/shelf.py:90 cps/shelf.py:144 +#: cps/admin.py:1368 cps/admin.py:1371 cps/admin.py:1756 cps/admin.py:1965 +#: cps/admin.py:2063 cps/admin.py:2184 cps/editbooks.py:170 +#: cps/editbooks.py:772 cps/editbooks.py:1518 cps/shelf.py:90 cps/shelf.py:144 #: cps/shelf.py:194 cps/shelf.py:237 cps/shelf.py:287 cps/shelf.py:327 -#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:160 cps/web.py:1526 +#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:161 cps/web.py:1536 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "" -#: cps/admin.py:1350 +#: cps/admin.py:1378 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1353 +#: cps/admin.py:1381 #, 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:1355 +#: cps/admin.py:1383 msgid "Please configure your e-mail address first..." msgstr "" -#: cps/admin.py:1357 +#: cps/admin.py:1385 msgid "Email Server Settings updated" msgstr "Sähköpostipalvelimen tiedot päivitetty" -#: cps/admin.py:1380 cps/templates/admin.html:195 +#: cps/admin.py:1408 cps/templates/admin.html:211 msgid "Edit Scheduled Tasks Settings" msgstr "" -#: cps/admin.py:1392 +#: cps/admin.py:1420 msgid "Invalid start time for task specified" msgstr "" -#: cps/admin.py:1397 +#: cps/admin.py:1425 msgid "Invalid duration for task specified" msgstr "" -#: cps/admin.py:1407 +#: cps/admin.py:1435 msgid "Scheduled tasks settings updated" msgstr "" -#: cps/admin.py:1417 cps/admin.py:1466 cps/admin.py:2102 cps/web.py:1325 +#: cps/admin.py:1445 cps/admin.py:1494 cps/admin.py:2180 cps/web.py:1335 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Tapahtui tuntematon virhe. Yritä myöhemmin uudelleen." -#: cps/admin.py:1421 +#: cps/admin.py:1449 msgid "Settings DB is not Writeable" msgstr "" -#: cps/admin.py:1451 cps/admin.py:2094 +#: cps/admin.py:1479 cps/admin.py:2172 #, python-format msgid "Edit User %(nick)s" msgstr "Muokkaa käyttäjää %(nick)s" -#: cps/admin.py:1463 +#: cps/admin.py:1491 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "" -#: cps/admin.py:1469 +#: cps/admin.py:1497 msgid "Oops! Please configure the SMTP mail settings." msgstr "" -#: cps/admin.py:1480 +#: cps/admin.py:1508 msgid "Logfile viewer" msgstr "Lokitiedoston katselin" -#: cps/admin.py:1546 +#: cps/admin.py:1574 msgid "Requesting update package" msgstr "Haetaan päivitystiedostoa" -#: cps/admin.py:1547 +#: cps/admin.py:1575 msgid "Downloading update package" msgstr "Ladataan päivitystiedostoa" -#: cps/admin.py:1548 +#: cps/admin.py:1576 msgid "Unzipping update package" msgstr "Puretaan päivitystiedostoa" -#: cps/admin.py:1549 +#: cps/admin.py:1577 msgid "Replacing files" msgstr "Korvataan tiedostoja" -#: cps/admin.py:1550 +#: cps/admin.py:1578 msgid "Database connections are closed" msgstr "Tietokantayhteydet on katkaistu" -#: cps/admin.py:1551 +#: cps/admin.py:1579 msgid "Stopping server" msgstr "Sammutetaan palvelin" -#: cps/admin.py:1552 +#: cps/admin.py:1580 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:1553 cps/admin.py:1554 cps/admin.py:1555 cps/admin.py:1556 -#: cps/admin.py:1557 cps/admin.py:1558 +#: cps/admin.py:1581 cps/admin.py:1582 cps/admin.py:1583 cps/admin.py:1584 +#: cps/admin.py:1585 cps/admin.py:1586 msgid "Update failed:" msgstr "Päivitys epäonnistui:" -#: cps/admin.py:1553 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1581 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP virhe" -#: cps/admin.py:1554 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1582 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Yhteysvirhe" -#: cps/admin.py:1555 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1583 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Aikakatkaisu yhteyttä luotaessa" -#: cps/admin.py:1556 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1584 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Yleinen virhe" -#: cps/admin.py:1557 +#: cps/admin.py:1585 msgid "Update file could not be saved in temp dir" msgstr "" -#: cps/admin.py:1558 +#: cps/admin.py:1586 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1582 +#: cps/admin.py:1610 msgid "Failed to extract at least One LDAP User" msgstr "" -#: cps/admin.py:1627 +#: cps/admin.py:1655 msgid "Failed to Create at Least One LDAP User" msgstr "" -#: cps/admin.py:1640 +#: cps/admin.py:1668 #, python-format msgid "Error: %(ldaperror)s" msgstr "" -#: cps/admin.py:1644 +#: cps/admin.py:1672 msgid "Error: No user returned in response of LDAP server" msgstr "" -#: cps/admin.py:1680 +#: cps/admin.py:1708 msgid "At Least One LDAP User Not Found in Database" msgstr "" -#: cps/admin.py:1682 +#: cps/admin.py:1710 #, python-brace-format msgid "{} User Successfully Imported" msgstr "" -#: cps/admin.py:1740 +#: cps/admin.py:1768 msgid "Books path not valid" msgstr "" -#: cps/admin.py:1746 +#: cps/admin.py:1774 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1774 +#: cps/admin.py:1802 msgid "DB is not Writeable" msgstr "" -#: cps/admin.py:1788 +#: cps/admin.py:1816 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1792 +#: cps/admin.py:1820 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1872 +#: cps/admin.py:1846 +msgid "Kepubify binary not found" +msgstr "" + +#: cps/admin.py:1894 +msgid "reverse proxy login header name" +msgstr "" + +#: cps/admin.py:1904 +msgid "reverse proxy shared secret header name" +msgstr "" + +#: cps/admin.py:1913 +msgid "Please configure both reverse proxy shared secret header name and secret" +msgstr "" + +#: cps/admin.py:1917 +msgid "Please configure reverse proxy shared secret header name and secret or disable the feature" +msgstr "" + +#: cps/admin.py:1922 +msgid "Please configure at least one trusted reverse proxy IP or CIDR" +msgstr "" + +#: cps/admin.py:1946 msgid "Password length has to be between 1 and 40" msgstr "" -#: cps/admin.py:1926 +#: cps/admin.py:1957 cps/helper.py:1007 +msgid "Please specify a valid UnRar directory" +msgstr "" + +#: cps/admin.py:2004 msgid "Database Settings updated" msgstr "" -#: cps/admin.py:1934 +#: cps/admin.py:2012 msgid "Database Configuration" msgstr "" -#: cps/admin.py:1949 cps/web.py:1295 +#: cps/admin.py:2027 cps/web.py:1305 msgid "Oops! Please complete all fields." msgstr "Ole hyvä ja täytä kaikki kentät!" -#: cps/admin.py:1958 +#: cps/admin.py:2036 msgid "E-mail is not from valid domain" msgstr "Sähköpostiosoite ei ole toimivasta domainista" -#: cps/admin.py:1964 +#: cps/admin.py:2042 msgid "Add new user" msgstr "Lisää uusi käyttäjä" -#: cps/admin.py:1975 +#: cps/admin.py:2053 #, python-format msgid "User '%(user)s' created" msgstr "Käyttäjä '%(user)s' lisätty" -#: cps/admin.py:1981 +#: cps/admin.py:2059 msgid "Oops! An account already exists for this Email. or name." msgstr "" -#: cps/admin.py:2011 +#: cps/admin.py:2089 #, python-format msgid "User '%(nick)s' deleted" msgstr "Käyttäjä '%(nick)s' poistettu" -#: cps/admin.py:2014 +#: cps/admin.py:2092 msgid "Can't delete Guest User" msgstr "" -#: cps/admin.py:2017 +#: cps/admin.py:2095 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:2072 cps/web.py:1475 +#: cps/admin.py:2150 cps/web.py:1485 msgid "Email can't be empty and has to be a valid Email" msgstr "" -#: cps/admin.py:2098 +#: cps/admin.py:2176 #, python-format msgid "User '%(nick)s' updated" msgstr "Käyttäjä '%(nick)s' päivitetty" @@ -541,145 +580,153 @@ msgstr "Käyttäjä '%(nick)s' päivitetty" msgid "Search" msgstr "Hae" -#: cps/converter.py:31 +#: cps/converter.py:32 msgid "not installed" msgstr "ei asennettu" -#: cps/converter.py:32 +#: cps/converter.py:33 msgid "Execution permissions missing" msgstr "" -#: cps/db.py:1129 cps/templates/config_edit.html:207 +#: cps/db.py:1129 cps/templates/config_edit.html:229 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:565 cps/web.py:599 cps/web.py:644 cps/web.py:684 cps/web.py:711 -#: cps/web.py:998 cps/web.py:1028 cps/web.py:1073 cps/web.py:1101 -#: cps/web.py:1140 +#: cps/web.py:567 cps/web.py:601 cps/web.py:646 cps/web.py:686 cps/web.py:713 +#: cps/web.py:1000 cps/web.py:1030 cps/web.py:1075 cps/web.py:1103 +#: cps/web.py:1142 msgid "None" msgstr "Ei mitään" -#: cps/editbooks.py:155 +#: cps/editbooks.py:156 #, python-format msgid "File %(file)s uploaded" msgstr "Tiedosto %(file)s tallennettu" -#: cps/editbooks.py:184 +#: cps/editbooks.py:185 msgid "Source or destination format for conversion missing" msgstr "Lähteen tai kohteen tiedostomuoto puuttuu" -#: cps/editbooks.py:192 +#: cps/editbooks.py:189 cps/editbooks.py:197 +msgid "Source format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:201 +msgid "Destination format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:209 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Kirja lisätty muutosjonoon muotoon %(book_format)s" -#: cps/editbooks.py:196 +#: cps/editbooks.py:213 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Kirjan muunnoksessa tapahtui virhe: %(res)s" -#: cps/editbooks.py:297 +#: cps/editbooks.py:314 msgid "Changes successfully applied" msgstr "" -#: cps/editbooks.py:317 +#: cps/editbooks.py:334 msgid "Value is missing on request" msgstr "" -#: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 -#: cps/editbooks.py:1146 cps/web.py:532 cps/web.py:1567 cps/web.py:1613 -#: cps/web.py:1663 +#: cps/editbooks.py:336 cps/editbooks.py:343 cps/editbooks.py:644 +#: cps/editbooks.py:1170 cps/web.py:534 cps/web.py:1577 cps/web.py:1623 +#: cps/web.py:1673 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Virhe eKirjan avaamisessa. Tiedostoa ei ole tai se ei ole saatavilla:" -#: cps/editbooks.py:673 cps/editbooks.py:1503 +#: cps/editbooks.py:690 cps/editbooks.py:1547 msgid "User has no rights to upload cover" msgstr "" -#: cps/editbooks.py:694 cps/editbooks.py:938 +#: cps/editbooks.py:711 cps/editbooks.py:961 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "" -#: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 +#: cps/editbooks.py:726 cps/editbooks.py:935 cps/editbooks.py:1306 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "" -#: cps/editbooks.py:737 +#: cps/editbooks.py:754 msgid "Metadata successfully updated" msgstr "Metadata päivitetty onnistuneesti" -#: cps/editbooks.py:760 +#: cps/editbooks.py:777 #, python-brace-format msgid "Error editing book: {}" msgstr "" -#: cps/editbooks.py:856 +#: cps/editbooks.py:879 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "" -#: cps/editbooks.py:950 cps/editbooks.py:1420 +#: cps/editbooks.py:973 cps/editbooks.py:1464 msgid "File type isn't allowed to be uploaded to this server" msgstr "" -#: cps/editbooks.py:956 cps/editbooks.py:1431 +#: cps/editbooks.py:979 cps/editbooks.py:1475 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "Tiedostopääte '%(ext)s' ei ole sallittujen palvelimelle ladattavien listalla" -#: cps/editbooks.py:960 cps/editbooks.py:1436 +#: cps/editbooks.py:983 cps/editbooks.py:1480 msgid "File to be uploaded must have an extension" msgstr "Ladattavalla tiedostolla on oltava tiedostopääte" -#: cps/editbooks.py:968 +#: cps/editbooks.py:992 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "" -#: cps/editbooks.py:988 +#: cps/editbooks.py:1012 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "" -#: cps/editbooks.py:1041 +#: cps/editbooks.py:1065 msgid "Book Format Successfully Deleted" msgstr "" -#: cps/editbooks.py:1044 cps/editbooks.py:1061 +#: cps/editbooks.py:1068 cps/editbooks.py:1085 msgid "Book Successfully Deleted" msgstr "" -#: cps/editbooks.py:1065 +#: cps/editbooks.py:1089 msgid "You are missing permissions to delete books" msgstr "" -#: cps/editbooks.py:1139 +#: cps/editbooks.py:1163 #, python-brace-format msgid "Book with id \"{}\" could not be deleted: not found" msgstr "" -#: cps/editbooks.py:1181 +#: cps/editbooks.py:1205 msgid "edit metadata" msgstr "muokkaa metadataa" -#: cps/editbooks.py:1234 +#: cps/editbooks.py:1267 #, python-format msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1425 +#: cps/editbooks.py:1469 msgid "User has no rights to upload additional file formats" msgstr "" -#: cps/editbooks.py:1449 +#: cps/editbooks.py:1493 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Polun %(path)s luonti epäonnistui (Ei oikeutta)." -#: cps/editbooks.py:1456 +#: cps/editbooks.py:1500 #, python-format msgid "Failed to store file %(file)s." msgstr "Tiedoston %(file)s tallennus epäonnistui." -#: cps/editbooks.py:1481 +#: cps/editbooks.py:1525 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Tiedostoformaatti %(ext)s lisätty %(book)s" @@ -690,9 +737,9 @@ msgstr "" #: cps/error_handler.py:108 cps/templates/layout.html:69 #: cps/templates/layout.html:104 cps/templates/login.html:27 -#: cps/templates/register.html:17 cps/web.py:1292 cps/web.py:1296 -#: cps/web.py:1302 cps/web.py:1326 cps/web.py:1330 cps/web.py:1343 -#: cps/web.py:1346 +#: cps/templates/register.html:17 cps/web.py:1302 cps/web.py:1306 +#: cps/web.py:1312 cps/web.py:1336 cps/web.py:1340 cps/web.py:1353 +#: cps/web.py:1356 msgid "Register" msgstr "Rekisteröi" @@ -713,7 +760,7 @@ msgstr "Paluuosoitteen domain ei ole varmistettu, seuraa ohjeita vamistaaksesi s msgid "%(format)s format not found for book id: %(book)d" msgstr "%(format)s tiedostomuotoa ei löytynyt kirjalle: %(book)d" -#: cps/helper.py:94 cps/tasks/convert.py:91 +#: cps/helper.py:94 cps/tasks/convert.py:92 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s ei löytynyt Google Drivesta: %(fn)s" @@ -899,10 +946,6 @@ msgstr "" msgid "Cover" msgstr "" -#: cps/helper.py:1006 -msgid "UnRar binary file not found" -msgstr "" - #: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "" @@ -933,7 +976,7 @@ msgstr "" msgid "Error executing Calibre" msgstr "" -#: cps/helper.py:1154 cps/templates/admin.html:216 +#: cps/helper.py:1154 cps/templates/admin.html:232 msgid "Queue all books for metadata backup" msgstr "" @@ -955,7 +998,7 @@ msgstr "Rekisteröi tuottajalle %(provider)s" msgid "This %(oauth)s account is already linked to a different user" msgstr "" -#: cps/oauth_bb.py:147 cps/remotelogin.py:131 +#: cps/oauth_bb.py:147 cps/remotelogin.py:150 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "olet nyt kirjautunut tunnuksella: \"%(nickname)s\"" @@ -1023,25 +1066,29 @@ msgstr "" msgid "{} Stars" msgstr "" -#: cps/remotelogin.py:63 cps/templates/layout.html:68 -#: cps/templates/layout.html:103 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1361 -msgid "Login" -msgstr "Kirjaudu sisään" - -#: cps/remotelogin.py:75 cps/remotelogin.py:109 +#: cps/remotelogin.py:46 cps/remotelogin.py:128 msgid "Token not found" msgstr "Valtuutusta ei löytynyt" -#: cps/remotelogin.py:84 cps/remotelogin.py:117 +#: cps/remotelogin.py:55 cps/remotelogin.py:136 msgid "Token has expired" msgstr "Valtuutus vanhentunut" -#: cps/remotelogin.py:93 +#: cps/remotelogin.py:86 cps/remotelogin.py:112 cps/templates/layout.html:68 +#: cps/templates/layout.html:103 cps/templates/login.html:4 +#: cps/templates/login.html:21 cps/web.py:1371 +msgid "Login" +msgstr "Kirjaudu sisään" + +#: cps/remotelogin.py:100 +msgid "Token already approved" +msgstr "" + +#: cps/remotelogin.py:108 msgid "Success! Please return to your device" msgstr "Onnistui! Ole hyvä ja palaa laitteellesi" -#: cps/render_template.py:41 cps/web.py:421 +#: cps/render_template.py:41 cps/web.py:423 msgid "Books" msgstr "Kirjat" @@ -1066,7 +1113,7 @@ msgstr "" msgid "Show Downloaded Books" msgstr "" -#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:436 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:438 msgid "Top Rated Books" msgstr "Parhaiten arvioidut kirjat" @@ -1075,7 +1122,7 @@ msgid "Show Top Rated Books" msgstr "Näytä parhaiten arvioidut kirjat" #: cps/render_template.py:61 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:769 +#: cps/templates/index.xml:67 cps/web.py:771 msgid "Read Books" msgstr "Luetut kirjat" @@ -1084,7 +1131,7 @@ msgid "Show Read and Unread" msgstr "" #: cps/render_template.py:65 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:772 +#: cps/templates/index.xml:74 cps/web.py:774 msgid "Unread Books" msgstr "Lukemattomat kirjat" @@ -1102,7 +1149,7 @@ msgid "Show Random Books" msgstr "Näytä satunnausia kirjoja" #: cps/render_template.py:71 cps/templates/book_table.html:93 -#: cps/templates/index.xml:97 cps/web.py:1144 +#: cps/templates/index.xml:97 cps/web.py:1146 msgid "Categories" msgstr "Kategoriat" @@ -1112,7 +1159,7 @@ msgstr "" #: cps/render_template.py:74 cps/templates/book_edit.html:86 #: cps/templates/book_table.html:94 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1034 cps/web.py:1046 +#: cps/templates/search_form.html:70 cps/web.py:1036 cps/web.py:1048 msgid "Series" msgstr "Sarjat" @@ -1130,7 +1177,7 @@ msgid "Show Author Section" msgstr "" #: cps/render_template.py:81 cps/templates/book_table.html:98 -#: cps/templates/index.xml:88 cps/web.py:1002 +#: cps/templates/index.xml:88 cps/web.py:1004 msgid "Publishers" msgstr "Julkaisijat" @@ -1140,7 +1187,7 @@ msgstr "" #: cps/render_template.py:84 cps/templates/book_table.html:96 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1116 +#: cps/web.py:1118 msgid "Languages" msgstr "Kielet" @@ -1164,7 +1211,7 @@ msgstr "Tiedotomuodot" msgid "Show File Formats Section" msgstr "" -#: cps/render_template.py:95 cps/web.py:795 +#: cps/render_template.py:95 cps/web.py:797 msgid "Archived Books" msgstr "" @@ -1172,7 +1219,7 @@ msgstr "" msgid "Show Archived Books" msgstr "" -#: cps/render_template.py:100 cps/web.py:831 +#: cps/render_template.py:100 cps/web.py:833 msgid "Books List" msgstr "" @@ -1405,150 +1452,154 @@ msgstr "Uusi päivitys saatavilla. Paina alla olevaa nappia päivittääksesi ve msgid "No release information available" msgstr "Ei päivitystietoa saatavilla" -#: cps/templates/index.html:6 cps/web.py:448 +#: cps/templates/index.html:6 cps/web.py:450 msgid "Discover (Random Books)" msgstr "Löydä (satunnaiset kirjat)" -#: cps/web.py:484 +#: cps/web.py:486 msgid "Hot Books (Most Downloaded)" msgstr "Kuumat kirjat (ladatuimmat)" -#: cps/web.py:515 +#: cps/web.py:517 #, python-format msgid "Downloaded books by %(user)s" msgstr "" -#: cps/web.py:548 +#: cps/web.py:550 #, python-format msgid "Author: %(name)s" msgstr "Kirjailija: %(name)s" -#: cps/web.py:584 +#: cps/web.py:586 #, python-format msgid "Publisher: %(name)s" msgstr "Julkaisija: %(name)s" -#: cps/web.py:612 +#: cps/web.py:614 #, python-format msgid "Series: %(serie)s" msgstr "Sarja: %(serie)s" -#: cps/web.py:626 +#: cps/web.py:628 msgid "Rating: None" msgstr "" -#: cps/web.py:635 +#: cps/web.py:637 #, python-format msgid "Rating: %(rating)s stars" msgstr "Arvostelu: %(rating)s tähteä" -#: cps/web.py:666 +#: cps/web.py:668 #, python-format msgid "File format: %(format)s" msgstr "Tiedostomuoto: %(format)s" -#: cps/web.py:701 +#: cps/web.py:703 #, python-format msgid "Category: %(name)s" msgstr "Kategoria: %(name)s" -#: cps/web.py:730 +#: cps/web.py:732 #, python-format msgid "Language: %(name)s" msgstr "Kieli: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:974 +#: cps/templates/admin.html:16 cps/web.py:976 msgid "Downloads" msgstr "DLS" -#: cps/web.py:1076 +#: cps/web.py:1078 msgid "Ratings list" msgstr "Arvostelulistaus" -#: cps/web.py:1103 +#: cps/web.py:1105 msgid "File formats list" msgstr "Tiedostomuotolistaus" -#: cps/web.py:1264 +#: cps/web.py:1272 +msgid "Book format not supported" +msgstr "" + +#: cps/web.py:1274 msgid "Please configure the SMTP mail settings first..." msgstr "" -#: cps/web.py:1270 +#: cps/web.py:1280 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Kirja lisätty onnistuneeksi lähetettäväksi osoitteeseen %(eReadermail)s" -#: cps/web.py:1273 +#: cps/web.py:1283 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Kirjan: %(res)s lähettämisessa tapahtui virhe" -#: cps/web.py:1275 +#: cps/web.py:1285 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "" -#: cps/web.py:1291 cps/web.py:1342 +#: cps/web.py:1301 cps/web.py:1352 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "" -#: cps/web.py:1328 +#: cps/web.py:1338 msgid "Oops! Your Email is not allowed." msgstr "Sähköpostiosoitteellasi ei ole sallittua rekisteröityä" -#: cps/web.py:1331 +#: cps/web.py:1341 msgid "Success! Confirmation Email has been sent." msgstr "Vahvistusviesti on lähetetty sähköpostiosoitteeseesi." -#: cps/web.py:1376 cps/web.py:1390 +#: cps/web.py:1386 cps/web.py:1400 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1399 +#: cps/web.py:1409 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1406 +#: cps/web.py:1416 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1411 +#: cps/web.py:1421 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1415 cps/web.py:1440 +#: cps/web.py:1425 cps/web.py:1450 msgid "Wrong Username or Password" msgstr "" -#: cps/web.py:1422 +#: cps/web.py:1432 msgid "New Password was sent to your email address" msgstr "" -#: cps/web.py:1426 +#: cps/web.py:1436 msgid "An unknown error occurred. Please try again later." msgstr "" -#: cps/web.py:1428 +#: cps/web.py:1438 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1436 +#: cps/web.py:1446 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1501 cps/web.py:1551 +#: cps/web.py:1511 cps/web.py:1561 #, python-format msgid "%(name)s's Profile" msgstr "%(name)sn profiili" -#: cps/web.py:1517 +#: cps/web.py:1527 msgid "Success! Profile Updated" msgstr "" -#: cps/web.py:1521 +#: cps/web.py:1531 msgid "Oops! An account already exists for this Email." msgstr "" @@ -1560,46 +1611,46 @@ msgstr "" msgid "Delete temp folder contents" msgstr "" -#: cps/tasks/convert.py:112 +#: cps/tasks/convert.py:113 #, python-format msgid "%(book)s send to E-Reader" msgstr "" -#: cps/tasks/convert.py:177 +#: cps/tasks/convert.py:180 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "" -#: cps/tasks/convert.py:211 +#: cps/tasks/convert.py:214 #, python-format msgid "%(format)s format not found on disk" msgstr "" -#: cps/tasks/convert.py:215 +#: cps/tasks/convert.py:218 msgid "Ebook converter failed with unknown error" msgstr "" -#: cps/tasks/convert.py:234 +#: cps/tasks/convert.py:237 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "" -#: cps/tasks/convert.py:254 +#: cps/tasks/convert.py:257 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "" -#: cps/tasks/convert.py:291 cps/tasks/convert.py:342 +#: cps/tasks/convert.py:294 cps/tasks/convert.py:345 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:322 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "E-kirjan muunnos epäonnistui: %(error)s" -#: cps/tasks/convert.py:347 +#: cps/tasks/convert.py:350 msgid "Convert" msgstr "" @@ -1685,7 +1736,7 @@ msgstr "Muokkaa" #: cps/templates/admin.html:25 cps/templates/book_edit.html:17 #: cps/templates/book_table.html:131 cps/templates/book_table.html:180 -#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:115 +#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:117 #: cps/templates/user_edit.html:67 cps/templates/user_table.html:149 msgid "Delete" msgstr "Poista" @@ -1775,128 +1826,145 @@ msgstr "Etäkirjautuminen" msgid "Reverse Proxy Login" msgstr "" -#: cps/templates/admin.html:154 cps/templates/config_edit.html:176 +#: cps/templates/admin.html:154 cps/templates/config_edit.html:180 msgid "Reverse Proxy Header Name" msgstr "" -#: cps/templates/admin.html:159 +#: cps/templates/admin.html:158 +msgid "Reverse Proxy Trusted IPs/CIDRs" +msgstr "" + +#: cps/templates/admin.html:162 cps/templates/config_edit.html:193 +msgid "Reverse Proxy Shared Secret Header Name" +msgstr "" + +#: cps/templates/admin.html:166 +msgid "Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/admin.html:170 +msgid "Reverse Proxy Shared Secret Configured" +msgstr "" + +#: cps/templates/admin.html:175 msgid "Edit Calibre Database Configuration" msgstr "" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:176 msgid "Edit Basic Configuration" msgstr "" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:177 msgid "Edit UI Configuration" msgstr "" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:183 msgid "Scheduled Tasks" msgstr "" -#: cps/templates/admin.html:170 cps/templates/schedule_edit.html:12 +#: cps/templates/admin.html:186 cps/templates/schedule_edit.html:12 #: cps/templates/tasks.html:18 msgid "Start Time" msgstr "" -#: cps/templates/admin.html:174 cps/templates/schedule_edit.html:20 +#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:20 msgid "Maximum Duration" msgstr "" -#: cps/templates/admin.html:178 cps/templates/schedule_edit.html:29 +#: cps/templates/admin.html:194 cps/templates/schedule_edit.html:29 msgid "Generate Thumbnails" msgstr "" -#: cps/templates/admin.html:182 +#: cps/templates/admin.html:198 msgid "Generate series cover thumbnails" msgstr "" -#: cps/templates/admin.html:186 cps/templates/admin.html:208 +#: cps/templates/admin.html:202 cps/templates/admin.html:224 #: cps/templates/schedule_edit.html:37 msgid "Reconnect Calibre Database" msgstr "" -#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 +#: cps/templates/admin.html:206 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" msgstr "" -#: cps/templates/admin.html:197 +#: cps/templates/admin.html:213 msgid "Refresh Thumbnail Cache" msgstr "" -#: cps/templates/admin.html:203 +#: cps/templates/admin.html:219 msgid "Administration" msgstr "Ylläpito" -#: cps/templates/admin.html:204 +#: cps/templates/admin.html:220 msgid "Download Debug Package" msgstr "" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:221 msgid "View Logs" msgstr "Katsele lokitiedostoja" -#: cps/templates/admin.html:211 +#: cps/templates/admin.html:227 msgid "Restart" msgstr "Uudellenkäynnistä Calibre-Web" -#: cps/templates/admin.html:212 +#: cps/templates/admin.html:228 msgid "Shutdown" msgstr "Sammuta Calibre-Web" -#: cps/templates/admin.html:221 +#: cps/templates/admin.html:237 msgid "Version Information" msgstr "" -#: cps/templates/admin.html:225 +#: cps/templates/admin.html:241 msgid "Version" msgstr "Versio" -#: cps/templates/admin.html:226 +#: cps/templates/admin.html:242 msgid "Details" msgstr "Yksityiskohdat" -#: cps/templates/admin.html:232 +#: cps/templates/admin.html:248 msgid "Current Version" msgstr "Nykyinen versio" -#: cps/templates/admin.html:239 +#: cps/templates/admin.html:255 msgid "Check for Update" msgstr "Tarkista päivitykset" -#: cps/templates/admin.html:240 +#: cps/templates/admin.html:256 msgid "Perform Update" msgstr "Päivitä" -#: cps/templates/admin.html:253 +#: cps/templates/admin.html:269 msgid "Are you sure you want to restart?" msgstr "Haluatko varmasti uudelleenkäynnistää Calibre-Webin?" -#: cps/templates/admin.html:258 cps/templates/admin.html:272 -#: cps/templates/admin.html:292 cps/templates/config_db.html:82 +#: cps/templates/admin.html:274 cps/templates/admin.html:288 +#: cps/templates/admin.html:308 cps/templates/config_db.html:82 msgid "OK" msgstr "Ok" -#: cps/templates/admin.html:259 cps/templates/admin.html:273 +#: cps/templates/admin.html:275 cps/templates/admin.html:289 #: cps/templates/book_edit.html:220 cps/templates/book_table.html:162 #: cps/templates/book_table.html:181 cps/templates/book_table.html:201 #: cps/templates/book_table.html:221 cps/templates/book_table.html:241 #: cps/templates/book_table.html:261 cps/templates/book_table.html:316 -#: cps/templates/config_db.html:66 cps/templates/config_edit.html:431 +#: cps/templates/config_db.html:66 cps/templates/config_edit.html:453 #: cps/templates/config_view_edit.html:175 cps/templates/detail.html:350 -#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:98 -#: cps/templates/modal_dialogs.html:116 cps/templates/modal_dialogs.html:134 +#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:100 +#: cps/templates/modal_dialogs.html:118 cps/templates/modal_dialogs.html:136 +#: cps/templates/remote_login_verify.html:16 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 #: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "" -#: cps/templates/admin.html:271 +#: cps/templates/admin.html:287 msgid "Are you sure you want to shutdown?" msgstr "Haluatko varmasti pysäyttää Calibre-Webin?" -#: cps/templates/admin.html:283 +#: cps/templates/admin.html:299 msgid "Updating, please do not reload this page" msgstr "Päivitetään, älä päivitä sivua" @@ -2137,7 +2205,7 @@ msgid "Fetch Metadata" msgstr "Hae metadata" #: cps/templates/book_edit.html:219 cps/templates/config_db.html:65 -#: cps/templates/config_edit.html:430 cps/templates/config_view_edit.html:174 +#: cps/templates/config_edit.html:452 cps/templates/config_view_edit.html:174 #: cps/templates/email_edit.html:65 cps/templates/schedule_edit.html:44 #: cps/templates/shelf_edit.html:25 cps/templates/shelf_order.html:41 #: cps/templates/user_edit.html:142 @@ -2509,214 +2577,234 @@ msgstr "" msgid "Allow Reverse Proxy Authentication" msgstr "" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:176 +msgid "Security Warning" +msgstr "" + +#: cps/templates/config_edit.html:177 +msgid "Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled." +msgstr "" + +#: cps/templates/config_edit.html:184 +msgid "Reverse Proxy Trusted IPs/CIDRs (Comma Separated)" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "Enable Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/config_edit.html:197 +msgid "Reverse Proxy Shared Secret" +msgstr "" + +#: cps/templates/config_edit.html:205 msgid "Login type" msgstr "Kirjautumisen tyyppi" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:207 msgid "Use Standard Authentication" msgstr "Käytä oletuskirjautumista" -#: cps/templates/config_edit.html:187 +#: cps/templates/config_edit.html:209 msgid "Use LDAP Authentication" msgstr "Käytä LDAP kirjautumista" -#: cps/templates/config_edit.html:190 +#: cps/templates/config_edit.html:212 msgid "Use OAuth" msgstr "Käytä OAuth kirjautumista" -#: cps/templates/config_edit.html:197 +#: cps/templates/config_edit.html:219 msgid "LDAP Server Host Name or IP Address" msgstr "LDAP palvelimen nimi tai IP osoite" -#: cps/templates/config_edit.html:201 +#: cps/templates/config_edit.html:223 msgid "LDAP Server Port" msgstr "LDAP Palveimen portti" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:227 msgid "LDAP Encryption" msgstr "" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:230 msgid "TLS" msgstr "" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:231 msgid "SSL" msgstr "" -#: cps/templates/config_edit.html:213 +#: cps/templates/config_edit.html:235 msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" msgstr "" -#: cps/templates/config_edit.html:220 +#: cps/templates/config_edit.html:242 msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" msgstr "" -#: cps/templates/config_edit.html:227 +#: cps/templates/config_edit.html:249 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" msgstr "" -#: cps/templates/config_edit.html:236 +#: cps/templates/config_edit.html:258 msgid "LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:260 msgid "Anonymous" msgstr "" -#: cps/templates/config_edit.html:239 +#: cps/templates/config_edit.html:261 msgid "Unauthenticated" msgstr "" -#: cps/templates/config_edit.html:240 +#: cps/templates/config_edit.html:262 msgid "Simple" msgstr "" -#: cps/templates/config_edit.html:245 +#: cps/templates/config_edit.html:267 msgid "LDAP Administrator Username" msgstr "LDAP pääkäyttäjän käyttäjänimi" -#: cps/templates/config_edit.html:251 +#: cps/templates/config_edit.html:273 msgid "LDAP Administrator Password" msgstr "LDAP pääkäyttäjän salasana" -#: cps/templates/config_edit.html:256 +#: cps/templates/config_edit.html:278 msgid "LDAP Distinguished Name (DN)" msgstr "LDAP DN" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:282 msgid "LDAP User Object Filter" msgstr "LDAP käyttäjä suodin (object filter)" -#: cps/templates/config_edit.html:265 +#: cps/templates/config_edit.html:287 msgid "LDAP Server is OpenLDAP?" msgstr "LDAP palvelin on OpenLDAP?" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:289 msgid "Following Settings are Needed For User Import" msgstr "" -#: cps/templates/config_edit.html:269 +#: cps/templates/config_edit.html:291 msgid "LDAP Group Object Filter" msgstr "" -#: cps/templates/config_edit.html:273 +#: cps/templates/config_edit.html:295 msgid "LDAP Group Name" msgstr "" -#: cps/templates/config_edit.html:277 +#: cps/templates/config_edit.html:299 msgid "LDAP Group Members Field" msgstr "" -#: cps/templates/config_edit.html:281 +#: cps/templates/config_edit.html:303 msgid "LDAP Member User Filter Detection" msgstr "" -#: cps/templates/config_edit.html:283 +#: cps/templates/config_edit.html:305 msgid "Autodetect" msgstr "" -#: cps/templates/config_edit.html:284 +#: cps/templates/config_edit.html:306 msgid "Custom Filter" msgstr "" -#: cps/templates/config_edit.html:289 +#: cps/templates/config_edit.html:311 msgid "LDAP Member User Filter" msgstr "" -#: cps/templates/config_edit.html:300 +#: cps/templates/config_edit.html:322 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "Hanki %(provider)s OAuth valtuutus" -#: cps/templates/config_edit.html:303 +#: cps/templates/config_edit.html:325 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "%(provider)s OAuth asiakas Id" -#: cps/templates/config_edit.html:307 +#: cps/templates/config_edit.html:329 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "%(provider)s OAuth asiakas salaisuus" -#: cps/templates/config_edit.html:323 +#: cps/templates/config_edit.html:345 msgid "External binaries" msgstr "Ulkoiset binäärit" -#: cps/templates/config_edit.html:329 +#: cps/templates/config_edit.html:351 msgid "Path to Calibre Binaries" msgstr "" -#: cps/templates/config_edit.html:337 +#: cps/templates/config_edit.html:359 msgid "Calibre E-Book Converter Settings" msgstr "" -#: cps/templates/config_edit.html:340 +#: cps/templates/config_edit.html:362 msgid "Path to Kepubify E-Book Converter" msgstr "" -#: cps/templates/config_edit.html:348 +#: cps/templates/config_edit.html:370 msgid "Location of Unrar binary" msgstr "" -#: cps/templates/config_edit.html:364 +#: cps/templates/config_edit.html:386 msgid "Security Settings" msgstr "" -#: cps/templates/config_edit.html:372 +#: cps/templates/config_edit.html:394 msgid "Limit failed login attempts" msgstr "" -#: cps/templates/config_edit.html:376 +#: cps/templates/config_edit.html:398 msgid "Configure Backend for Limiter" msgstr "" -#: cps/templates/config_edit.html:380 +#: cps/templates/config_edit.html:402 msgid "Options for Limiter Backend" msgstr "" -#: cps/templates/config_edit.html:386 +#: cps/templates/config_edit.html:408 msgid "Check if file extensions matches file content on upload" msgstr "" -#: cps/templates/config_edit.html:389 +#: cps/templates/config_edit.html:411 msgid "Session protection" msgstr "" -#: cps/templates/config_edit.html:391 +#: cps/templates/config_edit.html:413 msgid "Basic" msgstr "" -#: cps/templates/config_edit.html:392 +#: cps/templates/config_edit.html:414 msgid "Strong" msgstr "" -#: cps/templates/config_edit.html:397 +#: cps/templates/config_edit.html:419 msgid "User Password policy" msgstr "" -#: cps/templates/config_edit.html:401 +#: cps/templates/config_edit.html:423 msgid "Minimum password length" msgstr "" -#: cps/templates/config_edit.html:406 +#: cps/templates/config_edit.html:428 msgid "Enforce number" msgstr "" -#: cps/templates/config_edit.html:410 +#: cps/templates/config_edit.html:432 msgid "Enforce lowercase characters" msgstr "" -#: cps/templates/config_edit.html:414 +#: cps/templates/config_edit.html:436 msgid "Enforce uppercase characters" msgstr "" -#: cps/templates/config_edit.html:418 +#: cps/templates/config_edit.html:440 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" msgstr "" -#: cps/templates/config_edit.html:422 +#: cps/templates/config_edit.html:444 msgid "Enforce special characters" msgstr "" @@ -3183,27 +3271,27 @@ msgstr "" msgid "Choose File Location" msgstr "" -#: cps/templates/modal_dialogs.html:81 +#: cps/templates/modal_dialogs.html:82 msgid "type" msgstr "" -#: cps/templates/modal_dialogs.html:82 +#: cps/templates/modal_dialogs.html:83 msgid "name" msgstr "" -#: cps/templates/modal_dialogs.html:83 +#: cps/templates/modal_dialogs.html:84 msgid "size" msgstr "" -#: cps/templates/modal_dialogs.html:89 +#: cps/templates/modal_dialogs.html:90 msgid "Parent Directory" msgstr "" -#: cps/templates/modal_dialogs.html:97 +#: cps/templates/modal_dialogs.html:99 msgid "Select" msgstr "" -#: cps/templates/modal_dialogs.html:133 cps/templates/tasks.html:46 +#: cps/templates/modal_dialogs.html:135 cps/templates/tasks.html:46 msgid "Ok" msgstr "" @@ -3459,6 +3547,31 @@ msgstr "Kun teet näin, sinut kirjataan automaattisesti sisään tälle laitteel msgid "This verification link will expire in 10 minutes." msgstr "Linkki vanhenee 10 minuutissa." +#: cps/templates/remote_login_verify.html:4 +msgid "Approve Magic Link Login" +msgstr "" + +#: cps/templates/remote_login_verify.html:5 +msgid "Review the device that requested access before approving this login." +msgstr "" + +#: cps/templates/remote_login_verify.html:7 +msgid "IP address" +msgstr "" + +#: cps/templates/remote_login_verify.html:9 +msgid "Browser" +msgstr "" + +#: cps/templates/remote_login_verify.html:12 +#, python-format +msgid "If you approve this request, the device that started it will be logged in as %(username)s." +msgstr "" + +#: cps/templates/remote_login_verify.html:15 +msgid "Approve Login" +msgstr "" + #: cps/templates/schedule_edit.html:33 msgid "Generate Series Cover Thumbnails" msgstr "" diff --git a/cps/translations/fr/LC_MESSAGES/messages.mo b/cps/translations/fr/LC_MESSAGES/messages.mo index d97426b00165048f97592350f392cdef75fb3ca1..0476f407ecc9bfc535aa8484c624921b9d6d7f25 100644 GIT binary patch delta 14211 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 WdHHz?B}MtAWrtU8f5^)y#0>!a(Mp~G diff --git a/cps/translations/fr/LC_MESSAGES/messages.po b/cps/translations/fr/LC_MESSAGES/messages.po index 0bede3513..1dec2550c 100644 --- a/cps/translations/fr/LC_MESSAGES/messages.po +++ b/cps/translations/fr/LC_MESSAGES/messages.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-08-01 11:42+0200\n" +"POT-Creation-Date: 2026-08-08 16:08+0200\n" "PO-Revision-Date: 2026-01-15 11:30+0000\n" "Last-Translator: \n" "Language: fr\n" @@ -12,519 +12,558 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" +"Generated-By: Babel 2.18.0\n" #: cps/about.py:85 msgid "Statistics" msgstr "Statistiques" -#: cps/admin.py:151 +#: cps/admin.py:154 msgid "Server restarted, please reload page." msgstr "Serveur redémarré, veuillez recharger la page." -#: cps/admin.py:153 +#: cps/admin.py:156 msgid "Performing Server shutdown, please close window." msgstr "Arrêt du serveur en cours, veuillez fermer la fenêtre." -#: cps/admin.py:161 +#: cps/admin.py:164 msgid "Success! Database Reconnected" msgstr "Succès ! Base de données reconnectée." -#: cps/admin.py:164 +#: cps/admin.py:167 msgid "Unknown command" msgstr "Commande inconnue" -#: cps/admin.py:175 +#: cps/admin.py:178 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "Succès ! Livres mis en file d'attente pour la sauvegarde des métadonnées, veuillez vérifier les tâches pour connaître le résultat." -#: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 -#: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 -#: cps/uploader.py:117 +#: cps/admin.py:211 cps/editbooks.py:825 cps/editbooks.py:875 +#: cps/editbooks.py:1564 cps/templates/remote_login_verify.html:8 +#: cps/templates/remote_login_verify.html:10 cps/updater.py:615 +#: cps/uploader.py:117 cps/uploader.py:126 msgid "Unknown" msgstr "Inconnu" -#: cps/admin.py:233 +#: cps/admin.py:236 msgid "Admin page" msgstr "Page admin" -#: cps/admin.py:253 +#: cps/admin.py:256 msgid "Basic Configuration" msgstr "Configuration principale" -#: cps/admin.py:291 +#: cps/admin.py:294 msgid "UI Configuration" msgstr "Configuration de l’interface utilisateur" -#: cps/admin.py:315 cps/admin.py:1002 cps/db.py:809 cps/search.py:150 -#: cps/web.py:750 +#: cps/admin.py:318 cps/admin.py:1005 cps/db.py:809 cps/search.py:150 +#: cps/web.py:752 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "La colonne personnalisée N°%(column)d n'existe pas dans la base de données Calibre" -#: cps/admin.py:333 cps/templates/admin.html:51 +#: cps/admin.py:336 cps/templates/admin.html:51 msgid "Edit Users" msgstr "Modifier les utilisateurs" -#: cps/admin.py:378 cps/opds.py:559 cps/templates/grid.html:14 +#: cps/admin.py:381 cps/opds.py:559 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Tout" -#: cps/admin.py:401 cps/admin.py:1432 +#: cps/admin.py:404 cps/admin.py:1460 msgid "User not found" msgstr "L'utilisateur n'a pas été trouvé" -#: cps/admin.py:415 +#: cps/admin.py:418 #, python-brace-format msgid "{} users deleted successfully" msgstr "{} Utilisateurs supprimés avec succès" -#: cps/admin.py:438 cps/templates/config_view_edit.html:133 +#: cps/admin.py:441 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Afficher tout" -#: cps/admin.py:459 cps/admin.py:465 +#: cps/admin.py:462 cps/admin.py:468 msgid "Malformed request" msgstr "Demande malformée" -#: cps/admin.py:477 cps/admin.py:2078 +#: cps/admin.py:480 cps/admin.py:2156 msgid "Guest Name can't be changed" msgstr "Le nom de l’invité ne peut pas être modifié" -#: cps/admin.py:489 +#: cps/admin.py:492 msgid "Guest can't have this role" msgstr "L’invité ne peut pas avoir ce rôle" -#: cps/admin.py:501 cps/admin.py:2032 +#: cps/admin.py:504 cps/admin.py:2110 msgid "No admin user remaining, can't remove admin role" msgstr "Aucun utilisateur admin restant, impossible de supprimer le rôle admin" -#: cps/admin.py:505 cps/admin.py:519 +#: cps/admin.py:508 cps/admin.py:522 msgid "Value has to be true or false" msgstr "La valeur doit être vraie ou fausse" -#: cps/admin.py:507 +#: cps/admin.py:510 msgid "Invalid role" msgstr "Rôle invalide" -#: cps/admin.py:511 +#: cps/admin.py:514 msgid "Guest can't have this view" msgstr "L’invité ne peut pas avoir cette vue" -#: cps/admin.py:521 +#: cps/admin.py:524 msgid "Invalid view" msgstr "Vue invalide" -#: cps/admin.py:524 +#: cps/admin.py:527 msgid "Guest's Locale is determined automatically and can't be set" msgstr "Les paramètres régionaux de l’invité sont déterminés automatiquement et ne peuvent pas être définis" -#: cps/admin.py:528 +#: cps/admin.py:531 msgid "No Valid Locale Given" msgstr "Aucun paramètre régional valide n’est donné" -#: cps/admin.py:539 +#: cps/admin.py:542 msgid "No Valid Book Language Given" msgstr "Aucune langue de livre valide donnée" -#: cps/admin.py:541 cps/editbooks.py:243 cps/editbooks.py:428 -#: cps/editbooks.py:430 +#: cps/admin.py:544 cps/editbooks.py:260 cps/editbooks.py:445 +#: cps/editbooks.py:447 msgid "Parameter not found" msgstr "Paramètre non trouvé" -#: cps/admin.py:578 +#: cps/admin.py:581 msgid "Invalid Read Column" msgstr "Colonne de lecture non valide" -#: cps/admin.py:584 +#: cps/admin.py:587 msgid "Invalid Restricted Column" msgstr "Colonne restreinte non valide" -#: cps/admin.py:604 cps/admin.py:1903 +#: cps/admin.py:607 cps/admin.py:1981 msgid "Calibre-Web configuration updated" msgstr "Configuration de Calibre-Web mise à jour" -#: cps/admin.py:616 +#: cps/admin.py:619 msgid "Do you really want to delete the Kobo Token?" msgstr "Voulez-vous vraiment supprimer le jeton Kobo ?" -#: cps/admin.py:618 +#: cps/admin.py:621 msgid "Do you really want to delete this domain?" msgstr "Voulez-vous vraiment supprimer ce domaine ?" -#: cps/admin.py:620 +#: cps/admin.py:623 msgid "Do you really want to delete this user?" msgstr "Voulez-vous vraiment supprimer cet utilisateur ?" -#: cps/admin.py:622 +#: cps/admin.py:625 msgid "Do you really want to delete this book?" msgstr "Voulez-vous vraiment supprimer ce livre ?" -#: cps/admin.py:624 +#: cps/admin.py:627 msgid "Are you sure you want to delete this shelf?" msgstr "Êtes-vous sûr de vouloir supprimer l’étagère ?" -#: cps/admin.py:626 +#: cps/admin.py:629 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Êtes-vous sûr de vouloir modifier les paramètres régionaux des utilisateurs sélectionnés ?" -#: cps/admin.py:628 +#: cps/admin.py:631 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "Êtes-vous sûr de vouloir modifier les langues de livre visibles pour le ou les utilisateurs sélectionnés ?" -#: cps/admin.py:630 +#: cps/admin.py:633 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "Êtes-vous sûr de vouloir modifier le rôle sélectionné pour le ou les utilisateurs sélectionnés ?" -#: cps/admin.py:632 +#: cps/admin.py:635 msgid "Are you sure you want to change the archive status for the selected book(s)?" msgstr "Êtes-vous sûr de vouloir modifier le statut d'archivage du/des livres sélectionné(s) ?" -#: cps/admin.py:634 +#: cps/admin.py:637 msgid "Are you sure you want to change the read status for the selected book(s)?" msgstr "Êtes-vous sûr de vouloir modifier le statut d'archivage du ou des livres sélectionnés ?" -#: cps/admin.py:636 +#: cps/admin.py:639 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Êtes-vous sûr de vouloir modifier les restrictions sélectionnées pour le ou les utilisateurs sélectionnés ?" -#: cps/admin.py:638 +#: cps/admin.py:641 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "Êtes-vous sûr de vouloir modifier les restrictions de visibilité sélectionnées pour le ou les utilisateurs sélectionnés ?" -#: cps/admin.py:641 +#: cps/admin.py:644 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Êtes-vous sûr de vouloir modifier le comportement de synchronisation des étagères pour le ou les utilisateurs sélectionnés ?" -#: cps/admin.py:643 +#: cps/admin.py:646 msgid "Are you sure you want to change Calibre library location?" msgstr "Êtes-vous sûr de vouloir modifier l'emplacement de la bibliothèque Calibre ?" -#: cps/admin.py:645 +#: cps/admin.py:648 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "Calibre-Web va rechercher des mises à jour de couvertures et mettre à jour les vignettes de couverture, cela peut prendre du temps." -#: cps/admin.py:648 +#: cps/admin.py:651 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Êtes-vous sûr de vouloir supprimer la base de données de synchronisation de Calibre-Web pour forcer une synchronisation complète avec votre liseuse Kobo ?" -#: cps/admin.py:891 cps/admin.py:897 cps/admin.py:907 cps/admin.py:917 +#: cps/admin.py:894 cps/admin.py:900 cps/admin.py:910 cps/admin.py:920 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Refuser" -#: cps/admin.py:893 cps/admin.py:899 cps/admin.py:909 cps/admin.py:919 +#: cps/admin.py:896 cps/admin.py:902 cps/admin.py:912 cps/admin.py:922 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Autoriser" -#: cps/admin.py:952 +#: cps/admin.py:955 #, python-brace-format msgid "{} sync entries deleted" msgstr "{} Entrées de synchronisation supprimées" -#: cps/admin.py:993 +#: cps/admin.py:996 msgid "Tag not found" msgstr "Étiquette introuvable" -#: cps/admin.py:1011 +#: cps/admin.py:1014 msgid "Invalid Action" msgstr "Action invalide" -#: cps/admin.py:1138 +#: cps/admin.py:1137 +#, python-format +msgid "Invalid reverse proxy trusted IP/CIDR entry: %(entry)s" +msgstr "" + +#: cps/admin.py:1148 +#, python-format +msgid "Invalid %(label)s: %(value)s" +msgstr "" + +#: cps/admin.py:1166 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json n'est pas configuré pour l'application Web" -#: cps/admin.py:1183 +#: cps/admin.py:1211 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "L'emplacement du fichier logfile est incorrect, veuillez saisir un chemin valide" -#: cps/admin.py:1189 +#: cps/admin.py:1217 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "L'emplacement du fichier Access Logfile est incorrect, veuillez saisir un chemin valide" -#: cps/admin.py:1223 +#: cps/admin.py:1251 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Veuillez saisir un fournisseur LDAP, Port, DN et l'identifiant objet de l'utilisateur" -#: cps/admin.py:1229 +#: cps/admin.py:1257 msgid "Please Enter a LDAP Service Account and Password" msgstr "Veuillez saisir un compte de service LDAP et un mot de passe." -#: cps/admin.py:1232 +#: cps/admin.py:1260 msgid "Please Enter a LDAP Service Account" msgstr "Veuillez entrer un compte de service LDAP" -#: cps/admin.py:1237 +#: cps/admin.py:1265 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "Le filtre objet du groupe LDAP a besoin d'un identifiant de format \"%s\"" -#: cps/admin.py:1239 +#: cps/admin.py:1267 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "Le filtre objet du groupe LDAP a une parenthèse non gérée" -#: cps/admin.py:1243 +#: cps/admin.py:1271 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "Le filtre objet de l'utilisateur LDAP a besoin d'un identifiant de format \"%s\"" -#: cps/admin.py:1245 +#: cps/admin.py:1273 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "Le filtre objet de l'utilisateur LDAP a une parenthèse non gérée" -#: cps/admin.py:1252 +#: cps/admin.py:1280 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "Le filtre utilisateur des membres LDAP doit avoir un identificateur de format \"%s\\ »" -#: cps/admin.py:1254 +#: cps/admin.py:1282 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "Le filtre utilisateur de membre LDAP a des parenthèses non appariées" -#: cps/admin.py:1261 +#: cps/admin.py:1289 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP CACertificat, certificat ou emplacement de clé non valide, veuillez entrer le chemin correct" -#: cps/admin.py:1292 cps/templates/admin.html:53 +#: cps/admin.py:1320 cps/templates/admin.html:53 msgid "Add New User" msgstr "Ajouter un nouvel utilisateur" -#: cps/admin.py:1301 cps/templates/admin.html:100 +#: cps/admin.py:1329 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Modifier les paramètres du serveur de courriels" -#: cps/admin.py:1320 +#: cps/admin.py:1348 msgid "Success! Gmail Account Verified." msgstr "Succès ! Compte Gmail vérifié." -#: cps/admin.py:1340 cps/admin.py:1343 cps/admin.py:1728 cps/admin.py:1887 -#: cps/admin.py:1985 cps/admin.py:2106 cps/editbooks.py:169 -#: cps/editbooks.py:755 cps/editbooks.py:1474 cps/shelf.py:90 cps/shelf.py:144 +#: cps/admin.py:1368 cps/admin.py:1371 cps/admin.py:1756 cps/admin.py:1965 +#: cps/admin.py:2063 cps/admin.py:2184 cps/editbooks.py:170 +#: cps/editbooks.py:772 cps/editbooks.py:1518 cps/shelf.py:90 cps/shelf.py:144 #: cps/shelf.py:194 cps/shelf.py:237 cps/shelf.py:287 cps/shelf.py:327 -#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:160 cps/web.py:1526 +#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:161 cps/web.py:1536 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Oups ! Erreur de la base de données: %(error)s." -#: cps/admin.py:1350 +#: cps/admin.py:1378 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Teste les courriels en file d’attente pour l’envoi à %(email)s, veuillez vérifier le résultat des tâches" -#: cps/admin.py:1353 +#: cps/admin.py:1381 #, 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:1355 +#: cps/admin.py:1383 msgid "Please configure your e-mail address first..." msgstr "Veuillez d'abord configurer votre adresse de courriel..." -#: cps/admin.py:1357 +#: cps/admin.py:1385 msgid "Email Server Settings updated" msgstr "Les paramètres du serveur de courriels ont été mis à jour" -#: cps/admin.py:1380 cps/templates/admin.html:195 +#: cps/admin.py:1408 cps/templates/admin.html:211 msgid "Edit Scheduled Tasks Settings" msgstr "Modifier les paramètres des tâches planifiées" -#: cps/admin.py:1392 +#: cps/admin.py:1420 msgid "Invalid start time for task specified" msgstr "Heure de début non valide pour la tâche spécifiée" -#: cps/admin.py:1397 +#: cps/admin.py:1425 msgid "Invalid duration for task specified" msgstr "Durée invalide pour la tâche spécifiée" -#: cps/admin.py:1407 +#: cps/admin.py:1435 msgid "Scheduled tasks settings updated" msgstr "Durée non valide pour la tâche spécifiée" -#: cps/admin.py:1417 cps/admin.py:1466 cps/admin.py:2102 cps/web.py:1325 +#: cps/admin.py:1445 cps/admin.py:1494 cps/admin.py:2180 cps/web.py:1335 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Oups ! Une erreur inconnue est survenue. Veuillez réessayer plus tard." -#: cps/admin.py:1421 +#: cps/admin.py:1449 msgid "Settings DB is not Writeable" msgstr "La base de données des paramètres n'est pas accessible en écriture." -#: cps/admin.py:1451 cps/admin.py:2094 +#: cps/admin.py:1479 cps/admin.py:2172 #, python-format msgid "Edit User %(nick)s" msgstr "Éditer l'utilisateur %(nick)s" -#: cps/admin.py:1463 +#: cps/admin.py:1491 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "Succès ! Mot de passe de l'utilisateur %(user)s réinitialisé." -#: cps/admin.py:1469 +#: cps/admin.py:1497 msgid "Oops! Please configure the SMTP mail settings." msgstr "Oups ! Veuillez configurer les paramètres de messagerie SMTP." -#: cps/admin.py:1480 +#: cps/admin.py:1508 msgid "Logfile viewer" msgstr "Visualiseur de fichier journal" -#: cps/admin.py:1546 +#: cps/admin.py:1574 msgid "Requesting update package" msgstr "Demande de mise à jour" -#: cps/admin.py:1547 +#: cps/admin.py:1575 msgid "Downloading update package" msgstr "Téléchargement de la mise à jour" -#: cps/admin.py:1548 +#: cps/admin.py:1576 msgid "Unzipping update package" msgstr "Décompression de la mise à jour" -#: cps/admin.py:1549 +#: cps/admin.py:1577 msgid "Replacing files" msgstr "Remplacement des fichiers" -#: cps/admin.py:1550 +#: cps/admin.py:1578 msgid "Database connections are closed" msgstr "Les connexions à la base de données ont été fermées" -#: cps/admin.py:1551 +#: cps/admin.py:1579 msgid "Stopping server" msgstr "Arrêt du serveur" -#: cps/admin.py:1552 +#: cps/admin.py:1580 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:1553 cps/admin.py:1554 cps/admin.py:1555 cps/admin.py:1556 -#: cps/admin.py:1557 cps/admin.py:1558 +#: cps/admin.py:1581 cps/admin.py:1582 cps/admin.py:1583 cps/admin.py:1584 +#: cps/admin.py:1585 cps/admin.py:1586 msgid "Update failed:" msgstr "La mise à jour a échoué :" -#: cps/admin.py:1553 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1581 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "Erreur HTTP" -#: cps/admin.py:1554 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1582 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Erreur de connexion" -#: cps/admin.py:1555 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1583 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Délai d'attente dépassé lors de l'établissement de la connexion." -#: cps/admin.py:1556 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1584 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Erreur générale" -#: cps/admin.py:1557 +#: cps/admin.py:1585 msgid "Update file could not be saved in temp dir" msgstr "Le fichier de mise à jour n'a pas pu être enregistré dans le répertoire temporaire." -#: cps/admin.py:1558 +#: cps/admin.py:1586 msgid "Files could not be replaced during update" msgstr "Les fichiers n’ont pas pu être remplacés pendant la mise à jour" -#: cps/admin.py:1582 +#: cps/admin.py:1610 msgid "Failed to extract at least One LDAP User" msgstr "Échec de l'extraction d'au moins un utilisateur LDAP" -#: cps/admin.py:1627 +#: cps/admin.py:1655 msgid "Failed to Create at Least One LDAP User" msgstr "Impossible de créer au moins un utilisateur LDAP" -#: cps/admin.py:1640 +#: cps/admin.py:1668 #, python-format msgid "Error: %(ldaperror)s" msgstr "Erreur : %(ldaperror)s" -#: cps/admin.py:1644 +#: cps/admin.py:1672 msgid "Error: No user returned in response of LDAP server" msgstr "Erreur : Aucun utilisateur renvoyé dans la réponse LDAP du serveur" -#: cps/admin.py:1680 +#: cps/admin.py:1708 msgid "At Least One LDAP User Not Found in Database" msgstr "Au moins un utilisateur LDAP n'a pas été trouvé dans la base de données" -#: cps/admin.py:1682 +#: cps/admin.py:1710 #, python-brace-format msgid "{} User Successfully Imported" msgstr "{} Utilisateur importé avec succès" -#: cps/admin.py:1740 +#: cps/admin.py:1768 msgid "Books path not valid" msgstr "Chemin d'accès aux livres non valide" -#: cps/admin.py:1746 +#: cps/admin.py:1774 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "L'emplacement de la base de données est incorrect, veuillez saisir un chemin valide" -#: cps/admin.py:1774 +#: cps/admin.py:1802 msgid "DB is not Writeable" msgstr "La base de données n'est pas accessible en écriture" -#: cps/admin.py:1788 +#: cps/admin.py:1816 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "L'emplacement du fichier Keyfile est incorrect, veuillez saisir un chemin valide" -#: cps/admin.py:1792 +#: cps/admin.py:1820 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "L'emplacement du fichier Certfile est incorrect, veuillez saisir un chemin valide" -#: cps/admin.py:1872 +#: cps/admin.py:1846 +msgid "Kepubify binary not found" +msgstr "" + +#: cps/admin.py:1894 +msgid "reverse proxy login header name" +msgstr "" + +#: cps/admin.py:1904 +msgid "reverse proxy shared secret header name" +msgstr "" + +#: cps/admin.py:1913 +msgid "Please configure both reverse proxy shared secret header name and secret" +msgstr "" + +#: cps/admin.py:1917 +msgid "Please configure reverse proxy shared secret header name and secret or disable the feature" +msgstr "" + +#: cps/admin.py:1922 +msgid "Please configure at least one trusted reverse proxy IP or CIDR" +msgstr "" + +#: cps/admin.py:1946 msgid "Password length has to be between 1 and 40" msgstr "La longueur du mot de passe doit être comprise entre 1 et 40 caractères." -#: cps/admin.py:1926 +#: cps/admin.py:1957 cps/helper.py:1007 +msgid "Please specify a valid UnRar directory" +msgstr "" + +#: cps/admin.py:2004 msgid "Database Settings updated" msgstr "Paramètres de la base de données mis à jour" -#: cps/admin.py:1934 +#: cps/admin.py:2012 msgid "Database Configuration" msgstr "Configuration de la base de données" -#: cps/admin.py:1949 cps/web.py:1295 +#: cps/admin.py:2027 cps/web.py:1305 msgid "Oops! Please complete all fields." msgstr "Oups ! Veuillez compléter tous les champs !" -#: cps/admin.py:1958 +#: cps/admin.py:2036 msgid "E-mail is not from valid domain" msgstr "Cette adresse de courriel n’appartient pas à un domaine valide" -#: cps/admin.py:1964 +#: cps/admin.py:2042 msgid "Add new user" msgstr "Ajouter un nouvel utilisateur" -#: cps/admin.py:1975 +#: cps/admin.py:2053 #, python-format msgid "User '%(user)s' created" msgstr "Utilisateur '%(user)s' créé" -#: cps/admin.py:1981 +#: cps/admin.py:2059 msgid "Oops! An account already exists for this Email. or name." msgstr "Oups ! Un compte existe déjà pour cette adresse e-mail ou ce nom." -#: cps/admin.py:2011 +#: cps/admin.py:2089 #, python-format msgid "User '%(nick)s' deleted" msgstr "Utilisateur '%(nick)s' supprimé" -#: cps/admin.py:2014 +#: cps/admin.py:2092 msgid "Can't delete Guest User" msgstr "Impossible de supprimer l’utilisateur Invité" -#: cps/admin.py:2017 +#: cps/admin.py:2095 msgid "No admin user remaining, can't delete user" msgstr "Aucun utilisateur admin restant, impossible de supprimer l’utilisateur" -#: cps/admin.py:2072 cps/web.py:1475 +#: cps/admin.py:2150 cps/web.py:1485 msgid "Email can't be empty and has to be a valid Email" msgstr "L'adresse e-mail ne peut pas être vide et doit être valide." -#: cps/admin.py:2098 +#: cps/admin.py:2176 #, python-format msgid "User '%(nick)s' updated" msgstr "Utilisateur '%(nick)s' mis à jour" @@ -537,145 +576,153 @@ msgstr "Utilisateur '%(nick)s' mis à jour" msgid "Search" msgstr "Chercher" -#: cps/converter.py:31 +#: cps/converter.py:32 msgid "not installed" msgstr "non installé" -#: cps/converter.py:32 +#: cps/converter.py:33 msgid "Execution permissions missing" msgstr "Permissions d'exécution manquantes" -#: cps/db.py:1129 cps/templates/config_edit.html:207 +#: cps/db.py:1129 cps/templates/config_edit.html:229 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:565 cps/web.py:599 cps/web.py:644 cps/web.py:684 cps/web.py:711 -#: cps/web.py:998 cps/web.py:1028 cps/web.py:1073 cps/web.py:1101 -#: cps/web.py:1140 +#: cps/web.py:567 cps/web.py:601 cps/web.py:646 cps/web.py:686 cps/web.py:713 +#: cps/web.py:1000 cps/web.py:1030 cps/web.py:1075 cps/web.py:1103 +#: cps/web.py:1142 msgid "None" msgstr "Aucun" -#: cps/editbooks.py:155 +#: cps/editbooks.py:156 #, python-format msgid "File %(file)s uploaded" msgstr "Le fichier %(file)s a été téléverser" -#: cps/editbooks.py:184 +#: cps/editbooks.py:185 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:192 +#: cps/editbooks.py:189 cps/editbooks.py:197 +msgid "Source format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:201 +msgid "Destination format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:209 #, 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:196 +#: cps/editbooks.py:213 #, 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/editbooks.py:297 +#: cps/editbooks.py:314 msgid "Changes successfully applied" msgstr "Modifications appliquées avec succès" -#: cps/editbooks.py:317 +#: cps/editbooks.py:334 msgid "Value is missing on request" msgstr "La valeur est manquante sur demande." -#: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 -#: cps/editbooks.py:1146 cps/web.py:532 cps/web.py:1567 cps/web.py:1613 -#: cps/web.py:1663 +#: cps/editbooks.py:336 cps/editbooks.py:343 cps/editbooks.py:644 +#: cps/editbooks.py:1170 cps/web.py:534 cps/web.py:1577 cps/web.py:1623 +#: cps/web.py:1673 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Oups ! Le livre sélectionné n'est pas disponible. Le fichier n'existe pas ou n'est pas accessible" -#: cps/editbooks.py:673 cps/editbooks.py:1503 +#: cps/editbooks.py:690 cps/editbooks.py:1547 msgid "User has no rights to upload cover" msgstr "L'utilisateur n'a pas le droit de téléverser de couverture" -#: cps/editbooks.py:694 cps/editbooks.py:938 +#: cps/editbooks.py:711 cps/editbooks.py:961 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "Les identificateurs ne sont pas sensibles à la casse, écrasant l’ancien identificateur" -#: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 +#: cps/editbooks.py:726 cps/editbooks.py:935 cps/editbooks.py:1306 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "'%(langname)s' n'est pas une langue valide" -#: cps/editbooks.py:737 +#: cps/editbooks.py:754 msgid "Metadata successfully updated" msgstr "Les métadonnées ont bien été mises à jour" -#: cps/editbooks.py:760 +#: cps/editbooks.py:777 #, python-brace-format msgid "Error editing book: {}" msgstr "Erreur lors de la modification du livre : {}" -#: cps/editbooks.py:856 +#: cps/editbooks.py:879 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "Le fichier téléversé existe probablement dans la librairie, veuillez le modifier avant de le téléverser de nouveau: " -#: cps/editbooks.py:950 cps/editbooks.py:1420 +#: cps/editbooks.py:973 cps/editbooks.py:1464 msgid "File type isn't allowed to be uploaded to this server" msgstr "Le type de fichier n'est pas autorisé à être téléversé sur ce serveur." -#: cps/editbooks.py:956 cps/editbooks.py:1431 +#: cps/editbooks.py:979 cps/editbooks.py:1475 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "L’extension de fichier '%(ext)s' n’est pas autorisée à être téléversée sur ce serveur" -#: cps/editbooks.py:960 cps/editbooks.py:1436 +#: cps/editbooks.py:983 cps/editbooks.py:1480 msgid "File to be uploaded must have an extension" msgstr "Le ficher doit avoir une extension pour être téléversé" -#: cps/editbooks.py:968 +#: cps/editbooks.py:992 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "Le fichier %(filename)s ne peut pas être sauvegardé dans le répertoire temporaire" -#: cps/editbooks.py:988 +#: cps/editbooks.py:1012 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Impossible de déplacer le fichier de couverture %(file)s: %(error)s" -#: cps/editbooks.py:1041 +#: cps/editbooks.py:1065 msgid "Book Format Successfully Deleted" msgstr "Le format de livre a été supprimé avec succès" -#: cps/editbooks.py:1044 cps/editbooks.py:1061 +#: cps/editbooks.py:1068 cps/editbooks.py:1085 msgid "Book Successfully Deleted" msgstr "Le livre a été supprimé avec succès" -#: cps/editbooks.py:1065 +#: cps/editbooks.py:1089 msgid "You are missing permissions to delete books" msgstr "Vous n’avez par les permissions pour supprimer les livres" -#: cps/editbooks.py:1139 +#: cps/editbooks.py:1163 #, python-brace-format msgid "Book with id \"{}\" could not be deleted: not found" msgstr "Le livre avec l'id \"{}\" n'a pas pu être supprimé: non trouvé" -#: cps/editbooks.py:1181 +#: cps/editbooks.py:1205 msgid "edit metadata" msgstr "modifier les métadonnées" -#: cps/editbooks.py:1234 +#: cps/editbooks.py:1267 #, python-format msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "Seriesindex : %(seriesindex)s n'est pas un nombre valide, ignoré" -#: cps/editbooks.py:1425 +#: cps/editbooks.py:1469 msgid "User has no rights to upload additional file formats" msgstr "L'utilisateur n'a pas le droit de téléverser d'autres formats de fichiers." -#: cps/editbooks.py:1449 +#: cps/editbooks.py:1493 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Impossible de créer le chemin %(path)s (Permission refusée)." -#: cps/editbooks.py:1456 +#: cps/editbooks.py:1500 #, python-format msgid "Failed to store file %(file)s." msgstr "Échec de la sauvegarde du fichier %(file)s." -#: cps/editbooks.py:1481 +#: cps/editbooks.py:1525 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Le format de fichier %(ext)s a été ajouté à %(book)s" @@ -686,9 +733,9 @@ msgstr "Veuillez patienter une minute pour enregistrer le prochain utilisateur." #: cps/error_handler.py:108 cps/templates/layout.html:69 #: cps/templates/layout.html:104 cps/templates/login.html:27 -#: cps/templates/register.html:17 cps/web.py:1292 cps/web.py:1296 -#: cps/web.py:1302 cps/web.py:1326 cps/web.py:1330 cps/web.py:1343 -#: cps/web.py:1346 +#: cps/templates/register.html:17 cps/web.py:1302 cps/web.py:1306 +#: cps/web.py:1312 cps/web.py:1336 cps/web.py:1340 cps/web.py:1353 +#: cps/web.py:1356 msgid "Register" msgstr "Créer un compte" @@ -709,7 +756,7 @@ msgstr "Le domaine de retour d’appel (Callback domain) est non vérifié, veui msgid "%(format)s format not found for book id: %(book)d" msgstr "le format %(format)s est introuvable pour le livre : %(book)d" -#: cps/helper.py:94 cps/tasks/convert.py:91 +#: cps/helper.py:94 cps/tasks/convert.py:92 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "le %(format)s est introuvable sur Google Drive : %(fn)s" @@ -895,10 +942,6 @@ msgstr "Seuls les fichiers jpg/jpeg sont supportés comme fichier de couverture" msgid "Cover" msgstr "Couverture" -#: cps/helper.py:1006 -msgid "UnRar binary file not found" -msgstr "Fichier binaire UnRar non trouvé" - #: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "Erreur lors de l'exécution de UnRar" @@ -929,7 +972,7 @@ msgstr "Autorisations d'exécution manquantes : %(missing)s" msgid "Error executing Calibre" msgstr "Erreur lors de l'exécution de Calibre" -#: cps/helper.py:1154 cps/templates/admin.html:216 +#: cps/helper.py:1154 cps/templates/admin.html:232 msgid "Queue all books for metadata backup" msgstr "Mettre tous les livres en file d'attente pour la sauvegarde des métadonnées" @@ -951,7 +994,7 @@ msgstr "Créer un compte avec %(provider)s" msgid "This %(oauth)s account is already linked to a different user" msgstr "" -#: cps/oauth_bb.py:147 cps/remotelogin.py:131 +#: cps/oauth_bb.py:147 cps/remotelogin.py:150 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "Succès ! Vous êtes maintenant connecté comme : '%(nickname)s'" @@ -1019,25 +1062,29 @@ msgstr "Erreur Oauth Google : {}" msgid "{} Stars" msgstr "{} Étoiles" -#: cps/remotelogin.py:63 cps/templates/layout.html:68 -#: cps/templates/layout.html:103 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1361 -msgid "Login" -msgstr "Connexion" - -#: cps/remotelogin.py:75 cps/remotelogin.py:109 +#: cps/remotelogin.py:46 cps/remotelogin.py:128 msgid "Token not found" msgstr "Jeton non trouvé" -#: cps/remotelogin.py:84 cps/remotelogin.py:117 +#: cps/remotelogin.py:55 cps/remotelogin.py:136 msgid "Token has expired" msgstr "Jeton expiré" -#: cps/remotelogin.py:93 +#: cps/remotelogin.py:86 cps/remotelogin.py:112 cps/templates/layout.html:68 +#: cps/templates/layout.html:103 cps/templates/login.html:4 +#: cps/templates/login.html:21 cps/web.py:1371 +msgid "Login" +msgstr "Connexion" + +#: cps/remotelogin.py:100 +msgid "Token already approved" +msgstr "" + +#: cps/remotelogin.py:108 msgid "Success! Please return to your device" msgstr "Succès ! Veuillez revenir à votre appareil." -#: cps/render_template.py:41 cps/web.py:421 +#: cps/render_template.py:41 cps/web.py:423 msgid "Books" msgstr "Livres" @@ -1062,7 +1109,7 @@ msgstr "Livres téléchargés" msgid "Show Downloaded Books" msgstr "Afficher les livres téléchargés" -#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:436 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:438 msgid "Top Rated Books" msgstr "Livres les mieux notés" @@ -1071,7 +1118,7 @@ msgid "Show Top Rated Books" msgstr "Afficher les livres les mieux notés" #: cps/render_template.py:61 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:769 +#: cps/templates/index.xml:67 cps/web.py:771 msgid "Read Books" msgstr "Livres lus" @@ -1080,7 +1127,7 @@ msgid "Show Read and Unread" msgstr "Afficher les éléments lus et non lus" #: cps/render_template.py:65 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:772 +#: cps/templates/index.xml:74 cps/web.py:774 msgid "Unread Books" msgstr "Livres non-lus" @@ -1098,7 +1145,7 @@ msgid "Show Random Books" msgstr "Afficher des livres au hasard" #: cps/render_template.py:71 cps/templates/book_table.html:93 -#: cps/templates/index.xml:97 cps/web.py:1144 +#: cps/templates/index.xml:97 cps/web.py:1146 msgid "Categories" msgstr "Catégories" @@ -1108,7 +1155,7 @@ msgstr "Afficher la section Catégorie" #: cps/render_template.py:74 cps/templates/book_edit.html:86 #: cps/templates/book_table.html:94 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1034 cps/web.py:1046 +#: cps/templates/search_form.html:70 cps/web.py:1036 cps/web.py:1048 msgid "Series" msgstr "Séries" @@ -1126,7 +1173,7 @@ msgid "Show Author Section" msgstr "Afficher la Section Auteur" #: cps/render_template.py:81 cps/templates/book_table.html:98 -#: cps/templates/index.xml:88 cps/web.py:1002 +#: cps/templates/index.xml:88 cps/web.py:1004 msgid "Publishers" msgstr "Éditeurs" @@ -1136,7 +1183,7 @@ msgstr "Afficher la Section Editeur" #: cps/render_template.py:84 cps/templates/book_table.html:96 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1116 +#: cps/web.py:1118 msgid "Languages" msgstr "Langues" @@ -1160,7 +1207,7 @@ msgstr "Formats de fichier" msgid "Show File Formats Section" msgstr "Afficher la section du format des fichiers" -#: cps/render_template.py:95 cps/web.py:795 +#: cps/render_template.py:95 cps/web.py:797 msgid "Archived Books" msgstr "Livres archivés" @@ -1168,7 +1215,7 @@ msgstr "Livres archivés" msgid "Show Archived Books" msgstr "Afficher livres archivés" -#: cps/render_template.py:100 cps/web.py:831 +#: cps/render_template.py:100 cps/web.py:833 msgid "Books List" msgstr "Liste des livres" @@ -1401,150 +1448,154 @@ msgstr "Une nouvelle mise à jour est disponible. Cliquez sur le bouton ci-desso msgid "No release information available" msgstr "Aucune information concernant cette version n’est disponible" -#: cps/templates/index.html:6 cps/web.py:448 +#: cps/templates/index.html:6 cps/web.py:450 msgid "Discover (Random Books)" msgstr "Découvrir (Livres au hasard)" -#: cps/web.py:484 +#: cps/web.py:486 msgid "Hot Books (Most Downloaded)" msgstr "Livres populaires (les plus téléchargés)" -#: cps/web.py:515 +#: cps/web.py:517 #, python-format msgid "Downloaded books by %(user)s" msgstr "Livres téléchargés par %(user)s" -#: cps/web.py:548 +#: cps/web.py:550 #, python-format msgid "Author: %(name)s" msgstr "Auteur : %(name)s" -#: cps/web.py:584 +#: cps/web.py:586 #, python-format msgid "Publisher: %(name)s" msgstr "Éditeur : '%(name)s'" -#: cps/web.py:612 +#: cps/web.py:614 #, python-format msgid "Series: %(serie)s" msgstr "Séries : %(serie)s" -#: cps/web.py:626 +#: cps/web.py:628 msgid "Rating: None" msgstr "Évaluation: Aucune" -#: cps/web.py:635 +#: cps/web.py:637 #, python-format msgid "Rating: %(rating)s stars" msgstr "Évaluation : %(rating)s étoiles" -#: cps/web.py:666 +#: cps/web.py:668 #, python-format msgid "File format: %(format)s" msgstr "Format de fichier : %(format)s" -#: cps/web.py:701 +#: cps/web.py:703 #, python-format msgid "Category: %(name)s" msgstr "Catégorie : %(name)s" -#: cps/web.py:730 +#: cps/web.py:732 #, python-format msgid "Language: %(name)s" msgstr "Langue : %(name)s" -#: cps/templates/admin.html:16 cps/web.py:974 +#: cps/templates/admin.html:16 cps/web.py:976 msgid "Downloads" msgstr "Téléchargements" -#: cps/web.py:1076 +#: cps/web.py:1078 msgid "Ratings list" msgstr "Liste des évaluations" -#: cps/web.py:1103 +#: cps/web.py:1105 msgid "File formats list" msgstr "Liste de formats de fichiers" -#: cps/web.py:1264 +#: cps/web.py:1272 +msgid "Book format not supported" +msgstr "" + +#: cps/web.py:1274 msgid "Please configure the SMTP mail settings first..." msgstr "Veuillez d'abord configurer les paramètres de messagerie SMTP..." -#: cps/web.py:1270 +#: cps/web.py:1280 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Succès ! Le livre a été mis en file d'attente pour l'envoi vers %(eReadermail)s" -#: cps/web.py:1273 +#: cps/web.py:1283 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Oups ! Une erreur est survenue lors de l'envoi du livre : %(res)s" -#: cps/web.py:1275 +#: cps/web.py:1285 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Oups ! Veuillez mettre à jour votre profil avec une adresse e-mail valide pour votre liseuse." -#: cps/web.py:1291 cps/web.py:1342 +#: cps/web.py:1301 cps/web.py:1352 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "Oups ! Le serveur de courriel n'est pas configuré, veuillez contacter votre administrateur!" -#: cps/web.py:1328 +#: cps/web.py:1338 msgid "Oops! Your Email is not allowed." msgstr "Oups ! Votre adresse de courriel n’est pas autorisé pour une inscription" -#: cps/web.py:1331 +#: cps/web.py:1341 msgid "Success! Confirmation Email has been sent." msgstr "Succès ! Le courriel de confirmation a été envoyé à votre adresse." -#: cps/web.py:1376 cps/web.py:1390 +#: cps/web.py:1386 cps/web.py:1400 msgid "Cannot activate LDAP authentication" msgstr "Impossible d'activer l'authentification LDAP" -#: cps/web.py:1399 +#: cps/web.py:1409 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "vous êtes maintenant connecté sous le nom: '%(nickname)s'" -#: cps/web.py:1406 +#: cps/web.py:1416 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Connexion de secours en tant que : '%(nickname)s', serveur LDAP inaccessible ou utilisateur inconnu" -#: cps/web.py:1411 +#: cps/web.py:1421 #, python-format msgid "Could not login: %(message)s" msgstr "Impossible de se connecter : %(message)s" -#: cps/web.py:1415 cps/web.py:1440 +#: cps/web.py:1425 cps/web.py:1450 msgid "Wrong Username or Password" msgstr "Nom d'utilisateur ou mot de passe incorrect" -#: cps/web.py:1422 +#: cps/web.py:1432 msgid "New Password was sent to your email address" msgstr "Un nouveau mot de passe a été envoyé à votre adresse e-mail." -#: cps/web.py:1426 +#: cps/web.py:1436 msgid "An unknown error occurred. Please try again later." msgstr "Une erreur inconnue s'est produite. Veuillez réessayer plus tard." -#: cps/web.py:1428 +#: cps/web.py:1438 msgid "Please enter valid username to reset password" msgstr "Veuillez saisir un nom d'utilisateur valide pour réinitialiser votre mot de passe." -#: cps/web.py:1436 +#: cps/web.py:1446 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Vous êtes maintenant connecté sous le nom : '%(nickname)s'" -#: cps/web.py:1501 cps/web.py:1551 +#: cps/web.py:1511 cps/web.py:1561 #, python-format msgid "%(name)s's Profile" msgstr "Profil de %(name)s" -#: cps/web.py:1517 +#: cps/web.py:1527 msgid "Success! Profile Updated" msgstr "Succès ! Profil mis à jour." -#: cps/web.py:1521 +#: cps/web.py:1531 msgid "Oops! An account already exists for this Email." msgstr "Oups ! Un compte existe déjà pour cette adresse e-mail." @@ -1556,46 +1607,46 @@ msgstr "Aucun fichier gmail.json avec information OAuth valide trouvé" msgid "Delete temp folder contents" msgstr "Supprimer le contenu du dossier temporaire" -#: cps/tasks/convert.py:112 +#: cps/tasks/convert.py:113 #, python-format msgid "%(book)s send to E-Reader" msgstr "%(book)s envoyer à la liseuse" -#: cps/tasks/convert.py:177 +#: cps/tasks/convert.py:180 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "ebook-convert calibre %(tool)s non trouvé" -#: cps/tasks/convert.py:211 +#: cps/tasks/convert.py:214 #, python-format msgid "%(format)s format not found on disk" msgstr "Format %(format)s non trouvé sur le disque" -#: cps/tasks/convert.py:215 +#: cps/tasks/convert.py:218 msgid "Ebook converter failed with unknown error" msgstr "Le convertisseur Ebook a échoué avec une erreur inconnue" -#: cps/tasks/convert.py:234 +#: cps/tasks/convert.py:237 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "La commande Kepubify-converter a échouée : %(error)s" -#: cps/tasks/convert.py:254 +#: cps/tasks/convert.py:257 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Fichier converti non trouvé ou plus d'un fichier dans le chemin %(folder)s" -#: cps/tasks/convert.py:291 cps/tasks/convert.py:342 +#: cps/tasks/convert.py:294 cps/tasks/convert.py:345 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre a échoué avec l’erreur : %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:322 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "La commande ebook-convert a échouée : %(error)s" -#: cps/tasks/convert.py:347 +#: cps/tasks/convert.py:350 msgid "Convert" msgstr "Convertir" @@ -1681,7 +1732,7 @@ msgstr "Éditer" #: cps/templates/admin.html:25 cps/templates/book_edit.html:17 #: cps/templates/book_table.html:131 cps/templates/book_table.html:180 -#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:115 +#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:117 #: cps/templates/user_edit.html:67 cps/templates/user_table.html:149 msgid "Delete" msgstr "Supprimer" @@ -1771,128 +1822,145 @@ msgstr "Connexion à distance Magic Link" msgid "Reverse Proxy Login" msgstr "Compte du Reverse Proxy" -#: cps/templates/admin.html:154 cps/templates/config_edit.html:176 +#: cps/templates/admin.html:154 cps/templates/config_edit.html:180 msgid "Reverse Proxy Header Name" msgstr "Nom de l'en-tête du Reverse Proxy" -#: cps/templates/admin.html:159 +#: cps/templates/admin.html:158 +msgid "Reverse Proxy Trusted IPs/CIDRs" +msgstr "" + +#: cps/templates/admin.html:162 cps/templates/config_edit.html:193 +msgid "Reverse Proxy Shared Secret Header Name" +msgstr "" + +#: cps/templates/admin.html:166 +msgid "Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/admin.html:170 +msgid "Reverse Proxy Shared Secret Configured" +msgstr "" + +#: cps/templates/admin.html:175 msgid "Edit Calibre Database Configuration" msgstr "Modifier la configuration de la base de données Calibre" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:176 msgid "Edit Basic Configuration" msgstr "Éditer la configuration principale" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:177 msgid "Edit UI Configuration" msgstr "Éditer la configuration de l’interface utilisateur" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:183 msgid "Scheduled Tasks" msgstr "Tâches planifiées" -#: cps/templates/admin.html:170 cps/templates/schedule_edit.html:12 +#: cps/templates/admin.html:186 cps/templates/schedule_edit.html:12 #: cps/templates/tasks.html:18 msgid "Start Time" msgstr "Heure de début" -#: cps/templates/admin.html:174 cps/templates/schedule_edit.html:20 +#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:20 msgid "Maximum Duration" msgstr "Durée maximale" -#: cps/templates/admin.html:178 cps/templates/schedule_edit.html:29 +#: cps/templates/admin.html:194 cps/templates/schedule_edit.html:29 msgid "Generate Thumbnails" msgstr "Générer des vignettes" -#: cps/templates/admin.html:182 +#: cps/templates/admin.html:198 msgid "Generate series cover thumbnails" msgstr "Générer des vignettes de couverture de série" -#: cps/templates/admin.html:186 cps/templates/admin.html:208 +#: cps/templates/admin.html:202 cps/templates/admin.html:224 #: cps/templates/schedule_edit.html:37 msgid "Reconnect Calibre Database" msgstr "Reconnecter la base de données Calibre" -#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 +#: cps/templates/admin.html:206 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" msgstr "Générer des fichiers de sauvegarde des métadonnées" -#: cps/templates/admin.html:197 +#: cps/templates/admin.html:213 msgid "Refresh Thumbnail Cache" msgstr "Actualiser le cache des vignettes" -#: cps/templates/admin.html:203 +#: cps/templates/admin.html:219 msgid "Administration" msgstr "Administration" -#: cps/templates/admin.html:204 +#: cps/templates/admin.html:220 msgid "Download Debug Package" msgstr "Télécharger le package de débogage" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:221 msgid "View Logs" msgstr "Afficher les fichiers journaux" -#: cps/templates/admin.html:211 +#: cps/templates/admin.html:227 msgid "Restart" msgstr "Redémarrer Calibre-Web" -#: cps/templates/admin.html:212 +#: cps/templates/admin.html:228 msgid "Shutdown" msgstr "Arrêter Calibre-Web" -#: cps/templates/admin.html:221 +#: cps/templates/admin.html:237 msgid "Version Information" msgstr "Informations sur la version" -#: cps/templates/admin.html:225 +#: cps/templates/admin.html:241 msgid "Version" msgstr "Version" -#: cps/templates/admin.html:226 +#: cps/templates/admin.html:242 msgid "Details" msgstr "Détails" -#: cps/templates/admin.html:232 +#: cps/templates/admin.html:248 msgid "Current Version" msgstr "Version actuelle" -#: cps/templates/admin.html:239 +#: cps/templates/admin.html:255 msgid "Check for Update" msgstr "Rechercher les mises à jour" -#: cps/templates/admin.html:240 +#: cps/templates/admin.html:256 msgid "Perform Update" msgstr "Effectuer la mise à jour" -#: cps/templates/admin.html:253 +#: cps/templates/admin.html:269 msgid "Are you sure you want to restart?" msgstr "Êtes-vous sûr de vouloir redémarrer Calibre-Web?" -#: cps/templates/admin.html:258 cps/templates/admin.html:272 -#: cps/templates/admin.html:292 cps/templates/config_db.html:82 +#: cps/templates/admin.html:274 cps/templates/admin.html:288 +#: cps/templates/admin.html:308 cps/templates/config_db.html:82 msgid "OK" msgstr "OK" -#: cps/templates/admin.html:259 cps/templates/admin.html:273 +#: cps/templates/admin.html:275 cps/templates/admin.html:289 #: cps/templates/book_edit.html:220 cps/templates/book_table.html:162 #: cps/templates/book_table.html:181 cps/templates/book_table.html:201 #: cps/templates/book_table.html:221 cps/templates/book_table.html:241 #: cps/templates/book_table.html:261 cps/templates/book_table.html:316 -#: cps/templates/config_db.html:66 cps/templates/config_edit.html:431 +#: cps/templates/config_db.html:66 cps/templates/config_edit.html:453 #: cps/templates/config_view_edit.html:175 cps/templates/detail.html:350 -#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:98 -#: cps/templates/modal_dialogs.html:116 cps/templates/modal_dialogs.html:134 +#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:100 +#: cps/templates/modal_dialogs.html:118 cps/templates/modal_dialogs.html:136 +#: cps/templates/remote_login_verify.html:16 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 #: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Annuler" -#: cps/templates/admin.html:271 +#: cps/templates/admin.html:287 msgid "Are you sure you want to shutdown?" msgstr "Êtes-vous sûr de vouloir arrêter Calibre-Web?" -#: cps/templates/admin.html:283 +#: cps/templates/admin.html:299 msgid "Updating, please do not reload this page" msgstr "Mise à jour en cours, ne pas rafraîchir la page" @@ -2133,7 +2201,7 @@ msgid "Fetch Metadata" msgstr "Obtenir les métadonnées" #: cps/templates/book_edit.html:219 cps/templates/config_db.html:65 -#: cps/templates/config_edit.html:430 cps/templates/config_view_edit.html:174 +#: cps/templates/config_edit.html:452 cps/templates/config_view_edit.html:174 #: cps/templates/email_edit.html:65 cps/templates/schedule_edit.html:44 #: cps/templates/shelf_edit.html:25 cps/templates/shelf_order.html:41 #: cps/templates/user_edit.html:142 @@ -2505,214 +2573,234 @@ msgstr "Clé de l'API Google Books" msgid "Allow Reverse Proxy Authentication" msgstr "Autoriser l'authentification Reverse Proxy" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:176 +msgid "Security Warning" +msgstr "" + +#: cps/templates/config_edit.html:177 +msgid "Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled." +msgstr "" + +#: cps/templates/config_edit.html:184 +msgid "Reverse Proxy Trusted IPs/CIDRs (Comma Separated)" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "Enable Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/config_edit.html:197 +msgid "Reverse Proxy Shared Secret" +msgstr "" + +#: cps/templates/config_edit.html:205 msgid "Login type" msgstr "Type de connexion" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:207 msgid "Use Standard Authentication" msgstr "Utiliser l’authentification standard" -#: cps/templates/config_edit.html:187 +#: cps/templates/config_edit.html:209 msgid "Use LDAP Authentication" msgstr "Utiliser l’authentification LDAP" -#: cps/templates/config_edit.html:190 +#: cps/templates/config_edit.html:212 msgid "Use OAuth" msgstr "Utiliser OAuth" -#: cps/templates/config_edit.html:197 +#: cps/templates/config_edit.html:219 msgid "LDAP Server Host Name or IP Address" msgstr "Nom d'hôte ou Adresse IP du serveur LDAP" -#: cps/templates/config_edit.html:201 +#: cps/templates/config_edit.html:223 msgid "LDAP Server Port" msgstr "Port du serveur LDAP" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:227 msgid "LDAP Encryption" msgstr "Chiffrement LDAP" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:230 msgid "TLS" msgstr "TLS" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:231 msgid "SSL" msgstr "SSL" -#: cps/templates/config_edit.html:213 +#: cps/templates/config_edit.html:235 msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" msgstr "Chemin d’accès LDAP CACertificat (uniquement requis pour l’authentification par certificat client)" -#: cps/templates/config_edit.html:220 +#: cps/templates/config_edit.html:242 msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" msgstr "Chemin d’accès LDAP CACertificat (requis uniquement pour l’authentification par certificat client)" -#: cps/templates/config_edit.html:227 +#: cps/templates/config_edit.html:249 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" msgstr "Chemin d’accès au fichier de clés LDAP (requis uniquement pour l’authentification par certificat client)" -#: cps/templates/config_edit.html:236 +#: cps/templates/config_edit.html:258 msgid "LDAP Authentication" msgstr "Authentification LDAP" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:260 msgid "Anonymous" msgstr "Anonyme" -#: cps/templates/config_edit.html:239 +#: cps/templates/config_edit.html:261 msgid "Unauthenticated" msgstr "Non authentifié" -#: cps/templates/config_edit.html:240 +#: cps/templates/config_edit.html:262 msgid "Simple" msgstr "Simple" -#: cps/templates/config_edit.html:245 +#: cps/templates/config_edit.html:267 msgid "LDAP Administrator Username" msgstr "Nom d'utilisateur de l'administrateur LDAP" -#: cps/templates/config_edit.html:251 +#: cps/templates/config_edit.html:273 msgid "LDAP Administrator Password" msgstr "Mot de passe de l'administrateur LDAP" -#: cps/templates/config_edit.html:256 +#: cps/templates/config_edit.html:278 msgid "LDAP Distinguished Name (DN)" msgstr "LDAP Distinguished Name (DN)" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:282 msgid "LDAP User Object Filter" msgstr "Filtre objet de l'utilisateur LDAP" -#: cps/templates/config_edit.html:265 +#: cps/templates/config_edit.html:287 msgid "LDAP Server is OpenLDAP?" msgstr "Est-ce que le serveur LDAP est OpenLDAP?" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:289 msgid "Following Settings are Needed For User Import" msgstr "Les paramètres suivant sont nécessaires pour importer un utilisateur" -#: cps/templates/config_edit.html:269 +#: cps/templates/config_edit.html:291 msgid "LDAP Group Object Filter" msgstr "Filtre objet de groupe LDAP" -#: cps/templates/config_edit.html:273 +#: cps/templates/config_edit.html:295 msgid "LDAP Group Name" msgstr "Nom de groupe LDAP" -#: cps/templates/config_edit.html:277 +#: cps/templates/config_edit.html:299 msgid "LDAP Group Members Field" msgstr "Champ des membres de groupe LDAP" -#: cps/templates/config_edit.html:281 +#: cps/templates/config_edit.html:303 msgid "LDAP Member User Filter Detection" msgstr "Filtre de détection des utilisateurs membres LDAP" -#: cps/templates/config_edit.html:283 +#: cps/templates/config_edit.html:305 msgid "Autodetect" msgstr "Détecter automatiquement" -#: cps/templates/config_edit.html:284 +#: cps/templates/config_edit.html:306 msgid "Custom Filter" msgstr "Filtre personnalisé" -#: cps/templates/config_edit.html:289 +#: cps/templates/config_edit.html:311 msgid "LDAP Member User Filter" msgstr "Filtre utilisateur des membres LDAP" -#: cps/templates/config_edit.html:300 +#: cps/templates/config_edit.html:322 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "Obtenir les identifiants OAuth %(provider)s" -#: cps/templates/config_edit.html:303 +#: cps/templates/config_edit.html:325 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "Client Id OAuth %(provider)s" -#: cps/templates/config_edit.html:307 +#: cps/templates/config_edit.html:329 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "Client secret OAuth %(provider)s" -#: cps/templates/config_edit.html:323 +#: cps/templates/config_edit.html:345 msgid "External binaries" msgstr "Binaires externes" -#: cps/templates/config_edit.html:329 +#: cps/templates/config_edit.html:351 msgid "Path to Calibre Binaries" msgstr "Chemin d'accès aux binaires Calibre" -#: cps/templates/config_edit.html:337 +#: cps/templates/config_edit.html:359 msgid "Calibre E-Book Converter Settings" msgstr "Paramètres du convertisseur de livres Calibre" -#: cps/templates/config_edit.html:340 +#: cps/templates/config_edit.html:362 msgid "Path to Kepubify E-Book Converter" msgstr "Chemin vers le convertisseur de livres Kepubify" -#: cps/templates/config_edit.html:348 +#: cps/templates/config_edit.html:370 msgid "Location of Unrar binary" msgstr "Emplacement du fichier binaire Unrar" -#: cps/templates/config_edit.html:364 +#: cps/templates/config_edit.html:386 msgid "Security Settings" msgstr "Paramètres de sécurité" -#: cps/templates/config_edit.html:372 +#: cps/templates/config_edit.html:394 msgid "Limit failed login attempts" msgstr "Limiter les tentatives de connexion infructueuses" -#: cps/templates/config_edit.html:376 +#: cps/templates/config_edit.html:398 msgid "Configure Backend for Limiter" msgstr "Configurer le backend pour le limiteur" -#: cps/templates/config_edit.html:380 +#: cps/templates/config_edit.html:402 msgid "Options for Limiter Backend" msgstr "Options pour le backend du limiteur" -#: cps/templates/config_edit.html:386 +#: cps/templates/config_edit.html:408 msgid "Check if file extensions matches file content on upload" msgstr "Vérifier si les extensions de fichiers sont cohérentes avec le contenu lors du téléversement" -#: cps/templates/config_edit.html:389 +#: cps/templates/config_edit.html:411 msgid "Session protection" msgstr "Protection de session" -#: cps/templates/config_edit.html:391 +#: cps/templates/config_edit.html:413 msgid "Basic" msgstr "Basique" -#: cps/templates/config_edit.html:392 +#: cps/templates/config_edit.html:414 msgid "Strong" msgstr "Fort" -#: cps/templates/config_edit.html:397 +#: cps/templates/config_edit.html:419 msgid "User Password policy" msgstr "Politique relative aux mots de passe des utilisateurs" -#: cps/templates/config_edit.html:401 +#: cps/templates/config_edit.html:423 msgid "Minimum password length" msgstr "Longueur minimale du mot de passe" -#: cps/templates/config_edit.html:406 +#: cps/templates/config_edit.html:428 msgid "Enforce number" msgstr "Imposer les chiffres" -#: cps/templates/config_edit.html:410 +#: cps/templates/config_edit.html:432 msgid "Enforce lowercase characters" msgstr "Imposer les caractères minuscules" -#: cps/templates/config_edit.html:414 +#: cps/templates/config_edit.html:436 msgid "Enforce uppercase characters" msgstr "Imposer les caractères majuscules" -#: cps/templates/config_edit.html:418 +#: cps/templates/config_edit.html:440 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" msgstr "Imposer les caractères (nécessaire pour les caractères chinois/japonais/coréens)" -#: cps/templates/config_edit.html:422 +#: cps/templates/config_edit.html:444 msgid "Enforce special characters" msgstr "Imposer les caractères spéciaux" @@ -3179,27 +3267,27 @@ msgstr "Les livres doivent d'abord être archivés et l'appareil synchronisé av msgid "Choose File Location" msgstr "Choisissez l’emplacement du fichier" -#: cps/templates/modal_dialogs.html:81 +#: cps/templates/modal_dialogs.html:82 msgid "type" msgstr "type" -#: cps/templates/modal_dialogs.html:82 +#: cps/templates/modal_dialogs.html:83 msgid "name" msgstr "nom" -#: cps/templates/modal_dialogs.html:83 +#: cps/templates/modal_dialogs.html:84 msgid "size" msgstr "taille" -#: cps/templates/modal_dialogs.html:89 +#: cps/templates/modal_dialogs.html:90 msgid "Parent Directory" msgstr "Répertoire parent" -#: cps/templates/modal_dialogs.html:97 +#: cps/templates/modal_dialogs.html:99 msgid "Select" msgstr "Sélectionner" -#: cps/templates/modal_dialogs.html:133 cps/templates/tasks.html:46 +#: cps/templates/modal_dialogs.html:135 cps/templates/tasks.html:46 msgid "Ok" msgstr "Ok" @@ -3455,6 +3543,31 @@ msgstr "Une fois vérifié, vous serez automatiquement connecté à cet appareil msgid "This verification link will expire in 10 minutes." msgstr "Le lien de vérification expirera après 10 minutes." +#: cps/templates/remote_login_verify.html:4 +msgid "Approve Magic Link Login" +msgstr "" + +#: cps/templates/remote_login_verify.html:5 +msgid "Review the device that requested access before approving this login." +msgstr "" + +#: cps/templates/remote_login_verify.html:7 +msgid "IP address" +msgstr "" + +#: cps/templates/remote_login_verify.html:9 +msgid "Browser" +msgstr "" + +#: cps/templates/remote_login_verify.html:12 +#, python-format +msgid "If you approve this request, the device that started it will be logged in as %(username)s." +msgstr "" + +#: cps/templates/remote_login_verify.html:15 +msgid "Approve Login" +msgstr "" + #: cps/templates/schedule_edit.html:33 msgid "Generate Series Cover Thumbnails" msgstr "Générer des vignettes de couverture de série" diff --git a/cps/translations/gl/LC_MESSAGES/messages.mo b/cps/translations/gl/LC_MESSAGES/messages.mo index 09495c46d76fd745d139563ec3e392f57b2d1a5c..12e3aa6bfc1c673876524a6532aaed795d464c56 100644 GIT binary patch delta 14032 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 diff --git a/cps/translations/hu/LC_MESSAGES/messages.po b/cps/translations/hu/LC_MESSAGES/messages.po index 3f80f40ba..d22baba82 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: 2026-08-01 11:42+0200\n" +"POT-Creation-Date: 2026-08-08 16:08+0200\n" "PO-Revision-Date: 2019-04-06 23:36+0200\n" "Last-Translator: \n" "Language: hu\n" @@ -16,519 +16,558 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" +"Generated-By: Babel 2.18.0\n" #: cps/about.py:85 msgid "Statistics" msgstr "Statisztika" -#: cps/admin.py:151 +#: cps/admin.py:154 msgid "Server restarted, please reload page." msgstr "" -#: cps/admin.py:153 +#: cps/admin.py:156 msgid "Performing Server shutdown, please close window." msgstr "" -#: cps/admin.py:161 +#: cps/admin.py:164 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:164 +#: cps/admin.py:167 msgid "Unknown command" msgstr "" -#: cps/admin.py:175 +#: cps/admin.py:178 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "" -#: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 -#: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 -#: cps/uploader.py:117 +#: cps/admin.py:211 cps/editbooks.py:825 cps/editbooks.py:875 +#: cps/editbooks.py:1564 cps/templates/remote_login_verify.html:8 +#: cps/templates/remote_login_verify.html:10 cps/updater.py:615 +#: cps/uploader.py:117 cps/uploader.py:126 msgid "Unknown" msgstr "Ismeretlen" -#: cps/admin.py:233 +#: cps/admin.py:236 msgid "Admin page" msgstr "Rendszergazda oldala" -#: cps/admin.py:253 +#: cps/admin.py:256 msgid "Basic Configuration" msgstr "Alapvető beállítások" -#: cps/admin.py:291 +#: cps/admin.py:294 msgid "UI Configuration" msgstr "Felhasználói felület beállításai" -#: cps/admin.py:315 cps/admin.py:1002 cps/db.py:809 cps/search.py:150 -#: cps/web.py:750 +#: cps/admin.py:318 cps/admin.py:1005 cps/db.py:809 cps/search.py:150 +#: cps/web.py:752 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "" -#: cps/admin.py:333 cps/templates/admin.html:51 +#: cps/admin.py:336 cps/templates/admin.html:51 msgid "Edit Users" msgstr "" -#: cps/admin.py:378 cps/opds.py:559 cps/templates/grid.html:14 +#: cps/admin.py:381 cps/opds.py:559 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "" -#: cps/admin.py:401 cps/admin.py:1432 +#: cps/admin.py:404 cps/admin.py:1460 msgid "User not found" msgstr "" -#: cps/admin.py:415 +#: cps/admin.py:418 #, python-brace-format msgid "{} users deleted successfully" msgstr "" -#: cps/admin.py:438 cps/templates/config_view_edit.html:133 +#: cps/admin.py:441 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Mindent mutass" -#: cps/admin.py:459 cps/admin.py:465 +#: cps/admin.py:462 cps/admin.py:468 msgid "Malformed request" msgstr "" -#: cps/admin.py:477 cps/admin.py:2078 +#: cps/admin.py:480 cps/admin.py:2156 msgid "Guest Name can't be changed" msgstr "" -#: cps/admin.py:489 +#: cps/admin.py:492 msgid "Guest can't have this role" msgstr "" -#: cps/admin.py:501 cps/admin.py:2032 +#: cps/admin.py:504 cps/admin.py:2110 msgid "No admin user remaining, can't remove admin role" msgstr "" -#: cps/admin.py:505 cps/admin.py:519 +#: cps/admin.py:508 cps/admin.py:522 msgid "Value has to be true or false" msgstr "" -#: cps/admin.py:507 +#: cps/admin.py:510 msgid "Invalid role" msgstr "" -#: cps/admin.py:511 +#: cps/admin.py:514 msgid "Guest can't have this view" msgstr "" -#: cps/admin.py:521 +#: cps/admin.py:524 msgid "Invalid view" msgstr "" -#: cps/admin.py:524 +#: cps/admin.py:527 msgid "Guest's Locale is determined automatically and can't be set" msgstr "" -#: cps/admin.py:528 +#: cps/admin.py:531 msgid "No Valid Locale Given" msgstr "" -#: cps/admin.py:539 +#: cps/admin.py:542 msgid "No Valid Book Language Given" msgstr "" -#: cps/admin.py:541 cps/editbooks.py:243 cps/editbooks.py:428 -#: cps/editbooks.py:430 +#: cps/admin.py:544 cps/editbooks.py:260 cps/editbooks.py:445 +#: cps/editbooks.py:447 msgid "Parameter not found" msgstr "" -#: cps/admin.py:578 +#: cps/admin.py:581 msgid "Invalid Read Column" msgstr "" -#: cps/admin.py:584 +#: cps/admin.py:587 msgid "Invalid Restricted Column" msgstr "" -#: cps/admin.py:604 cps/admin.py:1903 +#: cps/admin.py:607 cps/admin.py:1981 msgid "Calibre-Web configuration updated" msgstr "A Calibre-Web konfigurációja frissítve." -#: cps/admin.py:616 +#: cps/admin.py:619 msgid "Do you really want to delete the Kobo Token?" msgstr "" -#: cps/admin.py:618 +#: cps/admin.py:621 msgid "Do you really want to delete this domain?" msgstr "" -#: cps/admin.py:620 +#: cps/admin.py:623 msgid "Do you really want to delete this user?" msgstr "" -#: cps/admin.py:622 +#: cps/admin.py:625 msgid "Do you really want to delete this book?" msgstr "" -#: cps/admin.py:624 +#: cps/admin.py:627 msgid "Are you sure you want to delete this shelf?" msgstr "Valóban törölni akarod a polcot?" -#: cps/admin.py:626 +#: cps/admin.py:629 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "" -#: cps/admin.py:628 +#: cps/admin.py:631 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "" -#: cps/admin.py:630 +#: cps/admin.py:633 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "" -#: cps/admin.py:632 +#: cps/admin.py:635 msgid "Are you sure you want to change the archive status for the selected book(s)?" msgstr "" -#: cps/admin.py:634 +#: cps/admin.py:637 msgid "Are you sure you want to change the read status for the selected book(s)?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:639 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "" -#: cps/admin.py:638 +#: cps/admin.py:641 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "" -#: cps/admin.py:641 +#: cps/admin.py:644 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "" -#: cps/admin.py:643 +#: cps/admin.py:646 msgid "Are you sure you want to change Calibre library location?" msgstr "" -#: cps/admin.py:645 +#: cps/admin.py:648 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "" -#: cps/admin.py:648 +#: cps/admin.py:651 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "" -#: cps/admin.py:891 cps/admin.py:897 cps/admin.py:907 cps/admin.py:917 +#: cps/admin.py:894 cps/admin.py:900 cps/admin.py:910 cps/admin.py:920 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "" -#: cps/admin.py:893 cps/admin.py:899 cps/admin.py:909 cps/admin.py:919 +#: cps/admin.py:896 cps/admin.py:902 cps/admin.py:912 cps/admin.py:922 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "" -#: cps/admin.py:952 +#: cps/admin.py:955 #, python-brace-format msgid "{} sync entries deleted" msgstr "" -#: cps/admin.py:993 +#: cps/admin.py:996 msgid "Tag not found" msgstr "" -#: cps/admin.py:1011 +#: cps/admin.py:1014 msgid "Invalid Action" msgstr "" -#: cps/admin.py:1138 +#: cps/admin.py:1137 +#, python-format +msgid "Invalid reverse proxy trusted IP/CIDR entry: %(entry)s" +msgstr "" + +#: cps/admin.py:1148 +#, python-format +msgid "Invalid %(label)s: %(value)s" +msgstr "" + +#: cps/admin.py:1166 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "" -#: cps/admin.py:1183 +#: cps/admin.py:1211 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1189 +#: cps/admin.py:1217 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1223 +#: cps/admin.py:1251 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "" -#: cps/admin.py:1229 +#: cps/admin.py:1257 msgid "Please Enter a LDAP Service Account and Password" msgstr "" -#: cps/admin.py:1232 +#: cps/admin.py:1260 msgid "Please Enter a LDAP Service Account" msgstr "" -#: cps/admin.py:1237 +#: cps/admin.py:1265 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1239 +#: cps/admin.py:1267 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1243 +#: cps/admin.py:1271 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1245 +#: cps/admin.py:1273 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1252 +#: cps/admin.py:1280 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1254 +#: cps/admin.py:1282 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1261 +#: cps/admin.py:1289 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1292 cps/templates/admin.html:53 +#: cps/admin.py:1320 cps/templates/admin.html:53 msgid "Add New User" msgstr "" -#: cps/admin.py:1301 cps/templates/admin.html:100 +#: cps/admin.py:1329 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "SMTP beállítások változtatása" -#: cps/admin.py:1320 +#: cps/admin.py:1348 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1340 cps/admin.py:1343 cps/admin.py:1728 cps/admin.py:1887 -#: cps/admin.py:1985 cps/admin.py:2106 cps/editbooks.py:169 -#: cps/editbooks.py:755 cps/editbooks.py:1474 cps/shelf.py:90 cps/shelf.py:144 +#: cps/admin.py:1368 cps/admin.py:1371 cps/admin.py:1756 cps/admin.py:1965 +#: cps/admin.py:2063 cps/admin.py:2184 cps/editbooks.py:170 +#: cps/editbooks.py:772 cps/editbooks.py:1518 cps/shelf.py:90 cps/shelf.py:144 #: cps/shelf.py:194 cps/shelf.py:237 cps/shelf.py:287 cps/shelf.py:327 -#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:160 cps/web.py:1526 +#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:161 cps/web.py:1536 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "" -#: cps/admin.py:1350 +#: cps/admin.py:1378 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1353 +#: cps/admin.py:1381 #, 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:1355 +#: cps/admin.py:1383 msgid "Please configure your e-mail address first..." msgstr "" -#: cps/admin.py:1357 +#: cps/admin.py:1385 msgid "Email Server Settings updated" msgstr "Az e-mail kiszolgáló beállításai frissítve." -#: cps/admin.py:1380 cps/templates/admin.html:195 +#: cps/admin.py:1408 cps/templates/admin.html:211 msgid "Edit Scheduled Tasks Settings" msgstr "" -#: cps/admin.py:1392 +#: cps/admin.py:1420 msgid "Invalid start time for task specified" msgstr "" -#: cps/admin.py:1397 +#: cps/admin.py:1425 msgid "Invalid duration for task specified" msgstr "" -#: cps/admin.py:1407 +#: cps/admin.py:1435 msgid "Scheduled tasks settings updated" msgstr "" -#: cps/admin.py:1417 cps/admin.py:1466 cps/admin.py:2102 cps/web.py:1325 +#: cps/admin.py:1445 cps/admin.py:1494 cps/admin.py:2180 cps/web.py:1335 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Ismeretlen hiba történt. Próbáld újra később!" -#: cps/admin.py:1421 +#: cps/admin.py:1449 msgid "Settings DB is not Writeable" msgstr "" -#: cps/admin.py:1451 cps/admin.py:2094 +#: cps/admin.py:1479 cps/admin.py:2172 #, python-format msgid "Edit User %(nick)s" msgstr " A felhasználó szerkesztése: %(nick)s" -#: cps/admin.py:1463 +#: cps/admin.py:1491 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "" -#: cps/admin.py:1469 +#: cps/admin.py:1497 msgid "Oops! Please configure the SMTP mail settings." msgstr "" -#: cps/admin.py:1480 +#: cps/admin.py:1508 msgid "Logfile viewer" msgstr "" -#: cps/admin.py:1546 +#: cps/admin.py:1574 msgid "Requesting update package" msgstr "Frissítési csomag kérése" -#: cps/admin.py:1547 +#: cps/admin.py:1575 msgid "Downloading update package" msgstr "Frissítési csomag letöltése" -#: cps/admin.py:1548 +#: cps/admin.py:1576 msgid "Unzipping update package" msgstr "Frissítési csomag kitömörítése" -#: cps/admin.py:1549 +#: cps/admin.py:1577 msgid "Replacing files" msgstr "Fájlok cserélése" -#: cps/admin.py:1550 +#: cps/admin.py:1578 msgid "Database connections are closed" msgstr "Adatbázis kapcsolatok lezárva" -#: cps/admin.py:1551 +#: cps/admin.py:1579 msgid "Stopping server" msgstr "Szerver leállítása" -#: cps/admin.py:1552 +#: cps/admin.py:1580 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:1553 cps/admin.py:1554 cps/admin.py:1555 cps/admin.py:1556 -#: cps/admin.py:1557 cps/admin.py:1558 +#: cps/admin.py:1581 cps/admin.py:1582 cps/admin.py:1583 cps/admin.py:1584 +#: cps/admin.py:1585 cps/admin.py:1586 msgid "Update failed:" msgstr "A frissítés nem sikerült:" -#: cps/admin.py:1553 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1581 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP hiba" -#: cps/admin.py:1554 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1582 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Kapcsolódási hiba" -#: cps/admin.py:1555 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1583 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Időtúllépés a kapcsolódás során" -#: cps/admin.py:1556 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1584 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Általános hiba" -#: cps/admin.py:1557 +#: cps/admin.py:1585 msgid "Update file could not be saved in temp dir" msgstr "" -#: cps/admin.py:1558 +#: cps/admin.py:1586 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1582 +#: cps/admin.py:1610 msgid "Failed to extract at least One LDAP User" msgstr "" -#: cps/admin.py:1627 +#: cps/admin.py:1655 msgid "Failed to Create at Least One LDAP User" msgstr "" -#: cps/admin.py:1640 +#: cps/admin.py:1668 #, python-format msgid "Error: %(ldaperror)s" msgstr "" -#: cps/admin.py:1644 +#: cps/admin.py:1672 msgid "Error: No user returned in response of LDAP server" msgstr "" -#: cps/admin.py:1680 +#: cps/admin.py:1708 msgid "At Least One LDAP User Not Found in Database" msgstr "" -#: cps/admin.py:1682 +#: cps/admin.py:1710 #, python-brace-format msgid "{} User Successfully Imported" msgstr "" -#: cps/admin.py:1740 +#: cps/admin.py:1768 msgid "Books path not valid" msgstr "" -#: cps/admin.py:1746 +#: cps/admin.py:1774 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1774 +#: cps/admin.py:1802 msgid "DB is not Writeable" msgstr "" -#: cps/admin.py:1788 +#: cps/admin.py:1816 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1792 +#: cps/admin.py:1820 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1872 +#: cps/admin.py:1846 +msgid "Kepubify binary not found" +msgstr "" + +#: cps/admin.py:1894 +msgid "reverse proxy login header name" +msgstr "" + +#: cps/admin.py:1904 +msgid "reverse proxy shared secret header name" +msgstr "" + +#: cps/admin.py:1913 +msgid "Please configure both reverse proxy shared secret header name and secret" +msgstr "" + +#: cps/admin.py:1917 +msgid "Please configure reverse proxy shared secret header name and secret or disable the feature" +msgstr "" + +#: cps/admin.py:1922 +msgid "Please configure at least one trusted reverse proxy IP or CIDR" +msgstr "" + +#: cps/admin.py:1946 msgid "Password length has to be between 1 and 40" msgstr "" -#: cps/admin.py:1926 +#: cps/admin.py:1957 cps/helper.py:1007 +msgid "Please specify a valid UnRar directory" +msgstr "" + +#: cps/admin.py:2004 msgid "Database Settings updated" msgstr "" -#: cps/admin.py:1934 +#: cps/admin.py:2012 msgid "Database Configuration" msgstr "" -#: cps/admin.py:1949 cps/web.py:1295 +#: cps/admin.py:2027 cps/web.py:1305 msgid "Oops! Please complete all fields." msgstr "Az összes mezőt ki kell tölteni!" -#: cps/admin.py:1958 +#: cps/admin.py:2036 msgid "E-mail is not from valid domain" msgstr "Az e-mail tartománya nem érvényes." -#: cps/admin.py:1964 +#: cps/admin.py:2042 msgid "Add new user" msgstr "Új felhasználó hozzáadása" -#: cps/admin.py:1975 +#: cps/admin.py:2053 #, python-format msgid "User '%(user)s' created" msgstr "A következő felhasználó létrehozva: %(user)s" -#: cps/admin.py:1981 +#: cps/admin.py:2059 msgid "Oops! An account already exists for this Email. or name." msgstr "" -#: cps/admin.py:2011 +#: cps/admin.py:2089 #, python-format msgid "User '%(nick)s' deleted" msgstr "A felhasználó törölve: %(nick)s" -#: cps/admin.py:2014 +#: cps/admin.py:2092 msgid "Can't delete Guest User" msgstr "" -#: cps/admin.py:2017 +#: cps/admin.py:2095 msgid "No admin user remaining, can't delete user" msgstr "" -#: cps/admin.py:2072 cps/web.py:1475 +#: cps/admin.py:2150 cps/web.py:1485 msgid "Email can't be empty and has to be a valid Email" msgstr "" -#: cps/admin.py:2098 +#: cps/admin.py:2176 #, python-format msgid "User '%(nick)s' updated" msgstr "A felhasználó frissítve: %(nick)s" @@ -541,145 +580,153 @@ msgstr "A felhasználó frissítve: %(nick)s" msgid "Search" msgstr "Keresés" -#: cps/converter.py:31 +#: cps/converter.py:32 msgid "not installed" msgstr "nincs telepítve" -#: cps/converter.py:32 +#: cps/converter.py:33 msgid "Execution permissions missing" msgstr "" -#: cps/db.py:1129 cps/templates/config_edit.html:207 +#: cps/db.py:1129 cps/templates/config_edit.html:229 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:565 cps/web.py:599 cps/web.py:644 cps/web.py:684 cps/web.py:711 -#: cps/web.py:998 cps/web.py:1028 cps/web.py:1073 cps/web.py:1101 -#: cps/web.py:1140 +#: cps/web.py:567 cps/web.py:601 cps/web.py:646 cps/web.py:686 cps/web.py:713 +#: cps/web.py:1000 cps/web.py:1030 cps/web.py:1075 cps/web.py:1103 +#: cps/web.py:1142 msgid "None" msgstr "Nincs" -#: cps/editbooks.py:155 +#: cps/editbooks.py:156 #, python-format msgid "File %(file)s uploaded" msgstr "" -#: cps/editbooks.py:184 +#: cps/editbooks.py:185 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:192 +#: cps/editbooks.py:189 cps/editbooks.py:197 +msgid "Source format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:201 +msgid "Destination format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:209 #, 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:196 +#: cps/editbooks.py:213 #, 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/editbooks.py:297 +#: cps/editbooks.py:314 msgid "Changes successfully applied" msgstr "" -#: cps/editbooks.py:317 +#: cps/editbooks.py:334 msgid "Value is missing on request" msgstr "" -#: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 -#: cps/editbooks.py:1146 cps/web.py:532 cps/web.py:1567 cps/web.py:1613 -#: cps/web.py:1663 +#: cps/editbooks.py:336 cps/editbooks.py:343 cps/editbooks.py:644 +#: cps/editbooks.py:1170 cps/web.py:534 cps/web.py:1577 cps/web.py:1623 +#: cps/web.py:1673 msgid "Oops! Selected book 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/editbooks.py:673 cps/editbooks.py:1503 +#: cps/editbooks.py:690 cps/editbooks.py:1547 msgid "User has no rights to upload cover" msgstr "" -#: cps/editbooks.py:694 cps/editbooks.py:938 +#: cps/editbooks.py:711 cps/editbooks.py:961 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "" -#: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 +#: cps/editbooks.py:726 cps/editbooks.py:935 cps/editbooks.py:1306 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "" -#: cps/editbooks.py:737 +#: cps/editbooks.py:754 msgid "Metadata successfully updated" msgstr "A metaadatok sikeresen frissültek" -#: cps/editbooks.py:760 +#: cps/editbooks.py:777 #, python-brace-format msgid "Error editing book: {}" msgstr "" -#: cps/editbooks.py:856 +#: cps/editbooks.py:879 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "" -#: cps/editbooks.py:950 cps/editbooks.py:1420 +#: cps/editbooks.py:973 cps/editbooks.py:1464 msgid "File type isn't allowed to be uploaded to this server" msgstr "" -#: cps/editbooks.py:956 cps/editbooks.py:1431 +#: cps/editbooks.py:979 cps/editbooks.py:1475 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "A(z) \"%(ext)s\" kiterjesztésű fájlok feltöltése nincs engedélyezve ezen a szerveren." -#: cps/editbooks.py:960 cps/editbooks.py:1436 +#: cps/editbooks.py:983 cps/editbooks.py:1480 msgid "File to be uploaded must have an extension" msgstr "A feltöltendő fájlnak kiterjesztéssel kell rendelkeznie!" -#: cps/editbooks.py:968 +#: cps/editbooks.py:992 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "" -#: cps/editbooks.py:988 +#: cps/editbooks.py:1012 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "" -#: cps/editbooks.py:1041 +#: cps/editbooks.py:1065 msgid "Book Format Successfully Deleted" msgstr "" -#: cps/editbooks.py:1044 cps/editbooks.py:1061 +#: cps/editbooks.py:1068 cps/editbooks.py:1085 msgid "Book Successfully Deleted" msgstr "" -#: cps/editbooks.py:1065 +#: cps/editbooks.py:1089 msgid "You are missing permissions to delete books" msgstr "" -#: cps/editbooks.py:1139 +#: cps/editbooks.py:1163 #, python-brace-format msgid "Book with id \"{}\" could not be deleted: not found" msgstr "" -#: cps/editbooks.py:1181 +#: cps/editbooks.py:1205 msgid "edit metadata" msgstr "Metaadatok szerkesztése" -#: cps/editbooks.py:1234 +#: cps/editbooks.py:1267 #, python-format msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1425 +#: cps/editbooks.py:1469 msgid "User has no rights to upload additional file formats" msgstr "" -#: cps/editbooks.py:1449 +#: cps/editbooks.py:1493 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Nem sikerült létrehozni az elérési utat (engedély megtagadva): %(path)s." -#: cps/editbooks.py:1456 +#: cps/editbooks.py:1500 #, python-format msgid "Failed to store file %(file)s." msgstr "Nem sikerült elmenteni a %(file)s fájlt." -#: cps/editbooks.py:1481 +#: cps/editbooks.py:1525 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "A(z) %(ext)s fájlformátum hozzáadva a könyvhez: %(book)s." @@ -690,9 +737,9 @@ msgstr "" #: cps/error_handler.py:108 cps/templates/layout.html:69 #: cps/templates/layout.html:104 cps/templates/login.html:27 -#: cps/templates/register.html:17 cps/web.py:1292 cps/web.py:1296 -#: cps/web.py:1302 cps/web.py:1326 cps/web.py:1330 cps/web.py:1343 -#: cps/web.py:1346 +#: cps/templates/register.html:17 cps/web.py:1302 cps/web.py:1306 +#: cps/web.py:1312 cps/web.py:1336 cps/web.py:1340 cps/web.py:1353 +#: cps/web.py:1356 msgid "Register" msgstr "Regisztrálás" @@ -713,7 +760,7 @@ msgstr "A visszahívási tartomány nem ellenőrzött, kövesd az alábbi lépé msgid "%(format)s format not found for book id: %(book)d" msgstr "A(z) %(format)s formátum nem található a következő könyvhöz: %(book)d" -#: cps/helper.py:94 cps/tasks/convert.py:91 +#: cps/helper.py:94 cps/tasks/convert.py:92 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s nem található a Google Drive-on: %(fn)s" @@ -899,10 +946,6 @@ msgstr "" msgid "Cover" msgstr "" -#: cps/helper.py:1006 -msgid "UnRar binary file not found" -msgstr "" - #: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "" @@ -933,7 +976,7 @@ msgstr "" msgid "Error executing Calibre" msgstr "" -#: cps/helper.py:1154 cps/templates/admin.html:216 +#: cps/helper.py:1154 cps/templates/admin.html:232 msgid "Queue all books for metadata backup" msgstr "" @@ -955,7 +998,7 @@ msgstr "" msgid "This %(oauth)s account is already linked to a different user" msgstr "" -#: cps/oauth_bb.py:147 cps/remotelogin.py:131 +#: cps/oauth_bb.py:147 cps/remotelogin.py:150 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "Be vagy jelentkezve mint: %(nickname)s" @@ -1023,25 +1066,29 @@ msgstr "" msgid "{} Stars" msgstr "" -#: cps/remotelogin.py:63 cps/templates/layout.html:68 -#: cps/templates/layout.html:103 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1361 -msgid "Login" -msgstr "Belépés" - -#: cps/remotelogin.py:75 cps/remotelogin.py:109 +#: cps/remotelogin.py:46 cps/remotelogin.py:128 msgid "Token not found" msgstr "A token nem található." -#: cps/remotelogin.py:84 cps/remotelogin.py:117 +#: cps/remotelogin.py:55 cps/remotelogin.py:136 msgid "Token has expired" msgstr "A token érvényessége lejárt." -#: cps/remotelogin.py:93 +#: cps/remotelogin.py:86 cps/remotelogin.py:112 cps/templates/layout.html:68 +#: cps/templates/layout.html:103 cps/templates/login.html:4 +#: cps/templates/login.html:21 cps/web.py:1371 +msgid "Login" +msgstr "Belépés" + +#: cps/remotelogin.py:100 +msgid "Token already approved" +msgstr "" + +#: cps/remotelogin.py:108 msgid "Success! Please return to your device" msgstr "Sikerült! Újra használható az eszköz." -#: cps/render_template.py:41 cps/web.py:421 +#: cps/render_template.py:41 cps/web.py:423 msgid "Books" msgstr "" @@ -1066,7 +1113,7 @@ msgstr "" msgid "Show Downloaded Books" msgstr "" -#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:436 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:438 msgid "Top Rated Books" msgstr "Legjobb könyvek" @@ -1075,7 +1122,7 @@ msgid "Show Top Rated Books" msgstr "Legjobbra értékelt könyvek mutatása" #: cps/render_template.py:61 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:769 +#: cps/templates/index.xml:67 cps/web.py:771 msgid "Read Books" msgstr "Olvasott könyvek" @@ -1084,7 +1131,7 @@ msgid "Show Read and Unread" msgstr "" #: cps/render_template.py:65 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:772 +#: cps/templates/index.xml:74 cps/web.py:774 msgid "Unread Books" msgstr "Olvasatlan könyvek" @@ -1102,7 +1149,7 @@ msgid "Show Random Books" msgstr "Mutass könyveket találomra" #: cps/render_template.py:71 cps/templates/book_table.html:93 -#: cps/templates/index.xml:97 cps/web.py:1144 +#: cps/templates/index.xml:97 cps/web.py:1146 msgid "Categories" msgstr "Címkék" @@ -1112,7 +1159,7 @@ msgstr "" #: cps/render_template.py:74 cps/templates/book_edit.html:86 #: cps/templates/book_table.html:94 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1034 cps/web.py:1046 +#: cps/templates/search_form.html:70 cps/web.py:1036 cps/web.py:1048 msgid "Series" msgstr "Sorozatok" @@ -1130,7 +1177,7 @@ msgid "Show Author Section" msgstr "" #: cps/render_template.py:81 cps/templates/book_table.html:98 -#: cps/templates/index.xml:88 cps/web.py:1002 +#: cps/templates/index.xml:88 cps/web.py:1004 msgid "Publishers" msgstr "Kiadók" @@ -1140,7 +1187,7 @@ msgstr "" #: cps/render_template.py:84 cps/templates/book_table.html:96 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1116 +#: cps/web.py:1118 msgid "Languages" msgstr "Nyelvek" @@ -1164,7 +1211,7 @@ msgstr "" msgid "Show File Formats Section" msgstr "" -#: cps/render_template.py:95 cps/web.py:795 +#: cps/render_template.py:95 cps/web.py:797 msgid "Archived Books" msgstr "" @@ -1172,7 +1219,7 @@ msgstr "" msgid "Show Archived Books" msgstr "" -#: cps/render_template.py:100 cps/web.py:831 +#: cps/render_template.py:100 cps/web.py:833 msgid "Books List" msgstr "" @@ -1405,150 +1452,154 @@ msgstr "Új frissítés érhető el. Kattints az alábbi gombra a frissítéshez msgid "No release information available" msgstr "Nincs információ a kiadásról." -#: cps/templates/index.html:6 cps/web.py:448 +#: cps/templates/index.html:6 cps/web.py:450 msgid "Discover (Random Books)" msgstr "Felfedezés (könyvek találomra)" -#: cps/web.py:484 +#: cps/web.py:486 msgid "Hot Books (Most Downloaded)" msgstr "Kelendő könyvek (legtöbbet letöltöttek)" -#: cps/web.py:515 +#: cps/web.py:517 #, python-format msgid "Downloaded books by %(user)s" msgstr "" -#: cps/web.py:548 +#: cps/web.py:550 #, python-format msgid "Author: %(name)s" msgstr "" -#: cps/web.py:584 +#: cps/web.py:586 #, python-format msgid "Publisher: %(name)s" msgstr "Kiadó: %(name)s" -#: cps/web.py:612 +#: cps/web.py:614 #, python-format msgid "Series: %(serie)s" msgstr "Sorozat: %(serie)s" -#: cps/web.py:626 +#: cps/web.py:628 msgid "Rating: None" msgstr "" -#: cps/web.py:635 +#: cps/web.py:637 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:666 +#: cps/web.py:668 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:701 +#: cps/web.py:703 #, python-format msgid "Category: %(name)s" msgstr "Címke: %(name)s" -#: cps/web.py:730 +#: cps/web.py:732 #, python-format msgid "Language: %(name)s" msgstr "Nyelv: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:974 +#: cps/templates/admin.html:16 cps/web.py:976 msgid "Downloads" msgstr "Letöltések" -#: cps/web.py:1076 +#: cps/web.py:1078 msgid "Ratings list" msgstr "" -#: cps/web.py:1103 +#: cps/web.py:1105 msgid "File formats list" msgstr "" -#: cps/web.py:1264 +#: cps/web.py:1272 +msgid "Book format not supported" +msgstr "" + +#: cps/web.py:1274 msgid "Please configure the SMTP mail settings first..." msgstr "" -#: cps/web.py:1270 +#: cps/web.py:1280 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "A könyv sikeresen küldésre lett jelölve a következő címre: %(eReadermail)s" -#: cps/web.py:1273 +#: cps/web.py:1283 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Hiba történt a könyv küldésekor: %(res)s" -#: cps/web.py:1275 +#: cps/web.py:1285 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "" -#: cps/web.py:1291 cps/web.py:1342 +#: cps/web.py:1301 cps/web.py:1352 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "" -#: cps/web.py:1328 +#: cps/web.py:1338 msgid "Oops! Your Email is not allowed." msgstr "Nem engedélyezett a megadott e-mail cím bejegyzése" -#: cps/web.py:1331 +#: cps/web.py:1341 msgid "Success! Confirmation Email has been sent." msgstr "Jóváhagyó levél elküldve az email címedre." -#: cps/web.py:1376 cps/web.py:1390 +#: cps/web.py:1386 cps/web.py:1400 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1399 +#: cps/web.py:1409 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1406 +#: cps/web.py:1416 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1411 +#: cps/web.py:1421 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1415 cps/web.py:1440 +#: cps/web.py:1425 cps/web.py:1450 msgid "Wrong Username or Password" msgstr "" -#: cps/web.py:1422 +#: cps/web.py:1432 msgid "New Password was sent to your email address" msgstr "" -#: cps/web.py:1426 +#: cps/web.py:1436 msgid "An unknown error occurred. Please try again later." msgstr "" -#: cps/web.py:1428 +#: cps/web.py:1438 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1436 +#: cps/web.py:1446 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1501 cps/web.py:1551 +#: cps/web.py:1511 cps/web.py:1561 #, python-format msgid "%(name)s's Profile" msgstr "%(name)s profilja" -#: cps/web.py:1517 +#: cps/web.py:1527 msgid "Success! Profile Updated" msgstr "" -#: cps/web.py:1521 +#: cps/web.py:1531 msgid "Oops! An account already exists for this Email." msgstr "" @@ -1560,46 +1611,46 @@ msgstr "" msgid "Delete temp folder contents" msgstr "" -#: cps/tasks/convert.py:112 +#: cps/tasks/convert.py:113 #, python-format msgid "%(book)s send to E-Reader" msgstr "" -#: cps/tasks/convert.py:177 +#: cps/tasks/convert.py:180 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "" -#: cps/tasks/convert.py:211 +#: cps/tasks/convert.py:214 #, python-format msgid "%(format)s format not found on disk" msgstr "" -#: cps/tasks/convert.py:215 +#: cps/tasks/convert.py:218 msgid "Ebook converter failed with unknown error" msgstr "" -#: cps/tasks/convert.py:234 +#: cps/tasks/convert.py:237 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "" -#: cps/tasks/convert.py:254 +#: cps/tasks/convert.py:257 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "" -#: cps/tasks/convert.py:291 cps/tasks/convert.py:342 +#: cps/tasks/convert.py:294 cps/tasks/convert.py:345 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:322 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Az e-könyv átalakítás nem sikerült: %(error)s" -#: cps/tasks/convert.py:347 +#: cps/tasks/convert.py:350 msgid "Convert" msgstr "" @@ -1685,7 +1736,7 @@ msgstr "Szerkesztés" #: cps/templates/admin.html:25 cps/templates/book_edit.html:17 #: cps/templates/book_table.html:131 cps/templates/book_table.html:180 -#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:115 +#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:117 #: cps/templates/user_edit.html:67 cps/templates/user_table.html:149 msgid "Delete" msgstr "Törlés" @@ -1775,128 +1826,145 @@ msgstr "Távoli belépés:" msgid "Reverse Proxy Login" msgstr "" -#: cps/templates/admin.html:154 cps/templates/config_edit.html:176 +#: cps/templates/admin.html:154 cps/templates/config_edit.html:180 msgid "Reverse Proxy Header Name" msgstr "" -#: cps/templates/admin.html:159 +#: cps/templates/admin.html:158 +msgid "Reverse Proxy Trusted IPs/CIDRs" +msgstr "" + +#: cps/templates/admin.html:162 cps/templates/config_edit.html:193 +msgid "Reverse Proxy Shared Secret Header Name" +msgstr "" + +#: cps/templates/admin.html:166 +msgid "Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/admin.html:170 +msgid "Reverse Proxy Shared Secret Configured" +msgstr "" + +#: cps/templates/admin.html:175 msgid "Edit Calibre Database Configuration" msgstr "" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:176 msgid "Edit Basic Configuration" msgstr "" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:177 msgid "Edit UI Configuration" msgstr "" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:183 msgid "Scheduled Tasks" msgstr "" -#: cps/templates/admin.html:170 cps/templates/schedule_edit.html:12 +#: cps/templates/admin.html:186 cps/templates/schedule_edit.html:12 #: cps/templates/tasks.html:18 msgid "Start Time" msgstr "" -#: cps/templates/admin.html:174 cps/templates/schedule_edit.html:20 +#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:20 msgid "Maximum Duration" msgstr "" -#: cps/templates/admin.html:178 cps/templates/schedule_edit.html:29 +#: cps/templates/admin.html:194 cps/templates/schedule_edit.html:29 msgid "Generate Thumbnails" msgstr "" -#: cps/templates/admin.html:182 +#: cps/templates/admin.html:198 msgid "Generate series cover thumbnails" msgstr "" -#: cps/templates/admin.html:186 cps/templates/admin.html:208 +#: cps/templates/admin.html:202 cps/templates/admin.html:224 #: cps/templates/schedule_edit.html:37 msgid "Reconnect Calibre Database" msgstr "" -#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 +#: cps/templates/admin.html:206 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" msgstr "" -#: cps/templates/admin.html:197 +#: cps/templates/admin.html:213 msgid "Refresh Thumbnail Cache" msgstr "" -#: cps/templates/admin.html:203 +#: cps/templates/admin.html:219 msgid "Administration" msgstr "Adminisztráció" -#: cps/templates/admin.html:204 +#: cps/templates/admin.html:220 msgid "Download Debug Package" msgstr "" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:221 msgid "View Logs" msgstr "" -#: cps/templates/admin.html:211 +#: cps/templates/admin.html:227 msgid "Restart" msgstr "A Calibre adatbázis újraindítása" -#: cps/templates/admin.html:212 +#: cps/templates/admin.html:228 msgid "Shutdown" msgstr "A Calibre adatbázis leállítása" -#: cps/templates/admin.html:221 +#: cps/templates/admin.html:237 msgid "Version Information" msgstr "" -#: cps/templates/admin.html:225 +#: cps/templates/admin.html:241 msgid "Version" msgstr "Verzió" -#: cps/templates/admin.html:226 +#: cps/templates/admin.html:242 msgid "Details" msgstr "Részletek" -#: cps/templates/admin.html:232 +#: cps/templates/admin.html:248 msgid "Current Version" msgstr "Jelenlegi verzió" -#: cps/templates/admin.html:239 +#: cps/templates/admin.html:255 msgid "Check for Update" msgstr "Frissítés keresése" -#: cps/templates/admin.html:240 +#: cps/templates/admin.html:256 msgid "Perform Update" msgstr "Frissítés elkezdése" -#: cps/templates/admin.html:253 +#: cps/templates/admin.html:269 msgid "Are you sure you want to restart?" msgstr "Valóban újra akarod indítani a Calibre-Web-et?" -#: cps/templates/admin.html:258 cps/templates/admin.html:272 -#: cps/templates/admin.html:292 cps/templates/config_db.html:82 +#: cps/templates/admin.html:274 cps/templates/admin.html:288 +#: cps/templates/admin.html:308 cps/templates/config_db.html:82 msgid "OK" msgstr "OK" -#: cps/templates/admin.html:259 cps/templates/admin.html:273 +#: cps/templates/admin.html:275 cps/templates/admin.html:289 #: cps/templates/book_edit.html:220 cps/templates/book_table.html:162 #: cps/templates/book_table.html:181 cps/templates/book_table.html:201 #: cps/templates/book_table.html:221 cps/templates/book_table.html:241 #: cps/templates/book_table.html:261 cps/templates/book_table.html:316 -#: cps/templates/config_db.html:66 cps/templates/config_edit.html:431 +#: cps/templates/config_db.html:66 cps/templates/config_edit.html:453 #: cps/templates/config_view_edit.html:175 cps/templates/detail.html:350 -#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:98 -#: cps/templates/modal_dialogs.html:116 cps/templates/modal_dialogs.html:134 +#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:100 +#: cps/templates/modal_dialogs.html:118 cps/templates/modal_dialogs.html:136 +#: cps/templates/remote_login_verify.html:16 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 #: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "" -#: cps/templates/admin.html:271 +#: cps/templates/admin.html:287 msgid "Are you sure you want to shutdown?" msgstr "Valóban le akarod állítani a Calibre-Web-et?" -#: cps/templates/admin.html:283 +#: cps/templates/admin.html:299 msgid "Updating, please do not reload this page" msgstr "Frissítés folyamatban, ne töltsd újra az oldalt" @@ -2137,7 +2205,7 @@ msgid "Fetch Metadata" msgstr "Metaadatok beszerzése" #: cps/templates/book_edit.html:219 cps/templates/config_db.html:65 -#: cps/templates/config_edit.html:430 cps/templates/config_view_edit.html:174 +#: cps/templates/config_edit.html:452 cps/templates/config_view_edit.html:174 #: cps/templates/email_edit.html:65 cps/templates/schedule_edit.html:44 #: cps/templates/shelf_edit.html:25 cps/templates/shelf_order.html:41 #: cps/templates/user_edit.html:142 @@ -2509,214 +2577,234 @@ msgstr "" msgid "Allow Reverse Proxy Authentication" msgstr "" -#: cps/templates/config_edit.html:183 -msgid "Login type" +#: cps/templates/config_edit.html:176 +msgid "Security Warning" msgstr "" -#: cps/templates/config_edit.html:185 -msgid "Use Standard Authentication" +#: cps/templates/config_edit.html:177 +msgid "Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled." msgstr "" -#: cps/templates/config_edit.html:187 -msgid "Use LDAP Authentication" +#: cps/templates/config_edit.html:184 +msgid "Reverse Proxy Trusted IPs/CIDRs (Comma Separated)" msgstr "" -#: cps/templates/config_edit.html:190 -msgid "Use OAuth" +#: cps/templates/config_edit.html:189 +msgid "Enable Reverse Proxy Shared Secret Header" msgstr "" #: cps/templates/config_edit.html:197 -msgid "LDAP Server Host Name or IP Address" -msgstr "" - -#: cps/templates/config_edit.html:201 -msgid "LDAP Server Port" +msgid "Reverse Proxy Shared Secret" msgstr "" #: cps/templates/config_edit.html:205 -msgid "LDAP Encryption" +msgid "Login type" msgstr "" -#: cps/templates/config_edit.html:208 -msgid "TLS" +#: cps/templates/config_edit.html:207 +msgid "Use Standard Authentication" msgstr "" #: cps/templates/config_edit.html:209 -msgid "SSL" +msgid "Use LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:213 -msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" +#: cps/templates/config_edit.html:212 +msgid "Use OAuth" msgstr "" -#: cps/templates/config_edit.html:220 -msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" +#: cps/templates/config_edit.html:219 +msgid "LDAP Server Host Name or IP Address" +msgstr "" + +#: cps/templates/config_edit.html:223 +msgid "LDAP Server Port" msgstr "" #: cps/templates/config_edit.html:227 +msgid "LDAP Encryption" +msgstr "" + +#: cps/templates/config_edit.html:230 +msgid "TLS" +msgstr "" + +#: cps/templates/config_edit.html:231 +msgid "SSL" +msgstr "" + +#: cps/templates/config_edit.html:235 +msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" +msgstr "" + +#: cps/templates/config_edit.html:242 +msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" +msgstr "" + +#: cps/templates/config_edit.html:249 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" msgstr "" -#: cps/templates/config_edit.html:236 +#: cps/templates/config_edit.html:258 msgid "LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:260 msgid "Anonymous" msgstr "" -#: cps/templates/config_edit.html:239 +#: cps/templates/config_edit.html:261 msgid "Unauthenticated" msgstr "" -#: cps/templates/config_edit.html:240 +#: cps/templates/config_edit.html:262 msgid "Simple" msgstr "" -#: cps/templates/config_edit.html:245 +#: cps/templates/config_edit.html:267 msgid "LDAP Administrator Username" msgstr "" -#: cps/templates/config_edit.html:251 +#: cps/templates/config_edit.html:273 msgid "LDAP Administrator Password" msgstr "" -#: cps/templates/config_edit.html:256 +#: cps/templates/config_edit.html:278 msgid "LDAP Distinguished Name (DN)" msgstr "" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:282 msgid "LDAP User Object Filter" msgstr "" -#: cps/templates/config_edit.html:265 +#: cps/templates/config_edit.html:287 msgid "LDAP Server is OpenLDAP?" msgstr "" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:289 msgid "Following Settings are Needed For User Import" msgstr "" -#: cps/templates/config_edit.html:269 +#: cps/templates/config_edit.html:291 msgid "LDAP Group Object Filter" msgstr "" -#: cps/templates/config_edit.html:273 +#: cps/templates/config_edit.html:295 msgid "LDAP Group Name" msgstr "" -#: cps/templates/config_edit.html:277 +#: cps/templates/config_edit.html:299 msgid "LDAP Group Members Field" msgstr "" -#: cps/templates/config_edit.html:281 +#: cps/templates/config_edit.html:303 msgid "LDAP Member User Filter Detection" msgstr "" -#: cps/templates/config_edit.html:283 +#: cps/templates/config_edit.html:305 msgid "Autodetect" msgstr "" -#: cps/templates/config_edit.html:284 +#: cps/templates/config_edit.html:306 msgid "Custom Filter" msgstr "" -#: cps/templates/config_edit.html:289 +#: cps/templates/config_edit.html:311 msgid "LDAP Member User Filter" msgstr "" -#: cps/templates/config_edit.html:300 +#: cps/templates/config_edit.html:322 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:303 +#: cps/templates/config_edit.html:325 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:307 +#: cps/templates/config_edit.html:329 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:323 +#: cps/templates/config_edit.html:345 msgid "External binaries" msgstr "Külső futtatható fájlok" -#: cps/templates/config_edit.html:329 +#: cps/templates/config_edit.html:351 msgid "Path to Calibre Binaries" msgstr "" -#: cps/templates/config_edit.html:337 +#: cps/templates/config_edit.html:359 msgid "Calibre E-Book Converter Settings" msgstr "" -#: cps/templates/config_edit.html:340 +#: cps/templates/config_edit.html:362 msgid "Path to Kepubify E-Book Converter" msgstr "" -#: cps/templates/config_edit.html:348 +#: cps/templates/config_edit.html:370 msgid "Location of Unrar binary" msgstr "" -#: cps/templates/config_edit.html:364 +#: cps/templates/config_edit.html:386 msgid "Security Settings" msgstr "" -#: cps/templates/config_edit.html:372 +#: cps/templates/config_edit.html:394 msgid "Limit failed login attempts" msgstr "" -#: cps/templates/config_edit.html:376 +#: cps/templates/config_edit.html:398 msgid "Configure Backend for Limiter" msgstr "" -#: cps/templates/config_edit.html:380 +#: cps/templates/config_edit.html:402 msgid "Options for Limiter Backend" msgstr "" -#: cps/templates/config_edit.html:386 +#: cps/templates/config_edit.html:408 msgid "Check if file extensions matches file content on upload" msgstr "" -#: cps/templates/config_edit.html:389 +#: cps/templates/config_edit.html:411 msgid "Session protection" msgstr "" -#: cps/templates/config_edit.html:391 +#: cps/templates/config_edit.html:413 msgid "Basic" msgstr "" -#: cps/templates/config_edit.html:392 +#: cps/templates/config_edit.html:414 msgid "Strong" msgstr "" -#: cps/templates/config_edit.html:397 +#: cps/templates/config_edit.html:419 msgid "User Password policy" msgstr "" -#: cps/templates/config_edit.html:401 +#: cps/templates/config_edit.html:423 msgid "Minimum password length" msgstr "" -#: cps/templates/config_edit.html:406 +#: cps/templates/config_edit.html:428 msgid "Enforce number" msgstr "" -#: cps/templates/config_edit.html:410 +#: cps/templates/config_edit.html:432 msgid "Enforce lowercase characters" msgstr "" -#: cps/templates/config_edit.html:414 +#: cps/templates/config_edit.html:436 msgid "Enforce uppercase characters" msgstr "" -#: cps/templates/config_edit.html:418 +#: cps/templates/config_edit.html:440 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" msgstr "" -#: cps/templates/config_edit.html:422 +#: cps/templates/config_edit.html:444 msgid "Enforce special characters" msgstr "" @@ -3183,27 +3271,27 @@ msgstr "" msgid "Choose File Location" msgstr "" -#: cps/templates/modal_dialogs.html:81 +#: cps/templates/modal_dialogs.html:82 msgid "type" msgstr "" -#: cps/templates/modal_dialogs.html:82 +#: cps/templates/modal_dialogs.html:83 msgid "name" msgstr "" -#: cps/templates/modal_dialogs.html:83 +#: cps/templates/modal_dialogs.html:84 msgid "size" msgstr "" -#: cps/templates/modal_dialogs.html:89 +#: cps/templates/modal_dialogs.html:90 msgid "Parent Directory" msgstr "" -#: cps/templates/modal_dialogs.html:97 +#: cps/templates/modal_dialogs.html:99 msgid "Select" msgstr "" -#: cps/templates/modal_dialogs.html:133 cps/templates/tasks.html:46 +#: cps/templates/modal_dialogs.html:135 cps/templates/tasks.html:46 msgid "Ok" msgstr "" @@ -3459,6 +3547,31 @@ msgstr "Az első belépés után automatikusan be leszel léptetve ezen az eszk msgid "This verification link will expire in 10 minutes." msgstr "" +#: cps/templates/remote_login_verify.html:4 +msgid "Approve Magic Link Login" +msgstr "" + +#: cps/templates/remote_login_verify.html:5 +msgid "Review the device that requested access before approving this login." +msgstr "" + +#: cps/templates/remote_login_verify.html:7 +msgid "IP address" +msgstr "" + +#: cps/templates/remote_login_verify.html:9 +msgid "Browser" +msgstr "" + +#: cps/templates/remote_login_verify.html:12 +#, python-format +msgid "If you approve this request, the device that started it will be logged in as %(username)s." +msgstr "" + +#: cps/templates/remote_login_verify.html:15 +msgid "Approve Login" +msgstr "" + #: cps/templates/schedule_edit.html:33 msgid "Generate Series Cover Thumbnails" msgstr "" diff --git a/cps/translations/id/LC_MESSAGES/messages.mo b/cps/translations/id/LC_MESSAGES/messages.mo index b11c48f3e29e8ff72dd44ae320c9ff11a6e08ecd..dcf7b885f06bc08111b1aedd39be20b105e12cc1 100644 GIT binary patch delta 11817 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 XnUa{Tkdj%Fnp>Kkn729kSUx)d*Ybts diff --git a/cps/translations/id/LC_MESSAGES/messages.po b/cps/translations/id/LC_MESSAGES/messages.po index fc868d46f..4d29fb70b 100644 --- a/cps/translations/id/LC_MESSAGES/messages.po +++ b/cps/translations/id/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: 2026-08-01 11:42+0200\n" +"POT-Creation-Date: 2026-08-08 16:08+0200\n" "PO-Revision-Date: 2023-01-21 10:00+0700\n" "Last-Translator: Arief Hidayat\n" "Language: id\n" @@ -16,519 +16,558 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" +"Generated-By: Babel 2.18.0\n" #: cps/about.py:85 msgid "Statistics" msgstr "Statistik" -#: cps/admin.py:151 +#: cps/admin.py:154 msgid "Server restarted, please reload page." msgstr "" -#: cps/admin.py:153 +#: cps/admin.py:156 msgid "Performing Server shutdown, please close window." msgstr "" -#: cps/admin.py:161 +#: cps/admin.py:164 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:164 +#: cps/admin.py:167 msgid "Unknown command" msgstr "Perintah tidak diketahui" -#: cps/admin.py:175 +#: cps/admin.py:178 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "" -#: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 -#: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 -#: cps/uploader.py:117 +#: cps/admin.py:211 cps/editbooks.py:825 cps/editbooks.py:875 +#: cps/editbooks.py:1564 cps/templates/remote_login_verify.html:8 +#: cps/templates/remote_login_verify.html:10 cps/updater.py:615 +#: cps/uploader.py:117 cps/uploader.py:126 msgid "Unknown" msgstr "Tidak diketahui" -#: cps/admin.py:233 +#: cps/admin.py:236 msgid "Admin page" msgstr "Halaman Admin" -#: cps/admin.py:253 +#: cps/admin.py:256 msgid "Basic Configuration" msgstr "Pengaturan Dasar" -#: cps/admin.py:291 +#: cps/admin.py:294 msgid "UI Configuration" msgstr "Pengaturan Antarmuka" -#: cps/admin.py:315 cps/admin.py:1002 cps/db.py:809 cps/search.py:150 -#: cps/web.py:750 +#: cps/admin.py:318 cps/admin.py:1005 cps/db.py:809 cps/search.py:150 +#: cps/web.py:752 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "Kolom Kustom No.%(column)d tidak ada di basis data kaliber" -#: cps/admin.py:333 cps/templates/admin.html:51 +#: cps/admin.py:336 cps/templates/admin.html:51 msgid "Edit Users" msgstr "Edit pengguna" -#: cps/admin.py:378 cps/opds.py:559 cps/templates/grid.html:14 +#: cps/admin.py:381 cps/opds.py:559 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Semua" -#: cps/admin.py:401 cps/admin.py:1432 +#: cps/admin.py:404 cps/admin.py:1460 msgid "User not found" msgstr "Pengguna tidak ditemukan" -#: cps/admin.py:415 +#: cps/admin.py:418 #, python-brace-format msgid "{} users deleted successfully" msgstr "{} pengguna berhasil dihapus" -#: cps/admin.py:438 cps/templates/config_view_edit.html:133 +#: cps/admin.py:441 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Tampilkan semua" -#: cps/admin.py:459 cps/admin.py:465 +#: cps/admin.py:462 cps/admin.py:468 msgid "Malformed request" msgstr "Permintaan salah" -#: cps/admin.py:477 cps/admin.py:2078 +#: cps/admin.py:480 cps/admin.py:2156 msgid "Guest Name can't be changed" msgstr "Nama Tamu tidak dapat diganti" -#: cps/admin.py:489 +#: cps/admin.py:492 msgid "Guest can't have this role" msgstr "Tamu tidak dapat memiliki peran ini" -#: cps/admin.py:501 cps/admin.py:2032 +#: cps/admin.py:504 cps/admin.py:2110 msgid "No admin user remaining, can't remove admin role" msgstr "Tidak ada pengguna admin yang tersisa, tidak dapat menghapus peran admin" -#: cps/admin.py:505 cps/admin.py:519 +#: cps/admin.py:508 cps/admin.py:522 msgid "Value has to be true or false" msgstr "Nilai harus benar atau salah" -#: cps/admin.py:507 +#: cps/admin.py:510 msgid "Invalid role" msgstr "Peran tidak valid" -#: cps/admin.py:511 +#: cps/admin.py:514 msgid "Guest can't have this view" msgstr " Tamu tidak dapat mengakses tampilan ini" -#: cps/admin.py:521 +#: cps/admin.py:524 msgid "Invalid view" msgstr " Tampilan tidak valid" -#: cps/admin.py:524 +#: cps/admin.py:527 msgid "Guest's Locale is determined automatically and can't be set" msgstr "Lokal Tamu ditentukan secara otomatis dan tidak dapat disetel" -#: cps/admin.py:528 +#: cps/admin.py:531 msgid "No Valid Locale Given" msgstr "Tidak Ada Lokal yang Valid Diberikan" -#: cps/admin.py:539 +#: cps/admin.py:542 msgid "No Valid Book Language Given" msgstr "Tidak Ada Bahasa Buku yang Valid Diberikan" -#: cps/admin.py:541 cps/editbooks.py:243 cps/editbooks.py:428 -#: cps/editbooks.py:430 +#: cps/admin.py:544 cps/editbooks.py:260 cps/editbooks.py:445 +#: cps/editbooks.py:447 msgid "Parameter not found" msgstr "Parameter tidak ditemukan" -#: cps/admin.py:578 +#: cps/admin.py:581 msgid "Invalid Read Column" msgstr "Kolom Baca Tidak Valid" -#: cps/admin.py:584 +#: cps/admin.py:587 msgid "Invalid Restricted Column" msgstr "Kolom Dibatasi Tidak Valid" -#: cps/admin.py:604 cps/admin.py:1903 +#: cps/admin.py:607 cps/admin.py:1981 msgid "Calibre-Web configuration updated" msgstr "Pengaturan Calibre-Web telah diperbarui" -#: cps/admin.py:616 +#: cps/admin.py:619 msgid "Do you really want to delete the Kobo Token?" msgstr "Apakah Anda yakin ingin menghapus Token Kobo?" -#: cps/admin.py:618 +#: cps/admin.py:621 msgid "Do you really want to delete this domain?" msgstr "Apakah Anda yakin ingin menghapus domain ini?" -#: cps/admin.py:620 +#: cps/admin.py:623 msgid "Do you really want to delete this user?" msgstr "Apakah Anda yakin ingin menghapus pengguna ini?" -#: cps/admin.py:622 +#: cps/admin.py:625 msgid "Do you really want to delete this book?" msgstr "" -#: cps/admin.py:624 +#: cps/admin.py:627 msgid "Are you sure you want to delete this shelf?" msgstr "Apakah Anda yakin ingin menghapus rak ini?" -#: cps/admin.py:626 +#: cps/admin.py:629 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Apakah Anda yakin ingin merubah lokalisasi untuk pengguna yang dipilih?" -#: cps/admin.py:628 +#: cps/admin.py:631 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "Apakah Anda yakin ingin merubah bahasa buku yang terlihat untuk pengguna yang dipilih?" -#: cps/admin.py:630 +#: cps/admin.py:633 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "Apakah Anda yakin ingin merubah peran untuk pengguna yang dipilih?" -#: cps/admin.py:632 +#: cps/admin.py:635 msgid "Are you sure you want to change the archive status for the selected book(s)?" msgstr "" -#: cps/admin.py:634 +#: cps/admin.py:637 msgid "Are you sure you want to change the read status for the selected book(s)?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:639 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Apakah Anda yakin ingin mengubah batasan yang dipilih untuk pengguna yang dipilih?" -#: cps/admin.py:638 +#: cps/admin.py:641 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "Apakah Anda yakin ingin merubah batasan visibilitas untuk pengguna yang dipilih?" -#: cps/admin.py:641 +#: cps/admin.py:644 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Apakah Anda yakin ingin mengubah perilaku sinkronisasi rak untuk pengguna yang dipilih?" -#: cps/admin.py:643 +#: cps/admin.py:646 msgid "Are you sure you want to change Calibre library location?" msgstr "Apakah Anda yakin ingin mengubah lokasi perpustakaan Calibre?" -#: cps/admin.py:645 +#: cps/admin.py:648 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "Calibre-Web akan mencari Sampul yang diperbarui dan memperbarui Thumbnail Sampul, ini mungkin memakan waktu cukup lama?" -#: cps/admin.py:648 +#: cps/admin.py:651 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Apakah Anda yakin ingin menghapus database sinkronisasi Calibre-Web untuk memaksakan sinkronisasi penuh dengan Kobo Reader Anda?" -#: cps/admin.py:891 cps/admin.py:897 cps/admin.py:907 cps/admin.py:917 +#: cps/admin.py:894 cps/admin.py:900 cps/admin.py:910 cps/admin.py:920 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Tolak" -#: cps/admin.py:893 cps/admin.py:899 cps/admin.py:909 cps/admin.py:919 +#: cps/admin.py:896 cps/admin.py:902 cps/admin.py:912 cps/admin.py:922 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Izinkan" -#: cps/admin.py:952 +#: cps/admin.py:955 #, python-brace-format msgid "{} sync entries deleted" msgstr "{} entri sinkronisasi dihapus" -#: cps/admin.py:993 +#: cps/admin.py:996 msgid "Tag not found" msgstr "Tag tidak ditemukan" -#: cps/admin.py:1011 +#: cps/admin.py:1014 msgid "Invalid Action" msgstr "Tindakan Tidak Valid" -#: cps/admin.py:1138 +#: cps/admin.py:1137 +#, python-format +msgid "Invalid reverse proxy trusted IP/CIDR entry: %(entry)s" +msgstr "" + +#: cps/admin.py:1148 +#, python-format +msgid "Invalid %(label)s: %(value)s" +msgstr "" + +#: cps/admin.py:1166 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json Tidak Diatur Untuk Aplikasi Web" -#: cps/admin.py:1183 +#: cps/admin.py:1211 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "Lokasi Logfile tidak Valid, Harap Masukkan Jalur yang Benar" -#: cps/admin.py:1189 +#: cps/admin.py:1217 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "Akses Logfile Catatan tidak Valid, Harap Masukkan Jalur yang Benar" -#: cps/admin.py:1223 +#: cps/admin.py:1251 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Harap Masukkan Provider LDAP, Port, DN dan User Obect Identifier" -#: cps/admin.py:1229 +#: cps/admin.py:1257 msgid "Please Enter a LDAP Service Account and Password" msgstr "Masukkan Akun Layanan LDAP dan Kata Sandi" -#: cps/admin.py:1232 +#: cps/admin.py:1260 msgid "Please Enter a LDAP Service Account" msgstr "Masukkan Akun Layanan LDAP" -#: cps/admin.py:1237 +#: cps/admin.py:1265 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "Filter Objek Grup LDAP Harus Memiliki Satu Pengidentifikasi Format \"%s\"" -#: cps/admin.py:1239 +#: cps/admin.py:1267 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "Filter Objek Grup LDAP Memiliki Tanda kurung yang Tak Berpasangan" -#: cps/admin.py:1243 +#: cps/admin.py:1271 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "Filter Objek Pengguna LDAP harus Memiliki Satu Pengidentifikasi Format \"%s\"" -#: cps/admin.py:1245 +#: cps/admin.py:1273 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "Filter Objek Pengguna LDAP Memiliki Tanda kurung yang Tak Berpasangan" -#: cps/admin.py:1252 +#: cps/admin.py:1280 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "Filter Pengguna Anggota LDAP harus Memiliki Satu Pengenal Format \"%s\"" -#: cps/admin.py:1254 +#: cps/admin.py:1282 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "Filter Pengguna Anggota LDAP Memiliki Tanda Kurung yang Tak Berpasangan" -#: cps/admin.py:1261 +#: cps/admin.py:1289 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "Lokasi LDAP Sertifikat CA, Sertifikat, atau Kunci tidak Valid, Harap Masukkan Jalur yang Benar " -#: cps/admin.py:1292 cps/templates/admin.html:53 +#: cps/admin.py:1320 cps/templates/admin.html:53 msgid "Add New User" msgstr "Tambah Pengguna Baru" -#: cps/admin.py:1301 cps/templates/admin.html:100 +#: cps/admin.py:1329 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Edit Pengaturan Server Email" -#: cps/admin.py:1320 +#: cps/admin.py:1348 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1340 cps/admin.py:1343 cps/admin.py:1728 cps/admin.py:1887 -#: cps/admin.py:1985 cps/admin.py:2106 cps/editbooks.py:169 -#: cps/editbooks.py:755 cps/editbooks.py:1474 cps/shelf.py:90 cps/shelf.py:144 +#: cps/admin.py:1368 cps/admin.py:1371 cps/admin.py:1756 cps/admin.py:1965 +#: cps/admin.py:2063 cps/admin.py:2184 cps/editbooks.py:170 +#: cps/editbooks.py:772 cps/editbooks.py:1518 cps/shelf.py:90 cps/shelf.py:144 #: cps/shelf.py:194 cps/shelf.py:237 cps/shelf.py:287 cps/shelf.py:327 -#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:160 cps/web.py:1526 +#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:161 cps/web.py:1536 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Kesalahan basis data: %(error)s" -#: cps/admin.py:1350 +#: cps/admin.py:1378 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Uji email diantrean untuk dikirim ke %(email), harap periksa Tasks untuk hasilnya" -#: cps/admin.py:1353 +#: cps/admin.py:1381 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Terjadi kesalahan saat mengirim email tes: %(res)s" -#: cps/admin.py:1355 +#: cps/admin.py:1383 msgid "Please configure your e-mail address first..." msgstr "Harap atur alamat email Anda terlebih dahulu.." -#: cps/admin.py:1357 +#: cps/admin.py:1385 msgid "Email Server Settings updated" msgstr "Setelan server email diperbarui" -#: cps/admin.py:1380 cps/templates/admin.html:195 +#: cps/admin.py:1408 cps/templates/admin.html:211 msgid "Edit Scheduled Tasks Settings" msgstr "Edit Pengaturan Tugas Terjadwal" -#: cps/admin.py:1392 +#: cps/admin.py:1420 msgid "Invalid start time for task specified" msgstr "Waktu mulai tidak valid untuk tugas yang ditentukan" -#: cps/admin.py:1397 +#: cps/admin.py:1425 msgid "Invalid duration for task specified" msgstr "Durasi tidak valid untuk tugas yang ditentukan" -#: cps/admin.py:1407 +#: cps/admin.py:1435 msgid "Scheduled tasks settings updated" msgstr "Pengaturan tugas terjadwal diperbarui" -#: cps/admin.py:1417 cps/admin.py:1466 cps/admin.py:2102 cps/web.py:1325 +#: cps/admin.py:1445 cps/admin.py:1494 cps/admin.py:2180 cps/web.py:1335 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Terjadi kesalahan yang tidak diketahui. Coba lagi nanti." -#: cps/admin.py:1421 +#: cps/admin.py:1449 msgid "Settings DB is not Writeable" msgstr "Pengaturan DB tidak dapat ditulisi" -#: cps/admin.py:1451 cps/admin.py:2094 +#: cps/admin.py:1479 cps/admin.py:2172 #, python-format msgid "Edit User %(nick)s" msgstr "Edit pengguna %(nick)s" -#: cps/admin.py:1463 +#: cps/admin.py:1491 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "" -#: cps/admin.py:1469 +#: cps/admin.py:1497 msgid "Oops! Please configure the SMTP mail settings." msgstr "" -#: cps/admin.py:1480 +#: cps/admin.py:1508 msgid "Logfile viewer" msgstr "Penampil berkas log" -#: cps/admin.py:1546 +#: cps/admin.py:1574 msgid "Requesting update package" msgstr "Meminta paket pembaruan" -#: cps/admin.py:1547 +#: cps/admin.py:1575 msgid "Downloading update package" msgstr "Mengunduh paket pembaruan" -#: cps/admin.py:1548 +#: cps/admin.py:1576 msgid "Unzipping update package" msgstr "Mengekstrak paket pembaruan" -#: cps/admin.py:1549 +#: cps/admin.py:1577 msgid "Replacing files" msgstr "Mengganti berkas" -#: cps/admin.py:1550 +#: cps/admin.py:1578 msgid "Database connections are closed" msgstr "Koneksi basis data ditutup" -#: cps/admin.py:1551 +#: cps/admin.py:1579 msgid "Stopping server" msgstr "Menghentikan server" -#: cps/admin.py:1552 +#: cps/admin.py:1580 msgid "Update finished, please press okay and reload page" msgstr "Pembaruan selesai, silakan tekan OK dan muat ulang halaman" -#: cps/admin.py:1553 cps/admin.py:1554 cps/admin.py:1555 cps/admin.py:1556 -#: cps/admin.py:1557 cps/admin.py:1558 +#: cps/admin.py:1581 cps/admin.py:1582 cps/admin.py:1583 cps/admin.py:1584 +#: cps/admin.py:1585 cps/admin.py:1586 msgid "Update failed:" msgstr "Pembaruan gagal:" -#: cps/admin.py:1553 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1581 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "Kesalahan HTTP" -#: cps/admin.py:1554 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1582 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Kesalahan koneksi" -#: cps/admin.py:1555 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1583 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Batas waktu saat membuat koneksi" -#: cps/admin.py:1556 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1584 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Kesalahan umum" -#: cps/admin.py:1557 +#: cps/admin.py:1585 msgid "Update file could not be saved in temp dir" msgstr "Berkas pembaruan tidak dapat disimpan di direktori temp" -#: cps/admin.py:1558 +#: cps/admin.py:1586 msgid "Files could not be replaced during update" msgstr "Berkas tidak dapat diganti selama pembaruan" -#: cps/admin.py:1582 +#: cps/admin.py:1610 msgid "Failed to extract at least One LDAP User" msgstr "Gagal mengekstrak setidaknya Satu Pengguna LDAP" -#: cps/admin.py:1627 +#: cps/admin.py:1655 msgid "Failed to Create at Least One LDAP User" msgstr "Gagal Membuat Sedikitnya Satu Pengguna LDAP" -#: cps/admin.py:1640 +#: cps/admin.py:1668 #, python-format msgid "Error: %(ldaperror)s" msgstr "Kesalahan: %(ldaperror)s" -#: cps/admin.py:1644 +#: cps/admin.py:1672 msgid "Error: No user returned in response of LDAP server" msgstr "Error: Tidak ada pengguna yang dikembalikan sebagai respons dari server LDAP" -#: cps/admin.py:1680 +#: cps/admin.py:1708 msgid "At Least One LDAP User Not Found in Database" msgstr "Setidaknya Satu Pengguna LDAP Tidak Ditemukan di Basis Data" -#: cps/admin.py:1682 +#: cps/admin.py:1710 #, python-brace-format msgid "{} User Successfully Imported" msgstr "{} Pengguna Berhasil Diimpor" -#: cps/admin.py:1740 +#: cps/admin.py:1768 msgid "Books path not valid" msgstr "" -#: cps/admin.py:1746 +#: cps/admin.py:1774 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "Lokasi Basis Data tidak Valid, Harap Masukkan Jalur yang Benar" -#: cps/admin.py:1774 +#: cps/admin.py:1802 msgid "DB is not Writeable" msgstr "Basis Data tidak dapat ditulisi" -#: cps/admin.py:1788 +#: cps/admin.py:1816 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "Lokasi keyfile tidak Valid, Harap Masukkan Jalur yang Benar " -#: cps/admin.py:1792 +#: cps/admin.py:1820 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "Lokasi Sertifikat tidak Valid, Harap Masukkan Jalur yang Benar " -#: cps/admin.py:1872 +#: cps/admin.py:1846 +msgid "Kepubify binary not found" +msgstr "" + +#: cps/admin.py:1894 +msgid "reverse proxy login header name" +msgstr "" + +#: cps/admin.py:1904 +msgid "reverse proxy shared secret header name" +msgstr "" + +#: cps/admin.py:1913 +msgid "Please configure both reverse proxy shared secret header name and secret" +msgstr "" + +#: cps/admin.py:1917 +msgid "Please configure reverse proxy shared secret header name and secret or disable the feature" +msgstr "" + +#: cps/admin.py:1922 +msgid "Please configure at least one trusted reverse proxy IP or CIDR" +msgstr "" + +#: cps/admin.py:1946 msgid "Password length has to be between 1 and 40" msgstr "" -#: cps/admin.py:1926 +#: cps/admin.py:1957 cps/helper.py:1007 +msgid "Please specify a valid UnRar directory" +msgstr "" + +#: cps/admin.py:2004 msgid "Database Settings updated" msgstr "Pengaturan Basis Data diperbarui" -#: cps/admin.py:1934 +#: cps/admin.py:2012 msgid "Database Configuration" msgstr "Pengaturan Basis Data" -#: cps/admin.py:1949 cps/web.py:1295 +#: cps/admin.py:2027 cps/web.py:1305 msgid "Oops! Please complete all fields." msgstr "Harap masukkan seluruh isian!" -#: cps/admin.py:1958 +#: cps/admin.py:2036 msgid "E-mail is not from valid domain" msgstr "Email bukan dari domain yang valid" -#: cps/admin.py:1964 +#: cps/admin.py:2042 msgid "Add new user" msgstr "Tambahkan pengguna baru" -#: cps/admin.py:1975 +#: cps/admin.py:2053 #, python-format msgid "User '%(user)s' created" msgstr "Pengguna '%(user)s' telah dibuat" -#: cps/admin.py:1981 +#: cps/admin.py:2059 msgid "Oops! An account already exists for this Email. or name." msgstr "Ditemukan akun yang ada untuk alamat email atau nama ini." -#: cps/admin.py:2011 +#: cps/admin.py:2089 #, python-format msgid "User '%(nick)s' deleted" msgstr "Pengguna '%(nick)s' telah dihapus" -#: cps/admin.py:2014 +#: cps/admin.py:2092 msgid "Can't delete Guest User" msgstr "Tidak dapat menghapus Pengguna Tamu" -#: cps/admin.py:2017 +#: cps/admin.py:2095 msgid "No admin user remaining, can't delete user" msgstr "Tidak ada pengguna admin tersisa, tidak dapat menghapus pengguna" -#: cps/admin.py:2072 cps/web.py:1475 +#: cps/admin.py:2150 cps/web.py:1485 msgid "Email can't be empty and has to be a valid Email" msgstr "Alamat email tidak boleh kosong dan harus berupa email yang valid" -#: cps/admin.py:2098 +#: cps/admin.py:2176 #, python-format msgid "User '%(nick)s' updated" msgstr "Pengguna '%(nick)s' diperbarui" @@ -541,145 +580,153 @@ msgstr "Pengguna '%(nick)s' diperbarui" msgid "Search" msgstr "Telusuri" -#: cps/converter.py:31 +#: cps/converter.py:32 msgid "not installed" msgstr "belum dipasang" -#: cps/converter.py:32 +#: cps/converter.py:33 msgid "Execution permissions missing" msgstr "Izin eksekusi hilang" -#: cps/db.py:1129 cps/templates/config_edit.html:207 +#: cps/db.py:1129 cps/templates/config_edit.html:229 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:565 cps/web.py:599 cps/web.py:644 cps/web.py:684 cps/web.py:711 -#: cps/web.py:998 cps/web.py:1028 cps/web.py:1073 cps/web.py:1101 -#: cps/web.py:1140 +#: cps/web.py:567 cps/web.py:601 cps/web.py:646 cps/web.py:686 cps/web.py:713 +#: cps/web.py:1000 cps/web.py:1030 cps/web.py:1075 cps/web.py:1103 +#: cps/web.py:1142 msgid "None" msgstr "Tidak ada" -#: cps/editbooks.py:155 +#: cps/editbooks.py:156 #, python-format msgid "File %(file)s uploaded" msgstr "Berkas %(file)s telah diunggah" -#: cps/editbooks.py:184 +#: cps/editbooks.py:185 msgid "Source or destination format for conversion missing" msgstr "Format sumber atau tujuan untuk konversi tidak ada" -#: cps/editbooks.py:192 +#: cps/editbooks.py:189 cps/editbooks.py:197 +msgid "Source format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:201 +msgid "Destination format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:209 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Buku berhasil diantrekan untuk dikonversi ke %(book_format)s" -#: cps/editbooks.py:196 +#: cps/editbooks.py:213 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Terjadi kesalahan saat mengonversi buku ini: %(res)s" -#: cps/editbooks.py:297 +#: cps/editbooks.py:314 msgid "Changes successfully applied" msgstr "" -#: cps/editbooks.py:317 +#: cps/editbooks.py:334 msgid "Value is missing on request" msgstr "" -#: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 -#: cps/editbooks.py:1146 cps/web.py:532 cps/web.py:1567 cps/web.py:1613 -#: cps/web.py:1663 +#: cps/editbooks.py:336 cps/editbooks.py:343 cps/editbooks.py:644 +#: cps/editbooks.py:1170 cps/web.py:534 cps/web.py:1577 cps/web.py:1623 +#: cps/web.py:1673 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Ups! Judul buku yang dipilih tidak tersedia. Berkas tidak ada atau tidak dapat diakses" -#: cps/editbooks.py:673 cps/editbooks.py:1503 +#: cps/editbooks.py:690 cps/editbooks.py:1547 msgid "User has no rights to upload cover" msgstr "Pengguna tidak berhak mengganti sampul" -#: cps/editbooks.py:694 cps/editbooks.py:938 +#: cps/editbooks.py:711 cps/editbooks.py:961 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "IDは大文字小文字を区別しません。元のIDを上書きします" -#: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 +#: cps/editbooks.py:726 cps/editbooks.py:935 cps/editbooks.py:1306 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "'%(langname)s' bukan bahasa yang valid" -#: cps/editbooks.py:737 +#: cps/editbooks.py:754 msgid "Metadata successfully updated" msgstr "Metadata berhasil diperbarui" -#: cps/editbooks.py:760 +#: cps/editbooks.py:777 #, python-brace-format msgid "Error editing book: {}" msgstr "Kesalahan pengeditan buku: {}" -#: cps/editbooks.py:856 +#: cps/editbooks.py:879 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "Buku yang diunggah mungkin ada di perpustakaan, pertimbangkan untuk mengubahnya sebelum mengunggah yang baru: " -#: cps/editbooks.py:950 cps/editbooks.py:1420 +#: cps/editbooks.py:973 cps/editbooks.py:1464 msgid "File type isn't allowed to be uploaded to this server" msgstr "" -#: cps/editbooks.py:956 cps/editbooks.py:1431 +#: cps/editbooks.py:979 cps/editbooks.py:1475 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "Ekstensi berkas '%(ext)s' tidak diizinkan untuk diunggah ke server ini" -#: cps/editbooks.py:960 cps/editbooks.py:1436 +#: cps/editbooks.py:983 cps/editbooks.py:1480 msgid "File to be uploaded must have an extension" msgstr "Berkas yang akan diunggah harus memiliki ekstensi" -#: cps/editbooks.py:968 +#: cps/editbooks.py:992 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "Berkas %(filename)s tidak dapat disimpan ke direktori temp" -#: cps/editbooks.py:988 +#: cps/editbooks.py:1012 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Gagal Memindahkan Berkas Sampul %(file)s: %(error)s" -#: cps/editbooks.py:1041 +#: cps/editbooks.py:1065 msgid "Book Format Successfully Deleted" msgstr "Format Buku Berhasil Dihapus" -#: cps/editbooks.py:1044 cps/editbooks.py:1061 +#: cps/editbooks.py:1068 cps/editbooks.py:1085 msgid "Book Successfully Deleted" msgstr "Buku Berhasil Dihapus" -#: cps/editbooks.py:1065 +#: cps/editbooks.py:1089 msgid "You are missing permissions to delete books" msgstr "Anda tidak memiliki izin untuk menghapus buku" -#: cps/editbooks.py:1139 +#: cps/editbooks.py:1163 #, python-brace-format msgid "Book with id \"{}\" could not be deleted: not found" msgstr "" -#: cps/editbooks.py:1181 +#: cps/editbooks.py:1205 msgid "edit metadata" msgstr "edit metadata" -#: cps/editbooks.py:1234 +#: cps/editbooks.py:1267 #, python-format msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1425 +#: cps/editbooks.py:1469 msgid "User has no rights to upload additional file formats" msgstr "Pengguna tidak memiliki izin untuk mengunggah format berkas tambahan" -#: cps/editbooks.py:1449 +#: cps/editbooks.py:1493 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Gagal membuat jalur %(path)s (Izin ditolak)." -#: cps/editbooks.py:1456 +#: cps/editbooks.py:1500 #, python-format msgid "Failed to store file %(file)s." msgstr "Gagal menyimpan berkas %(file)s." -#: cps/editbooks.py:1481 +#: cps/editbooks.py:1525 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Format berkas %(ext)s ditambahkan ke %(book)s" @@ -690,9 +737,9 @@ msgstr "" #: cps/error_handler.py:108 cps/templates/layout.html:69 #: cps/templates/layout.html:104 cps/templates/login.html:27 -#: cps/templates/register.html:17 cps/web.py:1292 cps/web.py:1296 -#: cps/web.py:1302 cps/web.py:1326 cps/web.py:1330 cps/web.py:1343 -#: cps/web.py:1346 +#: cps/templates/register.html:17 cps/web.py:1302 cps/web.py:1306 +#: cps/web.py:1312 cps/web.py:1336 cps/web.py:1340 cps/web.py:1353 +#: cps/web.py:1356 msgid "Register" msgstr "Daftar" @@ -713,7 +760,7 @@ msgstr "Domain panggilan balik tidak diverifikasi, ikuti langkah-langkah untuk m msgid "%(format)s format not found for book id: %(book)d" msgstr "%(format)s format tidak ditemukan untuk id buku: %(book)d" -#: cps/helper.py:94 cps/tasks/convert.py:91 +#: cps/helper.py:94 cps/tasks/convert.py:92 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s tidak ditemukan di Google Drive: %(fn)s" @@ -899,10 +946,6 @@ msgstr "Hanya berkas jpg/jpeg yang didukung sebagai berkas sampul" msgid "Cover" msgstr "" -#: cps/helper.py:1006 -msgid "UnRar binary file not found" -msgstr "Berkas biner unrar tidak ditemukan" - #: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "" @@ -933,7 +976,7 @@ msgstr "" msgid "Error executing Calibre" msgstr "" -#: cps/helper.py:1154 cps/templates/admin.html:216 +#: cps/helper.py:1154 cps/templates/admin.html:232 msgid "Queue all books for metadata backup" msgstr "Antrian semua buku untuk cadangan metadata" @@ -955,7 +998,7 @@ msgstr "Daftar dengan %(provider)s" msgid "This %(oauth)s account is already linked to a different user" msgstr "" -#: cps/oauth_bb.py:147 cps/remotelogin.py:131 +#: cps/oauth_bb.py:147 cps/remotelogin.py:150 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "Anda sekarang login sebagai: %(nickname)s" @@ -1023,25 +1066,29 @@ msgstr "Kesalahan Google OAuth: {}" msgid "{} Stars" msgstr "{}★" -#: cps/remotelogin.py:63 cps/templates/layout.html:68 -#: cps/templates/layout.html:103 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1361 -msgid "Login" -msgstr "Masuk" - -#: cps/remotelogin.py:75 cps/remotelogin.py:109 +#: cps/remotelogin.py:46 cps/remotelogin.py:128 msgid "Token not found" msgstr "Token tidak ditemukan" -#: cps/remotelogin.py:84 cps/remotelogin.py:117 +#: cps/remotelogin.py:55 cps/remotelogin.py:136 msgid "Token has expired" msgstr "Token telah kedaluwarsa" -#: cps/remotelogin.py:93 +#: cps/remotelogin.py:86 cps/remotelogin.py:112 cps/templates/layout.html:68 +#: cps/templates/layout.html:103 cps/templates/login.html:4 +#: cps/templates/login.html:21 cps/web.py:1371 +msgid "Login" +msgstr "Masuk" + +#: cps/remotelogin.py:100 +msgid "Token already approved" +msgstr "" + +#: cps/remotelogin.py:108 msgid "Success! Please return to your device" msgstr "Berhasil! Silakan kembali ke perangkat Anda" -#: cps/render_template.py:41 cps/web.py:421 +#: cps/render_template.py:41 cps/web.py:423 msgid "Books" msgstr "Buku" @@ -1066,7 +1113,7 @@ msgstr "Buku yang Diunduh" msgid "Show Downloaded Books" msgstr "Tampilkan Buku yang Diunduh" -#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:436 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:438 msgid "Top Rated Books" msgstr "Buku Berperingkat Teratas" @@ -1075,7 +1122,7 @@ msgid "Show Top Rated Books" msgstr "Tampilkan Buku Berperingkat Teratas" #: cps/render_template.py:61 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:769 +#: cps/templates/index.xml:67 cps/web.py:771 msgid "Read Books" msgstr "Buku Telah Dibaca" @@ -1084,7 +1131,7 @@ msgid "Show Read and Unread" msgstr "" #: cps/render_template.py:65 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:772 +#: cps/templates/index.xml:74 cps/web.py:774 msgid "Unread Books" msgstr "Buku yang Belum Dibaca" @@ -1102,7 +1149,7 @@ msgid "Show Random Books" msgstr "Tampilkan Buku Acak" #: cps/render_template.py:71 cps/templates/book_table.html:93 -#: cps/templates/index.xml:97 cps/web.py:1144 +#: cps/templates/index.xml:97 cps/web.py:1146 msgid "Categories" msgstr "Kategori" @@ -1112,7 +1159,7 @@ msgstr "" #: cps/render_template.py:74 cps/templates/book_edit.html:86 #: cps/templates/book_table.html:94 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1034 cps/web.py:1046 +#: cps/templates/search_form.html:70 cps/web.py:1036 cps/web.py:1048 msgid "Series" msgstr "Seri" @@ -1130,7 +1177,7 @@ msgid "Show Author Section" msgstr "" #: cps/render_template.py:81 cps/templates/book_table.html:98 -#: cps/templates/index.xml:88 cps/web.py:1002 +#: cps/templates/index.xml:88 cps/web.py:1004 msgid "Publishers" msgstr "Penerbit" @@ -1140,7 +1187,7 @@ msgstr "" #: cps/render_template.py:84 cps/templates/book_table.html:96 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1116 +#: cps/web.py:1118 msgid "Languages" msgstr "Bahasa" @@ -1164,7 +1211,7 @@ msgstr "Format berkas" msgid "Show File Formats Section" msgstr "" -#: cps/render_template.py:95 cps/web.py:795 +#: cps/render_template.py:95 cps/web.py:797 msgid "Archived Books" msgstr "Buku yang Diarsipkan" @@ -1172,7 +1219,7 @@ msgstr "Buku yang Diarsipkan" msgid "Show Archived Books" msgstr "" -#: cps/render_template.py:100 cps/web.py:831 +#: cps/render_template.py:100 cps/web.py:833 msgid "Books List" msgstr "Daftar Buku" @@ -1405,150 +1452,154 @@ msgstr "Pembaruan tersedia. Klik tombol di bawah untuk memperbarui ke versi: %(v msgid "No release information available" msgstr "Tidak ada informasi rilis yang tersedia" -#: cps/templates/index.html:6 cps/web.py:448 +#: cps/templates/index.html:6 cps/web.py:450 msgid "Discover (Random Books)" msgstr "Temukan (Buku Acak)" -#: cps/web.py:484 +#: cps/web.py:486 msgid "Hot Books (Most Downloaded)" msgstr "Buku Populer (Paling Banyak Diunduh)" -#: cps/web.py:515 +#: cps/web.py:517 #, python-format msgid "Downloaded books by %(user)s" msgstr "Buku telah diunduh oleh %(user)s" -#: cps/web.py:548 +#: cps/web.py:550 #, python-format msgid "Author: %(name)s" msgstr "Penulis: %(name)s" -#: cps/web.py:584 +#: cps/web.py:586 #, python-format msgid "Publisher: %(name)s" msgstr "Penerbit: %(name)s" -#: cps/web.py:612 +#: cps/web.py:614 #, python-format msgid "Series: %(serie)s" msgstr "Seri: %(serie)s" -#: cps/web.py:626 +#: cps/web.py:628 msgid "Rating: None" msgstr "Peringkat: Tidak ada" -#: cps/web.py:635 +#: cps/web.py:637 #, python-format msgid "Rating: %(rating)s stars" msgstr "Peringkat: %(rating)s★" -#: cps/web.py:666 +#: cps/web.py:668 #, python-format msgid "File format: %(format)s" msgstr "Format berkas: %(format)s" -#: cps/web.py:701 +#: cps/web.py:703 #, python-format msgid "Category: %(name)s" msgstr "Kategori: %(name)s" -#: cps/web.py:730 +#: cps/web.py:732 #, python-format msgid "Language: %(name)s" msgstr "Bahasa: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:974 +#: cps/templates/admin.html:16 cps/web.py:976 msgid "Downloads" msgstr "Unduhan" -#: cps/web.py:1076 +#: cps/web.py:1078 msgid "Ratings list" msgstr "Daftar peringkat" -#: cps/web.py:1103 +#: cps/web.py:1105 msgid "File formats list" msgstr "Daftar format berkas" -#: cps/web.py:1264 +#: cps/web.py:1272 +msgid "Book format not supported" +msgstr "" + +#: cps/web.py:1274 msgid "Please configure the SMTP mail settings first..." msgstr "" -#: cps/web.py:1270 +#: cps/web.py:1280 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Buku telah diantrikan untuk dikirim ke %(eReadermail)s" -#: cps/web.py:1273 +#: cps/web.py:1283 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Oops! Terjadi kesalahan saat mengirim buku: %(res)s" -#: cps/web.py:1275 +#: cps/web.py:1285 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "" -#: cps/web.py:1291 cps/web.py:1342 +#: cps/web.py:1301 cps/web.py:1352 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "Server email belum diatur, silakan hubungi administrator!" -#: cps/web.py:1328 +#: cps/web.py:1338 msgid "Oops! Your Email is not allowed." msgstr "Alamat email Anda tidak diizinkan untuk mendaftar" -#: cps/web.py:1331 +#: cps/web.py:1341 msgid "Success! Confirmation Email has been sent." msgstr "E-mail konfirmasi telah dikirimkan ke alamat email Anda." -#: cps/web.py:1376 cps/web.py:1390 +#: cps/web.py:1386 cps/web.py:1400 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1399 +#: cps/web.py:1409 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1406 +#: cps/web.py:1416 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1411 +#: cps/web.py:1421 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1415 cps/web.py:1440 +#: cps/web.py:1425 cps/web.py:1450 msgid "Wrong Username or Password" msgstr "" -#: cps/web.py:1422 +#: cps/web.py:1432 msgid "New Password was sent to your email address" msgstr "" -#: cps/web.py:1426 +#: cps/web.py:1436 msgid "An unknown error occurred. Please try again later." msgstr "" -#: cps/web.py:1428 +#: cps/web.py:1438 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1436 +#: cps/web.py:1446 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1501 cps/web.py:1551 +#: cps/web.py:1511 cps/web.py:1561 #, python-format msgid "%(name)s's Profile" msgstr "Profil %(name)s" -#: cps/web.py:1517 +#: cps/web.py:1527 msgid "Success! Profile Updated" msgstr "" -#: cps/web.py:1521 +#: cps/web.py:1531 msgid "Oops! An account already exists for this Email." msgstr "Ditemukan akun yang ada untuk alamat email ini" @@ -1560,46 +1611,46 @@ msgstr "Tidak ditemukan berkas gmail.json yang valid dengan informasi OAuth" msgid "Delete temp folder contents" msgstr "" -#: cps/tasks/convert.py:112 +#: cps/tasks/convert.py:113 #, python-format msgid "%(book)s send to E-Reader" msgstr "%%(buku)s telah dikirim ke E-Reader" -#: cps/tasks/convert.py:177 +#: cps/tasks/convert.py:180 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre ebook-convert %(tool)s tidak ditemukan" -#: cps/tasks/convert.py:211 +#: cps/tasks/convert.py:214 #, python-format msgid "%(format)s format not found on disk" msgstr "%(format)s format tidak ditemukan dalam disk" -#: cps/tasks/convert.py:215 +#: cps/tasks/convert.py:218 msgid "Ebook converter failed with unknown error" msgstr "Konverter ebook gagal dengan kesalahan yang tidak diketahui." -#: cps/tasks/convert.py:234 +#: cps/tasks/convert.py:237 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kebupify-converter gagal: %(error)s" -#: cps/tasks/convert.py:254 +#: cps/tasks/convert.py:257 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Berkas yang telah dikonversi tidak ditemukan atau terdapat duplikat dalam folder %(folder)s" -#: cps/tasks/convert.py:291 cps/tasks/convert.py:342 +#: cps/tasks/convert.py:294 cps/tasks/convert.py:345 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre gagal dengan kesalahan: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:322 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Ebook-converter gagal: %(error)s" -#: cps/tasks/convert.py:347 +#: cps/tasks/convert.py:350 msgid "Convert" msgstr "Konversi" @@ -1685,7 +1736,7 @@ msgstr "Edit" #: cps/templates/admin.html:25 cps/templates/book_edit.html:17 #: cps/templates/book_table.html:131 cps/templates/book_table.html:180 -#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:115 +#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:117 #: cps/templates/user_edit.html:67 cps/templates/user_table.html:149 msgid "Delete" msgstr "Hapus" @@ -1775,128 +1826,145 @@ msgstr "Login Jarak Jauh dengan Magic Link" msgid "Reverse Proxy Login" msgstr "Login Reverse Proxy" -#: cps/templates/admin.html:154 cps/templates/config_edit.html:176 +#: cps/templates/admin.html:154 cps/templates/config_edit.html:180 msgid "Reverse Proxy Header Name" msgstr "Nama Header Reverse Proxy" -#: cps/templates/admin.html:159 +#: cps/templates/admin.html:158 +msgid "Reverse Proxy Trusted IPs/CIDRs" +msgstr "" + +#: cps/templates/admin.html:162 cps/templates/config_edit.html:193 +msgid "Reverse Proxy Shared Secret Header Name" +msgstr "" + +#: cps/templates/admin.html:166 +msgid "Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/admin.html:170 +msgid "Reverse Proxy Shared Secret Configured" +msgstr "" + +#: cps/templates/admin.html:175 msgid "Edit Calibre Database Configuration" msgstr "Edit Pengaturan Basis Data Caliber" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:176 msgid "Edit Basic Configuration" msgstr "Edit Pengaturan Dasar" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:177 msgid "Edit UI Configuration" msgstr "Edit Pengaturan Antarmuka" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:183 msgid "Scheduled Tasks" msgstr "Tugas Terjadwal" -#: cps/templates/admin.html:170 cps/templates/schedule_edit.html:12 +#: cps/templates/admin.html:186 cps/templates/schedule_edit.html:12 #: cps/templates/tasks.html:18 msgid "Start Time" msgstr "Waktu saat tugas mulai dijalankan" -#: cps/templates/admin.html:174 cps/templates/schedule_edit.html:20 +#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:20 msgid "Maximum Duration" msgstr "Durasi tugas maksimum" -#: cps/templates/admin.html:178 cps/templates/schedule_edit.html:29 +#: cps/templates/admin.html:194 cps/templates/schedule_edit.html:29 msgid "Generate Thumbnails" msgstr "Buat thumbnail sampul buku" -#: cps/templates/admin.html:182 +#: cps/templates/admin.html:198 msgid "Generate series cover thumbnails" msgstr "Buat thumbnail sampul seri" -#: cps/templates/admin.html:186 cps/templates/admin.html:208 +#: cps/templates/admin.html:202 cps/templates/admin.html:224 #: cps/templates/schedule_edit.html:37 msgid "Reconnect Calibre Database" msgstr "Sambungkan kembali ke Perpustakaan Caliber" -#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 +#: cps/templates/admin.html:206 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" msgstr "" -#: cps/templates/admin.html:197 +#: cps/templates/admin.html:213 msgid "Refresh Thumbnail Cache" msgstr "Segarkan Cache Thumbnail Sampul" -#: cps/templates/admin.html:203 +#: cps/templates/admin.html:219 msgid "Administration" msgstr "Administrasi" -#: cps/templates/admin.html:204 +#: cps/templates/admin.html:220 msgid "Download Debug Package" msgstr "Unduh Paket Debug" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:221 msgid "View Logs" msgstr "Tampilkan Log" -#: cps/templates/admin.html:211 +#: cps/templates/admin.html:227 msgid "Restart" msgstr "Mulai Ulang" -#: cps/templates/admin.html:212 +#: cps/templates/admin.html:228 msgid "Shutdown" msgstr "Matikan" -#: cps/templates/admin.html:221 +#: cps/templates/admin.html:237 msgid "Version Information" msgstr "Informasi Versi" -#: cps/templates/admin.html:225 +#: cps/templates/admin.html:241 msgid "Version" msgstr "Versi" -#: cps/templates/admin.html:226 +#: cps/templates/admin.html:242 msgid "Details" msgstr "Detail" -#: cps/templates/admin.html:232 +#: cps/templates/admin.html:248 msgid "Current Version" msgstr "Versi saat ini" -#: cps/templates/admin.html:239 +#: cps/templates/admin.html:255 msgid "Check for Update" msgstr "Periksa Pembaruan" -#: cps/templates/admin.html:240 +#: cps/templates/admin.html:256 msgid "Perform Update" msgstr "Lakukan Pembaruan" -#: cps/templates/admin.html:253 +#: cps/templates/admin.html:269 msgid "Are you sure you want to restart?" msgstr "Apa Anda yakin untuk memulai ulang?" -#: cps/templates/admin.html:258 cps/templates/admin.html:272 -#: cps/templates/admin.html:292 cps/templates/config_db.html:82 +#: cps/templates/admin.html:274 cps/templates/admin.html:288 +#: cps/templates/admin.html:308 cps/templates/config_db.html:82 msgid "OK" msgstr "OK" -#: cps/templates/admin.html:259 cps/templates/admin.html:273 +#: cps/templates/admin.html:275 cps/templates/admin.html:289 #: cps/templates/book_edit.html:220 cps/templates/book_table.html:162 #: cps/templates/book_table.html:181 cps/templates/book_table.html:201 #: cps/templates/book_table.html:221 cps/templates/book_table.html:241 #: cps/templates/book_table.html:261 cps/templates/book_table.html:316 -#: cps/templates/config_db.html:66 cps/templates/config_edit.html:431 +#: cps/templates/config_db.html:66 cps/templates/config_edit.html:453 #: cps/templates/config_view_edit.html:175 cps/templates/detail.html:350 -#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:98 -#: cps/templates/modal_dialogs.html:116 cps/templates/modal_dialogs.html:134 +#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:100 +#: cps/templates/modal_dialogs.html:118 cps/templates/modal_dialogs.html:136 +#: cps/templates/remote_login_verify.html:16 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 #: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Batal" -#: cps/templates/admin.html:271 +#: cps/templates/admin.html:287 msgid "Are you sure you want to shutdown?" msgstr "Apa Anda yakin untuk mematikan layanan?" -#: cps/templates/admin.html:283 +#: cps/templates/admin.html:299 msgid "Updating, please do not reload this page" msgstr "Memperbarui, jangan memuat ulang halaman ini" @@ -2137,7 +2205,7 @@ msgid "Fetch Metadata" msgstr "Ambil Metadata" #: cps/templates/book_edit.html:219 cps/templates/config_db.html:65 -#: cps/templates/config_edit.html:430 cps/templates/config_view_edit.html:174 +#: cps/templates/config_edit.html:452 cps/templates/config_view_edit.html:174 #: cps/templates/email_edit.html:65 cps/templates/schedule_edit.html:44 #: cps/templates/shelf_edit.html:25 cps/templates/shelf_order.html:41 #: cps/templates/user_edit.html:142 @@ -2509,214 +2577,234 @@ msgstr "" msgid "Allow Reverse Proxy Authentication" msgstr "Izinkan Reverse Proxy Authentication" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:176 +msgid "Security Warning" +msgstr "" + +#: cps/templates/config_edit.html:177 +msgid "Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled." +msgstr "" + +#: cps/templates/config_edit.html:184 +msgid "Reverse Proxy Trusted IPs/CIDRs (Comma Separated)" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "Enable Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/config_edit.html:197 +msgid "Reverse Proxy Shared Secret" +msgstr "" + +#: cps/templates/config_edit.html:205 msgid "Login type" msgstr "Tipe Login" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:207 msgid "Use Standard Authentication" msgstr "Gunakan Otentikasi Standar" -#: cps/templates/config_edit.html:187 +#: cps/templates/config_edit.html:209 msgid "Use LDAP Authentication" msgstr "Gunakan Otentikasi LDAP" -#: cps/templates/config_edit.html:190 +#: cps/templates/config_edit.html:212 msgid "Use OAuth" msgstr "Gunakan Oauth" -#: cps/templates/config_edit.html:197 +#: cps/templates/config_edit.html:219 msgid "LDAP Server Host Name or IP Address" msgstr "Nama Host Server atau Alamat IP LDAP" -#: cps/templates/config_edit.html:201 +#: cps/templates/config_edit.html:223 msgid "LDAP Server Port" msgstr "Port Server LDAP" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:227 msgid "LDAP Encryption" msgstr "Enkripsi LDAP" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:230 msgid "TLS" msgstr "TLS" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:231 msgid "SSL" msgstr "SSL" -#: cps/templates/config_edit.html:213 +#: cps/templates/config_edit.html:235 msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" msgstr "Jalur CACertificate LDAP (Hanya diperlukan untuk Autentikasi Sertifikat Klien)" -#: cps/templates/config_edit.html:220 +#: cps/templates/config_edit.html:242 msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" msgstr "Jalur Sertifikat LDAP (Hanya diperlukan untuk Otentikasi Sertifikat Klien)" -#: cps/templates/config_edit.html:227 +#: cps/templates/config_edit.html:249 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" msgstr "Jalur Keyfile LDAP (Hanya diperlukan untuk Otentikasi Sertifikat Klien)" -#: cps/templates/config_edit.html:236 +#: cps/templates/config_edit.html:258 msgid "LDAP Authentication" msgstr "Otentikasi LDAP" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:260 msgid "Anonymous" msgstr "Anonim" -#: cps/templates/config_edit.html:239 +#: cps/templates/config_edit.html:261 msgid "Unauthenticated" msgstr "Tidak diautentikasi" -#: cps/templates/config_edit.html:240 +#: cps/templates/config_edit.html:262 msgid "Simple" msgstr "Sederhana" -#: cps/templates/config_edit.html:245 +#: cps/templates/config_edit.html:267 msgid "LDAP Administrator Username" msgstr "Nama Pengguna Administrator LDAP" -#: cps/templates/config_edit.html:251 +#: cps/templates/config_edit.html:273 msgid "LDAP Administrator Password" msgstr "Kata Sandi Administrator LDAP" -#: cps/templates/config_edit.html:256 +#: cps/templates/config_edit.html:278 msgid "LDAP Distinguished Name (DN)" msgstr "Distinguished Name (DN) LDAP" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:282 msgid "LDAP User Object Filter" msgstr "Filter Objek Pengguna LDAP" -#: cps/templates/config_edit.html:265 +#: cps/templates/config_edit.html:287 msgid "LDAP Server is OpenLDAP?" msgstr "Server LDAP adalah OpenLDAP?" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:289 msgid "Following Settings are Needed For User Import" msgstr "Pengaturan Berikut Diperlukan Untuk Impor Pengguna" -#: cps/templates/config_edit.html:269 +#: cps/templates/config_edit.html:291 msgid "LDAP Group Object Filter" msgstr "Filter Objek Grup LDAP" -#: cps/templates/config_edit.html:273 +#: cps/templates/config_edit.html:295 msgid "LDAP Group Name" msgstr "Nama Grup LDAP" -#: cps/templates/config_edit.html:277 +#: cps/templates/config_edit.html:299 msgid "LDAP Group Members Field" msgstr "Bidang Group Members LDAP" -#: cps/templates/config_edit.html:281 +#: cps/templates/config_edit.html:303 msgid "LDAP Member User Filter Detection" msgstr "Deteksi Filter Pengguna Anggota LDAP" -#: cps/templates/config_edit.html:283 +#: cps/templates/config_edit.html:305 msgid "Autodetect" msgstr "Deteksi otomatis" -#: cps/templates/config_edit.html:284 +#: cps/templates/config_edit.html:306 msgid "Custom Filter" msgstr "Filter Kustom" -#: cps/templates/config_edit.html:289 +#: cps/templates/config_edit.html:311 msgid "LDAP Member User Filter" msgstr "Filter Pengguna Anggota LDAP" -#: cps/templates/config_edit.html:300 +#: cps/templates/config_edit.html:322 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "Dapatkan %(provider)s Kredensial OAuth" -#: cps/templates/config_edit.html:303 +#: cps/templates/config_edit.html:325 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "ID Klien %(provider)s OAuth" -#: cps/templates/config_edit.html:307 +#: cps/templates/config_edit.html:329 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "Client Secret %(provider)s OAuth" -#: cps/templates/config_edit.html:323 +#: cps/templates/config_edit.html:345 msgid "External binaries" msgstr "Binari Eksternal" -#: cps/templates/config_edit.html:329 +#: cps/templates/config_edit.html:351 msgid "Path to Calibre Binaries" msgstr "" -#: cps/templates/config_edit.html:337 +#: cps/templates/config_edit.html:359 msgid "Calibre E-Book Converter Settings" msgstr "Pengaturan Konverter E-Book Caliber" -#: cps/templates/config_edit.html:340 +#: cps/templates/config_edit.html:362 msgid "Path to Kepubify E-Book Converter" msgstr "Jalur ke Konverter E-Book Kepubify" -#: cps/templates/config_edit.html:348 +#: cps/templates/config_edit.html:370 msgid "Location of Unrar binary" msgstr "" -#: cps/templates/config_edit.html:364 +#: cps/templates/config_edit.html:386 msgid "Security Settings" msgstr "" -#: cps/templates/config_edit.html:372 +#: cps/templates/config_edit.html:394 msgid "Limit failed login attempts" msgstr "" -#: cps/templates/config_edit.html:376 +#: cps/templates/config_edit.html:398 msgid "Configure Backend for Limiter" msgstr "" -#: cps/templates/config_edit.html:380 +#: cps/templates/config_edit.html:402 msgid "Options for Limiter Backend" msgstr "" -#: cps/templates/config_edit.html:386 +#: cps/templates/config_edit.html:408 msgid "Check if file extensions matches file content on upload" msgstr "" -#: cps/templates/config_edit.html:389 +#: cps/templates/config_edit.html:411 msgid "Session protection" msgstr "" -#: cps/templates/config_edit.html:391 +#: cps/templates/config_edit.html:413 msgid "Basic" msgstr "" -#: cps/templates/config_edit.html:392 +#: cps/templates/config_edit.html:414 msgid "Strong" msgstr "" -#: cps/templates/config_edit.html:397 +#: cps/templates/config_edit.html:419 msgid "User Password policy" msgstr "" -#: cps/templates/config_edit.html:401 +#: cps/templates/config_edit.html:423 msgid "Minimum password length" msgstr "" -#: cps/templates/config_edit.html:406 +#: cps/templates/config_edit.html:428 msgid "Enforce number" msgstr "" -#: cps/templates/config_edit.html:410 +#: cps/templates/config_edit.html:432 msgid "Enforce lowercase characters" msgstr "" -#: cps/templates/config_edit.html:414 +#: cps/templates/config_edit.html:436 msgid "Enforce uppercase characters" msgstr "" -#: cps/templates/config_edit.html:418 +#: cps/templates/config_edit.html:440 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" msgstr "" -#: cps/templates/config_edit.html:422 +#: cps/templates/config_edit.html:444 msgid "Enforce special characters" msgstr "" @@ -3183,27 +3271,27 @@ msgstr "Buku harus diarsipkan terlebih dahulu dan perangkat disinkronkan sebelum msgid "Choose File Location" msgstr "Pilih Lokasi Berkas" -#: cps/templates/modal_dialogs.html:81 +#: cps/templates/modal_dialogs.html:82 msgid "type" msgstr "tipe" -#: cps/templates/modal_dialogs.html:82 +#: cps/templates/modal_dialogs.html:83 msgid "name" msgstr "nama" -#: cps/templates/modal_dialogs.html:83 +#: cps/templates/modal_dialogs.html:84 msgid "size" msgstr "ukuran" -#: cps/templates/modal_dialogs.html:89 +#: cps/templates/modal_dialogs.html:90 msgid "Parent Directory" msgstr "Direktori Induk" -#: cps/templates/modal_dialogs.html:97 +#: cps/templates/modal_dialogs.html:99 msgid "Select" msgstr "Pilih" -#: cps/templates/modal_dialogs.html:133 cps/templates/tasks.html:46 +#: cps/templates/modal_dialogs.html:135 cps/templates/tasks.html:46 msgid "Ok" msgstr "Ok" @@ -3459,6 +3547,31 @@ msgstr "Setelah diverifikasi, Anda akan secara otomatis masuk ke perangkat ini." msgid "This verification link will expire in 10 minutes." msgstr "Tautan verifikasi ini akan kedaluwarsa dalam 10 menit." +#: cps/templates/remote_login_verify.html:4 +msgid "Approve Magic Link Login" +msgstr "" + +#: cps/templates/remote_login_verify.html:5 +msgid "Review the device that requested access before approving this login." +msgstr "" + +#: cps/templates/remote_login_verify.html:7 +msgid "IP address" +msgstr "" + +#: cps/templates/remote_login_verify.html:9 +msgid "Browser" +msgstr "" + +#: cps/templates/remote_login_verify.html:12 +#, python-format +msgid "If you approve this request, the device that started it will be logged in as %(username)s." +msgstr "" + +#: cps/templates/remote_login_verify.html:15 +msgid "Approve Login" +msgstr "" + #: cps/templates/schedule_edit.html:33 msgid "Generate Series Cover Thumbnails" msgstr "Hasilkan Thumbnail Sampul Seri" diff --git a/cps/translations/it/LC_MESSAGES/messages.mo b/cps/translations/it/LC_MESSAGES/messages.mo index 88d1e2671c64baeae777d7ef3963875e4f668d59..2f3bafc0de7f7c14409833c8d2adb0854936fa34 100644 GIT binary patch delta 14190 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 n&JCm-tTi)VAv6zUP+oqXLP=46Sz<~4\n" "Language: it\n" @@ -16,519 +16,558 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" +"Generated-By: Babel 2.18.0\n" #: cps/about.py:85 msgid "Statistics" msgstr "Statistiche" -#: cps/admin.py:151 +#: cps/admin.py:154 msgid "Server restarted, please reload page." msgstr "Server riavviato, ricarica la pagina." -#: cps/admin.py:153 +#: cps/admin.py:156 msgid "Performing Server shutdown, please close window." msgstr "Esecuzione dell'arresto del server, chiudi la finestra." -#: cps/admin.py:161 +#: cps/admin.py:164 msgid "Success! Database Reconnected" msgstr "Tutto OK! Database riconnesso" -#: cps/admin.py:164 +#: cps/admin.py:167 msgid "Unknown command" msgstr "Comando sconosciuto" -#: cps/admin.py:175 +#: cps/admin.py:178 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "Tutto OK! Libri in coda per il backup dei metadati, controlla le attività per il risultato" -#: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 -#: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 -#: cps/uploader.py:117 +#: cps/admin.py:211 cps/editbooks.py:825 cps/editbooks.py:875 +#: cps/editbooks.py:1564 cps/templates/remote_login_verify.html:8 +#: cps/templates/remote_login_verify.html:10 cps/updater.py:615 +#: cps/uploader.py:117 cps/uploader.py:126 msgid "Unknown" msgstr "Sconosciuto" -#: cps/admin.py:233 +#: cps/admin.py:236 msgid "Admin page" msgstr "Pagina di amministrazione" -#: cps/admin.py:253 +#: cps/admin.py:256 msgid "Basic Configuration" msgstr "Configurazione di base" -#: cps/admin.py:291 +#: cps/admin.py:294 msgid "UI Configuration" msgstr "Configurazione dell'interfaccia utente" -#: cps/admin.py:315 cps/admin.py:1002 cps/db.py:809 cps/search.py:150 -#: cps/web.py:750 +#: cps/admin.py:318 cps/admin.py:1005 cps/db.py:809 cps/search.py:150 +#: cps/web.py:752 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "La colonna personalizzata no.%(column)d non esiste nel database di Calibre" -#: cps/admin.py:333 cps/templates/admin.html:51 +#: cps/admin.py:336 cps/templates/admin.html:51 msgid "Edit Users" msgstr "Modifica utenti" -#: cps/admin.py:378 cps/opds.py:559 cps/templates/grid.html:14 +#: cps/admin.py:381 cps/opds.py:559 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Tutti" -#: cps/admin.py:401 cps/admin.py:1432 +#: cps/admin.py:404 cps/admin.py:1460 msgid "User not found" msgstr "Utente non trovato" -#: cps/admin.py:415 +#: cps/admin.py:418 #, python-brace-format msgid "{} users deleted successfully" msgstr "utenti eliminati correttamente" -#: cps/admin.py:438 cps/templates/config_view_edit.html:133 +#: cps/admin.py:441 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Mostra tutto" -#: cps/admin.py:459 cps/admin.py:465 +#: cps/admin.py:462 cps/admin.py:468 msgid "Malformed request" msgstr "Richiesta non valida" -#: cps/admin.py:477 cps/admin.py:2078 +#: cps/admin.py:480 cps/admin.py:2156 msgid "Guest Name can't be changed" msgstr "Il nome dell'utente Guest (ospite) non può essere modificato" -#: cps/admin.py:489 +#: cps/admin.py:492 msgid "Guest can't have this role" msgstr "L'utente Guest (ospite) non può avere questo ruolo" -#: cps/admin.py:501 cps/admin.py:2032 +#: cps/admin.py:504 cps/admin.py:2110 msgid "No admin user remaining, can't remove admin role" msgstr "Non rimarrebbe nessun utente amministratore, non è possibile rimuovere il ruolo di amministratore" -#: cps/admin.py:505 cps/admin.py:519 +#: cps/admin.py:508 cps/admin.py:522 msgid "Value has to be true or false" msgstr "Il valore deve essere vero o falso" -#: cps/admin.py:507 +#: cps/admin.py:510 msgid "Invalid role" msgstr "Ruolo non valido" -#: cps/admin.py:511 +#: cps/admin.py:514 msgid "Guest can't have this view" msgstr "L'utente Guest (ospite) non può visualizzare questa schermata" -#: cps/admin.py:521 +#: cps/admin.py:524 msgid "Invalid view" msgstr "Visualizzazione non valida" -#: cps/admin.py:524 +#: cps/admin.py:527 msgid "Guest's Locale is determined automatically and can't be set" msgstr "Le impostazioni locali dell'utente Guest (ospite) sono determinate automaticamente e non possono essere configurate" -#: cps/admin.py:528 +#: cps/admin.py:531 msgid "No Valid Locale Given" msgstr "Nessuna lingua valida specificata" -#: cps/admin.py:539 +#: cps/admin.py:542 msgid "No Valid Book Language Given" msgstr "Nessun libro valido per la lingua specificata" -#: cps/admin.py:541 cps/editbooks.py:243 cps/editbooks.py:428 -#: cps/editbooks.py:430 +#: cps/admin.py:544 cps/editbooks.py:260 cps/editbooks.py:445 +#: cps/editbooks.py:447 msgid "Parameter not found" msgstr "Parametro non trovato" -#: cps/admin.py:578 +#: cps/admin.py:581 msgid "Invalid Read Column" msgstr "Colonna di lettura non valida" -#: cps/admin.py:584 +#: cps/admin.py:587 msgid "Invalid Restricted Column" msgstr "Colonna con restrizioni non valida" -#: cps/admin.py:604 cps/admin.py:1903 +#: cps/admin.py:607 cps/admin.py:1981 msgid "Calibre-Web configuration updated" msgstr "La configurazione di Calibre-Web è stata aggiornata" -#: cps/admin.py:616 +#: cps/admin.py:619 msgid "Do you really want to delete the Kobo Token?" msgstr "Vuoi veramente eliminare il token di Kobo?" -#: cps/admin.py:618 +#: cps/admin.py:621 msgid "Do you really want to delete this domain?" msgstr "Vuoi veramente eliminare questo dominio?" -#: cps/admin.py:620 +#: cps/admin.py:623 msgid "Do you really want to delete this user?" msgstr "Vuoi veramente eliminare questo utente?" -#: cps/admin.py:622 +#: cps/admin.py:625 msgid "Do you really want to delete this book?" msgstr "Vuoi davvero eliminare questo libro?" -#: cps/admin.py:624 +#: cps/admin.py:627 msgid "Are you sure you want to delete this shelf?" msgstr "Sei sicuro di voler eliminare questo scaffale?" -#: cps/admin.py:626 +#: cps/admin.py:629 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Sei sicuro di voler cambiare le impostazioni internazionali degli utenti selezionati?" -#: cps/admin.py:628 +#: cps/admin.py:631 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "Sei sicuro di voler cambiare le lingue visibili del libro per gli utenti selezionati?" -#: cps/admin.py:630 +#: cps/admin.py:633 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "Sei sicuro di voler cambiare il ruolo selezionato per gli utenti selezionati?" -#: cps/admin.py:632 +#: cps/admin.py:635 msgid "Are you sure you want to change the archive status for the selected book(s)?" msgstr "Sei sicuro di voler cambiare lo stato dell'archivio per i libri selezionati?" -#: cps/admin.py:634 +#: cps/admin.py:637 msgid "Are you sure you want to change the read status for the selected book(s)?" msgstr "Sei sicuro di voler cambiare lo stato di lettura per i libri selezionati?" -#: cps/admin.py:636 +#: cps/admin.py:639 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Sei sicuro di voler cambiare le restrizioni selezionate per gli utenti selezionati?" -#: cps/admin.py:638 +#: cps/admin.py:641 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "Sei sicuro di voler cambiare le restrizioni di visibilità selezionate per gli utenti selezionati?" -#: cps/admin.py:641 +#: cps/admin.py:644 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Sei sicuro di voler cambiare il comportamento di sincronizzazione dello scaffale per gli utenti selezionati?" -#: cps/admin.py:643 +#: cps/admin.py:646 msgid "Are you sure you want to change Calibre library location?" msgstr "Sei sicuro di voler cambiare la posizione della biblioteca di Calibre?" -#: cps/admin.py:645 +#: cps/admin.py:648 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "Calibre-Web cercherà le copertine aggiornate e aggiornerà le miniature delle copertine, ma ci vorrà un po' di tempo." -#: cps/admin.py:648 +#: cps/admin.py:651 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Sei sicuro di voler eliminare il database sincronizzato di Calibre-Web e forzare una sincronizzazione completa con il tuo lettore Kobo?" -#: cps/admin.py:891 cps/admin.py:897 cps/admin.py:907 cps/admin.py:917 +#: cps/admin.py:894 cps/admin.py:900 cps/admin.py:910 cps/admin.py:920 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Nega" -#: cps/admin.py:893 cps/admin.py:899 cps/admin.py:909 cps/admin.py:919 +#: cps/admin.py:896 cps/admin.py:902 cps/admin.py:912 cps/admin.py:922 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Consenti" -#: cps/admin.py:952 +#: cps/admin.py:955 #, python-brace-format msgid "{} sync entries deleted" msgstr "{} voci di sincronizzazione eliminate" -#: cps/admin.py:993 +#: cps/admin.py:996 msgid "Tag not found" msgstr "Etichetta non trovata" -#: cps/admin.py:1011 +#: cps/admin.py:1014 msgid "Invalid Action" msgstr "Azione non valida" -#: cps/admin.py:1138 +#: cps/admin.py:1137 +#, python-format +msgid "Invalid reverse proxy trusted IP/CIDR entry: %(entry)s" +msgstr "" + +#: cps/admin.py:1148 +#, python-format +msgid "Invalid %(label)s: %(value)s" +msgstr "" + +#: cps/admin.py:1166 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json non è configurato per Web Application" -#: cps/admin.py:1183 +#: cps/admin.py:1211 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "La posizione del file di log non è valida, per favore indica il percorso corretto" -#: cps/admin.py:1189 +#: cps/admin.py:1217 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "La posizione del file del log di accesso non è valida, indica il percorso corretto" -#: cps/admin.py:1223 +#: cps/admin.py:1251 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Inserisci un provider LDAP, una porta, un DN e un identificatore oggetto utente" -#: cps/admin.py:1229 +#: cps/admin.py:1257 msgid "Please Enter a LDAP Service Account and Password" msgstr "Inserisci un account e una password del servizio LDAP" -#: cps/admin.py:1232 +#: cps/admin.py:1260 msgid "Please Enter a LDAP Service Account" msgstr "Inserisci un account di servizio LDAP" -#: cps/admin.py:1237 +#: cps/admin.py:1265 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "Il filtro oggetto gruppo LDAP deve avere un identificatore di formato \"%s\"" -#: cps/admin.py:1239 +#: cps/admin.py:1267 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "Il filtro oggetto gruppo LDAP ha parentesi senza corrispondenza" -#: cps/admin.py:1243 +#: cps/admin.py:1271 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "Il filtro oggetto utente LDAP deve avere un identificatore di formato \"%s\"" -#: cps/admin.py:1245 +#: cps/admin.py:1273 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "Il filtro oggetto utente LDAP ha parentesi senza corrispondenza" -#: cps/admin.py:1252 +#: cps/admin.py:1280 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "Il filtro utente membro LDAP deve avere un identificatore di formato \"%s\"" -#: cps/admin.py:1254 +#: cps/admin.py:1282 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "Il filtro utente membro LDAP ha parentesi senza corrispondenza" -#: cps/admin.py:1261 +#: cps/admin.py:1289 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "Il certificato CA LDAP, il certificato o la posizione della chiave non sono validi. Inserisci il percorso corretto" -#: cps/admin.py:1292 cps/templates/admin.html:53 +#: cps/admin.py:1320 cps/templates/admin.html:53 msgid "Add New User" msgstr "Aggiungi nuovo utente" -#: cps/admin.py:1301 cps/templates/admin.html:100 +#: cps/admin.py:1329 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Modifica le impostazioni del server e-mail" -#: cps/admin.py:1320 +#: cps/admin.py:1348 msgid "Success! Gmail Account Verified." msgstr "Tutto OK! Account Gmail verificato." -#: cps/admin.py:1340 cps/admin.py:1343 cps/admin.py:1728 cps/admin.py:1887 -#: cps/admin.py:1985 cps/admin.py:2106 cps/editbooks.py:169 -#: cps/editbooks.py:755 cps/editbooks.py:1474 cps/shelf.py:90 cps/shelf.py:144 +#: cps/admin.py:1368 cps/admin.py:1371 cps/admin.py:1756 cps/admin.py:1965 +#: cps/admin.py:2063 cps/admin.py:2184 cps/editbooks.py:170 +#: cps/editbooks.py:772 cps/editbooks.py:1518 cps/shelf.py:90 cps/shelf.py:144 #: cps/shelf.py:194 cps/shelf.py:237 cps/shelf.py:287 cps/shelf.py:327 -#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:160 cps/web.py:1526 +#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:161 cps/web.py:1536 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Errore nel database: %(error)s." -#: cps/admin.py:1350 +#: cps/admin.py:1378 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "L'e-mail di prova è stato accodata correttamente per essere spedita a %(email)s, controlla il risultato in Attività" -#: cps/admin.py:1353 +#: cps/admin.py:1381 #, 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 prova: %(res)s" -#: cps/admin.py:1355 +#: cps/admin.py:1383 msgid "Please configure your e-mail address first..." msgstr "Configura prima il tuo indirizzo e-mail..." -#: cps/admin.py:1357 +#: cps/admin.py:1385 msgid "Email Server Settings updated" msgstr "Le impostazioni del server e-mail sono state aggiornate" -#: cps/admin.py:1380 cps/templates/admin.html:195 +#: cps/admin.py:1408 cps/templates/admin.html:211 msgid "Edit Scheduled Tasks Settings" msgstr "Modifica le impostazioni delle attività pianificate" -#: cps/admin.py:1392 +#: cps/admin.py:1420 msgid "Invalid start time for task specified" msgstr "Ora di inizio non valida per l'attività specificata" -#: cps/admin.py:1397 +#: cps/admin.py:1425 msgid "Invalid duration for task specified" msgstr "Durata non valida per l'attività specificata" -#: cps/admin.py:1407 +#: cps/admin.py:1435 msgid "Scheduled tasks settings updated" msgstr "Impostazioni delle attività pianificate aggiornate" -#: cps/admin.py:1417 cps/admin.py:1466 cps/admin.py:2102 cps/web.py:1325 +#: cps/admin.py:1445 cps/admin.py:1494 cps/admin.py:2180 cps/web.py:1335 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Si è verificato un errore sconosciuto. Per favore riprova più tardi." -#: cps/admin.py:1421 +#: cps/admin.py:1449 msgid "Settings DB is not Writeable" msgstr "Il DB delle impostazioni non è scrivibile" -#: cps/admin.py:1451 cps/admin.py:2094 +#: cps/admin.py:1479 cps/admin.py:2172 #, python-format msgid "Edit User %(nick)s" msgstr "Modifica utente %(nick)s" -#: cps/admin.py:1463 +#: cps/admin.py:1491 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "Tutto OK! Password reimpostata per l'utente %(user)s" -#: cps/admin.py:1469 +#: cps/admin.py:1497 msgid "Oops! Please configure the SMTP mail settings." msgstr "Per favore configura le impostazioni della posta SMTP." -#: cps/admin.py:1480 +#: cps/admin.py:1508 msgid "Logfile viewer" msgstr "Visualizzatore del file di log" -#: cps/admin.py:1546 +#: cps/admin.py:1574 msgid "Requesting update package" msgstr "Richiesta del pacchetto di aggiornamento" -#: cps/admin.py:1547 +#: cps/admin.py:1575 msgid "Downloading update package" msgstr "Download del pacchetto di aggiornamento" -#: cps/admin.py:1548 +#: cps/admin.py:1576 msgid "Unzipping update package" msgstr "Decompressione del pacchetto di aggiornamento" -#: cps/admin.py:1549 +#: cps/admin.py:1577 msgid "Replacing files" msgstr "Sostituzione dei file" -#: cps/admin.py:1550 +#: cps/admin.py:1578 msgid "Database connections are closed" msgstr "Le connessioni al database sono chiuse" -#: cps/admin.py:1551 +#: cps/admin.py:1579 msgid "Stopping server" msgstr "Arresto del server" -#: cps/admin.py:1552 +#: cps/admin.py:1580 msgid "Update finished, please press okay and reload page" msgstr "Aggiornamento terminato, premi OK e ricarica la pagina" -#: cps/admin.py:1553 cps/admin.py:1554 cps/admin.py:1555 cps/admin.py:1556 -#: cps/admin.py:1557 cps/admin.py:1558 +#: cps/admin.py:1581 cps/admin.py:1582 cps/admin.py:1583 cps/admin.py:1584 +#: cps/admin.py:1585 cps/admin.py:1586 msgid "Update failed:" msgstr "Aggiornamento non riuscito:" -#: cps/admin.py:1553 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1581 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "Errore HTTP" -#: cps/admin.py:1554 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1582 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Errore di connessione" -#: cps/admin.py:1555 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1583 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Tempo scaduto nello stabilire la connessione" -#: cps/admin.py:1556 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1584 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Errore generale" -#: cps/admin.py:1557 +#: cps/admin.py:1585 msgid "Update file could not be saved in temp dir" msgstr "Il file di aggiornamento non può essere salvato nella cartella temporanea" -#: cps/admin.py:1558 +#: cps/admin.py:1586 msgid "Files could not be replaced during update" msgstr "Impossibile sostituire i file durante l'aggiornamento" -#: cps/admin.py:1582 +#: cps/admin.py:1610 msgid "Failed to extract at least One LDAP User" msgstr "Impossibile estrarre almeno un utente LDAP" -#: cps/admin.py:1627 +#: cps/admin.py:1655 msgid "Failed to Create at Least One LDAP User" msgstr "Impossibile creare almeno un utente LDAP" -#: cps/admin.py:1640 +#: cps/admin.py:1668 #, python-format msgid "Error: %(ldaperror)s" msgstr "Errore: %(ldaperror)s" -#: cps/admin.py:1644 +#: cps/admin.py:1672 msgid "Error: No user returned in response of LDAP server" msgstr "Errore: nessun utente restituito in risposta dal server LDAP" -#: cps/admin.py:1680 +#: cps/admin.py:1708 msgid "At Least One LDAP User Not Found in Database" msgstr "Almeno un utente LDAP non è stato trovato nel database" -#: cps/admin.py:1682 +#: cps/admin.py:1710 #, python-brace-format msgid "{} User Successfully Imported" msgstr "{} utente importato correttamente" -#: cps/admin.py:1740 +#: cps/admin.py:1768 msgid "Books path not valid" msgstr "Percorso dei libri non valido" -#: cps/admin.py:1746 +#: cps/admin.py:1774 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "La posizione del DB non è valida, per favore indica il percorso corretto" -#: cps/admin.py:1774 +#: cps/admin.py:1802 msgid "DB is not Writeable" msgstr "Il DB non è scrivibile" -#: cps/admin.py:1788 +#: cps/admin.py:1816 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "La posizione del Keyfile non è valida. Inserisci il percorso corretto" -#: cps/admin.py:1792 +#: cps/admin.py:1820 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "La posizione del Certfile non è valida, indica il percorso corretto" -#: cps/admin.py:1872 +#: cps/admin.py:1846 +msgid "Kepubify binary not found" +msgstr "" + +#: cps/admin.py:1894 +msgid "reverse proxy login header name" +msgstr "" + +#: cps/admin.py:1904 +msgid "reverse proxy shared secret header name" +msgstr "" + +#: cps/admin.py:1913 +msgid "Please configure both reverse proxy shared secret header name and secret" +msgstr "" + +#: cps/admin.py:1917 +msgid "Please configure reverse proxy shared secret header name and secret or disable the feature" +msgstr "" + +#: cps/admin.py:1922 +msgid "Please configure at least one trusted reverse proxy IP or CIDR" +msgstr "" + +#: cps/admin.py:1946 msgid "Password length has to be between 1 and 40" msgstr "La lunghezza della password deve essere compresa tra 1 e 40" -#: cps/admin.py:1926 +#: cps/admin.py:1957 cps/helper.py:1007 +msgid "Please specify a valid UnRar directory" +msgstr "" + +#: cps/admin.py:2004 msgid "Database Settings updated" msgstr "Impostazioni del database aggiornate" -#: cps/admin.py:1934 +#: cps/admin.py:2012 msgid "Database Configuration" msgstr "Configurazione del database" -#: cps/admin.py:1949 cps/web.py:1295 +#: cps/admin.py:2027 cps/web.py:1305 msgid "Oops! Please complete all fields." msgstr "Per favore completa tutti i campi." -#: cps/admin.py:1958 +#: cps/admin.py:2036 msgid "E-mail is not from valid domain" msgstr "L'e-mail non proviene da un dominio valido" -#: cps/admin.py:1964 +#: cps/admin.py:2042 msgid "Add new user" msgstr "Aggiungi nuovo utente" -#: cps/admin.py:1975 +#: cps/admin.py:2053 #, python-format msgid "User '%(user)s' created" msgstr "L'utente '%(user)s' è stato creato" -#: cps/admin.py:1981 +#: cps/admin.py:2059 msgid "Oops! An account already exists for this Email. or name." msgstr "Esiste già un account per questa e-mail o nome." -#: cps/admin.py:2011 +#: cps/admin.py:2089 #, python-format msgid "User '%(nick)s' deleted" msgstr "L'utente '%(nick)s' è stato eliminato" -#: cps/admin.py:2014 +#: cps/admin.py:2092 msgid "Can't delete Guest User" msgstr "Impossibile eliminare l'utente Guest (ospite)" -#: cps/admin.py:2017 +#: cps/admin.py:2095 msgid "No admin user remaining, can't delete user" msgstr "Non rimarrebbe nessun utente amministratore, non è possibile eliminare l'utente" -#: cps/admin.py:2072 cps/web.py:1475 +#: cps/admin.py:2150 cps/web.py:1485 msgid "Email can't be empty and has to be a valid Email" msgstr "L'e-mail non può essere vuota e deve essere un'e-mail valida" -#: cps/admin.py:2098 +#: cps/admin.py:2176 #, python-format msgid "User '%(nick)s' updated" msgstr "L'utente '%(nick)s' è stato aggiornato" @@ -541,145 +580,153 @@ msgstr "L'utente '%(nick)s' è stato aggiornato" msgid "Search" msgstr "Cerca" -#: cps/converter.py:31 +#: cps/converter.py:32 msgid "not installed" msgstr "non installato" -#: cps/converter.py:32 +#: cps/converter.py:33 msgid "Execution permissions missing" msgstr "Mancano i permessi di esecuzione" -#: cps/db.py:1129 cps/templates/config_edit.html:207 +#: cps/db.py:1129 cps/templates/config_edit.html:229 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:565 cps/web.py:599 cps/web.py:644 cps/web.py:684 cps/web.py:711 -#: cps/web.py:998 cps/web.py:1028 cps/web.py:1073 cps/web.py:1101 -#: cps/web.py:1140 +#: cps/web.py:567 cps/web.py:601 cps/web.py:646 cps/web.py:686 cps/web.py:713 +#: cps/web.py:1000 cps/web.py:1030 cps/web.py:1075 cps/web.py:1103 +#: cps/web.py:1142 msgid "None" msgstr "Nessuna" -#: cps/editbooks.py:155 +#: cps/editbooks.py:156 #, python-format msgid "File %(file)s uploaded" msgstr "Il file %(file)s è stato caricato" -#: cps/editbooks.py:184 +#: cps/editbooks.py:185 msgid "Source or destination format for conversion missing" msgstr "Manca il formato di origine o di destinazione per la conversione" -#: cps/editbooks.py:192 +#: cps/editbooks.py:189 cps/editbooks.py:197 +msgid "Source format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:201 +msgid "Destination format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:209 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Libro accodato correttamente per essere convertito in %(book_format)s" -#: cps/editbooks.py:196 +#: cps/editbooks.py:213 #, 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/editbooks.py:297 +#: cps/editbooks.py:314 msgid "Changes successfully applied" msgstr "Cambiamenti applicati correttamente" -#: cps/editbooks.py:317 +#: cps/editbooks.py:334 msgid "Value is missing on request" msgstr "Il valore non è presente nella richiesta" -#: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 -#: cps/editbooks.py:1146 cps/web.py:532 cps/web.py:1567 cps/web.py:1613 -#: cps/web.py:1663 +#: cps/editbooks.py:336 cps/editbooks.py:343 cps/editbooks.py:644 +#: cps/editbooks.py:1170 cps/web.py:534 cps/web.py:1577 cps/web.py:1623 +#: cps/web.py:1673 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Il libro selezionato non è disponibile. Il file non esiste o non è accessibile" -#: cps/editbooks.py:673 cps/editbooks.py:1503 +#: cps/editbooks.py:690 cps/editbooks.py:1547 msgid "User has no rights to upload cover" msgstr "L'utente non ha i permessi per caricare le copertine" -#: cps/editbooks.py:694 cps/editbooks.py:938 +#: cps/editbooks.py:711 cps/editbooks.py:961 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "Gli identificatori non fanno distinzione tra maiuscole e minuscole e sovrascrivono il vecchio identificatore" -#: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 +#: cps/editbooks.py:726 cps/editbooks.py:935 cps/editbooks.py:1306 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "%(langname)s non è una lingua valida" -#: cps/editbooks.py:737 +#: cps/editbooks.py:754 msgid "Metadata successfully updated" msgstr "Metadati aggiornati correttamente" -#: cps/editbooks.py:760 +#: cps/editbooks.py:777 #, python-brace-format msgid "Error editing book: {}" msgstr "Errore nella modifica del libro: {}" -#: cps/editbooks.py:856 +#: cps/editbooks.py:879 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "Probabilmente il libro caricato esiste già nella biblioteca, cambialo prima di caricarlo di nuovo:" -#: cps/editbooks.py:950 cps/editbooks.py:1420 +#: cps/editbooks.py:973 cps/editbooks.py:1464 msgid "File type isn't allowed to be uploaded to this server" msgstr "Non è consentito caricare questo tipo di file su questo server" -#: cps/editbooks.py:956 cps/editbooks.py:1431 +#: cps/editbooks.py:979 cps/editbooks.py:1475 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "Non è consentito caricare l'estensione del file '%(ext)s' su questo server" -#: cps/editbooks.py:960 cps/editbooks.py:1436 +#: cps/editbooks.py:983 cps/editbooks.py:1480 msgid "File to be uploaded must have an extension" msgstr "Il file da caricare deve avere un'estensione" -#: cps/editbooks.py:968 +#: cps/editbooks.py:992 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "Il file %(filename)s non può essere salvato nella cartella temporanea" -#: cps/editbooks.py:988 +#: cps/editbooks.py:1012 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Impossibile spostare il file della copertina %(file)s: %(error)s" -#: cps/editbooks.py:1041 +#: cps/editbooks.py:1065 msgid "Book Format Successfully Deleted" msgstr "Il formato del libro è stato eliminato correttamente" -#: cps/editbooks.py:1044 cps/editbooks.py:1061 +#: cps/editbooks.py:1068 cps/editbooks.py:1085 msgid "Book Successfully Deleted" msgstr "Il libro è stato eliminato correttamente" -#: cps/editbooks.py:1065 +#: cps/editbooks.py:1089 msgid "You are missing permissions to delete books" msgstr "Ti mancano le autorizzazioni per eliminare i libri" -#: cps/editbooks.py:1139 +#: cps/editbooks.py:1163 #, python-brace-format msgid "Book with id \"{}\" could not be deleted: not found" msgstr "Non è stato possibile eliminare il libro con id \"{}\": non trovato" -#: cps/editbooks.py:1181 +#: cps/editbooks.py:1205 msgid "edit metadata" msgstr "modifica i metadati" -#: cps/editbooks.py:1234 +#: cps/editbooks.py:1267 #, python-format msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "Indice serie: %(seriesindex)s non è un numero valido, lo salto" -#: cps/editbooks.py:1425 +#: cps/editbooks.py:1469 msgid "User has no rights to upload additional file formats" msgstr "L'utente non ha i permessi per caricare formati di file aggiuntivi" -#: cps/editbooks.py:1449 +#: cps/editbooks.py:1493 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Impossibile creare il percorso %(path)s (autorizzazione negata)." -#: cps/editbooks.py:1456 +#: cps/editbooks.py:1500 #, python-format msgid "Failed to store file %(file)s." msgstr "Impossibile archiviare il file %(file)s." -#: cps/editbooks.py:1481 +#: cps/editbooks.py:1525 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Formato file %(ext)s aggiunto a %(book)s" @@ -690,9 +737,9 @@ msgstr "Attendi un minuto per registrare il prossimo utente" #: cps/error_handler.py:108 cps/templates/layout.html:69 #: cps/templates/layout.html:104 cps/templates/login.html:27 -#: cps/templates/register.html:17 cps/web.py:1292 cps/web.py:1296 -#: cps/web.py:1302 cps/web.py:1326 cps/web.py:1330 cps/web.py:1343 -#: cps/web.py:1346 +#: cps/templates/register.html:17 cps/web.py:1302 cps/web.py:1306 +#: cps/web.py:1312 cps/web.py:1336 cps/web.py:1340 cps/web.py:1353 +#: cps/web.py:1356 msgid "Register" msgstr "Registrati" @@ -713,7 +760,7 @@ msgstr "Il dominio di callback non è stato verificato, segui i passaggi per ver msgid "%(format)s format not found for book id: %(book)d" msgstr "Formato %(format)s non trovato per l'ID libro: %(book)d" -#: cps/helper.py:94 cps/tasks/convert.py:91 +#: cps/helper.py:94 cps/tasks/convert.py:92 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s non trovato su Google Drive: %(fn)s" @@ -899,10 +946,6 @@ msgstr "Solo i file jpg/jpeg sono supportati come file di copertina" msgid "Cover" msgstr "Copertina" -#: cps/helper.py:1006 -msgid "UnRar binary file not found" -msgstr "File binario UnRar non trovato" - #: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "Errore nell'eseguire UnRar" @@ -933,7 +976,7 @@ msgstr "Permessi di esecuzione mancanti: %(missing)s" msgid "Error executing Calibre" msgstr "Errore durante l'esecuzione di Calibre" -#: cps/helper.py:1154 cps/templates/admin.html:216 +#: cps/helper.py:1154 cps/templates/admin.html:232 msgid "Queue all books for metadata backup" msgstr "Metti in coda tutti i libri per il backup dei metadati" @@ -955,7 +998,7 @@ msgstr "Registra con %(provider)s" msgid "This %(oauth)s account is already linked to a different user" msgstr "" -#: cps/oauth_bb.py:147 cps/remotelogin.py:131 +#: cps/oauth_bb.py:147 cps/remotelogin.py:150 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "Tutto OK! Ora sei connesso come: %(nickname)s" @@ -1023,25 +1066,29 @@ msgstr "Errore OAuth di Google: {}" msgid "{} Stars" msgstr "{} stelle" -#: cps/remotelogin.py:63 cps/templates/layout.html:68 -#: cps/templates/layout.html:103 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1361 -msgid "Login" -msgstr "Accesso" - -#: cps/remotelogin.py:75 cps/remotelogin.py:109 +#: cps/remotelogin.py:46 cps/remotelogin.py:128 msgid "Token not found" msgstr "Token non trovato" -#: cps/remotelogin.py:84 cps/remotelogin.py:117 +#: cps/remotelogin.py:55 cps/remotelogin.py:136 msgid "Token has expired" msgstr "Il token è scaduto" -#: cps/remotelogin.py:93 +#: cps/remotelogin.py:86 cps/remotelogin.py:112 cps/templates/layout.html:68 +#: cps/templates/layout.html:103 cps/templates/login.html:4 +#: cps/templates/login.html:21 cps/web.py:1371 +msgid "Login" +msgstr "Accesso" + +#: cps/remotelogin.py:100 +msgid "Token already approved" +msgstr "" + +#: cps/remotelogin.py:108 msgid "Success! Please return to your device" msgstr "Tutto OK! Torna al tuo dispositivo" -#: cps/render_template.py:41 cps/web.py:421 +#: cps/render_template.py:41 cps/web.py:423 msgid "Books" msgstr "Libri" @@ -1066,7 +1113,7 @@ msgstr "Libri scaricati" msgid "Show Downloaded Books" msgstr "Mostra Libri scaricati" -#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:436 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:438 msgid "Top Rated Books" msgstr "Libri più votati" @@ -1075,7 +1122,7 @@ msgid "Show Top Rated Books" msgstr "Mostra Libri più votati" #: cps/render_template.py:61 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:769 +#: cps/templates/index.xml:67 cps/web.py:771 msgid "Read Books" msgstr "Libri letti" @@ -1084,7 +1131,7 @@ msgid "Show Read and Unread" msgstr "Mostra Libri letti e Libri da leggere" #: cps/render_template.py:65 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:772 +#: cps/templates/index.xml:74 cps/web.py:774 msgid "Unread Books" msgstr "Libri da leggere" @@ -1102,7 +1149,7 @@ msgid "Show Random Books" msgstr "Mostra Libri casuali" #: cps/render_template.py:71 cps/templates/book_table.html:93 -#: cps/templates/index.xml:97 cps/web.py:1144 +#: cps/templates/index.xml:97 cps/web.py:1146 msgid "Categories" msgstr "Categorie" @@ -1112,7 +1159,7 @@ msgstr "Mostra sezione Categorie" #: cps/render_template.py:74 cps/templates/book_edit.html:86 #: cps/templates/book_table.html:94 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1034 cps/web.py:1046 +#: cps/templates/search_form.html:70 cps/web.py:1036 cps/web.py:1048 msgid "Series" msgstr "Serie" @@ -1130,7 +1177,7 @@ msgid "Show Author Section" msgstr "Mostra sezione Autori" #: cps/render_template.py:81 cps/templates/book_table.html:98 -#: cps/templates/index.xml:88 cps/web.py:1002 +#: cps/templates/index.xml:88 cps/web.py:1004 msgid "Publishers" msgstr "Editori" @@ -1140,7 +1187,7 @@ msgstr "Mostra sezione Editori" #: cps/render_template.py:84 cps/templates/book_table.html:96 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1116 +#: cps/web.py:1118 msgid "Languages" msgstr "Lingue" @@ -1164,7 +1211,7 @@ msgstr "Formati di file" msgid "Show File Formats Section" msgstr "Mostra sezione Formati di file" -#: cps/render_template.py:95 cps/web.py:795 +#: cps/render_template.py:95 cps/web.py:797 msgid "Archived Books" msgstr "Libri archiviati" @@ -1172,7 +1219,7 @@ msgstr "Libri archiviati" msgid "Show Archived Books" msgstr "Mostra Libri archiviati" -#: cps/render_template.py:100 cps/web.py:831 +#: cps/render_template.py:100 cps/web.py:833 msgid "Books List" msgstr "Elenco libri" @@ -1241,7 +1288,7 @@ msgstr "Non è consentito rimuovere un libro dallo scaffale" #: cps/shelf.py:129 #, python-format msgid "No Books are part of the shelf: %(name)s" -msgstr "Nessun libro fa parte dello scaffale: %(nome)s" +msgstr "Nessun libro fa parte dello scaffale: %(name)s" #: cps/shelf.py:140 #, python-format @@ -1405,150 +1452,154 @@ msgstr "È disponibile un nuovo aggiornamento. Fai clic sul pulsante in basso pe msgid "No release information available" msgstr "Nessuna informazione disponibile sulla versione" -#: cps/templates/index.html:6 cps/web.py:448 +#: cps/templates/index.html:6 cps/web.py:450 msgid "Discover (Random Books)" msgstr "Libri casuali" -#: cps/web.py:484 +#: cps/web.py:486 msgid "Hot Books (Most Downloaded)" msgstr "Libri hot (i più scaricati)" -#: cps/web.py:515 +#: cps/web.py:517 #, python-format msgid "Downloaded books by %(user)s" msgstr "Libri scaricati da %(user)s" -#: cps/web.py:548 +#: cps/web.py:550 #, python-format msgid "Author: %(name)s" msgstr "Autore: %(name)s" -#: cps/web.py:584 +#: cps/web.py:586 #, python-format msgid "Publisher: %(name)s" msgstr "Editore: %(name)s" -#: cps/web.py:612 +#: cps/web.py:614 #, python-format msgid "Series: %(serie)s" msgstr "Serie: %(serie)s" -#: cps/web.py:626 +#: cps/web.py:628 msgid "Rating: None" msgstr "Valutazione: nessuna" -#: cps/web.py:635 +#: cps/web.py:637 #, python-format msgid "Rating: %(rating)s stars" msgstr "Valutazione: %(rating)s stelle" -#: cps/web.py:666 +#: cps/web.py:668 #, python-format msgid "File format: %(format)s" msgstr "Formato file: %(format)s" -#: cps/web.py:701 +#: cps/web.py:703 #, python-format msgid "Category: %(name)s" msgstr "Categoria: %(name)s" -#: cps/web.py:730 +#: cps/web.py:732 #, python-format msgid "Language: %(name)s" msgstr "Lingua: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:974 +#: cps/templates/admin.html:16 cps/web.py:976 msgid "Downloads" msgstr "Scaricati" -#: cps/web.py:1076 +#: cps/web.py:1078 msgid "Ratings list" msgstr "Elenco valutazioni" -#: cps/web.py:1103 +#: cps/web.py:1105 msgid "File formats list" msgstr "Elenco formati di file" -#: cps/web.py:1264 +#: cps/web.py:1272 +msgid "Book format not supported" +msgstr "" + +#: cps/web.py:1274 msgid "Please configure the SMTP mail settings first..." msgstr "Configura prima le impostazioni della posta SMTP..." -#: cps/web.py:1270 +#: cps/web.py:1280 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Tutto OK! Libro in coda per l'invio a %(eReadermail)s" -#: cps/web.py:1273 +#: cps/web.py:1283 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Si è verificato un errore durante l'invio del libro: %(res)s" -#: cps/web.py:1275 +#: cps/web.py:1285 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Per favore aggiorna il tuo profilo con un'e-mail eReader valida." -#: cps/web.py:1291 cps/web.py:1342 +#: cps/web.py:1301 cps/web.py:1352 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "Il server e-mail non è configurato, per favore contatta l'amministratore" -#: cps/web.py:1328 +#: cps/web.py:1338 msgid "Oops! Your Email is not allowed." msgstr "La tua email non è consentita." -#: cps/web.py:1331 +#: cps/web.py:1341 msgid "Success! Confirmation Email has been sent." msgstr "Tutto OK! L'e-mail di conferma è stata inviata." -#: cps/web.py:1376 cps/web.py:1390 +#: cps/web.py:1386 cps/web.py:1400 msgid "Cannot activate LDAP authentication" msgstr "Impossibile attivare l'autenticazione LDAP" -#: cps/web.py:1399 +#: cps/web.py:1409 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "ora sei connesso come: '%(nickname)s'" -#: cps/web.py:1406 +#: cps/web.py:1416 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Accesso di riserva come: '%(nickname)s', il server LDAP non è raggiungibile o l'utente è sconosciuto" -#: cps/web.py:1411 +#: cps/web.py:1421 #, python-format msgid "Could not login: %(message)s" msgstr "Impossibile accedere: %(message)s" -#: cps/web.py:1415 cps/web.py:1440 +#: cps/web.py:1425 cps/web.py:1450 msgid "Wrong Username or Password" msgstr "Nome utente o password errati" -#: cps/web.py:1422 +#: cps/web.py:1432 msgid "New Password was sent to your email address" msgstr "La nuova password è stata inviata al tuo indirizzo e-mail" -#: cps/web.py:1426 +#: cps/web.py:1436 msgid "An unknown error occurred. Please try again later." msgstr "Si è verificato un errore sconosciuto, riprova più tardi." -#: cps/web.py:1428 +#: cps/web.py:1438 msgid "Please enter valid username to reset password" msgstr "Inserisci un nome utente valido per reimpostare la password" -#: cps/web.py:1436 +#: cps/web.py:1446 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Ora sei connesso come: '%(nickname)s'" -#: cps/web.py:1501 cps/web.py:1551 +#: cps/web.py:1511 cps/web.py:1561 #, python-format msgid "%(name)s's Profile" msgstr "Profilo di %(name)s" -#: cps/web.py:1517 +#: cps/web.py:1527 msgid "Success! Profile Updated" msgstr "Tutto OK! Profilo aggiornato" -#: cps/web.py:1521 +#: cps/web.py:1531 msgid "Oops! An account already exists for this Email." msgstr "Esiste già un account per questa e-mail." @@ -1560,46 +1611,46 @@ msgstr "Nessun file gmail.json valido con informazioni OAuth trovato" msgid "Delete temp folder contents" msgstr "Elimina contenuto della cartella temporanea" -#: cps/tasks/convert.py:112 +#: cps/tasks/convert.py:113 #, python-format msgid "%(book)s send to E-Reader" msgstr "%(book)s inviato all'E-Reader" -#: cps/tasks/convert.py:177 +#: cps/tasks/convert.py:180 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre ebook-convert %(tool)s non trovato" -#: cps/tasks/convert.py:211 +#: cps/tasks/convert.py:214 #, python-format msgid "%(format)s format not found on disk" msgstr "Formato %(format)s non trovato sul disco" -#: cps/tasks/convert.py:215 +#: cps/tasks/convert.py:218 msgid "Ebook converter failed with unknown error" msgstr "La conversione del libro è terminata con un errore sconosciuto" -#: cps/tasks/convert.py:234 +#: cps/tasks/convert.py:237 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Errore con il convertitore Kepubify: %(error)s" -#: cps/tasks/convert.py:254 +#: cps/tasks/convert.py:257 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "File convertito non trovato o più di un file nella cartella %(folder)s" -#: cps/tasks/convert.py:291 cps/tasks/convert.py:342 +#: cps/tasks/convert.py:294 cps/tasks/convert.py:345 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Si è verificato un errore con Calibre: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:322 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Errore nel convertitore: %(error)s" -#: cps/tasks/convert.py:347 +#: cps/tasks/convert.py:350 msgid "Convert" msgstr "Converti" @@ -1685,7 +1736,7 @@ msgstr "Modifica" #: cps/templates/admin.html:25 cps/templates/book_edit.html:17 #: cps/templates/book_table.html:131 cps/templates/book_table.html:180 -#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:115 +#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:117 #: cps/templates/user_edit.html:67 cps/templates/user_table.html:149 msgid "Delete" msgstr "Elimina" @@ -1775,128 +1826,145 @@ msgstr "Accesso remoto Magic Link" msgid "Reverse Proxy Login" msgstr "Accesso reverse proxy" -#: cps/templates/admin.html:154 cps/templates/config_edit.html:176 +#: cps/templates/admin.html:154 cps/templates/config_edit.html:180 msgid "Reverse Proxy Header Name" msgstr "Nome dell'intestazione reverse proxy" -#: cps/templates/admin.html:159 +#: cps/templates/admin.html:158 +msgid "Reverse Proxy Trusted IPs/CIDRs" +msgstr "" + +#: cps/templates/admin.html:162 cps/templates/config_edit.html:193 +msgid "Reverse Proxy Shared Secret Header Name" +msgstr "" + +#: cps/templates/admin.html:166 +msgid "Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/admin.html:170 +msgid "Reverse Proxy Shared Secret Configured" +msgstr "" + +#: cps/templates/admin.html:175 msgid "Edit Calibre Database Configuration" msgstr "Modifica la configurazione del database di Calibre" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:176 msgid "Edit Basic Configuration" msgstr "Modifica la configurazione di base" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:177 msgid "Edit UI Configuration" msgstr "Modifica la configurazione dell'interfaccia utente" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:183 msgid "Scheduled Tasks" msgstr "Attività pianificate" -#: cps/templates/admin.html:170 cps/templates/schedule_edit.html:12 +#: cps/templates/admin.html:186 cps/templates/schedule_edit.html:12 #: cps/templates/tasks.html:18 msgid "Start Time" msgstr "Ora di inizio" -#: cps/templates/admin.html:174 cps/templates/schedule_edit.html:20 +#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:20 msgid "Maximum Duration" msgstr "Durata massima" -#: cps/templates/admin.html:178 cps/templates/schedule_edit.html:29 +#: cps/templates/admin.html:194 cps/templates/schedule_edit.html:29 msgid "Generate Thumbnails" msgstr "Genera miniature" -#: cps/templates/admin.html:182 +#: cps/templates/admin.html:198 msgid "Generate series cover thumbnails" msgstr "Genera miniature delle copertine delle serie" -#: cps/templates/admin.html:186 cps/templates/admin.html:208 +#: cps/templates/admin.html:202 cps/templates/admin.html:224 #: cps/templates/schedule_edit.html:37 msgid "Reconnect Calibre Database" msgstr "Riconnetti il database di Calibre" -#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 +#: cps/templates/admin.html:206 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" msgstr "Genera file di backup dei metadati" -#: cps/templates/admin.html:197 +#: cps/templates/admin.html:213 msgid "Refresh Thumbnail Cache" msgstr "Aggiorna la cache delle miniature" -#: cps/templates/admin.html:203 +#: cps/templates/admin.html:219 msgid "Administration" msgstr "Amministrazione" -#: cps/templates/admin.html:204 +#: cps/templates/admin.html:220 msgid "Download Debug Package" msgstr "Scarica il pacchetto di debug" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:221 msgid "View Logs" msgstr "Visualizza log" -#: cps/templates/admin.html:211 +#: cps/templates/admin.html:227 msgid "Restart" msgstr "Riavvia Calibre-Web" -#: cps/templates/admin.html:212 +#: cps/templates/admin.html:228 msgid "Shutdown" msgstr "Arresta Calibre-Web" -#: cps/templates/admin.html:221 +#: cps/templates/admin.html:237 msgid "Version Information" msgstr "Informazioni sulla versione" -#: cps/templates/admin.html:225 +#: cps/templates/admin.html:241 msgid "Version" msgstr "Versione" -#: cps/templates/admin.html:226 +#: cps/templates/admin.html:242 msgid "Details" msgstr "Dettagli" -#: cps/templates/admin.html:232 +#: cps/templates/admin.html:248 msgid "Current Version" msgstr "Versione attuale" -#: cps/templates/admin.html:239 +#: cps/templates/admin.html:255 msgid "Check for Update" msgstr "Ricerca aggiornamenti" -#: cps/templates/admin.html:240 +#: cps/templates/admin.html:256 msgid "Perform Update" msgstr "Esegui l'aggiornamento" -#: cps/templates/admin.html:253 +#: cps/templates/admin.html:269 msgid "Are you sure you want to restart?" msgstr "Sei sicuro di voler riavviare Calibre-Web?" -#: cps/templates/admin.html:258 cps/templates/admin.html:272 -#: cps/templates/admin.html:292 cps/templates/config_db.html:82 +#: cps/templates/admin.html:274 cps/templates/admin.html:288 +#: cps/templates/admin.html:308 cps/templates/config_db.html:82 msgid "OK" msgstr "OK" -#: cps/templates/admin.html:259 cps/templates/admin.html:273 +#: cps/templates/admin.html:275 cps/templates/admin.html:289 #: cps/templates/book_edit.html:220 cps/templates/book_table.html:162 #: cps/templates/book_table.html:181 cps/templates/book_table.html:201 #: cps/templates/book_table.html:221 cps/templates/book_table.html:241 #: cps/templates/book_table.html:261 cps/templates/book_table.html:316 -#: cps/templates/config_db.html:66 cps/templates/config_edit.html:431 +#: cps/templates/config_db.html:66 cps/templates/config_edit.html:453 #: cps/templates/config_view_edit.html:175 cps/templates/detail.html:350 -#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:98 -#: cps/templates/modal_dialogs.html:116 cps/templates/modal_dialogs.html:134 +#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:100 +#: cps/templates/modal_dialogs.html:118 cps/templates/modal_dialogs.html:136 +#: cps/templates/remote_login_verify.html:16 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 #: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Annulla" -#: cps/templates/admin.html:271 +#: cps/templates/admin.html:287 msgid "Are you sure you want to shutdown?" msgstr "Sei sicuro di voler fermare Calibre-Web?" -#: cps/templates/admin.html:283 +#: cps/templates/admin.html:299 msgid "Updating, please do not reload this page" msgstr "Aggiornamento in corso, non ricaricare la pagina." @@ -2137,7 +2205,7 @@ msgid "Fetch Metadata" msgstr "Recupera i metadati" #: cps/templates/book_edit.html:219 cps/templates/config_db.html:65 -#: cps/templates/config_edit.html:430 cps/templates/config_view_edit.html:174 +#: cps/templates/config_edit.html:452 cps/templates/config_view_edit.html:174 #: cps/templates/email_edit.html:65 cps/templates/schedule_edit.html:44 #: cps/templates/shelf_edit.html:25 cps/templates/shelf_order.html:41 #: cps/templates/user_edit.html:142 @@ -2509,214 +2577,234 @@ msgstr "Chiave API di Google Libri" msgid "Allow Reverse Proxy Authentication" msgstr "Consenti autenticazione con reverse proxy" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:176 +msgid "Security Warning" +msgstr "" + +#: cps/templates/config_edit.html:177 +msgid "Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled." +msgstr "" + +#: cps/templates/config_edit.html:184 +msgid "Reverse Proxy Trusted IPs/CIDRs (Comma Separated)" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "Enable Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/config_edit.html:197 +msgid "Reverse Proxy Shared Secret" +msgstr "" + +#: cps/templates/config_edit.html:205 msgid "Login type" msgstr "Tipo di accesso" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:207 msgid "Use Standard Authentication" msgstr "Usa autenticazione standard" -#: cps/templates/config_edit.html:187 +#: cps/templates/config_edit.html:209 msgid "Use LDAP Authentication" msgstr "Usa l'autenticazione LDAP" -#: cps/templates/config_edit.html:190 +#: cps/templates/config_edit.html:212 msgid "Use OAuth" msgstr "Usa OAuth" -#: cps/templates/config_edit.html:197 +#: cps/templates/config_edit.html:219 msgid "LDAP Server Host Name or IP Address" msgstr "Nome host o indirizzo IP del server LDAP" -#: cps/templates/config_edit.html:201 +#: cps/templates/config_edit.html:223 msgid "LDAP Server Port" msgstr "Porta del server LDAP" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:227 msgid "LDAP Encryption" msgstr "Crittografia LDAP" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:230 msgid "TLS" msgstr "TLS" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:231 msgid "SSL" msgstr "SSL" -#: cps/templates/config_edit.html:213 +#: cps/templates/config_edit.html:235 msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" msgstr "Percorso certificato CA LDAP (necessario solo per l'autenticazione del certificato client)" -#: cps/templates/config_edit.html:220 +#: cps/templates/config_edit.html:242 msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" msgstr "Percorso certificato LDAP (necessario solo per l'autenticazione del certificato client)" -#: cps/templates/config_edit.html:227 +#: cps/templates/config_edit.html:249 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" msgstr "Percorso del file di chiavi LDAP (necessario solo per l'autenticazione del certificato client)" -#: cps/templates/config_edit.html:236 +#: cps/templates/config_edit.html:258 msgid "LDAP Authentication" msgstr "Autenticazione LDAP" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:260 msgid "Anonymous" msgstr "Anonimo" -#: cps/templates/config_edit.html:239 +#: cps/templates/config_edit.html:261 msgid "Unauthenticated" msgstr "Non autenticato" -#: cps/templates/config_edit.html:240 +#: cps/templates/config_edit.html:262 msgid "Simple" msgstr "Semplice" -#: cps/templates/config_edit.html:245 +#: cps/templates/config_edit.html:267 msgid "LDAP Administrator Username" msgstr "Nome utente amministratore LDAP" -#: cps/templates/config_edit.html:251 +#: cps/templates/config_edit.html:273 msgid "LDAP Administrator Password" msgstr "Password amministratore LDAP" -#: cps/templates/config_edit.html:256 +#: cps/templates/config_edit.html:278 msgid "LDAP Distinguished Name (DN)" msgstr "Nome distinto LDAP (DN)" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:282 msgid "LDAP User Object Filter" msgstr "Filtro oggetto utente LDAP" -#: cps/templates/config_edit.html:265 +#: cps/templates/config_edit.html:287 msgid "LDAP Server is OpenLDAP?" msgstr "Il server LDAP è OpenLDAP?" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:289 msgid "Following Settings are Needed For User Import" msgstr "Per l'importazione degli utenti sono necessarie le seguenti impostazioni" -#: cps/templates/config_edit.html:269 +#: cps/templates/config_edit.html:291 msgid "LDAP Group Object Filter" msgstr "Filtro oggetto gruppo LDAP" -#: cps/templates/config_edit.html:273 +#: cps/templates/config_edit.html:295 msgid "LDAP Group Name" msgstr "Nome gruppo LDAP" -#: cps/templates/config_edit.html:277 +#: cps/templates/config_edit.html:299 msgid "LDAP Group Members Field" msgstr "Campo membri del gruppo LDAP" -#: cps/templates/config_edit.html:281 +#: cps/templates/config_edit.html:303 msgid "LDAP Member User Filter Detection" msgstr "Rilevamento filtro utente membro LDAP" -#: cps/templates/config_edit.html:283 +#: cps/templates/config_edit.html:305 msgid "Autodetect" msgstr "Trova automaticamente" -#: cps/templates/config_edit.html:284 +#: cps/templates/config_edit.html:306 msgid "Custom Filter" msgstr "Filtro personalizzato" -#: cps/templates/config_edit.html:289 +#: cps/templates/config_edit.html:311 msgid "LDAP Member User Filter" msgstr "Filtro utente membro LDAP" -#: cps/templates/config_edit.html:300 +#: cps/templates/config_edit.html:322 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "Ottieni le credenziali OAuth di %(provider)s" -#: cps/templates/config_edit.html:303 +#: cps/templates/config_edit.html:325 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "%(provider)s ID client OAuth" -#: cps/templates/config_edit.html:307 +#: cps/templates/config_edit.html:329 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "%(provider)s Secret OAuth Client" -#: cps/templates/config_edit.html:323 +#: cps/templates/config_edit.html:345 msgid "External binaries" msgstr "File eseguibili esterni" -#: cps/templates/config_edit.html:329 +#: cps/templates/config_edit.html:351 msgid "Path to Calibre Binaries" msgstr "Percorso dei file eseguibili di Calibre" -#: cps/templates/config_edit.html:337 +#: cps/templates/config_edit.html:359 msgid "Calibre E-Book Converter Settings" msgstr "Impostazioni del convertitore di libri di Calibre" -#: cps/templates/config_edit.html:340 +#: cps/templates/config_edit.html:362 msgid "Path to Kepubify E-Book Converter" msgstr "Percorso del convertitore di libri Kepubify" -#: cps/templates/config_edit.html:348 +#: cps/templates/config_edit.html:370 msgid "Location of Unrar binary" msgstr "Posizione del file binario di UnRar" -#: cps/templates/config_edit.html:364 +#: cps/templates/config_edit.html:386 msgid "Security Settings" msgstr "Impostazioni di sicurezza" -#: cps/templates/config_edit.html:372 +#: cps/templates/config_edit.html:394 msgid "Limit failed login attempts" msgstr "Limita tentativi di accesso non riusciti" -#: cps/templates/config_edit.html:376 +#: cps/templates/config_edit.html:398 msgid "Configure Backend for Limiter" msgstr "Configura il backend per il limitatore" -#: cps/templates/config_edit.html:380 +#: cps/templates/config_edit.html:402 msgid "Options for Limiter Backend" msgstr "Opzioni per il limitatore del Backend" -#: cps/templates/config_edit.html:386 +#: cps/templates/config_edit.html:408 msgid "Check if file extensions matches file content on upload" msgstr "Controlla se le estensioni dei file corrispondono al contenuto del file al momento del caricamento" -#: cps/templates/config_edit.html:389 +#: cps/templates/config_edit.html:411 msgid "Session protection" msgstr "Protezione sessione" -#: cps/templates/config_edit.html:391 +#: cps/templates/config_edit.html:413 msgid "Basic" msgstr "Di base" -#: cps/templates/config_edit.html:392 +#: cps/templates/config_edit.html:414 msgid "Strong" msgstr "Forte" -#: cps/templates/config_edit.html:397 +#: cps/templates/config_edit.html:419 msgid "User Password policy" msgstr "Politica password utente" -#: cps/templates/config_edit.html:401 +#: cps/templates/config_edit.html:423 msgid "Minimum password length" msgstr "Lunghezza minima password" -#: cps/templates/config_edit.html:406 +#: cps/templates/config_edit.html:428 msgid "Enforce number" msgstr "Obbliga numero" -#: cps/templates/config_edit.html:410 +#: cps/templates/config_edit.html:432 msgid "Enforce lowercase characters" msgstr "Obbliga caratteri minuscoli" -#: cps/templates/config_edit.html:414 +#: cps/templates/config_edit.html:436 msgid "Enforce uppercase characters" msgstr "Obbliga caratteri maiuscoli" -#: cps/templates/config_edit.html:418 +#: cps/templates/config_edit.html:440 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" msgstr "Obbliga caratteri (necessario per caratteri cinesi, giapponesi e coreani)" -#: cps/templates/config_edit.html:422 +#: cps/templates/config_edit.html:444 msgid "Enforce special characters" msgstr "Obbliga caratteri speciali" @@ -3183,27 +3271,27 @@ msgstr "I libri devono essere prima archiviati e il dispositivo sincronizzato pr msgid "Choose File Location" msgstr "Scegli la posizione del file" -#: cps/templates/modal_dialogs.html:81 +#: cps/templates/modal_dialogs.html:82 msgid "type" msgstr "tipo" -#: cps/templates/modal_dialogs.html:82 +#: cps/templates/modal_dialogs.html:83 msgid "name" msgstr "nome" -#: cps/templates/modal_dialogs.html:83 +#: cps/templates/modal_dialogs.html:84 msgid "size" msgstr "dimensione" -#: cps/templates/modal_dialogs.html:89 +#: cps/templates/modal_dialogs.html:90 msgid "Parent Directory" msgstr "Cartella superiore" -#: cps/templates/modal_dialogs.html:97 +#: cps/templates/modal_dialogs.html:99 msgid "Select" msgstr "Seleziona" -#: cps/templates/modal_dialogs.html:133 cps/templates/tasks.html:46 +#: cps/templates/modal_dialogs.html:135 cps/templates/tasks.html:46 msgid "Ok" msgstr "OK" @@ -3459,6 +3547,31 @@ msgstr "Una volta verificato, accederai automaticamente a questo dispositivo." msgid "This verification link will expire in 10 minutes." msgstr "Questo link di verifica scadrà tra 10 minuti." +#: cps/templates/remote_login_verify.html:4 +msgid "Approve Magic Link Login" +msgstr "" + +#: cps/templates/remote_login_verify.html:5 +msgid "Review the device that requested access before approving this login." +msgstr "" + +#: cps/templates/remote_login_verify.html:7 +msgid "IP address" +msgstr "" + +#: cps/templates/remote_login_verify.html:9 +msgid "Browser" +msgstr "" + +#: cps/templates/remote_login_verify.html:12 +#, python-format +msgid "If you approve this request, the device that started it will be logged in as %(username)s." +msgstr "" + +#: cps/templates/remote_login_verify.html:15 +msgid "Approve Login" +msgstr "" + #: cps/templates/schedule_edit.html:33 msgid "Generate Series Cover Thumbnails" msgstr "Genera miniature delle copertine delle serie" diff --git a/cps/translations/ja/LC_MESSAGES/messages.mo b/cps/translations/ja/LC_MESSAGES/messages.mo index 73da92a284729ba12195d2cbb68ad4c9b88af1d5..afda9113d2352ad9e86abd4650e334f077663e28 100644 GIT binary patch delta 11774 zcmX?qocYx;=K6a=EK?a67#OZGF)+w5Ffg1E1Mv{JMwfv>l7WGtR+oXnkb!|=x-J8Q zG6Ms{NnHj89R>!5x4IC0QhE#wLJSNH=6VpmmmULy0s{j>x*h|A8Uq7EhaLliIRgX3 zdOZdP4h9B>=Xwkbp$rW53?K9u7{VAB7~J$37%UkW80P9TFjz1!FkIJXU|?lnU=T21 zV6bOkU=TB4U|?rpUI@7FO$H1MTnr2hs|*+z z_!t-%wi+-n@Gvki95G;E5Mf|oxCmAE3@l#Hz`$n+Q7CN)QK)4IvDn-YVvsGA_JFDj zHe_JnXJBARGK4sw2&%r!5aN&;Lr6$WfvQ^$)xX^k5;BJj85oop7#QvwGBEJgGcYhP z89_7%7%?!2GB7YG8!<3QGcYh%8bKTsYQ(@G1+oyTuGWZwfs=uOVFHvt%Lw9uwMLMj z-2>$xHG=r~iV*`t3IhYfOCv}K`x!GZ*npzMn1P|*mw|!ds4)XWFaraFun7Z$Hz>|b z7#QLh7#KF2FfjNqFfa(2GB9W}FfhcMGB7AIFfeqRLVU2+lz{=1TrQYG(!z67hzCT> zAZbR+jDdlTfq}urjDdlhfq}u>jDbObfq^013=)+YW(@V{u(n#lx#GEgv@p`NXT3^gCw#CPzxE&A?8S%L(+npImF?9<_ru53=9la z<`9RjHfLb4VqjpnVO|e0Sl9xhQPP5eL6?DnLB)cBL6d=jA;<#aqZ$hahHwT3hDjEX zIDTaTi4rDD2w&C`;$u@w1_oIM1_pmih4U2KVFhu3lr<#k zOsp9g5R)K`QJBiE~v)28JL81_nPz1_nkdS%p2#GQVCx}7PP7sHwL-{&R z5FcAOK|bNP7wX!PLQa`abjSo2Nj*APLMe3b%Lb&T~3goeF9a;;|vK2QD+7Q z2?hoRO=n05I5|Un9O(=x*|MA=4r_OYSh&a;lK9p*LwtV384^;bogwzTc4nvt7bv1G z5FePkKn$>PfrLc33&g@q7f7Ykvf1Ks@#os_(N0#OJJ@ z;51gxz~c!ia!ouT*)GWwl1Qd`LUO@2Pe=peK9pwjf>@vnrMyZ%7bb@rL;1jW@)nKfM_kv=|r| zxP2h0*31WzeG+^ii8j**;?q1Ih{2UUkRV>}1Brq?J`4<|3=9lsq3W1@AyLBT3$6b} zd?7AV@`co9mcEcg6$Rzz`9jM6eqTt)Z1II;w=2F7pM8Ytm-K^JXy6BNxT7DWk_q;M zRPXtI5cP-sAojiXV_>KURkuw35QXgikW{M-rS1F~7_1o>7$W^4KAh?giMs{to0F>4@1Tp$n<$4Y^axU~p`gp_+AB#}l3LOf6!2q`Zn1VW;6OCTg_4+cV_`X*HT ze_%Z%XnBGlsoO9J()e@XpMF>O;dIiMW1R7$j)the1MM zV;Cgvj)Xz-?K!CUoiIqMeIEvi^RHo$-0&+55)vxm5OIfah&tTXn7>0pjsCR@$sWbhzFiS)qRX)U|?ckVE7pcap)hgMGOo&QD7f4 z*hWD-7!}39parV`3!)&c)7eoB;4agdCXmhLmvG(GUx}q9H!(kB0bU zc{IerZPAd#yc5d57Y#`h52GRGvBoek=rJ%bc*H=Wpge|wp&k^Jn`0nB{TNEi#6lbr z8q2`o!N9;!77Gc|{jre#z{6OGL3(izb+K`f>{}NHiITH%klb)14iv-;3~%BfiS2J3 z#2mJGh{HAF8S24}M)P=xODp3cAu%@|(kDC@4=GYr6CfcFoB#=tq6A21a%}=6M4l!< zEO?awNwl96AW_Dc2odK@goKPxBE(_liIBA5omdZvyNE=Hi;|!U3KJoTrZo}bgXvKI zibRO|T~KvL5+OdmkqF7gj}syJ{WH`8+aySu@k)ZEtw1Q9mIQG?bv=~Pkp#)FQ=$BI zNf00GhVl<5L40~431Z>ZBuHw1kOZ;#O%f!r{()K`l?*8f^^+muUdfOU&Pax&ot|V! z$kZ=MhPZ4kRKuZUNF{MM84_fyDG-aaQXoDtOM#>b+Y|ls{AAsXUSAr=%v`BkZqxa@<9&q;+iWHHpB^{Ega z?18E~nhFV-%TWHkR7h04NriONzokMtHosCKX~-lE$LFH+XAZ|#5ln1S8 z5C?RpL3}t9O0P_V_+TfLe*T;#OIRf5cAZa;wI?~3~ZqM z@0<>4V0fiN%Kp-HNZhSRhjbtgr$Y>WmJV^qhjd5*!jJ)Rs8|NXLYWMRI^_(Ag}ND# z64fdLl9&TCAW@N=0V%*LG8h=@LH+VI8ITazkpU^84rV~2mkV*oqg+Ufg*Ol41LHhMiI|)R zX$wxwgE(ws9wbUG4`~l9&xaJryYeAEeVq@9OZfswb}}n~7*tRIDWZ25KpGmi3Lp;WDTJ73R0s(P zi$aJ4oeRMZu4izEFc=~WAt8|srK<}eKI|@pIB+#od`}_7L1zjfLHf5466CB!5d9)W zkf=~8f+SY$B1j47Rs_ivDMgTywy+2ka`g-hT}2QBRu@4m+y&*|DuP78%OXf36Dfwo zy?Zglf`Vd5ZYeK@1of0+NXfaVn1LaLfq~&vF~mao5{N@}N+7A_aycZ(3(FyCp#m!3Sq?F<56Yie4spP|a!3d)Du?)dbvY!2PeS<*%NZCJ zGBPmyFRzCvSXjxx;Ksnfu)h-0*<`DN3?AuLK~iy66(n^}sDi}t`YK2Rv(qz))Qa zNxk=>^!r+fkN?*~5*b?^BuJI(Ac@Go4iYt~br6FppyE@Y>Q>c3Qu#F~{k{%jJ_oeH zBT)}Ar(UTZVvt2W#6s_SNU9Bj^5da&T0JBLa-kY~>LC^{s)rc7589JDR}aZGpP}+{ z4G?u!P&%vuQjQcgfbFSgSOyi?+yHUN^9G1RenI(+jS!cLKxwT;h=C4`kVF{M$iR@z zz`#)42x)rVZ)9Ky1PxL(F)&1dLbeIg6}txI>oqel#4<22bT%_EB!K$=&zm7}=+Odk zd3_6nzp4e|{JM5XHh$mEz)%mGGLh_HV5nnYU~ue!C_K;s$?s>O^z{x% z96#)UM8!v_I`&S8xJV}?L{vH%z$2j!osf`9=!Aq|YbPY6mO$lKcS1aNx|5+EJSp_H z6H>IQc0t7Fi#!OyxF7-ldqFtBwqFf=kSFwF0U)P{;Z5Qq3f>G&Rq zNAi0hQCiajF>iSfBu(t=fp|o+w;mFN`n?bz#PmX3T+s{BIK3B=S`YOyFyt^WFnsF; zB^m~XAp--0>J&&6OrHV? z^378q20fnwG58CV{yha!=`c-&h;vPas1uwDNpx~hzVlRwLj$Hl1|F)XLW=aAQ2N_c zP;RPcU@)ErDbwAiK@wZuG>Fe;OoRCNBvk$dlopr{@tMVRh=qRBAt6^h9WwS)I~~#p zJvkj>4$BOPLrrHu)Z5H}=uZUEp!{Dx15(EKLKUn6NiZ-loQLwC&Va-v*GxzVDbIxX z%zh>$8)eOeL{ZO7h{5w_LUPL%DE|tSeg&l&W416&Q()Z(-4KW~aHpC$Xvmqfcdp5+UOJ_sU(3;s0^R~_g1vLZ1_1O@Q zyqXQk9n5nW>cNx7!gC-JYI7hG_H!UU@t*^6Kn?Da?;l6ngmtL6%QTQCnXP6HW7oHFC zx!Qb)#jf)q4)%x2$Ipj^K+${#1{ctD-F(RK-M;yd)-}rlh(nzhK;%p67eLDHolyEG zl(t+55wBbbX-@B42ubCy7eajUV841voa1w#EYhy%7QgS6E? zEQ9!nV>zT9@30)wXpCMCaZtf>NQdj<*Oh?Z{sQkh6)A-hI6YR&2;zG3=CPI1q-Vg7=%Fi|LST;>V5&Gh1Wph z%5DuLj$+q9EGSz8QP;T!9CQp@pyH3#K!Wt^8i<3W) zA?Dmz4~d%h>mg;o^aeV+K2hHSF)(-w#HUePAW>2P6>r`GnUwC@0!hT@wm^K&u@w>( zGFu^0ptBWXU*J|qRAkj}g~auttq_+!+{(ZZ&%nU&ZY#thziki$Qno?Vm288=>EvyY z5IMdLV&FfhI`Qog_3GOpMY#EPsKd8I)J1KFRC2}JAr7jayB$)`AA)LpupKg4^kF+B z`?&0Y80fJBVo(H>j^6a-mYhaKMmiIQhfnr|nhh&9^@@oC3Sh=mV!LedWFE^tGn zo}p+LMB}bq5DOmdf^@lF?t=6M`FBG`x21PO(uf?C@4g!n=U%%Z7Ip82RJ(U~gAHbo z*aNXRVGk&uGcfGf15u~37m`S;_JZ1i^$ZLX_d>GOo4pJSnG6gJ;`<kd^l$b<`h*+@AP!AB0GZBTd;rqg z{&s+Y!4j1JOAkUEu>K%q;NaFlNTs2F2x4&QAxKoTLiwFgdgdWWh^;&X@%e^B5C^?J z1WBBXharht1WL;thLoThP}=q|14BJ%{Z7zfNRVVg6*e4(q~0zle;$-xahQRj2vpP_ zh9p+iBM=7|9f25Z38npxK+2J1C|!C4;;{B3kjCm2&?Pe3d_1=V;FN>#m;9S1_nUs@H3DgjynTsFLa)Pcx2%j zNH*Sb2I3&Ovk-lHXCXZv)3XqDF=s)Q9BBL>%wS;XKMM(x^-u+;p&IW&>8EEQ4tsMJ z;vlYb5TA;l0~y4?pnDEdF8D&lOV2^f>pll@=<;)rv~=klq~-J)qz;t-dCx-(Qa%rH zspWY{iRA#LH=Kv~NZ|q``*mG_MAhF55QCI1LijEhA^gmXkX+CW};<3cb5C@fCh7`>!E<>7PA1*W0gO}S`UV)VP=~p22fA1AY{@w$n?_Yr!#B>#s z+9j?+ES9+naftO*h=ZM=w9i!rh7QnL(W{WCx_=eYt9}EOPr3%tpL4Aq(#-C@1{uXZ zeGL)ya_QV>L#R#m3|ZAv!hV@%uPrLT)qi0;N?w7zu+g7*1iSN zAA1YpkgQvfxNf@zNfYaCK`gv*3sPeKy9KFZ>LqSNhFs!qLyFL?w;|bs>kh;q**lQ5 zVR;9V7J}|DFiZk1K!l1L-i4_5x(f-RSSWwWU1+Mm3n?Ei-G!9>&+bCZ`+67b;CcqW zdk~jNLupSaU49SJu~>Q!l32dng9M@NeMkr--3J@MP;?&>h4oPJ{r4dubsj4J^gbjc zKi!8|{1eI-dH~X2&%hx00Airp14xjXJ%A|8cmPRMjSnC`?0x_-Xx;;e&z3%5U}$Gx zV7TxAQuIbVgjl@lA*6&m@DNhp-+c%%&)^ZH2={yhF(>K~1A{tfq9E}R#G=ke5CbMd z`70kmG;W4!I0L0GKY|Rm-+BaTq&|2AY10Wmh74xeZtm1|b=mx?a1R^1g@U1(m4U_P VwH4Bgj24?uR_=}8y#J;E7XXSymdgMD delta 11841 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 diff --git a/cps/translations/ja/LC_MESSAGES/messages.po b/cps/translations/ja/LC_MESSAGES/messages.po index c533b9214..3de2b39b9 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: 2026-08-01 11:42+0200\n" +"POT-Creation-Date: 2026-08-08 16:08+0200\n" "PO-Revision-Date: 2018-02-07 02:20-0500\n" "Last-Translator: subdiox \n" "Language: ja\n" @@ -16,519 +16,558 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" +"Generated-By: Babel 2.18.0\n" #: cps/about.py:85 msgid "Statistics" msgstr "統計" -#: cps/admin.py:151 +#: cps/admin.py:154 msgid "Server restarted, please reload page." msgstr "" -#: cps/admin.py:153 +#: cps/admin.py:156 msgid "Performing Server shutdown, please close window." msgstr "" -#: cps/admin.py:161 +#: cps/admin.py:164 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:164 +#: cps/admin.py:167 msgid "Unknown command" msgstr "不明なコマンド" -#: cps/admin.py:175 +#: cps/admin.py:178 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "" -#: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 -#: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 -#: cps/uploader.py:117 +#: cps/admin.py:211 cps/editbooks.py:825 cps/editbooks.py:875 +#: cps/editbooks.py:1564 cps/templates/remote_login_verify.html:8 +#: cps/templates/remote_login_verify.html:10 cps/updater.py:615 +#: cps/uploader.py:117 cps/uploader.py:126 msgid "Unknown" msgstr "不明" -#: cps/admin.py:233 +#: cps/admin.py:236 msgid "Admin page" msgstr "管理者ページ" -#: cps/admin.py:253 +#: cps/admin.py:256 msgid "Basic Configuration" msgstr "基本設定" -#: cps/admin.py:291 +#: cps/admin.py:294 msgid "UI Configuration" msgstr "UI設定" -#: cps/admin.py:315 cps/admin.py:1002 cps/db.py:809 cps/search.py:150 -#: cps/web.py:750 +#: cps/admin.py:318 cps/admin.py:1005 cps/db.py:809 cps/search.py:150 +#: cps/web.py:752 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "カスタムカラムの%(column)d列目がcalibreのDBに存在しません" -#: cps/admin.py:333 cps/templates/admin.html:51 +#: cps/admin.py:336 cps/templates/admin.html:51 msgid "Edit Users" msgstr "ユーザーを編集" -#: cps/admin.py:378 cps/opds.py:559 cps/templates/grid.html:14 +#: cps/admin.py:381 cps/opds.py:559 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "全て" -#: cps/admin.py:401 cps/admin.py:1432 +#: cps/admin.py:404 cps/admin.py:1460 msgid "User not found" msgstr "ユーザーが見つかりません" -#: cps/admin.py:415 +#: cps/admin.py:418 #, python-brace-format msgid "{} users deleted successfully" msgstr "{}人のユーザーが削除されました" -#: cps/admin.py:438 cps/templates/config_view_edit.html:133 +#: cps/admin.py:441 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "全て表示" -#: cps/admin.py:459 cps/admin.py:465 +#: cps/admin.py:462 cps/admin.py:468 msgid "Malformed request" msgstr "不正なリクエスト" -#: cps/admin.py:477 cps/admin.py:2078 +#: cps/admin.py:480 cps/admin.py:2156 msgid "Guest Name can't be changed" msgstr "ゲストユーザーの名前は変更できません" -#: cps/admin.py:489 +#: cps/admin.py:492 msgid "Guest can't have this role" msgstr "ゲストユーザーはこのロールを持つことができません" -#: cps/admin.py:501 cps/admin.py:2032 +#: cps/admin.py:504 cps/admin.py:2110 msgid "No admin user remaining, can't remove admin role" msgstr "管理者ユーザーが残っておらず、管理者ロールを削除できません" -#: cps/admin.py:505 cps/admin.py:519 +#: cps/admin.py:508 cps/admin.py:522 msgid "Value has to be true or false" msgstr "値はtrueかfalseのどちらかでなければなりません" -#: cps/admin.py:507 +#: cps/admin.py:510 msgid "Invalid role" msgstr "無効なロール" -#: cps/admin.py:511 +#: cps/admin.py:514 msgid "Guest can't have this view" msgstr "ゲストユーザーはこの画面を表示できません" -#: cps/admin.py:521 +#: cps/admin.py:524 msgid "Invalid view" msgstr "無効な表示" -#: cps/admin.py:524 +#: cps/admin.py:527 msgid "Guest's Locale is determined automatically and can't be set" msgstr "ゲストユーザーの言語設定は自動的に決定されるため、固定することはできません" -#: cps/admin.py:528 +#: cps/admin.py:531 msgid "No Valid Locale Given" msgstr "有効な言語設定がありません" -#: cps/admin.py:539 +#: cps/admin.py:542 msgid "No Valid Book Language Given" msgstr "有効な本の言語がありません" -#: cps/admin.py:541 cps/editbooks.py:243 cps/editbooks.py:428 -#: cps/editbooks.py:430 +#: cps/admin.py:544 cps/editbooks.py:260 cps/editbooks.py:445 +#: cps/editbooks.py:447 msgid "Parameter not found" msgstr "パラメータが見つかりません" -#: cps/admin.py:578 +#: cps/admin.py:581 msgid "Invalid Read Column" msgstr "無効な読み取り列" -#: cps/admin.py:584 +#: cps/admin.py:587 msgid "Invalid Restricted Column" msgstr "無効な制限列" -#: cps/admin.py:604 cps/admin.py:1903 +#: cps/admin.py:607 cps/admin.py:1981 msgid "Calibre-Web configuration updated" msgstr "Calibre-Webの設定を更新しました" -#: cps/admin.py:616 +#: cps/admin.py:619 msgid "Do you really want to delete the Kobo Token?" msgstr "Koboのトークンを削除してもよろしいですか?" -#: cps/admin.py:618 +#: cps/admin.py:621 msgid "Do you really want to delete this domain?" msgstr "このドメインを削除してもよろしいですか?" -#: cps/admin.py:620 +#: cps/admin.py:623 msgid "Do you really want to delete this user?" msgstr "このユーザーを削除してもよろしいですか?" -#: cps/admin.py:622 +#: cps/admin.py:625 msgid "Do you really want to delete this book?" msgstr "" -#: cps/admin.py:624 +#: cps/admin.py:627 msgid "Are you sure you want to delete this shelf?" msgstr "この本棚を削除してもよろしいですか?" -#: cps/admin.py:626 +#: cps/admin.py:629 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "選択したユーザーの言語設定を変更してもよろしいですか?" -#: cps/admin.py:628 +#: cps/admin.py:631 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "選択したユーザーが表示できる本の言語を変更してもよろしいですか?" -#: cps/admin.py:630 +#: cps/admin.py:633 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "選択したユーザーの選択したロールを変更してもよろしいですか?" -#: cps/admin.py:632 +#: cps/admin.py:635 msgid "Are you sure you want to change the archive status for the selected book(s)?" msgstr "" -#: cps/admin.py:634 +#: cps/admin.py:637 msgid "Are you sure you want to change the read status for the selected book(s)?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:639 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "選択したユーザーの選択した制限を変更してもよろしいですか?" -#: cps/admin.py:638 +#: cps/admin.py:641 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "選択したユーザーの選択した表示制限を変更してもよろしいですか?" -#: cps/admin.py:641 +#: cps/admin.py:644 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "選択したユーザーの本棚同期の動作を変更してもよろしいですか?" -#: cps/admin.py:643 +#: cps/admin.py:646 msgid "Are you sure you want to change Calibre library location?" msgstr "Calibreライブラリのパスを変更してもよろしいですか?" -#: cps/admin.py:645 +#: cps/admin.py:648 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "Calibre-Webは新しい表紙を検索してそのサムネイルを更新しますが、これにはしばらく時間がかかるかもしれません" -#: cps/admin.py:648 +#: cps/admin.py:651 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Calibre-Webの同期DBを削除して強制的にKoboリーダーと同期してもよろしいですか?" -#: cps/admin.py:891 cps/admin.py:897 cps/admin.py:907 cps/admin.py:917 +#: cps/admin.py:894 cps/admin.py:900 cps/admin.py:910 cps/admin.py:920 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "拒否" -#: cps/admin.py:893 cps/admin.py:899 cps/admin.py:909 cps/admin.py:919 +#: cps/admin.py:896 cps/admin.py:902 cps/admin.py:912 cps/admin.py:922 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "許可" -#: cps/admin.py:952 +#: cps/admin.py:955 #, python-brace-format msgid "{} sync entries deleted" msgstr "{}件の同期項目を削除しました" -#: cps/admin.py:993 +#: cps/admin.py:996 msgid "Tag not found" msgstr "タグが見つかりません" -#: cps/admin.py:1011 +#: cps/admin.py:1014 msgid "Invalid Action" msgstr "無効なアクションです" -#: cps/admin.py:1138 +#: cps/admin.py:1137 +#, python-format +msgid "Invalid reverse proxy trusted IP/CIDR entry: %(entry)s" +msgstr "" + +#: cps/admin.py:1148 +#, python-format +msgid "Invalid %(label)s: %(value)s" +msgstr "" + +#: cps/admin.py:1166 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.jsonがWebアプリケーション用に設定されていません" -#: cps/admin.py:1183 +#: cps/admin.py:1211 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "ログファイルの場所が無効です。正しいパスを入力してください" -#: cps/admin.py:1189 +#: cps/admin.py:1217 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "アクセスログファイルの場所が無効です。正しいパスを入力してください" -#: cps/admin.py:1223 +#: cps/admin.py:1251 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "LDAPのプロバイダ、ポート番号、DN、ユーザーIDを入力してください" -#: cps/admin.py:1229 +#: cps/admin.py:1257 msgid "Please Enter a LDAP Service Account and Password" msgstr "LDAPのサービスアカウント名とパスワードを入力してください" -#: cps/admin.py:1232 +#: cps/admin.py:1260 msgid "Please Enter a LDAP Service Account" msgstr "LDAPのサービスアカウント名を入力してください" -#: cps/admin.py:1237 +#: cps/admin.py:1265 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "LDAPのグループフィルタには \"%s\" というフォーマットのIDが一つ必要です" -#: cps/admin.py:1239 +#: cps/admin.py:1267 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "LDAPのグループフィルタ内の括弧が一致しません" -#: cps/admin.py:1243 +#: cps/admin.py:1271 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAPのユーザーフィルタには \"%s\" というフォーマットのIDが一つ必要です" -#: cps/admin.py:1245 +#: cps/admin.py:1273 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "LDAPのユーザーフィルタ内の括弧が一致しません" -#: cps/admin.py:1252 +#: cps/admin.py:1280 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAPのメンバーフィルタには \"%s\" というフォーマットのIDが一つ必要です" -#: cps/admin.py:1254 +#: cps/admin.py:1282 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "LDAPのメンバーフィルタ内の括弧が一致しません" -#: cps/admin.py:1261 +#: cps/admin.py:1289 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAPのCA証明書、証明書、キーの場所が無効です。正しいパスを入力してください" -#: cps/admin.py:1292 cps/templates/admin.html:53 +#: cps/admin.py:1320 cps/templates/admin.html:53 msgid "Add New User" msgstr "新規ユーザーを追加" -#: cps/admin.py:1301 cps/templates/admin.html:100 +#: cps/admin.py:1329 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "メールサーバー設定を編集" -#: cps/admin.py:1320 +#: cps/admin.py:1348 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1340 cps/admin.py:1343 cps/admin.py:1728 cps/admin.py:1887 -#: cps/admin.py:1985 cps/admin.py:2106 cps/editbooks.py:169 -#: cps/editbooks.py:755 cps/editbooks.py:1474 cps/shelf.py:90 cps/shelf.py:144 +#: cps/admin.py:1368 cps/admin.py:1371 cps/admin.py:1756 cps/admin.py:1965 +#: cps/admin.py:2063 cps/admin.py:2184 cps/editbooks.py:170 +#: cps/editbooks.py:772 cps/editbooks.py:1518 cps/shelf.py:90 cps/shelf.py:144 #: cps/shelf.py:194 cps/shelf.py:237 cps/shelf.py:287 cps/shelf.py:327 -#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:160 cps/web.py:1526 +#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:161 cps/web.py:1536 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "DBエラー: %(error)s" -#: cps/admin.py:1350 +#: cps/admin.py:1378 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "%(email)s へのテストメール送信がキューに追加されました。結果を見るにはタスクを確認してください" -#: cps/admin.py:1353 +#: cps/admin.py:1381 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "%(res)s へのテストメール送信中にエラーが発生しました" -#: cps/admin.py:1355 +#: cps/admin.py:1383 msgid "Please configure your e-mail address first..." msgstr "初めにメールアドレスを設定してください" -#: cps/admin.py:1357 +#: cps/admin.py:1385 msgid "Email Server Settings updated" msgstr "メールサーバーの設定を更新しました" -#: cps/admin.py:1380 cps/templates/admin.html:195 +#: cps/admin.py:1408 cps/templates/admin.html:211 msgid "Edit Scheduled Tasks Settings" msgstr "スケジュールタスク設定を編集" -#: cps/admin.py:1392 +#: cps/admin.py:1420 msgid "Invalid start time for task specified" msgstr "指定したタスクの開始時刻が無効です" -#: cps/admin.py:1397 +#: cps/admin.py:1425 msgid "Invalid duration for task specified" msgstr "指定したタスクの期間が無効です" -#: cps/admin.py:1407 +#: cps/admin.py:1435 msgid "Scheduled tasks settings updated" msgstr "スケジュールタスクの設定を更新しました" -#: cps/admin.py:1417 cps/admin.py:1466 cps/admin.py:2102 cps/web.py:1325 +#: cps/admin.py:1445 cps/admin.py:1494 cps/admin.py:2180 cps/web.py:1335 msgid "Oops! An unknown error occurred. Please try again later." msgstr "不明なエラーが発生しました。あとで再試行してください。" -#: cps/admin.py:1421 +#: cps/admin.py:1449 msgid "Settings DB is not Writeable" msgstr "設定DBが書き込みできません" -#: cps/admin.py:1451 cps/admin.py:2094 +#: cps/admin.py:1479 cps/admin.py:2172 #, python-format msgid "Edit User %(nick)s" msgstr "ユーザー %(nick)s を編集" -#: cps/admin.py:1463 +#: cps/admin.py:1491 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "" -#: cps/admin.py:1469 +#: cps/admin.py:1497 msgid "Oops! Please configure the SMTP mail settings." msgstr "" -#: cps/admin.py:1480 +#: cps/admin.py:1508 msgid "Logfile viewer" msgstr "ログファイルビューア" -#: cps/admin.py:1546 +#: cps/admin.py:1574 msgid "Requesting update package" msgstr "更新データを要求中" -#: cps/admin.py:1547 +#: cps/admin.py:1575 msgid "Downloading update package" msgstr "更新データをダウンロード中" -#: cps/admin.py:1548 +#: cps/admin.py:1576 msgid "Unzipping update package" msgstr "更新データを展開中" -#: cps/admin.py:1549 +#: cps/admin.py:1577 msgid "Replacing files" msgstr "ファイルを置換中" -#: cps/admin.py:1550 +#: cps/admin.py:1578 msgid "Database connections are closed" msgstr "DB接続を切断" -#: cps/admin.py:1551 +#: cps/admin.py:1579 msgid "Stopping server" msgstr "サーバー停止中" -#: cps/admin.py:1552 +#: cps/admin.py:1580 msgid "Update finished, please press okay and reload page" msgstr "アップデート完了、OKを押してページを再読み込みしてください" -#: cps/admin.py:1553 cps/admin.py:1554 cps/admin.py:1555 cps/admin.py:1556 -#: cps/admin.py:1557 cps/admin.py:1558 +#: cps/admin.py:1581 cps/admin.py:1582 cps/admin.py:1583 cps/admin.py:1584 +#: cps/admin.py:1585 cps/admin.py:1586 msgid "Update failed:" msgstr "アップデート失敗:" -#: cps/admin.py:1553 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1581 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTPエラー" -#: cps/admin.py:1554 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1582 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "接続エラー" -#: cps/admin.py:1555 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1583 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "接続確立中にタイムアウトしました" -#: cps/admin.py:1556 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1584 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "エラー発生" -#: cps/admin.py:1557 +#: cps/admin.py:1585 msgid "Update file could not be saved in temp dir" msgstr "更新データを一時フォルダに保存できませんでした" -#: cps/admin.py:1558 +#: cps/admin.py:1586 msgid "Files could not be replaced during update" msgstr "更新中にファイルを置換できませんでした" -#: cps/admin.py:1582 +#: cps/admin.py:1610 msgid "Failed to extract at least One LDAP User" msgstr "少なくとも1人のLDAPユーザーの抽出に失敗しました" -#: cps/admin.py:1627 +#: cps/admin.py:1655 msgid "Failed to Create at Least One LDAP User" msgstr "少なくとも1人のLDAPユーザーの作成に失敗しました" -#: cps/admin.py:1640 +#: cps/admin.py:1668 #, python-format msgid "Error: %(ldaperror)s" msgstr "エラー: %(ldaperror)s" -#: cps/admin.py:1644 +#: cps/admin.py:1672 msgid "Error: No user returned in response of LDAP server" msgstr "エラー: LDAPサーバーのレスポンスでユーザーが返されません" -#: cps/admin.py:1680 +#: cps/admin.py:1708 msgid "At Least One LDAP User Not Found in Database" msgstr "DB内にLDAPユーザーが1人も見つかりません" -#: cps/admin.py:1682 +#: cps/admin.py:1710 #, python-brace-format msgid "{} User Successfully Imported" msgstr "{}人のユーザーをインポートしました" -#: cps/admin.py:1740 +#: cps/admin.py:1768 msgid "Books path not valid" msgstr "" -#: cps/admin.py:1746 +#: cps/admin.py:1774 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "DBの場所が無効です。正しいパスを入力してください" -#: cps/admin.py:1774 +#: cps/admin.py:1802 msgid "DB is not Writeable" msgstr "DBへの書き込みができません" -#: cps/admin.py:1788 +#: cps/admin.py:1816 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "キーファイルの場所が無効です。正しいパスを入力してください" -#: cps/admin.py:1792 +#: cps/admin.py:1820 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "証明書ファイルの場所が無効です。正しいパスを入力してください" -#: cps/admin.py:1872 +#: cps/admin.py:1846 +msgid "Kepubify binary not found" +msgstr "" + +#: cps/admin.py:1894 +msgid "reverse proxy login header name" +msgstr "" + +#: cps/admin.py:1904 +msgid "reverse proxy shared secret header name" +msgstr "" + +#: cps/admin.py:1913 +msgid "Please configure both reverse proxy shared secret header name and secret" +msgstr "" + +#: cps/admin.py:1917 +msgid "Please configure reverse proxy shared secret header name and secret or disable the feature" +msgstr "" + +#: cps/admin.py:1922 +msgid "Please configure at least one trusted reverse proxy IP or CIDR" +msgstr "" + +#: cps/admin.py:1946 msgid "Password length has to be between 1 and 40" msgstr "" -#: cps/admin.py:1926 +#: cps/admin.py:1957 cps/helper.py:1007 +msgid "Please specify a valid UnRar directory" +msgstr "" + +#: cps/admin.py:2004 msgid "Database Settings updated" msgstr "DB設定を更新しました" -#: cps/admin.py:1934 +#: cps/admin.py:2012 msgid "Database Configuration" msgstr "DB設定" -#: cps/admin.py:1949 cps/web.py:1295 +#: cps/admin.py:2027 cps/web.py:1305 msgid "Oops! Please complete all fields." msgstr "全ての項目を入力してください" -#: cps/admin.py:1958 +#: cps/admin.py:2036 msgid "E-mail is not from valid domain" msgstr "このメールは有効なドメインからのものではありません" -#: cps/admin.py:1964 +#: cps/admin.py:2042 msgid "Add new user" msgstr "新規ユーザー追加" -#: cps/admin.py:1975 +#: cps/admin.py:2053 #, python-format msgid "User '%(user)s' created" msgstr "ユーザー '%(user)s' を作成しました" -#: cps/admin.py:1981 +#: cps/admin.py:2059 msgid "Oops! An account already exists for this Email. or name." msgstr "このメールアドレスかニックネームで登録されたアカウントがすでに存在します。" -#: cps/admin.py:2011 +#: cps/admin.py:2089 #, python-format msgid "User '%(nick)s' deleted" msgstr "ユーザー '%(nick)s' を削除しました" -#: cps/admin.py:2014 +#: cps/admin.py:2092 msgid "Can't delete Guest User" msgstr "ゲストユーザーは削除できません" -#: cps/admin.py:2017 +#: cps/admin.py:2095 msgid "No admin user remaining, can't delete user" msgstr "管理者ユーザーが残っておらず、ユーザーを削除できません" -#: cps/admin.py:2072 cps/web.py:1475 +#: cps/admin.py:2150 cps/web.py:1485 msgid "Email can't be empty and has to be a valid Email" msgstr "" -#: cps/admin.py:2098 +#: cps/admin.py:2176 #, python-format msgid "User '%(nick)s' updated" msgstr "ユーザー '%(nick)s' を更新しました" @@ -541,145 +580,153 @@ msgstr "ユーザー '%(nick)s' を更新しました" msgid "Search" msgstr "検索" -#: cps/converter.py:31 +#: cps/converter.py:32 msgid "not installed" msgstr "インストールされていません" -#: cps/converter.py:32 +#: cps/converter.py:33 msgid "Execution permissions missing" msgstr "実行権限がありません" -#: cps/db.py:1129 cps/templates/config_edit.html:207 +#: cps/db.py:1129 cps/templates/config_edit.html:229 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:565 cps/web.py:599 cps/web.py:644 cps/web.py:684 cps/web.py:711 -#: cps/web.py:998 cps/web.py:1028 cps/web.py:1073 cps/web.py:1101 -#: cps/web.py:1140 +#: cps/web.py:567 cps/web.py:601 cps/web.py:646 cps/web.py:686 cps/web.py:713 +#: cps/web.py:1000 cps/web.py:1030 cps/web.py:1075 cps/web.py:1103 +#: cps/web.py:1142 msgid "None" msgstr "なし" -#: cps/editbooks.py:155 +#: cps/editbooks.py:156 #, python-format msgid "File %(file)s uploaded" msgstr "ファイル %(file)s をアップロードしました" -#: cps/editbooks.py:184 +#: cps/editbooks.py:185 msgid "Source or destination format for conversion missing" msgstr "変換元の形式または変換後の形式が指定されていません" -#: cps/editbooks.py:192 +#: cps/editbooks.py:189 cps/editbooks.py:197 +msgid "Source format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:201 +msgid "Destination format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:209 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "本の %(book_format)s への変換がキューに追加されました" -#: cps/editbooks.py:196 +#: cps/editbooks.py:213 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "この本の変換中にエラーが発生しました: %(res)s" -#: cps/editbooks.py:297 +#: cps/editbooks.py:314 msgid "Changes successfully applied" msgstr "" -#: cps/editbooks.py:317 +#: cps/editbooks.py:334 msgid "Value is missing on request" msgstr "" -#: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 -#: cps/editbooks.py:1146 cps/web.py:532 cps/web.py:1567 cps/web.py:1613 -#: cps/web.py:1663 +#: cps/editbooks.py:336 cps/editbooks.py:343 cps/editbooks.py:644 +#: cps/editbooks.py:1170 cps/web.py:534 cps/web.py:1577 cps/web.py:1623 +#: cps/web.py:1673 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "選択した本は利用できません。ファイルが存在しないか、アクセスできません" -#: cps/editbooks.py:673 cps/editbooks.py:1503 +#: cps/editbooks.py:690 cps/editbooks.py:1547 msgid "User has no rights to upload cover" msgstr "ユーザーは表紙をアップロードする権限がありません" -#: cps/editbooks.py:694 cps/editbooks.py:938 +#: cps/editbooks.py:711 cps/editbooks.py:961 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "IDは大文字小文字を区別しません。元のIDを上書きします" -#: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 +#: cps/editbooks.py:726 cps/editbooks.py:935 cps/editbooks.py:1306 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "'%(langname)s' は有効な言語ではありません" -#: cps/editbooks.py:737 +#: cps/editbooks.py:754 msgid "Metadata successfully updated" msgstr "メタデータを更新しました" -#: cps/editbooks.py:760 +#: cps/editbooks.py:777 #, python-brace-format msgid "Error editing book: {}" msgstr "本編集中のエラー: {}" -#: cps/editbooks.py:856 +#: cps/editbooks.py:879 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "アップロードした本はすでにライブラリに存在します。新しくアップロードする前に変更を加えてください: " -#: cps/editbooks.py:950 cps/editbooks.py:1420 +#: cps/editbooks.py:973 cps/editbooks.py:1464 msgid "File type isn't allowed to be uploaded to this server" msgstr "" -#: cps/editbooks.py:956 cps/editbooks.py:1431 +#: cps/editbooks.py:979 cps/editbooks.py:1475 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "ファイル拡張子 '%(ext)s' をこのサーバーにアップロードすることは許可されていません" -#: cps/editbooks.py:960 cps/editbooks.py:1436 +#: cps/editbooks.py:983 cps/editbooks.py:1480 msgid "File to be uploaded must have an extension" msgstr "アップロードするファイルには拡張子が必要です" -#: cps/editbooks.py:968 +#: cps/editbooks.py:992 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "ファイル %(filename)s は一時フォルダに保存できませんでした" -#: cps/editbooks.py:988 +#: cps/editbooks.py:1012 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "表紙ファイル %(file)s の移動に失敗しました: %(error)s" -#: cps/editbooks.py:1041 +#: cps/editbooks.py:1065 msgid "Book Format Successfully Deleted" msgstr "本の形式を削除しました" -#: cps/editbooks.py:1044 cps/editbooks.py:1061 +#: cps/editbooks.py:1068 cps/editbooks.py:1085 msgid "Book Successfully Deleted" msgstr "本を削除しました" -#: cps/editbooks.py:1065 +#: cps/editbooks.py:1089 msgid "You are missing permissions to delete books" msgstr "本を削除する権限がありません" -#: cps/editbooks.py:1139 +#: cps/editbooks.py:1163 #, python-brace-format msgid "Book with id \"{}\" could not be deleted: not found" msgstr "" -#: cps/editbooks.py:1181 +#: cps/editbooks.py:1205 msgid "edit metadata" msgstr "メタデータを編集" -#: cps/editbooks.py:1234 +#: cps/editbooks.py:1267 #, python-format msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1425 +#: cps/editbooks.py:1469 msgid "User has no rights to upload additional file formats" msgstr "新たなファイル形式をアップロードする権限がありません" -#: cps/editbooks.py:1449 +#: cps/editbooks.py:1493 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "%(path)s の作成に失敗しました (Permission denied)。" -#: cps/editbooks.py:1456 +#: cps/editbooks.py:1500 #, python-format msgid "Failed to store file %(file)s." msgstr "ファイル %(file)s を保存できません。" -#: cps/editbooks.py:1481 +#: cps/editbooks.py:1525 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "ファイル形式 %(ext)s が %(book)s に追加されました" @@ -690,9 +737,9 @@ msgstr "" #: cps/error_handler.py:108 cps/templates/layout.html:69 #: cps/templates/layout.html:104 cps/templates/login.html:27 -#: cps/templates/register.html:17 cps/web.py:1292 cps/web.py:1296 -#: cps/web.py:1302 cps/web.py:1326 cps/web.py:1330 cps/web.py:1343 -#: cps/web.py:1346 +#: cps/templates/register.html:17 cps/web.py:1302 cps/web.py:1306 +#: cps/web.py:1312 cps/web.py:1336 cps/web.py:1340 cps/web.py:1353 +#: cps/web.py:1356 msgid "Register" msgstr "登録" @@ -713,7 +760,7 @@ msgstr "コールバックドメインが認証されていません。Google De msgid "%(format)s format not found for book id: %(book)d" msgstr "ID: %(book)d の本に %(format)s フォーマットはありません" -#: cps/helper.py:94 cps/tasks/convert.py:91 +#: cps/helper.py:94 cps/tasks/convert.py:92 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "Googleドライブ: %(fn)s に %(format)s はありません" @@ -899,10 +946,6 @@ msgstr "表紙ファイルは jpg/jpeg のみ対応しています" msgid "Cover" msgstr "" -#: cps/helper.py:1006 -msgid "UnRar binary file not found" -msgstr "UnRarのバイナリファイルが見つかりません" - #: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "" @@ -933,7 +976,7 @@ msgstr "" msgid "Error executing Calibre" msgstr "" -#: cps/helper.py:1154 cps/templates/admin.html:216 +#: cps/helper.py:1154 cps/templates/admin.html:232 msgid "Queue all books for metadata backup" msgstr "" @@ -955,7 +998,7 @@ msgstr "%(provider)s で登録" msgid "This %(oauth)s account is already linked to a different user" msgstr "" -#: cps/oauth_bb.py:147 cps/remotelogin.py:131 +#: cps/oauth_bb.py:147 cps/remotelogin.py:150 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "%(nickname)s としてログイン中" @@ -1023,25 +1066,29 @@ msgstr "Google OAuth エラー: {}" msgid "{} Stars" msgstr "星{}" -#: cps/remotelogin.py:63 cps/templates/layout.html:68 -#: cps/templates/layout.html:103 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1361 -msgid "Login" -msgstr "ログイン" - -#: cps/remotelogin.py:75 cps/remotelogin.py:109 +#: cps/remotelogin.py:46 cps/remotelogin.py:128 msgid "Token not found" msgstr "トークンが見つかりません" -#: cps/remotelogin.py:84 cps/remotelogin.py:117 +#: cps/remotelogin.py:55 cps/remotelogin.py:136 msgid "Token has expired" msgstr "トークンが無効です" -#: cps/remotelogin.py:93 +#: cps/remotelogin.py:86 cps/remotelogin.py:112 cps/templates/layout.html:68 +#: cps/templates/layout.html:103 cps/templates/login.html:4 +#: cps/templates/login.html:21 cps/web.py:1371 +msgid "Login" +msgstr "ログイン" + +#: cps/remotelogin.py:100 +msgid "Token already approved" +msgstr "" + +#: cps/remotelogin.py:108 msgid "Success! Please return to your device" msgstr "成功です!端末に戻ってください" -#: cps/render_template.py:41 cps/web.py:421 +#: cps/render_template.py:41 cps/web.py:423 msgid "Books" msgstr "本" @@ -1066,7 +1113,7 @@ msgstr "ダウンロードされた本" msgid "Show Downloaded Books" msgstr "ダウンロードされた本を表示" -#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:436 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:438 msgid "Top Rated Books" msgstr "高評価の本" @@ -1075,7 +1122,7 @@ msgid "Show Top Rated Books" msgstr "高評価の本を表示" #: cps/render_template.py:61 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:769 +#: cps/templates/index.xml:67 cps/web.py:771 msgid "Read Books" msgstr "既読の本" @@ -1084,7 +1131,7 @@ msgid "Show Read and Unread" msgstr "" #: cps/render_template.py:65 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:772 +#: cps/templates/index.xml:74 cps/web.py:774 msgid "Unread Books" msgstr "未読の本" @@ -1102,7 +1149,7 @@ msgid "Show Random Books" msgstr "ランダムに本を表示" #: cps/render_template.py:71 cps/templates/book_table.html:93 -#: cps/templates/index.xml:97 cps/web.py:1144 +#: cps/templates/index.xml:97 cps/web.py:1146 msgid "Categories" msgstr "カテゴリ" @@ -1112,7 +1159,7 @@ msgstr "" #: cps/render_template.py:74 cps/templates/book_edit.html:86 #: cps/templates/book_table.html:94 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1034 cps/web.py:1046 +#: cps/templates/search_form.html:70 cps/web.py:1036 cps/web.py:1048 msgid "Series" msgstr "シリーズ" @@ -1130,7 +1177,7 @@ msgid "Show Author Section" msgstr "" #: cps/render_template.py:81 cps/templates/book_table.html:98 -#: cps/templates/index.xml:88 cps/web.py:1002 +#: cps/templates/index.xml:88 cps/web.py:1004 msgid "Publishers" msgstr "出版社" @@ -1140,7 +1187,7 @@ msgstr "" #: cps/render_template.py:84 cps/templates/book_table.html:96 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1116 +#: cps/web.py:1118 msgid "Languages" msgstr "言語" @@ -1164,7 +1211,7 @@ msgstr "ファイル形式" msgid "Show File Formats Section" msgstr "" -#: cps/render_template.py:95 cps/web.py:795 +#: cps/render_template.py:95 cps/web.py:797 msgid "Archived Books" msgstr "アーカイブされた本" @@ -1172,7 +1219,7 @@ msgstr "アーカイブされた本" msgid "Show Archived Books" msgstr "" -#: cps/render_template.py:100 cps/web.py:831 +#: cps/render_template.py:100 cps/web.py:833 msgid "Books List" msgstr "本の一覧" @@ -1405,150 +1452,154 @@ msgstr "アップデートが利用可能です。下のボタンをクリック msgid "No release information available" msgstr "リリース情報がありません" -#: cps/templates/index.html:6 cps/web.py:448 +#: cps/templates/index.html:6 cps/web.py:450 msgid "Discover (Random Books)" msgstr "本を見つける (ランダムに表示)" -#: cps/web.py:484 +#: cps/web.py:486 msgid "Hot Books (Most Downloaded)" msgstr "人気の本 (最もダウンロードされた本)" -#: cps/web.py:515 +#: cps/web.py:517 #, python-format msgid "Downloaded books by %(user)s" msgstr "%(user)s がダウンロードした本" -#: cps/web.py:548 +#: cps/web.py:550 #, python-format msgid "Author: %(name)s" msgstr "著者: %(name)s" -#: cps/web.py:584 +#: cps/web.py:586 #, python-format msgid "Publisher: %(name)s" msgstr "出版社: %(name)s" -#: cps/web.py:612 +#: cps/web.py:614 #, python-format msgid "Series: %(serie)s" msgstr "シリーズ: %(serie)s" -#: cps/web.py:626 +#: cps/web.py:628 msgid "Rating: None" msgstr "評価: なし" -#: cps/web.py:635 +#: cps/web.py:637 #, python-format msgid "Rating: %(rating)s stars" msgstr "評価: 星%(rating)s" -#: cps/web.py:666 +#: cps/web.py:668 #, python-format msgid "File format: %(format)s" msgstr "ファイル形式: %(format)s" -#: cps/web.py:701 +#: cps/web.py:703 #, python-format msgid "Category: %(name)s" msgstr "カテゴリ: %(name)s" -#: cps/web.py:730 +#: cps/web.py:732 #, python-format msgid "Language: %(name)s" msgstr "言語: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:974 +#: cps/templates/admin.html:16 cps/web.py:976 msgid "Downloads" msgstr "ダウンロード数" -#: cps/web.py:1076 +#: cps/web.py:1078 msgid "Ratings list" msgstr "評価一覧" -#: cps/web.py:1103 +#: cps/web.py:1105 msgid "File formats list" msgstr "ファイル形式一覧" -#: cps/web.py:1264 +#: cps/web.py:1272 +msgid "Book format not supported" +msgstr "" + +#: cps/web.py:1274 msgid "Please configure the SMTP mail settings first..." msgstr "" -#: cps/web.py:1270 +#: cps/web.py:1280 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "本の %(eReadermail)s への送信がキューに追加されました" -#: cps/web.py:1273 +#: cps/web.py:1283 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "%(res)s を送信中にエラーが発生しました" -#: cps/web.py:1275 +#: cps/web.py:1285 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "" -#: cps/web.py:1291 cps/web.py:1342 +#: cps/web.py:1301 cps/web.py:1352 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "メールサーバーが設定されていません。管理者に連絡してください" -#: cps/web.py:1328 +#: cps/web.py:1338 msgid "Oops! Your Email is not allowed." msgstr "このメールアドレスは登録が許可されていません" -#: cps/web.py:1331 +#: cps/web.py:1341 msgid "Success! Confirmation Email has been sent." msgstr "確認メールがこのメールアドレスに送信されました。" -#: cps/web.py:1376 cps/web.py:1390 +#: cps/web.py:1386 cps/web.py:1400 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1399 +#: cps/web.py:1409 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1406 +#: cps/web.py:1416 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1411 +#: cps/web.py:1421 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1415 cps/web.py:1440 +#: cps/web.py:1425 cps/web.py:1450 msgid "Wrong Username or Password" msgstr "" -#: cps/web.py:1422 +#: cps/web.py:1432 msgid "New Password was sent to your email address" msgstr "" -#: cps/web.py:1426 +#: cps/web.py:1436 msgid "An unknown error occurred. Please try again later." msgstr "" -#: cps/web.py:1428 +#: cps/web.py:1438 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1436 +#: cps/web.py:1446 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1501 cps/web.py:1551 +#: cps/web.py:1511 cps/web.py:1561 #, python-format msgid "%(name)s's Profile" msgstr "%(name)s のプロフィール" -#: cps/web.py:1517 +#: cps/web.py:1527 msgid "Success! Profile Updated" msgstr "" -#: cps/web.py:1521 +#: cps/web.py:1531 msgid "Oops! An account already exists for this Email." msgstr "このメールアドレスで登録されたアカウントがすでに存在します" @@ -1560,46 +1611,46 @@ msgstr "OAuth情報を含んだ有効なgmail.jsonファイルが見つかりま msgid "Delete temp folder contents" msgstr "" -#: cps/tasks/convert.py:112 +#: cps/tasks/convert.py:113 #, python-format msgid "%(book)s send to E-Reader" msgstr "%(book)s をE-Readerに送信" -#: cps/tasks/convert.py:177 +#: cps/tasks/convert.py:180 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre ebook-convert %(tool)s が見つかりません" -#: cps/tasks/convert.py:211 +#: cps/tasks/convert.py:214 #, python-format msgid "%(format)s format not found on disk" msgstr "%(format)s 形式は存在しません" -#: cps/tasks/convert.py:215 +#: cps/tasks/convert.py:218 msgid "Ebook converter failed with unknown error" msgstr "Ebook converter が不明なエラーで失敗しました" -#: cps/tasks/convert.py:234 +#: cps/tasks/convert.py:237 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify-converter が失敗しました: %(error)s" -#: cps/tasks/convert.py:254 +#: cps/tasks/convert.py:257 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "変換されたファイルが見つからないか、またはフォルダー %(folder)s 内に複数存在します" -#: cps/tasks/convert.py:291 cps/tasks/convert.py:342 +#: cps/tasks/convert.py:294 cps/tasks/convert.py:345 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre が失敗しました: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:322 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Ebook-converter が失敗しました: %(error)s" -#: cps/tasks/convert.py:347 +#: cps/tasks/convert.py:350 msgid "Convert" msgstr "変換" @@ -1685,7 +1736,7 @@ msgstr "編集" #: cps/templates/admin.html:25 cps/templates/book_edit.html:17 #: cps/templates/book_table.html:131 cps/templates/book_table.html:180 -#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:115 +#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:117 #: cps/templates/user_edit.html:67 cps/templates/user_table.html:149 msgid "Delete" msgstr "削除" @@ -1775,128 +1826,145 @@ msgstr "マジックリンクによるリモートログイン" msgid "Reverse Proxy Login" msgstr "リバースプロキシによるログイン" -#: cps/templates/admin.html:154 cps/templates/config_edit.html:176 +#: cps/templates/admin.html:154 cps/templates/config_edit.html:180 msgid "Reverse Proxy Header Name" msgstr "リバースプロキシのヘッダー名" -#: cps/templates/admin.html:159 +#: cps/templates/admin.html:158 +msgid "Reverse Proxy Trusted IPs/CIDRs" +msgstr "" + +#: cps/templates/admin.html:162 cps/templates/config_edit.html:193 +msgid "Reverse Proxy Shared Secret Header Name" +msgstr "" + +#: cps/templates/admin.html:166 +msgid "Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/admin.html:170 +msgid "Reverse Proxy Shared Secret Configured" +msgstr "" + +#: cps/templates/admin.html:175 msgid "Edit Calibre Database Configuration" msgstr "Calibre DBの設定を編集" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:176 msgid "Edit Basic Configuration" msgstr "基本設定を編集" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:177 msgid "Edit UI Configuration" msgstr "UI設定を編集" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:183 msgid "Scheduled Tasks" msgstr "スケジュールタスク" -#: cps/templates/admin.html:170 cps/templates/schedule_edit.html:12 +#: cps/templates/admin.html:186 cps/templates/schedule_edit.html:12 #: cps/templates/tasks.html:18 msgid "Start Time" msgstr "タスクを開始する時間" -#: cps/templates/admin.html:174 cps/templates/schedule_edit.html:20 +#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:20 msgid "Maximum Duration" msgstr "最大タスク継続時間" -#: cps/templates/admin.html:178 cps/templates/schedule_edit.html:29 +#: cps/templates/admin.html:194 cps/templates/schedule_edit.html:29 msgid "Generate Thumbnails" msgstr "本の表紙サムネイルを生成" -#: cps/templates/admin.html:182 +#: cps/templates/admin.html:198 msgid "Generate series cover thumbnails" msgstr "シリーズの表紙サムネイルを生成" -#: cps/templates/admin.html:186 cps/templates/admin.html:208 +#: cps/templates/admin.html:202 cps/templates/admin.html:224 #: cps/templates/schedule_edit.html:37 msgid "Reconnect Calibre Database" msgstr "Calibreライブラリに再接続" -#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 +#: cps/templates/admin.html:206 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" msgstr "" -#: cps/templates/admin.html:197 +#: cps/templates/admin.html:213 msgid "Refresh Thumbnail Cache" msgstr "表紙サムネイルのキャッシュを更新" -#: cps/templates/admin.html:203 +#: cps/templates/admin.html:219 msgid "Administration" msgstr "管理" -#: cps/templates/admin.html:204 +#: cps/templates/admin.html:220 msgid "Download Debug Package" msgstr "デバッグパッケージをダウンロード" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:221 msgid "View Logs" msgstr "ログを表示" -#: cps/templates/admin.html:211 +#: cps/templates/admin.html:227 msgid "Restart" msgstr "再起動" -#: cps/templates/admin.html:212 +#: cps/templates/admin.html:228 msgid "Shutdown" msgstr "シャットダウン" -#: cps/templates/admin.html:221 +#: cps/templates/admin.html:237 msgid "Version Information" msgstr "バージョン情報" -#: cps/templates/admin.html:225 +#: cps/templates/admin.html:241 msgid "Version" msgstr "バージョン" -#: cps/templates/admin.html:226 +#: cps/templates/admin.html:242 msgid "Details" msgstr "詳細" -#: cps/templates/admin.html:232 +#: cps/templates/admin.html:248 msgid "Current Version" msgstr "現在のバージョン" -#: cps/templates/admin.html:239 +#: cps/templates/admin.html:255 msgid "Check for Update" msgstr "アップデートを確認" -#: cps/templates/admin.html:240 +#: cps/templates/admin.html:256 msgid "Perform Update" msgstr "アップデートを実行" -#: cps/templates/admin.html:253 +#: cps/templates/admin.html:269 msgid "Are you sure you want to restart?" msgstr "再起動してもよろしいですか?" -#: cps/templates/admin.html:258 cps/templates/admin.html:272 -#: cps/templates/admin.html:292 cps/templates/config_db.html:82 +#: cps/templates/admin.html:274 cps/templates/admin.html:288 +#: cps/templates/admin.html:308 cps/templates/config_db.html:82 msgid "OK" msgstr "OK" -#: cps/templates/admin.html:259 cps/templates/admin.html:273 +#: cps/templates/admin.html:275 cps/templates/admin.html:289 #: cps/templates/book_edit.html:220 cps/templates/book_table.html:162 #: cps/templates/book_table.html:181 cps/templates/book_table.html:201 #: cps/templates/book_table.html:221 cps/templates/book_table.html:241 #: cps/templates/book_table.html:261 cps/templates/book_table.html:316 -#: cps/templates/config_db.html:66 cps/templates/config_edit.html:431 +#: cps/templates/config_db.html:66 cps/templates/config_edit.html:453 #: cps/templates/config_view_edit.html:175 cps/templates/detail.html:350 -#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:98 -#: cps/templates/modal_dialogs.html:116 cps/templates/modal_dialogs.html:134 +#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:100 +#: cps/templates/modal_dialogs.html:118 cps/templates/modal_dialogs.html:136 +#: cps/templates/remote_login_verify.html:16 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 #: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "キャンセル" -#: cps/templates/admin.html:271 +#: cps/templates/admin.html:287 msgid "Are you sure you want to shutdown?" msgstr "シャットダウンしてもよろしいですか?" -#: cps/templates/admin.html:283 +#: cps/templates/admin.html:299 msgid "Updating, please do not reload this page" msgstr "アップデート中です。このページをリロードしないでください" @@ -2137,7 +2205,7 @@ msgid "Fetch Metadata" msgstr "メタデータを取得" #: cps/templates/book_edit.html:219 cps/templates/config_db.html:65 -#: cps/templates/config_edit.html:430 cps/templates/config_view_edit.html:174 +#: cps/templates/config_edit.html:452 cps/templates/config_view_edit.html:174 #: cps/templates/email_edit.html:65 cps/templates/schedule_edit.html:44 #: cps/templates/shelf_edit.html:25 cps/templates/shelf_order.html:41 #: cps/templates/user_edit.html:142 @@ -2509,214 +2577,234 @@ msgstr "" msgid "Allow Reverse Proxy Authentication" msgstr "リバースプロキシの認証を許可" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:176 +msgid "Security Warning" +msgstr "" + +#: cps/templates/config_edit.html:177 +msgid "Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled." +msgstr "" + +#: cps/templates/config_edit.html:184 +msgid "Reverse Proxy Trusted IPs/CIDRs (Comma Separated)" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "Enable Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/config_edit.html:197 +msgid "Reverse Proxy Shared Secret" +msgstr "" + +#: cps/templates/config_edit.html:205 msgid "Login type" msgstr "ログインの種類" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:207 msgid "Use Standard Authentication" msgstr "通常の認証を利用" -#: cps/templates/config_edit.html:187 +#: cps/templates/config_edit.html:209 msgid "Use LDAP Authentication" msgstr "LDAP認証を利用" -#: cps/templates/config_edit.html:190 +#: cps/templates/config_edit.html:212 msgid "Use OAuth" msgstr "OAuthを利用" -#: cps/templates/config_edit.html:197 +#: cps/templates/config_edit.html:219 msgid "LDAP Server Host Name or IP Address" msgstr "LDAPサーバーのホスト名またはIPアドレス" -#: cps/templates/config_edit.html:201 +#: cps/templates/config_edit.html:223 msgid "LDAP Server Port" msgstr "LDAPサーバーのポート番号" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:227 msgid "LDAP Encryption" msgstr "LDAPの暗号化方式" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:230 msgid "TLS" msgstr "TLS" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:231 msgid "SSL" msgstr "SSL" -#: cps/templates/config_edit.html:213 +#: cps/templates/config_edit.html:235 msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" msgstr "LDAPのCA証明書のパス (クライアント証明書による認証の場合のみ必要)" -#: cps/templates/config_edit.html:220 +#: cps/templates/config_edit.html:242 msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" msgstr "LDAP証明書のパス (クライアント証明書による認証の場合のみ必要)" -#: cps/templates/config_edit.html:227 +#: cps/templates/config_edit.html:249 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" msgstr "LDAPのキーファイルのパス (クライアント証明書による認証の場合のみ必要)" -#: cps/templates/config_edit.html:236 +#: cps/templates/config_edit.html:258 msgid "LDAP Authentication" msgstr "LDAP認証" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:260 msgid "Anonymous" msgstr "匿名" -#: cps/templates/config_edit.html:239 +#: cps/templates/config_edit.html:261 msgid "Unauthenticated" msgstr "認証失敗" -#: cps/templates/config_edit.html:240 +#: cps/templates/config_edit.html:262 msgid "Simple" msgstr "簡単" -#: cps/templates/config_edit.html:245 +#: cps/templates/config_edit.html:267 msgid "LDAP Administrator Username" msgstr "LDAP管理者のユーザー名" -#: cps/templates/config_edit.html:251 +#: cps/templates/config_edit.html:273 msgid "LDAP Administrator Password" msgstr "LDAP管理者のパスワード" -#: cps/templates/config_edit.html:256 +#: cps/templates/config_edit.html:278 msgid "LDAP Distinguished Name (DN)" msgstr "LDAPの識別名 (DN)" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:282 msgid "LDAP User Object Filter" msgstr "LDAPユーザーフィルタ" -#: cps/templates/config_edit.html:265 +#: cps/templates/config_edit.html:287 msgid "LDAP Server is OpenLDAP?" msgstr "LDAPサーバーはOpenLDAPですか?" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:289 msgid "Following Settings are Needed For User Import" msgstr "以下の設定はユーザーのインポートのために必要です" -#: cps/templates/config_edit.html:269 +#: cps/templates/config_edit.html:291 msgid "LDAP Group Object Filter" msgstr "LDAPグループフィルタ" -#: cps/templates/config_edit.html:273 +#: cps/templates/config_edit.html:295 msgid "LDAP Group Name" msgstr "LDAPグループ名" -#: cps/templates/config_edit.html:277 +#: cps/templates/config_edit.html:299 msgid "LDAP Group Members Field" msgstr "LDAPグループメンバーフィールド" -#: cps/templates/config_edit.html:281 +#: cps/templates/config_edit.html:303 msgid "LDAP Member User Filter Detection" msgstr "LDAPメンバーユーザーフィルタ検出" -#: cps/templates/config_edit.html:283 +#: cps/templates/config_edit.html:305 msgid "Autodetect" msgstr "自動検出" -#: cps/templates/config_edit.html:284 +#: cps/templates/config_edit.html:306 msgid "Custom Filter" msgstr "カスタムフィルタ" -#: cps/templates/config_edit.html:289 +#: cps/templates/config_edit.html:311 msgid "LDAP Member User Filter" msgstr "LDAPメンバーユーザーフィルタ" -#: cps/templates/config_edit.html:300 +#: cps/templates/config_edit.html:322 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "%(provider)s OAuth 認証情報を入手" -#: cps/templates/config_edit.html:303 +#: cps/templates/config_edit.html:325 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "%(provider)s OAuth クライアントID" -#: cps/templates/config_edit.html:307 +#: cps/templates/config_edit.html:329 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "%(provider)s OAuth クライアントシークレット" -#: cps/templates/config_edit.html:323 +#: cps/templates/config_edit.html:345 msgid "External binaries" msgstr "外部バイナリ" -#: cps/templates/config_edit.html:329 +#: cps/templates/config_edit.html:351 msgid "Path to Calibre Binaries" msgstr "" -#: cps/templates/config_edit.html:337 +#: cps/templates/config_edit.html:359 msgid "Calibre E-Book Converter Settings" msgstr "Calibre E-Book Converterの設定" -#: cps/templates/config_edit.html:340 +#: cps/templates/config_edit.html:362 msgid "Path to Kepubify E-Book Converter" msgstr "Kepubify E-Book Converterのパス" -#: cps/templates/config_edit.html:348 +#: cps/templates/config_edit.html:370 msgid "Location of Unrar binary" msgstr "" -#: cps/templates/config_edit.html:364 +#: cps/templates/config_edit.html:386 msgid "Security Settings" msgstr "" -#: cps/templates/config_edit.html:372 +#: cps/templates/config_edit.html:394 msgid "Limit failed login attempts" msgstr "" -#: cps/templates/config_edit.html:376 +#: cps/templates/config_edit.html:398 msgid "Configure Backend for Limiter" msgstr "" -#: cps/templates/config_edit.html:380 +#: cps/templates/config_edit.html:402 msgid "Options for Limiter Backend" msgstr "" -#: cps/templates/config_edit.html:386 +#: cps/templates/config_edit.html:408 msgid "Check if file extensions matches file content on upload" msgstr "" -#: cps/templates/config_edit.html:389 +#: cps/templates/config_edit.html:411 msgid "Session protection" msgstr "" -#: cps/templates/config_edit.html:391 +#: cps/templates/config_edit.html:413 msgid "Basic" msgstr "" -#: cps/templates/config_edit.html:392 +#: cps/templates/config_edit.html:414 msgid "Strong" msgstr "" -#: cps/templates/config_edit.html:397 +#: cps/templates/config_edit.html:419 msgid "User Password policy" msgstr "" -#: cps/templates/config_edit.html:401 +#: cps/templates/config_edit.html:423 msgid "Minimum password length" msgstr "" -#: cps/templates/config_edit.html:406 +#: cps/templates/config_edit.html:428 msgid "Enforce number" msgstr "" -#: cps/templates/config_edit.html:410 +#: cps/templates/config_edit.html:432 msgid "Enforce lowercase characters" msgstr "" -#: cps/templates/config_edit.html:414 +#: cps/templates/config_edit.html:436 msgid "Enforce uppercase characters" msgstr "" -#: cps/templates/config_edit.html:418 +#: cps/templates/config_edit.html:440 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" msgstr "" -#: cps/templates/config_edit.html:422 +#: cps/templates/config_edit.html:444 msgid "Enforce special characters" msgstr "" @@ -3183,27 +3271,27 @@ msgstr "本を安全に削除するためには、初めに本をアーカイブ msgid "Choose File Location" msgstr "ファイルの場所を選択" -#: cps/templates/modal_dialogs.html:81 +#: cps/templates/modal_dialogs.html:82 msgid "type" msgstr "種類" -#: cps/templates/modal_dialogs.html:82 +#: cps/templates/modal_dialogs.html:83 msgid "name" msgstr "名前" -#: cps/templates/modal_dialogs.html:83 +#: cps/templates/modal_dialogs.html:84 msgid "size" msgstr "サイズ" -#: cps/templates/modal_dialogs.html:89 +#: cps/templates/modal_dialogs.html:90 msgid "Parent Directory" msgstr "親ディレクトリ" -#: cps/templates/modal_dialogs.html:97 +#: cps/templates/modal_dialogs.html:99 msgid "Select" msgstr "選択" -#: cps/templates/modal_dialogs.html:133 cps/templates/tasks.html:46 +#: cps/templates/modal_dialogs.html:135 cps/templates/tasks.html:46 msgid "Ok" msgstr "OK" @@ -3459,6 +3547,31 @@ msgstr "一度承認されると、自動的にこの端末でログインされ msgid "This verification link will expire in 10 minutes." msgstr "この確認リンクの有効期限は10分です。" +#: cps/templates/remote_login_verify.html:4 +msgid "Approve Magic Link Login" +msgstr "" + +#: cps/templates/remote_login_verify.html:5 +msgid "Review the device that requested access before approving this login." +msgstr "" + +#: cps/templates/remote_login_verify.html:7 +msgid "IP address" +msgstr "" + +#: cps/templates/remote_login_verify.html:9 +msgid "Browser" +msgstr "" + +#: cps/templates/remote_login_verify.html:12 +#, python-format +msgid "If you approve this request, the device that started it will be logged in as %(username)s." +msgstr "" + +#: cps/templates/remote_login_verify.html:15 +msgid "Approve Login" +msgstr "" + #: cps/templates/schedule_edit.html:33 msgid "Generate Series Cover Thumbnails" msgstr "シリーズの表紙サムネイルを生成" diff --git a/cps/translations/km/LC_MESSAGES/messages.mo b/cps/translations/km/LC_MESSAGES/messages.mo index 4628043efaaa0868677a2862a9f111bba1b2a3bb..b4be4907bf1501764cad949772378526940fbbf4 100644 GIT binary patch delta 35 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 z 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 diff --git a/cps/translations/ko/LC_MESSAGES/messages.po b/cps/translations/ko/LC_MESSAGES/messages.po index 709396961..09be2ee82 100644 --- a/cps/translations/ko/LC_MESSAGES/messages.po +++ b/cps/translations/ko/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: 2026-08-01 11:42+0200\n" +"POT-Creation-Date: 2026-08-08 16:08+0200\n" "PO-Revision-Date: 2024-11-01 17:50+0900\n" "Last-Translator: limeade23 \n" "Language: ko\n" @@ -16,519 +16,558 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" +"Generated-By: Babel 2.18.0\n" #: cps/about.py:85 msgid "Statistics" msgstr "통계" -#: cps/admin.py:151 +#: cps/admin.py:154 msgid "Server restarted, please reload page." msgstr "서버가 재시작되었습니다. 페이지를 새로고침 해주세요." -#: cps/admin.py:153 +#: cps/admin.py:156 msgid "Performing Server shutdown, please close window." msgstr "서버를 종료합니다. 창을 닫아주세요." -#: cps/admin.py:161 +#: cps/admin.py:164 msgid "Success! Database Reconnected" msgstr "성공적으로 데이터베이스를 다시 연결했습니다." -#: cps/admin.py:164 +#: cps/admin.py:167 msgid "Unknown command" msgstr "알 수 없는 명령입니다." -#: cps/admin.py:175 +#: cps/admin.py:178 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "메타데이터 백업이 작업에 추가되었습니다. 작업 결과를 확인해주세요." -#: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 -#: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 -#: cps/uploader.py:117 +#: cps/admin.py:211 cps/editbooks.py:825 cps/editbooks.py:875 +#: cps/editbooks.py:1564 cps/templates/remote_login_verify.html:8 +#: cps/templates/remote_login_verify.html:10 cps/updater.py:615 +#: cps/uploader.py:117 cps/uploader.py:126 msgid "Unknown" msgstr "알 수 없음" -#: cps/admin.py:233 +#: cps/admin.py:236 msgid "Admin page" msgstr "관리 페이지" -#: cps/admin.py:253 +#: cps/admin.py:256 msgid "Basic Configuration" msgstr "기본 설정" -#: cps/admin.py:291 +#: cps/admin.py:294 msgid "UI Configuration" msgstr "UI 설정" -#: cps/admin.py:315 cps/admin.py:1002 cps/db.py:809 cps/search.py:150 -#: cps/web.py:750 +#: cps/admin.py:318 cps/admin.py:1005 cps/db.py:809 cps/search.py:150 +#: cps/web.py:752 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "사용자 정의 항목 %(column)d이(가) calibre 데이터베이스에 없습니다." -#: cps/admin.py:333 cps/templates/admin.html:51 +#: cps/admin.py:336 cps/templates/admin.html:51 msgid "Edit Users" msgstr "사용자 관리" -#: cps/admin.py:378 cps/opds.py:559 cps/templates/grid.html:14 +#: cps/admin.py:381 cps/opds.py:559 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "모두" -#: cps/admin.py:401 cps/admin.py:1432 +#: cps/admin.py:404 cps/admin.py:1460 msgid "User not found" msgstr "사용자를 찾을 수 없습니다." -#: cps/admin.py:415 +#: cps/admin.py:418 #, python-brace-format msgid "{} users deleted successfully" msgstr "{} 사용자를 삭제했습니다." -#: cps/admin.py:438 cps/templates/config_view_edit.html:133 +#: cps/admin.py:441 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "모두 보기" -#: cps/admin.py:459 cps/admin.py:465 +#: cps/admin.py:462 cps/admin.py:468 msgid "Malformed request" msgstr "잘못된 요청입니다." -#: cps/admin.py:477 cps/admin.py:2078 +#: cps/admin.py:480 cps/admin.py:2156 msgid "Guest Name can't be changed" msgstr "게스트 이름은 변경할 수 없습니다." -#: cps/admin.py:489 +#: cps/admin.py:492 msgid "Guest can't have this role" msgstr "게스트는 가질 수 없는 권한입니다." -#: cps/admin.py:501 cps/admin.py:2032 +#: cps/admin.py:504 cps/admin.py:2110 msgid "No admin user remaining, can't remove admin role" msgstr "남아있는 관리자가 없어 권한을 삭제할 수 없습니다." -#: cps/admin.py:505 cps/admin.py:519 +#: cps/admin.py:508 cps/admin.py:522 msgid "Value has to be true or false" msgstr "true 또는 false여야 합니다." -#: cps/admin.py:507 +#: cps/admin.py:510 msgid "Invalid role" msgstr "잘못된 권한입니다." -#: cps/admin.py:511 +#: cps/admin.py:514 msgid "Guest can't have this view" msgstr "게스트는 사용할 수 없습니다." -#: cps/admin.py:521 +#: cps/admin.py:524 msgid "Invalid view" msgstr "잘못된 설정입니다." -#: cps/admin.py:524 +#: cps/admin.py:527 msgid "Guest's Locale is determined automatically and can't be set" msgstr "게스트 언어는 자동으로 설정되며 변경할 수 없습니다." -#: cps/admin.py:528 +#: cps/admin.py:531 msgid "No Valid Locale Given" msgstr "올바른 언어가 아닙니다." -#: cps/admin.py:539 +#: cps/admin.py:542 msgid "No Valid Book Language Given" msgstr "제공된 책의 언어가 올바르지 않습니다." -#: cps/admin.py:541 cps/editbooks.py:243 cps/editbooks.py:428 -#: cps/editbooks.py:430 +#: cps/admin.py:544 cps/editbooks.py:260 cps/editbooks.py:445 +#: cps/editbooks.py:447 msgid "Parameter not found" msgstr "매개변수를 찾을 수 없습니다." -#: cps/admin.py:578 +#: cps/admin.py:581 msgid "Invalid Read Column" msgstr "읽음 상태가 올바르지 않습니다." -#: cps/admin.py:584 +#: cps/admin.py:587 msgid "Invalid Restricted Column" msgstr "표시 제한이 올바르지 않습니다." -#: cps/admin.py:604 cps/admin.py:1903 +#: cps/admin.py:607 cps/admin.py:1981 msgid "Calibre-Web configuration updated" msgstr "Calibre-Web 설정이 변경되었습니다." -#: cps/admin.py:616 +#: cps/admin.py:619 msgid "Do you really want to delete the Kobo Token?" msgstr "Kobo 토큰을 삭제하시겠습니까?" -#: cps/admin.py:618 +#: cps/admin.py:621 msgid "Do you really want to delete this domain?" msgstr "이 도메인을 삭제하시겠습니까?" -#: cps/admin.py:620 +#: cps/admin.py:623 msgid "Do you really want to delete this user?" msgstr "이 사용자를 삭제하시겠습니까?" -#: cps/admin.py:622 +#: cps/admin.py:625 msgid "Do you really want to delete this book?" msgstr "이 책을 삭제하시겠습니까?" -#: cps/admin.py:624 +#: cps/admin.py:627 msgid "Are you sure you want to delete this shelf?" msgstr "이 서재를 삭제하시겠습니까?" -#: cps/admin.py:626 +#: cps/admin.py:629 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "선택한 사용자의 언어를 변경하시겠습니까?" -#: cps/admin.py:628 +#: cps/admin.py:631 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "선택한 사용자에 대해 표시되는 책 언어를 변경하시겠습니까?" -#: cps/admin.py:630 +#: cps/admin.py:633 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "선택한 사용자의 권한을 변경하시겠습니까?" -#: cps/admin.py:632 +#: cps/admin.py:635 msgid "Are you sure you want to change the archive status for the selected book(s)?" msgstr "선택한 책의 숨김 상태를 변경하시겠습니까?" -#: cps/admin.py:634 +#: cps/admin.py:637 msgid "Are you sure you want to change the read status for the selected book(s)?" msgstr "선택한 책의 읽음 상태를 변경하시겠습니까?" -#: cps/admin.py:636 +#: cps/admin.py:639 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "선택한 사용자의 제한을 변경하시겠습니까?" -#: cps/admin.py:638 +#: cps/admin.py:641 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "선택한 사용자의 표시 제한을 변경하시겠습니까?" -#: cps/admin.py:641 +#: cps/admin.py:644 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "선택한 사용자의 서재 동기화 설정을 변경하시겠습니까?" -#: cps/admin.py:643 +#: cps/admin.py:646 msgid "Are you sure you want to change Calibre library location?" msgstr "Calibre 라이브러리 경로를 변경하시겠습니까?" -#: cps/admin.py:645 +#: cps/admin.py:648 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "Calibre-Web이 새로운 썸네일로 갱신합니다. 시간이 걸릴 수 있습니다." -#: cps/admin.py:648 +#: cps/admin.py:651 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Kobo Reader와 전체 동기화를 강제하기 위해 Calibre-Web의 동기화 데이터베이스를 삭제하시겠습니까?" -#: cps/admin.py:891 cps/admin.py:897 cps/admin.py:907 cps/admin.py:917 +#: cps/admin.py:894 cps/admin.py:900 cps/admin.py:910 cps/admin.py:920 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "거부" -#: cps/admin.py:893 cps/admin.py:899 cps/admin.py:909 cps/admin.py:919 +#: cps/admin.py:896 cps/admin.py:902 cps/admin.py:912 cps/admin.py:922 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "허용" -#: cps/admin.py:952 +#: cps/admin.py:955 #, python-brace-format msgid "{} sync entries deleted" msgstr "{} 동기화 항목이 삭제되었습니다." -#: cps/admin.py:993 +#: cps/admin.py:996 msgid "Tag not found" msgstr "태그를 찾을 수 없습니다." -#: cps/admin.py:1011 +#: cps/admin.py:1014 msgid "Invalid Action" msgstr "잘못된 작업입니다." -#: cps/admin.py:1138 +#: cps/admin.py:1137 +#, python-format +msgid "Invalid reverse proxy trusted IP/CIDR entry: %(entry)s" +msgstr "" + +#: cps/admin.py:1148 +#, python-format +msgid "Invalid %(label)s: %(value)s" +msgstr "" + +#: cps/admin.py:1166 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json이 웹 애플리케이션용으로 설정되지 않았습니다." -#: cps/admin.py:1183 +#: cps/admin.py:1211 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "로그 파일의 경로를 확인해주세요." -#: cps/admin.py:1189 +#: cps/admin.py:1217 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "액세스 로그 파일의 경로를 확인해주세요." -#: cps/admin.py:1223 +#: cps/admin.py:1251 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "LDAP 공급자, 포트, DN 및 사용자 개체 식별자를 입력해주세요." -#: cps/admin.py:1229 +#: cps/admin.py:1257 msgid "Please Enter a LDAP Service Account and Password" msgstr "LDAP 서비스 계정과 비밀번호를 입력해주세요." -#: cps/admin.py:1232 +#: cps/admin.py:1260 msgid "Please Enter a LDAP Service Account" msgstr "LDAP 서비스 계정을 입력해주세요." -#: cps/admin.py:1237 +#: cps/admin.py:1265 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "LDAP 그룹 개체 필터에는 하나의 \"%s\" 형식 식별자가 필요합니다." -#: cps/admin.py:1239 +#: cps/admin.py:1267 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "LDAP 그룹 개체 필터에 맞지 않는 괄호가 있습니다." -#: cps/admin.py:1243 +#: cps/admin.py:1271 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP 사용자 개체 필터에는 하나의 \"%s\" 형식 식별자가 필요합니다." -#: cps/admin.py:1245 +#: cps/admin.py:1273 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "LDAP 사용자 개체 필터에 맞지 않는 괄호가 있습니다." -#: cps/admin.py:1252 +#: cps/admin.py:1280 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP 구성원 사용자 필터에는 하나의 \"%s\" 형식 식별자가 필요합니다." -#: cps/admin.py:1254 +#: cps/admin.py:1282 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "LDAP 구성원 사용자 필터에 맞지 않는 괄호가 있습니다." -#: cps/admin.py:1261 +#: cps/admin.py:1289 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP CA인증서, 인증서 또는 키 경로가 유효하지 않습니다." -#: cps/admin.py:1292 cps/templates/admin.html:53 +#: cps/admin.py:1320 cps/templates/admin.html:53 msgid "Add New User" msgstr "사용자 생성" -#: cps/admin.py:1301 cps/templates/admin.html:100 +#: cps/admin.py:1329 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "이메일 서버 설정" -#: cps/admin.py:1320 +#: cps/admin.py:1348 msgid "Success! Gmail Account Verified." msgstr "Gmail 계정 인증에 성공했습니다." -#: cps/admin.py:1340 cps/admin.py:1343 cps/admin.py:1728 cps/admin.py:1887 -#: cps/admin.py:1985 cps/admin.py:2106 cps/editbooks.py:169 -#: cps/editbooks.py:755 cps/editbooks.py:1474 cps/shelf.py:90 cps/shelf.py:144 +#: cps/admin.py:1368 cps/admin.py:1371 cps/admin.py:1756 cps/admin.py:1965 +#: cps/admin.py:2063 cps/admin.py:2184 cps/editbooks.py:170 +#: cps/editbooks.py:772 cps/editbooks.py:1518 cps/shelf.py:90 cps/shelf.py:144 #: cps/shelf.py:194 cps/shelf.py:237 cps/shelf.py:287 cps/shelf.py:327 -#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:160 cps/web.py:1526 +#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:161 cps/web.py:1536 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "데이터베이스 오류가 발생했습니다: %(error)s." -#: cps/admin.py:1350 +#: cps/admin.py:1378 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "%(email)s로 테스트 이메일을 전송했습니다." -#: cps/admin.py:1353 +#: cps/admin.py:1381 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "테스트 이메일 전송 중 오류가 발생했습니다: %(res)s" -#: cps/admin.py:1355 +#: cps/admin.py:1383 msgid "Please configure your e-mail address first..." msgstr "이메일 주소를 설정해주세요." -#: cps/admin.py:1357 +#: cps/admin.py:1385 msgid "Email Server Settings updated" msgstr "이메일 서버 설정이 변경되었습니다." -#: cps/admin.py:1380 cps/templates/admin.html:195 +#: cps/admin.py:1408 cps/templates/admin.html:211 msgid "Edit Scheduled Tasks Settings" msgstr "예약 작업 설정" -#: cps/admin.py:1392 +#: cps/admin.py:1420 msgid "Invalid start time for task specified" msgstr "작업 시작 시간이 올바르지 않습니다." -#: cps/admin.py:1397 +#: cps/admin.py:1425 msgid "Invalid duration for task specified" msgstr "작업 실행 시간이 올바르지 않습니다." -#: cps/admin.py:1407 +#: cps/admin.py:1435 msgid "Scheduled tasks settings updated" msgstr "예약 작업 설정이 변경되었습니다." -#: cps/admin.py:1417 cps/admin.py:1466 cps/admin.py:2102 cps/web.py:1325 +#: cps/admin.py:1445 cps/admin.py:1494 cps/admin.py:2180 cps/web.py:1335 msgid "Oops! An unknown error occurred. Please try again later." msgstr "알 수 없는 오류가 발생했습니다. 잠시 후 다시 시도해 주세요." -#: cps/admin.py:1421 +#: cps/admin.py:1449 msgid "Settings DB is not Writeable" msgstr "설정 데이터베이스에 반영할 수 없습니다." -#: cps/admin.py:1451 cps/admin.py:2094 +#: cps/admin.py:1479 cps/admin.py:2172 #, python-format msgid "Edit User %(nick)s" msgstr "사용자 %(nick)s 수정" -#: cps/admin.py:1463 +#: cps/admin.py:1491 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "사용자 %(user)s의 비밀번호가 재설정되었습니다." -#: cps/admin.py:1469 +#: cps/admin.py:1497 msgid "Oops! Please configure the SMTP mail settings." msgstr "SMTP를 설정해주세요." -#: cps/admin.py:1480 +#: cps/admin.py:1508 msgid "Logfile viewer" msgstr "로그 파일 보기" -#: cps/admin.py:1546 +#: cps/admin.py:1574 msgid "Requesting update package" msgstr "업데이트 패키지 요청 중" -#: cps/admin.py:1547 +#: cps/admin.py:1575 msgid "Downloading update package" msgstr "업데이트 패키지 다운로드 중" -#: cps/admin.py:1548 +#: cps/admin.py:1576 msgid "Unzipping update package" msgstr "업데이트 패키지 압축 해제 중" -#: cps/admin.py:1549 +#: cps/admin.py:1577 msgid "Replacing files" msgstr "파일 반영 중" -#: cps/admin.py:1550 +#: cps/admin.py:1578 msgid "Database connections are closed" msgstr "데이터베이스 연결이 종료됩니다." -#: cps/admin.py:1551 +#: cps/admin.py:1579 msgid "Stopping server" msgstr "서버를 중지하고 있습니다." -#: cps/admin.py:1552 +#: cps/admin.py:1580 msgid "Update finished, please press okay and reload page" msgstr "업데이트가 완료되었습니다. 확인을 누르고 페이지를 새로고침해주세요." -#: cps/admin.py:1553 cps/admin.py:1554 cps/admin.py:1555 cps/admin.py:1556 -#: cps/admin.py:1557 cps/admin.py:1558 +#: cps/admin.py:1581 cps/admin.py:1582 cps/admin.py:1583 cps/admin.py:1584 +#: cps/admin.py:1585 cps/admin.py:1586 msgid "Update failed:" msgstr "업데이트 실패: " -#: cps/admin.py:1553 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1581 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP 오류가 발생했습니다." -#: cps/admin.py:1554 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1582 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "연결 오류가 발생했습니다." -#: cps/admin.py:1555 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1583 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "연결 시도 중 시간이 초과되었습니다." -#: cps/admin.py:1556 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1584 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "오류가 발생했습니다." -#: cps/admin.py:1557 +#: cps/admin.py:1585 msgid "Update file could not be saved in temp dir" msgstr "임시 폴더에 업데이트 파일을 저장할 수 없습니다." -#: cps/admin.py:1558 +#: cps/admin.py:1586 msgid "Files could not be replaced during update" msgstr "업데이트 중 파일을 변경할 수 없습니다." -#: cps/admin.py:1582 +#: cps/admin.py:1610 msgid "Failed to extract at least One LDAP User" msgstr "최소 한 명의 LDAP 사용자 정보를 가져오지 못했습니다." -#: cps/admin.py:1627 +#: cps/admin.py:1655 msgid "Failed to Create at Least One LDAP User" msgstr "최소 한 명의 LDAP 사용자 정보를 생성하지 못했습니다." -#: cps/admin.py:1640 +#: cps/admin.py:1668 #, python-format msgid "Error: %(ldaperror)s" msgstr "오류: %(ldaperror)s" -#: cps/admin.py:1644 +#: cps/admin.py:1672 msgid "Error: No user returned in response of LDAP server" msgstr "오류: LDAP 서버에서 반환된 사용자가 없습니다." -#: cps/admin.py:1680 +#: cps/admin.py:1708 msgid "At Least One LDAP User Not Found in Database" msgstr "데이터베이스에서 찾을 수 없는 LDAP 사용자가 있습니다." -#: cps/admin.py:1682 +#: cps/admin.py:1710 #, python-brace-format msgid "{} User Successfully Imported" msgstr "{} 명의 사용자를 가져왔습니다." -#: cps/admin.py:1740 +#: cps/admin.py:1768 msgid "Books path not valid" msgstr "책 경로가 유효하지 않습니다." -#: cps/admin.py:1746 +#: cps/admin.py:1774 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "데이터베이스 경로가 유효하지 않습니다." -#: cps/admin.py:1774 +#: cps/admin.py:1802 msgid "DB is not Writeable" msgstr "데이터베이스에 쓰기 권한이 없습니다." -#: cps/admin.py:1788 +#: cps/admin.py:1816 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "키 파일 경로가 유효하지 않습니다." -#: cps/admin.py:1792 +#: cps/admin.py:1820 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "인증서 파일 경로가 유효하지 않습니다." -#: cps/admin.py:1872 +#: cps/admin.py:1846 +msgid "Kepubify binary not found" +msgstr "" + +#: cps/admin.py:1894 +msgid "reverse proxy login header name" +msgstr "" + +#: cps/admin.py:1904 +msgid "reverse proxy shared secret header name" +msgstr "" + +#: cps/admin.py:1913 +msgid "Please configure both reverse proxy shared secret header name and secret" +msgstr "" + +#: cps/admin.py:1917 +msgid "Please configure reverse proxy shared secret header name and secret or disable the feature" +msgstr "" + +#: cps/admin.py:1922 +msgid "Please configure at least one trusted reverse proxy IP or CIDR" +msgstr "" + +#: cps/admin.py:1946 msgid "Password length has to be between 1 and 40" msgstr "비밀번호는 1~40자 사이로 입력해주세요." -#: cps/admin.py:1926 +#: cps/admin.py:1957 cps/helper.py:1007 +msgid "Please specify a valid UnRar directory" +msgstr "" + +#: cps/admin.py:2004 msgid "Database Settings updated" msgstr "데이터베이스 설정이 변경되었습니다." -#: cps/admin.py:1934 +#: cps/admin.py:2012 msgid "Database Configuration" msgstr "데이터베이스 설정" -#: cps/admin.py:1949 cps/web.py:1295 +#: cps/admin.py:2027 cps/web.py:1305 msgid "Oops! Please complete all fields." msgstr "모든 항목을 입력해주세요." -#: cps/admin.py:1958 +#: cps/admin.py:2036 msgid "E-mail is not from valid domain" msgstr "이메일 주소가 올바르지 않습니다." -#: cps/admin.py:1964 +#: cps/admin.py:2042 msgid "Add new user" msgstr "새 사용자 생성" -#: cps/admin.py:1975 +#: cps/admin.py:2053 #, python-format msgid "User '%(user)s' created" msgstr "사용자 '%(user)s'이(가) 생성되었습니다." -#: cps/admin.py:1981 +#: cps/admin.py:2059 msgid "Oops! An account already exists for this Email. or name." msgstr "이미 등록된 이메일 주소 또는 이름입니다." -#: cps/admin.py:2011 +#: cps/admin.py:2089 #, python-format msgid "User '%(nick)s' deleted" msgstr "사용자 '%(nick)s'이(가) 삭제되었습니다." -#: cps/admin.py:2014 +#: cps/admin.py:2092 msgid "Can't delete Guest User" msgstr "게스트 사용자는 삭제할 수 없습니다." -#: cps/admin.py:2017 +#: cps/admin.py:2095 msgid "No admin user remaining, can't delete user" msgstr "남은 관리자가 없어 사용자를 삭제할 수 없습니다." -#: cps/admin.py:2072 cps/web.py:1475 +#: cps/admin.py:2150 cps/web.py:1485 msgid "Email can't be empty and has to be a valid Email" msgstr "이메일 주소는 비워둘 수 없고, 올바른 형식이어야 합니다." -#: cps/admin.py:2098 +#: cps/admin.py:2176 #, python-format msgid "User '%(nick)s' updated" msgstr "사용자 '%(nick)s'의 정보를 수정했습니다." @@ -541,145 +580,153 @@ msgstr "사용자 '%(nick)s'의 정보를 수정했습니다." msgid "Search" msgstr "검색" -#: cps/converter.py:31 +#: cps/converter.py:32 msgid "not installed" msgstr "설치되지 않았습니다." -#: cps/converter.py:32 +#: cps/converter.py:33 msgid "Execution permissions missing" msgstr "실행 권한이 없습니다." -#: cps/db.py:1129 cps/templates/config_edit.html:207 +#: cps/db.py:1129 cps/templates/config_edit.html:229 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:565 cps/web.py:599 cps/web.py:644 cps/web.py:684 cps/web.py:711 -#: cps/web.py:998 cps/web.py:1028 cps/web.py:1073 cps/web.py:1101 -#: cps/web.py:1140 +#: cps/web.py:567 cps/web.py:601 cps/web.py:646 cps/web.py:686 cps/web.py:713 +#: cps/web.py:1000 cps/web.py:1030 cps/web.py:1075 cps/web.py:1103 +#: cps/web.py:1142 msgid "None" msgstr "없음" -#: cps/editbooks.py:155 +#: cps/editbooks.py:156 #, python-format msgid "File %(file)s uploaded" msgstr "파일 %(file)s이(가) 업로드되었습니다." -#: cps/editbooks.py:184 +#: cps/editbooks.py:185 msgid "Source or destination format for conversion missing" msgstr "변환할 원본 또는 대상 파일 형식이 지정되지 않았습니다." -#: cps/editbooks.py:192 +#: cps/editbooks.py:189 cps/editbooks.py:197 +msgid "Source format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:201 +msgid "Destination format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:209 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "%(book_format)s 형식으로 변환하기 위해 작업에 추가되었습니다." -#: cps/editbooks.py:196 +#: cps/editbooks.py:213 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "책 변환 중 오류가 발생했습니다: %(res)s" -#: cps/editbooks.py:297 +#: cps/editbooks.py:314 msgid "Changes successfully applied" msgstr "변경 사항이 저장되었습니다." -#: cps/editbooks.py:317 +#: cps/editbooks.py:334 msgid "Value is missing on request" msgstr "요청에서 누락된 값이 있습니다." -#: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 -#: cps/editbooks.py:1146 cps/web.py:532 cps/web.py:1567 cps/web.py:1613 -#: cps/web.py:1663 +#: cps/editbooks.py:336 cps/editbooks.py:343 cps/editbooks.py:644 +#: cps/editbooks.py:1170 cps/web.py:534 cps/web.py:1577 cps/web.py:1623 +#: cps/web.py:1673 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "선택한 책을 사용할 수 없습니다. 파일이 없거나 접근할 수 없습니다." -#: cps/editbooks.py:673 cps/editbooks.py:1503 +#: cps/editbooks.py:690 cps/editbooks.py:1547 msgid "User has no rights to upload cover" msgstr "표지 업로드 권한이 없습니다." -#: cps/editbooks.py:694 cps/editbooks.py:938 +#: cps/editbooks.py:711 cps/editbooks.py:961 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "식별자는 대소문자 구분 없이 덮어씁니다." -#: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 +#: cps/editbooks.py:726 cps/editbooks.py:935 cps/editbooks.py:1306 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "'%(langname)s'은(는) 올바른 언어가 아닙니다." -#: cps/editbooks.py:737 +#: cps/editbooks.py:754 msgid "Metadata successfully updated" msgstr "메타데이터가 업데이트되었습니다." -#: cps/editbooks.py:760 +#: cps/editbooks.py:777 #, python-brace-format msgid "Error editing book: {}" msgstr "책 편집 중 오류가 발생했습니다: {}" -#: cps/editbooks.py:856 +#: cps/editbooks.py:879 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "업로드된 책이 이미 존재하는 것 같습니다. 확인이 필요합니다: " -#: cps/editbooks.py:950 cps/editbooks.py:1420 +#: cps/editbooks.py:973 cps/editbooks.py:1464 msgid "File type isn't allowed to be uploaded to this server" msgstr "업로드할 수 없는 파일 형식입니다." -#: cps/editbooks.py:956 cps/editbooks.py:1431 +#: cps/editbooks.py:979 cps/editbooks.py:1475 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "파일 확장자 '%(ext)s'은(는) 서버에 업로드할 수 없습니다" -#: cps/editbooks.py:960 cps/editbooks.py:1436 +#: cps/editbooks.py:983 cps/editbooks.py:1480 msgid "File to be uploaded must have an extension" msgstr "확장자가 없는 파일은 업로드할 수 없습니다." -#: cps/editbooks.py:968 +#: cps/editbooks.py:992 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "파일 %(filename)s을(를) 임시 폴더에 저장할 수 없습니다." -#: cps/editbooks.py:988 +#: cps/editbooks.py:1012 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "표지 파일 %(file)s을(를) 이동하지 못했습니다 :%(error)s" -#: cps/editbooks.py:1041 +#: cps/editbooks.py:1065 msgid "Book Format Successfully Deleted" msgstr "해당 파일 형식이 삭제되었습니다." -#: cps/editbooks.py:1044 cps/editbooks.py:1061 +#: cps/editbooks.py:1068 cps/editbooks.py:1085 msgid "Book Successfully Deleted" msgstr "책이 삭제되었습니다." -#: cps/editbooks.py:1065 +#: cps/editbooks.py:1089 msgid "You are missing permissions to delete books" msgstr "삭제 권한이 없습니다." -#: cps/editbooks.py:1139 +#: cps/editbooks.py:1163 #, python-brace-format msgid "Book with id \"{}\" could not be deleted: not found" msgstr "책 (\"{}\")을 찾을 수 없습니다." -#: cps/editbooks.py:1181 +#: cps/editbooks.py:1205 msgid "edit metadata" msgstr "메타데이터 편집" -#: cps/editbooks.py:1234 +#: cps/editbooks.py:1267 #, python-format msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "시리즈 순서 %(seriesindex)s은(는) 올바르지 않아 건너뜁니다." -#: cps/editbooks.py:1425 +#: cps/editbooks.py:1469 msgid "User has no rights to upload additional file formats" msgstr "추가 파일 형식을 업로드할 권한이 없습니다." -#: cps/editbooks.py:1449 +#: cps/editbooks.py:1493 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "쓰기 권한이 없어 %(path)s 경로 생성에 실패했습니다." -#: cps/editbooks.py:1456 +#: cps/editbooks.py:1500 #, python-format msgid "Failed to store file %(file)s." msgstr "%(file)s 파일 저장에 실패했습니다." -#: cps/editbooks.py:1481 +#: cps/editbooks.py:1525 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "파일 형식 %(ext)s이(가) %(book)s에 추가되었습니다" @@ -690,9 +737,9 @@ msgstr "추가 사용자를 등록은 1분 뒤 가능합니다." #: cps/error_handler.py:108 cps/templates/layout.html:69 #: cps/templates/layout.html:104 cps/templates/login.html:27 -#: cps/templates/register.html:17 cps/web.py:1292 cps/web.py:1296 -#: cps/web.py:1302 cps/web.py:1326 cps/web.py:1330 cps/web.py:1343 -#: cps/web.py:1346 +#: cps/templates/register.html:17 cps/web.py:1302 cps/web.py:1306 +#: cps/web.py:1312 cps/web.py:1336 cps/web.py:1340 cps/web.py:1353 +#: cps/web.py:1356 msgid "Register" msgstr "가입" @@ -713,7 +760,7 @@ msgstr "콜백 도메인이 인증되지 않았습니다. Google 개발자 콘 msgid "%(format)s format not found for book id: %(book)d" msgstr "책 ID %(book)d의 %(format)s 형식을 찾을 수 없습니다." -#: cps/helper.py:94 cps/tasks/convert.py:91 +#: cps/helper.py:94 cps/tasks/convert.py:92 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "Google 드라이브에서 %(format)s 파일을 찾을 수 없습니다: %(fn)s" @@ -899,10 +946,6 @@ msgstr "표지 파일은 jpg/jpeg 형식만 지원합니다." msgid "Cover" msgstr "표지" -#: cps/helper.py:1006 -msgid "UnRar binary file not found" -msgstr "UnRar 바이너리 파일을 찾을 수 없습니다." - #: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "UnRar 실행 중 오류가 발생했습니다." @@ -933,7 +976,7 @@ msgstr "실행 권한이 없습니다: %(missing)s" msgid "Error executing Calibre" msgstr "Calibre 실행 오류" -#: cps/helper.py:1154 cps/templates/admin.html:216 +#: cps/helper.py:1154 cps/templates/admin.html:232 msgid "Queue all books for metadata backup" msgstr "메타데이터 백업이 작업에 추가되었습니다." @@ -955,7 +998,7 @@ msgstr "%(provider)s로 가입" msgid "This %(oauth)s account is already linked to a different user" msgstr "" -#: cps/oauth_bb.py:147 cps/remotelogin.py:131 +#: cps/oauth_bb.py:147 cps/remotelogin.py:150 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "%(nickname)s로 로그인했습니다." @@ -1023,25 +1066,29 @@ msgstr "Google OAuth 오류가 발생했습니다: {}" msgid "{} Stars" msgstr "{} Stars" -#: cps/remotelogin.py:63 cps/templates/layout.html:68 -#: cps/templates/layout.html:103 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1361 -msgid "Login" -msgstr "로그인" - -#: cps/remotelogin.py:75 cps/remotelogin.py:109 +#: cps/remotelogin.py:46 cps/remotelogin.py:128 msgid "Token not found" msgstr "토큰을 찾을 수 없습니다." -#: cps/remotelogin.py:84 cps/remotelogin.py:117 +#: cps/remotelogin.py:55 cps/remotelogin.py:136 msgid "Token has expired" msgstr "토큰이 만료되었습니다." -#: cps/remotelogin.py:93 +#: cps/remotelogin.py:86 cps/remotelogin.py:112 cps/templates/layout.html:68 +#: cps/templates/layout.html:103 cps/templates/login.html:4 +#: cps/templates/login.html:21 cps/web.py:1371 +msgid "Login" +msgstr "로그인" + +#: cps/remotelogin.py:100 +msgid "Token already approved" +msgstr "" + +#: cps/remotelogin.py:108 msgid "Success! Please return to your device" msgstr "인증되었습니다. 기기로 돌아가 주세요." -#: cps/render_template.py:41 cps/web.py:421 +#: cps/render_template.py:41 cps/web.py:423 msgid "Books" msgstr "전체" @@ -1066,7 +1113,7 @@ msgstr "다운로드한" msgid "Show Downloaded Books" msgstr "다운로드했던 책 보기" -#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:436 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:438 msgid "Top Rated Books" msgstr "베스트" @@ -1075,7 +1122,7 @@ msgid "Show Top Rated Books" msgstr "평점 높은 책 보기" #: cps/render_template.py:61 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:769 +#: cps/templates/index.xml:67 cps/web.py:771 msgid "Read Books" msgstr "읽음" @@ -1084,7 +1131,7 @@ msgid "Show Read and Unread" msgstr "읽은 책과 읽지 않은 책 보기" #: cps/render_template.py:65 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:772 +#: cps/templates/index.xml:74 cps/web.py:774 msgid "Unread Books" msgstr "읽지 않음" @@ -1102,7 +1149,7 @@ msgid "Show Random Books" msgstr "무작위 추천 보기" #: cps/render_template.py:71 cps/templates/book_table.html:93 -#: cps/templates/index.xml:97 cps/web.py:1144 +#: cps/templates/index.xml:97 cps/web.py:1146 msgid "Categories" msgstr "카테고리" @@ -1112,7 +1159,7 @@ msgstr "카테고리 보기" #: cps/render_template.py:74 cps/templates/book_edit.html:86 #: cps/templates/book_table.html:94 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1034 cps/web.py:1046 +#: cps/templates/search_form.html:70 cps/web.py:1036 cps/web.py:1048 msgid "Series" msgstr "시리즈" @@ -1130,7 +1177,7 @@ msgid "Show Author Section" msgstr "저자 보기" #: cps/render_template.py:81 cps/templates/book_table.html:98 -#: cps/templates/index.xml:88 cps/web.py:1002 +#: cps/templates/index.xml:88 cps/web.py:1004 msgid "Publishers" msgstr "출판사" @@ -1140,7 +1187,7 @@ msgstr "출판사 보기" #: cps/render_template.py:84 cps/templates/book_table.html:96 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1116 +#: cps/web.py:1118 msgid "Languages" msgstr "언어" @@ -1164,7 +1211,7 @@ msgstr "파일 형식" msgid "Show File Formats Section" msgstr "파일 형식 보기" -#: cps/render_template.py:95 cps/web.py:795 +#: cps/render_template.py:95 cps/web.py:797 msgid "Archived Books" msgstr "숨긴 책" @@ -1172,7 +1219,7 @@ msgstr "숨긴 책" msgid "Show Archived Books" msgstr "숨긴 책 보기" -#: cps/render_template.py:100 cps/web.py:831 +#: cps/render_template.py:100 cps/web.py:833 msgid "Books List" msgstr "책 목록" @@ -1405,150 +1452,154 @@ msgstr "새로운 업데이트가 있습니다. %(version)s으로 업데이트 msgid "No release information available" msgstr "업데이트 정보가 없습니다." -#: cps/templates/index.html:6 cps/web.py:448 +#: cps/templates/index.html:6 cps/web.py:450 msgid "Discover (Random Books)" msgstr "추천 (무작위)" -#: cps/web.py:484 +#: cps/web.py:486 msgid "Hot Books (Most Downloaded)" msgstr "인기 책 (가장 많이 다운로드된 책)" -#: cps/web.py:515 +#: cps/web.py:517 #, python-format msgid "Downloaded books by %(user)s" msgstr "%(user)s이(가) 다운로드한 책" -#: cps/web.py:548 +#: cps/web.py:550 #, python-format msgid "Author: %(name)s" msgstr "저자: %(name)s" -#: cps/web.py:584 +#: cps/web.py:586 #, python-format msgid "Publisher: %(name)s" msgstr "출판사: %(name)s" -#: cps/web.py:612 +#: cps/web.py:614 #, python-format msgid "Series: %(serie)s" msgstr "시리즈: %(serie)s" -#: cps/web.py:626 +#: cps/web.py:628 msgid "Rating: None" msgstr "평점: 없음" -#: cps/web.py:635 +#: cps/web.py:637 #, python-format msgid "Rating: %(rating)s stars" msgstr "평점: %(rating)s" -#: cps/web.py:666 +#: cps/web.py:668 #, python-format msgid "File format: %(format)s" msgstr "파일 형식: %(format)s" -#: cps/web.py:701 +#: cps/web.py:703 #, python-format msgid "Category: %(name)s" msgstr "카테고리: %(name)s" -#: cps/web.py:730 +#: cps/web.py:732 #, python-format msgid "Language: %(name)s" msgstr "언어: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:974 +#: cps/templates/admin.html:16 cps/web.py:976 msgid "Downloads" msgstr "다운로드" -#: cps/web.py:1076 +#: cps/web.py:1078 msgid "Ratings list" msgstr "평점 목록" -#: cps/web.py:1103 +#: cps/web.py:1105 msgid "File formats list" msgstr "파일 형식 목록" -#: cps/web.py:1264 +#: cps/web.py:1272 +msgid "Book format not supported" +msgstr "" + +#: cps/web.py:1274 msgid "Please configure the SMTP mail settings first..." msgstr "SMTP 설정을 해주세요." -#: cps/web.py:1270 +#: cps/web.py:1280 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "%(eReadermail)s에 전송 작업이 추가되었습니다." -#: cps/web.py:1273 +#: cps/web.py:1283 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "전송 중 오류가 발생했습니다: %(res)s" -#: cps/web.py:1275 +#: cps/web.py:1285 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "문제가 발생했습니다. 프로필에 유효한 전자책 리더 이메일을 설정해 주세요." -#: cps/web.py:1291 cps/web.py:1342 +#: cps/web.py:1301 cps/web.py:1352 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "이메일 서버가 설정되지 않았습니다. 관리자에게 문의하세요." -#: cps/web.py:1328 +#: cps/web.py:1338 msgid "Oops! Your Email is not allowed." msgstr "사용할 수 없는 이메일입니다." -#: cps/web.py:1331 +#: cps/web.py:1341 msgid "Success! Confirmation Email has been sent." msgstr "인증 이메일을 발송했습니다." -#: cps/web.py:1376 cps/web.py:1390 +#: cps/web.py:1386 cps/web.py:1400 msgid "Cannot activate LDAP authentication" msgstr "LDAP 인증을 활성화할 수 없습니다." -#: cps/web.py:1399 +#: cps/web.py:1409 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "'%(nickname)s'로 로그인했습니다." -#: cps/web.py:1406 +#: cps/web.py:1416 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "'%(nickname)s'(으)로 대체 로그인했습니다. LDAP 서버에 연결할 수 없거나 존재하지 않는 사용자입니다." -#: cps/web.py:1411 +#: cps/web.py:1421 #, python-format msgid "Could not login: %(message)s" msgstr "로그인할 수 없습니다: %(message)s" -#: cps/web.py:1415 cps/web.py:1440 +#: cps/web.py:1425 cps/web.py:1450 msgid "Wrong Username or Password" msgstr "사용자 이름 또는 비밀번호가 올바르지 않습니다." -#: cps/web.py:1422 +#: cps/web.py:1432 msgid "New Password was sent to your email address" msgstr "새로운 비밀번호가 이메일로 전송되었습니다" -#: cps/web.py:1426 +#: cps/web.py:1436 msgid "An unknown error occurred. Please try again later." msgstr "알 수 없는 오류가 발생했습니다. 나중에 다시 시도해 주세요." -#: cps/web.py:1428 +#: cps/web.py:1438 msgid "Please enter valid username to reset password" msgstr "비밀번호를 재설정하려면 올바른 사용자 이름을 입력하세요." -#: cps/web.py:1436 +#: cps/web.py:1446 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "'%(nickname)s'로 로그인했습니다." -#: cps/web.py:1501 cps/web.py:1551 +#: cps/web.py:1511 cps/web.py:1561 #, python-format msgid "%(name)s's Profile" msgstr "%(name)s 프로필" -#: cps/web.py:1517 +#: cps/web.py:1527 msgid "Success! Profile Updated" msgstr "프로필이 업데이트되었습니다." -#: cps/web.py:1521 +#: cps/web.py:1531 msgid "Oops! An account already exists for this Email." msgstr "이미 등록된 이메일 주소입니다." @@ -1560,46 +1611,46 @@ msgstr "인증 정보가 포함된 유요한 gmail.json을 찾을 수 없습니 msgid "Delete temp folder contents" msgstr "임시 폴더 비우기" -#: cps/tasks/convert.py:112 +#: cps/tasks/convert.py:113 #, python-format msgid "%(book)s send to E-Reader" msgstr "%(book)s을(를) 전자책 리더로 전송" -#: cps/tasks/convert.py:177 +#: cps/tasks/convert.py:180 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre ebook-convert %(tool)s을(를) 찾을 수 없습니다." -#: cps/tasks/convert.py:211 +#: cps/tasks/convert.py:214 #, python-format msgid "%(format)s format not found on disk" msgstr "%(format)s 형식을 찾을 수 없습니다." -#: cps/tasks/convert.py:215 +#: cps/tasks/convert.py:218 msgid "Ebook converter failed with unknown error" msgstr "알 수 없는 오류로 변환에 실패했습니다." -#: cps/tasks/convert.py:234 +#: cps/tasks/convert.py:237 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify 변환에 실패했습니다: %(error)s" -#: cps/tasks/convert.py:254 +#: cps/tasks/convert.py:257 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "변환된 파일을 찾을 수 없거나 %(folder)s 폴더에 하나 이상의 파일이 존재합니다." -#: cps/tasks/convert.py:291 cps/tasks/convert.py:342 +#: cps/tasks/convert.py:294 cps/tasks/convert.py:345 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre가 다음 오류로 실패했습니다: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:322 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "변환에 실패했습니다: %(error)s" -#: cps/tasks/convert.py:347 +#: cps/tasks/convert.py:350 msgid "Convert" msgstr "변환" @@ -1685,7 +1736,7 @@ msgstr "편집" #: cps/templates/admin.html:25 cps/templates/book_edit.html:17 #: cps/templates/book_table.html:131 cps/templates/book_table.html:180 -#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:115 +#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:117 #: cps/templates/user_edit.html:67 cps/templates/user_table.html:149 msgid "Delete" msgstr "삭제" @@ -1775,128 +1826,145 @@ msgstr "매직 링크 원격 로그인" msgid "Reverse Proxy Login" msgstr "리버스 프록시 로그인" -#: cps/templates/admin.html:154 cps/templates/config_edit.html:176 +#: cps/templates/admin.html:154 cps/templates/config_edit.html:180 msgid "Reverse Proxy Header Name" msgstr "리버스 프록시 헤더 이름" -#: cps/templates/admin.html:159 +#: cps/templates/admin.html:158 +msgid "Reverse Proxy Trusted IPs/CIDRs" +msgstr "" + +#: cps/templates/admin.html:162 cps/templates/config_edit.html:193 +msgid "Reverse Proxy Shared Secret Header Name" +msgstr "" + +#: cps/templates/admin.html:166 +msgid "Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/admin.html:170 +msgid "Reverse Proxy Shared Secret Configured" +msgstr "" + +#: cps/templates/admin.html:175 msgid "Edit Calibre Database Configuration" msgstr "Calibre 데이터베이스 설정" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:176 msgid "Edit Basic Configuration" msgstr "기본 설정" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:177 msgid "Edit UI Configuration" msgstr "UI 설정" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:183 msgid "Scheduled Tasks" msgstr "예약된 작업" -#: cps/templates/admin.html:170 cps/templates/schedule_edit.html:12 +#: cps/templates/admin.html:186 cps/templates/schedule_edit.html:12 #: cps/templates/tasks.html:18 msgid "Start Time" msgstr "시작 시간" -#: cps/templates/admin.html:174 cps/templates/schedule_edit.html:20 +#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:20 msgid "Maximum Duration" msgstr "최대 실행 시간" -#: cps/templates/admin.html:178 cps/templates/schedule_edit.html:29 +#: cps/templates/admin.html:194 cps/templates/schedule_edit.html:29 msgid "Generate Thumbnails" msgstr "썸네일 생성" -#: cps/templates/admin.html:182 +#: cps/templates/admin.html:198 msgid "Generate series cover thumbnails" msgstr "시리즈 표지 썸네일 생성" -#: cps/templates/admin.html:186 cps/templates/admin.html:208 +#: cps/templates/admin.html:202 cps/templates/admin.html:224 #: cps/templates/schedule_edit.html:37 msgid "Reconnect Calibre Database" msgstr "Calibre 데이터베이스 다시 연결" -#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 +#: cps/templates/admin.html:206 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" msgstr "메타데이터 백업" -#: cps/templates/admin.html:197 +#: cps/templates/admin.html:213 msgid "Refresh Thumbnail Cache" msgstr "썸네일 캐시 갱신" -#: cps/templates/admin.html:203 +#: cps/templates/admin.html:219 msgid "Administration" msgstr "관리" -#: cps/templates/admin.html:204 +#: cps/templates/admin.html:220 msgid "Download Debug Package" msgstr "디버그 패키지 다운로드" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:221 msgid "View Logs" msgstr "로그 보기" -#: cps/templates/admin.html:211 +#: cps/templates/admin.html:227 msgid "Restart" msgstr "재시작" -#: cps/templates/admin.html:212 +#: cps/templates/admin.html:228 msgid "Shutdown" msgstr "종료" -#: cps/templates/admin.html:221 +#: cps/templates/admin.html:237 msgid "Version Information" msgstr "버전 정보" -#: cps/templates/admin.html:225 +#: cps/templates/admin.html:241 msgid "Version" msgstr "버전" -#: cps/templates/admin.html:226 +#: cps/templates/admin.html:242 msgid "Details" msgstr "세부 정보" -#: cps/templates/admin.html:232 +#: cps/templates/admin.html:248 msgid "Current Version" msgstr "현재 버전" -#: cps/templates/admin.html:239 +#: cps/templates/admin.html:255 msgid "Check for Update" msgstr "업데이트 확인" -#: cps/templates/admin.html:240 +#: cps/templates/admin.html:256 msgid "Perform Update" msgstr "업데이트 실행" -#: cps/templates/admin.html:253 +#: cps/templates/admin.html:269 msgid "Are you sure you want to restart?" msgstr "재시작하시겠습니까?" -#: cps/templates/admin.html:258 cps/templates/admin.html:272 -#: cps/templates/admin.html:292 cps/templates/config_db.html:82 +#: cps/templates/admin.html:274 cps/templates/admin.html:288 +#: cps/templates/admin.html:308 cps/templates/config_db.html:82 msgid "OK" msgstr "예" -#: cps/templates/admin.html:259 cps/templates/admin.html:273 +#: cps/templates/admin.html:275 cps/templates/admin.html:289 #: cps/templates/book_edit.html:220 cps/templates/book_table.html:162 #: cps/templates/book_table.html:181 cps/templates/book_table.html:201 #: cps/templates/book_table.html:221 cps/templates/book_table.html:241 #: cps/templates/book_table.html:261 cps/templates/book_table.html:316 -#: cps/templates/config_db.html:66 cps/templates/config_edit.html:431 +#: cps/templates/config_db.html:66 cps/templates/config_edit.html:453 #: cps/templates/config_view_edit.html:175 cps/templates/detail.html:350 -#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:98 -#: cps/templates/modal_dialogs.html:116 cps/templates/modal_dialogs.html:134 +#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:100 +#: cps/templates/modal_dialogs.html:118 cps/templates/modal_dialogs.html:136 +#: cps/templates/remote_login_verify.html:16 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 #: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "취소" -#: cps/templates/admin.html:271 +#: cps/templates/admin.html:287 msgid "Are you sure you want to shutdown?" msgstr "종료하시겠습니까?" -#: cps/templates/admin.html:283 +#: cps/templates/admin.html:299 msgid "Updating, please do not reload this page" msgstr "업데이트 중입니다. 이 페이지를 새로고침하지 마세요." @@ -2137,7 +2205,7 @@ msgid "Fetch Metadata" msgstr "메타데이터 가져오기" #: cps/templates/book_edit.html:219 cps/templates/config_db.html:65 -#: cps/templates/config_edit.html:430 cps/templates/config_view_edit.html:174 +#: cps/templates/config_edit.html:452 cps/templates/config_view_edit.html:174 #: cps/templates/email_edit.html:65 cps/templates/schedule_edit.html:44 #: cps/templates/shelf_edit.html:25 cps/templates/shelf_order.html:41 #: cps/templates/user_edit.html:142 @@ -2509,214 +2577,234 @@ msgstr "Google Books API 키" msgid "Allow Reverse Proxy Authentication" msgstr "리버스 프록시 인증 허용" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:176 +msgid "Security Warning" +msgstr "" + +#: cps/templates/config_edit.html:177 +msgid "Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled." +msgstr "" + +#: cps/templates/config_edit.html:184 +msgid "Reverse Proxy Trusted IPs/CIDRs (Comma Separated)" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "Enable Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/config_edit.html:197 +msgid "Reverse Proxy Shared Secret" +msgstr "" + +#: cps/templates/config_edit.html:205 msgid "Login type" msgstr "로그인 방식" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:207 msgid "Use Standard Authentication" msgstr "일반 인증 사용" -#: cps/templates/config_edit.html:187 +#: cps/templates/config_edit.html:209 msgid "Use LDAP Authentication" msgstr "LDAP 인증 사용" -#: cps/templates/config_edit.html:190 +#: cps/templates/config_edit.html:212 msgid "Use OAuth" msgstr "OAuth 사용" -#: cps/templates/config_edit.html:197 +#: cps/templates/config_edit.html:219 msgid "LDAP Server Host Name or IP Address" msgstr "LDAP 서버 호스트 이름 또는 IP 주소" -#: cps/templates/config_edit.html:201 +#: cps/templates/config_edit.html:223 msgid "LDAP Server Port" msgstr "LDAP 서버 포트" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:227 msgid "LDAP Encryption" msgstr "LDAP 암호화" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:230 msgid "TLS" msgstr "TLS" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:231 msgid "SSL" msgstr "SSL" -#: cps/templates/config_edit.html:213 +#: cps/templates/config_edit.html:235 msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" msgstr "LDAP CA 인증서 경로 (클라이언트 인증서 인증 시에만 필요)" -#: cps/templates/config_edit.html:220 +#: cps/templates/config_edit.html:242 msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" msgstr "LDAP 인증서 경로 (클라이언트 인증서 인증 시에만 필요)" -#: cps/templates/config_edit.html:227 +#: cps/templates/config_edit.html:249 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" msgstr "LDAP 키 파일 경로 (클라이언트 인증서 인증 시에만 필요)" -#: cps/templates/config_edit.html:236 +#: cps/templates/config_edit.html:258 msgid "LDAP Authentication" msgstr "LDAP 인증" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:260 msgid "Anonymous" msgstr "익명" -#: cps/templates/config_edit.html:239 +#: cps/templates/config_edit.html:261 msgid "Unauthenticated" msgstr "미인증" -#: cps/templates/config_edit.html:240 +#: cps/templates/config_edit.html:262 msgid "Simple" msgstr "단순 인증" -#: cps/templates/config_edit.html:245 +#: cps/templates/config_edit.html:267 msgid "LDAP Administrator Username" msgstr "LDAP 관리자 아이디" -#: cps/templates/config_edit.html:251 +#: cps/templates/config_edit.html:273 msgid "LDAP Administrator Password" msgstr "LDAP 관리자 비밀번호" -#: cps/templates/config_edit.html:256 +#: cps/templates/config_edit.html:278 msgid "LDAP Distinguished Name (DN)" msgstr "LDAP 식별 이름 (DN)" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:282 msgid "LDAP User Object Filter" msgstr "LDAP 사용자 객체 필터" -#: cps/templates/config_edit.html:265 +#: cps/templates/config_edit.html:287 msgid "LDAP Server is OpenLDAP?" msgstr "OpenLDAP 서버인 경우 체크" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:289 msgid "Following Settings are Needed For User Import" msgstr "사용자를 가져오기 위해 다음 설정이 필요합니다." -#: cps/templates/config_edit.html:269 +#: cps/templates/config_edit.html:291 msgid "LDAP Group Object Filter" msgstr "LDAP 그룹 객체 필터" -#: cps/templates/config_edit.html:273 +#: cps/templates/config_edit.html:295 msgid "LDAP Group Name" msgstr "LDAP 그룹 이름" -#: cps/templates/config_edit.html:277 +#: cps/templates/config_edit.html:299 msgid "LDAP Group Members Field" msgstr "LDAP 그룹 구성원 필드" -#: cps/templates/config_edit.html:281 +#: cps/templates/config_edit.html:303 msgid "LDAP Member User Filter Detection" msgstr "LDAP 구성원 사용자 감지 필터" -#: cps/templates/config_edit.html:283 +#: cps/templates/config_edit.html:305 msgid "Autodetect" msgstr "자동 감지" -#: cps/templates/config_edit.html:284 +#: cps/templates/config_edit.html:306 msgid "Custom Filter" msgstr "사용자 지정 필터" -#: cps/templates/config_edit.html:289 +#: cps/templates/config_edit.html:311 msgid "LDAP Member User Filter" msgstr "LDAP 구성원 사용자 필터" -#: cps/templates/config_edit.html:300 +#: cps/templates/config_edit.html:322 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "%(provider)s OAuth 인증 정보 받기" -#: cps/templates/config_edit.html:303 +#: cps/templates/config_edit.html:325 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "%(provider)s OAuth 클라이언트 ID" -#: cps/templates/config_edit.html:307 +#: cps/templates/config_edit.html:329 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "%(provider)s OAuth 클라이언트 비밀키" -#: cps/templates/config_edit.html:323 +#: cps/templates/config_edit.html:345 msgid "External binaries" msgstr "외부 바이너리 설정" -#: cps/templates/config_edit.html:329 +#: cps/templates/config_edit.html:351 msgid "Path to Calibre Binaries" msgstr "Calibre 바이너리 경로" -#: cps/templates/config_edit.html:337 +#: cps/templates/config_edit.html:359 msgid "Calibre E-Book Converter Settings" msgstr "Calibre E-Book 컨버터 설정" -#: cps/templates/config_edit.html:340 +#: cps/templates/config_edit.html:362 msgid "Path to Kepubify E-Book Converter" msgstr "Kepubify 전자책 컨버터 경로" -#: cps/templates/config_edit.html:348 +#: cps/templates/config_edit.html:370 msgid "Location of Unrar binary" msgstr "UnRar 바이너리 경로" -#: cps/templates/config_edit.html:364 +#: cps/templates/config_edit.html:386 msgid "Security Settings" msgstr "보안 설정" -#: cps/templates/config_edit.html:372 +#: cps/templates/config_edit.html:394 msgid "Limit failed login attempts" msgstr "로그인 실패 횟수 제한" -#: cps/templates/config_edit.html:376 +#: cps/templates/config_edit.html:398 msgid "Configure Backend for Limiter" msgstr "Flask-Limiter 데이터베이스 주소" -#: cps/templates/config_edit.html:380 +#: cps/templates/config_edit.html:402 msgid "Options for Limiter Backend" msgstr "Flask-Limiter 옵션" -#: cps/templates/config_edit.html:386 +#: cps/templates/config_edit.html:408 msgid "Check if file extensions matches file content on upload" msgstr "업로드 시 파일 확장자 검사" -#: cps/templates/config_edit.html:389 +#: cps/templates/config_edit.html:411 msgid "Session protection" msgstr "세션 보호" -#: cps/templates/config_edit.html:391 +#: cps/templates/config_edit.html:413 msgid "Basic" msgstr "기본" -#: cps/templates/config_edit.html:392 +#: cps/templates/config_edit.html:414 msgid "Strong" msgstr "강력" -#: cps/templates/config_edit.html:397 +#: cps/templates/config_edit.html:419 msgid "User Password policy" msgstr "비밀번호 강도 규칙 사용" -#: cps/templates/config_edit.html:401 +#: cps/templates/config_edit.html:423 msgid "Minimum password length" msgstr "최소 비밀번호 길이" -#: cps/templates/config_edit.html:406 +#: cps/templates/config_edit.html:428 msgid "Enforce number" msgstr "숫자 필수" -#: cps/templates/config_edit.html:410 +#: cps/templates/config_edit.html:432 msgid "Enforce lowercase characters" msgstr "소문자 필수" -#: cps/templates/config_edit.html:414 +#: cps/templates/config_edit.html:436 msgid "Enforce uppercase characters" msgstr "대문자 필수" -#: cps/templates/config_edit.html:418 +#: cps/templates/config_edit.html:440 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" msgstr "문자 포함 필수 (중국어/일본어/한국어 사용 시 필요)" -#: cps/templates/config_edit.html:422 +#: cps/templates/config_edit.html:444 msgid "Enforce special characters" msgstr "특수문자 필수" @@ -3183,27 +3271,27 @@ msgstr "책을 안전하게 삭제하려면 먼저 숨김 처리한 뒤 기기 msgid "Choose File Location" msgstr "파일 위치 선택" -#: cps/templates/modal_dialogs.html:81 +#: cps/templates/modal_dialogs.html:82 msgid "type" msgstr "유형" -#: cps/templates/modal_dialogs.html:82 +#: cps/templates/modal_dialogs.html:83 msgid "name" msgstr "이름" -#: cps/templates/modal_dialogs.html:83 +#: cps/templates/modal_dialogs.html:84 msgid "size" msgstr "크기" -#: cps/templates/modal_dialogs.html:89 +#: cps/templates/modal_dialogs.html:90 msgid "Parent Directory" msgstr "상위 폴더" -#: cps/templates/modal_dialogs.html:97 +#: cps/templates/modal_dialogs.html:99 msgid "Select" msgstr "선택" -#: cps/templates/modal_dialogs.html:133 cps/templates/tasks.html:46 +#: cps/templates/modal_dialogs.html:135 cps/templates/tasks.html:46 msgid "Ok" msgstr "확인" @@ -3459,6 +3547,31 @@ msgstr "승인되면 자동으로 로그인됩니다." msgid "This verification link will expire in 10 minutes." msgstr "인증 링크는 10분 뒤 만료됩니다." +#: cps/templates/remote_login_verify.html:4 +msgid "Approve Magic Link Login" +msgstr "" + +#: cps/templates/remote_login_verify.html:5 +msgid "Review the device that requested access before approving this login." +msgstr "" + +#: cps/templates/remote_login_verify.html:7 +msgid "IP address" +msgstr "" + +#: cps/templates/remote_login_verify.html:9 +msgid "Browser" +msgstr "" + +#: cps/templates/remote_login_verify.html:12 +#, python-format +msgid "If you approve this request, the device that started it will be logged in as %(username)s." +msgstr "" + +#: cps/templates/remote_login_verify.html:15 +msgid "Approve Login" +msgstr "" + #: cps/templates/schedule_edit.html:33 msgid "Generate Series Cover Thumbnails" msgstr "시리즈 표지 썸네일 생성" diff --git a/cps/translations/nl/LC_MESSAGES/messages.mo b/cps/translations/nl/LC_MESSAGES/messages.mo index a47ce3f5543b6df960cf9ff5438ff94e1b8e8fc0..7fc9fc49bdc41d20bef5ba96a09066cb0dff1011 100644 GIT binary patch delta 11774 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 CR)=N) diff --git a/cps/translations/nl/LC_MESSAGES/messages.po b/cps/translations/nl/LC_MESSAGES/messages.po index 149ebdf61..b9fc6883a 100644 --- a/cps/translations/nl/LC_MESSAGES/messages.po +++ b/cps/translations/nl/LC_MESSAGES/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web (GPLV3)\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2026-08-01 11:42+0200\n" +"POT-Creation-Date: 2026-08-08 16:08+0200\n" "PO-Revision-Date: 2023-12-20 22:00+0100\n" "Last-Translator: Michiel Cornelissen \n" "Language: nl\n" @@ -17,519 +17,558 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" +"Generated-By: Babel 2.18.0\n" #: cps/about.py:85 msgid "Statistics" msgstr "Statistieken" -#: cps/admin.py:151 +#: cps/admin.py:154 msgid "Server restarted, please reload page." msgstr "" -#: cps/admin.py:153 +#: cps/admin.py:156 msgid "Performing Server shutdown, please close window." msgstr "" -#: cps/admin.py:161 +#: cps/admin.py:164 msgid "Success! Database Reconnected" msgstr "Gelukt! Database opnieuw verbonden" -#: cps/admin.py:164 +#: cps/admin.py:167 msgid "Unknown command" msgstr "Onbekende opdracht" -#: cps/admin.py:175 +#: cps/admin.py:178 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "" -#: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 -#: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 -#: cps/uploader.py:117 +#: cps/admin.py:211 cps/editbooks.py:825 cps/editbooks.py:875 +#: cps/editbooks.py:1564 cps/templates/remote_login_verify.html:8 +#: cps/templates/remote_login_verify.html:10 cps/updater.py:615 +#: cps/uploader.py:117 cps/uploader.py:126 msgid "Unknown" msgstr "Onbekend" -#: cps/admin.py:233 +#: cps/admin.py:236 msgid "Admin page" msgstr "Systeembeheer" -#: cps/admin.py:253 +#: cps/admin.py:256 msgid "Basic Configuration" msgstr "Basisconfiguratie" -#: cps/admin.py:291 +#: cps/admin.py:294 msgid "UI Configuration" msgstr "Uiterlijk aanpassen" -#: cps/admin.py:315 cps/admin.py:1002 cps/db.py:809 cps/search.py:150 -#: cps/web.py:750 +#: cps/admin.py:318 cps/admin.py:1005 cps/db.py:809 cps/search.py:150 +#: cps/web.py:752 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "" -#: cps/admin.py:333 cps/templates/admin.html:51 +#: cps/admin.py:336 cps/templates/admin.html:51 msgid "Edit Users" msgstr "" -#: cps/admin.py:378 cps/opds.py:559 cps/templates/grid.html:14 +#: cps/admin.py:381 cps/opds.py:559 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Alles" -#: cps/admin.py:401 cps/admin.py:1432 +#: cps/admin.py:404 cps/admin.py:1460 msgid "User not found" msgstr "Gebruiker niet gevonden" -#: cps/admin.py:415 +#: cps/admin.py:418 #, python-brace-format msgid "{} users deleted successfully" msgstr "{} gebruikers succesvol verwijderd" -#: cps/admin.py:438 cps/templates/config_view_edit.html:133 +#: cps/admin.py:441 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Alle talen" -#: cps/admin.py:459 cps/admin.py:465 +#: cps/admin.py:462 cps/admin.py:468 msgid "Malformed request" msgstr "Misvormd verzoek" -#: cps/admin.py:477 cps/admin.py:2078 +#: cps/admin.py:480 cps/admin.py:2156 msgid "Guest Name can't be changed" msgstr "Gast naam kan niet worden veranderd" -#: cps/admin.py:489 +#: cps/admin.py:492 msgid "Guest can't have this role" msgstr "Gast kan deze rol niet hebben" -#: cps/admin.py:501 cps/admin.py:2032 +#: cps/admin.py:504 cps/admin.py:2110 msgid "No admin user remaining, can't remove admin role" msgstr "Kan systeembeheerder rol niet verwijderen van de laatste systeembeheerder" -#: cps/admin.py:505 cps/admin.py:519 +#: cps/admin.py:508 cps/admin.py:522 msgid "Value has to be true or false" msgstr "Waarde moet Waar of Onwaar zijn" -#: cps/admin.py:507 +#: cps/admin.py:510 msgid "Invalid role" msgstr "Ongeldige rol" -#: cps/admin.py:511 +#: cps/admin.py:514 msgid "Guest can't have this view" msgstr "Gast kan dit niet bekijken" -#: cps/admin.py:521 +#: cps/admin.py:524 msgid "Invalid view" msgstr "Ongeldige waarde" -#: cps/admin.py:524 +#: cps/admin.py:527 msgid "Guest's Locale is determined automatically and can't be set" msgstr "Gasts locale is automatisch bepaald en kan niet handmatig worden ingesteld" -#: cps/admin.py:528 +#: cps/admin.py:531 msgid "No Valid Locale Given" msgstr "Geen geldige locale is opgegeven" -#: cps/admin.py:539 +#: cps/admin.py:542 msgid "No Valid Book Language Given" msgstr "Geen geldige boek taal is opgegeven" -#: cps/admin.py:541 cps/editbooks.py:243 cps/editbooks.py:428 -#: cps/editbooks.py:430 +#: cps/admin.py:544 cps/editbooks.py:260 cps/editbooks.py:445 +#: cps/editbooks.py:447 msgid "Parameter not found" msgstr "Parameter is niet gevonden" -#: cps/admin.py:578 +#: cps/admin.py:581 msgid "Invalid Read Column" msgstr "Ongeldige gelezen kolom" -#: cps/admin.py:584 +#: cps/admin.py:587 msgid "Invalid Restricted Column" msgstr "Ongeldige beperkte kolom" -#: cps/admin.py:604 cps/admin.py:1903 +#: cps/admin.py:607 cps/admin.py:1981 msgid "Calibre-Web configuration updated" msgstr "Calibre-Web-configuratie bijgewerkt" -#: cps/admin.py:616 +#: cps/admin.py:619 msgid "Do you really want to delete the Kobo Token?" msgstr "Wil je je Kobo Token echt verwijderen?" -#: cps/admin.py:618 +#: cps/admin.py:621 msgid "Do you really want to delete this domain?" msgstr "Wil je dit domein echt verwijderen?" -#: cps/admin.py:620 +#: cps/admin.py:623 msgid "Do you really want to delete this user?" msgstr "Wil je deze gebruiker echt verwijderen?" -#: cps/admin.py:622 +#: cps/admin.py:625 msgid "Do you really want to delete this book?" msgstr "" -#: cps/admin.py:624 +#: cps/admin.py:627 msgid "Are you sure you want to delete this shelf?" msgstr "Weet je zeker dat je deze boekenplank wilt verwijderen?" -#: cps/admin.py:626 +#: cps/admin.py:629 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "" -#: cps/admin.py:628 +#: cps/admin.py:631 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "Weet je zeker dat je de zichtbare talen voor de geselecteerde gebruiker(s) wil veranderen?" -#: cps/admin.py:630 +#: cps/admin.py:633 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "Weet je zeker dat je de geselecteerde rol van de geselecteerde gebruiker(s) wil veranderen?" -#: cps/admin.py:632 +#: cps/admin.py:635 msgid "Are you sure you want to change the archive status for the selected book(s)?" msgstr "" -#: cps/admin.py:634 +#: cps/admin.py:637 msgid "Are you sure you want to change the read status for the selected book(s)?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:639 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "" -#: cps/admin.py:638 +#: cps/admin.py:641 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "Weet je zeker dat je de geselecteerde zichtbaarheidsbeperkingen voor de geselecteerde gebruiker(s) wil veranderen?" -#: cps/admin.py:641 +#: cps/admin.py:644 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "" -#: cps/admin.py:643 +#: cps/admin.py:646 msgid "Are you sure you want to change Calibre library location?" msgstr "" -#: cps/admin.py:645 +#: cps/admin.py:648 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "Calibre-web gaat zoeken naar bijgewerkte omslagen en miniaturen bijwerken, dit kan even duren?" -#: cps/admin.py:648 +#: cps/admin.py:651 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Weet u zeker dat u de volledige Calibre-Web synchronisatiedatabase wilt verwijderen om een volledige synchronisatie met uw Kobo Reader te forceren?" -#: cps/admin.py:891 cps/admin.py:897 cps/admin.py:907 cps/admin.py:917 +#: cps/admin.py:894 cps/admin.py:900 cps/admin.py:910 cps/admin.py:920 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Weigeren" -#: cps/admin.py:893 cps/admin.py:899 cps/admin.py:909 cps/admin.py:919 +#: cps/admin.py:896 cps/admin.py:902 cps/admin.py:912 cps/admin.py:922 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Toestaan" -#: cps/admin.py:952 +#: cps/admin.py:955 #, python-brace-format msgid "{} sync entries deleted" msgstr "{} synchronisatie objecten verwijderd" -#: cps/admin.py:993 +#: cps/admin.py:996 msgid "Tag not found" msgstr "Tag niet gevonden" -#: cps/admin.py:1011 +#: cps/admin.py:1014 msgid "Invalid Action" msgstr "Ongeldige actie" -#: cps/admin.py:1138 +#: cps/admin.py:1137 +#, python-format +msgid "Invalid reverse proxy trusted IP/CIDR entry: %(entry)s" +msgstr "" + +#: cps/admin.py:1148 +#, python-format +msgid "Invalid %(label)s: %(value)s" +msgstr "" + +#: cps/admin.py:1166 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json is niet geconfigureerd voor webapplicatie" -#: cps/admin.py:1183 +#: cps/admin.py:1211 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "De locatie van het logbestand is onjuist, voer een geldige locatie in" -#: cps/admin.py:1189 +#: cps/admin.py:1217 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "De locatie vam het toegangslog is onjuist, voer een geldige locatie in" -#: cps/admin.py:1223 +#: cps/admin.py:1251 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Voer alsjeblieft een LDAP Provider, Port, DN en User Object Identifier in" -#: cps/admin.py:1229 +#: cps/admin.py:1257 msgid "Please Enter a LDAP Service Account and Password" msgstr "Voer een geldig LDAP Service Account en wachtwoord in" -#: cps/admin.py:1232 +#: cps/admin.py:1260 msgid "Please Enter a LDAP Service Account" msgstr "Voer een LDAP Service Account in" -#: cps/admin.py:1237 +#: cps/admin.py:1265 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "LDAP Groep Object Filter Moet Een \"%s\" Formaat Identificiatie hebben" -#: cps/admin.py:1239 +#: cps/admin.py:1267 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "LDAP Groep Object Filter heeft een niet-gebalanceerd haakje" -#: cps/admin.py:1243 +#: cps/admin.py:1271 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP Gebruiker Object Filter moet \"%s\" Formaat Identificatie hebben" -#: cps/admin.py:1245 +#: cps/admin.py:1273 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "LDAP Gebruiker Filter heeft een niet-gebalanceerd haakje" -#: cps/admin.py:1252 +#: cps/admin.py:1280 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP Lid Gebruiker Filter moet een \"%s\" Formaat Identificatie hebben" -#: cps/admin.py:1254 +#: cps/admin.py:1282 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "LDAP Lid Gebruiker Filter heeft een niet-gebalanceerd haakje" -#: cps/admin.py:1261 +#: cps/admin.py:1289 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP CACertficaat, Certificaat of Sleutel Locatie is ongeldig. Voer alsjeblieft een geldig pad in." -#: cps/admin.py:1292 cps/templates/admin.html:53 +#: cps/admin.py:1320 cps/templates/admin.html:53 msgid "Add New User" msgstr "Gebruiker toevoegen" -#: cps/admin.py:1301 cps/templates/admin.html:100 +#: cps/admin.py:1329 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "SMTP-instellingen bewerken" -#: cps/admin.py:1320 +#: cps/admin.py:1348 msgid "Success! Gmail Account Verified." msgstr "Gelukt! Gmail account geverifieerd." -#: cps/admin.py:1340 cps/admin.py:1343 cps/admin.py:1728 cps/admin.py:1887 -#: cps/admin.py:1985 cps/admin.py:2106 cps/editbooks.py:169 -#: cps/editbooks.py:755 cps/editbooks.py:1474 cps/shelf.py:90 cps/shelf.py:144 +#: cps/admin.py:1368 cps/admin.py:1371 cps/admin.py:1756 cps/admin.py:1965 +#: cps/admin.py:2063 cps/admin.py:2184 cps/editbooks.py:170 +#: cps/editbooks.py:772 cps/editbooks.py:1518 cps/shelf.py:90 cps/shelf.py:144 #: cps/shelf.py:194 cps/shelf.py:237 cps/shelf.py:287 cps/shelf.py:327 -#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:160 cps/web.py:1526 +#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:161 cps/web.py:1536 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Database fout: %(error)s." -#: cps/admin.py:1350 +#: cps/admin.py:1378 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Test E-Mail wordt verzonden naar %(email)s, controleer de taken voor het resultaat" -#: cps/admin.py:1353 +#: cps/admin.py:1381 #, 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:1355 +#: cps/admin.py:1383 msgid "Please configure your e-mail address first..." msgstr "Gelieve eerst je e-mail adres configureren..." -#: cps/admin.py:1357 +#: cps/admin.py:1385 msgid "Email Server Settings updated" msgstr "E-mailserver-instellingen bijgewerkt" -#: cps/admin.py:1380 cps/templates/admin.html:195 +#: cps/admin.py:1408 cps/templates/admin.html:211 msgid "Edit Scheduled Tasks Settings" msgstr "Bewerk instellingen van geplande taken" -#: cps/admin.py:1392 +#: cps/admin.py:1420 msgid "Invalid start time for task specified" msgstr "De starttijd van de taak is ongeldig" -#: cps/admin.py:1397 +#: cps/admin.py:1425 msgid "Invalid duration for task specified" msgstr "De duur van de taak is ongeldig" -#: cps/admin.py:1407 +#: cps/admin.py:1435 msgid "Scheduled tasks settings updated" msgstr "Instellingen van geplande taken bijgewerkt" -#: cps/admin.py:1417 cps/admin.py:1466 cps/admin.py:2102 cps/web.py:1325 +#: cps/admin.py:1445 cps/admin.py:1494 cps/admin.py:2180 cps/web.py:1335 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Onbekende fout opgetreden. Probeer het later nog eens." -#: cps/admin.py:1421 +#: cps/admin.py:1449 msgid "Settings DB is not Writeable" msgstr "Instellingen database is niet schrijfbaar." -#: cps/admin.py:1451 cps/admin.py:2094 +#: cps/admin.py:1479 cps/admin.py:2172 #, python-format msgid "Edit User %(nick)s" msgstr "Gebruiker '%(nick)s' bewerken" -#: cps/admin.py:1463 +#: cps/admin.py:1491 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "" -#: cps/admin.py:1469 +#: cps/admin.py:1497 msgid "Oops! Please configure the SMTP mail settings." msgstr "" -#: cps/admin.py:1480 +#: cps/admin.py:1508 msgid "Logfile viewer" msgstr "Logbestand lezer" -#: cps/admin.py:1546 +#: cps/admin.py:1574 msgid "Requesting update package" msgstr "Update opvragen" -#: cps/admin.py:1547 +#: cps/admin.py:1575 msgid "Downloading update package" msgstr "Update downloaden" -#: cps/admin.py:1548 +#: cps/admin.py:1576 msgid "Unzipping update package" msgstr "Update uitpakken" -#: cps/admin.py:1549 +#: cps/admin.py:1577 msgid "Replacing files" msgstr "Update toepassen" -#: cps/admin.py:1550 +#: cps/admin.py:1578 msgid "Database connections are closed" msgstr "Databaseverbindingen zijn gesloten" -#: cps/admin.py:1551 +#: cps/admin.py:1579 msgid "Stopping server" msgstr "Bezig met stoppen van Calibre-Web" -#: cps/admin.py:1552 +#: cps/admin.py:1580 msgid "Update finished, please press okay and reload page" msgstr "Update voltooid, klik op 'Oké' en vernieuw de pagina" -#: cps/admin.py:1553 cps/admin.py:1554 cps/admin.py:1555 cps/admin.py:1556 -#: cps/admin.py:1557 cps/admin.py:1558 +#: cps/admin.py:1581 cps/admin.py:1582 cps/admin.py:1583 cps/admin.py:1584 +#: cps/admin.py:1585 cps/admin.py:1586 msgid "Update failed:" msgstr "Update mislukt:" -#: cps/admin.py:1553 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1581 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP-fout" -#: cps/admin.py:1554 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1582 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Verbindingsfout" -#: cps/admin.py:1555 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1583 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Time-out tijdens maken van verbinding" -#: cps/admin.py:1556 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1584 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Algemene fout" -#: cps/admin.py:1557 +#: cps/admin.py:1585 msgid "Update file could not be saved in temp dir" msgstr "" -#: cps/admin.py:1558 +#: cps/admin.py:1586 msgid "Files could not be replaced during update" msgstr "Bestanden kunnen niet vervangen worden tijdens een update" -#: cps/admin.py:1582 +#: cps/admin.py:1610 msgid "Failed to extract at least One LDAP User" msgstr "" -#: cps/admin.py:1627 +#: cps/admin.py:1655 msgid "Failed to Create at Least One LDAP User" msgstr "Het is niet gelukt tenminste een LDAP gebruiker aan te maken" -#: cps/admin.py:1640 +#: cps/admin.py:1668 #, python-format msgid "Error: %(ldaperror)s" msgstr "Fout: %(ldaperror)s" -#: cps/admin.py:1644 +#: cps/admin.py:1672 msgid "Error: No user returned in response of LDAP server" msgstr "Fout: No user returned in response of LDAP server" -#: cps/admin.py:1680 +#: cps/admin.py:1708 msgid "At Least One LDAP User Not Found in Database" msgstr "Minstens een LDAP Gebruiker is niet gevonden in de Database" -#: cps/admin.py:1682 +#: cps/admin.py:1710 #, python-brace-format msgid "{} User Successfully Imported" msgstr "{} Gebruiker succesvol geïmporteerd" -#: cps/admin.py:1740 +#: cps/admin.py:1768 msgid "Books path not valid" msgstr "Boekpad is ongeldig" -#: cps/admin.py:1746 +#: cps/admin.py:1774 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "Database niet gevonden, voer de juiste locatie in" -#: cps/admin.py:1774 +#: cps/admin.py:1802 msgid "DB is not Writeable" msgstr "Kan niet schrijven naar database" -#: cps/admin.py:1788 +#: cps/admin.py:1816 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "SSL-sleutellocatie is niet geldig, voer een geldig pad in" -#: cps/admin.py:1792 +#: cps/admin.py:1820 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "SSL-certificaatlocatie is niet geldig, voer een geldig pad in" -#: cps/admin.py:1872 +#: cps/admin.py:1846 +msgid "Kepubify binary not found" +msgstr "" + +#: cps/admin.py:1894 +msgid "reverse proxy login header name" +msgstr "" + +#: cps/admin.py:1904 +msgid "reverse proxy shared secret header name" +msgstr "" + +#: cps/admin.py:1913 +msgid "Please configure both reverse proxy shared secret header name and secret" +msgstr "" + +#: cps/admin.py:1917 +msgid "Please configure reverse proxy shared secret header name and secret or disable the feature" +msgstr "" + +#: cps/admin.py:1922 +msgid "Please configure at least one trusted reverse proxy IP or CIDR" +msgstr "" + +#: cps/admin.py:1946 msgid "Password length has to be between 1 and 40" msgstr "Het wachtwoord moet tussen de 1 en 40 tekens lang zijn" -#: cps/admin.py:1926 +#: cps/admin.py:1957 cps/helper.py:1007 +msgid "Please specify a valid UnRar directory" +msgstr "" + +#: cps/admin.py:2004 msgid "Database Settings updated" msgstr "" -#: cps/admin.py:1934 +#: cps/admin.py:2012 msgid "Database Configuration" msgstr "" -#: cps/admin.py:1949 cps/web.py:1295 +#: cps/admin.py:2027 cps/web.py:1305 msgid "Oops! Please complete all fields." msgstr "Vul alle velden in!" -#: cps/admin.py:1958 +#: cps/admin.py:2036 msgid "E-mail is not from valid domain" msgstr "Het e-mailadres bevat geen geldige domeinnaam" -#: cps/admin.py:1964 +#: cps/admin.py:2042 msgid "Add new user" msgstr "Gebruiker toevoegen" -#: cps/admin.py:1975 +#: cps/admin.py:2053 #, python-format msgid "User '%(user)s' created" msgstr "Gebruiker '%(user)s' aangemaakt" -#: cps/admin.py:1981 +#: cps/admin.py:2059 msgid "Oops! An account already exists for this Email. or name." msgstr "" -#: cps/admin.py:2011 +#: cps/admin.py:2089 #, python-format msgid "User '%(nick)s' deleted" msgstr "Gebruiker '%(nick)s' verwijderd" -#: cps/admin.py:2014 +#: cps/admin.py:2092 msgid "Can't delete Guest User" msgstr "Kan Gast gebruiker niet verwijderen" -#: cps/admin.py:2017 +#: cps/admin.py:2095 msgid "No admin user remaining, can't delete user" msgstr "Kan laatste systeembeheerder niet verwijderen" -#: cps/admin.py:2072 cps/web.py:1475 +#: cps/admin.py:2150 cps/web.py:1485 msgid "Email can't be empty and has to be a valid Email" msgstr "E-mail kan niet leeg zijn en moet geldig zijn" -#: cps/admin.py:2098 +#: cps/admin.py:2176 #, python-format msgid "User '%(nick)s' updated" msgstr "Gebruiker '%(nick)s' bijgewerkt" @@ -542,145 +581,153 @@ msgstr "Gebruiker '%(nick)s' bijgewerkt" msgid "Search" msgstr "Zoeken" -#: cps/converter.py:31 +#: cps/converter.py:32 msgid "not installed" msgstr "niet geïnstalleerd" -#: cps/converter.py:32 +#: cps/converter.py:33 msgid "Execution permissions missing" msgstr "Kan programma niet uitvoeren" -#: cps/db.py:1129 cps/templates/config_edit.html:207 +#: cps/db.py:1129 cps/templates/config_edit.html:229 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:565 cps/web.py:599 cps/web.py:644 cps/web.py:684 cps/web.py:711 -#: cps/web.py:998 cps/web.py:1028 cps/web.py:1073 cps/web.py:1101 -#: cps/web.py:1140 +#: cps/web.py:567 cps/web.py:601 cps/web.py:646 cps/web.py:686 cps/web.py:713 +#: cps/web.py:1000 cps/web.py:1030 cps/web.py:1075 cps/web.py:1103 +#: cps/web.py:1142 msgid "None" msgstr "Geen" -#: cps/editbooks.py:155 +#: cps/editbooks.py:156 #, python-format msgid "File %(file)s uploaded" msgstr "Bestand %(file)s geüpload" -#: cps/editbooks.py:184 +#: cps/editbooks.py:185 msgid "Source or destination format for conversion missing" msgstr "Bron- of doelformaat ontbreekt voor conversie" -#: cps/editbooks.py:192 +#: cps/editbooks.py:189 cps/editbooks.py:197 +msgid "Source format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:201 +msgid "Destination format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:209 #, 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:196 +#: cps/editbooks.py:213 #, 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/editbooks.py:297 +#: cps/editbooks.py:314 msgid "Changes successfully applied" msgstr "" -#: cps/editbooks.py:317 +#: cps/editbooks.py:334 msgid "Value is missing on request" msgstr "" -#: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 -#: cps/editbooks.py:1146 cps/web.py:532 cps/web.py:1567 cps/web.py:1613 -#: cps/web.py:1663 +#: cps/editbooks.py:336 cps/editbooks.py:343 cps/editbooks.py:644 +#: cps/editbooks.py:1170 cps/web.py:534 cps/web.py:1577 cps/web.py:1623 +#: cps/web.py:1673 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Oeps! Geselecteerd boek is niet beschikbaar. Bestand bestaat niet of is niet toegankelijk" -#: cps/editbooks.py:673 cps/editbooks.py:1503 +#: cps/editbooks.py:690 cps/editbooks.py:1547 msgid "User has no rights to upload cover" msgstr "Gebruiker mist rechten om de omslag te uploaden" -#: cps/editbooks.py:694 cps/editbooks.py:938 +#: cps/editbooks.py:711 cps/editbooks.py:961 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "Identificatoren zijn niet hoofdlettergevoelig, overschrijf huidige identificatoren" -#: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 +#: cps/editbooks.py:726 cps/editbooks.py:935 cps/editbooks.py:1306 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "" -#: cps/editbooks.py:737 +#: cps/editbooks.py:754 msgid "Metadata successfully updated" msgstr "De metagegevens zijn bijgewerkt" -#: cps/editbooks.py:760 +#: cps/editbooks.py:777 #, python-brace-format msgid "Error editing book: {}" msgstr "Fout tijdens bijwerken van boek: {}" -#: cps/editbooks.py:856 +#: cps/editbooks.py:879 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "Geüpload boek staat mogelijk al in de bibliotheek, controleer alvorens door te gaan: " -#: cps/editbooks.py:950 cps/editbooks.py:1420 +#: cps/editbooks.py:973 cps/editbooks.py:1464 msgid "File type isn't allowed to be uploaded to this server" msgstr "" -#: cps/editbooks.py:956 cps/editbooks.py:1431 +#: cps/editbooks.py:979 cps/editbooks.py:1475 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "De bestandsextensie '%(ext)s' is niet toegestaan op deze server" -#: cps/editbooks.py:960 cps/editbooks.py:1436 +#: cps/editbooks.py:983 cps/editbooks.py:1480 msgid "File to be uploaded must have an extension" msgstr "Het te uploaden bestand moet voorzien zijn van een extensie" -#: cps/editbooks.py:968 +#: cps/editbooks.py:992 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "Bestand %(filename)s kon niet opgeslagen worden in de tijdelijke map" -#: cps/editbooks.py:988 +#: cps/editbooks.py:1012 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Omslag %(file)s niet verplaatst: %(error)s" -#: cps/editbooks.py:1041 +#: cps/editbooks.py:1065 msgid "Book Format Successfully Deleted" msgstr "Het boekformaat is verwijderd" -#: cps/editbooks.py:1044 cps/editbooks.py:1061 +#: cps/editbooks.py:1068 cps/editbooks.py:1085 msgid "Book Successfully Deleted" msgstr "Het boek is verwijderd" -#: cps/editbooks.py:1065 +#: cps/editbooks.py:1089 msgid "You are missing permissions to delete books" msgstr "U mist rechten om boeken te verwijderen" -#: cps/editbooks.py:1139 +#: cps/editbooks.py:1163 #, python-brace-format msgid "Book with id \"{}\" could not be deleted: not found" msgstr "" -#: cps/editbooks.py:1181 +#: cps/editbooks.py:1205 msgid "edit metadata" msgstr "metagegevens bewerken" -#: cps/editbooks.py:1234 +#: cps/editbooks.py:1267 #, python-format msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1425 +#: cps/editbooks.py:1469 msgid "User has no rights to upload additional file formats" msgstr "Gebruiker mist rechten om extra bestandsformaten te uploaden" -#: cps/editbooks.py:1449 +#: cps/editbooks.py:1493 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Kan de locatie '%(path)s' niet aanmaken (niet gemachtigd)." -#: cps/editbooks.py:1456 +#: cps/editbooks.py:1500 #, python-format msgid "Failed to store file %(file)s." msgstr "Kan %(file)s niet opslaan." -#: cps/editbooks.py:1481 +#: cps/editbooks.py:1525 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Bestandsformaat %(ext)s toegevoegd aan %(book)s" @@ -691,9 +738,9 @@ msgstr "Wacht alstublieft één minuut voor het registreren van de volgende gebr #: cps/error_handler.py:108 cps/templates/layout.html:69 #: cps/templates/layout.html:104 cps/templates/login.html:27 -#: cps/templates/register.html:17 cps/web.py:1292 cps/web.py:1296 -#: cps/web.py:1302 cps/web.py:1326 cps/web.py:1330 cps/web.py:1343 -#: cps/web.py:1346 +#: cps/templates/register.html:17 cps/web.py:1302 cps/web.py:1306 +#: cps/web.py:1312 cps/web.py:1336 cps/web.py:1340 cps/web.py:1353 +#: cps/web.py:1356 msgid "Register" msgstr "Registreren" @@ -714,7 +761,7 @@ msgstr "Het callback-domein is niet geverifieerd. Volg de stappen in de Google-o msgid "%(format)s format not found for book id: %(book)d" msgstr "%(format)s formaat niet gevonden voor boek met id: %(book)d" -#: cps/helper.py:94 cps/tasks/convert.py:91 +#: cps/helper.py:94 cps/tasks/convert.py:92 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s niet aangetroffen op Google Drive: %(fn)s" @@ -900,10 +947,6 @@ msgstr "Alleen jpg/jpeg bestanden zijn toegestaan als omslag" msgid "Cover" msgstr "" -#: cps/helper.py:1006 -msgid "UnRar binary file not found" -msgstr "UnRar executable niet gevonden" - #: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "" @@ -934,7 +977,7 @@ msgstr "" msgid "Error executing Calibre" msgstr "" -#: cps/helper.py:1154 cps/templates/admin.html:216 +#: cps/helper.py:1154 cps/templates/admin.html:232 msgid "Queue all books for metadata backup" msgstr "Voeg alle boeken toe aan de wachtrij voor het maken van een metagegevens backup" @@ -956,7 +999,7 @@ msgstr "Aanmelden bij %(provider)s" msgid "This %(oauth)s account is already linked to a different user" msgstr "" -#: cps/oauth_bb.py:147 cps/remotelogin.py:131 +#: cps/oauth_bb.py:147 cps/remotelogin.py:150 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "je bent ingelogd als: '%(nickname)s'" @@ -1024,25 +1067,29 @@ msgstr "Google OAuth foutmelding: {}" msgid "{} Stars" msgstr "{} sterren" -#: cps/remotelogin.py:63 cps/templates/layout.html:68 -#: cps/templates/layout.html:103 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1361 -msgid "Login" -msgstr "Inloggen" - -#: cps/remotelogin.py:75 cps/remotelogin.py:109 +#: cps/remotelogin.py:46 cps/remotelogin.py:128 msgid "Token not found" msgstr "Toegangssleutel niet gevonden" -#: cps/remotelogin.py:84 cps/remotelogin.py:117 +#: cps/remotelogin.py:55 cps/remotelogin.py:136 msgid "Token has expired" msgstr "Toegangssleutel is verlopen" -#: cps/remotelogin.py:93 +#: cps/remotelogin.py:86 cps/remotelogin.py:112 cps/templates/layout.html:68 +#: cps/templates/layout.html:103 cps/templates/login.html:4 +#: cps/templates/login.html:21 cps/web.py:1371 +msgid "Login" +msgstr "Inloggen" + +#: cps/remotelogin.py:100 +msgid "Token already approved" +msgstr "" + +#: cps/remotelogin.py:108 msgid "Success! Please return to your device" msgstr "Gelukt! Ga terug naar je apparaat" -#: cps/render_template.py:41 cps/web.py:421 +#: cps/render_template.py:41 cps/web.py:423 msgid "Books" msgstr "Boeken" @@ -1067,7 +1114,7 @@ msgstr "Gedownloade boeken" msgid "Show Downloaded Books" msgstr "Gedownloade boeken tonen" -#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:436 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:438 msgid "Top Rated Books" msgstr "Best beoordeelde boeken" @@ -1076,7 +1123,7 @@ msgid "Show Top Rated Books" msgstr "Best beoordeelde boeken tonen" #: cps/render_template.py:61 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:769 +#: cps/templates/index.xml:67 cps/web.py:771 msgid "Read Books" msgstr "Gelezen boeken" @@ -1085,7 +1132,7 @@ msgid "Show Read and Unread" msgstr "" #: cps/render_template.py:65 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:772 +#: cps/templates/index.xml:74 cps/web.py:774 msgid "Unread Books" msgstr "Ongelezen boeken" @@ -1103,7 +1150,7 @@ msgid "Show Random Books" msgstr "Willekeurige boeken tonen" #: cps/render_template.py:71 cps/templates/book_table.html:93 -#: cps/templates/index.xml:97 cps/web.py:1144 +#: cps/templates/index.xml:97 cps/web.py:1146 msgid "Categories" msgstr "Categorieën" @@ -1113,7 +1160,7 @@ msgstr "" #: cps/render_template.py:74 cps/templates/book_edit.html:86 #: cps/templates/book_table.html:94 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1034 cps/web.py:1046 +#: cps/templates/search_form.html:70 cps/web.py:1036 cps/web.py:1048 msgid "Series" msgstr "Boekenreeksen" @@ -1131,7 +1178,7 @@ msgid "Show Author Section" msgstr "" #: cps/render_template.py:81 cps/templates/book_table.html:98 -#: cps/templates/index.xml:88 cps/web.py:1002 +#: cps/templates/index.xml:88 cps/web.py:1004 msgid "Publishers" msgstr "Uitgevers" @@ -1141,7 +1188,7 @@ msgstr "" #: cps/render_template.py:84 cps/templates/book_table.html:96 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1116 +#: cps/web.py:1118 msgid "Languages" msgstr "Talen" @@ -1165,7 +1212,7 @@ msgstr "Bestandsformaten" msgid "Show File Formats Section" msgstr "" -#: cps/render_template.py:95 cps/web.py:795 +#: cps/render_template.py:95 cps/web.py:797 msgid "Archived Books" msgstr "Gearchiveerde boeken" @@ -1173,7 +1220,7 @@ msgstr "Gearchiveerde boeken" msgid "Show Archived Books" msgstr "" -#: cps/render_template.py:100 cps/web.py:831 +#: cps/render_template.py:100 cps/web.py:833 msgid "Books List" msgstr "Boekenlijst" @@ -1406,150 +1453,154 @@ msgstr "Er is een update beschikbaar. Klik op de knop hieronder om te updaten na msgid "No release information available" msgstr "Geen update-informatie beschikbaar" -#: cps/templates/index.html:6 cps/web.py:448 +#: cps/templates/index.html:6 cps/web.py:450 msgid "Discover (Random Books)" msgstr "Verkennen (willekeurige boeken)" -#: cps/web.py:484 +#: cps/web.py:486 msgid "Hot Books (Most Downloaded)" msgstr "Populaire boeken (meest gedownload)" -#: cps/web.py:515 +#: cps/web.py:517 #, python-format msgid "Downloaded books by %(user)s" msgstr "Gedownloade boeken door %(user)s" -#: cps/web.py:548 +#: cps/web.py:550 #, python-format msgid "Author: %(name)s" msgstr "Auteur: %(name)s" -#: cps/web.py:584 +#: cps/web.py:586 #, python-format msgid "Publisher: %(name)s" msgstr "Uitgever: %(name)s" -#: cps/web.py:612 +#: cps/web.py:614 #, python-format msgid "Series: %(serie)s" msgstr "Reeks: %(serie)s" -#: cps/web.py:626 +#: cps/web.py:628 msgid "Rating: None" msgstr "Beoordeling: geen" -#: cps/web.py:635 +#: cps/web.py:637 #, python-format msgid "Rating: %(rating)s stars" msgstr "Beoordeling: %(rating)s sterren" -#: cps/web.py:666 +#: cps/web.py:668 #, python-format msgid "File format: %(format)s" msgstr "Bestandsformaat: %(format)s" -#: cps/web.py:701 +#: cps/web.py:703 #, python-format msgid "Category: %(name)s" msgstr "Categorie: %(name)s" -#: cps/web.py:730 +#: cps/web.py:732 #, python-format msgid "Language: %(name)s" msgstr "Taal: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:974 +#: cps/templates/admin.html:16 cps/web.py:976 msgid "Downloads" msgstr "Downloads" -#: cps/web.py:1076 +#: cps/web.py:1078 msgid "Ratings list" msgstr "Beoordelingen" -#: cps/web.py:1103 +#: cps/web.py:1105 msgid "File formats list" msgstr "Alle bestandsformaten" -#: cps/web.py:1264 +#: cps/web.py:1272 +msgid "Book format not supported" +msgstr "" + +#: cps/web.py:1274 msgid "Please configure the SMTP mail settings first..." msgstr "" -#: cps/web.py:1270 +#: cps/web.py:1280 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Het boek is in de wachtrij geplaatst om te worden verstuurd aan %(eReadermail)s" -#: cps/web.py:1273 +#: cps/web.py:1283 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Fout opgetreden bij het versturen van dit boek: %(res)s" -#: cps/web.py:1275 +#: cps/web.py:1285 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "" -#: cps/web.py:1291 cps/web.py:1342 +#: cps/web.py:1301 cps/web.py:1352 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "E-mailserver is niet geconfigureerd, neem contact op met de beheerder!" -#: cps/web.py:1328 +#: cps/web.py:1338 msgid "Oops! Your Email is not allowed." msgstr "Dit e-mailadres mag niet worden gebruikt voor registratie" -#: cps/web.py:1331 +#: cps/web.py:1341 msgid "Success! Confirmation Email has been sent." msgstr "Er is een bevestigings-e-mail verstuurd naar je e-mailadres." -#: cps/web.py:1376 cps/web.py:1390 +#: cps/web.py:1386 cps/web.py:1400 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1399 +#: cps/web.py:1409 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1406 +#: cps/web.py:1416 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1411 +#: cps/web.py:1421 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1415 cps/web.py:1440 +#: cps/web.py:1425 cps/web.py:1450 msgid "Wrong Username or Password" msgstr "" -#: cps/web.py:1422 +#: cps/web.py:1432 msgid "New Password was sent to your email address" msgstr "" -#: cps/web.py:1426 +#: cps/web.py:1436 msgid "An unknown error occurred. Please try again later." msgstr "" -#: cps/web.py:1428 +#: cps/web.py:1438 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1436 +#: cps/web.py:1446 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1501 cps/web.py:1551 +#: cps/web.py:1511 cps/web.py:1561 #, python-format msgid "%(name)s's Profile" msgstr "%(name)ss profiel" -#: cps/web.py:1517 +#: cps/web.py:1527 msgid "Success! Profile Updated" msgstr "" -#: cps/web.py:1521 +#: cps/web.py:1531 msgid "Oops! An account already exists for this Email." msgstr "" @@ -1561,46 +1612,46 @@ msgstr "Geen geldig gmail.json bestand gevonden met OAuth informatie" msgid "Delete temp folder contents" msgstr "Inhoud van tijdelijke map verwijderen" -#: cps/tasks/convert.py:112 +#: cps/tasks/convert.py:113 #, python-format msgid "%(book)s send to E-Reader" msgstr "" -#: cps/tasks/convert.py:177 +#: cps/tasks/convert.py:180 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre ebook-convert %(tool)s niet gevonden" -#: cps/tasks/convert.py:211 +#: cps/tasks/convert.py:214 #, python-format msgid "%(format)s format not found on disk" msgstr "%(format)s formaat is niet gevonden op de schijf" -#: cps/tasks/convert.py:215 +#: cps/tasks/convert.py:218 msgid "Ebook converter failed with unknown error" msgstr "E-Book converter mislukt met een onbekende foutmelding" -#: cps/tasks/convert.py:234 +#: cps/tasks/convert.py:237 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify-converteerder mislukt: %(error)s" -#: cps/tasks/convert.py:254 +#: cps/tasks/convert.py:257 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Omgezette bestand is niet gevonden of meer dan een bestand in map %(folder)s" -#: cps/tasks/convert.py:291 cps/tasks/convert.py:342 +#: cps/tasks/convert.py:294 cps/tasks/convert.py:345 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre mislukt met foutmelding: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:322 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "E-boek-conversie mislukt: %(error)s" -#: cps/tasks/convert.py:347 +#: cps/tasks/convert.py:350 msgid "Convert" msgstr "Overzetten" @@ -1686,7 +1737,7 @@ msgstr "Bewerken" #: cps/templates/admin.html:25 cps/templates/book_edit.html:17 #: cps/templates/book_table.html:131 cps/templates/book_table.html:180 -#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:115 +#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:117 #: cps/templates/user_edit.html:67 cps/templates/user_table.html:149 msgid "Delete" msgstr "Verwijderen" @@ -1776,128 +1827,145 @@ msgstr "Inloggen op afstand" msgid "Reverse Proxy Login" msgstr "Reverse Proxy Login" -#: cps/templates/admin.html:154 cps/templates/config_edit.html:176 +#: cps/templates/admin.html:154 cps/templates/config_edit.html:180 msgid "Reverse Proxy Header Name" msgstr "Reverse proxy header naam" -#: cps/templates/admin.html:159 +#: cps/templates/admin.html:158 +msgid "Reverse Proxy Trusted IPs/CIDRs" +msgstr "" + +#: cps/templates/admin.html:162 cps/templates/config_edit.html:193 +msgid "Reverse Proxy Shared Secret Header Name" +msgstr "" + +#: cps/templates/admin.html:166 +msgid "Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/admin.html:170 +msgid "Reverse Proxy Shared Secret Configured" +msgstr "" + +#: cps/templates/admin.html:175 msgid "Edit Calibre Database Configuration" msgstr "" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:176 msgid "Edit Basic Configuration" msgstr "Bewerk basisconfiguratie" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:177 msgid "Edit UI Configuration" msgstr "Bewerk gebruikersinterface configuratie" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:183 msgid "Scheduled Tasks" msgstr "Geplande taken" -#: cps/templates/admin.html:170 cps/templates/schedule_edit.html:12 +#: cps/templates/admin.html:186 cps/templates/schedule_edit.html:12 #: cps/templates/tasks.html:18 msgid "Start Time" msgstr "Starttijd" -#: cps/templates/admin.html:174 cps/templates/schedule_edit.html:20 +#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:20 msgid "Maximum Duration" msgstr "Maximale duur" -#: cps/templates/admin.html:178 cps/templates/schedule_edit.html:29 +#: cps/templates/admin.html:194 cps/templates/schedule_edit.html:29 msgid "Generate Thumbnails" msgstr "Genereer miniaturen" -#: cps/templates/admin.html:182 +#: cps/templates/admin.html:198 msgid "Generate series cover thumbnails" msgstr "Genereer serie miniaturen" -#: cps/templates/admin.html:186 cps/templates/admin.html:208 +#: cps/templates/admin.html:202 cps/templates/admin.html:224 #: cps/templates/schedule_edit.html:37 msgid "Reconnect Calibre Database" msgstr "Opnieuw verbinding maken met Calibre database" -#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 +#: cps/templates/admin.html:206 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" msgstr "Genereer backupbestanden voor metagegevens" -#: cps/templates/admin.html:197 +#: cps/templates/admin.html:213 msgid "Refresh Thumbnail Cache" msgstr "Ververs cache met omslagminiaturen" -#: cps/templates/admin.html:203 +#: cps/templates/admin.html:219 msgid "Administration" msgstr "Systeembeheer" -#: cps/templates/admin.html:204 +#: cps/templates/admin.html:220 msgid "Download Debug Package" msgstr "Download foutopsporingspakket" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:221 msgid "View Logs" msgstr "Logboeken bekijken" -#: cps/templates/admin.html:211 +#: cps/templates/admin.html:227 msgid "Restart" msgstr "Calibre-Web herstarten" -#: cps/templates/admin.html:212 +#: cps/templates/admin.html:228 msgid "Shutdown" msgstr "Calibre-Web stoppen" -#: cps/templates/admin.html:221 +#: cps/templates/admin.html:237 msgid "Version Information" msgstr "Versie informatie" -#: cps/templates/admin.html:225 +#: cps/templates/admin.html:241 msgid "Version" msgstr "Versie" -#: cps/templates/admin.html:226 +#: cps/templates/admin.html:242 msgid "Details" msgstr "Details" -#: cps/templates/admin.html:232 +#: cps/templates/admin.html:248 msgid "Current Version" msgstr "Huidige versie" -#: cps/templates/admin.html:239 +#: cps/templates/admin.html:255 msgid "Check for Update" msgstr "Controleren op updates" -#: cps/templates/admin.html:240 +#: cps/templates/admin.html:256 msgid "Perform Update" msgstr "Update uitvoeren" -#: cps/templates/admin.html:253 +#: cps/templates/admin.html:269 msgid "Are you sure you want to restart?" msgstr "Weet je zeker dat je Calibre-Web wilt herstarten?" -#: cps/templates/admin.html:258 cps/templates/admin.html:272 -#: cps/templates/admin.html:292 cps/templates/config_db.html:82 +#: cps/templates/admin.html:274 cps/templates/admin.html:288 +#: cps/templates/admin.html:308 cps/templates/config_db.html:82 msgid "OK" msgstr "Oké" -#: cps/templates/admin.html:259 cps/templates/admin.html:273 +#: cps/templates/admin.html:275 cps/templates/admin.html:289 #: cps/templates/book_edit.html:220 cps/templates/book_table.html:162 #: cps/templates/book_table.html:181 cps/templates/book_table.html:201 #: cps/templates/book_table.html:221 cps/templates/book_table.html:241 #: cps/templates/book_table.html:261 cps/templates/book_table.html:316 -#: cps/templates/config_db.html:66 cps/templates/config_edit.html:431 +#: cps/templates/config_db.html:66 cps/templates/config_edit.html:453 #: cps/templates/config_view_edit.html:175 cps/templates/detail.html:350 -#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:98 -#: cps/templates/modal_dialogs.html:116 cps/templates/modal_dialogs.html:134 +#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:100 +#: cps/templates/modal_dialogs.html:118 cps/templates/modal_dialogs.html:136 +#: cps/templates/remote_login_verify.html:16 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 #: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Annuleren" -#: cps/templates/admin.html:271 +#: cps/templates/admin.html:287 msgid "Are you sure you want to shutdown?" msgstr "Weet je zeker dat je Calibre-Web wilt stoppen?" -#: cps/templates/admin.html:283 +#: cps/templates/admin.html:299 msgid "Updating, please do not reload this page" msgstr "Bezig met bijwerken, vernieuw de pagina niet" @@ -2138,7 +2206,7 @@ msgid "Fetch Metadata" msgstr "Metagegevens ophalen" #: cps/templates/book_edit.html:219 cps/templates/config_db.html:65 -#: cps/templates/config_edit.html:430 cps/templates/config_view_edit.html:174 +#: cps/templates/config_edit.html:452 cps/templates/config_view_edit.html:174 #: cps/templates/email_edit.html:65 cps/templates/schedule_edit.html:44 #: cps/templates/shelf_edit.html:25 cps/templates/shelf_order.html:41 #: cps/templates/user_edit.html:142 @@ -2510,214 +2578,234 @@ msgstr "" msgid "Allow Reverse Proxy Authentication" msgstr "Reverse Proxy authenticatie toestaan" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:176 +msgid "Security Warning" +msgstr "" + +#: cps/templates/config_edit.html:177 +msgid "Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled." +msgstr "" + +#: cps/templates/config_edit.html:184 +msgid "Reverse Proxy Trusted IPs/CIDRs (Comma Separated)" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "Enable Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/config_edit.html:197 +msgid "Reverse Proxy Shared Secret" +msgstr "" + +#: cps/templates/config_edit.html:205 msgid "Login type" msgstr "Login type" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:207 msgid "Use Standard Authentication" msgstr "Gebruik standaard authenticatie" -#: cps/templates/config_edit.html:187 +#: cps/templates/config_edit.html:209 msgid "Use LDAP Authentication" msgstr "Gebruik LDAP authenticatie" -#: cps/templates/config_edit.html:190 +#: cps/templates/config_edit.html:212 msgid "Use OAuth" msgstr "Gebruik OAuth" -#: cps/templates/config_edit.html:197 +#: cps/templates/config_edit.html:219 msgid "LDAP Server Host Name or IP Address" msgstr "LDAP Server hostnaam of IP-adres" -#: cps/templates/config_edit.html:201 +#: cps/templates/config_edit.html:223 msgid "LDAP Server Port" msgstr "LDAP Server Poort" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:227 msgid "LDAP Encryption" msgstr "LDAP encryptie" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:230 msgid "TLS" msgstr "TLS" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:231 msgid "SSL" msgstr "SSL" -#: cps/templates/config_edit.html:213 +#: cps/templates/config_edit.html:235 msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" msgstr "LDAP CACertificataat Path (Alleen nodig voor Client Certificaat Autorisatie)" -#: cps/templates/config_edit.html:220 +#: cps/templates/config_edit.html:242 msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" msgstr "LDAP Certificaat Pad (Alleen nodig voor Client Certificaat Autorisatie)" -#: cps/templates/config_edit.html:227 +#: cps/templates/config_edit.html:249 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" msgstr "LDAP SleutelBestand Pad (alleen nodig voor Client Certificaat Autorisatie)" -#: cps/templates/config_edit.html:236 +#: cps/templates/config_edit.html:258 msgid "LDAP Authentication" msgstr "LDAP Authenticatie" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:260 msgid "Anonymous" msgstr "Anoniem" -#: cps/templates/config_edit.html:239 +#: cps/templates/config_edit.html:261 msgid "Unauthenticated" msgstr "Niet geverifieerd" -#: cps/templates/config_edit.html:240 +#: cps/templates/config_edit.html:262 msgid "Simple" msgstr "Eenvoudig" -#: cps/templates/config_edit.html:245 +#: cps/templates/config_edit.html:267 msgid "LDAP Administrator Username" msgstr "LDAP Administrator naam" -#: cps/templates/config_edit.html:251 +#: cps/templates/config_edit.html:273 msgid "LDAP Administrator Password" msgstr "LDAP Administrator wachtwoord" -#: cps/templates/config_edit.html:256 +#: cps/templates/config_edit.html:278 msgid "LDAP Distinguished Name (DN)" msgstr "LDAP Distinguished Name (DN)" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:282 msgid "LDAP User Object Filter" msgstr "LDAP User Object Filter" -#: cps/templates/config_edit.html:265 +#: cps/templates/config_edit.html:287 msgid "LDAP Server is OpenLDAP?" msgstr "LDAP Server is OpenLDAP?" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:289 msgid "Following Settings are Needed For User Import" msgstr "De volgende instellingen zijn nodig voor het importeren van gebruikers:" -#: cps/templates/config_edit.html:269 +#: cps/templates/config_edit.html:291 msgid "LDAP Group Object Filter" msgstr "LDAP Groep Object Filter" -#: cps/templates/config_edit.html:273 +#: cps/templates/config_edit.html:295 msgid "LDAP Group Name" msgstr "LDAP groepnaam" -#: cps/templates/config_edit.html:277 +#: cps/templates/config_edit.html:299 msgid "LDAP Group Members Field" msgstr "LDAP groepleden veld" -#: cps/templates/config_edit.html:281 +#: cps/templates/config_edit.html:303 msgid "LDAP Member User Filter Detection" msgstr "LDAP Lid Gebruiker Filter Detectie" -#: cps/templates/config_edit.html:283 +#: cps/templates/config_edit.html:305 msgid "Autodetect" msgstr "Automatisch detecteren" -#: cps/templates/config_edit.html:284 +#: cps/templates/config_edit.html:306 msgid "Custom Filter" msgstr "Aangepast Filter" -#: cps/templates/config_edit.html:289 +#: cps/templates/config_edit.html:311 msgid "LDAP Member User Filter" msgstr "LDAP Lid Gebruiker Filter" -#: cps/templates/config_edit.html:300 +#: cps/templates/config_edit.html:322 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "Verkrijg %(provider)s OAuth Verificatiegegevens" -#: cps/templates/config_edit.html:303 +#: cps/templates/config_edit.html:325 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "%(provider)s OAuth Client Id" -#: cps/templates/config_edit.html:307 +#: cps/templates/config_edit.html:329 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "%(provider)s OAuth Client geheim" -#: cps/templates/config_edit.html:323 +#: cps/templates/config_edit.html:345 msgid "External binaries" msgstr "Externe programma's" -#: cps/templates/config_edit.html:329 +#: cps/templates/config_edit.html:351 msgid "Path to Calibre Binaries" msgstr "" -#: cps/templates/config_edit.html:337 +#: cps/templates/config_edit.html:359 msgid "Calibre E-Book Converter Settings" msgstr "Calibre E-Book omzet instellingen" -#: cps/templates/config_edit.html:340 +#: cps/templates/config_edit.html:362 msgid "Path to Kepubify E-Book Converter" msgstr "Pad naar Kepubify E-book Converteerder" -#: cps/templates/config_edit.html:348 +#: cps/templates/config_edit.html:370 msgid "Location of Unrar binary" msgstr "" -#: cps/templates/config_edit.html:364 +#: cps/templates/config_edit.html:386 msgid "Security Settings" msgstr "" -#: cps/templates/config_edit.html:372 +#: cps/templates/config_edit.html:394 msgid "Limit failed login attempts" msgstr "Beperk aantal mislukte inlogpogingen" -#: cps/templates/config_edit.html:376 +#: cps/templates/config_edit.html:398 msgid "Configure Backend for Limiter" msgstr "Configureer email server" -#: cps/templates/config_edit.html:380 +#: cps/templates/config_edit.html:402 msgid "Options for Limiter Backend" msgstr "Opties voor email server" -#: cps/templates/config_edit.html:386 +#: cps/templates/config_edit.html:408 msgid "Check if file extensions matches file content on upload" msgstr "Controleer bij upload of de bestandsextensie overeenkomt met bestandstype" -#: cps/templates/config_edit.html:389 +#: cps/templates/config_edit.html:411 msgid "Session protection" msgstr "Sessiebescherming" -#: cps/templates/config_edit.html:391 +#: cps/templates/config_edit.html:413 msgid "Basic" msgstr "Basis" -#: cps/templates/config_edit.html:392 +#: cps/templates/config_edit.html:414 msgid "Strong" msgstr "Sterk" -#: cps/templates/config_edit.html:397 +#: cps/templates/config_edit.html:419 msgid "User Password policy" msgstr "" -#: cps/templates/config_edit.html:401 +#: cps/templates/config_edit.html:423 msgid "Minimum password length" msgstr "Minimale wachtwoordlengte" -#: cps/templates/config_edit.html:406 +#: cps/templates/config_edit.html:428 msgid "Enforce number" msgstr "Forceer getal" -#: cps/templates/config_edit.html:410 +#: cps/templates/config_edit.html:432 msgid "Enforce lowercase characters" msgstr "Forceer kleine letter" -#: cps/templates/config_edit.html:414 +#: cps/templates/config_edit.html:436 msgid "Enforce uppercase characters" msgstr "Forceer hoofdletter" -#: cps/templates/config_edit.html:418 +#: cps/templates/config_edit.html:440 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" msgstr "Forceer tekens (vereist voor Chinese/Japanse/Koreaanse tekens)" -#: cps/templates/config_edit.html:422 +#: cps/templates/config_edit.html:444 msgid "Enforce special characters" msgstr "Forceer speciaal teken" @@ -3184,27 +3272,27 @@ msgstr "Boeken moeten eerst worden gearchiveerd en het apparaat moet worden gesy msgid "Choose File Location" msgstr "Kies bestandslocatie" -#: cps/templates/modal_dialogs.html:81 +#: cps/templates/modal_dialogs.html:82 msgid "type" msgstr "type" -#: cps/templates/modal_dialogs.html:82 +#: cps/templates/modal_dialogs.html:83 msgid "name" msgstr "naam" -#: cps/templates/modal_dialogs.html:83 +#: cps/templates/modal_dialogs.html:84 msgid "size" msgstr "grootte" -#: cps/templates/modal_dialogs.html:89 +#: cps/templates/modal_dialogs.html:90 msgid "Parent Directory" msgstr "Bovenliggende map" -#: cps/templates/modal_dialogs.html:97 +#: cps/templates/modal_dialogs.html:99 msgid "Select" msgstr "Selecteer" -#: cps/templates/modal_dialogs.html:133 cps/templates/tasks.html:46 +#: cps/templates/modal_dialogs.html:135 cps/templates/tasks.html:46 msgid "Ok" msgstr "" @@ -3460,6 +3548,31 @@ msgstr "Na controle wordt je automatisch op dit apparaat ingelogd." msgid "This verification link will expire in 10 minutes." msgstr "De link vervalt na 10 minuten." +#: cps/templates/remote_login_verify.html:4 +msgid "Approve Magic Link Login" +msgstr "" + +#: cps/templates/remote_login_verify.html:5 +msgid "Review the device that requested access before approving this login." +msgstr "" + +#: cps/templates/remote_login_verify.html:7 +msgid "IP address" +msgstr "" + +#: cps/templates/remote_login_verify.html:9 +msgid "Browser" +msgstr "" + +#: cps/templates/remote_login_verify.html:12 +#, python-format +msgid "If you approve this request, the device that started it will be logged in as %(username)s." +msgstr "" + +#: cps/templates/remote_login_verify.html:15 +msgid "Approve Login" +msgstr "" + #: cps/templates/schedule_edit.html:33 msgid "Generate Series Cover Thumbnails" msgstr "Genereer serie omslagminiaturen" diff --git a/cps/translations/no/LC_MESSAGES/messages.mo b/cps/translations/no/LC_MESSAGES/messages.mo index b36f38e177bf444b909656066956c4aaaceaae20..509f25b613feeab2bc672b159c44880f80f373ca 100644 GIT binary patch delta 7486 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 N<)xNvR%w033IGFeu@(RT diff --git a/cps/translations/no/LC_MESSAGES/messages.po b/cps/translations/no/LC_MESSAGES/messages.po index 06d2c60f2..678c2b3ea 100644 --- a/cps/translations/no/LC_MESSAGES/messages.po +++ b/cps/translations/no/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: 2026-08-01 11:42+0200\n" +"POT-Creation-Date: 2026-08-08 16:08+0200\n" "PO-Revision-Date: 2023-01-06 11:00+0000\n" "Last-Translator: Vegard Fladby \n" "Language: no\n" @@ -16,519 +16,558 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" +"Generated-By: Babel 2.18.0\n" #: cps/about.py:85 msgid "Statistics" msgstr "Statistikk" -#: cps/admin.py:151 +#: cps/admin.py:154 msgid "Server restarted, please reload page." msgstr "" -#: cps/admin.py:153 +#: cps/admin.py:156 msgid "Performing Server shutdown, please close window." msgstr "" -#: cps/admin.py:161 +#: cps/admin.py:164 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:164 +#: cps/admin.py:167 msgid "Unknown command" msgstr "Ukjent kommando" -#: cps/admin.py:175 +#: cps/admin.py:178 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "" -#: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 -#: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 -#: cps/uploader.py:117 +#: cps/admin.py:211 cps/editbooks.py:825 cps/editbooks.py:875 +#: cps/editbooks.py:1564 cps/templates/remote_login_verify.html:8 +#: cps/templates/remote_login_verify.html:10 cps/updater.py:615 +#: cps/uploader.py:117 cps/uploader.py:126 msgid "Unknown" msgstr "Ukjent" -#: cps/admin.py:233 +#: cps/admin.py:236 msgid "Admin page" msgstr "Admin side" -#: cps/admin.py:253 +#: cps/admin.py:256 msgid "Basic Configuration" msgstr "Grunnleggende konfigurasjon" -#: cps/admin.py:291 +#: cps/admin.py:294 msgid "UI Configuration" msgstr "UI-konfigurasjon" -#: cps/admin.py:315 cps/admin.py:1002 cps/db.py:809 cps/search.py:150 -#: cps/web.py:750 +#: cps/admin.py:318 cps/admin.py:1005 cps/db.py:809 cps/search.py:150 +#: cps/web.py:752 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "Egendefinert kolonnenr.%(column)d finnes ikke i caliber-databasen" -#: cps/admin.py:333 cps/templates/admin.html:51 +#: cps/admin.py:336 cps/templates/admin.html:51 msgid "Edit Users" msgstr "Rediger brukere" -#: cps/admin.py:378 cps/opds.py:559 cps/templates/grid.html:14 +#: cps/admin.py:381 cps/opds.py:559 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Alle" -#: cps/admin.py:401 cps/admin.py:1432 +#: cps/admin.py:404 cps/admin.py:1460 msgid "User not found" msgstr "Bruker ikke funnet" -#: cps/admin.py:415 +#: cps/admin.py:418 #, python-brace-format msgid "{} users deleted successfully" msgstr "{} brukere ble slettet" -#: cps/admin.py:438 cps/templates/config_view_edit.html:133 +#: cps/admin.py:441 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Vis alt" -#: cps/admin.py:459 cps/admin.py:465 +#: cps/admin.py:462 cps/admin.py:468 msgid "Malformed request" msgstr "Feil utformet forespørsel" -#: cps/admin.py:477 cps/admin.py:2078 +#: cps/admin.py:480 cps/admin.py:2156 msgid "Guest Name can't be changed" msgstr "Gjestenavn kan ikke endres" -#: cps/admin.py:489 +#: cps/admin.py:492 msgid "Guest can't have this role" msgstr "Gjesten kan ikke ha denne rollen" -#: cps/admin.py:501 cps/admin.py:2032 +#: cps/admin.py:504 cps/admin.py:2110 msgid "No admin user remaining, can't remove admin role" msgstr "Ingen administratorbruker igjen, kan ikke fjerne administratorrollen" -#: cps/admin.py:505 cps/admin.py:519 +#: cps/admin.py:508 cps/admin.py:522 msgid "Value has to be true or false" msgstr "Verdien må være sann eller usann" -#: cps/admin.py:507 +#: cps/admin.py:510 msgid "Invalid role" msgstr "Ugyldig rolle" -#: cps/admin.py:511 +#: cps/admin.py:514 msgid "Guest can't have this view" msgstr "Gjestene kan ikke ha denne utsikten" -#: cps/admin.py:521 +#: cps/admin.py:524 msgid "Invalid view" msgstr "Ugyldig visning" -#: cps/admin.py:524 +#: cps/admin.py:527 msgid "Guest's Locale is determined automatically and can't be set" msgstr "Gjestenes lokalitet bestemmes automatisk og kan ikke angis" -#: cps/admin.py:528 +#: cps/admin.py:531 msgid "No Valid Locale Given" msgstr "Ingen gyldig lokalitet gitt" -#: cps/admin.py:539 +#: cps/admin.py:542 msgid "No Valid Book Language Given" msgstr "Ikke oppgitt gyldig bokspråk" -#: cps/admin.py:541 cps/editbooks.py:243 cps/editbooks.py:428 -#: cps/editbooks.py:430 +#: cps/admin.py:544 cps/editbooks.py:260 cps/editbooks.py:445 +#: cps/editbooks.py:447 msgid "Parameter not found" msgstr "Parameter ikke funnet" -#: cps/admin.py:578 +#: cps/admin.py:581 msgid "Invalid Read Column" msgstr "Ugyldig lesekolonne" -#: cps/admin.py:584 +#: cps/admin.py:587 msgid "Invalid Restricted Column" msgstr "Ugyldig begrenset kolonne" -#: cps/admin.py:604 cps/admin.py:1903 +#: cps/admin.py:607 cps/admin.py:1981 msgid "Calibre-Web configuration updated" msgstr "Calibre-Web-konfigurasjonen er oppdatert" -#: cps/admin.py:616 +#: cps/admin.py:619 msgid "Do you really want to delete the Kobo Token?" msgstr "Vil du virkelig slette Kobo-tokenet?" -#: cps/admin.py:618 +#: cps/admin.py:621 msgid "Do you really want to delete this domain?" msgstr "Vil du virkelig slette dette domenet?" -#: cps/admin.py:620 +#: cps/admin.py:623 msgid "Do you really want to delete this user?" msgstr "Vil du virkelig slette denne brukeren?" -#: cps/admin.py:622 +#: cps/admin.py:625 msgid "Do you really want to delete this book?" msgstr "" -#: cps/admin.py:624 +#: cps/admin.py:627 msgid "Are you sure you want to delete this shelf?" msgstr "Er du sikker på at du vil slette denne hyllen?" -#: cps/admin.py:626 +#: cps/admin.py:629 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Er du sikker på at du vil endre lokaliteter for valgte bruker(e)?" -#: cps/admin.py:628 +#: cps/admin.py:631 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "Er du sikker på at du vil endre synlige bokspråk for valgte bruker(e)?" -#: cps/admin.py:630 +#: cps/admin.py:633 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "Er du sikker på at du vil endre den valgte rollen for den(e) valgte brukeren?" -#: cps/admin.py:632 +#: cps/admin.py:635 msgid "Are you sure you want to change the archive status for the selected book(s)?" msgstr "" -#: cps/admin.py:634 +#: cps/admin.py:637 msgid "Are you sure you want to change the read status for the selected book(s)?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:639 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Er du sikker på at du vil endre de valgte begrensningene for den(e) valgte brukeren?" -#: cps/admin.py:638 +#: cps/admin.py:641 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "Er du sikker på at du vil endre de valgte synlighetsbegrensningene for valgte bruker(e)?" -#: cps/admin.py:641 +#: cps/admin.py:644 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Er du sikker på at du vil endre atferden for hyllesynkronisering for de(n) valgte brukeren(e)?" -#: cps/admin.py:643 +#: cps/admin.py:646 msgid "Are you sure you want to change Calibre library location?" msgstr "Er du sikker på at du vil endre plassering av Caliber-biblioteket?" -#: cps/admin.py:645 +#: cps/admin.py:648 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "Calibre-Web vil søke etter oppdaterte omslag og oppdatere omslagsminiatyrbilder, kan dette ta litt tid?" -#: cps/admin.py:648 +#: cps/admin.py:651 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Er du sikker på at du vil slette Calibre-Webs synkroniseringsdatabase for å tvinge frem en full synkronisering med Kobo Reader?" -#: cps/admin.py:891 cps/admin.py:897 cps/admin.py:907 cps/admin.py:917 +#: cps/admin.py:894 cps/admin.py:900 cps/admin.py:910 cps/admin.py:920 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Benekte" -#: cps/admin.py:893 cps/admin.py:899 cps/admin.py:909 cps/admin.py:919 +#: cps/admin.py:896 cps/admin.py:902 cps/admin.py:912 cps/admin.py:922 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Tillate" -#: cps/admin.py:952 +#: cps/admin.py:955 #, python-brace-format msgid "{} sync entries deleted" msgstr "{} synkroniseringsoppføringer slettet" -#: cps/admin.py:993 +#: cps/admin.py:996 msgid "Tag not found" msgstr "Merket ble ikke funnet" -#: cps/admin.py:1011 +#: cps/admin.py:1014 msgid "Invalid Action" msgstr "Ugyldig handling" -#: cps/admin.py:1138 +#: cps/admin.py:1137 +#, python-format +msgid "Invalid reverse proxy trusted IP/CIDR entry: %(entry)s" +msgstr "" + +#: cps/admin.py:1148 +#, python-format +msgid "Invalid %(label)s: %(value)s" +msgstr "" + +#: cps/admin.py:1166 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json er ikke konfigurert for webapplikasjon" -#: cps/admin.py:1183 +#: cps/admin.py:1211 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "Loggfilplasseringen er ikke gyldig, skriv inn riktig bane" -#: cps/admin.py:1189 +#: cps/admin.py:1217 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "Plasseringen av tilgangsloggfilen er ikke gyldig, skriv inn riktig bane" -#: cps/admin.py:1223 +#: cps/admin.py:1251 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Angi en LDAP-leverandør, port, DN og brukerobjektidentifikator" -#: cps/admin.py:1229 +#: cps/admin.py:1257 msgid "Please Enter a LDAP Service Account and Password" msgstr "Vennligst skriv inn en LDAP-tjenestekonto og passord" -#: cps/admin.py:1232 +#: cps/admin.py:1260 msgid "Please Enter a LDAP Service Account" msgstr "Angi en LDAP-tjenestekonto" -#: cps/admin.py:1237 +#: cps/admin.py:1265 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "LDAP-gruppeobjektfilter må ha én \"%s\"-formatidentifikator" -#: cps/admin.py:1239 +#: cps/admin.py:1267 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "LDAP-gruppeobjektfilter har uovertruffen parentes" -#: cps/admin.py:1243 +#: cps/admin.py:1271 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP-brukerobjektfilter må ha én \"%s\"-formatidentifikator" -#: cps/admin.py:1245 +#: cps/admin.py:1273 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "LDAP-brukerobjektfilter har uovertruffen parentes" -#: cps/admin.py:1252 +#: cps/admin.py:1280 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP-medlemsbrukerfilter må ha én \"%s\"-formatidentifikator" -#: cps/admin.py:1254 +#: cps/admin.py:1282 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "LDAP-medlemsbrukerfilter har uovertruffen parentes" -#: cps/admin.py:1261 +#: cps/admin.py:1289 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP CA-sertifikat, sertifikat eller nøkkelplassering er ikke gyldig. Angi riktig bane" -#: cps/admin.py:1292 cps/templates/admin.html:53 +#: cps/admin.py:1320 cps/templates/admin.html:53 msgid "Add New User" msgstr "Legg til ny bruker" -#: cps/admin.py:1301 cps/templates/admin.html:100 +#: cps/admin.py:1329 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "" -#: cps/admin.py:1320 +#: cps/admin.py:1348 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1340 cps/admin.py:1343 cps/admin.py:1728 cps/admin.py:1887 -#: cps/admin.py:1985 cps/admin.py:2106 cps/editbooks.py:169 -#: cps/editbooks.py:755 cps/editbooks.py:1474 cps/shelf.py:90 cps/shelf.py:144 +#: cps/admin.py:1368 cps/admin.py:1371 cps/admin.py:1756 cps/admin.py:1965 +#: cps/admin.py:2063 cps/admin.py:2184 cps/editbooks.py:170 +#: cps/editbooks.py:772 cps/editbooks.py:1518 cps/shelf.py:90 cps/shelf.py:144 #: cps/shelf.py:194 cps/shelf.py:237 cps/shelf.py:287 cps/shelf.py:327 -#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:160 cps/web.py:1526 +#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:161 cps/web.py:1536 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "" -#: cps/admin.py:1350 +#: cps/admin.py:1378 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Test e-post i kø for sending til %(email)s, sjekk Oppgaver for resultat" -#: cps/admin.py:1353 +#: cps/admin.py:1381 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Det oppsto en feil ved sending av test-e-posten: %(res)s" -#: cps/admin.py:1355 +#: cps/admin.py:1383 msgid "Please configure your e-mail address first..." msgstr "Vennligst konfigurer e-postadressen din først..." -#: cps/admin.py:1357 +#: cps/admin.py:1385 msgid "Email Server Settings updated" msgstr "" -#: cps/admin.py:1380 cps/templates/admin.html:195 +#: cps/admin.py:1408 cps/templates/admin.html:211 msgid "Edit Scheduled Tasks Settings" msgstr "Rediger innstillinger for planlagte oppgaver" -#: cps/admin.py:1392 +#: cps/admin.py:1420 msgid "Invalid start time for task specified" msgstr "Ugyldig starttidspunkt for spesifisert oppgave" -#: cps/admin.py:1397 +#: cps/admin.py:1425 msgid "Invalid duration for task specified" msgstr "Ugyldig varighet for spesifisert oppgave" -#: cps/admin.py:1407 +#: cps/admin.py:1435 msgid "Scheduled tasks settings updated" msgstr "Innstillinger for planlagte oppgaver er oppdatert" -#: cps/admin.py:1417 cps/admin.py:1466 cps/admin.py:2102 cps/web.py:1325 +#: cps/admin.py:1445 cps/admin.py:1494 cps/admin.py:2180 cps/web.py:1335 msgid "Oops! An unknown error occurred. Please try again later." msgstr "" -#: cps/admin.py:1421 +#: cps/admin.py:1449 msgid "Settings DB is not Writeable" msgstr "Innstillinger DB er ikke skrivbar" -#: cps/admin.py:1451 cps/admin.py:2094 +#: cps/admin.py:1479 cps/admin.py:2172 #, python-format msgid "Edit User %(nick)s" msgstr "Rediger bruker %(nick)s" -#: cps/admin.py:1463 +#: cps/admin.py:1491 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "" -#: cps/admin.py:1469 +#: cps/admin.py:1497 msgid "Oops! Please configure the SMTP mail settings." msgstr "" -#: cps/admin.py:1480 +#: cps/admin.py:1508 msgid "Logfile viewer" msgstr "Loggfilviser" -#: cps/admin.py:1546 +#: cps/admin.py:1574 msgid "Requesting update package" msgstr "Ber om oppdateringspakke" -#: cps/admin.py:1547 +#: cps/admin.py:1575 msgid "Downloading update package" msgstr "Laster ned oppdateringspakken" -#: cps/admin.py:1548 +#: cps/admin.py:1576 msgid "Unzipping update package" msgstr "Pakker ut oppdateringspakken" -#: cps/admin.py:1549 +#: cps/admin.py:1577 msgid "Replacing files" msgstr "Erstatter filer" -#: cps/admin.py:1550 +#: cps/admin.py:1578 msgid "Database connections are closed" msgstr "Databaseforbindelser er stengt" -#: cps/admin.py:1551 +#: cps/admin.py:1579 msgid "Stopping server" msgstr "Stopper server" -#: cps/admin.py:1552 +#: cps/admin.py:1580 msgid "Update finished, please press okay and reload page" msgstr "Oppdatering fullført, vennligst trykk OK og last inn siden på nytt" -#: cps/admin.py:1553 cps/admin.py:1554 cps/admin.py:1555 cps/admin.py:1556 -#: cps/admin.py:1557 cps/admin.py:1558 +#: cps/admin.py:1581 cps/admin.py:1582 cps/admin.py:1583 cps/admin.py:1584 +#: cps/admin.py:1585 cps/admin.py:1586 msgid "Update failed:" msgstr "Oppdatering mislyktes:" -#: cps/admin.py:1553 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1581 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP-feil" -#: cps/admin.py:1554 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1582 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Tilkoblingsfeil" -#: cps/admin.py:1555 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1583 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Tidsavbrudd under etablering av tilkobling" -#: cps/admin.py:1556 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1584 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Generell feil" -#: cps/admin.py:1557 +#: cps/admin.py:1585 msgid "Update file could not be saved in temp dir" msgstr "Oppdateringsfilen kunne ikke lagres i temp dir" -#: cps/admin.py:1558 +#: cps/admin.py:1586 msgid "Files could not be replaced during update" msgstr "Filer kunne ikke erstattes under oppdatering" -#: cps/admin.py:1582 +#: cps/admin.py:1610 msgid "Failed to extract at least One LDAP User" msgstr "Kunne ikke pakke ut minst én LDAP-bruker" -#: cps/admin.py:1627 +#: cps/admin.py:1655 msgid "Failed to Create at Least One LDAP User" msgstr "Kunne ikke opprette minst én LDAP-bruker" -#: cps/admin.py:1640 +#: cps/admin.py:1668 #, python-format msgid "Error: %(ldaperror)s" msgstr "Feil: %(ldaperror)s" -#: cps/admin.py:1644 +#: cps/admin.py:1672 msgid "Error: No user returned in response of LDAP server" msgstr "Feil: Ingen bruker ble returnert som svar fra LDAP-serveren" -#: cps/admin.py:1680 +#: cps/admin.py:1708 msgid "At Least One LDAP User Not Found in Database" msgstr "Minst én LDAP-bruker ikke funnet i databasen" -#: cps/admin.py:1682 +#: cps/admin.py:1710 #, python-brace-format msgid "{} User Successfully Imported" msgstr "{} Bruker ble importert" -#: cps/admin.py:1740 +#: cps/admin.py:1768 msgid "Books path not valid" msgstr "" -#: cps/admin.py:1746 +#: cps/admin.py:1774 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "DB-plassering er ikke gyldig, skriv inn riktig bane" -#: cps/admin.py:1774 +#: cps/admin.py:1802 msgid "DB is not Writeable" msgstr "DB er ikke skrivbar" -#: cps/admin.py:1788 +#: cps/admin.py:1816 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "Nøkkelfilplasseringen er ikke gyldig. Angi riktig bane" -#: cps/admin.py:1792 +#: cps/admin.py:1820 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "Sertifikatfilplasseringen er ikke gyldig, vennligst skriv inn riktig bane" -#: cps/admin.py:1872 +#: cps/admin.py:1846 +msgid "Kepubify binary not found" +msgstr "" + +#: cps/admin.py:1894 +msgid "reverse proxy login header name" +msgstr "" + +#: cps/admin.py:1904 +msgid "reverse proxy shared secret header name" +msgstr "" + +#: cps/admin.py:1913 +msgid "Please configure both reverse proxy shared secret header name and secret" +msgstr "" + +#: cps/admin.py:1917 +msgid "Please configure reverse proxy shared secret header name and secret or disable the feature" +msgstr "" + +#: cps/admin.py:1922 +msgid "Please configure at least one trusted reverse proxy IP or CIDR" +msgstr "" + +#: cps/admin.py:1946 msgid "Password length has to be between 1 and 40" msgstr "" -#: cps/admin.py:1926 +#: cps/admin.py:1957 cps/helper.py:1007 +msgid "Please specify a valid UnRar directory" +msgstr "" + +#: cps/admin.py:2004 msgid "Database Settings updated" msgstr "Databaseinnstillinger oppdatert" -#: cps/admin.py:1934 +#: cps/admin.py:2012 msgid "Database Configuration" msgstr "Databasekonfigurasjon" -#: cps/admin.py:1949 cps/web.py:1295 +#: cps/admin.py:2027 cps/web.py:1305 msgid "Oops! Please complete all fields." msgstr "" -#: cps/admin.py:1958 +#: cps/admin.py:2036 msgid "E-mail is not from valid domain" msgstr "E-post er ikke fra gyldig domene" -#: cps/admin.py:1964 +#: cps/admin.py:2042 msgid "Add new user" msgstr "Legg til ny bruker" -#: cps/admin.py:1975 +#: cps/admin.py:2053 #, python-format msgid "User '%(user)s' created" msgstr "Bruker '%(user)s' opprettet" -#: cps/admin.py:1981 +#: cps/admin.py:2059 msgid "Oops! An account already exists for this Email. or name." msgstr "" -#: cps/admin.py:2011 +#: cps/admin.py:2089 #, python-format msgid "User '%(nick)s' deleted" msgstr "Brukeren '%(nick)s' slettet" -#: cps/admin.py:2014 +#: cps/admin.py:2092 msgid "Can't delete Guest User" msgstr "Kan ikke slette gjestebruker" -#: cps/admin.py:2017 +#: cps/admin.py:2095 msgid "No admin user remaining, can't delete user" msgstr "Ingen administratorbruker igjen, kan ikke slette bruker" -#: cps/admin.py:2072 cps/web.py:1475 +#: cps/admin.py:2150 cps/web.py:1485 msgid "Email can't be empty and has to be a valid Email" msgstr "" -#: cps/admin.py:2098 +#: cps/admin.py:2176 #, python-format msgid "User '%(nick)s' updated" msgstr "Bruker '%(nick)s' oppdatert" @@ -541,145 +580,153 @@ msgstr "Bruker '%(nick)s' oppdatert" msgid "Search" msgstr "Søk" -#: cps/converter.py:31 +#: cps/converter.py:32 msgid "not installed" msgstr "ikke installert" -#: cps/converter.py:32 +#: cps/converter.py:33 msgid "Execution permissions missing" msgstr "Utførelsestillatelser mangler" -#: cps/db.py:1129 cps/templates/config_edit.html:207 +#: cps/db.py:1129 cps/templates/config_edit.html:229 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:565 cps/web.py:599 cps/web.py:644 cps/web.py:684 cps/web.py:711 -#: cps/web.py:998 cps/web.py:1028 cps/web.py:1073 cps/web.py:1101 -#: cps/web.py:1140 +#: cps/web.py:567 cps/web.py:601 cps/web.py:646 cps/web.py:686 cps/web.py:713 +#: cps/web.py:1000 cps/web.py:1030 cps/web.py:1075 cps/web.py:1103 +#: cps/web.py:1142 msgid "None" msgstr "Ingen" -#: cps/editbooks.py:155 +#: cps/editbooks.py:156 #, python-format msgid "File %(file)s uploaded" msgstr "Fil %(file)s lastet opp" -#: cps/editbooks.py:184 +#: cps/editbooks.py:185 msgid "Source or destination format for conversion missing" msgstr "Kilde- eller målformat for konvertering mangler" -#: cps/editbooks.py:192 +#: cps/editbooks.py:189 cps/editbooks.py:197 +msgid "Source format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:201 +msgid "Destination format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:209 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Boken ble satt i kø for konvertering til %(book_format)s" -#: cps/editbooks.py:196 +#: cps/editbooks.py:213 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Det oppsto en feil ved konvertering av denne boken: %(res)s" -#: cps/editbooks.py:297 +#: cps/editbooks.py:314 msgid "Changes successfully applied" msgstr "" -#: cps/editbooks.py:317 +#: cps/editbooks.py:334 msgid "Value is missing on request" msgstr "" -#: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 -#: cps/editbooks.py:1146 cps/web.py:532 cps/web.py:1567 cps/web.py:1613 -#: cps/web.py:1663 +#: cps/editbooks.py:336 cps/editbooks.py:343 cps/editbooks.py:644 +#: cps/editbooks.py:1170 cps/web.py:534 cps/web.py:1577 cps/web.py:1623 +#: cps/web.py:1673 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "" -#: cps/editbooks.py:673 cps/editbooks.py:1503 +#: cps/editbooks.py:690 cps/editbooks.py:1547 msgid "User has no rights to upload cover" msgstr "Brukeren har ingen rettigheter til å laste opp cover" -#: cps/editbooks.py:694 cps/editbooks.py:938 +#: cps/editbooks.py:711 cps/editbooks.py:961 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "Identifikatorer skiller ikke mellom store og små bokstaver, overskriver gammel identifikator" -#: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 +#: cps/editbooks.py:726 cps/editbooks.py:935 cps/editbooks.py:1306 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "'%(langname)s' er ikke et gyldig språk" -#: cps/editbooks.py:737 +#: cps/editbooks.py:754 msgid "Metadata successfully updated" msgstr "Metadata ble oppdatert" -#: cps/editbooks.py:760 +#: cps/editbooks.py:777 #, python-brace-format msgid "Error editing book: {}" msgstr "Feil ved redigering av bok: {}" -#: cps/editbooks.py:856 +#: cps/editbooks.py:879 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "Opplastet bok finnes sannsynligvis i biblioteket, vurder å endre før du laster opp ny: " -#: cps/editbooks.py:950 cps/editbooks.py:1420 +#: cps/editbooks.py:973 cps/editbooks.py:1464 msgid "File type isn't allowed to be uploaded to this server" msgstr "" -#: cps/editbooks.py:956 cps/editbooks.py:1431 +#: cps/editbooks.py:979 cps/editbooks.py:1475 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "Filtypen «%(ext)s» er ikke tillatt å lastes opp til denne serveren" -#: cps/editbooks.py:960 cps/editbooks.py:1436 +#: cps/editbooks.py:983 cps/editbooks.py:1480 msgid "File to be uploaded must have an extension" msgstr "Filen som skal lastes opp må ha en utvidelse" -#: cps/editbooks.py:968 +#: cps/editbooks.py:992 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "Filen %(filename)s kunne ikke lagres i midlertidig dir" -#: cps/editbooks.py:988 +#: cps/editbooks.py:1012 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Kunne ikke flytte omslagsfil %(file)s: %(error)s" -#: cps/editbooks.py:1041 +#: cps/editbooks.py:1065 msgid "Book Format Successfully Deleted" msgstr "Bokformatet er slettet" -#: cps/editbooks.py:1044 cps/editbooks.py:1061 +#: cps/editbooks.py:1068 cps/editbooks.py:1085 msgid "Book Successfully Deleted" msgstr "Boken ble slettet" -#: cps/editbooks.py:1065 +#: cps/editbooks.py:1089 msgid "You are missing permissions to delete books" msgstr "Du mangler tillatelser til å slette bøker" -#: cps/editbooks.py:1139 +#: cps/editbooks.py:1163 #, python-brace-format msgid "Book with id \"{}\" could not be deleted: not found" msgstr "" -#: cps/editbooks.py:1181 +#: cps/editbooks.py:1205 msgid "edit metadata" msgstr "redigere metadata" -#: cps/editbooks.py:1234 +#: cps/editbooks.py:1267 #, python-format msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1425 +#: cps/editbooks.py:1469 msgid "User has no rights to upload additional file formats" msgstr "Brukeren har ingen rettigheter til å laste opp flere filformater" -#: cps/editbooks.py:1449 +#: cps/editbooks.py:1493 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Kunne ikke opprette banen %(path)s (Tillatelse nektet)." -#: cps/editbooks.py:1456 +#: cps/editbooks.py:1500 #, python-format msgid "Failed to store file %(file)s." msgstr "Kunne ikke lagre filen %(file)s." -#: cps/editbooks.py:1481 +#: cps/editbooks.py:1525 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Filformat %(ext)s lagt til %(book)s" @@ -690,9 +737,9 @@ msgstr "" #: cps/error_handler.py:108 cps/templates/layout.html:69 #: cps/templates/layout.html:104 cps/templates/login.html:27 -#: cps/templates/register.html:17 cps/web.py:1292 cps/web.py:1296 -#: cps/web.py:1302 cps/web.py:1326 cps/web.py:1330 cps/web.py:1343 -#: cps/web.py:1346 +#: cps/templates/register.html:17 cps/web.py:1302 cps/web.py:1306 +#: cps/web.py:1312 cps/web.py:1336 cps/web.py:1340 cps/web.py:1353 +#: cps/web.py:1356 msgid "Register" msgstr "Registrere" @@ -713,7 +760,7 @@ msgstr "Tilbakeringingsdomene er ikke bekreftet. Følg fremgangsmåten for å be msgid "%(format)s format not found for book id: %(book)d" msgstr "%(format)s format ikke funnet for bok-ID: %(book)d" -#: cps/helper.py:94 cps/tasks/convert.py:91 +#: cps/helper.py:94 cps/tasks/convert.py:92 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s ikke funnet på Google Disk: %(fn)s" @@ -899,10 +946,6 @@ msgstr "Bare jpg/jpeg-filer støttes som coverfile" msgid "Cover" msgstr "Dekke" -#: cps/helper.py:1006 -msgid "UnRar binary file not found" -msgstr "UnRar binær fil ikke funnet" - #: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "Feil ved kjøring av UnRar" @@ -933,7 +976,7 @@ msgstr "" msgid "Error executing Calibre" msgstr "" -#: cps/helper.py:1154 cps/templates/admin.html:216 +#: cps/helper.py:1154 cps/templates/admin.html:232 msgid "Queue all books for metadata backup" msgstr "Sett alle bøker i kø for sikkerhetskopiering av metadata" @@ -955,7 +998,7 @@ msgstr "Registrer deg hos %(provider)s" msgid "This %(oauth)s account is already linked to a different user" msgstr "" -#: cps/oauth_bb.py:147 cps/remotelogin.py:131 +#: cps/oauth_bb.py:147 cps/remotelogin.py:150 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "" @@ -1023,25 +1066,29 @@ msgstr "Google Oauth-feil: {}" msgid "{} Stars" msgstr "{} Stjerner" -#: cps/remotelogin.py:63 cps/templates/layout.html:68 -#: cps/templates/layout.html:103 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1361 -msgid "Login" -msgstr "Logg Inn" - -#: cps/remotelogin.py:75 cps/remotelogin.py:109 +#: cps/remotelogin.py:46 cps/remotelogin.py:128 msgid "Token not found" msgstr "Token ikke funnet" -#: cps/remotelogin.py:84 cps/remotelogin.py:117 +#: cps/remotelogin.py:55 cps/remotelogin.py:136 msgid "Token has expired" msgstr "Token har utløpt" -#: cps/remotelogin.py:93 +#: cps/remotelogin.py:86 cps/remotelogin.py:112 cps/templates/layout.html:68 +#: cps/templates/layout.html:103 cps/templates/login.html:4 +#: cps/templates/login.html:21 cps/web.py:1371 +msgid "Login" +msgstr "Logg Inn" + +#: cps/remotelogin.py:100 +msgid "Token already approved" +msgstr "" + +#: cps/remotelogin.py:108 msgid "Success! Please return to your device" msgstr "Suksess! Gå tilbake til enheten din" -#: cps/render_template.py:41 cps/web.py:421 +#: cps/render_template.py:41 cps/web.py:423 msgid "Books" msgstr "Bøker" @@ -1066,7 +1113,7 @@ msgstr "Nedlastede bøker" msgid "Show Downloaded Books" msgstr "Vis nedlastede bøker" -#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:436 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:438 msgid "Top Rated Books" msgstr "Topprangerte bøker" @@ -1075,7 +1122,7 @@ msgid "Show Top Rated Books" msgstr "Vis best rangerte bøker" #: cps/render_template.py:61 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:769 +#: cps/templates/index.xml:67 cps/web.py:771 msgid "Read Books" msgstr "Lese bøker" @@ -1084,7 +1131,7 @@ msgid "Show Read and Unread" msgstr "" #: cps/render_template.py:65 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:772 +#: cps/templates/index.xml:74 cps/web.py:774 msgid "Unread Books" msgstr "Uleste bøker" @@ -1102,7 +1149,7 @@ msgid "Show Random Books" msgstr "Vis tilfeldige bøker" #: cps/render_template.py:71 cps/templates/book_table.html:93 -#: cps/templates/index.xml:97 cps/web.py:1144 +#: cps/templates/index.xml:97 cps/web.py:1146 msgid "Categories" msgstr "Kategorier" @@ -1112,7 +1159,7 @@ msgstr "" #: cps/render_template.py:74 cps/templates/book_edit.html:86 #: cps/templates/book_table.html:94 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1034 cps/web.py:1046 +#: cps/templates/search_form.html:70 cps/web.py:1036 cps/web.py:1048 msgid "Series" msgstr "Serie" @@ -1130,7 +1177,7 @@ msgid "Show Author Section" msgstr "" #: cps/render_template.py:81 cps/templates/book_table.html:98 -#: cps/templates/index.xml:88 cps/web.py:1002 +#: cps/templates/index.xml:88 cps/web.py:1004 msgid "Publishers" msgstr "Forlag" @@ -1140,7 +1187,7 @@ msgstr "" #: cps/render_template.py:84 cps/templates/book_table.html:96 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1116 +#: cps/web.py:1118 msgid "Languages" msgstr "Språk" @@ -1164,7 +1211,7 @@ msgstr "Filformater" msgid "Show File Formats Section" msgstr "" -#: cps/render_template.py:95 cps/web.py:795 +#: cps/render_template.py:95 cps/web.py:797 msgid "Archived Books" msgstr "Arkiverte bøker" @@ -1172,7 +1219,7 @@ msgstr "Arkiverte bøker" msgid "Show Archived Books" msgstr "" -#: cps/render_template.py:100 cps/web.py:831 +#: cps/render_template.py:100 cps/web.py:833 msgid "Books List" msgstr "Bøker Liste" @@ -1405,150 +1452,154 @@ msgstr "En ny oppdatering er tilgjengelig. Klikk på knappen nedenfor for å opp msgid "No release information available" msgstr "Ingen utgivelsesinformasjon tilgjengelig" -#: cps/templates/index.html:6 cps/web.py:448 +#: cps/templates/index.html:6 cps/web.py:450 msgid "Discover (Random Books)" msgstr "Discover (tilfeldige bøker)" -#: cps/web.py:484 +#: cps/web.py:486 msgid "Hot Books (Most Downloaded)" msgstr "Hot Books (mest nedlastede)" -#: cps/web.py:515 +#: cps/web.py:517 #, python-format msgid "Downloaded books by %(user)s" msgstr "Lastet ned bøker av %(user)s" -#: cps/web.py:548 +#: cps/web.py:550 #, python-format msgid "Author: %(name)s" msgstr "Forfatter: %(name)s" -#: cps/web.py:584 +#: cps/web.py:586 #, python-format msgid "Publisher: %(name)s" msgstr "Utgiver: %(name)s" -#: cps/web.py:612 +#: cps/web.py:614 #, python-format msgid "Series: %(serie)s" msgstr "Serie: %(serie)s" -#: cps/web.py:626 +#: cps/web.py:628 msgid "Rating: None" msgstr "Vurdering: Ingen" -#: cps/web.py:635 +#: cps/web.py:637 #, python-format msgid "Rating: %(rating)s stars" msgstr "Rangering: %(rating)s stjerner" -#: cps/web.py:666 +#: cps/web.py:668 #, python-format msgid "File format: %(format)s" msgstr "Filformat: %(format)s" -#: cps/web.py:701 +#: cps/web.py:703 #, python-format msgid "Category: %(name)s" msgstr "Kategori: %(name)s" -#: cps/web.py:730 +#: cps/web.py:732 #, python-format msgid "Language: %(name)s" msgstr "Språk: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:974 +#: cps/templates/admin.html:16 cps/web.py:976 msgid "Downloads" msgstr "Nedlastinger" -#: cps/web.py:1076 +#: cps/web.py:1078 msgid "Ratings list" msgstr "Rangeringsliste" -#: cps/web.py:1103 +#: cps/web.py:1105 msgid "File formats list" msgstr "Liste over filformater" -#: cps/web.py:1264 +#: cps/web.py:1272 +msgid "Book format not supported" +msgstr "" + +#: cps/web.py:1274 msgid "Please configure the SMTP mail settings first..." msgstr "" -#: cps/web.py:1270 +#: cps/web.py:1280 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "" -#: cps/web.py:1273 +#: cps/web.py:1283 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "" -#: cps/web.py:1275 +#: cps/web.py:1285 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "" -#: cps/web.py:1291 cps/web.py:1342 +#: cps/web.py:1301 cps/web.py:1352 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "" -#: cps/web.py:1328 +#: cps/web.py:1338 msgid "Oops! Your Email is not allowed." msgstr "" -#: cps/web.py:1331 +#: cps/web.py:1341 msgid "Success! Confirmation Email has been sent." msgstr "" -#: cps/web.py:1376 cps/web.py:1390 +#: cps/web.py:1386 cps/web.py:1400 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1399 +#: cps/web.py:1409 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1406 +#: cps/web.py:1416 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1411 +#: cps/web.py:1421 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1415 cps/web.py:1440 +#: cps/web.py:1425 cps/web.py:1450 msgid "Wrong Username or Password" msgstr "" -#: cps/web.py:1422 +#: cps/web.py:1432 msgid "New Password was sent to your email address" msgstr "" -#: cps/web.py:1426 +#: cps/web.py:1436 msgid "An unknown error occurred. Please try again later." msgstr "" -#: cps/web.py:1428 +#: cps/web.py:1438 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1436 +#: cps/web.py:1446 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1501 cps/web.py:1551 +#: cps/web.py:1511 cps/web.py:1561 #, python-format msgid "%(name)s's Profile" msgstr "" -#: cps/web.py:1517 +#: cps/web.py:1527 msgid "Success! Profile Updated" msgstr "" -#: cps/web.py:1521 +#: cps/web.py:1531 msgid "Oops! An account already exists for this Email." msgstr "" @@ -1560,46 +1611,46 @@ msgstr "Fant ingen gyldig gmail.json-fil med OAuth-informasjon" msgid "Delete temp folder contents" msgstr "" -#: cps/tasks/convert.py:112 +#: cps/tasks/convert.py:113 #, python-format msgid "%(book)s send to E-Reader" msgstr "%(book)s sendes til E-Reader" -#: cps/tasks/convert.py:177 +#: cps/tasks/convert.py:180 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Caliber ebook-convert %(tool)s ble ikke funnet" -#: cps/tasks/convert.py:211 +#: cps/tasks/convert.py:214 #, python-format msgid "%(format)s format not found on disk" msgstr "%(format)s format ikke funnet på disken" -#: cps/tasks/convert.py:215 +#: cps/tasks/convert.py:218 msgid "Ebook converter failed with unknown error" msgstr "Ebook-konvertering mislyktes med ukjent feil" -#: cps/tasks/convert.py:234 +#: cps/tasks/convert.py:237 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify-konvertering mislyktes: %(error)s" -#: cps/tasks/convert.py:254 +#: cps/tasks/convert.py:257 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Konvertert fil ikke funnet eller mer enn én fil i mappen %(folder)s" -#: cps/tasks/convert.py:291 cps/tasks/convert.py:342 +#: cps/tasks/convert.py:294 cps/tasks/convert.py:345 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Caliber mislyktes med feil: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:322 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Ebook-konvertering mislyktes: %(error)s" -#: cps/tasks/convert.py:347 +#: cps/tasks/convert.py:350 msgid "Convert" msgstr "Konvertere" @@ -1685,7 +1736,7 @@ msgstr "Redigere" #: cps/templates/admin.html:25 cps/templates/book_edit.html:17 #: cps/templates/book_table.html:131 cps/templates/book_table.html:180 -#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:115 +#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:117 #: cps/templates/user_edit.html:67 cps/templates/user_table.html:149 msgid "Delete" msgstr "Slett" @@ -1775,128 +1826,145 @@ msgstr "Magic Link ekstern pålogging" msgid "Reverse Proxy Login" msgstr "Omvendt proxy-pålogging" -#: cps/templates/admin.html:154 cps/templates/config_edit.html:176 +#: cps/templates/admin.html:154 cps/templates/config_edit.html:180 msgid "Reverse Proxy Header Name" msgstr "Omvendt proxy-overskriftsnavn" -#: cps/templates/admin.html:159 +#: cps/templates/admin.html:158 +msgid "Reverse Proxy Trusted IPs/CIDRs" +msgstr "" + +#: cps/templates/admin.html:162 cps/templates/config_edit.html:193 +msgid "Reverse Proxy Shared Secret Header Name" +msgstr "" + +#: cps/templates/admin.html:166 +msgid "Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/admin.html:170 +msgid "Reverse Proxy Shared Secret Configured" +msgstr "" + +#: cps/templates/admin.html:175 msgid "Edit Calibre Database Configuration" msgstr "Rediger Caliber-databasekonfigurasjon" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:176 msgid "Edit Basic Configuration" msgstr "Rediger grunnleggende konfigurasjon" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:177 msgid "Edit UI Configuration" msgstr "Rediger UI-konfigurasjon" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:183 msgid "Scheduled Tasks" msgstr "Planlagte oppgaver" -#: cps/templates/admin.html:170 cps/templates/schedule_edit.html:12 +#: cps/templates/admin.html:186 cps/templates/schedule_edit.html:12 #: cps/templates/tasks.html:18 msgid "Start Time" msgstr "" -#: cps/templates/admin.html:174 cps/templates/schedule_edit.html:20 +#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:20 msgid "Maximum Duration" msgstr "" -#: cps/templates/admin.html:178 cps/templates/schedule_edit.html:29 +#: cps/templates/admin.html:194 cps/templates/schedule_edit.html:29 msgid "Generate Thumbnails" msgstr "" -#: cps/templates/admin.html:182 +#: cps/templates/admin.html:198 msgid "Generate series cover thumbnails" msgstr "Generer serieomslagsminiatyrbilder" -#: cps/templates/admin.html:186 cps/templates/admin.html:208 +#: cps/templates/admin.html:202 cps/templates/admin.html:224 #: cps/templates/schedule_edit.html:37 msgid "Reconnect Calibre Database" msgstr "Koble til Caliber-databasen på nytt" -#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 +#: cps/templates/admin.html:206 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" msgstr "" -#: cps/templates/admin.html:197 +#: cps/templates/admin.html:213 msgid "Refresh Thumbnail Cache" msgstr "" -#: cps/templates/admin.html:203 +#: cps/templates/admin.html:219 msgid "Administration" msgstr "Administrasjon" -#: cps/templates/admin.html:204 +#: cps/templates/admin.html:220 msgid "Download Debug Package" msgstr "Last ned feilsøkingspakken" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:221 msgid "View Logs" msgstr "Vis logger" -#: cps/templates/admin.html:211 +#: cps/templates/admin.html:227 msgid "Restart" msgstr "Omstart" -#: cps/templates/admin.html:212 +#: cps/templates/admin.html:228 msgid "Shutdown" msgstr "Skru av" -#: cps/templates/admin.html:221 +#: cps/templates/admin.html:237 msgid "Version Information" msgstr "Versjonsinformasjon" -#: cps/templates/admin.html:225 +#: cps/templates/admin.html:241 msgid "Version" msgstr "Versjon" -#: cps/templates/admin.html:226 +#: cps/templates/admin.html:242 msgid "Details" msgstr "Detaljer" -#: cps/templates/admin.html:232 +#: cps/templates/admin.html:248 msgid "Current Version" msgstr "" -#: cps/templates/admin.html:239 +#: cps/templates/admin.html:255 msgid "Check for Update" msgstr "Se etter oppdatering" -#: cps/templates/admin.html:240 +#: cps/templates/admin.html:256 msgid "Perform Update" msgstr "Utfør oppdatering" -#: cps/templates/admin.html:253 +#: cps/templates/admin.html:269 msgid "Are you sure you want to restart?" msgstr "Er du sikker på at du vil starte på nytt?" -#: cps/templates/admin.html:258 cps/templates/admin.html:272 -#: cps/templates/admin.html:292 cps/templates/config_db.html:82 +#: cps/templates/admin.html:274 cps/templates/admin.html:288 +#: cps/templates/admin.html:308 cps/templates/config_db.html:82 msgid "OK" msgstr "OK" -#: cps/templates/admin.html:259 cps/templates/admin.html:273 +#: cps/templates/admin.html:275 cps/templates/admin.html:289 #: cps/templates/book_edit.html:220 cps/templates/book_table.html:162 #: cps/templates/book_table.html:181 cps/templates/book_table.html:201 #: cps/templates/book_table.html:221 cps/templates/book_table.html:241 #: cps/templates/book_table.html:261 cps/templates/book_table.html:316 -#: cps/templates/config_db.html:66 cps/templates/config_edit.html:431 +#: cps/templates/config_db.html:66 cps/templates/config_edit.html:453 #: cps/templates/config_view_edit.html:175 cps/templates/detail.html:350 -#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:98 -#: cps/templates/modal_dialogs.html:116 cps/templates/modal_dialogs.html:134 +#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:100 +#: cps/templates/modal_dialogs.html:118 cps/templates/modal_dialogs.html:136 +#: cps/templates/remote_login_verify.html:16 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 #: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Avbryt" -#: cps/templates/admin.html:271 +#: cps/templates/admin.html:287 msgid "Are you sure you want to shutdown?" msgstr "Er du sikker på at du vil slå av?" -#: cps/templates/admin.html:283 +#: cps/templates/admin.html:299 msgid "Updating, please do not reload this page" msgstr "Oppdaterer, vennligst ikke last inn denne siden på nytt" @@ -2137,7 +2205,7 @@ msgid "Fetch Metadata" msgstr "Hent metadata" #: cps/templates/book_edit.html:219 cps/templates/config_db.html:65 -#: cps/templates/config_edit.html:430 cps/templates/config_view_edit.html:174 +#: cps/templates/config_edit.html:452 cps/templates/config_view_edit.html:174 #: cps/templates/email_edit.html:65 cps/templates/schedule_edit.html:44 #: cps/templates/shelf_edit.html:25 cps/templates/shelf_order.html:41 #: cps/templates/user_edit.html:142 @@ -2509,214 +2577,234 @@ msgstr "" msgid "Allow Reverse Proxy Authentication" msgstr "Tillat omvendt proxy-autentisering" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:176 +msgid "Security Warning" +msgstr "" + +#: cps/templates/config_edit.html:177 +msgid "Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled." +msgstr "" + +#: cps/templates/config_edit.html:184 +msgid "Reverse Proxy Trusted IPs/CIDRs (Comma Separated)" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "Enable Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/config_edit.html:197 +msgid "Reverse Proxy Shared Secret" +msgstr "" + +#: cps/templates/config_edit.html:205 msgid "Login type" msgstr "Påloggingstype" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:207 msgid "Use Standard Authentication" msgstr "Bruk standardautentisering" -#: cps/templates/config_edit.html:187 +#: cps/templates/config_edit.html:209 msgid "Use LDAP Authentication" msgstr "Bruk LDAP-autentisering" -#: cps/templates/config_edit.html:190 +#: cps/templates/config_edit.html:212 msgid "Use OAuth" msgstr "Bruk OAuth" -#: cps/templates/config_edit.html:197 +#: cps/templates/config_edit.html:219 msgid "LDAP Server Host Name or IP Address" msgstr "LDAP-serverens vertsnavn eller IP-adresse" -#: cps/templates/config_edit.html:201 +#: cps/templates/config_edit.html:223 msgid "LDAP Server Port" msgstr "LDAP-serverport" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:227 msgid "LDAP Encryption" msgstr "LDAP-kryptering" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:230 msgid "TLS" msgstr "TLS" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:231 msgid "SSL" msgstr "SSL" -#: cps/templates/config_edit.html:213 +#: cps/templates/config_edit.html:235 msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" msgstr "LDAP CACertificate Path (Kun nødvendig for klientsertifikatautentisering)" -#: cps/templates/config_edit.html:220 +#: cps/templates/config_edit.html:242 msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" msgstr "LDAP-sertifikatbane (kun nødvendig for klientsertifikatautentisering)" -#: cps/templates/config_edit.html:227 +#: cps/templates/config_edit.html:249 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" msgstr "LDAP-nøkkelfilbane (kun nødvendig for klientsertifikatautentisering)" -#: cps/templates/config_edit.html:236 +#: cps/templates/config_edit.html:258 msgid "LDAP Authentication" msgstr "LDAP-autentisering" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:260 msgid "Anonymous" msgstr "Anonym" -#: cps/templates/config_edit.html:239 +#: cps/templates/config_edit.html:261 msgid "Unauthenticated" msgstr "Uautentisert" -#: cps/templates/config_edit.html:240 +#: cps/templates/config_edit.html:262 msgid "Simple" msgstr "Enkel" -#: cps/templates/config_edit.html:245 +#: cps/templates/config_edit.html:267 msgid "LDAP Administrator Username" msgstr "LDAP-administratorbrukernavn" -#: cps/templates/config_edit.html:251 +#: cps/templates/config_edit.html:273 msgid "LDAP Administrator Password" msgstr "LDAP-administratorpassord" -#: cps/templates/config_edit.html:256 +#: cps/templates/config_edit.html:278 msgid "LDAP Distinguished Name (DN)" msgstr "LDAP Distinguished Name (DN)" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:282 msgid "LDAP User Object Filter" msgstr "LDAP-brukerobjektfilter" -#: cps/templates/config_edit.html:265 +#: cps/templates/config_edit.html:287 msgid "LDAP Server is OpenLDAP?" msgstr "LDAP Server er OpenLDAP?" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:289 msgid "Following Settings are Needed For User Import" msgstr "Følgende innstillinger er nødvendig for brukerimport" -#: cps/templates/config_edit.html:269 +#: cps/templates/config_edit.html:291 msgid "LDAP Group Object Filter" msgstr "LDAP gruppeobjektfilter" -#: cps/templates/config_edit.html:273 +#: cps/templates/config_edit.html:295 msgid "LDAP Group Name" msgstr "LDAP-gruppenavn" -#: cps/templates/config_edit.html:277 +#: cps/templates/config_edit.html:299 msgid "LDAP Group Members Field" msgstr "Felt for LDAP-gruppemedlemmer" -#: cps/templates/config_edit.html:281 +#: cps/templates/config_edit.html:303 msgid "LDAP Member User Filter Detection" msgstr "LDAP-medlemsbrukerfilterdeteksjon" -#: cps/templates/config_edit.html:283 +#: cps/templates/config_edit.html:305 msgid "Autodetect" msgstr "" -#: cps/templates/config_edit.html:284 +#: cps/templates/config_edit.html:306 msgid "Custom Filter" msgstr "" -#: cps/templates/config_edit.html:289 +#: cps/templates/config_edit.html:311 msgid "LDAP Member User Filter" msgstr "" -#: cps/templates/config_edit.html:300 +#: cps/templates/config_edit.html:322 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:303 +#: cps/templates/config_edit.html:325 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:307 +#: cps/templates/config_edit.html:329 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:323 +#: cps/templates/config_edit.html:345 msgid "External binaries" msgstr "" -#: cps/templates/config_edit.html:329 +#: cps/templates/config_edit.html:351 msgid "Path to Calibre Binaries" msgstr "" -#: cps/templates/config_edit.html:337 +#: cps/templates/config_edit.html:359 msgid "Calibre E-Book Converter Settings" msgstr "" -#: cps/templates/config_edit.html:340 +#: cps/templates/config_edit.html:362 msgid "Path to Kepubify E-Book Converter" msgstr "" -#: cps/templates/config_edit.html:348 +#: cps/templates/config_edit.html:370 msgid "Location of Unrar binary" msgstr "" -#: cps/templates/config_edit.html:364 +#: cps/templates/config_edit.html:386 msgid "Security Settings" msgstr "" -#: cps/templates/config_edit.html:372 +#: cps/templates/config_edit.html:394 msgid "Limit failed login attempts" msgstr "" -#: cps/templates/config_edit.html:376 +#: cps/templates/config_edit.html:398 msgid "Configure Backend for Limiter" msgstr "" -#: cps/templates/config_edit.html:380 +#: cps/templates/config_edit.html:402 msgid "Options for Limiter Backend" msgstr "" -#: cps/templates/config_edit.html:386 +#: cps/templates/config_edit.html:408 msgid "Check if file extensions matches file content on upload" msgstr "" -#: cps/templates/config_edit.html:389 +#: cps/templates/config_edit.html:411 msgid "Session protection" msgstr "" -#: cps/templates/config_edit.html:391 +#: cps/templates/config_edit.html:413 msgid "Basic" msgstr "" -#: cps/templates/config_edit.html:392 +#: cps/templates/config_edit.html:414 msgid "Strong" msgstr "" -#: cps/templates/config_edit.html:397 +#: cps/templates/config_edit.html:419 msgid "User Password policy" msgstr "" -#: cps/templates/config_edit.html:401 +#: cps/templates/config_edit.html:423 msgid "Minimum password length" msgstr "" -#: cps/templates/config_edit.html:406 +#: cps/templates/config_edit.html:428 msgid "Enforce number" msgstr "" -#: cps/templates/config_edit.html:410 +#: cps/templates/config_edit.html:432 msgid "Enforce lowercase characters" msgstr "" -#: cps/templates/config_edit.html:414 +#: cps/templates/config_edit.html:436 msgid "Enforce uppercase characters" msgstr "" -#: cps/templates/config_edit.html:418 +#: cps/templates/config_edit.html:440 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" msgstr "" -#: cps/templates/config_edit.html:422 +#: cps/templates/config_edit.html:444 msgid "Enforce special characters" msgstr "" @@ -3183,27 +3271,27 @@ msgstr "" msgid "Choose File Location" msgstr "" -#: cps/templates/modal_dialogs.html:81 +#: cps/templates/modal_dialogs.html:82 msgid "type" msgstr "" -#: cps/templates/modal_dialogs.html:82 +#: cps/templates/modal_dialogs.html:83 msgid "name" msgstr "" -#: cps/templates/modal_dialogs.html:83 +#: cps/templates/modal_dialogs.html:84 msgid "size" msgstr "" -#: cps/templates/modal_dialogs.html:89 +#: cps/templates/modal_dialogs.html:90 msgid "Parent Directory" msgstr "" -#: cps/templates/modal_dialogs.html:97 +#: cps/templates/modal_dialogs.html:99 msgid "Select" msgstr "" -#: cps/templates/modal_dialogs.html:133 cps/templates/tasks.html:46 +#: cps/templates/modal_dialogs.html:135 cps/templates/tasks.html:46 msgid "Ok" msgstr "" @@ -3459,6 +3547,31 @@ msgstr "" msgid "This verification link will expire in 10 minutes." msgstr "" +#: cps/templates/remote_login_verify.html:4 +msgid "Approve Magic Link Login" +msgstr "" + +#: cps/templates/remote_login_verify.html:5 +msgid "Review the device that requested access before approving this login." +msgstr "" + +#: cps/templates/remote_login_verify.html:7 +msgid "IP address" +msgstr "" + +#: cps/templates/remote_login_verify.html:9 +msgid "Browser" +msgstr "" + +#: cps/templates/remote_login_verify.html:12 +#, python-format +msgid "If you approve this request, the device that started it will be logged in as %(username)s." +msgstr "" + +#: cps/templates/remote_login_verify.html:15 +msgid "Approve Login" +msgstr "" + #: cps/templates/schedule_edit.html:33 msgid "Generate Series Cover Thumbnails" msgstr "" diff --git a/cps/translations/pl/LC_MESSAGES/messages.mo b/cps/translations/pl/LC_MESSAGES/messages.mo index fb721ec8d91faa8a5ed4226eb7481d0edde0888f..2b05067fd8337615b8135acd45dbb4ffc4566184 100644 GIT binary patch delta 14082 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 LDr@upe-WGj_Gwfs delta 14194 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 F697CAY_$LY diff --git a/cps/translations/pl/LC_MESSAGES/messages.po b/cps/translations/pl/LC_MESSAGES/messages.po index 5f537a603..4f8d9edc1 100644 --- a/cps/translations/pl/LC_MESSAGES/messages.po +++ b/cps/translations/pl/LC_MESSAGES/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre Web - polski (POT: 2021-06-12 08:52)\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-08-01 11:42+0200\n" +"POT-Creation-Date: 2026-08-08 16:08+0200\n" "PO-Revision-Date: 2025-12-08 12:51+0100\n" "Last-Translator: Daniel Szepietowski \n" "Language: pl\n" @@ -17,523 +17,562 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" +"Generated-By: Babel 2.18.0\n" #: cps/about.py:85 msgid "Statistics" msgstr "Statystyki" -#: cps/admin.py:151 +#: cps/admin.py:154 msgid "Server restarted, please reload page." msgstr "Serwer został zrestartowany, proszę odświeżyć stronę." -#: cps/admin.py:153 +#: cps/admin.py:156 msgid "Performing Server shutdown, please close window." msgstr "Wyłączanie serwera, proszę zamknąć okno." -#: cps/admin.py:161 +#: cps/admin.py:164 msgid "Success! Database Reconnected" msgstr "Sukces! Ponownie połączono z bazą danych." -#: cps/admin.py:164 +#: cps/admin.py:167 msgid "Unknown command" msgstr "Nieznane polecenie" -#: cps/admin.py:175 +#: cps/admin.py:178 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "Sukces! Książki zostały umieszczone w kolejce do utworzenia kopii zapasowej metadanych, sprawdź zakładkę " # ??? -#: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 -#: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 -#: cps/uploader.py:117 +#: cps/admin.py:211 cps/editbooks.py:825 cps/editbooks.py:875 +#: cps/editbooks.py:1564 cps/templates/remote_login_verify.html:8 +#: cps/templates/remote_login_verify.html:10 cps/updater.py:615 +#: cps/uploader.py:117 cps/uploader.py:126 msgid "Unknown" msgstr "Nieznany" -#: cps/admin.py:233 +#: cps/admin.py:236 msgid "Admin page" msgstr "Panel administratora" -#: cps/admin.py:253 +#: cps/admin.py:256 msgid "Basic Configuration" msgstr "Konfiguracja podstawowa" -#: cps/admin.py:291 +#: cps/admin.py:294 msgid "UI Configuration" msgstr "Konfiguracja Interfejsu" -#: cps/admin.py:315 cps/admin.py:1002 cps/db.py:809 cps/search.py:150 -#: cps/web.py:750 +#: cps/admin.py:318 cps/admin.py:1005 cps/db.py:809 cps/search.py:150 +#: cps/web.py:752 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "Niestandardowa kolumna %(column)d nie istnieje w bazie danych calibre." -#: cps/admin.py:333 cps/templates/admin.html:51 +#: cps/admin.py:336 cps/templates/admin.html:51 msgid "Edit Users" msgstr "Edytuj użytkowników" # ??? -#: cps/admin.py:378 cps/opds.py:559 cps/templates/grid.html:14 +#: cps/admin.py:381 cps/opds.py:559 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Wszystko" -#: cps/admin.py:401 cps/admin.py:1432 +#: cps/admin.py:404 cps/admin.py:1460 msgid "User not found" msgstr "Nie znaleziono użytkownika" -#: cps/admin.py:415 +#: cps/admin.py:418 #, python-brace-format msgid "{} users deleted successfully" msgstr "{} użytkowników usuniętych pomyślnie" -#: cps/admin.py:438 cps/templates/config_view_edit.html:133 +#: cps/admin.py:441 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Pokaż wszystkie" -#: cps/admin.py:459 cps/admin.py:465 +#: cps/admin.py:462 cps/admin.py:468 msgid "Malformed request" msgstr "Nieprawidłowo sformułowane żądanie" -#: cps/admin.py:477 cps/admin.py:2078 +#: cps/admin.py:480 cps/admin.py:2156 msgid "Guest Name can't be changed" msgstr "Nazwa gościa nie może być zmieniona" -#: cps/admin.py:489 +#: cps/admin.py:492 msgid "Guest can't have this role" msgstr "Gość nie może pełnić tej roli" -#: cps/admin.py:501 cps/admin.py:2032 +#: cps/admin.py:504 cps/admin.py:2110 msgid "No admin user remaining, can't remove admin role" msgstr "Nie można odebrać praw administratora. Brak na serwerze innego konta z prawami administratora" -#: cps/admin.py:505 cps/admin.py:519 +#: cps/admin.py:508 cps/admin.py:522 msgid "Value has to be true or false" msgstr "Wartość musi być prawdziwa lub fałszywa" -#: cps/admin.py:507 +#: cps/admin.py:510 msgid "Invalid role" msgstr "Nieprawidłowa rola" -#: cps/admin.py:511 +#: cps/admin.py:514 msgid "Guest can't have this view" msgstr "Gość nie może tego zobaczyć" -#: cps/admin.py:521 +#: cps/admin.py:524 msgid "Invalid view" msgstr "Nieprawidłowy widok" -#: cps/admin.py:524 +#: cps/admin.py:527 msgid "Guest's Locale is determined automatically and can't be set" msgstr "Lokalizacja gościa jest określana automatycznie i nie można jej ustawić" -#: cps/admin.py:528 +#: cps/admin.py:531 msgid "No Valid Locale Given" msgstr "Nie podano prawidłowej lokalizacji" -#: cps/admin.py:539 +#: cps/admin.py:542 msgid "No Valid Book Language Given" msgstr "Nie podano obowiązującego języka książki" -#: cps/admin.py:541 cps/editbooks.py:243 cps/editbooks.py:428 -#: cps/editbooks.py:430 +#: cps/admin.py:544 cps/editbooks.py:260 cps/editbooks.py:445 +#: cps/editbooks.py:447 msgid "Parameter not found" msgstr "Nie znaleziono parametru" -#: cps/admin.py:578 +#: cps/admin.py:581 msgid "Invalid Read Column" msgstr "Nieprawidłowa kolumna do odczytu" -#: cps/admin.py:584 +#: cps/admin.py:587 msgid "Invalid Restricted Column" msgstr "Nieprawidłowa zastrzeżona kolumna" -#: cps/admin.py:604 cps/admin.py:1903 +#: cps/admin.py:607 cps/admin.py:1981 msgid "Calibre-Web configuration updated" msgstr "Konfiguracja Calibre-Web została zaktualizowana" -#: cps/admin.py:616 +#: cps/admin.py:619 msgid "Do you really want to delete the Kobo Token?" msgstr "Czy na pewno chcesz usunąć Token Kobo?" -#: cps/admin.py:618 +#: cps/admin.py:621 msgid "Do you really want to delete this domain?" msgstr "Czy naprawdę chcesz usunąć tę domenę?" -#: cps/admin.py:620 +#: cps/admin.py:623 msgid "Do you really want to delete this user?" msgstr "Czy naprawdę chcesz usunąć tego użytkownika?" -#: cps/admin.py:622 +#: cps/admin.py:625 msgid "Do you really want to delete this book?" msgstr "Czy na pewnochcesz usunąć tą książkę?" -#: cps/admin.py:624 +#: cps/admin.py:627 msgid "Are you sure you want to delete this shelf?" msgstr "Czy na pewno chcesz usunąć półkę?" -#: cps/admin.py:626 +#: cps/admin.py:629 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Czy na pewno chcesz zmienić ustawienia lokalne wybranego użytkownika(ów)?" -#: cps/admin.py:628 +#: cps/admin.py:631 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "Czy na pewno chcesz zmienić widoczne języki książek dla wybranego użytkownika (użytkowników)?" -#: cps/admin.py:630 +#: cps/admin.py:633 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "Czy na pewno chcesz zmienić wybraną rolę dla wybranego użytkownika (użytkowników)?" -#: cps/admin.py:632 +#: cps/admin.py:635 msgid "Are you sure you want to change the archive status for the selected book(s)?" msgstr "Czy na pewno chcesz zmienić status archiwizacji dla wybranych książek?" -#: cps/admin.py:634 +#: cps/admin.py:637 msgid "Are you sure you want to change the read status for the selected book(s)?" msgstr "Czy na pewno chcesz zmienić stan przeczytania dla danych książek?" -#: cps/admin.py:636 +#: cps/admin.py:639 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Czy na pewno chcesz zmienić wybrane ograniczenia dla wybranego użytkownika(ów)?" -#: cps/admin.py:638 +#: cps/admin.py:641 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "Czy na pewno chcesz zmienić wybrane ograniczenia widoczności dla wybranego użytkownika(ów)?" -#: cps/admin.py:641 +#: cps/admin.py:644 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Czy na pewno chcesz zmienić zachowanie synchronizacji półek dla wybranego użytkownika(ów)?" -#: cps/admin.py:643 +#: cps/admin.py:646 msgid "Are you sure you want to change Calibre library location?" msgstr "Czy na pewno chcesz zmienić lokalizację biblioteki Calibre?" -#: cps/admin.py:645 +#: cps/admin.py:648 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "Calibre-Web wyszuka i zaktualizuje okładki i miniaturki, to może zająć chwilę." -#: cps/admin.py:648 +#: cps/admin.py:651 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Czy na pewno chcesz usunąć bazę synchronizacji Calibre-Web i wymusić ponowną pełną synchronizację z twoim czytnikiem Kobo?" -#: cps/admin.py:891 cps/admin.py:897 cps/admin.py:907 cps/admin.py:917 +#: cps/admin.py:894 cps/admin.py:900 cps/admin.py:910 cps/admin.py:920 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Zabroń" -#: cps/admin.py:893 cps/admin.py:899 cps/admin.py:909 cps/admin.py:919 +#: cps/admin.py:896 cps/admin.py:902 cps/admin.py:912 cps/admin.py:922 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Zezwalaj" -#: cps/admin.py:952 +#: cps/admin.py:955 #, python-brace-format msgid "{} sync entries deleted" msgstr "Usunięto {} wpisów synchronizacyjnych" -#: cps/admin.py:993 +#: cps/admin.py:996 msgid "Tag not found" msgstr "Nie znaleziono tagu." -#: cps/admin.py:1011 +#: cps/admin.py:1014 msgid "Invalid Action" msgstr "Nieprawidłowe działanie" -#: cps/admin.py:1138 +#: cps/admin.py:1137 +#, python-format +msgid "Invalid reverse proxy trusted IP/CIDR entry: %(entry)s" +msgstr "" + +#: cps/admin.py:1148 +#, python-format +msgid "Invalid %(label)s: %(value)s" +msgstr "" + +#: cps/admin.py:1166 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json nie został skonfigurowany dla aplikacji webowej" -#: cps/admin.py:1183 +#: cps/admin.py:1211 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "Lokalizacja pliku dziennika jest nieprawidłowa, wprowadź poprawną ścieżkę" -#: cps/admin.py:1189 +#: cps/admin.py:1217 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "Lokalizacja pliku dziennika dostępu jest nieprawidłowa, wprowadź poprawną ścieżkę" -#: cps/admin.py:1223 +#: cps/admin.py:1251 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Wprowadź dostawcę LDAP, port, nazwę wyróżniającą i identyfikator obiektu użytkownika" -#: cps/admin.py:1229 +#: cps/admin.py:1257 msgid "Please Enter a LDAP Service Account and Password" msgstr "Proszę wprowadzić konto i hasło usługi LDAP" -#: cps/admin.py:1232 +#: cps/admin.py:1260 msgid "Please Enter a LDAP Service Account" msgstr "Proszę wprowadzić konto usługi LDAP" -#: cps/admin.py:1237 +#: cps/admin.py:1265 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "Filtr obiektów grupy LDAP musi mieć jeden identyfikator formatu \"% s\"" -#: cps/admin.py:1239 +#: cps/admin.py:1267 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "Filtr obiektów grupy LDAP ma niedopasowany nawias" -#: cps/admin.py:1243 +#: cps/admin.py:1271 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "Filtr obiektów użytkownika LDAP musi mieć jeden identyfikator formatu \"% s\"" -#: cps/admin.py:1245 +#: cps/admin.py:1273 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "Filtr obiektów użytkownika LDAP ma niedopasowany nawias" -#: cps/admin.py:1252 +#: cps/admin.py:1280 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "Filtr użytkownika członka LDAP musi mieć jedno \"%s\" identyfikator formatu" -#: cps/admin.py:1254 +#: cps/admin.py:1282 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "Filtr użytkownika członka LDAP ma niedopasowane nawiasy" -#: cps/admin.py:1261 +#: cps/admin.py:1289 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "Główny urząd certyfikatu LDAP, Certyfikat lub Lokalizacja Klucza nie jest prawidłowa, Proszę wprowadzić poprawną ścieżkę" -#: cps/admin.py:1292 cps/templates/admin.html:53 +#: cps/admin.py:1320 cps/templates/admin.html:53 msgid "Add New User" msgstr "Dodaj nowego użytkownika" -#: cps/admin.py:1301 cps/templates/admin.html:100 +#: cps/admin.py:1329 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Zmień ustawienia SMTP" -#: cps/admin.py:1320 +#: cps/admin.py:1348 msgid "Success! Gmail Account Verified." msgstr "Sukces! Konto Gmail zostało zweryfikowane." -#: cps/admin.py:1340 cps/admin.py:1343 cps/admin.py:1728 cps/admin.py:1887 -#: cps/admin.py:1985 cps/admin.py:2106 cps/editbooks.py:169 -#: cps/editbooks.py:755 cps/editbooks.py:1474 cps/shelf.py:90 cps/shelf.py:144 +#: cps/admin.py:1368 cps/admin.py:1371 cps/admin.py:1756 cps/admin.py:1965 +#: cps/admin.py:2063 cps/admin.py:2184 cps/editbooks.py:170 +#: cps/editbooks.py:772 cps/editbooks.py:1518 cps/shelf.py:90 cps/shelf.py:144 #: cps/shelf.py:194 cps/shelf.py:237 cps/shelf.py:287 cps/shelf.py:327 -#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:160 cps/web.py:1526 +#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:161 cps/web.py:1536 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Błąd bazy danych: %(error)s." -#: cps/admin.py:1350 +#: cps/admin.py:1378 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Email testowy na %(email)s został dodany do kolejki, sprawdź zakładkę Zadania aby sprawdzić rezultat. " -#: cps/admin.py:1353 +#: cps/admin.py:1381 #, 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:1355 +#: cps/admin.py:1383 msgid "Please configure your e-mail address first..." msgstr "Najpierw skonfiguruj swój adres e-mail..." -#: cps/admin.py:1357 +#: cps/admin.py:1385 msgid "Email Server Settings updated" msgstr "Zaktualizowano ustawienia serwera poczty e-mail" -#: cps/admin.py:1380 cps/templates/admin.html:195 +#: cps/admin.py:1408 cps/templates/admin.html:211 msgid "Edit Scheduled Tasks Settings" msgstr "Zmodyfikuj ustawienia zaplanowanych zadań." -#: cps/admin.py:1392 +#: cps/admin.py:1420 msgid "Invalid start time for task specified" msgstr "Ustawiono nieprawidłowy czas rozpoczęcia zadania." -#: cps/admin.py:1397 +#: cps/admin.py:1425 msgid "Invalid duration for task specified" msgstr "Ustawiono nieprawidłowy czas trwania zadania." -#: cps/admin.py:1407 +#: cps/admin.py:1435 msgid "Scheduled tasks settings updated" msgstr "Zaktualizowano ustawienia zaplanowanych zadań." -#: cps/admin.py:1417 cps/admin.py:1466 cps/admin.py:2102 cps/web.py:1325 +#: cps/admin.py:1445 cps/admin.py:1494 cps/admin.py:2180 cps/web.py:1335 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Wystąpił nieznany błąd. Spróbuj ponownie później." -#: cps/admin.py:1421 +#: cps/admin.py:1449 msgid "Settings DB is not Writeable" msgstr "Brak uprawnień do zapisu bazy danych ustawień." -#: cps/admin.py:1451 cps/admin.py:2094 +#: cps/admin.py:1479 cps/admin.py:2172 #, python-format msgid "Edit User %(nick)s" msgstr "Edytuj użytkownika %(nick)s" # ??? -#: cps/admin.py:1463 +#: cps/admin.py:1491 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "Sukces! Zresetowano hasło dla użytkownika %(user)s" -#: cps/admin.py:1469 +#: cps/admin.py:1497 msgid "Oops! Please configure the SMTP mail settings." msgstr "Ups! Proszę skonfiguruj ustawienia SMTP dla email." -#: cps/admin.py:1480 +#: cps/admin.py:1508 msgid "Logfile viewer" msgstr "Przeglądanie dziennika" -#: cps/admin.py:1546 +#: cps/admin.py:1574 msgid "Requesting update package" msgstr "Żądanie o pakiet aktualizacji" -#: cps/admin.py:1547 +#: cps/admin.py:1575 msgid "Downloading update package" msgstr "Pobieranie pakietu aktualizacji" -#: cps/admin.py:1548 +#: cps/admin.py:1576 msgid "Unzipping update package" msgstr "Rozpakowywanie pakietu aktualizacji" # ??? -#: cps/admin.py:1549 +#: cps/admin.py:1577 msgid "Replacing files" msgstr "Zastępowanie plików" -#: cps/admin.py:1550 +#: cps/admin.py:1578 msgid "Database connections are closed" msgstr "Połączenia z bazą danych zostały zakończone" -#: cps/admin.py:1551 +#: cps/admin.py:1579 msgid "Stopping server" msgstr "Zatrzymywanie serwera" -#: cps/admin.py:1552 +#: cps/admin.py:1580 msgid "Update finished, please press okay and reload page" msgstr "Aktualizacja zakończona, proszę nacisnąć OK i odświeżyć stronę" -#: cps/admin.py:1553 cps/admin.py:1554 cps/admin.py:1555 cps/admin.py:1556 -#: cps/admin.py:1557 cps/admin.py:1558 +#: cps/admin.py:1581 cps/admin.py:1582 cps/admin.py:1583 cps/admin.py:1584 +#: cps/admin.py:1585 cps/admin.py:1586 msgid "Update failed:" msgstr "Aktualizacja nieudana:" -#: cps/admin.py:1553 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1581 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "Błąd HTTP" -#: cps/admin.py:1554 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1582 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Błąd połączenia" -#: cps/admin.py:1555 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1583 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Przekroczono limit czasu podczas nawiązywania połączenia" -#: cps/admin.py:1556 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1584 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Błąd ogólny" -#: cps/admin.py:1557 +#: cps/admin.py:1585 msgid "Update file could not be saved in temp dir" msgstr "Plik aktualizacyjny nie mógł zostać zapisany do tymczasowego folderu" -#: cps/admin.py:1558 +#: cps/admin.py:1586 msgid "Files could not be replaced during update" msgstr "Nie udało się zamienić plików podczas aktualizacji" -#: cps/admin.py:1582 +#: cps/admin.py:1610 msgid "Failed to extract at least One LDAP User" msgstr "Nie udało się znaleźć żadnego użytkownika z LDAP." -#: cps/admin.py:1627 +#: cps/admin.py:1655 msgid "Failed to Create at Least One LDAP User" msgstr "Błąd przy tworzeniu przynajmniej jednego użytkownika LDAP" -#: cps/admin.py:1640 +#: cps/admin.py:1668 #, python-format msgid "Error: %(ldaperror)s" msgstr "Błąd: %(ldaperror)s" -#: cps/admin.py:1644 +#: cps/admin.py:1672 msgid "Error: No user returned in response of LDAP server" msgstr "Błąd. LDAP nie zwrócił żadnego użytkownika" -#: cps/admin.py:1680 +#: cps/admin.py:1708 msgid "At Least One LDAP User Not Found in Database" msgstr "Przynajmniej jeden użytkownik LDAP nie został znaleziony w bazie danych" -#: cps/admin.py:1682 +#: cps/admin.py:1710 #, python-brace-format msgid "{} User Successfully Imported" msgstr "{} Użytkownik pomyślnie zaimportowany" -#: cps/admin.py:1740 +#: cps/admin.py:1768 msgid "Books path not valid" msgstr "Nieprawidłowa ścieżka do książek." -#: cps/admin.py:1746 +#: cps/admin.py:1774 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "Lokalizacja bazy danych jest nieprawidłowa, wprowadź poprawną ścieżkę" -#: cps/admin.py:1774 +#: cps/admin.py:1802 msgid "DB is not Writeable" msgstr "Baza danych nie jest zapisywalna" -#: cps/admin.py:1788 +#: cps/admin.py:1816 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "Lokalizacja pliku klucza jest nieprawidłowa, wprowadź poprawną ścieżkę" -#: cps/admin.py:1792 +#: cps/admin.py:1820 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "Lokalizacja pliku certyfikatu jest nieprawidłowa, wprowadź poprawną ścieżkę" -#: cps/admin.py:1872 +#: cps/admin.py:1846 +msgid "Kepubify binary not found" +msgstr "" + +#: cps/admin.py:1894 +msgid "reverse proxy login header name" +msgstr "" + +#: cps/admin.py:1904 +msgid "reverse proxy shared secret header name" +msgstr "" + +#: cps/admin.py:1913 +msgid "Please configure both reverse proxy shared secret header name and secret" +msgstr "" + +#: cps/admin.py:1917 +msgid "Please configure reverse proxy shared secret header name and secret or disable the feature" +msgstr "" + +#: cps/admin.py:1922 +msgid "Please configure at least one trusted reverse proxy IP or CIDR" +msgstr "" + +#: cps/admin.py:1946 msgid "Password length has to be between 1 and 40" msgstr "Hasło musi mieć między 1 a 40 znaków." -#: cps/admin.py:1926 +#: cps/admin.py:1957 cps/helper.py:1007 +msgid "Please specify a valid UnRar directory" +msgstr "" + +#: cps/admin.py:2004 msgid "Database Settings updated" msgstr "Zaktualizowano ustawienia bazy danych" -#: cps/admin.py:1934 +#: cps/admin.py:2012 msgid "Database Configuration" msgstr "Konfiguracja bazy danych" -#: cps/admin.py:1949 cps/web.py:1295 +#: cps/admin.py:2027 cps/web.py:1305 msgid "Oops! Please complete all fields." msgstr "Proszę wypełnić wszystkie pola!" -#: cps/admin.py:1958 +#: cps/admin.py:2036 msgid "E-mail is not from valid domain" msgstr "E-mail nie pochodzi z prawidłowej domeny" -#: cps/admin.py:1964 +#: cps/admin.py:2042 msgid "Add new user" msgstr "Dodaj nowego użytkownika" -#: cps/admin.py:1975 +#: cps/admin.py:2053 #, python-format msgid "User '%(user)s' created" msgstr "Użytkownik '%(user)s' został utworzony" -#: cps/admin.py:1981 +#: cps/admin.py:2059 msgid "Oops! An account already exists for this Email. or name." msgstr "Znaleziono istniejące konto dla tego adresu e-mail lub nazwy." -#: cps/admin.py:2011 +#: cps/admin.py:2089 #, python-format msgid "User '%(nick)s' deleted" msgstr "Użytkownik '%(nick)s' został usunięty" -#: cps/admin.py:2014 +#: cps/admin.py:2092 msgid "Can't delete Guest User" msgstr "Nie udało się usunąć konta gościa" -#: cps/admin.py:2017 +#: cps/admin.py:2095 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:2072 cps/web.py:1475 +#: cps/admin.py:2150 cps/web.py:1485 msgid "Email can't be empty and has to be a valid Email" msgstr "Email nie może być pusty i musi być prawidłowy" -#: cps/admin.py:2098 +#: cps/admin.py:2176 #, python-format msgid "User '%(nick)s' updated" msgstr "Użytkownik '%(nick)s' został zaktualizowany" @@ -546,145 +585,153 @@ msgstr "Użytkownik '%(nick)s' został zaktualizowany" msgid "Search" msgstr "Szukaj" -#: cps/converter.py:31 +#: cps/converter.py:32 msgid "not installed" msgstr "nie zainstalowane" -#: cps/converter.py:32 +#: cps/converter.py:33 msgid "Execution permissions missing" msgstr "Brak uprawnienia do wykonywania pliku" -#: cps/db.py:1129 cps/templates/config_edit.html:207 +#: cps/db.py:1129 cps/templates/config_edit.html:229 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:565 cps/web.py:599 cps/web.py:644 cps/web.py:684 cps/web.py:711 -#: cps/web.py:998 cps/web.py:1028 cps/web.py:1073 cps/web.py:1101 -#: cps/web.py:1140 +#: cps/web.py:567 cps/web.py:601 cps/web.py:646 cps/web.py:686 cps/web.py:713 +#: cps/web.py:1000 cps/web.py:1030 cps/web.py:1075 cps/web.py:1103 +#: cps/web.py:1142 msgid "None" msgstr "Brak" -#: cps/editbooks.py:155 +#: cps/editbooks.py:156 #, python-format msgid "File %(file)s uploaded" msgstr "Wysłano plik %(file)s" -#: cps/editbooks.py:184 +#: cps/editbooks.py:185 msgid "Source or destination format for conversion missing" msgstr "Brak formatu źródłowego lub docelowego do konwersji" -#: cps/editbooks.py:192 +#: cps/editbooks.py:189 cps/editbooks.py:197 +msgid "Source format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:201 +msgid "Destination format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:209 #, 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:196 +#: cps/editbooks.py:213 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Podczas konwersji książki wystąpił błąd: %(res)s" -#: cps/editbooks.py:297 +#: cps/editbooks.py:314 msgid "Changes successfully applied" msgstr "Zmiany zostały poprawnie zaaplikowane." -#: cps/editbooks.py:317 +#: cps/editbooks.py:334 msgid "Value is missing on request" msgstr "Brakująca wartość w zapytaniu" -#: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 -#: cps/editbooks.py:1146 cps/web.py:532 cps/web.py:1567 cps/web.py:1613 -#: cps/web.py:1663 +#: cps/editbooks.py:336 cps/editbooks.py:343 cps/editbooks.py:644 +#: cps/editbooks.py:1170 cps/web.py:534 cps/web.py:1577 cps/web.py:1623 +#: cps/web.py:1673 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Błąd otwierania e-booka. Plik nie istnieje lub jest niedostępny" -#: cps/editbooks.py:673 cps/editbooks.py:1503 +#: cps/editbooks.py:690 cps/editbooks.py:1547 msgid "User has no rights to upload cover" msgstr "Użytkownik nie ma uprawnień do wgrywania okładek" -#: cps/editbooks.py:694 cps/editbooks.py:938 +#: cps/editbooks.py:711 cps/editbooks.py:961 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "W identyfikatorach nie jest rozróżniana wielkość liter, nadpisywanie starego identyfikatora" -#: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 +#: cps/editbooks.py:726 cps/editbooks.py:935 cps/editbooks.py:1306 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "'%(langname)s' nie jest prawidłowym językiem" -#: cps/editbooks.py:737 +#: cps/editbooks.py:754 msgid "Metadata successfully updated" msgstr "Metadane zostały pomyślnie zaktualizowane" -#: cps/editbooks.py:760 +#: cps/editbooks.py:777 #, python-brace-format msgid "Error editing book: {}" msgstr "Błąd podczas edycji książki: {}" -#: cps/editbooks.py:856 +#: cps/editbooks.py:879 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "Wysłana książka prawdopodobnie istnieje w bibliotece, rozważ zmianę przed przesłaniem nowej: " -#: cps/editbooks.py:950 cps/editbooks.py:1420 +#: cps/editbooks.py:973 cps/editbooks.py:1464 msgid "File type isn't allowed to be uploaded to this server" msgstr "Ten typ pliku nie jest dozwolony na serwerze." -#: cps/editbooks.py:956 cps/editbooks.py:1431 +#: cps/editbooks.py:979 cps/editbooks.py:1475 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "Rozszerzenie pliku '%(ext)s' nie jest dozwolone do wysłania na ten serwer" -#: cps/editbooks.py:960 cps/editbooks.py:1436 +#: cps/editbooks.py:983 cps/editbooks.py:1480 msgid "File to be uploaded must have an extension" msgstr "Plik do wysłania musi mieć rozszerzenie" -#: cps/editbooks.py:968 +#: cps/editbooks.py:992 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "Nie można zapisać pliku %(filename)s w katalogu tymczasowym" -#: cps/editbooks.py:988 +#: cps/editbooks.py:1012 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Nie udało się przenieść pliku okładki %(file)s:%(error)s" -#: cps/editbooks.py:1041 +#: cps/editbooks.py:1065 msgid "Book Format Successfully Deleted" msgstr "Plik książki w wybranym formacie został usunięty" -#: cps/editbooks.py:1044 cps/editbooks.py:1061 +#: cps/editbooks.py:1068 cps/editbooks.py:1085 msgid "Book Successfully Deleted" msgstr "Książka została usunięta" -#: cps/editbooks.py:1065 +#: cps/editbooks.py:1089 msgid "You are missing permissions to delete books" msgstr "Nie masz uprawnień do usuwania książek" -#: cps/editbooks.py:1139 +#: cps/editbooks.py:1163 #, python-brace-format msgid "Book with id \"{}\" could not be deleted: not found" msgstr "Książka z id \"{}\" nie mogła zostać usunięta, ponieważ nie istnieje" -#: cps/editbooks.py:1181 +#: cps/editbooks.py:1205 msgid "edit metadata" msgstr "edytuj metadane" -#: cps/editbooks.py:1234 +#: cps/editbooks.py:1267 #, python-format msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "Indeks: %(seriesindex)s nie jest prawidłową liczbą, pomijam" -#: cps/editbooks.py:1425 +#: cps/editbooks.py:1469 msgid "User has no rights to upload additional file formats" msgstr "Użytkownik nie ma uprawnień do wgrywania dodatkowych formatów plików" -#: cps/editbooks.py:1449 +#: cps/editbooks.py:1493 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Nie udało się utworzyć łącza %(path)s (Odmowa dostępu)." -#: cps/editbooks.py:1456 +#: cps/editbooks.py:1500 #, python-format msgid "Failed to store file %(file)s." msgstr "Nie można zapisać pliku %(file)s." -#: cps/editbooks.py:1481 +#: cps/editbooks.py:1525 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Format pliku %(ext)s dodany do %(book)s" @@ -695,9 +742,9 @@ msgstr "Proszę poczekać minutę przed rejestracją kolejnego użytkownika." #: cps/error_handler.py:108 cps/templates/layout.html:69 #: cps/templates/layout.html:104 cps/templates/login.html:27 -#: cps/templates/register.html:17 cps/web.py:1292 cps/web.py:1296 -#: cps/web.py:1302 cps/web.py:1326 cps/web.py:1330 cps/web.py:1343 -#: cps/web.py:1346 +#: cps/templates/register.html:17 cps/web.py:1302 cps/web.py:1306 +#: cps/web.py:1312 cps/web.py:1336 cps/web.py:1340 cps/web.py:1353 +#: cps/web.py:1356 msgid "Register" msgstr "Zarejestruj się" @@ -718,7 +765,7 @@ msgstr "Zwrotna domena nie jest zweryfikowana, proszę zweryfikowania domenę w msgid "%(format)s format not found for book id: %(book)d" msgstr "Nie znaleziono formatu %(format)s dla id książki: %(book)d" -#: cps/helper.py:94 cps/tasks/convert.py:91 +#: cps/helper.py:94 cps/tasks/convert.py:92 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "Nie znaleziono %(format)s na Google Drive: %(fn)s" @@ -906,10 +953,6 @@ msgstr "Jako plik okładki dopuszczalne są jedynie pliki jpg/jpeg" msgid "Cover" msgstr "Okładka" -#: cps/helper.py:1006 -msgid "UnRar binary file not found" -msgstr "Plik wykonywalny programu unrar nie znaleziony" - #: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "Błąd podczas uruchamiania UnRar" @@ -940,7 +983,7 @@ msgstr "Brakuje uprawnień do wykonywania: %(missing)s" msgid "Error executing Calibre" msgstr "Błąd podczas uruchamiania Calibre" -#: cps/helper.py:1154 cps/templates/admin.html:216 +#: cps/helper.py:1154 cps/templates/admin.html:232 msgid "Queue all books for metadata backup" msgstr "Zaplanuj backup metadanych dla wszystkich książek" @@ -963,7 +1006,7 @@ msgstr "Zarejestruj się %(provider)s" msgid "This %(oauth)s account is already linked to a different user" msgstr "" -#: cps/oauth_bb.py:147 cps/remotelogin.py:131 +#: cps/oauth_bb.py:147 cps/remotelogin.py:150 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "zalogowałeś się jako: '%(nickname)s'" @@ -1031,25 +1074,29 @@ msgstr "Błąd Google Oauth: {}" msgid "{} Stars" msgstr "{} Gwiazdek" -#: cps/remotelogin.py:63 cps/templates/layout.html:68 -#: cps/templates/layout.html:103 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1361 -msgid "Login" -msgstr "Zaloguj się" - -#: cps/remotelogin.py:75 cps/remotelogin.py:109 +#: cps/remotelogin.py:46 cps/remotelogin.py:128 msgid "Token not found" msgstr "Nie znaleziono tokenu" -#: cps/remotelogin.py:84 cps/remotelogin.py:117 +#: cps/remotelogin.py:55 cps/remotelogin.py:136 msgid "Token has expired" msgstr "Token wygasł" -#: cps/remotelogin.py:93 +#: cps/remotelogin.py:86 cps/remotelogin.py:112 cps/templates/layout.html:68 +#: cps/templates/layout.html:103 cps/templates/login.html:4 +#: cps/templates/login.html:21 cps/web.py:1371 +msgid "Login" +msgstr "Zaloguj się" + +#: cps/remotelogin.py:100 +msgid "Token already approved" +msgstr "" + +#: cps/remotelogin.py:108 msgid "Success! Please return to your device" msgstr "Powodzenie! Wróć do swojego urządzenia" -#: cps/render_template.py:41 cps/web.py:421 +#: cps/render_template.py:41 cps/web.py:423 msgid "Books" msgstr "Książki" @@ -1074,7 +1121,7 @@ msgstr "Pobrane książki" msgid "Show Downloaded Books" msgstr "Pokaż pobrane książki" -#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:436 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:438 msgid "Top Rated Books" msgstr "Najwyżej ocenione" @@ -1083,7 +1130,7 @@ msgid "Show Top Rated Books" msgstr "Pokaż menu najwyżej ocenionych książek" #: cps/render_template.py:61 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:769 +#: cps/templates/index.xml:67 cps/web.py:771 msgid "Read Books" msgstr "Przeczytane" @@ -1092,7 +1139,7 @@ msgid "Show Read and Unread" msgstr "Pokaż przeczytanie i nieprzeczytani" #: cps/render_template.py:65 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:772 +#: cps/templates/index.xml:74 cps/web.py:774 msgid "Unread Books" msgstr "Nieprzeczytane" @@ -1110,7 +1157,7 @@ msgid "Show Random Books" msgstr "Pokazuj losowe książki" #: cps/render_template.py:71 cps/templates/book_table.html:93 -#: cps/templates/index.xml:97 cps/web.py:1144 +#: cps/templates/index.xml:97 cps/web.py:1146 msgid "Categories" msgstr "Kategorie" @@ -1120,7 +1167,7 @@ msgstr "Pokaż sekcję kategorii" #: cps/render_template.py:74 cps/templates/book_edit.html:86 #: cps/templates/book_table.html:94 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1034 cps/web.py:1046 +#: cps/templates/search_form.html:70 cps/web.py:1036 cps/web.py:1048 msgid "Series" msgstr "Cykle" @@ -1138,7 +1185,7 @@ msgid "Show Author Section" msgstr "Pokaż sekcję autorów" #: cps/render_template.py:81 cps/templates/book_table.html:98 -#: cps/templates/index.xml:88 cps/web.py:1002 +#: cps/templates/index.xml:88 cps/web.py:1004 msgid "Publishers" msgstr "Wydawcy" @@ -1148,7 +1195,7 @@ msgstr "Pokaż sekcję wydawnictw" #: cps/render_template.py:84 cps/templates/book_table.html:96 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1116 +#: cps/web.py:1118 msgid "Languages" msgstr "Języki" @@ -1172,7 +1219,7 @@ msgstr "Formaty plików" msgid "Show File Formats Section" msgstr "Pokaż sekcję formatów plików" -#: cps/render_template.py:95 cps/web.py:795 +#: cps/render_template.py:95 cps/web.py:797 msgid "Archived Books" msgstr "Zarchiwizowane książki" @@ -1180,7 +1227,7 @@ msgstr "Zarchiwizowane książki" msgid "Show Archived Books" msgstr "Pokaż sekcję zarchiwizowanych książek" -#: cps/render_template.py:100 cps/web.py:831 +#: cps/render_template.py:100 cps/web.py:833 msgid "Books List" msgstr "Lista książek" @@ -1413,150 +1460,154 @@ msgstr "Dostępna jest nowa aktualizacja. Kliknij przycisk poniżej, aby zaktual msgid "No release information available" msgstr "Brak dostępnych informacji o wersji" -#: cps/templates/index.html:6 cps/web.py:448 +#: cps/templates/index.html:6 cps/web.py:450 msgid "Discover (Random Books)" msgstr "Odkrywaj (losowe książki)" -#: cps/web.py:484 +#: cps/web.py:486 msgid "Hot Books (Most Downloaded)" msgstr "Najpopularniejsze książki (najczęściej pobierane)" -#: cps/web.py:515 +#: cps/web.py:517 #, python-format msgid "Downloaded books by %(user)s" msgstr "Książki pobrane przez %(user)s" -#: cps/web.py:548 +#: cps/web.py:550 #, python-format msgid "Author: %(name)s" msgstr "Autor: %(name)s" -#: cps/web.py:584 +#: cps/web.py:586 #, python-format msgid "Publisher: %(name)s" msgstr "Wydawca: %(name)s" -#: cps/web.py:612 +#: cps/web.py:614 #, python-format msgid "Series: %(serie)s" msgstr "Cykl: %(serie)s" -#: cps/web.py:626 +#: cps/web.py:628 msgid "Rating: None" msgstr "Ocena: Brak" -#: cps/web.py:635 +#: cps/web.py:637 #, python-format msgid "Rating: %(rating)s stars" msgstr "Ocena: %(rating)s gwiazdek" -#: cps/web.py:666 +#: cps/web.py:668 #, python-format msgid "File format: %(format)s" msgstr "Format pliku: %(format)s" -#: cps/web.py:701 +#: cps/web.py:703 #, python-format msgid "Category: %(name)s" msgstr "Kategoria: %(name)s" -#: cps/web.py:730 +#: cps/web.py:732 #, python-format msgid "Language: %(name)s" msgstr "Język: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:974 +#: cps/templates/admin.html:16 cps/web.py:976 msgid "Downloads" msgstr "DLS" -#: cps/web.py:1076 +#: cps/web.py:1078 msgid "Ratings list" msgstr "Lista z ocenami" -#: cps/web.py:1103 +#: cps/web.py:1105 msgid "File formats list" msgstr "Lista formatów" -#: cps/web.py:1264 +#: cps/web.py:1272 +msgid "Book format not supported" +msgstr "" + +#: cps/web.py:1274 msgid "Please configure the SMTP mail settings first..." msgstr "Proszę najpierw skonfigurować ustawienia SMTP poczty." -#: cps/web.py:1270 +#: cps/web.py:1280 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Książka została umieszczona w kolejce do wysłania do %(eReadermail)s" -#: cps/web.py:1273 +#: cps/web.py:1283 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Wystąpił błąd podczas wysyłania tej książki: %(res)s" -#: cps/web.py:1275 +#: cps/web.py:1285 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Ups! Zaktualizuj swój profil używając poprawnego adresu email czytnika." -#: cps/web.py:1291 cps/web.py:1342 +#: cps/web.py:1301 cps/web.py:1352 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "Serwer e-mail nie jest skonfigurowany, skontaktuj się z administratorem!" -#: cps/web.py:1328 +#: cps/web.py:1338 msgid "Oops! Your Email is not allowed." msgstr ".Twój e-mail nie może się zarejestrować" -#: cps/web.py:1331 +#: cps/web.py:1341 msgid "Success! Confirmation Email has been sent." msgstr "Wiadomość e-mail z potwierdzeniem została wysłana na Twoje konto e-mail." -#: cps/web.py:1376 cps/web.py:1390 +#: cps/web.py:1386 cps/web.py:1400 msgid "Cannot activate LDAP authentication" msgstr "Nie udało się aktywować autoryzacji za pomocą LDAP" -#: cps/web.py:1399 +#: cps/web.py:1409 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "jesteś zalogowany jako: '%(nickname)s'" -#: cps/web.py:1406 +#: cps/web.py:1416 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Logowanie awaryjne jako: ‘%(nickname)s’, serwer LDAP jest nieosiągalny lub użytkownik nie jest znany." -#: cps/web.py:1411 +#: cps/web.py:1421 #, python-format msgid "Could not login: %(message)s" msgstr "Nie udało się zalogować: %(message)s" -#: cps/web.py:1415 cps/web.py:1440 +#: cps/web.py:1425 cps/web.py:1450 msgid "Wrong Username or Password" msgstr "Nieprawidłowy login lub hasło" -#: cps/web.py:1422 +#: cps/web.py:1432 msgid "New Password was sent to your email address" msgstr "Nowe hasło zostało wysłane na twój adres email" -#: cps/web.py:1426 +#: cps/web.py:1436 msgid "An unknown error occurred. Please try again later." msgstr "Wystąpił nieznany błąd. Proszę spróbować później." -#: cps/web.py:1428 +#: cps/web.py:1438 msgid "Please enter valid username to reset password" msgstr "Proszę wprowadzić prawidłowy login do resetu hasła" -#: cps/web.py:1436 +#: cps/web.py:1446 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Jesteś zalogowany jako: '%(nickname)s'" -#: cps/web.py:1501 cps/web.py:1551 +#: cps/web.py:1511 cps/web.py:1561 #, python-format msgid "%(name)s's Profile" msgstr "Profil użytkownika %(name)s" -#: cps/web.py:1517 +#: cps/web.py:1527 msgid "Success! Profile Updated" msgstr "Sukces! Zaktualizowano profil" -#: cps/web.py:1521 +#: cps/web.py:1531 msgid "Oops! An account already exists for this Email." msgstr "Znaleziono istniejące konto dla tego adresu e-mail." @@ -1568,46 +1619,46 @@ msgstr "Nie znaleziono poprawnego pliku gmail.json z informacjami OAuth" msgid "Delete temp folder contents" msgstr "Usuń zawartość folderu tymczasowego" -#: cps/tasks/convert.py:112 +#: cps/tasks/convert.py:113 #, python-format msgid "%(book)s send to E-Reader" msgstr "%(book)s wysłano na czytnik" -#: cps/tasks/convert.py:177 +#: cps/tasks/convert.py:180 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Nie znaleziono narzędzia calibre %(tool)s do konwertowania" -#: cps/tasks/convert.py:211 +#: cps/tasks/convert.py:214 #, python-format msgid "%(format)s format not found on disk" msgstr "Nie znaleziono na dysku formatu %(format)s" -#: cps/tasks/convert.py:215 +#: cps/tasks/convert.py:218 msgid "Ebook converter failed with unknown error" msgstr "Konwertowanie ebooka zakończyło się niepowodzeniem z nieznanego powodu" -#: cps/tasks/convert.py:234 +#: cps/tasks/convert.py:237 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify-converter spowodowało błąd: %(error)s" -#: cps/tasks/convert.py:254 +#: cps/tasks/convert.py:257 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Konwertowany plik nie został znaleziony, lub więcej niż jeden plik w folderze %(folder)s" -#: cps/tasks/convert.py:291 cps/tasks/convert.py:342 +#: cps/tasks/convert.py:294 cps/tasks/convert.py:345 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre zakończyło się błędem: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:322 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Konwertowanie nie powiodło się: %(error)s" -#: cps/tasks/convert.py:347 +#: cps/tasks/convert.py:350 msgid "Convert" msgstr "Konwertuj" @@ -1696,7 +1747,7 @@ msgstr "Edycja" # ??? #: cps/templates/admin.html:25 cps/templates/book_edit.html:17 #: cps/templates/book_table.html:131 cps/templates/book_table.html:180 -#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:115 +#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:117 #: cps/templates/user_edit.html:67 cps/templates/user_table.html:149 msgid "Delete" msgstr "Usuń" @@ -1786,128 +1837,145 @@ msgstr "Zdalne logowanie (Magic Link)" msgid "Reverse Proxy Login" msgstr "Logowanie reverse proxy" -#: cps/templates/admin.html:154 cps/templates/config_edit.html:176 +#: cps/templates/admin.html:154 cps/templates/config_edit.html:180 msgid "Reverse Proxy Header Name" msgstr "Nazwa nagłowka reverse proxy" -#: cps/templates/admin.html:159 +#: cps/templates/admin.html:158 +msgid "Reverse Proxy Trusted IPs/CIDRs" +msgstr "" + +#: cps/templates/admin.html:162 cps/templates/config_edit.html:193 +msgid "Reverse Proxy Shared Secret Header Name" +msgstr "" + +#: cps/templates/admin.html:166 +msgid "Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/admin.html:170 +msgid "Reverse Proxy Shared Secret Configured" +msgstr "" + +#: cps/templates/admin.html:175 msgid "Edit Calibre Database Configuration" msgstr "Edytuj konfigurację bazy danych Calibre" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:176 msgid "Edit Basic Configuration" msgstr "Edytuj podstawową konfigurację" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:177 msgid "Edit UI Configuration" msgstr "Edytuj konfigurację interfejsu" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:183 msgid "Scheduled Tasks" msgstr "Zaplanowane zadania" -#: cps/templates/admin.html:170 cps/templates/schedule_edit.html:12 +#: cps/templates/admin.html:186 cps/templates/schedule_edit.html:12 #: cps/templates/tasks.html:18 msgid "Start Time" msgstr "Czas początkowy" -#: cps/templates/admin.html:174 cps/templates/schedule_edit.html:20 +#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:20 msgid "Maximum Duration" msgstr "Maksymalna długość" -#: cps/templates/admin.html:178 cps/templates/schedule_edit.html:29 +#: cps/templates/admin.html:194 cps/templates/schedule_edit.html:29 msgid "Generate Thumbnails" msgstr "Wygeneruj miniaturki" -#: cps/templates/admin.html:182 +#: cps/templates/admin.html:198 msgid "Generate series cover thumbnails" msgstr "Wygeneruj miniaturki dla serii" -#: cps/templates/admin.html:186 cps/templates/admin.html:208 +#: cps/templates/admin.html:202 cps/templates/admin.html:224 #: cps/templates/schedule_edit.html:37 msgid "Reconnect Calibre Database" msgstr "Połącz ponownie z bazą danych Calibre" -#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 +#: cps/templates/admin.html:206 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" msgstr "Wygeneruj kopie zapasową plików z metadanymi" -#: cps/templates/admin.html:197 +#: cps/templates/admin.html:213 msgid "Refresh Thumbnail Cache" msgstr "Zresetuj cache miniaturek" -#: cps/templates/admin.html:203 +#: cps/templates/admin.html:219 msgid "Administration" msgstr "Zarządzanie" -#: cps/templates/admin.html:204 +#: cps/templates/admin.html:220 msgid "Download Debug Package" msgstr "Pobierz pakiet Debug" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:221 msgid "View Logs" msgstr "Podgląd dziennika" -#: cps/templates/admin.html:211 +#: cps/templates/admin.html:227 msgid "Restart" msgstr "Uruchom ponownie Calibre Web" -#: cps/templates/admin.html:212 +#: cps/templates/admin.html:228 msgid "Shutdown" msgstr "Zatrzymaj Calibre Web" -#: cps/templates/admin.html:221 +#: cps/templates/admin.html:237 msgid "Version Information" msgstr "Informacje o wersji" -#: cps/templates/admin.html:225 +#: cps/templates/admin.html:241 msgid "Version" msgstr "Wersja" -#: cps/templates/admin.html:226 +#: cps/templates/admin.html:242 msgid "Details" msgstr "Szczegóły" -#: cps/templates/admin.html:232 +#: cps/templates/admin.html:248 msgid "Current Version" msgstr "Bieżąca wersja" -#: cps/templates/admin.html:239 +#: cps/templates/admin.html:255 msgid "Check for Update" msgstr "Sprawdź aktualizacje" -#: cps/templates/admin.html:240 +#: cps/templates/admin.html:256 msgid "Perform Update" msgstr "Wykonaj aktualizację" -#: cps/templates/admin.html:253 +#: cps/templates/admin.html:269 msgid "Are you sure you want to restart?" msgstr "Na pewno chcesz uruchomić ponownie Calibre Web?" -#: cps/templates/admin.html:258 cps/templates/admin.html:272 -#: cps/templates/admin.html:292 cps/templates/config_db.html:82 +#: cps/templates/admin.html:274 cps/templates/admin.html:288 +#: cps/templates/admin.html:308 cps/templates/config_db.html:82 msgid "OK" msgstr "OK" -#: cps/templates/admin.html:259 cps/templates/admin.html:273 +#: cps/templates/admin.html:275 cps/templates/admin.html:289 #: cps/templates/book_edit.html:220 cps/templates/book_table.html:162 #: cps/templates/book_table.html:181 cps/templates/book_table.html:201 #: cps/templates/book_table.html:221 cps/templates/book_table.html:241 #: cps/templates/book_table.html:261 cps/templates/book_table.html:316 -#: cps/templates/config_db.html:66 cps/templates/config_edit.html:431 +#: cps/templates/config_db.html:66 cps/templates/config_edit.html:453 #: cps/templates/config_view_edit.html:175 cps/templates/detail.html:350 -#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:98 -#: cps/templates/modal_dialogs.html:116 cps/templates/modal_dialogs.html:134 +#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:100 +#: cps/templates/modal_dialogs.html:118 cps/templates/modal_dialogs.html:136 +#: cps/templates/remote_login_verify.html:16 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 #: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Anuluj" -#: cps/templates/admin.html:271 +#: cps/templates/admin.html:287 msgid "Are you sure you want to shutdown?" msgstr "Na pewno chcesz zatrzymać Calibre Web?" -#: cps/templates/admin.html:283 +#: cps/templates/admin.html:299 msgid "Updating, please do not reload this page" msgstr "Aktualizowanie, proszę nie odświeżać strony" @@ -2151,7 +2219,7 @@ msgid "Fetch Metadata" msgstr "Uzyskaj metadane" #: cps/templates/book_edit.html:219 cps/templates/config_db.html:65 -#: cps/templates/config_edit.html:430 cps/templates/config_view_edit.html:174 +#: cps/templates/config_edit.html:452 cps/templates/config_view_edit.html:174 #: cps/templates/email_edit.html:65 cps/templates/schedule_edit.html:44 #: cps/templates/shelf_edit.html:25 cps/templates/shelf_order.html:41 #: cps/templates/user_edit.html:142 @@ -2524,214 +2592,234 @@ msgstr "Klucz API do Google Books" msgid "Allow Reverse Proxy Authentication" msgstr "Zezwalaj na uwierzytelnianie reverse proxy" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:176 +msgid "Security Warning" +msgstr "" + +#: cps/templates/config_edit.html:177 +msgid "Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled." +msgstr "" + +#: cps/templates/config_edit.html:184 +msgid "Reverse Proxy Trusted IPs/CIDRs (Comma Separated)" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "Enable Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/config_edit.html:197 +msgid "Reverse Proxy Shared Secret" +msgstr "" + +#: cps/templates/config_edit.html:205 msgid "Login type" msgstr "Rodzaj logowania" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:207 msgid "Use Standard Authentication" msgstr "Użyj standardowego uwierzytelnienia" -#: cps/templates/config_edit.html:187 +#: cps/templates/config_edit.html:209 msgid "Use LDAP Authentication" msgstr "Użyj uwierzytelniania LDAP" -#: cps/templates/config_edit.html:190 +#: cps/templates/config_edit.html:212 msgid "Use OAuth" msgstr "Uzyj OAuth" -#: cps/templates/config_edit.html:197 +#: cps/templates/config_edit.html:219 msgid "LDAP Server Host Name or IP Address" msgstr "Nazwa hosta lub adres IP serwera LDAP" -#: cps/templates/config_edit.html:201 +#: cps/templates/config_edit.html:223 msgid "LDAP Server Port" msgstr "Port serwera LDAP" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:227 msgid "LDAP Encryption" msgstr "Szyfrowanie LDAP" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:230 msgid "TLS" msgstr "TLS" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:231 msgid "SSL" msgstr "SSL" -#: cps/templates/config_edit.html:213 +#: cps/templates/config_edit.html:235 msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" msgstr "Ścieżka certyfikatu urzędu certyfikacji LDAP (wymagana tylko dla uwierzytelniania certyfikatu klienta)" -#: cps/templates/config_edit.html:220 +#: cps/templates/config_edit.html:242 msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" msgstr "Ścieżka certyfikatu LDAP (potrzebna tylko do uwierzytelniania certyfikatem klienta)" -#: cps/templates/config_edit.html:227 +#: cps/templates/config_edit.html:249 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" msgstr "Ścieżka pliku klucza LDAP (wymagana tylko dla uwierzytelniania certyfikatem klienta)" -#: cps/templates/config_edit.html:236 +#: cps/templates/config_edit.html:258 msgid "LDAP Authentication" msgstr "Uwierzytelnianie LDAP" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:260 msgid "Anonymous" msgstr "Anonim" -#: cps/templates/config_edit.html:239 +#: cps/templates/config_edit.html:261 msgid "Unauthenticated" msgstr "Nieuwierzytelniony" -#: cps/templates/config_edit.html:240 +#: cps/templates/config_edit.html:262 msgid "Simple" msgstr "Proste" -#: cps/templates/config_edit.html:245 +#: cps/templates/config_edit.html:267 msgid "LDAP Administrator Username" msgstr "Nazwa administratora LDAP" -#: cps/templates/config_edit.html:251 +#: cps/templates/config_edit.html:273 msgid "LDAP Administrator Password" msgstr "Hasło administratora LDAP" -#: cps/templates/config_edit.html:256 +#: cps/templates/config_edit.html:278 msgid "LDAP Distinguished Name (DN)" msgstr "LDAP Distinguished Name (DN)" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:282 msgid "LDAP User Object Filter" msgstr "LDAP User Object Filter" -#: cps/templates/config_edit.html:265 +#: cps/templates/config_edit.html:287 msgid "LDAP Server is OpenLDAP?" msgstr "Serwer LDAP to OpenLDAP?" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:289 msgid "Following Settings are Needed For User Import" msgstr "Następujące ustawienia są niezbędne dla zaimportowania użytkowników" -#: cps/templates/config_edit.html:269 +#: cps/templates/config_edit.html:291 msgid "LDAP Group Object Filter" msgstr "Filtr obiektów grupy LDAP" -#: cps/templates/config_edit.html:273 +#: cps/templates/config_edit.html:295 msgid "LDAP Group Name" msgstr "Nazwa grupy LDAP" -#: cps/templates/config_edit.html:277 +#: cps/templates/config_edit.html:299 msgid "LDAP Group Members Field" msgstr "Pola członków grupy LDAP" -#: cps/templates/config_edit.html:281 +#: cps/templates/config_edit.html:303 msgid "LDAP Member User Filter Detection" msgstr "Wykrywanie filtra użytkownika członka LDAP" -#: cps/templates/config_edit.html:283 +#: cps/templates/config_edit.html:305 msgid "Autodetect" msgstr "Autodetekcja" -#: cps/templates/config_edit.html:284 +#: cps/templates/config_edit.html:306 msgid "Custom Filter" msgstr "Filtr niestandardowy" -#: cps/templates/config_edit.html:289 +#: cps/templates/config_edit.html:311 msgid "LDAP Member User Filter" msgstr "Filtr użytkownika członka LDAP" -#: cps/templates/config_edit.html:300 +#: cps/templates/config_edit.html:322 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "Uzyskaj %(provider)s OAuth Credential" -#: cps/templates/config_edit.html:303 +#: cps/templates/config_edit.html:325 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "%(provider)s OAuth Client Id" -#: cps/templates/config_edit.html:307 +#: cps/templates/config_edit.html:329 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "%(provider)s OAuth Client Secret" -#: cps/templates/config_edit.html:323 +#: cps/templates/config_edit.html:345 msgid "External binaries" msgstr "Zewnętrzne pliki" -#: cps/templates/config_edit.html:329 +#: cps/templates/config_edit.html:351 msgid "Path to Calibre Binaries" msgstr "Ścieżka do plików binarnych Calibre" -#: cps/templates/config_edit.html:337 +#: cps/templates/config_edit.html:359 msgid "Calibre E-Book Converter Settings" msgstr "Ustawienia konwertera calibre" -#: cps/templates/config_edit.html:340 +#: cps/templates/config_edit.html:362 msgid "Path to Kepubify E-Book Converter" msgstr "Ścieżka do konwertera Kepubify" -#: cps/templates/config_edit.html:348 +#: cps/templates/config_edit.html:370 msgid "Location of Unrar binary" msgstr "Ścieżka do plików binarnych Unrar" -#: cps/templates/config_edit.html:364 +#: cps/templates/config_edit.html:386 msgid "Security Settings" msgstr "Ustawienia bezpieczeństwa" -#: cps/templates/config_edit.html:372 +#: cps/templates/config_edit.html:394 msgid "Limit failed login attempts" msgstr "Ogranicz liczbę nieudanych prób logowania" -#: cps/templates/config_edit.html:376 +#: cps/templates/config_edit.html:398 msgid "Configure Backend for Limiter" msgstr "Skonfiguruj backend dla limitera" -#: cps/templates/config_edit.html:380 +#: cps/templates/config_edit.html:402 msgid "Options for Limiter Backend" msgstr "Ustawienia dla backend limitera" -#: cps/templates/config_edit.html:386 +#: cps/templates/config_edit.html:408 msgid "Check if file extensions matches file content on upload" msgstr "Sprawdź czy rozszerzenie pliku jest zgodne z zawartością pliku podczas wgrywania" -#: cps/templates/config_edit.html:389 +#: cps/templates/config_edit.html:411 msgid "Session protection" msgstr "Bezpieczeństwo sesji" -#: cps/templates/config_edit.html:391 +#: cps/templates/config_edit.html:413 msgid "Basic" msgstr "Bazowe" -#: cps/templates/config_edit.html:392 +#: cps/templates/config_edit.html:414 msgid "Strong" msgstr "Silne" -#: cps/templates/config_edit.html:397 +#: cps/templates/config_edit.html:419 msgid "User Password policy" msgstr "Polityka haseł użytkowników" -#: cps/templates/config_edit.html:401 +#: cps/templates/config_edit.html:423 msgid "Minimum password length" msgstr "Minimalna długość hasła" -#: cps/templates/config_edit.html:406 +#: cps/templates/config_edit.html:428 msgid "Enforce number" msgstr "Wymuś cyfrę" -#: cps/templates/config_edit.html:410 +#: cps/templates/config_edit.html:432 msgid "Enforce lowercase characters" msgstr "Wymuś małe znaki" -#: cps/templates/config_edit.html:414 +#: cps/templates/config_edit.html:436 msgid "Enforce uppercase characters" msgstr "Wymuś duże znaki" -#: cps/templates/config_edit.html:418 +#: cps/templates/config_edit.html:440 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" msgstr "Wymuś znaki (wymagane dla Chińskich/Japońskich/Koreańskich Znaków)" -#: cps/templates/config_edit.html:422 +#: cps/templates/config_edit.html:444 msgid "Enforce special characters" msgstr "Wymuś znaki specjalne" @@ -3200,27 +3288,27 @@ msgstr "Książki muszą najpierw zostać zarchiwizowane a urządzenie zsynchron msgid "Choose File Location" msgstr "Wybierz lokalizację pliku" -#: cps/templates/modal_dialogs.html:81 +#: cps/templates/modal_dialogs.html:82 msgid "type" msgstr "typ" -#: cps/templates/modal_dialogs.html:82 +#: cps/templates/modal_dialogs.html:83 msgid "name" msgstr "nazwa" -#: cps/templates/modal_dialogs.html:83 +#: cps/templates/modal_dialogs.html:84 msgid "size" msgstr "rozmiar" -#: cps/templates/modal_dialogs.html:89 +#: cps/templates/modal_dialogs.html:90 msgid "Parent Directory" msgstr "Główny katalog" -#: cps/templates/modal_dialogs.html:97 +#: cps/templates/modal_dialogs.html:99 msgid "Select" msgstr "Wybierz" -#: cps/templates/modal_dialogs.html:133 cps/templates/tasks.html:46 +#: cps/templates/modal_dialogs.html:135 cps/templates/tasks.html:46 msgid "Ok" msgstr "OK" @@ -3477,6 +3565,31 @@ msgstr "Gdy to zrobisz, automatycznie zalogujesz się na tym urządzeniu." msgid "This verification link will expire in 10 minutes." msgstr "Link wygaśnie po 10 minutach." +#: cps/templates/remote_login_verify.html:4 +msgid "Approve Magic Link Login" +msgstr "" + +#: cps/templates/remote_login_verify.html:5 +msgid "Review the device that requested access before approving this login." +msgstr "" + +#: cps/templates/remote_login_verify.html:7 +msgid "IP address" +msgstr "" + +#: cps/templates/remote_login_verify.html:9 +msgid "Browser" +msgstr "" + +#: cps/templates/remote_login_verify.html:12 +#, python-format +msgid "If you approve this request, the device that started it will be logged in as %(username)s." +msgstr "" + +#: cps/templates/remote_login_verify.html:15 +msgid "Approve Login" +msgstr "" + #: cps/templates/schedule_edit.html:33 msgid "Generate Series Cover Thumbnails" msgstr "Wygeneruj miniaturki dla Serii" diff --git a/cps/translations/pt/LC_MESSAGES/messages.mo b/cps/translations/pt/LC_MESSAGES/messages.mo index ba179ad965fa124b916b37936440557fe4d92076..b970a22dfb876d86c23df545282296961b310425 100644 GIT binary patch delta 12146 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\n" "Language: pt\n" @@ -13,519 +13,558 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" +"Generated-By: Babel 2.18.0\n" #: cps/about.py:85 msgid "Statistics" msgstr "Estatísticas" -#: cps/admin.py:151 +#: cps/admin.py:154 msgid "Server restarted, please reload page." msgstr "" -#: cps/admin.py:153 +#: cps/admin.py:156 msgid "Performing Server shutdown, please close window." msgstr "" -#: cps/admin.py:161 +#: cps/admin.py:164 msgid "Success! Database Reconnected" msgstr "Sucesso! Base de dados religada" -#: cps/admin.py:164 +#: cps/admin.py:167 msgid "Unknown command" msgstr "Comando desconhecido" -#: cps/admin.py:175 +#: cps/admin.py:178 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "" -#: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 -#: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 -#: cps/uploader.py:117 +#: cps/admin.py:211 cps/editbooks.py:825 cps/editbooks.py:875 +#: cps/editbooks.py:1564 cps/templates/remote_login_verify.html:8 +#: cps/templates/remote_login_verify.html:10 cps/updater.py:615 +#: cps/uploader.py:117 cps/uploader.py:126 msgid "Unknown" msgstr "Desconhecido" -#: cps/admin.py:233 +#: cps/admin.py:236 msgid "Admin page" msgstr "Página de administração" -#: cps/admin.py:253 +#: cps/admin.py:256 msgid "Basic Configuration" msgstr "Configuração básica" -#: cps/admin.py:291 +#: cps/admin.py:294 msgid "UI Configuration" msgstr "Configuração de IU" -#: cps/admin.py:315 cps/admin.py:1002 cps/db.py:809 cps/search.py:150 -#: cps/web.py:750 +#: cps/admin.py:318 cps/admin.py:1005 cps/db.py:809 cps/search.py:150 +#: cps/web.py:752 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "A coluna personalizada No.%(column)d não existe na base de dados do Calibre" -#: cps/admin.py:333 cps/templates/admin.html:51 +#: cps/admin.py:336 cps/templates/admin.html:51 msgid "Edit Users" msgstr "Editar utilizadores" -#: cps/admin.py:378 cps/opds.py:559 cps/templates/grid.html:14 +#: cps/admin.py:381 cps/opds.py:559 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Tudo" -#: cps/admin.py:401 cps/admin.py:1432 +#: cps/admin.py:404 cps/admin.py:1460 msgid "User not found" msgstr "Utilizador não encontrado" -#: cps/admin.py:415 +#: cps/admin.py:418 #, python-brace-format msgid "{} users deleted successfully" msgstr "{} utilizadores eliminados com sucesso" -#: cps/admin.py:438 cps/templates/config_view_edit.html:133 +#: cps/admin.py:441 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Mostrar tudo" -#: cps/admin.py:459 cps/admin.py:465 +#: cps/admin.py:462 cps/admin.py:468 msgid "Malformed request" msgstr "Pedido mal construído" -#: cps/admin.py:477 cps/admin.py:2078 +#: cps/admin.py:480 cps/admin.py:2156 msgid "Guest Name can't be changed" msgstr "Nome do convidado não pode ser alterado" -#: cps/admin.py:489 +#: cps/admin.py:492 msgid "Guest can't have this role" msgstr "Convidado não pode ter esta função" -#: cps/admin.py:501 cps/admin.py:2032 +#: cps/admin.py:504 cps/admin.py:2110 msgid "No admin user remaining, can't remove admin role" msgstr "Nenhum utilizador administrador restante, impossível remover a função de administrador" -#: cps/admin.py:505 cps/admin.py:519 +#: cps/admin.py:508 cps/admin.py:522 msgid "Value has to be true or false" msgstr "Valor tem de ser verdadeiro ou falso" -#: cps/admin.py:507 +#: cps/admin.py:510 msgid "Invalid role" msgstr "Função inválida" -#: cps/admin.py:511 +#: cps/admin.py:514 msgid "Guest can't have this view" msgstr "O convidado não podr ter esta vista" -#: cps/admin.py:521 +#: cps/admin.py:524 msgid "Invalid view" msgstr "Vista inválida" -#: cps/admin.py:524 +#: cps/admin.py:527 msgid "Guest's Locale is determined automatically and can't be set" msgstr "O idioma do convidado é detetado automaticamente e não pode ser alterado" -#: cps/admin.py:528 +#: cps/admin.py:531 msgid "No Valid Locale Given" msgstr "Nenhum idioma válido fornecido" -#: cps/admin.py:539 +#: cps/admin.py:542 msgid "No Valid Book Language Given" msgstr "Não foi indicado um idioma de livro válido" -#: cps/admin.py:541 cps/editbooks.py:243 cps/editbooks.py:428 -#: cps/editbooks.py:430 +#: cps/admin.py:544 cps/editbooks.py:260 cps/editbooks.py:445 +#: cps/editbooks.py:447 msgid "Parameter not found" msgstr "Parâmetro não encontrado" -#: cps/admin.py:578 +#: cps/admin.py:581 msgid "Invalid Read Column" msgstr "Coluna Lido é inválida" -#: cps/admin.py:584 +#: cps/admin.py:587 msgid "Invalid Restricted Column" msgstr "Coluna Restrito é inválida" -#: cps/admin.py:604 cps/admin.py:1903 +#: cps/admin.py:607 cps/admin.py:1981 msgid "Calibre-Web configuration updated" msgstr "Configuração do Calibre-Web atualizada" -#: cps/admin.py:616 +#: cps/admin.py:619 msgid "Do you really want to delete the Kobo Token?" msgstr "Quer realmente apagar a Kobo Token?" -#: cps/admin.py:618 +#: cps/admin.py:621 msgid "Do you really want to delete this domain?" msgstr "Quer realmente eliminar este domínio?" -#: cps/admin.py:620 +#: cps/admin.py:623 msgid "Do you really want to delete this user?" msgstr "Quer realmente apagar este utilizador?" -#: cps/admin.py:622 +#: cps/admin.py:625 msgid "Do you really want to delete this book?" msgstr "" -#: cps/admin.py:624 +#: cps/admin.py:627 msgid "Are you sure you want to delete this shelf?" msgstr "Tem a certeza de que quer apagar essa estante?" -#: cps/admin.py:626 +#: cps/admin.py:629 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Tem a certeza de que quer alterar o idioma dos utilizadores selecionados?" -#: cps/admin.py:628 +#: cps/admin.py:631 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "Tem a certeza de que quer alterar os idiomas de livros visíveis para os utilizadores selecionados?" -#: cps/admin.py:630 +#: cps/admin.py:633 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "Tem a certeza de que quer alterar a função selecionada para os utilizadores selecionados?" -#: cps/admin.py:632 +#: cps/admin.py:635 msgid "Are you sure you want to change the archive status for the selected book(s)?" msgstr "" -#: cps/admin.py:634 +#: cps/admin.py:637 msgid "Are you sure you want to change the read status for the selected book(s)?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:639 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Tem a certeza de que quer alterar as restrições selecionadas para os utilizadores selecionados?" -#: cps/admin.py:638 +#: cps/admin.py:641 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "Tem a certeza de de que quer alterar as restrições de visibilidade selecionadas para os utilizadores selecionados?" -#: cps/admin.py:641 +#: cps/admin.py:644 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Tem a certeza de que quer alterar o comportamento de sincronização da estante para os utilizadores selecionados?" -#: cps/admin.py:643 +#: cps/admin.py:646 msgid "Are you sure you want to change Calibre library location?" msgstr "Tem a certeza de que quer alterar a localização da biblioteca Calibre?" -#: cps/admin.py:645 +#: cps/admin.py:648 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "O Calibre-Web irá procurar por capas atualizadas e atualizará as miniaturas das capas. Isto poderá demorar um pouco" -#: cps/admin.py:648 +#: cps/admin.py:651 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Tem a certeza de que deseja apagar a base de dados de sincronização do Calibre-Web para forçar uma sincronização completa com seu Kobo Reader?" -#: cps/admin.py:891 cps/admin.py:897 cps/admin.py:907 cps/admin.py:917 +#: cps/admin.py:894 cps/admin.py:900 cps/admin.py:910 cps/admin.py:920 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Negar" -#: cps/admin.py:893 cps/admin.py:899 cps/admin.py:909 cps/admin.py:919 +#: cps/admin.py:896 cps/admin.py:902 cps/admin.py:912 cps/admin.py:922 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Permitir" -#: cps/admin.py:952 +#: cps/admin.py:955 #, python-brace-format msgid "{} sync entries deleted" msgstr "{} entradas de sincronização eliminadas" -#: cps/admin.py:993 +#: cps/admin.py:996 msgid "Tag not found" msgstr "Etiqueta não encontrada" -#: cps/admin.py:1011 +#: cps/admin.py:1014 msgid "Invalid Action" msgstr "Ação inválida" -#: cps/admin.py:1138 +#: cps/admin.py:1137 +#, python-format +msgid "Invalid reverse proxy trusted IP/CIDR entry: %(entry)s" +msgstr "" + +#: cps/admin.py:1148 +#, python-format +msgid "Invalid %(label)s: %(value)s" +msgstr "" + +#: cps/admin.py:1166 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json não está configurado para aplicação Web" -#: cps/admin.py:1183 +#: cps/admin.py:1211 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "A localização do ficheiro de historial não é válida. Por favor, digite um caminho correto" -#: cps/admin.py:1189 +#: cps/admin.py:1217 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "A localização do ficheiro de historial não é válida. Por favor, digite um caminho correto" -#: cps/admin.py:1223 +#: cps/admin.py:1251 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Digite um fornecedor LDAP, porta, DN e identificador de objeto do utilizador" -#: cps/admin.py:1229 +#: cps/admin.py:1257 msgid "Please Enter a LDAP Service Account and Password" msgstr "Por favor, digite uma conta de serviço LDAP e senha" -#: cps/admin.py:1232 +#: cps/admin.py:1260 msgid "Please Enter a LDAP Service Account" msgstr "Por favor, digite uma conta de serviço LDAP" -#: cps/admin.py:1237 +#: cps/admin.py:1265 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "O filtro de objeto de grupo LDAP precisa de ter um identificador de formato \"%s\"" -#: cps/admin.py:1239 +#: cps/admin.py:1267 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "Filtro de objeto de grupo LDAP tem parênteses não coincidentes" -#: cps/admin.py:1243 +#: cps/admin.py:1271 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "O filtro de objeto de utilizador LDAP precisa de ter um identificador de formato \"%s\"" -#: cps/admin.py:1245 +#: cps/admin.py:1273 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "Filtro de objeto de utilizador LDAP tem parênteses não coincidentes" -#: cps/admin.py:1252 +#: cps/admin.py:1280 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "O filtro de utilizador membro do LDAP precisa ter um identificador de formato \"%s\"" -#: cps/admin.py:1254 +#: cps/admin.py:1282 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "Filtro de utilizador de membro LDAP tem parênteses incomparáveis" -#: cps/admin.py:1261 +#: cps/admin.py:1289 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP Certificado CA: Localização inválida de certificado ou chave. Por favor, digite um caminho correto" -#: cps/admin.py:1292 cps/templates/admin.html:53 +#: cps/admin.py:1320 cps/templates/admin.html:53 msgid "Add New User" msgstr "Adicionar utilizador" -#: cps/admin.py:1301 cps/templates/admin.html:100 +#: cps/admin.py:1329 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Editar configurações do servidor de email" -#: cps/admin.py:1320 +#: cps/admin.py:1348 msgid "Success! Gmail Account Verified." msgstr "Sucesso! Conta Gmail verificada" -#: cps/admin.py:1340 cps/admin.py:1343 cps/admin.py:1728 cps/admin.py:1887 -#: cps/admin.py:1985 cps/admin.py:2106 cps/editbooks.py:169 -#: cps/editbooks.py:755 cps/editbooks.py:1474 cps/shelf.py:90 cps/shelf.py:144 +#: cps/admin.py:1368 cps/admin.py:1371 cps/admin.py:1756 cps/admin.py:1965 +#: cps/admin.py:2063 cps/admin.py:2184 cps/editbooks.py:170 +#: cps/editbooks.py:772 cps/editbooks.py:1518 cps/shelf.py:90 cps/shelf.py:144 #: cps/shelf.py:194 cps/shelf.py:237 cps/shelf.py:287 cps/shelf.py:327 -#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:160 cps/web.py:1526 +#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:161 cps/web.py:1536 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Erro de base de dados: %(error)s." -#: cps/admin.py:1350 +#: cps/admin.py:1378 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Email de teste enviado para lista de espera para envio para %(email)s. Por favor, verifique o resultado em Tarefas" -#: cps/admin.py:1353 +#: cps/admin.py:1381 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Ocorreu um erro ao enviar o email de teste: %(res)s" -#: cps/admin.py:1355 +#: cps/admin.py:1383 msgid "Please configure your e-mail address first..." msgstr "Por favor, primeiro configure seu endereço de email..." -#: cps/admin.py:1357 +#: cps/admin.py:1385 msgid "Email Server Settings updated" msgstr "Atualização das configurações do servidor de email" -#: cps/admin.py:1380 cps/templates/admin.html:195 +#: cps/admin.py:1408 cps/templates/admin.html:211 msgid "Edit Scheduled Tasks Settings" msgstr "Editar configurações de tarefas agendadas" -#: cps/admin.py:1392 +#: cps/admin.py:1420 msgid "Invalid start time for task specified" msgstr "Hora de início inválida para a tarefa especificada" -#: cps/admin.py:1397 +#: cps/admin.py:1425 msgid "Invalid duration for task specified" msgstr "Duração inválida para a tarefa especificada" -#: cps/admin.py:1407 +#: cps/admin.py:1435 msgid "Scheduled tasks settings updated" msgstr "Foram atualizadas as configurações de tarefas agendadas" -#: cps/admin.py:1417 cps/admin.py:1466 cps/admin.py:2102 cps/web.py:1325 +#: cps/admin.py:1445 cps/admin.py:1494 cps/admin.py:2180 cps/web.py:1335 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Ocorreu um erro desconhecido. Por favor, tente novamente mais tarde." -#: cps/admin.py:1421 +#: cps/admin.py:1449 msgid "Settings DB is not Writeable" msgstr "Configuaração da DB não é gravável" -#: cps/admin.py:1451 cps/admin.py:2094 +#: cps/admin.py:1479 cps/admin.py:2172 #, python-format msgid "Edit User %(nick)s" msgstr "Editar utilizador %(nick)s" -#: cps/admin.py:1463 +#: cps/admin.py:1491 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "" -#: cps/admin.py:1469 +#: cps/admin.py:1497 msgid "Oops! Please configure the SMTP mail settings." msgstr "" -#: cps/admin.py:1480 +#: cps/admin.py:1508 msgid "Logfile viewer" msgstr "Visualizador do historial" -#: cps/admin.py:1546 +#: cps/admin.py:1574 msgid "Requesting update package" msgstr "A solicitar pacote de atualização" -#: cps/admin.py:1547 +#: cps/admin.py:1575 msgid "Downloading update package" msgstr "A descarregar pacote de atualização" -#: cps/admin.py:1548 +#: cps/admin.py:1576 msgid "Unzipping update package" msgstr "A descomprimir pacote de atualização" -#: cps/admin.py:1549 +#: cps/admin.py:1577 msgid "Replacing files" msgstr "A substituir ficheiros" -#: cps/admin.py:1550 +#: cps/admin.py:1578 msgid "Database connections are closed" msgstr "As ligações à base de dados estão fechadas" -#: cps/admin.py:1551 +#: cps/admin.py:1579 msgid "Stopping server" msgstr "A parar o servidor" -#: cps/admin.py:1552 +#: cps/admin.py:1580 msgid "Update finished, please press okay and reload page" msgstr "Atualização concluída, pressione OK e refresque a página" -#: cps/admin.py:1553 cps/admin.py:1554 cps/admin.py:1555 cps/admin.py:1556 -#: cps/admin.py:1557 cps/admin.py:1558 +#: cps/admin.py:1581 cps/admin.py:1582 cps/admin.py:1583 cps/admin.py:1584 +#: cps/admin.py:1585 cps/admin.py:1586 msgid "Update failed:" msgstr "Atualização falhou:" -#: cps/admin.py:1553 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1581 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "Erro HTTP" -#: cps/admin.py:1554 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1582 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Erro de ligação" -#: cps/admin.py:1555 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1583 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Tempo limite ao estabelecer a ligação" -#: cps/admin.py:1556 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1584 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Erro geral" -#: cps/admin.py:1557 +#: cps/admin.py:1585 msgid "Update file could not be saved in temp dir" msgstr "Ficheiro de atualização não pode ser guardado na pasta temporária" -#: cps/admin.py:1558 +#: cps/admin.py:1586 msgid "Files could not be replaced during update" msgstr "Não foi possível substituir ficheiros durante a atualização" -#: cps/admin.py:1582 +#: cps/admin.py:1610 msgid "Failed to extract at least One LDAP User" msgstr "Falha ao extrair pelo menos um utilizador LDAP" -#: cps/admin.py:1627 +#: cps/admin.py:1655 msgid "Failed to Create at Least One LDAP User" msgstr "Falha ao criar pelo menos um utilizador LDAP" -#: cps/admin.py:1640 +#: cps/admin.py:1668 #, python-format msgid "Error: %(ldaperror)s" msgstr "Erro: %(ldaperror)s" -#: cps/admin.py:1644 +#: cps/admin.py:1672 msgid "Error: No user returned in response of LDAP server" msgstr "Erro: Nenhum utilizador devolvido na resposta do servidor LDAP" -#: cps/admin.py:1680 +#: cps/admin.py:1708 msgid "At Least One LDAP User Not Found in Database" msgstr "No mínimo um utilizador LDAP não encontrado no base de dados" -#: cps/admin.py:1682 +#: cps/admin.py:1710 #, python-brace-format msgid "{} User Successfully Imported" msgstr "{} utilizador importado com sucesso" -#: cps/admin.py:1740 +#: cps/admin.py:1768 msgid "Books path not valid" msgstr "" -#: cps/admin.py:1746 +#: cps/admin.py:1774 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "A localização da base de dados não é válida. Por favor, digite o caminho correto" -#: cps/admin.py:1774 +#: cps/admin.py:1802 msgid "DB is not Writeable" msgstr "DB não é gravável" -#: cps/admin.py:1788 +#: cps/admin.py:1816 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "Localização do ficheiro de chaves não é válida. Por favor, digite o caminho correto" -#: cps/admin.py:1792 +#: cps/admin.py:1820 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "Localização do ficheiro de certificados não é válida. Por favor, digite o caminho correto" -#: cps/admin.py:1872 +#: cps/admin.py:1846 +msgid "Kepubify binary not found" +msgstr "" + +#: cps/admin.py:1894 +msgid "reverse proxy login header name" +msgstr "" + +#: cps/admin.py:1904 +msgid "reverse proxy shared secret header name" +msgstr "" + +#: cps/admin.py:1913 +msgid "Please configure both reverse proxy shared secret header name and secret" +msgstr "" + +#: cps/admin.py:1917 +msgid "Please configure reverse proxy shared secret header name and secret or disable the feature" +msgstr "" + +#: cps/admin.py:1922 +msgid "Please configure at least one trusted reverse proxy IP or CIDR" +msgstr "" + +#: cps/admin.py:1946 msgid "Password length has to be between 1 and 40" msgstr "A dimensão da senha deve estar entre 1 e 40" -#: cps/admin.py:1926 +#: cps/admin.py:1957 cps/helper.py:1007 +msgid "Please specify a valid UnRar directory" +msgstr "" + +#: cps/admin.py:2004 msgid "Database Settings updated" msgstr "Configurações da base de dados atualizadas" -#: cps/admin.py:1934 +#: cps/admin.py:2012 msgid "Database Configuration" msgstr "Configuração da base de dados" -#: cps/admin.py:1949 cps/web.py:1295 +#: cps/admin.py:2027 cps/web.py:1305 msgid "Oops! Please complete all fields." msgstr "Por favor, preencha todos os campos!" -#: cps/admin.py:1958 +#: cps/admin.py:2036 msgid "E-mail is not from valid domain" msgstr "O email não é de um domínio válido" -#: cps/admin.py:1964 +#: cps/admin.py:2042 msgid "Add new user" msgstr "Adicionar novo utilizador" -#: cps/admin.py:1975 +#: cps/admin.py:2053 #, python-format msgid "User '%(user)s' created" msgstr "Criado utilizador '%(user)s'" -#: cps/admin.py:1981 +#: cps/admin.py:2059 msgid "Oops! An account already exists for this Email. or name." msgstr "Já existe uma conta para este endereço de email ou nome." -#: cps/admin.py:2011 +#: cps/admin.py:2089 #, python-format msgid "User '%(nick)s' deleted" msgstr "Utilizador '%(nick)s' eliminado" -#: cps/admin.py:2014 +#: cps/admin.py:2092 msgid "Can't delete Guest User" msgstr "Impossível eliminar convidado" -#: cps/admin.py:2017 +#: cps/admin.py:2095 msgid "No admin user remaining, can't delete user" msgstr "Nenhum utilizador administrador restante, não é possível eliminar o utilizador" -#: cps/admin.py:2072 cps/web.py:1475 +#: cps/admin.py:2150 cps/web.py:1485 msgid "Email can't be empty and has to be a valid Email" msgstr "O email não pode estar vazio e tem de ser válido" -#: cps/admin.py:2098 +#: cps/admin.py:2176 #, python-format msgid "User '%(nick)s' updated" msgstr "Utilizador '%(nick)s' atualizado" @@ -538,145 +577,153 @@ msgstr "Utilizador '%(nick)s' atualizado" msgid "Search" msgstr "Pesquisar" -#: cps/converter.py:31 +#: cps/converter.py:32 msgid "not installed" msgstr "não instalado" -#: cps/converter.py:32 +#: cps/converter.py:33 msgid "Execution permissions missing" msgstr "Falta de permissões de execução" -#: cps/db.py:1129 cps/templates/config_edit.html:207 +#: cps/db.py:1129 cps/templates/config_edit.html:229 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:565 cps/web.py:599 cps/web.py:644 cps/web.py:684 cps/web.py:711 -#: cps/web.py:998 cps/web.py:1028 cps/web.py:1073 cps/web.py:1101 -#: cps/web.py:1140 +#: cps/web.py:567 cps/web.py:601 cps/web.py:646 cps/web.py:686 cps/web.py:713 +#: cps/web.py:1000 cps/web.py:1030 cps/web.py:1075 cps/web.py:1103 +#: cps/web.py:1142 msgid "None" msgstr "Nenhum" -#: cps/editbooks.py:155 +#: cps/editbooks.py:156 #, python-format msgid "File %(file)s uploaded" msgstr "Ficheiro %(file)s enviado" -#: cps/editbooks.py:184 +#: cps/editbooks.py:185 msgid "Source or destination format for conversion missing" msgstr "Formato de origem ou destino para conversão está em falta" -#: cps/editbooks.py:192 +#: cps/editbooks.py:189 cps/editbooks.py:197 +msgid "Source format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:201 +msgid "Destination format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:209 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Livro enviado com sucesso para lista de espera de conversão para %(book_format)s" -#: cps/editbooks.py:196 +#: cps/editbooks.py:213 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Ocorreu um erro ao converter este livro: %(res)s" -#: cps/editbooks.py:297 +#: cps/editbooks.py:314 msgid "Changes successfully applied" msgstr "" -#: cps/editbooks.py:317 +#: cps/editbooks.py:334 msgid "Value is missing on request" msgstr "" -#: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 -#: cps/editbooks.py:1146 cps/web.py:532 cps/web.py:1567 cps/web.py:1613 -#: cps/web.py:1663 +#: cps/editbooks.py:336 cps/editbooks.py:343 cps/editbooks.py:644 +#: cps/editbooks.py:1170 cps/web.py:534 cps/web.py:1577 cps/web.py:1623 +#: cps/web.py:1673 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Oops! O Livro selecionado não está disponível. O ficheiro não existe ou não está acessível" -#: cps/editbooks.py:673 cps/editbooks.py:1503 +#: cps/editbooks.py:690 cps/editbooks.py:1547 msgid "User has no rights to upload cover" msgstr "Utilizador não tem permissão para carregar capas" -#: cps/editbooks.py:694 cps/editbooks.py:938 +#: cps/editbooks.py:711 cps/editbooks.py:961 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "Os identificadores não diferenciam maiúsculas de minúsculas, substituindo o identificador antigo" -#: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 +#: cps/editbooks.py:726 cps/editbooks.py:935 cps/editbooks.py:1306 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "%(langname)s não é um idioma válido" -#: cps/editbooks.py:737 +#: cps/editbooks.py:754 msgid "Metadata successfully updated" msgstr "Metadados atualizados com sucesso" -#: cps/editbooks.py:760 +#: cps/editbooks.py:777 #, python-brace-format msgid "Error editing book: {}" msgstr "Erro ao editar o livro: {}" -#: cps/editbooks.py:856 +#: cps/editbooks.py:879 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "O livro carregado provavelmente existe na biblioteca, considere alterar antes de carregar novo: " -#: cps/editbooks.py:950 cps/editbooks.py:1420 +#: cps/editbooks.py:973 cps/editbooks.py:1464 msgid "File type isn't allowed to be uploaded to this server" msgstr "" -#: cps/editbooks.py:956 cps/editbooks.py:1431 +#: cps/editbooks.py:979 cps/editbooks.py:1475 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "A extensão de ficheiro '%(ext)s' não pode ser enviada para este servidor" -#: cps/editbooks.py:960 cps/editbooks.py:1436 +#: cps/editbooks.py:983 cps/editbooks.py:1480 msgid "File to be uploaded must have an extension" msgstr "O ficheiro a ser carregado deve ter uma extensão" -#: cps/editbooks.py:968 +#: cps/editbooks.py:992 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "O ficheiro %(filename)s não foi possível ser guardado na pasta temporária" -#: cps/editbooks.py:988 +#: cps/editbooks.py:1012 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Falha ao mover ficheiro de capa %(file)s: %(error)s" -#: cps/editbooks.py:1041 +#: cps/editbooks.py:1065 msgid "Book Format Successfully Deleted" msgstr "Formato de livro eliminado com sucesso" -#: cps/editbooks.py:1044 cps/editbooks.py:1061 +#: cps/editbooks.py:1068 cps/editbooks.py:1085 msgid "Book Successfully Deleted" msgstr "Livro eliminado com sucesso" -#: cps/editbooks.py:1065 +#: cps/editbooks.py:1089 msgid "You are missing permissions to delete books" msgstr "Não tem permissões para apagar livros" -#: cps/editbooks.py:1139 +#: cps/editbooks.py:1163 #, python-brace-format msgid "Book with id \"{}\" could not be deleted: not found" msgstr "" -#: cps/editbooks.py:1181 +#: cps/editbooks.py:1205 msgid "edit metadata" msgstr "editar metadados" -#: cps/editbooks.py:1234 +#: cps/editbooks.py:1267 #, python-format msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1425 +#: cps/editbooks.py:1469 msgid "User has no rights to upload additional file formats" msgstr "Utilizador não tem direitos para carregar formatos de ficheiro adicionais" -#: cps/editbooks.py:1449 +#: cps/editbooks.py:1493 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Falha ao criar o caminho %(path)s (Permissão negada)." -#: cps/editbooks.py:1456 +#: cps/editbooks.py:1500 #, python-format msgid "Failed to store file %(file)s." msgstr "Falha ao armazenar o ficheiro %(file)s." -#: cps/editbooks.py:1481 +#: cps/editbooks.py:1525 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Formato de ficheiro %(ext)s adicionado a %(book)s" @@ -687,9 +734,9 @@ msgstr "Por favor, aguarde um minuto para registar o próximo utilizador" #: cps/error_handler.py:108 cps/templates/layout.html:69 #: cps/templates/layout.html:104 cps/templates/login.html:27 -#: cps/templates/register.html:17 cps/web.py:1292 cps/web.py:1296 -#: cps/web.py:1302 cps/web.py:1326 cps/web.py:1330 cps/web.py:1343 -#: cps/web.py:1346 +#: cps/templates/register.html:17 cps/web.py:1302 cps/web.py:1306 +#: cps/web.py:1312 cps/web.py:1336 cps/web.py:1340 cps/web.py:1353 +#: cps/web.py:1356 msgid "Register" msgstr "Registar" @@ -710,7 +757,7 @@ msgstr "O domínio Callback não foi verificado. Por favor, siga os passos para msgid "%(format)s format not found for book id: %(book)d" msgstr "Formato %(format)s não encontrado para o ID do livro: %(book)d" -#: cps/helper.py:94 cps/tasks/convert.py:91 +#: cps/helper.py:94 cps/tasks/convert.py:92 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s não encontrado no Google Drive: %(fn)s" @@ -896,10 +943,6 @@ msgstr "Apenas ficheiros jpg/jpeg são suportados como ficheiros de capa" msgid "Cover" msgstr "" -#: cps/helper.py:1006 -msgid "UnRar binary file not found" -msgstr "Binário UnRar não encontrado" - #: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "" @@ -930,7 +973,7 @@ msgstr "" msgid "Error executing Calibre" msgstr "" -#: cps/helper.py:1154 cps/templates/admin.html:216 +#: cps/helper.py:1154 cps/templates/admin.html:232 msgid "Queue all books for metadata backup" msgstr "Enviar todos os livros para lista de espera para cópia de segurança de metadados" @@ -952,7 +995,7 @@ msgstr "Autentique-se com %(provider)s" msgid "This %(oauth)s account is already linked to a different user" msgstr "" -#: cps/oauth_bb.py:147 cps/remotelogin.py:131 +#: cps/oauth_bb.py:147 cps/remotelogin.py:150 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "Sucesso! Agora está autenticado como: '%(nickname)s'" @@ -1020,25 +1063,29 @@ msgstr "Erro no Oauth do Google: {}" msgid "{} Stars" msgstr "{} Estrelas" -#: cps/remotelogin.py:63 cps/templates/layout.html:68 -#: cps/templates/layout.html:103 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1361 -msgid "Login" -msgstr "Autenticar" - -#: cps/remotelogin.py:75 cps/remotelogin.py:109 +#: cps/remotelogin.py:46 cps/remotelogin.py:128 msgid "Token not found" msgstr "Token não encontrado" -#: cps/remotelogin.py:84 cps/remotelogin.py:117 +#: cps/remotelogin.py:55 cps/remotelogin.py:136 msgid "Token has expired" msgstr "O Token expirou" -#: cps/remotelogin.py:93 +#: cps/remotelogin.py:86 cps/remotelogin.py:112 cps/templates/layout.html:68 +#: cps/templates/layout.html:103 cps/templates/login.html:4 +#: cps/templates/login.html:21 cps/web.py:1371 +msgid "Login" +msgstr "Autenticar" + +#: cps/remotelogin.py:100 +msgid "Token already approved" +msgstr "" + +#: cps/remotelogin.py:108 msgid "Success! Please return to your device" msgstr "Sucesso! Por favor, volte ao seu dispositivo" -#: cps/render_template.py:41 cps/web.py:421 +#: cps/render_template.py:41 cps/web.py:423 msgid "Books" msgstr "Livros" @@ -1063,7 +1110,7 @@ msgstr "Livros descarregados" msgid "Show Downloaded Books" msgstr "Mostrar livros descarregados" -#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:436 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:438 msgid "Top Rated Books" msgstr "Top de pontuação de livros" @@ -1072,7 +1119,7 @@ msgid "Show Top Rated Books" msgstr "Mostrar livros mais bem pontuados" #: cps/render_template.py:61 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:769 +#: cps/templates/index.xml:67 cps/web.py:771 msgid "Read Books" msgstr "Livros lidos" @@ -1081,7 +1128,7 @@ msgid "Show Read and Unread" msgstr "" #: cps/render_template.py:65 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:772 +#: cps/templates/index.xml:74 cps/web.py:774 msgid "Unread Books" msgstr "Livros não lidos" @@ -1099,7 +1146,7 @@ msgid "Show Random Books" msgstr "Mostrar livros aleatoriamente" #: cps/render_template.py:71 cps/templates/book_table.html:93 -#: cps/templates/index.xml:97 cps/web.py:1144 +#: cps/templates/index.xml:97 cps/web.py:1146 msgid "Categories" msgstr "Categorias" @@ -1109,7 +1156,7 @@ msgstr "" #: cps/render_template.py:74 cps/templates/book_edit.html:86 #: cps/templates/book_table.html:94 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1034 cps/web.py:1046 +#: cps/templates/search_form.html:70 cps/web.py:1036 cps/web.py:1048 msgid "Series" msgstr "Séries" @@ -1127,7 +1174,7 @@ msgid "Show Author Section" msgstr "" #: cps/render_template.py:81 cps/templates/book_table.html:98 -#: cps/templates/index.xml:88 cps/web.py:1002 +#: cps/templates/index.xml:88 cps/web.py:1004 msgid "Publishers" msgstr "Editoras" @@ -1137,7 +1184,7 @@ msgstr "" #: cps/render_template.py:84 cps/templates/book_table.html:96 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1116 +#: cps/web.py:1118 msgid "Languages" msgstr "Idiomas" @@ -1161,7 +1208,7 @@ msgstr "Formatos de ficheiro" msgid "Show File Formats Section" msgstr "" -#: cps/render_template.py:95 cps/web.py:795 +#: cps/render_template.py:95 cps/web.py:797 msgid "Archived Books" msgstr "Livros arquivados" @@ -1169,7 +1216,7 @@ msgstr "Livros arquivados" msgid "Show Archived Books" msgstr "" -#: cps/render_template.py:100 cps/web.py:831 +#: cps/render_template.py:100 cps/web.py:833 msgid "Books List" msgstr "Lista de livros" @@ -1402,150 +1449,154 @@ msgstr "Uma nova atualização está disponível. Clique no botão abaixo para a msgid "No release information available" msgstr "Não existem informações disponíveis sobre o lançamento" -#: cps/templates/index.html:6 cps/web.py:448 +#: cps/templates/index.html:6 cps/web.py:450 msgid "Discover (Random Books)" msgstr "Descobrir (Livros aleatórios)" -#: cps/web.py:484 +#: cps/web.py:486 msgid "Hot Books (Most Downloaded)" msgstr "Livros quentes (Mais descarregados)" -#: cps/web.py:515 +#: cps/web.py:517 #, python-format msgid "Downloaded books by %(user)s" msgstr "Livros descarregados por %(user)s" -#: cps/web.py:548 +#: cps/web.py:550 #, python-format msgid "Author: %(name)s" msgstr "Autor: %(name)s" -#: cps/web.py:584 +#: cps/web.py:586 #, python-format msgid "Publisher: %(name)s" msgstr "Editora: %(name)s" -#: cps/web.py:612 +#: cps/web.py:614 #, python-format msgid "Series: %(serie)s" msgstr "Séries: %(serie)s" -#: cps/web.py:626 +#: cps/web.py:628 msgid "Rating: None" msgstr "Pontuação: Nenhuma" -#: cps/web.py:635 +#: cps/web.py:637 #, python-format msgid "Rating: %(rating)s stars" msgstr "Pontuação: %(rating)s estrelas" -#: cps/web.py:666 +#: cps/web.py:668 #, python-format msgid "File format: %(format)s" msgstr "Formato do ficheiro: %(format)s" -#: cps/web.py:701 +#: cps/web.py:703 #, python-format msgid "Category: %(name)s" msgstr "Categoria: %(name)s" -#: cps/web.py:730 +#: cps/web.py:732 #, python-format msgid "Language: %(name)s" msgstr "Idioma: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:974 +#: cps/templates/admin.html:16 cps/web.py:976 msgid "Downloads" msgstr "Descarregamentos" -#: cps/web.py:1076 +#: cps/web.py:1078 msgid "Ratings list" msgstr "Lista de pontuações" -#: cps/web.py:1103 +#: cps/web.py:1105 msgid "File formats list" msgstr "Lista de formatos de ficheiro" -#: cps/web.py:1264 +#: cps/web.py:1272 +msgid "Book format not supported" +msgstr "" + +#: cps/web.py:1274 msgid "Please configure the SMTP mail settings first..." msgstr "" -#: cps/web.py:1270 +#: cps/web.py:1280 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Sucesso! Livro enviado para lista de espera para envio a %(eReadermail)s" -#: cps/web.py:1273 +#: cps/web.py:1283 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Ops! Ocorreu um erro ao enviar este livro: %(res)s" -#: cps/web.py:1275 +#: cps/web.py:1285 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "" -#: cps/web.py:1291 cps/web.py:1342 +#: cps/web.py:1301 cps/web.py:1352 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "Ops! O servidor de email não está configurado. Por favor, contacte o seu administrador!" -#: cps/web.py:1328 +#: cps/web.py:1338 msgid "Oops! Your Email is not allowed." msgstr "Ops! O seu email não é permitido para registo" -#: cps/web.py:1331 +#: cps/web.py:1341 msgid "Success! Confirmation Email has been sent." msgstr "Sucesso! O email de confirmação foi enviado para a sua conta de email." -#: cps/web.py:1376 cps/web.py:1390 +#: cps/web.py:1386 cps/web.py:1400 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1399 +#: cps/web.py:1409 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1406 +#: cps/web.py:1416 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1411 +#: cps/web.py:1421 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1415 cps/web.py:1440 +#: cps/web.py:1425 cps/web.py:1450 msgid "Wrong Username or Password" msgstr "" -#: cps/web.py:1422 +#: cps/web.py:1432 msgid "New Password was sent to your email address" msgstr "" -#: cps/web.py:1426 +#: cps/web.py:1436 msgid "An unknown error occurred. Please try again later." msgstr "" -#: cps/web.py:1428 +#: cps/web.py:1438 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1436 +#: cps/web.py:1446 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1501 cps/web.py:1551 +#: cps/web.py:1511 cps/web.py:1561 #, python-format msgid "%(name)s's Profile" msgstr "Perfil de %(name)s" -#: cps/web.py:1517 +#: cps/web.py:1527 msgid "Success! Profile Updated" msgstr "" -#: cps/web.py:1521 +#: cps/web.py:1531 msgid "Oops! An account already exists for this Email." msgstr "Foi encontrada uma conta já existente com este endereço de email." @@ -1557,46 +1608,46 @@ msgstr "Não foi encontrado nenhum ficheiro gmail.json válido com informações msgid "Delete temp folder contents" msgstr "" -#: cps/tasks/convert.py:112 +#: cps/tasks/convert.py:113 #, python-format msgid "%(book)s send to E-Reader" msgstr "%(book)s enviado para dispositivo de leitura" -#: cps/tasks/convert.py:177 +#: cps/tasks/convert.py:180 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre ebook-convert %(tool)s não encontrado" -#: cps/tasks/convert.py:211 +#: cps/tasks/convert.py:214 #, python-format msgid "%(format)s format not found on disk" msgstr "Formato %(format)s não encontrado no disco" -#: cps/tasks/convert.py:215 +#: cps/tasks/convert.py:218 msgid "Ebook converter failed with unknown error" msgstr "O conversor de ebook falhou com erro desconhecido" -#: cps/tasks/convert.py:234 +#: cps/tasks/convert.py:237 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Conversor Kepubify falhou: %(error)s" -#: cps/tasks/convert.py:254 +#: cps/tasks/convert.py:257 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Ficheiro convertido não encontrado ou mais de um ficheiro na pasta %(folder)s" -#: cps/tasks/convert.py:291 cps/tasks/convert.py:342 +#: cps/tasks/convert.py:294 cps/tasks/convert.py:345 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre falhou com erro: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:322 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Conversor de ebook falhou: %(error)s" -#: cps/tasks/convert.py:347 +#: cps/tasks/convert.py:350 msgid "Convert" msgstr "Converter" @@ -1682,7 +1733,7 @@ msgstr "Editar" #: cps/templates/admin.html:25 cps/templates/book_edit.html:17 #: cps/templates/book_table.html:131 cps/templates/book_table.html:180 -#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:115 +#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:117 #: cps/templates/user_edit.html:67 cps/templates/user_table.html:149 msgid "Delete" msgstr "Apagar" @@ -1772,128 +1823,145 @@ msgstr "Autenticação remota Magic Link" msgid "Reverse Proxy Login" msgstr "Autenticação de Proxy reverso" -#: cps/templates/admin.html:154 cps/templates/config_edit.html:176 +#: cps/templates/admin.html:154 cps/templates/config_edit.html:180 msgid "Reverse Proxy Header Name" msgstr "Nome do cabeçalho do Proxy reverso" -#: cps/templates/admin.html:159 +#: cps/templates/admin.html:158 +msgid "Reverse Proxy Trusted IPs/CIDRs" +msgstr "" + +#: cps/templates/admin.html:162 cps/templates/config_edit.html:193 +msgid "Reverse Proxy Shared Secret Header Name" +msgstr "" + +#: cps/templates/admin.html:166 +msgid "Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/admin.html:170 +msgid "Reverse Proxy Shared Secret Configured" +msgstr "" + +#: cps/templates/admin.html:175 msgid "Edit Calibre Database Configuration" msgstr "Editar configuração da base de dados do Calibre" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:176 msgid "Edit Basic Configuration" msgstr "Editar configurações básicas" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:177 msgid "Edit UI Configuration" msgstr "Editar configuração de IU" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:183 msgid "Scheduled Tasks" msgstr "Tarefas agendadas" -#: cps/templates/admin.html:170 cps/templates/schedule_edit.html:12 +#: cps/templates/admin.html:186 cps/templates/schedule_edit.html:12 #: cps/templates/tasks.html:18 msgid "Start Time" msgstr "Hora de início" -#: cps/templates/admin.html:174 cps/templates/schedule_edit.html:20 +#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:20 msgid "Maximum Duration" msgstr "Duração máxima" -#: cps/templates/admin.html:178 cps/templates/schedule_edit.html:29 +#: cps/templates/admin.html:194 cps/templates/schedule_edit.html:29 msgid "Generate Thumbnails" msgstr "Gerar miniaturas" -#: cps/templates/admin.html:182 +#: cps/templates/admin.html:198 msgid "Generate series cover thumbnails" msgstr "Gerar miniaturas para capa de séries" -#: cps/templates/admin.html:186 cps/templates/admin.html:208 +#: cps/templates/admin.html:202 cps/templates/admin.html:224 #: cps/templates/schedule_edit.html:37 msgid "Reconnect Calibre Database" msgstr "Religar à biblioteca do Calibre" -#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 +#: cps/templates/admin.html:206 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" msgstr "Criar cópia de segurança dos metadados" -#: cps/templates/admin.html:197 +#: cps/templates/admin.html:213 msgid "Refresh Thumbnail Cache" msgstr "Atualizar Cache de miniaturas" -#: cps/templates/admin.html:203 +#: cps/templates/admin.html:219 msgid "Administration" msgstr "Administração" -#: cps/templates/admin.html:204 +#: cps/templates/admin.html:220 msgid "Download Debug Package" msgstr "Descarregar pacote de depuração" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:221 msgid "View Logs" msgstr "Ver historial" -#: cps/templates/admin.html:211 +#: cps/templates/admin.html:227 msgid "Restart" msgstr "Reiniciar" -#: cps/templates/admin.html:212 +#: cps/templates/admin.html:228 msgid "Shutdown" msgstr "Desligar" -#: cps/templates/admin.html:221 +#: cps/templates/admin.html:237 msgid "Version Information" msgstr "Dados da versão" -#: cps/templates/admin.html:225 +#: cps/templates/admin.html:241 msgid "Version" msgstr "Versão" -#: cps/templates/admin.html:226 +#: cps/templates/admin.html:242 msgid "Details" msgstr "Detalhes" -#: cps/templates/admin.html:232 +#: cps/templates/admin.html:248 msgid "Current Version" msgstr "Versão atual" -#: cps/templates/admin.html:239 +#: cps/templates/admin.html:255 msgid "Check for Update" msgstr "Verificar atualizações" -#: cps/templates/admin.html:240 +#: cps/templates/admin.html:256 msgid "Perform Update" msgstr "Aplicar atualizações" -#: cps/templates/admin.html:253 +#: cps/templates/admin.html:269 msgid "Are you sure you want to restart?" msgstr "Tem a certeza de que quer reiniciar?" -#: cps/templates/admin.html:258 cps/templates/admin.html:272 -#: cps/templates/admin.html:292 cps/templates/config_db.html:82 +#: cps/templates/admin.html:274 cps/templates/admin.html:288 +#: cps/templates/admin.html:308 cps/templates/config_db.html:82 msgid "OK" msgstr "Ok" -#: cps/templates/admin.html:259 cps/templates/admin.html:273 +#: cps/templates/admin.html:275 cps/templates/admin.html:289 #: cps/templates/book_edit.html:220 cps/templates/book_table.html:162 #: cps/templates/book_table.html:181 cps/templates/book_table.html:201 #: cps/templates/book_table.html:221 cps/templates/book_table.html:241 #: cps/templates/book_table.html:261 cps/templates/book_table.html:316 -#: cps/templates/config_db.html:66 cps/templates/config_edit.html:431 +#: cps/templates/config_db.html:66 cps/templates/config_edit.html:453 #: cps/templates/config_view_edit.html:175 cps/templates/detail.html:350 -#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:98 -#: cps/templates/modal_dialogs.html:116 cps/templates/modal_dialogs.html:134 +#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:100 +#: cps/templates/modal_dialogs.html:118 cps/templates/modal_dialogs.html:136 +#: cps/templates/remote_login_verify.html:16 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 #: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Cancelar" -#: cps/templates/admin.html:271 +#: cps/templates/admin.html:287 msgid "Are you sure you want to shutdown?" msgstr "Tem certeza de que quer encerrar?" -#: cps/templates/admin.html:283 +#: cps/templates/admin.html:299 msgid "Updating, please do not reload this page" msgstr "A atualizar, por favor, não refresque esta página" @@ -2134,7 +2202,7 @@ msgid "Fetch Metadata" msgstr "Obter metadados" #: cps/templates/book_edit.html:219 cps/templates/config_db.html:65 -#: cps/templates/config_edit.html:430 cps/templates/config_view_edit.html:174 +#: cps/templates/config_edit.html:452 cps/templates/config_view_edit.html:174 #: cps/templates/email_edit.html:65 cps/templates/schedule_edit.html:44 #: cps/templates/shelf_edit.html:25 cps/templates/shelf_order.html:41 #: cps/templates/user_edit.html:142 @@ -2506,214 +2574,234 @@ msgstr "" msgid "Allow Reverse Proxy Authentication" msgstr "Permitir autenticação por Proxy reverso" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:176 +msgid "Security Warning" +msgstr "" + +#: cps/templates/config_edit.html:177 +msgid "Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled." +msgstr "" + +#: cps/templates/config_edit.html:184 +msgid "Reverse Proxy Trusted IPs/CIDRs (Comma Separated)" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "Enable Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/config_edit.html:197 +msgid "Reverse Proxy Shared Secret" +msgstr "" + +#: cps/templates/config_edit.html:205 msgid "Login type" msgstr "Tipo de autenticação" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:207 msgid "Use Standard Authentication" msgstr "Usar autenticação padrão" -#: cps/templates/config_edit.html:187 +#: cps/templates/config_edit.html:209 msgid "Use LDAP Authentication" msgstr "Usar autenticação LDAP" -#: cps/templates/config_edit.html:190 +#: cps/templates/config_edit.html:212 msgid "Use OAuth" msgstr "Usar OAuth" -#: cps/templates/config_edit.html:197 +#: cps/templates/config_edit.html:219 msgid "LDAP Server Host Name or IP Address" msgstr "Nome ou endereço IP do servidor LDAP" -#: cps/templates/config_edit.html:201 +#: cps/templates/config_edit.html:223 msgid "LDAP Server Port" msgstr "Porta do servidor LDAP" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:227 msgid "LDAP Encryption" msgstr "Criptografia LDAP" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:230 msgid "TLS" msgstr "TLS" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:231 msgid "SSL" msgstr "SSL" -#: cps/templates/config_edit.html:213 +#: cps/templates/config_edit.html:235 msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" msgstr "Caminho do certificado CA do LDAP (Necessário apenas para autenticação por certificado de cliente)" -#: cps/templates/config_edit.html:220 +#: cps/templates/config_edit.html:242 msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" msgstr "Caminho do certificado LDAP (Necessário apenas para autenticação por certificado de cliente)" -#: cps/templates/config_edit.html:227 +#: cps/templates/config_edit.html:249 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" msgstr "Caminho do ficheiro de chave LDAP (Necessário apenas para autenticação por certificado de cliente)" -#: cps/templates/config_edit.html:236 +#: cps/templates/config_edit.html:258 msgid "LDAP Authentication" msgstr "Autenticação LDAP" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:260 msgid "Anonymous" msgstr "Anónimo" -#: cps/templates/config_edit.html:239 +#: cps/templates/config_edit.html:261 msgid "Unauthenticated" msgstr "Não autenticado" -#: cps/templates/config_edit.html:240 +#: cps/templates/config_edit.html:262 msgid "Simple" msgstr "Simples" -#: cps/templates/config_edit.html:245 +#: cps/templates/config_edit.html:267 msgid "LDAP Administrator Username" msgstr "Nome de utilizador do administrador LDAP" -#: cps/templates/config_edit.html:251 +#: cps/templates/config_edit.html:273 msgid "LDAP Administrator Password" msgstr "Senha de administrador LDAP" -#: cps/templates/config_edit.html:256 +#: cps/templates/config_edit.html:278 msgid "LDAP Distinguished Name (DN)" msgstr "Nome distinto LDAP (DN)" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:282 msgid "LDAP User Object Filter" msgstr "Filtro de Objeto do utilizador LDAP" -#: cps/templates/config_edit.html:265 +#: cps/templates/config_edit.html:287 msgid "LDAP Server is OpenLDAP?" msgstr "O Servidor LDAP é OpenLDAP?" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:289 msgid "Following Settings are Needed For User Import" msgstr "As seguintes configurações são necessárias para a importação de utilizadores" -#: cps/templates/config_edit.html:269 +#: cps/templates/config_edit.html:291 msgid "LDAP Group Object Filter" msgstr "Filtro de objetos do grupo LDAP" -#: cps/templates/config_edit.html:273 +#: cps/templates/config_edit.html:295 msgid "LDAP Group Name" msgstr "Nome do grupo LDAP" -#: cps/templates/config_edit.html:277 +#: cps/templates/config_edit.html:299 msgid "LDAP Group Members Field" msgstr "Campo de membros do grupo LDAP" -#: cps/templates/config_edit.html:281 +#: cps/templates/config_edit.html:303 msgid "LDAP Member User Filter Detection" msgstr "LDAP deteção de filtro de utilizador membro LDAP" -#: cps/templates/config_edit.html:283 +#: cps/templates/config_edit.html:305 msgid "Autodetect" msgstr "Autodetetar" -#: cps/templates/config_edit.html:284 +#: cps/templates/config_edit.html:306 msgid "Custom Filter" msgstr "Filtro personalizado" -#: cps/templates/config_edit.html:289 +#: cps/templates/config_edit.html:311 msgid "LDAP Member User Filter" msgstr "Filtro de utilizador Membro LDAP" -#: cps/templates/config_edit.html:300 +#: cps/templates/config_edit.html:322 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "Obter credenciais OAuth de %(provider)s" -#: cps/templates/config_edit.html:303 +#: cps/templates/config_edit.html:325 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "ID do cliente OAuth de %(provider)s" -#: cps/templates/config_edit.html:307 +#: cps/templates/config_edit.html:329 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "Senha do cliente Oauth de %(provider)s" -#: cps/templates/config_edit.html:323 +#: cps/templates/config_edit.html:345 msgid "External binaries" msgstr "Binários externos" -#: cps/templates/config_edit.html:329 +#: cps/templates/config_edit.html:351 msgid "Path to Calibre Binaries" msgstr "" -#: cps/templates/config_edit.html:337 +#: cps/templates/config_edit.html:359 msgid "Calibre E-Book Converter Settings" msgstr "Configurações do conversor de ebooks do Calibre" -#: cps/templates/config_edit.html:340 +#: cps/templates/config_edit.html:362 msgid "Path to Kepubify E-Book Converter" msgstr "Caminho para o conversor de ebooks do Kepubify" -#: cps/templates/config_edit.html:348 +#: cps/templates/config_edit.html:370 msgid "Location of Unrar binary" msgstr "" -#: cps/templates/config_edit.html:364 +#: cps/templates/config_edit.html:386 msgid "Security Settings" msgstr "" -#: cps/templates/config_edit.html:372 +#: cps/templates/config_edit.html:394 msgid "Limit failed login attempts" msgstr "Limitar tentativas de autenticação falhada" -#: cps/templates/config_edit.html:376 +#: cps/templates/config_edit.html:398 msgid "Configure Backend for Limiter" msgstr "" -#: cps/templates/config_edit.html:380 +#: cps/templates/config_edit.html:402 msgid "Options for Limiter Backend" msgstr "" -#: cps/templates/config_edit.html:386 +#: cps/templates/config_edit.html:408 msgid "Check if file extensions matches file content on upload" msgstr "" -#: cps/templates/config_edit.html:389 +#: cps/templates/config_edit.html:411 msgid "Session protection" msgstr "Proteção de sessão" -#: cps/templates/config_edit.html:391 +#: cps/templates/config_edit.html:413 msgid "Basic" msgstr "Básica" -#: cps/templates/config_edit.html:392 +#: cps/templates/config_edit.html:414 msgid "Strong" msgstr "Forte" -#: cps/templates/config_edit.html:397 +#: cps/templates/config_edit.html:419 msgid "User Password policy" msgstr "" -#: cps/templates/config_edit.html:401 +#: cps/templates/config_edit.html:423 msgid "Minimum password length" msgstr "Tamanho mínimo da senha" -#: cps/templates/config_edit.html:406 +#: cps/templates/config_edit.html:428 msgid "Enforce number" msgstr "Exigir números" -#: cps/templates/config_edit.html:410 +#: cps/templates/config_edit.html:432 msgid "Enforce lowercase characters" msgstr "Exigir letras minúsculas" -#: cps/templates/config_edit.html:414 +#: cps/templates/config_edit.html:436 msgid "Enforce uppercase characters" msgstr "Exigir letras maiúsculas" -#: cps/templates/config_edit.html:418 +#: cps/templates/config_edit.html:440 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" msgstr "" -#: cps/templates/config_edit.html:422 +#: cps/templates/config_edit.html:444 msgid "Enforce special characters" msgstr "Exigir caracteres especiais" @@ -3180,27 +3268,27 @@ msgstr "Os livros devem primeiro ser arquivados e o dispositivo deve ser sincron msgid "Choose File Location" msgstr "Escolher a localização do ficheiro" -#: cps/templates/modal_dialogs.html:81 +#: cps/templates/modal_dialogs.html:82 msgid "type" msgstr "tipo" -#: cps/templates/modal_dialogs.html:82 +#: cps/templates/modal_dialogs.html:83 msgid "name" msgstr "nome" -#: cps/templates/modal_dialogs.html:83 +#: cps/templates/modal_dialogs.html:84 msgid "size" msgstr "tamanho" -#: cps/templates/modal_dialogs.html:89 +#: cps/templates/modal_dialogs.html:90 msgid "Parent Directory" msgstr "Pasta superior" -#: cps/templates/modal_dialogs.html:97 +#: cps/templates/modal_dialogs.html:99 msgid "Select" msgstr "Selecionar" -#: cps/templates/modal_dialogs.html:133 cps/templates/tasks.html:46 +#: cps/templates/modal_dialogs.html:135 cps/templates/tasks.html:46 msgid "Ok" msgstr "Ok" @@ -3456,6 +3544,31 @@ msgstr "Uma vez verificado, você será automaticamente ligado a este dispositiv msgid "This verification link will expire in 10 minutes." msgstr "Esta ligação de verificação irá expirar em 10 minutos." +#: cps/templates/remote_login_verify.html:4 +msgid "Approve Magic Link Login" +msgstr "" + +#: cps/templates/remote_login_verify.html:5 +msgid "Review the device that requested access before approving this login." +msgstr "" + +#: cps/templates/remote_login_verify.html:7 +msgid "IP address" +msgstr "" + +#: cps/templates/remote_login_verify.html:9 +msgid "Browser" +msgstr "" + +#: cps/templates/remote_login_verify.html:12 +#, python-format +msgid "If you approve this request, the device that started it will be logged in as %(username)s." +msgstr "" + +#: cps/templates/remote_login_verify.html:15 +msgid "Approve Login" +msgstr "" + #: cps/templates/schedule_edit.html:33 msgid "Generate Series Cover Thumbnails" msgstr "Gerar miniaturas para capa de série" diff --git a/cps/translations/pt_BR/LC_MESSAGES/messages.mo b/cps/translations/pt_BR/LC_MESSAGES/messages.mo index 34fff3f06a47dd1b7f31522207beb8af82bc43b3..803f0bd70e8a0ca7a7ebc0510d17904d70f59c8a 100644 GIT binary patch delta 14178 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

EJz$n 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 PucRn3C4ckA|0bLO4<}sa diff --git a/cps/translations/pt_BR/LC_MESSAGES/messages.po b/cps/translations/pt_BR/LC_MESSAGES/messages.po index ead5b4fef..f3e924348 100644 --- a/cps/translations/pt_BR/LC_MESSAGES/messages.po +++ b/cps/translations/pt_BR/LC_MESSAGES/messages.po @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-08-01 11:42+0200\n" +"POT-Creation-Date: 2026-08-08 16:08+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: br\n" @@ -13,519 +13,558 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" +"Generated-By: Babel 2.18.0\n" #: cps/about.py:85 msgid "Statistics" msgstr "Estatísticas" -#: cps/admin.py:151 +#: cps/admin.py:154 msgid "Server restarted, please reload page." msgstr "Servidor reiniciado, por favor recarregue a página." -#: cps/admin.py:153 +#: cps/admin.py:156 msgid "Performing Server shutdown, please close window." msgstr "Desligando o servidor, por favor feche a janela." -#: cps/admin.py:161 +#: cps/admin.py:164 msgid "Success! Database Reconnected" msgstr "Sucesso! Banco de dados reconectado" -#: cps/admin.py:164 +#: cps/admin.py:167 msgid "Unknown command" msgstr "Comando desconhecido" -#: cps/admin.py:175 +#: cps/admin.py:178 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "Sucesso! Livros enfileirados para backup de Metadados, por favor verifique Tarefas para o resultado" -#: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 -#: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 -#: cps/uploader.py:117 +#: cps/admin.py:211 cps/editbooks.py:825 cps/editbooks.py:875 +#: cps/editbooks.py:1564 cps/templates/remote_login_verify.html:8 +#: cps/templates/remote_login_verify.html:10 cps/updater.py:615 +#: cps/uploader.py:117 cps/uploader.py:126 msgid "Unknown" msgstr "Desconhecido" -#: cps/admin.py:233 +#: cps/admin.py:236 msgid "Admin page" msgstr "Página de Administração" -#: cps/admin.py:253 +#: cps/admin.py:256 msgid "Basic Configuration" msgstr "Configuração Básica" -#: cps/admin.py:291 +#: cps/admin.py:294 msgid "UI Configuration" msgstr "Configuração de UI" -#: cps/admin.py:315 cps/admin.py:1002 cps/db.py:809 cps/search.py:150 -#: cps/web.py:750 +#: cps/admin.py:318 cps/admin.py:1005 cps/db.py:809 cps/search.py:150 +#: cps/web.py:752 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "A Coluna Personalizada No.%(column)d não existe no banco de dados do calibre" -#: cps/admin.py:333 cps/templates/admin.html:51 +#: cps/admin.py:336 cps/templates/admin.html:51 msgid "Edit Users" msgstr "Editar Usuários" -#: cps/admin.py:378 cps/opds.py:559 cps/templates/grid.html:14 +#: cps/admin.py:381 cps/opds.py:559 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Todos" -#: cps/admin.py:401 cps/admin.py:1432 +#: cps/admin.py:404 cps/admin.py:1460 msgid "User not found" msgstr "Usuário não encontrado" -#: cps/admin.py:415 +#: cps/admin.py:418 #, python-brace-format msgid "{} users deleted successfully" msgstr "{} usuário(s) deletedos com sucesso" -#: cps/admin.py:438 cps/templates/config_view_edit.html:133 +#: cps/admin.py:441 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Mostrar Tudo" -#: cps/admin.py:459 cps/admin.py:465 +#: cps/admin.py:462 cps/admin.py:468 msgid "Malformed request" msgstr "Requisição Malformada" -#: cps/admin.py:477 cps/admin.py:2078 +#: cps/admin.py:480 cps/admin.py:2156 msgid "Guest Name can't be changed" msgstr "Nome do Convidado não pode ser alterado" -#: cps/admin.py:489 +#: cps/admin.py:492 msgid "Guest can't have this role" msgstr "Convidado não pode ter esta função" -#: cps/admin.py:501 cps/admin.py:2032 +#: cps/admin.py:504 cps/admin.py:2110 msgid "No admin user remaining, can't remove admin role" msgstr "Nenhum usuário administrador restante, impossível remover a função de administrador" -#: cps/admin.py:505 cps/admin.py:519 +#: cps/admin.py:508 cps/admin.py:522 msgid "Value has to be true or false" msgstr "Valor tem de ser Verdadeiro ou Falso" -#: cps/admin.py:507 +#: cps/admin.py:510 msgid "Invalid role" msgstr "Função Inválida" -#: cps/admin.py:511 +#: cps/admin.py:514 msgid "Guest can't have this view" msgstr "Convidado não pode ter esta visão" -#: cps/admin.py:521 +#: cps/admin.py:524 msgid "Invalid view" msgstr "Visão Inválida" -#: cps/admin.py:524 +#: cps/admin.py:527 msgid "Guest's Locale is determined automatically and can't be set" msgstr "O idioma do Convidado é detectado automaticamente e não pode ser alterado" -#: cps/admin.py:528 +#: cps/admin.py:531 msgid "No Valid Locale Given" msgstr "Nenhum Idioma Válido Fornecido" -#: cps/admin.py:539 +#: cps/admin.py:542 msgid "No Valid Book Language Given" msgstr "Nenhum Idioma do Livro Válido Fornecido" -#: cps/admin.py:541 cps/editbooks.py:243 cps/editbooks.py:428 -#: cps/editbooks.py:430 +#: cps/admin.py:544 cps/editbooks.py:260 cps/editbooks.py:445 +#: cps/editbooks.py:447 msgid "Parameter not found" msgstr "Parametro não encontrado" -#: cps/admin.py:578 +#: cps/admin.py:581 msgid "Invalid Read Column" msgstr "Coluna Lido Inválida" -#: cps/admin.py:584 +#: cps/admin.py:587 msgid "Invalid Restricted Column" msgstr "Coluna Restrito Inválida" -#: cps/admin.py:604 cps/admin.py:1903 +#: cps/admin.py:607 cps/admin.py:1981 msgid "Calibre-Web configuration updated" msgstr "Configuração do Calibre-Web atualizada" -#: cps/admin.py:616 +#: cps/admin.py:619 msgid "Do you really want to delete the Kobo Token?" msgstr "Você realmente quer apagar a Kobo Token?" -#: cps/admin.py:618 +#: cps/admin.py:621 msgid "Do you really want to delete this domain?" msgstr "Você realmente quer apagar este domínio?" -#: cps/admin.py:620 +#: cps/admin.py:623 msgid "Do you really want to delete this user?" msgstr "Você realmente quer apagar este usuário?" -#: cps/admin.py:622 +#: cps/admin.py:625 msgid "Do you really want to delete this book?" msgstr "Você realmente quer apagar este livro?" -#: cps/admin.py:624 +#: cps/admin.py:627 msgid "Are you sure you want to delete this shelf?" msgstr "Tem certeza que quer apagar essa estante?" -#: cps/admin.py:626 +#: cps/admin.py:629 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Tem certeza que quer alterar o idioma do(s) usuário(s) selecionados?" -#: cps/admin.py:628 +#: cps/admin.py:631 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "Tem certeza que quer alterar os idiomas de livros visíveis par o usuário(s) selecionado(s)?" -#: cps/admin.py:630 +#: cps/admin.py:633 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "Tem certeza que quer alterar a função selecionada para o(s) usuário(s) selecionado(s)?" -#: cps/admin.py:632 +#: cps/admin.py:635 msgid "Are you sure you want to change the archive status for the selected book(s)?" msgstr "Tem certeza que quer alterar o status de arquivamento do(s) livro(s) selecionado(s)?" -#: cps/admin.py:634 +#: cps/admin.py:637 msgid "Are you sure you want to change the read status for the selected book(s)?" msgstr "Tem certeza que quer alterar o status de leitura do(s) livro(s) selecionado(s)?" -#: cps/admin.py:636 +#: cps/admin.py:639 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Tem certeza que quer alterar as restriçõeo selecionada para o(s) usuário(s) selecionado(s)?" -#: cps/admin.py:638 +#: cps/admin.py:641 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "Tem certeza de que quer alterar as restrições de visibilidade selecionadas para os usuários selecionados?" -#: cps/admin.py:641 +#: cps/admin.py:644 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Tem certeza de que quer alterar o comportamento de sincronização da estante para o usuário selecionado?" -#: cps/admin.py:643 +#: cps/admin.py:646 msgid "Are you sure you want to change Calibre library location?" msgstr "Tem certeza que queres alterar a localização da biblioteca Calibre?" -#: cps/admin.py:645 +#: cps/admin.py:648 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "O Calibre-Web buscará por Capas atualizadas e atualizará as Miniaturas de Capas, isso pode demorar um pouco" -#: cps/admin.py:648 +#: cps/admin.py:651 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Tem certeza de que deseja apagar o banco de dados de sincronização do Calibre-Web para forçar uma sincronização completa com seu Kobo Reader?" -#: cps/admin.py:891 cps/admin.py:897 cps/admin.py:907 cps/admin.py:917 +#: cps/admin.py:894 cps/admin.py:900 cps/admin.py:910 cps/admin.py:920 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Negar" -#: cps/admin.py:893 cps/admin.py:899 cps/admin.py:909 cps/admin.py:919 +#: cps/admin.py:896 cps/admin.py:902 cps/admin.py:912 cps/admin.py:922 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Permitir" -#: cps/admin.py:952 +#: cps/admin.py:955 #, python-brace-format msgid "{} sync entries deleted" msgstr "{} entradas de sincronização deletadas" -#: cps/admin.py:993 +#: cps/admin.py:996 msgid "Tag not found" msgstr "Tag não encontrada" -#: cps/admin.py:1011 +#: cps/admin.py:1014 msgid "Invalid Action" msgstr "Ação Inválida" -#: cps/admin.py:1138 +#: cps/admin.py:1137 +#, python-format +msgid "Invalid reverse proxy trusted IP/CIDR entry: %(entry)s" +msgstr "" + +#: cps/admin.py:1148 +#, python-format +msgid "Invalid %(label)s: %(value)s" +msgstr "" + +#: cps/admin.py:1166 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json Não Está Configurado para Aplicação Web" -#: cps/admin.py:1183 +#: cps/admin.py:1211 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "A localização do arquivo de log não é válida, digite o caminho correto" -#: cps/admin.py:1189 +#: cps/admin.py:1217 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "A localização do arquivo de log de acesso não é válida, digite o caminho correto" -#: cps/admin.py:1223 +#: cps/admin.py:1251 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Digite um provedor LDAP, porta, DN e identificador de objeto do usuário" -#: cps/admin.py:1229 +#: cps/admin.py:1257 msgid "Please Enter a LDAP Service Account and Password" msgstr "Por favor, digite uma Conta de Serviço LDAP e Senha" -#: cps/admin.py:1232 +#: cps/admin.py:1260 msgid "Please Enter a LDAP Service Account" msgstr "Por favor, digite uma Conta de Serviço LDAP" -#: cps/admin.py:1237 +#: cps/admin.py:1265 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "O filtro de objeto de grupo LDAP precisa ter um identificador de formato \"%s\"" -#: cps/admin.py:1239 +#: cps/admin.py:1267 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "Filtro de objeto de grupo LDAP tem parênteses incomparáveis" -#: cps/admin.py:1243 +#: cps/admin.py:1271 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "O filtro de objeto de usuário LDAP precisa ter um identificador de formato \"%s\"" -#: cps/admin.py:1245 +#: cps/admin.py:1273 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "Filtro de objeto de usuário LDAP tem parênteses incomparáveis" -#: cps/admin.py:1252 +#: cps/admin.py:1280 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "O filtro de usuário membro do LDAP precisa ter um identificador de formato \"%s\"" -#: cps/admin.py:1254 +#: cps/admin.py:1282 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "Filtro de usuário de membro LDAP tem parênteses incomparáveis" -#: cps/admin.py:1261 +#: cps/admin.py:1289 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "Localização de LDAP CACertificate, Certificados ou Key Inválida, Insira o Caminho Correto" -#: cps/admin.py:1292 cps/templates/admin.html:53 +#: cps/admin.py:1320 cps/templates/admin.html:53 msgid "Add New User" msgstr "Adicionar Novo Usuário" -#: cps/admin.py:1301 cps/templates/admin.html:100 +#: cps/admin.py:1329 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Editar configurações do servidor de e-mail" -#: cps/admin.py:1320 +#: cps/admin.py:1348 msgid "Success! Gmail Account Verified." msgstr "Sucesso! Conta do Gmail verificada." -#: cps/admin.py:1340 cps/admin.py:1343 cps/admin.py:1728 cps/admin.py:1887 -#: cps/admin.py:1985 cps/admin.py:2106 cps/editbooks.py:169 -#: cps/editbooks.py:755 cps/editbooks.py:1474 cps/shelf.py:90 cps/shelf.py:144 +#: cps/admin.py:1368 cps/admin.py:1371 cps/admin.py:1756 cps/admin.py:1965 +#: cps/admin.py:2063 cps/admin.py:2184 cps/editbooks.py:170 +#: cps/editbooks.py:772 cps/editbooks.py:1518 cps/shelf.py:90 cps/shelf.py:144 #: cps/shelf.py:194 cps/shelf.py:237 cps/shelf.py:287 cps/shelf.py:327 -#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:160 cps/web.py:1526 +#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:161 cps/web.py:1536 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Erro de banco de dados: %(error)s." -#: cps/admin.py:1350 +#: cps/admin.py:1378 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "E-mail de teste enfileirado para envio para %(email)s, verifique o resultado em Tarefas" -#: cps/admin.py:1353 +#: cps/admin.py:1381 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Ocorreu um erro ao enviar o e-mail de teste: %(res)s" -#: cps/admin.py:1355 +#: cps/admin.py:1383 msgid "Please configure your e-mail address first..." msgstr "Por favor, configure seu endereço de e-mail primeiro..." -#: cps/admin.py:1357 +#: cps/admin.py:1385 msgid "Email Server Settings updated" msgstr "Atualização das configurações do servidor de e-mail" -#: cps/admin.py:1380 cps/templates/admin.html:195 +#: cps/admin.py:1408 cps/templates/admin.html:211 msgid "Edit Scheduled Tasks Settings" msgstr "Editar configurações de tarefas agendadas" -#: cps/admin.py:1392 +#: cps/admin.py:1420 msgid "Invalid start time for task specified" msgstr "Hora de início inválida para a tarefa especificada" -#: cps/admin.py:1397 +#: cps/admin.py:1425 msgid "Invalid duration for task specified" msgstr "Duração inválida para a tarefa especificada" -#: cps/admin.py:1407 +#: cps/admin.py:1435 msgid "Scheduled tasks settings updated" msgstr "Configurações de tarefas agendadas atualizadas" -#: cps/admin.py:1417 cps/admin.py:1466 cps/admin.py:2102 cps/web.py:1325 +#: cps/admin.py:1445 cps/admin.py:1494 cps/admin.py:2180 cps/web.py:1335 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Ocorreu um erro desconhecido. Por favor, tente novamente mais tarde." -#: cps/admin.py:1421 +#: cps/admin.py:1449 msgid "Settings DB is not Writeable" msgstr "Settings DB não é gravável" -#: cps/admin.py:1451 cps/admin.py:2094 +#: cps/admin.py:1479 cps/admin.py:2172 #, python-format msgid "Edit User %(nick)s" msgstr "Editar Usuário %(nick)s" -#: cps/admin.py:1463 +#: cps/admin.py:1491 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "Sucesso! Senha do usuário %(user)s redefinida" -#: cps/admin.py:1469 +#: cps/admin.py:1497 msgid "Oops! Please configure the SMTP mail settings." msgstr "Ops! Por favor, altere as configurações SMTP do servidor de e-mail." -#: cps/admin.py:1480 +#: cps/admin.py:1508 msgid "Logfile viewer" msgstr "Visualizador do Log" -#: cps/admin.py:1546 +#: cps/admin.py:1574 msgid "Requesting update package" msgstr "Solicitação de pacote de atualização" -#: cps/admin.py:1547 +#: cps/admin.py:1575 msgid "Downloading update package" msgstr "Baixando pacote de atualização" -#: cps/admin.py:1548 +#: cps/admin.py:1576 msgid "Unzipping update package" msgstr "Descompactando pacote de atualização" -#: cps/admin.py:1549 +#: cps/admin.py:1577 msgid "Replacing files" msgstr "Substituindo arquivos" -#: cps/admin.py:1550 +#: cps/admin.py:1578 msgid "Database connections are closed" msgstr "As conexões à base de dados estão fechadas" -#: cps/admin.py:1551 +#: cps/admin.py:1579 msgid "Stopping server" msgstr "Parando servidor" -#: cps/admin.py:1552 +#: cps/admin.py:1580 msgid "Update finished, please press okay and reload page" msgstr "Atualização concluída, pressione okay e recarregue a página" -#: cps/admin.py:1553 cps/admin.py:1554 cps/admin.py:1555 cps/admin.py:1556 -#: cps/admin.py:1557 cps/admin.py:1558 +#: cps/admin.py:1581 cps/admin.py:1582 cps/admin.py:1583 cps/admin.py:1584 +#: cps/admin.py:1585 cps/admin.py:1586 msgid "Update failed:" msgstr "Atualização falhou:" -#: cps/admin.py:1553 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1581 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "Erro HTTP" -#: cps/admin.py:1554 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1582 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Erro de conexão" -#: cps/admin.py:1555 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1583 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Tempo limite durante o estabelecimento da conexão" -#: cps/admin.py:1556 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1584 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Erro geral" -#: cps/admin.py:1557 +#: cps/admin.py:1585 msgid "Update file could not be saved in temp dir" msgstr "Arquivo de atualização não pôde ser salvo no diretório temporário" -#: cps/admin.py:1558 +#: cps/admin.py:1586 msgid "Files could not be replaced during update" msgstr "Arquivos não puderam ser substituídos durante a atualização" -#: cps/admin.py:1582 +#: cps/admin.py:1610 msgid "Failed to extract at least One LDAP User" msgstr "Falha ao extrair pelo menos um usuário LDAP" -#: cps/admin.py:1627 +#: cps/admin.py:1655 msgid "Failed to Create at Least One LDAP User" msgstr "Falha ao criar pelo menos um usuário LDAP" -#: cps/admin.py:1640 +#: cps/admin.py:1668 #, python-format msgid "Error: %(ldaperror)s" msgstr "Erro: %(ldaperror)s" -#: cps/admin.py:1644 +#: cps/admin.py:1672 msgid "Error: No user returned in response of LDAP server" msgstr "Erro: Nenhum usuário retornado na resposta do servidor LDAP" -#: cps/admin.py:1680 +#: cps/admin.py:1708 msgid "At Least One LDAP User Not Found in Database" msgstr "No mínimo um usuário LDAP não encontrado no banco de dados" -#: cps/admin.py:1682 +#: cps/admin.py:1710 #, python-brace-format msgid "{} User Successfully Imported" msgstr "{} Usuário Importado com Sucesso" -#: cps/admin.py:1740 +#: cps/admin.py:1768 msgid "Books path not valid" msgstr "A localização dos livros não é válida" -#: cps/admin.py:1746 +#: cps/admin.py:1774 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "A localização do banco de dados não é válida, digite o caminho correto" -#: cps/admin.py:1774 +#: cps/admin.py:1802 msgid "DB is not Writeable" msgstr "DB não é gravável" -#: cps/admin.py:1788 +#: cps/admin.py:1816 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "Localização do Keyfile Inválida, Insira o Caminho Correto" -#: cps/admin.py:1792 +#: cps/admin.py:1820 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "Localização do Certfile Inválida, Insira o Caminho Correto" -#: cps/admin.py:1872 +#: cps/admin.py:1846 +msgid "Kepubify binary not found" +msgstr "" + +#: cps/admin.py:1894 +msgid "reverse proxy login header name" +msgstr "" + +#: cps/admin.py:1904 +msgid "reverse proxy shared secret header name" +msgstr "" + +#: cps/admin.py:1913 +msgid "Please configure both reverse proxy shared secret header name and secret" +msgstr "" + +#: cps/admin.py:1917 +msgid "Please configure reverse proxy shared secret header name and secret or disable the feature" +msgstr "" + +#: cps/admin.py:1922 +msgid "Please configure at least one trusted reverse proxy IP or CIDR" +msgstr "" + +#: cps/admin.py:1946 msgid "Password length has to be between 1 and 40" msgstr "O comprimento da senha deve estar entre 1 e 40" -#: cps/admin.py:1926 +#: cps/admin.py:1957 cps/helper.py:1007 +msgid "Please specify a valid UnRar directory" +msgstr "" + +#: cps/admin.py:2004 msgid "Database Settings updated" msgstr "Configurações do Banco de Dados Atualizada" -#: cps/admin.py:1934 +#: cps/admin.py:2012 msgid "Database Configuration" msgstr "Configuração do Banco de Dados" -#: cps/admin.py:1949 cps/web.py:1295 +#: cps/admin.py:2027 cps/web.py:1305 msgid "Oops! Please complete all fields." msgstr "Por favor, preencha todos os campos!" -#: cps/admin.py:1958 +#: cps/admin.py:2036 msgid "E-mail is not from valid domain" msgstr "O e-mail não é de um domínio válido" -#: cps/admin.py:1964 +#: cps/admin.py:2042 msgid "Add new user" msgstr "Adicionar novo usuário" -#: cps/admin.py:1975 +#: cps/admin.py:2053 #, python-format msgid "User '%(user)s' created" msgstr "Usuário '%(user)s' criado" -#: cps/admin.py:1981 +#: cps/admin.py:2059 msgid "Oops! An account already exists for this Email. or name." msgstr "Encontrada uma conta existente para este endereço de e-mail ou apelido." -#: cps/admin.py:2011 +#: cps/admin.py:2089 #, python-format msgid "User '%(nick)s' deleted" msgstr "Usuário '%(nick)s' excluído" -#: cps/admin.py:2014 +#: cps/admin.py:2092 msgid "Can't delete Guest User" msgstr "Impossível excluir Convidado" -#: cps/admin.py:2017 +#: cps/admin.py:2095 msgid "No admin user remaining, can't delete user" msgstr "Nenhum usuário administrador restante, não é possível apagar o usuário" -#: cps/admin.py:2072 cps/web.py:1475 +#: cps/admin.py:2150 cps/web.py:1485 msgid "Email can't be empty and has to be a valid Email" msgstr "O e-mail não pode ficar vazio e deve ser um endereço de e-mail válido" -#: cps/admin.py:2098 +#: cps/admin.py:2176 #, python-format msgid "User '%(nick)s' updated" msgstr "Usuário '%(nick)s' atualizado" @@ -538,145 +577,153 @@ msgstr "Usuário '%(nick)s' atualizado" msgid "Search" msgstr "Pesquisar" -#: cps/converter.py:31 +#: cps/converter.py:32 msgid "not installed" msgstr "não instalado" -#: cps/converter.py:32 +#: cps/converter.py:33 msgid "Execution permissions missing" msgstr "Faltam as permissões de execução" -#: cps/db.py:1129 cps/templates/config_edit.html:207 +#: cps/db.py:1129 cps/templates/config_edit.html:229 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:565 cps/web.py:599 cps/web.py:644 cps/web.py:684 cps/web.py:711 -#: cps/web.py:998 cps/web.py:1028 cps/web.py:1073 cps/web.py:1101 -#: cps/web.py:1140 +#: cps/web.py:567 cps/web.py:601 cps/web.py:646 cps/web.py:686 cps/web.py:713 +#: cps/web.py:1000 cps/web.py:1030 cps/web.py:1075 cps/web.py:1103 +#: cps/web.py:1142 msgid "None" msgstr "Nenhum" -#: cps/editbooks.py:155 +#: cps/editbooks.py:156 #, python-format msgid "File %(file)s uploaded" msgstr "Arquivo %(file)s enviado" -#: cps/editbooks.py:184 +#: cps/editbooks.py:185 msgid "Source or destination format for conversion missing" msgstr "Formato de origem ou destino para conversão ausente" -#: cps/editbooks.py:192 +#: cps/editbooks.py:189 cps/editbooks.py:197 +msgid "Source format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:201 +msgid "Destination format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:209 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Livro enfileirado com sucesso para conversão em %(book_format)s" -#: cps/editbooks.py:196 +#: cps/editbooks.py:213 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Ocorreu um erro ao converter este livro: %(res)s" -#: cps/editbooks.py:297 +#: cps/editbooks.py:314 msgid "Changes successfully applied" msgstr "Alterações aplicadas com sucesso" -#: cps/editbooks.py:317 +#: cps/editbooks.py:334 msgid "Value is missing on request" msgstr "Valor ausente na requisição" -#: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 -#: cps/editbooks.py:1146 cps/web.py:532 cps/web.py:1567 cps/web.py:1613 -#: cps/web.py:1663 +#: cps/editbooks.py:336 cps/editbooks.py:343 cps/editbooks.py:644 +#: cps/editbooks.py:1170 cps/web.py:534 cps/web.py:1577 cps/web.py:1623 +#: cps/web.py:1673 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Oops! O Livro selecionado não está disponível. O arquivo não existe ou não é acessível" -#: cps/editbooks.py:673 cps/editbooks.py:1503 +#: cps/editbooks.py:690 cps/editbooks.py:1547 msgid "User has no rights to upload cover" msgstr "Usuário não tem permissão para fazer upload da capa" -#: cps/editbooks.py:694 cps/editbooks.py:938 +#: cps/editbooks.py:711 cps/editbooks.py:961 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "Os identificadores não diferenciam maiúsculas de minúsculas, substituindo o identificador antigo" -#: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 +#: cps/editbooks.py:726 cps/editbooks.py:935 cps/editbooks.py:1306 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "%(langname)s não é um idioma válido" -#: cps/editbooks.py:737 +#: cps/editbooks.py:754 msgid "Metadata successfully updated" msgstr "Metadados atualizados com sucesso" -#: cps/editbooks.py:760 +#: cps/editbooks.py:777 #, python-brace-format msgid "Error editing book: {}" msgstr "Erro ao editar o livro: {}" -#: cps/editbooks.py:856 +#: cps/editbooks.py:879 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "O livro carregado provavelmente existe na biblioteca, considere alterar antes de carregar novo: " -#: cps/editbooks.py:950 cps/editbooks.py:1420 +#: cps/editbooks.py:973 cps/editbooks.py:1464 msgid "File type isn't allowed to be uploaded to this server" msgstr "Este tipo de arquivo não pode ser enviado para este servidor" -#: cps/editbooks.py:956 cps/editbooks.py:1431 +#: cps/editbooks.py:979 cps/editbooks.py:1475 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "A extensão de arquivo '%(ext)s' não pode ser enviada para este servidor" -#: cps/editbooks.py:960 cps/editbooks.py:1436 +#: cps/editbooks.py:983 cps/editbooks.py:1480 msgid "File to be uploaded must have an extension" msgstr "O arquivo a ser carregado deve ter uma extensão" -#: cps/editbooks.py:968 +#: cps/editbooks.py:992 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "O arquivo %(filename)s não pôde ser salvo no diretório temporário" -#: cps/editbooks.py:988 +#: cps/editbooks.py:1012 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Falha ao mover arquivo de capa %(file)s: %(error)s" -#: cps/editbooks.py:1041 +#: cps/editbooks.py:1065 msgid "Book Format Successfully Deleted" msgstr "Formato do Livro Apagado com Sucesso" -#: cps/editbooks.py:1044 cps/editbooks.py:1061 +#: cps/editbooks.py:1068 cps/editbooks.py:1085 msgid "Book Successfully Deleted" msgstr "Livro Apagado com Sucesso" -#: cps/editbooks.py:1065 +#: cps/editbooks.py:1089 msgid "You are missing permissions to delete books" msgstr "Você não tem permissão para apagar livros" -#: cps/editbooks.py:1139 +#: cps/editbooks.py:1163 #, python-brace-format msgid "Book with id \"{}\" could not be deleted: not found" msgstr "Livro com id \"{}\" não pôde ser apagado: não encontrado" -#: cps/editbooks.py:1181 +#: cps/editbooks.py:1205 msgid "edit metadata" msgstr "editar metadados" -#: cps/editbooks.py:1234 +#: cps/editbooks.py:1267 #, python-format msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "Seriesindex: %(seriesindex)s não é um número válido, ignorando" -#: cps/editbooks.py:1425 +#: cps/editbooks.py:1469 msgid "User has no rights to upload additional file formats" msgstr "Usuário não tem direitos para fazer upload de formatos de arquivo adicionais" -#: cps/editbooks.py:1449 +#: cps/editbooks.py:1493 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Falha ao criar o caminho %(path)s (Permission denied)." -#: cps/editbooks.py:1456 +#: cps/editbooks.py:1500 #, python-format msgid "Failed to store file %(file)s." msgstr "Falha ao armazenar o arquivo %(file)s." -#: cps/editbooks.py:1481 +#: cps/editbooks.py:1525 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Formato de arquivo %(ext)s adicionado a %(book)s" @@ -687,9 +734,9 @@ msgstr "Aguarde um minuto para registrar o próximo usuário" #: cps/error_handler.py:108 cps/templates/layout.html:69 #: cps/templates/layout.html:104 cps/templates/login.html:27 -#: cps/templates/register.html:17 cps/web.py:1292 cps/web.py:1296 -#: cps/web.py:1302 cps/web.py:1326 cps/web.py:1330 cps/web.py:1343 -#: cps/web.py:1346 +#: cps/templates/register.html:17 cps/web.py:1302 cps/web.py:1306 +#: cps/web.py:1312 cps/web.py:1336 cps/web.py:1340 cps/web.py:1353 +#: cps/web.py:1356 msgid "Register" msgstr "Registe-se" @@ -710,7 +757,7 @@ msgstr "O domínio Callback não foi verificado, por favor siga os passos para v msgid "%(format)s format not found for book id: %(book)d" msgstr "Formato %(format)s não encontrado para o id do livro: %(book)d" -#: cps/helper.py:94 cps/tasks/convert.py:91 +#: cps/helper.py:94 cps/tasks/convert.py:92 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s não encontrado no Google Drive: %(fn)s" @@ -896,10 +943,6 @@ msgstr "Apenas arquivos jpg/jpeg são suportados como arquivos de capa" msgid "Cover" msgstr "Capa" -#: cps/helper.py:1006 -msgid "UnRar binary file not found" -msgstr "Binário UnRar não encontrado" - #: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "Erro ao executar UnRar" @@ -930,7 +973,7 @@ msgstr "Permissões de execução ausentes: %(missing)s" msgid "Error executing Calibre" msgstr "Erro ao executar Calibre" -#: cps/helper.py:1154 cps/templates/admin.html:216 +#: cps/helper.py:1154 cps/templates/admin.html:232 msgid "Queue all books for metadata backup" msgstr "Enfileirar todos os livros para backup de Metadados" @@ -952,7 +995,7 @@ msgstr "Registre-se com %(provider)s" msgid "This %(oauth)s account is already linked to a different user" msgstr "" -#: cps/oauth_bb.py:147 cps/remotelogin.py:131 +#: cps/oauth_bb.py:147 cps/remotelogin.py:150 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "agora você está logado como: '%(nickname)s'" @@ -1020,25 +1063,29 @@ msgstr "Erro no Oauth do Google: {}" msgid "{} Stars" msgstr "{} Estrelas" -#: cps/remotelogin.py:63 cps/templates/layout.html:68 -#: cps/templates/layout.html:103 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1361 -msgid "Login" -msgstr "Login" - -#: cps/remotelogin.py:75 cps/remotelogin.py:109 +#: cps/remotelogin.py:46 cps/remotelogin.py:128 msgid "Token not found" msgstr "Token não encontrado" -#: cps/remotelogin.py:84 cps/remotelogin.py:117 +#: cps/remotelogin.py:55 cps/remotelogin.py:136 msgid "Token has expired" msgstr "O Token expirou" -#: cps/remotelogin.py:93 +#: cps/remotelogin.py:86 cps/remotelogin.py:112 cps/templates/layout.html:68 +#: cps/templates/layout.html:103 cps/templates/login.html:4 +#: cps/templates/login.html:21 cps/web.py:1371 +msgid "Login" +msgstr "Login" + +#: cps/remotelogin.py:100 +msgid "Token already approved" +msgstr "" + +#: cps/remotelogin.py:108 msgid "Success! Please return to your device" msgstr "Sucesso! Por favor, volte ao seu aparelho" -#: cps/render_template.py:41 cps/web.py:421 +#: cps/render_template.py:41 cps/web.py:423 msgid "Books" msgstr "Livros" @@ -1063,7 +1110,7 @@ msgstr "Livros Baixados" msgid "Show Downloaded Books" msgstr "Mostrar Livros Baixados" -#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:436 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:438 msgid "Top Rated Books" msgstr "Livros Mais Bem Avaliados" @@ -1072,7 +1119,7 @@ msgid "Show Top Rated Books" msgstr "Mostrar Livros Mais Bem Avaliados" #: cps/render_template.py:61 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:769 +#: cps/templates/index.xml:67 cps/web.py:771 msgid "Read Books" msgstr "Livros Lidos" @@ -1081,7 +1128,7 @@ msgid "Show Read and Unread" msgstr "Mostrar lidos e não lidos" #: cps/render_template.py:65 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:772 +#: cps/templates/index.xml:74 cps/web.py:774 msgid "Unread Books" msgstr "Livros Não Lidos" @@ -1099,7 +1146,7 @@ msgid "Show Random Books" msgstr "Mostrar Livros Aleatórios" #: cps/render_template.py:71 cps/templates/book_table.html:93 -#: cps/templates/index.xml:97 cps/web.py:1144 +#: cps/templates/index.xml:97 cps/web.py:1146 msgid "Categories" msgstr "Categorias" @@ -1109,7 +1156,7 @@ msgstr "Mostrar seção de categorias" #: cps/render_template.py:74 cps/templates/book_edit.html:86 #: cps/templates/book_table.html:94 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1034 cps/web.py:1046 +#: cps/templates/search_form.html:70 cps/web.py:1036 cps/web.py:1048 msgid "Series" msgstr "Série" @@ -1127,7 +1174,7 @@ msgid "Show Author Section" msgstr "Mostrar seção de autores" #: cps/render_template.py:81 cps/templates/book_table.html:98 -#: cps/templates/index.xml:88 cps/web.py:1002 +#: cps/templates/index.xml:88 cps/web.py:1004 msgid "Publishers" msgstr "Editoras" @@ -1137,7 +1184,7 @@ msgstr "Mostrar seção de editoras" #: cps/render_template.py:84 cps/templates/book_table.html:96 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1116 +#: cps/web.py:1118 msgid "Languages" msgstr "Idiomas" @@ -1161,7 +1208,7 @@ msgstr "Formatos de arquivo" msgid "Show File Formats Section" msgstr "Mostrar seção de formatos de arquivo" -#: cps/render_template.py:95 cps/web.py:795 +#: cps/render_template.py:95 cps/web.py:797 msgid "Archived Books" msgstr "Livros Arquivados" @@ -1169,7 +1216,7 @@ msgstr "Livros Arquivados" msgid "Show Archived Books" msgstr "Mostrar livros arquivados" -#: cps/render_template.py:100 cps/web.py:831 +#: cps/render_template.py:100 cps/web.py:833 msgid "Books List" msgstr "Lista de Livros" @@ -1402,150 +1449,154 @@ msgstr "Uma nova atualização está disponível. Clique no botão abaixo para a msgid "No release information available" msgstr "Não há informações de lançamento disponíveis" -#: cps/templates/index.html:6 cps/web.py:448 +#: cps/templates/index.html:6 cps/web.py:450 msgid "Discover (Random Books)" msgstr "Descobrir (Livros Aleatórios)" -#: cps/web.py:484 +#: cps/web.py:486 msgid "Hot Books (Most Downloaded)" msgstr "Livros Quentess (Mais Baixados)" -#: cps/web.py:515 +#: cps/web.py:517 #, python-format msgid "Downloaded books by %(user)s" msgstr "Livros baixados por %(user)s" -#: cps/web.py:548 +#: cps/web.py:550 #, python-format msgid "Author: %(name)s" msgstr "Autor: %(name)s" -#: cps/web.py:584 +#: cps/web.py:586 #, python-format msgid "Publisher: %(name)s" msgstr "Editora: %(name)s" -#: cps/web.py:612 +#: cps/web.py:614 #, python-format msgid "Series: %(serie)s" msgstr "Série: %(serie)s" -#: cps/web.py:626 +#: cps/web.py:628 msgid "Rating: None" msgstr "Avaliação: Nenhuma" -#: cps/web.py:635 +#: cps/web.py:637 #, python-format msgid "Rating: %(rating)s stars" msgstr "Avaliação: %(rating)s estrelas" -#: cps/web.py:666 +#: cps/web.py:668 #, python-format msgid "File format: %(format)s" msgstr "Formato do arquivo: %(format)s" -#: cps/web.py:701 +#: cps/web.py:703 #, python-format msgid "Category: %(name)s" msgstr "Categoria: %(name)s" -#: cps/web.py:730 +#: cps/web.py:732 #, python-format msgid "Language: %(name)s" msgstr "Idioma: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:974 +#: cps/templates/admin.html:16 cps/web.py:976 msgid "Downloads" msgstr "Downloads" -#: cps/web.py:1076 +#: cps/web.py:1078 msgid "Ratings list" msgstr "Lista de Avaliações" -#: cps/web.py:1103 +#: cps/web.py:1105 msgid "File formats list" msgstr "Lista de formatos de arquivo" -#: cps/web.py:1264 +#: cps/web.py:1272 +msgid "Book format not supported" +msgstr "" + +#: cps/web.py:1274 msgid "Please configure the SMTP mail settings first..." msgstr "Por favor, configure primeiro as configurações de e-mail SMTP..." -#: cps/web.py:1270 +#: cps/web.py:1280 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Livro enfileirado com sucesso para envio para %(eReadermail)s" -#: cps/web.py:1273 +#: cps/web.py:1283 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Ops! Ocorreu um erro ao enviar este livro: %(res)s" -#: cps/web.py:1275 +#: cps/web.py:1285 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Ops! Atualize seu perfil com um e-mail de eReader válido." -#: cps/web.py:1291 cps/web.py:1342 +#: cps/web.py:1301 cps/web.py:1352 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "O servidor de E-Mail não está configurado, por favor contacte o seu administrador!" -#: cps/web.py:1328 +#: cps/web.py:1338 msgid "Oops! Your Email is not allowed." msgstr "Seu e-mail não tem permissão para registrar" -#: cps/web.py:1331 +#: cps/web.py:1341 msgid "Success! Confirmation Email has been sent." msgstr "O e-mail de confirmação foi enviado para a sua conta de e-mail." -#: cps/web.py:1376 cps/web.py:1390 +#: cps/web.py:1386 cps/web.py:1400 msgid "Cannot activate LDAP authentication" msgstr "Não foi possível ativar a autenticação LDAP" -#: cps/web.py:1399 +#: cps/web.py:1409 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "agora você está conectado como: '%(nickname)s'" -#: cps/web.py:1406 +#: cps/web.py:1416 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Login de contingência como: '%(nickname)s'; servidor LDAP inacessível ou usuário desconhecido" -#: cps/web.py:1411 +#: cps/web.py:1421 #, python-format msgid "Could not login: %(message)s" msgstr "Não foi possível fazer login: %(message)s" -#: cps/web.py:1415 cps/web.py:1440 +#: cps/web.py:1425 cps/web.py:1450 msgid "Wrong Username or Password" msgstr "Nome de usuário ou senha incorretos" -#: cps/web.py:1422 +#: cps/web.py:1432 msgid "New Password was sent to your email address" msgstr "Uma nova senha foi enviada para o seu endereço de e-mail" -#: cps/web.py:1426 +#: cps/web.py:1436 msgid "An unknown error occurred. Please try again later." msgstr "Ocorreu um erro desconhecido. Tente novamente mais tarde." -#: cps/web.py:1428 +#: cps/web.py:1438 msgid "Please enter valid username to reset password" msgstr "Digite um nome de usuário válido para redefinir a senha" -#: cps/web.py:1436 +#: cps/web.py:1446 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Agora você está conectado como: '%(nickname)s'" -#: cps/web.py:1501 cps/web.py:1551 +#: cps/web.py:1511 cps/web.py:1561 #, python-format msgid "%(name)s's Profile" msgstr "Perfil de %(name)s" -#: cps/web.py:1517 +#: cps/web.py:1527 msgid "Success! Profile Updated" msgstr "Sucesso! Perfil atualizado" -#: cps/web.py:1521 +#: cps/web.py:1531 msgid "Oops! An account already exists for this Email." msgstr "Encontrada uma conta existente para este endereço de e-mail." @@ -1557,46 +1608,46 @@ msgstr "Não foi encontrado nenhum arquivo gmail.json válido com informações msgid "Delete temp folder contents" msgstr "Excluir conteúdo da pasta temporária" -#: cps/tasks/convert.py:112 +#: cps/tasks/convert.py:113 #, python-format msgid "%(book)s send to E-Reader" msgstr "%(book)s enviado para E-Reader" -#: cps/tasks/convert.py:177 +#: cps/tasks/convert.py:180 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre ebook-convert %(tool)s não encontrado" -#: cps/tasks/convert.py:211 +#: cps/tasks/convert.py:214 #, python-format msgid "%(format)s format not found on disk" msgstr "Formato %(format)s não encontrado no disco" -#: cps/tasks/convert.py:215 +#: cps/tasks/convert.py:218 msgid "Ebook converter failed with unknown error" msgstr "O conversor de Ebook falhou com erro desconhecido" -#: cps/tasks/convert.py:234 +#: cps/tasks/convert.py:237 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify-converter falhou: %(error)s" -#: cps/tasks/convert.py:254 +#: cps/tasks/convert.py:257 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Arquivo convertido não encontrado ou mais de um arquivo na pasta %(folder)s" -#: cps/tasks/convert.py:291 cps/tasks/convert.py:342 +#: cps/tasks/convert.py:294 cps/tasks/convert.py:345 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre falhou com erro: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:322 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Ebook-converter falhou: %(error)s" -#: cps/tasks/convert.py:347 +#: cps/tasks/convert.py:350 msgid "Convert" msgstr "Converter" @@ -1682,7 +1733,7 @@ msgstr "Editar" #: cps/templates/admin.html:25 cps/templates/book_edit.html:17 #: cps/templates/book_table.html:131 cps/templates/book_table.html:180 -#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:115 +#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:117 #: cps/templates/user_edit.html:67 cps/templates/user_table.html:149 msgid "Delete" msgstr "Apagar" @@ -1772,128 +1823,145 @@ msgstr "Login remoto Magic Link" msgid "Reverse Proxy Login" msgstr "Login de Proxy Reverso" -#: cps/templates/admin.html:154 cps/templates/config_edit.html:176 +#: cps/templates/admin.html:154 cps/templates/config_edit.html:180 msgid "Reverse Proxy Header Name" msgstr "Nome do cabeçalho do Proxy Reverso" -#: cps/templates/admin.html:159 +#: cps/templates/admin.html:158 +msgid "Reverse Proxy Trusted IPs/CIDRs" +msgstr "" + +#: cps/templates/admin.html:162 cps/templates/config_edit.html:193 +msgid "Reverse Proxy Shared Secret Header Name" +msgstr "" + +#: cps/templates/admin.html:166 +msgid "Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/admin.html:170 +msgid "Reverse Proxy Shared Secret Configured" +msgstr "" + +#: cps/templates/admin.html:175 msgid "Edit Calibre Database Configuration" msgstr "Editar Configuração do Banco de Dados do Calibre" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:176 msgid "Edit Basic Configuration" msgstr "Editar Configurações Básicas" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:177 msgid "Edit UI Configuration" msgstr "Editar Configuração de UI" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:183 msgid "Scheduled Tasks" msgstr "Tarefas Agendadas" -#: cps/templates/admin.html:170 cps/templates/schedule_edit.html:12 +#: cps/templates/admin.html:186 cps/templates/schedule_edit.html:12 #: cps/templates/tasks.html:18 msgid "Start Time" msgstr "Hora em que as tarefas começam a ser executadas" -#: cps/templates/admin.html:174 cps/templates/schedule_edit.html:20 +#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:20 msgid "Maximum Duration" msgstr "Duração máxima das tarefas" -#: cps/templates/admin.html:178 cps/templates/schedule_edit.html:29 +#: cps/templates/admin.html:194 cps/templates/schedule_edit.html:29 msgid "Generate Thumbnails" msgstr "Gerar miniaturas de capa de livro" -#: cps/templates/admin.html:182 +#: cps/templates/admin.html:198 msgid "Generate series cover thumbnails" msgstr "Gerar miniaturas de capa de séries" -#: cps/templates/admin.html:186 cps/templates/admin.html:208 +#: cps/templates/admin.html:202 cps/templates/admin.html:224 #: cps/templates/schedule_edit.html:37 msgid "Reconnect Calibre Database" msgstr "Reconectar à Biblioteca do Calibre" -#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 +#: cps/templates/admin.html:206 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" msgstr "Gerar arquivos de backup de metadados" -#: cps/templates/admin.html:197 +#: cps/templates/admin.html:213 msgid "Refresh Thumbnail Cache" msgstr "Atualizar Cache de Capas de Miniaturas" -#: cps/templates/admin.html:203 +#: cps/templates/admin.html:219 msgid "Administration" msgstr "Administração" -#: cps/templates/admin.html:204 +#: cps/templates/admin.html:220 msgid "Download Debug Package" msgstr "Baixar Pacote de Depuração" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:221 msgid "View Logs" msgstr "Ver Logs" -#: cps/templates/admin.html:211 +#: cps/templates/admin.html:227 msgid "Restart" msgstr "Reiniciar" -#: cps/templates/admin.html:212 +#: cps/templates/admin.html:228 msgid "Shutdown" msgstr "Desligar" -#: cps/templates/admin.html:221 +#: cps/templates/admin.html:237 msgid "Version Information" msgstr "Informação da Versão" -#: cps/templates/admin.html:225 +#: cps/templates/admin.html:241 msgid "Version" msgstr "Versão" -#: cps/templates/admin.html:226 +#: cps/templates/admin.html:242 msgid "Details" msgstr "Detalhes" -#: cps/templates/admin.html:232 +#: cps/templates/admin.html:248 msgid "Current Version" msgstr "Versão atual" -#: cps/templates/admin.html:239 +#: cps/templates/admin.html:255 msgid "Check for Update" msgstr "Verificar Atualizações" -#: cps/templates/admin.html:240 +#: cps/templates/admin.html:256 msgid "Perform Update" msgstr "Realizar Atualizações" -#: cps/templates/admin.html:253 +#: cps/templates/admin.html:269 msgid "Are you sure you want to restart?" msgstr "Tem a certeza que quer reiniciar?" -#: cps/templates/admin.html:258 cps/templates/admin.html:272 -#: cps/templates/admin.html:292 cps/templates/config_db.html:82 +#: cps/templates/admin.html:274 cps/templates/admin.html:288 +#: cps/templates/admin.html:308 cps/templates/config_db.html:82 msgid "OK" msgstr "Ok" -#: cps/templates/admin.html:259 cps/templates/admin.html:273 +#: cps/templates/admin.html:275 cps/templates/admin.html:289 #: cps/templates/book_edit.html:220 cps/templates/book_table.html:162 #: cps/templates/book_table.html:181 cps/templates/book_table.html:201 #: cps/templates/book_table.html:221 cps/templates/book_table.html:241 #: cps/templates/book_table.html:261 cps/templates/book_table.html:316 -#: cps/templates/config_db.html:66 cps/templates/config_edit.html:431 +#: cps/templates/config_db.html:66 cps/templates/config_edit.html:453 #: cps/templates/config_view_edit.html:175 cps/templates/detail.html:350 -#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:98 -#: cps/templates/modal_dialogs.html:116 cps/templates/modal_dialogs.html:134 +#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:100 +#: cps/templates/modal_dialogs.html:118 cps/templates/modal_dialogs.html:136 +#: cps/templates/remote_login_verify.html:16 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 #: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Cancelar" -#: cps/templates/admin.html:271 +#: cps/templates/admin.html:287 msgid "Are you sure you want to shutdown?" msgstr "Tem certeza que quer encerrar?" -#: cps/templates/admin.html:283 +#: cps/templates/admin.html:299 msgid "Updating, please do not reload this page" msgstr "Atualizando, por favor não recarregue esta página" @@ -2134,7 +2202,7 @@ msgid "Fetch Metadata" msgstr "Buscar Metadados" #: cps/templates/book_edit.html:219 cps/templates/config_db.html:65 -#: cps/templates/config_edit.html:430 cps/templates/config_view_edit.html:174 +#: cps/templates/config_edit.html:452 cps/templates/config_view_edit.html:174 #: cps/templates/email_edit.html:65 cps/templates/schedule_edit.html:44 #: cps/templates/shelf_edit.html:25 cps/templates/shelf_order.html:41 #: cps/templates/user_edit.html:142 @@ -2506,214 +2574,234 @@ msgstr "Chave da API do Google Books" msgid "Allow Reverse Proxy Authentication" msgstr "Permitir a Autenticação por Proxy Reverso" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:176 +msgid "Security Warning" +msgstr "" + +#: cps/templates/config_edit.html:177 +msgid "Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled." +msgstr "" + +#: cps/templates/config_edit.html:184 +msgid "Reverse Proxy Trusted IPs/CIDRs (Comma Separated)" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "Enable Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/config_edit.html:197 +msgid "Reverse Proxy Shared Secret" +msgstr "" + +#: cps/templates/config_edit.html:205 msgid "Login type" msgstr "Tipo de Login" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:207 msgid "Use Standard Authentication" msgstr "Usar Autenticação padrão" -#: cps/templates/config_edit.html:187 +#: cps/templates/config_edit.html:209 msgid "Use LDAP Authentication" msgstr "Usar Autenticação LDAP" -#: cps/templates/config_edit.html:190 +#: cps/templates/config_edit.html:212 msgid "Use OAuth" msgstr "Usar OAuth" -#: cps/templates/config_edit.html:197 +#: cps/templates/config_edit.html:219 msgid "LDAP Server Host Name or IP Address" msgstr "Nome ou endereço IP do servidor LDAP" -#: cps/templates/config_edit.html:201 +#: cps/templates/config_edit.html:223 msgid "LDAP Server Port" msgstr "Porta do servidor LDAP" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:227 msgid "LDAP Encryption" msgstr "Criptografia LDAP" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:230 msgid "TLS" msgstr "TLS" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:231 msgid "SSL" msgstr "SSL" -#: cps/templates/config_edit.html:213 +#: cps/templates/config_edit.html:235 msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" msgstr "Caminho do CACertificate LDAP (Necessário apenas para autenticação de certificado de cliente)" -#: cps/templates/config_edit.html:220 +#: cps/templates/config_edit.html:242 msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" msgstr "Caminho do Certificado LDAP (Necessário apenas para autenticação de certificado de cliente)" -#: cps/templates/config_edit.html:227 +#: cps/templates/config_edit.html:249 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" msgstr "Caminho do Keyfile LDAP (Necessário apenas para autenticação de certificado de cliente)" -#: cps/templates/config_edit.html:236 +#: cps/templates/config_edit.html:258 msgid "LDAP Authentication" msgstr "Autenticação LDAP" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:260 msgid "Anonymous" msgstr "Anônimo" -#: cps/templates/config_edit.html:239 +#: cps/templates/config_edit.html:261 msgid "Unauthenticated" msgstr "Não autenticado" -#: cps/templates/config_edit.html:240 +#: cps/templates/config_edit.html:262 msgid "Simple" msgstr "Simples" -#: cps/templates/config_edit.html:245 +#: cps/templates/config_edit.html:267 msgid "LDAP Administrator Username" msgstr "Nome de usuário do administrador LDAP" -#: cps/templates/config_edit.html:251 +#: cps/templates/config_edit.html:273 msgid "LDAP Administrator Password" msgstr "Senha de Administrador LDAP" -#: cps/templates/config_edit.html:256 +#: cps/templates/config_edit.html:278 msgid "LDAP Distinguished Name (DN)" msgstr "Nome Distinto LDAP (DN)" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:282 msgid "LDAP User Object Filter" msgstr "Filtro de Objeto do Usuário LDAP" -#: cps/templates/config_edit.html:265 +#: cps/templates/config_edit.html:287 msgid "LDAP Server is OpenLDAP?" msgstr "O Servidor LDAP é OpenLDAP?" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:289 msgid "Following Settings are Needed For User Import" msgstr "As seguintes configurações são necessárias para a mportação de Usuários" -#: cps/templates/config_edit.html:269 +#: cps/templates/config_edit.html:291 msgid "LDAP Group Object Filter" msgstr "Filtro de objetos do grupo LDAP" -#: cps/templates/config_edit.html:273 +#: cps/templates/config_edit.html:295 msgid "LDAP Group Name" msgstr "Nome do Grupo LDAP" -#: cps/templates/config_edit.html:277 +#: cps/templates/config_edit.html:299 msgid "LDAP Group Members Field" msgstr "Campo de Membros do Grupo LDAP" -#: cps/templates/config_edit.html:281 +#: cps/templates/config_edit.html:303 msgid "LDAP Member User Filter Detection" msgstr "LDAP Detecção de filtro de usuário membro LDAP" -#: cps/templates/config_edit.html:283 +#: cps/templates/config_edit.html:305 msgid "Autodetect" msgstr "Autodetectar" -#: cps/templates/config_edit.html:284 +#: cps/templates/config_edit.html:306 msgid "Custom Filter" msgstr "Filtro Personalizado" -#: cps/templates/config_edit.html:289 +#: cps/templates/config_edit.html:311 msgid "LDAP Member User Filter" msgstr "Filtro de Utilizador Membro LDAP" -#: cps/templates/config_edit.html:300 +#: cps/templates/config_edit.html:322 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "Obter credenciais OAuth de %(provider)s" -#: cps/templates/config_edit.html:303 +#: cps/templates/config_edit.html:325 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "ID do cliente OAuth de %(provider)s" -#: cps/templates/config_edit.html:307 +#: cps/templates/config_edit.html:329 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "Senha do cliente Oauth de %(provider)s" -#: cps/templates/config_edit.html:323 +#: cps/templates/config_edit.html:345 msgid "External binaries" msgstr "Binários externos" -#: cps/templates/config_edit.html:329 +#: cps/templates/config_edit.html:351 msgid "Path to Calibre Binaries" msgstr "Caminho para os binários do Calibre" -#: cps/templates/config_edit.html:337 +#: cps/templates/config_edit.html:359 msgid "Calibre E-Book Converter Settings" msgstr "Configurações do Calibre E-Book Converter" -#: cps/templates/config_edit.html:340 +#: cps/templates/config_edit.html:362 msgid "Path to Kepubify E-Book Converter" msgstr "Caminho para Kepubify E-Book Converter" -#: cps/templates/config_edit.html:348 +#: cps/templates/config_edit.html:370 msgid "Location of Unrar binary" msgstr "Localização do binário do Unrar" -#: cps/templates/config_edit.html:364 +#: cps/templates/config_edit.html:386 msgid "Security Settings" msgstr "Configurações de segurança" -#: cps/templates/config_edit.html:372 +#: cps/templates/config_edit.html:394 msgid "Limit failed login attempts" msgstr "Limitar tentativas de login malsucedidas" -#: cps/templates/config_edit.html:376 +#: cps/templates/config_edit.html:398 msgid "Configure Backend for Limiter" msgstr "Configurar backend do limitador" -#: cps/templates/config_edit.html:380 +#: cps/templates/config_edit.html:402 msgid "Options for Limiter Backend" msgstr "Opções do backend do limitador" -#: cps/templates/config_edit.html:386 +#: cps/templates/config_edit.html:408 msgid "Check if file extensions matches file content on upload" msgstr "Verificar se a extensão do arquivo corresponde ao conteúdo no upload" -#: cps/templates/config_edit.html:389 +#: cps/templates/config_edit.html:411 msgid "Session protection" msgstr "Proteção de sessão" -#: cps/templates/config_edit.html:391 +#: cps/templates/config_edit.html:413 msgid "Basic" msgstr "Básica" -#: cps/templates/config_edit.html:392 +#: cps/templates/config_edit.html:414 msgid "Strong" msgstr "Forte" -#: cps/templates/config_edit.html:397 +#: cps/templates/config_edit.html:419 msgid "User Password policy" msgstr "Política de senha do usuário" -#: cps/templates/config_edit.html:401 +#: cps/templates/config_edit.html:423 msgid "Minimum password length" msgstr "Comprimento mínimo da senha" -#: cps/templates/config_edit.html:406 +#: cps/templates/config_edit.html:428 msgid "Enforce number" msgstr "Exigir número" -#: cps/templates/config_edit.html:410 +#: cps/templates/config_edit.html:432 msgid "Enforce lowercase characters" msgstr "Exigir letras minúsculas" -#: cps/templates/config_edit.html:414 +#: cps/templates/config_edit.html:436 msgid "Enforce uppercase characters" msgstr "Exigir letras maiúsculas" -#: cps/templates/config_edit.html:418 +#: cps/templates/config_edit.html:440 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" msgstr "Exigir caracteres (necessário para caracteres chineses/japoneses/coreanos)" -#: cps/templates/config_edit.html:422 +#: cps/templates/config_edit.html:444 msgid "Enforce special characters" msgstr "Exigir caracteres especiais" @@ -3180,27 +3268,27 @@ msgstr "Os livros devem primeiro ser arquivados e o dispositivo deve ser sincron msgid "Choose File Location" msgstr "Escolha a Localização do Arquivo" -#: cps/templates/modal_dialogs.html:81 +#: cps/templates/modal_dialogs.html:82 msgid "type" msgstr "tipo" -#: cps/templates/modal_dialogs.html:82 +#: cps/templates/modal_dialogs.html:83 msgid "name" msgstr "nome" -#: cps/templates/modal_dialogs.html:83 +#: cps/templates/modal_dialogs.html:84 msgid "size" msgstr "tamanho" -#: cps/templates/modal_dialogs.html:89 +#: cps/templates/modal_dialogs.html:90 msgid "Parent Directory" msgstr "Diretório Acima" -#: cps/templates/modal_dialogs.html:97 +#: cps/templates/modal_dialogs.html:99 msgid "Select" msgstr "Selecione" -#: cps/templates/modal_dialogs.html:133 cps/templates/tasks.html:46 +#: cps/templates/modal_dialogs.html:135 cps/templates/tasks.html:46 msgid "Ok" msgstr "Ok" @@ -3456,6 +3544,31 @@ msgstr "Uma vez verificado, você será automaticamente conectado a este disposi msgid "This verification link will expire in 10 minutes." msgstr "Este link de verificação irá expirar em 10 minutos." +#: cps/templates/remote_login_verify.html:4 +msgid "Approve Magic Link Login" +msgstr "" + +#: cps/templates/remote_login_verify.html:5 +msgid "Review the device that requested access before approving this login." +msgstr "" + +#: cps/templates/remote_login_verify.html:7 +msgid "IP address" +msgstr "" + +#: cps/templates/remote_login_verify.html:9 +msgid "Browser" +msgstr "" + +#: cps/templates/remote_login_verify.html:12 +#, python-format +msgid "If you approve this request, the device that started it will be logged in as %(username)s." +msgstr "" + +#: cps/templates/remote_login_verify.html:15 +msgid "Approve Login" +msgstr "" + #: cps/templates/schedule_edit.html:33 msgid "Generate Series Cover Thumbnails" msgstr "Gerar miniaturas de capa de Série" diff --git a/cps/translations/ru/LC_MESSAGES/messages.mo b/cps/translations/ru/LC_MESSAGES/messages.mo index aecea5eee6be326ccd1715de0405bbf677c2d97b..145aa4530b9787c63055d9f0f89b9bf233293a00 100644 GIT binary patch delta 29 lcmZ2*hH1eWrVW~&>=p`!W>y9kn+-hO85u1$S9q<61^|`$35);$ delta 29 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Ν3<0l%+O7(nLWM#DUFCkhIX-1W60qq2`@y0^3v1 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\n" "Language: sk_SK\n" @@ -16,519 +16,558 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" +"Generated-By: Babel 2.18.0\n" #: cps/about.py:85 msgid "Statistics" msgstr "Štatistika" -#: cps/admin.py:151 +#: cps/admin.py:154 msgid "Server restarted, please reload page." msgstr "Server bol reštartovaný, znovu načítajte stránku." -#: cps/admin.py:153 +#: cps/admin.py:156 msgid "Performing Server shutdown, please close window." msgstr "Vypínam server, zavrite prosím okno." -#: cps/admin.py:161 +#: cps/admin.py:164 msgid "Success! Database Reconnected" msgstr "Spojenie s databázovo bolo úspešne znovu naviazané" -#: cps/admin.py:164 +#: cps/admin.py:167 msgid "Unknown command" msgstr "Neznámy príkaz" -#: cps/admin.py:175 +#: cps/admin.py:178 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "Úspech! Knihy boli zaradená do zálohovania metadát, skontrolujte si Úlohy na kontrolu" -#: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 -#: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 -#: cps/uploader.py:117 +#: cps/admin.py:211 cps/editbooks.py:825 cps/editbooks.py:875 +#: cps/editbooks.py:1564 cps/templates/remote_login_verify.html:8 +#: cps/templates/remote_login_verify.html:10 cps/updater.py:615 +#: cps/uploader.py:117 cps/uploader.py:126 msgid "Unknown" msgstr "Neznámy" -#: cps/admin.py:233 +#: cps/admin.py:236 msgid "Admin page" msgstr "Stránka správcu" -#: cps/admin.py:253 +#: cps/admin.py:256 msgid "Basic Configuration" msgstr "Základná konfigurácia" -#: cps/admin.py:291 +#: cps/admin.py:294 msgid "UI Configuration" msgstr "Konfigurácia používateľského rozhrania" -#: cps/admin.py:315 cps/admin.py:1002 cps/db.py:809 cps/search.py:150 -#: cps/web.py:750 +#: cps/admin.py:318 cps/admin.py:1005 cps/db.py:809 cps/search.py:150 +#: cps/web.py:752 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "Používateľom definovaný stĺpec č. %(column)d v Calibre databáze neexistuje" -#: cps/admin.py:333 cps/templates/admin.html:51 +#: cps/admin.py:336 cps/templates/admin.html:51 msgid "Edit Users" msgstr "Upraviť používateľov" -#: cps/admin.py:378 cps/opds.py:559 cps/templates/grid.html:14 +#: cps/admin.py:381 cps/opds.py:559 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Všetko" -#: cps/admin.py:401 cps/admin.py:1432 +#: cps/admin.py:404 cps/admin.py:1460 msgid "User not found" msgstr "Používateľ sa nenašiel" -#: cps/admin.py:415 +#: cps/admin.py:418 #, python-brace-format msgid "{} users deleted successfully" msgstr "Zmazaných {} používateľov" -#: cps/admin.py:438 cps/templates/config_view_edit.html:133 +#: cps/admin.py:441 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Zobraziť všetko" -#: cps/admin.py:459 cps/admin.py:465 +#: cps/admin.py:462 cps/admin.py:468 msgid "Malformed request" msgstr "Chybne vytvorená žiadosť" -#: cps/admin.py:477 cps/admin.py:2078 +#: cps/admin.py:480 cps/admin.py:2156 msgid "Guest Name can't be changed" msgstr "Meno hosťa nie je možné zmeniť" -#: cps/admin.py:489 +#: cps/admin.py:492 msgid "Guest can't have this role" msgstr "Hosť nemôže mať túto rolu" -#: cps/admin.py:501 cps/admin.py:2032 +#: cps/admin.py:504 cps/admin.py:2110 msgid "No admin user remaining, can't remove admin role" msgstr "Nezostáva žiadny správca, nie je možné odobrať rolu správcu" -#: cps/admin.py:505 cps/admin.py:519 +#: cps/admin.py:508 cps/admin.py:522 msgid "Value has to be true or false" msgstr "Hodnota musí byť pravda alebo nepravda" -#: cps/admin.py:507 +#: cps/admin.py:510 msgid "Invalid role" msgstr "Neplatná rola" -#: cps/admin.py:511 +#: cps/admin.py:514 msgid "Guest can't have this view" msgstr "Hosť nemôže mať toto zobrazenie" -#: cps/admin.py:521 +#: cps/admin.py:524 msgid "Invalid view" msgstr "Neplatné zobrazenie" -#: cps/admin.py:524 +#: cps/admin.py:527 msgid "Guest's Locale is determined automatically and can't be set" msgstr "Nastavenie jazyka pre hosťa sa určí automaticky a nie je možné ho nastaviť" -#: cps/admin.py:528 +#: cps/admin.py:531 msgid "No Valid Locale Given" msgstr "Nebolo poskytnuté platné nastavenie jazyka" -#: cps/admin.py:539 +#: cps/admin.py:542 msgid "No Valid Book Language Given" msgstr "Nebolo poskytnuté platné jazykové nastavenie pre knihu" -#: cps/admin.py:541 cps/editbooks.py:243 cps/editbooks.py:428 -#: cps/editbooks.py:430 +#: cps/admin.py:544 cps/editbooks.py:260 cps/editbooks.py:445 +#: cps/editbooks.py:447 msgid "Parameter not found" msgstr "Parameter sa nenašiel" -#: cps/admin.py:578 +#: cps/admin.py:581 msgid "Invalid Read Column" msgstr "Neplatný stĺpec na čítanie" -#: cps/admin.py:584 +#: cps/admin.py:587 msgid "Invalid Restricted Column" msgstr "Neplatný stĺpec na obmedzenie" -#: cps/admin.py:604 cps/admin.py:1903 +#: cps/admin.py:607 cps/admin.py:1981 msgid "Calibre-Web configuration updated" msgstr "Konfigurácia Calibre-Web bola aktualizovaná" -#: cps/admin.py:616 +#: cps/admin.py:619 msgid "Do you really want to delete the Kobo Token?" msgstr "Naozaj chcete zmazať Kobo-žetón?" -#: cps/admin.py:618 +#: cps/admin.py:621 msgid "Do you really want to delete this domain?" msgstr "Naozaj chcete zmazať túto doménu?" -#: cps/admin.py:620 +#: cps/admin.py:623 msgid "Do you really want to delete this user?" msgstr "Naozaj chcete zmazať tohot používateľa?" -#: cps/admin.py:622 +#: cps/admin.py:625 msgid "Do you really want to delete this book?" msgstr "" -#: cps/admin.py:624 +#: cps/admin.py:627 msgid "Are you sure you want to delete this shelf?" msgstr "Naozaj chcete zmazať túto poličku?" -#: cps/admin.py:626 +#: cps/admin.py:629 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Naozaj chcete zmeniť nastavenia jazykov pre vybraných používateľov?" -#: cps/admin.py:628 +#: cps/admin.py:631 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "Naozaj chcete zmeniť viditeľné jazkyky pre knihy pre vybraných používateľov?" -#: cps/admin.py:630 +#: cps/admin.py:633 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "Naozaj chcete zmeniť vybrané role pre vybraných používateľov?" -#: cps/admin.py:632 +#: cps/admin.py:635 msgid "Are you sure you want to change the archive status for the selected book(s)?" msgstr "" -#: cps/admin.py:634 +#: cps/admin.py:637 msgid "Are you sure you want to change the read status for the selected book(s)?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:639 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Naozaj chcete zmeniť vybrané obmedzenia pre vybraných používateľov?" -#: cps/admin.py:638 +#: cps/admin.py:641 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "Naozaj chcete zmeniť vybrané obmedzenia viditeľnosti pre vybraných používateľov?" -#: cps/admin.py:641 +#: cps/admin.py:644 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Naozaj chcete zmeniť synchronizačné správanie sa police pre vybraných používateľov?" -#: cps/admin.py:643 +#: cps/admin.py:646 msgid "Are you sure you want to change Calibre library location?" msgstr "Naozaj chcete zmenit umiestnenie pre knižnicu Calibre?" -#: cps/admin.py:645 +#: cps/admin.py:648 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "Calilbre-Web vyhľadá aktualizované obálky a aktualizuje ich náhľady, môže to chvíľu trvať?" -#: cps/admin.py:648 +#: cps/admin.py:651 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Naozaj chcete zmazať synchronizačnú databázu Calibre-Web aby ste vynútili úplnú synchronizáciu s vašou Kobo čítačkou?" -#: cps/admin.py:891 cps/admin.py:897 cps/admin.py:907 cps/admin.py:917 +#: cps/admin.py:894 cps/admin.py:900 cps/admin.py:910 cps/admin.py:920 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Odmietnuť" -#: cps/admin.py:893 cps/admin.py:899 cps/admin.py:909 cps/admin.py:919 +#: cps/admin.py:896 cps/admin.py:902 cps/admin.py:912 cps/admin.py:922 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Povoliť" -#: cps/admin.py:952 +#: cps/admin.py:955 #, python-brace-format msgid "{} sync entries deleted" msgstr "Zmazalo sa {} synchronizačných položiek" -#: cps/admin.py:993 +#: cps/admin.py:996 msgid "Tag not found" msgstr "Štítok sa nenašiel" -#: cps/admin.py:1011 +#: cps/admin.py:1014 msgid "Invalid Action" msgstr "Neplatná akcia" -#: cps/admin.py:1138 +#: cps/admin.py:1137 +#, python-format +msgid "Invalid reverse proxy trusted IP/CIDR entry: %(entry)s" +msgstr "" + +#: cps/admin.py:1148 +#, python-format +msgid "Invalid %(label)s: %(value)s" +msgstr "" + +#: cps/admin.py:1166 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json nie je nakonfiguraovaný pre webovú aplikáciu" -#: cps/admin.py:1183 +#: cps/admin.py:1211 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "Umiestnenie denníkového súboru je neplatné, zadajte prosím správnu cestu" -#: cps/admin.py:1189 +#: cps/admin.py:1217 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "Umiestnenie súbor denníka prístupov nie je platné, zadajte prosím správnu cestu" -#: cps/admin.py:1223 +#: cps/admin.py:1251 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Zadajte prosím poskytovateľa LDAP, port, DN a identifikátor používateľa" -#: cps/admin.py:1229 +#: cps/admin.py:1257 msgid "Please Enter a LDAP Service Account and Password" msgstr "Zadajte prosím konto a heslo pre LDAP službu" -#: cps/admin.py:1232 +#: cps/admin.py:1260 msgid "Please Enter a LDAP Service Account" msgstr "Zadajte prosím konto pre LDAP službu" -#: cps/admin.py:1237 +#: cps/admin.py:1265 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "Filter pre LDAP objekt skupiny potrebuje jeden \"%s\" formátový identifikátor" -#: cps/admin.py:1239 +#: cps/admin.py:1267 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "Filter pre LDAP objekt skupiny má nezhodu v zátvorkách" -#: cps/admin.py:1243 +#: cps/admin.py:1271 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "Filter pre LDAP objekt používateľa potrebuje jeden \"%s\" formátový identifikátor" -#: cps/admin.py:1245 +#: cps/admin.py:1273 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "Filter pre LDAP objekt používateľa má nezhodu v zátvorkách" -#: cps/admin.py:1252 +#: cps/admin.py:1280 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "Filter pre LDAP členstvo používateľa potrebuje jeden \"%s\" formátový identifikátor" -#: cps/admin.py:1254 +#: cps/admin.py:1282 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "Filter pre LDAP členstvo používateľa má nezhodu v zátvorkách" -#: cps/admin.py:1261 +#: cps/admin.py:1289 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP CA-certifikát, certifikát alebo umiestnenie kľúča nie je platné. Zadajte prosím správnu cestu" -#: cps/admin.py:1292 cps/templates/admin.html:53 +#: cps/admin.py:1320 cps/templates/admin.html:53 msgid "Add New User" msgstr "Pridať nového používateľa" -#: cps/admin.py:1301 cps/templates/admin.html:100 +#: cps/admin.py:1329 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Upraviť nastavenie pre poštový server" -#: cps/admin.py:1320 +#: cps/admin.py:1348 msgid "Success! Gmail Account Verified." msgstr "Úspech! Gmail konto bolo verifikované." -#: cps/admin.py:1340 cps/admin.py:1343 cps/admin.py:1728 cps/admin.py:1887 -#: cps/admin.py:1985 cps/admin.py:2106 cps/editbooks.py:169 -#: cps/editbooks.py:755 cps/editbooks.py:1474 cps/shelf.py:90 cps/shelf.py:144 +#: cps/admin.py:1368 cps/admin.py:1371 cps/admin.py:1756 cps/admin.py:1965 +#: cps/admin.py:2063 cps/admin.py:2184 cps/editbooks.py:170 +#: cps/editbooks.py:772 cps/editbooks.py:1518 cps/shelf.py:90 cps/shelf.py:144 #: cps/shelf.py:194 cps/shelf.py:237 cps/shelf.py:287 cps/shelf.py:327 -#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:160 cps/web.py:1526 +#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:161 cps/web.py:1536 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Chyba databázy: %(error)s." -#: cps/admin.py:1350 +#: cps/admin.py:1378 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Testovací e-mail bol zaradený na odoslanie na %(email)s, skontrolujte si výsledok v sekcii Úlohy" -#: cps/admin.py:1353 +#: cps/admin.py:1381 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Pri odosielaní testovacieho e-mailu sa vyskytla chyba: %(res)s" -#: cps/admin.py:1355 +#: cps/admin.py:1383 msgid "Please configure your e-mail address first..." msgstr "Prosím, najskôr si nastavte e-mailovú adresu..." -#: cps/admin.py:1357 +#: cps/admin.py:1385 msgid "Email Server Settings updated" msgstr "Nastavenia poštového servera boli aktualizované" -#: cps/admin.py:1380 cps/templates/admin.html:195 +#: cps/admin.py:1408 cps/templates/admin.html:211 msgid "Edit Scheduled Tasks Settings" msgstr "Upraviť nastavenia naplánovaných úloh" -#: cps/admin.py:1392 +#: cps/admin.py:1420 msgid "Invalid start time for task specified" msgstr "Bol uvedený neplatný čas spustenia" -#: cps/admin.py:1397 +#: cps/admin.py:1425 msgid "Invalid duration for task specified" msgstr "Bol uvedený neplatný doba behu" -#: cps/admin.py:1407 +#: cps/admin.py:1435 msgid "Scheduled tasks settings updated" msgstr "Nastavenia naplánovaných úloh boli aktualizované" -#: cps/admin.py:1417 cps/admin.py:1466 cps/admin.py:2102 cps/web.py:1325 +#: cps/admin.py:1445 cps/admin.py:1494 cps/admin.py:2180 cps/web.py:1335 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Vyskytla sa neočakávaná chyba. Prosím, skúste to opäť neskôr." -#: cps/admin.py:1421 +#: cps/admin.py:1449 msgid "Settings DB is not Writeable" msgstr "Nie je možné zapisovať do databázy nastavení" -#: cps/admin.py:1451 cps/admin.py:2094 +#: cps/admin.py:1479 cps/admin.py:2172 #, python-format msgid "Edit User %(nick)s" msgstr "Upraviť používateľa %(nick)s" -#: cps/admin.py:1463 +#: cps/admin.py:1491 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "Úspech! Heslo pre používateľa %(user)s bolo resetované" -#: cps/admin.py:1469 +#: cps/admin.py:1497 msgid "Oops! Please configure the SMTP mail settings." msgstr "Nastavte prosím poštový server." -#: cps/admin.py:1480 +#: cps/admin.py:1508 msgid "Logfile viewer" msgstr "Prezerač denníkového súboru" -#: cps/admin.py:1546 +#: cps/admin.py:1574 msgid "Requesting update package" msgstr "Žiadosť o aktualizačný balík" -#: cps/admin.py:1547 +#: cps/admin.py:1575 msgid "Downloading update package" msgstr "Sťahuje sa aktualizačný balík" -#: cps/admin.py:1548 +#: cps/admin.py:1576 msgid "Unzipping update package" msgstr "Rozbaľuje sa aktualizačný balík" -#: cps/admin.py:1549 +#: cps/admin.py:1577 msgid "Replacing files" msgstr "Nahradzujú sa súbory" -#: cps/admin.py:1550 +#: cps/admin.py:1578 msgid "Database connections are closed" msgstr "Spojenia s databázou sú uzavreté" -#: cps/admin.py:1551 +#: cps/admin.py:1579 msgid "Stopping server" msgstr "Zastavuje sa server" -#: cps/admin.py:1552 +#: cps/admin.py:1580 msgid "Update finished, please press okay and reload page" msgstr "Aktualizácia dokončená, stlačte prosím OK a znovu načítajte stránku" -#: cps/admin.py:1553 cps/admin.py:1554 cps/admin.py:1555 cps/admin.py:1556 -#: cps/admin.py:1557 cps/admin.py:1558 +#: cps/admin.py:1581 cps/admin.py:1582 cps/admin.py:1583 cps/admin.py:1584 +#: cps/admin.py:1585 cps/admin.py:1586 msgid "Update failed:" msgstr "Aktualizácia zlyhala:" -#: cps/admin.py:1553 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1581 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP chyba" -#: cps/admin.py:1554 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1582 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Chyba spojenia" -#: cps/admin.py:1555 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1583 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Časový limit pre naviazanie spojenia vypršal" -#: cps/admin.py:1556 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1584 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Všeobecná chyba" -#: cps/admin.py:1557 +#: cps/admin.py:1585 msgid "Update file could not be saved in temp dir" msgstr "Súbor aktualizácie nebolo možné uložiť do dočasného adresára" -#: cps/admin.py:1558 +#: cps/admin.py:1586 msgid "Files could not be replaced during update" msgstr "Nebolo možné nahradiť súbory počas aktualizácie" -#: cps/admin.py:1582 +#: cps/admin.py:1610 msgid "Failed to extract at least One LDAP User" msgstr "Extrakcia minimálne jedného LDAP používateľa zlyhala" -#: cps/admin.py:1627 +#: cps/admin.py:1655 msgid "Failed to Create at Least One LDAP User" msgstr "Vytvorenie minimálne jedného LDAP používateľa zlyhalo" -#: cps/admin.py:1640 +#: cps/admin.py:1668 #, python-format msgid "Error: %(ldaperror)s" msgstr "Chyba: %(ldaperror)s" -#: cps/admin.py:1644 +#: cps/admin.py:1672 msgid "Error: No user returned in response of LDAP server" msgstr "Chyba: Odpoveď LDAP servera neobsahuje žiadneho používateľa" -#: cps/admin.py:1680 +#: cps/admin.py:1708 msgid "At Least One LDAP User Not Found in Database" msgstr "Minimálne jeden LDAP používateľ sa nenachádza v databáze" -#: cps/admin.py:1682 +#: cps/admin.py:1710 #, python-brace-format msgid "{} User Successfully Imported" msgstr "Používateľ bol naimportovaný" -#: cps/admin.py:1740 +#: cps/admin.py:1768 msgid "Books path not valid" msgstr "" -#: cps/admin.py:1746 +#: cps/admin.py:1774 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "Umiestnenie databáze nie je platné, zadajte prosím správnu cestu" -#: cps/admin.py:1774 +#: cps/admin.py:1802 msgid "DB is not Writeable" msgstr "Do databázy nie je možné zapisovať" -#: cps/admin.py:1788 +#: cps/admin.py:1816 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "Umiestnenie súboru s kľúčmi nie je platné, zadajte prosím správnu cestu" -#: cps/admin.py:1792 +#: cps/admin.py:1820 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "Umiestnenie súboru s certifikátmi nie je platné, zadajte prosím správnu cestu" -#: cps/admin.py:1872 +#: cps/admin.py:1846 +msgid "Kepubify binary not found" +msgstr "" + +#: cps/admin.py:1894 +msgid "reverse proxy login header name" +msgstr "" + +#: cps/admin.py:1904 +msgid "reverse proxy shared secret header name" +msgstr "" + +#: cps/admin.py:1913 +msgid "Please configure both reverse proxy shared secret header name and secret" +msgstr "" + +#: cps/admin.py:1917 +msgid "Please configure reverse proxy shared secret header name and secret or disable the feature" +msgstr "" + +#: cps/admin.py:1922 +msgid "Please configure at least one trusted reverse proxy IP or CIDR" +msgstr "" + +#: cps/admin.py:1946 msgid "Password length has to be between 1 and 40" msgstr "Heslo musí byť dlhé 1 až 40 znakov" -#: cps/admin.py:1926 +#: cps/admin.py:1957 cps/helper.py:1007 +msgid "Please specify a valid UnRar directory" +msgstr "" + +#: cps/admin.py:2004 msgid "Database Settings updated" msgstr "Nastavenia databáze boli aktualizované" -#: cps/admin.py:1934 +#: cps/admin.py:2012 msgid "Database Configuration" msgstr "Konfigurácia databázy" -#: cps/admin.py:1949 cps/web.py:1295 +#: cps/admin.py:2027 cps/web.py:1305 msgid "Oops! Please complete all fields." msgstr "Vyplňte prosím všetky polia." -#: cps/admin.py:1958 +#: cps/admin.py:2036 msgid "E-mail is not from valid domain" msgstr "E-mail nie je z platnej domény" -#: cps/admin.py:1964 +#: cps/admin.py:2042 msgid "Add new user" msgstr "Pridať nového používateľa" -#: cps/admin.py:1975 +#: cps/admin.py:2053 #, python-format msgid "User '%(user)s' created" msgstr "Používateľ '%(user)s' bol vytvorený" -#: cps/admin.py:1981 +#: cps/admin.py:2059 msgid "Oops! An account already exists for this Email. or name." msgstr "Účet s týmto menom alebo e-mailovou adresou už existuje." -#: cps/admin.py:2011 +#: cps/admin.py:2089 #, python-format msgid "User '%(nick)s' deleted" msgstr "Používateľ '%(nick)s' bol zmazaný" -#: cps/admin.py:2014 +#: cps/admin.py:2092 msgid "Can't delete Guest User" msgstr "Nie je možné zmazať používateľa Hosť" -#: cps/admin.py:2017 +#: cps/admin.py:2095 msgid "No admin user remaining, can't delete user" msgstr "Nezostáva žiadny používateľ, nie je možné odobrať rolu správcu" -#: cps/admin.py:2072 cps/web.py:1475 +#: cps/admin.py:2150 cps/web.py:1485 msgid "Email can't be empty and has to be a valid Email" msgstr "E-mailová adresa nemôže byť prázdna a musí byť platná" -#: cps/admin.py:2098 +#: cps/admin.py:2176 #, python-format msgid "User '%(nick)s' updated" msgstr "Používateľ '%(nick)s' bol aktualizovaný" @@ -541,145 +580,153 @@ msgstr "Používateľ '%(nick)s' bol aktualizovaný" msgid "Search" msgstr "Hľadať" -#: cps/converter.py:31 +#: cps/converter.py:32 msgid "not installed" msgstr "nie je naištalované" -#: cps/converter.py:32 +#: cps/converter.py:33 msgid "Execution permissions missing" msgstr "Chýba právo na vykonanie" -#: cps/db.py:1129 cps/templates/config_edit.html:207 +#: cps/db.py:1129 cps/templates/config_edit.html:229 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:565 cps/web.py:599 cps/web.py:644 cps/web.py:684 cps/web.py:711 -#: cps/web.py:998 cps/web.py:1028 cps/web.py:1073 cps/web.py:1101 -#: cps/web.py:1140 +#: cps/web.py:567 cps/web.py:601 cps/web.py:646 cps/web.py:686 cps/web.py:713 +#: cps/web.py:1000 cps/web.py:1030 cps/web.py:1075 cps/web.py:1103 +#: cps/web.py:1142 msgid "None" msgstr "Žiadne" -#: cps/editbooks.py:155 +#: cps/editbooks.py:156 #, python-format msgid "File %(file)s uploaded" msgstr "Súbor %(file)s bol nahraný" -#: cps/editbooks.py:184 +#: cps/editbooks.py:185 msgid "Source or destination format for conversion missing" msgstr "Chýba zdrojový alebo cieľový formát pre prevod" -#: cps/editbooks.py:192 +#: cps/editbooks.py:189 cps/editbooks.py:197 +msgid "Source format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:201 +msgid "Destination format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:209 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Kniha bola úspešne zaradená na prevod do %(book_format)s" -#: cps/editbooks.py:196 +#: cps/editbooks.py:213 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Vyskytla sa chyba pri prevode tejto knihy: %(res)s" -#: cps/editbooks.py:297 +#: cps/editbooks.py:314 msgid "Changes successfully applied" msgstr "" -#: cps/editbooks.py:317 +#: cps/editbooks.py:334 msgid "Value is missing on request" msgstr "" -#: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 -#: cps/editbooks.py:1146 cps/web.py:532 cps/web.py:1567 cps/web.py:1613 -#: cps/web.py:1663 +#: cps/editbooks.py:336 cps/editbooks.py:343 cps/editbooks.py:644 +#: cps/editbooks.py:1170 cps/web.py:534 cps/web.py:1577 cps/web.py:1623 +#: cps/web.py:1673 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Vybraná kniha nie je dostupná. Súbor neexistuje alebo sa k nemu nedá pristupovať" -#: cps/editbooks.py:673 cps/editbooks.py:1503 +#: cps/editbooks.py:690 cps/editbooks.py:1547 msgid "User has no rights to upload cover" msgstr "Používateľ nemá práva nahrať obálku knihy" -#: cps/editbooks.py:694 cps/editbooks.py:938 +#: cps/editbooks.py:711 cps/editbooks.py:961 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "Identifikátory nerozlišujú malé a veľké písmená, prepisuje sa starý identifikátor" -#: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 +#: cps/editbooks.py:726 cps/editbooks.py:935 cps/editbooks.py:1306 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "'%(langname)s' nie je platný jazyk" -#: cps/editbooks.py:737 +#: cps/editbooks.py:754 msgid "Metadata successfully updated" msgstr "Metadáta boli úspešne aktualizované" -#: cps/editbooks.py:760 +#: cps/editbooks.py:777 #, python-brace-format msgid "Error editing book: {}" msgstr "Chyba pri úprave knihy: {}" -#: cps/editbooks.py:856 +#: cps/editbooks.py:879 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "Nahrávaná kniha pravdepodobne existuje v knižnici, zvážte zmenu pred nahraním novej: " -#: cps/editbooks.py:950 cps/editbooks.py:1420 +#: cps/editbooks.py:973 cps/editbooks.py:1464 msgid "File type isn't allowed to be uploaded to this server" msgstr "" -#: cps/editbooks.py:956 cps/editbooks.py:1431 +#: cps/editbooks.py:979 cps/editbooks.py:1475 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "Prípona súboru '%(ext)s' nemôže byť nahraná na tento server" -#: cps/editbooks.py:960 cps/editbooks.py:1436 +#: cps/editbooks.py:983 cps/editbooks.py:1480 msgid "File to be uploaded must have an extension" msgstr "Súbor ktorý sa má nahrať musí mať príponu" -#: cps/editbooks.py:968 +#: cps/editbooks.py:992 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "Súbor %(filename)s nebolo možné uložiť do dočasného adresára" -#: cps/editbooks.py:988 +#: cps/editbooks.py:1012 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Zlyhal presun súboru obalky %(file)s: %(error)s" -#: cps/editbooks.py:1041 +#: cps/editbooks.py:1065 msgid "Book Format Successfully Deleted" msgstr "Kniha s formátom bola úspešne zmazaná" -#: cps/editbooks.py:1044 cps/editbooks.py:1061 +#: cps/editbooks.py:1068 cps/editbooks.py:1085 msgid "Book Successfully Deleted" msgstr "Kniha bola úspešne zmazaná" -#: cps/editbooks.py:1065 +#: cps/editbooks.py:1089 msgid "You are missing permissions to delete books" msgstr "Nemáte oprávnenia na mazanie kníh" -#: cps/editbooks.py:1139 +#: cps/editbooks.py:1163 #, python-brace-format msgid "Book with id \"{}\" could not be deleted: not found" msgstr "" -#: cps/editbooks.py:1181 +#: cps/editbooks.py:1205 msgid "edit metadata" msgstr "upraviť metadáta" -#: cps/editbooks.py:1234 +#: cps/editbooks.py:1267 #, python-format msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1425 +#: cps/editbooks.py:1469 msgid "User has no rights to upload additional file formats" msgstr "Používateľ nemá práva na nahranie dodatočných súborových formátov" -#: cps/editbooks.py:1449 +#: cps/editbooks.py:1493 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Nebolo možné vytvoriť cestu %(path)s (Povolenie zamietnuté)." -#: cps/editbooks.py:1456 +#: cps/editbooks.py:1500 #, python-format msgid "Failed to store file %(file)s." msgstr "Zlyhalo uloženie súboru: %(file)s." -#: cps/editbooks.py:1481 +#: cps/editbooks.py:1525 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Súborový formát %(ext)s bol pridaný k %(book)s" @@ -690,9 +737,9 @@ msgstr "Počkajte, prosím minútku pred registráciou ďalšieho používateľa #: cps/error_handler.py:108 cps/templates/layout.html:69 #: cps/templates/layout.html:104 cps/templates/login.html:27 -#: cps/templates/register.html:17 cps/web.py:1292 cps/web.py:1296 -#: cps/web.py:1302 cps/web.py:1326 cps/web.py:1330 cps/web.py:1343 -#: cps/web.py:1346 +#: cps/templates/register.html:17 cps/web.py:1302 cps/web.py:1306 +#: cps/web.py:1312 cps/web.py:1336 cps/web.py:1340 cps/web.py:1353 +#: cps/web.py:1356 msgid "Register" msgstr "Registrovať" @@ -713,7 +760,7 @@ msgstr "Doména spätného volania nie je verifikovaná, prosím, vykonajte krok msgid "%(format)s format not found for book id: %(book)d" msgstr "Formát %(format)s sa nenašiel pre knihu s ID: %(book)d" -#: cps/helper.py:94 cps/tasks/convert.py:91 +#: cps/helper.py:94 cps/tasks/convert.py:92 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s sa nenašiel na Google Drive: %(fn)s" @@ -899,10 +946,6 @@ msgstr "Ako súbor obálky knihy sú podporované iba súbory jpg/jpeg" msgid "Cover" msgstr "Obálka knihy" -#: cps/helper.py:1006 -msgid "UnRar binary file not found" -msgstr "Binárny súbor pre UnRar sa nenašiel" - #: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "Chyba pri spustení UnRar" @@ -933,7 +976,7 @@ msgstr "" msgid "Error executing Calibre" msgstr "" -#: cps/helper.py:1154 cps/templates/admin.html:216 +#: cps/helper.py:1154 cps/templates/admin.html:232 msgid "Queue all books for metadata backup" msgstr "Zaradiť všetky knihy na zálohovanie metadát" @@ -955,7 +998,7 @@ msgstr "Zaregistrovať s %(provider)s" msgid "This %(oauth)s account is already linked to a different user" msgstr "" -#: cps/oauth_bb.py:147 cps/remotelogin.py:131 +#: cps/oauth_bb.py:147 cps/remotelogin.py:150 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "Úspech! Teraz ste prihlásený ako: %(nickname)s" @@ -1023,25 +1066,29 @@ msgstr "Chyba Google OAuth: {}" msgid "{} Stars" msgstr "{} Hviezdičiek" -#: cps/remotelogin.py:63 cps/templates/layout.html:68 -#: cps/templates/layout.html:103 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1361 -msgid "Login" -msgstr "Prihlásiť sa" - -#: cps/remotelogin.py:75 cps/remotelogin.py:109 +#: cps/remotelogin.py:46 cps/remotelogin.py:128 msgid "Token not found" msgstr "Žetón sa nenašiel" -#: cps/remotelogin.py:84 cps/remotelogin.py:117 +#: cps/remotelogin.py:55 cps/remotelogin.py:136 msgid "Token has expired" msgstr "Žetón expiroval" -#: cps/remotelogin.py:93 +#: cps/remotelogin.py:86 cps/remotelogin.py:112 cps/templates/layout.html:68 +#: cps/templates/layout.html:103 cps/templates/login.html:4 +#: cps/templates/login.html:21 cps/web.py:1371 +msgid "Login" +msgstr "Prihlásiť sa" + +#: cps/remotelogin.py:100 +msgid "Token already approved" +msgstr "" + +#: cps/remotelogin.py:108 msgid "Success! Please return to your device" msgstr "Úspech! Vráťte sa k vašemu zariadeniu" -#: cps/render_template.py:41 cps/web.py:421 +#: cps/render_template.py:41 cps/web.py:423 msgid "Books" msgstr "Knihy" @@ -1066,7 +1113,7 @@ msgstr "Stiahnuté knihy" msgid "Show Downloaded Books" msgstr "Zobraziť stiahnuté knihy" -#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:436 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:438 msgid "Top Rated Books" msgstr "Najlepšie hodnotené knihy" @@ -1075,7 +1122,7 @@ msgid "Show Top Rated Books" msgstr "Zobraziť najlepšie hodnotené knihy" #: cps/render_template.py:61 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:769 +#: cps/templates/index.xml:67 cps/web.py:771 msgid "Read Books" msgstr "Prečítané knihy" @@ -1084,7 +1131,7 @@ msgid "Show Read and Unread" msgstr "Zobraziť prečítané a neprečítané" #: cps/render_template.py:65 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:772 +#: cps/templates/index.xml:74 cps/web.py:774 msgid "Unread Books" msgstr "Neprečítané knihy" @@ -1102,7 +1149,7 @@ msgid "Show Random Books" msgstr "Zobraziť náhodné knihy" #: cps/render_template.py:71 cps/templates/book_table.html:93 -#: cps/templates/index.xml:97 cps/web.py:1144 +#: cps/templates/index.xml:97 cps/web.py:1146 msgid "Categories" msgstr "Kategórie" @@ -1112,7 +1159,7 @@ msgstr "Zobraziť časť Kategórie" #: cps/render_template.py:74 cps/templates/book_edit.html:86 #: cps/templates/book_table.html:94 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1034 cps/web.py:1046 +#: cps/templates/search_form.html:70 cps/web.py:1036 cps/web.py:1048 msgid "Series" msgstr "Série" @@ -1130,7 +1177,7 @@ msgid "Show Author Section" msgstr "Zobraziť časť Autori" #: cps/render_template.py:81 cps/templates/book_table.html:98 -#: cps/templates/index.xml:88 cps/web.py:1002 +#: cps/templates/index.xml:88 cps/web.py:1004 msgid "Publishers" msgstr "Vydavatelia" @@ -1140,7 +1187,7 @@ msgstr "Zobraziť časť vydavatelia" #: cps/render_template.py:84 cps/templates/book_table.html:96 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1116 +#: cps/web.py:1118 msgid "Languages" msgstr "Jazyky" @@ -1164,7 +1211,7 @@ msgstr "Súborové formáty" msgid "Show File Formats Section" msgstr "Zobraziť časť Súborové formáty" -#: cps/render_template.py:95 cps/web.py:795 +#: cps/render_template.py:95 cps/web.py:797 msgid "Archived Books" msgstr "Archivované knihy" @@ -1172,7 +1219,7 @@ msgstr "Archivované knihy" msgid "Show Archived Books" msgstr "Zobraziť archivované knihy" -#: cps/render_template.py:100 cps/web.py:831 +#: cps/render_template.py:100 cps/web.py:833 msgid "Books List" msgstr "Zoznam kníh" @@ -1405,150 +1452,154 @@ msgstr "Je dostupná nová aktualizácia. Kliknite na tlačidlo dolu, ak chcete msgid "No release information available" msgstr "Nie je dostupná informácia o vydaní" -#: cps/templates/index.html:6 cps/web.py:448 +#: cps/templates/index.html:6 cps/web.py:450 msgid "Discover (Random Books)" msgstr "Objaviť (Náhodné knihy)" -#: cps/web.py:484 +#: cps/web.py:486 msgid "Hot Books (Most Downloaded)" msgstr "Horúce knihy (Najviac sťahované)" -#: cps/web.py:515 +#: cps/web.py:517 #, python-format msgid "Downloaded books by %(user)s" msgstr "Knihy stiahnuté: %(user)s" -#: cps/web.py:548 +#: cps/web.py:550 #, python-format msgid "Author: %(name)s" msgstr "Author: %(name)s" -#: cps/web.py:584 +#: cps/web.py:586 #, python-format msgid "Publisher: %(name)s" msgstr "Vydavateľ: %(name)s" -#: cps/web.py:612 +#: cps/web.py:614 #, python-format msgid "Series: %(serie)s" msgstr "Série: %(serie)s" -#: cps/web.py:626 +#: cps/web.py:628 msgid "Rating: None" msgstr "Hodnotenie: Žiadne" -#: cps/web.py:635 +#: cps/web.py:637 #, python-format msgid "Rating: %(rating)s stars" msgstr "Hodnotenie: %(rating)s hviezdičiek" -#: cps/web.py:666 +#: cps/web.py:668 #, python-format msgid "File format: %(format)s" msgstr "Súborový formát: %(format)s" -#: cps/web.py:701 +#: cps/web.py:703 #, python-format msgid "Category: %(name)s" msgstr "Kategória: %(name)s" -#: cps/web.py:730 +#: cps/web.py:732 #, python-format msgid "Language: %(name)s" msgstr "Jazyk: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:974 +#: cps/templates/admin.html:16 cps/web.py:976 msgid "Downloads" msgstr "Stiahnutia" -#: cps/web.py:1076 +#: cps/web.py:1078 msgid "Ratings list" msgstr "Zoznam hodnotení" -#: cps/web.py:1103 +#: cps/web.py:1105 msgid "File formats list" msgstr "Zoznam súborových formátov" -#: cps/web.py:1264 +#: cps/web.py:1272 +msgid "Book format not supported" +msgstr "" + +#: cps/web.py:1274 msgid "Please configure the SMTP mail settings first..." msgstr "Najskôr nastavte poštový server, prosím..." -#: cps/web.py:1270 +#: cps/web.py:1280 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Úspech! Kniha bola zaradená na odoslanie do %(eReadermail)s" -#: cps/web.py:1273 +#: cps/web.py:1283 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Vyskytla sa chyba pri posielaní knihy: %(res)s" -#: cps/web.py:1275 +#: cps/web.py:1285 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Nastavte vo vašom profile platnú e-mailovú adresu pre vašu čítačku." -#: cps/web.py:1291 cps/web.py:1342 +#: cps/web.py:1301 cps/web.py:1352 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "Poštový server nie je nastavený, kontaktujte prosím správcu." -#: cps/web.py:1328 +#: cps/web.py:1338 msgid "Oops! Your Email is not allowed." msgstr "Vaša e-mailová adresa nie je povolená." -#: cps/web.py:1331 +#: cps/web.py:1341 msgid "Success! Confirmation Email has been sent." msgstr "Úspech! Potvrdzujúci e-mail bol odoslaný." -#: cps/web.py:1376 cps/web.py:1390 +#: cps/web.py:1386 cps/web.py:1400 msgid "Cannot activate LDAP authentication" msgstr "Nie je možné aktivovať LDAP autentifikáciu" -#: cps/web.py:1399 +#: cps/web.py:1409 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "ste prihlásený ako: '%(nickname)s'" -#: cps/web.py:1406 +#: cps/web.py:1416 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Záložné prihlásenie ako: '%(nickname)s', LDAP server je nedostupný alebo používateľ je neznámy" -#: cps/web.py:1411 +#: cps/web.py:1421 #, python-format msgid "Could not login: %(message)s" msgstr "Nemôžem prihlásiť: %(message)s" -#: cps/web.py:1415 cps/web.py:1440 +#: cps/web.py:1425 cps/web.py:1450 msgid "Wrong Username or Password" msgstr "Nesprávne používateľské meno alebo heslo" -#: cps/web.py:1422 +#: cps/web.py:1432 msgid "New Password was sent to your email address" msgstr "Na vašu e-mailovú adresu bolo odoslané nové heslo" -#: cps/web.py:1426 +#: cps/web.py:1436 msgid "An unknown error occurred. Please try again later." msgstr "Vyskytla sa neočakávaná chyba. Prosím, skúste to opäť neskôr." -#: cps/web.py:1428 +#: cps/web.py:1438 msgid "Please enter valid username to reset password" msgstr "Na resetovanie hesla zadajte platné používateľské meno" -#: cps/web.py:1436 +#: cps/web.py:1446 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Teraz ste prihlásený ako: '%(nickname)s'" -#: cps/web.py:1501 cps/web.py:1551 +#: cps/web.py:1511 cps/web.py:1561 #, python-format msgid "%(name)s's Profile" msgstr "Profil pre %(name)s" -#: cps/web.py:1517 +#: cps/web.py:1527 msgid "Success! Profile Updated" msgstr "Úspech! Profil bol aktualizovaný" -#: cps/web.py:1521 +#: cps/web.py:1531 msgid "Oops! An account already exists for this Email." msgstr "Účet s touto e-mailovou adresou už existuje." @@ -1560,46 +1611,46 @@ msgstr "Nenašiel sa súbor gmail.json s OAuth informáciou" msgid "Delete temp folder contents" msgstr "" -#: cps/tasks/convert.py:112 +#: cps/tasks/convert.py:113 #, python-format msgid "%(book)s send to E-Reader" msgstr "%(book)s bol odoslaný do čítačky" -#: cps/tasks/convert.py:177 +#: cps/tasks/convert.py:180 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Nástroj pre prevod ebook-convert %(tool)s sa nenašiel" -#: cps/tasks/convert.py:211 +#: cps/tasks/convert.py:214 #, python-format msgid "%(format)s format not found on disk" msgstr "Formát %(format)s sa nenachádza na disku" -#: cps/tasks/convert.py:215 +#: cps/tasks/convert.py:218 msgid "Ebook converter failed with unknown error" msgstr "Prevádzač e-kníh zlyhal s neznámou chybou" -#: cps/tasks/convert.py:234 +#: cps/tasks/convert.py:237 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Prevádzač Kepubify zlyhal: %(error)s" -#: cps/tasks/convert.py:254 +#: cps/tasks/convert.py:257 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Prevádzaný súbor sa nenašiel alebo viac ako jeden súbor v zložke %(folder)s" -#: cps/tasks/convert.py:291 cps/tasks/convert.py:342 +#: cps/tasks/convert.py:294 cps/tasks/convert.py:345 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre zlyhal s chybou: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:322 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Prevádzač e-kníh zlyhal: %(error)s" -#: cps/tasks/convert.py:347 +#: cps/tasks/convert.py:350 msgid "Convert" msgstr "Previesť" @@ -1685,7 +1736,7 @@ msgstr "Upraviť" #: cps/templates/admin.html:25 cps/templates/book_edit.html:17 #: cps/templates/book_table.html:131 cps/templates/book_table.html:180 -#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:115 +#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:117 #: cps/templates/user_edit.html:67 cps/templates/user_table.html:149 msgid "Delete" msgstr "Zmazať" @@ -1775,128 +1826,145 @@ msgstr "Vzdialené prihlásenie Magic Link" msgid "Reverse Proxy Login" msgstr "Prihlásenie na reverznú proxy" -#: cps/templates/admin.html:154 cps/templates/config_edit.html:176 +#: cps/templates/admin.html:154 cps/templates/config_edit.html:180 msgid "Reverse Proxy Header Name" msgstr "Meno hlavičky pre reverznú proxy" -#: cps/templates/admin.html:159 +#: cps/templates/admin.html:158 +msgid "Reverse Proxy Trusted IPs/CIDRs" +msgstr "" + +#: cps/templates/admin.html:162 cps/templates/config_edit.html:193 +msgid "Reverse Proxy Shared Secret Header Name" +msgstr "" + +#: cps/templates/admin.html:166 +msgid "Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/admin.html:170 +msgid "Reverse Proxy Shared Secret Configured" +msgstr "" + +#: cps/templates/admin.html:175 msgid "Edit Calibre Database Configuration" msgstr "Upraviť configuráciu databázy Calibre" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:176 msgid "Edit Basic Configuration" msgstr "Upraviť základnú konfiguráciu" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:177 msgid "Edit UI Configuration" msgstr "Upraviť konfiguráciu používateľského rozhrania" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:183 msgid "Scheduled Tasks" msgstr "Naplánované úlohy" -#: cps/templates/admin.html:170 cps/templates/schedule_edit.html:12 +#: cps/templates/admin.html:186 cps/templates/schedule_edit.html:12 #: cps/templates/tasks.html:18 msgid "Start Time" msgstr "Začiatok" -#: cps/templates/admin.html:174 cps/templates/schedule_edit.html:20 +#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:20 msgid "Maximum Duration" msgstr "Maximálne trvanie" -#: cps/templates/admin.html:178 cps/templates/schedule_edit.html:29 +#: cps/templates/admin.html:194 cps/templates/schedule_edit.html:29 msgid "Generate Thumbnails" msgstr "Generovať náhľady" -#: cps/templates/admin.html:182 +#: cps/templates/admin.html:198 msgid "Generate series cover thumbnails" msgstr "Generovať náhľady obálok pre série" -#: cps/templates/admin.html:186 cps/templates/admin.html:208 +#: cps/templates/admin.html:202 cps/templates/admin.html:224 #: cps/templates/schedule_edit.html:37 msgid "Reconnect Calibre Database" msgstr "Znovu naviazať spojenie s Calibre databázou" -#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 +#: cps/templates/admin.html:206 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" msgstr "Vygenerovať záložné súbory pre metadáta" -#: cps/templates/admin.html:197 +#: cps/templates/admin.html:213 msgid "Refresh Thumbnail Cache" msgstr "Obnoviť vyrovnávaciu pamäť pre náhľady" -#: cps/templates/admin.html:203 +#: cps/templates/admin.html:219 msgid "Administration" msgstr "Správa" -#: cps/templates/admin.html:204 +#: cps/templates/admin.html:220 msgid "Download Debug Package" msgstr "Stiahnuť ladiaci balík" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:221 msgid "View Logs" msgstr "Zobraziť denníky" -#: cps/templates/admin.html:211 +#: cps/templates/admin.html:227 msgid "Restart" msgstr "Reštart" -#: cps/templates/admin.html:212 +#: cps/templates/admin.html:228 msgid "Shutdown" msgstr "Vypnúť" -#: cps/templates/admin.html:221 +#: cps/templates/admin.html:237 msgid "Version Information" msgstr "Informácia o verzii" -#: cps/templates/admin.html:225 +#: cps/templates/admin.html:241 msgid "Version" msgstr "Verzia" -#: cps/templates/admin.html:226 +#: cps/templates/admin.html:242 msgid "Details" msgstr "Detaily" -#: cps/templates/admin.html:232 +#: cps/templates/admin.html:248 msgid "Current Version" msgstr "Aktuálna verzia" -#: cps/templates/admin.html:239 +#: cps/templates/admin.html:255 msgid "Check for Update" msgstr "Kontrola aktualizácie" -#: cps/templates/admin.html:240 +#: cps/templates/admin.html:256 msgid "Perform Update" msgstr "Vykonať aktualizáciu" -#: cps/templates/admin.html:253 +#: cps/templates/admin.html:269 msgid "Are you sure you want to restart?" msgstr "Skutočne chcete reštartovať?" -#: cps/templates/admin.html:258 cps/templates/admin.html:272 -#: cps/templates/admin.html:292 cps/templates/config_db.html:82 +#: cps/templates/admin.html:274 cps/templates/admin.html:288 +#: cps/templates/admin.html:308 cps/templates/config_db.html:82 msgid "OK" msgstr "V poriadku" -#: cps/templates/admin.html:259 cps/templates/admin.html:273 +#: cps/templates/admin.html:275 cps/templates/admin.html:289 #: cps/templates/book_edit.html:220 cps/templates/book_table.html:162 #: cps/templates/book_table.html:181 cps/templates/book_table.html:201 #: cps/templates/book_table.html:221 cps/templates/book_table.html:241 #: cps/templates/book_table.html:261 cps/templates/book_table.html:316 -#: cps/templates/config_db.html:66 cps/templates/config_edit.html:431 +#: cps/templates/config_db.html:66 cps/templates/config_edit.html:453 #: cps/templates/config_view_edit.html:175 cps/templates/detail.html:350 -#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:98 -#: cps/templates/modal_dialogs.html:116 cps/templates/modal_dialogs.html:134 +#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:100 +#: cps/templates/modal_dialogs.html:118 cps/templates/modal_dialogs.html:136 +#: cps/templates/remote_login_verify.html:16 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 #: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Zrušiť" -#: cps/templates/admin.html:271 +#: cps/templates/admin.html:287 msgid "Are you sure you want to shutdown?" msgstr "Skutočne chcete vypnúťť?" -#: cps/templates/admin.html:283 +#: cps/templates/admin.html:299 msgid "Updating, please do not reload this page" msgstr "Aktualizuje sa, neskúšajte znovu načítať stránku" @@ -2137,7 +2205,7 @@ msgid "Fetch Metadata" msgstr "Načítať metadáta" #: cps/templates/book_edit.html:219 cps/templates/config_db.html:65 -#: cps/templates/config_edit.html:430 cps/templates/config_view_edit.html:174 +#: cps/templates/config_edit.html:452 cps/templates/config_view_edit.html:174 #: cps/templates/email_edit.html:65 cps/templates/schedule_edit.html:44 #: cps/templates/shelf_edit.html:25 cps/templates/shelf_order.html:41 #: cps/templates/user_edit.html:142 @@ -2509,214 +2577,234 @@ msgstr "" msgid "Allow Reverse Proxy Authentication" msgstr "Povoliť reverznú proxy autentifikáciu" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:176 +msgid "Security Warning" +msgstr "" + +#: cps/templates/config_edit.html:177 +msgid "Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled." +msgstr "" + +#: cps/templates/config_edit.html:184 +msgid "Reverse Proxy Trusted IPs/CIDRs (Comma Separated)" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "Enable Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/config_edit.html:197 +msgid "Reverse Proxy Shared Secret" +msgstr "" + +#: cps/templates/config_edit.html:205 msgid "Login type" msgstr "Typ prihlásenia" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:207 msgid "Use Standard Authentication" msgstr "Použiť štandardnú autentifikáciu" -#: cps/templates/config_edit.html:187 +#: cps/templates/config_edit.html:209 msgid "Use LDAP Authentication" msgstr "Použiť LDAP autentifikáciu" -#: cps/templates/config_edit.html:190 +#: cps/templates/config_edit.html:212 msgid "Use OAuth" msgstr "Použiť OAuth" -#: cps/templates/config_edit.html:197 +#: cps/templates/config_edit.html:219 msgid "LDAP Server Host Name or IP Address" msgstr "Hostiteľské meno alebo IP adresa LDAP servera" -#: cps/templates/config_edit.html:201 +#: cps/templates/config_edit.html:223 msgid "LDAP Server Port" msgstr "Port LDAP servera" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:227 msgid "LDAP Encryption" msgstr "LDAP šifrovanie" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:230 msgid "TLS" msgstr "TLS" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:231 msgid "SSL" msgstr "SSL" -#: cps/templates/config_edit.html:213 +#: cps/templates/config_edit.html:235 msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" msgstr "Cesta k LDAP CA-certifikátu (potrebná iba pre autentifikáciu certifikátom klienta)" -#: cps/templates/config_edit.html:220 +#: cps/templates/config_edit.html:242 msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" msgstr "Cesta k LDAP certifikátu (potrebná iba pre autentifikáciu certifikátom klienta)" -#: cps/templates/config_edit.html:227 +#: cps/templates/config_edit.html:249 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" msgstr "Cesta k LDAP súboru kľúča (potrebná iba pre autentifikáciu certifikátom klienta)" -#: cps/templates/config_edit.html:236 +#: cps/templates/config_edit.html:258 msgid "LDAP Authentication" msgstr "LDAP autentifikácia" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:260 msgid "Anonymous" msgstr "Anonymný" -#: cps/templates/config_edit.html:239 +#: cps/templates/config_edit.html:261 msgid "Unauthenticated" msgstr "Neautentifikovaný" -#: cps/templates/config_edit.html:240 +#: cps/templates/config_edit.html:262 msgid "Simple" msgstr "Jednoduchý" -#: cps/templates/config_edit.html:245 +#: cps/templates/config_edit.html:267 msgid "LDAP Administrator Username" msgstr "Meno používateľa pre LDAP správcu" -#: cps/templates/config_edit.html:251 +#: cps/templates/config_edit.html:273 msgid "LDAP Administrator Password" msgstr "Heslo pre LDAP správcu" -#: cps/templates/config_edit.html:256 +#: cps/templates/config_edit.html:278 msgid "LDAP Distinguished Name (DN)" msgstr "LDAP rozlišovacie meno (DN)" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:282 msgid "LDAP User Object Filter" msgstr "Filter pre LDAP objekt používateľa" -#: cps/templates/config_edit.html:265 +#: cps/templates/config_edit.html:287 msgid "LDAP Server is OpenLDAP?" msgstr "LDAP server je OpenLDAP?" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:289 msgid "Following Settings are Needed For User Import" msgstr "Pre import používateľa sú potrebné nasledovné nastavenia" -#: cps/templates/config_edit.html:269 +#: cps/templates/config_edit.html:291 msgid "LDAP Group Object Filter" msgstr "Filter pre LDAP objekt skupiny" -#: cps/templates/config_edit.html:273 +#: cps/templates/config_edit.html:295 msgid "LDAP Group Name" msgstr "Meno LDAP skupiny" -#: cps/templates/config_edit.html:277 +#: cps/templates/config_edit.html:299 msgid "LDAP Group Members Field" msgstr "Pole členov LDAP skupiny" -#: cps/templates/config_edit.html:281 +#: cps/templates/config_edit.html:303 msgid "LDAP Member User Filter Detection" msgstr "Detekcia filtra pre LDAP členstvo používateľa" -#: cps/templates/config_edit.html:283 +#: cps/templates/config_edit.html:305 msgid "Autodetect" msgstr "Automatická detekcia" -#: cps/templates/config_edit.html:284 +#: cps/templates/config_edit.html:306 msgid "Custom Filter" msgstr "Filter používateľa" -#: cps/templates/config_edit.html:289 +#: cps/templates/config_edit.html:311 msgid "LDAP Member User Filter" msgstr "Filter pre LDAP členstvo požívateľa" -#: cps/templates/config_edit.html:300 +#: cps/templates/config_edit.html:322 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "Získať OAuth prístupové údaje pre %(provider)s" -#: cps/templates/config_edit.html:303 +#: cps/templates/config_edit.html:325 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "%(provider)s OAuth klientské ID" -#: cps/templates/config_edit.html:307 +#: cps/templates/config_edit.html:329 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "%(provider)s OAuth klientské tajomstvo" -#: cps/templates/config_edit.html:323 +#: cps/templates/config_edit.html:345 msgid "External binaries" msgstr "Externé binárky" -#: cps/templates/config_edit.html:329 +#: cps/templates/config_edit.html:351 msgid "Path to Calibre Binaries" msgstr "" -#: cps/templates/config_edit.html:337 +#: cps/templates/config_edit.html:359 msgid "Calibre E-Book Converter Settings" msgstr "Nastavenie Calibre prevádzača e-kníh" -#: cps/templates/config_edit.html:340 +#: cps/templates/config_edit.html:362 msgid "Path to Kepubify E-Book Converter" msgstr "Cesta Kepubify prevádzaču e-kníh" -#: cps/templates/config_edit.html:348 +#: cps/templates/config_edit.html:370 msgid "Location of Unrar binary" msgstr "" -#: cps/templates/config_edit.html:364 +#: cps/templates/config_edit.html:386 msgid "Security Settings" msgstr "Bezpečnostné nastavenia" -#: cps/templates/config_edit.html:372 +#: cps/templates/config_edit.html:394 msgid "Limit failed login attempts" msgstr "Obmedziť neúspešné pokusy o prihlásenie" -#: cps/templates/config_edit.html:376 +#: cps/templates/config_edit.html:398 msgid "Configure Backend for Limiter" msgstr "" -#: cps/templates/config_edit.html:380 +#: cps/templates/config_edit.html:402 msgid "Options for Limiter Backend" msgstr "" -#: cps/templates/config_edit.html:386 +#: cps/templates/config_edit.html:408 msgid "Check if file extensions matches file content on upload" msgstr "" -#: cps/templates/config_edit.html:389 +#: cps/templates/config_edit.html:411 msgid "Session protection" msgstr "Ochrana sedenia" -#: cps/templates/config_edit.html:391 +#: cps/templates/config_edit.html:413 msgid "Basic" msgstr "Základná" -#: cps/templates/config_edit.html:392 +#: cps/templates/config_edit.html:414 msgid "Strong" msgstr "Silná" -#: cps/templates/config_edit.html:397 +#: cps/templates/config_edit.html:419 msgid "User Password policy" msgstr "Zásady pre používateľské heslá" -#: cps/templates/config_edit.html:401 +#: cps/templates/config_edit.html:423 msgid "Minimum password length" msgstr "Minimálna dĺžka hesla" -#: cps/templates/config_edit.html:406 +#: cps/templates/config_edit.html:428 msgid "Enforce number" msgstr "Vyžadovať číslo" -#: cps/templates/config_edit.html:410 +#: cps/templates/config_edit.html:432 msgid "Enforce lowercase characters" msgstr "Vyžadovať malé písmená" -#: cps/templates/config_edit.html:414 +#: cps/templates/config_edit.html:436 msgid "Enforce uppercase characters" msgstr "Vyžadovať veľké písmená" -#: cps/templates/config_edit.html:418 +#: cps/templates/config_edit.html:440 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" msgstr "" -#: cps/templates/config_edit.html:422 +#: cps/templates/config_edit.html:444 msgid "Enforce special characters" msgstr "Vyžadovať špeciálne znaky" @@ -3183,27 +3271,27 @@ msgstr "Kniha musí byť najskôr archivovaná a zariadenie synchronizované pre msgid "Choose File Location" msgstr "Vyberte umiestnenie súboru" -#: cps/templates/modal_dialogs.html:81 +#: cps/templates/modal_dialogs.html:82 msgid "type" msgstr "typ" -#: cps/templates/modal_dialogs.html:82 +#: cps/templates/modal_dialogs.html:83 msgid "name" msgstr "meno" -#: cps/templates/modal_dialogs.html:83 +#: cps/templates/modal_dialogs.html:84 msgid "size" msgstr "veľkosť" -#: cps/templates/modal_dialogs.html:89 +#: cps/templates/modal_dialogs.html:90 msgid "Parent Directory" msgstr "Rodičovský adresár" -#: cps/templates/modal_dialogs.html:97 +#: cps/templates/modal_dialogs.html:99 msgid "Select" msgstr "Vybrať" -#: cps/templates/modal_dialogs.html:133 cps/templates/tasks.html:46 +#: cps/templates/modal_dialogs.html:135 cps/templates/tasks.html:46 msgid "Ok" msgstr "Ok" @@ -3459,6 +3547,31 @@ msgstr "Po verifikácii budete automaticky prihlásený na tomto zariadení." msgid "This verification link will expire in 10 minutes." msgstr "Toto verifikačné prepojenie expiruje za 10 minút." +#: cps/templates/remote_login_verify.html:4 +msgid "Approve Magic Link Login" +msgstr "" + +#: cps/templates/remote_login_verify.html:5 +msgid "Review the device that requested access before approving this login." +msgstr "" + +#: cps/templates/remote_login_verify.html:7 +msgid "IP address" +msgstr "" + +#: cps/templates/remote_login_verify.html:9 +msgid "Browser" +msgstr "" + +#: cps/templates/remote_login_verify.html:12 +#, python-format +msgid "If you approve this request, the device that started it will be logged in as %(username)s." +msgstr "" + +#: cps/templates/remote_login_verify.html:15 +msgid "Approve Login" +msgstr "" + #: cps/templates/schedule_edit.html:33 msgid "Generate Series Cover Thumbnails" msgstr "Vygenerovať náhľady obálok kníh pre série" diff --git a/cps/translations/sl/LC_MESSAGES/messages.mo b/cps/translations/sl/LC_MESSAGES/messages.mo index 62050dc8b2005316ee11a7b66f888c8e03cb288d..23e6d341c5a59587c6ccaca9c8feaef991ebdc22 100644 GIT binary patch delta 13580 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

h7HVY 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 delta 11174 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 diff --git a/cps/translations/uk/LC_MESSAGES/messages.po b/cps/translations/uk/LC_MESSAGES/messages.po index 013f748ca..ae3ab1890 100644 --- a/cps/translations/uk/LC_MESSAGES/messages.po +++ b/cps/translations/uk/LC_MESSAGES/messages.po @@ -1,549 +1,575 @@ -# Переклад на українську мову для Calibre-web. +# Український переклад для Calibre-Web. +# Vitalii Stopchanskyi , 2026. # Copyright (C) 2018 ABIS Team # This file is distributed under the same license as the Calibre-web project -# ABIS Team , 2018. msgid "" msgstr "" "Project-Id-Version: Calibre-web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n" -"POT-Creation-Date: 2026-08-01 11:42+0200\n" -"PO-Revision-Date: 2017-04-30 00:47+0300\n" -"Last-Translator: ABIS Team \n" +"POT-Creation-Date: 2026-08-08 16:08+0200\n" +"PO-Revision-Date: 2026-06-30 09:37+0200\n" +"Last-Translator: Vitalii Stopchanskyi \n" "Language: uk\n" -"Language-Team: \n" +"Language-Team: Vitalii Stopchanskyi \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.17.0\n" +"Generated-By: Babel 2.18.0\n" #: cps/about.py:85 msgid "Statistics" msgstr "Статистика" -#: cps/admin.py:151 -#, fuzzy +#: cps/admin.py:154 msgid "Server restarted, please reload page." -msgstr "Сервер перезавантажено, будь-ласка, перезавантажте сторінку" +msgstr "Сервер перезавантажено. Будь ласка, перезавантажте сторінку." -#: cps/admin.py:153 -#, fuzzy +#: cps/admin.py:156 msgid "Performing Server shutdown, please close window." -msgstr "Виконується зупинка серверу, будь-ласка, закрийте вікно" - -#: cps/admin.py:161 -msgid "Success! Database Reconnected" -msgstr "" +msgstr "Виконується вимкнення сервера. Будь ласка, закрийте вікно." #: cps/admin.py:164 +msgid "Success! Database Reconnected" +msgstr "Вдалося! Базу даних перепід'єднано" + +#: cps/admin.py:167 msgid "Unknown command" msgstr "Невідома команда" -#: cps/admin.py:175 +#: cps/admin.py:178 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" -msgstr "" +msgstr "Вдалося! Книги поставлено в чергу для резервного копіювання метаданих. Результат можна побачити у завданнях" -#: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 -#: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 -#: cps/uploader.py:117 +#: cps/admin.py:211 cps/editbooks.py:825 cps/editbooks.py:875 +#: cps/editbooks.py:1564 cps/templates/remote_login_verify.html:8 +#: cps/templates/remote_login_verify.html:10 cps/updater.py:615 +#: cps/uploader.py:117 cps/uploader.py:126 msgid "Unknown" msgstr "Невідомий" -#: cps/admin.py:233 +#: cps/admin.py:236 msgid "Admin page" msgstr "Сторінка адміністратора" -#: cps/admin.py:253 +#: cps/admin.py:256 msgid "Basic Configuration" -msgstr "Настройки сервера" +msgstr "Базові налаштування" -#: cps/admin.py:291 +#: cps/admin.py:294 msgid "UI Configuration" -msgstr "Конфігурація інтерфейсу" +msgstr "Налаштування інтерфейсу" -#: cps/admin.py:315 cps/admin.py:1002 cps/db.py:809 cps/search.py:150 -#: cps/web.py:750 +#: cps/admin.py:318 cps/admin.py:1005 cps/db.py:809 cps/search.py:150 +#: cps/web.py:752 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" -msgstr "" +msgstr "Стовпчика №%(column)d немає в базі даних Calibre" -#: cps/admin.py:333 cps/templates/admin.html:51 -#, fuzzy +#: cps/admin.py:336 cps/templates/admin.html:51 msgid "Edit Users" -msgstr "Керування сервером" +msgstr "Редагувати користувачів" -#: cps/admin.py:378 cps/opds.py:559 cps/templates/grid.html:14 +#: cps/admin.py:381 cps/opds.py:559 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" -msgstr "Всі" +msgstr "Усі" -#: cps/admin.py:401 cps/admin.py:1432 +#: cps/admin.py:404 cps/admin.py:1460 msgid "User not found" msgstr "Користувача не знайдено" -#: cps/admin.py:415 +#: cps/admin.py:418 #, python-brace-format msgid "{} users deleted successfully" -msgstr "{} користувачі видалені успішно" +msgstr "{} користувачів успішно видалено" -#: cps/admin.py:438 cps/templates/config_view_edit.html:133 +#: cps/admin.py:441 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" -msgstr "Показати всі" +msgstr "Показати усі" -#: cps/admin.py:459 cps/admin.py:465 +#: cps/admin.py:462 cps/admin.py:468 msgid "Malformed request" -msgstr "" +msgstr "Хибний запит" -#: cps/admin.py:477 cps/admin.py:2078 +#: cps/admin.py:480 cps/admin.py:2156 msgid "Guest Name can't be changed" -msgstr "" +msgstr "Ім'я гостя неможливо змінити" -#: cps/admin.py:489 +#: cps/admin.py:492 msgid "Guest can't have this role" -msgstr "" +msgstr "Гість не може мати цієї ролі" -#: cps/admin.py:501 cps/admin.py:2032 +#: cps/admin.py:504 cps/admin.py:2110 msgid "No admin user remaining, can't remove admin role" -msgstr "" +msgstr "Неможливо вилучити роль адміністратора, бо тоді не залишиться жодного адміністратора" -#: cps/admin.py:505 cps/admin.py:519 +#: cps/admin.py:508 cps/admin.py:522 msgid "Value has to be true or false" -msgstr "" +msgstr "Значення повинно бути істинним чи хибним" -#: cps/admin.py:507 +#: cps/admin.py:510 msgid "Invalid role" -msgstr "Не правильна роль" +msgstr "Хибна роль" -#: cps/admin.py:511 +#: cps/admin.py:514 msgid "Guest can't have this view" -msgstr "" - -#: cps/admin.py:521 -msgid "Invalid view" -msgstr "" +msgstr "Гість не може мати такого вигляду" #: cps/admin.py:524 +msgid "Invalid view" +msgstr "Хибний вигляд" + +#: cps/admin.py:527 msgid "Guest's Locale is determined automatically and can't be set" -msgstr "" +msgstr "Локаль гостя визначається автоматично і не може бути вказана" -#: cps/admin.py:528 +#: cps/admin.py:531 msgid "No Valid Locale Given" -msgstr "" +msgstr "Не вказано дійсної локалі" -#: cps/admin.py:539 +#: cps/admin.py:542 msgid "No Valid Book Language Given" -msgstr "" +msgstr "Не вказано дійсної мови книги" -#: cps/admin.py:541 cps/editbooks.py:243 cps/editbooks.py:428 -#: cps/editbooks.py:430 +#: cps/admin.py:544 cps/editbooks.py:260 cps/editbooks.py:445 +#: cps/editbooks.py:447 msgid "Parameter not found" -msgstr "" +msgstr "Параметр не знайдено" -#: cps/admin.py:578 +#: cps/admin.py:581 msgid "Invalid Read Column" -msgstr "" +msgstr "Хибний стовпчик читання" -#: cps/admin.py:584 +#: cps/admin.py:587 msgid "Invalid Restricted Column" -msgstr "" +msgstr "Хибний стовпчик з обмеженнями" -#: cps/admin.py:604 cps/admin.py:1903 +#: cps/admin.py:607 cps/admin.py:1981 msgid "Calibre-Web configuration updated" -msgstr "" +msgstr "Конфіґурацію Calibre-Web оновлено" -#: cps/admin.py:616 +#: cps/admin.py:619 msgid "Do you really want to delete the Kobo Token?" -msgstr "" +msgstr "Справді бажаєте видалити токен Kobo?" -#: cps/admin.py:618 +#: cps/admin.py:621 msgid "Do you really want to delete this domain?" -msgstr "" +msgstr "Справді бажаєте видалити цей домен?" -#: cps/admin.py:620 +#: cps/admin.py:623 msgid "Do you really want to delete this user?" -msgstr "" +msgstr "Справді бажаєте видалити цього користувача?" -#: cps/admin.py:622 -#, fuzzy +#: cps/admin.py:625 msgid "Do you really want to delete this book?" -msgstr "Ви справді хочете видалити книжкову полицю?" +msgstr "Справді бажаєте видалити цю полицю?" -#: cps/admin.py:624 +#: cps/admin.py:627 msgid "Are you sure you want to delete this shelf?" -msgstr "Ви справді хочете видалити книжкову полицю?" +msgstr "Справді бажаєте видалити цю полицю?" -#: cps/admin.py:626 -#, fuzzy +#: cps/admin.py:629 msgid "Are you sure you want to change locales of selected user(s)?" -msgstr "Ви справді хочете видалити книжкову полицю?" +msgstr "Справді бажаєте змінити локалі вибраних користувачів?" -#: cps/admin.py:628 +#: cps/admin.py:631 msgid "Are you sure you want to change visible book languages for selected user(s)?" -msgstr "" +msgstr "Справді бажаєте змінити видимі мови книг для вибраних користувачів?" -#: cps/admin.py:630 +#: cps/admin.py:633 msgid "Are you sure you want to change the selected role for the selected user(s)?" -msgstr "" +msgstr "Справді бажаєте змінити вибрану роль для вибраних користувачів?" -#: cps/admin.py:632 -#, fuzzy +#: cps/admin.py:635 msgid "Are you sure you want to change the archive status for the selected book(s)?" -msgstr "Ви справді хочете видалити книжкову полицю?" +msgstr "Справді бажаєте змінити стан архівування для вибраних книг?" -#: cps/admin.py:634 -#, fuzzy +#: cps/admin.py:637 msgid "Are you sure you want to change the read status for the selected book(s)?" -msgstr "Ви справді хочете видалити книжкову полицю?" +msgstr "Справді бажаєте змінити стан читання для вибраних книг?" -#: cps/admin.py:636 -#, fuzzy +#: cps/admin.py:639 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" -msgstr "Ви справді хочете видалити книжкову полицю?" - -#: cps/admin.py:638 -msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" -msgstr "" +msgstr "Справді бажаєте змінити вибрані обмеження для вибраних користувачів?" #: cps/admin.py:641 -#, fuzzy +msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" +msgstr "Справді бажаєте змінити вибрані обмеження видимості для вибраних користувачів?" + +#: cps/admin.py:644 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" -msgstr "Ви справді хочете видалити книжкову полицю?" +msgstr "Справді бажаєте поведінку синхронізації полиці для вибраних користувачів?" -#: cps/admin.py:643 -#, fuzzy +#: cps/admin.py:646 msgid "Are you sure you want to change Calibre library location?" -msgstr "Ви справді хочете видалити книжкову полицю?" - -#: cps/admin.py:645 -msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" -msgstr "" +msgstr "Справді бажаєте розташування бібліотеки Calibre?" #: cps/admin.py:648 -msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" -msgstr "" +msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" +msgstr "Calibre-Web буде шукати оновлені обкладинки та оновить їх мініатюри. Це триватиме певний час. Продовжити?" -#: cps/admin.py:891 cps/admin.py:897 cps/admin.py:907 cps/admin.py:917 +#: cps/admin.py:651 +msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" +msgstr "Справді бажаєте видалити базу даних синхронізації Calibre-Web, щоб примусово виконати повну синхронізацію з е-читалкою Kobo?" + +#: cps/admin.py:894 cps/admin.py:900 cps/admin.py:910 cps/admin.py:920 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" -msgstr "Заборонити" +msgstr "Відхилити" -#: cps/admin.py:893 cps/admin.py:899 cps/admin.py:909 cps/admin.py:919 +#: cps/admin.py:896 cps/admin.py:902 cps/admin.py:912 cps/admin.py:922 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Дозволити" -#: cps/admin.py:952 +#: cps/admin.py:955 #, python-brace-format msgid "{} sync entries deleted" -msgstr "" +msgstr "{} записів синхронізації видалено" -#: cps/admin.py:993 +#: cps/admin.py:996 msgid "Tag not found" -msgstr "Тег не знайдено" +msgstr "Мітки не знайдено" -#: cps/admin.py:1011 +#: cps/admin.py:1014 msgid "Invalid Action" +msgstr "Хибна дія" + +#: cps/admin.py:1137 +#, python-format +msgid "Invalid reverse proxy trusted IP/CIDR entry: %(entry)s" msgstr "" -#: cps/admin.py:1138 +#: cps/admin.py:1148 +#, python-format +msgid "Invalid %(label)s: %(value)s" +msgstr "" + +#: cps/admin.py:1166 msgid "client_secrets.json Is Not Configured For Web Application" -msgstr "" +msgstr "client_secrets.json не налаштований для вебзастосунка" -#: cps/admin.py:1183 +#: cps/admin.py:1211 msgid "Logfile Location is not Valid, Please Enter Correct Path" -msgstr "" +msgstr "Розташування файлу журналу недійсне. Вкажіть коректний шлях до файлу" -#: cps/admin.py:1189 +#: cps/admin.py:1217 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" -msgstr "" +msgstr "Розташування файлу журналу доступу недійсне. Вкажіть коректний шлях" -#: cps/admin.py:1223 +#: cps/admin.py:1251 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" -msgstr "" +msgstr "Вкажіть надавача LDAP, порт, DN ідентифікатор об'єкту користувача" -#: cps/admin.py:1229 +#: cps/admin.py:1257 msgid "Please Enter a LDAP Service Account and Password" -msgstr "" +msgstr "Вкажіть обліковий запис служби LDAP і пароль" -#: cps/admin.py:1232 +#: cps/admin.py:1260 msgid "Please Enter a LDAP Service Account" -msgstr "" +msgstr "Вкажіть обліковий запис служби LDAP" -#: cps/admin.py:1237 +#: cps/admin.py:1265 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" -msgstr "" +msgstr "Фільтр об'єктів групи LDAP повинен мати один ідентифікатор формату «%s»" -#: cps/admin.py:1239 +#: cps/admin.py:1267 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" -msgstr "" +msgstr "Фільтр об'єктів групи LDAP має дужки, що не збігаються" -#: cps/admin.py:1243 +#: cps/admin.py:1271 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" -msgstr "" +msgstr "Фільтр об'єктів користувача LDAP повинен мати один ідентифікатор формату «%s»" -#: cps/admin.py:1245 +#: cps/admin.py:1273 msgid "LDAP User Object Filter Has Unmatched Parenthesis" -msgstr "" +msgstr "Фільтр об'єктів групи LDAP містить дужки, які не збігаються" -#: cps/admin.py:1252 +#: cps/admin.py:1280 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" -msgstr "" +msgstr "Фільтр користувачів-учасників LDAP повинен мати один ідентифікатор формату «%s»" -#: cps/admin.py:1254 +#: cps/admin.py:1282 msgid "LDAP Member User Filter Has Unmatched Parenthesis" -msgstr "" +msgstr "Фільтр користувачів-учасників LDAP містить дужки, які не збігаються" -#: cps/admin.py:1261 +#: cps/admin.py:1289 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" -msgstr "" +msgstr "CACertificate LDAP, сертифікат або ключове розташування хибне. Вкажіть коректний шлях" -#: cps/admin.py:1292 cps/templates/admin.html:53 +#: cps/admin.py:1320 cps/templates/admin.html:53 msgid "Add New User" -msgstr "" +msgstr "Додати нового користувача" -#: cps/admin.py:1301 cps/templates/admin.html:100 +#: cps/admin.py:1329 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Змінити налаштування SMTP" -#: cps/admin.py:1320 +#: cps/admin.py:1348 msgid "Success! Gmail Account Verified." -msgstr "" +msgstr "Вдалося! Обліковий запис Gmail перевірено." -#: cps/admin.py:1340 cps/admin.py:1343 cps/admin.py:1728 cps/admin.py:1887 -#: cps/admin.py:1985 cps/admin.py:2106 cps/editbooks.py:169 -#: cps/editbooks.py:755 cps/editbooks.py:1474 cps/shelf.py:90 cps/shelf.py:144 +#: cps/admin.py:1368 cps/admin.py:1371 cps/admin.py:1756 cps/admin.py:1965 +#: cps/admin.py:2063 cps/admin.py:2184 cps/editbooks.py:170 +#: cps/editbooks.py:772 cps/editbooks.py:1518 cps/shelf.py:90 cps/shelf.py:144 #: cps/shelf.py:194 cps/shelf.py:237 cps/shelf.py:287 cps/shelf.py:327 -#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:160 cps/web.py:1526 +#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:161 cps/web.py:1536 #, python-format msgid "Oops! Database Error: %(error)s." -msgstr "" +msgstr "Ой, леле! Помилка бази даний: %(error)s." -#: cps/admin.py:1350 +#: cps/admin.py:1378 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" -msgstr "" +msgstr "Пробний е-лист доданий до черги для надсилання до %(email)s. Перевірте результат у завданнях" -#: cps/admin.py:1353 +#: cps/admin.py:1381 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" -msgstr "" +msgstr "Сталася помилка надсилання пробного е-листа: %(res)s" -#: cps/admin.py:1355 +#: cps/admin.py:1383 msgid "Please configure your e-mail address first..." -msgstr "" +msgstr "Будь ласка, спершу налаштуйте свою адресу е-пошти..." -#: cps/admin.py:1357 +#: cps/admin.py:1385 msgid "Email Server Settings updated" -msgstr "" +msgstr "Налаштування сервера е-пошти оновлено" -#: cps/admin.py:1380 cps/templates/admin.html:195 +#: cps/admin.py:1408 cps/templates/admin.html:211 msgid "Edit Scheduled Tasks Settings" -msgstr "" +msgstr "Змінити налаштування запланованих завдань" -#: cps/admin.py:1392 +#: cps/admin.py:1420 msgid "Invalid start time for task specified" -msgstr "" +msgstr "Для завдання вказано хибний час початку" -#: cps/admin.py:1397 +#: cps/admin.py:1425 msgid "Invalid duration for task specified" -msgstr "" +msgstr "Для завдання вказано хибну тривалість" -#: cps/admin.py:1407 +#: cps/admin.py:1435 msgid "Scheduled tasks settings updated" -msgstr "" +msgstr "Налаштування запланованих завдань оновлено" -#: cps/admin.py:1417 cps/admin.py:1466 cps/admin.py:2102 cps/web.py:1325 +#: cps/admin.py:1445 cps/admin.py:1494 cps/admin.py:2180 cps/web.py:1335 msgid "Oops! An unknown error occurred. Please try again later." -msgstr "" +msgstr "Ой, лихо! Сталася невідома помилка! Спробуйте знову пізніше." -#: cps/admin.py:1421 +#: cps/admin.py:1449 msgid "Settings DB is not Writeable" -msgstr "" +msgstr "БД налаштувань недоступна для запису" -#: cps/admin.py:1451 cps/admin.py:2094 +#: cps/admin.py:1479 cps/admin.py:2172 #, python-format msgid "Edit User %(nick)s" msgstr "Змінити користувача %(nick)s" -#: cps/admin.py:1463 +#: cps/admin.py:1491 #, python-format msgid "Success! Password for user %(user)s reset" -msgstr "" +msgstr "Вдалося! Пароль користувача %(user)s скинуто" -#: cps/admin.py:1469 -#, fuzzy +#: cps/admin.py:1497 msgid "Oops! Please configure the SMTP mail settings." -msgstr "Будь-ласка, спочатку сконфігуруйте параметри SMTP" +msgstr "Будь ласка, спочатку налаштуйте SMTP." -#: cps/admin.py:1480 +#: cps/admin.py:1508 msgid "Logfile viewer" -msgstr "" +msgstr "Переглядач файлів журналів" -#: cps/admin.py:1546 +#: cps/admin.py:1574 msgid "Requesting update package" -msgstr "Перевірка оновлень" +msgstr "Перевірка наявності оновлення" -#: cps/admin.py:1547 +#: cps/admin.py:1575 msgid "Downloading update package" -msgstr "Завантаження оновлень" +msgstr "Завантаження оновлення" -#: cps/admin.py:1548 +#: cps/admin.py:1576 msgid "Unzipping update package" msgstr "Розпакування оновлення" -#: cps/admin.py:1549 +#: cps/admin.py:1577 msgid "Replacing files" msgstr "Заміна файлів" -#: cps/admin.py:1550 +#: cps/admin.py:1578 msgid "Database connections are closed" msgstr "З'єднання з базою даних закрите" -#: cps/admin.py:1551 +#: cps/admin.py:1579 msgid "Stopping server" msgstr "Сервер зупиняється" -#: cps/admin.py:1552 +#: cps/admin.py:1580 msgid "Update finished, please press okay and reload page" -msgstr "Оновлення встановлені, натисніть ok і перезавантажте сторінку" +msgstr "Оновлення встановлено. Натисніть «Гаразд» перезавантажте сторінку" -#: cps/admin.py:1553 cps/admin.py:1554 cps/admin.py:1555 cps/admin.py:1556 -#: cps/admin.py:1557 cps/admin.py:1558 +#: cps/admin.py:1581 cps/admin.py:1582 cps/admin.py:1583 cps/admin.py:1584 +#: cps/admin.py:1585 cps/admin.py:1586 msgid "Update failed:" -msgstr "Оновлення неуспішне:" +msgstr "Не вдалося оновити:" -#: cps/admin.py:1553 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1581 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" -msgstr "HTTP помилка" +msgstr "Помилка HTTP" -#: cps/admin.py:1554 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1582 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Помилка зʼєднання" -#: cps/admin.py:1555 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1583 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" -msgstr "" +msgstr "Минув час встановлення з'єднання" -#: cps/admin.py:1556 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1584 cps/updater.py:397 cps/updater.py:634 msgid "General error" -msgstr "Помилка" +msgstr "Загальна помилка" -#: cps/admin.py:1557 +#: cps/admin.py:1585 msgid "Update file could not be saved in temp dir" -msgstr "" +msgstr "Файл оновлення не вдалося зберегти до тимчасової теки" -#: cps/admin.py:1558 +#: cps/admin.py:1586 msgid "Files could not be replaced during update" -msgstr "" +msgstr "Під час оновлення не вдалося замінити файли" -#: cps/admin.py:1582 +#: cps/admin.py:1610 msgid "Failed to extract at least One LDAP User" -msgstr "" +msgstr "Не вдалося витягнути щонайменше одного користувача LDAP" -#: cps/admin.py:1627 +#: cps/admin.py:1655 msgid "Failed to Create at Least One LDAP User" -msgstr "" +msgstr "Не вдалося створити щонайменше одного користувача LDAP" -#: cps/admin.py:1640 +#: cps/admin.py:1668 #, python-format msgid "Error: %(ldaperror)s" -msgstr "" +msgstr "Помилка: %(ldaperror)s" -#: cps/admin.py:1644 +#: cps/admin.py:1672 msgid "Error: No user returned in response of LDAP server" -msgstr "" +msgstr "Помилка: У відповідь на запит LDAP-сервера не повернуто жодного користувача" -#: cps/admin.py:1680 +#: cps/admin.py:1708 msgid "At Least One LDAP User Not Found in Database" -msgstr "" +msgstr "Щонайменше одного користувача LDAP не знайдено у базі даних" -#: cps/admin.py:1682 +#: cps/admin.py:1710 #, python-brace-format msgid "{} User Successfully Imported" -msgstr "" +msgstr "Користувача {} успішно імпортовано" -#: cps/admin.py:1740 +#: cps/admin.py:1768 msgid "Books path not valid" -msgstr "" - -#: cps/admin.py:1746 -msgid "DB Location is not Valid, Please Enter Correct Path" -msgstr "" +msgstr "Шлях до книги недійсний" #: cps/admin.py:1774 +msgid "DB Location is not Valid, Please Enter Correct Path" +msgstr "Розташування БД недійсне. Вкажіть коректний шлях" + +#: cps/admin.py:1802 msgid "DB is not Writeable" -msgstr "" +msgstr "БД недоступна для запису" -#: cps/admin.py:1788 +#: cps/admin.py:1816 msgid "Keyfile Location is not Valid, Please Enter Correct Path" -msgstr "" +msgstr "Розташування ключового файлу недійсне. Вкажіть коректний шлях" -#: cps/admin.py:1792 +#: cps/admin.py:1820 msgid "Certfile Location is not Valid, Please Enter Correct Path" +msgstr "Розташування файлу сертифіката недійсне. Вкажіть коректний шлях" + +#: cps/admin.py:1846 +msgid "Kepubify binary not found" msgstr "" -#: cps/admin.py:1872 +#: cps/admin.py:1894 +msgid "reverse proxy login header name" +msgstr "" + +#: cps/admin.py:1904 +msgid "reverse proxy shared secret header name" +msgstr "" + +#: cps/admin.py:1913 +msgid "Please configure both reverse proxy shared secret header name and secret" +msgstr "" + +#: cps/admin.py:1917 +msgid "Please configure reverse proxy shared secret header name and secret or disable the feature" +msgstr "" + +#: cps/admin.py:1922 +msgid "Please configure at least one trusted reverse proxy IP or CIDR" +msgstr "" + +#: cps/admin.py:1946 msgid "Password length has to be between 1 and 40" +msgstr "Довжина пароля повинна бути між 1 та 40 символів" + +#: cps/admin.py:1957 cps/helper.py:1007 +msgid "Please specify a valid UnRar directory" msgstr "" -#: cps/admin.py:1926 -#, fuzzy +#: cps/admin.py:2004 msgid "Database Settings updated" -msgstr "З'єднання з базою даних закрите" +msgstr "Налаштування бази даних оновлено" -#: cps/admin.py:1934 -#, fuzzy +#: cps/admin.py:2012 msgid "Database Configuration" -msgstr "Особливі налаштування" +msgstr "Налаштування БД" -#: cps/admin.py:1949 cps/web.py:1295 +#: cps/admin.py:2027 cps/web.py:1305 msgid "Oops! Please complete all fields." -msgstr "Будь-ласка, заповніть всі поля!" +msgstr "Будь ласка, заповніть всі поля." -#: cps/admin.py:1958 +#: cps/admin.py:2036 msgid "E-mail is not from valid domain" -msgstr "" +msgstr "Адреса е-пошти з недійсного домена" -#: cps/admin.py:1964 +#: cps/admin.py:2042 msgid "Add new user" -msgstr "Додати користувача" +msgstr "Додати нового користувача" -#: cps/admin.py:1975 +#: cps/admin.py:2053 #, python-format msgid "User '%(user)s' created" -msgstr "Користувач '%(user)s' додан" +msgstr "Користувача «%(user)s» додано" -#: cps/admin.py:1981 +#: cps/admin.py:2059 msgid "Oops! An account already exists for this Email. or name." -msgstr "" +msgstr "От дідько! Обліковий запис з цією е-поштою або псевдом вже існує." -#: cps/admin.py:2011 +#: cps/admin.py:2089 #, python-format msgid "User '%(nick)s' deleted" -msgstr "Користувача '%(nick)s' видалено" +msgstr "Користувача «%(nick)s» видалено" -#: cps/admin.py:2014 +#: cps/admin.py:2092 msgid "Can't delete Guest User" -msgstr "" +msgstr "Користувача-гостя неможливо видалити" -#: cps/admin.py:2017 +#: cps/admin.py:2095 msgid "No admin user remaining, can't delete user" -msgstr "" +msgstr "Неможливо видалити користувача, бо тоді не залишиться жодного адміністратора" -#: cps/admin.py:2072 cps/web.py:1475 +#: cps/admin.py:2150 cps/web.py:1485 msgid "Email can't be empty and has to be a valid Email" -msgstr "" +msgstr "Адреса е-пошти не може бути порожньою і повинна бути дійсною" -#: cps/admin.py:2098 +#: cps/admin.py:2176 #, python-format msgid "User '%(nick)s' updated" -msgstr "Користувача '%(nick)s' оновлено" +msgstr "Користувача «%(nick)s» оновлено" #: cps/basic.py:66 cps/search.py:50 cps/search.py:440 #: cps/templates/basic_layout.html:23 cps/templates/book_edit.html:242 @@ -553,204 +579,211 @@ msgstr "Користувача '%(nick)s' оновлено" msgid "Search" msgstr "Пошук" -#: cps/converter.py:31 +#: cps/converter.py:32 msgid "not installed" msgstr "не встановлено" -#: cps/converter.py:32 +#: cps/converter.py:33 msgid "Execution permissions missing" -msgstr "" +msgstr "Відсутні дозволи на виконання" -#: cps/db.py:1129 cps/templates/config_edit.html:207 +#: cps/db.py:1129 cps/templates/config_edit.html:229 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:565 cps/web.py:599 cps/web.py:644 cps/web.py:684 cps/web.py:711 -#: cps/web.py:998 cps/web.py:1028 cps/web.py:1073 cps/web.py:1101 -#: cps/web.py:1140 +#: cps/web.py:567 cps/web.py:601 cps/web.py:646 cps/web.py:686 cps/web.py:713 +#: cps/web.py:1000 cps/web.py:1030 cps/web.py:1075 cps/web.py:1103 +#: cps/web.py:1142 msgid "None" -msgstr "Ні" +msgstr "Немає" -#: cps/editbooks.py:155 +#: cps/editbooks.py:156 #, python-format msgid "File %(file)s uploaded" -msgstr "" +msgstr "Файл %(file)s вивантажено" -#: cps/editbooks.py:184 +#: cps/editbooks.py:185 msgid "Source or destination format for conversion missing" +msgstr "Формат джерела або призначення для конвертації" + +#: cps/editbooks.py:189 cps/editbooks.py:197 +msgid "Source format for conversion not supported" msgstr "" -#: cps/editbooks.py:192 +#: cps/editbooks.py:201 +msgid "Destination format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:209 #, python-format msgid "Book successfully queued for converting to %(book_format)s" -msgstr "" +msgstr "Книгу успішно поставлено в чергу для конвертації в %(book_format)s" -#: cps/editbooks.py:196 +#: cps/editbooks.py:213 #, python-format msgid "There was an error converting this book: %(res)s" -msgstr "" +msgstr "Відбулася помилка конвертації цієї книги: %(res)s" -#: cps/editbooks.py:297 +#: cps/editbooks.py:314 msgid "Changes successfully applied" -msgstr "" +msgstr "Зміни успішно застосовано" -#: cps/editbooks.py:317 +#: cps/editbooks.py:334 msgid "Value is missing on request" -msgstr "" +msgstr "Значення відсутнє за запитом" -#: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 -#: cps/editbooks.py:1146 cps/web.py:532 cps/web.py:1567 cps/web.py:1613 -#: cps/web.py:1663 +#: cps/editbooks.py:336 cps/editbooks.py:343 cps/editbooks.py:644 +#: cps/editbooks.py:1170 cps/web.py:534 cps/web.py:1577 cps/web.py:1623 +#: cps/web.py:1673 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" -msgstr "Неможливо відкрити книгу. Файл не існує або немає доступу." +msgstr "Ой, лишенько! Вибрана книга недоступна. Файл не існує або до нього немає доступу" -#: cps/editbooks.py:673 cps/editbooks.py:1503 +#: cps/editbooks.py:690 cps/editbooks.py:1547 msgid "User has no rights to upload cover" -msgstr "" +msgstr "Користувач не має права вивантажувати обкладинку" -#: cps/editbooks.py:694 cps/editbooks.py:938 +#: cps/editbooks.py:711 cps/editbooks.py:961 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" -msgstr "" +msgstr "Ідентифікатори нечутливі до великих/малих літер. Перезапис старого ідентифікатора" -#: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 +#: cps/editbooks.py:726 cps/editbooks.py:935 cps/editbooks.py:1306 #, python-format msgid "'%(langname)s' is not a valid language" -msgstr "" +msgstr "«%(langname)s» є недійсною мовою" -#: cps/editbooks.py:737 +#: cps/editbooks.py:754 msgid "Metadata successfully updated" -msgstr "" +msgstr "Метадані успішно оновлено" -#: cps/editbooks.py:760 +#: cps/editbooks.py:777 #, python-brace-format msgid "Error editing book: {}" -msgstr "" +msgstr "Помилка редагування книги: {}" -#: cps/editbooks.py:856 +#: cps/editbooks.py:879 msgid "Uploaded book probably exists in the library, consider to change before upload new: " -msgstr "" +msgstr "Вивантажена книга, ймовірно, вже наявна у бібліотеці, тож подумайте заміну перед вивантаженням нової: " -#: cps/editbooks.py:950 cps/editbooks.py:1420 +#: cps/editbooks.py:973 cps/editbooks.py:1464 msgid "File type isn't allowed to be uploaded to this server" -msgstr "" +msgstr "Тип файлу недозволений для вивантаження на цей сервер" -#: cps/editbooks.py:956 cps/editbooks.py:1431 +#: cps/editbooks.py:979 cps/editbooks.py:1475 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" -msgstr "" +msgstr "Розширення файлу «%(ext)s» не дозволене для вивантаження на цей сервер" -#: cps/editbooks.py:960 cps/editbooks.py:1436 +#: cps/editbooks.py:983 cps/editbooks.py:1480 msgid "File to be uploaded must have an extension" -msgstr "Завантажувальний файл повинен мати розширення" +msgstr "Файл для завантаження повинен мати розширення" -#: cps/editbooks.py:968 +#: cps/editbooks.py:992 #, python-format msgid "File %(filename)s could not saved to temp dir" -msgstr "" +msgstr "Файл %(filename)s не вдалося зберегти до тимчасової теки" -#: cps/editbooks.py:988 +#: cps/editbooks.py:1012 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" -msgstr "" - -#: cps/editbooks.py:1041 -msgid "Book Format Successfully Deleted" -msgstr "" - -#: cps/editbooks.py:1044 cps/editbooks.py:1061 -msgid "Book Successfully Deleted" -msgstr "" +msgstr "Не вдалося перемістити файл обкладинки %(file)s: %(error)s" #: cps/editbooks.py:1065 -msgid "You are missing permissions to delete books" -msgstr "" +msgid "Book Format Successfully Deleted" +msgstr "Формат книг успішно видалено" -#: cps/editbooks.py:1139 +#: cps/editbooks.py:1068 cps/editbooks.py:1085 +msgid "Book Successfully Deleted" +msgstr "Книгу успішно видалено" + +#: cps/editbooks.py:1089 +msgid "You are missing permissions to delete books" +msgstr "Ви не маєте права видаляти книги" + +#: cps/editbooks.py:1163 #, python-brace-format msgid "Book with id \"{}\" could not be deleted: not found" -msgstr "" +msgstr "Книгу з ідентифікатором «{}» не вдалося видалити: не знайдено" -#: cps/editbooks.py:1181 +#: cps/editbooks.py:1205 msgid "edit metadata" -msgstr "змінити метадані" +msgstr "редагувати метадані" -#: cps/editbooks.py:1234 +#: cps/editbooks.py:1267 #, python-format msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" -msgstr "" +msgstr "Індекс серії: %(seriesindex)s є недійсним номером, пропускання" -#: cps/editbooks.py:1425 +#: cps/editbooks.py:1469 msgid "User has no rights to upload additional file formats" -msgstr "" +msgstr "Користувач не має права вивантажувати додаткові формати файлів" -#: cps/editbooks.py:1449 +#: cps/editbooks.py:1493 #, python-format msgid "Failed to create path %(path)s (Permission denied)." -msgstr "" +msgstr "Не вдалося створити шлях %(path)s (доступ заборонено)." -#: cps/editbooks.py:1456 +#: cps/editbooks.py:1500 #, python-format msgid "Failed to store file %(file)s." -msgstr "" +msgstr "Не вдалося зберегти файл %(file)s." -#: cps/editbooks.py:1481 +#: cps/editbooks.py:1525 #, python-format msgid "File format %(ext)s added to %(book)s" -msgstr "" +msgstr "Формат файлу %(ext)s додано до %(book)s" #: cps/error_handler.py:107 msgid "Please wait one minute to register next user" -msgstr "" +msgstr "Перед реєстрацією наступного користувача зачекайте одну хвилину" #: cps/error_handler.py:108 cps/templates/layout.html:69 #: cps/templates/layout.html:104 cps/templates/login.html:27 -#: cps/templates/register.html:17 cps/web.py:1292 cps/web.py:1296 -#: cps/web.py:1302 cps/web.py:1326 cps/web.py:1330 cps/web.py:1343 -#: cps/web.py:1346 +#: cps/templates/register.html:17 cps/web.py:1302 cps/web.py:1306 +#: cps/web.py:1312 cps/web.py:1336 cps/web.py:1340 cps/web.py:1353 +#: cps/web.py:1356 msgid "Register" -msgstr "Зареєструватись" +msgstr "Зареєструвати" #: cps/error_handler.py:112 msgid "Please wait one minute before next login" -msgstr "" +msgstr "Перед наступним входом зачекайте одну хвилину" #: cps/gdrive.py:58 msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" -msgstr "" +msgstr "Налаштування Google Drive не завершено. Спробуйте деактивувати і знову активувати Google Drive" #: cps/gdrive.py:96 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" -msgstr "Домен зворотнього зв'язку не підтверджено. Виконайте дії для підтвердження домену, будь-ласка" +msgstr "Домен зворотного зв'язку не перевірено. Виконайте дії, щоб перевірити домен у консолі розробника Google" #: cps/helper.py:88 #, python-format msgid "%(format)s format not found for book id: %(book)d" -msgstr "" +msgstr "Формат %(format)s не знайдено для книги: %(book)d" -#: cps/helper.py:94 cps/tasks/convert.py:91 +#: cps/helper.py:94 cps/tasks/convert.py:92 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" -msgstr "" +msgstr "%(format)s не знайдено на Google Drive: %(fn)s" #: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" -msgstr "" +msgstr "%(format)s не знайдено: %(fn)s" #: cps/helper.py:105 cps/helper.py:236 cps/templates/detail.html:66 -#, fuzzy msgid "Send to eReader" -msgstr "Відправити на Kindle" +msgstr "Надіслати на Kindle" #: cps/helper.py:106 cps/helper.py:126 cps/helper.py:238 msgid "This Email has been sent via Calibre-Web." -msgstr "" +msgstr "Цей е-лист надіслано за допомогою Calibre-Web." #: cps/helper.py:124 msgid "Calibre-Web Test Email" -msgstr "" +msgstr "Пробний е-лист Calibre-Web" #: cps/helper.py:125 msgid "Test Email" -msgstr "" +msgstr "Пробний е-лист" #: cps/helper.py:133 #, python-format @@ -785,283 +818,282 @@ msgstr "" #: cps/helper.py:142 msgid "Get Started with Calibre-Web" -msgstr "" +msgstr "Початок роботи з Calibre-Web" #: cps/helper.py:149 #, python-format msgid "Registration Email for user: %(name)s" -msgstr "" +msgstr "Е-пошта реєстрації для користувача: %(name)s" #: cps/helper.py:160 cps/helper.py:166 #, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" -msgstr "" +msgstr "Конвертувати %(orig)s у %(format)s і надіслати на е-читалку" #: cps/helper.py:185 cps/helper.py:189 cps/helper.py:193 -#, fuzzy, python-format +#, python-format msgid "Send %(format)s to eReader" -msgstr "Надіслати %(format)s до E-Reader" +msgstr "Надіслати %(format)s на е-читалку" #: cps/helper.py:233 -#, fuzzy, python-format +#, python-format msgid "%(book)s send to eReader" -msgstr "Відправити на Kindle" +msgstr "%(book)s надіслано на е-читалку" #: cps/helper.py:240 msgid "The requested file could not be read. Maybe wrong permissions?" -msgstr "" +msgstr "Запитаний файл не вдалося прочитати. Можливо, неправильні дозволи?" #: cps/helper.py:353 #, python-brace-format msgid "Read status could not set: {}" -msgstr "" +msgstr "Не вдалося встановити стан читання: {}" #: cps/helper.py:376 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" -msgstr "" +msgstr "Не вдалося видалити теку для книги %(id)s, шлях має підтеки: %(path)s" #: cps/helper.py:382 #, python-format msgid "Deleting book %(id)s failed: %(message)s" -msgstr "" +msgstr "Не вдалося видалити книгу %(id)s: %(message)s" #: cps/helper.py:393 #, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" -msgstr "" +msgstr "Видалення книги %(id)s лише з бази даних, шлях до книги у базі даних недійсний: %(path)s" #: cps/helper.py:407 #, python-format msgid "Moving book path of Book %(book_id)s to: '%(src)s' failed with error: %(error)s" -msgstr "" +msgstr "Не вдалося переміщення шляху книги %(book_id)s до: «%(src)s». Помилка: %(error)s" #: cps/helper.py:446 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" -msgstr "" +msgstr "Не вдалося перейментувати автора з «%(src)s» на «%(dest)s». Помилка: %(error)s" #: cps/helper.py:516 cps/helper.py:525 #, python-format msgid "File %(file)s not found on Google Drive" -msgstr "" +msgstr "Файл %(file)s не знайдено на Google Drive" #: cps/helper.py:567 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" -msgstr "" +msgstr "Не вдалося перейменувати назву з «%(src)s» на «%(dest)s». Помилка: %(error)s" #: cps/helper.py:586 #, python-format msgid "Book path %(path)s not found on Google Drive" -msgstr "" +msgstr "Шлях до книги %(path)s не знайдено на Google Drive" #: cps/helper.py:646 msgid "Found an existing account for this Email address" -msgstr "" +msgstr "Знайдено існуючий обліковий запис з цією адресою е-пошти" #: cps/helper.py:654 msgid "This username is already taken" -msgstr "" +msgstr "Це псевдо вже використовується" #: cps/helper.py:668 msgid "Invalid Email address format" -msgstr "" +msgstr "Хибний формат адреси е-пошти" #: cps/helper.py:690 msgid "Password doesn't comply with password validation rules" -msgstr "" +msgstr "Пароль не відповідає правилам перевірки пароля" #: cps/helper.py:836 msgid "Python module 'advocate' is not installed but is needed for cover uploads" -msgstr "" +msgstr "Модуль Python «advocate» не встановлений, але потрібний для вивантаження обкладинок" #: cps/helper.py:846 msgid "Error Downloading Cover" -msgstr "" +msgstr "Помилка завантаження обкладинки" #: cps/helper.py:849 msgid "Cover Format Error" -msgstr "" +msgstr "Помилка формату обкладинки" #: cps/helper.py:852 msgid "You are not allowed to access localhost or the local network for cover uploads" -msgstr "" +msgstr "Вам не дозволено доступатися до локального хосту або локальної мережі для вивантаження обкладинок" #: cps/helper.py:862 msgid "Failed to create path for cover" -msgstr "" +msgstr "Не вдалося створити шлях для обкладинки" #: cps/helper.py:878 msgid "Cover-file is not a valid image file, or could not be stored" -msgstr "" +msgstr "Файл обкладинки не є дійсним файлом зображення або його неможливо зберегти" #: cps/helper.py:889 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" -msgstr "" +msgstr "В якості файлів обкладинки підтримуються лише формати jpg, jpeg, png, webp, bmp" #: cps/helper.py:901 msgid "Invalid cover file content" -msgstr "" +msgstr "Недійсний вміст файлу обкладинки" #: cps/helper.py:905 msgid "Only jpg/jpeg files are supported as coverfile" -msgstr "" +msgstr "В якості файлів обкладинки підтримуються лише формати jpg та jpeg" #: cps/helper.py:989 cps/helper.py:1152 -#, fuzzy msgid "Cover" -msgstr "Огляд" - -#: cps/helper.py:1006 -msgid "UnRar binary file not found" -msgstr "" +msgstr "Обкладинка" #: cps/helper.py:1017 msgid "Error executing UnRar" -msgstr "" +msgstr "Помилка виконання UnRar" #: cps/helper.py:1025 msgid "Could not find the specified directory" -msgstr "" +msgstr "Не вдалося знайти визначеної теки" #: cps/helper.py:1028 msgid "Please specify a directory, not a file" -msgstr "" +msgstr "Вкажіть саме теку, а не файл" #: cps/helper.py:1042 msgid "Calibre binaries not viable" -msgstr "" +msgstr "Бінарні файли Calibre нежиттєздатні" #: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" -msgstr "" +msgstr "Відсутні бінарні файли Calibre: %(missing)s" #: cps/helper.py:1053 #, python-format msgid "Missing executable permissions: %(missing)s" -msgstr "" +msgstr "Відсутні дозволи на виконання: %(missing)s" #: cps/helper.py:1058 msgid "Error executing Calibre" -msgstr "" +msgstr "Помилка виконання Calibre" -#: cps/helper.py:1154 cps/templates/admin.html:216 +#: cps/helper.py:1154 cps/templates/admin.html:232 msgid "Queue all books for metadata backup" -msgstr "" +msgstr "Поставити усі книги в чергу для резервного копіювання метаданих" #: cps/kobo_auth.py:93 msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" -msgstr "" +msgstr "Щоб отримати дійсний api_endpoint для пристрою Kobo, зайдіть у Calibre-Web не з локального хосту" #: cps/kobo_auth.py:119 msgid "Kobo Setup" -msgstr "" +msgstr "Налаштування Kobo" #: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" -msgstr "" +msgstr "Зареєструвати з %(provider)s" #: cps/oauth_bb.py:140 #, python-format msgid "This %(oauth)s account is already linked to a different user" -msgstr "" +msgstr "Цей обліковий запис %(oauth)s вже пов'язаний з іншим користувачем" -#: cps/oauth_bb.py:147 cps/remotelogin.py:131 +#: cps/oauth_bb.py:147 cps/remotelogin.py:150 #, python-format msgid "Success! You are now logged in as: %(nickname)s" -msgstr "Ви увійшли як користувач: '%(nickname)s'" +msgstr "Ви увійшли як користувач «%(nickname)s»" #: cps/oauth_bb.py:157 #, python-format msgid "Link to %(oauth)s Succeeded" -msgstr "" +msgstr "Прив'язка до %(oauth)s вдалася" #: cps/oauth_bb.py:164 msgid "Login failed, No User Linked With OAuth Account" -msgstr "" +msgstr "Не вдалося увійти. З обліковим записом OAuth не пов'язано жодного користувача" #: cps/oauth_bb.py:206 #, python-format msgid "Unlink to %(oauth)s Succeeded" -msgstr "" +msgstr "Відв'язування від %(oauth)s вдалося" #: cps/oauth_bb.py:211 #, python-format msgid "Unlink to %(oauth)s Failed" -msgstr "" +msgstr "Відв'язування від %(oauth)s не вдалося" #: cps/oauth_bb.py:214 #, python-format msgid "Not Linked to %(oauth)s" -msgstr "" +msgstr "Не прив'язано до %(oauth)s" #: cps/oauth_bb.py:271 msgid "Failed to log in with GitHub." -msgstr "" +msgstr "Не вдалося увійти з GitHub." #: cps/oauth_bb.py:277 msgid "Failed to fetch user info from GitHub." -msgstr "" +msgstr "Не вдалося отримати інформацію про користувача з GitHub." #: cps/oauth_bb.py:289 msgid "Failed to log in with Google." -msgstr "" +msgstr "Не вдалося увійти з Google." #: cps/oauth_bb.py:295 msgid "Failed to fetch user info from Google." -msgstr "" +msgstr "Не вдалося отримати інформацію про користувача з Google." #: cps/oauth_bb.py:343 msgid "GitHub Oauth error, please retry later." -msgstr "" +msgstr "Помилка GitHub OAuth. Спробуйте повторити пізніше." #: cps/oauth_bb.py:346 #, python-brace-format msgid "GitHub Oauth error: {}" -msgstr "" +msgstr "Помилка GitHub Oauth: {}" #: cps/oauth_bb.py:367 msgid "Google Oauth error, please retry later." -msgstr "" +msgstr "Помилка Google OAuth. Спробуйте повторити пізніше." #: cps/oauth_bb.py:370 #, python-brace-format msgid "Google Oauth error: {}" -msgstr "" +msgstr "Помилка Google OAuth: {}" #: cps/opds.py:307 #, python-brace-format msgid "{} Stars" msgstr "{} зірок" -#: cps/remotelogin.py:63 cps/templates/layout.html:68 -#: cps/templates/layout.html:103 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1361 -msgid "Login" -msgstr "Ім'я користувача" - -#: cps/remotelogin.py:75 cps/remotelogin.py:109 +#: cps/remotelogin.py:46 cps/remotelogin.py:128 msgid "Token not found" msgstr "Токен не знайдено" -#: cps/remotelogin.py:84 cps/remotelogin.py:117 +#: cps/remotelogin.py:55 cps/remotelogin.py:136 msgid "Token has expired" -msgstr "Час дії токено вичерпано" +msgstr "Час дії токену вичерпано" -#: cps/remotelogin.py:93 +#: cps/remotelogin.py:86 cps/remotelogin.py:112 cps/templates/layout.html:68 +#: cps/templates/layout.html:103 cps/templates/login.html:4 +#: cps/templates/login.html:21 cps/web.py:1371 +msgid "Login" +msgstr "Вхід" + +#: cps/remotelogin.py:100 +msgid "Token already approved" +msgstr "" + +#: cps/remotelogin.py:108 msgid "Success! Please return to your device" -msgstr "Вдалося! Будь-ласка, поверніться до вашого пристрою" +msgstr "Вдалося! Будь ласка, поверніться до свого пристрою" -#: cps/render_template.py:41 cps/web.py:421 +#: cps/render_template.py:41 cps/web.py:423 msgid "Books" msgstr "Книжки" #: cps/render_template.py:43 msgid "Show recent books" -msgstr "Показувати останні книги" +msgstr "Показати останні книги" #: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" @@ -1069,43 +1101,42 @@ msgstr "Популярні книги" #: cps/render_template.py:46 msgid "Show Hot Books" -msgstr "Показувати популярні книги" +msgstr "Показати популярні книги" #: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" -msgstr "" +msgstr "Завантажені книги" #: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" -msgstr "" +msgstr "Показати завантажені книги" -#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:436 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:438 msgid "Top Rated Books" -msgstr "Книги з найкращим рейтингом" +msgstr "Книги з найкращими оцінками" #: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" -msgstr "Показувати книги з найвищим рейтингом" +msgstr "Показати книги з найкращими оцінками" #: cps/render_template.py:61 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:769 +#: cps/templates/index.xml:67 cps/web.py:771 msgid "Read Books" msgstr "Прочитані книги" #: cps/render_template.py:63 -#, fuzzy msgid "Show Read and Unread" -msgstr "Показувати прочитані та непрочитані книги" +msgstr "Показати прочитані та непрочитані" #: cps/render_template.py:65 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:772 +#: cps/templates/index.xml:74 cps/web.py:774 msgid "Unread Books" msgstr "Непрочитані книги" #: cps/render_template.py:67 msgid "Show unread" -msgstr "Показати не прочитані" +msgstr "Показати непрочитані" #: cps/render_template.py:68 msgid "Discover" @@ -1114,28 +1145,26 @@ msgstr "Огляд" #: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" -msgstr "Показувати випадкові книги" +msgstr "Показати випадкові книги" #: cps/render_template.py:71 cps/templates/book_table.html:93 -#: cps/templates/index.xml:97 cps/web.py:1144 +#: cps/templates/index.xml:97 cps/web.py:1146 msgid "Categories" msgstr "Категорії" #: cps/render_template.py:73 cps/templates/user_table.html:158 -#, fuzzy msgid "Show Category Section" -msgstr "Показувати вибір категорії" +msgstr "Показати вибір категорії" #: cps/render_template.py:74 cps/templates/book_edit.html:86 #: cps/templates/book_table.html:94 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1034 cps/web.py:1046 +#: cps/templates/search_form.html:70 cps/web.py:1036 cps/web.py:1048 msgid "Series" msgstr "Серії" #: cps/render_template.py:76 cps/templates/user_table.html:157 -#, fuzzy msgid "Show Series Section" -msgstr "Показувати вибір серії" +msgstr "Показати секцію серії" #: cps/render_template.py:77 cps/templates/book_table.html:92 #: cps/templates/index.xml:79 @@ -1143,69 +1172,63 @@ msgid "Authors" msgstr "Автори" #: cps/render_template.py:79 cps/templates/user_table.html:160 -#, fuzzy msgid "Show Author Section" -msgstr "Показувати вибір автора" +msgstr "Показати секцію автора" #: cps/render_template.py:81 cps/templates/book_table.html:98 -#: cps/templates/index.xml:88 cps/web.py:1002 +#: cps/templates/index.xml:88 cps/web.py:1004 msgid "Publishers" msgstr "Видавництва" #: cps/render_template.py:83 cps/templates/user_table.html:163 -#, fuzzy msgid "Show Publisher Section" -msgstr "Показувати вибір серії" +msgstr "Показати секцію видавництва" #: cps/render_template.py:84 cps/templates/book_table.html:96 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1116 +#: cps/web.py:1118 msgid "Languages" msgstr "Мови" #: cps/render_template.py:87 cps/templates/user_table.html:155 -#, fuzzy msgid "Show Language Section" -msgstr "Показувати вибір мови" +msgstr "Показати секцію мови" #: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" -msgstr "Рейтинги" +msgstr "Оцінки" #: cps/render_template.py:90 cps/templates/user_table.html:164 -#, fuzzy msgid "Show Ratings Section" -msgstr "Показувати вибір серії" +msgstr "Показати секцію оцінок" #: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "Формати файлів" #: cps/render_template.py:93 cps/templates/user_table.html:165 -#, fuzzy msgid "Show File Formats Section" -msgstr "Показувати вибір серії" +msgstr "Показати секцію форматів файлів" -#: cps/render_template.py:95 cps/web.py:795 +#: cps/render_template.py:95 cps/web.py:797 msgid "Archived Books" msgstr "Архівні книжки" #: cps/render_template.py:97 cps/templates/user_table.html:166 -#, fuzzy msgid "Show Archived Books" -msgstr "Архівні книжки" +msgstr "Показати архівні книги" -#: cps/render_template.py:100 cps/web.py:831 +#: cps/render_template.py:100 cps/web.py:833 msgid "Books List" -msgstr "Список книжок" +msgstr "Список книг" #: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" -msgstr "" +msgstr "Показати список книг" #: cps/search.py:214 msgid "Published after " -msgstr "Опубліковані після " +msgstr "Опубліковано після " #: cps/search.py:221 msgid "Published before " @@ -1214,21 +1237,21 @@ msgstr "Опубліковано до " #: cps/search.py:243 #, python-format msgid "Rating <= %(rating)s" -msgstr "Рейтинг <= %(rating)s" +msgstr "Оцінка <= %(rating)s" #: cps/search.py:245 #, python-format msgid "Rating >= %(rating)s" -msgstr "Рейтинг >= %(rating)s" +msgstr "Оцінка >= %(rating)s" #: cps/search.py:247 #, python-format msgid "Read Status = '%(status)s'" -msgstr "" +msgstr "Стан читання = «%(status)s»" #: cps/search.py:365 msgid "Error on search for custom columns, please restart Calibre-Web" -msgstr "" +msgstr "Помилка пошуку власних стовпчиків. Перезапустіть Calibre-Web" #: cps/search.py:384 cps/search.py:416 cps/templates/layout.html:57 msgid "Advanced Search" @@ -1236,65 +1259,64 @@ msgstr "Розширений пошук" #: cps/shelf.py:49 cps/shelf.py:111 cps/shelf.py:157 msgid "Invalid shelf specified" -msgstr "" +msgstr "Вказано хибну полицю" #: cps/shelf.py:55 -#, fuzzy msgid "Sorry you are not allowed to add a book to that shelf" -msgstr "Вибачте, але у вас немає дозволу для видалення книги з цієї полиці" +msgstr "Вибачте, але ви не маєте права додавати книги до цієї полиці" #: cps/shelf.py:64 #, python-format msgid "Book is already part of the shelf: %(shelfname)s" -msgstr "" +msgstr "Книга вже на полиці «%(shelfname)s»" #: cps/shelf.py:77 #, python-format msgid "%(book_id)s is a invalid Book Id. Could not be added to Shelf" -msgstr "" +msgstr "%(book_id)s - це хибний ідентифікатор книги. Не вдалося додати до полиці" #: cps/shelf.py:97 #, python-format msgid "Book has been added to shelf: %(sname)s" -msgstr "Книга додана на книжкову полицю: %(sname)s" +msgstr "Книгу додано на полицю «%(sname)s»" #: cps/shelf.py:116 msgid "You are not allowed to remove a book from the shelf" -msgstr "" +msgstr "Вам не дозволено вилучати книгу з полиці" #: cps/shelf.py:129 #, python-format msgid "No Books are part of the shelf: %(name)s" -msgstr "" +msgstr "На полиці « %(name)s» немає жодної книги" #: cps/shelf.py:140 #, python-format msgid "Books have been removed from shelf: %(sname)s" -msgstr "" +msgstr "Книги вилучено з полиці «%(sname)s»" #: cps/shelf.py:147 #, python-format msgid "Could not remove books from shelf: %(sname)s" -msgstr "" +msgstr "Не вдалося вилучити книги з полиці «%(sname)s»" #: cps/shelf.py:162 msgid "You are not allowed to add a book to the shelf" -msgstr "" +msgstr "Вам не дозволено додавати книгу до полиці" #: cps/shelf.py:178 #, python-format msgid "Books are already part of the shelf: %(name)s" -msgstr "" +msgstr "Книги вже є на полиці: %(name)s" #: cps/shelf.py:190 #, python-format msgid "Books have been added to shelf: %(sname)s" -msgstr "" +msgstr "Книги додано до полиці «%(sname)s»" #: cps/shelf.py:197 #, python-format msgid "Could not add books to shelf: %(sname)s" -msgstr "" +msgstr "Не вдалося додати книги до полиці «%(sname)s»" #: cps/shelf.py:243 #, python-format @@ -1303,42 +1325,41 @@ msgstr "Книга видалена з книжкової полиці: %(sname) #: cps/shelf.py:252 msgid "Sorry you are not allowed to remove a book from this shelf" -msgstr "" +msgstr "Вибачте, але вам не дозволено вилучати книгу з цієї полиці" #: cps/shelf.py:262 cps/templates/layout.html:159 msgid "Create a Shelf" -msgstr "створити книжкову полицю" +msgstr "Створити полицю" #: cps/shelf.py:270 cps/shelf.py:312 -#, fuzzy msgid "Sorry you are not allowed to edit this shelf" -msgstr "Вибачте, але у вас немає дозволу для видалення книги з цієї полиці" +msgstr "Вибачте, але вам не дозволено редагувати цю полицю" #: cps/shelf.py:272 msgid "Edit a shelf" -msgstr "Змінити книжкову полицю" +msgstr "Редагувати полицю" #: cps/shelf.py:281 msgid "Error deleting Shelf" -msgstr "" +msgstr "Помилка видалення полиці" #: cps/shelf.py:283 msgid "Shelf successfully deleted" -msgstr "" +msgstr "Полицю успішно видалено" #: cps/shelf.py:336 #, python-format msgid "Change order of Shelf: '%(name)s'" -msgstr "Змінити розташування книжкової полиці '%(name)s'" +msgstr "Змінити розташування полиці «%(name)s»" #: cps/shelf.py:371 msgid "Sorry you are not allowed to create a public shelf" -msgstr "" +msgstr "Вибачте, але вам не дозволено створювати публічну полицю" #: cps/shelf.py:388 #, python-format msgid "Shelf %(title)s created" -msgstr "Створена книжкова полиця %(title)s" +msgstr "Полицю «%(title)s» створено" #: cps/shelf.py:391 #, python-format @@ -1352,21 +1373,21 @@ msgstr "Сталась помилка" #: cps/shelf.py:427 #, python-format msgid "A public shelf with the name '%(title)s' already exists." -msgstr "" +msgstr "Публічна полиця з назвою «%(title)s» вже існує." #: cps/shelf.py:438 #, python-format msgid "A private shelf with the name '%(title)s' already exists." -msgstr "" +msgstr "Приватна полиця з назвою «%(title)s» вже існує." #: cps/shelf.py:528 #, python-format msgid "Shelf: '%(name)s'" -msgstr "Книжкова полиця: '%(name)s'" +msgstr "Полиця: «%(name)s»" #: cps/shelf.py:534 msgid "Error opening shelf. Shelf does not exist or is not accessible" -msgstr "Помилка при відкриванні полиці. Полиця не існує або до неї відсутній доступ" +msgstr "Помилка відкриття полиці. Полиця не існує або до неї відсутній доступ" #: cps/tasks_status.py:47 cps/templates/layout.html:90 #: cps/templates/tasks.html:7 @@ -1379,7 +1400,7 @@ msgstr "Очікує" #: cps/tasks_status.py:65 msgid "Failed" -msgstr "" +msgstr "Не вдалося" #: cps/tasks_status.py:67 msgid "Started" @@ -1395,299 +1416,297 @@ msgstr "Закінчено" #: cps/tasks_status.py:73 msgid "Cancelled" -msgstr "Відмінено" +msgstr "Скасовано" #: cps/tasks_status.py:75 msgid "Unknown Status" -msgstr "Невідомий статус" +msgstr "Статус невідомий" #: cps/updater.py:433 cps/updater.py:444 cps/updater.py:545 cps/updater.py:560 msgid "Unexpected data while reading update information" -msgstr "" +msgstr "Неочікувані дані при читанні інформації про оновлення" #: cps/updater.py:440 cps/updater.py:552 msgid "No update available. You already have the latest version installed" -msgstr "" +msgstr "Оновлення відсутні. У вас вже встановлена остання версія" #: cps/updater.py:459 msgid "A new update is available. Click on the button below to update to the latest version." -msgstr "" +msgstr "Доступне оновлення. Щоб оновити до останньої версії, натисніть нижченаведену кнопку." #: cps/updater.py:476 msgid "Could not fetch update information" -msgstr "" +msgstr "Не вдалося отримати інформацію про оновлення" #: cps/updater.py:487 msgid "Click on the button below to update to the latest stable version." -msgstr "" +msgstr "Щоб оновити до останньої стабільної версії, натисніть нижченаведену кнопку." #: cps/updater.py:495 cps/updater.py:509 cps/updater.py:520 #, python-format msgid "A new update is available. Click on the button below to update to version: %(version)s" -msgstr "" +msgstr "Доступне оновлення. Натисніть нижченаведену кнопку, щоб оновити до версії %(version)s" #: cps/updater.py:538 msgid "No release information available" -msgstr "" +msgstr "Немає доступної інформації про випуск" -#: cps/templates/index.html:6 cps/web.py:448 +#: cps/templates/index.html:6 cps/web.py:450 msgid "Discover (Random Books)" msgstr "Огляд (випадкові книги)" -#: cps/web.py:484 +#: cps/web.py:486 msgid "Hot Books (Most Downloaded)" msgstr "Популярні книги (найбільш завантажувані)" -#: cps/web.py:515 +#: cps/web.py:517 #, python-format msgid "Downloaded books by %(user)s" -msgstr "" +msgstr "Книги, завантажені %(user)s" -#: cps/web.py:548 +#: cps/web.py:550 #, python-format msgid "Author: %(name)s" -msgstr "" +msgstr "Автор: %(name)s" -#: cps/web.py:584 +#: cps/web.py:586 #, python-format msgid "Publisher: %(name)s" msgstr "Видавництво: %(name)s" -#: cps/web.py:612 +#: cps/web.py:614 #, python-format msgid "Series: %(serie)s" msgstr "Серії: %(serie)s" -#: cps/web.py:626 +#: cps/web.py:628 msgid "Rating: None" -msgstr "Рейтинг: Відсутній" +msgstr "Оцінка: Немає" -#: cps/web.py:635 +#: cps/web.py:637 #, python-format msgid "Rating: %(rating)s stars" -msgstr "Рейтинг: %(rating)s зірок" +msgstr "Оцінка: %(rating)s зірок" -#: cps/web.py:666 +#: cps/web.py:668 #, python-format msgid "File format: %(format)s" msgstr "Формат файлу: %(format)s" -#: cps/web.py:701 +#: cps/web.py:703 #, python-format msgid "Category: %(name)s" msgstr "Категорія: %(name)s" -#: cps/web.py:730 +#: cps/web.py:732 #, python-format msgid "Language: %(name)s" msgstr "Мова: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:974 +#: cps/templates/admin.html:16 cps/web.py:976 msgid "Downloads" msgstr "Завантаження" -#: cps/web.py:1076 +#: cps/web.py:1078 msgid "Ratings list" -msgstr "Список рейтингів" +msgstr "Список оцінок" -#: cps/web.py:1103 +#: cps/web.py:1105 msgid "File formats list" msgstr "Список форматів файлу" -#: cps/web.py:1264 -#, fuzzy -msgid "Please configure the SMTP mail settings first..." -msgstr "Будь-ласка, спочатку сконфігуруйте параметри SMTP" +#: cps/web.py:1272 +msgid "Book format not supported" +msgstr "" -#: cps/web.py:1270 +#: cps/web.py:1274 +msgid "Please configure the SMTP mail settings first..." +msgstr "Будь ласка, спочатку налаштуйте пошту SMTP..." + +#: cps/web.py:1280 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" -msgstr "" +msgstr "Вдалося! Книгу поставлено для надсилання на %(eReadermail)s" -#: cps/web.py:1273 +#: cps/web.py:1283 #, python-format msgid "Oops! There was an error sending book: %(res)s" -msgstr "Помилка при відправці книги: %(res)s" +msgstr "Дідько! Помилка надсилання книги: %(res)s" -#: cps/web.py:1275 +#: cps/web.py:1285 msgid "Oops! Please update your profile with a valid eReader Email." -msgstr "" +msgstr "Оновіть свій профіль і вкажіть дійсну адресу е-пошти е-читалки." -#: cps/web.py:1291 cps/web.py:1342 +#: cps/web.py:1301 cps/web.py:1352 msgid "Oops! Email server is not configured, please contact your administrator." -msgstr "" +msgstr "Сервер е-пошти не налаштований. Зв'яжіться з своїм адміністратором." -#: cps/web.py:1328 +#: cps/web.py:1338 msgid "Oops! Your Email is not allowed." -msgstr "" +msgstr "Отакої! Ваша адреса е-пошти не дозволена." -#: cps/web.py:1331 +#: cps/web.py:1341 msgid "Success! Confirmation Email has been sent." -msgstr "" +msgstr "Вдалося! Е-лист для підтвердження надіслано." -#: cps/web.py:1376 cps/web.py:1390 +#: cps/web.py:1386 cps/web.py:1400 msgid "Cannot activate LDAP authentication" -msgstr "" +msgstr "Неможливо активувати автентифікацію LDAP" -#: cps/web.py:1399 -#, fuzzy, python-format +#: cps/web.py:1409 +#, python-format msgid "you are now logged in as: '%(nickname)s'" -msgstr "Ви увійшли як користувач: '%(nickname)s'" +msgstr "ви не увійшли як користувач «%(nickname)s»" -#: cps/web.py:1406 +#: cps/web.py:1416 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" -msgstr "" +msgstr "Резервний вхід як «%(nickname)s». Неможливо отримати доступ до сервера LDAP або користувач невідомий" -#: cps/web.py:1411 +#: cps/web.py:1421 #, python-format msgid "Could not login: %(message)s" -msgstr "" +msgstr "Не вдалося увійти: %(message)s" -#: cps/web.py:1415 cps/web.py:1440 -#, fuzzy +#: cps/web.py:1425 cps/web.py:1450 msgid "Wrong Username or Password" -msgstr "Помилка в імені користувача або паролі" +msgstr "Хибне псевдо або пароль" -#: cps/web.py:1422 +#: cps/web.py:1432 msgid "New Password was sent to your email address" -msgstr "" - -#: cps/web.py:1426 -msgid "An unknown error occurred. Please try again later." -msgstr "" - -#: cps/web.py:1428 -#, fuzzy -msgid "Please enter valid username to reset password" -msgstr "Помилка в імені користувача або паролі" +msgstr "Новий пароль надіслано на вашу адресу е-пошти" #: cps/web.py:1436 -#, fuzzy, python-format -msgid "You are now logged in as: '%(nickname)s'" -msgstr "Ви увійшли як користувач: '%(nickname)s'" +msgid "An unknown error occurred. Please try again later." +msgstr "Трапилася невідома помилка. Будь ласка, спробуйте пізніше." -#: cps/web.py:1501 cps/web.py:1551 +#: cps/web.py:1438 +msgid "Please enter valid username to reset password" +msgstr "Для скидання паролю вкажіть дійсне псевдо" + +#: cps/web.py:1446 +#, python-format +msgid "You are now logged in as: '%(nickname)s'" +msgstr "Ви не увійшли як користувач «%(nickname)s»" + +#: cps/web.py:1511 cps/web.py:1561 #, python-format msgid "%(name)s's Profile" msgstr "Профіль %(name)s" -#: cps/web.py:1517 -#, fuzzy +#: cps/web.py:1527 msgid "Success! Profile Updated" -msgstr "Профіль оновлено" +msgstr "Вдалося! Профіль оновлено" -#: cps/web.py:1521 +#: cps/web.py:1531 msgid "Oops! An account already exists for this Email." -msgstr "" +msgstr "Отакої! Обліковий запис з такою адресою е-пошти вже існує." #: cps/services/gmail.py:59 msgid "Found no valid gmail.json file with OAuth information" -msgstr "" +msgstr "Не знайдено дійсного файлу gmail.jsom з інформацією OAuth" #: cps/tasks/clean.py:29 msgid "Delete temp folder contents" -msgstr "" +msgstr "Видалити вміст тимчасової теки" -#: cps/tasks/convert.py:112 -#, fuzzy, python-format +#: cps/tasks/convert.py:113 +#, python-format msgid "%(book)s send to E-Reader" -msgstr "Відправити на Kindle" +msgstr "%(book)s надіслано на е-читалку" -#: cps/tasks/convert.py:177 +#: cps/tasks/convert.py:180 #, python-format msgid "Calibre ebook-convert %(tool)s not found" -msgstr "" +msgstr "Конвертер е-книг Calibre «%(tool)s» не знайдено" -#: cps/tasks/convert.py:211 +#: cps/tasks/convert.py:214 #, python-format msgid "%(format)s format not found on disk" -msgstr "" +msgstr "Формат %(format)s не знайдено на диску" -#: cps/tasks/convert.py:215 +#: cps/tasks/convert.py:218 msgid "Ebook converter failed with unknown error" -msgstr "" +msgstr "Е-книги не вдалося конвертувати через невідому помилку" -#: cps/tasks/convert.py:234 +#: cps/tasks/convert.py:237 #, python-format msgid "Kepubify-converter failed: %(error)s" -msgstr "" +msgstr "Помилка конвертера Kepubify: %(error)s" -#: cps/tasks/convert.py:254 +#: cps/tasks/convert.py:257 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" -msgstr "" +msgstr "Конвертований файл не знайдено або у теці «%(folder)s» більше одного файлу" -#: cps/tasks/convert.py:291 cps/tasks/convert.py:342 +#: cps/tasks/convert.py:294 cps/tasks/convert.py:345 #, python-format msgid "Calibre failed with error: %(error)s" -msgstr "" +msgstr "Помилка Calibre: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:322 #, python-format msgid "Ebook-converter failed: %(error)s" -msgstr "" +msgstr "Помилка конвертера е-книг: %(error)s" -#: cps/tasks/convert.py:347 +#: cps/tasks/convert.py:350 msgid "Convert" -msgstr "" +msgstr "Конвертувати" #: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" -msgstr "" +msgstr "Перепідключення бази даних Calibre" #: cps/tasks/mail.py:283 msgid "E-mail" -msgstr "" +msgstr "Е-пошта" #: cps/tasks/metadata_backup.py:34 -#, fuzzy msgid "Backing up Metadata" -msgstr "змінити метадані" +msgstr "Резервне копіювання метаданих" #: cps/tasks/thumbnail.py:97 #, python-format msgid "Generated %(count)s cover thumbnails" -msgstr "" +msgstr "Згенеровано %(count)s мініатюр обкладинок" #: cps/tasks/thumbnail.py:233 cps/tasks/thumbnail.py:448 #: cps/tasks/thumbnail.py:518 msgid "Cover Thumbnails" -msgstr "" +msgstr "Мініатюри обкладинок" #: cps/tasks/thumbnail.py:294 #, python-brace-format msgid "Generated {0} series thumbnails" -msgstr "" +msgstr "Згенеровано {0} мініатюр серій" #: cps/tasks/thumbnail.py:459 msgid "Clearing cover thumbnail cache" -msgstr "" +msgstr "Очищення кешу мініатюр обкладинок" #: cps/tasks/upload.py:39 cps/templates/admin.html:20 #: cps/templates/layout.html:82 cps/templates/user_table.html:145 msgid "Upload" -msgstr "Додати нову книгу" +msgstr "Вивантажити" #: cps/templates/admin.html:9 msgid "Users" -msgstr "Список користувачів" +msgstr "Користувачі" #: cps/templates/admin.html:13 cps/templates/login.html:9 #: cps/templates/login.html:10 cps/templates/register.html:9 #: cps/templates/user_edit.html:10 cps/templates/user_table.html:134 msgid "Username" -msgstr "Ім'я користувача" +msgstr "Псевдо" #: cps/templates/admin.html:14 cps/templates/register.html:14 #: cps/templates/user_edit.html:15 cps/templates/user_table.html:135 msgid "Email" -msgstr "" +msgstr "Е-пошта" #: cps/templates/admin.html:15 -#, fuzzy msgid "Send to eReader Email" -msgstr "Kindle" +msgstr "Надіслати на е-пошту е-читалки" #: cps/templates/admin.html:17 cps/templates/layout.html:93 #: cps/templates/user_table.html:143 @@ -1707,7 +1726,7 @@ msgstr "Завантажити" #: cps/templates/admin.html:23 msgid "View Books" -msgstr "" +msgstr "Дивитися книги" #: cps/templates/admin.html:24 cps/templates/book_table.html:315 #: cps/templates/user_table.html:131 cps/templates/user_table.html:148 @@ -1716,63 +1735,63 @@ msgstr "Редагувати" #: cps/templates/admin.html:25 cps/templates/book_edit.html:17 #: cps/templates/book_table.html:131 cps/templates/book_table.html:180 -#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:115 +#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:117 #: cps/templates/user_edit.html:67 cps/templates/user_table.html:149 msgid "Delete" msgstr "Видалити" #: cps/templates/admin.html:26 msgid "Public Shelf" -msgstr "" +msgstr "Публічна полиця" #: cps/templates/admin.html:55 msgid "Import LDAP Users" -msgstr "" +msgstr "Імпортувати користувачів LDAP" #: cps/templates/admin.html:62 msgid "Email Server Settings" -msgstr "" +msgstr "Налаштування сервера е-пошти" #: cps/templates/admin.html:67 cps/templates/email_edit.html:31 msgid "SMTP Hostname" -msgstr "SMTP-сервер" +msgstr "Ім'я хосту SMTP" #: cps/templates/admin.html:71 cps/templates/email_edit.html:35 msgid "SMTP Port" -msgstr "SMTP-порт" +msgstr "Порт SMTP" #: cps/templates/admin.html:75 cps/templates/email_edit.html:39 msgid "Encryption" -msgstr "SSL" +msgstr "Шифрування" #: cps/templates/admin.html:79 cps/templates/email_edit.html:47 msgid "SMTP Login" -msgstr "SMTP логін" +msgstr "Псевдо SMTP" #: cps/templates/admin.html:83 cps/templates/admin.html:94 #: cps/templates/email_edit.html:55 msgid "From Email" -msgstr "Відправник" +msgstr "З е-пошти" #: cps/templates/admin.html:90 msgid "Email Service" -msgstr "" +msgstr "Служба е-пошти" #: cps/templates/admin.html:91 msgid "Gmail via Oauth2" -msgstr "" +msgstr "Gmail через OAuth2" #: cps/templates/admin.html:106 msgid "Configuration" -msgstr "Налаштування сервера" +msgstr "Налаштування" #: cps/templates/admin.html:109 msgid "Calibre Database Directory" -msgstr "Папка Calibre DB" +msgstr "Тека бази даних Calibre" #: cps/templates/admin.html:113 cps/templates/config_edit.html:68 msgid "Log Level" -msgstr "Рівень логування" +msgstr "Рівень журналу" #: cps/templates/admin.html:117 msgid "Port" @@ -1784,11 +1803,11 @@ msgstr "Зовнішній порт" #: cps/templates/admin.html:129 cps/templates/config_view_edit.html:28 msgid "Books per Page" -msgstr "Кількість книг на сторінці" +msgstr "К-сть книг на сторінці" #: cps/templates/admin.html:133 msgid "Uploads" -msgstr "Загрузка на сервер" +msgstr "Вивантаження" #: cps/templates/admin.html:137 msgid "Anonymous Browsing" @@ -1800,137 +1819,153 @@ msgstr "Публічна реєстрація" #: cps/templates/admin.html:145 msgid "Magic Link Remote Login" -msgstr "" +msgstr "Віддалений вхід за одноразовим посиланням" #: cps/templates/admin.html:149 msgid "Reverse Proxy Login" -msgstr "" +msgstr "Псевдо зворотного проксі" -#: cps/templates/admin.html:154 cps/templates/config_edit.html:176 +#: cps/templates/admin.html:154 cps/templates/config_edit.html:180 msgid "Reverse Proxy Header Name" +msgstr "Назва заголовка зворотного проксі" + +#: cps/templates/admin.html:158 +msgid "Reverse Proxy Trusted IPs/CIDRs" msgstr "" -#: cps/templates/admin.html:159 -#, fuzzy +#: cps/templates/admin.html:162 cps/templates/config_edit.html:193 +msgid "Reverse Proxy Shared Secret Header Name" +msgstr "" + +#: cps/templates/admin.html:166 +msgid "Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/admin.html:170 +msgid "Reverse Proxy Shared Secret Configured" +msgstr "" + +#: cps/templates/admin.html:175 msgid "Edit Calibre Database Configuration" -msgstr "Папка Calibre DB" +msgstr "Редагувати налаштування БД Calibre" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:176 msgid "Edit Basic Configuration" -msgstr "" +msgstr "Редагувати базові налаштування" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:177 msgid "Edit UI Configuration" -msgstr "" +msgstr "Редагувати налаштування інтерфейсу" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:183 msgid "Scheduled Tasks" msgstr "Заплановані завдання" -#: cps/templates/admin.html:170 cps/templates/schedule_edit.html:12 +#: cps/templates/admin.html:186 cps/templates/schedule_edit.html:12 #: cps/templates/tasks.html:18 msgid "Start Time" -msgstr "" +msgstr "Час початку" -#: cps/templates/admin.html:174 cps/templates/schedule_edit.html:20 +#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:20 msgid "Maximum Duration" -msgstr "Максимальний час завдання" +msgstr "Максимальна тривалість" -#: cps/templates/admin.html:178 cps/templates/schedule_edit.html:29 +#: cps/templates/admin.html:194 cps/templates/schedule_edit.html:29 msgid "Generate Thumbnails" -msgstr "" +msgstr "Генерувати мініатюри" -#: cps/templates/admin.html:182 +#: cps/templates/admin.html:198 msgid "Generate series cover thumbnails" -msgstr "" +msgstr "Генерувати мініатюри обкладинок серій" -#: cps/templates/admin.html:186 cps/templates/admin.html:208 +#: cps/templates/admin.html:202 cps/templates/admin.html:224 #: cps/templates/schedule_edit.html:37 msgid "Reconnect Calibre Database" -msgstr "" +msgstr "Перепід'єднати БД Calibre" -#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 +#: cps/templates/admin.html:206 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" -msgstr "" +msgstr "Генерувати резервні файли метаданих" -#: cps/templates/admin.html:197 +#: cps/templates/admin.html:213 msgid "Refresh Thumbnail Cache" -msgstr "" +msgstr "Оновити кеш мініатюр" -#: cps/templates/admin.html:203 +#: cps/templates/admin.html:219 msgid "Administration" msgstr "Адміністрування" -#: cps/templates/admin.html:204 +#: cps/templates/admin.html:220 msgid "Download Debug Package" -msgstr "" +msgstr "Завантажити пакет виправлення помилок" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:221 msgid "View Logs" -msgstr "Переглянути логи" +msgstr "Переглянути журнали" -#: cps/templates/admin.html:211 +#: cps/templates/admin.html:227 msgid "Restart" msgstr "Перезавантажити" -#: cps/templates/admin.html:212 +#: cps/templates/admin.html:228 msgid "Shutdown" msgstr "Вимкнути" -#: cps/templates/admin.html:221 +#: cps/templates/admin.html:237 msgid "Version Information" msgstr "Інформація про версію" -#: cps/templates/admin.html:225 +#: cps/templates/admin.html:241 msgid "Version" msgstr "Версія" -#: cps/templates/admin.html:226 +#: cps/templates/admin.html:242 msgid "Details" -msgstr "Деталі" +msgstr "Відомості" -#: cps/templates/admin.html:232 +#: cps/templates/admin.html:248 msgid "Current Version" msgstr "Поточна версія" -#: cps/templates/admin.html:239 +#: cps/templates/admin.html:255 msgid "Check for Update" -msgstr "Перевірка оновлень" +msgstr "Перевірити оновлення" -#: cps/templates/admin.html:240 +#: cps/templates/admin.html:256 msgid "Perform Update" -msgstr "Встановити оновлення" +msgstr "Виконати оновлення" -#: cps/templates/admin.html:253 +#: cps/templates/admin.html:269 msgid "Are you sure you want to restart?" -msgstr "Впевнені що хочете перезавантажити?" +msgstr "Справді бажаєте перезавантажити?" -#: cps/templates/admin.html:258 cps/templates/admin.html:272 -#: cps/templates/admin.html:292 cps/templates/config_db.html:82 +#: cps/templates/admin.html:274 cps/templates/admin.html:288 +#: cps/templates/admin.html:308 cps/templates/config_db.html:82 msgid "OK" -msgstr "Ok" +msgstr "Гаразд" -#: cps/templates/admin.html:259 cps/templates/admin.html:273 +#: cps/templates/admin.html:275 cps/templates/admin.html:289 #: cps/templates/book_edit.html:220 cps/templates/book_table.html:162 #: cps/templates/book_table.html:181 cps/templates/book_table.html:201 #: cps/templates/book_table.html:221 cps/templates/book_table.html:241 #: cps/templates/book_table.html:261 cps/templates/book_table.html:316 -#: cps/templates/config_db.html:66 cps/templates/config_edit.html:431 +#: cps/templates/config_db.html:66 cps/templates/config_edit.html:453 #: cps/templates/config_view_edit.html:175 cps/templates/detail.html:350 -#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:98 -#: cps/templates/modal_dialogs.html:116 cps/templates/modal_dialogs.html:134 +#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:100 +#: cps/templates/modal_dialogs.html:118 cps/templates/modal_dialogs.html:136 +#: cps/templates/remote_login_verify.html:16 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 #: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Скасувати" -#: cps/templates/admin.html:271 +#: cps/templates/admin.html:287 msgid "Are you sure you want to shutdown?" -msgstr "" +msgstr "Справді бажаєте вимкнути?" -#: cps/templates/admin.html:283 +#: cps/templates/admin.html:299 msgid "Updating, please do not reload this page" -msgstr "Встановлення оновлень, будь-ласка, не оновлюйте сторінку" +msgstr "Встановлюються оновлення. Будь ласка, не оновлюйте цю сторінку" #: cps/templates/author.html:15 msgid "via" @@ -1943,38 +1978,38 @@ msgstr "У бібліотеці" #: cps/templates/author.html:26 cps/templates/index.html:74 #: cps/templates/search.html:45 cps/templates/shelf.html:20 msgid "Sort according to book date, newest first" -msgstr "" +msgstr "Впорядкувати за датою книги, спершу новіші" #: cps/templates/author.html:27 cps/templates/index.html:75 #: cps/templates/search.html:46 cps/templates/shelf.html:21 msgid "Sort according to book date, oldest first" -msgstr "" +msgstr "Впорядкувати за датою книги, спершу старіші" #: cps/templates/author.html:28 cps/templates/index.html:76 #: cps/templates/search.html:47 cps/templates/shelf.html:22 msgid "Sort title in alphabetical order" -msgstr "" +msgstr "Впорядкувати назви за абеткою (А-Я)" #: cps/templates/author.html:29 cps/templates/index.html:77 #: cps/templates/search.html:48 cps/templates/shelf.html:23 msgid "Sort title in reverse alphabetical order" -msgstr "" +msgstr "Впорядкувати назви за абеткою (Я-А)" #: cps/templates/author.html:30 cps/templates/index.html:80 #: cps/templates/search.html:51 cps/templates/shelf.html:26 msgid "Sort according to publishing date, newest first" -msgstr "" +msgstr "Впорядкувати за датою публікації, спершу новіші" #: cps/templates/author.html:31 cps/templates/index.html:81 #: cps/templates/search.html:52 cps/templates/shelf.html:27 msgid "Sort according to publishing date, oldest first" -msgstr "" +msgstr "Впорядкувати за датою публікації, спершу старіші" #: cps/templates/author.html:56 cps/templates/author.html:113 #: cps/templates/index.html:30 cps/templates/index.html:113 #: cps/templates/search.html:81 cps/templates/shelf.html:58 msgid "reduce" -msgstr "" +msgstr "зменшити" #: cps/templates/author.html:97 msgid "More by" @@ -1984,7 +2019,7 @@ msgstr "Більше за" #: cps/templates/listenmp3.html:62 #, python-format msgid "Book %(index)s of %(range)s" -msgstr "" +msgstr "Книга %(index)s з %(range)s" #: cps/templates/basic_detail.html:41 cps/templates/book_edit.html:106 #: cps/templates/detail.html:165 cps/templates/listenmp3.html:69 @@ -1997,7 +2032,7 @@ msgstr "Мова" #: cps/templates/detail.html:200 cps/templates/listenmp3.html:102 #: cps/templates/search_form.html:16 msgid "Publisher" -msgstr "Видавець" +msgstr "Видавництво" #: cps/templates/basic_detail.html:70 cps/templates/detail.html:209 #: cps/templates/listenmp3.html:111 @@ -2011,25 +2046,25 @@ msgstr "Опис:" #: cps/templates/basic_index.html:7 cps/templates/layout.html:173 msgid "Previous" -msgstr "Попередній перегляд" +msgstr "Попередній" #: cps/templates/basic_index.html:12 cps/templates/feed.xml:22 #: cps/templates/layout.html:187 msgid "Next" -msgstr "Далі" +msgstr "Наступний" #: cps/templates/basic_index.html:18 cps/templates/search.html:6 msgid "No Results Found" -msgstr "" +msgstr "Нічого не знайдено" #: cps/templates/basic_layout.html:17 cps/templates/layout.html:26 #: cps/templates/login.html:30 msgid "Home" -msgstr "" +msgstr "Головна" #: cps/templates/basic_layout.html:21 cps/templates/layout.html:47 msgid "Search Library" -msgstr "" +msgstr "Шукати у бібліотеці" #: cps/templates/basic_layout.html:29 cps/templates/layout.html:72 #: cps/templates/layout.html:98 @@ -2038,7 +2073,7 @@ msgstr "Вийти" #: cps/templates/basic_layout.html:35 msgid "Normal Theme" -msgstr "" +msgstr "Нормальна тема" #: cps/templates/book_edit.html:11 msgid "Delete Book" @@ -2050,7 +2085,7 @@ msgstr "Видалити формати:" #: cps/templates/book_edit.html:25 msgid "Convert book format:" -msgstr "" +msgstr "Конвертувати формат книги:" #: cps/templates/book_edit.html:30 msgid "Convert from:" @@ -2058,11 +2093,11 @@ msgstr "Конвертувати з:" #: cps/templates/book_edit.html:32 cps/templates/book_edit.html:39 msgid "select an option" -msgstr "" +msgstr "вибрати функцію" #: cps/templates/book_edit.html:37 msgid "Convert to:" -msgstr "Конвертувати в:" +msgstr "Конвертувати у:" #: cps/templates/book_edit.html:46 msgid "Convert book" @@ -2071,7 +2106,7 @@ msgstr "Конвертувати книгу" #: cps/templates/book_edit.html:53 cps/templates/layout.html:79 #: cps/templates/layout.html:136 msgid "Uploading..." -msgstr "Завантаження..." +msgstr "Вивантаження..." #: cps/templates/book_edit.html:53 cps/templates/book_edit.html:257 #: cps/templates/layout.html:79 cps/templates/layout.html:203 @@ -2085,11 +2120,11 @@ msgstr "Помилка" #: cps/templates/book_edit.html:53 cps/templates/layout.html:79 msgid "Upload done, processing, please wait..." -msgstr "" +msgstr "Вивантаження завершено, триває обробка. Зачекайте..." #: cps/templates/book_edit.html:58 msgid "Upload Format" -msgstr "Формат завантаження" +msgstr "Формат вивантаження" #: cps/templates/book_edit.html:71 cps/templates/search_form.html:8 msgid "Book Title" @@ -2102,19 +2137,19 @@ msgstr "Автор" #: cps/templates/book_edit.html:82 cps/templates/search_form.html:52 msgid "Tags" -msgstr "Теги" +msgstr "Мітки" #: cps/templates/book_edit.html:90 msgid "Series ID" -msgstr "" +msgstr "ID серії" #: cps/templates/book_edit.html:93 msgid "Published Date" -msgstr "Опубліковано" +msgstr "Дата публікації" #: cps/templates/book_edit.html:110 msgid "Rating" -msgstr "Рейтинг" +msgstr "Оцінка" #: cps/templates/book_edit.html:114 cps/templates/book_edit.html:282 #: cps/templates/book_edit.html:297 cps/templates/search_form.html:154 @@ -2127,16 +2162,16 @@ msgstr "Ідентифікатори" #: cps/templates/book_edit.html:122 cps/templates/book_edit.html:306 msgid "Identifier Type" -msgstr "" +msgstr "Тип ідентифікатора" #: cps/templates/book_edit.html:123 cps/templates/book_edit.html:307 msgid "Identifier Value" -msgstr "" +msgstr "Значення ідентифікатора" #: cps/templates/book_edit.html:124 cps/templates/book_edit.html:308 #: cps/templates/user_table.html:24 msgid "Remove" -msgstr "Видалити" +msgstr "Вилучити" #: cps/templates/book_edit.html:129 msgid "Add Identifier" @@ -2144,11 +2179,11 @@ msgstr "Додати ідентифікатор" #: cps/templates/book_edit.html:133 msgid "Fetch Cover from URL (JPEG - Image will be downloaded and stored in database)" -msgstr "" +msgstr "Отримати обкладинку з URL-адреси (JPEG - зображення буде завантажено і збережено в БД)" #: cps/templates/book_edit.html:137 msgid "Upload Cover from Local Disk" -msgstr "" +msgstr "Вивантаження обкладинки з локального диска" #: cps/templates/book_edit.html:149 cps/templates/search_form.html:46 #: cps/templates/search_form.html:167 @@ -2162,14 +2197,14 @@ msgstr "Ні" #: cps/templates/book_edit.html:215 msgid "View Book on Save" -msgstr "переглянути книгу після редагування" +msgstr "Переглянути книгу після збереження" #: cps/templates/book_edit.html:218 cps/templates/book_edit.html:236 msgid "Fetch Metadata" msgstr "Отримати метадані" #: cps/templates/book_edit.html:219 cps/templates/config_db.html:65 -#: cps/templates/config_edit.html:430 cps/templates/config_view_edit.html:174 +#: cps/templates/config_edit.html:452 cps/templates/config_view_edit.html:174 #: cps/templates/email_edit.html:65 cps/templates/schedule_edit.html:44 #: cps/templates/shelf_edit.html:25 cps/templates/shelf_order.html:41 #: cps/templates/user_edit.html:142 @@ -2181,13 +2216,12 @@ msgid "Keyword" msgstr "Ключове слово" #: cps/templates/book_edit.html:240 -#, fuzzy msgid "Search keyword" -msgstr " Пошук по ключовому слову" +msgstr " Пошук за ключовим словом" #: cps/templates/book_edit.html:246 msgid "Click the cover to load metadata to the form" -msgstr "Натисніть на обкладинку, щоб отримати метадані" +msgstr "Щоб підвантажити метадані у форму" #: cps/templates/book_edit.html:253 cps/templates/book_edit.html:292 msgid "Loading..." @@ -2203,104 +2237,98 @@ msgstr "Помилка пошуку!" #: cps/templates/book_edit.html:294 msgid "No Result(s) found! Please try another keyword." -msgstr "" +msgstr "Нічого не знайдено. Спробуйте пошукати інше ключове слово." #: cps/templates/book_table.html:12 cps/templates/book_table.html:95 #: cps/templates/user_table.html:14 cps/templates/user_table.html:77 #: cps/templates/user_table.html:100 msgid "This Field is Required" -msgstr "" +msgstr "Це поле обов'язкове" #: cps/templates/book_table.html:25 -#, fuzzy msgid "Archive selected books" -msgstr "Архівні книжки" +msgstr "Архівувати вибрані книги" #: cps/templates/book_table.html:28 -#, fuzzy msgid "Unarchive selected books" -msgstr "Архівні книжки" +msgstr "Розархівувати вибрані книги" #: cps/templates/book_table.html:34 -#, fuzzy msgid "Mark selected books as read" -msgstr "Відмітити як не прочитане" +msgstr "Позначити вибрані книги як прочитані" #: cps/templates/book_table.html:37 -#, fuzzy msgid "Mark selected books as unread" -msgstr "Відмітити як не прочитане" +msgstr "Позначити вибрані книги як непрочитані" #: cps/templates/book_table.html:57 msgid "Merge selected books" -msgstr "" +msgstr "Об'єднати вибрані книги" #: cps/templates/book_table.html:60 cps/templates/user_table.html:124 -#, fuzzy msgid "Clear selections" -msgstr "Дії" +msgstr "Зняти вибір" #: cps/templates/book_table.html:63 -#, fuzzy msgid "Edit selected books" -msgstr "Видалити книгу" +msgstr "Редагувати вибрані книги" #: cps/templates/book_table.html:67 msgid "Exchange author and title" -msgstr "" +msgstr "Поміняти місцями автора і назву" #: cps/templates/book_table.html:73 msgid "Update Title Sort automatically" -msgstr "" +msgstr "Оновлювати впорядкування назв автоматично" #: cps/templates/book_table.html:77 msgid "Update Author Sort automatically" -msgstr "" +msgstr "Оновлювати впорядкування авторів автоматично" #: cps/templates/book_table.html:89 cps/templates/book_table.html:95 msgid "Enter Title" -msgstr "" +msgstr "Вказати назву" #: cps/templates/book_table.html:89 cps/templates/config_view_edit.html:24 #: cps/templates/shelf_edit.html:8 msgid "Title" -msgstr "Заголовок" +msgstr "Назва" #: cps/templates/book_table.html:90 msgid "Enter Title Sort" -msgstr "" +msgstr "Вказати впорядкування за назвою" #: cps/templates/book_table.html:90 msgid "Title Sort" -msgstr "" +msgstr "Впорядкування за назвою" #: cps/templates/book_table.html:91 msgid "Enter Author Sort" -msgstr "" +msgstr "Вказати впорядкування за автором" #: cps/templates/book_table.html:91 msgid "Author Sort" -msgstr "" +msgstr "Впорядкування за автором" #: cps/templates/book_table.html:92 msgid "Enter Authors" -msgstr "" +msgstr "Вказати авторів" #: cps/templates/book_table.html:93 msgid "Enter Categories" -msgstr "" +msgstr "Вказати категорії" #: cps/templates/book_table.html:94 msgid "Enter Series" -msgstr "" +msgstr "Вказати серії" #: cps/templates/book_table.html:95 msgid "Series Index" -msgstr "" +msgstr "Індекс серій" #: cps/templates/book_table.html:96 msgid "Enter Languages" -msgstr "" +msgstr "Вказати мови" #: cps/templates/book_table.html:97 msgid "Publishing Date" @@ -2308,11 +2336,11 @@ msgstr "Дата публікації" #: cps/templates/book_table.html:98 msgid "Enter Publishers" -msgstr "" +msgstr "Вказати видавництва" #: cps/templates/book_table.html:99 msgid "Enter comments" -msgstr "Введіть коментар" +msgstr "Вкажіть коментарі" #: cps/templates/book_table.html:99 msgid "Comments" @@ -2320,39 +2348,37 @@ msgstr "Коментарі" #: cps/templates/book_table.html:101 msgid "Archive Status" -msgstr "" +msgstr "Стан архівування" #: cps/templates/book_table.html:103 cps/templates/search_form.html:42 msgid "Read Status" -msgstr "" +msgstr "Стан читання" #: cps/templates/book_table.html:106 cps/templates/book_table.html:108 #: cps/templates/book_table.html:110 cps/templates/book_table.html:112 #: cps/templates/book_table.html:116 cps/templates/book_table.html:118 #: cps/templates/book_table.html:122 -#, fuzzy msgid "Enter " -msgstr "Зареєструватись" +msgstr "Вказати " #: cps/templates/book_table.html:128 -#, fuzzy msgid "Delete selected books" -msgstr "Видалити книгу" +msgstr "Видалити вибрані книги" #: cps/templates/book_table.html:148 cps/templates/book_table.html:172 #: cps/templates/book_table.html:192 cps/templates/book_table.html:212 #: cps/templates/book_table.html:232 cps/templates/book_table.html:252 #: cps/templates/modal_dialogs.html:46 cps/templates/tasks.html:37 msgid "Are you really sure?" -msgstr "" +msgstr "Ви переконані?" #: cps/templates/book_table.html:152 msgid "Books with Title will be merged from:" -msgstr "" +msgstr "Книги з назвою буде об'єднано з:" #: cps/templates/book_table.html:156 msgid "Into Book with Title:" -msgstr "" +msgstr "У книгу з назвою:" #: cps/templates/book_table.html:161 msgid "Merge" @@ -2360,43 +2386,39 @@ msgstr "Обʼєднати" #: cps/templates/book_table.html:176 msgid "The following books will be deleted:" -msgstr "" +msgstr "Наступні книги будуть видалені:" #: cps/templates/book_table.html:196 msgid "The following books will be archived:" -msgstr "" +msgstr "Наступні книги будуть заархівовані:" #: cps/templates/book_table.html:200 cps/templates/detail.html:275 -#, fuzzy msgid "Archive" -msgstr "Заархівовано" +msgstr "Архівувати" #: cps/templates/book_table.html:216 msgid "The following books will be unarchived:" -msgstr "" +msgstr "Наступні книги будуть розархівовані:" #: cps/templates/book_table.html:220 -#, fuzzy msgid "Unarchive" -msgstr "Заархівовано" +msgstr "Розархівувати" #: cps/templates/book_table.html:236 msgid "The following books will be marked read:" -msgstr "" +msgstr "Наступні книги будуть позначені як прочитані:" #: cps/templates/book_table.html:240 -#, fuzzy msgid "Mark as read" -msgstr "Відмітити як прочитане" +msgstr "Позначити як прочитане" #: cps/templates/book_table.html:256 msgid "The following books will be marked unread:" -msgstr "" +msgstr "Наступні книги будуть позначені як непрочитані:" #: cps/templates/book_table.html:260 -#, fuzzy msgid "Mark as unread" -msgstr "Відмітити як не прочитане" +msgstr "Позначити як непрочитані" #: cps/templates/book_table.html:272 cps/templates/detail.html:348 msgid "Edit Metadata" @@ -2404,7 +2426,7 @@ msgstr "Редагувати метадані" #: cps/templates/book_table.html:275 msgid "Edit the fields you want changed. Blank fields will be ignored:" -msgstr "" +msgstr "Змініть поля, які бажаєте. Порожні поля будуть проігноровані:" #: cps/templates/config_db.html:12 msgid "Location of Calibre Database" @@ -2412,7 +2434,7 @@ msgstr "Розташування БД Calibre" #: cps/templates/config_db.html:21 msgid "Separate Book Files from Library" -msgstr "" +msgstr "Файли книг поза бібліотекою" #: cps/templates/config_db.html:34 msgid "Use Google Drive?" @@ -2424,23 +2446,23 @@ msgstr "Автентифікація Google Drive" #: cps/templates/config_db.html:44 msgid "Google Drive Calibre folder" -msgstr "Папка Calibre в Google Drive" +msgstr "Тека Calibre в Google Drive" #: cps/templates/config_db.html:52 msgid "Metadata Watch Channel ID" -msgstr "Metadata Watch Channel ID" +msgstr "ID каналу відстеження метаданих" #: cps/templates/config_db.html:55 msgid "Revoke" -msgstr "Скасувати" +msgstr "Відкликати" #: cps/templates/config_db.html:80 msgid "New db location is invalid, please enter valid path" -msgstr "" +msgstr "Нове розташування БД недійсне. Будь ласка, вкажіть дійсний шлях" #: cps/templates/config_edit.html:18 msgid "Server Configuration" -msgstr "Налаштування серверу" +msgstr "Налаштування сервера" #: cps/templates/config_edit.html:25 msgid "Server Port" @@ -2452,7 +2474,7 @@ msgstr "Розташування сертифіката SSL (залиште йо #: cps/templates/config_edit.html:35 msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" -msgstr "Розташування ключових слів SSL (залиште його порожнім для серверів, які не використовують SSL)" +msgstr "Розташування ключового файлу SSL (залиште його порожнім для серверів, які не використовують SSL)" #: cps/templates/config_edit.html:43 msgid "Update Channel" @@ -2472,43 +2494,43 @@ msgstr "Довірені хости (розділені комою)" #: cps/templates/config_edit.html:61 msgid "Logfile Configuration" -msgstr "Logfile налаштування" +msgstr "Файл журналу конфіґурації" #: cps/templates/config_edit.html:77 msgid "Location and name of logfile (calibre-web.log for no entry)" -msgstr "Розташування і назва логфайлу (calibre-web.log for no entry)" +msgstr "Розташування і назва файлу журналу (якщо не вказано буде calibre-web.log)" #: cps/templates/config_edit.html:82 msgid "Enable Access Log" -msgstr "" +msgstr "Увімкнути журнал доступу" #: cps/templates/config_edit.html:85 msgid "Location and name of access logfile (access.log for no entry)" -msgstr "" +msgstr "Розташування і назва файлу журналу доступу (якщо не вказано буде access.log)" #: cps/templates/config_edit.html:96 msgid "Feature Configuration" -msgstr "Особливі налаштування" +msgstr "Налаштування функцій" #: cps/templates/config_edit.html:104 msgid "Convert non-English characters in title and author while saving to disk" -msgstr "" +msgstr "Змінювати нелатинські символи у назві й авторі під час збереження на диск" #: cps/templates/config_edit.html:108 msgid "Embed Metadata to Ebook File on Download/Conversion/e-mail (needs Calibre/Kepubify binaries)" -msgstr "" +msgstr "Вбудовувати метадані у файл е-книги при завантаженні/конвертуванні/надсиланні е-поштою (потребує бінарних файлів Calibre/Kepubify)" #: cps/templates/config_edit.html:112 msgid "Enable Uploads" -msgstr "Дозволити завантаження книг на сервер" +msgstr "Дозволити вивантаження" #: cps/templates/config_edit.html:112 msgid "(Please ensure that users also have upload permissions)" -msgstr "" +msgstr "(Обов'язково переконайтеся, що користувачі також мають дозволи для вивантаження)" #: cps/templates/config_edit.html:116 msgid "Allowed Upload Fileformats" -msgstr "" +msgstr "Дозволені формати файлів для вивантаження" #: cps/templates/config_edit.html:122 msgid "Enable Anonymous Browsing" @@ -2520,256 +2542,274 @@ msgstr "Дозволити публічну реєстрацію" #: cps/templates/config_edit.html:131 msgid "Use Email as Username" -msgstr "" +msgstr "Використовувати е-пошту як псевдо" #: cps/templates/config_edit.html:136 msgid "Enable Magic Link Remote Login" -msgstr "Включити віддалений логін (\"magic link\")" +msgstr "Увімкнути віддалений вхід («Magic Link»)" #: cps/templates/config_edit.html:141 msgid "Enable Kobo sync" -msgstr "" +msgstr "Увімкнути синхронізацію Kobo" #: cps/templates/config_edit.html:146 msgid "Proxy unknown requests to Kobo Store" -msgstr "" +msgstr "Невідомі запити проксі до магазину Kobo" #: cps/templates/config_edit.html:149 msgid "Server External Port (for port forwarded API calls)" -msgstr "" +msgstr "Зовнішній порт сервера (для викликів API, що перенаправляються на порт)" #: cps/templates/config_edit.html:157 msgid "Use Goodreads" -msgstr "" +msgstr "Використовувати Goodreads" #: cps/templates/config_edit.html:161 msgid "Goodreads API Key" -msgstr "" +msgstr "Ключ API Goodreads" #: cps/templates/config_edit.html:167 msgid "Google Books API Key" -msgstr "" +msgstr "Ключ API Google Books" #: cps/templates/config_edit.html:172 msgid "Allow Reverse Proxy Authentication" +msgstr "Дозволити автентифікацію зворотного проксі" + +#: cps/templates/config_edit.html:176 +msgid "Security Warning" msgstr "" -#: cps/templates/config_edit.html:183 -msgid "Login type" -msgstr "Тип логіну" - -#: cps/templates/config_edit.html:185 -msgid "Use Standard Authentication" +#: cps/templates/config_edit.html:177 +msgid "Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled." msgstr "" -#: cps/templates/config_edit.html:187 -msgid "Use LDAP Authentication" +#: cps/templates/config_edit.html:184 +msgid "Reverse Proxy Trusted IPs/CIDRs (Comma Separated)" msgstr "" -#: cps/templates/config_edit.html:190 -msgid "Use OAuth" +#: cps/templates/config_edit.html:189 +msgid "Enable Reverse Proxy Shared Secret Header" msgstr "" #: cps/templates/config_edit.html:197 -msgid "LDAP Server Host Name or IP Address" -msgstr "" - -#: cps/templates/config_edit.html:201 -msgid "LDAP Server Port" +msgid "Reverse Proxy Shared Secret" msgstr "" #: cps/templates/config_edit.html:205 -msgid "LDAP Encryption" -msgstr "" +msgid "Login type" +msgstr "Тип входу" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:207 +msgid "Use Standard Authentication" +msgstr "Використ. стандартну автентифікацію" + +#: cps/templates/config_edit.html:209 +msgid "Use LDAP Authentication" +msgstr "Використ. автентифікацію LDAP" + +#: cps/templates/config_edit.html:212 +msgid "Use OAuth" +msgstr "Використ. OAuth" + +#: cps/templates/config_edit.html:219 +msgid "LDAP Server Host Name or IP Address" +msgstr "Ім'я хосту сервера LDAP або IP-адреса" + +#: cps/templates/config_edit.html:223 +msgid "LDAP Server Port" +msgstr "Порт сервера LDAP" + +#: cps/templates/config_edit.html:227 +msgid "LDAP Encryption" +msgstr "Шифрування LDAP" + +#: cps/templates/config_edit.html:230 msgid "TLS" msgstr "TLS" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:231 msgid "SSL" msgstr "SSL" -#: cps/templates/config_edit.html:213 +#: cps/templates/config_edit.html:235 msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" -msgstr "" +msgstr "Шлях CACertificate LDAP (потрібен тільки для автентифікації з клієнтським сертифікатом)" -#: cps/templates/config_edit.html:220 +#: cps/templates/config_edit.html:242 msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" -msgstr "" +msgstr "Шлях сертифіката LDAP (потрібен тільки для автентифікації з клієнтським сертифікатом)" -#: cps/templates/config_edit.html:227 +#: cps/templates/config_edit.html:249 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" -msgstr "" +msgstr "Шлях ключового файлу LDAP (потрібен тільки для автентифікації з клієнтським сертифікатом)" -#: cps/templates/config_edit.html:236 +#: cps/templates/config_edit.html:258 msgid "LDAP Authentication" -msgstr "" +msgstr "Автентифікація LDAP" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:260 msgid "Anonymous" msgstr "Анонім" -#: cps/templates/config_edit.html:239 +#: cps/templates/config_edit.html:261 msgid "Unauthenticated" -msgstr "" +msgstr "Неавтентифікований" -#: cps/templates/config_edit.html:240 +#: cps/templates/config_edit.html:262 msgid "Simple" -msgstr "" - -#: cps/templates/config_edit.html:245 -msgid "LDAP Administrator Username" -msgstr "" - -#: cps/templates/config_edit.html:251 -msgid "LDAP Administrator Password" -msgstr "" - -#: cps/templates/config_edit.html:256 -msgid "LDAP Distinguished Name (DN)" -msgstr "" - -#: cps/templates/config_edit.html:260 -msgid "LDAP User Object Filter" -msgstr "" - -#: cps/templates/config_edit.html:265 -msgid "LDAP Server is OpenLDAP?" -msgstr "" +msgstr "Простий" #: cps/templates/config_edit.html:267 -msgid "Following Settings are Needed For User Import" -msgstr "" - -#: cps/templates/config_edit.html:269 -msgid "LDAP Group Object Filter" -msgstr "" +msgid "LDAP Administrator Username" +msgstr "Псевдо адміністратора LDAP" #: cps/templates/config_edit.html:273 +msgid "LDAP Administrator Password" +msgstr "Пароль адміністратора LDAP" + +#: cps/templates/config_edit.html:278 +msgid "LDAP Distinguished Name (DN)" +msgstr "Розрізнюване ім'я (DN) LDAP" + +#: cps/templates/config_edit.html:282 +msgid "LDAP User Object Filter" +msgstr "Фільтр об'єктів користувача LDAP" + +#: cps/templates/config_edit.html:287 +msgid "LDAP Server is OpenLDAP?" +msgstr "Сервер LDAP є OpenLDAP?" + +#: cps/templates/config_edit.html:289 +msgid "Following Settings are Needed For User Import" +msgstr "Для імпорту користувача потрібні наступні налаштування" + +#: cps/templates/config_edit.html:291 +msgid "LDAP Group Object Filter" +msgstr "Фільтр об'єктів групи LDAP" + +#: cps/templates/config_edit.html:295 msgid "LDAP Group Name" -msgstr "" +msgstr "Назва групи LDAP" -#: cps/templates/config_edit.html:277 +#: cps/templates/config_edit.html:299 msgid "LDAP Group Members Field" -msgstr "" +msgstr "Поле учасників групи LDAP" -#: cps/templates/config_edit.html:281 +#: cps/templates/config_edit.html:303 msgid "LDAP Member User Filter Detection" -msgstr "" +msgstr "Визначення фільтра користувачів-учасників LDAP" -#: cps/templates/config_edit.html:283 +#: cps/templates/config_edit.html:305 msgid "Autodetect" msgstr "Автовизначення" -#: cps/templates/config_edit.html:284 +#: cps/templates/config_edit.html:306 msgid "Custom Filter" -msgstr "" +msgstr "Власний фільтр" -#: cps/templates/config_edit.html:289 +#: cps/templates/config_edit.html:311 msgid "LDAP Member User Filter" -msgstr "" +msgstr "Фільтр користувачів-учасників LDAP" -#: cps/templates/config_edit.html:300 +#: cps/templates/config_edit.html:322 #, python-format msgid "Obtain %(provider)s OAuth Credential" -msgstr "" +msgstr "Отримати облікові дані OAuth для %(provider)s" -#: cps/templates/config_edit.html:303 +#: cps/templates/config_edit.html:325 #, python-format msgid "%(provider)s OAuth Client Id" -msgstr "" - -#: cps/templates/config_edit.html:307 -#, python-format -msgid "%(provider)s OAuth Client Secret" -msgstr "" - -#: cps/templates/config_edit.html:323 -msgid "External binaries" -msgstr "" +msgstr "ID клієнта OAuth для %(provider)s" #: cps/templates/config_edit.html:329 +#, python-format +msgid "%(provider)s OAuth Client Secret" +msgstr "Секретний ключ клієнта OAuth для %(provider)s" + +#: cps/templates/config_edit.html:345 +msgid "External binaries" +msgstr "Зовнішні бінарні файли" + +#: cps/templates/config_edit.html:351 msgid "Path to Calibre Binaries" -msgstr "" +msgstr "Шлях до бінарників Calibre" -#: cps/templates/config_edit.html:337 +#: cps/templates/config_edit.html:359 msgid "Calibre E-Book Converter Settings" -msgstr "" +msgstr "Налаштування конвертера е-книг Calibre" -#: cps/templates/config_edit.html:340 +#: cps/templates/config_edit.html:362 msgid "Path to Kepubify E-Book Converter" -msgstr "" +msgstr "Шлях до конвертера е-книг Kepubify" -#: cps/templates/config_edit.html:348 +#: cps/templates/config_edit.html:370 msgid "Location of Unrar binary" -msgstr "" - -#: cps/templates/config_edit.html:364 -#, fuzzy -msgid "Security Settings" -msgstr "Налаштування OAuth" - -#: cps/templates/config_edit.html:372 -msgid "Limit failed login attempts" -msgstr "" - -#: cps/templates/config_edit.html:376 -msgid "Configure Backend for Limiter" -msgstr "" - -#: cps/templates/config_edit.html:380 -msgid "Options for Limiter Backend" -msgstr "" +msgstr "Розташування бінарника Unrar" #: cps/templates/config_edit.html:386 +msgid "Security Settings" +msgstr "Налаштування безпеки" + +#: cps/templates/config_edit.html:394 +msgid "Limit failed login attempts" +msgstr "Досягнено максимальної кількості невдалих спроб входу" + +#: cps/templates/config_edit.html:398 +msgid "Configure Backend for Limiter" +msgstr "Налаштування серверної частини для обмежувача" + +#: cps/templates/config_edit.html:402 +msgid "Options for Limiter Backend" +msgstr "Параметри серверної частини обмежувача" + +#: cps/templates/config_edit.html:408 msgid "Check if file extensions matches file content on upload" -msgstr "" +msgstr "При вивантаженні перевірте чи розширення файлів відповідають їх вмісту" -#: cps/templates/config_edit.html:389 +#: cps/templates/config_edit.html:411 msgid "Session protection" -msgstr "" +msgstr "Захист сесії" -#: cps/templates/config_edit.html:391 +#: cps/templates/config_edit.html:413 msgid "Basic" -msgstr "" - -#: cps/templates/config_edit.html:392 -msgid "Strong" -msgstr "" - -#: cps/templates/config_edit.html:397 -#, fuzzy -msgid "User Password policy" -msgstr "Скинути пароль користувача" - -#: cps/templates/config_edit.html:401 -msgid "Minimum password length" -msgstr "" - -#: cps/templates/config_edit.html:406 -msgid "Enforce number" -msgstr "" - -#: cps/templates/config_edit.html:410 -msgid "Enforce lowercase characters" -msgstr "" +msgstr "Базовий" #: cps/templates/config_edit.html:414 +msgid "Strong" +msgstr "Сильний" + +#: cps/templates/config_edit.html:419 +msgid "User Password policy" +msgstr "Політика паролю користувача" + +#: cps/templates/config_edit.html:423 +msgid "Minimum password length" +msgstr "Мінімальна довжина пароля" + +#: cps/templates/config_edit.html:428 +msgid "Enforce number" +msgstr "Цифри обов'язкові" + +#: cps/templates/config_edit.html:432 +msgid "Enforce lowercase characters" +msgstr "Малі літери обов'язкові" + +#: cps/templates/config_edit.html:436 msgid "Enforce uppercase characters" -msgstr "" +msgstr "Великі літери обов'язкові" -#: cps/templates/config_edit.html:418 +#: cps/templates/config_edit.html:440 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" -msgstr "" +msgstr "Ієрогліфи обов'язкові (потрібно для японських, корейських і китайських символів)" -#: cps/templates/config_edit.html:422 +#: cps/templates/config_edit.html:444 msgid "Enforce special characters" -msgstr "" +msgstr "Спеціальні символи обов'язкові" #: cps/templates/config_view_edit.html:17 msgid "View Configuration" -msgstr "Переглянути налаштування" +msgstr "Налаштування вигляду" #: cps/templates/config_view_edit.html:32 msgid "No. of Random Books to Display" @@ -2777,7 +2817,7 @@ msgstr "Кількість показаних випадкових книг" #: cps/templates/config_view_edit.html:36 msgid "No. of Authors to Display Before Hiding (0=Disable Hiding)" -msgstr "" +msgstr "Кількість показаних авторів перед приховуванням (0 = вимк. приховування)" #: cps/templates/config_view_edit.html:40 cps/templates/readcbr.html:101 msgid "Theme" @@ -2789,51 +2829,51 @@ msgstr "Стандартна тема" #: cps/templates/config_view_edit.html:43 msgid "caliBlur! Dark Theme" -msgstr "" +msgstr "caliBlur! Темна тема" #: cps/templates/config_view_edit.html:47 msgid "Regular Expression for Ignoring Columns" -msgstr "Regexp для ігнорування стовпців" +msgstr "Регулярний вираз для ігнорування стовпчиків" #: cps/templates/config_view_edit.html:51 msgid "Link Read/Unread Status to Calibre Column" -msgstr "" +msgstr "Посилання стан прочитано/непрочитано у стовпчику Calibre" #: cps/templates/config_view_edit.html:60 msgid "View Restrictions based on Calibre column" -msgstr "" +msgstr "Показувати обмеження на основі стовпчика Calibre" #: cps/templates/config_view_edit.html:69 msgid "Regular Expression for Title Sorting" -msgstr "Regexp для сортування по назві" +msgstr "Регулярний вираз для впорядкування за назвою" #: cps/templates/config_view_edit.html:80 msgid "Default Settings for New Users" -msgstr "Налаштування по замовчуванню для нових користувачів" +msgstr "Типові налаштування для нових користувачів" #: cps/templates/config_view_edit.html:88 cps/templates/user_edit.html:96 msgid "Admin User" -msgstr "Керування сервером" +msgstr "Адміністратор" #: cps/templates/config_view_edit.html:92 cps/templates/user_edit.html:101 msgid "Allow Downloads" -msgstr "Дозволити завантажувати з сервера" +msgstr "Дозволити завантаження з сервера" #: cps/templates/config_view_edit.html:96 cps/templates/user_edit.html:105 msgid "Allow eBook Viewer" -msgstr "" +msgstr "Дозволити переглядач е-книг" #: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:110 msgid "Allow Uploads" -msgstr "Дозволити завантаження на сервер" +msgstr "Дозволити вивантаження на сервер" #: cps/templates/config_view_edit.html:106 cps/templates/user_edit.html:115 msgid "Allow Edit" -msgstr "Дозволити редагування книг" +msgstr "Дозволити редагування" #: cps/templates/config_view_edit.html:111 cps/templates/user_edit.html:120 msgid "Allow Delete Books" -msgstr "" +msgstr "Дозволити видалення книг" #: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:126 msgid "Allow Changing Password" @@ -2841,59 +2881,56 @@ msgstr "Дозволити зміну пароля" #: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:130 msgid "Allow Editing Public Shelves" -msgstr "Дозволити редагування публічних книжкових полиць" +msgstr "Дозволити редагування публічних полиць" #: cps/templates/config_view_edit.html:123 -#, fuzzy msgid "Default Language" -msgstr "Виключити мови" +msgstr "Типова мова" #: cps/templates/config_view_edit.html:131 -#, fuzzy msgid "Default Visible Language of Books" -msgstr "Показувати книги на мовах" +msgstr "Типова мова видимих книг" #: cps/templates/config_view_edit.html:147 msgid "Default Visibilities for New Users" -msgstr "Можливості за замовчуванням для нових користувачів" +msgstr "Типова видимість для нових користувачів" #: cps/templates/config_view_edit.html:163 cps/templates/user_edit.html:84 #: cps/templates/user_table.html:154 msgid "Show Random Books in Detail View" -msgstr "Показувати випадкові книги при перегляді деталей" +msgstr "При перегляді відомостей показувати випадкові книги" #: cps/templates/config_view_edit.html:166 cps/templates/user_edit.html:87 msgid "Add Allowed/Denied Tags" -msgstr "" +msgstr "Додати дозволені/заборонені мітки" #: cps/templates/config_view_edit.html:167 msgid "Add Allowed/Denied custom column values" -msgstr "" +msgstr "Додати дозволені/заборонені значення власних стовпчиків" #: cps/templates/detail.html:85 cps/templates/detail.html:99 msgid "Read in Browser" -msgstr "Відкрити в браузері" +msgstr "Читати у вебоглядачі" #: cps/templates/detail.html:108 cps/templates/detail.html:128 msgid "Listen in Browser" -msgstr "Прослухати в браузері" +msgstr "Слухати у вебоглядачі" #: cps/templates/detail.html:259 cps/templates/listenmp3.html:158 msgid "Mark As Unread" -msgstr "Відмітити як не прочитане" +msgstr "Позначити як непрочитане" #: cps/templates/detail.html:260 cps/templates/listenmp3.html:158 msgid "Mark As Read" -msgstr "Відмітити як прочитане" +msgstr "Позначити як прочитане" #: cps/templates/detail.html:262 -#, fuzzy msgid "Mark Book as Read or Unread" -msgstr "Відмітити як не прочитане" +msgstr "Позначити книгу як прочитану чи непрочитану" #: cps/templates/detail.html:262 cps/templates/listenmp3.html:159 msgid "Read" -msgstr "Прочитано" +msgstr "Прочитана" #: cps/templates/detail.html:272 cps/templates/listenmp3.html:166 msgid "Restore from archive" @@ -2901,16 +2938,16 @@ msgstr "Відновити з архіву" #: cps/templates/detail.html:273 cps/templates/listenmp3.html:166 msgid "Add to archive" -msgstr "Додати в архів" +msgstr "Додати до архіву" #: cps/templates/detail.html:275 msgid "Mark Book as archived or not, to hide it in Calibre-Web and delete it from Kobo Reader" -msgstr "" +msgstr "Позначити книгу як заархівовану або ні, щоб сховати її у Calibre-Web та видалити з е-читалки Kobo" #: cps/templates/detail.html:301 cps/templates/listenmp3.html:190 #: cps/templates/search.html:16 msgid "Add to shelf" -msgstr "Додати на книжкову полицю" +msgstr "Додати до полиці" #: cps/templates/detail.html:313 cps/templates/detail.html:332 #: cps/templates/feed.xml:131 cps/templates/layout.html:156 @@ -2921,23 +2958,23 @@ msgstr "(Публічно)" #: cps/templates/email_edit.html:13 msgid "Email Account Type" -msgstr "" +msgstr "Тип облікового запису е-пошти" #: cps/templates/email_edit.html:15 msgid "Standard Email Account" -msgstr "" +msgstr "Стандартний обліковий запис е-пошти" #: cps/templates/email_edit.html:16 msgid "Gmail Account" -msgstr "" +msgstr "Обліковий запис Gmail" #: cps/templates/email_edit.html:22 msgid "Setup Gmail Account" -msgstr "" +msgstr "Налаштувати обліковий запис Gmail" #: cps/templates/email_edit.html:24 msgid "Revoke Gmail Access" -msgstr "" +msgstr "Відкликати доступ Gmail" #: cps/templates/email_edit.html:42 msgid "STARTTLS" @@ -2953,12 +2990,11 @@ msgstr "Пароль SMTP" #: cps/templates/email_edit.html:58 msgid "Attachment Size Limit" -msgstr "Обмеження розміру вкладення" +msgstr "Обмеження розміру долучення" #: cps/templates/email_edit.html:66 -#, fuzzy msgid "Save and Send Test Email" -msgstr "Зберегти налаштування і відправити тестове повідомлення" +msgstr "Зберегти і надіслати пробний е-лист" #: cps/templates/email_edit.html:70 cps/templates/layout.html:26 #: cps/templates/shelf_order.html:42 cps/templates/user_table.html:174 @@ -2967,7 +3003,7 @@ msgstr "Назад" #: cps/templates/email_edit.html:74 msgid "Allowed Domains (Whitelist)" -msgstr "" +msgstr "Дозволені домени (білий список)" #: cps/templates/email_edit.html:78 cps/templates/email_edit.html:105 msgid "Add Domain" @@ -2980,19 +3016,19 @@ msgstr "Додати" #: cps/templates/email_edit.html:86 cps/templates/email_edit.html:96 msgid "Enter domainname" -msgstr "Введіть домен" +msgstr "Вкажіть доменне ім'я" #: cps/templates/email_edit.html:92 msgid "Denied Domains (Blacklist)" -msgstr "Заборонені домени (Чорний список)" +msgstr "Заборонені домени (чорний список)" #: cps/templates/generate_kobo_auth_url.html:6 msgid "Open the .kobo/Kobo/Kobo eReader.conf file in a text editor and add (or edit):" -msgstr "" +msgstr "Відкрити файл .kobo/Kobo/Kobo eReader.conf у текстовому редакторі й додати (чи редагувати):" #: cps/templates/generate_kobo_auth_url.html:11 msgid "Kobo Token:" -msgstr "" +msgstr "Токен Kobo:" #: cps/templates/grid.html:21 msgid "List" @@ -3000,74 +3036,73 @@ msgstr "Список" #: cps/templates/http_error.html:34 msgid "Calibre-Web Instance is unconfigured, please contact your administrator" -msgstr "" +msgstr "Примірник Calibre-Web не налаштований. Зв'яжіться з адміністратором" #: cps/templates/http_error.html:44 msgid "Create Issue" -msgstr "" +msgstr "Повідомити про проблему" #: cps/templates/http_error.html:52 -#, fuzzy msgid "Return to Database config" -msgstr "Особливі налаштування" +msgstr "Повернутися до налаштування БД" #: cps/templates/http_error.html:54 msgid "Return to Home" -msgstr "" +msgstr "Повернутися на головну" #: cps/templates/http_error.html:57 msgid "Logout User" -msgstr "" +msgstr "Вийти користувача" #: cps/templates/index.html:71 msgid "Sort ascending according to download count" -msgstr "" +msgstr "Впорядкувати за кількістю завантажень, від меншої" #: cps/templates/index.html:72 msgid "Sort descending according to download count" -msgstr "" +msgstr "Впорядкувати за кількістю завантажень, від більшої" #: cps/templates/index.html:78 cps/templates/search.html:49 #: cps/templates/shelf.html:24 msgid "Sort authors in alphabetical order" -msgstr "" +msgstr "Впорядкувати авторів у порядку абетки, А-Я" #: cps/templates/index.html:79 cps/templates/search.html:50 #: cps/templates/shelf.html:25 msgid "Sort authors in reverse alphabetical order" -msgstr "" +msgstr "Впорядкувати авторів у порядку абетки, Я-А" #: cps/templates/index.html:83 msgid "Sort ascending according to series index" -msgstr "" +msgstr "Впорядкувати за номером серії, від меншого" #: cps/templates/index.html:84 msgid "Sort descending according to series index" -msgstr "" +msgstr "Впорядкувати за номером серії, від більшого" #: cps/templates/index.xml:7 msgid "Start" -msgstr "Старт" +msgstr "Почати" #: cps/templates/index.xml:19 msgid "Alphabetical Books" -msgstr "" +msgstr "Книги за абеткою" #: cps/templates/index.xml:23 msgid "Books sorted alphabetically" -msgstr "" +msgstr "Книги впорядковані за абеткою" #: cps/templates/index.xml:31 msgid "Popular publications from this catalog based on Downloads." -msgstr "Популярні книги в цьому каталозі, на основі кількості завантажень" +msgstr "Популярні книги в цій теці на основі завантажень." #: cps/templates/index.xml:40 msgid "Popular publications from this catalog based on Rating." -msgstr "Популярні книги з цього каталогу на основі рейтингу" +msgstr "Популярні книги в цій теці на основі оцінок." #: cps/templates/index.xml:45 msgid "Recently added Books" -msgstr "" +msgstr "Останні додані книги" #: cps/templates/index.xml:49 msgid "The latest Books" @@ -3075,56 +3110,56 @@ msgstr "Останні книги" #: cps/templates/index.xml:54 msgid "Random Books" -msgstr "Випадковий список книг" +msgstr "Випадкові книги" #: cps/templates/index.xml:83 msgid "Books ordered by Author" -msgstr "Книги відсортовані за автором" +msgstr "Книги впорядковані за автором" #: cps/templates/index.xml:92 msgid "Books ordered by publisher" -msgstr "" +msgstr "Книги впорядковані за видавництвом" #: cps/templates/index.xml:101 msgid "Books ordered by category" -msgstr "Книги відсортовані за категоріями" +msgstr "Книги впорядковані за категорією" #: cps/templates/index.xml:110 msgid "Books ordered by series" -msgstr "Книги відсортовані за серією" +msgstr "Книги впорядковані за серією" #: cps/templates/index.xml:119 msgid "Books ordered by Languages" -msgstr "" +msgstr "Книги впорядковані за мовою" #: cps/templates/index.xml:128 msgid "Books ordered by Rating" -msgstr "" +msgstr "Книги впорядковані за оцінкою" #: cps/templates/index.xml:137 msgid "Books ordered by file formats" -msgstr "" +msgstr "Книги впорядковані за форматами файлів" #: cps/templates/index.xml:142 cps/templates/layout.html:154 #: cps/templates/search_form.html:88 msgid "Shelves" -msgstr "" +msgstr "Полиці" #: cps/templates/index.xml:146 msgid "Books organized in shelves" -msgstr "" +msgstr "Книги організовані на полицях" #: cps/templates/layout.html:32 msgid "Toggle Navigation" -msgstr "Включити навігацію" +msgstr "Перемкнути навіґацію" #: cps/templates/layout.html:58 msgid "Simple Theme" -msgstr "" +msgstr "Проста тема" #: cps/templates/layout.html:66 cps/templates/layout.html:96 msgid "Account" -msgstr "" +msgstr "Обліковий запис" #: cps/templates/layout.html:93 cps/templates/read.html:83 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 @@ -3133,11 +3168,11 @@ msgstr "Налаштування" #: cps/templates/layout.html:137 msgid "Please do not refresh the page" -msgstr "" +msgstr "Будь ласка, не оновлюйте сторінку" #: cps/templates/layout.html:147 msgid "Browse" -msgstr "Перегляд" +msgstr "Огляд" #: cps/templates/layout.html:160 cps/templates/stats.html:3 msgid "About" @@ -3145,15 +3180,15 @@ msgstr "Про програму" #: cps/templates/layout.html:199 msgid "Book Details" -msgstr "Деталі" +msgstr "Відомості про книгу" #: cps/templates/list.html:22 msgid "Grid" -msgstr "" +msgstr "Решітка" #: cps/templates/listenmp3.html:167 msgid "Archived" -msgstr "Заархівовано" +msgstr "Заархівовані" #: cps/templates/login.html:18 msgid "Remember Me" @@ -3161,263 +3196,255 @@ msgstr "Запам'ятати мене" #: cps/templates/login.html:23 msgid "Forgot Password?" -msgstr "" +msgstr "Забули пароль?" #: cps/templates/login.html:34 msgid "Log in with Magic Link" -msgstr "Увійдіть в систему за допомогою magic link" +msgstr "Увійти за допомогою Magic Link" #: cps/templates/logviewer.html:6 msgid "Show Calibre-Web Log: " -msgstr "" +msgstr "Показати журнал Calibre-Web" #: cps/templates/logviewer.html:8 msgid "Calibre-Web Log: " -msgstr "" +msgstr "Журнал Calibre-Web:" #: cps/templates/logviewer.html:8 msgid "Stream output, can't be displayed" -msgstr "" +msgstr "Виведення потоку, неможливо відобразити" #: cps/templates/logviewer.html:12 msgid "Show Access Log: " -msgstr "" +msgstr "Показати журнал доступу:" #: cps/templates/logviewer.html:18 msgid "Download Calibre-Web Log" -msgstr "" +msgstr "Завантажити журнал Calibre-Web" #: cps/templates/logviewer.html:21 msgid "Download Access Log" -msgstr "" +msgstr "Завантажити журнал доступу" #: cps/templates/modal_dialogs.html:6 msgid "Select Allowed/Denied Tags" -msgstr "" +msgstr "Вибрати дозволені/заборонені мітки" #: cps/templates/modal_dialogs.html:7 msgid "Select Allowed/Denied Custom Column Values" -msgstr "" +msgstr "Вибрати дозволені/заборонені власні значення стовпчиків" #: cps/templates/modal_dialogs.html:8 msgid "Select Allowed/Denied Tags of User" -msgstr "" +msgstr "Вибрати дозволені/заборонені мітки користувачів" #: cps/templates/modal_dialogs.html:9 msgid "Select Allowed/Denied Custom Column Values of User" -msgstr "" +msgstr "Вибрати дозволені/заборонені значення власних стовпчиків користувачів" #: cps/templates/modal_dialogs.html:15 msgid "Enter Tag" -msgstr "Введіть тег" +msgstr "Вкажіть мітку" #: cps/templates/modal_dialogs.html:24 msgid "Add View Restriction" -msgstr "" +msgstr "Додати обмеження перегляду" #: cps/templates/modal_dialogs.html:50 msgid "This book format will be permanently erased from database" -msgstr "" +msgstr "Цю книгу буде назавжди витерто з бази даних" #: cps/templates/modal_dialogs.html:51 msgid "This book will be permanently erased from database and hard disk" -msgstr "" +msgstr "Цю книгу буде назавжди витерто з бази даних та жорсткого диска" #: cps/templates/modal_dialogs.html:55 msgid "Important Kobo Note: deleted books will remain on any paired Kobo device." -msgstr "" +msgstr "Важлива примітка щодо Kobo: видалені книги залишаться на будь-якому спареному пристрої Kobo." #: cps/templates/modal_dialogs.html:56 msgid "Books must first be archived and the device synced before a book can safely be deleted." -msgstr "" +msgstr "Перед тим, як книгу можна бути безпечно видалено, спершу книги мають бути заархівованими, а пристрій синхронізованим." #: cps/templates/modal_dialogs.html:75 msgid "Choose File Location" msgstr "Оберіть розташування файлу" -#: cps/templates/modal_dialogs.html:81 -msgid "type" -msgstr "" - #: cps/templates/modal_dialogs.html:82 -msgid "name" -msgstr "" +msgid "type" +msgstr "тип" #: cps/templates/modal_dialogs.html:83 +msgid "name" +msgstr "назва" + +#: cps/templates/modal_dialogs.html:84 msgid "size" -msgstr "" +msgstr "розмір" -#: cps/templates/modal_dialogs.html:89 +#: cps/templates/modal_dialogs.html:90 msgid "Parent Directory" -msgstr "" +msgstr "Батьківська тека" -#: cps/templates/modal_dialogs.html:97 +#: cps/templates/modal_dialogs.html:99 msgid "Select" -msgstr "" +msgstr "Обрати" -#: cps/templates/modal_dialogs.html:133 cps/templates/tasks.html:46 -#, fuzzy +#: cps/templates/modal_dialogs.html:135 cps/templates/tasks.html:46 msgid "Ok" -msgstr "Книга" +msgstr "Гаразд" #: cps/templates/osd.xml:5 msgid "Calibre-Web eBook Catalog" -msgstr "" +msgstr "Тека е-книг Calibre-Web" #: cps/templates/read.html:7 msgid "epub Reader" -msgstr "" +msgstr "Читалка ePub" #: cps/templates/read.html:85 -#, fuzzy msgid "Choose a theme below:" -msgstr "Виберіть ім'я користувача" +msgstr "Оберіть тему нижче:" #: cps/templates/read.html:89 cps/templates/readcbr.html:104 msgid "Light" -msgstr "" +msgstr "Світла" #: cps/templates/read.html:91 cps/templates/readcbr.html:105 msgid "Dark" -msgstr "" +msgstr "Темна" #: cps/templates/read.html:93 msgid "Sepia" -msgstr "" +msgstr "Сепія" #: cps/templates/read.html:95 msgid "Amber" -msgstr "" +msgstr "Бурштинова" #: cps/templates/read.html:97 -#, fuzzy msgid "Black" msgstr "Назад" #: cps/templates/read.html:109 msgid "Reflow text when sidebars are open." -msgstr "Переформатувати текст, коли відкриті бічні панелі." +msgstr "Перекомпонувати текст, якщо відкриті бічні панелі." #: cps/templates/read.html:114 msgid "Show pages count" -msgstr "" +msgstr "Показати кількість сторінок" #: cps/templates/read.html:118 msgid "Font Size" -msgstr "" +msgstr "Розмір шрифту" #: cps/templates/read.html:126 msgid "Font" -msgstr "" +msgstr "Шрифт" #: cps/templates/read.html:127 -#, fuzzy msgid "Default" -msgstr "Видалити" +msgstr "Типовий" #: cps/templates/read.html:128 msgid "Yahei" -msgstr "" +msgstr "Yahei" #: cps/templates/read.html:129 msgid "SimSun" -msgstr "" +msgstr "SimSun" #: cps/templates/read.html:130 -#, fuzzy msgid "KaiTi" -msgstr "Очікує" +msgstr "KaiTi" #: cps/templates/read.html:131 -#, fuzzy msgid "Arial" -msgstr "Вертикально" +msgstr "Arial" #: cps/templates/read.html:134 -#, fuzzy msgid "Spread" -msgstr "Прочитано" +msgstr "Розширити" #: cps/templates/read.html:135 msgid "Two columns" -msgstr "" +msgstr "Два стовпчики" #: cps/templates/read.html:136 msgid "One column" -msgstr "" +msgstr "Один стовпчик" #: cps/templates/readcbr.html:8 msgid "Comic Reader" -msgstr "" +msgstr "Читалка мальописів" #: cps/templates/readcbr.html:75 msgid "Keyboard Shortcuts" -msgstr "" +msgstr "Сполучення клавіш" #: cps/templates/readcbr.html:78 msgid "Previous Page" -msgstr "" +msgstr "Попередня сторінка" #: cps/templates/readcbr.html:79 cps/templates/readcbr.html:159 msgid "Next Page" -msgstr "" +msgstr "Наступна сторінка" #: cps/templates/readcbr.html:80 msgid "Single Page Display" -msgstr "" +msgstr "Показ однієї сторінки" #: cps/templates/readcbr.html:81 msgid "Long Strip Display" -msgstr "" +msgstr "Показ довгим рулоном" #: cps/templates/readcbr.html:82 msgid "Scale to Best" -msgstr "" +msgstr "Масштабувати якнайкраще" #: cps/templates/readcbr.html:83 msgid "Scale to Width" -msgstr "" +msgstr "Масштабувати по ширині" #: cps/templates/readcbr.html:84 msgid "Scale to Height" -msgstr "" +msgstr "Масштабувати по висоті" #: cps/templates/readcbr.html:85 msgid "Scale to Native" -msgstr "" +msgstr "Оригінальний масштаб" #: cps/templates/readcbr.html:86 msgid "Rotate Right" -msgstr "" +msgstr "Повернути вправо" #: cps/templates/readcbr.html:87 msgid "Rotate Left" -msgstr "" +msgstr "Повернути вліво" #: cps/templates/readcbr.html:88 msgid "Flip Image" -msgstr "" +msgstr "Віддзеркалити" #: cps/templates/readcbr.html:110 msgid "Display" -msgstr "" +msgstr "Показати" #: cps/templates/readcbr.html:113 -#, fuzzy msgid "Single Page" -msgstr "Сторінка адміністратора" +msgstr "Одна сторінка" #: cps/templates/readcbr.html:114 msgid "Long Strip" -msgstr "" +msgstr "Догий рулон" #: cps/templates/readcbr.html:119 msgid "Scale" -msgstr "" +msgstr "Масштаб" #: cps/templates/readcbr.html:122 msgid "Best" -msgstr "Краще" +msgstr "Найкраще" #: cps/templates/readcbr.html:123 msgid "Width" @@ -3429,7 +3456,7 @@ msgstr "Висота" #: cps/templates/readcbr.html:125 msgid "Native" -msgstr "" +msgstr "Оригінал" #: cps/templates/readcbr.html:130 msgid "Rotate" @@ -3437,11 +3464,11 @@ msgstr "Повернути" #: cps/templates/readcbr.html:141 msgid "Flip" -msgstr "" +msgstr "Дзеркально" #: cps/templates/readcbr.html:144 msgid "Horizontal" -msgstr "" +msgstr "Горизонтально" #: cps/templates/readcbr.html:145 msgid "Vertical" @@ -3453,23 +3480,23 @@ msgstr "Напрям" #: cps/templates/readcbr.html:153 msgid "Left to Right" -msgstr "" +msgstr "Зліва на право" #: cps/templates/readcbr.html:154 msgid "Right to Left" -msgstr "" +msgstr "Справа на ліво" #: cps/templates/readcbr.html:162 msgid "Reset to Top" -msgstr "" +msgstr "Скинути на початок" #: cps/templates/readcbr.html:163 msgid "Remember Position" -msgstr "" +msgstr "Запам'ятати місце" #: cps/templates/readcbr.html:168 msgid "Scrollbar" -msgstr "" +msgstr "Смуга прокрутки" #: cps/templates/readcbr.html:171 msgid "Show" @@ -3481,16 +3508,15 @@ msgstr "Сховати" #: cps/templates/readdjvu.html:5 msgid "DJVU Reader" -msgstr "" +msgstr "Читалка DjVu" #: cps/templates/readpdf.html:31 msgid "PDF Reader" -msgstr "" +msgstr "Читалка PDF" #: cps/templates/readtxt.html:6 -#, fuzzy msgid "txt Reader" -msgstr "Засіб для читання txt-файлів" +msgstr "Читалка TXT" #: cps/templates/register.html:4 msgid "Register New Account" @@ -3498,35 +3524,60 @@ msgstr "Зареєструвати нового користувача" #: cps/templates/register.html:10 msgid "Choose a username" -msgstr "Виберіть ім'я користувача" +msgstr "Оберіть псевдо" #: cps/templates/register.html:15 msgid "Your Email" -msgstr "Ваш email-адрес" +msgstr "Адреса е-пошти" #: cps/templates/remote_login.html:5 msgid "Magic Link - Authorise New Device" -msgstr "" +msgstr "Magic Link - авторизувати новий пристрій" #: cps/templates/remote_login.html:7 msgid "On another device, login and visit:" -msgstr "" +msgstr "Увійдіть на іншому пристрої і відкрийте:" #: cps/templates/remote_login.html:11 msgid "Once verified, you will automatically be logged in on this device." -msgstr "Після цього ви автоматично ввійдете в систему на цьому пристрої." +msgstr "Після цього ви автоматично увійдете в систему на цьому пристрої." #: cps/templates/remote_login.html:14 msgid "This verification link will expire in 10 minutes." +msgstr "Це посилання для перевірки стане недійсним через 10 хвилин." + +#: cps/templates/remote_login_verify.html:4 +msgid "Approve Magic Link Login" +msgstr "" + +#: cps/templates/remote_login_verify.html:5 +msgid "Review the device that requested access before approving this login." +msgstr "" + +#: cps/templates/remote_login_verify.html:7 +msgid "IP address" +msgstr "" + +#: cps/templates/remote_login_verify.html:9 +msgid "Browser" +msgstr "" + +#: cps/templates/remote_login_verify.html:12 +#, python-format +msgid "If you approve this request, the device that started it will be logged in as %(username)s." +msgstr "" + +#: cps/templates/remote_login_verify.html:15 +msgid "Approve Login" msgstr "" #: cps/templates/schedule_edit.html:33 msgid "Generate Series Cover Thumbnails" -msgstr "" +msgstr "Генерувати мініатюри обкладинок серій" #: cps/templates/search.html:7 msgid "Search Term:" -msgstr "" +msgstr "Шукати термін:" #: cps/templates/search.html:9 msgid "Results for:" @@ -3534,7 +3585,7 @@ msgstr "Результати для:" #: cps/templates/search.html:29 msgid "Remove from shelf" -msgstr "" +msgstr "Вилучити з полиці" #: cps/templates/search_form.html:21 msgid "Published Date From" @@ -3546,24 +3597,23 @@ msgstr "Дата публікації до" #: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" -msgstr "" +msgstr "Будь-яка" #: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" -msgstr "" +msgstr "Порожньо" #: cps/templates/search_form.html:60 msgid "Exclude Tags" -msgstr "Виключити теги" +msgstr "Виключити мітки" #: cps/templates/search_form.html:78 msgid "Exclude Series" msgstr "Виключити серії" #: cps/templates/search_form.html:96 -#, fuzzy msgid "Exclude Shelves" -msgstr "Виключити серії" +msgstr "Виключити полиці" #: cps/templates/search_form.html:116 msgid "Exclude Languages" @@ -3575,15 +3625,15 @@ msgstr "Розширення" #: cps/templates/search_form.html:135 msgid "Exclude Extensions" -msgstr "" +msgstr "Виключити розширення" #: cps/templates/search_form.html:145 msgid "Rating Above" -msgstr "" +msgstr "Оцінка понад" #: cps/templates/search_form.html:149 msgid "Rating Below" -msgstr "" +msgstr "Оцінка до" #: cps/templates/search_form.html:175 cps/templates/search_form.html:187 #: cps/templates/search_form.html:201 @@ -3597,47 +3647,47 @@ msgstr "До:" #: cps/templates/shelf.html:13 msgid "Delete this Shelf" -msgstr "Видалити цю книжкову полицю" +msgstr "Видалити цю полицю" #: cps/templates/shelf.html:14 msgid "Edit Shelf Properties" -msgstr "" +msgstr "Редагувати властивості полиці" #: cps/templates/shelf.html:17 msgid "Arrange books manually" -msgstr "" +msgstr "Розставити книги власноруч" #: cps/templates/shelf.html:18 msgid "Disable Change order" -msgstr "" +msgstr "Вимкнути зміну порядку" #: cps/templates/shelf.html:18 msgid "Enable Change order" -msgstr "" +msgstr "Увімкнути зміну порядку" #: cps/templates/shelf.html:28 msgid "Sort according to book added to shelf, newest first" -msgstr "" +msgstr "Впорядкувати книги за часом додавання книги на полицю, спершу нові" #: cps/templates/shelf.html:29 msgid "Sort according to book added to shelf, oldest first" -msgstr "" +msgstr "Впорядкувати книги за часом додавання книги на полицю, спершу старі" #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" -msgstr "зробити книжкову полицю доступною для всіх?" +msgstr "Поділитися з усіма" #: cps/templates/shelf_edit.html:21 msgid "Sync this shelf with Kobo device" -msgstr "" +msgstr "Синхронізувати з пристроєм Kobo" #: cps/templates/shelf_order.html:5 msgid "Drag to Rearrange Order" -msgstr "Перетягніть для змінення порядку" +msgstr "Перетягніть для зміни порядку" #: cps/templates/shelf_order.html:33 msgid "Hidden Book" -msgstr "" +msgstr "Прихована книга" #: cps/templates/stats.html:7 msgid "Library Statistics" @@ -3645,19 +3695,19 @@ msgstr "Статистика бібліотеки Calibre" #: cps/templates/stats.html:12 msgid "Books in this Library" -msgstr "Книг в цій бібліотеці" +msgstr "Книг у цій бібліотеці" #: cps/templates/stats.html:16 msgid "Authors in this Library" -msgstr "Авторів в цій бібліотеці" +msgstr "Авторів у цій бібліотеці" #: cps/templates/stats.html:20 msgid "Categories in this Library" -msgstr "Категорій в цій бібліотеці" +msgstr "Категорій у цій бібліотеці" #: cps/templates/stats.html:24 msgid "Series in this Library" -msgstr "Серій в цій бібліотеці" +msgstr "Серій у цій бібліотеці" #: cps/templates/stats.html:29 msgid "System Statistics" @@ -3685,16 +3735,15 @@ msgstr "Статус" #: cps/templates/tasks.html:16 msgid "Progress" -msgstr "Прогрес" +msgstr "Поступ" #: cps/templates/tasks.html:17 msgid "Run Time" -msgstr "Тривалість" +msgstr "Час роботи" #: cps/templates/tasks.html:19 -#, fuzzy msgid "Message" -msgstr "Обʼєднати" +msgstr "Об'єднати" #: cps/templates/tasks.html:21 msgid "Actions" @@ -3702,11 +3751,11 @@ msgstr "Дії" #: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." -msgstr "" +msgstr "Це завдання буде скасовано. Весь поступ цього завдання буде збережено." #: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." -msgstr "" +msgstr "Якщо це заплановане завдання, воно буде знову виконане в наступний запланований момент часу." #: cps/templates/user_edit.html:20 msgid "Reset user Password" @@ -3714,11 +3763,11 @@ msgstr "Скинути пароль користувача" #: cps/templates/user_edit.html:28 msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" -msgstr "" +msgstr "Надіслати на адресу е-пошти е-читалки. Кілька адрес вписуйте через кому" #: cps/templates/user_edit.html:43 msgid "Language of Books" -msgstr "Показувати книги на мовах" +msgstr "Показувати книги мовами" #: cps/templates/user_edit.html:54 msgid "OAuth Settings" @@ -3726,15 +3775,15 @@ msgstr "Налаштування OAuth" #: cps/templates/user_edit.html:56 msgid "Link" -msgstr "" +msgstr "Поєднати" #: cps/templates/user_edit.html:58 msgid "Unlink" -msgstr "" +msgstr "Роз'єднати" #: cps/templates/user_edit.html:64 msgid "Kobo Sync Token" -msgstr "" +msgstr "Токен синхронізації Kobo" #: cps/templates/user_edit.html:66 msgid "Create/View" @@ -3742,52 +3791,47 @@ msgstr "Створити/Переглянути" #: cps/templates/user_edit.html:70 msgid "Force full kobo sync" -msgstr "" +msgstr "Примусова повна синхронізація Kobo" #: cps/templates/user_edit.html:88 msgid "Add allowed/Denied Custom Column Values" -msgstr "" +msgstr "Додати дозволені/заборонені значення власних стовпчиків" #: cps/templates/user_edit.html:137 msgid "Sync only books in selected shelves with Kobo" -msgstr "" +msgstr "Синхронізувати з Kobo лише книги на вибаних полицях" #: cps/templates/user_edit.html:147 cps/templates/user_table.html:169 msgid "Delete User" -msgstr "Видалити цього користувача" +msgstr "Видалити користувача" #: cps/templates/user_edit.html:159 msgid "Generate Kobo Auth URL" -msgstr "" +msgstr "Генерувати URL синхронізаціх Kobo" #: cps/templates/user_table.html:80 cps/templates/user_table.html:103 msgid "Select..." msgstr "Обрати..." #: cps/templates/user_table.html:131 -#, fuzzy msgid "Edit User" -msgstr "Керування сервером" +msgstr "Редагувати користувача" #: cps/templates/user_table.html:134 -#, fuzzy msgid "Enter Username" -msgstr "Виберіть ім'я користувача" +msgstr "Вкажіть псевдо" #: cps/templates/user_table.html:135 -#, fuzzy msgid "Enter Email" -msgstr "Kindle" +msgstr "Вкажіть е-пошту" #: cps/templates/user_table.html:136 -#, fuzzy msgid "Enter eReader Email" -msgstr "Kindle" +msgstr "Вкажіть е-пошту е-читалки" #: cps/templates/user_table.html:136 -#, fuzzy msgid "eReader Email" -msgstr "Kindle" +msgstr "Е-пошта е-читалки" #: cps/templates/user_table.html:137 msgid "Locale" @@ -3795,60 +3839,57 @@ msgstr "Локалізація" #: cps/templates/user_table.html:138 msgid "Visible Book Languages" -msgstr "" +msgstr "Мови видимих книг" #: cps/templates/user_table.html:139 msgid "Edit Allowed Tags" -msgstr "" +msgstr "Редагувати дозволені мітки" #: cps/templates/user_table.html:139 msgid "Allowed Tags" -msgstr "Дозволені теги" +msgstr "Дозволені мітки" #: cps/templates/user_table.html:140 msgid "Edit Denied Tags" -msgstr "Змінити заборонені теги" +msgstr "Редагувати заборонені мітки" #: cps/templates/user_table.html:140 msgid "Denied Tags" -msgstr "Заборонені теги" +msgstr "Заборонені мітки" #: cps/templates/user_table.html:141 msgid "Edit Allowed Column Values" -msgstr "" +msgstr "Редагувати дозволені значення стовпчиків" #: cps/templates/user_table.html:141 msgid "Allowed Column Values" -msgstr "" +msgstr "Дозволені значення стовпчиків" #: cps/templates/user_table.html:142 msgid "Edit Denied Column Values" -msgstr "" +msgstr "Редагувати заборонені значення стовпчиків" #: cps/templates/user_table.html:142 msgid "Denied Column Values" -msgstr "" +msgstr "Заборонені значення стовпчиків" #: cps/templates/user_table.html:144 -#, fuzzy msgid "Change Password" -msgstr "Дозволити зміну пароля" +msgstr "Змінити пароль" #: cps/templates/user_table.html:147 msgid "View" -msgstr "Показати" +msgstr "Перегляд" #: cps/templates/user_table.html:150 -#, fuzzy msgid "Edit Public Shelves" -msgstr "Змінити книжкову полицю" +msgstr "Редагувати публічну полицю" #: cps/templates/user_table.html:152 msgid "Sync selected Shelves with Kobo" -msgstr "" +msgstr "Синхронізувати вибрані полиці з Kobo" #: cps/templates/user_table.html:156 -#, fuzzy msgid "Show Read/Unread Section" -msgstr "Показувати вибір серії" +msgstr "Показати розділ прочитаних/непрочитаних" diff --git a/cps/translations/vi/LC_MESSAGES/messages.mo b/cps/translations/vi/LC_MESSAGES/messages.mo index 6e1811a82e24c1b5944d48372de7f915ee27b0b4..ed2220b37bc7944517183cebe47f628d0e0807b7 100644 GIT binary patch delta 29 lcmaF*gz@PU#tqu`>=p`!W>y9kn~m%f85u1$PjR?t2mq=93SR&K delta 29 lcmaF*gz@PU#tqu`?1l=4hE^s\n" "Language: vi\n" @@ -13,519 +13,558 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" +"Generated-By: Babel 2.18.0\n" #: cps/about.py:85 msgid "Statistics" msgstr "Thống kê" -#: cps/admin.py:151 +#: cps/admin.py:154 msgid "Server restarted, please reload page." msgstr "" -#: cps/admin.py:153 +#: cps/admin.py:156 msgid "Performing Server shutdown, please close window." msgstr "" -#: cps/admin.py:161 +#: cps/admin.py:164 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:164 +#: cps/admin.py:167 msgid "Unknown command" msgstr "Lệnh không tồn tại" -#: cps/admin.py:175 +#: cps/admin.py:178 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "" -#: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 -#: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 -#: cps/uploader.py:117 +#: cps/admin.py:211 cps/editbooks.py:825 cps/editbooks.py:875 +#: cps/editbooks.py:1564 cps/templates/remote_login_verify.html:8 +#: cps/templates/remote_login_verify.html:10 cps/updater.py:615 +#: cps/uploader.py:117 cps/uploader.py:126 msgid "Unknown" msgstr "Không rõ" -#: cps/admin.py:233 +#: cps/admin.py:236 msgid "Admin page" msgstr "Trang admin" -#: cps/admin.py:253 +#: cps/admin.py:256 msgid "Basic Configuration" msgstr "Thiết lập cơ bản" -#: cps/admin.py:291 +#: cps/admin.py:294 msgid "UI Configuration" msgstr "Thiết lập UI" -#: cps/admin.py:315 cps/admin.py:1002 cps/db.py:809 cps/search.py:150 -#: cps/web.py:750 +#: cps/admin.py:318 cps/admin.py:1005 cps/db.py:809 cps/search.py:150 +#: cps/web.py:752 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "" -#: cps/admin.py:333 cps/templates/admin.html:51 +#: cps/admin.py:336 cps/templates/admin.html:51 msgid "Edit Users" msgstr "Chỉnh sửa người dùng" -#: cps/admin.py:378 cps/opds.py:559 cps/templates/grid.html:14 +#: cps/admin.py:381 cps/opds.py:559 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Tất cả" -#: cps/admin.py:401 cps/admin.py:1432 +#: cps/admin.py:404 cps/admin.py:1460 msgid "User not found" msgstr "Không tìm thấy user" -#: cps/admin.py:415 +#: cps/admin.py:418 #, python-brace-format msgid "{} users deleted successfully" msgstr "{} người dung đã đươc xoá thành công" -#: cps/admin.py:438 cps/templates/config_view_edit.html:133 +#: cps/admin.py:441 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Hiển thị tất cả" -#: cps/admin.py:459 cps/admin.py:465 +#: cps/admin.py:462 cps/admin.py:468 msgid "Malformed request" msgstr "Yêu cầu không đúng định dạng" -#: cps/admin.py:477 cps/admin.py:2078 +#: cps/admin.py:480 cps/admin.py:2156 msgid "Guest Name can't be changed" msgstr "Tên người dung khách không thể thay đổi" -#: cps/admin.py:489 +#: cps/admin.py:492 msgid "Guest can't have this role" msgstr "Khách không thể mang vai trò này" -#: cps/admin.py:501 cps/admin.py:2032 +#: cps/admin.py:504 cps/admin.py:2110 msgid "No admin user remaining, can't remove admin role" msgstr "Không còn người dùng quản trị, không thể xoá vai trò admin" -#: cps/admin.py:505 cps/admin.py:519 +#: cps/admin.py:508 cps/admin.py:522 msgid "Value has to be true or false" msgstr "Giá trị phải là true hoặc false" -#: cps/admin.py:507 +#: cps/admin.py:510 msgid "Invalid role" msgstr "Vai trò không hợp lệ" -#: cps/admin.py:511 +#: cps/admin.py:514 msgid "Guest can't have this view" msgstr "Tài khoản khách không có màn hình này" -#: cps/admin.py:521 +#: cps/admin.py:524 msgid "Invalid view" msgstr "View không hợp lệ" -#: cps/admin.py:524 +#: cps/admin.py:527 msgid "Guest's Locale is determined automatically and can't be set" msgstr "Ngôn ngữ của khách được xác định tự động và không thể đặt được" -#: cps/admin.py:528 +#: cps/admin.py:531 msgid "No Valid Locale Given" msgstr "Địa chỉ cung cấp không hợp lệ" -#: cps/admin.py:539 +#: cps/admin.py:542 msgid "No Valid Book Language Given" msgstr "Ngôn ngữ sách không hợp lệ" -#: cps/admin.py:541 cps/editbooks.py:243 cps/editbooks.py:428 -#: cps/editbooks.py:430 +#: cps/admin.py:544 cps/editbooks.py:260 cps/editbooks.py:445 +#: cps/editbooks.py:447 msgid "Parameter not found" msgstr "Tham số không tồn tại" -#: cps/admin.py:578 +#: cps/admin.py:581 msgid "Invalid Read Column" msgstr "Cột đọc không hợp lệ" -#: cps/admin.py:584 +#: cps/admin.py:587 msgid "Invalid Restricted Column" msgstr "Cột bị hạn chế không hợp lệ" -#: cps/admin.py:604 cps/admin.py:1903 +#: cps/admin.py:607 cps/admin.py:1981 msgid "Calibre-Web configuration updated" msgstr "Thiết lập Calibre-Web đã cập nhật" -#: cps/admin.py:616 +#: cps/admin.py:619 msgid "Do you really want to delete the Kobo Token?" msgstr "Bạn có thực sự muốn xóa Kobo Token không?" -#: cps/admin.py:618 +#: cps/admin.py:621 msgid "Do you really want to delete this domain?" msgstr "Bạn có thực sự muốn xóa miền này không?" -#: cps/admin.py:620 +#: cps/admin.py:623 msgid "Do you really want to delete this user?" msgstr "Bạn có thực sự muốn xóa người dùng này không?" -#: cps/admin.py:622 +#: cps/admin.py:625 msgid "Do you really want to delete this book?" msgstr "" -#: cps/admin.py:624 +#: cps/admin.py:627 msgid "Are you sure you want to delete this shelf?" msgstr "Bạn có chắc chắn muốn xóa giá này không?" -#: cps/admin.py:626 +#: cps/admin.py:629 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Bạn có chắc chắn muốn thay đổi ngôn ngữ của những người dùng đã chọn?" -#: cps/admin.py:628 +#: cps/admin.py:631 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "Bạn có chắc chắn muốn thay đổi ngôn ngữ sách hiển thị cho (những) người dùng đã chọn không?" -#: cps/admin.py:630 +#: cps/admin.py:633 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "Bạn có chắc chắn muốn thay đổi vai trò đã chọn cho (những) người dùng đã chọn không?" -#: cps/admin.py:632 +#: cps/admin.py:635 msgid "Are you sure you want to change the archive status for the selected book(s)?" msgstr "" -#: cps/admin.py:634 +#: cps/admin.py:637 msgid "Are you sure you want to change the read status for the selected book(s)?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:639 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Bạn có chắc chắn muốn thay đổi những giới hạn đã chọn cho người dung?" -#: cps/admin.py:638 +#: cps/admin.py:641 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "Bạn có chắc chắn muốn thay đổi các giới hạn hiển thị đã chọn cho (những) người dùng đã chọn không?" -#: cps/admin.py:641 +#: cps/admin.py:644 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Bạn có chắc chắn muốn thay đổi hành vi đồng bộ hóa giá cho (những) người dùng đã chọn không?" -#: cps/admin.py:643 +#: cps/admin.py:646 msgid "Are you sure you want to change Calibre library location?" msgstr "Bạn có chắc chắn muốn thay đổi vị trí thư viện Calibre không?" -#: cps/admin.py:645 +#: cps/admin.py:648 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "" -#: cps/admin.py:648 +#: cps/admin.py:651 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Bạn có chắc chắn muốn xóa cơ sở dữ liệu đồng bộ của Calibre-Web để bắt buộc đồng bộ hóa hoàn toàn với Kobo Reader của mình không?" -#: cps/admin.py:891 cps/admin.py:897 cps/admin.py:907 cps/admin.py:917 +#: cps/admin.py:894 cps/admin.py:900 cps/admin.py:910 cps/admin.py:920 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Từ chối" -#: cps/admin.py:893 cps/admin.py:899 cps/admin.py:909 cps/admin.py:919 +#: cps/admin.py:896 cps/admin.py:902 cps/admin.py:912 cps/admin.py:922 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Cho phép" -#: cps/admin.py:952 +#: cps/admin.py:955 #, python-brace-format msgid "{} sync entries deleted" msgstr "{} mục nhập đồng bộ hóa đã bị xóa" -#: cps/admin.py:993 +#: cps/admin.py:996 msgid "Tag not found" msgstr "Tag không tồn tại" -#: cps/admin.py:1011 +#: cps/admin.py:1014 msgid "Invalid Action" msgstr "Hành động không hợp lệ" -#: cps/admin.py:1138 +#: cps/admin.py:1137 +#, python-format +msgid "Invalid reverse proxy trusted IP/CIDR entry: %(entry)s" +msgstr "" + +#: cps/admin.py:1148 +#, python-format +msgid "Invalid %(label)s: %(value)s" +msgstr "" + +#: cps/admin.py:1166 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "" -#: cps/admin.py:1183 +#: cps/admin.py:1211 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "Vị trí tệp nhật ký không hợp lệ, vui lòng nhập đường dẫn chính xác" -#: cps/admin.py:1189 +#: cps/admin.py:1217 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1223 +#: cps/admin.py:1251 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "" -#: cps/admin.py:1229 +#: cps/admin.py:1257 msgid "Please Enter a LDAP Service Account and Password" msgstr "" -#: cps/admin.py:1232 +#: cps/admin.py:1260 msgid "Please Enter a LDAP Service Account" msgstr "" -#: cps/admin.py:1237 +#: cps/admin.py:1265 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1239 +#: cps/admin.py:1267 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1243 +#: cps/admin.py:1271 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1245 +#: cps/admin.py:1273 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1252 +#: cps/admin.py:1280 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1254 +#: cps/admin.py:1282 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1261 +#: cps/admin.py:1289 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1292 cps/templates/admin.html:53 +#: cps/admin.py:1320 cps/templates/admin.html:53 msgid "Add New User" msgstr "Thêm người dùng mới" -#: cps/admin.py:1301 cps/templates/admin.html:100 +#: cps/admin.py:1329 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "" -#: cps/admin.py:1320 +#: cps/admin.py:1348 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1340 cps/admin.py:1343 cps/admin.py:1728 cps/admin.py:1887 -#: cps/admin.py:1985 cps/admin.py:2106 cps/editbooks.py:169 -#: cps/editbooks.py:755 cps/editbooks.py:1474 cps/shelf.py:90 cps/shelf.py:144 +#: cps/admin.py:1368 cps/admin.py:1371 cps/admin.py:1756 cps/admin.py:1965 +#: cps/admin.py:2063 cps/admin.py:2184 cps/editbooks.py:170 +#: cps/editbooks.py:772 cps/editbooks.py:1518 cps/shelf.py:90 cps/shelf.py:144 #: cps/shelf.py:194 cps/shelf.py:237 cps/shelf.py:287 cps/shelf.py:327 -#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:160 cps/web.py:1526 +#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:161 cps/web.py:1536 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Lỗi cơ sở dữ liệu: %(error)s." -#: cps/admin.py:1350 +#: cps/admin.py:1378 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1353 +#: cps/admin.py:1381 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "" -#: cps/admin.py:1355 +#: cps/admin.py:1383 msgid "Please configure your e-mail address first..." msgstr "" -#: cps/admin.py:1357 +#: cps/admin.py:1385 msgid "Email Server Settings updated" msgstr "" -#: cps/admin.py:1380 cps/templates/admin.html:195 +#: cps/admin.py:1408 cps/templates/admin.html:211 msgid "Edit Scheduled Tasks Settings" msgstr "" -#: cps/admin.py:1392 +#: cps/admin.py:1420 msgid "Invalid start time for task specified" msgstr "" -#: cps/admin.py:1397 +#: cps/admin.py:1425 msgid "Invalid duration for task specified" msgstr "" -#: cps/admin.py:1407 +#: cps/admin.py:1435 msgid "Scheduled tasks settings updated" msgstr "" -#: cps/admin.py:1417 cps/admin.py:1466 cps/admin.py:2102 cps/web.py:1325 +#: cps/admin.py:1445 cps/admin.py:1494 cps/admin.py:2180 cps/web.py:1335 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Lỗi không xác định xảy ra. Xin hãy thử lại sau." -#: cps/admin.py:1421 +#: cps/admin.py:1449 msgid "Settings DB is not Writeable" msgstr "" -#: cps/admin.py:1451 cps/admin.py:2094 +#: cps/admin.py:1479 cps/admin.py:2172 #, python-format msgid "Edit User %(nick)s" msgstr "Chỉnh sửa người dùng %(nick)s" -#: cps/admin.py:1463 +#: cps/admin.py:1491 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "" -#: cps/admin.py:1469 +#: cps/admin.py:1497 msgid "Oops! Please configure the SMTP mail settings." msgstr "" -#: cps/admin.py:1480 +#: cps/admin.py:1508 msgid "Logfile viewer" msgstr "" -#: cps/admin.py:1546 +#: cps/admin.py:1574 msgid "Requesting update package" msgstr "" -#: cps/admin.py:1547 +#: cps/admin.py:1575 msgid "Downloading update package" msgstr "" -#: cps/admin.py:1548 +#: cps/admin.py:1576 msgid "Unzipping update package" msgstr "Đang giải nén tệp cập nhật" -#: cps/admin.py:1549 +#: cps/admin.py:1577 msgid "Replacing files" msgstr "They thế tập tin" -#: cps/admin.py:1550 +#: cps/admin.py:1578 msgid "Database connections are closed" msgstr "Liên kết cơ sở dữ liệu đã được đóng" -#: cps/admin.py:1551 +#: cps/admin.py:1579 msgid "Stopping server" msgstr "Đang dừng server" -#: cps/admin.py:1552 +#: cps/admin.py:1580 msgid "Update finished, please press okay and reload page" msgstr "Cập nhật hoàn tất, ấn okay và tải lại trang" -#: cps/admin.py:1553 cps/admin.py:1554 cps/admin.py:1555 cps/admin.py:1556 -#: cps/admin.py:1557 cps/admin.py:1558 +#: cps/admin.py:1581 cps/admin.py:1582 cps/admin.py:1583 cps/admin.py:1584 +#: cps/admin.py:1585 cps/admin.py:1586 msgid "Update failed:" msgstr "Cập nhật thất bại:" -#: cps/admin.py:1553 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1581 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "Lỗi HTTP" -#: cps/admin.py:1554 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1582 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Lỗi kết nối" -#: cps/admin.py:1555 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1583 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "" -#: cps/admin.py:1556 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1584 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Lỗi chung" -#: cps/admin.py:1557 +#: cps/admin.py:1585 msgid "Update file could not be saved in temp dir" msgstr "File cập nhật không thể được lưu trong thư mục tạm thời" -#: cps/admin.py:1558 +#: cps/admin.py:1586 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1582 +#: cps/admin.py:1610 msgid "Failed to extract at least One LDAP User" msgstr "" -#: cps/admin.py:1627 +#: cps/admin.py:1655 msgid "Failed to Create at Least One LDAP User" msgstr "" -#: cps/admin.py:1640 +#: cps/admin.py:1668 #, python-format msgid "Error: %(ldaperror)s" msgstr "" -#: cps/admin.py:1644 +#: cps/admin.py:1672 msgid "Error: No user returned in response of LDAP server" msgstr "" -#: cps/admin.py:1680 +#: cps/admin.py:1708 msgid "At Least One LDAP User Not Found in Database" msgstr "" -#: cps/admin.py:1682 +#: cps/admin.py:1710 #, python-brace-format msgid "{} User Successfully Imported" msgstr "" -#: cps/admin.py:1740 +#: cps/admin.py:1768 msgid "Books path not valid" msgstr "" -#: cps/admin.py:1746 +#: cps/admin.py:1774 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1774 +#: cps/admin.py:1802 msgid "DB is not Writeable" msgstr "" -#: cps/admin.py:1788 +#: cps/admin.py:1816 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1792 +#: cps/admin.py:1820 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1872 +#: cps/admin.py:1846 +msgid "Kepubify binary not found" +msgstr "" + +#: cps/admin.py:1894 +msgid "reverse proxy login header name" +msgstr "" + +#: cps/admin.py:1904 +msgid "reverse proxy shared secret header name" +msgstr "" + +#: cps/admin.py:1913 +msgid "Please configure both reverse proxy shared secret header name and secret" +msgstr "" + +#: cps/admin.py:1917 +msgid "Please configure reverse proxy shared secret header name and secret or disable the feature" +msgstr "" + +#: cps/admin.py:1922 +msgid "Please configure at least one trusted reverse proxy IP or CIDR" +msgstr "" + +#: cps/admin.py:1946 msgid "Password length has to be between 1 and 40" msgstr "" -#: cps/admin.py:1926 +#: cps/admin.py:1957 cps/helper.py:1007 +msgid "Please specify a valid UnRar directory" +msgstr "" + +#: cps/admin.py:2004 msgid "Database Settings updated" msgstr "Thiết lập cơ sở dữ lieu đã được cập nhật" -#: cps/admin.py:1934 +#: cps/admin.py:2012 msgid "Database Configuration" msgstr "Thiết lập cơ sở dữ lieu :)))" -#: cps/admin.py:1949 cps/web.py:1295 +#: cps/admin.py:2027 cps/web.py:1305 msgid "Oops! Please complete all fields." msgstr "Hãy điền hết các trường!" -#: cps/admin.py:1958 +#: cps/admin.py:2036 msgid "E-mail is not from valid domain" msgstr "Địa chỉ email không hợp lệ" -#: cps/admin.py:1964 +#: cps/admin.py:2042 msgid "Add new user" msgstr "Thêm người dùng mới" -#: cps/admin.py:1975 +#: cps/admin.py:2053 #, python-format msgid "User '%(user)s' created" msgstr "Người dùng '%(user)s' đã được tạo" -#: cps/admin.py:1981 +#: cps/admin.py:2059 msgid "Oops! An account already exists for this Email. or name." msgstr "Người dùng với địa chỉ email hoặc tên đã tồn tại." -#: cps/admin.py:2011 +#: cps/admin.py:2089 #, python-format msgid "User '%(nick)s' deleted" msgstr "Người dùng '%(nick)s' đã bị xoá" -#: cps/admin.py:2014 +#: cps/admin.py:2092 msgid "Can't delete Guest User" msgstr "Không thể xoá người dùng khách" -#: cps/admin.py:2017 +#: cps/admin.py:2095 msgid "No admin user remaining, can't delete user" msgstr "" -#: cps/admin.py:2072 cps/web.py:1475 +#: cps/admin.py:2150 cps/web.py:1485 msgid "Email can't be empty and has to be a valid Email" msgstr "" -#: cps/admin.py:2098 +#: cps/admin.py:2176 #, python-format msgid "User '%(nick)s' updated" msgstr "Người dùng '%(nick)s' đã được cập nhật" @@ -538,145 +577,153 @@ msgstr "Người dùng '%(nick)s' đã được cập nhật" msgid "Search" msgstr "Tìm kiếm" -#: cps/converter.py:31 +#: cps/converter.py:32 msgid "not installed" msgstr "chưa cài đặt" -#: cps/converter.py:32 +#: cps/converter.py:33 msgid "Execution permissions missing" msgstr "" -#: cps/db.py:1129 cps/templates/config_edit.html:207 +#: cps/db.py:1129 cps/templates/config_edit.html:229 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:565 cps/web.py:599 cps/web.py:644 cps/web.py:684 cps/web.py:711 -#: cps/web.py:998 cps/web.py:1028 cps/web.py:1073 cps/web.py:1101 -#: cps/web.py:1140 +#: cps/web.py:567 cps/web.py:601 cps/web.py:646 cps/web.py:686 cps/web.py:713 +#: cps/web.py:1000 cps/web.py:1030 cps/web.py:1075 cps/web.py:1103 +#: cps/web.py:1142 msgid "None" msgstr "None" -#: cps/editbooks.py:155 +#: cps/editbooks.py:156 #, python-format msgid "File %(file)s uploaded" msgstr "File %(file)s đã được tải lên" -#: cps/editbooks.py:184 +#: cps/editbooks.py:185 msgid "Source or destination format for conversion missing" msgstr "Thiếu định dạng nguồn hoặc đích để convert" -#: cps/editbooks.py:192 +#: cps/editbooks.py:189 cps/editbooks.py:197 +msgid "Source format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:201 +msgid "Destination format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:209 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "" -#: cps/editbooks.py:196 +#: cps/editbooks.py:213 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Có lỗi xảy ra khi chuyển đổi định dạng cho sach: %(res)s" -#: cps/editbooks.py:297 +#: cps/editbooks.py:314 msgid "Changes successfully applied" msgstr "" -#: cps/editbooks.py:317 +#: cps/editbooks.py:334 msgid "Value is missing on request" msgstr "" -#: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 -#: cps/editbooks.py:1146 cps/web.py:532 cps/web.py:1567 cps/web.py:1613 -#: cps/web.py:1663 +#: cps/editbooks.py:336 cps/editbooks.py:343 cps/editbooks.py:644 +#: cps/editbooks.py:1170 cps/web.py:534 cps/web.py:1577 cps/web.py:1623 +#: cps/web.py:1673 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "" -#: cps/editbooks.py:673 cps/editbooks.py:1503 +#: cps/editbooks.py:690 cps/editbooks.py:1547 msgid "User has no rights to upload cover" msgstr "" -#: cps/editbooks.py:694 cps/editbooks.py:938 +#: cps/editbooks.py:711 cps/editbooks.py:961 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "" -#: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 +#: cps/editbooks.py:726 cps/editbooks.py:935 cps/editbooks.py:1306 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "%(langname)s không phải là ngôn ngữ hợp lệ" -#: cps/editbooks.py:737 +#: cps/editbooks.py:754 msgid "Metadata successfully updated" msgstr "Metadata đã được cập nhật thành công" -#: cps/editbooks.py:760 +#: cps/editbooks.py:777 #, python-brace-format msgid "Error editing book: {}" msgstr "" -#: cps/editbooks.py:856 +#: cps/editbooks.py:879 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "" -#: cps/editbooks.py:950 cps/editbooks.py:1420 +#: cps/editbooks.py:973 cps/editbooks.py:1464 msgid "File type isn't allowed to be uploaded to this server" msgstr "" -#: cps/editbooks.py:956 cps/editbooks.py:1431 +#: cps/editbooks.py:979 cps/editbooks.py:1475 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "" -#: cps/editbooks.py:960 cps/editbooks.py:1436 +#: cps/editbooks.py:983 cps/editbooks.py:1480 msgid "File to be uploaded must have an extension" msgstr "" -#: cps/editbooks.py:968 +#: cps/editbooks.py:992 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "" -#: cps/editbooks.py:988 +#: cps/editbooks.py:1012 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "" -#: cps/editbooks.py:1041 +#: cps/editbooks.py:1065 msgid "Book Format Successfully Deleted" msgstr "" -#: cps/editbooks.py:1044 cps/editbooks.py:1061 +#: cps/editbooks.py:1068 cps/editbooks.py:1085 msgid "Book Successfully Deleted" msgstr "" -#: cps/editbooks.py:1065 +#: cps/editbooks.py:1089 msgid "You are missing permissions to delete books" msgstr "" -#: cps/editbooks.py:1139 +#: cps/editbooks.py:1163 #, python-brace-format msgid "Book with id \"{}\" could not be deleted: not found" msgstr "" -#: cps/editbooks.py:1181 +#: cps/editbooks.py:1205 msgid "edit metadata" msgstr "" -#: cps/editbooks.py:1234 +#: cps/editbooks.py:1267 #, python-format msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1425 +#: cps/editbooks.py:1469 msgid "User has no rights to upload additional file formats" msgstr "" -#: cps/editbooks.py:1449 +#: cps/editbooks.py:1493 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "" -#: cps/editbooks.py:1456 +#: cps/editbooks.py:1500 #, python-format msgid "Failed to store file %(file)s." msgstr "Lưu file thất bại %(file)s." -#: cps/editbooks.py:1481 +#: cps/editbooks.py:1525 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "" @@ -687,9 +734,9 @@ msgstr "" #: cps/error_handler.py:108 cps/templates/layout.html:69 #: cps/templates/layout.html:104 cps/templates/login.html:27 -#: cps/templates/register.html:17 cps/web.py:1292 cps/web.py:1296 -#: cps/web.py:1302 cps/web.py:1326 cps/web.py:1330 cps/web.py:1343 -#: cps/web.py:1346 +#: cps/templates/register.html:17 cps/web.py:1302 cps/web.py:1306 +#: cps/web.py:1312 cps/web.py:1336 cps/web.py:1340 cps/web.py:1353 +#: cps/web.py:1356 msgid "Register" msgstr "Đăng ký" @@ -710,7 +757,7 @@ msgstr "" msgid "%(format)s format not found for book id: %(book)d" msgstr "" -#: cps/helper.py:94 cps/tasks/convert.py:91 +#: cps/helper.py:94 cps/tasks/convert.py:92 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "" @@ -896,10 +943,6 @@ msgstr "" msgid "Cover" msgstr "" -#: cps/helper.py:1006 -msgid "UnRar binary file not found" -msgstr "" - #: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "" @@ -930,7 +973,7 @@ msgstr "" msgid "Error executing Calibre" msgstr "" -#: cps/helper.py:1154 cps/templates/admin.html:216 +#: cps/helper.py:1154 cps/templates/admin.html:232 msgid "Queue all books for metadata backup" msgstr "" @@ -952,7 +995,7 @@ msgstr "" msgid "This %(oauth)s account is already linked to a different user" msgstr "" -#: cps/oauth_bb.py:147 cps/remotelogin.py:131 +#: cps/oauth_bb.py:147 cps/remotelogin.py:150 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "" @@ -1020,25 +1063,29 @@ msgstr "Google Oauth lỗi: {}" msgid "{} Stars" msgstr "{} sao" -#: cps/remotelogin.py:63 cps/templates/layout.html:68 -#: cps/templates/layout.html:103 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1361 -msgid "Login" -msgstr "Đăng nhập" - -#: cps/remotelogin.py:75 cps/remotelogin.py:109 +#: cps/remotelogin.py:46 cps/remotelogin.py:128 msgid "Token not found" msgstr "Không tìm thấy token" -#: cps/remotelogin.py:84 cps/remotelogin.py:117 +#: cps/remotelogin.py:55 cps/remotelogin.py:136 msgid "Token has expired" msgstr "Token đã hết hạn" -#: cps/remotelogin.py:93 +#: cps/remotelogin.py:86 cps/remotelogin.py:112 cps/templates/layout.html:68 +#: cps/templates/layout.html:103 cps/templates/login.html:4 +#: cps/templates/login.html:21 cps/web.py:1371 +msgid "Login" +msgstr "Đăng nhập" + +#: cps/remotelogin.py:100 +msgid "Token already approved" +msgstr "" + +#: cps/remotelogin.py:108 msgid "Success! Please return to your device" msgstr "Thành công! Hãy quay lại thiết bị của bạn" -#: cps/render_template.py:41 cps/web.py:421 +#: cps/render_template.py:41 cps/web.py:423 msgid "Books" msgstr "Sách" @@ -1063,7 +1110,7 @@ msgstr "Sách đã tải" msgid "Show Downloaded Books" msgstr "Hiển thị sách đã tải" -#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:436 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:438 msgid "Top Rated Books" msgstr "Top sách được đánh giá cao" @@ -1072,7 +1119,7 @@ msgid "Show Top Rated Books" msgstr "Hiện thị top những sách được đánh giá cao" #: cps/render_template.py:61 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:769 +#: cps/templates/index.xml:67 cps/web.py:771 msgid "Read Books" msgstr "Sách đã đọc" @@ -1081,7 +1128,7 @@ msgid "Show Read and Unread" msgstr "" #: cps/render_template.py:65 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:772 +#: cps/templates/index.xml:74 cps/web.py:774 msgid "Unread Books" msgstr "Sách chưa đọc" @@ -1099,7 +1146,7 @@ msgid "Show Random Books" msgstr "Hiển thị sách ngẫu nhiên" #: cps/render_template.py:71 cps/templates/book_table.html:93 -#: cps/templates/index.xml:97 cps/web.py:1144 +#: cps/templates/index.xml:97 cps/web.py:1146 msgid "Categories" msgstr "Chủ đề" @@ -1109,7 +1156,7 @@ msgstr "" #: cps/render_template.py:74 cps/templates/book_edit.html:86 #: cps/templates/book_table.html:94 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1034 cps/web.py:1046 +#: cps/templates/search_form.html:70 cps/web.py:1036 cps/web.py:1048 msgid "Series" msgstr "Series" @@ -1127,7 +1174,7 @@ msgid "Show Author Section" msgstr "" #: cps/render_template.py:81 cps/templates/book_table.html:98 -#: cps/templates/index.xml:88 cps/web.py:1002 +#: cps/templates/index.xml:88 cps/web.py:1004 msgid "Publishers" msgstr "Nhà phát hành" @@ -1137,7 +1184,7 @@ msgstr "" #: cps/render_template.py:84 cps/templates/book_table.html:96 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1116 +#: cps/web.py:1118 msgid "Languages" msgstr "Ngôn ngữ" @@ -1161,7 +1208,7 @@ msgstr "Định dạng file" msgid "Show File Formats Section" msgstr "" -#: cps/render_template.py:95 cps/web.py:795 +#: cps/render_template.py:95 cps/web.py:797 msgid "Archived Books" msgstr "Sách đã lưu trữ" @@ -1169,7 +1216,7 @@ msgstr "Sách đã lưu trữ" msgid "Show Archived Books" msgstr "" -#: cps/render_template.py:100 cps/web.py:831 +#: cps/render_template.py:100 cps/web.py:833 msgid "Books List" msgstr "Danh sách sách" @@ -1402,150 +1449,154 @@ msgstr "" msgid "No release information available" msgstr "" -#: cps/templates/index.html:6 cps/web.py:448 +#: cps/templates/index.html:6 cps/web.py:450 msgid "Discover (Random Books)" msgstr "" -#: cps/web.py:484 +#: cps/web.py:486 msgid "Hot Books (Most Downloaded)" msgstr "" -#: cps/web.py:515 +#: cps/web.py:517 #, python-format msgid "Downloaded books by %(user)s" msgstr "" -#: cps/web.py:548 +#: cps/web.py:550 #, python-format msgid "Author: %(name)s" msgstr "" -#: cps/web.py:584 +#: cps/web.py:586 #, python-format msgid "Publisher: %(name)s" msgstr "" -#: cps/web.py:612 +#: cps/web.py:614 #, python-format msgid "Series: %(serie)s" msgstr "" -#: cps/web.py:626 +#: cps/web.py:628 msgid "Rating: None" msgstr "" -#: cps/web.py:635 +#: cps/web.py:637 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:666 +#: cps/web.py:668 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:701 +#: cps/web.py:703 #, python-format msgid "Category: %(name)s" msgstr "" -#: cps/web.py:730 +#: cps/web.py:732 #, python-format msgid "Language: %(name)s" msgstr "" -#: cps/templates/admin.html:16 cps/web.py:974 +#: cps/templates/admin.html:16 cps/web.py:976 msgid "Downloads" msgstr "Tải xuống" -#: cps/web.py:1076 +#: cps/web.py:1078 msgid "Ratings list" msgstr "Danh sách đánh giá" -#: cps/web.py:1103 +#: cps/web.py:1105 msgid "File formats list" msgstr "Danh sách định dạng file" -#: cps/web.py:1264 +#: cps/web.py:1272 +msgid "Book format not supported" +msgstr "" + +#: cps/web.py:1274 msgid "Please configure the SMTP mail settings first..." msgstr "" -#: cps/web.py:1270 +#: cps/web.py:1280 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "" -#: cps/web.py:1273 +#: cps/web.py:1283 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "" -#: cps/web.py:1275 +#: cps/web.py:1285 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "" -#: cps/web.py:1291 cps/web.py:1342 +#: cps/web.py:1301 cps/web.py:1352 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "" -#: cps/web.py:1328 +#: cps/web.py:1338 msgid "Oops! Your Email is not allowed." msgstr "Email của bạn không được cho phép để đăng ký" -#: cps/web.py:1331 +#: cps/web.py:1341 msgid "Success! Confirmation Email has been sent." msgstr "" -#: cps/web.py:1376 cps/web.py:1390 +#: cps/web.py:1386 cps/web.py:1400 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1399 +#: cps/web.py:1409 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1406 +#: cps/web.py:1416 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1411 +#: cps/web.py:1421 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1415 cps/web.py:1440 +#: cps/web.py:1425 cps/web.py:1450 msgid "Wrong Username or Password" msgstr "" -#: cps/web.py:1422 +#: cps/web.py:1432 msgid "New Password was sent to your email address" msgstr "" -#: cps/web.py:1426 +#: cps/web.py:1436 msgid "An unknown error occurred. Please try again later." msgstr "" -#: cps/web.py:1428 +#: cps/web.py:1438 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1436 +#: cps/web.py:1446 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1501 cps/web.py:1551 +#: cps/web.py:1511 cps/web.py:1561 #, python-format msgid "%(name)s's Profile" msgstr "" -#: cps/web.py:1517 +#: cps/web.py:1527 msgid "Success! Profile Updated" msgstr "" -#: cps/web.py:1521 +#: cps/web.py:1531 msgid "Oops! An account already exists for this Email." msgstr "Tìm thấy một tài khoản đã toàn tại cho địa chỉ email này" @@ -1557,46 +1608,46 @@ msgstr "" msgid "Delete temp folder contents" msgstr "" -#: cps/tasks/convert.py:112 +#: cps/tasks/convert.py:113 #, python-format msgid "%(book)s send to E-Reader" msgstr "" -#: cps/tasks/convert.py:177 +#: cps/tasks/convert.py:180 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "" -#: cps/tasks/convert.py:211 +#: cps/tasks/convert.py:214 #, python-format msgid "%(format)s format not found on disk" msgstr "" -#: cps/tasks/convert.py:215 +#: cps/tasks/convert.py:218 msgid "Ebook converter failed with unknown error" msgstr "" -#: cps/tasks/convert.py:234 +#: cps/tasks/convert.py:237 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "" -#: cps/tasks/convert.py:254 +#: cps/tasks/convert.py:257 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "" -#: cps/tasks/convert.py:291 cps/tasks/convert.py:342 +#: cps/tasks/convert.py:294 cps/tasks/convert.py:345 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:322 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "" -#: cps/tasks/convert.py:347 +#: cps/tasks/convert.py:350 msgid "Convert" msgstr "" @@ -1682,7 +1733,7 @@ msgstr "Chỉnh sửa" #: cps/templates/admin.html:25 cps/templates/book_edit.html:17 #: cps/templates/book_table.html:131 cps/templates/book_table.html:180 -#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:115 +#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:117 #: cps/templates/user_edit.html:67 cps/templates/user_table.html:149 msgid "Delete" msgstr "Xoá" @@ -1772,128 +1823,145 @@ msgstr "Đăng nhập bằng Magic Link" msgid "Reverse Proxy Login" msgstr "" -#: cps/templates/admin.html:154 cps/templates/config_edit.html:176 +#: cps/templates/admin.html:154 cps/templates/config_edit.html:180 msgid "Reverse Proxy Header Name" msgstr "" -#: cps/templates/admin.html:159 +#: cps/templates/admin.html:158 +msgid "Reverse Proxy Trusted IPs/CIDRs" +msgstr "" + +#: cps/templates/admin.html:162 cps/templates/config_edit.html:193 +msgid "Reverse Proxy Shared Secret Header Name" +msgstr "" + +#: cps/templates/admin.html:166 +msgid "Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/admin.html:170 +msgid "Reverse Proxy Shared Secret Configured" +msgstr "" + +#: cps/templates/admin.html:175 msgid "Edit Calibre Database Configuration" msgstr "Chỉnh sửa thiết lập cơ sở dữ liệu Calibre" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:176 msgid "Edit Basic Configuration" msgstr "Chỉnh sửa thiết lập cơ bản" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:177 msgid "Edit UI Configuration" msgstr "Chỉnh sửa thiết lập UI" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:183 msgid "Scheduled Tasks" msgstr "" -#: cps/templates/admin.html:170 cps/templates/schedule_edit.html:12 +#: cps/templates/admin.html:186 cps/templates/schedule_edit.html:12 #: cps/templates/tasks.html:18 msgid "Start Time" msgstr "" -#: cps/templates/admin.html:174 cps/templates/schedule_edit.html:20 +#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:20 msgid "Maximum Duration" msgstr "" -#: cps/templates/admin.html:178 cps/templates/schedule_edit.html:29 +#: cps/templates/admin.html:194 cps/templates/schedule_edit.html:29 msgid "Generate Thumbnails" msgstr "" -#: cps/templates/admin.html:182 +#: cps/templates/admin.html:198 msgid "Generate series cover thumbnails" msgstr "" -#: cps/templates/admin.html:186 cps/templates/admin.html:208 +#: cps/templates/admin.html:202 cps/templates/admin.html:224 #: cps/templates/schedule_edit.html:37 msgid "Reconnect Calibre Database" msgstr "" -#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 +#: cps/templates/admin.html:206 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" msgstr "" -#: cps/templates/admin.html:197 +#: cps/templates/admin.html:213 msgid "Refresh Thumbnail Cache" msgstr "" -#: cps/templates/admin.html:203 +#: cps/templates/admin.html:219 msgid "Administration" msgstr "Quản trị" -#: cps/templates/admin.html:204 +#: cps/templates/admin.html:220 msgid "Download Debug Package" msgstr "Tải xuống package debug" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:221 msgid "View Logs" msgstr "Xem logs" -#: cps/templates/admin.html:211 +#: cps/templates/admin.html:227 msgid "Restart" msgstr "Khởi động lại" -#: cps/templates/admin.html:212 +#: cps/templates/admin.html:228 msgid "Shutdown" msgstr "Tắt" -#: cps/templates/admin.html:221 +#: cps/templates/admin.html:237 msgid "Version Information" msgstr "" -#: cps/templates/admin.html:225 +#: cps/templates/admin.html:241 msgid "Version" msgstr "Phiên bản" -#: cps/templates/admin.html:226 +#: cps/templates/admin.html:242 msgid "Details" msgstr "Chi tiết" -#: cps/templates/admin.html:232 +#: cps/templates/admin.html:248 msgid "Current Version" msgstr "Phiên bản hiện tại" -#: cps/templates/admin.html:239 +#: cps/templates/admin.html:255 msgid "Check for Update" msgstr "Kiểm tra cập nhật" -#: cps/templates/admin.html:240 +#: cps/templates/admin.html:256 msgid "Perform Update" msgstr "Bắt đầu cập nhật" -#: cps/templates/admin.html:253 +#: cps/templates/admin.html:269 msgid "Are you sure you want to restart?" msgstr "Bạn có chắc chắn muốn khởi động lại?" -#: cps/templates/admin.html:258 cps/templates/admin.html:272 -#: cps/templates/admin.html:292 cps/templates/config_db.html:82 +#: cps/templates/admin.html:274 cps/templates/admin.html:288 +#: cps/templates/admin.html:308 cps/templates/config_db.html:82 msgid "OK" msgstr "Ok" -#: cps/templates/admin.html:259 cps/templates/admin.html:273 +#: cps/templates/admin.html:275 cps/templates/admin.html:289 #: cps/templates/book_edit.html:220 cps/templates/book_table.html:162 #: cps/templates/book_table.html:181 cps/templates/book_table.html:201 #: cps/templates/book_table.html:221 cps/templates/book_table.html:241 #: cps/templates/book_table.html:261 cps/templates/book_table.html:316 -#: cps/templates/config_db.html:66 cps/templates/config_edit.html:431 +#: cps/templates/config_db.html:66 cps/templates/config_edit.html:453 #: cps/templates/config_view_edit.html:175 cps/templates/detail.html:350 -#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:98 -#: cps/templates/modal_dialogs.html:116 cps/templates/modal_dialogs.html:134 +#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:100 +#: cps/templates/modal_dialogs.html:118 cps/templates/modal_dialogs.html:136 +#: cps/templates/remote_login_verify.html:16 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 #: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Huỷ bỏ" -#: cps/templates/admin.html:271 +#: cps/templates/admin.html:287 msgid "Are you sure you want to shutdown?" msgstr "Bạn có chắc muốn tắt?" -#: cps/templates/admin.html:283 +#: cps/templates/admin.html:299 msgid "Updating, please do not reload this page" msgstr "Đang update, làm ơn đừng load lại trang này" @@ -2134,7 +2202,7 @@ msgid "Fetch Metadata" msgstr "Fetch Metadata" #: cps/templates/book_edit.html:219 cps/templates/config_db.html:65 -#: cps/templates/config_edit.html:430 cps/templates/config_view_edit.html:174 +#: cps/templates/config_edit.html:452 cps/templates/config_view_edit.html:174 #: cps/templates/email_edit.html:65 cps/templates/schedule_edit.html:44 #: cps/templates/shelf_edit.html:25 cps/templates/shelf_order.html:41 #: cps/templates/user_edit.html:142 @@ -2506,214 +2574,234 @@ msgstr "" msgid "Allow Reverse Proxy Authentication" msgstr "" -#: cps/templates/config_edit.html:183 -msgid "Login type" -msgstr "Kiểu đăng nhập" - -#: cps/templates/config_edit.html:185 -msgid "Use Standard Authentication" +#: cps/templates/config_edit.html:176 +msgid "Security Warning" msgstr "" -#: cps/templates/config_edit.html:187 -msgid "Use LDAP Authentication" +#: cps/templates/config_edit.html:177 +msgid "Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled." msgstr "" -#: cps/templates/config_edit.html:190 -msgid "Use OAuth" +#: cps/templates/config_edit.html:184 +msgid "Reverse Proxy Trusted IPs/CIDRs (Comma Separated)" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "Enable Reverse Proxy Shared Secret Header" msgstr "" #: cps/templates/config_edit.html:197 -msgid "LDAP Server Host Name or IP Address" -msgstr "" - -#: cps/templates/config_edit.html:201 -msgid "LDAP Server Port" +msgid "Reverse Proxy Shared Secret" msgstr "" #: cps/templates/config_edit.html:205 -msgid "LDAP Encryption" -msgstr "" +msgid "Login type" +msgstr "Kiểu đăng nhập" -#: cps/templates/config_edit.html:208 -msgid "TLS" +#: cps/templates/config_edit.html:207 +msgid "Use Standard Authentication" msgstr "" #: cps/templates/config_edit.html:209 -msgid "SSL" +msgid "Use LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:213 -msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" +#: cps/templates/config_edit.html:212 +msgid "Use OAuth" msgstr "" -#: cps/templates/config_edit.html:220 -msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" +#: cps/templates/config_edit.html:219 +msgid "LDAP Server Host Name or IP Address" +msgstr "" + +#: cps/templates/config_edit.html:223 +msgid "LDAP Server Port" msgstr "" #: cps/templates/config_edit.html:227 +msgid "LDAP Encryption" +msgstr "" + +#: cps/templates/config_edit.html:230 +msgid "TLS" +msgstr "" + +#: cps/templates/config_edit.html:231 +msgid "SSL" +msgstr "" + +#: cps/templates/config_edit.html:235 +msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" +msgstr "" + +#: cps/templates/config_edit.html:242 +msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" +msgstr "" + +#: cps/templates/config_edit.html:249 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" msgstr "" -#: cps/templates/config_edit.html:236 +#: cps/templates/config_edit.html:258 msgid "LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:260 msgid "Anonymous" msgstr "" -#: cps/templates/config_edit.html:239 +#: cps/templates/config_edit.html:261 msgid "Unauthenticated" msgstr "" -#: cps/templates/config_edit.html:240 +#: cps/templates/config_edit.html:262 msgid "Simple" msgstr "" -#: cps/templates/config_edit.html:245 +#: cps/templates/config_edit.html:267 msgid "LDAP Administrator Username" msgstr "" -#: cps/templates/config_edit.html:251 +#: cps/templates/config_edit.html:273 msgid "LDAP Administrator Password" msgstr "" -#: cps/templates/config_edit.html:256 +#: cps/templates/config_edit.html:278 msgid "LDAP Distinguished Name (DN)" msgstr "" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:282 msgid "LDAP User Object Filter" msgstr "" -#: cps/templates/config_edit.html:265 +#: cps/templates/config_edit.html:287 msgid "LDAP Server is OpenLDAP?" msgstr "" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:289 msgid "Following Settings are Needed For User Import" msgstr "" -#: cps/templates/config_edit.html:269 +#: cps/templates/config_edit.html:291 msgid "LDAP Group Object Filter" msgstr "" -#: cps/templates/config_edit.html:273 +#: cps/templates/config_edit.html:295 msgid "LDAP Group Name" msgstr "" -#: cps/templates/config_edit.html:277 +#: cps/templates/config_edit.html:299 msgid "LDAP Group Members Field" msgstr "" -#: cps/templates/config_edit.html:281 +#: cps/templates/config_edit.html:303 msgid "LDAP Member User Filter Detection" msgstr "" -#: cps/templates/config_edit.html:283 +#: cps/templates/config_edit.html:305 msgid "Autodetect" msgstr "" -#: cps/templates/config_edit.html:284 +#: cps/templates/config_edit.html:306 msgid "Custom Filter" msgstr "" -#: cps/templates/config_edit.html:289 +#: cps/templates/config_edit.html:311 msgid "LDAP Member User Filter" msgstr "" -#: cps/templates/config_edit.html:300 +#: cps/templates/config_edit.html:322 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:303 +#: cps/templates/config_edit.html:325 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:307 +#: cps/templates/config_edit.html:329 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:323 +#: cps/templates/config_edit.html:345 msgid "External binaries" msgstr "" -#: cps/templates/config_edit.html:329 +#: cps/templates/config_edit.html:351 msgid "Path to Calibre Binaries" msgstr "" -#: cps/templates/config_edit.html:337 +#: cps/templates/config_edit.html:359 msgid "Calibre E-Book Converter Settings" msgstr "" -#: cps/templates/config_edit.html:340 +#: cps/templates/config_edit.html:362 msgid "Path to Kepubify E-Book Converter" msgstr "" -#: cps/templates/config_edit.html:348 +#: cps/templates/config_edit.html:370 msgid "Location of Unrar binary" msgstr "" -#: cps/templates/config_edit.html:364 +#: cps/templates/config_edit.html:386 msgid "Security Settings" msgstr "" -#: cps/templates/config_edit.html:372 +#: cps/templates/config_edit.html:394 msgid "Limit failed login attempts" msgstr "" -#: cps/templates/config_edit.html:376 +#: cps/templates/config_edit.html:398 msgid "Configure Backend for Limiter" msgstr "" -#: cps/templates/config_edit.html:380 +#: cps/templates/config_edit.html:402 msgid "Options for Limiter Backend" msgstr "" -#: cps/templates/config_edit.html:386 +#: cps/templates/config_edit.html:408 msgid "Check if file extensions matches file content on upload" msgstr "" -#: cps/templates/config_edit.html:389 +#: cps/templates/config_edit.html:411 msgid "Session protection" msgstr "" -#: cps/templates/config_edit.html:391 +#: cps/templates/config_edit.html:413 msgid "Basic" msgstr "" -#: cps/templates/config_edit.html:392 +#: cps/templates/config_edit.html:414 msgid "Strong" msgstr "" -#: cps/templates/config_edit.html:397 +#: cps/templates/config_edit.html:419 msgid "User Password policy" msgstr "" -#: cps/templates/config_edit.html:401 +#: cps/templates/config_edit.html:423 msgid "Minimum password length" msgstr "" -#: cps/templates/config_edit.html:406 +#: cps/templates/config_edit.html:428 msgid "Enforce number" msgstr "" -#: cps/templates/config_edit.html:410 +#: cps/templates/config_edit.html:432 msgid "Enforce lowercase characters" msgstr "" -#: cps/templates/config_edit.html:414 +#: cps/templates/config_edit.html:436 msgid "Enforce uppercase characters" msgstr "" -#: cps/templates/config_edit.html:418 +#: cps/templates/config_edit.html:440 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" msgstr "" -#: cps/templates/config_edit.html:422 +#: cps/templates/config_edit.html:444 msgid "Enforce special characters" msgstr "" @@ -3180,27 +3268,27 @@ msgstr "" msgid "Choose File Location" msgstr "Chọn file location" -#: cps/templates/modal_dialogs.html:81 +#: cps/templates/modal_dialogs.html:82 msgid "type" msgstr "kiểu" -#: cps/templates/modal_dialogs.html:82 +#: cps/templates/modal_dialogs.html:83 msgid "name" msgstr "tên" -#: cps/templates/modal_dialogs.html:83 +#: cps/templates/modal_dialogs.html:84 msgid "size" msgstr "kích thước" -#: cps/templates/modal_dialogs.html:89 +#: cps/templates/modal_dialogs.html:90 msgid "Parent Directory" msgstr "Thư mục cha" -#: cps/templates/modal_dialogs.html:97 +#: cps/templates/modal_dialogs.html:99 msgid "Select" msgstr "Chọn" -#: cps/templates/modal_dialogs.html:133 cps/templates/tasks.html:46 +#: cps/templates/modal_dialogs.html:135 cps/templates/tasks.html:46 msgid "Ok" msgstr "Ok" @@ -3456,6 +3544,31 @@ msgstr "Một khi xác nhận, bạn sẽ tự động đăng nhập trên thi msgid "This verification link will expire in 10 minutes." msgstr "Link xác nhận này sẽ hết hạn trong 10 phút." +#: cps/templates/remote_login_verify.html:4 +msgid "Approve Magic Link Login" +msgstr "" + +#: cps/templates/remote_login_verify.html:5 +msgid "Review the device that requested access before approving this login." +msgstr "" + +#: cps/templates/remote_login_verify.html:7 +msgid "IP address" +msgstr "" + +#: cps/templates/remote_login_verify.html:9 +msgid "Browser" +msgstr "" + +#: cps/templates/remote_login_verify.html:12 +#, python-format +msgid "If you approve this request, the device that started it will be logged in as %(username)s." +msgstr "" + +#: cps/templates/remote_login_verify.html:15 +msgid "Approve Login" +msgstr "" + #: cps/templates/schedule_edit.html:33 msgid "Generate Series Cover Thumbnails" msgstr "" diff --git a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo index 62fb6236667c7d3cd6a8bd3c1f88620a252a6b2b..4677ef0b3e8974e54494c984cb4761cd1b4b80b8 100644 GIT binary patch delta 14185 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 Mb$h^O_Gc>W01%^CP5=M^ delta 14242 zcmaEKlX>+m=K6a=EK?a67#MPx85m?37#M1#K|BP$W5&QB$-uyH*NlNdf`NhIyBPz6 zEdv9CfH?z$Ap--0pE(1AG6MrcgE<3(4g&+j5_5<-7tI+MgcukY-a+|{77Ppu3=9l% z77Pq(3=9nR77PsL3=H)QX%-9&91IK$^DGz`LKzqsmRm3|gfTEM{Iy_Uuw-Ch2(e^f zuwYUFIl4l%ZdgoHO#U7R(ex}7=jrX z81~vRFnBXCFbLW+FvKx1FvQwJ)a|inV9;h@VBmCMU{GXWU@&!Hs0aHz+yUZ)DhCDz zkb@c=Ac<+Z10)2FI6xBNEe8e$HUFtxq>4k zh%Fo$7+4q>7@Qp$7=#%Z7(5&y_QXK>Nsjdp1!Yi)YDY*=H#$OsdaffR)vj`cIN&tY z;HQp|#Pz`u;v)$s1_lEL1_l==h{H>r7#OS=7#J2gL2}7mCy2%T&Jc%*Ix{fnGB7YG z)H^dUXo9j4RG`8c;^Sq`3=H863=DgmAwCjufyB9v3xx0P0&!5h3j>2JC=Eg7r$gm8 zLHVa#AW`|$1rq1KTp%9gbY);rWnf^aS9OI1skbY{f*@B&+~m4K6!yC^FlaC^FsycE zU{GOTV7TJSz~Iin!0^+RfkBXgfx*!Y5@o?|5Pey05Qp`+LE?Uy8v{ck0|NuAJH+AX z?hyOx-NA{po}tYhQh-cwhXl@`?wOtA!GE~EJA4qQa>;s9@A3l({ zKtg1003_ z0x@W32m^x?0|UeU5J*rng+kQHheGt}g+jzVLm@$(77DRAHx%N)`cQ~{y`i8qRL{UL zFBFn0S3xCqg+fB$bSNZCuK@5})1N(?UFAU;Pr!YvIdxSv} zUqTopt&~E=d%_qPL_zs~Nf;!5?t;=kp&Bg0Aq9(XI3&m#!XZIFD;(mZwc!w-?+=G~ z;9NMw;rGHJQSv$*5^|go5TA=gK=dg^KtjeOf`OqP)I_q5fYe6G5s-pmVgw|09*uxx z$EOjHf{8B@LYqcHEQo>9RgsXWn-R&t;LpIoussrzHrS&e?F88IjrAM3?J+6TU|khsr-@|$8Az_sP#SV%~oh=nA|7qO5KV2y*Aqgx*b zG1w&z;*g*?h)Of>=GP}2m60d5J9 z#2b{rz~INgz%VfZ;(-SVkfQrj0>omQM2NV1A|!1@CW6yMJwtvXBxvdqAwf7h5t7>1 zCqjI3G7(bZJxPS51&$<0+7L~Grj;a!cyJOVsuGeQL7$cc$t~SUkp9EGBuG(zJqhBV z`$-@V)iW@>N`m<0R}v%$*^(i&QZmFrcFB;|Y)~?!Nj5JT;f6*A!UD4Dx|TvB$a`|fq{YHS}Mfn z;%Sf|w@!mt;FAUkfz&jJ`r0&z`t@m$T<{?c64XD_AR)k=4v9*+bVyp$NQa15#;9BOTHwyq^w9Y_b`UkcrHI zIJhhW;(-1PNUEQi0Z9WJG8pQ?eY;~B;Kac2KLZkne3=Xk`V0&VBAF12TrwdR`Da3+ zDhw)~lnL=kZYCrI8!{mwvnUhd&|R63v~eaAV*brch(}*!Li(62S@jSF(OD1$8Ceho z1yy7&r1q@JWdL_j>i6bCO0plh5R1k0AR!`?2l0t!9wcNO z^B@ig$b)3BU?{&L50Xf$^B@M#&x1tSqdW!%Jq8Abw|S5>A(Ibra6~>NJ9a?mdWM7f z5SRVRXJGJPU|^6gfW&1=0mOi|0!S-&YXPJa`3Wj+UkK5cR|qM1`U@dZcdroQfM11> z?8{mN2_eZMNbb-oVqh?1U|=vV0)^w+2;$=lMUbGoUj)gw0>u!Y z1{FiZ%Zee1XgQSsuNYF<=$Al3G`0l7uPK4lnyX46QFpO~0X$OjtAv5U3Y7oVOCdd% zq*6!}%qoSrbbcu$zpf~Sq=9Wv@qML`C^%jU@!^|NNR%;@LDCFw8N>tPWe|C_GDvQ) zDuaZC50oEU#=uYy8YswzDy%Gn1YK_#q(qxh1}W)QltFy{sSIL~SUDv1DwjiYgBFyw zFNes7KfEf3zIpkO$?E?Dzp{ z5nlyFUbzAyZdUbF%uvgO4JNGLG+>uI%!+5G7`Cq0A;&ZbqNRT^ML3|os1#v(;RK5hNzOf1t zMYHRn0;`}Jk5oY{z5(UmuY#n3&ros3YKTKQsv#DNR6~5KSPfC9RSgMA3n<^Y8j>ag zt07}R(bbUNbbK{5|Ie(3xbzCtpgYx&MEJBC5_hkvAtfJk4a5S@8i>!up|pAp#3$xZ zzFQ3>TZYv@EH1Bsc&HJouA>Ix@aYiq>KT?mB{tPSg8m>>!{r)K{$yadRRgI$S!*G2 zZcz*AYzEgtEGUDDH`GELHoF#50V+f%MliFgVsh zT;yE`shuL~AP&i|gA_cCb&xpRR|hGgFV{h$fW01)n1t&gm5^mUBr1IBAw_X$JtQp@ zLFu-7NaCCYr8m_xFi3&&|EYS2g-@ZK(eKbfssB)MmIjEyVhs=j<)O531H{Mf4G@Qi zH$Z%z2c=sYAc=EU10;&JK*bM3)!%GjV5kR;;e2R-1QAms#HY$o+M*GX27DVK7NgaCP*AxG(n2S z>?TO+oY4dgawyH-3~88HL+R9JNTt#brS~^O(#-p2NKq@*0!b^*EfDdv7D#nGu?1qz z-j;fZ&!4wIG;p*+TyEG3vDgC2&w3j71y7rHyTnl5I^J#DS;UATEC021#_H?U1OkZij?G zNIRsmX=#UaI5xFI^j&I)MA7GVNd9N-fM(+kNH(t*hcaY3AU;v-fcQkcgMq<|fq}uO z17cxq2c)E2+yM!x6CDtTe(Zo0r81q6G~v<-=?{c_Q2J&!B!pgegA#2$0|RFd#O0zrkOqWW52#>ZU~uYz1hG#K#DLTuh!0A8 zAaT5`2a*QXLFM=MK+?|H9!NoTr3Vs)?|UGrpSKrco>VU+YK(gs82CW>KcpApqGXT& z0|P^IFC=Iu^+IyR-d;$Mf9Qo+AlU~gU=;cwacSEJi30CF28IyOFnk}x!V`TEhhFW2 zlnZyE>Oc2ELWr@SfuSBWRU+IE@v(M4Bm_+RA&DcfA5vn4LFqgw-PR8&C+77tFqnWw zGW#Lf>_tB$M7SqF$^oefkSJ1~00{}r2@vz$CqNvQJb|GeJT9LN)lfeHVsXa=hzols zK;m}(1V|!UH38z#y%WHRhvE1HNZR=bHIQQ>#6p3IkSGv?@(m|K(uVm&NdC8;2x&8> zPppSDGPg~Hq{^ogAwexU31YF+B#2LaCqWWt(j-Wb&w(W1H+C<5QiUuil3YW ziK^?9AZhC!RQ^5G+%Hi6|N2P~m$6KSSj;gQ5_E=>Awgy}84?8%P=3K=28J3&28O=L zkb;DJDumXZ3eoRB71F$}md2id~GVkJf>-oM5r(glIH3yr$L%dk<%cFs1`~u zod$8p*=dk={k3Tf3~r!Fr|FP5Pk_=>r$c;tYC0qYFGBgOGa%wTP+E8f#C)k4kX+<6 z1Dr_f8HynchK3oCY}Pvi;-k4xh5Mo6AD}eDOo%#xnP3AL6rg8DJ5=5e z%8!Q9Ni!j7DHBZBGceSE84L{lPJV?7hZ63sDR`Vbs;W!VHef^-~3G*Q4 zrbFc$pyIvr80x_@oKv6ztDp)tLizik^wD{cpgjYXe=!e|n7+<~lx(u|Ar3H}4{@N? zd`Ooobv`5ndgep2`GNV6%IW=lNQmhzFo$SNT>x=;&H_l~Qn>)q5ShOKV$hid5FdPA z02vG7nan6JTo0O@ZCMC$!mNc5CvI2>QF#U`{&XQEwftTP2{Z0R5Wd_Zh&sJR5Pj}Y z@#IC23}3tmQcH9%f)r(I7D4jO@kNjd|HmSRdT>8hV=<(NieC&duw*gBz~04>T4Lp5 z$gtJ1#gGw1xg`*FMN1%F?_L5)rjwxJbD-i|q5M5dAdz`>2_!6^FM$M=^ipU$S7Rwe zz!gddErle*_@xjZ&s+*gU2B#?Lh2k;-4m$z$E6UT2`__0s>?En!*Z5ELaG?bZ-&xc z%OK`VtX~GPcsW#J%Q8r-aW_=_+cHSN9>@Ak z5QQO7i4-VZxCxXx85rs|L0r6e6C{dOLFogVAZg~>CWym7Y=X2RIX6RU1%=I!k}iBR zM7(=5q(ED=8Dh?z%@BL*KW&D%kZB8q=7-WUP+D^f#HD6iAVKB{6%U4rCv1T@uy_k3 z$g8$MS_(6_KpJhww?G{D87j}S6;c~%L+E;jpskQrT_u#Bz7^7{+qxCfzP-8?;xLtM zki=uS4dU{uZIJxkwG9#yo3}wKm9yIzz)KVUZi9rN<93LA+IEOJ4cj3e>fH{?E%gix z3${Zl+!Na&KKQ&H;!~j=5TD8HfM`_S0g*R=iu*&w!*)P&OY#ng!|HcH@_+vh$dKqp zsQ62$zMoKi3_GE7C%ii$2B<=5M<^W&r7L$rf^6zeNOihrC&Wj0cS0I(-$4d3Ffd5% zf;iM@7o_^N-vz1l!goPx*UViId+K&UMwMpmVqmBTE!uhm)xf_S;$!vQkT}!Z4bk8Z zrIU9<+R^p9Aw7meQ1$0_LoB`udu4GEl_$ERNaQXkf=Gi z7vg}|d+Q+@en2Jo_CX{J_CX!A52C?kAH?FceUNNb0Oc>)2MLLF`yfHR3(7yU4-(`z z_CccJEmWR$Kcwd&z8_K<`PA=+^p7X+hs5cz{SX5m?1vce2FhnV05OR70HhvQJpdVD z@IL@4z$P4kl%OXMK+?#Q0}yjr4?@&g9E9YC%7YMd=N*LPy86urAsR0pgtQjl9E4;a z$wQD3h&==ep_D@qA67xddk#TDYBH2w02N<*2$E*DK=~IAfwCC`!}UWDd;UYkr4EDj z*E1+W7z}!cAwg_?7~*o*!;tJ#aTwzB4Tm8PIRRCF?=U3pUmu2~5tbv6s1ZK`QRjUG z;(^2?kTI8xBVY>|Wx+6{z|z#~``lHCq=3l}IO4{_qKizMCf?^J82mAwG0F38|*zPeMX0 z`6Q$gDuD9aPeL3pI ztx*0csQxP#AO+RK3y_eIx(K$fp277Z#HB$OAsQp0bRI+jLo<|~a1j!;bD{jLP<@A> z{F6}rH7Nfslzw#)QXqYY@`W!!`jiTnKp|Vtz+ig`q9FJZBq;MQL4t5PRD9bdhyyQO zf`q`$OOTT622?)(8bdt;XxVxFHHgpqp%P24L0r1^8YF5CU4!`e9@Kyr zQ2F;z`VUke=XHq1lGh>nHLpV)V0InSxwX9xX+zdthdAii^?FF$y|@msK=KBp98kUi z2}+L}kkp!Z12Qb#a|4n#9^QZ$%y1Jzv)_bR$OomRZ$k8I+=N7}<4s7*DdZ-^fzxk7 zO3dZ;P=UucA&KuZ%z#@EgEekJ4AQ>^$!;FEAO^Ep^6%b; zMA-)@pXUyQFAt@y??CJezXLY6o+0ZF#HGzp1rwnBHFqE(uoFrjfYQgI^5>xZ+fe?a zJCMrh{T)b2sd*O?wc&RmJ)(}gkf_}crJsOl(A>#Ah=d-L4u;Yd_aH8vdk^Bn4fh~E zId%_{1|Ho5`+$M*K7^LK4-q$p(n0qjwP4|WNYs|zhj?i2eMnkcav$3NUw0o80tcZA z&fSMtbQP-bBUJo1R2|a;h=ceaKrB{$0I|sK0i=j^dH_kR)ej(v_re2+dB35w_(Mp) z!T2Gx{~z`ck}69dLV~XKA*7MH`5`2c-F*njE#|gO?b7egugEiN}y2w0#UQDCRLF-)26BSg;Z*zTq*% zfqNfAMmnB9hIBT0pFpC_@(Co)eV#zlMDr8KIKtj1kPu^j3ehhEnyv=z@Ns(zu^{p( z#Nq@fKNrd`c?$7qBb1)_6k^fBr;w1@0#$zvs{Za%NG0v9Esrb4Z+=feO5UYWVsb(hpF00Wm1$1;n8xFCZ3Fzkm!@O?d%HBTHXE zLgc^;NI`WO%76X>V$rV`kaC6nC4^Rm(De+?FCiKeUqW13@)D8;=D&nkyzeC>$j-fl z7)ETI;q!?I1Pu=^{*j8zWg=B0asr`9Qfijq(k!c zHMIS&{s!Vx+c%JE*Y^#?M=@_84oQacbKgJ=DuMFb-#{9teNg@!D82X%#Nt&@{*5;f z58Q{+Ki)vv1A=cE7&f0V^9hv0W}r>g7#zx-?H diff --git a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po index eeca0bffd..6ff89be76 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: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-08-01 11:42+0200\n" +"POT-Creation-Date: 2026-08-08 16:08+0200\n" "PO-Revision-Date: 2025-12-06 13:53+0800\n" "Last-Translator: qx100\n" "Language: zh_CN\n" @@ -16,519 +16,558 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" +"Generated-By: Babel 2.18.0\n" #: cps/about.py:85 msgid "Statistics" msgstr "统计" -#: cps/admin.py:151 +#: cps/admin.py:154 msgid "Server restarted, please reload page." msgstr "服务器已重启,请刷新页面。" -#: cps/admin.py:153 +#: cps/admin.py:156 msgid "Performing Server shutdown, please close window." msgstr "正在关闭服务器,请关闭窗口。" -#: cps/admin.py:161 +#: cps/admin.py:164 msgid "Success! Database Reconnected" msgstr "数据库重新连接成功" -#: cps/admin.py:164 +#: cps/admin.py:167 msgid "Unknown command" msgstr "未知命令" -#: cps/admin.py:175 +#: cps/admin.py:178 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "成功!书籍已排队进行元数据备份,请检查任务列表以获取结果" -#: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 -#: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 -#: cps/uploader.py:117 +#: cps/admin.py:211 cps/editbooks.py:825 cps/editbooks.py:875 +#: cps/editbooks.py:1564 cps/templates/remote_login_verify.html:8 +#: cps/templates/remote_login_verify.html:10 cps/updater.py:615 +#: cps/uploader.py:117 cps/uploader.py:126 msgid "Unknown" msgstr "未知" -#: cps/admin.py:233 +#: cps/admin.py:236 msgid "Admin page" msgstr "管理页" -#: cps/admin.py:253 +#: cps/admin.py:256 msgid "Basic Configuration" msgstr "基本配置" -#: cps/admin.py:291 +#: cps/admin.py:294 msgid "UI Configuration" msgstr "界面配置" -#: cps/admin.py:315 cps/admin.py:1002 cps/db.py:809 cps/search.py:150 -#: cps/web.py:750 +#: cps/admin.py:318 cps/admin.py:1005 cps/db.py:809 cps/search.py:150 +#: cps/web.py:752 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "自定义列号:%(column)d 在 Calibre 数据库中不存在" -#: cps/admin.py:333 cps/templates/admin.html:51 +#: cps/admin.py:336 cps/templates/admin.html:51 msgid "Edit Users" msgstr "管理用户" -#: cps/admin.py:378 cps/opds.py:559 cps/templates/grid.html:14 +#: cps/admin.py:381 cps/opds.py:559 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "全部" -#: cps/admin.py:401 cps/admin.py:1432 +#: cps/admin.py:404 cps/admin.py:1460 msgid "User not found" msgstr "找不到用户" -#: cps/admin.py:415 +#: cps/admin.py:418 #, python-brace-format msgid "{} users deleted successfully" msgstr "成功删除 {} 个用户" -#: cps/admin.py:438 cps/templates/config_view_edit.html:133 +#: cps/admin.py:441 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "显示全部" -#: cps/admin.py:459 cps/admin.py:465 +#: cps/admin.py:462 cps/admin.py:468 msgid "Malformed request" msgstr "格式错误的请求" -#: cps/admin.py:477 cps/admin.py:2078 +#: cps/admin.py:480 cps/admin.py:2156 msgid "Guest Name can't be changed" msgstr "访客名称无法更改" -#: cps/admin.py:489 +#: cps/admin.py:492 msgid "Guest can't have this role" msgstr "访客无法拥有此角色" -#: cps/admin.py:501 cps/admin.py:2032 +#: cps/admin.py:504 cps/admin.py:2110 msgid "No admin user remaining, can't remove admin role" msgstr "没有其余管理员账户,无法删除管理员角色" -#: cps/admin.py:505 cps/admin.py:519 +#: cps/admin.py:508 cps/admin.py:522 msgid "Value has to be true or false" msgstr "值必须为 true 或 false" -#: cps/admin.py:507 +#: cps/admin.py:510 msgid "Invalid role" msgstr "无效角色" -#: cps/admin.py:511 +#: cps/admin.py:514 msgid "Guest can't have this view" msgstr "访客无法查看此页面" -#: cps/admin.py:521 +#: cps/admin.py:524 msgid "Invalid view" msgstr "无效页面" -#: cps/admin.py:524 +#: cps/admin.py:527 msgid "Guest's Locale is determined automatically and can't be set" msgstr "无法设置访客的本地化,该项设置的值将自动检测" -#: cps/admin.py:528 +#: cps/admin.py:531 msgid "No Valid Locale Given" msgstr "无可用本地化" -#: cps/admin.py:539 +#: cps/admin.py:542 msgid "No Valid Book Language Given" msgstr "无有效书籍语言" -#: cps/admin.py:541 cps/editbooks.py:243 cps/editbooks.py:428 -#: cps/editbooks.py:430 +#: cps/admin.py:544 cps/editbooks.py:260 cps/editbooks.py:445 +#: cps/editbooks.py:447 msgid "Parameter not found" msgstr "参数未找到" -#: cps/admin.py:578 +#: cps/admin.py:581 msgid "Invalid Read Column" msgstr "无效的阅读栏目" -#: cps/admin.py:584 +#: cps/admin.py:587 msgid "Invalid Restricted Column" msgstr "无效的限制栏目" -#: cps/admin.py:604 cps/admin.py:1903 +#: cps/admin.py:607 cps/admin.py:1981 msgid "Calibre-Web configuration updated" msgstr "Calibre-Web 配置已更新" -#: cps/admin.py:616 +#: cps/admin.py:619 msgid "Do you really want to delete the Kobo Token?" msgstr "您确定删除 Kobo 令牌吗?" -#: cps/admin.py:618 +#: cps/admin.py:621 msgid "Do you really want to delete this domain?" msgstr "您确定要删除此域吗?" -#: cps/admin.py:620 +#: cps/admin.py:623 msgid "Do you really want to delete this user?" msgstr "您确定要删除此用户吗?" -#: cps/admin.py:622 +#: cps/admin.py:625 msgid "Do you really want to delete this book?" msgstr "您确定要删除这本书吗?" -#: cps/admin.py:624 +#: cps/admin.py:627 msgid "Are you sure you want to delete this shelf?" msgstr "您确定要删除此书架吗?" -#: cps/admin.py:626 +#: cps/admin.py:629 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "您确定要修改选定用户的本地化设置吗?" -#: cps/admin.py:628 +#: cps/admin.py:631 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "您确定要修改选定用户的可见书籍语言吗?" -#: cps/admin.py:630 +#: cps/admin.py:633 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "您确定要修改选定用户的选定角色吗?" -#: cps/admin.py:632 +#: cps/admin.py:635 msgid "Are you sure you want to change the archive status for the selected book(s)?" msgstr "您确定要修改所选书籍的归档状态吗?" -#: cps/admin.py:634 +#: cps/admin.py:637 msgid "Are you sure you want to change the read status for the selected book(s)?" msgstr "您确定要修改所选书记的已读状态吗?" -#: cps/admin.py:636 +#: cps/admin.py:639 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "您确定要修改选定用户的选定限制吗?" -#: cps/admin.py:638 +#: cps/admin.py:641 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "您确定要修改选定用户的选定可视化限制吗?" -#: cps/admin.py:641 +#: cps/admin.py:644 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "您确定要更改所选用户的书架同步行为吗?" -#: cps/admin.py:643 +#: cps/admin.py:646 msgid "Are you sure you want to change Calibre library location?" msgstr "您确定要更改 Calibre 库位置吗?" -#: cps/admin.py:645 +#: cps/admin.py:648 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "Calibre-Web 将搜索更新封面,并更新缩略图,这可能需要一段时间?" -#: cps/admin.py:648 +#: cps/admin.py:651 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "您确定要删除 Calibre-Web 的同步数据库以强制与您的 Kobo Reader 进行完全同步吗?" -#: cps/admin.py:891 cps/admin.py:897 cps/admin.py:907 cps/admin.py:917 +#: cps/admin.py:894 cps/admin.py:900 cps/admin.py:910 cps/admin.py:920 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "拒绝" -#: cps/admin.py:893 cps/admin.py:899 cps/admin.py:909 cps/admin.py:919 +#: cps/admin.py:896 cps/admin.py:902 cps/admin.py:912 cps/admin.py:922 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "允许" -#: cps/admin.py:952 +#: cps/admin.py:955 #, python-brace-format msgid "{} sync entries deleted" msgstr "{} 同步项目被删除" -#: cps/admin.py:993 +#: cps/admin.py:996 msgid "Tag not found" msgstr "标签未找到" -#: cps/admin.py:1011 +#: cps/admin.py:1014 msgid "Invalid Action" msgstr "无效的动作" -#: cps/admin.py:1138 +#: cps/admin.py:1137 +#, python-format +msgid "Invalid reverse proxy trusted IP/CIDR entry: %(entry)s" +msgstr "" + +#: cps/admin.py:1148 +#, python-format +msgid "Invalid %(label)s: %(value)s" +msgstr "" + +#: cps/admin.py:1166 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json 未为 Web 应用程序配置" -#: cps/admin.py:1183 +#: cps/admin.py:1211 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "日志文件路径无效,请输入正确的路径" -#: cps/admin.py:1189 +#: cps/admin.py:1217 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "访问日志路径无效,请输入正确的路径" -#: cps/admin.py:1223 +#: cps/admin.py:1251 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "请输入 LDAP 主机、端口、DN 和用户对象标识符" -#: cps/admin.py:1229 +#: cps/admin.py:1257 msgid "Please Enter a LDAP Service Account and Password" msgstr "请输入一个 LDAP 服务账号和密码" -#: cps/admin.py:1232 +#: cps/admin.py:1260 msgid "Please Enter a LDAP Service Account" msgstr "请输入一个 LDAP 服务账号" -#: cps/admin.py:1237 +#: cps/admin.py:1265 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "LDAP 组对象过滤器需要一个具有“%s”格式标识符" -#: cps/admin.py:1239 +#: cps/admin.py:1267 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "LDAP 组对象过滤器的括号不匹配" -#: cps/admin.py:1243 +#: cps/admin.py:1271 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP 用户对象过滤器需要一个具有“%s”格式标识符" -#: cps/admin.py:1245 +#: cps/admin.py:1273 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "LDAP 用户对象过滤器的括号不匹配" -#: cps/admin.py:1252 +#: cps/admin.py:1280 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP 成员用户过滤器需要有一个“%s”格式标识符" -#: cps/admin.py:1254 +#: cps/admin.py:1282 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "LDAP 成员用户过滤器中有不匹配的括号" -#: cps/admin.py:1261 +#: cps/admin.py:1289 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP CA证书、证书或密钥位置无效,请输入正确的路径" -#: cps/admin.py:1292 cps/templates/admin.html:53 +#: cps/admin.py:1320 cps/templates/admin.html:53 msgid "Add New User" msgstr "添加新用户" -#: cps/admin.py:1301 cps/templates/admin.html:100 +#: cps/admin.py:1329 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "编辑邮件服务器设置" -#: cps/admin.py:1320 +#: cps/admin.py:1348 msgid "Success! Gmail Account Verified." msgstr "Gmail 账户验证成功。" -#: cps/admin.py:1340 cps/admin.py:1343 cps/admin.py:1728 cps/admin.py:1887 -#: cps/admin.py:1985 cps/admin.py:2106 cps/editbooks.py:169 -#: cps/editbooks.py:755 cps/editbooks.py:1474 cps/shelf.py:90 cps/shelf.py:144 +#: cps/admin.py:1368 cps/admin.py:1371 cps/admin.py:1756 cps/admin.py:1965 +#: cps/admin.py:2063 cps/admin.py:2184 cps/editbooks.py:170 +#: cps/editbooks.py:772 cps/editbooks.py:1518 cps/shelf.py:90 cps/shelf.py:144 #: cps/shelf.py:194 cps/shelf.py:237 cps/shelf.py:287 cps/shelf.py:327 -#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:160 cps/web.py:1526 +#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:161 cps/web.py:1536 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "数据库错误:%(error)s。" -#: cps/admin.py:1350 +#: cps/admin.py:1378 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "发送给 %(email)s 的测试邮件已加入队列。请检查任务结果" -#: cps/admin.py:1353 +#: cps/admin.py:1381 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "发送测试邮件时出错:%(res)s" -#: cps/admin.py:1355 +#: cps/admin.py:1383 msgid "Please configure your e-mail address first..." msgstr "请先配置您的邮箱地址..." -#: cps/admin.py:1357 +#: cps/admin.py:1385 msgid "Email Server Settings updated" msgstr "邮件服务器设置已更新" -#: cps/admin.py:1380 cps/templates/admin.html:195 +#: cps/admin.py:1408 cps/templates/admin.html:211 msgid "Edit Scheduled Tasks Settings" msgstr "编辑计划任务设置" -#: cps/admin.py:1392 +#: cps/admin.py:1420 msgid "Invalid start time for task specified" msgstr "指定任务的开始时间无效" -#: cps/admin.py:1397 +#: cps/admin.py:1425 msgid "Invalid duration for task specified" msgstr "指定任务的持续时间无效" -#: cps/admin.py:1407 +#: cps/admin.py:1435 msgid "Scheduled tasks settings updated" msgstr "已更新计划任务设置" -#: cps/admin.py:1417 cps/admin.py:1466 cps/admin.py:2102 cps/web.py:1325 +#: cps/admin.py:1445 cps/admin.py:1494 cps/admin.py:2180 cps/web.py:1335 msgid "Oops! An unknown error occurred. Please try again later." msgstr "发生一个未知错误,请稍后再试。" -#: cps/admin.py:1421 +#: cps/admin.py:1449 msgid "Settings DB is not Writeable" msgstr "设置数据库不可写" -#: cps/admin.py:1451 cps/admin.py:2094 +#: cps/admin.py:1479 cps/admin.py:2172 #, python-format msgid "Edit User %(nick)s" msgstr "编辑用户 %(nick)s" -#: cps/admin.py:1463 +#: cps/admin.py:1491 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "用户 %(user)s 的密码已重置" -#: cps/admin.py:1469 +#: cps/admin.py:1497 msgid "Oops! Please configure the SMTP mail settings." msgstr "请先配置 SMTP 邮箱设置..." -#: cps/admin.py:1480 +#: cps/admin.py:1508 msgid "Logfile viewer" msgstr "日志文件查看器" -#: cps/admin.py:1546 +#: cps/admin.py:1574 msgid "Requesting update package" msgstr "正在请求更新包" -#: cps/admin.py:1547 +#: cps/admin.py:1575 msgid "Downloading update package" msgstr "正在下载更新包" -#: cps/admin.py:1548 +#: cps/admin.py:1576 msgid "Unzipping update package" msgstr "正在解压更新包" -#: cps/admin.py:1549 +#: cps/admin.py:1577 msgid "Replacing files" msgstr "正在替换文件" -#: cps/admin.py:1550 +#: cps/admin.py:1578 msgid "Database connections are closed" msgstr "数据库连接已关闭" -#: cps/admin.py:1551 +#: cps/admin.py:1579 msgid "Stopping server" msgstr "正在停止服务器" -#: cps/admin.py:1552 +#: cps/admin.py:1580 msgid "Update finished, please press okay and reload page" msgstr "更新完成,请点击确定并刷新页面" -#: cps/admin.py:1553 cps/admin.py:1554 cps/admin.py:1555 cps/admin.py:1556 -#: cps/admin.py:1557 cps/admin.py:1558 +#: cps/admin.py:1581 cps/admin.py:1582 cps/admin.py:1583 cps/admin.py:1584 +#: cps/admin.py:1585 cps/admin.py:1586 msgid "Update failed:" msgstr "更新失败:" -#: cps/admin.py:1553 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1581 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP 错误" -#: cps/admin.py:1554 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1582 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "连接错误" -#: cps/admin.py:1555 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1583 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "建立连接超时" -#: cps/admin.py:1556 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1584 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "一般错误" -#: cps/admin.py:1557 +#: cps/admin.py:1585 msgid "Update file could not be saved in temp dir" msgstr "更新文件无法保存在临时目录中" -#: cps/admin.py:1558 +#: cps/admin.py:1586 msgid "Files could not be replaced during update" msgstr "更新期间无法替换文件" -#: cps/admin.py:1582 +#: cps/admin.py:1610 msgid "Failed to extract at least One LDAP User" msgstr "未能获得任何 LDAP 用户" -#: cps/admin.py:1627 +#: cps/admin.py:1655 msgid "Failed to Create at Least One LDAP User" msgstr "未能创建任何 LDAP 用户" -#: cps/admin.py:1640 +#: cps/admin.py:1668 #, python-format msgid "Error: %(ldaperror)s" msgstr "错误:%(ldaperror)s" -#: cps/admin.py:1644 +#: cps/admin.py:1672 msgid "Error: No user returned in response of LDAP server" msgstr "错误:在 LDAP 服务器的响应中没有返回用户" -#: cps/admin.py:1680 +#: cps/admin.py:1708 msgid "At Least One LDAP User Not Found in Database" msgstr "数据库中没有找到任何 LDAP 用户" -#: cps/admin.py:1682 +#: cps/admin.py:1710 #, python-brace-format msgid "{} User Successfully Imported" msgstr "{} 用户被成功导入" -#: cps/admin.py:1740 +#: cps/admin.py:1768 msgid "Books path not valid" msgstr "书籍路径无效" -#: cps/admin.py:1746 +#: cps/admin.py:1774 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "数据库路径无效,请输入正确的路径" -#: cps/admin.py:1774 +#: cps/admin.py:1802 msgid "DB is not Writeable" msgstr "数据库不可写入" -#: cps/admin.py:1788 +#: cps/admin.py:1816 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "密钥文件路径无效,请输入正确的路径" -#: cps/admin.py:1792 +#: cps/admin.py:1820 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "证书文件路径无效,请输入正确的路径" -#: cps/admin.py:1872 +#: cps/admin.py:1846 +msgid "Kepubify binary not found" +msgstr "" + +#: cps/admin.py:1894 +msgid "reverse proxy login header name" +msgstr "" + +#: cps/admin.py:1904 +msgid "reverse proxy shared secret header name" +msgstr "" + +#: cps/admin.py:1913 +msgid "Please configure both reverse proxy shared secret header name and secret" +msgstr "" + +#: cps/admin.py:1917 +msgid "Please configure reverse proxy shared secret header name and secret or disable the feature" +msgstr "" + +#: cps/admin.py:1922 +msgid "Please configure at least one trusted reverse proxy IP or CIDR" +msgstr "" + +#: cps/admin.py:1946 msgid "Password length has to be between 1 and 40" msgstr "密码长度必须在1到40之间" -#: cps/admin.py:1926 +#: cps/admin.py:1957 cps/helper.py:1007 +msgid "Please specify a valid UnRar directory" +msgstr "" + +#: cps/admin.py:2004 msgid "Database Settings updated" msgstr "数据库设置已更新" -#: cps/admin.py:1934 +#: cps/admin.py:2012 msgid "Database Configuration" msgstr "数据库配置" -#: cps/admin.py:1949 cps/web.py:1295 +#: cps/admin.py:2027 cps/web.py:1305 msgid "Oops! Please complete all fields." msgstr "请填写所有字段。" -#: cps/admin.py:1958 +#: cps/admin.py:2036 msgid "E-mail is not from valid domain" msgstr "邮箱域名无效" -#: cps/admin.py:1964 +#: cps/admin.py:2042 msgid "Add new user" msgstr "添加新用户" -#: cps/admin.py:1975 +#: cps/admin.py:2053 #, python-format msgid "User '%(user)s' created" msgstr "用户“%(user)s”已创建" -#: cps/admin.py:1981 +#: cps/admin.py:2059 msgid "Oops! An account already exists for this Email. or name." msgstr "使用此邮箱或用户名的账号已经存在。" -#: cps/admin.py:2011 +#: cps/admin.py:2089 #, python-format msgid "User '%(nick)s' deleted" msgstr "用户“%(nick)s”已删除" -#: cps/admin.py:2014 +#: cps/admin.py:2092 msgid "Can't delete Guest User" msgstr "无法删除访客用户" -#: cps/admin.py:2017 +#: cps/admin.py:2095 msgid "No admin user remaining, can't delete user" msgstr "管理员账户不存在,无法删除用户" -#: cps/admin.py:2072 cps/web.py:1475 +#: cps/admin.py:2150 cps/web.py:1485 msgid "Email can't be empty and has to be a valid Email" msgstr "电子邮件地址不能为空,并且必须是有效的电子邮件" -#: cps/admin.py:2098 +#: cps/admin.py:2176 #, python-format msgid "User '%(nick)s' updated" msgstr "用户“%(nick)s”已更新" @@ -541,145 +580,153 @@ msgstr "用户“%(nick)s”已更新" msgid "Search" msgstr "搜索" -#: cps/converter.py:31 +#: cps/converter.py:32 msgid "not installed" msgstr "未安装" -#: cps/converter.py:32 +#: cps/converter.py:33 msgid "Execution permissions missing" msgstr "缺少执行权限" -#: cps/db.py:1129 cps/templates/config_edit.html:207 +#: cps/db.py:1129 cps/templates/config_edit.html:229 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:565 cps/web.py:599 cps/web.py:644 cps/web.py:684 cps/web.py:711 -#: cps/web.py:998 cps/web.py:1028 cps/web.py:1073 cps/web.py:1101 -#: cps/web.py:1140 +#: cps/web.py:567 cps/web.py:601 cps/web.py:646 cps/web.py:686 cps/web.py:713 +#: cps/web.py:1000 cps/web.py:1030 cps/web.py:1075 cps/web.py:1103 +#: cps/web.py:1142 msgid "None" msgstr "无" -#: cps/editbooks.py:155 +#: cps/editbooks.py:156 #, python-format msgid "File %(file)s uploaded" msgstr "文件 %(file)s 已上传" -#: cps/editbooks.py:184 +#: cps/editbooks.py:185 msgid "Source or destination format for conversion missing" msgstr "转换的源格式或目的格式缺失" -#: cps/editbooks.py:192 +#: cps/editbooks.py:189 cps/editbooks.py:197 +msgid "Source format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:201 +msgid "Destination format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:209 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "书籍已经被成功加入 %(book_format)s 格式转换队列" -#: cps/editbooks.py:196 +#: cps/editbooks.py:213 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "转换此书籍时出现错误: %(res)s" -#: cps/editbooks.py:297 +#: cps/editbooks.py:314 msgid "Changes successfully applied" msgstr "修改成功" -#: cps/editbooks.py:317 +#: cps/editbooks.py:334 msgid "Value is missing on request" msgstr "请求中缺少数值" -#: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 -#: cps/editbooks.py:1146 cps/web.py:532 cps/web.py:1567 cps/web.py:1613 -#: cps/web.py:1663 +#: cps/editbooks.py:336 cps/editbooks.py:343 cps/editbooks.py:644 +#: cps/editbooks.py:1170 cps/web.py:534 cps/web.py:1577 cps/web.py:1623 +#: cps/web.py:1673 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "糟糕!所选书籍无法打开。文件不存在或者文件不可访问" -#: cps/editbooks.py:673 cps/editbooks.py:1503 +#: cps/editbooks.py:690 cps/editbooks.py:1547 msgid "User has no rights to upload cover" msgstr "用户没有权限上传封面" -#: cps/editbooks.py:694 cps/editbooks.py:938 +#: cps/editbooks.py:711 cps/editbooks.py:961 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "标识符不区分大小写,覆盖旧标识符" -#: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 +#: cps/editbooks.py:726 cps/editbooks.py:935 cps/editbooks.py:1306 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "'%(langname)s' 不是一种有效语言" -#: cps/editbooks.py:737 +#: cps/editbooks.py:754 msgid "Metadata successfully updated" msgstr "已成功更新元数据" -#: cps/editbooks.py:760 +#: cps/editbooks.py:777 #, python-brace-format msgid "Error editing book: {}" msgstr "编辑书籍时出错: {}" -#: cps/editbooks.py:856 +#: cps/editbooks.py:879 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "上传的书籍可能已经存在,建议修改后重新上传: " -#: cps/editbooks.py:950 cps/editbooks.py:1420 +#: cps/editbooks.py:973 cps/editbooks.py:1464 msgid "File type isn't allowed to be uploaded to this server" msgstr "此文件类型不允许上传到服务器" -#: cps/editbooks.py:956 cps/editbooks.py:1431 +#: cps/editbooks.py:979 cps/editbooks.py:1475 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "不能上传文件扩展名为“%(ext)s”的文件到此服务器" -#: cps/editbooks.py:960 cps/editbooks.py:1436 +#: cps/editbooks.py:983 cps/editbooks.py:1480 msgid "File to be uploaded must have an extension" msgstr "要上传的文件必须具有扩展名" -#: cps/editbooks.py:968 +#: cps/editbooks.py:992 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "文件 %(filename)s 无法保存到临时目录" -#: cps/editbooks.py:988 +#: cps/editbooks.py:1012 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "移动封面文件失败 %(file)s:%(error)s" -#: cps/editbooks.py:1041 +#: cps/editbooks.py:1065 msgid "Book Format Successfully Deleted" msgstr "书籍的此格式副本已成功删除" -#: cps/editbooks.py:1044 cps/editbooks.py:1061 +#: cps/editbooks.py:1068 cps/editbooks.py:1085 msgid "Book Successfully Deleted" msgstr "书籍已成功删除" -#: cps/editbooks.py:1065 +#: cps/editbooks.py:1089 msgid "You are missing permissions to delete books" msgstr "您没有删除书籍的权限" -#: cps/editbooks.py:1139 +#: cps/editbooks.py:1163 #, python-brace-format msgid "Book with id \"{}\" could not be deleted: not found" msgstr "ID为\"{}\"的书籍无法被删除,原因:未找到" -#: cps/editbooks.py:1181 +#: cps/editbooks.py:1205 msgid "edit metadata" msgstr "编辑元数据" -#: cps/editbooks.py:1234 +#: cps/editbooks.py:1267 #, python-format msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "丛书索引: %(seriesindex)s 不是一个有效的数值,跳过" -#: cps/editbooks.py:1425 +#: cps/editbooks.py:1469 msgid "User has no rights to upload additional file formats" msgstr "用户没有权限上传其他文件格式" -#: cps/editbooks.py:1449 +#: cps/editbooks.py:1493 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "创建路径 %(path)s 失败 (权限不足)" -#: cps/editbooks.py:1456 +#: cps/editbooks.py:1500 #, python-format msgid "Failed to store file %(file)s." msgstr "保存文件 %(file)s 失败。" -#: cps/editbooks.py:1481 +#: cps/editbooks.py:1525 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "已添加 %(ext)s 格式到 %(book)s" @@ -690,9 +737,9 @@ msgstr "请等待一分钟注册下一个用户" #: cps/error_handler.py:108 cps/templates/layout.html:69 #: cps/templates/layout.html:104 cps/templates/login.html:27 -#: cps/templates/register.html:17 cps/web.py:1292 cps/web.py:1296 -#: cps/web.py:1302 cps/web.py:1326 cps/web.py:1330 cps/web.py:1343 -#: cps/web.py:1346 +#: cps/templates/register.html:17 cps/web.py:1302 cps/web.py:1306 +#: cps/web.py:1312 cps/web.py:1336 cps/web.py:1340 cps/web.py:1353 +#: cps/web.py:1356 msgid "Register" msgstr "注册" @@ -713,7 +760,7 @@ msgstr "回调域名尚未被校验,请在 Google 开发者控制台按步骤 msgid "%(format)s format not found for book id: %(book)d" msgstr "找不到 ID 为 %(book)d 的书籍的 %(format)s 格式" -#: cps/helper.py:94 cps/tasks/convert.py:91 +#: cps/helper.py:94 cps/tasks/convert.py:92 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "Google Drive %(fn)s 上找不到 %(format)s" @@ -899,10 +946,6 @@ msgstr "仅将 jpg、jpeg 文件作为封面文件" msgid "Cover" msgstr "封面" -#: cps/helper.py:1006 -msgid "UnRar binary file not found" -msgstr "找不到 UnRar 执行文件" - #: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "执行 UnRar 时出错" @@ -933,7 +976,7 @@ msgstr "缺少执行权限: %(missing)s" msgid "Error executing Calibre" msgstr "执行 Calibre 时出错" -#: cps/helper.py:1154 cps/templates/admin.html:216 +#: cps/helper.py:1154 cps/templates/admin.html:232 msgid "Queue all books for metadata backup" msgstr "将所有书籍加入元数据备份队列" @@ -955,7 +998,7 @@ msgstr "使用 %(provider)s 注册" msgid "This %(oauth)s account is already linked to a different user" msgstr "" -#: cps/oauth_bb.py:147 cps/remotelogin.py:131 +#: cps/oauth_bb.py:147 cps/remotelogin.py:150 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "您现在已以“%(nickname)s”身份登录" @@ -1023,25 +1066,29 @@ msgstr "Google Oauth 错误: {}" msgid "{} Stars" msgstr "{} 星" -#: cps/remotelogin.py:63 cps/templates/layout.html:68 -#: cps/templates/layout.html:103 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1361 -msgid "Login" -msgstr "登录" - -#: cps/remotelogin.py:75 cps/remotelogin.py:109 +#: cps/remotelogin.py:46 cps/remotelogin.py:128 msgid "Token not found" msgstr "找不到令牌" -#: cps/remotelogin.py:84 cps/remotelogin.py:117 +#: cps/remotelogin.py:55 cps/remotelogin.py:136 msgid "Token has expired" msgstr "令牌已过期" -#: cps/remotelogin.py:93 +#: cps/remotelogin.py:86 cps/remotelogin.py:112 cps/templates/layout.html:68 +#: cps/templates/layout.html:103 cps/templates/login.html:4 +#: cps/templates/login.html:21 cps/web.py:1371 +msgid "Login" +msgstr "登录" + +#: cps/remotelogin.py:100 +msgid "Token already approved" +msgstr "" + +#: cps/remotelogin.py:108 msgid "Success! Please return to your device" msgstr "成功!请返回您的设备" -#: cps/render_template.py:41 cps/web.py:421 +#: cps/render_template.py:41 cps/web.py:423 msgid "Books" msgstr "书籍" @@ -1066,7 +1113,7 @@ msgstr "已下载书籍" msgid "Show Downloaded Books" msgstr "显示下载过的书籍" -#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:436 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:438 msgid "Top Rated Books" msgstr "最高评分书籍" @@ -1075,7 +1122,7 @@ msgid "Show Top Rated Books" msgstr "显示最高评分书籍" #: cps/render_template.py:61 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:769 +#: cps/templates/index.xml:67 cps/web.py:771 msgid "Read Books" msgstr "已读书籍" @@ -1084,7 +1131,7 @@ msgid "Show Read and Unread" msgstr "显示已读或未读状态" #: cps/render_template.py:65 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:772 +#: cps/templates/index.xml:74 cps/web.py:774 msgid "Unread Books" msgstr "未读书籍" @@ -1102,7 +1149,7 @@ msgid "Show Random Books" msgstr "显示随机书籍" #: cps/render_template.py:71 cps/templates/book_table.html:93 -#: cps/templates/index.xml:97 cps/web.py:1144 +#: cps/templates/index.xml:97 cps/web.py:1146 msgid "Categories" msgstr "分类" @@ -1112,7 +1159,7 @@ msgstr "显示分类栏目" #: cps/render_template.py:74 cps/templates/book_edit.html:86 #: cps/templates/book_table.html:94 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1034 cps/web.py:1046 +#: cps/templates/search_form.html:70 cps/web.py:1036 cps/web.py:1048 msgid "Series" msgstr "丛书" @@ -1130,7 +1177,7 @@ msgid "Show Author Section" msgstr "显示作者栏目" #: cps/render_template.py:81 cps/templates/book_table.html:98 -#: cps/templates/index.xml:88 cps/web.py:1002 +#: cps/templates/index.xml:88 cps/web.py:1004 msgid "Publishers" msgstr "出版社" @@ -1140,7 +1187,7 @@ msgstr "显示出版社栏目" #: cps/render_template.py:84 cps/templates/book_table.html:96 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1116 +#: cps/web.py:1118 msgid "Languages" msgstr "语言" @@ -1164,7 +1211,7 @@ msgstr "文件格式" msgid "Show File Formats Section" msgstr "显示文件格式栏目" -#: cps/render_template.py:95 cps/web.py:795 +#: cps/render_template.py:95 cps/web.py:797 msgid "Archived Books" msgstr "归档书籍" @@ -1172,7 +1219,7 @@ msgstr "归档书籍" msgid "Show Archived Books" msgstr "显示归档书籍" -#: cps/render_template.py:100 cps/web.py:831 +#: cps/render_template.py:100 cps/web.py:833 msgid "Books List" msgstr "书籍列表" @@ -1405,150 +1452,154 @@ msgstr "有新的更新。单击下面的按钮以更新到版本: %(version)s" msgid "No release information available" msgstr "无可用发布信息" -#: cps/templates/index.html:6 cps/web.py:448 +#: cps/templates/index.html:6 cps/web.py:450 msgid "Discover (Random Books)" msgstr "发现 (随机书籍)" -#: cps/web.py:484 +#: cps/web.py:486 msgid "Hot Books (Most Downloaded)" msgstr "热门书籍(最多下载)" -#: cps/web.py:515 +#: cps/web.py:517 #, python-format msgid "Downloaded books by %(user)s" msgstr "%(user)s 下载过的书籍" -#: cps/web.py:548 +#: cps/web.py:550 #, python-format msgid "Author: %(name)s" msgstr "作者:%(name)s" -#: cps/web.py:584 +#: cps/web.py:586 #, python-format msgid "Publisher: %(name)s" msgstr "出版社:%(name)s" -#: cps/web.py:612 +#: cps/web.py:614 #, python-format msgid "Series: %(serie)s" msgstr "丛书:%(serie)s" -#: cps/web.py:626 +#: cps/web.py:628 msgid "Rating: None" msgstr "评分:无" -#: cps/web.py:635 +#: cps/web.py:637 #, python-format msgid "Rating: %(rating)s stars" msgstr "评分:%(rating)s 星" -#: cps/web.py:666 +#: cps/web.py:668 #, python-format msgid "File format: %(format)s" msgstr "文件格式:%(format)s" -#: cps/web.py:701 +#: cps/web.py:703 #, python-format msgid "Category: %(name)s" msgstr "分类:%(name)s" -#: cps/web.py:730 +#: cps/web.py:732 #, python-format msgid "Language: %(name)s" msgstr "语言:%(name)s" -#: cps/templates/admin.html:16 cps/web.py:974 +#: cps/templates/admin.html:16 cps/web.py:976 msgid "Downloads" msgstr "下载次数" -#: cps/web.py:1076 +#: cps/web.py:1078 msgid "Ratings list" msgstr "评分列表" -#: cps/web.py:1103 +#: cps/web.py:1105 msgid "File formats list" msgstr "文件格式列表" -#: cps/web.py:1264 +#: cps/web.py:1272 +msgid "Book format not supported" +msgstr "" + +#: cps/web.py:1274 msgid "Please configure the SMTP mail settings first..." msgstr "请先配置 SMTP 邮箱设置..." -#: cps/web.py:1270 +#: cps/web.py:1280 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "书籍已经成功加入 %(eReadermail)s 的发送队列" -#: cps/web.py:1273 +#: cps/web.py:1283 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "糟糕!发送这本书籍的时候出现错误:%(res)s" -#: cps/web.py:1275 +#: cps/web.py:1285 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "请先配置您的 Kindle 邮箱。" -#: cps/web.py:1291 cps/web.py:1342 +#: cps/web.py:1301 cps/web.py:1352 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "邮件服务未配置,请联系网站管理员。" -#: cps/web.py:1328 +#: cps/web.py:1338 msgid "Oops! Your Email is not allowed." msgstr "您的电子邮件不允许注册。" -#: cps/web.py:1331 +#: cps/web.py:1341 msgid "Success! Confirmation Email has been sent." msgstr "确认邮件已经发送到您的邮箱。" -#: cps/web.py:1376 cps/web.py:1390 +#: cps/web.py:1386 cps/web.py:1400 msgid "Cannot activate LDAP authentication" msgstr "无法激活 LDAP 认证" -#: cps/web.py:1399 +#: cps/web.py:1409 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "您现在已以“%(nickname)s”身份登录" -#: cps/web.py:1406 +#: cps/web.py:1416 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "后备登录“%(nickname)s”:无法访问 LDAP 服务器,或用户未知" -#: cps/web.py:1411 +#: cps/web.py:1421 #, python-format msgid "Could not login: %(message)s" msgstr "无法登录:%(message)s" -#: cps/web.py:1415 cps/web.py:1440 +#: cps/web.py:1425 cps/web.py:1450 msgid "Wrong Username or Password" msgstr "用户名或密码错误" -#: cps/web.py:1422 +#: cps/web.py:1432 msgid "New Password was sent to your email address" msgstr "新密码已发送到您的邮箱" -#: cps/web.py:1426 +#: cps/web.py:1436 msgid "An unknown error occurred. Please try again later." msgstr "发生一个未知错误,请稍后再试。" -#: cps/web.py:1428 +#: cps/web.py:1438 msgid "Please enter valid username to reset password" msgstr "请输入有效的用户名进行密码重置" -#: cps/web.py:1436 +#: cps/web.py:1446 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "您现在已以“%(nickname)s”身份登录" -#: cps/web.py:1501 cps/web.py:1551 +#: cps/web.py:1511 cps/web.py:1561 #, python-format msgid "%(name)s's Profile" msgstr "%(name)s 的用户配置" -#: cps/web.py:1517 +#: cps/web.py:1527 msgid "Success! Profile Updated" msgstr "资料已更新" -#: cps/web.py:1521 +#: cps/web.py:1531 msgid "Oops! An account already exists for this Email." msgstr "使用此邮箱的账号已经存在。" @@ -1560,46 +1611,46 @@ msgstr "找不到包含 OAuth 信息的有效 gmail.json 文件" msgid "Delete temp folder contents" msgstr "删除临时文件夹" -#: cps/tasks/convert.py:112 +#: cps/tasks/convert.py:113 #, python-format msgid "%(book)s send to E-Reader" msgstr "%(book)s 发送到电子阅读器" -#: cps/tasks/convert.py:177 +#: cps/tasks/convert.py:180 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre 电子书转换器 %(tool)s 没有发现" -#: cps/tasks/convert.py:211 +#: cps/tasks/convert.py:214 #, python-format msgid "%(format)s format not found on disk" msgstr "硬盘上找不到 %(format)s 格式" -#: cps/tasks/convert.py:215 +#: cps/tasks/convert.py:218 msgid "Ebook converter failed with unknown error" msgstr "发生未知错误,书籍转换失败" -#: cps/tasks/convert.py:234 +#: cps/tasks/convert.py:237 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify 转换失败:%(error)s" -#: cps/tasks/convert.py:254 +#: cps/tasks/convert.py:257 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "找不到转换后的文件或文件夹 %(folder)s 中有多个文件" -#: cps/tasks/convert.py:291 cps/tasks/convert.py:342 +#: cps/tasks/convert.py:294 cps/tasks/convert.py:345 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre 运行失败,错误信息:%(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:322 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "电子书转换器失败: %(error)s" -#: cps/tasks/convert.py:347 +#: cps/tasks/convert.py:350 msgid "Convert" msgstr "转换" @@ -1685,7 +1736,7 @@ msgstr "编辑书籍" #: cps/templates/admin.html:25 cps/templates/book_edit.html:17 #: cps/templates/book_table.html:131 cps/templates/book_table.html:180 -#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:115 +#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:117 #: cps/templates/user_edit.html:67 cps/templates/user_table.html:149 msgid "Delete" msgstr "删除数据" @@ -1775,128 +1826,145 @@ msgstr "魔法链接远程登录" msgid "Reverse Proxy Login" msgstr "反向代理登录" -#: cps/templates/admin.html:154 cps/templates/config_edit.html:176 +#: cps/templates/admin.html:154 cps/templates/config_edit.html:180 msgid "Reverse Proxy Header Name" msgstr "反向代理头部名称" -#: cps/templates/admin.html:159 +#: cps/templates/admin.html:158 +msgid "Reverse Proxy Trusted IPs/CIDRs" +msgstr "" + +#: cps/templates/admin.html:162 cps/templates/config_edit.html:193 +msgid "Reverse Proxy Shared Secret Header Name" +msgstr "" + +#: cps/templates/admin.html:166 +msgid "Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/admin.html:170 +msgid "Reverse Proxy Shared Secret Configured" +msgstr "" + +#: cps/templates/admin.html:175 msgid "Edit Calibre Database Configuration" msgstr "编辑 Calibre 数据库配置" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:176 msgid "Edit Basic Configuration" msgstr "编辑基本配置" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:177 msgid "Edit UI Configuration" msgstr "编辑界面配置" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:183 msgid "Scheduled Tasks" msgstr "计划任务" -#: cps/templates/admin.html:170 cps/templates/schedule_edit.html:12 +#: cps/templates/admin.html:186 cps/templates/schedule_edit.html:12 #: cps/templates/tasks.html:18 msgid "Start Time" msgstr "任务开始运行的时间" -#: cps/templates/admin.html:174 cps/templates/schedule_edit.html:20 +#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:20 msgid "Maximum Duration" msgstr "最长任务持续时间" -#: cps/templates/admin.html:178 cps/templates/schedule_edit.html:29 +#: cps/templates/admin.html:194 cps/templates/schedule_edit.html:29 msgid "Generate Thumbnails" msgstr "生成书籍封面缩略图" -#: cps/templates/admin.html:182 +#: cps/templates/admin.html:198 msgid "Generate series cover thumbnails" msgstr "生成丛书封面缩略图" -#: cps/templates/admin.html:186 cps/templates/admin.html:208 +#: cps/templates/admin.html:202 cps/templates/admin.html:224 #: cps/templates/schedule_edit.html:37 msgid "Reconnect Calibre Database" msgstr "重新连接到 Calibre 库" -#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 +#: cps/templates/admin.html:206 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" msgstr "生成元数据备份文件" -#: cps/templates/admin.html:197 +#: cps/templates/admin.html:213 msgid "Refresh Thumbnail Cache" msgstr "刷新封面缩略图缓存" -#: cps/templates/admin.html:203 +#: cps/templates/admin.html:219 msgid "Administration" msgstr "管理" -#: cps/templates/admin.html:204 +#: cps/templates/admin.html:220 msgid "Download Debug Package" msgstr "下载 Debug 包" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:221 msgid "View Logs" msgstr "查看日志文件" -#: cps/templates/admin.html:211 +#: cps/templates/admin.html:227 msgid "Restart" msgstr "重启" -#: cps/templates/admin.html:212 +#: cps/templates/admin.html:228 msgid "Shutdown" msgstr "停止" -#: cps/templates/admin.html:221 +#: cps/templates/admin.html:237 msgid "Version Information" msgstr "版本信息" -#: cps/templates/admin.html:225 +#: cps/templates/admin.html:241 msgid "Version" msgstr "版本" -#: cps/templates/admin.html:226 +#: cps/templates/admin.html:242 msgid "Details" msgstr "详情" -#: cps/templates/admin.html:232 +#: cps/templates/admin.html:248 msgid "Current Version" msgstr "当前版本" -#: cps/templates/admin.html:239 +#: cps/templates/admin.html:255 msgid "Check for Update" msgstr "检查更新" -#: cps/templates/admin.html:240 +#: cps/templates/admin.html:256 msgid "Perform Update" msgstr "执行更新" -#: cps/templates/admin.html:253 +#: cps/templates/admin.html:269 msgid "Are you sure you want to restart?" msgstr "您确定要重启吗?" -#: cps/templates/admin.html:258 cps/templates/admin.html:272 -#: cps/templates/admin.html:292 cps/templates/config_db.html:82 +#: cps/templates/admin.html:274 cps/templates/admin.html:288 +#: cps/templates/admin.html:308 cps/templates/config_db.html:82 msgid "OK" msgstr "确定" -#: cps/templates/admin.html:259 cps/templates/admin.html:273 +#: cps/templates/admin.html:275 cps/templates/admin.html:289 #: cps/templates/book_edit.html:220 cps/templates/book_table.html:162 #: cps/templates/book_table.html:181 cps/templates/book_table.html:201 #: cps/templates/book_table.html:221 cps/templates/book_table.html:241 #: cps/templates/book_table.html:261 cps/templates/book_table.html:316 -#: cps/templates/config_db.html:66 cps/templates/config_edit.html:431 +#: cps/templates/config_db.html:66 cps/templates/config_edit.html:453 #: cps/templates/config_view_edit.html:175 cps/templates/detail.html:350 -#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:98 -#: cps/templates/modal_dialogs.html:116 cps/templates/modal_dialogs.html:134 +#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:100 +#: cps/templates/modal_dialogs.html:118 cps/templates/modal_dialogs.html:136 +#: cps/templates/remote_login_verify.html:16 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 #: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "取消" -#: cps/templates/admin.html:271 +#: cps/templates/admin.html:287 msgid "Are you sure you want to shutdown?" msgstr "您确定要关闭吗?" -#: cps/templates/admin.html:283 +#: cps/templates/admin.html:299 msgid "Updating, please do not reload this page" msgstr "正在更新,请不要刷新页面" @@ -2137,7 +2205,7 @@ msgid "Fetch Metadata" msgstr "获取元数据" #: cps/templates/book_edit.html:219 cps/templates/config_db.html:65 -#: cps/templates/config_edit.html:430 cps/templates/config_view_edit.html:174 +#: cps/templates/config_edit.html:452 cps/templates/config_view_edit.html:174 #: cps/templates/email_edit.html:65 cps/templates/schedule_edit.html:44 #: cps/templates/shelf_edit.html:25 cps/templates/shelf_order.html:41 #: cps/templates/user_edit.html:142 @@ -2509,214 +2577,234 @@ msgstr "Google Books API Key" msgid "Allow Reverse Proxy Authentication" msgstr "允许反向代理认证方式" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:176 +msgid "Security Warning" +msgstr "" + +#: cps/templates/config_edit.html:177 +msgid "Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled." +msgstr "" + +#: cps/templates/config_edit.html:184 +msgid "Reverse Proxy Trusted IPs/CIDRs (Comma Separated)" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "Enable Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/config_edit.html:197 +msgid "Reverse Proxy Shared Secret" +msgstr "" + +#: cps/templates/config_edit.html:205 msgid "Login type" msgstr "登录类型" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:207 msgid "Use Standard Authentication" msgstr "使用标准认证" -#: cps/templates/config_edit.html:187 +#: cps/templates/config_edit.html:209 msgid "Use LDAP Authentication" msgstr "使用 LDAP 认证" -#: cps/templates/config_edit.html:190 +#: cps/templates/config_edit.html:212 msgid "Use OAuth" msgstr "使用 OAuth 认证" -#: cps/templates/config_edit.html:197 +#: cps/templates/config_edit.html:219 msgid "LDAP Server Host Name or IP Address" msgstr "LDAP 服务器主机名或 IP 地址" -#: cps/templates/config_edit.html:201 +#: cps/templates/config_edit.html:223 msgid "LDAP Server Port" msgstr "LDAP 服务器端口" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:227 msgid "LDAP Encryption" msgstr "LDAP 加密" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:230 msgid "TLS" msgstr "TLS 协议" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:231 msgid "SSL" msgstr "SSL 协议" -#: cps/templates/config_edit.html:213 +#: cps/templates/config_edit.html:235 msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" msgstr "LDAP CA证书路径 (仅用于客户端证书认证)" -#: cps/templates/config_edit.html:220 +#: cps/templates/config_edit.html:242 msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" msgstr "LDAP 证书路径 (仅用于客户端证书认证)" -#: cps/templates/config_edit.html:227 +#: cps/templates/config_edit.html:249 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" msgstr "LDAP 密钥文件路径 (仅用于客户端证书认证)" -#: cps/templates/config_edit.html:236 +#: cps/templates/config_edit.html:258 msgid "LDAP Authentication" msgstr "LDAP 验证方式" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:260 msgid "Anonymous" msgstr "匿名" -#: cps/templates/config_edit.html:239 +#: cps/templates/config_edit.html:261 msgid "Unauthenticated" msgstr "无验证" -#: cps/templates/config_edit.html:240 +#: cps/templates/config_edit.html:262 msgid "Simple" msgstr "简单" -#: cps/templates/config_edit.html:245 +#: cps/templates/config_edit.html:267 msgid "LDAP Administrator Username" msgstr "LDAP 管理员用户名" -#: cps/templates/config_edit.html:251 +#: cps/templates/config_edit.html:273 msgid "LDAP Administrator Password" msgstr "LDAP 管理员密码" -#: cps/templates/config_edit.html:256 +#: cps/templates/config_edit.html:278 msgid "LDAP Distinguished Name (DN)" msgstr "LDAP 专有名称(DN)" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:282 msgid "LDAP User Object Filter" msgstr "LDAP 用户对象过滤器" -#: cps/templates/config_edit.html:265 +#: cps/templates/config_edit.html:287 msgid "LDAP Server is OpenLDAP?" msgstr "LDAP 服务器为 OpenLDAP?" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:289 msgid "Following Settings are Needed For User Import" msgstr "用户导入需要以下设置" -#: cps/templates/config_edit.html:269 +#: cps/templates/config_edit.html:291 msgid "LDAP Group Object Filter" msgstr "LDAP 组对象过滤器" -#: cps/templates/config_edit.html:273 +#: cps/templates/config_edit.html:295 msgid "LDAP Group Name" msgstr "LDAP 组名" -#: cps/templates/config_edit.html:277 +#: cps/templates/config_edit.html:299 msgid "LDAP Group Members Field" msgstr "LDAP 组成员字段" -#: cps/templates/config_edit.html:281 +#: cps/templates/config_edit.html:303 msgid "LDAP Member User Filter Detection" msgstr "LDAP 成员用户过滤器探测" -#: cps/templates/config_edit.html:283 +#: cps/templates/config_edit.html:305 msgid "Autodetect" msgstr "自动检测" -#: cps/templates/config_edit.html:284 +#: cps/templates/config_edit.html:306 msgid "Custom Filter" msgstr "自定义过滤器" -#: cps/templates/config_edit.html:289 +#: cps/templates/config_edit.html:311 msgid "LDAP Member User Filter" msgstr "LDAP 成员用户过滤器" -#: cps/templates/config_edit.html:300 +#: cps/templates/config_edit.html:322 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "获取 %(provider)s OAuth 凭证" -#: cps/templates/config_edit.html:303 +#: cps/templates/config_edit.html:325 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "%(provider)s OAuth 客户端 Id" -#: cps/templates/config_edit.html:307 +#: cps/templates/config_edit.html:329 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "%(provider)s OAuth 客户端 Secret" -#: cps/templates/config_edit.html:323 +#: cps/templates/config_edit.html:345 msgid "External binaries" msgstr "扩展程序配置" -#: cps/templates/config_edit.html:329 +#: cps/templates/config_edit.html:351 msgid "Path to Calibre Binaries" msgstr "Calibre 程序的路径" -#: cps/templates/config_edit.html:337 +#: cps/templates/config_edit.html:359 msgid "Calibre E-Book Converter Settings" msgstr "Calibre 电子书转换器设置" -#: cps/templates/config_edit.html:340 +#: cps/templates/config_edit.html:362 msgid "Path to Kepubify E-Book Converter" msgstr "KEpubify 电子书转换器路径" -#: cps/templates/config_edit.html:348 +#: cps/templates/config_edit.html:370 msgid "Location of Unrar binary" msgstr "Unrar 程序的位置" -#: cps/templates/config_edit.html:364 +#: cps/templates/config_edit.html:386 msgid "Security Settings" msgstr "安全设置" -#: cps/templates/config_edit.html:372 +#: cps/templates/config_edit.html:394 msgid "Limit failed login attempts" msgstr "限制失败的登录尝试" -#: cps/templates/config_edit.html:376 +#: cps/templates/config_edit.html:398 msgid "Configure Backend for Limiter" msgstr "配置限制器后台" -#: cps/templates/config_edit.html:380 +#: cps/templates/config_edit.html:402 msgid "Options for Limiter Backend" msgstr "限制器后台选项" -#: cps/templates/config_edit.html:386 +#: cps/templates/config_edit.html:408 msgid "Check if file extensions matches file content on upload" msgstr "检查上传的文件扩展名是否与文件内容匹配" -#: cps/templates/config_edit.html:389 +#: cps/templates/config_edit.html:411 msgid "Session protection" msgstr "会话保护" -#: cps/templates/config_edit.html:391 +#: cps/templates/config_edit.html:413 msgid "Basic" msgstr "基本" -#: cps/templates/config_edit.html:392 +#: cps/templates/config_edit.html:414 msgid "Strong" msgstr "强" -#: cps/templates/config_edit.html:397 +#: cps/templates/config_edit.html:419 msgid "User Password policy" msgstr "用户密码策略" -#: cps/templates/config_edit.html:401 +#: cps/templates/config_edit.html:423 msgid "Minimum password length" msgstr "最小密码长度" -#: cps/templates/config_edit.html:406 +#: cps/templates/config_edit.html:428 msgid "Enforce number" msgstr "必须使用数字" -#: cps/templates/config_edit.html:410 +#: cps/templates/config_edit.html:432 msgid "Enforce lowercase characters" msgstr "必须使用小写字符" -#: cps/templates/config_edit.html:414 +#: cps/templates/config_edit.html:436 msgid "Enforce uppercase characters" msgstr "必须使用大写字符" -#: cps/templates/config_edit.html:418 +#: cps/templates/config_edit.html:440 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" msgstr "必须使用文字(需要中文/日文/韩文文字)" -#: cps/templates/config_edit.html:422 +#: cps/templates/config_edit.html:444 msgid "Enforce special characters" msgstr "必须使用特殊字符" @@ -3183,27 +3271,27 @@ msgstr "在安全删除书籍之前,必须先将书籍归档并与设备同步 msgid "Choose File Location" msgstr "选择文件位置" -#: cps/templates/modal_dialogs.html:81 +#: cps/templates/modal_dialogs.html:82 msgid "type" msgstr "类型" -#: cps/templates/modal_dialogs.html:82 +#: cps/templates/modal_dialogs.html:83 msgid "name" msgstr "名称" -#: cps/templates/modal_dialogs.html:83 +#: cps/templates/modal_dialogs.html:84 msgid "size" msgstr "大小" -#: cps/templates/modal_dialogs.html:89 +#: cps/templates/modal_dialogs.html:90 msgid "Parent Directory" msgstr "父目录" -#: cps/templates/modal_dialogs.html:97 +#: cps/templates/modal_dialogs.html:99 msgid "Select" msgstr "选择" -#: cps/templates/modal_dialogs.html:133 cps/templates/tasks.html:46 +#: cps/templates/modal_dialogs.html:135 cps/templates/tasks.html:46 msgid "Ok" msgstr "完成" @@ -3459,6 +3547,31 @@ msgstr "验证后,您将自动在新设备上登录。" msgid "This verification link will expire in 10 minutes." msgstr "此验证链接将在10分钟后失效。" +#: cps/templates/remote_login_verify.html:4 +msgid "Approve Magic Link Login" +msgstr "" + +#: cps/templates/remote_login_verify.html:5 +msgid "Review the device that requested access before approving this login." +msgstr "" + +#: cps/templates/remote_login_verify.html:7 +msgid "IP address" +msgstr "" + +#: cps/templates/remote_login_verify.html:9 +msgid "Browser" +msgstr "" + +#: cps/templates/remote_login_verify.html:12 +#, python-format +msgid "If you approve this request, the device that started it will be logged in as %(username)s." +msgstr "" + +#: cps/templates/remote_login_verify.html:15 +msgid "Approve Login" +msgstr "" + #: cps/templates/schedule_edit.html:33 msgid "Generate Series Cover Thumbnails" msgstr "生成丛书封面缩略图" diff --git a/cps/translations/zh_Hant_TW/LC_MESSAGES/messages.mo b/cps/translations/zh_Hant_TW/LC_MESSAGES/messages.mo index 572a230644d9be1f1728db840dcad7e27a5440f2..ad94536b76a0cf03c10273eadc121f9a0fe870f4 100644 GIT binary patch delta 12387 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

*h()WR{DV;X+;m79xeet@ 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 NC%d<8K6aFw4FDVm^hf{z diff --git a/cps/translations/zh_Hant_TW/LC_MESSAGES/messages.po b/cps/translations/zh_Hant_TW/LC_MESSAGES/messages.po index 3537e64ee..fcf7f1019 100644 --- a/cps/translations/zh_Hant_TW/LC_MESSAGES/messages.po +++ b/cps/translations/zh_Hant_TW/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-08-01 11:42+0200\n" +"POT-Creation-Date: 2026-08-08 16:08+0200\n" "PO-Revision-Date: 2025-09-10 03:46+0000\n" "Last-Translator: finrodchen \n" "Language: zh_TW\n" @@ -16,519 +16,558 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" +"Generated-By: Babel 2.18.0\n" #: cps/about.py:85 msgid "Statistics" msgstr "統計" -#: cps/admin.py:151 +#: cps/admin.py:154 msgid "Server restarted, please reload page." msgstr "" -#: cps/admin.py:153 +#: cps/admin.py:156 msgid "Performing Server shutdown, please close window." msgstr "" -#: cps/admin.py:161 +#: cps/admin.py:164 msgid "Success! Database Reconnected" msgstr "已重新連上資料庫" -#: cps/admin.py:164 +#: cps/admin.py:167 msgid "Unknown command" msgstr "未知命令" -#: cps/admin.py:175 +#: cps/admin.py:178 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "" -#: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 -#: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 -#: cps/uploader.py:117 +#: cps/admin.py:211 cps/editbooks.py:825 cps/editbooks.py:875 +#: cps/editbooks.py:1564 cps/templates/remote_login_verify.html:8 +#: cps/templates/remote_login_verify.html:10 cps/updater.py:615 +#: cps/uploader.py:117 cps/uploader.py:126 msgid "Unknown" msgstr "未知" -#: cps/admin.py:233 +#: cps/admin.py:236 msgid "Admin page" msgstr "管理頁" -#: cps/admin.py:253 +#: cps/admin.py:256 msgid "Basic Configuration" msgstr "基本配置" -#: cps/admin.py:291 +#: cps/admin.py:294 msgid "UI Configuration" msgstr "界面配置" -#: cps/admin.py:315 cps/admin.py:1002 cps/db.py:809 cps/search.py:150 -#: cps/web.py:750 +#: cps/admin.py:318 cps/admin.py:1005 cps/db.py:809 cps/search.py:150 +#: cps/web.py:752 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "" -#: cps/admin.py:333 cps/templates/admin.html:51 +#: cps/admin.py:336 cps/templates/admin.html:51 msgid "Edit Users" msgstr "管理用戶" -#: cps/admin.py:378 cps/opds.py:559 cps/templates/grid.html:14 +#: cps/admin.py:381 cps/opds.py:559 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "全部" -#: cps/admin.py:401 cps/admin.py:1432 +#: cps/admin.py:404 cps/admin.py:1460 msgid "User not found" msgstr "找不到用戶" -#: cps/admin.py:415 +#: cps/admin.py:418 #, python-brace-format msgid "{} users deleted successfully" msgstr "成功刪除 {} 個用戶" -#: cps/admin.py:438 cps/templates/config_view_edit.html:133 +#: cps/admin.py:441 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "顯示全部" -#: cps/admin.py:459 cps/admin.py:465 +#: cps/admin.py:462 cps/admin.py:468 msgid "Malformed request" msgstr "格式錯誤的請求" -#: cps/admin.py:477 cps/admin.py:2078 +#: cps/admin.py:480 cps/admin.py:2156 msgid "Guest Name can't be changed" msgstr "訪客名稱無法更改" -#: cps/admin.py:489 +#: cps/admin.py:492 msgid "Guest can't have this role" msgstr "遊客無法擁有此角色" -#: cps/admin.py:501 cps/admin.py:2032 +#: cps/admin.py:504 cps/admin.py:2110 msgid "No admin user remaining, can't remove admin role" msgstr "管理員賬戶不存在,無法刪除管理員角色" -#: cps/admin.py:505 cps/admin.py:519 +#: cps/admin.py:508 cps/admin.py:522 msgid "Value has to be true or false" msgstr "值必須是 true 或 false" -#: cps/admin.py:507 +#: cps/admin.py:510 msgid "Invalid role" msgstr "無效角色" -#: cps/admin.py:511 +#: cps/admin.py:514 msgid "Guest can't have this view" msgstr "遊客無法擁有此視圖" -#: cps/admin.py:521 +#: cps/admin.py:524 msgid "Invalid view" msgstr "無效視圖" -#: cps/admin.py:524 +#: cps/admin.py:527 msgid "Guest's Locale is determined automatically and can't be set" msgstr "訪客的本地化是自動偵測而無法設置的" -#: cps/admin.py:528 +#: cps/admin.py:531 msgid "No Valid Locale Given" msgstr "無可用本地化" -#: cps/admin.py:539 +#: cps/admin.py:542 msgid "No Valid Book Language Given" msgstr "無有效書籍語言" -#: cps/admin.py:541 cps/editbooks.py:243 cps/editbooks.py:428 -#: cps/editbooks.py:430 +#: cps/admin.py:544 cps/editbooks.py:260 cps/editbooks.py:445 +#: cps/editbooks.py:447 msgid "Parameter not found" msgstr "參數未找到" -#: cps/admin.py:578 +#: cps/admin.py:581 msgid "Invalid Read Column" msgstr "無效的閱讀列" -#: cps/admin.py:584 +#: cps/admin.py:587 msgid "Invalid Restricted Column" msgstr "無效的限制列" -#: cps/admin.py:604 cps/admin.py:1903 +#: cps/admin.py:607 cps/admin.py:1981 msgid "Calibre-Web configuration updated" msgstr "Calibre-Web配置已更新" -#: cps/admin.py:616 +#: cps/admin.py:619 msgid "Do you really want to delete the Kobo Token?" msgstr "您確定刪除Kobo Token嗎?" -#: cps/admin.py:618 +#: cps/admin.py:621 msgid "Do you really want to delete this domain?" msgstr "您確定要刪除此網域嗎?" -#: cps/admin.py:620 +#: cps/admin.py:623 msgid "Do you really want to delete this user?" msgstr "您確定要刪除此用戶嗎?" -#: cps/admin.py:622 +#: cps/admin.py:625 msgid "Do you really want to delete this book?" msgstr "" -#: cps/admin.py:624 +#: cps/admin.py:627 msgid "Are you sure you want to delete this shelf?" msgstr "您確定要刪除此書架嗎?" -#: cps/admin.py:626 +#: cps/admin.py:629 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "您確定要修改選定用戶的本地化設置嗎?" -#: cps/admin.py:628 +#: cps/admin.py:631 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "您確定要修改選定用戶的可見書籍語言嗎?" -#: cps/admin.py:630 +#: cps/admin.py:633 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "您確定要修改選定用戶的選定角色嗎?" -#: cps/admin.py:632 +#: cps/admin.py:635 msgid "Are you sure you want to change the archive status for the selected book(s)?" msgstr "" -#: cps/admin.py:634 +#: cps/admin.py:637 msgid "Are you sure you want to change the read status for the selected book(s)?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:639 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "您確定要修改選定用戶的選定限制嗎?" -#: cps/admin.py:638 +#: cps/admin.py:641 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "您確定要修改選定用戶的選定可視化限制嗎?" -#: cps/admin.py:641 +#: cps/admin.py:644 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "您確定要更改所選用戶的書架同步行為嗎?" -#: cps/admin.py:643 +#: cps/admin.py:646 msgid "Are you sure you want to change Calibre library location?" msgstr "您確定要更改 Calibre 庫位置嗎?" -#: cps/admin.py:645 +#: cps/admin.py:648 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "Calibre-Web 將會搜尋更新的書籍封面並更新封面縮圖,這可能會花一點時間,確定要繼續嗎?" -#: cps/admin.py:648 +#: cps/admin.py:651 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "確定要刪除 Calibre-Web 的同步資料庫,以強制與 Kobo 閱讀器進行完整同步嗎?" -#: cps/admin.py:891 cps/admin.py:897 cps/admin.py:907 cps/admin.py:917 +#: cps/admin.py:894 cps/admin.py:900 cps/admin.py:910 cps/admin.py:920 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "拒絕" -#: cps/admin.py:893 cps/admin.py:899 cps/admin.py:909 cps/admin.py:919 +#: cps/admin.py:896 cps/admin.py:902 cps/admin.py:912 cps/admin.py:922 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "允許" -#: cps/admin.py:952 +#: cps/admin.py:955 #, python-brace-format msgid "{} sync entries deleted" msgstr "{} 同步項目已刪除" -#: cps/admin.py:993 +#: cps/admin.py:996 msgid "Tag not found" msgstr "標籤未找到" -#: cps/admin.py:1011 +#: cps/admin.py:1014 msgid "Invalid Action" msgstr "無效的動作" -#: cps/admin.py:1138 +#: cps/admin.py:1137 +#, python-format +msgid "Invalid reverse proxy trusted IP/CIDR entry: %(entry)s" +msgstr "" + +#: cps/admin.py:1148 +#, python-format +msgid "Invalid %(label)s: %(value)s" +msgstr "" + +#: cps/admin.py:1166 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json 未為 Web 應用程序配置" -#: cps/admin.py:1183 +#: cps/admin.py:1211 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "日誌文件路徑無效,請輸入正確的路徑" -#: cps/admin.py:1189 +#: cps/admin.py:1217 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "訪問日誌路徑無效,請輸入正確的路徑" -#: cps/admin.py:1223 +#: cps/admin.py:1251 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "請輸入LDAP主機、端口、DN和用戶對象標識符" -#: cps/admin.py:1229 +#: cps/admin.py:1257 msgid "Please Enter a LDAP Service Account and Password" msgstr "請輸入一個LDAP服務賬號和密碼 " -#: cps/admin.py:1232 +#: cps/admin.py:1260 msgid "Please Enter a LDAP Service Account" msgstr "請輸入一個LDAP服務賬號" -#: cps/admin.py:1237 +#: cps/admin.py:1265 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "LDAP群組對象過濾器需要一個具有“%s”格式標識符號" -#: cps/admin.py:1239 +#: cps/admin.py:1267 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "LDAP群組對象過濾器的括號不匹配" -#: cps/admin.py:1243 +#: cps/admin.py:1271 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP用戶對象過濾器需要一個具有“%s”格式標識符" -#: cps/admin.py:1245 +#: cps/admin.py:1273 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "LDAP用戶對象過濾器的括號不匹配" -#: cps/admin.py:1252 +#: cps/admin.py:1280 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP成員用戶過濾器需要有一個“%s”格式標識符號" -#: cps/admin.py:1254 +#: cps/admin.py:1282 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "LDAP成員用戶過濾器中有不匹配的括號" -#: cps/admin.py:1261 +#: cps/admin.py:1289 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP CA證書、證書或密鑰位置無效,請輸入正確的路徑" -#: cps/admin.py:1292 cps/templates/admin.html:53 +#: cps/admin.py:1320 cps/templates/admin.html:53 msgid "Add New User" msgstr "添加新用戶" -#: cps/admin.py:1301 cps/templates/admin.html:100 +#: cps/admin.py:1329 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "編輯郵件伺服器設置" -#: cps/admin.py:1320 +#: cps/admin.py:1348 msgid "Success! Gmail Account Verified." msgstr "已連上Gmail帳號" -#: cps/admin.py:1340 cps/admin.py:1343 cps/admin.py:1728 cps/admin.py:1887 -#: cps/admin.py:1985 cps/admin.py:2106 cps/editbooks.py:169 -#: cps/editbooks.py:755 cps/editbooks.py:1474 cps/shelf.py:90 cps/shelf.py:144 +#: cps/admin.py:1368 cps/admin.py:1371 cps/admin.py:1756 cps/admin.py:1965 +#: cps/admin.py:2063 cps/admin.py:2184 cps/editbooks.py:170 +#: cps/editbooks.py:772 cps/editbooks.py:1518 cps/shelf.py:90 cps/shelf.py:144 #: cps/shelf.py:194 cps/shelf.py:237 cps/shelf.py:287 cps/shelf.py:327 -#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:160 cps/web.py:1526 +#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:161 cps/web.py:1536 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "數據庫錯誤:%(error)s。" -#: cps/admin.py:1350 +#: cps/admin.py:1378 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "發送給%(email)s的測試郵件已進入隊列。請檢查任務結果" -#: cps/admin.py:1353 +#: cps/admin.py:1381 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "發送測試郵件時出錯:%(res)s" -#: cps/admin.py:1355 +#: cps/admin.py:1383 msgid "Please configure your e-mail address first..." msgstr "請先配置您的郵箱地址..." -#: cps/admin.py:1357 +#: cps/admin.py:1385 msgid "Email Server Settings updated" msgstr "郵件伺服器設置已更新" -#: cps/admin.py:1380 cps/templates/admin.html:195 +#: cps/admin.py:1408 cps/templates/admin.html:211 msgid "Edit Scheduled Tasks Settings" msgstr "編輯排程任務設定" -#: cps/admin.py:1392 +#: cps/admin.py:1420 msgid "Invalid start time for task specified" msgstr "指定的任務開始時間無效" -#: cps/admin.py:1397 +#: cps/admin.py:1425 msgid "Invalid duration for task specified" msgstr "指定的任務持續時間無效" -#: cps/admin.py:1407 +#: cps/admin.py:1435 msgid "Scheduled tasks settings updated" msgstr "排程任務設定已更新" -#: cps/admin.py:1417 cps/admin.py:1466 cps/admin.py:2102 cps/web.py:1325 +#: cps/admin.py:1445 cps/admin.py:1494 cps/admin.py:2180 cps/web.py:1335 msgid "Oops! An unknown error occurred. Please try again later." msgstr "發生一個未知錯誤,請稍後再試。" -#: cps/admin.py:1421 +#: cps/admin.py:1449 msgid "Settings DB is not Writeable" msgstr "設定資料庫無法寫入" -#: cps/admin.py:1451 cps/admin.py:2094 +#: cps/admin.py:1479 cps/admin.py:2172 #, python-format msgid "Edit User %(nick)s" msgstr "編輯用戶 %(nick)s" -#: cps/admin.py:1463 +#: cps/admin.py:1491 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "" -#: cps/admin.py:1469 +#: cps/admin.py:1497 msgid "Oops! Please configure the SMTP mail settings." msgstr "" -#: cps/admin.py:1480 +#: cps/admin.py:1508 msgid "Logfile viewer" msgstr "日誌文件查看器" -#: cps/admin.py:1546 +#: cps/admin.py:1574 msgid "Requesting update package" msgstr "正在請求更新包" -#: cps/admin.py:1547 +#: cps/admin.py:1575 msgid "Downloading update package" msgstr "正在下載更新包" -#: cps/admin.py:1548 +#: cps/admin.py:1576 msgid "Unzipping update package" msgstr "正在解壓更新包" -#: cps/admin.py:1549 +#: cps/admin.py:1577 msgid "Replacing files" msgstr "正在替換文件" -#: cps/admin.py:1550 +#: cps/admin.py:1578 msgid "Database connections are closed" msgstr "數據庫連接已關閉" -#: cps/admin.py:1551 +#: cps/admin.py:1579 msgid "Stopping server" msgstr "正在停止伺服器" -#: cps/admin.py:1552 +#: cps/admin.py:1580 msgid "Update finished, please press okay and reload page" msgstr "更新完成,請點擊確定並刷新頁面" -#: cps/admin.py:1553 cps/admin.py:1554 cps/admin.py:1555 cps/admin.py:1556 -#: cps/admin.py:1557 cps/admin.py:1558 +#: cps/admin.py:1581 cps/admin.py:1582 cps/admin.py:1583 cps/admin.py:1584 +#: cps/admin.py:1585 cps/admin.py:1586 msgid "Update failed:" msgstr "更新失敗:" -#: cps/admin.py:1553 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1581 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP錯誤" -#: cps/admin.py:1554 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1582 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "連接錯誤" -#: cps/admin.py:1555 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1583 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "建立連接超時" -#: cps/admin.py:1556 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1584 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "一般錯誤" -#: cps/admin.py:1557 +#: cps/admin.py:1585 msgid "Update file could not be saved in temp dir" msgstr "" -#: cps/admin.py:1558 +#: cps/admin.py:1586 msgid "Files could not be replaced during update" msgstr "更新時檔案無法替換變更" -#: cps/admin.py:1582 +#: cps/admin.py:1610 msgid "Failed to extract at least One LDAP User" msgstr "未能提取至少一個LDAP用戶" -#: cps/admin.py:1627 +#: cps/admin.py:1655 msgid "Failed to Create at Least One LDAP User" msgstr "未能創建至少一個LDAP用戶" -#: cps/admin.py:1640 +#: cps/admin.py:1668 #, python-format msgid "Error: %(ldaperror)s" msgstr "錯誤:%(ldaperror)s" -#: cps/admin.py:1644 +#: cps/admin.py:1672 msgid "Error: No user returned in response of LDAP server" msgstr "錯誤:在LDAP伺服器的響應中沒有返回用戶" -#: cps/admin.py:1680 +#: cps/admin.py:1708 msgid "At Least One LDAP User Not Found in Database" msgstr "數據庫中沒有找到至少一個LDAP用戶" -#: cps/admin.py:1682 +#: cps/admin.py:1710 #, python-brace-format msgid "{} User Successfully Imported" msgstr "{} 用戶被成功導入" -#: cps/admin.py:1740 +#: cps/admin.py:1768 msgid "Books path not valid" msgstr "書籍路徑無效" -#: cps/admin.py:1746 +#: cps/admin.py:1774 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "數據庫路徑無效,請輸入正確的路徑" -#: cps/admin.py:1774 +#: cps/admin.py:1802 msgid "DB is not Writeable" msgstr "數據庫不可寫入" -#: cps/admin.py:1788 +#: cps/admin.py:1816 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "密鑰文件路徑無效,請輸入正確的路徑" -#: cps/admin.py:1792 +#: cps/admin.py:1820 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "證書文件路徑無效,請輸入正確的路徑" -#: cps/admin.py:1872 +#: cps/admin.py:1846 +msgid "Kepubify binary not found" +msgstr "" + +#: cps/admin.py:1894 +msgid "reverse proxy login header name" +msgstr "" + +#: cps/admin.py:1904 +msgid "reverse proxy shared secret header name" +msgstr "" + +#: cps/admin.py:1913 +msgid "Please configure both reverse proxy shared secret header name and secret" +msgstr "" + +#: cps/admin.py:1917 +msgid "Please configure reverse proxy shared secret header name and secret or disable the feature" +msgstr "" + +#: cps/admin.py:1922 +msgid "Please configure at least one trusted reverse proxy IP or CIDR" +msgstr "" + +#: cps/admin.py:1946 msgid "Password length has to be between 1 and 40" msgstr "密碼長度必須介於 1 到 40 字元之間" -#: cps/admin.py:1926 +#: cps/admin.py:1957 cps/helper.py:1007 +msgid "Please specify a valid UnRar directory" +msgstr "" + +#: cps/admin.py:2004 msgid "Database Settings updated" msgstr "" -#: cps/admin.py:1934 +#: cps/admin.py:2012 msgid "Database Configuration" msgstr "數據庫配置" -#: cps/admin.py:1949 cps/web.py:1295 +#: cps/admin.py:2027 cps/web.py:1305 msgid "Oops! Please complete all fields." msgstr "請填寫所有欄位!" -#: cps/admin.py:1958 +#: cps/admin.py:2036 msgid "E-mail is not from valid domain" msgstr "郵箱不在有效網域中" -#: cps/admin.py:1964 +#: cps/admin.py:2042 msgid "Add new user" msgstr "添加新用戶" -#: cps/admin.py:1975 +#: cps/admin.py:2053 #, python-format msgid "User '%(user)s' created" msgstr "用戶“%(user)s”已創建" -#: cps/admin.py:1981 +#: cps/admin.py:2059 msgid "Oops! An account already exists for this Email. or name." msgstr "使用此郵箱或用戶名的賬號已經存在。" -#: cps/admin.py:2011 +#: cps/admin.py:2089 #, python-format msgid "User '%(nick)s' deleted" msgstr "用戶“%(nick)s”已刪除" -#: cps/admin.py:2014 +#: cps/admin.py:2092 msgid "Can't delete Guest User" msgstr "無法刪除訪客用戶" -#: cps/admin.py:2017 +#: cps/admin.py:2095 msgid "No admin user remaining, can't delete user" msgstr "管理員賬戶不存在,無法刪除用戶" -#: cps/admin.py:2072 cps/web.py:1475 +#: cps/admin.py:2150 cps/web.py:1485 msgid "Email can't be empty and has to be a valid Email" msgstr "電子郵件不可為空,且必須是有效的電子郵件格式" -#: cps/admin.py:2098 +#: cps/admin.py:2176 #, python-format msgid "User '%(nick)s' updated" msgstr "用戶“%(nick)s”已更新" @@ -541,145 +580,153 @@ msgstr "用戶“%(nick)s”已更新" msgid "Search" msgstr "搜尋" -#: cps/converter.py:31 +#: cps/converter.py:32 msgid "not installed" msgstr "未安裝" -#: cps/converter.py:32 +#: cps/converter.py:33 msgid "Execution permissions missing" msgstr "缺少執行權限" -#: cps/db.py:1129 cps/templates/config_edit.html:207 +#: cps/db.py:1129 cps/templates/config_edit.html:229 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:565 cps/web.py:599 cps/web.py:644 cps/web.py:684 cps/web.py:711 -#: cps/web.py:998 cps/web.py:1028 cps/web.py:1073 cps/web.py:1101 -#: cps/web.py:1140 +#: cps/web.py:567 cps/web.py:601 cps/web.py:646 cps/web.py:686 cps/web.py:713 +#: cps/web.py:1000 cps/web.py:1030 cps/web.py:1075 cps/web.py:1103 +#: cps/web.py:1142 msgid "None" msgstr "無" -#: cps/editbooks.py:155 +#: cps/editbooks.py:156 #, python-format msgid "File %(file)s uploaded" msgstr "文件 %(file)s 已上傳" -#: cps/editbooks.py:184 +#: cps/editbooks.py:185 msgid "Source or destination format for conversion missing" msgstr "轉換的來源或目的格式不存在" -#: cps/editbooks.py:192 +#: cps/editbooks.py:189 cps/editbooks.py:197 +msgid "Source format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:201 +msgid "Destination format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:209 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "書籍已經被成功加入到 %(book_format)s 格式轉換隊列" -#: cps/editbooks.py:196 +#: cps/editbooks.py:213 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "轉換此書籍時出現錯誤: %(res)s" -#: cps/editbooks.py:297 +#: cps/editbooks.py:314 msgid "Changes successfully applied" msgstr "" -#: cps/editbooks.py:317 +#: cps/editbooks.py:334 msgid "Value is missing on request" msgstr "請求中缺少必要的值" -#: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 -#: cps/editbooks.py:1146 cps/web.py:532 cps/web.py:1567 cps/web.py:1613 -#: cps/web.py:1663 +#: cps/editbooks.py:336 cps/editbooks.py:343 cps/editbooks.py:644 +#: cps/editbooks.py:1170 cps/web.py:534 cps/web.py:1577 cps/web.py:1623 +#: cps/web.py:1673 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "糟糕!選擇書名無法打開。文件不存在或者文件不可訪問" -#: cps/editbooks.py:673 cps/editbooks.py:1503 +#: cps/editbooks.py:690 cps/editbooks.py:1547 msgid "User has no rights to upload cover" msgstr "使用者沒有封面上傳權限" -#: cps/editbooks.py:694 cps/editbooks.py:938 +#: cps/editbooks.py:711 cps/editbooks.py:961 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "標識符不區分大小寫,覆蓋舊標識符" -#: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 +#: cps/editbooks.py:726 cps/editbooks.py:935 cps/editbooks.py:1306 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "" -#: cps/editbooks.py:737 +#: cps/editbooks.py:754 msgid "Metadata successfully updated" msgstr "已成功更新元數據" -#: cps/editbooks.py:760 +#: cps/editbooks.py:777 #, python-brace-format msgid "Error editing book: {}" msgstr "編輯書籍時發生錯誤:{}" -#: cps/editbooks.py:856 +#: cps/editbooks.py:879 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "上傳的書籍可能已經存在,建議修改後重新上傳: " -#: cps/editbooks.py:950 cps/editbooks.py:1420 +#: cps/editbooks.py:973 cps/editbooks.py:1464 msgid "File type isn't allowed to be uploaded to this server" msgstr "" -#: cps/editbooks.py:956 cps/editbooks.py:1431 +#: cps/editbooks.py:979 cps/editbooks.py:1475 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "不能上傳文件附檔名為“%(ext)s”的文件到此伺服器" -#: cps/editbooks.py:960 cps/editbooks.py:1436 +#: cps/editbooks.py:983 cps/editbooks.py:1480 msgid "File to be uploaded must have an extension" msgstr "要上傳的文件必須具有附檔名" -#: cps/editbooks.py:968 +#: cps/editbooks.py:992 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "文件 %(filename)s 無法保存到臨時目錄" -#: cps/editbooks.py:988 +#: cps/editbooks.py:1012 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "移動封面文件失敗 %(file)s:%(error)s" -#: cps/editbooks.py:1041 +#: cps/editbooks.py:1065 msgid "Book Format Successfully Deleted" msgstr "書籍格式已成功刪除" -#: cps/editbooks.py:1044 cps/editbooks.py:1061 +#: cps/editbooks.py:1068 cps/editbooks.py:1085 msgid "Book Successfully Deleted" msgstr "書籍已成功刪除" -#: cps/editbooks.py:1065 +#: cps/editbooks.py:1089 msgid "You are missing permissions to delete books" msgstr "您沒有刪除書籍的權限" -#: cps/editbooks.py:1139 +#: cps/editbooks.py:1163 #, python-brace-format msgid "Book with id \"{}\" could not be deleted: not found" msgstr "無法刪除 ID 為「{}」的書籍:未找到此書籍" -#: cps/editbooks.py:1181 +#: cps/editbooks.py:1205 msgid "edit metadata" msgstr "編輯元數據" -#: cps/editbooks.py:1234 +#: cps/editbooks.py:1267 #, python-format msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1425 +#: cps/editbooks.py:1469 msgid "User has no rights to upload additional file formats" msgstr "使用者沒有其他檔案格式上傳權限" -#: cps/editbooks.py:1449 +#: cps/editbooks.py:1493 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "創建路徑 %(path)s 失敗(權限拒絕)。" -#: cps/editbooks.py:1456 +#: cps/editbooks.py:1500 #, python-format msgid "Failed to store file %(file)s." msgstr "保存文件 %(file)s 失敗。" -#: cps/editbooks.py:1481 +#: cps/editbooks.py:1525 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "已添加 %(ext)s 格式到 %(book)s" @@ -690,9 +737,9 @@ msgstr "請等待一分鐘後再註冊下一位使用者" #: cps/error_handler.py:108 cps/templates/layout.html:69 #: cps/templates/layout.html:104 cps/templates/login.html:27 -#: cps/templates/register.html:17 cps/web.py:1292 cps/web.py:1296 -#: cps/web.py:1302 cps/web.py:1326 cps/web.py:1330 cps/web.py:1343 -#: cps/web.py:1346 +#: cps/templates/register.html:17 cps/web.py:1302 cps/web.py:1306 +#: cps/web.py:1312 cps/web.py:1336 cps/web.py:1340 cps/web.py:1353 +#: cps/web.py:1356 msgid "Register" msgstr "註冊" @@ -713,7 +760,7 @@ msgstr "回調網域名稱尚未被驗證,請在google開發者控制台按步 msgid "%(format)s format not found for book id: %(book)d" msgstr "找不到id為 %(book)d 的書籍的 %(format)s 格式" -#: cps/helper.py:94 cps/tasks/convert.py:91 +#: cps/helper.py:94 cps/tasks/convert.py:92 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "Google Drive %(fn)s 上找不到 %(format)s" @@ -899,10 +946,6 @@ msgstr "僅將jpg、jpeg文件作為封面文件" msgid "Cover" msgstr "" -#: cps/helper.py:1006 -msgid "UnRar binary file not found" -msgstr "找不到UnRar執行文件" - #: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "" @@ -933,7 +976,7 @@ msgstr "" msgid "Error executing Calibre" msgstr "" -#: cps/helper.py:1154 cps/templates/admin.html:216 +#: cps/helper.py:1154 cps/templates/admin.html:232 msgid "Queue all books for metadata backup" msgstr "將所有書籍排入元數據備份佇列" @@ -955,7 +998,7 @@ msgstr "使用 %(provider)s 註冊" msgid "This %(oauth)s account is already linked to a different user" msgstr "" -#: cps/oauth_bb.py:147 cps/remotelogin.py:131 +#: cps/oauth_bb.py:147 cps/remotelogin.py:150 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "您現在已以“%(nickname)s”身份登入" @@ -1023,25 +1066,29 @@ msgstr "Google Oauth 錯誤: {}" msgid "{} Stars" msgstr "{} 星" -#: cps/remotelogin.py:63 cps/templates/layout.html:68 -#: cps/templates/layout.html:103 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1361 -msgid "Login" -msgstr "登入" - -#: cps/remotelogin.py:75 cps/remotelogin.py:109 +#: cps/remotelogin.py:46 cps/remotelogin.py:128 msgid "Token not found" msgstr "找不到Token" -#: cps/remotelogin.py:84 cps/remotelogin.py:117 +#: cps/remotelogin.py:55 cps/remotelogin.py:136 msgid "Token has expired" msgstr "Token已過期" -#: cps/remotelogin.py:93 +#: cps/remotelogin.py:86 cps/remotelogin.py:112 cps/templates/layout.html:68 +#: cps/templates/layout.html:103 cps/templates/login.html:4 +#: cps/templates/login.html:21 cps/web.py:1371 +msgid "Login" +msgstr "登入" + +#: cps/remotelogin.py:100 +msgid "Token already approved" +msgstr "" + +#: cps/remotelogin.py:108 msgid "Success! Please return to your device" msgstr "成功!請返回您的設備" -#: cps/render_template.py:41 cps/web.py:421 +#: cps/render_template.py:41 cps/web.py:423 msgid "Books" msgstr "書籍" @@ -1066,7 +1113,7 @@ msgstr "已下載書籍" msgid "Show Downloaded Books" msgstr "顯示下載過的書籍" -#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:436 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:438 msgid "Top Rated Books" msgstr "最高評分書籍" @@ -1075,7 +1122,7 @@ msgid "Show Top Rated Books" msgstr "顯示最高評分書籍" #: cps/render_template.py:61 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:769 +#: cps/templates/index.xml:67 cps/web.py:771 msgid "Read Books" msgstr "已讀書籍" @@ -1084,7 +1131,7 @@ msgid "Show Read and Unread" msgstr "" #: cps/render_template.py:65 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:772 +#: cps/templates/index.xml:74 cps/web.py:774 msgid "Unread Books" msgstr "未讀書籍" @@ -1102,7 +1149,7 @@ msgid "Show Random Books" msgstr "隨機顯示書籍" #: cps/render_template.py:71 cps/templates/book_table.html:93 -#: cps/templates/index.xml:97 cps/web.py:1144 +#: cps/templates/index.xml:97 cps/web.py:1146 msgid "Categories" msgstr "分類" @@ -1112,7 +1159,7 @@ msgstr "" #: cps/render_template.py:74 cps/templates/book_edit.html:86 #: cps/templates/book_table.html:94 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1034 cps/web.py:1046 +#: cps/templates/search_form.html:70 cps/web.py:1036 cps/web.py:1048 msgid "Series" msgstr "叢書" @@ -1130,7 +1177,7 @@ msgid "Show Author Section" msgstr "" #: cps/render_template.py:81 cps/templates/book_table.html:98 -#: cps/templates/index.xml:88 cps/web.py:1002 +#: cps/templates/index.xml:88 cps/web.py:1004 msgid "Publishers" msgstr "出版社" @@ -1140,7 +1187,7 @@ msgstr "" #: cps/render_template.py:84 cps/templates/book_table.html:96 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1116 +#: cps/web.py:1118 msgid "Languages" msgstr "語言" @@ -1164,7 +1211,7 @@ msgstr "文件格式" msgid "Show File Formats Section" msgstr "" -#: cps/render_template.py:95 cps/web.py:795 +#: cps/render_template.py:95 cps/web.py:797 msgid "Archived Books" msgstr "歸檔書籍" @@ -1172,7 +1219,7 @@ msgstr "歸檔書籍" msgid "Show Archived Books" msgstr "" -#: cps/render_template.py:100 cps/web.py:831 +#: cps/render_template.py:100 cps/web.py:833 msgid "Books List" msgstr "書籍列表" @@ -1405,150 +1452,154 @@ msgstr "有新的更新。單擊下面的按鈕以更新到版本: %(version)s" msgid "No release information available" msgstr "無可用發佈信息" -#: cps/templates/index.html:6 cps/web.py:448 +#: cps/templates/index.html:6 cps/web.py:450 msgid "Discover (Random Books)" msgstr "發現(隨機書籍)" -#: cps/web.py:484 +#: cps/web.py:486 msgid "Hot Books (Most Downloaded)" msgstr "熱門書籍(最多下載)" -#: cps/web.py:515 +#: cps/web.py:517 #, python-format msgid "Downloaded books by %(user)s" msgstr "%(user)s 下載過的書籍" -#: cps/web.py:548 +#: cps/web.py:550 #, python-format msgid "Author: %(name)s" msgstr "作者:%(name)s" -#: cps/web.py:584 +#: cps/web.py:586 #, python-format msgid "Publisher: %(name)s" msgstr "出版社:%(name)s" -#: cps/web.py:612 +#: cps/web.py:614 #, python-format msgid "Series: %(serie)s" msgstr "叢書:%(serie)s" -#: cps/web.py:626 +#: cps/web.py:628 msgid "Rating: None" msgstr "評分: 無" -#: cps/web.py:635 +#: cps/web.py:637 #, python-format msgid "Rating: %(rating)s stars" msgstr "評分:%(rating)s 星" -#: cps/web.py:666 +#: cps/web.py:668 #, python-format msgid "File format: %(format)s" msgstr "文件格式:%(format)s" -#: cps/web.py:701 +#: cps/web.py:703 #, python-format msgid "Category: %(name)s" msgstr "分類:%(name)s" -#: cps/web.py:730 +#: cps/web.py:732 #, python-format msgid "Language: %(name)s" msgstr "語言:%(name)s" -#: cps/templates/admin.html:16 cps/web.py:974 +#: cps/templates/admin.html:16 cps/web.py:976 msgid "Downloads" msgstr "下載次數" -#: cps/web.py:1076 +#: cps/web.py:1078 msgid "Ratings list" msgstr "評分列表" -#: cps/web.py:1103 +#: cps/web.py:1105 msgid "File formats list" msgstr "文件格式列表" -#: cps/web.py:1264 +#: cps/web.py:1272 +msgid "Book format not supported" +msgstr "" + +#: cps/web.py:1274 msgid "Please configure the SMTP mail settings first..." msgstr "" -#: cps/web.py:1270 +#: cps/web.py:1280 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "書籍已經成功加入 %(eReadermail)s 的發送隊列" -#: cps/web.py:1273 +#: cps/web.py:1283 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "糟糕!發送這本書籍的時候出現錯誤:%(res)s" -#: cps/web.py:1275 +#: cps/web.py:1285 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "" -#: cps/web.py:1291 cps/web.py:1342 +#: cps/web.py:1301 cps/web.py:1352 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "郵件服務未配置,請聯繫網站管理員!" -#: cps/web.py:1328 +#: cps/web.py:1338 msgid "Oops! Your Email is not allowed." msgstr "您的電子郵件不允許註冊" -#: cps/web.py:1331 +#: cps/web.py:1341 msgid "Success! Confirmation Email has been sent." msgstr "確認郵件已經發送到您的郵箱。" -#: cps/web.py:1376 cps/web.py:1390 +#: cps/web.py:1386 cps/web.py:1400 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1399 +#: cps/web.py:1409 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1406 +#: cps/web.py:1416 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1411 +#: cps/web.py:1421 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1415 cps/web.py:1440 +#: cps/web.py:1425 cps/web.py:1450 msgid "Wrong Username or Password" msgstr "" -#: cps/web.py:1422 +#: cps/web.py:1432 msgid "New Password was sent to your email address" msgstr "" -#: cps/web.py:1426 +#: cps/web.py:1436 msgid "An unknown error occurred. Please try again later." msgstr "" -#: cps/web.py:1428 +#: cps/web.py:1438 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1436 +#: cps/web.py:1446 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1501 cps/web.py:1551 +#: cps/web.py:1511 cps/web.py:1561 #, python-format msgid "%(name)s's Profile" msgstr "%(name)s 的用戶配置" -#: cps/web.py:1517 +#: cps/web.py:1527 msgid "Success! Profile Updated" msgstr "" -#: cps/web.py:1521 +#: cps/web.py:1531 msgid "Oops! An account already exists for this Email." msgstr "使用此郵箱的賬號已經存在。" @@ -1560,46 +1611,46 @@ msgstr "找不到包含 OAuth 信息的有效 gmail.json 文件" msgid "Delete temp folder contents" msgstr "刪除暫存資料夾內容" -#: cps/tasks/convert.py:112 +#: cps/tasks/convert.py:113 #, python-format msgid "%(book)s send to E-Reader" msgstr "" -#: cps/tasks/convert.py:177 +#: cps/tasks/convert.py:180 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "沒有發現Calibre 電子書轉換器%(tool)s" -#: cps/tasks/convert.py:211 +#: cps/tasks/convert.py:214 #, python-format msgid "%(format)s format not found on disk" msgstr "硬碟上找不到 %(format)s 格式" -#: cps/tasks/convert.py:215 +#: cps/tasks/convert.py:218 msgid "Ebook converter failed with unknown error" msgstr "發生未知錯誤,書籍轉換失敗" -#: cps/tasks/convert.py:234 +#: cps/tasks/convert.py:237 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify 轉換失敗:%(error)s" -#: cps/tasks/convert.py:254 +#: cps/tasks/convert.py:257 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "找不到轉換後的文件或文件夾%(folder)s中有多個文件" -#: cps/tasks/convert.py:291 cps/tasks/convert.py:342 +#: cps/tasks/convert.py:294 cps/tasks/convert.py:345 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre 運行失敗,錯誤信息:%(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:322 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "電子書轉換器失敗: %(error)s" -#: cps/tasks/convert.py:347 +#: cps/tasks/convert.py:350 msgid "Convert" msgstr "轉換" @@ -1685,7 +1736,7 @@ msgstr "編輯書籍" #: cps/templates/admin.html:25 cps/templates/book_edit.html:17 #: cps/templates/book_table.html:131 cps/templates/book_table.html:180 -#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:115 +#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:117 #: cps/templates/user_edit.html:67 cps/templates/user_table.html:149 msgid "Delete" msgstr "刪除數據" @@ -1775,128 +1826,145 @@ msgstr "魔法連接遠程登錄" msgid "Reverse Proxy Login" msgstr "反向代理登入" -#: cps/templates/admin.html:154 cps/templates/config_edit.html:176 +#: cps/templates/admin.html:154 cps/templates/config_edit.html:180 msgid "Reverse Proxy Header Name" msgstr "反向代理標頭名稱" -#: cps/templates/admin.html:159 +#: cps/templates/admin.html:158 +msgid "Reverse Proxy Trusted IPs/CIDRs" +msgstr "" + +#: cps/templates/admin.html:162 cps/templates/config_edit.html:193 +msgid "Reverse Proxy Shared Secret Header Name" +msgstr "" + +#: cps/templates/admin.html:166 +msgid "Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/admin.html:170 +msgid "Reverse Proxy Shared Secret Configured" +msgstr "" + +#: cps/templates/admin.html:175 msgid "Edit Calibre Database Configuration" msgstr "編輯Calibre數據庫配置" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:176 msgid "Edit Basic Configuration" msgstr "編輯基本配置" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:177 msgid "Edit UI Configuration" msgstr "編輯界面配置" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:183 msgid "Scheduled Tasks" msgstr "已排程任務" -#: cps/templates/admin.html:170 cps/templates/schedule_edit.html:12 +#: cps/templates/admin.html:186 cps/templates/schedule_edit.html:12 #: cps/templates/tasks.html:18 msgid "Start Time" msgstr "開始時間" -#: cps/templates/admin.html:174 cps/templates/schedule_edit.html:20 +#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:20 msgid "Maximum Duration" msgstr "最長持續時間" -#: cps/templates/admin.html:178 cps/templates/schedule_edit.html:29 +#: cps/templates/admin.html:194 cps/templates/schedule_edit.html:29 msgid "Generate Thumbnails" msgstr "產生縮圖" -#: cps/templates/admin.html:182 +#: cps/templates/admin.html:198 msgid "Generate series cover thumbnails" msgstr "產生叢書封面縮圖" -#: cps/templates/admin.html:186 cps/templates/admin.html:208 +#: cps/templates/admin.html:202 cps/templates/admin.html:224 #: cps/templates/schedule_edit.html:37 msgid "Reconnect Calibre Database" msgstr "重新連線至Calibre資料庫" -#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 +#: cps/templates/admin.html:206 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" msgstr "產生元數據備份檔案" -#: cps/templates/admin.html:197 +#: cps/templates/admin.html:213 msgid "Refresh Thumbnail Cache" msgstr "更新縮圖快取" -#: cps/templates/admin.html:203 +#: cps/templates/admin.html:219 msgid "Administration" msgstr "管理" -#: cps/templates/admin.html:204 +#: cps/templates/admin.html:220 msgid "Download Debug Package" msgstr "下載除錯包" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:221 msgid "View Logs" msgstr "查看日誌文件" -#: cps/templates/admin.html:211 +#: cps/templates/admin.html:227 msgid "Restart" msgstr "重啟" -#: cps/templates/admin.html:212 +#: cps/templates/admin.html:228 msgid "Shutdown" msgstr "停止" -#: cps/templates/admin.html:221 +#: cps/templates/admin.html:237 msgid "Version Information" msgstr "版本資訊" -#: cps/templates/admin.html:225 +#: cps/templates/admin.html:241 msgid "Version" msgstr "版本" -#: cps/templates/admin.html:226 +#: cps/templates/admin.html:242 msgid "Details" msgstr "詳情" -#: cps/templates/admin.html:232 +#: cps/templates/admin.html:248 msgid "Current Version" msgstr "當前版本" -#: cps/templates/admin.html:239 +#: cps/templates/admin.html:255 msgid "Check for Update" msgstr "檢查更新" -#: cps/templates/admin.html:240 +#: cps/templates/admin.html:256 msgid "Perform Update" msgstr "執行更新" -#: cps/templates/admin.html:253 +#: cps/templates/admin.html:269 msgid "Are you sure you want to restart?" msgstr "您確定要重啟嗎?" -#: cps/templates/admin.html:258 cps/templates/admin.html:272 -#: cps/templates/admin.html:292 cps/templates/config_db.html:82 +#: cps/templates/admin.html:274 cps/templates/admin.html:288 +#: cps/templates/admin.html:308 cps/templates/config_db.html:82 msgid "OK" msgstr "確定" -#: cps/templates/admin.html:259 cps/templates/admin.html:273 +#: cps/templates/admin.html:275 cps/templates/admin.html:289 #: cps/templates/book_edit.html:220 cps/templates/book_table.html:162 #: cps/templates/book_table.html:181 cps/templates/book_table.html:201 #: cps/templates/book_table.html:221 cps/templates/book_table.html:241 #: cps/templates/book_table.html:261 cps/templates/book_table.html:316 -#: cps/templates/config_db.html:66 cps/templates/config_edit.html:431 +#: cps/templates/config_db.html:66 cps/templates/config_edit.html:453 #: cps/templates/config_view_edit.html:175 cps/templates/detail.html:350 -#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:98 -#: cps/templates/modal_dialogs.html:116 cps/templates/modal_dialogs.html:134 +#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:100 +#: cps/templates/modal_dialogs.html:118 cps/templates/modal_dialogs.html:136 +#: cps/templates/remote_login_verify.html:16 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 #: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "取消" -#: cps/templates/admin.html:271 +#: cps/templates/admin.html:287 msgid "Are you sure you want to shutdown?" msgstr "您確定要關閉嗎?" -#: cps/templates/admin.html:283 +#: cps/templates/admin.html:299 msgid "Updating, please do not reload this page" msgstr "正在更新,請不要刷新頁面" @@ -2137,7 +2205,7 @@ msgid "Fetch Metadata" msgstr "獲取元數據" #: cps/templates/book_edit.html:219 cps/templates/config_db.html:65 -#: cps/templates/config_edit.html:430 cps/templates/config_view_edit.html:174 +#: cps/templates/config_edit.html:452 cps/templates/config_view_edit.html:174 #: cps/templates/email_edit.html:65 cps/templates/schedule_edit.html:44 #: cps/templates/shelf_edit.html:25 cps/templates/shelf_order.html:41 #: cps/templates/user_edit.html:142 @@ -2509,214 +2577,234 @@ msgstr "" msgid "Allow Reverse Proxy Authentication" msgstr "允許反向代理認證方式" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:176 +msgid "Security Warning" +msgstr "" + +#: cps/templates/config_edit.html:177 +msgid "Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled." +msgstr "" + +#: cps/templates/config_edit.html:184 +msgid "Reverse Proxy Trusted IPs/CIDRs (Comma Separated)" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "Enable Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/config_edit.html:197 +msgid "Reverse Proxy Shared Secret" +msgstr "" + +#: cps/templates/config_edit.html:205 msgid "Login type" msgstr "登入類型" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:207 msgid "Use Standard Authentication" msgstr "使用標準認證" -#: cps/templates/config_edit.html:187 +#: cps/templates/config_edit.html:209 msgid "Use LDAP Authentication" msgstr "使用LDAP認證" -#: cps/templates/config_edit.html:190 +#: cps/templates/config_edit.html:212 msgid "Use OAuth" msgstr "使用OAuth認證" -#: cps/templates/config_edit.html:197 +#: cps/templates/config_edit.html:219 msgid "LDAP Server Host Name or IP Address" msgstr "LDAP伺服器主機名或IP地址" -#: cps/templates/config_edit.html:201 +#: cps/templates/config_edit.html:223 msgid "LDAP Server Port" msgstr "LDAP伺服器端口" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:227 msgid "LDAP Encryption" msgstr "LDAP 加密" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:230 msgid "TLS" msgstr "TLS協議" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:231 msgid "SSL" msgstr "SSL協議" -#: cps/templates/config_edit.html:213 +#: cps/templates/config_edit.html:235 msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" msgstr "LDAP CA證書路徑(僅用於客戶端證書認證)" -#: cps/templates/config_edit.html:220 +#: cps/templates/config_edit.html:242 msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" msgstr "LDAP 證書路徑(僅用於客戶端證書認證)" -#: cps/templates/config_edit.html:227 +#: cps/templates/config_edit.html:249 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" msgstr "LDAP密鑰文件路徑(僅用於客戶端證書認證)" -#: cps/templates/config_edit.html:236 +#: cps/templates/config_edit.html:258 msgid "LDAP Authentication" msgstr "LDAP 驗證方式" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:260 msgid "Anonymous" msgstr "匿名" -#: cps/templates/config_edit.html:239 +#: cps/templates/config_edit.html:261 msgid "Unauthenticated" msgstr "無驗證" -#: cps/templates/config_edit.html:240 +#: cps/templates/config_edit.html:262 msgid "Simple" msgstr "簡單" -#: cps/templates/config_edit.html:245 +#: cps/templates/config_edit.html:267 msgid "LDAP Administrator Username" msgstr "LDAP管理員用戶名" -#: cps/templates/config_edit.html:251 +#: cps/templates/config_edit.html:273 msgid "LDAP Administrator Password" msgstr "LDAP管理員密碼" -#: cps/templates/config_edit.html:256 +#: cps/templates/config_edit.html:278 msgid "LDAP Distinguished Name (DN)" msgstr "LDAP專有名稱(DN)" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:282 msgid "LDAP User Object Filter" msgstr "LDAP用戶對象過濾器" -#: cps/templates/config_edit.html:265 +#: cps/templates/config_edit.html:287 msgid "LDAP Server is OpenLDAP?" msgstr "LDAP伺服器是 OpenLDAP?" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:289 msgid "Following Settings are Needed For User Import" msgstr "用戶導入需要以下設置" -#: cps/templates/config_edit.html:269 +#: cps/templates/config_edit.html:291 msgid "LDAP Group Object Filter" msgstr "LDAP群組對象過濾器" -#: cps/templates/config_edit.html:273 +#: cps/templates/config_edit.html:295 msgid "LDAP Group Name" msgstr "LDAP群組名" -#: cps/templates/config_edit.html:277 +#: cps/templates/config_edit.html:299 msgid "LDAP Group Members Field" msgstr "LDAP群組成員欄位" -#: cps/templates/config_edit.html:281 +#: cps/templates/config_edit.html:303 msgid "LDAP Member User Filter Detection" msgstr "LDAP成員用戶過濾器檢測" -#: cps/templates/config_edit.html:283 +#: cps/templates/config_edit.html:305 msgid "Autodetect" msgstr "自動檢測" -#: cps/templates/config_edit.html:284 +#: cps/templates/config_edit.html:306 msgid "Custom Filter" msgstr "自定義過濾器" -#: cps/templates/config_edit.html:289 +#: cps/templates/config_edit.html:311 msgid "LDAP Member User Filter" msgstr "LDAP成員用戶過濾器" -#: cps/templates/config_edit.html:300 +#: cps/templates/config_edit.html:322 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "獲取 %(provider)s OAuth憑證" -#: cps/templates/config_edit.html:303 +#: cps/templates/config_edit.html:325 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "%(provider)s OAuth 客戶端Id" -#: cps/templates/config_edit.html:307 +#: cps/templates/config_edit.html:329 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "%(provider)s OAuth 客戶端密鑰" -#: cps/templates/config_edit.html:323 +#: cps/templates/config_edit.html:345 msgid "External binaries" msgstr "擴展程序配置" -#: cps/templates/config_edit.html:329 +#: cps/templates/config_edit.html:351 msgid "Path to Calibre Binaries" msgstr "" -#: cps/templates/config_edit.html:337 +#: cps/templates/config_edit.html:359 msgid "Calibre E-Book Converter Settings" msgstr "Calibre 電子書轉換器設置" -#: cps/templates/config_edit.html:340 +#: cps/templates/config_edit.html:362 msgid "Path to Kepubify E-Book Converter" msgstr "Kepubify 電子書轉換器路徑" -#: cps/templates/config_edit.html:348 +#: cps/templates/config_edit.html:370 msgid "Location of Unrar binary" msgstr "" -#: cps/templates/config_edit.html:364 +#: cps/templates/config_edit.html:386 msgid "Security Settings" msgstr "" -#: cps/templates/config_edit.html:372 +#: cps/templates/config_edit.html:394 msgid "Limit failed login attempts" msgstr "限制登入失敗嘗試次數" -#: cps/templates/config_edit.html:376 +#: cps/templates/config_edit.html:398 msgid "Configure Backend for Limiter" msgstr "設定限制器後端服務" -#: cps/templates/config_edit.html:380 +#: cps/templates/config_edit.html:402 msgid "Options for Limiter Backend" msgstr "限制器後端選項" -#: cps/templates/config_edit.html:386 +#: cps/templates/config_edit.html:408 msgid "Check if file extensions matches file content on upload" msgstr "上傳時請檢查檔案副檔名是否與檔案內容相符" -#: cps/templates/config_edit.html:389 +#: cps/templates/config_edit.html:411 msgid "Session protection" msgstr "會話保護" -#: cps/templates/config_edit.html:391 +#: cps/templates/config_edit.html:413 msgid "Basic" msgstr "基本的" -#: cps/templates/config_edit.html:392 +#: cps/templates/config_edit.html:414 msgid "Strong" msgstr "粗體" -#: cps/templates/config_edit.html:397 +#: cps/templates/config_edit.html:419 msgid "User Password policy" msgstr "" -#: cps/templates/config_edit.html:401 +#: cps/templates/config_edit.html:423 msgid "Minimum password length" msgstr "最短密碼長度" -#: cps/templates/config_edit.html:406 +#: cps/templates/config_edit.html:428 msgid "Enforce number" msgstr "強制使用數字" -#: cps/templates/config_edit.html:410 +#: cps/templates/config_edit.html:432 msgid "Enforce lowercase characters" msgstr "強制使用小寫英文" -#: cps/templates/config_edit.html:414 +#: cps/templates/config_edit.html:436 msgid "Enforce uppercase characters" msgstr "強制使用大寫英文" -#: cps/templates/config_edit.html:418 +#: cps/templates/config_edit.html:440 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" msgstr "強制使用字元(針對中文/日文/韓文字元需求)" -#: cps/templates/config_edit.html:422 +#: cps/templates/config_edit.html:444 msgid "Enforce special characters" msgstr "強制使用特殊符號" @@ -3183,27 +3271,27 @@ msgstr "必須先將書籍存檔並同步設備,然後才能安全地刪除書 msgid "Choose File Location" msgstr "選擇文件位置" -#: cps/templates/modal_dialogs.html:81 +#: cps/templates/modal_dialogs.html:82 msgid "type" msgstr "類型" -#: cps/templates/modal_dialogs.html:82 +#: cps/templates/modal_dialogs.html:83 msgid "name" msgstr "名稱" -#: cps/templates/modal_dialogs.html:83 +#: cps/templates/modal_dialogs.html:84 msgid "size" msgstr "大小" -#: cps/templates/modal_dialogs.html:89 +#: cps/templates/modal_dialogs.html:90 msgid "Parent Directory" msgstr "父目錄" -#: cps/templates/modal_dialogs.html:97 +#: cps/templates/modal_dialogs.html:99 msgid "Select" msgstr "選擇" -#: cps/templates/modal_dialogs.html:133 cps/templates/tasks.html:46 +#: cps/templates/modal_dialogs.html:135 cps/templates/tasks.html:46 msgid "Ok" msgstr "完成" @@ -3459,6 +3547,31 @@ msgstr "驗證後,您將自動在新設備上登入。" msgid "This verification link will expire in 10 minutes." msgstr "此驗證連接將在10分鐘後失效。" +#: cps/templates/remote_login_verify.html:4 +msgid "Approve Magic Link Login" +msgstr "" + +#: cps/templates/remote_login_verify.html:5 +msgid "Review the device that requested access before approving this login." +msgstr "" + +#: cps/templates/remote_login_verify.html:7 +msgid "IP address" +msgstr "" + +#: cps/templates/remote_login_verify.html:9 +msgid "Browser" +msgstr "" + +#: cps/templates/remote_login_verify.html:12 +#, python-format +msgid "If you approve this request, the device that started it will be logged in as %(username)s." +msgstr "" + +#: cps/templates/remote_login_verify.html:15 +msgid "Approve Login" +msgstr "" + #: cps/templates/schedule_edit.html:33 msgid "Generate Series Cover Thumbnails" msgstr "產生叢書封面縮圖" diff --git a/messages.pot b/messages.pot index 355a40b07..34a069621 100644 --- a/messages.pot +++ b/messages.pot @@ -8,526 +8,565 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-08-01 11:42+0200\n" +"POT-Creation-Date: 2026-08-08 16:08+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" +"Generated-By: Babel 2.18.0\n" #: cps/about.py:85 msgid "Statistics" msgstr "" -#: cps/admin.py:151 +#: cps/admin.py:154 msgid "Server restarted, please reload page." msgstr "" -#: cps/admin.py:153 +#: cps/admin.py:156 msgid "Performing Server shutdown, please close window." msgstr "" -#: cps/admin.py:161 +#: cps/admin.py:164 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:164 +#: cps/admin.py:167 msgid "Unknown command" msgstr "" -#: cps/admin.py:175 +#: cps/admin.py:178 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "" -#: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 -#: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 -#: cps/uploader.py:117 +#: cps/admin.py:211 cps/editbooks.py:825 cps/editbooks.py:875 +#: cps/editbooks.py:1564 cps/templates/remote_login_verify.html:8 +#: cps/templates/remote_login_verify.html:10 cps/updater.py:615 +#: cps/uploader.py:117 cps/uploader.py:126 msgid "Unknown" msgstr "" -#: cps/admin.py:233 +#: cps/admin.py:236 msgid "Admin page" msgstr "" -#: cps/admin.py:253 +#: cps/admin.py:256 msgid "Basic Configuration" msgstr "" -#: cps/admin.py:291 +#: cps/admin.py:294 msgid "UI Configuration" msgstr "" -#: cps/admin.py:315 cps/admin.py:1002 cps/db.py:809 cps/search.py:150 -#: cps/web.py:750 +#: cps/admin.py:318 cps/admin.py:1005 cps/db.py:809 cps/search.py:150 +#: cps/web.py:752 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "" -#: cps/admin.py:333 cps/templates/admin.html:51 +#: cps/admin.py:336 cps/templates/admin.html:51 msgid "Edit Users" msgstr "" -#: cps/admin.py:378 cps/opds.py:559 cps/templates/grid.html:14 +#: cps/admin.py:381 cps/opds.py:559 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "" -#: cps/admin.py:401 cps/admin.py:1432 +#: cps/admin.py:404 cps/admin.py:1460 msgid "User not found" msgstr "" -#: cps/admin.py:415 +#: cps/admin.py:418 #, python-brace-format msgid "{} users deleted successfully" msgstr "" -#: cps/admin.py:438 cps/templates/config_view_edit.html:133 +#: cps/admin.py:441 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "" -#: cps/admin.py:459 cps/admin.py:465 +#: cps/admin.py:462 cps/admin.py:468 msgid "Malformed request" msgstr "" -#: cps/admin.py:477 cps/admin.py:2078 +#: cps/admin.py:480 cps/admin.py:2156 msgid "Guest Name can't be changed" msgstr "" -#: cps/admin.py:489 +#: cps/admin.py:492 msgid "Guest can't have this role" msgstr "" -#: cps/admin.py:501 cps/admin.py:2032 +#: cps/admin.py:504 cps/admin.py:2110 msgid "No admin user remaining, can't remove admin role" msgstr "" -#: cps/admin.py:505 cps/admin.py:519 +#: cps/admin.py:508 cps/admin.py:522 msgid "Value has to be true or false" msgstr "" -#: cps/admin.py:507 +#: cps/admin.py:510 msgid "Invalid role" msgstr "" -#: cps/admin.py:511 +#: cps/admin.py:514 msgid "Guest can't have this view" msgstr "" -#: cps/admin.py:521 +#: cps/admin.py:524 msgid "Invalid view" msgstr "" -#: cps/admin.py:524 +#: cps/admin.py:527 msgid "Guest's Locale is determined automatically and can't be set" msgstr "" -#: cps/admin.py:528 +#: cps/admin.py:531 msgid "No Valid Locale Given" msgstr "" -#: cps/admin.py:539 +#: cps/admin.py:542 msgid "No Valid Book Language Given" msgstr "" -#: cps/admin.py:541 cps/editbooks.py:243 cps/editbooks.py:428 -#: cps/editbooks.py:430 +#: cps/admin.py:544 cps/editbooks.py:260 cps/editbooks.py:445 +#: cps/editbooks.py:447 msgid "Parameter not found" msgstr "" -#: cps/admin.py:578 +#: cps/admin.py:581 msgid "Invalid Read Column" msgstr "" -#: cps/admin.py:584 +#: cps/admin.py:587 msgid "Invalid Restricted Column" msgstr "" -#: cps/admin.py:604 cps/admin.py:1903 +#: cps/admin.py:607 cps/admin.py:1981 msgid "Calibre-Web configuration updated" msgstr "" -#: cps/admin.py:616 +#: cps/admin.py:619 msgid "Do you really want to delete the Kobo Token?" msgstr "" -#: cps/admin.py:618 +#: cps/admin.py:621 msgid "Do you really want to delete this domain?" msgstr "" -#: cps/admin.py:620 +#: cps/admin.py:623 msgid "Do you really want to delete this user?" msgstr "" -#: cps/admin.py:622 +#: cps/admin.py:625 msgid "Do you really want to delete this book?" msgstr "" -#: cps/admin.py:624 +#: cps/admin.py:627 msgid "Are you sure you want to delete this shelf?" msgstr "" -#: cps/admin.py:626 +#: cps/admin.py:629 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "" -#: cps/admin.py:628 +#: cps/admin.py:631 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "" -#: cps/admin.py:630 +#: cps/admin.py:633 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "" -#: cps/admin.py:632 +#: cps/admin.py:635 msgid "Are you sure you want to change the archive status for the selected book(s)?" msgstr "" -#: cps/admin.py:634 +#: cps/admin.py:637 msgid "Are you sure you want to change the read status for the selected book(s)?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:639 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "" -#: cps/admin.py:638 +#: cps/admin.py:641 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "" -#: cps/admin.py:641 +#: cps/admin.py:644 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "" -#: cps/admin.py:643 +#: cps/admin.py:646 msgid "Are you sure you want to change Calibre library location?" msgstr "" -#: cps/admin.py:645 +#: cps/admin.py:648 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "" -#: cps/admin.py:648 +#: cps/admin.py:651 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "" -#: cps/admin.py:891 cps/admin.py:897 cps/admin.py:907 cps/admin.py:917 +#: cps/admin.py:894 cps/admin.py:900 cps/admin.py:910 cps/admin.py:920 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "" -#: cps/admin.py:893 cps/admin.py:899 cps/admin.py:909 cps/admin.py:919 +#: cps/admin.py:896 cps/admin.py:902 cps/admin.py:912 cps/admin.py:922 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "" -#: cps/admin.py:952 +#: cps/admin.py:955 #, python-brace-format msgid "{} sync entries deleted" msgstr "" -#: cps/admin.py:993 +#: cps/admin.py:996 msgid "Tag not found" msgstr "" -#: cps/admin.py:1011 +#: cps/admin.py:1014 msgid "Invalid Action" msgstr "" -#: cps/admin.py:1138 +#: cps/admin.py:1137 +#, python-format +msgid "Invalid reverse proxy trusted IP/CIDR entry: %(entry)s" +msgstr "" + +#: cps/admin.py:1148 +#, python-format +msgid "Invalid %(label)s: %(value)s" +msgstr "" + +#: cps/admin.py:1166 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "" -#: cps/admin.py:1183 +#: cps/admin.py:1211 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1189 +#: cps/admin.py:1217 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1223 +#: cps/admin.py:1251 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "" -#: cps/admin.py:1229 +#: cps/admin.py:1257 msgid "Please Enter a LDAP Service Account and Password" msgstr "" -#: cps/admin.py:1232 +#: cps/admin.py:1260 msgid "Please Enter a LDAP Service Account" msgstr "" -#: cps/admin.py:1237 +#: cps/admin.py:1265 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1239 +#: cps/admin.py:1267 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1243 +#: cps/admin.py:1271 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1245 +#: cps/admin.py:1273 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1252 +#: cps/admin.py:1280 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1254 +#: cps/admin.py:1282 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1261 +#: cps/admin.py:1289 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1292 cps/templates/admin.html:53 +#: cps/admin.py:1320 cps/templates/admin.html:53 msgid "Add New User" msgstr "" -#: cps/admin.py:1301 cps/templates/admin.html:100 +#: cps/admin.py:1329 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "" -#: cps/admin.py:1320 +#: cps/admin.py:1348 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1340 cps/admin.py:1343 cps/admin.py:1728 cps/admin.py:1887 -#: cps/admin.py:1985 cps/admin.py:2106 cps/editbooks.py:169 -#: cps/editbooks.py:755 cps/editbooks.py:1474 cps/shelf.py:90 cps/shelf.py:144 +#: cps/admin.py:1368 cps/admin.py:1371 cps/admin.py:1756 cps/admin.py:1965 +#: cps/admin.py:2063 cps/admin.py:2184 cps/editbooks.py:170 +#: cps/editbooks.py:772 cps/editbooks.py:1518 cps/shelf.py:90 cps/shelf.py:144 #: cps/shelf.py:194 cps/shelf.py:237 cps/shelf.py:287 cps/shelf.py:327 -#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:160 cps/web.py:1526 +#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:161 cps/web.py:1536 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "" -#: cps/admin.py:1350 +#: cps/admin.py:1378 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1353 +#: cps/admin.py:1381 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "" -#: cps/admin.py:1355 +#: cps/admin.py:1383 msgid "Please configure your e-mail address first..." msgstr "" -#: cps/admin.py:1357 +#: cps/admin.py:1385 msgid "Email Server Settings updated" msgstr "" -#: cps/admin.py:1380 cps/templates/admin.html:195 +#: cps/admin.py:1408 cps/templates/admin.html:211 msgid "Edit Scheduled Tasks Settings" msgstr "" -#: cps/admin.py:1392 +#: cps/admin.py:1420 msgid "Invalid start time for task specified" msgstr "" -#: cps/admin.py:1397 +#: cps/admin.py:1425 msgid "Invalid duration for task specified" msgstr "" -#: cps/admin.py:1407 +#: cps/admin.py:1435 msgid "Scheduled tasks settings updated" msgstr "" -#: cps/admin.py:1417 cps/admin.py:1466 cps/admin.py:2102 cps/web.py:1325 +#: cps/admin.py:1445 cps/admin.py:1494 cps/admin.py:2180 cps/web.py:1335 msgid "Oops! An unknown error occurred. Please try again later." msgstr "" -#: cps/admin.py:1421 +#: cps/admin.py:1449 msgid "Settings DB is not Writeable" msgstr "" -#: cps/admin.py:1451 cps/admin.py:2094 +#: cps/admin.py:1479 cps/admin.py:2172 #, python-format msgid "Edit User %(nick)s" msgstr "" -#: cps/admin.py:1463 +#: cps/admin.py:1491 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "" -#: cps/admin.py:1469 +#: cps/admin.py:1497 msgid "Oops! Please configure the SMTP mail settings." msgstr "" -#: cps/admin.py:1480 +#: cps/admin.py:1508 msgid "Logfile viewer" msgstr "" -#: cps/admin.py:1546 +#: cps/admin.py:1574 msgid "Requesting update package" msgstr "" -#: cps/admin.py:1547 +#: cps/admin.py:1575 msgid "Downloading update package" msgstr "" -#: cps/admin.py:1548 +#: cps/admin.py:1576 msgid "Unzipping update package" msgstr "" -#: cps/admin.py:1549 +#: cps/admin.py:1577 msgid "Replacing files" msgstr "" -#: cps/admin.py:1550 +#: cps/admin.py:1578 msgid "Database connections are closed" msgstr "" -#: cps/admin.py:1551 +#: cps/admin.py:1579 msgid "Stopping server" msgstr "" -#: cps/admin.py:1552 +#: cps/admin.py:1580 msgid "Update finished, please press okay and reload page" msgstr "" -#: cps/admin.py:1553 cps/admin.py:1554 cps/admin.py:1555 cps/admin.py:1556 -#: cps/admin.py:1557 cps/admin.py:1558 +#: cps/admin.py:1581 cps/admin.py:1582 cps/admin.py:1583 cps/admin.py:1584 +#: cps/admin.py:1585 cps/admin.py:1586 msgid "Update failed:" msgstr "" -#: cps/admin.py:1553 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1581 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "" -#: cps/admin.py:1554 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1582 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "" -#: cps/admin.py:1555 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1583 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "" -#: cps/admin.py:1556 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1584 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "" -#: cps/admin.py:1557 +#: cps/admin.py:1585 msgid "Update file could not be saved in temp dir" msgstr "" -#: cps/admin.py:1558 +#: cps/admin.py:1586 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1582 +#: cps/admin.py:1610 msgid "Failed to extract at least One LDAP User" msgstr "" -#: cps/admin.py:1627 +#: cps/admin.py:1655 msgid "Failed to Create at Least One LDAP User" msgstr "" -#: cps/admin.py:1640 +#: cps/admin.py:1668 #, python-format msgid "Error: %(ldaperror)s" msgstr "" -#: cps/admin.py:1644 +#: cps/admin.py:1672 msgid "Error: No user returned in response of LDAP server" msgstr "" -#: cps/admin.py:1680 +#: cps/admin.py:1708 msgid "At Least One LDAP User Not Found in Database" msgstr "" -#: cps/admin.py:1682 +#: cps/admin.py:1710 #, python-brace-format msgid "{} User Successfully Imported" msgstr "" -#: cps/admin.py:1740 +#: cps/admin.py:1768 msgid "Books path not valid" msgstr "" -#: cps/admin.py:1746 +#: cps/admin.py:1774 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1774 +#: cps/admin.py:1802 msgid "DB is not Writeable" msgstr "" -#: cps/admin.py:1788 +#: cps/admin.py:1816 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1792 +#: cps/admin.py:1820 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1872 +#: cps/admin.py:1846 +msgid "Kepubify binary not found" +msgstr "" + +#: cps/admin.py:1894 +msgid "reverse proxy login header name" +msgstr "" + +#: cps/admin.py:1904 +msgid "reverse proxy shared secret header name" +msgstr "" + +#: cps/admin.py:1913 +msgid "Please configure both reverse proxy shared secret header name and secret" +msgstr "" + +#: cps/admin.py:1917 +msgid "Please configure reverse proxy shared secret header name and secret or disable the feature" +msgstr "" + +#: cps/admin.py:1922 +msgid "Please configure at least one trusted reverse proxy IP or CIDR" +msgstr "" + +#: cps/admin.py:1946 msgid "Password length has to be between 1 and 40" msgstr "" -#: cps/admin.py:1926 +#: cps/admin.py:1957 cps/helper.py:1007 +msgid "Please specify a valid UnRar directory" +msgstr "" + +#: cps/admin.py:2004 msgid "Database Settings updated" msgstr "" -#: cps/admin.py:1934 +#: cps/admin.py:2012 msgid "Database Configuration" msgstr "" -#: cps/admin.py:1949 cps/web.py:1295 +#: cps/admin.py:2027 cps/web.py:1305 msgid "Oops! Please complete all fields." msgstr "" -#: cps/admin.py:1958 +#: cps/admin.py:2036 msgid "E-mail is not from valid domain" msgstr "" -#: cps/admin.py:1964 +#: cps/admin.py:2042 msgid "Add new user" msgstr "" -#: cps/admin.py:1975 +#: cps/admin.py:2053 #, python-format msgid "User '%(user)s' created" msgstr "" -#: cps/admin.py:1981 +#: cps/admin.py:2059 msgid "Oops! An account already exists for this Email. or name." msgstr "" -#: cps/admin.py:2011 +#: cps/admin.py:2089 #, python-format msgid "User '%(nick)s' deleted" msgstr "" -#: cps/admin.py:2014 +#: cps/admin.py:2092 msgid "Can't delete Guest User" msgstr "" -#: cps/admin.py:2017 +#: cps/admin.py:2095 msgid "No admin user remaining, can't delete user" msgstr "" -#: cps/admin.py:2072 cps/web.py:1475 +#: cps/admin.py:2150 cps/web.py:1485 msgid "Email can't be empty and has to be a valid Email" msgstr "" -#: cps/admin.py:2098 +#: cps/admin.py:2176 #, python-format msgid "User '%(nick)s' updated" msgstr "" @@ -540,145 +579,153 @@ msgstr "" msgid "Search" msgstr "" -#: cps/converter.py:31 +#: cps/converter.py:32 msgid "not installed" msgstr "" -#: cps/converter.py:32 +#: cps/converter.py:33 msgid "Execution permissions missing" msgstr "" -#: cps/db.py:1129 cps/templates/config_edit.html:207 +#: cps/db.py:1129 cps/templates/config_edit.html:229 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:565 cps/web.py:599 cps/web.py:644 cps/web.py:684 cps/web.py:711 -#: cps/web.py:998 cps/web.py:1028 cps/web.py:1073 cps/web.py:1101 -#: cps/web.py:1140 +#: cps/web.py:567 cps/web.py:601 cps/web.py:646 cps/web.py:686 cps/web.py:713 +#: cps/web.py:1000 cps/web.py:1030 cps/web.py:1075 cps/web.py:1103 +#: cps/web.py:1142 msgid "None" msgstr "" -#: cps/editbooks.py:155 +#: cps/editbooks.py:156 #, python-format msgid "File %(file)s uploaded" msgstr "" -#: cps/editbooks.py:184 +#: cps/editbooks.py:185 msgid "Source or destination format for conversion missing" msgstr "" -#: cps/editbooks.py:192 +#: cps/editbooks.py:189 cps/editbooks.py:197 +msgid "Source format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:201 +msgid "Destination format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:209 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "" -#: cps/editbooks.py:196 +#: cps/editbooks.py:213 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "" -#: cps/editbooks.py:297 +#: cps/editbooks.py:314 msgid "Changes successfully applied" msgstr "" -#: cps/editbooks.py:317 +#: cps/editbooks.py:334 msgid "Value is missing on request" msgstr "" -#: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 -#: cps/editbooks.py:1146 cps/web.py:532 cps/web.py:1567 cps/web.py:1613 -#: cps/web.py:1663 +#: cps/editbooks.py:336 cps/editbooks.py:343 cps/editbooks.py:644 +#: cps/editbooks.py:1170 cps/web.py:534 cps/web.py:1577 cps/web.py:1623 +#: cps/web.py:1673 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "" -#: cps/editbooks.py:673 cps/editbooks.py:1503 +#: cps/editbooks.py:690 cps/editbooks.py:1547 msgid "User has no rights to upload cover" msgstr "" -#: cps/editbooks.py:694 cps/editbooks.py:938 +#: cps/editbooks.py:711 cps/editbooks.py:961 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "" -#: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 +#: cps/editbooks.py:726 cps/editbooks.py:935 cps/editbooks.py:1306 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "" -#: cps/editbooks.py:737 +#: cps/editbooks.py:754 msgid "Metadata successfully updated" msgstr "" -#: cps/editbooks.py:760 +#: cps/editbooks.py:777 #, python-brace-format msgid "Error editing book: {}" msgstr "" -#: cps/editbooks.py:856 +#: cps/editbooks.py:879 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "" -#: cps/editbooks.py:950 cps/editbooks.py:1420 +#: cps/editbooks.py:973 cps/editbooks.py:1464 msgid "File type isn't allowed to be uploaded to this server" msgstr "" -#: cps/editbooks.py:956 cps/editbooks.py:1431 +#: cps/editbooks.py:979 cps/editbooks.py:1475 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "" -#: cps/editbooks.py:960 cps/editbooks.py:1436 +#: cps/editbooks.py:983 cps/editbooks.py:1480 msgid "File to be uploaded must have an extension" msgstr "" -#: cps/editbooks.py:968 +#: cps/editbooks.py:992 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "" -#: cps/editbooks.py:988 +#: cps/editbooks.py:1012 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "" -#: cps/editbooks.py:1041 +#: cps/editbooks.py:1065 msgid "Book Format Successfully Deleted" msgstr "" -#: cps/editbooks.py:1044 cps/editbooks.py:1061 +#: cps/editbooks.py:1068 cps/editbooks.py:1085 msgid "Book Successfully Deleted" msgstr "" -#: cps/editbooks.py:1065 +#: cps/editbooks.py:1089 msgid "You are missing permissions to delete books" msgstr "" -#: cps/editbooks.py:1139 +#: cps/editbooks.py:1163 #, python-brace-format msgid "Book with id \"{}\" could not be deleted: not found" msgstr "" -#: cps/editbooks.py:1181 +#: cps/editbooks.py:1205 msgid "edit metadata" msgstr "" -#: cps/editbooks.py:1234 +#: cps/editbooks.py:1267 #, python-format msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1425 +#: cps/editbooks.py:1469 msgid "User has no rights to upload additional file formats" msgstr "" -#: cps/editbooks.py:1449 +#: cps/editbooks.py:1493 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "" -#: cps/editbooks.py:1456 +#: cps/editbooks.py:1500 #, python-format msgid "Failed to store file %(file)s." msgstr "" -#: cps/editbooks.py:1481 +#: cps/editbooks.py:1525 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "" @@ -689,9 +736,9 @@ msgstr "" #: cps/error_handler.py:108 cps/templates/layout.html:69 #: cps/templates/layout.html:104 cps/templates/login.html:27 -#: cps/templates/register.html:17 cps/web.py:1292 cps/web.py:1296 -#: cps/web.py:1302 cps/web.py:1326 cps/web.py:1330 cps/web.py:1343 -#: cps/web.py:1346 +#: cps/templates/register.html:17 cps/web.py:1302 cps/web.py:1306 +#: cps/web.py:1312 cps/web.py:1336 cps/web.py:1340 cps/web.py:1353 +#: cps/web.py:1356 msgid "Register" msgstr "" @@ -712,7 +759,7 @@ msgstr "" msgid "%(format)s format not found for book id: %(book)d" msgstr "" -#: cps/helper.py:94 cps/tasks/convert.py:91 +#: cps/helper.py:94 cps/tasks/convert.py:92 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "" @@ -898,10 +945,6 @@ msgstr "" msgid "Cover" msgstr "" -#: cps/helper.py:1006 -msgid "UnRar binary file not found" -msgstr "" - #: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "" @@ -932,7 +975,7 @@ msgstr "" msgid "Error executing Calibre" msgstr "" -#: cps/helper.py:1154 cps/templates/admin.html:216 +#: cps/helper.py:1154 cps/templates/admin.html:232 msgid "Queue all books for metadata backup" msgstr "" @@ -954,7 +997,7 @@ msgstr "" msgid "This %(oauth)s account is already linked to a different user" msgstr "" -#: cps/oauth_bb.py:147 cps/remotelogin.py:131 +#: cps/oauth_bb.py:147 cps/remotelogin.py:150 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "" @@ -1022,25 +1065,29 @@ msgstr "" msgid "{} Stars" msgstr "" -#: cps/remotelogin.py:63 cps/templates/layout.html:68 -#: cps/templates/layout.html:103 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1361 -msgid "Login" -msgstr "" - -#: cps/remotelogin.py:75 cps/remotelogin.py:109 +#: cps/remotelogin.py:46 cps/remotelogin.py:128 msgid "Token not found" msgstr "" -#: cps/remotelogin.py:84 cps/remotelogin.py:117 +#: cps/remotelogin.py:55 cps/remotelogin.py:136 msgid "Token has expired" msgstr "" -#: cps/remotelogin.py:93 +#: cps/remotelogin.py:86 cps/remotelogin.py:112 cps/templates/layout.html:68 +#: cps/templates/layout.html:103 cps/templates/login.html:4 +#: cps/templates/login.html:21 cps/web.py:1371 +msgid "Login" +msgstr "" + +#: cps/remotelogin.py:100 +msgid "Token already approved" +msgstr "" + +#: cps/remotelogin.py:108 msgid "Success! Please return to your device" msgstr "" -#: cps/render_template.py:41 cps/web.py:421 +#: cps/render_template.py:41 cps/web.py:423 msgid "Books" msgstr "" @@ -1065,7 +1112,7 @@ msgstr "" msgid "Show Downloaded Books" msgstr "" -#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:436 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:438 msgid "Top Rated Books" msgstr "" @@ -1074,7 +1121,7 @@ msgid "Show Top Rated Books" msgstr "" #: cps/render_template.py:61 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:769 +#: cps/templates/index.xml:67 cps/web.py:771 msgid "Read Books" msgstr "" @@ -1083,7 +1130,7 @@ msgid "Show Read and Unread" msgstr "" #: cps/render_template.py:65 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:772 +#: cps/templates/index.xml:74 cps/web.py:774 msgid "Unread Books" msgstr "" @@ -1101,7 +1148,7 @@ msgid "Show Random Books" msgstr "" #: cps/render_template.py:71 cps/templates/book_table.html:93 -#: cps/templates/index.xml:97 cps/web.py:1144 +#: cps/templates/index.xml:97 cps/web.py:1146 msgid "Categories" msgstr "" @@ -1111,7 +1158,7 @@ msgstr "" #: cps/render_template.py:74 cps/templates/book_edit.html:86 #: cps/templates/book_table.html:94 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1034 cps/web.py:1046 +#: cps/templates/search_form.html:70 cps/web.py:1036 cps/web.py:1048 msgid "Series" msgstr "" @@ -1129,7 +1176,7 @@ msgid "Show Author Section" msgstr "" #: cps/render_template.py:81 cps/templates/book_table.html:98 -#: cps/templates/index.xml:88 cps/web.py:1002 +#: cps/templates/index.xml:88 cps/web.py:1004 msgid "Publishers" msgstr "" @@ -1139,7 +1186,7 @@ msgstr "" #: cps/render_template.py:84 cps/templates/book_table.html:96 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1116 +#: cps/web.py:1118 msgid "Languages" msgstr "" @@ -1163,7 +1210,7 @@ msgstr "" msgid "Show File Formats Section" msgstr "" -#: cps/render_template.py:95 cps/web.py:795 +#: cps/render_template.py:95 cps/web.py:797 msgid "Archived Books" msgstr "" @@ -1171,7 +1218,7 @@ msgstr "" msgid "Show Archived Books" msgstr "" -#: cps/render_template.py:100 cps/web.py:831 +#: cps/render_template.py:100 cps/web.py:833 msgid "Books List" msgstr "" @@ -1404,150 +1451,154 @@ msgstr "" msgid "No release information available" msgstr "" -#: cps/templates/index.html:6 cps/web.py:448 +#: cps/templates/index.html:6 cps/web.py:450 msgid "Discover (Random Books)" msgstr "" -#: cps/web.py:484 +#: cps/web.py:486 msgid "Hot Books (Most Downloaded)" msgstr "" -#: cps/web.py:515 +#: cps/web.py:517 #, python-format msgid "Downloaded books by %(user)s" msgstr "" -#: cps/web.py:548 +#: cps/web.py:550 #, python-format msgid "Author: %(name)s" msgstr "" -#: cps/web.py:584 +#: cps/web.py:586 #, python-format msgid "Publisher: %(name)s" msgstr "" -#: cps/web.py:612 +#: cps/web.py:614 #, python-format msgid "Series: %(serie)s" msgstr "" -#: cps/web.py:626 +#: cps/web.py:628 msgid "Rating: None" msgstr "" -#: cps/web.py:635 +#: cps/web.py:637 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:666 +#: cps/web.py:668 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:701 +#: cps/web.py:703 #, python-format msgid "Category: %(name)s" msgstr "" -#: cps/web.py:730 +#: cps/web.py:732 #, python-format msgid "Language: %(name)s" msgstr "" -#: cps/templates/admin.html:16 cps/web.py:974 +#: cps/templates/admin.html:16 cps/web.py:976 msgid "Downloads" msgstr "" -#: cps/web.py:1076 +#: cps/web.py:1078 msgid "Ratings list" msgstr "" -#: cps/web.py:1103 +#: cps/web.py:1105 msgid "File formats list" msgstr "" -#: cps/web.py:1264 +#: cps/web.py:1272 +msgid "Book format not supported" +msgstr "" + +#: cps/web.py:1274 msgid "Please configure the SMTP mail settings first..." msgstr "" -#: cps/web.py:1270 +#: cps/web.py:1280 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "" -#: cps/web.py:1273 +#: cps/web.py:1283 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "" -#: cps/web.py:1275 +#: cps/web.py:1285 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "" -#: cps/web.py:1291 cps/web.py:1342 +#: cps/web.py:1301 cps/web.py:1352 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "" -#: cps/web.py:1328 +#: cps/web.py:1338 msgid "Oops! Your Email is not allowed." msgstr "" -#: cps/web.py:1331 +#: cps/web.py:1341 msgid "Success! Confirmation Email has been sent." msgstr "" -#: cps/web.py:1376 cps/web.py:1390 +#: cps/web.py:1386 cps/web.py:1400 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1399 +#: cps/web.py:1409 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1406 +#: cps/web.py:1416 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1411 +#: cps/web.py:1421 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1415 cps/web.py:1440 +#: cps/web.py:1425 cps/web.py:1450 msgid "Wrong Username or Password" msgstr "" -#: cps/web.py:1422 +#: cps/web.py:1432 msgid "New Password was sent to your email address" msgstr "" -#: cps/web.py:1426 +#: cps/web.py:1436 msgid "An unknown error occurred. Please try again later." msgstr "" -#: cps/web.py:1428 +#: cps/web.py:1438 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1436 +#: cps/web.py:1446 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1501 cps/web.py:1551 +#: cps/web.py:1511 cps/web.py:1561 #, python-format msgid "%(name)s's Profile" msgstr "" -#: cps/web.py:1517 +#: cps/web.py:1527 msgid "Success! Profile Updated" msgstr "" -#: cps/web.py:1521 +#: cps/web.py:1531 msgid "Oops! An account already exists for this Email." msgstr "" @@ -1559,46 +1610,46 @@ msgstr "" msgid "Delete temp folder contents" msgstr "" -#: cps/tasks/convert.py:112 +#: cps/tasks/convert.py:113 #, python-format msgid "%(book)s send to E-Reader" msgstr "" -#: cps/tasks/convert.py:177 +#: cps/tasks/convert.py:180 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "" -#: cps/tasks/convert.py:211 +#: cps/tasks/convert.py:214 #, python-format msgid "%(format)s format not found on disk" msgstr "" -#: cps/tasks/convert.py:215 +#: cps/tasks/convert.py:218 msgid "Ebook converter failed with unknown error" msgstr "" -#: cps/tasks/convert.py:234 +#: cps/tasks/convert.py:237 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "" -#: cps/tasks/convert.py:254 +#: cps/tasks/convert.py:257 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "" -#: cps/tasks/convert.py:291 cps/tasks/convert.py:342 +#: cps/tasks/convert.py:294 cps/tasks/convert.py:345 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:322 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "" -#: cps/tasks/convert.py:347 +#: cps/tasks/convert.py:350 msgid "Convert" msgstr "" @@ -1684,7 +1735,7 @@ msgstr "" #: cps/templates/admin.html:25 cps/templates/book_edit.html:17 #: cps/templates/book_table.html:131 cps/templates/book_table.html:180 -#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:115 +#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:117 #: cps/templates/user_edit.html:67 cps/templates/user_table.html:149 msgid "Delete" msgstr "" @@ -1774,128 +1825,145 @@ msgstr "" msgid "Reverse Proxy Login" msgstr "" -#: cps/templates/admin.html:154 cps/templates/config_edit.html:176 +#: cps/templates/admin.html:154 cps/templates/config_edit.html:180 msgid "Reverse Proxy Header Name" msgstr "" -#: cps/templates/admin.html:159 +#: cps/templates/admin.html:158 +msgid "Reverse Proxy Trusted IPs/CIDRs" +msgstr "" + +#: cps/templates/admin.html:162 cps/templates/config_edit.html:193 +msgid "Reverse Proxy Shared Secret Header Name" +msgstr "" + +#: cps/templates/admin.html:166 +msgid "Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/admin.html:170 +msgid "Reverse Proxy Shared Secret Configured" +msgstr "" + +#: cps/templates/admin.html:175 msgid "Edit Calibre Database Configuration" msgstr "" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:176 msgid "Edit Basic Configuration" msgstr "" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:177 msgid "Edit UI Configuration" msgstr "" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:183 msgid "Scheduled Tasks" msgstr "" -#: cps/templates/admin.html:170 cps/templates/schedule_edit.html:12 +#: cps/templates/admin.html:186 cps/templates/schedule_edit.html:12 #: cps/templates/tasks.html:18 msgid "Start Time" msgstr "" -#: cps/templates/admin.html:174 cps/templates/schedule_edit.html:20 +#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:20 msgid "Maximum Duration" msgstr "" -#: cps/templates/admin.html:178 cps/templates/schedule_edit.html:29 +#: cps/templates/admin.html:194 cps/templates/schedule_edit.html:29 msgid "Generate Thumbnails" msgstr "" -#: cps/templates/admin.html:182 +#: cps/templates/admin.html:198 msgid "Generate series cover thumbnails" msgstr "" -#: cps/templates/admin.html:186 cps/templates/admin.html:208 +#: cps/templates/admin.html:202 cps/templates/admin.html:224 #: cps/templates/schedule_edit.html:37 msgid "Reconnect Calibre Database" msgstr "" -#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 +#: cps/templates/admin.html:206 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" msgstr "" -#: cps/templates/admin.html:197 +#: cps/templates/admin.html:213 msgid "Refresh Thumbnail Cache" msgstr "" -#: cps/templates/admin.html:203 +#: cps/templates/admin.html:219 msgid "Administration" msgstr "" -#: cps/templates/admin.html:204 +#: cps/templates/admin.html:220 msgid "Download Debug Package" msgstr "" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:221 msgid "View Logs" msgstr "" -#: cps/templates/admin.html:211 +#: cps/templates/admin.html:227 msgid "Restart" msgstr "" -#: cps/templates/admin.html:212 +#: cps/templates/admin.html:228 msgid "Shutdown" msgstr "" -#: cps/templates/admin.html:221 +#: cps/templates/admin.html:237 msgid "Version Information" msgstr "" -#: cps/templates/admin.html:225 +#: cps/templates/admin.html:241 msgid "Version" msgstr "" -#: cps/templates/admin.html:226 +#: cps/templates/admin.html:242 msgid "Details" msgstr "" -#: cps/templates/admin.html:232 +#: cps/templates/admin.html:248 msgid "Current Version" msgstr "" -#: cps/templates/admin.html:239 +#: cps/templates/admin.html:255 msgid "Check for Update" msgstr "" -#: cps/templates/admin.html:240 +#: cps/templates/admin.html:256 msgid "Perform Update" msgstr "" -#: cps/templates/admin.html:253 +#: cps/templates/admin.html:269 msgid "Are you sure you want to restart?" msgstr "" -#: cps/templates/admin.html:258 cps/templates/admin.html:272 -#: cps/templates/admin.html:292 cps/templates/config_db.html:82 +#: cps/templates/admin.html:274 cps/templates/admin.html:288 +#: cps/templates/admin.html:308 cps/templates/config_db.html:82 msgid "OK" msgstr "" -#: cps/templates/admin.html:259 cps/templates/admin.html:273 +#: cps/templates/admin.html:275 cps/templates/admin.html:289 #: cps/templates/book_edit.html:220 cps/templates/book_table.html:162 #: cps/templates/book_table.html:181 cps/templates/book_table.html:201 #: cps/templates/book_table.html:221 cps/templates/book_table.html:241 #: cps/templates/book_table.html:261 cps/templates/book_table.html:316 -#: cps/templates/config_db.html:66 cps/templates/config_edit.html:431 +#: cps/templates/config_db.html:66 cps/templates/config_edit.html:453 #: cps/templates/config_view_edit.html:175 cps/templates/detail.html:350 -#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:98 -#: cps/templates/modal_dialogs.html:116 cps/templates/modal_dialogs.html:134 +#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:100 +#: cps/templates/modal_dialogs.html:118 cps/templates/modal_dialogs.html:136 +#: cps/templates/remote_login_verify.html:16 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 #: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "" -#: cps/templates/admin.html:271 +#: cps/templates/admin.html:287 msgid "Are you sure you want to shutdown?" msgstr "" -#: cps/templates/admin.html:283 +#: cps/templates/admin.html:299 msgid "Updating, please do not reload this page" msgstr "" @@ -2136,7 +2204,7 @@ msgid "Fetch Metadata" msgstr "" #: cps/templates/book_edit.html:219 cps/templates/config_db.html:65 -#: cps/templates/config_edit.html:430 cps/templates/config_view_edit.html:174 +#: cps/templates/config_edit.html:452 cps/templates/config_view_edit.html:174 #: cps/templates/email_edit.html:65 cps/templates/schedule_edit.html:44 #: cps/templates/shelf_edit.html:25 cps/templates/shelf_order.html:41 #: cps/templates/user_edit.html:142 @@ -2508,214 +2576,234 @@ msgstr "" msgid "Allow Reverse Proxy Authentication" msgstr "" -#: cps/templates/config_edit.html:183 -msgid "Login type" +#: cps/templates/config_edit.html:176 +msgid "Security Warning" msgstr "" -#: cps/templates/config_edit.html:185 -msgid "Use Standard Authentication" +#: cps/templates/config_edit.html:177 +msgid "Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled." msgstr "" -#: cps/templates/config_edit.html:187 -msgid "Use LDAP Authentication" +#: cps/templates/config_edit.html:184 +msgid "Reverse Proxy Trusted IPs/CIDRs (Comma Separated)" msgstr "" -#: cps/templates/config_edit.html:190 -msgid "Use OAuth" +#: cps/templates/config_edit.html:189 +msgid "Enable Reverse Proxy Shared Secret Header" msgstr "" #: cps/templates/config_edit.html:197 -msgid "LDAP Server Host Name or IP Address" -msgstr "" - -#: cps/templates/config_edit.html:201 -msgid "LDAP Server Port" +msgid "Reverse Proxy Shared Secret" msgstr "" #: cps/templates/config_edit.html:205 -msgid "LDAP Encryption" +msgid "Login type" msgstr "" -#: cps/templates/config_edit.html:208 -msgid "TLS" +#: cps/templates/config_edit.html:207 +msgid "Use Standard Authentication" msgstr "" #: cps/templates/config_edit.html:209 -msgid "SSL" +msgid "Use LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:213 -msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" +#: cps/templates/config_edit.html:212 +msgid "Use OAuth" msgstr "" -#: cps/templates/config_edit.html:220 -msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" +#: cps/templates/config_edit.html:219 +msgid "LDAP Server Host Name or IP Address" +msgstr "" + +#: cps/templates/config_edit.html:223 +msgid "LDAP Server Port" msgstr "" #: cps/templates/config_edit.html:227 +msgid "LDAP Encryption" +msgstr "" + +#: cps/templates/config_edit.html:230 +msgid "TLS" +msgstr "" + +#: cps/templates/config_edit.html:231 +msgid "SSL" +msgstr "" + +#: cps/templates/config_edit.html:235 +msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" +msgstr "" + +#: cps/templates/config_edit.html:242 +msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" +msgstr "" + +#: cps/templates/config_edit.html:249 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" msgstr "" -#: cps/templates/config_edit.html:236 +#: cps/templates/config_edit.html:258 msgid "LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:260 msgid "Anonymous" msgstr "" -#: cps/templates/config_edit.html:239 +#: cps/templates/config_edit.html:261 msgid "Unauthenticated" msgstr "" -#: cps/templates/config_edit.html:240 +#: cps/templates/config_edit.html:262 msgid "Simple" msgstr "" -#: cps/templates/config_edit.html:245 +#: cps/templates/config_edit.html:267 msgid "LDAP Administrator Username" msgstr "" -#: cps/templates/config_edit.html:251 +#: cps/templates/config_edit.html:273 msgid "LDAP Administrator Password" msgstr "" -#: cps/templates/config_edit.html:256 +#: cps/templates/config_edit.html:278 msgid "LDAP Distinguished Name (DN)" msgstr "" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:282 msgid "LDAP User Object Filter" msgstr "" -#: cps/templates/config_edit.html:265 +#: cps/templates/config_edit.html:287 msgid "LDAP Server is OpenLDAP?" msgstr "" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:289 msgid "Following Settings are Needed For User Import" msgstr "" -#: cps/templates/config_edit.html:269 +#: cps/templates/config_edit.html:291 msgid "LDAP Group Object Filter" msgstr "" -#: cps/templates/config_edit.html:273 +#: cps/templates/config_edit.html:295 msgid "LDAP Group Name" msgstr "" -#: cps/templates/config_edit.html:277 +#: cps/templates/config_edit.html:299 msgid "LDAP Group Members Field" msgstr "" -#: cps/templates/config_edit.html:281 +#: cps/templates/config_edit.html:303 msgid "LDAP Member User Filter Detection" msgstr "" -#: cps/templates/config_edit.html:283 +#: cps/templates/config_edit.html:305 msgid "Autodetect" msgstr "" -#: cps/templates/config_edit.html:284 +#: cps/templates/config_edit.html:306 msgid "Custom Filter" msgstr "" -#: cps/templates/config_edit.html:289 +#: cps/templates/config_edit.html:311 msgid "LDAP Member User Filter" msgstr "" -#: cps/templates/config_edit.html:300 +#: cps/templates/config_edit.html:322 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "" -#: cps/templates/config_edit.html:303 +#: cps/templates/config_edit.html:325 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "" -#: cps/templates/config_edit.html:307 +#: cps/templates/config_edit.html:329 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "" -#: cps/templates/config_edit.html:323 +#: cps/templates/config_edit.html:345 msgid "External binaries" msgstr "" -#: cps/templates/config_edit.html:329 +#: cps/templates/config_edit.html:351 msgid "Path to Calibre Binaries" msgstr "" -#: cps/templates/config_edit.html:337 +#: cps/templates/config_edit.html:359 msgid "Calibre E-Book Converter Settings" msgstr "" -#: cps/templates/config_edit.html:340 +#: cps/templates/config_edit.html:362 msgid "Path to Kepubify E-Book Converter" msgstr "" -#: cps/templates/config_edit.html:348 +#: cps/templates/config_edit.html:370 msgid "Location of Unrar binary" msgstr "" -#: cps/templates/config_edit.html:364 +#: cps/templates/config_edit.html:386 msgid "Security Settings" msgstr "" -#: cps/templates/config_edit.html:372 +#: cps/templates/config_edit.html:394 msgid "Limit failed login attempts" msgstr "" -#: cps/templates/config_edit.html:376 +#: cps/templates/config_edit.html:398 msgid "Configure Backend for Limiter" msgstr "" -#: cps/templates/config_edit.html:380 +#: cps/templates/config_edit.html:402 msgid "Options for Limiter Backend" msgstr "" -#: cps/templates/config_edit.html:386 +#: cps/templates/config_edit.html:408 msgid "Check if file extensions matches file content on upload" msgstr "" -#: cps/templates/config_edit.html:389 +#: cps/templates/config_edit.html:411 msgid "Session protection" msgstr "" -#: cps/templates/config_edit.html:391 +#: cps/templates/config_edit.html:413 msgid "Basic" msgstr "" -#: cps/templates/config_edit.html:392 +#: cps/templates/config_edit.html:414 msgid "Strong" msgstr "" -#: cps/templates/config_edit.html:397 +#: cps/templates/config_edit.html:419 msgid "User Password policy" msgstr "" -#: cps/templates/config_edit.html:401 +#: cps/templates/config_edit.html:423 msgid "Minimum password length" msgstr "" -#: cps/templates/config_edit.html:406 +#: cps/templates/config_edit.html:428 msgid "Enforce number" msgstr "" -#: cps/templates/config_edit.html:410 +#: cps/templates/config_edit.html:432 msgid "Enforce lowercase characters" msgstr "" -#: cps/templates/config_edit.html:414 +#: cps/templates/config_edit.html:436 msgid "Enforce uppercase characters" msgstr "" -#: cps/templates/config_edit.html:418 +#: cps/templates/config_edit.html:440 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" msgstr "" -#: cps/templates/config_edit.html:422 +#: cps/templates/config_edit.html:444 msgid "Enforce special characters" msgstr "" @@ -3182,27 +3270,27 @@ msgstr "" msgid "Choose File Location" msgstr "" -#: cps/templates/modal_dialogs.html:81 +#: cps/templates/modal_dialogs.html:82 msgid "type" msgstr "" -#: cps/templates/modal_dialogs.html:82 +#: cps/templates/modal_dialogs.html:83 msgid "name" msgstr "" -#: cps/templates/modal_dialogs.html:83 +#: cps/templates/modal_dialogs.html:84 msgid "size" msgstr "" -#: cps/templates/modal_dialogs.html:89 +#: cps/templates/modal_dialogs.html:90 msgid "Parent Directory" msgstr "" -#: cps/templates/modal_dialogs.html:97 +#: cps/templates/modal_dialogs.html:99 msgid "Select" msgstr "" -#: cps/templates/modal_dialogs.html:133 cps/templates/tasks.html:46 +#: cps/templates/modal_dialogs.html:135 cps/templates/tasks.html:46 msgid "Ok" msgstr "" @@ -3458,6 +3546,31 @@ msgstr "" msgid "This verification link will expire in 10 minutes." msgstr "" +#: cps/templates/remote_login_verify.html:4 +msgid "Approve Magic Link Login" +msgstr "" + +#: cps/templates/remote_login_verify.html:5 +msgid "Review the device that requested access before approving this login." +msgstr "" + +#: cps/templates/remote_login_verify.html:7 +msgid "IP address" +msgstr "" + +#: cps/templates/remote_login_verify.html:9 +msgid "Browser" +msgstr "" + +#: cps/templates/remote_login_verify.html:12 +#, python-format +msgid "If you approve this request, the device that started it will be logged in as %(username)s." +msgstr "" + +#: cps/templates/remote_login_verify.html:15 +msgid "Approve Login" +msgstr "" + #: cps/templates/schedule_edit.html:33 msgid "Generate Series Cover Thumbnails" msgstr "" From c3756a903e7d91b2ab7e12c1b5ff818a61cc1e16 Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Sat, 8 Aug 2026 16:13:10 +0200 Subject: [PATCH 28/29] Preparation for release --- cps/constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cps/constants.py b/cps/constants.py index 1ddef87cf..213c2f370 100644 --- a/cps/constants.py +++ b/cps/constants.py @@ -175,7 +175,7 @@ BookMeta = namedtuple('BookMeta', 'file_path, extension, title, author, cover, d 'series_id, languages, publisher, pubdate, identifiers') # python build process likes to have x.y.zbw -> b for beta and w a counting number -STABLE_VERSION = '0.6.27b' +STABLE_VERSION = '0.6.27' NIGHTLY_VERSION = dict() NIGHTLY_VERSION[0] = '$Format:%H$' From bd8bc7bb3c3a38e9a455e8026210ea344c488504 Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Sat, 8 Aug 2026 18:18:32 +0200 Subject: [PATCH 29/29] Version bump --- cps/constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cps/constants.py b/cps/constants.py index 213c2f370..dd233bca5 100644 --- a/cps/constants.py +++ b/cps/constants.py @@ -175,7 +175,7 @@ BookMeta = namedtuple('BookMeta', 'file_path, extension, title, author, cover, d 'series_id, languages, publisher, pubdate, identifiers') # python build process likes to have x.y.zbw -> b for beta and w a counting number -STABLE_VERSION = '0.6.27' +STABLE_VERSION = '0.6.28b' NIGHTLY_VERSION = dict() NIGHTLY_VERSION[0] = '$Format:%H$'

NYQBf43e+2q4d;e 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 J^O>dlSpg&xC@TN} delta 10161 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 diff --git a/cps/translations/sv/LC_MESSAGES/messages.po b/cps/translations/sv/LC_MESSAGES/messages.po index 8fe6e29ec..91c512f27 100644 --- a/cps/translations/sv/LC_MESSAGES/messages.po +++ b/cps/translations/sv/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2026-08-01 11:42+0200\n" +"POT-Creation-Date: 2026-08-08 16:08+0200\n" "PO-Revision-Date: 2021-05-13 11:00+0000\n" "Last-Translator: Jonatan Nyberg \n" "Language: sv\n" @@ -16,519 +16,558 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" +"Generated-By: Babel 2.18.0\n" #: cps/about.py:85 msgid "Statistics" msgstr "Statistik" -#: cps/admin.py:151 +#: cps/admin.py:154 msgid "Server restarted, please reload page." msgstr "" -#: cps/admin.py:153 +#: cps/admin.py:156 msgid "Performing Server shutdown, please close window." msgstr "" -#: cps/admin.py:161 +#: cps/admin.py:164 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:164 +#: cps/admin.py:167 msgid "Unknown command" msgstr "Okänt kommando" -#: cps/admin.py:175 +#: cps/admin.py:178 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "" -#: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 -#: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 -#: cps/uploader.py:117 +#: cps/admin.py:211 cps/editbooks.py:825 cps/editbooks.py:875 +#: cps/editbooks.py:1564 cps/templates/remote_login_verify.html:8 +#: cps/templates/remote_login_verify.html:10 cps/updater.py:615 +#: cps/uploader.py:117 cps/uploader.py:126 msgid "Unknown" msgstr "Okänd" -#: cps/admin.py:233 +#: cps/admin.py:236 msgid "Admin page" msgstr "Administrationssida" -#: cps/admin.py:253 +#: cps/admin.py:256 msgid "Basic Configuration" msgstr "Grundläggande konfiguration" -#: cps/admin.py:291 +#: cps/admin.py:294 msgid "UI Configuration" msgstr "Användargränssnitt konfiguration" -#: cps/admin.py:315 cps/admin.py:1002 cps/db.py:809 cps/search.py:150 -#: cps/web.py:750 +#: cps/admin.py:318 cps/admin.py:1005 cps/db.py:809 cps/search.py:150 +#: cps/web.py:752 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "" -#: cps/admin.py:333 cps/templates/admin.html:51 +#: cps/admin.py:336 cps/templates/admin.html:51 msgid "Edit Users" msgstr "Redigera användare" -#: cps/admin.py:378 cps/opds.py:559 cps/templates/grid.html:14 +#: cps/admin.py:381 cps/opds.py:559 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Alla" -#: cps/admin.py:401 cps/admin.py:1432 +#: cps/admin.py:404 cps/admin.py:1460 msgid "User not found" msgstr "Användaren hittades inte" -#: cps/admin.py:415 +#: cps/admin.py:418 #, python-brace-format msgid "{} users deleted successfully" msgstr "{} användare har tagits bort" -#: cps/admin.py:438 cps/templates/config_view_edit.html:133 +#: cps/admin.py:441 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Visa alla" -#: cps/admin.py:459 cps/admin.py:465 +#: cps/admin.py:462 cps/admin.py:468 msgid "Malformed request" msgstr "Felaktig begäran" -#: cps/admin.py:477 cps/admin.py:2078 +#: cps/admin.py:480 cps/admin.py:2156 msgid "Guest Name can't be changed" msgstr "Gästnamn kan inte ändras" -#: cps/admin.py:489 +#: cps/admin.py:492 msgid "Guest can't have this role" msgstr "Gäst kan inte ha den här rollen" -#: cps/admin.py:501 cps/admin.py:2032 +#: cps/admin.py:504 cps/admin.py:2110 msgid "No admin user remaining, can't remove admin role" msgstr "Ingen administratörsanvändare kvar, kan inte ta bort administratörsrollen" -#: cps/admin.py:505 cps/admin.py:519 +#: cps/admin.py:508 cps/admin.py:522 msgid "Value has to be true or false" msgstr "Värdet måste vara sant eller falskt" -#: cps/admin.py:507 +#: cps/admin.py:510 msgid "Invalid role" msgstr "Ogiltig roll" -#: cps/admin.py:511 +#: cps/admin.py:514 msgid "Guest can't have this view" msgstr "Gästen kan inte ha den här vyn" -#: cps/admin.py:521 +#: cps/admin.py:524 msgid "Invalid view" msgstr "Ogiltig vy" -#: cps/admin.py:524 +#: cps/admin.py:527 msgid "Guest's Locale is determined automatically and can't be set" msgstr "Gästens språk bestäms automatiskt och kan inte ställas in" -#: cps/admin.py:528 +#: cps/admin.py:531 msgid "No Valid Locale Given" msgstr "Inget giltigt språk anges" -#: cps/admin.py:539 +#: cps/admin.py:542 msgid "No Valid Book Language Given" msgstr "Inget giltigt bokspråk anges" -#: cps/admin.py:541 cps/editbooks.py:243 cps/editbooks.py:428 -#: cps/editbooks.py:430 +#: cps/admin.py:544 cps/editbooks.py:260 cps/editbooks.py:445 +#: cps/editbooks.py:447 msgid "Parameter not found" msgstr "Parameter hittades inte" -#: cps/admin.py:578 +#: cps/admin.py:581 msgid "Invalid Read Column" msgstr "" -#: cps/admin.py:584 +#: cps/admin.py:587 msgid "Invalid Restricted Column" msgstr "" -#: cps/admin.py:604 cps/admin.py:1903 +#: cps/admin.py:607 cps/admin.py:1981 msgid "Calibre-Web configuration updated" msgstr "Calibre-Web konfiguration uppdaterad" -#: cps/admin.py:616 +#: cps/admin.py:619 msgid "Do you really want to delete the Kobo Token?" msgstr "Vill du verkligen ta bort Kobo-token?" -#: cps/admin.py:618 +#: cps/admin.py:621 msgid "Do you really want to delete this domain?" msgstr "Vill du verkligen ta bort den här domänen?" -#: cps/admin.py:620 +#: cps/admin.py:623 msgid "Do you really want to delete this user?" msgstr "Vill du verkligen ta bort den här användaren?" -#: cps/admin.py:622 +#: cps/admin.py:625 msgid "Do you really want to delete this book?" msgstr "" -#: cps/admin.py:624 +#: cps/admin.py:627 msgid "Are you sure you want to delete this shelf?" msgstr "Är du säker på att du vill ta bort hyllan?" -#: cps/admin.py:626 +#: cps/admin.py:629 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Är du säker på att du vill ändra språk för valda användare?" -#: cps/admin.py:628 +#: cps/admin.py:631 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "Är du säker på att du vill ändra synliga bokspråk för valda användare?" -#: cps/admin.py:630 +#: cps/admin.py:633 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "Är du säker på att du vill ändra den valda rollen för de valda användarna?" -#: cps/admin.py:632 +#: cps/admin.py:635 msgid "Are you sure you want to change the archive status for the selected book(s)?" msgstr "" -#: cps/admin.py:634 +#: cps/admin.py:637 msgid "Are you sure you want to change the read status for the selected book(s)?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:639 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Är du säker på att du vill ändra de valda begränsningarna för de valda användarna?" -#: cps/admin.py:638 +#: cps/admin.py:641 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "Är du säker på att du vill ändra de valda synlighetsbegränsningarna för de valda användarna?" -#: cps/admin.py:641 +#: cps/admin.py:644 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "" -#: cps/admin.py:643 +#: cps/admin.py:646 msgid "Are you sure you want to change Calibre library location?" msgstr "" -#: cps/admin.py:645 +#: cps/admin.py:648 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "" -#: cps/admin.py:648 +#: cps/admin.py:651 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "" -#: cps/admin.py:891 cps/admin.py:897 cps/admin.py:907 cps/admin.py:917 +#: cps/admin.py:894 cps/admin.py:900 cps/admin.py:910 cps/admin.py:920 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Förneka" -#: cps/admin.py:893 cps/admin.py:899 cps/admin.py:909 cps/admin.py:919 +#: cps/admin.py:896 cps/admin.py:902 cps/admin.py:912 cps/admin.py:922 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Tillåt" -#: cps/admin.py:952 +#: cps/admin.py:955 #, python-brace-format msgid "{} sync entries deleted" msgstr "" -#: cps/admin.py:993 +#: cps/admin.py:996 msgid "Tag not found" msgstr "Taggen hittades inte" -#: cps/admin.py:1011 +#: cps/admin.py:1014 msgid "Invalid Action" msgstr "Ogiltig åtgärd" -#: cps/admin.py:1138 +#: cps/admin.py:1137 +#, python-format +msgid "Invalid reverse proxy trusted IP/CIDR entry: %(entry)s" +msgstr "" + +#: cps/admin.py:1148 +#, python-format +msgid "Invalid %(label)s: %(value)s" +msgstr "" + +#: cps/admin.py:1166 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json är inte konfigurerad för webbapplikation" -#: cps/admin.py:1183 +#: cps/admin.py:1211 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "Loggfilens plats är inte giltig, vänligen ange rätt sökväg" -#: cps/admin.py:1189 +#: cps/admin.py:1217 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "Åtkomstloggplatsens plats är inte giltig, vänligen ange rätt sökväg" -#: cps/admin.py:1223 +#: cps/admin.py:1251 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Vänligen ange en LDAP-leverantör, port, DN och användarobjektidentifierare" -#: cps/admin.py:1229 +#: cps/admin.py:1257 msgid "Please Enter a LDAP Service Account and Password" msgstr "" -#: cps/admin.py:1232 +#: cps/admin.py:1260 msgid "Please Enter a LDAP Service Account" msgstr "" -#: cps/admin.py:1237 +#: cps/admin.py:1265 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "LDAP-gruppobjektfilter måste ha en \"%s\"-formatidentifierare" -#: cps/admin.py:1239 +#: cps/admin.py:1267 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "LDAP-gruppobjektfilter har omatchande parentes" -#: cps/admin.py:1243 +#: cps/admin.py:1271 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP-användarobjektfilter måste ha en \"%s\"-formatidentifierare" -#: cps/admin.py:1245 +#: cps/admin.py:1273 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "LDAP-användarobjektfilter har omatchad parentes" -#: cps/admin.py:1252 +#: cps/admin.py:1280 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "Användarfilter för LDAP-medlemmar måste ha en \"%s\"-formatidentifierare" -#: cps/admin.py:1254 +#: cps/admin.py:1282 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "Användarfilter för LDAP-medlemmar har omatchad parentes" -#: cps/admin.py:1261 +#: cps/admin.py:1289 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP-certifikat, certifikat eller nyckelplats är inte giltigt, vänligen ange rätt sökväg" -#: cps/admin.py:1292 cps/templates/admin.html:53 +#: cps/admin.py:1320 cps/templates/admin.html:53 msgid "Add New User" msgstr "Lägg till ny användare" -#: cps/admin.py:1301 cps/templates/admin.html:100 +#: cps/admin.py:1329 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Ändra SMTP-inställningar" -#: cps/admin.py:1320 +#: cps/admin.py:1348 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1340 cps/admin.py:1343 cps/admin.py:1728 cps/admin.py:1887 -#: cps/admin.py:1985 cps/admin.py:2106 cps/editbooks.py:169 -#: cps/editbooks.py:755 cps/editbooks.py:1474 cps/shelf.py:90 cps/shelf.py:144 +#: cps/admin.py:1368 cps/admin.py:1371 cps/admin.py:1756 cps/admin.py:1965 +#: cps/admin.py:2063 cps/admin.py:2184 cps/editbooks.py:170 +#: cps/editbooks.py:772 cps/editbooks.py:1518 cps/shelf.py:90 cps/shelf.py:144 #: cps/shelf.py:194 cps/shelf.py:237 cps/shelf.py:287 cps/shelf.py:327 -#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:160 cps/web.py:1526 +#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:161 cps/web.py:1536 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Databasfel: %(error)s." -#: cps/admin.py:1350 +#: cps/admin.py:1378 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Testa e-post i kö för att skicka till %(email)s, vänligen kontrollera Uppgifter för resultat" -#: cps/admin.py:1353 +#: cps/admin.py:1381 #, 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:1355 +#: cps/admin.py:1383 msgid "Please configure your e-mail address first..." msgstr "Vänligen konfigurera din e-postadress först..." -#: cps/admin.py:1357 +#: cps/admin.py:1385 msgid "Email Server Settings updated" msgstr "E-postserverinställningar uppdaterade" -#: cps/admin.py:1380 cps/templates/admin.html:195 +#: cps/admin.py:1408 cps/templates/admin.html:211 msgid "Edit Scheduled Tasks Settings" msgstr "" -#: cps/admin.py:1392 +#: cps/admin.py:1420 msgid "Invalid start time for task specified" msgstr "" -#: cps/admin.py:1397 +#: cps/admin.py:1425 msgid "Invalid duration for task specified" msgstr "" -#: cps/admin.py:1407 +#: cps/admin.py:1435 msgid "Scheduled tasks settings updated" msgstr "" -#: cps/admin.py:1417 cps/admin.py:1466 cps/admin.py:2102 cps/web.py:1325 +#: cps/admin.py:1445 cps/admin.py:1494 cps/admin.py:2180 cps/web.py:1335 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Ett okänt fel uppstod. Försök igen senare." -#: cps/admin.py:1421 +#: cps/admin.py:1449 msgid "Settings DB is not Writeable" msgstr "" -#: cps/admin.py:1451 cps/admin.py:2094 +#: cps/admin.py:1479 cps/admin.py:2172 #, python-format msgid "Edit User %(nick)s" msgstr "Redigera användaren %(nick)s" -#: cps/admin.py:1463 +#: cps/admin.py:1491 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "" -#: cps/admin.py:1469 +#: cps/admin.py:1497 msgid "Oops! Please configure the SMTP mail settings." msgstr "" -#: cps/admin.py:1480 +#: cps/admin.py:1508 msgid "Logfile viewer" msgstr "Visaren för loggfil" -#: cps/admin.py:1546 +#: cps/admin.py:1574 msgid "Requesting update package" msgstr "Begär uppdateringspaketet" -#: cps/admin.py:1547 +#: cps/admin.py:1575 msgid "Downloading update package" msgstr "Hämtar uppdateringspaketet" -#: cps/admin.py:1548 +#: cps/admin.py:1576 msgid "Unzipping update package" msgstr "Packar upp uppdateringspaketet" -#: cps/admin.py:1549 +#: cps/admin.py:1577 msgid "Replacing files" msgstr "Ersätta filer" -#: cps/admin.py:1550 +#: cps/admin.py:1578 msgid "Database connections are closed" msgstr "Databasanslutningarna är stängda" -#: cps/admin.py:1551 +#: cps/admin.py:1579 msgid "Stopping server" msgstr "Stoppar server" -#: cps/admin.py:1552 +#: cps/admin.py:1580 msgid "Update finished, please press okay and reload page" msgstr "Uppdatering klar, tryck på okej och uppdatera sidan" -#: cps/admin.py:1553 cps/admin.py:1554 cps/admin.py:1555 cps/admin.py:1556 -#: cps/admin.py:1557 cps/admin.py:1558 +#: cps/admin.py:1581 cps/admin.py:1582 cps/admin.py:1583 cps/admin.py:1584 +#: cps/admin.py:1585 cps/admin.py:1586 msgid "Update failed:" msgstr "Uppdateringen misslyckades:" -#: cps/admin.py:1553 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1581 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP-fel" -#: cps/admin.py:1554 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1582 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Anslutningsfel" -#: cps/admin.py:1555 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1583 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Tiden ute när du etablerade anslutning" -#: cps/admin.py:1556 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1584 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Allmänt fel" -#: cps/admin.py:1557 +#: cps/admin.py:1585 msgid "Update file could not be saved in temp dir" msgstr "" -#: cps/admin.py:1558 +#: cps/admin.py:1586 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1582 +#: cps/admin.py:1610 msgid "Failed to extract at least One LDAP User" msgstr "" -#: cps/admin.py:1627 +#: cps/admin.py:1655 msgid "Failed to Create at Least One LDAP User" msgstr "Det gick inte att skapa minst en LDAP-användare" -#: cps/admin.py:1640 +#: cps/admin.py:1668 #, python-format msgid "Error: %(ldaperror)s" msgstr "Fel: %(ldaperror)s" -#: cps/admin.py:1644 +#: cps/admin.py:1672 msgid "Error: No user returned in response of LDAP server" msgstr "Fel: Ingen användare återges som svar på LDAP-servern" -#: cps/admin.py:1680 +#: cps/admin.py:1708 msgid "At Least One LDAP User Not Found in Database" msgstr "Minst en LDAP-användare hittades inte i databasen" -#: cps/admin.py:1682 +#: cps/admin.py:1710 #, python-brace-format msgid "{} User Successfully Imported" msgstr "{} användare har importerats" -#: cps/admin.py:1740 +#: cps/admin.py:1768 msgid "Books path not valid" msgstr "" -#: cps/admin.py:1746 +#: cps/admin.py:1774 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "DB-plats är inte giltig, vänligen ange rätt sökväg" -#: cps/admin.py:1774 +#: cps/admin.py:1802 msgid "DB is not Writeable" msgstr "DB är inte skrivbar" -#: cps/admin.py:1788 +#: cps/admin.py:1816 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "Keyfile-platsen är inte giltig, vänligen ange rätt sökväg" -#: cps/admin.py:1792 +#: cps/admin.py:1820 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "Certfile-platsen är inte giltig, vänligen ange rätt sökväg" -#: cps/admin.py:1872 +#: cps/admin.py:1846 +msgid "Kepubify binary not found" +msgstr "" + +#: cps/admin.py:1894 +msgid "reverse proxy login header name" +msgstr "" + +#: cps/admin.py:1904 +msgid "reverse proxy shared secret header name" +msgstr "" + +#: cps/admin.py:1913 +msgid "Please configure both reverse proxy shared secret header name and secret" +msgstr "" + +#: cps/admin.py:1917 +msgid "Please configure reverse proxy shared secret header name and secret or disable the feature" +msgstr "" + +#: cps/admin.py:1922 +msgid "Please configure at least one trusted reverse proxy IP or CIDR" +msgstr "" + +#: cps/admin.py:1946 msgid "Password length has to be between 1 and 40" msgstr "" -#: cps/admin.py:1926 +#: cps/admin.py:1957 cps/helper.py:1007 +msgid "Please specify a valid UnRar directory" +msgstr "" + +#: cps/admin.py:2004 msgid "Database Settings updated" msgstr "" -#: cps/admin.py:1934 +#: cps/admin.py:2012 msgid "Database Configuration" msgstr "" -#: cps/admin.py:1949 cps/web.py:1295 +#: cps/admin.py:2027 cps/web.py:1305 msgid "Oops! Please complete all fields." msgstr "Fyll i alla fält!" -#: cps/admin.py:1958 +#: cps/admin.py:2036 msgid "E-mail is not from valid domain" msgstr "E-posten är inte från giltig domän" -#: cps/admin.py:1964 +#: cps/admin.py:2042 msgid "Add new user" msgstr "Lägg till ny användare" -#: cps/admin.py:1975 +#: cps/admin.py:2053 #, python-format msgid "User '%(user)s' created" msgstr "Användaren '%(user)s' skapad" -#: cps/admin.py:1981 +#: cps/admin.py:2059 msgid "Oops! An account already exists for this Email. or name." msgstr "Hittade ett befintligt konto för den här e-postadressen eller namnet." -#: cps/admin.py:2011 +#: cps/admin.py:2089 #, python-format msgid "User '%(nick)s' deleted" msgstr "Användaren '%(nick)s' borttagen" -#: cps/admin.py:2014 +#: cps/admin.py:2092 msgid "Can't delete Guest User" msgstr "Det går inte att ta bort gästanvändaren" -#: cps/admin.py:2017 +#: cps/admin.py:2095 msgid "No admin user remaining, can't delete user" msgstr "Ingen adminstratörsanvändare kvar, kan inte ta bort användaren" -#: cps/admin.py:2072 cps/web.py:1475 +#: cps/admin.py:2150 cps/web.py:1485 msgid "Email can't be empty and has to be a valid Email" msgstr "" -#: cps/admin.py:2098 +#: cps/admin.py:2176 #, python-format msgid "User '%(nick)s' updated" msgstr "Användaren '%(nick)s' uppdaterad" @@ -541,145 +580,153 @@ msgstr "Användaren '%(nick)s' uppdaterad" msgid "Search" msgstr "Sök" -#: cps/converter.py:31 +#: cps/converter.py:32 msgid "not installed" msgstr "inte installerad" -#: cps/converter.py:32 +#: cps/converter.py:33 msgid "Execution permissions missing" msgstr "Körningstillstånd saknas" -#: cps/db.py:1129 cps/templates/config_edit.html:207 +#: cps/db.py:1129 cps/templates/config_edit.html:229 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:565 cps/web.py:599 cps/web.py:644 cps/web.py:684 cps/web.py:711 -#: cps/web.py:998 cps/web.py:1028 cps/web.py:1073 cps/web.py:1101 -#: cps/web.py:1140 +#: cps/web.py:567 cps/web.py:601 cps/web.py:646 cps/web.py:686 cps/web.py:713 +#: cps/web.py:1000 cps/web.py:1030 cps/web.py:1075 cps/web.py:1103 +#: cps/web.py:1142 msgid "None" msgstr "Ingen" -#: cps/editbooks.py:155 +#: cps/editbooks.py:156 #, python-format msgid "File %(file)s uploaded" msgstr "Filen %(file)s uppladdad" -#: cps/editbooks.py:184 +#: cps/editbooks.py:185 msgid "Source or destination format for conversion missing" msgstr "Källa eller målformat för konvertering saknas" -#: cps/editbooks.py:192 +#: cps/editbooks.py:189 cps/editbooks.py:197 +msgid "Source format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:201 +msgid "Destination format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:209 #, 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:196 +#: cps/editbooks.py:213 #, 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/editbooks.py:297 +#: cps/editbooks.py:314 msgid "Changes successfully applied" msgstr "" -#: cps/editbooks.py:317 +#: cps/editbooks.py:334 msgid "Value is missing on request" msgstr "" -#: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 -#: cps/editbooks.py:1146 cps/web.py:532 cps/web.py:1567 cps/web.py:1613 -#: cps/web.py:1663 +#: cps/editbooks.py:336 cps/editbooks.py:343 cps/editbooks.py:644 +#: cps/editbooks.py:1170 cps/web.py:534 cps/web.py:1577 cps/web.py:1623 +#: cps/web.py:1673 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Hoppsan! Vald boktitel är inte tillgänglig. Filen finns inte eller är inte tillgänglig" -#: cps/editbooks.py:673 cps/editbooks.py:1503 +#: cps/editbooks.py:690 cps/editbooks.py:1547 msgid "User has no rights to upload cover" msgstr "" -#: cps/editbooks.py:694 cps/editbooks.py:938 +#: cps/editbooks.py:711 cps/editbooks.py:961 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "Identifierare är inte skiftlägeskänsliga, skriver över gammal identifierare" -#: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 +#: cps/editbooks.py:726 cps/editbooks.py:935 cps/editbooks.py:1306 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "" -#: cps/editbooks.py:737 +#: cps/editbooks.py:754 msgid "Metadata successfully updated" msgstr "Metadata uppdaterades" -#: cps/editbooks.py:760 +#: cps/editbooks.py:777 #, python-brace-format msgid "Error editing book: {}" msgstr "" -#: cps/editbooks.py:856 +#: cps/editbooks.py:879 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "Uppladdad bok finns förmodligen i biblioteket, överväg att ändra innan du laddar upp nya: " -#: cps/editbooks.py:950 cps/editbooks.py:1420 +#: cps/editbooks.py:973 cps/editbooks.py:1464 msgid "File type isn't allowed to be uploaded to this server" msgstr "" -#: cps/editbooks.py:956 cps/editbooks.py:1431 +#: cps/editbooks.py:979 cps/editbooks.py:1475 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "Filändelsen '%(ext)s' får inte laddas upp till den här servern" -#: cps/editbooks.py:960 cps/editbooks.py:1436 +#: cps/editbooks.py:983 cps/editbooks.py:1480 msgid "File to be uploaded must have an extension" msgstr "Filen som ska laddas upp måste ha en ändelse" -#: cps/editbooks.py:968 +#: cps/editbooks.py:992 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "Filen %(filename)s kunde inte sparas i temp dir" -#: cps/editbooks.py:988 +#: cps/editbooks.py:1012 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Det gick inte att flytta omslagsfil %(file)s: %(error)s" -#: cps/editbooks.py:1041 +#: cps/editbooks.py:1065 msgid "Book Format Successfully Deleted" msgstr "Bokformat har tagits bort" -#: cps/editbooks.py:1044 cps/editbooks.py:1061 +#: cps/editbooks.py:1068 cps/editbooks.py:1085 msgid "Book Successfully Deleted" msgstr "Boken har tagits bort" -#: cps/editbooks.py:1065 +#: cps/editbooks.py:1089 msgid "You are missing permissions to delete books" msgstr "" -#: cps/editbooks.py:1139 +#: cps/editbooks.py:1163 #, python-brace-format msgid "Book with id \"{}\" could not be deleted: not found" msgstr "" -#: cps/editbooks.py:1181 +#: cps/editbooks.py:1205 msgid "edit metadata" msgstr "redigera metadata" -#: cps/editbooks.py:1234 +#: cps/editbooks.py:1267 #, python-format msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1425 +#: cps/editbooks.py:1469 msgid "User has no rights to upload additional file formats" msgstr "" -#: cps/editbooks.py:1449 +#: cps/editbooks.py:1493 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Det gick inte att skapa sökväg %(path)s (behörighet nekad)." -#: cps/editbooks.py:1456 +#: cps/editbooks.py:1500 #, python-format msgid "Failed to store file %(file)s." msgstr "Det gick inte att lagra filen %(file)s." -#: cps/editbooks.py:1481 +#: cps/editbooks.py:1525 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Filformatet %(ext)s lades till %(book)s" @@ -690,9 +737,9 @@ msgstr "" #: cps/error_handler.py:108 cps/templates/layout.html:69 #: cps/templates/layout.html:104 cps/templates/login.html:27 -#: cps/templates/register.html:17 cps/web.py:1292 cps/web.py:1296 -#: cps/web.py:1302 cps/web.py:1326 cps/web.py:1330 cps/web.py:1343 -#: cps/web.py:1346 +#: cps/templates/register.html:17 cps/web.py:1302 cps/web.py:1306 +#: cps/web.py:1312 cps/web.py:1336 cps/web.py:1340 cps/web.py:1353 +#: cps/web.py:1356 msgid "Register" msgstr "Registrera" @@ -713,7 +760,7 @@ msgstr "Återuppringningsdomänen är inte verifierad, följ stegen för att ver msgid "%(format)s format not found for book id: %(book)d" msgstr "%(format)s formatet hittades inte för bok-id: %(book)d" -#: cps/helper.py:94 cps/tasks/convert.py:91 +#: cps/helper.py:94 cps/tasks/convert.py:92 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s hittades inte på Google Drive: %(fn)s" @@ -899,10 +946,6 @@ msgstr "Endast jpg/jpeg-filer stöds som omslagsfil" msgid "Cover" msgstr "" -#: cps/helper.py:1006 -msgid "UnRar binary file not found" -msgstr "UnRar binär fil hittades inte" - #: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "" @@ -933,7 +976,7 @@ msgstr "" msgid "Error executing Calibre" msgstr "" -#: cps/helper.py:1154 cps/templates/admin.html:216 +#: cps/helper.py:1154 cps/templates/admin.html:232 msgid "Queue all books for metadata backup" msgstr "" @@ -955,7 +998,7 @@ msgstr "Registrera dig med %(provider)s" msgid "This %(oauth)s account is already linked to a different user" msgstr "" -#: cps/oauth_bb.py:147 cps/remotelogin.py:131 +#: cps/oauth_bb.py:147 cps/remotelogin.py:150 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "du är nu inloggad som: \"%(nickname)s\"" @@ -1023,25 +1066,29 @@ msgstr "Google Oauth-fel: {}" msgid "{} Stars" msgstr "{} stjärnor" -#: cps/remotelogin.py:63 cps/templates/layout.html:68 -#: cps/templates/layout.html:103 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1361 -msgid "Login" -msgstr "Logga in" - -#: cps/remotelogin.py:75 cps/remotelogin.py:109 +#: cps/remotelogin.py:46 cps/remotelogin.py:128 msgid "Token not found" msgstr "Token hittades inte" -#: cps/remotelogin.py:84 cps/remotelogin.py:117 +#: cps/remotelogin.py:55 cps/remotelogin.py:136 msgid "Token has expired" msgstr "Token har löpt ut" -#: cps/remotelogin.py:93 +#: cps/remotelogin.py:86 cps/remotelogin.py:112 cps/templates/layout.html:68 +#: cps/templates/layout.html:103 cps/templates/login.html:4 +#: cps/templates/login.html:21 cps/web.py:1371 +msgid "Login" +msgstr "Logga in" + +#: cps/remotelogin.py:100 +msgid "Token already approved" +msgstr "" + +#: cps/remotelogin.py:108 msgid "Success! Please return to your device" msgstr "Lyckades! Vänligen återvänd till din enhet" -#: cps/render_template.py:41 cps/web.py:421 +#: cps/render_template.py:41 cps/web.py:423 msgid "Books" msgstr "Böcker" @@ -1066,7 +1113,7 @@ msgstr "Hämtade böcker" msgid "Show Downloaded Books" msgstr "Visa hämtade böcker" -#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:436 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:438 msgid "Top Rated Books" msgstr "Bäst rankade böcker" @@ -1075,7 +1122,7 @@ msgid "Show Top Rated Books" msgstr "Visa böcker med bästa betyg" #: cps/render_template.py:61 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:769 +#: cps/templates/index.xml:67 cps/web.py:771 msgid "Read Books" msgstr "Lästa böcker" @@ -1084,7 +1131,7 @@ msgid "Show Read and Unread" msgstr "" #: cps/render_template.py:65 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:772 +#: cps/templates/index.xml:74 cps/web.py:774 msgid "Unread Books" msgstr "Olästa böcker" @@ -1102,7 +1149,7 @@ msgid "Show Random Books" msgstr "Visa slumpmässiga böcker" #: cps/render_template.py:71 cps/templates/book_table.html:93 -#: cps/templates/index.xml:97 cps/web.py:1144 +#: cps/templates/index.xml:97 cps/web.py:1146 msgid "Categories" msgstr "Kategorier" @@ -1112,7 +1159,7 @@ msgstr "" #: cps/render_template.py:74 cps/templates/book_edit.html:86 #: cps/templates/book_table.html:94 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1034 cps/web.py:1046 +#: cps/templates/search_form.html:70 cps/web.py:1036 cps/web.py:1048 msgid "Series" msgstr "Serier" @@ -1130,7 +1177,7 @@ msgid "Show Author Section" msgstr "" #: cps/render_template.py:81 cps/templates/book_table.html:98 -#: cps/templates/index.xml:88 cps/web.py:1002 +#: cps/templates/index.xml:88 cps/web.py:1004 msgid "Publishers" msgstr "Förlag" @@ -1140,7 +1187,7 @@ msgstr "" #: cps/render_template.py:84 cps/templates/book_table.html:96 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1116 +#: cps/web.py:1118 msgid "Languages" msgstr "Språk" @@ -1164,7 +1211,7 @@ msgstr "Filformat" msgid "Show File Formats Section" msgstr "" -#: cps/render_template.py:95 cps/web.py:795 +#: cps/render_template.py:95 cps/web.py:797 msgid "Archived Books" msgstr "Arkiverade böcker" @@ -1172,7 +1219,7 @@ msgstr "Arkiverade böcker" msgid "Show Archived Books" msgstr "" -#: cps/render_template.py:100 cps/web.py:831 +#: cps/render_template.py:100 cps/web.py:833 msgid "Books List" msgstr "Boklista" @@ -1405,150 +1452,154 @@ msgstr "En ny uppdatering är tillgänglig. Klicka på knappen nedan för att up msgid "No release information available" msgstr "Ingen versionsinformation tillgänglig" -#: cps/templates/index.html:6 cps/web.py:448 +#: cps/templates/index.html:6 cps/web.py:450 msgid "Discover (Random Books)" msgstr "Upptäck (slumpmässiga böcker)" -#: cps/web.py:484 +#: cps/web.py:486 msgid "Hot Books (Most Downloaded)" msgstr "Heta böcker (mest hämtade)" -#: cps/web.py:515 +#: cps/web.py:517 #, python-format msgid "Downloaded books by %(user)s" msgstr "Hämtade böcker av %(user)s" -#: cps/web.py:548 +#: cps/web.py:550 #, python-format msgid "Author: %(name)s" msgstr "Författare: %(name)s" -#: cps/web.py:584 +#: cps/web.py:586 #, python-format msgid "Publisher: %(name)s" msgstr "Förlag: %(name)s" -#: cps/web.py:612 +#: cps/web.py:614 #, python-format msgid "Series: %(serie)s" msgstr "Serier: %(serie)s" -#: cps/web.py:626 +#: cps/web.py:628 msgid "Rating: None" msgstr "" -#: cps/web.py:635 +#: cps/web.py:637 #, python-format msgid "Rating: %(rating)s stars" msgstr "Betyg: %(rating)s stars" -#: cps/web.py:666 +#: cps/web.py:668 #, python-format msgid "File format: %(format)s" msgstr "Filformat: %(format)s" -#: cps/web.py:701 +#: cps/web.py:703 #, python-format msgid "Category: %(name)s" msgstr "Kategori: %(name)s" -#: cps/web.py:730 +#: cps/web.py:732 #, python-format msgid "Language: %(name)s" msgstr "Språk: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:974 +#: cps/templates/admin.html:16 cps/web.py:976 msgid "Downloads" msgstr "Hämtningar" -#: cps/web.py:1076 +#: cps/web.py:1078 msgid "Ratings list" msgstr "Betygslista" -#: cps/web.py:1103 +#: cps/web.py:1105 msgid "File formats list" msgstr "Lista över filformat" -#: cps/web.py:1264 +#: cps/web.py:1272 +msgid "Book format not supported" +msgstr "" + +#: cps/web.py:1274 msgid "Please configure the SMTP mail settings first..." msgstr "" -#: cps/web.py:1270 +#: cps/web.py:1280 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Boken är i kö för att skicka till %(eReadermail)s" -#: cps/web.py:1273 +#: cps/web.py:1283 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Det gick inte att skicka den här boken: %(res)s" -#: cps/web.py:1275 +#: cps/web.py:1285 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "" -#: cps/web.py:1291 cps/web.py:1342 +#: cps/web.py:1301 cps/web.py:1352 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "E-postservern är inte konfigurerad, kontakta din administratör!" -#: cps/web.py:1328 +#: cps/web.py:1338 msgid "Oops! Your Email is not allowed." msgstr "Din e-post är inte tillåten att registrera" -#: cps/web.py:1331 +#: cps/web.py:1341 msgid "Success! Confirmation Email has been sent." msgstr "Bekräftelsemail skickades till ditt e-postkonto." -#: cps/web.py:1376 cps/web.py:1390 +#: cps/web.py:1386 cps/web.py:1400 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1399 +#: cps/web.py:1409 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1406 +#: cps/web.py:1416 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1411 +#: cps/web.py:1421 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1415 cps/web.py:1440 +#: cps/web.py:1425 cps/web.py:1450 msgid "Wrong Username or Password" msgstr "" -#: cps/web.py:1422 +#: cps/web.py:1432 msgid "New Password was sent to your email address" msgstr "" -#: cps/web.py:1426 +#: cps/web.py:1436 msgid "An unknown error occurred. Please try again later." msgstr "" -#: cps/web.py:1428 +#: cps/web.py:1438 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1436 +#: cps/web.py:1446 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1501 cps/web.py:1551 +#: cps/web.py:1511 cps/web.py:1561 #, python-format msgid "%(name)s's Profile" msgstr "%(name)ss profil" -#: cps/web.py:1517 +#: cps/web.py:1527 msgid "Success! Profile Updated" msgstr "" -#: cps/web.py:1521 +#: cps/web.py:1531 msgid "Oops! An account already exists for this Email." msgstr "Hittade ett befintligt konto för den här e-postadressen" @@ -1560,46 +1611,46 @@ msgstr "Hittade ingen giltig gmail.json-fil med OAuth-information" msgid "Delete temp folder contents" msgstr "" -#: cps/tasks/convert.py:112 +#: cps/tasks/convert.py:113 #, python-format msgid "%(book)s send to E-Reader" msgstr "" -#: cps/tasks/convert.py:177 +#: cps/tasks/convert.py:180 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "calibre e-bokkonverterings %(tool)s hittades inte" -#: cps/tasks/convert.py:211 +#: cps/tasks/convert.py:214 #, python-format msgid "%(format)s format not found on disk" msgstr "%(format)s-format hittades inte på disken" -#: cps/tasks/convert.py:215 +#: cps/tasks/convert.py:218 msgid "Ebook converter failed with unknown error" msgstr "E-bokkonverteraren misslyckades med okänt fel" -#: cps/tasks/convert.py:234 +#: cps/tasks/convert.py:237 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify-konverteraren misslyckades: %(error)s" -#: cps/tasks/convert.py:254 +#: cps/tasks/convert.py:257 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Konverterad fil hittades inte eller mer än en fil i mappen %(folder)s" -#: cps/tasks/convert.py:291 cps/tasks/convert.py:342 +#: cps/tasks/convert.py:294 cps/tasks/convert.py:345 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "calibre misslyckades med fel: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:322 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "E-bokkonverteraren misslyckades: %(error)s" -#: cps/tasks/convert.py:347 +#: cps/tasks/convert.py:350 msgid "Convert" msgstr "" @@ -1685,7 +1736,7 @@ msgstr "Redigera" #: cps/templates/admin.html:25 cps/templates/book_edit.html:17 #: cps/templates/book_table.html:131 cps/templates/book_table.html:180 -#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:115 +#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:117 #: cps/templates/user_edit.html:67 cps/templates/user_table.html:149 msgid "Delete" msgstr "Ta bort" @@ -1775,128 +1826,145 @@ msgstr "Fjärrinloggning" msgid "Reverse Proxy Login" msgstr "Omvänd proxy inloggning" -#: cps/templates/admin.html:154 cps/templates/config_edit.html:176 +#: cps/templates/admin.html:154 cps/templates/config_edit.html:180 msgid "Reverse Proxy Header Name" msgstr "Omvänt proxy rubriknamn" -#: cps/templates/admin.html:159 +#: cps/templates/admin.html:158 +msgid "Reverse Proxy Trusted IPs/CIDRs" +msgstr "" + +#: cps/templates/admin.html:162 cps/templates/config_edit.html:193 +msgid "Reverse Proxy Shared Secret Header Name" +msgstr "" + +#: cps/templates/admin.html:166 +msgid "Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/admin.html:170 +msgid "Reverse Proxy Shared Secret Configured" +msgstr "" + +#: cps/templates/admin.html:175 msgid "Edit Calibre Database Configuration" msgstr "" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:176 msgid "Edit Basic Configuration" msgstr "Redigera grundläggande konfiguration" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:177 msgid "Edit UI Configuration" msgstr "Redigera UI-konfiguration" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:183 msgid "Scheduled Tasks" msgstr "" -#: cps/templates/admin.html:170 cps/templates/schedule_edit.html:12 +#: cps/templates/admin.html:186 cps/templates/schedule_edit.html:12 #: cps/templates/tasks.html:18 msgid "Start Time" msgstr "" -#: cps/templates/admin.html:174 cps/templates/schedule_edit.html:20 +#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:20 msgid "Maximum Duration" msgstr "" -#: cps/templates/admin.html:178 cps/templates/schedule_edit.html:29 +#: cps/templates/admin.html:194 cps/templates/schedule_edit.html:29 msgid "Generate Thumbnails" msgstr "" -#: cps/templates/admin.html:182 +#: cps/templates/admin.html:198 msgid "Generate series cover thumbnails" msgstr "" -#: cps/templates/admin.html:186 cps/templates/admin.html:208 +#: cps/templates/admin.html:202 cps/templates/admin.html:224 #: cps/templates/schedule_edit.html:37 msgid "Reconnect Calibre Database" msgstr "" -#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 +#: cps/templates/admin.html:206 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" msgstr "" -#: cps/templates/admin.html:197 +#: cps/templates/admin.html:213 msgid "Refresh Thumbnail Cache" msgstr "" -#: cps/templates/admin.html:203 +#: cps/templates/admin.html:219 msgid "Administration" msgstr "Administration" -#: cps/templates/admin.html:204 +#: cps/templates/admin.html:220 msgid "Download Debug Package" msgstr "Hämta felsökningspaketet" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:221 msgid "View Logs" msgstr "Visa loggfiler" -#: cps/templates/admin.html:211 +#: cps/templates/admin.html:227 msgid "Restart" msgstr "Starta om Calibre-Web" -#: cps/templates/admin.html:212 +#: cps/templates/admin.html:228 msgid "Shutdown" msgstr "Stoppa Calibre-Web" -#: cps/templates/admin.html:221 +#: cps/templates/admin.html:237 msgid "Version Information" msgstr "" -#: cps/templates/admin.html:225 +#: cps/templates/admin.html:241 msgid "Version" msgstr "Version" -#: cps/templates/admin.html:226 +#: cps/templates/admin.html:242 msgid "Details" msgstr "Detaljer" -#: cps/templates/admin.html:232 +#: cps/templates/admin.html:248 msgid "Current Version" msgstr "Aktuell version" -#: cps/templates/admin.html:239 +#: cps/templates/admin.html:255 msgid "Check for Update" msgstr "Sök efter uppdatering" -#: cps/templates/admin.html:240 +#: cps/templates/admin.html:256 msgid "Perform Update" msgstr "Utför uppdatering" -#: cps/templates/admin.html:253 +#: cps/templates/admin.html:269 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:258 cps/templates/admin.html:272 -#: cps/templates/admin.html:292 cps/templates/config_db.html:82 +#: cps/templates/admin.html:274 cps/templates/admin.html:288 +#: cps/templates/admin.html:308 cps/templates/config_db.html:82 msgid "OK" msgstr "Ok" -#: cps/templates/admin.html:259 cps/templates/admin.html:273 +#: cps/templates/admin.html:275 cps/templates/admin.html:289 #: cps/templates/book_edit.html:220 cps/templates/book_table.html:162 #: cps/templates/book_table.html:181 cps/templates/book_table.html:201 #: cps/templates/book_table.html:221 cps/templates/book_table.html:241 #: cps/templates/book_table.html:261 cps/templates/book_table.html:316 -#: cps/templates/config_db.html:66 cps/templates/config_edit.html:431 +#: cps/templates/config_db.html:66 cps/templates/config_edit.html:453 #: cps/templates/config_view_edit.html:175 cps/templates/detail.html:350 -#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:98 -#: cps/templates/modal_dialogs.html:116 cps/templates/modal_dialogs.html:134 +#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:100 +#: cps/templates/modal_dialogs.html:118 cps/templates/modal_dialogs.html:136 +#: cps/templates/remote_login_verify.html:16 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 #: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Avbryt" -#: cps/templates/admin.html:271 +#: cps/templates/admin.html:287 msgid "Are you sure you want to shutdown?" msgstr "Är du säker på att du vill stoppa Calibre-Web?" -#: cps/templates/admin.html:283 +#: cps/templates/admin.html:299 msgid "Updating, please do not reload this page" msgstr "Uppdaterar, vänligen uppdatera inte sidan" @@ -2137,7 +2205,7 @@ msgid "Fetch Metadata" msgstr "Hämta metadata" #: cps/templates/book_edit.html:219 cps/templates/config_db.html:65 -#: cps/templates/config_edit.html:430 cps/templates/config_view_edit.html:174 +#: cps/templates/config_edit.html:452 cps/templates/config_view_edit.html:174 #: cps/templates/email_edit.html:65 cps/templates/schedule_edit.html:44 #: cps/templates/shelf_edit.html:25 cps/templates/shelf_order.html:41 #: cps/templates/user_edit.html:142 @@ -2509,214 +2577,234 @@ msgstr "" msgid "Allow Reverse Proxy Authentication" msgstr "Tillåt omvänd proxyautentisering" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:176 +msgid "Security Warning" +msgstr "" + +#: cps/templates/config_edit.html:177 +msgid "Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled." +msgstr "" + +#: cps/templates/config_edit.html:184 +msgid "Reverse Proxy Trusted IPs/CIDRs (Comma Separated)" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "Enable Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/config_edit.html:197 +msgid "Reverse Proxy Shared Secret" +msgstr "" + +#: cps/templates/config_edit.html:205 msgid "Login type" msgstr "Inloggningstyp" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:207 msgid "Use Standard Authentication" msgstr "Använd standardautentisering" -#: cps/templates/config_edit.html:187 +#: cps/templates/config_edit.html:209 msgid "Use LDAP Authentication" msgstr "Använd LDAP-autentisering" -#: cps/templates/config_edit.html:190 +#: cps/templates/config_edit.html:212 msgid "Use OAuth" msgstr "Använd OAuth" -#: cps/templates/config_edit.html:197 +#: cps/templates/config_edit.html:219 msgid "LDAP Server Host Name or IP Address" msgstr "LDAP-serverns värdnamn eller IP-adress" -#: cps/templates/config_edit.html:201 +#: cps/templates/config_edit.html:223 msgid "LDAP Server Port" msgstr "LDAP-serverport" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:227 msgid "LDAP Encryption" msgstr "LDAP-kryptering" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:230 msgid "TLS" msgstr "TLS" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:231 msgid "SSL" msgstr "SSL" -#: cps/templates/config_edit.html:213 +#: cps/templates/config_edit.html:235 msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" msgstr "LDAP CACertificate-sökväg (behövs endast för autentisering av klientcertifikat)" -#: cps/templates/config_edit.html:220 +#: cps/templates/config_edit.html:242 msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" msgstr "LDAP-certifikatsökväg (behövs endast för autentisering av klientcertifikat)" -#: cps/templates/config_edit.html:227 +#: cps/templates/config_edit.html:249 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" msgstr "LDAP-nyckelfilsökväg (behövs endast för autentisering av klientcertifikat)" -#: cps/templates/config_edit.html:236 +#: cps/templates/config_edit.html:258 msgid "LDAP Authentication" msgstr "LDAP-autentisering" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:260 msgid "Anonymous" msgstr "Anonym" -#: cps/templates/config_edit.html:239 +#: cps/templates/config_edit.html:261 msgid "Unauthenticated" msgstr "Oautentiserad" -#: cps/templates/config_edit.html:240 +#: cps/templates/config_edit.html:262 msgid "Simple" msgstr "Enkel" -#: cps/templates/config_edit.html:245 +#: cps/templates/config_edit.html:267 msgid "LDAP Administrator Username" msgstr "LDAP-adminstratörsanvändarnamn" -#: cps/templates/config_edit.html:251 +#: cps/templates/config_edit.html:273 msgid "LDAP Administrator Password" msgstr "LDAP-adminstratörslösenord" -#: cps/templates/config_edit.html:256 +#: cps/templates/config_edit.html:278 msgid "LDAP Distinguished Name (DN)" msgstr "LDAP Distinguished Name (DN)" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:282 msgid "LDAP User Object Filter" msgstr "LDAP-användarobjektfilter" -#: cps/templates/config_edit.html:265 +#: cps/templates/config_edit.html:287 msgid "LDAP Server is OpenLDAP?" msgstr "LDAP-server är OpenLDAP?" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:289 msgid "Following Settings are Needed For User Import" msgstr "Följande inställningar behövs för användarimport" -#: cps/templates/config_edit.html:269 +#: cps/templates/config_edit.html:291 msgid "LDAP Group Object Filter" msgstr "LDAP-gruppobjektfilter" -#: cps/templates/config_edit.html:273 +#: cps/templates/config_edit.html:295 msgid "LDAP Group Name" msgstr "LDAP-gruppnamn" -#: cps/templates/config_edit.html:277 +#: cps/templates/config_edit.html:299 msgid "LDAP Group Members Field" msgstr "Fält för LDAP-gruppmedlemmar" -#: cps/templates/config_edit.html:281 +#: cps/templates/config_edit.html:303 msgid "LDAP Member User Filter Detection" msgstr "LDAP-användarfilterdetektering för medlemmar" -#: cps/templates/config_edit.html:283 +#: cps/templates/config_edit.html:305 msgid "Autodetect" msgstr "Upptäck automatiskt" -#: cps/templates/config_edit.html:284 +#: cps/templates/config_edit.html:306 msgid "Custom Filter" msgstr "Anpassat filter" -#: cps/templates/config_edit.html:289 +#: cps/templates/config_edit.html:311 msgid "LDAP Member User Filter" msgstr "LDAP-användarfilter för medlemmar" -#: cps/templates/config_edit.html:300 +#: cps/templates/config_edit.html:322 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "Skaffa %(provider)s OAuth-certifikat" -#: cps/templates/config_edit.html:303 +#: cps/templates/config_edit.html:325 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "%(provider)s OAuth-klient-id" -#: cps/templates/config_edit.html:307 +#: cps/templates/config_edit.html:329 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "%(provider)s OAuth-klient-hemlighet" -#: cps/templates/config_edit.html:323 +#: cps/templates/config_edit.html:345 msgid "External binaries" msgstr "Externa binärer" -#: cps/templates/config_edit.html:329 +#: cps/templates/config_edit.html:351 msgid "Path to Calibre Binaries" msgstr "" -#: cps/templates/config_edit.html:337 +#: cps/templates/config_edit.html:359 msgid "Calibre E-Book Converter Settings" msgstr "Inställningar för calibre e-bokkonverterare" -#: cps/templates/config_edit.html:340 +#: cps/templates/config_edit.html:362 msgid "Path to Kepubify E-Book Converter" msgstr "Sökväg till Kepubify calibre e-bokkonverterare" -#: cps/templates/config_edit.html:348 +#: cps/templates/config_edit.html:370 msgid "Location of Unrar binary" msgstr "" -#: cps/templates/config_edit.html:364 +#: cps/templates/config_edit.html:386 msgid "Security Settings" msgstr "" -#: cps/templates/config_edit.html:372 +#: cps/templates/config_edit.html:394 msgid "Limit failed login attempts" msgstr "" -#: cps/templates/config_edit.html:376 +#: cps/templates/config_edit.html:398 msgid "Configure Backend for Limiter" msgstr "" -#: cps/templates/config_edit.html:380 +#: cps/templates/config_edit.html:402 msgid "Options for Limiter Backend" msgstr "" -#: cps/templates/config_edit.html:386 +#: cps/templates/config_edit.html:408 msgid "Check if file extensions matches file content on upload" msgstr "" -#: cps/templates/config_edit.html:389 +#: cps/templates/config_edit.html:411 msgid "Session protection" msgstr "" -#: cps/templates/config_edit.html:391 +#: cps/templates/config_edit.html:413 msgid "Basic" msgstr "" -#: cps/templates/config_edit.html:392 +#: cps/templates/config_edit.html:414 msgid "Strong" msgstr "" -#: cps/templates/config_edit.html:397 +#: cps/templates/config_edit.html:419 msgid "User Password policy" msgstr "" -#: cps/templates/config_edit.html:401 +#: cps/templates/config_edit.html:423 msgid "Minimum password length" msgstr "" -#: cps/templates/config_edit.html:406 +#: cps/templates/config_edit.html:428 msgid "Enforce number" msgstr "" -#: cps/templates/config_edit.html:410 +#: cps/templates/config_edit.html:432 msgid "Enforce lowercase characters" msgstr "" -#: cps/templates/config_edit.html:414 +#: cps/templates/config_edit.html:436 msgid "Enforce uppercase characters" msgstr "" -#: cps/templates/config_edit.html:418 +#: cps/templates/config_edit.html:440 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" msgstr "" -#: cps/templates/config_edit.html:422 +#: cps/templates/config_edit.html:444 msgid "Enforce special characters" msgstr "" @@ -3183,27 +3271,27 @@ msgstr "Böcker måste först arkiveras och enheten synkroniseras innan en bok s msgid "Choose File Location" msgstr "Välj filplats" -#: cps/templates/modal_dialogs.html:81 +#: cps/templates/modal_dialogs.html:82 msgid "type" msgstr "typ" -#: cps/templates/modal_dialogs.html:82 +#: cps/templates/modal_dialogs.html:83 msgid "name" msgstr "namn" -#: cps/templates/modal_dialogs.html:83 +#: cps/templates/modal_dialogs.html:84 msgid "size" msgstr "storlek" -#: cps/templates/modal_dialogs.html:89 +#: cps/templates/modal_dialogs.html:90 msgid "Parent Directory" msgstr "Föräldramapp" -#: cps/templates/modal_dialogs.html:97 +#: cps/templates/modal_dialogs.html:99 msgid "Select" msgstr "Välj" -#: cps/templates/modal_dialogs.html:133 cps/templates/tasks.html:46 +#: cps/templates/modal_dialogs.html:135 cps/templates/tasks.html:46 msgid "Ok" msgstr "Ok" @@ -3459,6 +3547,31 @@ msgstr "När du gör det kommer du automatiskt att logga in på den här enheten msgid "This verification link will expire in 10 minutes." msgstr "Länken går ut efter 10 minuter." +#: cps/templates/remote_login_verify.html:4 +msgid "Approve Magic Link Login" +msgstr "" + +#: cps/templates/remote_login_verify.html:5 +msgid "Review the device that requested access before approving this login." +msgstr "" + +#: cps/templates/remote_login_verify.html:7 +msgid "IP address" +msgstr "" + +#: cps/templates/remote_login_verify.html:9 +msgid "Browser" +msgstr "" + +#: cps/templates/remote_login_verify.html:12 +#, python-format +msgid "If you approve this request, the device that started it will be logged in as %(username)s." +msgstr "" + +#: cps/templates/remote_login_verify.html:15 +msgid "Approve Login" +msgstr "" + #: cps/templates/schedule_edit.html:33 msgid "Generate Series Cover Thumbnails" msgstr "" diff --git a/cps/translations/tr/LC_MESSAGES/messages.mo b/cps/translations/tr/LC_MESSAGES/messages.mo index 647a924bd7700ccd341b4639e9562b7e4d74a159..62027f66bce00f031a3dbdf420c0f47e9b4adbb6 100644 GIT binary patch delta 29 lcmdlxhjH&5#trv$*)0?d&8!S8Hb2!BW@NP3{8P_G9ss1;3MT*n delta 29 lcmdlxhjH&5#trv$*$ov84XsR!Hb2!BW@I$q{8P_G9sr~13K#$Y diff --git a/cps/translations/tr/LC_MESSAGES/messages.po b/cps/translations/tr/LC_MESSAGES/messages.po index 827bd7433..3b46df9c6 100644 --- a/cps/translations/tr/LC_MESSAGES/messages.po +++ b/cps/translations/tr/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-08-01 11:42+0200\n" +"POT-Creation-Date: 2026-08-08 16:08+0200\n" "PO-Revision-Date: 2020-04-23 22:47+0300\n" "Last-Translator: iz \n" "Language: tr\n" @@ -16,519 +16,558 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" +"Generated-By: Babel 2.18.0\n" #: cps/about.py:85 msgid "Statistics" msgstr "İstatistikler" -#: cps/admin.py:151 +#: cps/admin.py:154 msgid "Server restarted, please reload page." msgstr "" -#: cps/admin.py:153 +#: cps/admin.py:156 msgid "Performing Server shutdown, please close window." msgstr "" -#: cps/admin.py:161 +#: cps/admin.py:164 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:164 +#: cps/admin.py:167 msgid "Unknown command" msgstr "" -#: cps/admin.py:175 +#: cps/admin.py:178 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "" -#: cps/admin.py:208 cps/editbooks.py:808 cps/editbooks.py:852 -#: cps/editbooks.py:1520 cps/updater.py:615 cps/uploader.py:108 -#: cps/uploader.py:117 +#: cps/admin.py:211 cps/editbooks.py:825 cps/editbooks.py:875 +#: cps/editbooks.py:1564 cps/templates/remote_login_verify.html:8 +#: cps/templates/remote_login_verify.html:10 cps/updater.py:615 +#: cps/uploader.py:117 cps/uploader.py:126 msgid "Unknown" msgstr "Bilinmeyen" -#: cps/admin.py:233 +#: cps/admin.py:236 msgid "Admin page" msgstr "Yönetim sayfası" -#: cps/admin.py:253 +#: cps/admin.py:256 msgid "Basic Configuration" msgstr "Temel Ayarlar" -#: cps/admin.py:291 +#: cps/admin.py:294 msgid "UI Configuration" msgstr "Arayüz Ayarları" -#: cps/admin.py:315 cps/admin.py:1002 cps/db.py:809 cps/search.py:150 -#: cps/web.py:750 +#: cps/admin.py:318 cps/admin.py:1005 cps/db.py:809 cps/search.py:150 +#: cps/web.py:752 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "" -#: cps/admin.py:333 cps/templates/admin.html:51 +#: cps/admin.py:336 cps/templates/admin.html:51 msgid "Edit Users" msgstr "" -#: cps/admin.py:378 cps/opds.py:559 cps/templates/grid.html:14 +#: cps/admin.py:381 cps/opds.py:559 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Tümü" -#: cps/admin.py:401 cps/admin.py:1432 +#: cps/admin.py:404 cps/admin.py:1460 msgid "User not found" msgstr "" -#: cps/admin.py:415 +#: cps/admin.py:418 #, python-brace-format msgid "{} users deleted successfully" msgstr "" -#: cps/admin.py:438 cps/templates/config_view_edit.html:133 +#: cps/admin.py:441 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "" -#: cps/admin.py:459 cps/admin.py:465 +#: cps/admin.py:462 cps/admin.py:468 msgid "Malformed request" msgstr "" -#: cps/admin.py:477 cps/admin.py:2078 +#: cps/admin.py:480 cps/admin.py:2156 msgid "Guest Name can't be changed" msgstr "" -#: cps/admin.py:489 +#: cps/admin.py:492 msgid "Guest can't have this role" msgstr "" -#: cps/admin.py:501 cps/admin.py:2032 +#: cps/admin.py:504 cps/admin.py:2110 msgid "No admin user remaining, can't remove admin role" msgstr "" -#: cps/admin.py:505 cps/admin.py:519 +#: cps/admin.py:508 cps/admin.py:522 msgid "Value has to be true or false" msgstr "" -#: cps/admin.py:507 +#: cps/admin.py:510 msgid "Invalid role" msgstr "" -#: cps/admin.py:511 +#: cps/admin.py:514 msgid "Guest can't have this view" msgstr "" -#: cps/admin.py:521 +#: cps/admin.py:524 msgid "Invalid view" msgstr "" -#: cps/admin.py:524 +#: cps/admin.py:527 msgid "Guest's Locale is determined automatically and can't be set" msgstr "" -#: cps/admin.py:528 +#: cps/admin.py:531 msgid "No Valid Locale Given" msgstr "" -#: cps/admin.py:539 +#: cps/admin.py:542 msgid "No Valid Book Language Given" msgstr "" -#: cps/admin.py:541 cps/editbooks.py:243 cps/editbooks.py:428 -#: cps/editbooks.py:430 +#: cps/admin.py:544 cps/editbooks.py:260 cps/editbooks.py:445 +#: cps/editbooks.py:447 msgid "Parameter not found" msgstr "" -#: cps/admin.py:578 +#: cps/admin.py:581 msgid "Invalid Read Column" msgstr "" -#: cps/admin.py:584 +#: cps/admin.py:587 msgid "Invalid Restricted Column" msgstr "" -#: cps/admin.py:604 cps/admin.py:1903 +#: cps/admin.py:607 cps/admin.py:1981 msgid "Calibre-Web configuration updated" msgstr "Calibre-Web yapılandırması güncellendi" -#: cps/admin.py:616 +#: cps/admin.py:619 msgid "Do you really want to delete the Kobo Token?" msgstr "" -#: cps/admin.py:618 +#: cps/admin.py:621 msgid "Do you really want to delete this domain?" msgstr "" -#: cps/admin.py:620 +#: cps/admin.py:623 msgid "Do you really want to delete this user?" msgstr "" -#: cps/admin.py:622 +#: cps/admin.py:625 msgid "Do you really want to delete this book?" msgstr "" -#: cps/admin.py:624 +#: cps/admin.py:627 msgid "Are you sure you want to delete this shelf?" msgstr "" -#: cps/admin.py:626 +#: cps/admin.py:629 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "" -#: cps/admin.py:628 +#: cps/admin.py:631 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "" -#: cps/admin.py:630 +#: cps/admin.py:633 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "" -#: cps/admin.py:632 +#: cps/admin.py:635 msgid "Are you sure you want to change the archive status for the selected book(s)?" msgstr "" -#: cps/admin.py:634 +#: cps/admin.py:637 msgid "Are you sure you want to change the read status for the selected book(s)?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:639 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "" -#: cps/admin.py:638 +#: cps/admin.py:641 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "" -#: cps/admin.py:641 +#: cps/admin.py:644 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "" -#: cps/admin.py:643 +#: cps/admin.py:646 msgid "Are you sure you want to change Calibre library location?" msgstr "" -#: cps/admin.py:645 +#: cps/admin.py:648 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "" -#: cps/admin.py:648 +#: cps/admin.py:651 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "" -#: cps/admin.py:891 cps/admin.py:897 cps/admin.py:907 cps/admin.py:917 +#: cps/admin.py:894 cps/admin.py:900 cps/admin.py:910 cps/admin.py:920 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "" -#: cps/admin.py:893 cps/admin.py:899 cps/admin.py:909 cps/admin.py:919 +#: cps/admin.py:896 cps/admin.py:902 cps/admin.py:912 cps/admin.py:922 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "" -#: cps/admin.py:952 +#: cps/admin.py:955 #, python-brace-format msgid "{} sync entries deleted" msgstr "" -#: cps/admin.py:993 +#: cps/admin.py:996 msgid "Tag not found" msgstr "" -#: cps/admin.py:1011 +#: cps/admin.py:1014 msgid "Invalid Action" msgstr "" -#: cps/admin.py:1138 +#: cps/admin.py:1137 +#, python-format +msgid "Invalid reverse proxy trusted IP/CIDR entry: %(entry)s" +msgstr "" + +#: cps/admin.py:1148 +#, python-format +msgid "Invalid %(label)s: %(value)s" +msgstr "" + +#: cps/admin.py:1166 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "" -#: cps/admin.py:1183 +#: cps/admin.py:1211 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1189 +#: cps/admin.py:1217 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1223 +#: cps/admin.py:1251 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "" -#: cps/admin.py:1229 +#: cps/admin.py:1257 msgid "Please Enter a LDAP Service Account and Password" msgstr "" -#: cps/admin.py:1232 +#: cps/admin.py:1260 msgid "Please Enter a LDAP Service Account" msgstr "" -#: cps/admin.py:1237 +#: cps/admin.py:1265 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1239 +#: cps/admin.py:1267 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1243 +#: cps/admin.py:1271 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1245 +#: cps/admin.py:1273 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1252 +#: cps/admin.py:1280 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1254 +#: cps/admin.py:1282 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1261 +#: cps/admin.py:1289 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1292 cps/templates/admin.html:53 +#: cps/admin.py:1320 cps/templates/admin.html:53 msgid "Add New User" msgstr "" -#: cps/admin.py:1301 cps/templates/admin.html:100 +#: cps/admin.py:1329 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "" -#: cps/admin.py:1320 +#: cps/admin.py:1348 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1340 cps/admin.py:1343 cps/admin.py:1728 cps/admin.py:1887 -#: cps/admin.py:1985 cps/admin.py:2106 cps/editbooks.py:169 -#: cps/editbooks.py:755 cps/editbooks.py:1474 cps/shelf.py:90 cps/shelf.py:144 +#: cps/admin.py:1368 cps/admin.py:1371 cps/admin.py:1756 cps/admin.py:1965 +#: cps/admin.py:2063 cps/admin.py:2184 cps/editbooks.py:170 +#: cps/editbooks.py:772 cps/editbooks.py:1518 cps/shelf.py:90 cps/shelf.py:144 #: cps/shelf.py:194 cps/shelf.py:237 cps/shelf.py:287 cps/shelf.py:327 -#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:160 cps/web.py:1526 +#: cps/shelf.py:401 cps/shelf.py:523 cps/tasks/convert.py:161 cps/web.py:1536 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "" -#: cps/admin.py:1350 +#: cps/admin.py:1378 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1353 +#: cps/admin.py:1381 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Deneme e-postası gönderilirken bir hata oluştu: %(res)s" -#: cps/admin.py:1355 +#: cps/admin.py:1383 msgid "Please configure your e-mail address first..." msgstr "Lütfen önce e-posta adresinizi ayarlayın..." -#: cps/admin.py:1357 +#: cps/admin.py:1385 msgid "Email Server Settings updated" msgstr "E-posta sunucusu ayarları güncellendi" -#: cps/admin.py:1380 cps/templates/admin.html:195 +#: cps/admin.py:1408 cps/templates/admin.html:211 msgid "Edit Scheduled Tasks Settings" msgstr "" -#: cps/admin.py:1392 +#: cps/admin.py:1420 msgid "Invalid start time for task specified" msgstr "" -#: cps/admin.py:1397 +#: cps/admin.py:1425 msgid "Invalid duration for task specified" msgstr "" -#: cps/admin.py:1407 +#: cps/admin.py:1435 msgid "Scheduled tasks settings updated" msgstr "" -#: cps/admin.py:1417 cps/admin.py:1466 cps/admin.py:2102 cps/web.py:1325 +#: cps/admin.py:1445 cps/admin.py:1494 cps/admin.py:2180 cps/web.py:1335 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Bilinmeyen bir hata oluştu. Lütfen daha sonra tekrar deneyiniz." -#: cps/admin.py:1421 +#: cps/admin.py:1449 msgid "Settings DB is not Writeable" msgstr "" -#: cps/admin.py:1451 cps/admin.py:2094 +#: cps/admin.py:1479 cps/admin.py:2172 #, python-format msgid "Edit User %(nick)s" msgstr "%(nick)s kullanıcısını düzenle" -#: cps/admin.py:1463 +#: cps/admin.py:1491 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "" -#: cps/admin.py:1469 +#: cps/admin.py:1497 msgid "Oops! Please configure the SMTP mail settings." msgstr "" -#: cps/admin.py:1480 +#: cps/admin.py:1508 msgid "Logfile viewer" msgstr "Log dosyası görüntüleyici" -#: cps/admin.py:1546 +#: cps/admin.py:1574 msgid "Requesting update package" msgstr "Güncelleme paketi isteniyor" -#: cps/admin.py:1547 +#: cps/admin.py:1575 msgid "Downloading update package" msgstr "Güncelleme paketi indiriliyor" -#: cps/admin.py:1548 +#: cps/admin.py:1576 msgid "Unzipping update package" msgstr "Güncelleme paketi ayıklanıyor" -#: cps/admin.py:1549 +#: cps/admin.py:1577 msgid "Replacing files" msgstr "Dosyalar değiştiriliyor" -#: cps/admin.py:1550 +#: cps/admin.py:1578 msgid "Database connections are closed" msgstr "Veritabanı bağlantıları kapalı" -#: cps/admin.py:1551 +#: cps/admin.py:1579 msgid "Stopping server" msgstr "Sunucu durduruyor" -#: cps/admin.py:1552 +#: cps/admin.py:1580 msgid "Update finished, please press okay and reload page" msgstr "Güncelleme tamamlandı, sayfayı yenilemek için lütfen Tamam'a tıklayınız" -#: cps/admin.py:1553 cps/admin.py:1554 cps/admin.py:1555 cps/admin.py:1556 -#: cps/admin.py:1557 cps/admin.py:1558 +#: cps/admin.py:1581 cps/admin.py:1582 cps/admin.py:1583 cps/admin.py:1584 +#: cps/admin.py:1585 cps/admin.py:1586 msgid "Update failed:" msgstr "Güncelleme başarısız:" -#: cps/admin.py:1553 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1581 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP Hatası" -#: cps/admin.py:1554 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1582 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Bağlantı hatası" -#: cps/admin.py:1555 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1583 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Bağlantı kurulmaya çalışırken zaman aşımına uğradı" -#: cps/admin.py:1556 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1584 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Genel hata" -#: cps/admin.py:1557 +#: cps/admin.py:1585 msgid "Update file could not be saved in temp dir" msgstr "" -#: cps/admin.py:1558 +#: cps/admin.py:1586 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1582 +#: cps/admin.py:1610 msgid "Failed to extract at least One LDAP User" msgstr "" -#: cps/admin.py:1627 +#: cps/admin.py:1655 msgid "Failed to Create at Least One LDAP User" msgstr "" -#: cps/admin.py:1640 +#: cps/admin.py:1668 #, python-format msgid "Error: %(ldaperror)s" msgstr "" -#: cps/admin.py:1644 +#: cps/admin.py:1672 msgid "Error: No user returned in response of LDAP server" msgstr "" -#: cps/admin.py:1680 +#: cps/admin.py:1708 msgid "At Least One LDAP User Not Found in Database" msgstr "" -#: cps/admin.py:1682 +#: cps/admin.py:1710 #, python-brace-format msgid "{} User Successfully Imported" msgstr "" -#: cps/admin.py:1740 +#: cps/admin.py:1768 msgid "Books path not valid" msgstr "" -#: cps/admin.py:1746 +#: cps/admin.py:1774 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1774 +#: cps/admin.py:1802 msgid "DB is not Writeable" msgstr "" -#: cps/admin.py:1788 +#: cps/admin.py:1816 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1792 +#: cps/admin.py:1820 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1872 +#: cps/admin.py:1846 +msgid "Kepubify binary not found" +msgstr "" + +#: cps/admin.py:1894 +msgid "reverse proxy login header name" +msgstr "" + +#: cps/admin.py:1904 +msgid "reverse proxy shared secret header name" +msgstr "" + +#: cps/admin.py:1913 +msgid "Please configure both reverse proxy shared secret header name and secret" +msgstr "" + +#: cps/admin.py:1917 +msgid "Please configure reverse proxy shared secret header name and secret or disable the feature" +msgstr "" + +#: cps/admin.py:1922 +msgid "Please configure at least one trusted reverse proxy IP or CIDR" +msgstr "" + +#: cps/admin.py:1946 msgid "Password length has to be between 1 and 40" msgstr "" -#: cps/admin.py:1926 +#: cps/admin.py:1957 cps/helper.py:1007 +msgid "Please specify a valid UnRar directory" +msgstr "" + +#: cps/admin.py:2004 msgid "Database Settings updated" msgstr "" -#: cps/admin.py:1934 +#: cps/admin.py:2012 msgid "Database Configuration" msgstr "" -#: cps/admin.py:1949 cps/web.py:1295 +#: cps/admin.py:2027 cps/web.py:1305 msgid "Oops! Please complete all fields." msgstr "Lütfen tüm alanları doldurun!" -#: cps/admin.py:1958 +#: cps/admin.py:2036 msgid "E-mail is not from valid domain" msgstr "E-posta izin verilen bir servisten değil" -#: cps/admin.py:1964 +#: cps/admin.py:2042 msgid "Add new user" msgstr "Yeni kullanıcı ekle" -#: cps/admin.py:1975 +#: cps/admin.py:2053 #, python-format msgid "User '%(user)s' created" msgstr "'%(user)s' kullanıcısı oluşturuldu" -#: cps/admin.py:1981 +#: cps/admin.py:2059 msgid "Oops! An account already exists for this Email. or name." msgstr "" -#: cps/admin.py:2011 +#: cps/admin.py:2089 #, python-format msgid "User '%(nick)s' deleted" msgstr "Kullanıcı '%(nick)s' silindi" -#: cps/admin.py:2014 +#: cps/admin.py:2092 msgid "Can't delete Guest User" msgstr "" -#: cps/admin.py:2017 +#: cps/admin.py:2095 msgid "No admin user remaining, can't delete user" msgstr "Başka yönetici kullanıcı olmadığından silinemedi" -#: cps/admin.py:2072 cps/web.py:1475 +#: cps/admin.py:2150 cps/web.py:1485 msgid "Email can't be empty and has to be a valid Email" msgstr "" -#: cps/admin.py:2098 +#: cps/admin.py:2176 #, python-format msgid "User '%(nick)s' updated" msgstr "'%(nick)s' kullanıcısı güncellendi" @@ -541,145 +580,153 @@ msgstr "'%(nick)s' kullanıcısı güncellendi" msgid "Search" msgstr "Ara" -#: cps/converter.py:31 +#: cps/converter.py:32 msgid "not installed" msgstr "yüklü değil" -#: cps/converter.py:32 +#: cps/converter.py:33 msgid "Execution permissions missing" msgstr "" -#: cps/db.py:1129 cps/templates/config_edit.html:207 +#: cps/db.py:1129 cps/templates/config_edit.html:229 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:565 cps/web.py:599 cps/web.py:644 cps/web.py:684 cps/web.py:711 -#: cps/web.py:998 cps/web.py:1028 cps/web.py:1073 cps/web.py:1101 -#: cps/web.py:1140 +#: cps/web.py:567 cps/web.py:601 cps/web.py:646 cps/web.py:686 cps/web.py:713 +#: cps/web.py:1000 cps/web.py:1030 cps/web.py:1075 cps/web.py:1103 +#: cps/web.py:1142 msgid "None" msgstr "Hiçbiri" -#: cps/editbooks.py:155 +#: cps/editbooks.py:156 #, python-format msgid "File %(file)s uploaded" msgstr "%(file)s dosyası yüklendi" -#: cps/editbooks.py:184 +#: cps/editbooks.py:185 msgid "Source or destination format for conversion missing" msgstr "Dönüştürme için kaynak ya da hedef biçimi eksik" -#: cps/editbooks.py:192 +#: cps/editbooks.py:189 cps/editbooks.py:197 +msgid "Source format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:201 +msgid "Destination format for conversion not supported" +msgstr "" + +#: cps/editbooks.py:209 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "eKitap %(book_format)s formatlarına dönüştürülmek üzere başarıyla sıraya alındı" -#: cps/editbooks.py:196 +#: cps/editbooks.py:213 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Bu eKitabı dönüştürürken bir hata oluştu: %(res)s" -#: cps/editbooks.py:297 +#: cps/editbooks.py:314 msgid "Changes successfully applied" msgstr "" -#: cps/editbooks.py:317 +#: cps/editbooks.py:334 msgid "Value is missing on request" msgstr "" -#: cps/editbooks.py:319 cps/editbooks.py:326 cps/editbooks.py:627 -#: cps/editbooks.py:1146 cps/web.py:532 cps/web.py:1567 cps/web.py:1613 -#: cps/web.py:1663 +#: cps/editbooks.py:336 cps/editbooks.py:343 cps/editbooks.py:644 +#: cps/editbooks.py:1170 cps/web.py:534 cps/web.py:1577 cps/web.py:1623 +#: cps/web.py:1673 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "" -#: cps/editbooks.py:673 cps/editbooks.py:1503 +#: cps/editbooks.py:690 cps/editbooks.py:1547 msgid "User has no rights to upload cover" msgstr "" -#: cps/editbooks.py:694 cps/editbooks.py:938 +#: cps/editbooks.py:711 cps/editbooks.py:961 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "" -#: cps/editbooks.py:709 cps/editbooks.py:912 cps/editbooks.py:1273 +#: cps/editbooks.py:726 cps/editbooks.py:935 cps/editbooks.py:1306 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "" -#: cps/editbooks.py:737 +#: cps/editbooks.py:754 msgid "Metadata successfully updated" msgstr "Metaveri başarıyla güncellendi" -#: cps/editbooks.py:760 +#: cps/editbooks.py:777 #, python-brace-format msgid "Error editing book: {}" msgstr "" -#: cps/editbooks.py:856 +#: cps/editbooks.py:879 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "Yüklenen eKitap muhtemelen kitaplıkta zaten var. Yenisini yüklemeden değiştirmeyi düşünün: " -#: cps/editbooks.py:950 cps/editbooks.py:1420 +#: cps/editbooks.py:973 cps/editbooks.py:1464 msgid "File type isn't allowed to be uploaded to this server" msgstr "" -#: cps/editbooks.py:956 cps/editbooks.py:1431 +#: cps/editbooks.py:979 cps/editbooks.py:1475 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "'%(ext)s' uzantılı dosyaların bu sunucuya yüklenmesine izin verilmiyor" -#: cps/editbooks.py:960 cps/editbooks.py:1436 +#: cps/editbooks.py:983 cps/editbooks.py:1480 msgid "File to be uploaded must have an extension" msgstr "Yüklenecek dosyanın mutlaka bir uzantısı olması gerekli" -#: cps/editbooks.py:968 +#: cps/editbooks.py:992 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "%(filename)s dosyası geçici dizine kaydedilemedi" -#: cps/editbooks.py:988 +#: cps/editbooks.py:1012 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "" -#: cps/editbooks.py:1041 +#: cps/editbooks.py:1065 msgid "Book Format Successfully Deleted" msgstr "" -#: cps/editbooks.py:1044 cps/editbooks.py:1061 +#: cps/editbooks.py:1068 cps/editbooks.py:1085 msgid "Book Successfully Deleted" msgstr "" -#: cps/editbooks.py:1065 +#: cps/editbooks.py:1089 msgid "You are missing permissions to delete books" msgstr "" -#: cps/editbooks.py:1139 +#: cps/editbooks.py:1163 #, python-brace-format msgid "Book with id \"{}\" could not be deleted: not found" msgstr "" -#: cps/editbooks.py:1181 +#: cps/editbooks.py:1205 msgid "edit metadata" msgstr "metaveri düzenle" -#: cps/editbooks.py:1234 +#: cps/editbooks.py:1267 #, python-format msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1425 +#: cps/editbooks.py:1469 msgid "User has no rights to upload additional file formats" msgstr "" -#: cps/editbooks.py:1449 +#: cps/editbooks.py:1493 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "%(path)s dizini oluşturulamadı. (İzin reddedildi)" -#: cps/editbooks.py:1456 +#: cps/editbooks.py:1500 #, python-format msgid "Failed to store file %(file)s." msgstr "%(file)s dosyası kaydedilemedi." -#: cps/editbooks.py:1481 +#: cps/editbooks.py:1525 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "%(book)s kitabına %(ext)s dosya biçimi eklendi" @@ -690,9 +737,9 @@ msgstr "" #: cps/error_handler.py:108 cps/templates/layout.html:69 #: cps/templates/layout.html:104 cps/templates/login.html:27 -#: cps/templates/register.html:17 cps/web.py:1292 cps/web.py:1296 -#: cps/web.py:1302 cps/web.py:1326 cps/web.py:1330 cps/web.py:1343 -#: cps/web.py:1346 +#: cps/templates/register.html:17 cps/web.py:1302 cps/web.py:1306 +#: cps/web.py:1312 cps/web.py:1336 cps/web.py:1340 cps/web.py:1353 +#: cps/web.py:1356 msgid "Register" msgstr "Kayıt ol" @@ -713,7 +760,7 @@ msgstr "Geri yönlendirme alanı (callback domain) doğrulanamadı, lütfen Goog msgid "%(format)s format not found for book id: %(book)d" msgstr "%(book)d nolu kitap için %(format)s biçimi bulunamadı" -#: cps/helper.py:94 cps/tasks/convert.py:91 +#: cps/helper.py:94 cps/tasks/convert.py:92 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(fn)s eKitabı için %(format)s biçimi Google Drive'da bulunamadı" @@ -899,10 +946,6 @@ msgstr "" msgid "Cover" msgstr "" -#: cps/helper.py:1006 -msgid "UnRar binary file not found" -msgstr "" - #: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "" @@ -933,7 +976,7 @@ msgstr "" msgid "Error executing Calibre" msgstr "" -#: cps/helper.py:1154 cps/templates/admin.html:216 +#: cps/helper.py:1154 cps/templates/admin.html:232 msgid "Queue all books for metadata backup" msgstr "" @@ -955,7 +998,7 @@ msgstr "%(provider)s ile Kaydol" msgid "This %(oauth)s account is already linked to a different user" msgstr "" -#: cps/oauth_bb.py:147 cps/remotelogin.py:131 +#: cps/oauth_bb.py:147 cps/remotelogin.py:150 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "giriş yaptınız: '%(nickname)s'" @@ -1023,25 +1066,29 @@ msgstr "" msgid "{} Stars" msgstr "" -#: cps/remotelogin.py:63 cps/templates/layout.html:68 -#: cps/templates/layout.html:103 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1361 -msgid "Login" -msgstr "Giriş" - -#: cps/remotelogin.py:75 cps/remotelogin.py:109 +#: cps/remotelogin.py:46 cps/remotelogin.py:128 msgid "Token not found" msgstr "Token bulunamadı" -#: cps/remotelogin.py:84 cps/remotelogin.py:117 +#: cps/remotelogin.py:55 cps/remotelogin.py:136 msgid "Token has expired" msgstr "Token süresi doldu" -#: cps/remotelogin.py:93 +#: cps/remotelogin.py:86 cps/remotelogin.py:112 cps/templates/layout.html:68 +#: cps/templates/layout.html:103 cps/templates/login.html:4 +#: cps/templates/login.html:21 cps/web.py:1371 +msgid "Login" +msgstr "Giriş" + +#: cps/remotelogin.py:100 +msgid "Token already approved" +msgstr "" + +#: cps/remotelogin.py:108 msgid "Success! Please return to your device" msgstr "Başarılı! Lütfen cihazınıza dönün" -#: cps/render_template.py:41 cps/web.py:421 +#: cps/render_template.py:41 cps/web.py:423 msgid "Books" msgstr "eKitaplar" @@ -1066,7 +1113,7 @@ msgstr "" msgid "Show Downloaded Books" msgstr "" -#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:436 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:438 msgid "Top Rated Books" msgstr "" @@ -1075,7 +1122,7 @@ msgid "Show Top Rated Books" msgstr "" #: cps/render_template.py:61 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:769 +#: cps/templates/index.xml:67 cps/web.py:771 msgid "Read Books" msgstr "Okunanlar" @@ -1084,7 +1131,7 @@ msgid "Show Read and Unread" msgstr "" #: cps/render_template.py:65 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:772 +#: cps/templates/index.xml:74 cps/web.py:774 msgid "Unread Books" msgstr "Okunmamışlar" @@ -1102,7 +1149,7 @@ msgid "Show Random Books" msgstr "Rastgele Kitap Göster" #: cps/render_template.py:71 cps/templates/book_table.html:93 -#: cps/templates/index.xml:97 cps/web.py:1144 +#: cps/templates/index.xml:97 cps/web.py:1146 msgid "Categories" msgstr "Kategoriler" @@ -1112,7 +1159,7 @@ msgstr "" #: cps/render_template.py:74 cps/templates/book_edit.html:86 #: cps/templates/book_table.html:94 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1034 cps/web.py:1046 +#: cps/templates/search_form.html:70 cps/web.py:1036 cps/web.py:1048 msgid "Series" msgstr "Seriler" @@ -1130,7 +1177,7 @@ msgid "Show Author Section" msgstr "" #: cps/render_template.py:81 cps/templates/book_table.html:98 -#: cps/templates/index.xml:88 cps/web.py:1002 +#: cps/templates/index.xml:88 cps/web.py:1004 msgid "Publishers" msgstr "Yayıncılar" @@ -1140,7 +1187,7 @@ msgstr "" #: cps/render_template.py:84 cps/templates/book_table.html:96 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1116 +#: cps/web.py:1118 msgid "Languages" msgstr "Diller" @@ -1164,7 +1211,7 @@ msgstr "Biçimler" msgid "Show File Formats Section" msgstr "" -#: cps/render_template.py:95 cps/web.py:795 +#: cps/render_template.py:95 cps/web.py:797 msgid "Archived Books" msgstr "" @@ -1172,7 +1219,7 @@ msgstr "" msgid "Show Archived Books" msgstr "" -#: cps/render_template.py:100 cps/web.py:831 +#: cps/render_template.py:100 cps/web.py:833 msgid "Books List" msgstr "" @@ -1405,150 +1452,154 @@ msgstr "Yeni bir güncelleme mevcut. Son sürüme güncellemek için aşağıdak msgid "No release information available" msgstr "Sürüm bilgisi mevcut değil" -#: cps/templates/index.html:6 cps/web.py:448 +#: cps/templates/index.html:6 cps/web.py:450 msgid "Discover (Random Books)" msgstr "Keşfet (Rastgele)" -#: cps/web.py:484 +#: cps/web.py:486 msgid "Hot Books (Most Downloaded)" msgstr "" -#: cps/web.py:515 +#: cps/web.py:517 #, python-format msgid "Downloaded books by %(user)s" msgstr "" -#: cps/web.py:548 +#: cps/web.py:550 #, python-format msgid "Author: %(name)s" msgstr "Yazar: %(name)s" -#: cps/web.py:584 +#: cps/web.py:586 #, python-format msgid "Publisher: %(name)s" msgstr "Yayınevi: %(name)s" -#: cps/web.py:612 +#: cps/web.py:614 #, python-format msgid "Series: %(serie)s" msgstr "Seri: %(serie)s" -#: cps/web.py:626 +#: cps/web.py:628 msgid "Rating: None" msgstr "" -#: cps/web.py:635 +#: cps/web.py:637 #, python-format msgid "Rating: %(rating)s stars" msgstr "Değerlendirme: %(rating)s yıldız" -#: cps/web.py:666 +#: cps/web.py:668 #, python-format msgid "File format: %(format)s" msgstr "Biçim: %(format)s" -#: cps/web.py:701 +#: cps/web.py:703 #, python-format msgid "Category: %(name)s" msgstr "Kategori: %(name)s" -#: cps/web.py:730 +#: cps/web.py:732 #, python-format msgid "Language: %(name)s" msgstr "Dil: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:974 +#: cps/templates/admin.html:16 cps/web.py:976 msgid "Downloads" msgstr "" -#: cps/web.py:1076 +#: cps/web.py:1078 msgid "Ratings list" msgstr "Değerlendirme listesi" -#: cps/web.py:1103 +#: cps/web.py:1105 msgid "File formats list" msgstr "Biçim listesi" -#: cps/web.py:1264 +#: cps/web.py:1272 +msgid "Book format not supported" +msgstr "" + +#: cps/web.py:1274 msgid "Please configure the SMTP mail settings first..." msgstr "" -#: cps/web.py:1270 +#: cps/web.py:1280 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "%(eReadermail)s'a gönderilmek üzere başarıyla sıraya alındı" -#: cps/web.py:1273 +#: cps/web.py:1283 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "" -#: cps/web.py:1275 +#: cps/web.py:1285 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "" -#: cps/web.py:1291 cps/web.py:1342 +#: cps/web.py:1301 cps/web.py:1352 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "E-Posta sunucusu ayarlanmadı, lütfen yöneticinizle iletişime geçin!" -#: cps/web.py:1328 +#: cps/web.py:1338 msgid "Oops! Your Email is not allowed." msgstr "E-posta adresinizle kaydolunmasına izin verilmiyor" -#: cps/web.py:1331 +#: cps/web.py:1341 msgid "Success! Confirmation Email has been sent." msgstr "Onay e-Postası hesabınıza gönderildi." -#: cps/web.py:1376 cps/web.py:1390 +#: cps/web.py:1386 cps/web.py:1400 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1399 +#: cps/web.py:1409 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1406 +#: cps/web.py:1416 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1411 +#: cps/web.py:1421 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1415 cps/web.py:1440 +#: cps/web.py:1425 cps/web.py:1450 msgid "Wrong Username or Password" msgstr "" -#: cps/web.py:1422 +#: cps/web.py:1432 msgid "New Password was sent to your email address" msgstr "" -#: cps/web.py:1426 +#: cps/web.py:1436 msgid "An unknown error occurred. Please try again later." msgstr "" -#: cps/web.py:1428 +#: cps/web.py:1438 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1436 +#: cps/web.py:1446 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1501 cps/web.py:1551 +#: cps/web.py:1511 cps/web.py:1561 #, python-format msgid "%(name)s's Profile" msgstr "%(name)s Profili" -#: cps/web.py:1517 +#: cps/web.py:1527 msgid "Success! Profile Updated" msgstr "" -#: cps/web.py:1521 +#: cps/web.py:1531 msgid "Oops! An account already exists for this Email." msgstr "" @@ -1560,46 +1611,46 @@ msgstr "" msgid "Delete temp folder contents" msgstr "" -#: cps/tasks/convert.py:112 +#: cps/tasks/convert.py:113 #, python-format msgid "%(book)s send to E-Reader" msgstr "" -#: cps/tasks/convert.py:177 +#: cps/tasks/convert.py:180 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "" -#: cps/tasks/convert.py:211 +#: cps/tasks/convert.py:214 #, python-format msgid "%(format)s format not found on disk" msgstr "" -#: cps/tasks/convert.py:215 +#: cps/tasks/convert.py:218 msgid "Ebook converter failed with unknown error" msgstr "" -#: cps/tasks/convert.py:234 +#: cps/tasks/convert.py:237 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "" -#: cps/tasks/convert.py:254 +#: cps/tasks/convert.py:257 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "" -#: cps/tasks/convert.py:291 cps/tasks/convert.py:342 +#: cps/tasks/convert.py:294 cps/tasks/convert.py:345 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:322 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "eKitap-Dönüştürücü hatası: %(error)s" -#: cps/tasks/convert.py:347 +#: cps/tasks/convert.py:350 msgid "Convert" msgstr "" @@ -1685,7 +1736,7 @@ msgstr "Düzenleme" #: cps/templates/admin.html:25 cps/templates/book_edit.html:17 #: cps/templates/book_table.html:131 cps/templates/book_table.html:180 -#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:115 +#: cps/templates/modal_dialogs.html:62 cps/templates/modal_dialogs.html:117 #: cps/templates/user_edit.html:67 cps/templates/user_table.html:149 msgid "Delete" msgstr "Sil" @@ -1775,128 +1826,145 @@ msgstr "" msgid "Reverse Proxy Login" msgstr "" -#: cps/templates/admin.html:154 cps/templates/config_edit.html:176 +#: cps/templates/admin.html:154 cps/templates/config_edit.html:180 msgid "Reverse Proxy Header Name" msgstr "Ters Proxy Header Adı" -#: cps/templates/admin.html:159 +#: cps/templates/admin.html:158 +msgid "Reverse Proxy Trusted IPs/CIDRs" +msgstr "" + +#: cps/templates/admin.html:162 cps/templates/config_edit.html:193 +msgid "Reverse Proxy Shared Secret Header Name" +msgstr "" + +#: cps/templates/admin.html:166 +msgid "Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/admin.html:170 +msgid "Reverse Proxy Shared Secret Configured" +msgstr "" + +#: cps/templates/admin.html:175 msgid "Edit Calibre Database Configuration" msgstr "" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:176 msgid "Edit Basic Configuration" msgstr "" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:177 msgid "Edit UI Configuration" msgstr "" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:183 msgid "Scheduled Tasks" msgstr "" -#: cps/templates/admin.html:170 cps/templates/schedule_edit.html:12 +#: cps/templates/admin.html:186 cps/templates/schedule_edit.html:12 #: cps/templates/tasks.html:18 msgid "Start Time" msgstr "" -#: cps/templates/admin.html:174 cps/templates/schedule_edit.html:20 +#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:20 msgid "Maximum Duration" msgstr "" -#: cps/templates/admin.html:178 cps/templates/schedule_edit.html:29 +#: cps/templates/admin.html:194 cps/templates/schedule_edit.html:29 msgid "Generate Thumbnails" msgstr "" -#: cps/templates/admin.html:182 +#: cps/templates/admin.html:198 msgid "Generate series cover thumbnails" msgstr "" -#: cps/templates/admin.html:186 cps/templates/admin.html:208 +#: cps/templates/admin.html:202 cps/templates/admin.html:224 #: cps/templates/schedule_edit.html:37 msgid "Reconnect Calibre Database" msgstr "" -#: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 +#: cps/templates/admin.html:206 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" msgstr "" -#: cps/templates/admin.html:197 +#: cps/templates/admin.html:213 msgid "Refresh Thumbnail Cache" msgstr "" -#: cps/templates/admin.html:203 +#: cps/templates/admin.html:219 msgid "Administration" msgstr "Yönetim" -#: cps/templates/admin.html:204 +#: cps/templates/admin.html:220 msgid "Download Debug Package" msgstr "" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:221 msgid "View Logs" msgstr "" -#: cps/templates/admin.html:211 +#: cps/templates/admin.html:227 msgid "Restart" msgstr "" -#: cps/templates/admin.html:212 +#: cps/templates/admin.html:228 msgid "Shutdown" msgstr "" -#: cps/templates/admin.html:221 +#: cps/templates/admin.html:237 msgid "Version Information" msgstr "" -#: cps/templates/admin.html:225 +#: cps/templates/admin.html:241 msgid "Version" msgstr "Sürüm" -#: cps/templates/admin.html:226 +#: cps/templates/admin.html:242 msgid "Details" msgstr "Detaylar" -#: cps/templates/admin.html:232 +#: cps/templates/admin.html:248 msgid "Current Version" msgstr "Geçerli sürüm" -#: cps/templates/admin.html:239 +#: cps/templates/admin.html:255 msgid "Check for Update" msgstr "" -#: cps/templates/admin.html:240 +#: cps/templates/admin.html:256 msgid "Perform Update" msgstr "Güncelle" -#: cps/templates/admin.html:253 +#: cps/templates/admin.html:269 msgid "Are you sure you want to restart?" msgstr "" -#: cps/templates/admin.html:258 cps/templates/admin.html:272 -#: cps/templates/admin.html:292 cps/templates/config_db.html:82 +#: cps/templates/admin.html:274 cps/templates/admin.html:288 +#: cps/templates/admin.html:308 cps/templates/config_db.html:82 msgid "OK" msgstr "" -#: cps/templates/admin.html:259 cps/templates/admin.html:273 +#: cps/templates/admin.html:275 cps/templates/admin.html:289 #: cps/templates/book_edit.html:220 cps/templates/book_table.html:162 #: cps/templates/book_table.html:181 cps/templates/book_table.html:201 #: cps/templates/book_table.html:221 cps/templates/book_table.html:241 #: cps/templates/book_table.html:261 cps/templates/book_table.html:316 -#: cps/templates/config_db.html:66 cps/templates/config_edit.html:431 +#: cps/templates/config_db.html:66 cps/templates/config_edit.html:453 #: cps/templates/config_view_edit.html:175 cps/templates/detail.html:350 -#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:98 -#: cps/templates/modal_dialogs.html:116 cps/templates/modal_dialogs.html:134 +#: cps/templates/modal_dialogs.html:63 cps/templates/modal_dialogs.html:100 +#: cps/templates/modal_dialogs.html:118 cps/templates/modal_dialogs.html:136 +#: cps/templates/remote_login_verify.html:16 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 #: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "" -#: cps/templates/admin.html:271 +#: cps/templates/admin.html:287 msgid "Are you sure you want to shutdown?" msgstr "" -#: cps/templates/admin.html:283 +#: cps/templates/admin.html:299 msgid "Updating, please do not reload this page" msgstr "" @@ -2137,7 +2205,7 @@ msgid "Fetch Metadata" msgstr "" #: cps/templates/book_edit.html:219 cps/templates/config_db.html:65 -#: cps/templates/config_edit.html:430 cps/templates/config_view_edit.html:174 +#: cps/templates/config_edit.html:452 cps/templates/config_view_edit.html:174 #: cps/templates/email_edit.html:65 cps/templates/schedule_edit.html:44 #: cps/templates/shelf_edit.html:25 cps/templates/shelf_order.html:41 #: cps/templates/user_edit.html:142 @@ -2509,214 +2577,234 @@ msgstr "" msgid "Allow Reverse Proxy Authentication" msgstr "Ters Proxy Kimlik Doğrulamaya İzin Ver" -#: cps/templates/config_edit.html:183 +#: cps/templates/config_edit.html:176 +msgid "Security Warning" +msgstr "" + +#: cps/templates/config_edit.html:177 +msgid "Only enable this when Calibre-Web is reachable exclusively through a trusted reverse proxy. Never expose Calibre-Web directly to untrusted networks while reverse proxy authentication is enabled." +msgstr "" + +#: cps/templates/config_edit.html:184 +msgid "Reverse Proxy Trusted IPs/CIDRs (Comma Separated)" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "Enable Reverse Proxy Shared Secret Header" +msgstr "" + +#: cps/templates/config_edit.html:197 +msgid "Reverse Proxy Shared Secret" +msgstr "" + +#: cps/templates/config_edit.html:205 msgid "Login type" msgstr "Giriş türü" -#: cps/templates/config_edit.html:185 +#: cps/templates/config_edit.html:207 msgid "Use Standard Authentication" msgstr "" -#: cps/templates/config_edit.html:187 +#: cps/templates/config_edit.html:209 msgid "Use LDAP Authentication" msgstr "LDAP Kimlik Doğrulama kullan" -#: cps/templates/config_edit.html:190 +#: cps/templates/config_edit.html:212 msgid "Use OAuth" msgstr "OAuth kullan" -#: cps/templates/config_edit.html:197 +#: cps/templates/config_edit.html:219 msgid "LDAP Server Host Name or IP Address" msgstr "LDAP Sunucu adı veya IP Adresi" -#: cps/templates/config_edit.html:201 +#: cps/templates/config_edit.html:223 msgid "LDAP Server Port" msgstr "LDAP Sunucu Portu" -#: cps/templates/config_edit.html:205 +#: cps/templates/config_edit.html:227 msgid "LDAP Encryption" msgstr "" -#: cps/templates/config_edit.html:208 +#: cps/templates/config_edit.html:230 msgid "TLS" msgstr "" -#: cps/templates/config_edit.html:209 +#: cps/templates/config_edit.html:231 msgid "SSL" msgstr "SSL" -#: cps/templates/config_edit.html:213 +#: cps/templates/config_edit.html:235 msgid "LDAP CACertificate Path (Only needed for Client Certificate Authentication)" msgstr "" -#: cps/templates/config_edit.html:220 +#: cps/templates/config_edit.html:242 msgid "LDAP Certificate Path (Only needed for Client Certificate Authentication)" msgstr "" -#: cps/templates/config_edit.html:227 +#: cps/templates/config_edit.html:249 msgid "LDAP Keyfile Path (Only needed for Client Certificate Authentication)" msgstr "" -#: cps/templates/config_edit.html:236 +#: cps/templates/config_edit.html:258 msgid "LDAP Authentication" msgstr "" -#: cps/templates/config_edit.html:238 +#: cps/templates/config_edit.html:260 msgid "Anonymous" msgstr "" -#: cps/templates/config_edit.html:239 +#: cps/templates/config_edit.html:261 msgid "Unauthenticated" msgstr "" -#: cps/templates/config_edit.html:240 +#: cps/templates/config_edit.html:262 msgid "Simple" msgstr "" -#: cps/templates/config_edit.html:245 +#: cps/templates/config_edit.html:267 msgid "LDAP Administrator Username" msgstr "" -#: cps/templates/config_edit.html:251 +#: cps/templates/config_edit.html:273 msgid "LDAP Administrator Password" msgstr "" -#: cps/templates/config_edit.html:256 +#: cps/templates/config_edit.html:278 msgid "LDAP Distinguished Name (DN)" msgstr "LDAP Ayırt Edici Adı (DN)" -#: cps/templates/config_edit.html:260 +#: cps/templates/config_edit.html:282 msgid "LDAP User Object Filter" msgstr "" -#: cps/templates/config_edit.html:265 +#: cps/templates/config_edit.html:287 msgid "LDAP Server is OpenLDAP?" msgstr "LDAP Sunucusu OpenLDAP kullanıyor?" -#: cps/templates/config_edit.html:267 +#: cps/templates/config_edit.html:289 msgid "Following Settings are Needed For User Import" msgstr "" -#: cps/templates/config_edit.html:269 +#: cps/templates/config_edit.html:291 msgid "LDAP Group Object Filter" msgstr "" -#: cps/templates/config_edit.html:273 +#: cps/templates/config_edit.html:295 msgid "LDAP Group Name" msgstr "" -#: cps/templates/config_edit.html:277 +#: cps/templates/config_edit.html:299 msgid "LDAP Group Members Field" msgstr "" -#: cps/templates/config_edit.html:281 +#: cps/templates/config_edit.html:303 msgid "LDAP Member User Filter Detection" msgstr "" -#: cps/templates/config_edit.html:283 +#: cps/templates/config_edit.html:305 msgid "Autodetect" msgstr "" -#: cps/templates/config_edit.html:284 +#: cps/templates/config_edit.html:306 msgid "Custom Filter" msgstr "" -#: cps/templates/config_edit.html:289 +#: cps/templates/config_edit.html:311 msgid "LDAP Member User Filter" msgstr "" -#: cps/templates/config_edit.html:300 +#: cps/templates/config_edit.html:322 #, python-format msgid "Obtain %(provider)s OAuth Credential" msgstr "%(provider)s OAuth Kimlik Bilgisi Al" -#: cps/templates/config_edit.html:303 +#: cps/templates/config_edit.html:325 #, python-format msgid "%(provider)s OAuth Client Id" msgstr "%(provider)s OAuth Client Id" -#: cps/templates/config_edit.html:307 +#: cps/templates/config_edit.html:329 #, python-format msgid "%(provider)s OAuth Client Secret" msgstr "%(provider)s OAuth Client Secret" -#: cps/templates/config_edit.html:323 +#: cps/templates/config_edit.html:345 msgid "External binaries" msgstr "Harici Uygulamalar" -#: cps/templates/config_edit.html:329 +#: cps/templates/config_edit.html:351 msgid "Path to Calibre Binaries" msgstr "" -#: cps/templates/config_edit.html:337 +#: cps/templates/config_edit.html:359 msgid "Calibre E-Book Converter Settings" msgstr "" -#: cps/templates/config_edit.html:340 +#: cps/templates/config_edit.html:362 msgid "Path to Kepubify E-Book Converter" msgstr "" -#: cps/templates/config_edit.html:348 +#: cps/templates/config_edit.html:370 msgid "Location of Unrar binary" msgstr "" -#: cps/templates/config_edit.html:364 +#: cps/templates/config_edit.html:386 msgid "Security Settings" msgstr "" -#: cps/templates/config_edit.html:372 +#: cps/templates/config_edit.html:394 msgid "Limit failed login attempts" msgstr "" -#: cps/templates/config_edit.html:376 +#: cps/templates/config_edit.html:398 msgid "Configure Backend for Limiter" msgstr "" -#: cps/templates/config_edit.html:380 +#: cps/templates/config_edit.html:402 msgid "Options for Limiter Backend" msgstr "" -#: cps/templates/config_edit.html:386 +#: cps/templates/config_edit.html:408 msgid "Check if file extensions matches file content on upload" msgstr "" -#: cps/templates/config_edit.html:389 +#: cps/templates/config_edit.html:411 msgid "Session protection" msgstr "" -#: cps/templates/config_edit.html:391 +#: cps/templates/config_edit.html:413 msgid "Basic" msgstr "" -#: cps/templates/config_edit.html:392 +#: cps/templates/config_edit.html:414 msgid "Strong" msgstr "" -#: cps/templates/config_edit.html:397 +#: cps/templates/config_edit.html:419 msgid "User Password policy" msgstr "" -#: cps/templates/config_edit.html:401 +#: cps/templates/config_edit.html:423 msgid "Minimum password length" msgstr "" -#: cps/templates/config_edit.html:406 +#: cps/templates/config_edit.html:428 msgid "Enforce number" msgstr "" -#: cps/templates/config_edit.html:410 +#: cps/templates/config_edit.html:432 msgid "Enforce lowercase characters" msgstr "" -#: cps/templates/config_edit.html:414 +#: cps/templates/config_edit.html:436 msgid "Enforce uppercase characters" msgstr "" -#: cps/templates/config_edit.html:418 +#: cps/templates/config_edit.html:440 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" msgstr "" -#: cps/templates/config_edit.html:422 +#: cps/templates/config_edit.html:444 msgid "Enforce special characters" msgstr "" @@ -3183,27 +3271,27 @@ msgstr "" msgid "Choose File Location" msgstr "" -#: cps/templates/modal_dialogs.html:81 +#: cps/templates/modal_dialogs.html:82 msgid "type" msgstr "" -#: cps/templates/modal_dialogs.html:82 +#: cps/templates/modal_dialogs.html:83 msgid "name" msgstr "" -#: cps/templates/modal_dialogs.html:83 +#: cps/templates/modal_dialogs.html:84 msgid "size" msgstr "" -#: cps/templates/modal_dialogs.html:89 +#: cps/templates/modal_dialogs.html:90 msgid "Parent Directory" msgstr "" -#: cps/templates/modal_dialogs.html:97 +#: cps/templates/modal_dialogs.html:99 msgid "Select" msgstr "" -#: cps/templates/modal_dialogs.html:133 cps/templates/tasks.html:46 +#: cps/templates/modal_dialogs.html:135 cps/templates/tasks.html:46 msgid "Ok" msgstr "" @@ -3459,6 +3547,31 @@ msgstr "" msgid "This verification link will expire in 10 minutes." msgstr "" +#: cps/templates/remote_login_verify.html:4 +msgid "Approve Magic Link Login" +msgstr "" + +#: cps/templates/remote_login_verify.html:5 +msgid "Review the device that requested access before approving this login." +msgstr "" + +#: cps/templates/remote_login_verify.html:7 +msgid "IP address" +msgstr "" + +#: cps/templates/remote_login_verify.html:9 +msgid "Browser" +msgstr "" + +#: cps/templates/remote_login_verify.html:12 +#, python-format +msgid "If you approve this request, the device that started it will be logged in as %(username)s." +msgstr "" + +#: cps/templates/remote_login_verify.html:15 +msgid "Approve Login" +msgstr "" + #: cps/templates/schedule_edit.html:33 msgid "Generate Series Cover Thumbnails" msgstr "" diff --git a/cps/translations/uk/LC_MESSAGES/messages.mo b/cps/translations/uk/LC_MESSAGES/messages.mo index ab7bb787dd5f3207ea2c3db07e9385c636a3d330..2ad03ee3428f5b869349183b4360f429aa57a450 100644 GIT binary patch literal 86865 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