Merge branch 'Develop'

Update Requirements
Update Teststatus
This commit is contained in:
Ozzie Isaacs
2026-02-18 19:25:18 +01:00
67 changed files with 617 additions and 708 deletions

View File

@@ -25,7 +25,7 @@ import sys
import os import os
import mimetypes import mimetypes
from flask import Flask, request from flask import Flask
from flask.sessions import SecureCookieSessionInterface from flask.sessions import SecureCookieSessionInterface
from .MyLoginManager import MyLoginManager from .MyLoginManager import MyLoginManager
from flask_principal import Principal from flask_principal import Principal
@@ -111,7 +111,8 @@ web_server = WebServer()
updater_thread = Updater() updater_thread = Updater()
if limiter_present: if limiter_present:
limiter = Limiter(key_func=True, headers_enabled=True, auto_check=False, swallow_errors=False) limiter = Limiter(key_func=True, headers_enabled=True, in_memory_fallback_enabled=True, default_limits=[],
swallow_errors=True)
else: else:
limiter = None limiter = None

View File

@@ -18,7 +18,9 @@
import traceback import traceback
from flask import render_template from flask import render_template, request, flash, make_response
from flask_limiter import RateLimitExceeded
from flask_babel import gettext as _
from werkzeug.exceptions import default_exceptions from werkzeug.exceptions import default_exceptions
try: try:
from werkzeug.exceptions import FailedDependency from werkzeug.exceptions import FailedDependency
@@ -26,7 +28,10 @@ except ImportError:
from werkzeug.exceptions import UnprocessableEntity as FailedDependency from werkzeug.exceptions import UnprocessableEntity as FailedDependency
from . import config, app, logger, services from . import config, app, logger, services
from .render_template import render_title_template
from .web import render_login
from .usermanagement import auth
from cps.string_helper import strip_whitespaces
log = logger.create() log = logger.create()
@@ -85,3 +90,21 @@ def init_errorhandler():
log.debug('LDAP server not accessible while trying to login to opds feed') log.debug('LDAP server not accessible while trying to login to opds feed')
return error_http(FailedDependency()) return error_http(FailedDependency())
@app.errorhandler(RateLimitExceeded)
def handle_rate_limit(__):
log.error("Rate limit exceeded {}".format(request.endpoint))
if "register" in request.endpoint:
flash(_(u"Please wait one minute to register next user"), category="error")
return render_title_template('register.html', config=config, title=_("Register"), page="register")
elif "login" in request.endpoint:
form = request.form.to_dict()
username = strip_whitespaces(form.get('username', "")).lower().replace("\n", "").replace("\r", "")
flash(_("Please wait one minute before next login"), category="error")
return render_login(username, form.get("password", ""))
elif "opds" in request.endpoint:
return auth.auth_error_callback(429)
else:
return make_response('', 429)

View File

