1
0
mirror of https://github.com/janeczku/calibre-web synced 2024-11-16 23:04:54 +00:00

Merge branch 'master' into Develop

This commit is contained in:
Ozzie Isaacs 2024-09-21 12:40:05 +02:00
commit 24252e09b4
70 changed files with 5338 additions and 772 deletions

View File

@ -0,0 +1,22 @@
#
# Copyright 2015 Jordan Milne
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Source: https://github.com/JordanMilne/Advocate
from .adapters import ValidatingHTTPAdapter
from .api import *
from .addrvalidator import AddrValidator
from .exceptions import UnacceptableAddressException

View File

@ -0,0 +1,48 @@
#
# Copyright 2015 Jordan Milne
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Source: https://github.com/JordanMilne/Advocate
from requests.adapters import HTTPAdapter, DEFAULT_POOLBLOCK
from .addrvalidator import AddrValidator
from .exceptions import ProxyDisabledException
from .poolmanager import ValidatingPoolManager
class ValidatingHTTPAdapter(HTTPAdapter):
__attrs__ = HTTPAdapter.__attrs__ + ['_validator']
def __init__(self, *args, **kwargs):
self._validator = kwargs.pop('validator', None)
if not self._validator:
self._validator = AddrValidator()
super().__init__(*args, **kwargs)
def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK,
**pool_kwargs):
self._pool_connections = connections
self._pool_maxsize = maxsize
self._pool_block = block
self.poolmanager = ValidatingPoolManager(
num_pools=connections,
maxsize=maxsize,
block=block,
validator=self._validator,
**pool_kwargs
)
def proxy_manager_for(self, proxy, **proxy_kwargs):
raise ProxyDisabledException("Proxies cannot be used with Advocate")

View File

@ -0,0 +1,281 @@
#
# Copyright 2015 Jordan Milne
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Source: https://github.com/JordanMilne/Advocate
import functools
import fnmatch
import ipaddress
import re
try:
import netifaces
HAVE_NETIFACES = True
except ImportError:
netifaces = None
HAVE_NETIFACES = False
from .exceptions import NameserverException, ConfigException
def canonicalize_hostname(hostname):
"""Lowercase and punycodify a hostname"""
# We do the lowercasing after IDNA encoding because we only want to
# lowercase the *ASCII* chars.
# TODO: The differences between IDNA2003 and IDNA2008 might be relevant
# to us, but both specs are damn confusing.
return str(hostname.encode("idna").lower(), 'utf-8')
def determine_local_addresses():
"""Get all IPs that refer to this machine according to netifaces"""
if not HAVE_NETIFACES:
raise ConfigException("Tried to determine local addresses, "
"but netifaces module was not importable")
ips = []
for interface in netifaces.interfaces():
if_families = netifaces.ifaddresses(interface)
for family_kind in {netifaces.AF_INET, netifaces.AF_INET6}:
addrs = if_families.get(family_kind, [])
for addr in (x.get("addr", "") for x in addrs):
if family_kind == netifaces.AF_INET6:
# We can't do anything sensible with the scope here
addr = addr.split("%")[0]
ips.append(ipaddress.ip_network(addr))
return ips
def add_local_address_arg(func):
"""Add the "_local_addresses" kwarg if it's missing
IMO this information shouldn't be cached between calls (what if one of the
adapters got a new IP at runtime?,) and we don't want each function to
recalculate it. Just recalculate it if the caller didn't provide it for us.
"""
@functools.wraps(func)
def wrapper(self, *args, **kwargs):
if "_local_addresses" not in kwargs:
if self.autodetect_local_addresses:
kwargs["_local_addresses"] = determine_local_addresses()
else:
kwargs["_local_addresses"] = []
return func(self, *args, **kwargs)
return wrapper
class AddrValidator:
_6TO4_RELAY_NET = ipaddress.ip_network("192.88.99.0/24")
# Just the well known prefix, DNS64 servers can set their own
# prefix, but in practice most probably don't.
_DNS64_WK_PREFIX = ipaddress.ip_network("64:ff9b::/96")
DEFAULT_PORT_WHITELIST = {80, 8080, 443, 8443, 8000}
def __init__(
self,
ip_blacklist=None,
ip_whitelist=None,
port_whitelist=None,
port_blacklist=None,
hostname_blacklist=None,
allow_ipv6=False,
allow_teredo=False,
allow_6to4=False,
allow_dns64=False,
# Must be explicitly set to "False" if you don't want to try
# detecting local interface addresses with netifaces.
autodetect_local_addresses=True,
):
if not port_blacklist and not port_whitelist:
# An assortment of common HTTPS? ports.
port_whitelist = self.DEFAULT_PORT_WHITELIST.copy()
self.ip_blacklist = ip_blacklist or set()
self.ip_whitelist = ip_whitelist or set()
self.port_blacklist = port_blacklist or set()
self.port_whitelist = port_whitelist or set()
# TODO: ATM this can contain either regexes or globs that are converted
# to regexes upon every check. Create a collection that automagically
# converts them to regexes on insert?
self.hostname_blacklist = hostname_blacklist or set()
self.allow_ipv6 = allow_ipv6
self.allow_teredo = allow_teredo
self.allow_6to4 = allow_6to4
self.allow_dns64 = allow_dns64
self.autodetect_local_addresses = autodetect_local_addresses
@add_local_address_arg
def is_ip_allowed(self, addr_ip, _local_addresses=None):
if not isinstance(addr_ip,
(ipaddress.IPv4Address, ipaddress.IPv6Address)):
addr_ip = ipaddress.ip_address(addr_ip)
# The whitelist should take precedence over the blacklist so we can
# punch holes in blacklisted ranges
if any(addr_ip in net for net in self.ip_whitelist):
return True
if any(addr_ip in net for net in self.ip_blacklist):
return False
if any(addr_ip in net for net in _local_addresses):
return False
if addr_ip.version == 4:
if not addr_ip.is_private:
# IPs for carrier-grade NAT. Seems weird that it doesn't set
# `is_private`, but we need to check `not is_global`
if not ipaddress.ip_network(addr_ip).is_global:
return False
elif addr_ip.version == 6:
# You'd better have a good reason for enabling IPv6
# because Advocate's techniques don't work well without NAT.
if not self.allow_ipv6:
return False
# v6 addresses can also map to IPv4 addresses! Tricky!
v4_nested = []
if addr_ip.ipv4_mapped:
v4_nested.append(addr_ip.ipv4_mapped)
# WTF IPv6? Why you gotta have a billion tunneling mechanisms?
# XXX: Do we even really care about these? If we're tunneling
# through public servers we shouldn't be able to access
# addresses on our private network, right?
if addr_ip.sixtofour:
if not self.allow_6to4:
return False
v4_nested.append(addr_ip.sixtofour)
if addr_ip.teredo:
if not self.allow_teredo:
return False
# Check both the client *and* server IPs
v4_nested.extend(addr_ip.teredo)
if addr_ip in self._DNS64_WK_PREFIX:
if not self.allow_dns64:
return False
# When using the well-known prefix the last 4 bytes
# are the IPv4 addr
v4_nested.append(ipaddress.ip_address(addr_ip.packed[-4:]))
if not all(self.is_ip_allowed(addr_v4) for addr_v4 in v4_nested):
return False
# fec0::*, apparently deprecated?
if addr_ip.is_site_local:
return False
else:
raise ValueError("Unsupported IP version(?): %r" % addr_ip)
# 169.254.XXX.XXX, AWS uses these for autoconfiguration
if addr_ip.is_link_local:
return False
# 127.0.0.1, ::1, etc.
if addr_ip.is_loopback:
return False
if addr_ip.is_multicast:
return False
# 192.168.XXX.XXX, 10.XXX.XXX.XXX
if addr_ip.is_private:
return False
# 255.255.255.255, ::ffff:XXXX:XXXX (v6->v4) mapping
if addr_ip.is_reserved:
return False
# There's no reason to connect directly to a 6to4 relay
if addr_ip in self._6TO4_RELAY_NET:
return False
# 0.0.0.0
if addr_ip.is_unspecified:
return False
# It doesn't look bad, so... it's must be ok!
return True
def _hostname_matches_pattern(self, hostname, pattern):
# If they specified a string, just assume they only want basic globbing.
# This stops people from not realizing they're dealing in REs and
# not escaping their periods unless they specifically pass in an RE.
# This has the added benefit of letting us sanely handle globbed
# IDNs by default.
if isinstance(pattern, str):
# convert the glob to a punycode glob, then a regex
pattern = fnmatch.translate(canonicalize_hostname(pattern))
hostname = canonicalize_hostname(hostname)
# Down the line the hostname may get treated as a null-terminated string
# (as with `socket.getaddrinfo`.) Try to account for that.
#
# >>> socket.getaddrinfo("example.com\x00aaaa", 80)
# [(2, 1, 6, '', ('93.184.216.34', 80)), [...]
no_null_hostname = hostname.split("\x00")[0]
return any(re.match(pattern, x.strip(".")) for x
in (no_null_hostname, hostname))
def is_hostname_allowed(self, hostname):
# Sometimes (like with "external" services that your IP has privileged
# access to) you might not always know the IP range to blacklist access
# to, or the `A` record might change without you noticing.
# For e.x.: `foocorp.external.org`.
#
# Another option is doing something like:
#
# for addrinfo in socket.getaddrinfo("foocorp.external.org", 80):
# global_validator.ip_blacklist.add(ip_address(addrinfo[4][0]))
#
# but that's not always a good idea if they're behind a third-party lb.
for pattern in self.hostname_blacklist:
if self._hostname_matches_pattern(hostname, pattern):
return False
return True
@add_local_address_arg
def is_addrinfo_allowed(self, addrinfo, _local_addresses=None):
assert(len(addrinfo) == 5)
# XXX: Do we care about any of the other elements? Guessing not.
family, socktype, proto, canonname, sockaddr = addrinfo
# The 4th elem inaddrinfo may either be a touple of two or four items,
# depending on whether we're dealing with IPv4 or v6
if len(sockaddr) == 2:
# v4
ip, port = sockaddr
elif len(sockaddr) == 4:
# v6
# XXX: what *are* `flow_info` and `scope_id`? Anything useful?
# Seems like we can figure out all we need about the scope from
# the `is_<x>` properties.
ip, port, flow_info, scope_id = sockaddr
else:
raise ValueError("Unexpected addrinfo format %r" % sockaddr)
# Probably won't help protect against SSRF, but might prevent our being
# used to attack others' non-HTTP services. See
# http://www.remote.org/jochen/sec/hfpa/
if self.port_whitelist and port not in self.port_whitelist:
return False
if port in self.port_blacklist:
return False
if self.hostname_blacklist:
if not canonname:
raise NameserverException(
"addrinfo must contain the canon name to do blacklisting "
"based on hostname. Make sure you use the "
"`socket.AI_CANONNAME` flag, and that each record contains "
"the canon name. Your DNS server might also be garbage."
)
if not self.is_hostname_allowed(canonname):
return False
return self.is_ip_allowed(ip, _local_addresses=_local_addresses)

280
cps/cw_advocate/api.py Normal file
View File

