Merge remote-tracking branch 'original/Develop' into kobo_book_delete

pull/1164/head
Michael Shavit 5 years ago
commit 9804a98af8

@ -30,7 +30,7 @@ Calibre-Web is a web app providing a clean interface for browsing, reading and d
## Quick start ## Quick start
1. Install dependencies by running `pip install --target vendor -r requirements.txt`. 1. Install dependencies by running `pip3 install --target vendor -r requirements.txt`.
2. Execute the command: `python cps.py` (or `nohup python cps.py` - recommended if you want to exit the terminal window) 2. Execute the command: `python cps.py` (or `nohup python cps.py` - recommended if you want to exit the terminal window)
3. Point your browser to `http://localhost:8083` or `http://localhost:8083/opds` for the OPDS catalog 3. Point your browser to `http://localhost:8083` or `http://localhost:8083/opds` for the OPDS catalog
4. Set `Location of Calibre database` to the path of the folder where your Calibre library (metadata.db) lives, push "submit" button\ 4. Set `Location of Calibre database` to the path of the folder where your Calibre library (metadata.db) lives, push "submit" button\
@ -46,7 +46,7 @@ Please note that running the above install command can fail on some versions of
## Requirements ## Requirements
Python 2.7+, python 3.x+ python 3.x+, (Python 2.7+)
Optionally, to enable on-the-fly conversion from one ebook format to another when using the send-to-kindle feature, or during editing of ebooks metadata: Optionally, to enable on-the-fly conversion from one ebook format to another when using the send-to-kindle feature, or during editing of ebooks metadata:

@ -532,6 +532,9 @@ def _configuration_update_helper():
_config_checkbox_int("config_uploading") _config_checkbox_int("config_uploading")
_config_checkbox_int("config_anonbrowse") _config_checkbox_int("config_anonbrowse")
_config_checkbox_int("config_public_reg") _config_checkbox_int("config_public_reg")
_config_checkbox_int("config_kobo_sync")
_config_checkbox_int("config_kobo_proxy")
_config_int("config_ebookconverter") _config_int("config_ebookconverter")
_config_string("config_calibre") _config_string("config_calibre")

@ -68,6 +68,7 @@ class _Settings(_Base):
config_anonbrowse = Column(SmallInteger, default=0) config_anonbrowse = Column(SmallInteger, default=0)
config_public_reg = Column(SmallInteger, default=0) config_public_reg = Column(SmallInteger, default=0)
config_remote_login = Column(Boolean, default=False) config_remote_login = Column(Boolean, default=False)
config_kobo_sync = Column(Boolean, default=False)
config_default_role = Column(SmallInteger, default=0) config_default_role = Column(SmallInteger, default=0)
config_default_show = Column(SmallInteger, default=38911) config_default_show = Column(SmallInteger, default=38911)
@ -89,7 +90,8 @@ class _Settings(_Base):
config_login_type = Column(Integer, default=0) config_login_type = Column(Integer, default=0)
# config_oauth_provider = Column(Integer) config_kobo_proxy = Column(Boolean, default=False)
config_ldap_provider_url = Column(String, default='localhost') config_ldap_provider_url = Column(String, default='localhost')
config_ldap_port = Column(SmallInteger, default=389) config_ldap_port = Column(SmallInteger, default=389)

@ -126,7 +126,7 @@ def selected_roles(dictionary):
BookMeta = namedtuple('BookMeta', 'file_path, extension, title, author, cover, description, tags, series, ' BookMeta = namedtuple('BookMeta', 'file_path, extension, title, author, cover, description, tags, series, '
'series_id, languages') 'series_id, languages')
STABLE_VERSION = {'version': '0.6.5 Beta'} STABLE_VERSION = {'version': '0.6.6 Beta'}
NIGHTLY_VERSION = {} NIGHTLY_VERSION = {}
NIGHTLY_VERSION[0] = '$Format:%H$' NIGHTLY_VERSION[0] = '$Format:%H$'