@@ -25,6 +25,7 @@ import zipfile
from time import gmtime, strftime from time import gmtime, strftime
import json import json
from urllib.parse import unquote from urllib.parse import unquote
import requests
from flask import ( from flask import (
Blueprint, Blueprint,
@@ -41,10 +42,9 @@ from werkzeug.datastructures import Headers
from sqlalchemy import func from sqlalchemy import func
from sqlalchemy.sql.expression import and_, or_ from sqlalchemy.sql.expression import and_, or_
from sqlalchemy.exc import StatementError from sqlalchemy.exc import StatementError
import requests
from . import config, logger, kobo_auth, db, calibre_db, helper, shelf as shelf_lib, ub, csrf, kobo_sync_status from . import config, logger, kobo_auth, db, calibre_db, helper, shelf as shelf_lib, ub, csrf, kobo_sync_status
from . import isoLanguages from . import isoLanguages, limiter
from .epub import get_epub_layout from .epub import get_epub_layout
from .constants import COVER_THUMBNAIL_SMALL, COVER_THUMBNAIL_MEDIUM, COVER_THUMBNAIL_LARGE, BASE_DIR from .constants import COVER_THUMBNAIL_SMALL, COVER_THUMBNAIL_MEDIUM, COVER_THUMBNAIL_LARGE, BASE_DIR
from .helper import get_download_link from .helper import get_download_link
@@ -140,7 +140,7 @@ def convert_to_kobo_timestamp_string(timestamp):
@kobo.route("/v1/library/sync") @kobo.route("/v1/library/sync")
@requires_kobo_auth @requires_kobo_auth
# @download_required # @limiter.limit("3/minute", key_func=get_remote_address)
def HandleSyncRequest(): def HandleSyncRequest():
if not current_user.role_download(): if not current_user.role_download():
log.info("Users need download permissions for syncing library to Kobo reader") log.info("Users need download permissions for syncing library to Kobo reader")
@@ -336,6 +336,7 @@ def generate_sync_response(sync_token, sync_results, set_cont=False):
@kobo.route("/v1/library/<book_uuid>/metadata") @kobo.route("/v1/library/<book_uuid>/metadata")
@requires_kobo_auth @requires_kobo_auth
@download_required @download_required
# @limiter.limit("3/minute", key_func=get_remote_address)
def HandleMetadataRequest(book_uuid): def HandleMetadataRequest(book_uuid):
if not current_app.wsgi_app.is_proxied: if not current_app.wsgi_app.is_proxied:
log.debug('Kobo: Received unproxied request, changed request port to external server port') log.debug('Kobo: Received unproxied request, changed request port to external server port')
@@ -368,7 +369,7 @@ def get_download_url_for_book(book_id, book_format):
) )
return url_for( return url_for(
"kobo.download_book", "kobo.download_book",
auth_token=kobo_auth.get_auth_token(), auth_token=get_auth_token(),
book_id=book_id, book_id=book_id,
book_format=book_format.lower(), book_format=book_format.lower(),
_external=True, _external=True,
@@ -503,9 +504,11 @@ def get_metadata(book):
return metadata return metadata
@csrf.exempt @csrf.exempt
@kobo.route("/v1/library/tags", methods=["POST", "DELETE"]) @kobo.route("/v1/library/tags", methods=["POST", "DELETE"])
@requires_kobo_auth @requires_kobo_auth
# @limiter.limit("3/minute", key_func=get_remote_address)
# Creates a Shelf with the given items, and returns the shelf's uuid. # Creates a Shelf with the given items, and returns the shelf's uuid.
def HandleTagCreate(): def HandleTagCreate():
# catch delete requests, otherwise they are handled in the book delete handler # catch delete requests, otherwise they are handled in the book delete handler
@@ -541,6 +544,7 @@ def HandleTagCreate():
@csrf.exempt @csrf.exempt
@kobo.route("/v1/library/tags/<tag_id>", methods=["DELETE", "PUT"]) @kobo.route("/v1/library/tags/<tag_id>", methods=["DELETE", "PUT"])
@requires_kobo_auth @requires_kobo_auth
# @limiter.limit("3/minute", key_func=get_remote_address)
def HandleTagUpdate(tag_id): def HandleTagUpdate(tag_id):
shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.uuid == tag_id, shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.uuid == tag_id,
ub.Shelf.user_id == current_user.id).one_or_none() ub.Shelf.user_id == current_user.id).one_or_none()
@@ -595,6 +599,7 @@ def add_items_to_shelf(items, shelf):
@csrf.exempt @csrf.exempt
@kobo.route("/v1/library/tags/<tag_id>/items", methods=["POST"]) @kobo.route("/v1/library/tags/<tag_id>/items", methods=["POST"])
@requires_kobo_auth @requires_kobo_auth
# @limiter.limit("3/minute", key_func=get_remote_address)
def HandleTagAddItem(tag_id): def HandleTagAddItem(tag_id):
items = None items = None
try: try:
@@ -625,6 +630,7 @@ def HandleTagAddItem(tag_id):
@csrf.exempt @csrf.exempt
@kobo.route("/v1/library/tags/<tag_id>/items/delete", methods=["POST"]) @kobo.route("/v1/library/tags/<tag_id>/items/delete", methods=["POST"])
@requires_kobo_auth @requires_kobo_auth
# @limiter.limit("3/minute", key_func=get_remote_address)
def HandleTagRemoveItem(tag_id): def HandleTagRemoveItem(tag_id):
items = None items = None
try: try:
@@ -758,6 +764,7 @@ def create_kobo_tag(shelf):
@csrf.exempt @csrf.exempt
@kobo.route("/v1/library/<book_uuid>/state", methods=["GET", "PUT"]) @kobo.route("/v1/library/<book_uuid>/state", methods=["GET", "PUT"])
@requires_kobo_auth @requires_kobo_auth
# @limiter.limit("3/minute", key_func=get_remote_address)
def HandleStateRequest(book_uuid): def HandleStateRequest(book_uuid):
book = calibre_db.get_book_by_uuid(book_uuid) book = calibre_db.get_book_by_uuid(book_uuid)
if not book or not book.data: if not book or not book.data:
@@ -907,6 +914,7 @@ def get_current_bookmark_response(current_bookmark):
@kobo.route("/<book_uuid>/<width>/<height>/<isGreyscale>/image.jpg", defaults={'Quality': ""}) @kobo.route("/<book_uuid>/<width>/<height>/<isGreyscale>/image.jpg", defaults={'Quality': ""})
@kobo.route("/<book_uuid>/<width>/<height>/<Quality>/<isGreyscale>/image.jpg") @kobo.route("/<book_uuid>/<width>/<height>/<Quality>/<isGreyscale>/image.jpg")
@requires_kobo_auth @requires_kobo_auth
# @limiter.limit("3/minute", key_func=get_remote_address)
def HandleCoverImageRequest(book_uuid, width, height, Quality, isGreyscale): def HandleCoverImageRequest(book_uuid, width, height, Quality, isGreyscale):
try: try:
if int(height) > 1000: if int(height) > 1000:
@@ -943,6 +951,7 @@ def TopLevelEndpoint():
@csrf.exempt @csrf.exempt
@kobo.route("/v1/library/<book_uuid>", methods=["DELETE"]) @kobo.route("/v1/library/<book_uuid>", methods=["DELETE"])
@requires_kobo_auth @requires_kobo_auth
# @limiter.limit("3/minute", key_func=get_remote_address)
def HandleBookDeletionRequest(book_uuid): def HandleBookDeletionRequest(book_uuid):
log.info("Kobo book delete request received for book %s" % book_uuid) log.info("Kobo book delete request received for book %s" % book_uuid)
book = calibre_db.get_book_by_uuid(book_uuid) book = calibre_db.get_book_by_uuid(book_uuid)
@@ -962,6 +971,7 @@ def HandleBookDeletionRequest(book_uuid):
@kobo.route("/v1/library/<dummy>", methods=["DELETE", "GET", "POST"]) @kobo.route("/v1/library/<dummy>", methods=["DELETE", "GET", "POST"])
@kobo.route("/v1/library/<dummy>/preview", methods=["POST"]) @kobo.route("/v1/library/<dummy>/preview", methods=["POST"])
def HandleUnimplementedRequest(dummy=None): def HandleUnimplementedRequest(dummy=None):
[limiter.limiter.clear(limit.limit, *limit.request_args) for limit in limiter.current_limits]
log.debug("Unimplemented Library Request received: %s (request is forwarded to kobo if configured)", log.debug("Unimplemented Library Request received: %s (request is forwarded to kobo if configured)",
request.base_url) request.base_url)
return redirect_or_proxy_request() return redirect_or_proxy_request()
@@ -976,6 +986,9 @@ def HandleUnimplementedRequest(dummy=None):
@kobo.route("/v1/analytics/<dummy>", methods=["GET", "POST"]) @kobo.route("/v1/analytics/<dummy>", methods=["GET", "POST"])
@kobo.route("/v1/assets", methods=["GET"]) @kobo.route("/v1/assets", methods=["GET"])
def HandleUserRequest(dummy=None): def HandleUserRequest(dummy=None):
[limiter.limiter.clear(limit.limit, *limit.request_args) for limit in limiter.current_limits]
log.error("Key: {}".format(limiter.current_limit.key))
log.error("Remaining: {}".format(limiter.current_limit.remaining))
log.debug("Unimplemented User Request received: %s (request is forwarded to kobo if configured)", request.base_url) log.debug("Unimplemented User Request received: %s (request is forwarded to kobo if configured)", request.base_url)
return redirect_or_proxy_request() return redirect_or_proxy_request()
@@ -983,6 +996,7 @@ def HandleUserRequest(dummy=None):
@csrf.exempt @csrf.exempt
@kobo.route("/v1/user/loyalty/benefits", methods=["GET"]) @kobo.route("/v1/user/loyalty/benefits", methods=["GET"])
def handle_benefits(): def handle_benefits():
[limiter.limiter.clear(limit.limit, *limit.request_args) for limit in limiter.current_limits]
if config.config_kobo_proxy: if config.config_kobo_proxy:
return redirect_or_proxy_request() return redirect_or_proxy_request()
else: else:
@@ -992,6 +1006,7 @@ def handle_benefits():
@csrf.exempt @csrf.exempt
@kobo.route("/v1/analytics/gettests", methods=["GET", "POST"]) @kobo.route("/v1/analytics/gettests", methods=["GET", "POST"])
def handle_getests(): def handle_getests():
[limiter.limiter.clear(limit.limit, *limit.request_args) for limit in limiter.current_limits]
if config.config_kobo_proxy: if config.config_kobo_proxy:
return redirect_or_proxy_request() return redirect_or_proxy_request()
else: else:
@@ -1018,6 +1033,7 @@ def handle_getests():
@kobo.route("/v1/affiliate", methods=["GET", "POST"]) @kobo.route("/v1/affiliate", methods=["GET", "POST"])
@kobo.route("/v1/deals", methods=["GET", "POST"]) @kobo.route("/v1/deals", methods=["GET", "POST"])
def HandleProductsRequest(dummy=None): def HandleProductsRequest(dummy=None):
[limiter.limiter.clear(limit.limit, *limit.request_args) for limit in limiter.current_limits]
log.debug("Unimplemented Products Request received: %s (request is forwarded to kobo if configured)", log.debug("Unimplemented Products Request received: %s (request is forwarded to kobo if configured)",
request.base_url) request.base_url)
return redirect_or_proxy_request() return redirect_or_proxy_request()
@@ -1046,7 +1062,10 @@ def make_calibre_web_auth_response():
@kobo.route("/v1/auth/refresh", methods=["POST"]) @kobo.route("/v1/auth/refresh", methods=["POST"])
@kobo.route("/v1/auth/device", methods=["POST"]) @kobo.route("/v1/auth/device", methods=["POST"])
@requires_kobo_auth @requires_kobo_auth
# @limiter.limit("3/minute", key_func=get_remote_address)
def HandleAuthRequest(): def HandleAuthRequest():
log.error(limiter.current_limit)
log.error(limiter.current_limit)
log.debug('Kobo Auth request') log.debug('Kobo Auth request')
if config.config_kobo_proxy: if config.config_kobo_proxy:
try: try:
@@ -1058,6 +1077,7 @@ def HandleAuthRequest():
@kobo.route("/v1/initialization") @kobo.route("/v1/initialization")
@requires_kobo_auth @requires_kobo_auth
# @limiter.limit("3/minute", key_func=get_remote_address)
def HandleInitRequest(): def HandleInitRequest():
log.info('Init') log.info('Init')
@@ -1088,7 +1108,7 @@ def HandleInitRequest():
kobo_resources["image_host"] = calibre_web_url kobo_resources["image_host"] = calibre_web_url
kobo_resources["image_url_quality_template"] = unquote(calibre_web_url + kobo_resources["image_url_quality_template"] = unquote(calibre_web_url +
url_for("kobo.HandleCoverImageRequest", url_for("kobo.HandleCoverImageRequest",
auth_token=kobo_auth.get_auth_token(), auth_token=get_auth_token(),
book_uuid="{ImageId}", book_uuid="{ImageId}",
width="{width}", width="{width}",
height="{height}", height="{height}",
@@ -1096,7 +1116,7 @@ def HandleInitRequest():
isGreyscale='isGreyscale')) isGreyscale='isGreyscale'))
kobo_resources["image_url_template"] = unquote(calibre_web_url + kobo_resources["image_url_template"] = unquote(calibre_web_url +
url_for("kobo.HandleCoverImageRequest", url_for("kobo.HandleCoverImageRequest",
auth_token=kobo_auth.get_auth_token(), auth_token=get_auth_token(),
book_uuid="{ImageId}", book_uuid="{ImageId}",
width="{width}", width="{width}",
height="{height}", height="{height}",
@@ -1104,7 +1124,7 @@ def HandleInitRequest():
else: else:
kobo_resources["image_host"] = url_for("web.index", _external=True).strip("/") kobo_resources["image_host"] = url_for("web.index", _external=True).strip("/")
kobo_resources["image_url_quality_template"] = unquote(url_for("kobo.HandleCoverImageRequest", kobo_resources["image_url_quality_template"] = unquote(url_for("kobo.HandleCoverImageRequest",
auth_token=kobo_auth.get_auth_token(), auth_token=get_auth_token(),
book_uuid="{ImageId}", book_uuid="{ImageId}",
width="{width}", width="{width}",
height="{height}", height="{height}",
@@ -1112,7 +1132,7 @@ def HandleInitRequest():
isGreyscale='isGreyscale', isGreyscale='isGreyscale',
_external=True)) _external=True))
kobo_resources["image_url_template"] = unquote(url_for("kobo.HandleCoverImageRequest", kobo_resources["image_url_template"] = unquote(url_for("kobo.HandleCoverImageRequest",
auth_token=kobo_auth.get_auth_token(), auth_token=get_auth_token(),
book_uuid="{ImageId}", book_uuid="{ImageId}",
width="{width}", width="{width}",
height="{height}", height="{height}",
@@ -1128,6 +1148,7 @@ def HandleInitRequest():
@kobo.route("/download/<book_id>/<book_format>") @kobo.route("/download/<book_id>/<book_format>")
@requires_kobo_auth @requires_kobo_auth
@download_required @download_required
# @limiter.limit("3/minute", key_func=get_remote_address)
def download_book(book_id, book_format): def download_book(book_id, book_format):
return get_download_link(book_id, book_format, "kobo") return get_download_link(book_id, book_format, "kobo")

View File

@@ -67,7 +67,6 @@ from functools import wraps
from flask import g, Blueprint, abort, request from flask import g, Blueprint, abort, request
from .cw_login import login_user, current_user from .cw_login import login_user, current_user
from flask_babel import gettext as _ from flask_babel import gettext as _
from flask_limiter import RateLimitExceeded
from . import logger, config, calibre_db, db, helper, ub, lm, limiter from . import logger, config, calibre_db, db, helper, ub, lm, limiter
from .render_template import render_title_template from .render_template import render_title_template
@@ -154,13 +153,6 @@ def requires_kobo_auth(f):
def inner(*args, **kwargs): def inner(*args, **kwargs):
auth_token = get_auth_token() auth_token = get_auth_token()
if auth_token is not None: if auth_token is not None:
try:
limiter.check()
except RateLimitExceeded:
return abort(429)
except (ConnectionError, Exception) as e:
log.error("Connection error to limiter backend: %s", e)
return abort(429)
user = ( user = (
ub.session.query(ub.User) ub.session.query(ub.User)
.join(ub.RemoteAuthToken) .join(ub.RemoteAuthToken)
@@ -169,7 +161,7 @@ def requires_kobo_auth(f):
) )
if user is not None: if user is not None:
login_user(user) login_user(user)
[limiter.limiter.storage.clear(k.key) for k in limiter.current_limits] [limiter.limiter.clear(limit.limit, *limit.request_args) for limit in limiter.current_limits]
return f(*args, **kwargs) return f(*args, **kwargs)
log.debug("Received Kobo request without a recognizable auth token.") log.debug("Received Kobo request without a recognizable auth token.")
return abort(401) return abort(401)

View File

@@ -66,8 +66,8 @@ def main():
app.register_blueprint(tasks) app.register_blueprint(tasks)
app.register_blueprint(web) app.register_blueprint(web)
app.register_blueprint(basic) app.register_blueprint(basic)
app.register_blueprint(opds)
limiter.limit("3/minute", key_func=request_username)(opds) limiter.limit("3/minute", key_func=request_username)(opds)
app.register_blueprint(opds)
app.register_blueprint(jinjia) app.register_blueprint(jinjia)
app.register_blueprint(about) app.register_blueprint(about)
app.register_blueprint(shelf) app.register_blueprint(shelf)
@@ -77,9 +77,9 @@ def main():
app.register_blueprint(gdrive) app.register_blueprint(gdrive)
app.register_blueprint(editbook) app.register_blueprint(editbook)
if kobo_available: if kobo_available:
limiter.limit("3/minute", key_func=get_remote_address)(kobo)
app.register_blueprint(kobo) app.register_blueprint(kobo)
app.register_blueprint(kobo_auth) app.register_blueprint(kobo_auth)
limiter.limit("3/minute", key_func=get_remote_address)(kobo)
if oauth_available: if oauth_available:
app.register_blueprint(oauth) app.register_blueprint(oauth)
success = web_server.start() success = web_server.start()

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-Web\n" "Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2025-06-07 14:44+0300\n" "PO-Revision-Date: 2025-06-07 14:44+0300\n"
"Last-Translator: UsamaFoad <usamafoad@gmail.com>\n" "Last-Translator: UsamaFoad <usamafoad@gmail.com>\n"
"Language: ar\n" "Language: ar\n"
@@ -684,6 +684,22 @@ msgstr "فشل تخزين الملف %(file)s."
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "تمت إضافة تنسيق الملف %(ext)s إلى %(book)s" msgstr "تمت إضافة تنسيق الملف %(ext)s إلى %(book)s"
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr "يرجى الانتظار دقيقة واحدة لتسجيل مستخدم آخر"
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "تسجيل"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr "يرجى الانتظار دقيقة واحدة قبل تسجيل الدخول التالي"
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "لم يكتمل إعداد Google Drive، حاول إلغاء تنشيط Google Drive ثم تنشيطه مرة أخرى" msgstr "لم يكتمل إعداد Google Drive، حاول إلغاء تنشيط Google Drive ثم تنشيطه مرة أخرى"
@@ -1435,21 +1451,6 @@ msgstr "عفوًا! حدث خطأ أثناء إرسال الكتاب: %(res)s"
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "عفوًا! يرجى تحديث ملفك الشخصي ببريد إلكتروني صالح للقارئ الإلكتروني." msgstr "عفوًا! يرجى تحديث ملفك الشخصي ببريد إلكتروني صالح للقارئ الإلكتروني."
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr "يرجى الانتظار دقيقة واحدة لتسجيل مستخدم آخر"
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "تسجيل"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr "خطأ في الاتصال بالواجهة الخلفية للمُحدد، يرجى الاتصال بمسؤول النظام"
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." msgid "Oops! Email server is not configured, please contact your administrator."
msgstr "عفوًا! خادم البريد الإلكتروني غير مهيأ، يرجى الاتصال بمسؤول النظام." msgstr "عفوًا! خادم البريد الإلكتروني غير مهيأ، يرجى الاتصال بمسؤول النظام."
@@ -1466,10 +1467,6 @@ msgstr "نجاح! تم إرسال بريد إلكتروني للتأكيد."
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "لا يمكن تفعيل مصادقة LDAP" msgstr "لا يمكن تفعيل مصادقة LDAP"
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr "يرجى الانتظار دقيقة واحدة قبل تسجيل الدخول التالي"
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -6,7 +6,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-Web\n" "Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2020-06-09 21:11+0100\n" "PO-Revision-Date: 2020-06-09 21:11+0100\n"
"Last-Translator: Lukas Heroudek <lukas.heroudek@gmail.com>\n" "Last-Translator: Lukas Heroudek <lukas.heroudek@gmail.com>\n"
"Language: cs_CZ\n" "Language: cs_CZ\n"
@@ -683,6 +683,22 @@ msgstr "Uložení souboru %(file)s se nezdařilo."
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "Formát souboru %(ext)s přidán do %(book)s" msgstr "Formát souboru %(ext)s přidán do %(book)s"
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr ""
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "Registrovat"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr ""
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "Google Drive nastavení nebylo dokončeno, zkuste znovu deaktivovat a aktivovat Google Drive" msgstr "Google Drive nastavení nebylo dokončeno, zkuste znovu deaktivovat a aktivovat Google Drive"
@@ -1434,21 +1450,6 @@ msgstr "Při odesílání této knihy došlo k chybě: %(res)s"
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "" msgstr ""
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr ""
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "Registrovat"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr ""
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." msgid "Oops! Email server is not configured, please contact your administrator."
msgstr "E-mailový server není nakonfigurován, kontaktujte svého správce!" msgstr "E-mailový server není nakonfigurován, kontaktujte svého správce!"
@@ -1465,10 +1466,6 @@ msgstr "Potvrzovací e-mail byl odeslán na váš účet."
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "" msgstr ""
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr ""
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-Web\n" "Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2025-10-22 19:56+0200\n" "PO-Revision-Date: 2025-10-22 19:56+0200\n"
"Last-Translator: Sebastian Holzer\n" "Last-Translator: Sebastian Holzer\n"
"Language: de\n" "Language: de\n"
@@ -684,6 +684,22 @@ msgstr "Fehler beim Speichern der Datei %(file)s."
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "Dateiformat %(ext)s zu %(book)s hinzugefügt" msgstr "Dateiformat %(ext)s zu %(book)s hinzugefügt"
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr "Bitte eine Minute warten vor der Registrierung des nächsten Benutzers"
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "Registrieren"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr "Bitte eine Minute vor dem nächsten Loginversuch warten"
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "Google Drive Setup is nicht komplett, bitte versuche Google Drive zu deaktivieren und aktiviere es anschließend erneut" msgstr "Google Drive Setup is nicht komplett, bitte versuche Google Drive zu deaktivieren und aktiviere es anschließend erneut"
@@ -1435,21 +1451,6 @@ msgstr "Beim Senden des Buches trat ein Fehler auf: %(res)s"
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "Bitte zuerst die E-Reader E-Mailadresse konfigurieren." msgstr "Bitte zuerst die E-Reader E-Mailadresse konfigurieren."
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr "Bitte eine Minute warten vor der Registrierung des nächsten Benutzers"
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "Registrieren"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr "Verbindugnsfehler zu Limiter Backend, bitte Administrator kontaktieren"
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." msgid "Oops! Email server is not configured, please contact your administrator."
msgstr "Der E-Mail Server ist nicht konfiguriert, bitte den Administrator kontaktieren." msgstr "Der E-Mail Server ist nicht konfiguriert, bitte den Administrator kontaktieren."
@@ -1466,10 +1467,6 @@ msgstr "Eine Bestätigungs-E-Mail wurde an deinen E-Mail Account versendet."
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "LDAP-Authentifizierung kann nicht aktiviert werden" msgstr "LDAP-Authentifizierung kann nicht aktiviert werden"
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr "Bitte eine Minute vor dem nächsten Loginversuch warten"
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -6,7 +6,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-Web\n" "Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Depountis Georgios\n" "Last-Translator: Depountis Georgios\n"
"Language: el\n" "Language: el\n"
@@ -683,6 +683,22 @@ msgstr "Αποτυχία αποθήκευσης αρχείου %(file)s."
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "Μορφή αρχείου %(ext)s προστέθηκε σε %(book)s" msgstr "Μορφή αρχείου %(ext)s προστέθηκε σε %(book)s"
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr ""
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "Εγγραφή"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr ""
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "Η ρύθμιση του Google Drive δεν ολοκληρώθηκε, προσπάθησε να απενεργοποιήσεις και να ενεργοποιήσεις ξανά το Google Drive" msgstr "Η ρύθμιση του Google Drive δεν ολοκληρώθηκε, προσπάθησε να απενεργοποιήσεις και να ενεργοποιήσεις ξανά το Google Drive"
@@ -1434,21 +1450,6 @@ msgstr "Oυπς! Υπήρξε ένα σφάλμα κατά την αποστολ
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "" msgstr ""
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr ""
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "Εγγραφή"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr ""
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." msgid "Oops! Email server is not configured, please contact your administrator."
msgstr "Ο διακομιστής E-Mail δεν έχει διαμορφωθεί, παρακαλούμε επικοινώνησε με το διαχειριστή σου!" msgstr "Ο διακομιστής E-Mail δεν έχει διαμορφωθεί, παρακαλούμε επικοινώνησε με το διαχειριστή σου!"
@@ -1465,10 +1466,6 @@ msgstr "Το e-mail επιβεβαίωσης έχει σταλεί στον e-ma
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "" msgstr ""
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr ""
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -10,7 +10,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-Web\n" "Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2024-10-29 15:26+0100\n" "PO-Revision-Date: 2024-10-29 15:26+0100\n"
"Last-Translator: adruki <adruki@gmail.com>\n" "Last-Translator: adruki <adruki@gmail.com>\n"
"Language: es\n" "Language: es\n"
@@ -687,6 +687,22 @@ msgstr "Error al guardar el archivo %(file)s."
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "Archivo con formato %(ext)s añadido a %(book)s" msgstr "Archivo con formato %(ext)s añadido a %(book)s"
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr "Por favor, espera un minuto para registrar el siguiente usuario"
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "Registro"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr "Por favor, espera un minuto antes de iniciar sesión de nuevo"
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "La configuración de Google Drive no se ha completado, intente desactivar y activar Google Drive nuevamente" msgstr "La configuración de Google Drive no se ha completado, intente desactivar y activar Google Drive nuevamente"
@@ -1438,21 +1454,6 @@ msgstr "Hubo un error en el envío del libro: %(res)s"
msgid "Oops! Please update your profile with a valid eReader Email." 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." msgstr "Por favor, actualiza tu perfil con un correo electrónico de eReader válido."
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr "Por favor, espera un minuto para registrar el siguiente usuario"
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "Registro"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr "Error de conexión con el backend de Limiter, por favor contacta con tu administrador"
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." 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." msgstr "El servidor de correo no está configurado, por favor contacta con tu administrador."
@@ -1469,10 +1470,6 @@ msgstr "Se ha enviado un correo electrónico de verificación a su cuenta de cor
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "No se puede activar la autenticación LDAP" msgstr "No se puede activar la autenticación LDAP"
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr "Por favor, espera un minuto antes de iniciar sesión de nuevo"
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-Web\n" "Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2020-01-12 13:56+0100\n" "PO-Revision-Date: 2020-01-12 13:56+0100\n"
"Last-Translator: Samuli Valavuo <svalavuo@gmail.com>\n" "Last-Translator: Samuli Valavuo <svalavuo@gmail.com>\n"
"Language: fi\n" "Language: fi\n"
@@ -684,6 +684,22 @@ msgstr "Tiedoston %(file)s tallennus epäonnistui."
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "Tiedostoformaatti %(ext)s lisätty %(book)s" msgstr "Tiedostoformaatti %(ext)s lisätty %(book)s"
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr ""
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "Rekisteröi"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr ""
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "Google Drive asetukset ei ole valmiit. Koita poistaa Google Drive käytöstä ja ottaa se uudelleen käyttöön" msgstr "Google Drive asetukset ei ole valmiit. Koita poistaa Google Drive käytöstä ja ottaa se uudelleen käyttöön"
@@ -1435,21 +1451,6 @@ msgstr "Kirjan: %(res)s lähettämisessa tapahtui virhe"
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "" msgstr ""
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr ""
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "Rekisteröi"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr ""
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." msgid "Oops! Email server is not configured, please contact your administrator."
msgstr "" msgstr ""
@@ -1466,10 +1467,6 @@ msgstr "Vahvistusviesti on lähetetty sähköpostiosoitteeseesi."
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "" msgstr ""
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr ""
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-Web\n" "Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2026-01-15 11:30+0000\n" "PO-Revision-Date: 2026-01-15 11:30+0000\n"
"Last-Translator: <thovi98@gmail.com>\n" "Last-Translator: <thovi98@gmail.com>\n"
"Language: fr\n" "Language: fr\n"
@@ -680,6 +680,22 @@ msgstr "Échec de la sauvegarde du fichier %(file)s."
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "Le format de fichier %(ext)s a été ajouté à %(book)s" msgstr "Le format de fichier %(ext)s a été ajouté à %(book)s"
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr "Veuillez patienter une minute pour enregistrer le prochain utilisateur."
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "Créer un compte"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr "Veuillez patienter une minute avant de vous reconnecter."
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "La configuration de Google Drive nest pas terminée, essayez de désactiver et dactiver à nouveau Google Drive" msgstr "La configuration de Google Drive nest pas terminée, essayez de désactiver et dactiver à nouveau Google Drive"
@@ -1431,21 +1447,6 @@ msgstr "Oups ! Une erreur est survenue lors de l'envoi du livre : %(res)s"
msgid "Oops! Please update your profile with a valid eReader Email." 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." msgstr "Oups ! Veuillez mettre à jour votre profil avec une adresse e-mail valide pour votre liseuse."
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr "Veuillez patienter une minute pour enregistrer le prochain utilisateur."
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "Créer un compte"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr "Erreur de connexion au backend du limiteur, veuillez contacter votre administrateur."
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." 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!" msgstr "Oups ! Le serveur de courriel n'est pas configuré, veuillez contacter votre administrateur!"
@@ -1462,10 +1463,6 @@ msgstr "Succès ! Le courriel de confirmation a été envoyé à votre adresse."
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "Impossible d'activer l'authentification LDAP" msgstr "Impossible d'activer l'authentification LDAP"
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr "Veuillez patienter une minute avant de vous reconnecter."
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-Web\n" "Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2024-12-08 13:50+0100\n" "PO-Revision-Date: 2024-12-08 13:50+0100\n"
"Last-Translator: pollitor@gmx.com\n" "Last-Translator: pollitor@gmx.com\n"
"Language: gl\n" "Language: gl\n"
@@ -682,6 +682,22 @@ msgstr "Produciuse un erro ao almacenar o ficheiro %(file)s."
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "Engadiuse o formato de ficheiro %(ext)s a %(book)s" msgstr "Engadiuse o formato de ficheiro %(ext)s a %(book)s"
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr "Agarde un minuto para rexistrar o seguinte usuario"
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "Rexístrate"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr "Agarde un minuto antes do próximo inicio de sesión"
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "Non se completou a configuración de Google Drive, tenta desactivalo e activalo de novo" msgstr "Non se completou a configuración de Google Drive, tenta desactivalo e activalo de novo"
@@ -1433,21 +1449,6 @@ msgstr "Vaia! Produciuse un erro ao enviar o libro: %(res)s"
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "Vaia! Actualiza o teu perfil cun correo electrónico de eReader válido." msgstr "Vaia! Actualiza o teu perfil cun correo electrónico de eReader válido."
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr "Agarde un minuto para rexistrar o seguinte usuario"
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "Rexístrate"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr "Produciuse un erro de conexión ao back-end do limitador. Ponte en contacto co teu administrador"
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." msgid "Oops! Email server is not configured, please contact your administrator."
msgstr "Vaia! O servidor de correo electrónico non está configurado, póñase en contacto co seu administrador." msgstr "Vaia! O servidor de correo electrónico non está configurado, póñase en contacto co seu administrador."
@@ -1464,10 +1465,6 @@ msgstr "Éxito! Enviouse o correo electrónico de confirmación."
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "Non se pode activar a autenticación LDAP" msgstr "Non se pode activar a autenticación LDAP"
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr "Agarde un minuto antes do próximo inicio de sesión"
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2019-04-06 23:36+0200\n" "PO-Revision-Date: 2019-04-06 23:36+0200\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language: hu\n" "Language: hu\n"
@@ -684,6 +684,22 @@ msgstr "Nem sikerült elmenteni a %(file)s fájlt."
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "A(z) %(ext)s fájlformátum hozzáadva a könyvhez: %(book)s." msgstr "A(z) %(ext)s fájlformátum hozzáadva a könyvhez: %(book)s."
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr ""
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "Regisztrálás"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr ""
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "A Google Drive beállítása nem fejeződött be, próbáld kikapcsolni és újra aktíválni a Google Drive-ot." msgstr "A Google Drive beállítása nem fejeződött be, próbáld kikapcsolni és újra aktíválni a Google Drive-ot."
@@ -1435,21 +1451,6 @@ msgstr "Hiba történt a könyv küldésekor: %(res)s"
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "" msgstr ""
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr ""
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "Regisztrálás"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr ""
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." msgid "Oops! Email server is not configured, please contact your administrator."
msgstr "" msgstr ""
@@ -1466,10 +1467,6 @@ msgstr "Jóváhagyó levél elküldve az email címedre."
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "" msgstr ""
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr ""
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-Web\n" "Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2023-01-21 10:00+0700\n" "PO-Revision-Date: 2023-01-21 10:00+0700\n"
"Last-Translator: Arief Hidayat<arihid95@gmail.com>\n" "Last-Translator: Arief Hidayat<arihid95@gmail.com>\n"
"Language: id\n" "Language: id\n"
@@ -684,6 +684,22 @@ msgstr "Gagal menyimpan berkas %(file)s."
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "Format berkas %(ext)s ditambahkan ke %(book)s" msgstr "Format berkas %(ext)s ditambahkan ke %(book)s"
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr ""
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "Daftar"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr ""
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "Pengaturan Google Drive belum selesai, coba nonaktifkan dan aktifkan kembali Google Drive" msgstr "Pengaturan Google Drive belum selesai, coba nonaktifkan dan aktifkan kembali Google Drive"
@@ -1435,21 +1451,6 @@ msgstr "Oops! Terjadi kesalahan saat mengirim buku: %(res)s"
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "" msgstr ""
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr ""
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "Daftar"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr ""
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." msgid "Oops! Email server is not configured, please contact your administrator."
msgstr "Server email belum diatur, silakan hubungi administrator!" msgstr "Server email belum diatur, silakan hubungi administrator!"
@@ -1466,10 +1467,6 @@ msgstr "E-mail konfirmasi telah dikirimkan ke alamat email Anda."
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "" msgstr ""
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr ""
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-Web\n" "Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2026-01-04 02:22+0100\n" "PO-Revision-Date: 2026-01-04 02:22+0100\n"
"Last-Translator: Massimo Pissarello <mapi68@gmail.com>\n" "Last-Translator: Massimo Pissarello <mapi68@gmail.com>\n"
"Language: it\n" "Language: it\n"
@@ -684,6 +684,22 @@ msgstr "Impossibile archiviare il file %(file)s."
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "Formato file %(ext)s aggiunto a %(book)s" msgstr "Formato file %(ext)s aggiunto a %(book)s"
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr "Attendi un minuto per registrare il prossimo utente"
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "Registrati"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr "Attendi un minuto prima del prossimo accesso"
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "Configurazione di Google Drive non completata, prova a disattivare e attivare nuovamente Google Drive" msgstr "Configurazione di Google Drive non completata, prova a disattivare e attivare nuovamente Google Drive"
@@ -1435,21 +1451,6 @@ msgstr "Si è verificato un errore durante l'invio del libro: %(res)s"
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "Per favore aggiorna il tuo profilo con un'e-mail eReader valida." msgstr "Per favore aggiorna il tuo profilo con un'e-mail eReader valida."
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr "Attendi un minuto per registrare il prossimo utente"
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "Registrati"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr "Il server e-mail non è configurato, per favore contatta l'amministratore"
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." msgid "Oops! Email server is not configured, please contact your administrator."
msgstr "Il server e-mail non è configurato, per favore contatta l'amministratore" msgstr "Il server e-mail non è configurato, per favore contatta l'amministratore"
@@ -1466,10 +1467,6 @@ msgstr "Tutto OK! L'e-mail di conferma è stata inviata."
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "Impossibile attivare l'autenticazione LDAP" msgstr "Impossibile attivare l'autenticazione LDAP"
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr "Attendi un minuto prima del prossimo accesso"
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-Web\n" "Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2018-02-07 02:20-0500\n" "PO-Revision-Date: 2018-02-07 02:20-0500\n"
"Last-Translator: subdiox <subdiox@gmail.com>\n" "Last-Translator: subdiox <subdiox@gmail.com>\n"
"Language: ja\n" "Language: ja\n"
@@ -684,6 +684,22 @@ msgstr "ファイル %(file)s を保存できません。"
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "ファイル形式 %(ext)s が %(book)s に追加されました" msgstr "ファイル形式 %(ext)s が %(book)s に追加されました"
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr ""
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "登録"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr ""
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "Googleドライブの設定が完了していません。Googleドライブを無効にしてから再度有効にしてみてください" msgstr "Googleドライブの設定が完了していません。Googleドライブを無効にしてから再度有効にしてみてください"
@@ -1435,21 +1451,6 @@ msgstr "%(res)s を送信中にエラーが発生しました"
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "" msgstr ""
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr ""
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "登録"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr ""
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." msgid "Oops! Email server is not configured, please contact your administrator."
msgstr "メールサーバーが設定されていません。管理者に連絡してください" msgstr "メールサーバーが設定されていません。管理者に連絡してください"
@@ -1466,10 +1467,6 @@ msgstr "確認メールがこのメールアドレスに送信されました。
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "" msgstr ""
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr ""
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-Web\n" "Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2018-08-27 17:06+0700\n" "PO-Revision-Date: 2018-08-27 17:06+0700\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language: km_KH\n" "Language: km_KH\n"
@@ -685,6 +685,22 @@ msgstr "មិនអាចរក្សាទុកឯកសារ %(file)s ។"
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "ឯកសារទម្រង់ %(ext)s ត្រូវបានបន្ថែមទៅ %(book)s" msgstr "ឯកសារទម្រង់ %(ext)s ត្រូវបានបន្ថែមទៅ %(book)s"
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr ""
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "ចុះឈ្មោះ"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr ""
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "" msgstr ""
@@ -1436,21 +1452,6 @@ msgstr "មានបញ្ហានៅពេលផ្ញើសៀវភៅនេ
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "" msgstr ""
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr ""
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "ចុះឈ្មោះ"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr ""
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." msgid "Oops! Email server is not configured, please contact your administrator."
msgstr "" msgstr ""
@@ -1467,10 +1468,6 @@ msgstr ""
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "" msgstr ""
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr ""
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-Web\n" "Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2024-11-01 17:50+0900\n" "PO-Revision-Date: 2024-11-01 17:50+0900\n"
"Last-Translator: limeade23 <admin@limeade.me>\n" "Last-Translator: limeade23 <admin@limeade.me>\n"
"Language: ko\n" "Language: ko\n"
@@ -684,6 +684,22 @@ msgstr "%(file)s 파일 저장에 실패했습니다."
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "파일 형식 %(ext)s이(가) %(book)s에 추가되었습니다" msgstr "파일 형식 %(ext)s이(가) %(book)s에 추가되었습니다"
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr "다음 사용자를 등록은 1분 뒤 가능합니다."
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "등록"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr "1분 후 시도해 주세요."
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "Google 드라이브 설정이 완료되지 않았습니다. Google 드라이브를 비활성화한 후 다시 활성화해 주세요." msgstr "Google 드라이브 설정이 완료되지 않았습니다. Google 드라이브를 비활성화한 후 다시 활성화해 주세요."
@@ -1435,21 +1451,6 @@ msgstr "전송 중 오류가 발생했습니다: %(res)s"
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "문제가 발생했습니다. 프로필에 유효한 전자책 리더 이메일을 설정해 주세요." msgstr "문제가 발생했습니다. 프로필에 유효한 전자책 리더 이메일을 설정해 주세요."
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr "다음 사용자를 등록은 1분 뒤 가능합니다."
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "등록"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr "Flask-Limiter 시스템 연결에 문제가 발생했습니다. 관리자에게 문의하세요."
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." msgid "Oops! Email server is not configured, please contact your administrator."
msgstr "이메일 서버가 설정되지 않았습니다. 관리자에게 문의하세요." msgstr "이메일 서버가 설정되지 않았습니다. 관리자에게 문의하세요."
@@ -1466,10 +1467,6 @@ msgstr "인증 이메일을 발송했습니다."
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "LDAP 인증을 활성화할 수 없습니다." msgstr "LDAP 인증을 활성화할 수 없습니다."
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr "1분 후 시도해 주세요."
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-Web (GPLV3)\n" "Project-Id-Version: Calibre-Web (GPLV3)\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2023-12-20 22:00+0100\n" "PO-Revision-Date: 2023-12-20 22:00+0100\n"
"Last-Translator: Michiel Cornelissen <michiel.cornelissen+gitbhun at proton.me>\n" "Last-Translator: Michiel Cornelissen <michiel.cornelissen+gitbhun at proton.me>\n"
"Language: nl\n" "Language: nl\n"
@@ -685,6 +685,22 @@ msgstr "Kan %(file)s niet opslaan."
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "Bestandsformaat %(ext)s toegevoegd aan %(book)s" msgstr "Bestandsformaat %(ext)s toegevoegd aan %(book)s"
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr "Wacht alstublieft één minuut voor het registreren van de volgende gebruiker"
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "Registreren"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr "Wacht alstublieft één minuut voor de volgende inlogpoging"
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "Het instellen van Google Drive is niet afgerond, heractiveer Google Drive" msgstr "Het instellen van Google Drive is niet afgerond, heractiveer Google Drive"
@@ -1436,21 +1452,6 @@ msgstr "Fout opgetreden bij het versturen van dit boek: %(res)s"
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "" msgstr ""
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr "Wacht alstublieft één minuut voor het registreren van de volgende gebruiker"
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "Registreren"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr ""
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." msgid "Oops! Email server is not configured, please contact your administrator."
msgstr "E-mailserver is niet geconfigureerd, neem contact op met de beheerder!" msgstr "E-mailserver is niet geconfigureerd, neem contact op met de beheerder!"
@@ -1467,10 +1468,6 @@ msgstr "Er is een bevestigings-e-mail verstuurd naar je e-mailadres."
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "" msgstr ""
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr "Wacht alstublieft één minuut voor de volgende inlogpoging"
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-Web\n" "Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2023-01-06 11:00+0000\n" "PO-Revision-Date: 2023-01-06 11:00+0000\n"
"Last-Translator: Vegard Fladby <vegard.fladby@gmail.com>\n" "Last-Translator: Vegard Fladby <vegard.fladby@gmail.com>\n"
"Language: no\n" "Language: no\n"
@@ -684,6 +684,22 @@ msgstr "Kunne ikke lagre filen %(file)s."
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "Filformat %(ext)s lagt til %(book)s" msgstr "Filformat %(ext)s lagt til %(book)s"
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr ""
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "Registrere"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr ""
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "Google Disk-konfigurasjonen er ikke fullført. Prøv å deaktivere og aktivere Google Disk på nytt" msgstr "Google Disk-konfigurasjonen er ikke fullført. Prøv å deaktivere og aktivere Google Disk på nytt"
@@ -1435,21 +1451,6 @@ msgstr ""
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "" msgstr ""
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr ""
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "Registrere"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr ""
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." msgid "Oops! Email server is not configured, please contact your administrator."
msgstr "" msgstr ""
@@ -1466,10 +1467,6 @@ msgstr ""
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "" msgstr ""
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr ""
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre Web - polski (POT: 2021-06-12 08:52)\n" "Project-Id-Version: Calibre Web - polski (POT: 2021-06-12 08:52)\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2025-12-08 12:51+0100\n" "PO-Revision-Date: 2025-12-08 12:51+0100\n"
"Last-Translator: Daniel Szepietowski <daniel@szepi.dev>\n" "Last-Translator: Daniel Szepietowski <daniel@szepi.dev>\n"
"Language: pl\n" "Language: pl\n"
@@ -689,6 +689,22 @@ msgstr "Nie można zapisać pliku %(file)s."
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "Format pliku %(ext)s dodany do %(book)s" msgstr "Format pliku %(ext)s dodany do %(book)s"
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr "Proszę poczekać minutę przed rejestracją kolejnego użytkownika."
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "Zarejestruj się"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr "Proszę poczekać minutę przed kolejnym logowaniem"
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "Konfiguracja Google Drive nie została zakończona, spróbuj dezaktywować i ponownie aktywować Google Drive" msgstr "Konfiguracja Google Drive nie została zakończona, spróbuj dezaktywować i ponownie aktywować Google Drive"
@@ -1443,21 +1459,6 @@ msgstr "Wystąpił błąd podczas wysyłania tej książki: %(res)s"
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "Ups! Zaktualizuj swój profil używając poprawnego adresu email czytnika." msgstr "Ups! Zaktualizuj swój profil używając poprawnego adresu email czytnika."
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr "Proszę poczekać minutę przed rejestracją kolejnego użytkownika."
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "Zarejestruj się"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr "Błąd połączenia z backendem limitera, skontaktuj się z administratorem."
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." msgid "Oops! Email server is not configured, please contact your administrator."
msgstr "Serwer e-mail nie jest skonfigurowany, skontaktuj się z administratorem!" msgstr "Serwer e-mail nie jest skonfigurowany, skontaktuj się z administratorem!"
@@ -1474,10 +1475,6 @@ msgstr "Wiadomość e-mail z potwierdzeniem została wysłana na Twoje konto e-m
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "Nie udało się aktywować autoryzacji za pomocą LDAP" msgstr "Nie udało się aktywować autoryzacji za pomocą LDAP"
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr "Proszę poczekać minutę przed kolejnym logowaniem"
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -4,7 +4,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-Web\n" "Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2023-07-25 11:30+0100\n" "PO-Revision-Date: 2023-07-25 11:30+0100\n"
"Last-Translator: horus68 <https://github.com/horus68>\n" "Last-Translator: horus68 <https://github.com/horus68>\n"
"Language: pt\n" "Language: pt\n"
@@ -681,6 +681,22 @@ msgstr "Falha ao armazenar o ficheiro %(file)s."
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "Formato de ficheiro %(ext)s adicionado a %(book)s" msgstr "Formato de ficheiro %(ext)s adicionado a %(book)s"
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr "Por favor, aguarde um minuto para registar o próximo utilizador"
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "Registar"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr "Por favor, aguarde um minuto antes de nova autenticação"
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "Configuração do Google Drive não concluída, tente desativar e ativar o Google Drive novamente" msgstr "Configuração do Google Drive não concluída, tente desativar e ativar o Google Drive novamente"
@@ -1432,21 +1448,6 @@ msgstr "Ops! Ocorreu um erro ao enviar este livro: %(res)s"
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "" msgstr ""
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr "Por favor, aguarde um minuto para registar o próximo utilizador"
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "Registar"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr ""
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." 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!" msgstr "Ops! O servidor de email não está configurado. Por favor, contacte o seu administrador!"
@@ -1463,10 +1464,6 @@ msgstr "Sucesso! O email de confirmação foi enviado para a sua conta de email.
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "" msgstr ""
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr "Por favor, aguarde um minuto antes de nova autenticação"
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -4,7 +4,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: br\n" "Language: br\n"
@@ -681,6 +681,22 @@ msgstr "Falha ao armazenar o arquivo %(file)s."
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "Formato de arquivo %(ext)s adicionado a %(book)s" msgstr "Formato de arquivo %(ext)s adicionado a %(book)s"
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr "Aguarde um minuto para registrar o próximo usuário"
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "Registe-se"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr "Aguarde um minuto antes do próximo login"
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "Configuração do Google Drive não concluída, tente desativar e ativar o Google Drive novamente" msgstr "Configuração do Google Drive não concluída, tente desativar e ativar o Google Drive novamente"
@@ -1432,21 +1448,6 @@ msgstr "Ops! Ocorreu um erro ao enviar este livro: %(res)s"
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "Ops! Atualize seu perfil com um e-mail de eReader válido." msgstr "Ops! Atualize seu perfil com um e-mail de eReader válido."
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr "Aguarde um minuto para registrar o próximo usuário"
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "Registe-se"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr "Erro de conexão com o backend do limitador; entre em contato com o administrador"
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." 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!" msgstr "O servidor de E-Mail não está configurado, por favor contacte o seu administrador!"
@@ -1463,10 +1464,6 @@ msgstr "O e-mail de confirmação foi enviado para a sua conta de e-mail."
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "Não foi possível ativar a autenticação LDAP" msgstr "Não foi possível ativar a autenticação LDAP"
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr "Aguarde um minuto antes do próximo login"
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-Web\n" "Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2020-04-29 01:20+0400\n" "PO-Revision-Date: 2020-04-29 01:20+0400\n"
"Last-Translator: ZIZA\n" "Last-Translator: ZIZA\n"
"Language: ru\n" "Language: ru\n"
@@ -685,6 +685,22 @@ msgstr "Не удалось сохранить файл %(file)s."
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "Формат файла %(ext)s добавлен в %(book)s" msgstr "Формат файла %(ext)s добавлен в %(book)s"
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr ""
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "Зарегистрироваться"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr ""
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "Настройка Google Drive не завершена, попробуйте деактивировать и снова активировать Google Drive" msgstr "Настройка Google Drive не завершена, попробуйте деактивировать и снова активировать Google Drive"
@@ -1436,21 +1452,6 @@ msgstr "При отправке этой книги произошла ошиб
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "" msgstr ""
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr ""
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "Зарегистрироваться"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr ""
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." msgid "Oops! Email server is not configured, please contact your administrator."
msgstr "Сервер электронной почты не настроен, обратитесь к администратору !" msgstr "Сервер электронной почты не настроен, обратитесь к администратору !"
@@ -1467,10 +1468,6 @@ msgstr "Письмо с подтверждением отправлено вам
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "" msgstr ""
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr ""
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-Web\n" "Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2023-11-01 06:12+0100\n" "PO-Revision-Date: 2023-11-01 06:12+0100\n"
"Last-Translator: Branislav Hanáček <brango@brango.sk>\n" "Last-Translator: Branislav Hanáček <brango@brango.sk>\n"
"Language: sk_SK\n" "Language: sk_SK\n"
@@ -684,6 +684,22 @@ msgstr "Zlyhalo uloženie súboru: %(file)s."
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "Súborový formát %(ext)s bol pridaný k %(book)s" msgstr "Súborový formát %(ext)s bol pridaný k %(book)s"
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr "Počkajte, prosím minútku pred registráciou ďalšieho používateľa"
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "Registrovať"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr "Počkajte, prosím minútku pred opätovným prihlásením"
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "Nastavenie Google Drive nie je dokončené, skúste deaktivovať a znovu aktivovať Google Drive" msgstr "Nastavenie Google Drive nie je dokončené, skúste deaktivovať a znovu aktivovať Google Drive"
@@ -1435,21 +1451,6 @@ msgstr "Vyskytla sa chyba pri posielaní knihy: %(res)s"
msgid "Oops! Please update your profile with a valid eReader Email." 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." msgstr "Nastavte vo vašom profile platnú e-mailovú adresu pre vašu čítačku."
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr "Počkajte, prosím minútku pred registráciou ďalšieho používateľa"
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "Registrovať"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr ""
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." msgid "Oops! Email server is not configured, please contact your administrator."
msgstr "Poštový server nie je nastavený, kontaktujte prosím správcu." msgstr "Poštový server nie je nastavený, kontaktujte prosím správcu."
@@ -1466,10 +1467,6 @@ msgstr "Úspech! Potvrdzujúci e-mail bol odoslaný."
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "Nie je možné aktivovať LDAP autentifikáciu" msgstr "Nie je možné aktivovať LDAP autentifikáciu"
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr "Počkajte, prosím minútku pred opätovným prihlásením"
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-Web\n" "Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2024-09-18 19:45+0200\n" "PO-Revision-Date: 2024-09-18 19:45+0200\n"
"Last-Translator: Andrej Kralj\n" "Last-Translator: Andrej Kralj\n"
"Language: sl\n" "Language: sl\n"
@@ -684,6 +684,22 @@ msgstr "Nisem uspel shraniti datoteke %(file)s."
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "Oblina datotek %(ext)s je dodan v %(book)s" msgstr "Oblina datotek %(ext)s je dodan v %(book)s"
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr "Počakajte eno minuto za registracijo naslednjega uporabnika"
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "Registriraj"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr "Pred naslednjo prijavo počakajte eno minuto"
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "Nastavitev Google Drive ni dokončana, poskusite deaktivirati in znova aktivirati Google Drive" msgstr "Nastavitev Google Drive ni dokončana, poskusite deaktivirati in znova aktivirati Google Drive"
@@ -1435,21 +1451,6 @@ msgstr "Ups! Pri pošiljanju knjige je prišlo do napake: %(res)s"
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "Ups! Posodobite svoj profil z veljavnim e-poštnim naslovom eReaderja." msgstr "Ups! Posodobite svoj profil z veljavnim e-poštnim naslovom eReaderja."
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr "Počakajte eno minuto za registracijo naslednjega uporabnika"
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "Registriraj"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr "Napaka pri povezavi z zalednim strežnikom limiterja, obrnite se na skrbnika"
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." msgid "Oops! Email server is not configured, please contact your administrator."
msgstr "Ups! E-poštni strežnik ni nastavljen, obrnite se na skrbnika." msgstr "Ups! E-poštni strežnik ni nastavljen, obrnite se na skrbnika."
@@ -1466,10 +1467,6 @@ msgstr "Uspeh! Potrditveno e-poštno sporočilo je bilo poslano."
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "Ni mogoče aktivirati avtentikacije LDAP" msgstr "Ni mogoče aktivirati avtentikacije LDAP"
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr "Pred naslednjo prijavo počakajte eno minuto"
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-Web\n" "Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2021-05-13 11:00+0000\n" "PO-Revision-Date: 2021-05-13 11:00+0000\n"
"Last-Translator: Jonatan Nyberg <jonatan.nyberg.karl@gmail.com>\n" "Last-Translator: Jonatan Nyberg <jonatan.nyberg.karl@gmail.com>\n"
"Language: sv\n" "Language: sv\n"
@@ -684,6 +684,22 @@ msgstr "Det gick inte att lagra filen %(file)s."
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "Filformatet %(ext)s lades till %(book)s" msgstr "Filformatet %(ext)s lades till %(book)s"
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr ""
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "Registrera"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr ""
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "Installationen av Google Drive är inte klar, försök att inaktivera och aktivera Google Drive igen" msgstr "Installationen av Google Drive är inte klar, försök att inaktivera och aktivera Google Drive igen"
@@ -1435,21 +1451,6 @@ msgstr "Det gick inte att skicka den här boken: %(res)s"
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "" msgstr ""
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr ""
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "Registrera"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr ""
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." msgid "Oops! Email server is not configured, please contact your administrator."
msgstr "E-postservern är inte konfigurerad, kontakta din administratör!" msgstr "E-postservern är inte konfigurerad, kontakta din administratör!"
@@ -1466,10 +1467,6 @@ msgstr "Bekräftelsemail skickades till ditt e-postkonto."
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "" msgstr ""
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr ""
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-Web\n" "Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2020-04-23 22:47+0300\n" "PO-Revision-Date: 2020-04-23 22:47+0300\n"
"Last-Translator: iz <iz7iz7iz@protonmail.ch>\n" "Last-Translator: iz <iz7iz7iz@protonmail.ch>\n"
"Language: tr\n" "Language: tr\n"
@@ -684,6 +684,22 @@ msgstr "%(file)s dosyası kaydedilemedi."
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "%(book)s kitabına %(ext)s dosya biçimi eklendi" msgstr "%(book)s kitabına %(ext)s dosya biçimi eklendi"
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr ""
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "Kayıt ol"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr ""
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "Google Drive kurulumu tamamlanmadı, Google Drive'ı devre dışı bırakmayı ve tekrar etkinleştirmeyi deneyin" msgstr "Google Drive kurulumu tamamlanmadı, Google Drive'ı devre dışı bırakmayı ve tekrar etkinleştirmeyi deneyin"
@@ -1435,21 +1451,6 @@ msgstr ""
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "" msgstr ""
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr ""
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "Kayıt ol"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr ""
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." msgid "Oops! Email server is not configured, please contact your administrator."
msgstr "E-Posta sunucusu ayarlanmadı, lütfen yöneticinizle iletişime geçin!" msgstr "E-Posta sunucusu ayarlanmadı, lütfen yöneticinizle iletişime geçin!"
@@ -1466,10 +1467,6 @@ msgstr "Onay e-Postası hesabınıza gönderildi."
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "" msgstr ""
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr ""
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -6,7 +6,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-web\n" "Project-Id-Version: Calibre-web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2017-04-30 00:47+0300\n" "PO-Revision-Date: 2017-04-30 00:47+0300\n"
"Last-Translator: ABIS Team <biblio.if.abis@gmail.com>\n" "Last-Translator: ABIS Team <biblio.if.abis@gmail.com>\n"
"Language: uk\n" "Language: uk\n"
@@ -696,6 +696,22 @@ msgstr ""
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "" msgstr ""
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr ""
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "Зареєструватись"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr ""
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "" msgstr ""
@@ -1461,21 +1477,6 @@ msgstr "Помилка при відправці книги: %(res)s"
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "" msgstr ""
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr ""
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "Зареєструватись"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr ""
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." msgid "Oops! Email server is not configured, please contact your administrator."
msgstr "" msgstr ""
@@ -1492,10 +1493,6 @@ msgstr ""
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "" msgstr ""
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr ""
#: cps/web.py:1417 #: cps/web.py:1417
#, fuzzy, python-format #, fuzzy, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -4,7 +4,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-web\n" "Project-Id-Version: Calibre-web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2022-09-20 21:36+0700\n" "PO-Revision-Date: 2022-09-20 21:36+0700\n"
"Last-Translator: Ha Link <halink0803@gmail.com>\n" "Last-Translator: Ha Link <halink0803@gmail.com>\n"
"Language: vi\n" "Language: vi\n"
@@ -681,6 +681,22 @@ msgstr "Lưu file thất bại %(file)s."
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "" msgstr ""
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr ""
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "Đăng ký"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr ""
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "" msgstr ""
@@ -1432,21 +1448,6 @@ msgstr ""
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "" msgstr ""
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr ""
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "Đăng ký"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr ""
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." msgid "Oops! Email server is not configured, please contact your administrator."
msgstr "" msgstr ""
@@ -1463,10 +1464,6 @@ msgstr ""
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "" msgstr ""
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr ""
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-Web\n" "Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2025-12-06 13:53+0800\n" "PO-Revision-Date: 2025-12-06 13:53+0800\n"
"Last-Translator: qx100\n" "Last-Translator: qx100\n"
"Language: zh_CN\n" "Language: zh_CN\n"
@@ -684,6 +684,22 @@ msgstr "保存文件 %(file)s 失败。"
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "已添加 %(ext)s 格式到 %(book)s" msgstr "已添加 %(ext)s 格式到 %(book)s"
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr "请等待一分钟注册下一个用户"
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "注册"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr "下次登录前请等待一分钟"
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "Google Drive 设置未完成,请尝试停用并再次激活 Google 云端硬盘" msgstr "Google Drive 设置未完成,请尝试停用并再次激活 Google 云端硬盘"
@@ -1435,21 +1451,6 @@ msgstr "糟糕!发送这本书籍的时候出现错误:%(res)s"
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "请先配置您的 Kindle 邮箱。" msgstr "请先配置您的 Kindle 邮箱。"
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr "请等待一分钟注册下一个用户"
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "注册"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr "限制器后台连接错误,请联系管理员"
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." msgid "Oops! Email server is not configured, please contact your administrator."
msgstr "邮件服务未配置,请联系网站管理员。" msgstr "邮件服务未配置,请联系网站管理员。"
@@ -1466,10 +1467,6 @@ msgstr "确认邮件已经发送到您的邮箱。"
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "无法激活 LDAP 认证" msgstr "无法激活 LDAP 认证"
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr "下次登录前请等待一分钟"
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Calibre-Web\n" "Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: 2025-09-10 03:46+0000\n" "PO-Revision-Date: 2025-09-10 03:46+0000\n"
"Last-Translator: finrodchen <me@finrod.xyz>\n" "Last-Translator: finrodchen <me@finrod.xyz>\n"
"Language: zh_TW\n" "Language: zh_TW\n"
@@ -684,6 +684,22 @@ msgstr "保存文件 %(file)s 失敗。"
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "已添加 %(ext)s 格式到 %(book)s" msgstr "已添加 %(ext)s 格式到 %(book)s"
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr "請等待一分鐘後再註冊下一位使用者"
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr "註冊"
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr "請於下一次登入前等待一分鐘"
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "Google Drive 設置未完成請嘗試停用並再次激活Google雲端硬碟" msgstr "Google Drive 設置未完成請嘗試停用並再次激活Google雲端硬碟"
@@ -1435,21 +1451,6 @@ msgstr "糟糕!發送這本書籍的時候出現錯誤:%(res)s"
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "" msgstr ""
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr "請等待一分鐘後再註冊下一位使用者"
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr "註冊"
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr ""
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." msgid "Oops! Email server is not configured, please contact your administrator."
msgstr "郵件服務未配置,請聯繫網站管理員!" msgstr "郵件服務未配置,請聯繫網站管理員!"
@@ -1466,10 +1467,6 @@ msgstr "確認郵件已經發送到您的郵箱。"
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "" msgstr ""
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr "請於下一次登入前等待一分鐘"
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -43,14 +43,14 @@ def verify_password(username, password):
if config.config_login_type == constants.LOGIN_LDAP and services.ldap: if config.config_login_type == constants.LOGIN_LDAP and services.ldap:
login_result, error = services.ldap.bind_user(user.name, password) login_result, error = services.ldap.bind_user(user.name, password)
if login_result: if login_result:
[limiter.limiter.storage.clear(k.key) for k in limiter.current_limits] [limiter.limiter.clear(limit.limit, *limit.request_args) for limit in limiter.current_limits]
return user return user
if error is not None: if error is not None:
log.error(error) log.error(error)
else: else:
limiter.check() # limiter.check()
if check_password_hash(str(user.password), password): if check_password_hash(str(user.password), password):
[limiter.limiter.storage.clear(k.key) for k in limiter.current_limits] [limiter.limiter.clear(limit.limit, *limit.request_args) for limit in limiter.current_limits]
return user return user
ip_address = request.headers.get('X-Forwarded-For', request.remote_addr) ip_address = request.headers.get('X-Forwarded-For', request.remote_addr)
log.warning('OPDS Login failed for user "%s" IP-address: %s', username, ip_address) log.warning('OPDS Login failed for user "%s" IP-address: %s', username, ip_address)
@@ -120,7 +120,7 @@ def load_user_from_reverse_proxy_header(req):
if rp_header_username: if rp_header_username:
user = ub.session.query(ub.User).filter(func.lower(ub.User.name) == rp_header_username.lower()).first() user = ub.session.query(ub.User).filter(func.lower(ub.User.name) == rp_header_username.lower()).first()
if user: if user:
[limiter.limiter.storage.clear(k.key) for k in limiter.current_limits] [limiter.limiter.clear(limit.limit, *limit.request_args) for limit in limiter.current_limits]
return user return user
return None return None

View File

@@ -30,7 +30,6 @@ from flask import session as flask_session
from flask_babel import gettext as _ from flask_babel import gettext as _
from flask_babel import get_locale from flask_babel import get_locale
from .cw_login import login_user, logout_user, current_user from .cw_login import login_user, logout_user, current_user
from flask_limiter import RateLimitExceeded
from flask_limiter.util import get_remote_address from flask_limiter.util import get_remote_address
from sqlalchemy.exc import IntegrityError, InvalidRequestError, OperationalError from sqlalchemy.exc import IntegrityError, InvalidRequestError, OperationalError
from sqlalchemy.sql.expression import text, func, false, not_, and_, or_ from sqlalchemy.sql.expression import text, func, false, not_, and_, or_
@@ -39,7 +38,7 @@ from sqlalchemy.sql.functions import coalesce
from werkzeug.datastructures import Headers from werkzeug.datastructures import Headers
from werkzeug.security import generate_password_hash, check_password_hash from werkzeug.security import generate_password_hash, check_password_hash
from . import constants, logger, isoLanguages, services from . import constants, logger, isoLanguages, services, limiter
from . import db, ub, config, app from . import db, ub, config, app
from . import calibre_db, kobo_sync_status from . import calibre_db, kobo_sync_status
from .search import render_search_results, render_adv_search_results from .search import render_search_results, render_adv_search_results
@@ -55,7 +54,6 @@ from .usermanagement import login_required_if_no_ano
from .kobo_sync_status import remove_synced_book from .kobo_sync_status import remove_synced_book
from .render_template import render_title_template from .render_template import render_title_template
from .kobo_sync_status import change_archived_books from .kobo_sync_status import change_archived_books
from . import limiter
from .services.worker import WorkerThread from .services.worker import WorkerThread
from .tasks_status import render_task_status from .tasks_status import render_task_status
from .usermanagement import user_login_required from .usermanagement import user_login_required
@@ -1285,15 +1283,6 @@ def register_post():
if not config.config_public_reg: if not config.config_public_reg:
abort(404) abort(404)
to_save = request.form.to_dict() to_save = request.form.to_dict()
try:
limiter.check()
except RateLimitExceeded:
flash(_(u"Please wait one minute to register next user"), category="error")
return render_title_template('register.html', config=config, title=_("Register"), page="register")
except (ConnectionError, Exception) as e:
log.error("Connection error to limiter backend: %s", e)
flash(_("Connection error to limiter backend, please contact your administrator"), category="error")
return render_title_template('register.html', config=config, title=_("Register"), page="register")
if current_user is not None and current_user.is_authenticated: if current_user is not None and current_user.is_authenticated:
return redirect(url_for('web.index')) return redirect(url_for('web.index'))
if not config.get_mail_server_configured(): if not config.get_mail_server_configured():
@@ -1358,7 +1347,7 @@ def register():
def handle_login_user(user, remember, message, category): def handle_login_user(user, remember, message, category):
login_user(user, remember=remember) login_user(user, remember=remember)
flash(message, category=category) flash(message, category=category)
[limiter.limiter.storage.clear(k.key) for k in limiter.current_limits] [limiter.limiter.clear(limit.limit, *limit.request_args) for limit in limiter.current_limits]
return redirect(get_redirect_location(request.form.get('next', None), "web.index")) return redirect(get_redirect_location(request.form.get('next', None), "web.index"))
@@ -1392,15 +1381,6 @@ def login():
def login_post(): def login_post():
form = request.form.to_dict() form = request.form.to_dict()
username = strip_whitespaces(form.get('username', "")).lower().replace("\n","").replace("\r","") username = strip_whitespaces(form.get('username', "")).lower().replace("\n","").replace("\r","")
try:
limiter.check()
except RateLimitExceeded:
flash(_("Please wait one minute before next login"), category="error")
return render_login(username, form.get("password", ""))
except (ConnectionError, Exception) as e:
log.error("Connection error to limiter backend: %s", e)
flash(_("Connection error to limiter backend, please contact your administrator"), category="error")
return render_login(username, form.get("password", ""))
if current_user is not None and current_user.is_authenticated: if current_user is not None and current_user.is_authenticated:
return redirect(url_for('web.index')) return redirect(url_for('web.index'))
if config.config_login_type == constants.LOGIN_LDAP and not services.ldap: if config.config_login_type == constants.LOGIN_LDAP and not services.ldap:

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2026-02-13 19:17+0100\n" "POT-Creation-Date: 2026-02-14 11:23+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -683,6 +683,22 @@ msgstr ""
msgid "File format %(ext)s added to %(book)s" msgid "File format %(ext)s added to %(book)s"
msgstr "" msgstr ""
#: cps/error_handler.py:98
msgid "Please wait one minute to register next user"
msgstr ""
#: cps/error_handler.py:99 cps/templates/layout.html:69
#: cps/templates/layout.html:104 cps/templates/login.html:27
#: cps/templates/register.html:17 cps/web.py:1301 cps/web.py:1305
#: cps/web.py:1311 cps/web.py:1335 cps/web.py:1339 cps/web.py:1352
#: cps/web.py:1355
msgid "Register"
msgstr ""
#: cps/error_handler.py:103
msgid "Please wait one minute before next login"
msgstr ""
#: cps/gdrive.py:58 #: cps/gdrive.py:58
msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again" msgid "Google Drive setup not completed, try to deactivate and activate Google Drive again"
msgstr "" msgstr ""
@@ -1434,21 +1450,6 @@ msgstr ""
msgid "Oops! Please update your profile with a valid eReader Email." msgid "Oops! Please update your profile with a valid eReader Email."
msgstr "" msgstr ""
#: cps/web.py:1291
msgid "Please wait one minute to register next user"
msgstr ""
#: 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:1301 cps/web.py:1305 cps/web.py:1311
#: cps/web.py:1335 cps/web.py:1339 cps/web.py:1352 cps/web.py:1355
msgid "Register"
msgstr ""
#: cps/web.py:1295 cps/web.py:1402
msgid "Connection error to limiter backend, please contact your administrator"
msgstr ""
#: cps/web.py:1300 cps/web.py:1351 #: cps/web.py:1300 cps/web.py:1351
msgid "Oops! Email server is not configured, please contact your administrator." msgid "Oops! Email server is not configured, please contact your administrator."
msgstr "" msgstr ""
@@ -1465,10 +1466,6 @@ msgstr ""
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "" msgstr ""
#: cps/web.py:1398
msgid "Please wait one minute before next login"
msgstr ""
#: cps/web.py:1417 #: cps/web.py:1417
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"

View File

@@ -32,27 +32,27 @@ dependencies = [
"Flask-Principal>=0.3.2,<0.5.1", "Flask-Principal>=0.3.2,<0.5.1",
"Flask>=1.0.2,<3.2.0", "Flask>=1.0.2,<3.2.0",
"iso-639>=0.4.5,<0.5.0;python_version<'3.12'", "iso-639>=0.4.5,<0.5.0;python_version<'3.12'",
"pycountry>=20.0.0,<25.0.0;python_version>='3.12'", "pycountry>=20.0.0,<27.0.0;python_version>='3.12'",
"PyPDF>=6.1.3,<6.5.0", "PyPDF>=6.1.3,<6.8.0",
"pytz>=2016.10", "pytz>=2016.10",
"requests>=2.32.0,<2.33.0", "requests>=2.32.0,<2.33.0",
"SQLAlchemy>=1.3.0,<2.1.0", "SQLAlchemy>=1.3.0,<2.1.0",
"tornado>=6.4.2,<6.6", "tornado>=6.4.2,<6.6",
"Wand>=0.4.4,<0.7.0", "Wand>=0.4.4,<0.7.0",
"unidecode>=0.04.19,<1.4.0", "unidecode>=0.04.19,<1.5.0",
"lxml>=4.9.1,<5.4.0", "lxml>=4.9.1,<5.4.0",
"flask-wtf>=0.14.2,<1.3.0", "flask-wtf>=0.14.2,<1.3.0",
"chardet>=3.0.0,<5.3.0", "chardet>=3.0.0,<5.3.0",
"netifaces-plus>=0.12.0,<0.13.0", "netifaces-plus>=0.12.0,<0.13.0",
"urllib3>=1.22,<3.0", "urllib3>=1.22,<3.0",
"Flask-Limiter>=2.3.0,<3.13.0", "Flask-Limiter>=2.3.0,<4.2.0",
"regex>=2022.3.2,<2025.3.20", "regex>=2022.3.2,<2026.1.16",
"bleach>=6.0.0,<6.3.0", "bleach>=6.0.0,<6.4.0",
"python-magic>=0.4.27,<0.5.0", "python-magic>=0.4.27,<0.5.0",
"python-magic-bin>=0.4.0,<0.5.0;sys_platform=='win32'", "python-magic-bin>=0.4.0,<0.5.0;sys_platform=='win32'",
"flask-httpAuth>=4.4.0,<5.0.0", "flask-httpAuth>=4.4.0,<5.0.0",
"cryptography>=39.0.0,<45.0.0", "cryptography>=39.0.0,<47.0.0",
"certifi>=2024.7.4,<2025.8.24", "certifi>=2024.7.4,<2026.1.5",
] ]
dynamic = ["version"] dynamic = ["version"]
@@ -70,9 +70,9 @@ content-type = "text/markdown"
[project.optional-dependencies] [project.optional-dependencies]
gdrive = [ gdrive = [
"google-api-python-client>=2.73.00,<2.200.0", "google-api-python-client>=2.73.00,<2.200.0",
"gevent>20.6.0,<24.12.0", "gevent>20.6.0,<25.9.2",
"greenlet>=0.4.17,<3.3.0", "greenlet>=0.4.17,<3.4.0",
"httplib2>=0.9.2,<0.23.0", "httplib2>=0.9.2,<0.32.0",
"oauth2client>=4.0.0,<4.1.4", "oauth2client>=4.0.0,<4.1.4",
"uritemplate>=3.0.0,<4.3.0", "uritemplate>=3.0.0,<4.3.0",
"pyasn1-modules>=0.0.8,<0.7.0", "pyasn1-modules>=0.0.8,<0.7.0",
@@ -91,19 +91,19 @@ goodreads = [
] ]
ldap = [ ldap = [
"python-ldap>=3.0.0,<3.5.0", "python-ldap>=3.0.0,<3.5.0",
"Flask-SimpleLDAP>=1.4.0,<2.1.0", "Flask-SimpleLDAP>=1.4.0,<2.2.0",
] ]
oauth = [ oauth = [
"Flask-Dance>=2.0.0,<7.2.0", "Flask-Dance>=2.0.0,<7.2.0",
"SQLAlchemy-Utils>=0.33.5,<0.42.0", "SQLAlchemy-Utils>=0.33.5,<0.43.0",
] ]
metadata = [ metadata = [
"rarfile>=3.2,<5.0", "rarfile>=3.2,<5.0",
"scholarly>=1.2.0,<1.8", "scholarly>=1.2.0,<1.8",
"markdown2>=2.0.0,<2.6.0", "markdown2>=2.0.0,<2.6.0",
"html2text>=2020.1.16,<2025.2.26", "html2text>=2020.1.16,<2025.4.16",
"python-dateutil>=2.1,<2.10.0", "python-dateutil>=2.1,<2.10.0",
"beautifulsoup4>=4.0.1,<4.14.0", "beautifulsoup4>=4.0.1,<4.15.0",
"faust-cchardet>=2.1.18,<2.1.20", "faust-cchardet>=2.1.18,<2.1.20",
"py7zr>=0.15.0,<0.21.0", "py7zr>=0.15.0,<0.21.0",
"mutagen>=1.40.0,<1.50.0", "mutagen>=1.40.0,<1.50.0",

View File

@@ -4,8 +4,8 @@ Flask-Babel>=3.0.0,<4.1.0
Flask-Principal>=0.3.2,<0.5.1 Flask-Principal>=0.3.2,<0.5.1
Flask>=1.0.2,<3.2.0 Flask>=1.0.2,<3.2.0
iso-639>=0.4.5,<0.5.0;python_version<'3.12' iso-639>=0.4.5,<0.5.0;python_version<'3.12'
pycountry>=20.0.0,<25.0.0;python_version>='3.12' pycountry>=20.0.0,<27.0.0;python_version>='3.12'
PyPDF>=6.1.3,<6.7.0 PyPDF>=6.1.3,<6.8.0
pytz>=2016.10 pytz>=2016.10
requests>=2.32.0,<2.33.0 requests>=2.32.0,<2.33.0
SQLAlchemy>=1.3.0,<2.1.0 SQLAlchemy>=1.3.0,<2.1.0
@@ -17,7 +17,7 @@ flask-wtf>=0.14.2,<1.3.0
chardet>=3.0.0,<5.3.0 chardet>=3.0.0,<5.3.0
netifaces-plus>=0.12.0,<0.13.0 netifaces-plus>=0.12.0,<0.13.0
urllib3>=1.22,<3.0 urllib3>=1.22,<3.0
Flask-Limiter>=2.3.0,<3.1.3 Flask-Limiter>=2.3.0,<4.2.0
regex>=2022.3.2,<2026.1.16 regex>=2022.3.2,<2026.1.16
bleach>=6.0.0,<6.4.0 bleach>=6.0.0,<6.4.0
python-magic>=0.4.27,<0.5.0 python-magic>=0.4.27,<0.5.0

View File

@@ -37,20 +37,20 @@
<div class="row"> <div class="row">
<div class="col-xs-6 col-md-6 col-sm-offset-3" style="margin-top:50px;"> <div class="col-xs-6 col-md-6 col-sm-offset-3" style="margin-top:50px;">
<p class='text-justify attribute'><strong>Start Time: </strong>2026-01-24 20:50:12</p> <p class='text-justify attribute'><strong>Start Time: </strong>2026-02-18 19:25:49</p>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-xs-6 col-md-6 col-sm-offset-3"> <div class="col-xs-6 col-md-6 col-sm-offset-3">
<p class='text-justify attribute'><strong>Stop Time: </strong>2026-01-25 04:15:44</p> <p class='text-justify attribute'><strong>Stop Time: </strong>2026-02-19 02:59:10</p>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-xs-6 col-md-6 col-sm-offset-3"> <div class="col-xs-6 col-md-6 col-sm-offset-3">
<p class='text-justify attribute'><strong>Duration: </strong>6h 13 min</p> <p class='text-justify attribute'><strong>Duration: </strong>6h 16 min</p>
</div> </div>
</div> </div>
</div> </div>
@@ -2039,13 +2039,13 @@
<tr id="su" class="errorClass"> <tr id="su" class="failClass">
<td>TestLoadMetadata</td> <td>TestLoadMetadata</td>
<td class="text-center">1</td> <td class="text-center">1</td>
<td class="text-center">0</td> <td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">1</td> <td class="text-center">1</td>
<td class="text-center">0</td> <td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center"> <td class="text-center">
<a onclick="showClassDetail('c18', 1)">Detail</a> <a onclick="showClassDetail('c18', 1)">Detail</a>
</td> </td>
@@ -2053,27 +2053,26 @@
<tr id="et18.1" class="none bg-info"> <tr id="ft18.1" class="none bg-danger">
<td> <td>
<div class='testcase'>TestLoadMetadata - test_load_metadata</div> <div class='testcase'>TestLoadMetadata - test_load_metadata</div>
</td> </td>
<td colspan='6'> <td colspan='6'>
<div class="text-center"> <div class="text-center">
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_et18.1')">ERROR</a> <a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_ft18.1')">FAIL</a>
</div> </div>
<!--css div popup start--> <!--css div popup start-->
<div id="div_et18.1" class="popup_window test_output" style="display:block;"> <div id="div_ft18.1" class="popup_window test_output" style="display:block;">
<div class='close_button pull-right'> <div class='close_button pull-right'>
<button type="button" class="close" aria-label="Close" onfocus="this.blur();" <button type="button" class="close" aria-label="Close" onfocus="this.blur();"
onclick="document.getElementById('div_et18.1').style.display='none'"><span onclick="document.getElementById('div_ft18.1').style.display='none'"><span
aria-hidden="true">&times;</span></button> aria-hidden="true">&times;</span></button>
</div> </div>
<div class="text-left pull-left"> <div class="text-left pull-left">
<pre class="text-left">Traceback (most recent call last): <pre class="text-left">Traceback (most recent call last):
File &#34;/home/ozzie/Development/calibre-web-test/test/test_edit_books_metadata.py&#34;, line 87, in test_load_metadata File &#34;/home/ozzie/Development/calibre-web-test/test/test_edit_books_metadata.py&#34;, line 220, in test_load_metadata
if results[cont][&#39;source&#39;] == &#39;https://comicvine.gamespot.com/&#39;: self.assertLessEqual(diff(BytesIO(cover), BytesIO(new_cover), delete_diff_file=True), 0.025)
~~~~~~~^^^^^^ AssertionError: 0.04218017335689641 not less than or equal to 0.025</pre>
IndexError: list index out of range</pre>
</div> </div>
<div class="clearfix"></div> <div class="clearfix"></div>
</div> </div>
@@ -4684,11 +4683,11 @@ AssertionError: 30 != 20</pre>
<tr id="su" class="failClass"> <tr id="su" class="skipClass">
<td>TestThumbnails</td> <td>TestThumbnails</td>
<td class="text-center">8</td> <td class="text-center">8</td>
<td class="text-center">6</td> <td class="text-center">7</td>
<td class="text-center">1</td> <td class="text-center">0</td>
<td class="text-center">0</td> <td class="text-center">0</td>
<td class="text-center">1</td> <td class="text-center">1</td>
<td class="text-center"> <td class="text-center">
@@ -4761,31 +4760,11 @@ AssertionError: 30 != 20</pre>
<tr id="ft52.8" class="none bg-danger"> <tr id='pt52.8' class='hiddenRow bg-success'>
<td> <td>
<div class='testcase'>TestThumbnails - test_sideloaded_book</div> <div class='testcase'>TestThumbnails - test_sideloaded_book</div>
</td> </td>
<td colspan='6'> <td colspan='6' align='center'>PASS</td>
<div class="text-center">
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_ft52.8')">FAIL</a>
</div>
<!--css div popup start-->
<div id="div_ft52.8" class="popup_window test_output" style="display:block;">
<div class='close_button pull-right'>
<button type="button" class="close" aria-label="Close" onfocus="this.blur();"
onclick="document.getElementById('div_ft52.8').style.display='none'"><span
aria-hidden="true">&times;</span></button>
</div>
<div class="text-left pull-left">
<pre class="text-left">Traceback (most recent call last):
File &#34;/home/ozzie/Development/calibre-web-test/test/test_thumbnails.py&#34;, line 317, in test_sideloaded_book
self.assertAlmostEqual(diff(BytesIO(list_cover), BytesIO(old_list_cover), delete_diff_file=True), 0.0,
AssertionError: 0.01731210309182775 != 0.0 within 0.0001 delta (0.01731210309182775 difference)</pre>
</div>
<div class="clearfix"></div>
</div>
<!--css div popup end-->
</td>
</tr> </tr>
@@ -5992,9 +5971,9 @@ AssertionError: 0.01731210309182775 != 0.0 within 0.0001 delta (0.01731210309182
<tr id='total_row' class="text-center bg-grey"> <tr id='total_row' class="text-center bg-grey">
<td>Total</td> <td>Total</td>
<td>538</td> <td>538</td>
<td>528</td> <td>529</td>
<td>2</td> <td>2</td>
<td>1</td> <td>0</td>
<td>7</td> <td>7</td>
<td>&nbsp;</td> <td>&nbsp;</td>
</tr> </tr>
@@ -6023,7 +6002,7 @@ AssertionError: 0.01731210309182775 != 0.0 within 0.0001 delta (0.01731210309182
<tr> <tr>
<th>Platform</th> <th>Platform</th>
<td>Linux 6.8.0-90-generic #91-Ubuntu SMP PREEMPT_DYNAMIC Tue Nov 18 14:14:30 UTC 2025 x86_64 x86_64</td> <td>Linux 6.8.0-100-generic #100-Ubuntu SMP PREEMPT_DYNAMIC Tue Jan 13 16:40:06 UTC 2026 x86_64 x86_64</td>
<td>Basic</td> <td>Basic</td>
</tr> </tr>
@@ -6041,19 +6020,19 @@ AssertionError: 0.01731210309182775 != 0.0 within 0.0001 delta (0.01731210309182
<tr> <tr>
<th>babel</th> <th>babel</th>
<td>2.17.0</td> <td>2.18.0</td>
<td>Basic</td> <td>Basic</td>
</tr> </tr>
<tr> <tr>
<th>bleach</th> <th>bleach</th>
<td>6.2.0</td> <td>6.3.0</td>
<td>Basic</td> <td>Basic</td>
</tr> </tr>
<tr> <tr>
<th>certifi</th> <th>certifi</th>
<td>2025.8.3</td> <td>2026.1.4</td>
<td>Basic</td> <td>Basic</td>
</tr> </tr>
@@ -6065,7 +6044,7 @@ AssertionError: 0.01731210309182775 != 0.0 within 0.0001 delta (0.01731210309182
<tr> <tr>
<th>cryptography</th> <th>cryptography</th>
<td>44.0.3</td> <td>46.0.5</td>
<td>Basic</td> <td>Basic</td>
</tr> </tr>
@@ -6089,7 +6068,7 @@ AssertionError: 0.01731210309182775 != 0.0 within 0.0001 delta (0.01731210309182
<tr> <tr>
<th>Flask-Limiter</th> <th>Flask-Limiter</th>
<td>3.12</td> <td>4.1.1</td>
<td>Basic</td> <td>Basic</td>
</tr> </tr>
@@ -6131,13 +6110,13 @@ AssertionError: 0.01731210309182775 != 0.0 within 0.0001 delta (0.01731210309182
<tr> <tr>
<th>pycountry</th> <th>pycountry</th>
<td>24.6.1</td> <td>26.2.16</td>
<td>Basic</td> <td>Basic</td>
</tr> </tr>
<tr> <tr>
<th>pypdf</th> <th>pypdf</th>
<td>6.4.2</td> <td>6.7.1</td>
<td>Basic</td> <td>Basic</td>
</tr> </tr>
@@ -6155,7 +6134,7 @@ AssertionError: 0.01731210309182775 != 0.0 within 0.0001 delta (0.01731210309182
<tr> <tr>
<th>regex</th> <th>regex</th>
<td>2024.11.6</td> <td>2026.1.15</td>
<td>Basic</td> <td>Basic</td>
</tr> </tr>
@@ -6179,7 +6158,7 @@ AssertionError: 0.01731210309182775 != 0.0 within 0.0001 delta (0.01731210309182
<tr> <tr>
<th>Unidecode</th> <th>Unidecode</th>
<td>1.3.8</td> <td>1.4.0</td>
<td>Basic</td> <td>Basic</td>
</tr> </tr>
@@ -6203,7 +6182,7 @@ AssertionError: 0.01731210309182775 != 0.0 within 0.0001 delta (0.01731210309182
<tr> <tr>
<th>google-api-python-client</th> <th>google-api-python-client</th>
<td>2.188.0</td> <td>2.190.0</td>
<td>TestBackupMetadataGdrive</td> <td>TestBackupMetadataGdrive</td>
</tr> </tr>
@@ -6233,7 +6212,7 @@ AssertionError: 0.01731210309182775 != 0.0 within 0.0001 delta (0.01731210309182
<tr> <tr>
<th>google-api-python-client</th> <th>google-api-python-client</th>
<td>2.188.0</td> <td>2.190.0</td>
<td>TestCliGdrivedb</td> <td>TestCliGdrivedb</td>
</tr> </tr>
@@ -6263,7 +6242,7 @@ AssertionError: 0.01731210309182775 != 0.0 within 0.0001 delta (0.01731210309182
<tr> <tr>
<th>google-api-python-client</th> <th>google-api-python-client</th>
<td>2.188.0</td> <td>2.190.0</td>
<td>TestEbookConvertCalibreGDrive</td> <td>TestEbookConvertCalibreGDrive</td>
</tr> </tr>
@@ -6293,7 +6272,7 @@ AssertionError: 0.01731210309182775 != 0.0 within 0.0001 delta (0.01731210309182
<tr> <tr>
<th>google-api-python-client</th> <th>google-api-python-client</th>
<td>2.188.0</td> <td>2.190.0</td>
<td>TestEbookConvertGDriveKepubify</td> <td>TestEbookConvertGDriveKepubify</td>
</tr> </tr>
@@ -6335,7 +6314,7 @@ AssertionError: 0.01731210309182775 != 0.0 within 0.0001 delta (0.01731210309182
<tr> <tr>
<th>google-api-python-client</th> <th>google-api-python-client</th>
<td>2.188.0</td> <td>2.190.0</td>
<td>TestEditAuthorsGdrive</td> <td>TestEditAuthorsGdrive</td>
</tr> </tr>
@@ -6371,7 +6350,7 @@ AssertionError: 0.01731210309182775 != 0.0 within 0.0001 delta (0.01731210309182
<tr> <tr>
<th>google-api-python-client</th> <th>google-api-python-client</th>
<td>2.188.0</td> <td>2.190.0</td>
<td>TestEditBooksOnGdrive</td> <td>TestEditBooksOnGdrive</td>
</tr> </tr>
@@ -6413,7 +6392,7 @@ AssertionError: 0.01731210309182775 != 0.0 within 0.0001 delta (0.01731210309182
<tr> <tr>
<th>google-api-python-client</th> <th>google-api-python-client</th>
<td>2.188.0</td> <td>2.190.0</td>
<td>TestEmbedMetadataGdrive</td> <td>TestEmbedMetadataGdrive</td>
</tr> </tr>
@@ -6443,7 +6422,7 @@ AssertionError: 0.01731210309182775 != 0.0 within 0.0001 delta (0.01731210309182
<tr> <tr>
<th>google-api-python-client</th> <th>google-api-python-client</th>
<td>2.188.0</td> <td>2.190.0</td>
<td>TestSetupGdrive</td> <td>TestSetupGdrive</td>
</tr> </tr>
@@ -6496,8 +6475,8 @@ AssertionError: 0.01731210309182775 != 0.0 within 0.0001 delta (0.01731210309182
</tr> </tr>
<tr> <tr>
<th>Flask-SimpleLDAP</th> <th>flask-simpleldap</th>
<td>2.0.0</td> <td>2.1.0</td>
<td>TestLdapLogin</td> <td>TestLdapLogin</td>
</tr> </tr>
@@ -6545,7 +6524,7 @@ AssertionError: 0.01731210309182775 != 0.0 within 0.0001 delta (0.01731210309182
</div> </div>
<script> <script>
drawCircle(528, 2, 1, 7); drawCircle(529, 2, 0, 7);
showCase(5); showCase(5);
</script> </script>