@ -0,0 +1,280 @@
#
# Copyright 2015 Jordan Milne
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Source: https://github.com/JordanMilne/Advocate
"""
advocate.api
~~~~~~~~~~~~
This module implements the Requests API, largely a copy/paste from `requests`
itself.
:copyright: (c) 2015 by Jordan Milne.
:license: Apache2, see LICENSE for more details.
"""
from collections import OrderedDict
import hashlib
import pickle
from requests import Session as RequestsSession
# import cw_advocate
from .adapters import ValidatingHTTPAdapter
from .exceptions import MountDisabledException
class Session(RequestsSession):
"""Convenience wrapper around `requests.Session` set up for `advocate`ing"""
__attrs__ = RequestsSession.__attrs__ + ["validator"]
DEFAULT_VALIDATOR = None
"""
User-replaceable default validator to use for all Advocate sessions,
includes sessions created by advocate.get()
"""
def __init__(self, *args, **kwargs):
self.validator = kwargs.pop("validator", None) or self.DEFAULT_VALIDATOR
adapter_kwargs = kwargs.pop("_adapter_kwargs", {})
# `Session.__init__()` calls `mount()` internally, so we need to allow
# it temporarily
self.__mount_allowed = True
RequestsSession.__init__(self, *args, **kwargs)
# Drop any existing adapters
self.adapters = OrderedDict()
self.mount("http://", ValidatingHTTPAdapter(validator=self.validator, **adapter_kwargs))
self.mount("https://", ValidatingHTTPAdapter(validator=self.validator, **adapter_kwargs))
self.__mount_allowed = False
def mount(self, *args, **kwargs):
"""Wrapper around `mount()` to prevent a protection bypass"""
if self.__mount_allowed:
super().mount(*args, **kwargs)
else:
raise MountDisabledException(
"mount() is disabled to prevent protection bypasses"
)
def session(*args, **kwargs):
return Session(*args, **kwargs)
def request(method, url, **kwargs):
"""Constructs and sends a :class:`Request <Request>`.
:param method: method for the new :class:`Request` object.
:param url: URL for the new :class:`Request` object.
:param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.
:param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
:param json: (optional) json data to send in the body of the :class:`Request`.
:param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`.
:param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`.
:param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': ('filename', fileobj)}``) for multipart encoding upload.
:param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth.
:param timeout: (optional) How long to wait for the server to send data
before giving up, as a float, or a (`connect timeout, read timeout
<user/advanced.html#timeouts>`_) tuple.
:type timeout: float or tuple
:param allow_redirects: (optional) Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.
:type allow_redirects: bool
:param proxies: (optional) Dictionary mapping protocol to the URL of the proxy.
:param verify: (optional) if ``True``, the SSL cert will be verified. A CA_BUNDLE path can also be provided.
:param stream: (optional) if ``False``, the response content will be immediately downloaded.
:param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair.
:return: :class:`Response <Response>` object
:rtype: requests.Response
"""
validator = kwargs.pop("validator", None)
with Session(validator=validator) as sess:
response = sess.request(method=method, url=url, **kwargs)
return response
def get(url, **kwargs):
"""Sends a GET request.
:param url: URL for the new :class:`Request` object.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
"""
kwargs.setdefault('allow_redirects', True)
return request('get', url, **kwargs)
'''def options(url, **kwargs):
"""Sends a OPTIONS request.
:param url: URL for the new :class:`Request` object.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
"""
kwargs.setdefault('allow_redirects', True)
return request('options', url, **kwargs)
def head(url, **kwargs):
"""Sends a HEAD request.
:param url: URL for the new :class:`Request` object.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
"""
kwargs.setdefault('allow_redirects', False)
return request('head', url, **kwargs)
def post(url, data=None, json=None, **kwargs):
"""Sends a POST request.
:param url: URL for the new :class:`Request` object.
:param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
:param json: (optional) json data to send in the body of the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
"""
return request('post', url, data=data, json=json, **kwargs)
def put(url, data=None, **kwargs):
"""Sends a PUT request.
:param url: URL for the new :class:`Request` object.
:param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
"""
return request('put', url, data=data, **kwargs)
def patch(url, data=None, **kwargs):
"""Sends a PATCH request.
:param url: URL for the new :class:`Request` object.
:param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
"""
return request('patch', url, data=data, **kwargs)
def delete(url, **kwargs):
"""Sends a DELETE request.
:param url: URL for the new :class:`Request` object.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
"""
return request('delete', url, **kwargs)'''
class RequestsAPIWrapper:
"""Provides a `requests.api`-like interface with a specific validator"""
# Due to how the classes are dynamically constructed pickling may not work
# correctly unless loaded within the same interpreter instance.
# Enable at your peril.
SUPPORT_WRAPPER_PICKLING = False
def __init__(self, validator):
# Do this here to avoid circular import issues
try:
from .futures import FuturesSession
have_requests_futures = True
except ImportError as e:
have_requests_futures = False
self.validator = validator
outer_self = self
class _WrappedSession(Session):
"""An `advocate.Session` that uses the wrapper's blacklist
the wrapper is meant to be a transparent replacement for `requests`,
so people should be able to subclass `wrapper.Session` and still
get the desired validation behaviour
"""
DEFAULT_VALIDATOR = outer_self.validator
self._make_wrapper_cls_global(_WrappedSession)
if have_requests_futures:
class _WrappedFuturesSession(FuturesSession):
"""Like _WrappedSession, but for `FuturesSession`s"""
DEFAULT_VALIDATOR = outer_self.validator
self._make_wrapper_cls_global(_WrappedFuturesSession)
self.FuturesSession = _WrappedFuturesSession
self.request = self._default_arg_wrapper(request)
self.get = self._default_arg_wrapper(get)
self.Session = _WrappedSession
def __getattr__(self, item):
# This class is meant to mimic the requests base module, so if we don't
# have this attribute, it might be on the base module (like the Request
# class, etc.)
try:
return object.__getattribute__(self, item)
except AttributeError:
from . import cw_advocate
return getattr(cw_advocate, item)
def _default_arg_wrapper(self, fun):
def wrapped_func(*args, **kwargs):
kwargs.setdefault("validator", self.validator)
return fun(*args, **kwargs)
return wrapped_func
def _make_wrapper_cls_global(self, cls):
if not self.SUPPORT_WRAPPER_PICKLING:
return
# Gnarly, but necessary to give pickle a consistent module-level
# reference for each wrapper.
wrapper_hash = hashlib.sha256(pickle.dumps(self)).hexdigest()
cls.__name__ = "_".join((cls.__name__, wrapper_hash))
cls.__qualname__ = ".".join((__name__, cls.__name__))
if not globals().get(cls.__name__):
globals()[cls.__name__] = cls
__all__ = (
"get",
"request",
"session",
"Session",
"RequestsAPIWrapper",
)

View File

@ -0,0 +1,201 @@
#
# Copyright 2015 Jordan Milne
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Source: https://github.com/JordanMilne/Advocate
import ipaddress
import socket
from socket import timeout as SocketTimeout
from urllib3.connection import HTTPSConnection, HTTPConnection
from urllib3.exceptions import ConnectTimeoutError
from urllib3.util.connection import _set_socket_options
from urllib3.util.connection import create_connection as old_create_connection
from . import addrvalidator
from .exceptions import UnacceptableAddressException
def advocate_getaddrinfo(host, port, get_canonname=False):
addrinfo = socket.getaddrinfo(
host,
port,
0,
socket.SOCK_STREAM,
0,
# We need what the DNS client sees the hostname as, correctly handles
# IDNs and tricky things like `private.foocorp.org\x00.google.com`.
# All IDNs will be converted to punycode.
socket.AI_CANONNAME if get_canonname else 0,
)
return fix_addrinfo(addrinfo)
def fix_addrinfo(records):
"""
Propagate the canonname across records and parse IPs
I'm not sure if this is just the behaviour of `getaddrinfo` on Linux, but
it seems like only the first record in the set has the canonname field
populated.
"""
def fix_record(record, canonname):
sa = record[4]
sa = (ipaddress.ip_address(sa[0]),) + sa[1:]
return record[0], record[1], record[2], canonname, sa
canonname = None
if records:
# Apparently the canonical name is only included in the first record?
# Add it to all of them.
assert(len(records[0]) == 5)
canonname = records[0][3]
return tuple(fix_record(x, canonname) for x in records)
# Lifted from requests' urllib3, which in turn lifted it from `socket.py`. Oy!
def validating_create_connection(address,
timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
source_address=None, socket_options=None,
validator=None):
"""Connect to *address* and return the socket object.
Convenience function. Connect to *address* (a 2-tuple ``(host,
port)``) and return the socket object. Passing the optional
*timeout* parameter will set the timeout on the socket instance
before attempting to connect. If no *timeout* is supplied, the
global default timeout setting returned by :func:`getdefaulttimeout`
is used. If *source_address* is set it must be a tuple of (host, port)
for the socket to bind as a source address before making the connection.
An host of '' or port 0 tells the OS to use the default.
"""
host, port = address
# We can skip asking for the canon name if we're not doing hostname-based
# blacklisting.
need_canonname = False
if validator.hostname_blacklist:
need_canonname = True
# We check both the non-canonical and canonical hostnames so we can
# catch both of these:
# CNAME from nonblacklisted.com -> blacklisted.com
# CNAME from blacklisted.com -> nonblacklisted.com
if not validator.is_hostname_allowed(host):
raise UnacceptableAddressException(host)
err = None
addrinfo = advocate_getaddrinfo(host, port, get_canonname=need_canonname)
if addrinfo:
if validator.autodetect_local_addresses:
local_addresses = addrvalidator.determine_local_addresses()
else:
local_addresses = []
for res in addrinfo:
# Are we allowed to connect with this result?
if not validator.is_addrinfo_allowed(
res,
_local_addresses=local_addresses,
):
continue
af, socktype, proto, canonname, sa = res
# Unparse the validated IP
sa = (sa[0].exploded,) + sa[1:]
sock = None
try:
sock = socket.socket(af, socktype, proto)
# If provided, set socket level options before connecting.
# This is the only addition urllib3 makes to this function.
_set_socket_options(sock, socket_options)
if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT:
sock.settimeout(timeout)
if source_address:
sock.bind(source_address)
sock.connect(sa)
return sock
except socket.error as _:
err = _
if sock is not None:
sock.close()
sock = None
if err is None:
# If we got here, none of the results were acceptable
err = UnacceptableAddressException(address)
if err is not None:
raise err
else:
raise socket.error("getaddrinfo returns an empty list")
# TODO: Is there a better way to add this to multiple classes with different
# base classes? I tried a mixin, but it used the base method instead.
def _validating_new_conn(self):
""" Establish a socket connection and set nodelay settings on it.
:return: New socket connection.
"""
extra_kw = {}
if self.source_address:
extra_kw['source_address'] = self.source_address
if self.socket_options:
extra_kw['socket_options'] = self.socket_options
try:
# Hack around HTTPretty's patched sockets
# TODO: some better method of hacking around it that checks if we
# _would have_ connected to a private addr?
conn_func = validating_create_connection
if socket.getaddrinfo.__module__.startswith("httpretty"):
conn_func = old_create_connection
else:
extra_kw["validator"] = self._validator
conn = conn_func(
(self.host, self.port),
self.timeout,
**extra_kw
)
except SocketTimeout:
raise ConnectTimeoutError(
self, "Connection to %s timed out. (connect timeout=%s)" %
(self.host, self.timeout))
return conn
# Don't silently break if the private API changes across urllib3 versions
assert(hasattr(HTTPConnection, '_new_conn'))
assert(hasattr(HTTPSConnection, '_new_conn'))
class ValidatingHTTPConnection(HTTPConnection):
_new_conn = _validating_new_conn
def __init__(self, *args, **kwargs):
self._validator = kwargs.pop("validator")
HTTPConnection.__init__(self, *args, **kwargs)
class ValidatingHTTPSConnection(HTTPSConnection):
_new_conn = _validating_new_conn
def __init__(self, *args, **kwargs):
self._validator = kwargs.pop("validator")
HTTPSConnection.__init__(self, *args, **kwargs)