@ -19,7 +19,6 @@
import sys import sys
import uuid import uuid
from datetime import datetime
from time import gmtime, strftime from time import gmtime, strftime
try: try:
@ -32,9 +31,10 @@ from flask import (
request, request,
make_response, make_response,
jsonify, jsonify,
json, current_app,
url_for, url_for,
redirect, redirect,
abort
) )
from flask_login import login_required, current_user from flask_login import login_required, current_user
from werkzeug.datastructures import Headers from werkzeug.datastructures import Headers
@ -46,7 +46,7 @@ from . import config, logger, kobo_auth, db, helper, ub
from .services import SyncToken as SyncToken from .services import SyncToken as SyncToken
from .web import download_required from .web import download_required
KOBO_FORMATS = {"KEPUB": ["KEPUB"], "EPUB": ["EPUB", "EPUB3"]} KOBO_FORMATS = {"KEPUB": ["KEPUB"], "EPUB": ["EPUB3", "EPUB"]}
KOBO_STOREAPI_URL = "https://storeapi.kobo.com" KOBO_STOREAPI_URL = "https://storeapi.kobo.com"
kobo = Blueprint("kobo", __name__, url_prefix="/kobo/<auth_token>") kobo = Blueprint("kobo", __name__, url_prefix="/kobo/<auth_token>")
@ -74,9 +74,11 @@ CONNECTION_SPECIFIC_HEADERS = [
def redirect_or_proxy_request(): def redirect_or_proxy_request():
if config.config_kobo_proxy:
if request.method == "GET": if request.method == "GET":
return redirect(get_store_url_for_current_request(), 307) return redirect(get_store_url_for_current_request(), 307)
if request.method == "DELETE": if request.method == "DELETE":
log.info('Delete Book')
return make_response(jsonify({})) return make_response(jsonify({}))
else: else:
# The Kobo device turns other request types into GET requests on redirects, so we instead proxy to the Kobo store ourselves. # The Kobo device turns other request types into GET requests on redirects, so we instead proxy to the Kobo store ourselves.
@ -97,7 +99,8 @@ def redirect_or_proxy_request():
return make_response( return make_response(
store_response.content, store_response.status_code, response_headers.items() store_response.content, store_response.status_code, response_headers.items()
) )
else:
return make_response(jsonify({}))
@kobo.route("/v1/library/sync") @kobo.route("/v1/library/sync")
@login_required @login_required
@ -105,6 +108,8 @@ def redirect_or_proxy_request():
def HandleSyncRequest(): def HandleSyncRequest():
sync_token = SyncToken.SyncToken.from_headers(request.headers) sync_token = SyncToken.SyncToken.from_headers(request.headers)
log.info("Kobo library sync request received.") log.info("Kobo library sync request received.")
if not current_app.wsgi_app.is_proxied:
log.debug('Kobo: Received unproxied request, changed request port to server port')
# TODO: Limit the number of books return per sync call, and rely on the sync-continuatation header # TODO: Limit the number of books return per sync call, and rely on the sync-continuatation header
# instead so that the device triggers another sync. # instead so that the device triggers another sync.
@ -149,6 +154,7 @@ def HandleSyncRequest():
.filter(db.Data.format.in_(KOBO_FORMATS)) .filter(db.Data.format.in_(KOBO_FORMATS))
.all() .all()
) )
for book in changed_entries: for book in changed_entries:
entitlement = { entitlement = {
"BookEntitlement": create_book_entitlement(book, archived=(book.id in archived_book_ids)), "BookEntitlement": create_book_entitlement(book, archived=(book.id in archived_book_ids)),
@ -169,8 +175,12 @@ def HandleSyncRequest():
sync_token.books_last_modified = new_books_last_modified sync_token.books_last_modified = new_books_last_modified
sync_token.archive_last_modified = new_archived_last_modified sync_token.archive_last_modified = new_archived_last_modified
if config.config_kobo_proxy:
return generate_sync_response(request, sync_token, entitlements) return generate_sync_response(request, sync_token, entitlements)
return make_response(jsonify(entitlements))
# Missing feature: Detect server-side book deletions.
def generate_sync_response(request, sync_token, entitlements): def generate_sync_response(request, sync_token, entitlements):
# We first merge in sync results from the official Kobo store. # We first merge in sync results from the official Kobo store.
@ -210,6 +220,8 @@ def generate_sync_response(request, sync_token, entitlements):
@login_required @login_required
@download_required @download_required
def HandleMetadataRequest(book_uuid): def HandleMetadataRequest(book_uuid):
if not current_app.wsgi_app.is_proxied:
log.debug('Kobo: Received unproxied request, changed request port to server port')
log.info("Kobo library metadata request received for book %s" % book_uuid) log.info("Kobo library metadata request received for book %s" % book_uuid)
book = db.session.query(db.Books).filter(db.Books.uuid == book_uuid).first() book = db.session.query(db.Books).filter(db.Books.uuid == book_uuid).first()
if not book or not book.data: if not book or not book.data:
@ -221,6 +233,15 @@ def HandleMetadataRequest(book_uuid):
def get_download_url_for_book(book, book_format): def get_download_url_for_book(book, book_format):
if not current_app.wsgi_app.is_proxied:
return "{url_scheme}://{url_base}:{url_port}/download/{book_id}/{book_format}".format(
url_scheme=request.environ['wsgi.url_scheme'],
url_base=request.environ['SERVER_NAME'],
url_port=config.config_port,
book_id=book.id,
book_format=book_format.lower()
)
else:
return url_for( return url_for(
"web.download_link", "web.download_link",
book_id=book.id, book_id=book.id,
@ -278,11 +299,11 @@ def get_series(book):
def get_metadata(book): def get_metadata(book):
download_urls = [] download_urls = []
for book_data in book.data: for book_data in book.data:
if book_data.format not in KOBO_FORMATS: if book_data.format not in KOBO_FORMATS:
continue continue
for kobo_format in KOBO_FORMATS[book_data.format]: for kobo_format in KOBO_FORMATS[book_data.format]:
# log.debug('Id: %s, Format: %s' % (book.id, kobo_format))
download_urls.append( download_urls.append(
{ {
"Format": kobo_format, "Format": kobo_format,
@ -356,7 +377,10 @@ def HandleCoverImageRequest(book_uuid):
book_uuid, use_generic_cover_on_failure=False book_uuid, use_generic_cover_on_failure=False
) )
if not book_cover: if not book_cover:
if config.config_kobo_proxy:
return redirect(get_store_url_for_current_request(), 307) return redirect(get_store_url_for_current_request(), 307)
else:
abort(404)
return book_cover return book_cover
@ -397,19 +421,41 @@ def HandleBookDeletionRequest(book_uuid):
@kobo.route("/v1/library/tags/<shelf_name>", methods=["POST"]) @kobo.route("/v1/library/tags/<shelf_name>", methods=["POST"])
@kobo.route("/v1/library/tags/<tag_id>", methods=["DELETE"]) @kobo.route("/v1/library/tags/<tag_id>", methods=["DELETE"])
def HandleUnimplementedRequest(book_uuid=None, shelf_name=None, tag_id=None): def HandleUnimplementedRequest(book_uuid=None, shelf_name=None, tag_id=None):
log.debug("Alternative Request received:")
return redirect_or_proxy_request() return redirect_or_proxy_request()
# TODO: Implement the following routes
@kobo.route("/v1/user/loyalty/<dummy>", methods=["GET", "POST"])
@kobo.route("/v1/user/profile", methods=["GET", "POST"])
@kobo.route("/v1/user/wishlist", methods=["GET", "POST"])
@kobo.route("/v1/user/recommendations", methods=["GET", "POST"])
@kobo.route("/v1/analytics/<dummy>", methods=["GET", "POST"])
def HandleUserRequest(dummy=None):
log.debug("Unimplemented Request received: %s", request.base_url)
return redirect_or_proxy_request()
@kobo.app_errorhandler(404) @kobo.app_errorhandler(404)
def handle_404(err): def handle_404(err):
# This handler acts as a catch-all for endpoints that we don't have an interest in # This handler acts as a catch-all for endpoints that we don't have an interest in
# implementing (e.g: v1/analytics/gettests, v1/user/recommendations, etc) # implementing (e.g: v1/analytics/gettests, v1/user/recommendations, etc)
log.debug("Unknown Request received: %s", request.base_url)
return redirect_or_proxy_request() return redirect_or_proxy_request()
@kobo.route("/v1/initialization") @kobo.route("/v1/initialization")
@login_required @login_required
def HandleInitRequest(): def HandleInitRequest():
if not current_app.wsgi_app.is_proxied:
log.debug('Kobo: Received unproxied request, changed request port to server port')
calibre_web_url = "{url_scheme}://{url_base}:{url_port}".format(
url_scheme=request.environ['wsgi.url_scheme'],
url_base=request.environ['SERVER_NAME'],
url_port=config.config_port
)
else:
calibre_web_url = url_for("web.index", _external=True).strip("/")
if config.config_kobo_proxy:
outgoing_headers = Headers(request.headers) outgoing_headers = Headers(request.headers)
outgoing_headers.remove("Host") outgoing_headers.remove("Host")
store_response = requests.request( store_response = requests.request(
@ -422,14 +468,149 @@ def HandleInitRequest():
store_response_json = store_response.json() store_response_json = store_response.json()
if "Resources" in store_response_json: if "Resources" in store_response_json:
kobo_resources = store_response_json["Resources"] kobo_resources = store_response_json["Resources"]
# calibre_web_url = url_for("web.index", _external=True).strip("/")
calibre_web_url = url_for("web.index", _external=True).strip("/")
kobo_resources["image_host"] = calibre_web_url kobo_resources["image_host"] = calibre_web_url
kobo_resources["image_url_quality_template"] = unquote(url_for("kobo.HandleCoverImageRequest", _external=True, kobo_resources["image_url_quality_template"] = unquote(calibre_web_url + url_for("kobo.HandleCoverImageRequest",
auth_token = kobo_auth.get_auth_token(), auth_token = kobo_auth.get_auth_token(),
book_uuid="{ImageId}")) book_uuid="{ImageId}"))
kobo_resources["image_url_template"] = unquote(url_for("kobo.HandleCoverImageRequest", _external=True, kobo_resources["image_url_template"] = unquote(calibre_web_url + url_for("kobo.HandleCoverImageRequest",
auth_token = kobo_auth.get_auth_token(), auth_token = kobo_auth.get_auth_token(),
book_uuid="{ImageId}")) book_uuid="{ImageId}"))
return make_response(store_response_json, store_response.status_code) return make_response(store_response_json, store_response.status_code)
else:
resources = NATIVE_KOBO_RESOURCES(calibre_web_url)
response = make_response(jsonify({"Resources": resources}))
response.headers["x-kobo-apitoken"] = "e30="
return response
def NATIVE_KOBO_RESOURCES(calibre_web_url):
return {
"account_page": "https://secure.kobobooks.com/profile",
"account_page_rakuten": "https://my.rakuten.co.jp/",
"add_entitlement": "https://storeapi.kobo.com/v1/library/{RevisionIds}",
"affiliaterequest": "https://storeapi.kobo.com/v1/affiliate",
"audiobook_subscription_orange_deal_inclusion_url": "https://authorize.kobo.com/inclusion",
"authorproduct_recommendations": "https://storeapi.kobo.com/v1/products/books/authors/recommendations",
"autocomplete": "https://storeapi.kobo.com/v1/products/autocomplete",
"blackstone_header": {"key": "x-amz-request-payer", "value": "requester"},
"book": "https://storeapi.kobo.com/v1/products/books/{ProductId}",
"book_detail_page": "https://store.kobobooks.com/{culture}/ebook/{slug}",
"book_detail_page_rakuten": "http://books.rakuten.co.jp/rk/{crossrevisionid}",
"book_landing_page": "https://store.kobobooks.com/ebooks",
"book_subscription": "https://storeapi.kobo.com/v1/products/books/subscriptions",
"categories": "https://storeapi.kobo.com/v1/categories",
"categories_page": "https://store.kobobooks.com/ebooks/categories",
"category": "https://storeapi.kobo.com/v1/categories/{CategoryId}",
"category_featured_lists": "https://storeapi.kobo.com/v1/categories/{CategoryId}/featured",
"category_products": "https://storeapi.kobo.com/v1/categories/{CategoryId}/products",
"checkout_borrowed_book": "https://storeapi.kobo.com/v1/library/borrow",
"configuration_data": "https://storeapi.kobo.com/v1/configuration",
"content_access_book": "https://storeapi.kobo.com/v1/products/books/{ProductId}/access",
"customer_care_live_chat": "https://v2.zopim.com/widget/livechat.html?key=Y6gwUmnu4OATxN3Tli4Av9bYN319BTdO",
"daily_deal": "https://storeapi.kobo.com/v1/products/dailydeal",
"deals": "https://storeapi.kobo.com/v1/deals",
"delete_entitlement": "https://storeapi.kobo.com/v1/library/{Ids}",
"delete_tag": "https://storeapi.kobo.com/v1/library/tags/{TagId}",
"delete_tag_items": "https://storeapi.kobo.com/v1/library/tags/{TagId}/items/delete",
"device_auth": "https://storeapi.kobo.com/v1/auth/device",
"device_refresh": "https://storeapi.kobo.com/v1/auth/refresh",
"dictionary_host": "https://kbdownload1-a.akamaihd.net",
"discovery_host": "https://discovery.kobobooks.com",
"eula_page": "https://www.kobo.com/termsofuse?style=onestore",
"exchange_auth": "https://storeapi.kobo.com/v1/auth/exchange",
"external_book": "https://storeapi.kobo.com/v1/products/books/external/{Ids}",
"facebook_sso_page": "https://authorize.kobo.com/signin/provider/Facebook/login?returnUrl=http://store.kobobooks.com/",
"featured_list": "https://storeapi.kobo.com/v1/products/featured/{FeaturedListId}",
"featured_lists": "https://storeapi.kobo.com/v1/products/featured",
"free_books_page": {
"EN": "https://www.kobo.com/{region}/{language}/p/free-ebooks",
"FR": "https://www.kobo.com/{region}/{language}/p/livres-gratuits",
"IT": "https://www.kobo.com/{region}/{language}/p/libri-gratuiti",
"NL": "https://www.kobo.com/{region}/{language}/List/bekijk-het-overzicht-van-gratis-ebooks/QpkkVWnUw8sxmgjSlCbJRg",
"PT": "https://www.kobo.com/{region}/{language}/p/livros-gratis",
},
"fte_feedback": "https://storeapi.kobo.com/v1/products/ftefeedback",
"get_tests_request": "https://storeapi.kobo.com/v1/analytics/gettests",
"giftcard_epd_redeem_url": "https://www.kobo.com/{storefront}/{language}/redeem-ereader",
"giftcard_redeem_url": "https://www.kobo.com/{storefront}/{language}/redeem",
"help_page": "http://www.kobo.com/help",
"image_host": calibre_web_url,
"image_url_quality_template": unquote(calibre_web_url + url_for("kobo.HandleCoverImageRequest",
auth_token = kobo_auth.get_auth_token(),
book_uuid="{ImageId}")),
"image_url_template": unquote(calibre_web_url + url_for("kobo.HandleCoverImageRequest",
auth_token = kobo_auth.get_auth_token(),
book_uuid="{ImageId}")),
"kobo_audiobooks_enabled": "False",
"kobo_audiobooks_orange_deal_enabled": "False",
"kobo_audiobooks_subscriptions_enabled": "False",
"kobo_nativeborrow_enabled": "True",
"kobo_onestorelibrary_enabled": "False",
"kobo_redeem_enabled": "True",
"kobo_shelfie_enabled": "False",
"kobo_subscriptions_enabled": "False",
"kobo_superpoints_enabled": "False",
"kobo_wishlist_enabled": "True",
"library_book": "https://storeapi.kobo.com/v1/user/library/books/{LibraryItemId}",
"library_items": "https://storeapi.kobo.com/v1/user/library",
"library_metadata": "https://storeapi.kobo.com/v1/library/{Ids}/metadata",
"library_prices": "https://storeapi.kobo.com/v1/user/library/previews/prices",
"library_stack": "https://storeapi.kobo.com/v1/user/library/stacks/{LibraryItemId}",
"library_sync": "https://storeapi.kobo.com/v1/library/sync",
"love_dashboard_page": "https://store.kobobooks.com/{culture}/kobosuperpoints",
"love_points_redemption_page": "https://store.kobobooks.com/{culture}/KoboSuperPointsRedemption?productId={ProductId}",
"magazine_landing_page": "https://store.kobobooks.com/emagazines",
"notifications_registration_issue": "https://storeapi.kobo.com/v1/notifications/registration",
"oauth_host": "https://oauth.kobo.com",
"overdrive_account": "https://auth.overdrive.com/account",
"overdrive_library": "https://{libraryKey}.auth.overdrive.com/library",
"overdrive_library_finder_host": "https://libraryfinder.api.overdrive.com",
"overdrive_thunder_host": "https://thunder.api.overdrive.com",
"password_retrieval_page": "https://www.kobobooks.com/passwordretrieval.html",
"post_analytics_event": "https://storeapi.kobo.com/v1/analytics/event",
"privacy_page": "https://www.kobo.com/privacypolicy?style=onestore",
"product_nextread": "https://storeapi.kobo.com/v1/products/{ProductIds}/nextread",
"product_prices": "https://storeapi.kobo.com/v1/products/{ProductIds}/prices",
"product_recommendations": "https://storeapi.kobo.com/v1/products/{ProductId}/recommendations",
"product_reviews": "https://storeapi.kobo.com/v1/products/{ProductIds}/reviews",
"products": "https://storeapi.kobo.com/v1/products",
"provider_external_sign_in_page": "https://authorize.kobo.com/ExternalSignIn/{providerName}?returnUrl=http://store.kobobooks.com/",
"purchase_buy": "https://www.kobo.com/checkout/createpurchase/",
"purchase_buy_templated": "https://www.kobo.com/{culture}/checkout/createpurchase/{ProductId}",
"quickbuy_checkout": "https://storeapi.kobo.com/v1/store/quickbuy/{PurchaseId}/checkout",
"quickbuy_create": "https://storeapi.kobo.com/v1/store/quickbuy/purchase",
"rating": "https://storeapi.kobo.com/v1/products/{ProductId}/rating/{Rating}",
"reading_state": "https://storeapi.kobo.com/v1/library/{Ids}/state",
"redeem_interstitial_page": "https://store.kobobooks.com",
"registration_page": "https://authorize.kobo.com/signup?returnUrl=http://store.kobobooks.com/",
"related_items": "https://storeapi.kobo.com/v1/products/{Id}/related",
"remaining_book_series": "https://storeapi.kobo.com/v1/products/books/series/{SeriesId}",
"rename_tag": "https://storeapi.kobo.com/v1/library/tags/{TagId}",
"review": "https://storeapi.kobo.com/v1/products/reviews/{ReviewId}",
"review_sentiment": "https://storeapi.kobo.com/v1/products/reviews/{ReviewId}/sentiment/{Sentiment}",
"shelfie_recommendations": "https://storeapi.kobo.com/v1/user/recommendations/shelfie",
"sign_in_page": "https://authorize.kobo.com/signin?returnUrl=http://store.kobobooks.com/",
"social_authorization_host": "https://social.kobobooks.com:8443",
"social_host": "https://social.kobobooks.com",
"stacks_host_productId": "https://store.kobobooks.com/collections/byproductid/",
"store_home": "www.kobo.com/{region}/{language}",
"store_host": "store.kobobooks.com",
"store_newreleases": "https://store.kobobooks.com/{culture}/List/new-releases/961XUjtsU0qxkFItWOutGA",
"store_search": "https://store.kobobooks.com/{culture}/Search?Query={query}",
"store_top50": "https://store.kobobooks.com/{culture}/ebooks/Top",
"tag_items": "https://storeapi.kobo.com/v1/library/tags/{TagId}/Items",
"tags": "https://storeapi.kobo.com/v1/library/tags",
"taste_profile": "https://storeapi.kobo.com/v1/products/tasteprofile",
"update_accessibility_to_preview": "https://storeapi.kobo.com/v1/library/{EntitlementIds}/preview",
"use_one_store": "False",
"user_loyalty_benefits": "https://storeapi.kobo.com/v1/user/loyalty/benefits",
"user_platform": "https://storeapi.kobo.com/v1/user/platform",
"user_profile": "https://storeapi.kobo.com/v1/user/profile",
"user_ratings": "https://storeapi.kobo.com/v1/user/ratings",
"user_recommendations": "https://storeapi.kobo.com/v1/user/recommendations",
"user_reviews": "https://storeapi.kobo.com/v1/user/reviews",
"user_wishlist": "https://storeapi.kobo.com/v1/user/wishlist",
"userguide_host": "https://kbdownload1-a.akamaihd.net",
"wishlist_page": "https://store.kobobooks.com/{region}/{language}/account/wishlist",
}

@ -62,7 +62,7 @@ from datetime import datetime
from os import urandom from os import urandom
from flask import g, Blueprint, url_for from flask import g, Blueprint, url_for
from flask_login import login_user, current_user, login_required from flask_login import login_user, login_required
from flask_babel import gettext as _ from flask_babel import gettext as _
from . import logger, ub, lm from . import logger, ub, lm
@ -102,8 +102,7 @@ def load_user_from_kobo_request(request):
login_user(user) login_user(user)
return user return user
log.info("Received Kobo request without a recognizable auth token.") log.info("Received Kobo request without a recognizable auth token.")
return None return
kobo_auth = Blueprint("kobo_auth", __name__, url_prefix="/kobo_auth") kobo_auth = Blueprint("kobo_auth", __name__, url_prefix="/kobo_auth")

@ -60,10 +60,13 @@ class ReverseProxied(object):
def __init__(self, application): def __init__(self, application):
self.app = application self.app = application
self.proxied = False
def __call__(self, environ, start_response): def __call__(self, environ, start_response):
self.proxied = False
script_name = environ.get('HTTP_X_SCRIPT_NAME', '') script_name = environ.get('HTTP_X_SCRIPT_NAME', '')
if script_name: if script_name:
self.proxied = True
environ['SCRIPT_NAME'] = script_name environ['SCRIPT_NAME'] = script_name
path_info = environ.get('PATH_INFO', '') path_info = environ.get('PATH_INFO', '')
if path_info and path_info.startswith(script_name): if path_info and path_info.startswith(script_name):
@ -76,3 +79,7 @@ class ReverseProxied(object):
if servr: if servr:
environ['HTTP_HOST'] = servr environ['HTTP_HOST'] = servr
return self.app(environ, start_response) return self.app(environ, start_response)
@property
def is_proxied(self):
return self.proxied

@ -1,6 +1,6 @@
{% extends "layout.html" %} {% extends "layout.html" %}
{% block body %} {% block body %}
<div class="discover"> <div class="discover" xmlns:text-indent="http://www.w3.org/1999/xhtml">
<h2>{{title}}</h2> <h2>{{title}}</h2>
<form role="form" method="POST" autocomplete="off"> <form role="form" method="POST" autocomplete="off">
<div class="panel-group"> <div class="panel-group">
@ -169,6 +169,18 @@
<input type="checkbox" id="config_remote_login" name="config_remote_login" {% if config.config_remote_login %}checked{% endif %}> <input type="checkbox" id="config_remote_login" name="config_remote_login" {% if config.config_remote_login %}checked{% endif %}>
<label for="config_remote_login">{{_('Enable remote login ("magic link")')}}</label> <label for="config_remote_login">{{_('Enable remote login ("magic link")')}}</label>
</div> </div>
{% if feature_support['kobo'] %}
<div class="form-group">
<input type="checkbox" id="config_kobo_sync" name="config_kobo_sync" data-control="kobo-settings" {% if config.config_kobo_sync %}checked{% endif %}>
<label for="config_kobo_sync">{{_('Enable Kobo sync')}}</label>
</div>
<div data-related="kobo-settings">
<div class="form-group" style="text-indent:10px;">
<input type="checkbox" id="config_kobo_proxy" name="config_kobo_proxy" {% if config.config_kobo_proxy %}checked{% endif %}>
<label for="config_kobo_proxy">{{_('Proxy unknown requests to Kobo Store')}}</label>
</div>
</div>
{% endif %}
{% if feature_support['goodreads'] %} {% if feature_support['goodreads'] %}
<div class="form-group"> <div class="form-group">
<input type="checkbox" id="config_use_goodreads" name="config_use_goodreads" data-control="goodreads-settings" {% if config.config_use_goodreads %}checked{% endif %}> <input type="checkbox" id="config_use_goodreads" name="config_use_goodreads" data-control="goodreads-settings" {% if config.config_use_goodreads %}checked{% endif %}>

@ -26,6 +26,7 @@
<label for="kindle_mail">{{_('Kindle E-Mail')}}</label> <label for="kindle_mail">{{_('Kindle E-Mail')}}</label>
<input type="email" class="form-control" name="kindle_mail" id="kindle_mail" value="{{ content.kindle_mail if content.kindle_mail != None }}"> <input type="email" class="form-control" name="kindle_mail" id="kindle_mail" value="{{ content.kindle_mail if content.kindle_mail != None }}">
</div> </div>
{% if not content.role_anonymous() %}
<div class="form-group"> <div class="form-group">
<label for="locale">{{_('Language')}}</label> <label for="locale">{{_('Language')}}</label>
<select name="locale" id="locale" class="form-control"> <select name="locale" id="locale" class="form-control">
@ -34,6 +35,8 @@
{% endfor %} {% endfor %}
</select> </select>
</div> </div>
{% endif %}
<div class="form-group"> <div class="form-group">
<label for="default_language">{{_('Show books with language')}}</label> <label for="default_language">{{_('Show books with language')}}</label>
<select name="default_language" id="default_language" class="form-control"> <select name="default_language" id="default_language" class="form-control">
@ -55,7 +58,7 @@
{% endfor %} {% endfor %}
</div> </div>
{% endif %} {% endif %}
{% if feature_support['kobo'] %} {% if feature_support['kobo'] and not new_user %}
<label>{{ _('Kobo Sync Token')}}</label> <label>{{ _('Kobo Sync Token')}}</label>
<div class="form-group col"> <div class="form-group col">
<a class="btn btn-default" id="config_create_kobo_token" data-toggle="modal" data-target="#modal_kobo_token" data-remote="false" href="{{ url_for('kobo_auth.generate_auth_token', user_id=content.id) }}">{{_('Create/View')}}</a> <a class="btn btn-default" id="config_create_kobo_token" data-toggle="modal" data-target="#modal_kobo_token" data-remote="false" href="{{ url_for('kobo_auth.generate_auth_token', user_id=content.id) }}">{{_('Create/View')}}</a>

@ -1,65 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web)
# Copyright (C) 2018-2019 OzzieIsaacs
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from subproc_wrapper import process_open, cmdlineCall
import os
import sys
import re
import time
def main():
quotes = [1, 2]
format_new_ext = '.mobi'
format_old_ext = '.epub'
file_path = '/home/matthias/Dokumente/bücher/Bettina Szramah/Die Giftmischerin TCP_IP (10)/Die Giftmischerin TCP_IP - Bettina, Szrama'
command = ['/opt/calibre/ebook-convert', (file_path + format_old_ext),
(file_path + format_new_ext)]
#print(command)
#p1 = cmdlineCall(command[0],command[1:])
#time.sleep(10)
#print(p1)
p = process_open(command, quotes)
while p.poll() is None:
nextline = p.stdout.readline()
if os.name == 'nt' and sys.version_info < (3, 0):
nextline = nextline.decode('windows-1252')
elif os.name == 'posix' and sys.version_info < (3, 0):
nextline = nextline.decode('utf-8')
# log.debug(nextline.strip('\r\n'))
# parse progress string from calibre-converter
progress = re.search(r"(\d+)%\s.*", nextline)
if progress:
print('Progress:' + str(progress))
# self.UIqueue[index]['progress'] = progress.group(1) + ' %
# process returncode
check = p.returncode
calibre_traceback = p.stderr.readlines()
for ele in calibre_traceback:
if sys.version_info < (3, 0):
ele = ele.decode('utf-8')
print(ele.strip('\n'))
if not ele.startswith('Traceback') and not ele.startswith(' File'):
print( "Calibre failed with error: %s" % ele.strip('\n'))
print(str(check))
if __name__ == '__main__':
main()

@ -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: 2020-01-12 13:57+0100\n" "POT-Creation-Date: 2020-01-20 20:31+0100\n"
"PO-Revision-Date: 2020-01-08 11:37+0000\n" "PO-Revision-Date: 2020-01-08 11:37+0000\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"
@ -59,7 +59,7 @@ msgstr "Konfigurace Calibre-Web aktualizována"
msgid "Basic Configuration" msgid "Basic Configuration"
msgstr "Základní konfigurace" msgstr "Základní konfigurace"
#: cps/admin.py:465 cps/web.py:1093 #: cps/admin.py:465 cps/web.py:1090
msgid "Please fill out all fields!" msgid "Please fill out all fields!"
msgstr "Vyplňte všechna pole!" msgstr "Vyplňte všechna pole!"
@ -68,7 +68,7 @@ msgstr "Vyplňte všechna pole!"
msgid "Add new user" msgid "Add new user"
msgstr "Přidat nového uživatele" msgstr "Přidat nového uživatele"
#: cps/admin.py:476 cps/web.py:1318 #: cps/admin.py:476 cps/web.py:1315
msgid "E-mail is not from valid domain" msgid "E-mail is not from valid domain"
msgstr "E-mail není z platné domény" msgstr "E-mail není z platné domény"
@ -112,23 +112,23 @@ msgstr "Uživatel '%(nick)s' smazán"
msgid "No admin user remaining, can't delete user" msgid "No admin user remaining, can't delete user"
msgstr "Nezbývá žádný správce, nemůžete jej odstranit" msgstr "Nezbývá žádný správce, nemůžete jej odstranit"
#: cps/admin.py:612 cps/web.py:1359 #: cps/admin.py:612 cps/web.py:1356
msgid "Found an existing account for this e-mail address." msgid "Found an existing account for this e-mail address."
msgstr "Byl nalezen existující účet pro tuto e-mailovou adresu." msgstr "Byl nalezen existující účet pro tuto e-mailovou adresu."
#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1334 #: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1331
#, python-format #, python-format
msgid "Edit User %(nick)s" msgid "Edit User %(nick)s"
msgstr "Upravit uživatele %(nick)s" msgstr "Upravit uživatele %(nick)s"
#: cps/admin.py:622 cps/web.py:1327 #: cps/admin.py:622 cps/web.py:1324
msgid "This username is already taken" msgid "This username is already taken"
msgstr "Toto uživatelské jméno je již použito" msgstr "Toto uživatelské jméno je již použito"
#: cps/admin.py:637 #: cps/admin.py:637
#, python-format #, python-format
msgid "User '%(nick)s' updated" msgid "User '%(nick)s' updated"
msgstr "Uživatel %(nick)s aktualizován" msgstr "Uživatel '%(nick)s' aktualizován"
#: cps/admin.py:640 #: cps/admin.py:640
msgid "An unknown error occured." msgid "An unknown error occured."
@ -139,11 +139,11 @@ msgstr "Došlo k neznámé chybě."
msgid "Password for user %(user)s reset" msgid "Password for user %(user)s reset"
msgstr "Heslo pro uživatele %(user)s resetováno" msgstr "Heslo pro uživatele %(user)s resetováno"
#: cps/admin.py:660 cps/web.py:1118 cps/web.py:1174 #: cps/admin.py:660 cps/web.py:1115 cps/web.py:1171
msgid "An unknown error occurred. Please try again later." msgid "An unknown error occurred. Please try again later."
msgstr "Neznámá chyba. Opakujte prosím později." msgstr "Neznámá chyba. Opakujte prosím později."
#: cps/admin.py:663 cps/web.py:1062 #: cps/admin.py:663 cps/web.py:1059
msgid "Please configure the SMTP mail settings first..." msgid "Please configure the SMTP mail settings first..."
msgstr "Nejprve nakonfigurujte nastavení pošty SMTP..." msgstr "Nejprve nakonfigurujte nastavení pošty SMTP..."
@ -241,7 +241,7 @@ msgstr "Obal není v podporovaném formátu (jpg/png/webp), nelze uložit"
#: cps/editbooks.py:451 #: cps/editbooks.py:451
msgid "Cover is not a jpg file, can't save" msgid "Cover is not a jpg file, can't save"
msgstr "Obal neni soubor jpg, nelze uložit" msgstr "Obal není soubor jpg, nelze uložit"
#: cps/editbooks.py:494 #: cps/editbooks.py:494
#, python-format #, python-format
@ -489,7 +489,7 @@ msgstr "Kniha je již součástí police: %(shelfname)s"
#: cps/shelf.py:85 #: cps/shelf.py:85
#, python-format #, python-format
msgid "Book has been added to shelf: %(sname)s" msgid "Book has been added to shelf: %(sname)s"
msgstr "Kniha byla přidána do plice: %(sname)s" msgstr "Kniha byla přidána do police: %(sname)s"
#: cps/shelf.py:104 #: cps/shelf.py:104
#, python-format #, python-format
@ -591,7 +591,7 @@ msgid "Show best rated books"
msgstr "Zobrazit nejlépe hodnocené knihy" msgstr "Zobrazit nejlépe hodnocené knihy"
#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67 #: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67
#: cps/web.py:1011 #: cps/web.py:1009
msgid "Read Books" msgid "Read Books"
msgstr "Přečtené knihy" msgstr "Přečtené knihy"
@ -600,7 +600,7 @@ msgid "Show read and unread"
msgstr "Zobrazit prečtené a nepřečtené" msgstr "Zobrazit prečtené a nepřečtené"
#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71 #: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71
#: cps/web.py:1015 #: cps/web.py:1013
msgid "Unread Books" msgid "Unread Books"
msgstr "Nepřečtené knihy" msgstr "Nepřečtené knihy"
@ -722,7 +722,7 @@ msgstr "Knihy"
msgid "Hot Books (most downloaded)" msgid "Hot Books (most downloaded)"
msgstr "Žhavé knihy (nejstahovanější)" msgstr "Žhavé knihy (nejstahovanější)"
#: cps/web.py:586 cps/web.py:1382 cps/web.py:1478 #: cps/web.py:586 cps/web.py:1379 cps/web.py:1475
msgid "Error opening eBook. File does not exist or file is not accessible:" msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr "Chyba při otevíraní eKnihy. Soubor neexistuje nebo neni přístupný:" msgstr "Chyba při otevíraní eKnihy. Soubor neexistuje nebo neni přístupný:"
@ -790,128 +790,128 @@ msgid "Tasks"
msgstr "Úlohy" msgstr "Úlohy"
#: cps/templates/feed.xml:33 cps/templates/layout.html:44 #: cps/templates/feed.xml:33 cps/templates/layout.html:44
#: cps/templates/layout.html:45 cps/web.py:829 cps/web.py:831 #: cps/templates/layout.html:45 cps/web.py:827 cps/web.py:829
msgid "Search" msgid "Search"
msgstr "Hledat" msgstr "Hledat"
#: cps/web.py:881 #: cps/web.py:879
msgid "Published after " msgid "Published after "
msgstr "Vydáno po " msgstr "Vydáno po "
#: cps/web.py:888 #: cps/web.py:886
msgid "Published before " msgid "Published before "
msgstr "Vydáno před " msgstr "Vydáno před "
#: cps/web.py:902 #: cps/web.py:900
#, python-format #, python-format
msgid "Rating <= %(rating)s" msgid "Rating <= %(rating)s"
msgstr "Hodnocení <= %(rating)s" msgstr "Hodnocení <= %(rating)s"
#: cps/web.py:904 #: cps/web.py:902
#, python-format #, python-format
msgid "Rating >= %(rating)s" msgid "Rating >= %(rating)s"
msgstr "Hodnocení >= %(rating)s" msgstr "Hodnocení >= %(rating)s"
#: cps/web.py:970 cps/web.py:982 #: cps/web.py:968 cps/web.py:980
msgid "search" msgid "search"
msgstr "hledat" msgstr "hledat"
#: cps/web.py:1067 #: cps/web.py:1064
#, python-format #, python-format
msgid "Book successfully queued for sending to %(kindlemail)s" msgid "Book successfully queued for sending to %(kindlemail)s"
msgstr "Kniha byla úspěšně zařazena do fronty pro odeslání na %(kindlemail)s" msgstr "Kniha byla úspěšně zařazena do fronty pro odeslání na %(kindlemail)s"
#: cps/web.py:1071 #: cps/web.py:1068
#, python-format #, python-format
msgid "There was an error sending this book: %(res)s" msgid "There was an error sending this book: %(res)s"
msgstr "Při odesílání této knihy došlo k chybě: %(res)s" msgstr "Při odesílání této knihy došlo k chybě: %(res)s"
#: cps/web.py:1073 #: cps/web.py:1070
msgid "Please configure your kindle e-mail address first..." msgid "Please configure your kindle e-mail address first..."
msgstr "Nejprve nakonfigurujte vaši kindle e-mailovou adresu.." msgstr "Nejprve nakonfigurujte vaši kindle e-mailovou adresu.."
#: cps/web.py:1087 #: cps/web.py:1084
msgid "E-Mail server is not configured, please contact your administrator!" msgid "E-Mail 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!"
#: cps/web.py:1088 cps/web.py:1094 cps/web.py:1119 cps/web.py:1123 #: cps/web.py:1085 cps/web.py:1091 cps/web.py:1116 cps/web.py:1120
#: cps/web.py:1128 cps/web.py:1132 #: cps/web.py:1125 cps/web.py:1129
msgid "register" msgid "register"
msgstr "registrovat" msgstr "registrovat"
#: cps/web.py:1121 #: cps/web.py:1118
msgid "Your e-mail is not allowed to register" msgid "Your e-mail is not allowed to register"
msgstr "Váš e-mail nemá povolení k registraci" msgstr "Váš e-mail nemá povolení k registraci"
#: cps/web.py:1124 #: cps/web.py:1121
msgid "Confirmation e-mail was send to your e-mail account." msgid "Confirmation e-mail was send to your e-mail account."
msgstr "Potvrzovací e-mail byl odeslán na váš účet." msgstr "Potvrzovací e-mail byl odeslán na váš účet."
#: cps/web.py:1127 #: cps/web.py:1124
msgid "This username or e-mail address is already in use." msgid "This username or e-mail address is already in use."
msgstr "Toto uživatelské jméno nebo e-mailová adresa jsou již používány." msgstr "Toto uživatelské jméno nebo e-mailová adresa jsou již používány."
#: cps/web.py:1144 #: cps/web.py:1141
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "Nelze aktivovat ověření LDAP" msgstr "Nelze aktivovat ověření LDAP"
#: cps/web.py:1154 cps/web.py:1281 #: cps/web.py:1151 cps/web.py:1278
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"
msgstr "nyní jste přihlášeni jako: %(nickname)s" msgstr "nyní jste přihlášeni jako: %(nickname)s"
#: cps/web.py:1159 #: cps/web.py:1156
msgid "Could not login. LDAP server down, please contact your administrator" msgid "Could not login. LDAP server down, please contact your administrator"
msgstr "Nelze se přihlásit. LDAP server neodpovídá, kontaktujte svého správce" msgstr "Nelze se přihlásit. LDAP server neodpovídá, kontaktujte svého správce"
#: cps/web.py:1163 cps/web.py:1186 #: cps/web.py:1160 cps/web.py:1183
msgid "Wrong Username or Password" msgid "Wrong Username or Password"
msgstr "Špatné uživatelské jméno nebo heslo" msgstr "Špatné uživatelské jméno nebo heslo"
#: cps/web.py:1170 #: cps/web.py:1167
msgid "New Password was send to your email address" msgid "New Password was send to your email address"
msgstr "Nové heslo bylo zasláno na váši emailovou adresu" msgstr "Nové heslo bylo zasláno na váši emailovou adresu"
#: cps/web.py:1176 #: cps/web.py:1173
msgid "Please enter valid username to reset password" msgid "Please enter valid username to reset password"
msgstr "Zadejte platné uživatelské jméno pro obnovení hesla" msgstr "Zadejte platné uživatelské jméno pro obnovení hesla"
#: cps/web.py:1182 #: cps/web.py:1179
#, python-format #, python-format
msgid "You are now logged in as: '%(nickname)s'" msgid "You are now logged in as: '%(nickname)s'"
msgstr "Nyní jste přihlášeni jako: '%(nickname)s'" msgstr "Nyní jste přihlášeni jako: '%(nickname)s'"
#: cps/web.py:1189 cps/web.py:1213 #: cps/web.py:1186 cps/web.py:1210
msgid "login" msgid "login"
msgstr "přihlásit se" msgstr "přihlásit se"
#: cps/web.py:1225 cps/web.py:1259 #: cps/web.py:1222 cps/web.py:1256
msgid "Token not found" msgid "Token not found"
msgstr "Token nenalezen" msgstr "Token nenalezen"
#: cps/web.py:1234 cps/web.py:1267 #: cps/web.py:1231 cps/web.py:1264
msgid "Token has expired" msgid "Token has expired"
msgstr "Token vypršel" msgstr "Token vypršel"
#: cps/web.py:1243 #: cps/web.py:1240
msgid "Success! Please return to your device" msgid "Success! Please return to your device"
msgstr "Úspěch! Vraťte se prosím do zařízení" msgstr "Úspěch! Vraťte se prosím do zařízení"
#: cps/web.py:1320 cps/web.py:1363 cps/web.py:1369 #: cps/web.py:1317 cps/web.py:1360 cps/web.py:1366
#, python-format #, python-format
msgid "%(name)s's profile" msgid "%(name)s's profile"
msgstr "%(name)s profil" msgstr "%(name)s profil"
#: cps/web.py:1365 #: cps/web.py:1362
msgid "Profile updated" msgid "Profile updated"
msgstr "Profil aktualizován" msgstr "Profil aktualizován"
#: cps/web.py:1394 cps/web.py:1397 cps/web.py:1400 cps/web.py:1407 #: cps/web.py:1391 cps/web.py:1394 cps/web.py:1397 cps/web.py:1404
#: cps/web.py:1412 #: cps/web.py:1409
msgid "Read a Book" msgid "Read a Book"
msgstr "Číst knihu" msgstr "Číst knihu"
#: cps/web.py:1423 #: cps/web.py:1420
msgid "Error opening eBook. File does not exist or file is not accessible." msgid "Error opening eBook. File does not exist or file is not accessible."
msgstr "Chyba při otevírání eKnihy. Soubor neexistuje nebo není přístupný" msgstr "Chyba při otevírání eKnihy. Soubor neexistuje nebo není přístupný"
@ -953,11 +953,11 @@ msgstr "Správce"
#: cps/templates/detail.html:27 cps/templates/shelf.html:6 #: cps/templates/detail.html:27 cps/templates/shelf.html:6
#: cps/templates/shelfdown.html:62 #: cps/templates/shelfdown.html:62
msgid "Download" msgid "Download"
msgstr "Stáhovat" msgstr "Stahovat"
#: cps/templates/admin.html:18 #: cps/templates/admin.html:18
msgid "View Ebooks" msgid "View Ebooks"
msgstr "Prohlížet eknihy" msgstr "Prohlížet"
#: cps/templates/admin.html:19 cps/templates/layout.html:65 #: cps/templates/admin.html:19 cps/templates/layout.html:65
msgid "Upload" msgid "Upload"
@ -1098,7 +1098,7 @@ msgstr "Ok"
#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92
#: cps/templates/layout.html:28 cps/templates/shelf.html:73 #: cps/templates/layout.html:28 cps/templates/shelf.html:73
#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32 #: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32
#: cps/templates/user_edit.html:131 #: cps/templates/user_edit.html:133
msgid "Back" msgid "Back"
msgstr "Zpět" msgstr "Zpět"
@ -1211,7 +1211,7 @@ msgstr "Datum vydání"
msgid "Publisher" msgid "Publisher"
msgstr "Vydavatel" msgstr "Vydavatel"
#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:30 #: cps/templates/book_edit.html:103 cps/templates/user_edit.html:31
msgid "Language" msgid "Language"
msgstr "Jazyk" msgstr "Jazyk"
@ -1238,7 +1238,7 @@ msgstr "Získat metadata"
#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329 #: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329
#: cps/templates/config_view_edit.html:146 cps/templates/login.html:20 #: cps/templates/config_view_edit.html:146 cps/templates/login.html:20
#: cps/templates/search_form.html:170 cps/templates/shelf_edit.html:17 #: cps/templates/search_form.html:170 cps/templates/shelf_edit.html:17
#: cps/templates/user_edit.html:129 #: cps/templates/user_edit.html:131
msgid "Submit" msgid "Submit"
msgstr "Odeslat" msgstr "Odeslat"
@ -1405,7 +1405,7 @@ msgstr "Povolit veřejnou registraci"
#: cps/templates/config_edit.html:170 #: cps/templates/config_edit.html:170
msgid "Enable remote login (\"magic link\")" msgid "Enable remote login (\"magic link\")"
msgstr "Povolit vzdálené přihlášení (\“magic link\”)" msgstr "Povolit vzdálené přihlášení (\\“magic link\\”)"
#: cps/templates/config_edit.html:175 #: cps/templates/config_edit.html:175
msgid "Use Goodreads" msgid "Use Goodreads"
@ -1591,35 +1591,35 @@ msgstr "Štítky pro obsah pro dospělé"
msgid "Default settings for new users" msgid "Default settings for new users"
msgstr "Výchozí nastavení pro nového uživatele" msgstr "Výchozí nastavení pro nového uživatele"
#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:82 #: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:84
msgid "Admin user" msgid "Admin user"
msgstr "Uživatel admin" msgstr "Uživatel admin"
#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:91 #: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:93
msgid "Allow Downloads" msgid "Allow Downloads"
msgstr "Povolit stahování" msgstr "Povolit stahování"
#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:95 #: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:97
msgid "Allow book viewer" msgid "Allow book viewer"
msgstr "Povolit prohlížeč knih" msgstr "Povolit prohlížeč knih"
#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:99 #: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:101
msgid "Allow Uploads" msgid "Allow Uploads"
msgstr "Povolit nahrávání" msgstr "Povolit nahrávání"
#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:103 #: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:105
msgid "Allow Edit" msgid "Allow Edit"
msgstr "Povolit úpravy" msgstr "Povolit úpravy"
#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 #: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:109
msgid "Allow Delete books" msgid "Allow Delete books"
msgstr "Povolit mazání knih" msgstr "Povolit mazání knih"
#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:112 #: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:114
msgid "Allow Changing Password" msgid "Allow Changing Password"
msgstr "Povolit změnu hesla" msgstr "Povolit změnu hesla"
#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:116 #: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:118
msgid "Allow Editing Public Shelfs" msgid "Allow Editing Public Shelfs"
msgstr "Povolit úpravy veřejných polic" msgstr "Povolit úpravy veřejných polic"
@ -1627,11 +1627,11 @@ msgstr "Povolit úpravy veřejných polic"
msgid "Default visibilities for new users" msgid "Default visibilities for new users"
msgstr "Výchozí viditelnosti pro nové uživatele" msgstr "Výchozí viditelnosti pro nové uživatele"
#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:74 #: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:76
msgid "Show random books in detail view" msgid "Show random books in detail view"
msgstr "Zobrazit náhodné knihy v podrobném zobrazení" msgstr "Zobrazit náhodné knihy v podrobném zobrazení"
#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:87 #: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:89
msgid "Show mature content" msgid "Show mature content"
msgstr "Zobrazit obsah pro dospělé" msgstr "Zobrazit obsah pro dospělé"
@ -1665,7 +1665,7 @@ msgstr "Označit jako přečtené"
#: cps/templates/detail.html:201 #: cps/templates/detail.html:201
msgid "Read" msgid "Read"
msgstr "Číst" msgstr "Přečteno"
#: cps/templates/detail.html:211 #: cps/templates/detail.html:211
msgid "Description:" msgid "Description:"
@ -1910,13 +1910,21 @@ msgstr "Zapomenuté heslo"
msgid "Log in with magic link" msgid "Log in with magic link"
msgstr "Přihlásit se pomocí magického odkazu" msgstr "Přihlásit se pomocí magického odkazu"
#: cps/templates/logviewer.html:5 #: cps/templates/logviewer.html:6
msgid "Show Calibre-Web log" msgid "Show Calibre-Web log: "
msgstr "Zobrazit Calibre-Web log" msgstr "Zobrazit Calibre-Web log: "
#: cps/templates/logviewer.html:8
msgid "Calibre-Web log: "
msgstr "Calibre-Web log: "
#: cps/templates/logviewer.html:8 #: cps/templates/logviewer.html:8
msgid "Show access log" msgid "Stream output, can't be displayed"
msgstr "Zobrazit log přístupu" msgstr ""
#: cps/templates/logviewer.html:12
msgid "Show access log: "
msgstr "Zobrazit log přístupu: "
#: cps/templates/osd.xml:5 #: cps/templates/osd.xml:5
msgid "Calibre-Web ebook catalog" msgid "Calibre-Web ebook catalog"
@ -1972,7 +1980,7 @@ msgstr "Světlý"
#: cps/templates/readcbr.html:116 #: cps/templates/readcbr.html:116
msgid "Dark" msgid "Dark"
msgstr "Tnavý" msgstr "Tmavý"
#: cps/templates/readcbr.html:121 #: cps/templates/readcbr.html:121
msgid "Scale" msgid "Scale"
@ -2140,19 +2148,19 @@ msgstr "Statistika knihovny Calibre"
#: cps/templates/stats.html:12 #: cps/templates/stats.html:12
msgid "Books in this Library" msgid "Books in this Library"
msgstr "Knihy v této knihovně" msgstr "Knih v této knihovně"
#: cps/templates/stats.html:16 #: cps/templates/stats.html:16
msgid "Authors in this Library" msgid "Authors in this Library"
msgstr "Autoři v této knihovně" msgstr "Auto v této knihovně"
#: cps/templates/stats.html:20 #: cps/templates/stats.html:20
msgid "Categories in this Library" msgid "Categories in this Library"
msgstr "Kategorie v této knihovně" msgstr "Kategorií v této knihovně"
#: cps/templates/stats.html:24 #: cps/templates/stats.html:24
msgid "Series in this Library" msgid "Series in this Library"
msgstr "Série v této knihovně" msgstr "Sérií v této knihovně"
#: cps/templates/stats.html:28 #: cps/templates/stats.html:28
msgid "Linked libraries" msgid "Linked libraries"
@ -2208,33 +2216,33 @@ msgstr "Resetovat uživatelské heslo"
#: cps/templates/user_edit.html:26 #: cps/templates/user_edit.html:26
msgid "Kindle E-Mail" msgid "Kindle E-Mail"
msgstr "Kindle E-Mail" msgstr "Kindle e-mail"
#: cps/templates/user_edit.html:39 #: cps/templates/user_edit.html:41
msgid "Show books with language" msgid "Show books with language"
msgstr "Zobrazit knihy s jazykem" msgstr "Zobrazit knihy s jazykem"
#: cps/templates/user_edit.html:41 #: cps/templates/user_edit.html:43
msgid "Show all" msgid "Show all"
msgstr "Zobrazit vše" msgstr "Zobrazit vše"
#: cps/templates/user_edit.html:51 #: cps/templates/user_edit.html:53
msgid "OAuth Settings" msgid "OAuth Settings"
msgstr "Nastavení OAuth" msgstr "Nastavení OAuth"
#: cps/templates/user_edit.html:53 #: cps/templates/user_edit.html:55
msgid "Link" msgid "Link"
msgstr "Připojit" msgstr "Připojit"
#: cps/templates/user_edit.html:55 #: cps/templates/user_edit.html:57
msgid "Unlink" msgid "Unlink"
msgstr "Odpojit" msgstr "Odpojit"
#: cps/templates/user_edit.html:123 #: cps/templates/user_edit.html:125
msgid "Delete this user" msgid "Delete this user"
msgstr "Odstranit tohoto uživatele" msgstr "Odstranit tohoto uživatele"
#: cps/templates/user_edit.html:138 #: cps/templates/user_edit.html:140
msgid "Recent Downloads" msgid "Recent Downloads"
msgstr "Nedávná stahování" msgstr "Nedávná stahování"
@ -3591,3 +3599,9 @@ msgstr "Nedávná stahování"
#~ msgid "Zaza" #~ msgid "Zaza"
#~ msgstr "Zaza" #~ msgstr "Zaza"
#~ msgid "Show Calibre-Web log"
#~ msgstr "Zobrazit Calibre-Web log"
#~ msgid "Show access log"
#~ msgstr "Zobrazit log přístupu"

@ -7,17 +7,16 @@ 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: 2020-01-12 13:57+0100\n" "POT-Creation-Date: 2020-01-18 12:54+0100\n"
"PO-Revision-Date: 2020-01-13 18:24+0100\n" "PO-Revision-Date: 2020-01-18 12:52+0100\n"
"Last-Translator: Ozzie Isaacs\n" "Last-Translator: Ozzie Isaacs\n"
"Language: de\n" "Language: de\n"
"Language-Team: \n" "Language-Team: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.7.0\n" "Generated-By: Babel 2.7.0\n"
"X-Generator: Poedit 2.2.4\n"
#: cps/about.py:42 #: cps/about.py:42
msgid "installed" msgid "installed"
@ -61,7 +60,7 @@ msgstr "Konfiguration von Calibre-Web wurde aktualisiert"
msgid "Basic Configuration" msgid "Basic Configuration"
msgstr "Basiskonfiguration" msgstr "Basiskonfiguration"
#: cps/admin.py:465 cps/web.py:1093 #: cps/admin.py:465 cps/web.py:1090
msgid "Please fill out all fields!" msgid "Please fill out all fields!"
msgstr "Bitte alle Felder ausfüllen!" msgstr "Bitte alle Felder ausfüllen!"
@ -70,7 +69,7 @@ msgstr "Bitte alle Felder ausfüllen!"
msgid "Add new user" msgid "Add new user"
msgstr "Neuen Benutzer hinzufügen" msgstr "Neuen Benutzer hinzufügen"
#: cps/admin.py:476 cps/web.py:1318 #: cps/admin.py:476 cps/web.py:1315
msgid "E-mail is not from valid domain" msgid "E-mail is not from valid domain"
msgstr "E-Mail bezieht sich nicht auf eine gültige Domain" msgstr "E-Mail bezieht sich nicht auf eine gültige Domain"
@ -114,16 +113,16 @@ msgstr "Benutzer '%(nick)s' gelöscht"
msgid "No admin user remaining, can't delete user" msgid "No admin user remaining, can't delete user"
msgstr "Benutzer kann nicht gelöscht werden, es wäre kein Admin Benutzer übrig" msgstr "Benutzer kann nicht gelöscht werden, es wäre kein Admin Benutzer übrig"
#: cps/admin.py:612 cps/web.py:1359 #: cps/admin.py:612 cps/web.py:1356
msgid "Found an existing account for this e-mail address." msgid "Found an existing account for this e-mail address."
msgstr "Es existiert bereits ein Benutzer für diese E-Mailadresse." msgstr "Es existiert bereits ein Benutzer für diese E-Mailadresse."
#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1334 #: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1331
#, python-format #, python-format
msgid "Edit User %(nick)s" msgid "Edit User %(nick)s"
msgstr "Benutzer %(nick)s bearbeiten" msgstr "Benutzer %(nick)s bearbeiten"
#: cps/admin.py:622 cps/web.py:1327 #: cps/admin.py:622 cps/web.py:1324
msgid "This username is already taken" msgid "This username is already taken"
msgstr "Benutzername ist schon vorhanden" msgstr "Benutzername ist schon vorhanden"
@ -141,11 +140,11 @@ msgstr "Es ist ein unbekannter Fehler aufgetreten."
msgid "Password for user %(user)s reset" msgid "Password for user %(user)s reset"
msgstr "Passwort für Benutzer %(user)s wurde zurückgesetzt" msgstr "Passwort für Benutzer %(user)s wurde zurückgesetzt"
#: cps/admin.py:660 cps/web.py:1118 cps/web.py:1174 #: cps/admin.py:660 cps/web.py:1115 cps/web.py:1171
msgid "An unknown error occurred. Please try again later." msgid "An unknown error occurred. Please try again later."
msgstr "Es ist ein unbekannter Fehler aufgetreten. Bitte später erneut versuchen." msgstr "Es ist ein unbekannter Fehler aufgetreten. Bitte später erneut versuchen."
#: cps/admin.py:663 cps/web.py:1062 #: cps/admin.py:663 cps/web.py:1059
msgid "Please configure the SMTP mail settings first..." msgid "Please configure the SMTP mail settings first..."
msgstr "Bitte zuerst die SMTP-Einstellung konfigurieren ..." msgstr "Bitte zuerst die SMTP-Einstellung konfigurieren ..."
@ -593,7 +592,7 @@ msgid "Show best rated books"
msgstr "Zeige am besten bewertete Bücher" msgstr "Zeige am besten bewertete Bücher"
#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67 #: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67
#: cps/web.py:1011 #: cps/web.py:1009
msgid "Read Books" msgid "Read Books"
msgstr "Gelesene Bücher" msgstr "Gelesene Bücher"
@ -602,7 +601,7 @@ msgid "Show read and unread"
msgstr "Zeige gelesene/ungelesene Bücher" msgstr "Zeige gelesene/ungelesene Bücher"
#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71 #: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71
#: cps/web.py:1015 #: cps/web.py:1013
msgid "Unread Books" msgid "Unread Books"
msgstr "Ungelesene Bücher" msgstr "Ungelesene Bücher"
@ -724,7 +723,7 @@ msgstr "Bücher"
msgid "Hot Books (most downloaded)" msgid "Hot Books (most downloaded)"
msgstr "Beliebte Bücher (am meisten Downloads)" msgstr "Beliebte Bücher (am meisten Downloads)"
#: cps/web.py:586 cps/web.py:1382 cps/web.py:1478 #: cps/web.py:586 cps/web.py:1379 cps/web.py:1475
msgid "Error opening eBook. File does not exist or file is not accessible:" msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr "Öffnen des Buchs fehlgeschlagen. Datei existiert nicht oder ist nicht zugänglich:" msgstr "Öffnen des Buchs fehlgeschlagen. Datei existiert nicht oder ist nicht zugänglich:"
@ -792,128 +791,128 @@ msgid "Tasks"
msgstr "Aufgaben" msgstr "Aufgaben"
#: cps/templates/feed.xml:33 cps/templates/layout.html:44 #: cps/templates/feed.xml:33 cps/templates/layout.html:44
#: cps/templates/layout.html:45 cps/web.py:829 cps/web.py:831 #: cps/templates/layout.html:45 cps/web.py:827 cps/web.py:829
msgid "Search" msgid "Search"
msgstr "Suche" msgstr "Suche"
#: cps/web.py:881 #: cps/web.py:879
msgid "Published after " msgid "Published after "
msgstr "Herausgegeben nach dem " msgstr "Herausgegeben nach dem "
#: cps/web.py:888 #: cps/web.py:886
msgid "Published before " msgid "Published before "
msgstr "Herausgegeben vor dem " msgstr "Herausgegeben vor dem "
#: cps/web.py:902 #: cps/web.py:900
#, python-format #, python-format
msgid "Rating <= %(rating)s" msgid "Rating <= %(rating)s"
msgstr "Bewertung <= %(rating)s" msgstr "Bewertung <= %(rating)s"
#: cps/web.py:904 #: cps/web.py:902
#, python-format #, python-format
msgid "Rating >= %(rating)s" msgid "Rating >= %(rating)s"
msgstr "Bewertung >= %(rating)s" msgstr "Bewertung >= %(rating)s"
#: cps/web.py:970 cps/web.py:982 #: cps/web.py:968 cps/web.py:980
msgid "search" msgid "search"
msgstr "Suche" msgstr "Suche"
#: cps/web.py:1067 #: cps/web.py:1064
#, python-format #, python-format
msgid "Book successfully queued for sending to %(kindlemail)s" msgid "Book successfully queued for sending to %(kindlemail)s"
msgstr "Buch erfolgreich zum Senden an %(kindlemail)s eingereiht" msgstr "Buch erfolgreich zum Senden an %(kindlemail)s eingereiht"
#: cps/web.py:1071 #: cps/web.py:1068
#, python-format #, python-format
msgid "There was an error sending this book: %(res)s" msgid "There was an error sending this book: %(res)s"
msgstr "Beim Senden des Buchs trat ein Fehler auf: %(res)s" msgstr "Beim Senden des Buchs trat ein Fehler auf: %(res)s"
#: cps/web.py:1073 #: cps/web.py:1070
msgid "Please configure your kindle e-mail address first..." msgid "Please configure your kindle e-mail address first..."
msgstr "Bitte zuerst die Kindle E-Mailadresse konfigurieren..." msgstr "Bitte zuerst die Kindle E-Mailadresse konfigurieren..."
#: cps/web.py:1087 #: cps/web.py:1084
msgid "E-Mail server is not configured, please contact your administrator!" msgid "E-Mail server is not configured, please contact your administrator!"
msgstr "Der E-Mail Server ist nicht konfigurierte, bitte den Administrator kontaktieren!" msgstr "Der E-Mail Server ist nicht konfigurierte, bitte den Administrator kontaktieren!"
#: cps/web.py:1088 cps/web.py:1094 cps/web.py:1119 cps/web.py:1123 #: cps/web.py:1085 cps/web.py:1091 cps/web.py:1116 cps/web.py:1120
#: cps/web.py:1128 cps/web.py:1132 #: cps/web.py:1125 cps/web.py:1129
msgid "register" msgid "register"
msgstr "Registieren" msgstr "Registieren"
#: cps/web.py:1121 #: cps/web.py:1118
msgid "Your e-mail is not allowed to register" msgid "Your e-mail is not allowed to register"
msgstr "Diese E-Mail ist nicht für die Registrierung zugelassen" msgstr "Diese E-Mail ist nicht für die Registrierung zugelassen"
#: cps/web.py:1124 #: cps/web.py:1121
msgid "Confirmation e-mail was send to your e-mail account." msgid "Confirmation e-mail was send to your e-mail account."
msgstr "Eine Bestätigungs-E-Mail wurde an deinen E-Mail Account versendet." msgstr "Eine Bestätigungs-E-Mail wurde an deinen E-Mail Account versendet."
#: cps/web.py:1127 #: cps/web.py:1124
msgid "This username or e-mail address is already in use." msgid "This username or e-mail address is already in use."
msgstr "Benutzername oder E-Mailadresse ist bereits in Verwendung." msgstr "Benutzername oder E-Mailadresse ist bereits in Verwendung."
#: cps/web.py:1144 #: cps/web.py:1141
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:1154 cps/web.py:1281 #: cps/web.py:1151 cps/web.py:1278
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"
msgstr "Du bist nun eingeloggt als '%(nickname)s'" msgstr "Du bist nun eingeloggt als '%(nickname)s'"
#: cps/web.py:1159 #: cps/web.py:1156
msgid "Could not login. LDAP server down, please contact your administrator" msgid "Could not login. LDAP server down, please contact your administrator"
msgstr "Login nicht erfolgreich, LDAP Server nicht erreichbar, bitte Administrator kontaktieren" msgstr "Login nicht erfolgreich, LDAP Server nicht erreichbar, bitte Administrator kontaktieren"
#: cps/web.py:1163 cps/web.py:1186 #: cps/web.py:1160 cps/web.py:1183
msgid "Wrong Username or Password" msgid "Wrong Username or Password"
msgstr "Falscher Benutzername oder Passwort" msgstr "Falscher Benutzername oder Passwort"
#: cps/web.py:1170 #: cps/web.py:1167
msgid "New Password was send to your email address" msgid "New Password was send to your email address"
msgstr "Das neue Passwort wurde an die E-Mail Adresse verschickt" msgstr "Das neue Passwort wurde an die E-Mail Adresse verschickt"
#: cps/web.py:1176 #: cps/web.py:1173
msgid "Please enter valid username to reset password" msgid "Please enter valid username to reset password"
msgstr "Bitte einen gültigen Benutzernamen zum Zurücksetzen des Passworts angeben" msgstr "Bitte einen gültigen Benutzernamen zum Zurücksetzen des Passworts angeben"
#: cps/web.py:1182 #: cps/web.py:1179
#, python-format #, python-format
msgid "You are now logged in as: '%(nickname)s'" msgid "You are now logged in as: '%(nickname)s'"
msgstr "Eingeloggt als: '%(nickname)s'" msgstr "Eingeloggt als: '%(nickname)s'"
#: cps/web.py:1189 cps/web.py:1213 #: cps/web.py:1186 cps/web.py:1210
msgid "login" msgid "login"
msgstr "Login" msgstr "Login"
#: cps/web.py:1225 cps/web.py:1259 #: cps/web.py:1222 cps/web.py:1256
msgid "Token not found" msgid "Token not found"
msgstr "Token wurde nicht gefunden" msgstr "Token wurde nicht gefunden"
#: cps/web.py:1234 cps/web.py:1267 #: cps/web.py:1231 cps/web.py:1264
msgid "Token has expired" msgid "Token has expired"
msgstr "Das Token ist abgelaufen" msgstr "Das Token ist abgelaufen"
#: cps/web.py:1243 #: cps/web.py:1240
msgid "Success! Please return to your device" msgid "Success! Please return to your device"
msgstr "Erfolg! Bitte zum Gerät zurückkehren" msgstr "Erfolg! Bitte zum Gerät zurückkehren"
#: cps/web.py:1320 cps/web.py:1363 cps/web.py:1369 #: cps/web.py:1317 cps/web.py:1360 cps/web.py:1366
#, python-format #, python-format
msgid "%(name)s's profile" msgid "%(name)s's profile"
msgstr "%(name)s's Profil" msgstr "%(name)s's Profil"
#: cps/web.py:1365 #: cps/web.py:1362
msgid "Profile updated" msgid "Profile updated"
msgstr "Profil aktualisiert" msgstr "Profil aktualisiert"
#: cps/web.py:1394 cps/web.py:1397 cps/web.py:1400 cps/web.py:1407 #: cps/web.py:1391 cps/web.py:1394 cps/web.py:1397 cps/web.py:1404
#: cps/web.py:1412 #: cps/web.py:1409
msgid "Read a Book" msgid "Read a Book"
msgstr "Lese ein Buch" msgstr "Lese ein Buch"
#: cps/web.py:1423 #: cps/web.py:1420
msgid "Error opening eBook. File does not exist or file is not accessible." msgid "Error opening eBook. File does not exist or file is not accessible."
msgstr "Fehler beim Öffnen des eBooks. Datei existiert nicht oder ist nicht zugänglich." msgstr "Fehler beim Öffnen des eBooks. Datei existiert nicht oder ist nicht zugänglich."
@ -1100,7 +1099,7 @@ msgstr "OK"
#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92
#: cps/templates/layout.html:28 cps/templates/shelf.html:73 #: cps/templates/layout.html:28 cps/templates/shelf.html:73
#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32 #: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32
#: cps/templates/user_edit.html:131 #: cps/templates/user_edit.html:133
msgid "Back" msgid "Back"
msgstr "Zurück" msgstr "Zurück"
@ -1213,7 +1212,7 @@ msgstr "Herausgabedatum"
msgid "Publisher" msgid "Publisher"
msgstr "Herausgeber" msgstr "Herausgeber"
#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:30 #: cps/templates/book_edit.html:103 cps/templates/user_edit.html:31
msgid "Language" msgid "Language"
msgstr "Sprache" msgstr "Sprache"
@ -1240,7 +1239,7 @@ msgstr "Metadaten laden"
#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329 #: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329
#: cps/templates/config_view_edit.html:146 cps/templates/login.html:20 #: cps/templates/config_view_edit.html:146 cps/templates/login.html:20
#: cps/templates/search_form.html:170 cps/templates/shelf_edit.html:17 #: cps/templates/search_form.html:170 cps/templates/shelf_edit.html:17
#: cps/templates/user_edit.html:129 #: cps/templates/user_edit.html:131
msgid "Submit" msgid "Submit"
msgstr "Abschicken" msgstr "Abschicken"
@ -1593,35 +1592,35 @@ msgstr "Kategorien für Erwachseneninhalte"
msgid "Default settings for new users" msgid "Default settings for new users"
msgstr "Standard-Einstellungen für neue Benutzer" msgstr "Standard-Einstellungen für neue Benutzer"
#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:82 #: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:84
msgid "Admin user" msgid "Admin user"
msgstr "Administrator" msgstr "Administrator"
#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:91 #: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:93
msgid "Allow Downloads" msgid "Allow Downloads"
msgstr "Downloads erlauben" msgstr "Downloads erlauben"
#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:95 #: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:97
msgid "Allow book viewer" msgid "Allow book viewer"
msgstr "Anzeige von Büchern erlauben" msgstr "Anzeige von Büchern erlauben"
#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:99 #: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:101
msgid "Allow Uploads" msgid "Allow Uploads"
msgstr "Hochladen erlauben" msgstr "Hochladen erlauben"
#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:103 #: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:105
msgid "Allow Edit" msgid "Allow Edit"
msgstr "Bearbeiten erlauben" msgstr "Bearbeiten erlauben"
#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 #: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:109
msgid "Allow Delete books" msgid "Allow Delete books"
msgstr "Löschen von Büchern erlauben" msgstr "Löschen von Büchern erlauben"
#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:112 #: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:114
msgid "Allow Changing Password" msgid "Allow Changing Password"
msgstr "Ändern des Passworts erlauben" msgstr "Ändern des Passworts erlauben"
#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:116 #: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:118
msgid "Allow Editing Public Shelfs" msgid "Allow Editing Public Shelfs"
msgstr "Editieren öffentlicher Bücherregale erlauben" msgstr "Editieren öffentlicher Bücherregale erlauben"
@ -1629,11 +1628,11 @@ msgstr "Editieren öffentlicher Bücherregale erlauben"
msgid "Default visibilities for new users" msgid "Default visibilities for new users"
msgstr "Standard-Sichtbarkeiten für neue Benutzer" msgstr "Standard-Sichtbarkeiten für neue Benutzer"
#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:74 #: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:76
msgid "Show random books in detail view" msgid "Show random books in detail view"
msgstr "Zeige zufällige Bücher in der Detailansicht" msgstr "Zeige zufällige Bücher in der Detailansicht"
#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:87 #: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:89
msgid "Show mature content" msgid "Show mature content"
msgstr "Erwachseneninhalte anzeigen" msgstr "Erwachseneninhalte anzeigen"
@ -1912,13 +1911,21 @@ msgstr "Passwort vergessen"
msgid "Log in with magic link" msgid "Log in with magic link"
msgstr "Einloggen mit magischem Link" msgstr "Einloggen mit magischem Link"
#: cps/templates/logviewer.html:5 #: cps/templates/logviewer.html:6
msgid "Show Calibre-Web log" msgid "Show Calibre-Web log: "
msgstr "Zeige Calibre-Web Logdatei" msgstr "Calibre-Web Logdatei anzeigen: "
#: cps/templates/logviewer.html:8
msgid "Calibre-Web log: "
msgstr "Calibre-Web Logdatei: "
#: cps/templates/logviewer.html:8 #: cps/templates/logviewer.html:8
msgid "Show access log" msgid "Stream output, can't be displayed"
msgstr "Zeige Zugriffslogdatei" msgstr "Stream Ausgabe, kann nicht angezeigt werden"
#: cps/templates/logviewer.html:12
msgid "Show access log: "
msgstr "Zugriffslogbuch anzeigen: "
#: cps/templates/osd.xml:5 #: cps/templates/osd.xml:5
msgid "Calibre-Web ebook catalog" msgid "Calibre-Web ebook catalog"
@ -2212,31 +2219,31 @@ msgstr "Benutzerpasswort zurücksetzen"
msgid "Kindle E-Mail" msgid "Kindle E-Mail"
msgstr "Kindle E-Mail" msgstr "Kindle E-Mail"
#: cps/templates/user_edit.html:39 #: cps/templates/user_edit.html:41
msgid "Show books with language" msgid "Show books with language"
msgstr "Zeige nur Bücher mit dieser Sprache" msgstr "Zeige nur Bücher mit dieser Sprache"
#: cps/templates/user_edit.html:41 #: cps/templates/user_edit.html:43
msgid "Show all" msgid "Show all"
msgstr "Zeige alle" msgstr "Zeige alle"
#: cps/templates/user_edit.html:51 #: cps/templates/user_edit.html:53
msgid "OAuth Settings" msgid "OAuth Settings"
msgstr "Oauth Einstellungen" msgstr "Oauth Einstellungen"
#: cps/templates/user_edit.html:53 #: cps/templates/user_edit.html:55
msgid "Link" msgid "Link"
msgstr "Verknüpfung herstellen" msgstr "Verknüpfung herstellen"
#: cps/templates/user_edit.html:55 #: cps/templates/user_edit.html:57
msgid "Unlink" msgid "Unlink"
msgstr "Verknüpfung entfernen" msgstr "Verknüpfung entfernen"
#: cps/templates/user_edit.html:123 #: cps/templates/user_edit.html:125
msgid "Delete this user" msgid "Delete this user"
msgstr "Benutzer löschen" msgstr "Benutzer löschen"
#: cps/templates/user_edit.html:138 #: cps/templates/user_edit.html:140
msgid "Recent Downloads" msgid "Recent Downloads"
msgstr "Letzte Downloads" msgstr "Letzte Downloads"
@ -2374,3 +2381,10 @@ msgstr "Letzte Downloads"
#~ msgid "New Books" #~ msgid "New Books"
#~ msgstr "Neue Bücher" #~ msgstr "Neue Bücher"
#~ msgid "Show Calibre-Web log"
#~ msgstr "Zeige Calibre-Web Logdatei"
#~ msgid "Show access log"
#~ msgstr "Zeige Zugriffslogdatei"

@ -7,8 +7,8 @@ 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: 2020-01-12 13:57+0100\n" "POT-Creation-Date: 2020-01-18 12:28+0100\n"
"PO-Revision-Date: 2019-11-14 18:50+0100\n" "PO-Revision-Date: 2020-01-18 11:22+0100\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"
"Language-Team: \n" "Language-Team: \n"
@ -60,7 +60,7 @@ msgstr "Calibre-Web konfiguration uppdaterad"
msgid "Basic Configuration" msgid "Basic Configuration"
msgstr "Grundläggande konfiguration" msgstr "Grundläggande konfiguration"
#: cps/admin.py:465 cps/web.py:1093 #: cps/admin.py:465 cps/web.py:1090
msgid "Please fill out all fields!" msgid "Please fill out all fields!"
msgstr "Fyll i alla fält!" msgstr "Fyll i alla fält!"
@ -69,7 +69,7 @@ msgstr "Fyll i alla fält!"
msgid "Add new user" msgid "Add new user"
msgstr "Lägg till ny användare" msgstr "Lägg till ny användare"
#: cps/admin.py:476 cps/web.py:1318 #: cps/admin.py:476 cps/web.py:1315
msgid "E-mail is not from valid domain" msgid "E-mail is not from valid domain"
msgstr "E-posten är inte från giltig domän" msgstr "E-posten är inte från giltig domän"
@ -98,7 +98,7 @@ msgstr "Det gick inte att skicka Testmeddelandet: %(res)s"
#: cps/admin.py:540 #: cps/admin.py:540
msgid "Please configure your e-mail address first..." msgid "Please configure your e-mail address first..."
msgstr "" msgstr "Vänligen konfigurera din e-postadress först..."
#: cps/admin.py:542 #: cps/admin.py:542
msgid "E-mail server settings updated" msgid "E-mail server settings updated"
@ -113,18 +113,18 @@ msgstr "Användaren '%(nick)s' borttagen"
msgid "No admin user remaining, can't delete user" msgid "No admin user remaining, can't delete user"
msgstr "Ingen adminstratörsanvändare kvar, kan inte ta bort användaren" msgstr "Ingen adminstratörsanvändare kvar, kan inte ta bort användaren"
#: cps/admin.py:612 cps/web.py:1359 #: cps/admin.py:612 cps/web.py:1356
msgid "Found an existing account for this e-mail address." msgid "Found an existing account for this e-mail address."
msgstr "Hittade ett befintligt konto för den här e-postadressen." msgstr "Hittade ett befintligt konto för den här e-postadressen."
#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1334 #: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1331
#, python-format #, python-format
msgid "Edit User %(nick)s" msgid "Edit User %(nick)s"
msgstr "Redigera användaren %(nick)s" msgstr "Redigera användaren %(nick)s"
#: cps/admin.py:622 cps/web.py:1327 #: cps/admin.py:622 cps/web.py:1324
msgid "This username is already taken" msgid "This username is already taken"
msgstr "" msgstr "Detta användarnamn är redan taget"
#: cps/admin.py:637 #: cps/admin.py:637
#, python-format #, python-format
@ -140,11 +140,11 @@ msgstr "Ett okänt fel uppstod."
msgid "Password for user %(user)s reset" msgid "Password for user %(user)s reset"
msgstr "Lösenord för användaren %(user)s återställd" msgstr "Lösenord för användaren %(user)s återställd"
#: cps/admin.py:660 cps/web.py:1118 cps/web.py:1174 #: cps/admin.py:660 cps/web.py:1115 cps/web.py:1171
msgid "An unknown error occurred. Please try again later." msgid "An unknown error occurred. Please try again later."
msgstr "Ett okänt fel uppstod. Försök igen senare." msgstr "Ett okänt fel uppstod. Försök igen senare."
#: cps/admin.py:663 cps/web.py:1062 #: cps/admin.py:663 cps/web.py:1059
msgid "Please configure the SMTP mail settings first..." msgid "Please configure the SMTP mail settings first..."
msgstr "Konfigurera SMTP-postinställningarna först..." msgstr "Konfigurera SMTP-postinställningarna först..."
@ -260,11 +260,11 @@ msgstr "Det gick inte att redigera boken, kontrollera loggfilen för mer informa
#: cps/editbooks.py:581 #: cps/editbooks.py:581
#, python-format #, python-format
msgid "File %(filename)s could not saved to temp dir" msgid "File %(filename)s could not saved to temp dir"
msgstr "" msgstr "Filen %(filename)s kunde inte sparas i temp dir"
#: cps/editbooks.py:598 #: cps/editbooks.py:598
msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgid "Uploaded book probably exists in the library, consider to change before upload new: "
msgstr "" msgstr "Uppladdad bok finns förmodligen i biblioteket, överväg att ändra innan du laddar upp nya: "
#: cps/editbooks.py:613 #: cps/editbooks.py:613
#, python-format #, python-format
@ -592,7 +592,7 @@ msgid "Show best rated books"
msgstr "Visa böcker med bästa betyg" msgstr "Visa böcker med bästa betyg"
#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67 #: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67
#: cps/web.py:1011 #: cps/web.py:1009
msgid "Read Books" msgid "Read Books"
msgstr "Lästa böcker" msgstr "Lästa böcker"
@ -601,7 +601,7 @@ msgid "Show read and unread"
msgstr "Visa lästa och olästa" msgstr "Visa lästa och olästa"
#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71 #: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71
#: cps/web.py:1015 #: cps/web.py:1013
msgid "Unread Books" msgid "Unread Books"
msgstr "Olästa böcker" msgstr "Olästa böcker"
@ -723,7 +723,7 @@ msgstr "Böcker"
msgid "Hot Books (most downloaded)" msgid "Hot Books (most downloaded)"
msgstr "Heta böcker (mest hämtade)" msgstr "Heta böcker (mest hämtade)"
#: cps/web.py:586 cps/web.py:1382 cps/web.py:1478 #: cps/web.py:586 cps/web.py:1379 cps/web.py:1475
msgid "Error opening eBook. File does not exist or file is not accessible:" msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr "Fel vid öppnande av e-bok. Filen finns inte eller filen är inte tillgänglig:" msgstr "Fel vid öppnande av e-bok. Filen finns inte eller filen är inte tillgänglig:"
@ -791,128 +791,128 @@ msgid "Tasks"
msgstr "Uppgifter" msgstr "Uppgifter"
#: cps/templates/feed.xml:33 cps/templates/layout.html:44 #: cps/templates/feed.xml:33 cps/templates/layout.html:44
#: cps/templates/layout.html:45 cps/web.py:829 cps/web.py:831 #: cps/templates/layout.html:45 cps/web.py:827 cps/web.py:829
msgid "Search" msgid "Search"
msgstr "Sök" msgstr "Sök"
#: cps/web.py:881 #: cps/web.py:879
msgid "Published after " msgid "Published after "
msgstr "Publicerad efter " msgstr "Publicerad efter "
#: cps/web.py:888 #: cps/web.py:886
msgid "Published before " msgid "Published before "
msgstr "Publicerad före " msgstr "Publicerad före "
#: cps/web.py:902 #: cps/web.py:900
#, python-format #, python-format
msgid "Rating <= %(rating)s" msgid "Rating <= %(rating)s"
msgstr "Betyg <= %(rating)s" msgstr "Betyg <= %(rating)s"
#: cps/web.py:904 #: cps/web.py:902
#, python-format #, python-format
msgid "Rating >= %(rating)s" msgid "Rating >= %(rating)s"
msgstr "Betyg >= %(rating)s" msgstr "Betyg >= %(rating)s"
#: cps/web.py:970 cps/web.py:982 #: cps/web.py:968 cps/web.py:980
msgid "search" msgid "search"
msgstr "sök" msgstr "sök"
#: cps/web.py:1067 #: cps/web.py:1064
#, python-format #, python-format
msgid "Book successfully queued for sending to %(kindlemail)s" msgid "Book successfully queued for sending to %(kindlemail)s"
msgstr "Boken är i kö för att skicka till %(kindlemail)s" msgstr "Boken är i kö för att skicka till %(kindlemail)s"
#: cps/web.py:1071 #: cps/web.py:1068
#, python-format #, python-format
msgid "There was an error sending this book: %(res)s" msgid "There was an error sending this book: %(res)s"
msgstr "Det gick inte att skicka den här boken: %(res)s" msgstr "Det gick inte att skicka den här boken: %(res)s"
#: cps/web.py:1073 #: cps/web.py:1070
msgid "Please configure your kindle e-mail address first..." msgid "Please configure your kindle e-mail address first..."
msgstr "Konfigurera din kindle-e-postadress först..." msgstr "Konfigurera din kindle-e-postadress först..."
#: cps/web.py:1087 #: cps/web.py:1084
msgid "E-Mail server is not configured, please contact your administrator!" msgid "E-Mail server is not configured, please contact your administrator!"
msgstr "" msgstr "E-postservern är inte konfigurerad, kontakta din administratör!"
#: cps/web.py:1088 cps/web.py:1094 cps/web.py:1119 cps/web.py:1123 #: cps/web.py:1085 cps/web.py:1091 cps/web.py:1116 cps/web.py:1120
#: cps/web.py:1128 cps/web.py:1132 #: cps/web.py:1125 cps/web.py:1129
msgid "register" msgid "register"
msgstr "registrera" msgstr "registrera"
#: cps/web.py:1121 #: cps/web.py:1118
msgid "Your e-mail is not allowed to register" msgid "Your e-mail is not allowed to register"
msgstr "Din e-post är inte tillåten att registrera" msgstr "Din e-post är inte tillåten att registrera"
#: cps/web.py:1124 #: cps/web.py:1121
msgid "Confirmation e-mail was send to your e-mail account." msgid "Confirmation e-mail was send to your e-mail account."
msgstr "Bekräftelsemail skickades till ditt e-postkonto." msgstr "Bekräftelsemail skickades till ditt e-postkonto."
#: cps/web.py:1127 #: cps/web.py:1124
msgid "This username or e-mail address is already in use." msgid "This username or e-mail address is already in use."
msgstr "Det här användarnamnet eller e-postadressen är redan i bruk." msgstr "Det här användarnamnet eller e-postadressen är redan i bruk."
#: cps/web.py:1144 #: cps/web.py:1141
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "Det går inte att aktivera LDAP-autentisering" msgstr "Det går inte att aktivera LDAP-autentisering"
#: cps/web.py:1154 cps/web.py:1281 #: cps/web.py:1151 cps/web.py:1278
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"
msgstr "du är nu inloggad som: \"%(nickname)s\"" msgstr "du är nu inloggad som: \"%(nickname)s\""
#: cps/web.py:1159 #: cps/web.py:1156
msgid "Could not login. LDAP server down, please contact your administrator" msgid "Could not login. LDAP server down, please contact your administrator"
msgstr "Det gick inte att logga in. LDAP-servern är nere, kontakta din administratör" msgstr "Det gick inte att logga in. LDAP-servern är nere, kontakta din administratör"
#: cps/web.py:1163 cps/web.py:1186 #: cps/web.py:1160 cps/web.py:1183
msgid "Wrong Username or Password" msgid "Wrong Username or Password"
msgstr "Fel användarnamn eller lösenord" msgstr "Fel användarnamn eller lösenord"
#: cps/web.py:1170 #: cps/web.py:1167
msgid "New Password was send to your email address" msgid "New Password was send to your email address"
msgstr "" msgstr "Nytt lösenord skickades till din e-postadress"
#: cps/web.py:1176 #: cps/web.py:1173
msgid "Please enter valid username to reset password" msgid "Please enter valid username to reset password"
msgstr "" msgstr "Ange giltigt användarnamn för att återställa lösenordet"
#: cps/web.py:1182 #: cps/web.py:1179
#, python-format #, python-format
msgid "You are now logged in as: '%(nickname)s'" msgid "You are now logged in as: '%(nickname)s'"
msgstr "Du är nu inloggad som: \"%(nickname)s\"" msgstr "Du är nu inloggad som: \"%(nickname)s\""
#: cps/web.py:1189 cps/web.py:1213 #: cps/web.py:1186 cps/web.py:1210
msgid "login" msgid "login"
msgstr "logga in" msgstr "logga in"
#: cps/web.py:1225 cps/web.py:1259 #: cps/web.py:1222 cps/web.py:1256
msgid "Token not found" msgid "Token not found"
msgstr "Token hittades inte" msgstr "Token hittades inte"
#: cps/web.py:1234 cps/web.py:1267 #: cps/web.py:1231 cps/web.py:1264
msgid "Token has expired" msgid "Token has expired"
msgstr "Token har löpt ut" msgstr "Token har löpt ut"
#: cps/web.py:1243 #: cps/web.py:1240
msgid "Success! Please return to your device" msgid "Success! Please return to your device"
msgstr "Lyckades! Vänligen återvänd till din enhet" msgstr "Lyckades! Vänligen återvänd till din enhet"
#: cps/web.py:1320 cps/web.py:1363 cps/web.py:1369 #: cps/web.py:1317 cps/web.py:1360 cps/web.py:1366
#, python-format #, python-format
msgid "%(name)s's profile" msgid "%(name)s's profile"
msgstr "%(name)ss profil" msgstr "%(name)ss profil"
#: cps/web.py:1365 #: cps/web.py:1362
msgid "Profile updated" msgid "Profile updated"
msgstr "Profilen uppdaterad" msgstr "Profilen uppdaterad"
#: cps/web.py:1394 cps/web.py:1397 cps/web.py:1400 cps/web.py:1407 #: cps/web.py:1391 cps/web.py:1394 cps/web.py:1397 cps/web.py:1404
#: cps/web.py:1412 #: cps/web.py:1409
msgid "Read a Book" msgid "Read a Book"
msgstr "Läs en bok" msgstr "Läs en bok"
#: cps/web.py:1423 #: cps/web.py:1420
msgid "Error opening eBook. File does not exist or file is not accessible." msgid "Error opening eBook. File does not exist or file is not accessible."
msgstr "Fel vid öppningen av e-boken. Filen finns inte eller filen är inte tillgänglig." msgstr "Fel vid öppningen av e-boken. Filen finns inte eller filen är inte tillgänglig."
@ -1034,11 +1034,11 @@ msgstr "Fjärrinloggning"
#: cps/templates/admin.html:104 #: cps/templates/admin.html:104
msgid "Reverse proxy login" msgid "Reverse proxy login"
msgstr "" msgstr "Omvänd proxy inloggning"
#: cps/templates/admin.html:109 #: cps/templates/admin.html:109
msgid "Reverse proxy header name" msgid "Reverse proxy header name"
msgstr "" msgstr "Omvänt proxy rubriknamn"
#: cps/templates/admin.html:121 #: cps/templates/admin.html:121
msgid "Administration" msgid "Administration"
@ -1099,7 +1099,7 @@ msgstr "Ok"
#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92
#: cps/templates/layout.html:28 cps/templates/shelf.html:73 #: cps/templates/layout.html:28 cps/templates/shelf.html:73
#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32 #: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32
#: cps/templates/user_edit.html:131 #: cps/templates/user_edit.html:133
msgid "Back" msgid "Back"
msgstr "Tillbaka" msgstr "Tillbaka"
@ -1212,7 +1212,7 @@ msgstr "Publiceringsdatum"
msgid "Publisher" msgid "Publisher"
msgstr "Förlag" msgstr "Förlag"
#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:30 #: cps/templates/book_edit.html:103 cps/templates/user_edit.html:31
msgid "Language" msgid "Language"
msgstr "Språk" msgstr "Språk"
@ -1239,7 +1239,7 @@ msgstr "Hämta metadata"
#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329 #: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329
#: cps/templates/config_view_edit.html:146 cps/templates/login.html:20 #: cps/templates/config_view_edit.html:146 cps/templates/login.html:20
#: cps/templates/search_form.html:170 cps/templates/shelf_edit.html:17 #: cps/templates/search_form.html:170 cps/templates/shelf_edit.html:17
#: cps/templates/user_edit.html:129 #: cps/templates/user_edit.html:131
msgid "Submit" msgid "Submit"
msgstr "Skicka" msgstr "Skicka"
@ -1505,11 +1505,11 @@ msgstr "%(provider)s OAuth-klient-hemlighet"
#: cps/templates/config_edit.html:276 #: cps/templates/config_edit.html:276
msgid "Allow Reverse Proxy Authentication" msgid "Allow Reverse Proxy Authentication"
msgstr "" msgstr "Tillåt omvänd proxyautentisering"
#: cps/templates/config_edit.html:280 #: cps/templates/config_edit.html:280
msgid "Reverse Proxy Header Name" msgid "Reverse Proxy Header Name"
msgstr "" msgstr "Omvänt proxy rubriknamn"
#: cps/templates/config_edit.html:292 #: cps/templates/config_edit.html:292
msgid "External binaries" msgid "External binaries"
@ -1592,35 +1592,35 @@ msgstr "Taggar för vuxeninnehåll"
msgid "Default settings for new users" msgid "Default settings for new users"
msgstr "Standardinställningar för nya användare" msgstr "Standardinställningar för nya användare"
#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:82 #: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:84
msgid "Admin user" msgid "Admin user"
msgstr "Adminstratör användare" msgstr "Adminstratör användare"
#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:91 #: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:93
msgid "Allow Downloads" msgid "Allow Downloads"
msgstr "Tillåt Hämtningar" msgstr "Tillåt Hämtningar"
#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:95 #: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:97
msgid "Allow book viewer" msgid "Allow book viewer"
msgstr "Tillåt bokvisare" msgstr "Tillåt bokvisare"
#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:99 #: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:101
msgid "Allow Uploads" msgid "Allow Uploads"
msgstr "Tillåt Uppladdningar" msgstr "Tillåt Uppladdningar"
#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:103 #: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:105
msgid "Allow Edit" msgid "Allow Edit"
msgstr "Tillåt Redigera" msgstr "Tillåt Redigera"
#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 #: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:109
msgid "Allow Delete books" msgid "Allow Delete books"
msgstr "Tillåt Ta bort böcker" msgstr "Tillåt Ta bort böcker"
#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:112 #: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:114
msgid "Allow Changing Password" msgid "Allow Changing Password"
msgstr "Tillåt Ändra lösenord" msgstr "Tillåt Ändra lösenord"
#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:116 #: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:118
msgid "Allow Editing Public Shelfs" msgid "Allow Editing Public Shelfs"
msgstr "Tillåt Redigering av offentliga hyllor" msgstr "Tillåt Redigering av offentliga hyllor"
@ -1628,11 +1628,11 @@ msgstr "Tillåt Redigering av offentliga hyllor"
msgid "Default visibilities for new users" msgid "Default visibilities for new users"
msgstr "Standardvisibiliteter för nya användare" msgstr "Standardvisibiliteter för nya användare"
#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:74 #: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:76
msgid "Show random books in detail view" msgid "Show random books in detail view"
msgstr "Visa slumpmässiga böcker i detaljvyn" msgstr "Visa slumpmässiga böcker i detaljvyn"
#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:87 #: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:89
msgid "Show mature content" msgid "Show mature content"
msgstr "Visa vuxeninnehåll" msgstr "Visa vuxeninnehåll"
@ -1734,7 +1734,7 @@ msgstr "Ange domännamn"
#: cps/templates/email_edit.html:60 #: cps/templates/email_edit.html:60
msgid "Denied domains for registering" msgid "Denied domains for registering"
msgstr "" msgstr "Nekade domäner för registrering"
#: cps/templates/email_edit.html:90 #: cps/templates/email_edit.html:90
msgid "Do you really want to delete this domain rule?" msgid "Do you really want to delete this domain rule?"
@ -1774,7 +1774,7 @@ msgstr "Populära publikationer från den här katalogen baserad på betyg."
#: cps/templates/index.xml:31 #: cps/templates/index.xml:31
msgid "Recently added Books" msgid "Recently added Books"
msgstr "" msgstr "Senaste tillagda böcker"
#: cps/templates/index.xml:35 #: cps/templates/index.xml:35
msgid "The latest Books" msgid "The latest Books"
@ -1802,11 +1802,11 @@ msgstr "Böcker ordnade efter serier"
#: cps/templates/index.xml:93 #: cps/templates/index.xml:93
msgid "Books ordered by Languages" msgid "Books ordered by Languages"
msgstr "" msgstr "Böcker ordnade efter språk"
#: cps/templates/index.xml:100 #: cps/templates/index.xml:100
msgid "Books ordered by file formats" msgid "Books ordered by file formats"
msgstr "" msgstr "Böcker ordnade av filformat"
#: cps/templates/index.xml:103 cps/templates/layout.html:137 #: cps/templates/index.xml:103 cps/templates/layout.html:137
msgid "Public Shelves" msgid "Public Shelves"
@ -1905,19 +1905,27 @@ msgstr "Kom ihåg mig"
#: cps/templates/login.html:22 #: cps/templates/login.html:22
msgid "Forgot password" msgid "Forgot password"
msgstr "" msgstr "Glömt lösenord"
#: cps/templates/login.html:25 #: cps/templates/login.html:25
msgid "Log in with magic link" msgid "Log in with magic link"
msgstr "Logga in med magisk länk" msgstr "Logga in med magisk länk"
#: cps/templates/logviewer.html:5 #: cps/templates/logviewer.html:6
msgid "Show Calibre-Web log" msgid "Show Calibre-Web log: "
msgstr "Visa Calibre-Web-logg" msgstr "Visa Calibre-Web-logg: "
#: cps/templates/logviewer.html:8 #: cps/templates/logviewer.html:8
msgid "Show access log" msgid "Calibre-Web log: "
msgstr "Visa åtkomstlogg" msgstr "Visa åtkomstlogg: "
#: cps/templates/logviewer.html:8
msgid "Stream output, can't be displayed"
msgstr "Strömutmatning kan inte visas"
#: cps/templates/logviewer.html:12
msgid "Show access log: "
msgstr "Visa åtkomstlogg: "
#: cps/templates/osd.xml:5 #: cps/templates/osd.xml:5
msgid "Calibre-Web ebook catalog" msgid "Calibre-Web ebook catalog"
@ -2093,11 +2101,11 @@ msgstr "Uteslut språk"
#: cps/templates/search_form.html:95 #: cps/templates/search_form.html:95
msgid "Extensions" msgid "Extensions"
msgstr "" msgstr "Tillägg"
#: cps/templates/search_form.html:105 #: cps/templates/search_form.html:105
msgid "Exclude Extensions" msgid "Exclude Extensions"
msgstr "" msgstr "Uteslut tillägg"
#: cps/templates/search_form.html:117 #: cps/templates/search_form.html:117
msgid "Rating bigger than" msgid "Rating bigger than"
@ -2211,31 +2219,31 @@ msgstr "Återställ användarlösenordet"
msgid "Kindle E-Mail" msgid "Kindle E-Mail"
msgstr "Kindle e-post" msgstr "Kindle e-post"
#: cps/templates/user_edit.html:39 #: cps/templates/user_edit.html:41
msgid "Show books with language" msgid "Show books with language"
msgstr "Visa böcker med språk" msgstr "Visa böcker med språk"
#: cps/templates/user_edit.html:41 #: cps/templates/user_edit.html:43
msgid "Show all" msgid "Show all"
msgstr "Visa alla" msgstr "Visa alla"
#: cps/templates/user_edit.html:51 #: cps/templates/user_edit.html:53
msgid "OAuth Settings" msgid "OAuth Settings"
msgstr "OAuth-inställningar" msgstr "OAuth-inställningar"
#: cps/templates/user_edit.html:53 #: cps/templates/user_edit.html:55
msgid "Link" msgid "Link"
msgstr "Koppla" msgstr "Koppla"
#: cps/templates/user_edit.html:55 #: cps/templates/user_edit.html:57
msgid "Unlink" msgid "Unlink"
msgstr "Koppla bort" msgstr "Koppla bort"
#: cps/templates/user_edit.html:123 #: cps/templates/user_edit.html:125
msgid "Delete this user" msgid "Delete this user"
msgstr "Ta bort den här användaren" msgstr "Ta bort den här användaren"
#: cps/templates/user_edit.html:138 #: cps/templates/user_edit.html:140
msgid "Recent Downloads" msgid "Recent Downloads"
msgstr "Senaste hämtningar" msgstr "Senaste hämtningar"
@ -2458,3 +2466,9 @@ msgstr "Senaste hämtningar"
#~ msgid "New Books" #~ msgid "New Books"
#~ msgstr "Nya böcker" #~ msgstr "Nya böcker"
#~ msgid "Show Calibre-Web log"
#~ msgstr "Visa Calibre-Web-logg"
#~ msgid "Show access log"
#~ msgstr "Visa åtkomstlogg"

@ -479,7 +479,8 @@ def migrate_Database(session):
def clean_database(session): def clean_database(session):
# Remove expired remote login tokens # Remove expired remote login tokens
now = datetime.datetime.now() now = datetime.datetime.now()
session.query(RemoteAuthToken).filter(now > RemoteAuthToken.expiration).delete() session.query(RemoteAuthToken).filter(now > RemoteAuthToken.expiration).\
filter(RemoteAuthToken.token_type !=1 ).delete()
session.commit() session.commit()

@ -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: 2020-01-12 13:57+0100\n" "POT-Creation-Date: 2020-01-18 12:04+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"
@ -59,7 +59,7 @@ msgstr ""
msgid "Basic Configuration" msgid "Basic Configuration"
msgstr "" msgstr ""
#: cps/admin.py:465 cps/web.py:1093 #: cps/admin.py:465 cps/web.py:1090
msgid "Please fill out all fields!" msgid "Please fill out all fields!"
msgstr "" msgstr ""
@ -68,7 +68,7 @@ msgstr ""
msgid "Add new user" msgid "Add new user"
msgstr "" msgstr ""
#: cps/admin.py:476 cps/web.py:1318 #: cps/admin.py:476 cps/web.py:1315
msgid "E-mail is not from valid domain" msgid "E-mail is not from valid domain"
msgstr "" msgstr ""
@ -112,16 +112,16 @@ msgstr ""
msgid "No admin user remaining, can't delete user" msgid "No admin user remaining, can't delete user"
msgstr "" msgstr ""
#: cps/admin.py:612 cps/web.py:1359 #: cps/admin.py:612 cps/web.py:1356
msgid "Found an existing account for this e-mail address." msgid "Found an existing account for this e-mail address."
msgstr "" msgstr ""
#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1334 #: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1331
#, python-format #, python-format
msgid "Edit User %(nick)s" msgid "Edit User %(nick)s"
msgstr "" msgstr ""
#: cps/admin.py:622 cps/web.py:1327 #: cps/admin.py:622 cps/web.py:1324
msgid "This username is already taken" msgid "This username is already taken"
msgstr "" msgstr ""
@ -139,11 +139,11 @@ msgstr ""
msgid "Password for user %(user)s reset" msgid "Password for user %(user)s reset"
msgstr "" msgstr ""
#: cps/admin.py:660 cps/web.py:1118 cps/web.py:1174 #: cps/admin.py:660 cps/web.py:1115 cps/web.py:1171
msgid "An unknown error occurred. Please try again later." msgid "An unknown error occurred. Please try again later."
msgstr "" msgstr ""
#: cps/admin.py:663 cps/web.py:1062 #: cps/admin.py:663 cps/web.py:1059
msgid "Please configure the SMTP mail settings first..." msgid "Please configure the SMTP mail settings first..."
msgstr "" msgstr ""
@ -591,7 +591,7 @@ msgid "Show best rated books"
msgstr "" msgstr ""
#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67 #: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67
#: cps/web.py:1011 #: cps/web.py:1009
msgid "Read Books" msgid "Read Books"
msgstr "" msgstr ""
@ -600,7 +600,7 @@ msgid "Show read and unread"
msgstr "" msgstr ""
#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71 #: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71
#: cps/web.py:1015 #: cps/web.py:1013
msgid "Unread Books" msgid "Unread Books"
msgstr "" msgstr ""
@ -722,7 +722,7 @@ msgstr ""
msgid "Hot Books (most downloaded)" msgid "Hot Books (most downloaded)"
msgstr "" msgstr ""
#: cps/web.py:586 cps/web.py:1382 cps/web.py:1478 #: cps/web.py:586 cps/web.py:1379 cps/web.py:1475
msgid "Error opening eBook. File does not exist or file is not accessible:" msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr "" msgstr ""
@ -790,128 +790,128 @@ msgid "Tasks"
msgstr "" msgstr ""
#: cps/templates/feed.xml:33 cps/templates/layout.html:44 #: cps/templates/feed.xml:33 cps/templates/layout.html:44
#: cps/templates/layout.html:45 cps/web.py:829 cps/web.py:831 #: cps/templates/layout.html:45 cps/web.py:827 cps/web.py:829
msgid "Search" msgid "Search"
msgstr "" msgstr ""
#: cps/web.py:881 #: cps/web.py:879
msgid "Published after " msgid "Published after "
msgstr "" msgstr ""
#: cps/web.py:888 #: cps/web.py:886
msgid "Published before " msgid "Published before "
msgstr "" msgstr ""
#: cps/web.py:902 #: cps/web.py:900
#, python-format #, python-format
msgid "Rating <= %(rating)s" msgid "Rating <= %(rating)s"
msgstr "" msgstr ""
#: cps/web.py:904 #: cps/web.py:902
#, python-format #, python-format
msgid "Rating >= %(rating)s" msgid "Rating >= %(rating)s"
msgstr "" msgstr ""
#: cps/web.py:970 cps/web.py:982 #: cps/web.py:968 cps/web.py:980
msgid "search" msgid "search"
msgstr "" msgstr ""
#: cps/web.py:1067 #: cps/web.py:1064
#, python-format #, python-format
msgid "Book successfully queued for sending to %(kindlemail)s" msgid "Book successfully queued for sending to %(kindlemail)s"
msgstr "" msgstr ""
#: cps/web.py:1071 #: cps/web.py:1068
#, python-format #, python-format
msgid "There was an error sending this book: %(res)s" msgid "There was an error sending this book: %(res)s"
msgstr "" msgstr ""
#: cps/web.py:1073 #: cps/web.py:1070
msgid "Please configure your kindle e-mail address first..." msgid "Please configure your kindle e-mail address first..."
msgstr "" msgstr ""
#: cps/web.py:1087 #: cps/web.py:1084
msgid "E-Mail server is not configured, please contact your administrator!" msgid "E-Mail server is not configured, please contact your administrator!"
msgstr "" msgstr ""
#: cps/web.py:1088 cps/web.py:1094 cps/web.py:1119 cps/web.py:1123 #: cps/web.py:1085 cps/web.py:1091 cps/web.py:1116 cps/web.py:1120
#: cps/web.py:1128 cps/web.py:1132 #: cps/web.py:1125 cps/web.py:1129
msgid "register" msgid "register"
msgstr "" msgstr ""
#: cps/web.py:1121 #: cps/web.py:1118
msgid "Your e-mail is not allowed to register" msgid "Your e-mail is not allowed to register"
msgstr "" msgstr ""
#: cps/web.py:1124 #: cps/web.py:1121
msgid "Confirmation e-mail was send to your e-mail account." msgid "Confirmation e-mail was send to your e-mail account."
msgstr "" msgstr ""
#: cps/web.py:1127 #: cps/web.py:1124
msgid "This username or e-mail address is already in use." msgid "This username or e-mail address is already in use."
msgstr "" msgstr ""
#: cps/web.py:1144 #: cps/web.py:1141
msgid "Cannot activate LDAP authentication" msgid "Cannot activate LDAP authentication"
msgstr "" msgstr ""
#: cps/web.py:1154 cps/web.py:1281 #: cps/web.py:1151 cps/web.py:1278
#, python-format #, python-format
msgid "you are now logged in as: '%(nickname)s'" msgid "you are now logged in as: '%(nickname)s'"
msgstr "" msgstr ""
#: cps/web.py:1159 #: cps/web.py:1156
msgid "Could not login. LDAP server down, please contact your administrator" msgid "Could not login. LDAP server down, please contact your administrator"
msgstr "" msgstr ""
#: cps/web.py:1163 cps/web.py:1186 #: cps/web.py:1160 cps/web.py:1183
msgid "Wrong Username or Password" msgid "Wrong Username or Password"
msgstr "" msgstr ""
#: cps/web.py:1170 #: cps/web.py:1167
msgid "New Password was send to your email address" msgid "New Password was send to your email address"
msgstr "" msgstr ""
#: cps/web.py:1176 #: cps/web.py:1173
msgid "Please enter valid username to reset password" msgid "Please enter valid username to reset password"
msgstr "" msgstr ""
#: cps/web.py:1182 #: cps/web.py:1179
#, python-format #, python-format
msgid "You are now logged in as: '%(nickname)s'" msgid "You are now logged in as: '%(nickname)s'"
msgstr "" msgstr ""
#: cps/web.py:1189 cps/web.py:1213 #: cps/web.py:1186 cps/web.py:1210
msgid "login" msgid "login"
msgstr "" msgstr ""
#: cps/web.py:1225 cps/web.py:1259 #: cps/web.py:1222 cps/web.py:1256
msgid "Token not found" msgid "Token not found"
msgstr "" msgstr ""
#: cps/web.py:1234 cps/web.py:1267 #: cps/web.py:1231 cps/web.py:1264
msgid "Token has expired" msgid "Token has expired"
msgstr "" msgstr ""
#: cps/web.py:1243 #: cps/web.py:1240
msgid "Success! Please return to your device" msgid "Success! Please return to your device"
msgstr "" msgstr ""
#: cps/web.py:1320 cps/web.py:1363 cps/web.py:1369 #: cps/web.py:1317 cps/web.py:1360 cps/web.py:1366
#, python-format #, python-format
msgid "%(name)s's profile" msgid "%(name)s's profile"
msgstr "" msgstr ""
#: cps/web.py:1365 #: cps/web.py:1362
msgid "Profile updated" msgid "Profile updated"
msgstr "" msgstr ""
#: cps/web.py:1394 cps/web.py:1397 cps/web.py:1400 cps/web.py:1407 #: cps/web.py:1391 cps/web.py:1394 cps/web.py:1397 cps/web.py:1404
#: cps/web.py:1412 #: cps/web.py:1409
msgid "Read a Book" msgid "Read a Book"
msgstr "" msgstr ""
#: cps/web.py:1423 #: cps/web.py:1420
msgid "Error opening eBook. File does not exist or file is not accessible." msgid "Error opening eBook. File does not exist or file is not accessible."
msgstr "" msgstr ""
@ -1098,7 +1098,7 @@ msgstr ""
#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92 #: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92
#: cps/templates/layout.html:28 cps/templates/shelf.html:73 #: cps/templates/layout.html:28 cps/templates/shelf.html:73
#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32 #: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32
#: cps/templates/user_edit.html:131 #: cps/templates/user_edit.html:133
msgid "Back" msgid "Back"
msgstr "" msgstr ""
@ -1211,7 +1211,7 @@ msgstr ""
msgid "Publisher" msgid "Publisher"
msgstr "" msgstr ""
#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:30 #: cps/templates/book_edit.html:103 cps/templates/user_edit.html:31
msgid "Language" msgid "Language"
msgstr "" msgstr ""
@ -1238,7 +1238,7 @@ msgstr ""
#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329 #: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329
#: cps/templates/config_view_edit.html:146 cps/templates/login.html:20 #: cps/templates/config_view_edit.html:146 cps/templates/login.html:20
#: cps/templates/search_form.html:170 cps/templates/shelf_edit.html:17 #: cps/templates/search_form.html:170 cps/templates/shelf_edit.html:17
#: cps/templates/user_edit.html:129 #: cps/templates/user_edit.html:131
msgid "Submit" msgid "Submit"
msgstr "" msgstr ""
@ -1591,35 +1591,35 @@ msgstr ""
msgid "Default settings for new users" msgid "Default settings for new users"
msgstr "" msgstr ""
#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:82 #: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:84
msgid "Admin user" msgid "Admin user"
msgstr "" msgstr ""
#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:91 #: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:93
msgid "Allow Downloads" msgid "Allow Downloads"
msgstr "" msgstr ""
#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:95 #: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:97
msgid "Allow book viewer" msgid "Allow book viewer"
msgstr "" msgstr ""
#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:99 #: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:101
msgid "Allow Uploads" msgid "Allow Uploads"
msgstr "" msgstr ""
#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:103 #: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:105
msgid "Allow Edit" msgid "Allow Edit"
msgstr "" msgstr ""
#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 #: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:109
msgid "Allow Delete books" msgid "Allow Delete books"
msgstr "" msgstr ""
#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:112 #: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:114
msgid "Allow Changing Password" msgid "Allow Changing Password"
msgstr "" msgstr ""
#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:116 #: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:118
msgid "Allow Editing Public Shelfs" msgid "Allow Editing Public Shelfs"
msgstr "" msgstr ""
@ -1627,11 +1627,11 @@ msgstr ""
msgid "Default visibilities for new users" msgid "Default visibilities for new users"
msgstr "" msgstr ""
#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:74 #: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:76
msgid "Show random books in detail view" msgid "Show random books in detail view"
msgstr "" msgstr ""
#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:87 #: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:89
msgid "Show mature content" msgid "Show mature content"
msgstr "" msgstr ""
@ -1910,12 +1910,20 @@ msgstr ""
msgid "Log in with magic link" msgid "Log in with magic link"
msgstr "" msgstr ""
#: cps/templates/logviewer.html:5 #: cps/templates/logviewer.html:6
msgid "Show Calibre-Web log" msgid "Show Calibre-Web log: "
msgstr "" msgstr ""
#: cps/templates/logviewer.html:8 #: cps/templates/logviewer.html:8
msgid "Show access log" msgid "Calibre-Web log: "
msgstr ""
#: cps/templates/logviewer.html:8
msgid "Stream output, can't be displayed"
msgstr ""
#: cps/templates/logviewer.html:12
msgid "Show access log: "
msgstr "" msgstr ""
#: cps/templates/osd.xml:5 #: cps/templates/osd.xml:5
@ -2210,31 +2218,31 @@ msgstr ""
msgid "Kindle E-Mail" msgid "Kindle E-Mail"
msgstr "" msgstr ""
#: cps/templates/user_edit.html:39 #: cps/templates/user_edit.html:41
msgid "Show books with language" msgid "Show books with language"
msgstr "" msgstr ""
#: cps/templates/user_edit.html:41 #: cps/templates/user_edit.html:43
msgid "Show all" msgid "Show all"
msgstr "" msgstr ""
#: cps/templates/user_edit.html:51 #: cps/templates/user_edit.html:53
msgid "OAuth Settings" msgid "OAuth Settings"
msgstr "" msgstr ""
#: cps/templates/user_edit.html:53 #: cps/templates/user_edit.html:55
msgid "Link" msgid "Link"
msgstr "" msgstr ""
#: cps/templates/user_edit.html:55 #: cps/templates/user_edit.html:57
msgid "Unlink" msgid "Unlink"
msgstr "" msgstr ""
#: cps/templates/user_edit.html:123 #: cps/templates/user_edit.html:125
msgid "Delete this user" msgid "Delete this user"
msgstr "" msgstr ""
#: cps/templates/user_edit.html:138 #: cps/templates/user_edit.html:140
msgid "Recent Downloads" msgid "Recent Downloads"
msgstr "" msgstr ""

@ -31,7 +31,7 @@ rarfile>=2.7
# other # other
natsort>=2.2.0 natsort>=2.2.0
git+https://github.com/OzzieIsaacs/comicapi.git@5346716578b2843f54d522f44d01bc8d25001d24#egg=comicapi git+https://github.com/OzzieIsaacs/comicapi.git@ad8bfe5a1c31db882480433f86db2c5c57634a3f#egg=comicapi
#kobo integration #kobo integration
jsonschema>=3.2.0 jsonschema>=3.2.0

Loading…
Cancel
Save