View File

@ -0,0 +1,39 @@
#
# Copyright 2015 Jordan Milne
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Source: https://github.com/JordanMilne/Advocate
from urllib3 import HTTPConnectionPool, HTTPSConnectionPool
from .connection import (
ValidatingHTTPConnection,
ValidatingHTTPSConnection,
)
# Don't silently break if the private API changes across urllib3 versions
assert(hasattr(HTTPConnectionPool, 'ConnectionCls'))
assert(hasattr(HTTPSConnectionPool, 'ConnectionCls'))
assert(hasattr(HTTPConnectionPool, 'scheme'))
assert(hasattr(HTTPSConnectionPool, 'scheme'))
class ValidatingHTTPConnectionPool(HTTPConnectionPool):
scheme = 'http'
ConnectionCls = ValidatingHTTPConnection
class ValidatingHTTPSConnectionPool(HTTPSConnectionPool):
scheme = 'https'
ConnectionCls = ValidatingHTTPSConnection

View File

@ -0,0 +1,39 @@
#
# Copyright 2015 Jordan Milne
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Source: https://github.com/JordanMilne/Advocate
class AdvocateException(Exception):
pass
class UnacceptableAddressException(AdvocateException):
pass
class NameserverException(AdvocateException):
pass
class MountDisabledException(AdvocateException):
pass
class ProxyDisabledException(NotImplementedError, AdvocateException):
pass
class ConfigException(AdvocateException):
pass

View File

@ -0,0 +1,61 @@
#
# Copyright 2015 Jordan Milne
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Source: https://github.com/JordanMilne/Advocate
import collections
import functools
from urllib3 import PoolManager
from urllib3.poolmanager import _default_key_normalizer, PoolKey
from .connectionpool import (
ValidatingHTTPSConnectionPool,
ValidatingHTTPConnectionPool,
)
pool_classes_by_scheme = {
"http": ValidatingHTTPConnectionPool,
"https": ValidatingHTTPSConnectionPool,
}
AdvocatePoolKey = collections.namedtuple('AdvocatePoolKey',
PoolKey._fields + ('key_validator',))
def key_normalizer(key_class, request_context):
request_context = request_context.copy()
# TODO: add ability to serialize validator rules to dict,
# allowing pool to be shared between sessions with the same
# rules.
request_context["validator"] = id(request_context["validator"])
return _default_key_normalizer(key_class, request_context)
key_fn_by_scheme = {
'http': functools.partial(key_normalizer, AdvocatePoolKey),
'https': functools.partial(key_normalizer, AdvocatePoolKey),
}
class ValidatingPoolManager(PoolManager):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Make sure the API hasn't changed
assert (hasattr(self, 'pool_classes_by_scheme'))
self.pool_classes_by_scheme = pool_classes_by_scheme
self.key_fn_by_scheme = key_fn_by_scheme.copy()

View File

@ -43,10 +43,10 @@ from markupsafe import escape
from urllib.parse import quote
try:
import advocate
from advocate.exceptions import UnacceptableAddressException
from . import cw_advocate
from .cw_advocate.exceptions import UnacceptableAddressException
use_advocate = True
except ImportError:
except ImportError as e:
use_advocate = False
advocate = requests
UnacceptableAddressException = MissingSchema = BaseException
@ -841,7 +841,7 @@ def save_cover_from_url(url, book_path):
if cli_param.allow_localhost:
img = requests.get(url, timeout=(10, 200), allow_redirects=False) # ToDo: Error Handling
elif use_advocate:
img = advocate.get(url, timeout=(10, 200), allow_redirects=False) # ToDo: Error Handling
img = cw_advocate.get(url, timeout=(10, 200), allow_redirects=False) # ToDo: Error Handling
else:
log.error("python module advocate is not installed but is needed")
return False, _("Python module 'advocate' is not installed but is needed for cover uploads")

View File

@ -15,5 +15,5 @@
.blackTheme {
background: #000;
color: #fff
color: #fff;
}

View File

@ -0,0 +1 @@
!function(a){a.fn.datepicker.dates.sl={days:["Nedelja","Ponedeljek","Torek","Sreda","Četrtek","Petek","Sobota"],daysShort:["Ned","Pon","Tor","Sre","Čet","Pet","Sob"],daysMin:["Ne","Po","To","Sr","Če","Pe","So"],months:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"],monthsShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],today:"Danes",weekStart:1}}(jQuery);

View File

@ -135,19 +135,23 @@
window.themes = {
"darkTheme": {
"bgColor": "#202124",
"css_path": "{{ url_for('static', filename='css/epub_themes.css') }}"
"css_path": "{{ url_for('static', filename='css/epub_themes.css') }}",
"title-color": "#fff"
},
"lightTheme": {
"bgColor": "white",
"css_path": "{{ url_for('static', filename='css/epub_themes.css') }}"
"css_path": "{{ url_for('static', filename='css/epub_themes.css') }}",
"title-color": "#4f4f4f"
},
"sepiaTheme": {
"bgColor": "#ece1ca",
"css_path": "{{ url_for('static', filename='css/epub_themes.css') }}"
"css_path": "{{ url_for('static', filename='css/epub_themes.css') }}",
"title-color": "#4f4f4f"
},
"blackTheme": {
"bgColor": "black",
"css_path": "{{ url_for('static', filename='css/epub_themes.css') }}"
"css_path": "{{ url_for('static', filename='css/epub_themes.css') }}",
"title-color": "#fff"
},
};
@ -170,6 +174,7 @@
// Apply theme to rest of the page.
document.getElementById("main").style.backgroundColor = themes[id]["bgColor"];
document.getElementById("titlebar").style.color = themes[id]["title-color"] || "#fff";
}
// font size settings logic

View File

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: 2020-06-09 21:11+0100\n"
"Last-Translator: Lukas Heroudek <lukas.heroudek@gmail.com>\n"
"Language: cs_CZ\n"
@ -749,121 +749,121 @@ msgstr "Mazání knihy selhalo %(id)s failed: %(message)s"
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr "Mazání knihy %(id)s, cesta ke knize není platná %(path)s"
#: cps/helper.py:441
#: cps/helper.py:439
#, fuzzy, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Přejmenování názvu z: '%(src)s' na '%(dest)s' selhalo chybou: %(error)s"
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "Soubor %(file)s nenalezen na Google Drive"
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Přejmenování názvu z: '%(src)s' na '%(dest)s' selhalo chybou: %(error)s"
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "Cesta ke knize %(path)s nebyla nalezena na Google Drive"
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr ""
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr "Zadané uživatelské jméno je již použito"
#: cps/helper.py:687
#: cps/helper.py:679
msgid "Invalid Email address format"
msgstr ""
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr ""
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr ""
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr "Chyba stahování obalu"
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr "Chyba formátu obalu"
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr ""
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr "Vytvoření cesty obalu selhalo"
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr "Soubor obalu není platný, nebo nelze uložit"
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr ""
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr ""
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr "Pouze jpg/jpeg jsou podporované soubory pro obal"
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
#, fuzzy
msgid "Cover"
msgstr "Objevte"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr "UnRar binární soubor nenalezen"
#: cps/helper.py:1024
#: cps/helper.py:1016
#, fuzzy
msgid "Error executing UnRar"
msgstr "Chyba provádění UnRar"
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr ""
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr ""
#: cps/helper.py:1049
#: cps/helper.py:1041
#, fuzzy
msgid "Calibre binaries not viable"
msgstr "Databáze není zapisovatelná"
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr ""
#: cps/helper.py:1060
#: cps/helper.py:1052
#, fuzzy, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr "Chybí povolení k exekuci"
#: cps/helper.py:1065
#: cps/helper.py:1057
#, fuzzy
msgid "Error executing Calibre"
msgstr "Chyba provádění UnRar"
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: 2024-08-17 13:49+0200\n"
"Last-Translator: Ozzie Isaacs\n"
"Language: de\n"
@ -730,117 +730,117 @@ msgstr "Löschen von Buch %(id)s fehlgeschlagen: %(message)s"
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr "Lösche Buch %(id)s nur aus Datenbank, Pfad zum Buch in Datenbank ist nicht gültig: %(path)s"
#: cps/helper.py:441
#: cps/helper.py:439
#, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Umbenennen des Autors '%(src)s' zu '%(dest)s' schlug fehl: %(error)s"
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "Datei %(file)s wurde nicht auf Google Drive gefunden"
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Umbenennen des Titels '%(src)s' zu '%(dest)s' schlug fehl: %(error)s"
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "Buchpfad %(path)s wurde nicht auf Google Drive gefunden"
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr "Es existiert bereits ein Benutzerkonto für diese E-Mail Adresse"
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr "Benutzername ist schon vorhanden"
#: cps/helper.py:687
#: cps/helper.py:679
msgid "Invalid Email address format"
msgstr "Ungültiges E-Mail Adressformat"
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr "Passwort stimmt nicht mit den Passwortregln überein"
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr "Python Module 'advocate' ist nicht installiert, wird aber für das Cover hochladen benötigt"
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr "Fehler beim Herunterladen des Covers"
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr "Coverdatei fehlerhaft"
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr "Keine Berechtigung Cover von Localhost oder dem lokalen Netzwerk hochzuladen"
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr "Fehler beim Erzeugen des Ordners für die Coverdatei"
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr "Cover Datei ist keine gültige Bilddatei, kann nicht gespeichert werden"
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr "Nur jpg/jpeg/png/webp/bmp Dateien werden als Coverdatei unterstützt"
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr "Ungültiger Cover Dateiinhalt"
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr "Es werden nur jpg/jpeg Dateien als Cover untertützt"
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
msgid "Cover"
msgstr "Titelbild"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr "UnRar Programm nicht gefunden"
#: cps/helper.py:1024
#: cps/helper.py:1016
msgid "Error executing UnRar"
msgstr "Fehler beim Ausführen von UnRar"
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr "Angegebener Ordner konnte nicht gefunden werden"
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr "Bitte keine Datei sondern einen Ordner angeben"
#: cps/helper.py:1049
#: cps/helper.py:1041
msgid "Calibre binaries not viable"
msgstr "Calibre Programm ist nicht nutzbar"
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr "Fehlende Calibre Binärdateien: %(missing)s"
#: cps/helper.py:1060
#: cps/helper.py:1052
#, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr "Ausführeberechtigung fehlt: %(missing)s"
#: cps/helper.py:1065
#: cps/helper.py:1057
msgid "Error executing Calibre"
msgstr "Fehler beim Ausführen von Calibre"
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr "Alle Bücher für Metadaten Backup einreihen"

View File

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Depountis Georgios\n"
"Language: el\n"
@ -749,121 +749,121 @@ msgstr "Η διαγραφή βιβλίου %(id)s απέτυχε: %(message)s"
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr "Διαγραφή βιβλίου %(id)s, η πορεία βιβλίου δεν είναι έγκυρη: %(path)s"
#: cps/helper.py:441
#: cps/helper.py:439
#, fuzzy, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Η μετονομασία τίτλου από: '%(src)s' σε '%(dest)s' απέτυχε με σφάλμα: %(error)s"
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "Το αρχείο %(file)s δεν βρέθηκε στο Google Drive"
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Η μετονομασία τίτλου από: '%(src)s' σε '%(dest)s' απέτυχε με σφάλμα: %(error)s"
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "Η πορεία βιβλίου %(path)s δεν βρέθηκε στο Google Drive"
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr ""
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr "Αυτό το όνομα χρήστη έχει ήδη παρθεί"
#: cps/helper.py:687
#: cps/helper.py:679
msgid "Invalid Email address format"
msgstr ""
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr ""
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr ""
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr "Σφάλμα Κατεβάσματος Φόντου"
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr "Σφάλμα Μορφής Φόντου"
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr ""
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr "Αποτυχία δημιουργίας πορείας για φόντο"
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr "Το αρχείο φόντου δεν είναι ένα έγκυρο αρχείο εικόνας, ή δεν μπόρεσε να αποθηκευτεί"
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr ""
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr ""
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr "Μόνο jpg/jpeg αρχεία υποστηρίζονται ως αρχεία φόντου"
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
#, fuzzy
msgid "Cover"
msgstr "Ανακάλυψε"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr "Δεν βρέθηκε δυαδικό αρχείο UnRar"
#: cps/helper.py:1024
#: cps/helper.py:1016
#, fuzzy
msgid "Error executing UnRar"
msgstr "Σφάλμα εκτέλεσης UnRar"
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr ""
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr ""
#: cps/helper.py:1049
#: cps/helper.py:1041
#, fuzzy
msgid "Calibre binaries not viable"
msgstr "Η DB δεν μπορεί να Γραφτεί"
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr ""
#: cps/helper.py:1060
#: cps/helper.py:1052
#, fuzzy, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr "Λείπουν άδειες εκτέλεσης"
#: cps/helper.py:1065
#: cps/helper.py:1057
#, fuzzy
msgid "Error executing Calibre"
msgstr "Σφάλμα εκτέλεσης UnRar"
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr ""

View File

@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: 2020-05-25 17:22+0200\n"
"Last-Translator: minakmostoles <xxx@xxx.com>\n"
"Language: es\n"
@ -753,122 +753,122 @@ msgstr "El eliminado del libro %(id)s falló: %(message)s"
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr "Borrando el libro %(id)s, la ruta del libro es no válida: %(path)s"
#: cps/helper.py:441
#: cps/helper.py:439
#, fuzzy, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "El renombrado del título de: '%(src)s' a '%(dest)s' falló con el error: %(error)s"
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "Fichero %(file)s no encontrado en Google Drive"
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "El renombrado del título de: '%(src)s' a '%(dest)s' falló con el error: %(error)s"
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "La ruta %(path)s del libro no fue encontrada en Google Drive"
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr ""
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr "Este nombre de usuario ya está en uso"
#: cps/helper.py:687
#: cps/helper.py:679
#, fuzzy
msgid "Invalid Email address format"
msgstr "Dirección de correo no válida"
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr ""
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr ""
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr "Error al descargar la cubierta"
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr "Error en el formato de la cubierta"
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr ""
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr "Error al crear una ruta para la cubierta"
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr "El archivo de cubierta no es una imágen válida"
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr "Sólo se admiten como portada los archivos jpg/jpeg/png/webp/bmp"
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr ""
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr "Sólo se admiten como portada los archivos jpg/jpeg"
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
#, fuzzy
msgid "Cover"
msgstr "Descubrir"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr "No se encuentra el archivo binario UnRar"
#: cps/helper.py:1024
#: cps/helper.py:1016
#, fuzzy
msgid "Error executing UnRar"
msgstr "Error ejecutando UnRar"
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr ""
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr ""
#: cps/helper.py:1049
#: cps/helper.py:1041
#, fuzzy
msgid "Calibre binaries not viable"
msgstr "La base de datos no es modificable"
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr ""
#: cps/helper.py:1060
#: cps/helper.py:1052
#, fuzzy, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr "Faltan permisos de ejecución"
#: cps/helper.py:1065
#: cps/helper.py:1057
#, fuzzy
msgid "Error executing Calibre"
msgstr "Error ejecutando UnRar"
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: 2020-01-12 13:56+0100\n"
"Last-Translator: Samuli Valavuo <svalavuo@gmail.com>\n"
"Language: fi\n"
@ -747,118 +747,118 @@ msgstr ""
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr ""
#: cps/helper.py:441
#: cps/helper.py:439
#, fuzzy, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Tiedon muuttaminen arvosta: '%(src)s' arvoon '%(dest)s' epäonnistui virheeseen: %(error)s"
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "Tiedostoa %(file)s ei löytynyt Google Drivesta"
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Tiedon muuttaminen arvosta: '%(src)s' arvoon '%(dest)s' epäonnistui virheeseen: %(error)s"
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "Kirjan polkua %(path)s ei löytynyt Google Drivesta"
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr ""
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr ""
#: cps/helper.py:687
#: cps/helper.py:679
msgid "Invalid Email address format"
msgstr ""
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr ""
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr ""
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr ""
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr ""
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr ""
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr ""
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr ""
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr ""
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr ""
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr ""
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
#, fuzzy
msgid "Cover"
msgstr "Löydä"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr ""
#: cps/helper.py:1024
#: cps/helper.py:1016
msgid "Error executing UnRar"
msgstr ""
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr ""
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr ""
#: cps/helper.py:1049
#: cps/helper.py:1041
msgid "Calibre binaries not viable"
msgstr ""
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr ""
#: cps/helper.py:1060
#: cps/helper.py:1052
#, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr ""
#: cps/helper.py:1065
#: cps/helper.py:1057
msgid "Error executing Calibre"
msgstr ""
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr ""

View File

@ -22,7 +22,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: 2020-06-07 06:47+0200\n"
"Last-Translator: <thovi98@gmail.com>\n"
"Language: fr\n"
@ -765,122 +765,122 @@ msgstr "La suppression du livre %(id)s a échoué: %(message)s"
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr "Suppression du livre %(id)s, le chemin du livre est invalide : %(path)s"
#: cps/helper.py:441
#: cps/helper.py:439
#, fuzzy, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Renommer le titre de : '%(src)s' à '%(dest)s' a échoué avec lerreur : %(error)s"
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "Le fichier %(file)s n'a pas été trouvé dans Google Drive"
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Renommer le titre de : '%(src)s' à '%(dest)s' a échoué avec lerreur : %(error)s"
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "Le chemin du livre %(path)s n'a pas été trouvé dans Google Drive"
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr ""
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr "Cet utilisateur est déjà pris"
#: cps/helper.py:687
#: cps/helper.py:679
#, fuzzy
msgid "Invalid Email address format"
msgstr "Format de ladresse courriel invalide"
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr ""
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr ""
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr "Erreur lors du téléchargement de la couverture"
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr "Erreur de format de couverture"
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr ""
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr "Impossible de créer le chemin pour la couverture"
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr "Le fichier couverture n'est pas un fichier image valide, ou ne peut pas être stocké"
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr "Seuls les fichiers jpg/jpeg/png/webp/bmp sont supportés comme fichier de couverture"
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr "Contenu du fichier de couverture invalide"
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr "Seuls les fichiers jpg/jpeg sont supportés comme fichier de couverture"
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
#, fuzzy
msgid "Cover"
msgstr "Découvrir"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr "Fichier binaire UnRar non trouvé"
#: cps/helper.py:1024
#: cps/helper.py:1016
#, fuzzy
msgid "Error executing UnRar"
msgstr "Une erreur est survenue lors de l'exécution d'UnRar"
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr ""
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr ""
#: cps/helper.py:1049
#: cps/helper.py:1041
#, fuzzy
msgid "Calibre binaries not viable"
msgstr "La base de données n'est pas accessible en écriture"
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr ""
#: cps/helper.py:1060
#: cps/helper.py:1052
#, fuzzy, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr "Les permissions d'exécutions manquantes"
#: cps/helper.py:1065
#: cps/helper.py:1057
#, fuzzy
msgid "Error executing Calibre"
msgstr "Une erreur est survenue lors de l'exécution d'UnRar"
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr ""

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: 2022-08-11 16:46+0200\n"
"Last-Translator: pollitor <pollitor@gmx.com>\n"
"Language: gl\n"
@ -736,121 +736,121 @@ msgstr "O borrado do libro %(id)s fallou: %(message)s"
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr "Borrando o libro %(id)s, a ruta de libro non é válida: %(path)s"
#: cps/helper.py:441
#: cps/helper.py:439
#, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "O renomeado do título de: '%(src)s' a '%(dest)s' fallou co erro: %(error)s"
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "Ficheiro %(file)s non atopado en Google Drive"
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "O renomeado do título de: '%(src)s' a '%(dest)s' fallou co erro: %(error)s"
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "A ruta %(path)s do libro non se atopou en Google Drive"
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr ""
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr "Este nome de usuario xa está en uso"
#: cps/helper.py:687
#: cps/helper.py:679
#, fuzzy
msgid "Invalid Email address format"
msgstr "Enderezo de correo non válido"
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr ""
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr "O módulo Python 'advocate' non está instalado pero se necesita para as cargas de cubertas"
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr "Erro ao descargar a cuberta"
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr "Erro no formato da cuberta"
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr "Non ten permiso para acceder a localhost ou á rede local para as cargas de cubertas"
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr "Erro ao crear unha ruta para a cuberta"
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr "O arquivo de cuberta non é unha imaxe válida"
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr "Soamente se admiten como cuberta os arquivos jpg/jpeg/png/webp/bmp"
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr "Contido do arquivo de cuberta non válido"
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr "Soamente se admiten como cuberta os arquivos jpg/jpeg"
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
#, fuzzy
msgid "Cover"
msgstr "Descubrir"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr "Non se atopa o arquivo binario de UnRar"
#: cps/helper.py:1024
#: cps/helper.py:1016
msgid "Error executing UnRar"
msgstr "Erro executando UnRar"
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr ""
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr ""
#: cps/helper.py:1049
#: cps/helper.py:1041
#, fuzzy
msgid "Calibre binaries not viable"
msgstr "A base de datos non é modificable"
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr ""
#: cps/helper.py:1060
#: cps/helper.py:1052
#, fuzzy, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr "Faltan permisos de execución"
#: cps/helper.py:1065
#: cps/helper.py:1057
#, fuzzy
msgid "Error executing Calibre"
msgstr "Erro executando UnRar"
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: 2019-04-06 23:36+0200\n"
"Last-Translator: \n"
"Language: hu\n"
@ -746,118 +746,118 @@ msgstr ""
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr ""
#: cps/helper.py:441
#: cps/helper.py:439
#, fuzzy, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "A cím átnevezése \"%(src)s\"-ról \"%(dest)s\"-ra nem sikerült a következő hiba miatt: %(error)s"
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "A \"%(file)s\" fájl nem található a Google Drive-on"
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "A cím átnevezése \"%(src)s\"-ról \"%(dest)s\"-ra nem sikerült a következő hiba miatt: %(error)s"
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "A könyv elérési útja (\"%(path)s\") nem található a Google Drive-on"
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr ""
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr ""
#: cps/helper.py:687
#: cps/helper.py:679
msgid "Invalid Email address format"
msgstr ""
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr ""
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr ""
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr ""
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr ""
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr ""
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr ""
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr ""
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr ""
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr ""
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr ""
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
#, fuzzy
msgid "Cover"
msgstr "Felfedezés"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr ""
#: cps/helper.py:1024
#: cps/helper.py:1016
msgid "Error executing UnRar"
msgstr ""
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr ""
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr ""
#: cps/helper.py:1049
#: cps/helper.py:1041
msgid "Calibre binaries not viable"
msgstr ""
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr ""
#: cps/helper.py:1060
#: cps/helper.py:1052
#, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr ""
#: cps/helper.py:1065
#: cps/helper.py:1057
msgid "Error executing Calibre"
msgstr ""
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: 2023-01-21 10:00+0700\n"
"Last-Translator: Arief Hidayat<arihid95@gmail.com>\n"
"Language: id\n"
@ -738,122 +738,122 @@ msgstr "Gagal menghapus buku %(id)s: %(message)s"
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr "Menghapus buku %(id)s hanya dari basis data, jalur buku di basis data tidak valid: %(path)s"
#: cps/helper.py:441
#: cps/helper.py:439
#, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Ganti nama pengarang dari: '%(src)s' menjadi '%(dest)s' gagal dengan kesalahan: %(error)s"
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "Berkas %(file)s tidak ditemukan di Google Drive"
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Ganti nama judul dari: '%(src)s' menjadi '%(dest)s' gagal dengan kesalahan: %(error)s"
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "Jalur buku %(path)s tidak ditemukan di Google Drive"
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr ""
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr "Nama pengguna ini sudah digunakan"
#: cps/helper.py:687
#: cps/helper.py:679
#, fuzzy
msgid "Invalid Email address format"
msgstr "Format alamat email tidak valid"
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr ""
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr "Modul 'advocate' Python tidak diinstal tetapi diperlukan untuk unggahan sampul"
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr "Kesalahan Mengunduh Sampul"
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr "Kesalahan Format Sampul"
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr "Anda tidak diizinkan mengakses localhost atau jaringan lokal untuk unggahan sampul"
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr "Gagal membuat jalur untuk sampul"
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr "Berkas sampul bukan berkas gambar yang valid, atau tidak dapat disimpan"
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr "Hanya berkas jpg/jpeg/png/webp/bmp yang didukung sebagai berkas sampul"
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr "Konten berkas sampul tidak valid"
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr "Hanya berkas jpg/jpeg yang didukung sebagai berkas sampul"
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
#, fuzzy
msgid "Cover"
msgstr "Sampul"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr "Berkas biner unrar tidak ditemukan"
#: cps/helper.py:1024
#: cps/helper.py:1016
#, fuzzy
msgid "Error executing UnRar"
msgstr "Kesalahan saat menjalankan UnRar"
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr ""
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr ""
#: cps/helper.py:1049
#: cps/helper.py:1041
#, fuzzy
msgid "Calibre binaries not viable"
msgstr "Basis Data tidak dapat ditulisi"
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr ""
#: cps/helper.py:1060
#: cps/helper.py:1052
#, fuzzy, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr "Izin eksekusi hilang"
#: cps/helper.py:1065
#: cps/helper.py:1057
#, fuzzy
msgid "Error executing Calibre"
msgstr "Kesalahan saat menjalankan UnRar"
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr "Antrian semua buku untuk cadangan metadata"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: 2024-08-24 05:32+0200\n"
"Last-Translator: Massimo Pissarello <mapi68@gmail.com>\n"
"Language: it\n"
@ -730,117 +730,117 @@ msgstr "Eliminazione del libro %(id)s non riuscita: %(message)s"
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr "Eliminazione del libro %(id)s solo dal database, percorso del libro nel database non valido: %(path)s"
#: cps/helper.py:441
#: cps/helper.py:439
#, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "La modifica dell'autore da '%(src)s' a '%(dest)s' è terminata con l'errore: %(error)s"
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "Il file %(file) non è stato trovato su Google Drive"
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "La modifica del titolo da '%(src)s' a '%(dest)s' è terminata con l'errore: %(error)s"
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "Il percorso del libro %(path)s non è stato trovato su Google Drive"
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr "Trovato un account esistente per questo indirizzo e-mail"
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr "Questo nome utente è già utilizzato"
#: cps/helper.py:687
#: cps/helper.py:679
msgid "Invalid Email address format"
msgstr "Formato dell'indirizzo e-mail non valido"
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr "La password non è conforme alle regole di convalida della password"
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr "Il modulo Python \"advocate\" non è installato ma è necessario per il caricamento delle copertine"
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr "Errore nello scaricare la copertina"
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr "Errore nel formato della copertina"
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr "Non ti è consentito accedere all'host locale o alla rete locale per caricare le copertine"
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr "Impossibile creare il percorso per la copertina"
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr "Il file della copertina non è in un formato di immagine valido o non può essere salvato"
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr "Solo i file jpg/jpeg/png/webp/bmp sono supportati come file di copertina"
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr "Contenuto del file di copertina non valido"
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr "Solo i file jpg/jpeg sono supportati come file di copertina"
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
msgid "Cover"
msgstr "Copertina"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr "File binario UnRar non trovato"
#: cps/helper.py:1024
#: cps/helper.py:1016
msgid "Error executing UnRar"
msgstr "Errore nell'eseguire UnRar"
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr "Impossibile trovare la cartella specificata"
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr "Specifica una cartella, non un file"
#: cps/helper.py:1049
#: cps/helper.py:1041
msgid "Calibre binaries not viable"
msgstr "Eseguibili di Calibre non validi"
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr "File eseguibili di Calibre mancanti: %(missing)s"
#: cps/helper.py:1060
#: cps/helper.py:1052
#, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr "Permessi di esecuzione mancanti: %(missing)s"
#: cps/helper.py:1065
#: cps/helper.py:1057
msgid "Error executing Calibre"
msgstr "Errore durante l'esecuzione di Calibre"
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr "Metti in coda tutti i libri per il backup dei metadati"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: 2018-02-07 02:20-0500\n"
"Last-Translator: subdiox <subdiox@gmail.com>\n"
"Language: ja\n"
@ -738,122 +738,122 @@ msgstr "本 %(id)s の削除に失敗しました: %(message)s"
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr "本 %(id)s はDBのみから削除されます。DB内の本のパスが有効ではありません: %(path)s"
#: cps/helper.py:441
#: cps/helper.py:439
#, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "エラー: %(error)s により、著者名を %(src)s から %(dest)s に変更できませんでした"
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "ファイル %(file)s はGoogleドライブ上にありません"
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "エラー: %(error)s により、タイトルを %(src)s から %(dest)s に変更できませんでした"
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "本のパス %(path)s はGoogleドライブ上にありません"
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr ""
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr "このユーザー名はすでに使われています"
#: cps/helper.py:687
#: cps/helper.py:679
#, fuzzy
msgid "Invalid Email address format"
msgstr "メールアドレスの形式が無効"
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr ""
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr "表紙のアップロードに必要なPythonモジュール 'advocate' がインストールされていません"
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr "表紙のダウンロードに失敗しました"
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr "表紙形式エラー"
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr "表紙アップロードのためにlocalhostやローカルネットワークにアクセスすることは許可されていません"
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr "表紙ファイルの作成に失敗しました"
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr "表紙ファイルが有効な画像ファイルでないか、または保存できませんでした"
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr "表紙ファイルは jpg/jpeg/png/webp/bmp のみ対応しています"
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr "表紙ファイルの内容が無効です"
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr "表紙ファイルは jpg/jpeg のみ対応しています"
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
#, fuzzy
msgid "Cover"
msgstr "見つける"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr "UnRarのバイナリファイルが見つかりません"
#: cps/helper.py:1024
#: cps/helper.py:1016
#, fuzzy
msgid "Error executing UnRar"
msgstr "UnRarの実行中にエラーが発生しました"
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr ""
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr ""
#: cps/helper.py:1049
#: cps/helper.py:1041
#, fuzzy
msgid "Calibre binaries not viable"
msgstr "DBへの書き込みができません"
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr ""
#: cps/helper.py:1060
#: cps/helper.py:1052
#, fuzzy, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr "実行権限がありません"
#: cps/helper.py:1065
#: cps/helper.py:1057
#, fuzzy
msgid "Error executing Calibre"
msgstr "UnRarの実行中にエラーが発生しました"
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: 2018-08-27 17:06+0700\n"
"Last-Translator: \n"
"Language: km_KH\n"
@ -744,118 +744,118 @@ msgstr ""
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr ""
#: cps/helper.py:441
#: cps/helper.py:439
#, fuzzy, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "ប្តូរចំណងជើងពី “%(src)s” ទៅជា “%(dest)s” បរាជ័យដោយបញ្ហា: %(error)s"
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "ឯកសារ %(file)s រកមិនឃើញក្នុង Google Drive"
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "ប្តូរចំណងជើងពី “%(src)s” ទៅជា “%(dest)s” បរាជ័យដោយបញ្ហា: %(error)s"
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "ទីតាំងសៀវភៅ %(path)s រកមិនឃើញក្នុង Google Drive"
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr ""
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr ""
#: cps/helper.py:687
#: cps/helper.py:679
msgid "Invalid Email address format"
msgstr ""
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr ""
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr ""
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr ""
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr ""
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr ""
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr ""
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr ""
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr ""
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr ""
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr ""
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
#, fuzzy
msgid "Cover"
msgstr "ស្រាវជ្រាវ"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr ""
#: cps/helper.py:1024
#: cps/helper.py:1016
msgid "Error executing UnRar"
msgstr ""
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr ""
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr ""
#: cps/helper.py:1049
#: cps/helper.py:1041
msgid "Calibre binaries not viable"
msgstr ""
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr ""
#: cps/helper.py:1060
#: cps/helper.py:1052
#, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr ""
#: cps/helper.py:1065
#: cps/helper.py:1057
msgid "Error executing Calibre"
msgstr ""
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr ""

View File

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: 2022-01-10 11:30+0900\n"
"Last-Translator: 내맘대로의 EPUBGUIDE.NET <byword77@gmail.com>\n"
"Language: ko\n"
@ -738,122 +738,122 @@ msgstr "%(id)s 도서 삭제 실패: %(message)s"
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr "데이터베이스에서만 책 %(id)s 을(를) 삭제 중, 데이터베이스의 책 경로가 유효하지 않음: %(path)s"
#: cps/helper.py:441
#: cps/helper.py:439
#, fuzzy, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "제목 이름을 '%(src)s'에서 '%(dest)s'(으)로 변경하지 못했습니다. 오류: %(error)s"
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "Google 드라이브에서 %(file)s 파일을 찾을 수 없습니다"
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "제목 이름을 '%(src)s'에서 '%(dest)s'(으)로 변경하지 못했습니다. 오류: %(error)s"
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "Google 드라이브에서 책 경로 %(path)s을(를) 찾을 수 없습니다"
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr "다른 계정에서 사용하고 있는 이메일 주소입니다."
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr "등록되어 있는 username입니다"
#: cps/helper.py:687
#: cps/helper.py:679
#, fuzzy
msgid "Invalid Email address format"
msgstr "이메일 주소 형식이 잘못되었습니다"
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr "규칙에 어긋나는 비밀번호입니다."
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr "표지 업로드에 필요한 Python 모듈 'advocate'이 설치되지 않았습니다."
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr "표지 다운로드 중 오류 발생"
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr "표지 형식 오류"
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr "표지 업로드를 위해 localhost 또는 로컬 네트워크에 액세스할 수 없습니다."
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr "표지 경로 생성 실패"
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr "표지 파일이 유효한 이미지 파일이 아니거나 저장할 수 없습니다"
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr "표지는 jpg/jpeg/png/webp/bmp 파일만 지원됩니다"
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr "잘못된 표지 파일 콘텐츠"
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr "표지 파일로 jpg/jpeg 파일만 지원됩니다"
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
#, fuzzy
msgid "Cover"
msgstr "발견"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr "UnRar 바이너리 파일을 찾을 수 없습니다"
#: cps/helper.py:1024
#: cps/helper.py:1016
#, fuzzy
msgid "Error executing UnRar"
msgstr "UnRar 실행 오류"
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr ""
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr ""
#: cps/helper.py:1049
#: cps/helper.py:1041
#, fuzzy
msgid "Calibre binaries not viable"
msgstr "쓰기 권한이 없는 DB"
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr ""
#: cps/helper.py:1060
#: cps/helper.py:1052
#, fuzzy, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr "실행 권한 누락"
#: cps/helper.py:1065
#: cps/helper.py:1057
#, fuzzy
msgid "Error executing Calibre"
msgstr "UnRar 실행 오류"
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr "메타데이터 백업을 위해 모든 도서를 대기열에 추가"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web (GPLV3)\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: 2023-12-20 22:00+0100\n"
"Last-Translator: Michiel Cornelissen <michiel.cornelissen+gitbhun at proton.me>\n"
"Language: nl\n"
@ -750,122 +750,122 @@ msgstr "Verwijderen van boek %(id)s mislukt: %(message)s"
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr "Verwijder boek %(id)s alleen uit database, boek pad is ongeldig: %(path)s"
#: cps/helper.py:441
#: cps/helper.py:439
#, fuzzy, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Kan de titel '%(src)s' niet wijzigen in '%(dest)s': %(error)s"
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "Bestand '%(file)s' niet aangetroffen op Google Drive"
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Kan de titel '%(src)s' niet wijzigen in '%(dest)s': %(error)s"
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "Boeken locatie '%(path)s' niet aangetroffen op Google Drive"
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr "Bestaand account gevondne met dit e-mailadres"
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr "Deze gebruikersnaam is al in gebruik"
#: cps/helper.py:687
#: cps/helper.py:679
#, fuzzy
msgid "Invalid Email address format"
msgstr "Ongeldig E-Mail adres"
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr "Het wachtwoord voldoet niet aan de validatieregels"
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr "Pythonmodule 'advocate' is niet geïnstalleerd maar is nodig omslag uploads"
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr "Fout bij downloaden omslag"
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr "Onjuist omslagformaat"
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr "Toegang tot localhost of het lokale netwerk niet toegestaant voor omslag uploaden"
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr "Locatie aanmaken voor omslag mislukt"
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr "Omslag-bestand is geen afbeelding of kon niet opgeslagen worden"
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr "Alleen jpg/jpeg/png/webp/bmp bestanden worden ondersteund als omslag"
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr "Ongeldig omslagbestand"
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr "Alleen jpg/jpeg bestanden zijn toegestaan als omslag"
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
#, fuzzy
msgid "Cover"
msgstr "Willekeurige boeken"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr "UnRar executable niet gevonden"
#: cps/helper.py:1024
#: cps/helper.py:1016
#, fuzzy
msgid "Error executing UnRar"
msgstr "Fout bij het uitvoeren van UnRar"
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr ""
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr ""
#: cps/helper.py:1049
#: cps/helper.py:1041
#, fuzzy
msgid "Calibre binaries not viable"
msgstr "Kan niet schrijven naar database"
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr ""
#: cps/helper.py:1060
#: cps/helper.py:1052
#, fuzzy, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr "Kan programma niet uitvoeren"
#: cps/helper.py:1065
#: cps/helper.py:1057
#, fuzzy
msgid "Error executing Calibre"
msgstr "Fout bij het uitvoeren van UnRar"
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr "Voeg alle boeken toe aan de wachtrij voor het maken van een metagegevens backup"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: 2023-01-06 11:00+0000\n"
"Last-Translator: Vegard Fladby <vegard.fladby@gmail.com>\n"
"Language: no\n"
@ -746,121 +746,121 @@ msgstr "Sletting av bok %(id)s mislyktes: %(message)s"
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr "Sletter bok %(id)s kun fra databasen, bokbanen i databasen er ikke gyldig: %(path)s"
#: cps/helper.py:441
#: cps/helper.py:439
#, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Endre navn på forfatter fra: '%(src)s' til '%(dest)s' mislyktes med feil: %(error)s"
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "Fil %(file)s ikke funnet på Google Disk"
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Endre navn på tittel fra: '%(src)s' til '%(dest)s' mislyktes med feil: %(error)s"
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "Finner ikke bokbane %(path)s på Google Disk"
#: cps/helper.py:665
#: cps/helper.py:657
#, fuzzy
msgid "Found an existing account for this Email address"
msgstr "Fant en eksisterende konto for denne e-postadressen"
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr "Dette brukernavnet er allerede tatt"
#: cps/helper.py:687
#: cps/helper.py:679
#, fuzzy
msgid "Invalid Email address format"
msgstr "Ugyldig format for e-postadresse"
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr ""
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr "Python-modulen 'advocate' er ikke installert, men er nødvendig for omslagsopplastinger"
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr "Feil ved nedlasting av cover"
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr "Omslagsformatfeil"
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr "Du har ikke tilgang til localhost eller det lokale nettverket for coveropplastinger"
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr "Kunne ikke opprette bane for dekning"
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr "Cover-filen er ikke en gyldig bildefil, eller kunne ikke lagres"
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr "Bare jpg/jpeg/png/webp/bmp-filer støttes som coverfile"
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr "Ugyldig omslagsfilinnhold"
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr "Bare jpg/jpeg-filer støttes som coverfile"
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
msgid "Cover"
msgstr "Dekke"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr "UnRar binær fil ikke funnet"
#: cps/helper.py:1024
#: cps/helper.py:1016
msgid "Error executing UnRar"
msgstr "Feil ved kjøring av UnRar"
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr ""
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr ""
#: cps/helper.py:1049
#: cps/helper.py:1041
#, fuzzy
msgid "Calibre binaries not viable"
msgstr "DB er ikke skrivbar"
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr ""
#: cps/helper.py:1060
#: cps/helper.py:1052
#, fuzzy, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr "Utførelsestillatelser mangler"
#: cps/helper.py:1065
#: cps/helper.py:1057
#, fuzzy
msgid "Error executing Calibre"
msgstr "Feil ved kjøring av UnRar"
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr "Sett alle bøker i kø for sikkerhetskopiering av metadata"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre Web - polski (POT: 2021-06-12 08:52)\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: 2021-06-12 15:35+0200\n"
"Last-Translator: Radosław Kierznowski <radek.kierznowski@outlook.com>\n"
"Language: pl\n"
@ -753,122 +753,122 @@ msgstr "Usuwanie książki %(id)s zakończyło się błędem: %(message)s"
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr "Usuwanie książki %(id)s, ścieżka książki jest niepoprawna: %(path)s"
#: cps/helper.py:441
#: cps/helper.py:439
#, fuzzy, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Zmiana nazwy tytułu z: „%(src)s” na „%(dest)s” zakończyła się błędem: %(error)s"
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "Nie znaleziono pliku %(file)s na Google Drive"
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Zmiana nazwy tytułu z: „%(src)s” na „%(dest)s” zakończyła się błędem: %(error)s"
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "Nie znaleziono ścieżki do książki %(path)s na Google Drive"
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr ""
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr "Nazwa użytkownika jest już zajęta"
#: cps/helper.py:687
#: cps/helper.py:679
#, fuzzy
msgid "Invalid Email address format"
msgstr "Nieprawidłowy format adresu e-mail"
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr ""
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr ""
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr "Błąd przy pobieraniu okładki"
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr "Błędny format okładki"
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr ""
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr "Nie udało się utworzyć ścieżki dla okładki"
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr "Plik okładki nie jest poprawnym plikiem obrazu lub nie mógł zostać zapisany"
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr "Jako plik okładki obsługiwane są tylko pliki jpg/jpeg/png/webp/bmp"
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr ""
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr "Jako plik okładki dopuszczalne są jedynie pliki jpg/jpeg"
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
#, fuzzy
msgid "Cover"
msgstr "Odkrywaj"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr "Plik wykonywalny programu unrar nie znaleziony"
#: cps/helper.py:1024
#: cps/helper.py:1016
#, fuzzy
msgid "Error executing UnRar"
msgstr "Błąd przy wykonywaniu unrar"
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr ""
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr ""
#: cps/helper.py:1049
#: cps/helper.py:1041
#, fuzzy
msgid "Calibre binaries not viable"
msgstr "Baza danych nie jest zapisywalna"
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr ""
#: cps/helper.py:1060
#: cps/helper.py:1052
#, fuzzy, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr "Brak uprawnienia do wykonywania pliku"
#: cps/helper.py:1065
#: cps/helper.py:1057
#, fuzzy
msgid "Error executing Calibre"
msgstr "Błąd przy wykonywaniu unrar"
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr ""

View File

@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: 2023-07-25 11:30+0100\n"
"Last-Translator: horus68 <https://github.com/horus68>\n"
"Language: pt\n"
@ -735,122 +735,122 @@ msgstr "Falha ao eliminar livro %(id)s: %(message)s"
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr "Eliminar livro %(id)s apenas da base de dados, caminho do livro inválido: %(path)s"
#: cps/helper.py:441
#: cps/helper.py:439
#, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Renomear autor de: '%(src)s' para '%(dest)s' falhou com o erro: %(error)s"
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "Ficheiro %(file)s não encontrado no Google Drive"
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Renomear título de: '%(src)s' para '%(dest)s' falhou com o erro: %(error)s"
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "Caminho do livro %(path)s não encontrado no Google Drive"
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr "Encontrada uma conta existente para este endereço de email"
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr "Este nome de utilizador já está registado"
#: cps/helper.py:687
#: cps/helper.py:679
#, fuzzy
msgid "Invalid Email address format"
msgstr "Formato de endereço de email inválido"
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr ""
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr "O módulo Python 'advocate' não está instalado, mas é necessário para carregar capas"
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr "Erro ao descarregar a capa"
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr "Erro de formato da capa"
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr "Não possui permissões para aceder a localhost ou à rede local para carregar capas"
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr "Falha em criar um caminho para a capa"
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr "O ficheiro de capa não é um ficheiro de imagem válido, ou não foi possível ser armazenado"
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr "Apenas ficheiros jpg/jpeg/png/webp/bmp são suportados como ficheiros de capa"
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr "Conteúdo do ficheiro de capa inválido"
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr "Apenas ficheiros jpg/jpeg são suportados como ficheiros de capa"
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
#, fuzzy
msgid "Cover"
msgstr "Capa"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr "Binário UnRar não encontrado"
#: cps/helper.py:1024
#: cps/helper.py:1016
#, fuzzy
msgid "Error executing UnRar"
msgstr "Erro a executar UnRar"
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr ""
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr ""
#: cps/helper.py:1049
#: cps/helper.py:1041
#, fuzzy
msgid "Calibre binaries not viable"
msgstr "DB não é gravável"
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr ""
#: cps/helper.py:1060
#: cps/helper.py:1052
#, fuzzy, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr "Falta de permissões de execução"
#: cps/helper.py:1065
#: cps/helper.py:1057
#, fuzzy
msgid "Error executing Calibre"
msgstr "Erro a executar UnRar"
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr "Enviar todos os livros para lista de espera para cópia de segurança de metadados"

View File

@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: br\n"
@ -735,122 +735,122 @@ msgstr "Falha ao excluir livro %(id)s: %(message)s"
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr "Excluindo livro %(id)s somente do banco de dados, caminho do livro inválido: %(path)s"
#: cps/helper.py:441
#: cps/helper.py:439
#, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Renomear autor de: '%(src)s' para '%(dest)s' falhou com o erro: %(error)s"
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "Arquivo %(file)s não encontrado no Google Drive"
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Renomear título de: '%(src)s' para '%(dest)s' falhou com o erro: %(error)s"
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "Caminho do livro %(path)s não encontrado no Google Drive"
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr ""
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr "Este nome de usuário já está registrado"
#: cps/helper.py:687
#: cps/helper.py:679
#, fuzzy
msgid "Invalid Email address format"
msgstr "Formato de endereço de e-mail inválido"
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr ""
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr "O módulo Python 'advocate' não está instalado, mas é necessário para uploads de capa"
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr "Erro ao Baixar a capa"
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr "Erro de Formato da Capa"
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr "Você não tem permissão para acessar localhost ou a rede local para uploads de capa"
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr "Falha em criar caminho para a capa"
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr "O arquivo de capa não é um arquivo de imagem válido, ou não pôde ser armazenado"
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr "Apenas arquivos jpg/jpeg/png/webp/bmp são suportados como arquivos de capa"
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr "Conteúdo do arquivo de capa inválido"
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr "Apenas arquivos jpg/jpeg são suportados como arquivos de capa"
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
#, fuzzy
msgid "Cover"
msgstr "Capa"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr "Binário UnRar não encontrado"
#: cps/helper.py:1024
#: cps/helper.py:1016
#, fuzzy
msgid "Error executing UnRar"
msgstr "Erro excecutando UnRar"
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr ""
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr ""
#: cps/helper.py:1049
#: cps/helper.py:1041
#, fuzzy
msgid "Calibre binaries not viable"
msgstr "DB não é gravável"
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr ""
#: cps/helper.py:1060
#: cps/helper.py:1052
#, fuzzy, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr "Faltam as permissões de execução"
#: cps/helper.py:1065
#: cps/helper.py:1057
#, fuzzy
msgid "Error executing Calibre"
msgstr "Erro excecutando UnRar"
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: 2020-04-29 01:20+0400\n"
"Last-Translator: ZIZA\n"
"Language: ru\n"
@ -751,118 +751,118 @@ msgstr ""
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr ""
#: cps/helper.py:441
#: cps/helper.py:439
#, fuzzy, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Переименовывание заголовка с: '%(src)s' на '%(dest)s' не удалось из-за ошибки: %(error)s"
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "Файл %(file)s не найден на Google Drive"
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Переименовывание заголовка с: '%(src)s' на '%(dest)s' не удалось из-за ошибки: %(error)s"
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "Путь книги %(path)s не найден на Google Drive"
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr ""
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr "Это имя пользователя уже занято"
#: cps/helper.py:687
#: cps/helper.py:679
msgid "Invalid Email address format"
msgstr ""
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr ""
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr ""
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr ""
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr ""
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr ""
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr "Не удалось создать путь для обложки."
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr ""
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr ""
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr ""
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr "Только файлы в формате jpg / jpeg поддерживаются как файл обложки"
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
#, fuzzy
msgid "Cover"
msgstr "Обзор"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr ""
#: cps/helper.py:1024
#: cps/helper.py:1016
msgid "Error executing UnRar"
msgstr ""
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr ""
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr ""
#: cps/helper.py:1049
#: cps/helper.py:1041
msgid "Calibre binaries not viable"
msgstr ""
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr ""
#: cps/helper.py:1060
#: cps/helper.py:1052
#, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr ""
#: cps/helper.py:1065
#: cps/helper.py:1057
msgid "Error executing Calibre"
msgstr ""
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: 2023-11-01 06:12+0100\n"
"Last-Translator: Branislav Hanáček <brango@brango.sk>\n"
"Language: sk_SK\n"
@ -731,119 +731,119 @@ msgstr "Mazanie knihy %(id)s zlyhalo: %(message)s"
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr "Mazanie knihy %(id)s iba z databázy, cesta ku knihe v databáze nie je platná: %(path)s"
#: cps/helper.py:441
#: cps/helper.py:439
#, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Premenovanie autora z: '%(src)s' na '%(dest)s' zlyhalo s chybou: %(error)s"
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "Súbor %(file)s sa nenašiel na Google Drive"
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Zmena názvu knihy z: '%(src)s' na '%(dest)s' zlyhalo s chybou: %(error)s"
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "Cesta ku knihe %(path)s sa nenašla na Google Drive"
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr "Pre túto poštovú adresu sa našiel existujúci účet"
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr "Toto meno používateľa sa už používa"
#: cps/helper.py:687
#: cps/helper.py:679
msgid "Invalid Email address format"
msgstr "Neplatný formát poštovej adresy"
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr "Heslo nedodržiava pravidlá validácie"
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr "Python modul 'advocate' nie je nainštalovaný ale je potrebný pre nahrávanie obálok kníh"
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr "Chyba pri sťahovaní obálky knihy"
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr "Chyba formátu obálky knihy"
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr "Nemáte povolené pristupovať na lokálneho hostiteľa alebo lokálnu sieť na pre nahrávanie obálok kníh"
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr "Vytváranie cesty k obálke knihy zlyhalo"
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr "Súbor obálky knihy nie je platný súbor s obrázkom alebo nie je uložený"
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr "Ako súbor obálky knihy sú podporované iba súbory jpg/jpeg/png/webp/bmp"
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr "Neplatný obsah súboru obalky knihy"
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr "Ako súbor obálky knihy sú podporované iba súbory jpg/jpeg"
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
msgid "Cover"
msgstr "Obálka knihy"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr "Binárny súbor pre UnRar sa nenašiel"
#: cps/helper.py:1024
#: cps/helper.py:1016
msgid "Error executing UnRar"
msgstr "Chyba pri spustení UnRar"
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr ""
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr ""
#: cps/helper.py:1049
#: cps/helper.py:1041
#, fuzzy
msgid "Calibre binaries not viable"
msgstr "Do databázy nie je možné zapisovať"
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr ""
#: cps/helper.py:1060
#: cps/helper.py:1052
#, fuzzy, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr "Chýba právo na vykonanie"
#: cps/helper.py:1065
#: cps/helper.py:1057
#, fuzzy
msgid "Error executing Calibre"
msgstr "Chyba pri spustení UnRar"
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr "Zaradiť všetky knihy na zálohovanie metadát"

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: 2021-05-13 11:00+0000\n"
"Last-Translator: Jonatan Nyberg <jonatan.nyberg.karl@gmail.com>\n"
"Language: sv\n"
@ -747,122 +747,122 @@ msgstr "Borttagning av boken %(id)s misslyckades: %(message)s"
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr "Borttagning av boken %(id)s, boksökväg inte giltig: %(path)s"
#: cps/helper.py:441
#: cps/helper.py:439
#, fuzzy, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Byt namn på titel från: \"%(src)s\" till \"%(dest)s\" misslyckades med fel: %(error)s"
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "Filen %(file)s hittades inte på Google Drive"
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Byt namn på titel från: \"%(src)s\" till \"%(dest)s\" misslyckades med fel: %(error)s"
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "Boksökvägen %(path)s hittades inte på Google Drive"
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr ""
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr "Detta användarnamn är redan taget"
#: cps/helper.py:687
#: cps/helper.py:679
#, fuzzy
msgid "Invalid Email address format"
msgstr "Ogiltigt e-postadressformat"
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr ""
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr ""
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr "Fel vid hämtning av omslaget"
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr "Fel på omslagsformat"
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr ""
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr "Det gick inte att skapa sökväg för omslag"
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr "Omslagsfilen är inte en giltig bildfil eller kunde inte lagras"
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr "Endast jpg/jpeg/png/webp/bmp-filer stöds som omslagsfil"
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr ""
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr "Endast jpg/jpeg-filer stöds som omslagsfil"
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
#, fuzzy
msgid "Cover"
msgstr "Upptäck"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr "UnRar binär fil hittades inte"
#: cps/helper.py:1024
#: cps/helper.py:1016
#, fuzzy
msgid "Error executing UnRar"
msgstr "Fel vid körning av UnRar"
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr ""
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr ""
#: cps/helper.py:1049
#: cps/helper.py:1041
#, fuzzy
msgid "Calibre binaries not viable"
msgstr "DB är inte skrivbar"
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr ""
#: cps/helper.py:1060
#: cps/helper.py:1052
#, fuzzy, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr "Körningstillstånd saknas"
#: cps/helper.py:1065
#: cps/helper.py:1057
#, fuzzy
msgid "Error executing Calibre"
msgstr "Fel vid körning av UnRar"
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: 2020-04-23 22:47+0300\n"
"Last-Translator: iz <iz7iz7iz@protonmail.ch>\n"
"Language: tr\n"
@ -744,118 +744,118 @@ msgstr ""
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr ""
#: cps/helper.py:441
#: cps/helper.py:439
#, fuzzy, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Kitap adını değiştirme sırasında hata oluştu ('%(src)s' → '%(dest)s'): %(error)s"
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "%(file)s dosyası Google Drive'da bulunamadı"
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "Kitap adını değiştirme sırasında hata oluştu ('%(src)s' → '%(dest)s'): %(error)s"
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "eKitap yolu %(path)s Google Drive'da bulunamadı"
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr ""
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr "Bu kullanıcı adı zaten alındı"
#: cps/helper.py:687
#: cps/helper.py:679
msgid "Invalid Email address format"
msgstr ""
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr ""
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr ""
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr ""
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr ""
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr ""
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr ""
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr ""
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr ""
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr ""
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr ""
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
#, fuzzy
msgid "Cover"
msgstr "Keşfet"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr ""
#: cps/helper.py:1024
#: cps/helper.py:1016
msgid "Error executing UnRar"
msgstr ""
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr ""
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr ""
#: cps/helper.py:1049
#: cps/helper.py:1041
msgid "Calibre binaries not viable"
msgstr ""
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr ""
#: cps/helper.py:1060
#: cps/helper.py:1052
#, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr ""
#: cps/helper.py:1065
#: cps/helper.py:1057
msgid "Error executing Calibre"
msgstr ""
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr ""

View File

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: 2017-04-30 00:47+0300\n"
"Last-Translator: ABIS Team <biblio.if.abis@gmail.com>\n"
"Language: uk\n"
@ -740,118 +740,118 @@ msgstr ""
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr ""
#: cps/helper.py:441
#: cps/helper.py:439
#, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr ""
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr ""
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr ""
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr ""
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr ""
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr ""
#: cps/helper.py:687
#: cps/helper.py:679
msgid "Invalid Email address format"
msgstr ""
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr ""
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr ""
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr ""
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr ""
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr ""
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr ""
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr ""
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr ""
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr ""
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr ""
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
#, fuzzy
msgid "Cover"
msgstr "Огляд"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr ""
#: cps/helper.py:1024
#: cps/helper.py:1016
msgid "Error executing UnRar"
msgstr ""
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr ""
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr ""
#: cps/helper.py:1049
#: cps/helper.py:1041
msgid "Calibre binaries not viable"
msgstr ""
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr ""
#: cps/helper.py:1060
#: cps/helper.py:1052
#, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr ""
#: cps/helper.py:1065
#: cps/helper.py:1057
msgid "Error executing Calibre"
msgstr ""
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr ""

View File

@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: 2022-09-20 21:36+0700\n"
"Last-Translator: Ha Link <halink0803@gmail.com>\n"
"Language: vi\n"
@ -734,119 +734,119 @@ msgstr "Xoá sách %(id)s thất bại: %(message)s"
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr ""
#: cps/helper.py:441
#: cps/helper.py:439
#, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr ""
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "File %(file)s không tìm thấy trẻn Google Drive"
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr ""
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "Không tìm thấy được dẫn sách %(path)s trên Google Drive"
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr ""
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr "Username này đã bị sử dụng"
#: cps/helper.py:687
#: cps/helper.py:679
#, fuzzy
msgid "Invalid Email address format"
msgstr "Định dạng email address không hợp lệ"
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr ""
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr ""
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr "Lỗi tải xuống ảnh bìa"
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr "Định dạng ảnh bìa lỗi"
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr ""
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr "Tạo đường dẫn cho ảnh bìa thất bại"
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr ""
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr ""
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr ""
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr ""
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
#, fuzzy
msgid "Cover"
msgstr "Khám phá"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr ""
#: cps/helper.py:1024
#: cps/helper.py:1016
msgid "Error executing UnRar"
msgstr ""
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr ""
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr ""
#: cps/helper.py:1049
#: cps/helper.py:1041
msgid "Calibre binaries not viable"
msgstr ""
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr ""
#: cps/helper.py:1060
#: cps/helper.py:1052
#, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr ""
#: cps/helper.py:1065
#: cps/helper.py:1057
msgid "Error executing Calibre"
msgstr ""
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: 2020-09-27 22:18+0800\n"
"Last-Translator: xlivevil <xlivevil@aliyun.com>\n"
"Language: zh_CN\n"
@ -731,119 +731,119 @@ msgstr "删除书籍 %(id)s 失败:%(message)s"
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr "仅从数据库中删除书籍 %(id)s数据库中的书籍路径无效 %(path)s"
#: cps/helper.py:441
#: cps/helper.py:439
#, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "将作者从“%(src)s”改为“%(dest)s”时失败出错信息%(error)s"
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "Google Drive 上找不到文件 %(file)s"
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "将标题从“%(src)s”改为“%(dest)s”时失败出错信息%(error)s"
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "Google Drive 上找不到书籍路径 %(path)s"
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr "已存在使用此邮箱的账户"
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr "此用户名已被使用"
#: cps/helper.py:687
#: cps/helper.py:679
msgid "Invalid Email address format"
msgstr "无效的邮箱格式"
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr "密码不符合密码验证规则"
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr "上传封面所需的 Python 模块 'advocate' 未安装"
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr "下载封面时出错"
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr "封面格式出错"
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr "您没有访问本地主机或本地网络进行封面上传"
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr "创建封面路径失败"
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr "封面文件不是有效的图片文件,或者无法存储它"
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr "封面文件只支持 jpg、jpeg、png、webp、bmp 文件"
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr "封面文件内容无效"
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr "仅将 jpg、jpeg 文件作为封面文件"
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
msgid "Cover"
msgstr "封面"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr "找不到 UnRar 执行文件"
#: cps/helper.py:1024
#: cps/helper.py:1016
msgid "Error executing UnRar"
msgstr "执行 UnRar 时出错"
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr ""
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr ""
#: cps/helper.py:1049
#: cps/helper.py:1041
#, fuzzy
msgid "Calibre binaries not viable"
msgstr "数据库不可写入"
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr ""
#: cps/helper.py:1060
#: cps/helper.py:1052
#, fuzzy, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr "缺少执行权限"
#: cps/helper.py:1065
#: cps/helper.py:1057
#, fuzzy
msgid "Error executing Calibre"
msgstr "执行 UnRar 时出错"
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr "将所有书籍加入元数据备份队列"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: 2020-09-27 22:18+0800\n"
"Last-Translator: xlivevil <xlivevil@aliyun.com>\n"
"Language: zh_TW\n"
@ -741,122 +741,122 @@ msgstr "刪除書籍 %(id)s失敗%(message)s"
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr "僅從數據庫中刪除書籍 %(id)s數據庫中的書籍路徑無效 %(path)s"
#: cps/helper.py:441
#: cps/helper.py:439
#, fuzzy, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "將標題從“%(src)s”改為“%(dest)s”時失敗錯誤錯信息%(error)s"
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr "Google Drive上找不到文件 %(file)s"
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr "將標題從“%(src)s”改為“%(dest)s”時失敗錯誤錯信息%(error)s"
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr "Google Drive上找不到書籍路徑 %(path)s"
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr ""
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr "此用戶名已被使用"
#: cps/helper.py:687
#: cps/helper.py:679
#, fuzzy
msgid "Invalid Email address format"
msgstr "無效的郵件地址格式"
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr ""
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr ""
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr "下載封面時出錯"
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr "封面格式出錯"
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr ""
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr "創建封面路徑失敗"
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr "封面文件不是有效的圖片文件,或者無法儲存"
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr "封面文件只支持jpg/jpeg/png/webp/bmp格式文件"
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr ""
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr "僅將jpg、jpeg文件作為封面文件"
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
#, fuzzy
msgid "Cover"
msgstr "發現"
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr "找不到UnRar執行文件"
#: cps/helper.py:1024
#: cps/helper.py:1016
#, fuzzy
msgid "Error executing UnRar"
msgstr "執行UnRar時出錯"
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr ""
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr ""
#: cps/helper.py:1049
#: cps/helper.py:1041
#, fuzzy
msgid "Calibre binaries not viable"
msgstr "數據庫不可寫入"
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr ""
#: cps/helper.py:1060
#: cps/helper.py:1052
#, fuzzy, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr "缺少執行權限"
#: cps/helper.py:1065
#: cps/helper.py:1057
#, fuzzy
msgid "Error executing Calibre"
msgstr "執行UnRar時出錯"
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-09-14 10:51+0200\n"
"POT-Creation-Date: 2024-09-21 12:05+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -729,117 +729,117 @@ msgstr ""
msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s"
msgstr ""
#: cps/helper.py:441
#: cps/helper.py:439
#, python-format
msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr ""
#: cps/helper.py:512 cps/helper.py:521
#: cps/helper.py:507 cps/helper.py:516
#, python-format
msgid "File %(file)s not found on Google Drive"
msgstr ""
#: cps/helper.py:567
#: cps/helper.py:559
#, python-format
msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
msgstr ""
#: cps/helper.py:605
#: cps/helper.py:597
#, python-format
msgid "Book path %(path)s not found on Google Drive"
msgstr ""
#: cps/helper.py:665
#: cps/helper.py:657
msgid "Found an existing account for this Email address"
msgstr ""
#: cps/helper.py:673
#: cps/helper.py:665
msgid "This username is already taken"
msgstr ""
#: cps/helper.py:687
#: cps/helper.py:679
msgid "Invalid Email address format"
msgstr ""
#: cps/helper.py:709
#: cps/helper.py:701
msgid "Password doesn't comply with password validation rules"
msgstr ""
#: cps/helper.py:855
#: cps/helper.py:847
msgid "Python module 'advocate' is not installed but is needed for cover uploads"
msgstr ""
#: cps/helper.py:865
#: cps/helper.py:857
msgid "Error Downloading Cover"
msgstr ""
#: cps/helper.py:868
#: cps/helper.py:860
msgid "Cover Format Error"
msgstr ""
#: cps/helper.py:871
#: cps/helper.py:863
msgid "You are not allowed to access localhost or the local network for cover uploads"
msgstr ""
#: cps/helper.py:881
#: cps/helper.py:873
msgid "Failed to create path for cover"
msgstr ""
#: cps/helper.py:897
#: cps/helper.py:889
msgid "Cover-file is not a valid image file, or could not be stored"
msgstr ""
#: cps/helper.py:908
#: cps/helper.py:900
msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile"
msgstr ""
#: cps/helper.py:920
#: cps/helper.py:912
msgid "Invalid cover file content"
msgstr ""
#: cps/helper.py:924
#: cps/helper.py:916
msgid "Only jpg/jpeg files are supported as coverfile"
msgstr ""
#: cps/helper.py:996 cps/helper.py:1153
#: cps/helper.py:988 cps/helper.py:1145
msgid "Cover"
msgstr ""
#: cps/helper.py:1013
#: cps/helper.py:1005
msgid "UnRar binary file not found"
msgstr ""
#: cps/helper.py:1024
#: cps/helper.py:1016
msgid "Error executing UnRar"
msgstr ""
#: cps/helper.py:1032
#: cps/helper.py:1024
msgid "Could not find the specified directory"
msgstr ""
#: cps/helper.py:1035
#: cps/helper.py:1027
msgid "Please specify a directory, not a file"
msgstr ""
#: cps/helper.py:1049
#: cps/helper.py:1041
msgid "Calibre binaries not viable"
msgstr ""
#: cps/helper.py:1058
#: cps/helper.py:1050
#, python-format
msgid "Missing calibre binaries: %(missing)s"
msgstr ""
#: cps/helper.py:1060
#: cps/helper.py:1052
#, python-format
msgid "Missing executable permissions: %(missing)s"
msgstr ""
#: cps/helper.py:1065
#: cps/helper.py:1057
msgid "Error executing Calibre"
msgstr ""
#: cps/helper.py:1155 cps/templates/admin.html:216
#: cps/helper.py:1147 cps/templates/admin.html:216
msgid "Queue all books for metadata backup"
msgstr ""

View File

@ -17,7 +17,7 @@ google-api-python-client>=1.7.11,<2.200.0
# goodreads
goodreads>=0.3.2,<0.4.0
python-Levenshtein>=0.12.0,<0.26.0
python-Levenshtein>=0.12.0,<0.27.0
# ldap login
python-ldap>=3.0.0,<3.5.0

View File

@ -33,9 +33,9 @@ dependencies = [
"Flask-Principal>=0.3.2,<0.5.1",
"Flask>=1.0.2,<3.1.0",
"iso-639>=0.4.5,<0.5.0",
"PyPDF>=3.15.6,<4.3.0",
"PyPDF>=3.15.6,<5.1.0",
"pytz>=2016.10",
"requests>=2.28.0,<2.32.0",
"requests>=2.28.0,<2.33.0",
"SQLAlchemy>=1.3.0,<2.1.0",
"tornado>=6.3,<6.5",
"Wand>=0.4.4,<0.7.0",
@ -43,7 +43,8 @@ dependencies = [
"lxml>=4.9.1,<5.3.0",
"flask-wtf>=0.14.2,<1.3.0",
"chardet>=3.0.0,<5.3.0",
"advocate>=1.0.0,<1.1.0",
"netifaces-plus>0.12.0,<0.13.0",
"urllib3<2.0,>=1.22",
"Flask-Limiter>=2.3.0,<3.9.0",
"regex>=2022.3.2,<2024.6.25",
"bleach>=6.0.0,<6.2.0",
@ -83,7 +84,7 @@ gmail = [
]
goodreads = [
"goodreads>=0.3.2,<0.4.0",
"python-Levenshtein>=0.12.0,<0.26.0",
"python-Levenshtein>=0.12.0,<0.27.0",
]
ldap = [
"python-ldap>=3.0.0,<3.5.0",

View File

@ -4,7 +4,7 @@ Flask-Babel>=0.11.1,<4.1.0
Flask-Principal>=0.3.2,<0.5.1
Flask>=1.0.2,<3.1.0
iso-639>=0.4.5,<0.5.0
PyPDF>=3.15.6,<4.4.0
PyPDF>=3.15.6,<5.1.0
pytz>=2016.10
requests>=2.28.0,<2.33.0
SQLAlchemy>=1.3.0,<2.1.0
@ -14,7 +14,8 @@ unidecode>=0.04.19,<1.4.0
lxml>=4.9.1,<5.3.0
flask-wtf>=0.14.2,<1.3.0
chardet>=3.0.0,<5.3.0
advocate>=1.0.0,<1.1.0
netifaces-plus>0.12.0,<0.13.0
urllib3<2.0,>=1.22
Flask-Limiter>=2.3.0,<3.9.0
regex>=2022.3.2,<2024.6.25
bleach>=6.0.0,<6.2.0