From 9c03bf782e14a991cf317055d4f91eeb44718fc2 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 30 May 2022 10:15:22 -0700 Subject: [PATCH 01/21] Make an async request to all search connectors This is the untest first pass at re-arranging remote search to work in parallel rather than sequence. It moves a couple functions around (raise_not_valid_url, for example, needs to be in connector_manager.py now to avoid circular imports). It adds a function to Connector objects that generates a search result (either to the isbn endpoint or the free text endpoint) based on the query, which was previously done as part of the search. I also lowered the timeout to 8 seconds by default. --- bookwyrm/connectors/abstract_connector.py | 34 ++++----- bookwyrm/connectors/connector_manager.py | 84 +++++++++++++---------- bookwyrm/settings.py | 2 +- requirements.txt | 1 + 4 files changed, 62 insertions(+), 59 deletions(-) diff --git a/bookwyrm/connectors/abstract_connector.py b/bookwyrm/connectors/abstract_connector.py index 56e273886..6685d5a09 100644 --- a/bookwyrm/connectors/abstract_connector.py +++ b/bookwyrm/connectors/abstract_connector.py @@ -1,9 +1,8 @@ """ functionality outline for a book data connector """ from abc import ABC, abstractmethod import imghdr -import ipaddress import logging -from urllib.parse import urlparse +import re from django.core.files.base import ContentFile from django.db import transaction @@ -11,7 +10,7 @@ import requests from requests.exceptions import RequestException from bookwyrm import activitypub, models, settings -from .connector_manager import load_more_data, ConnectorException +from .connector_manager import load_more_data, ConnectorException, raise_not_valid_url from .format_mappings import format_mappings @@ -39,6 +38,18 @@ class AbstractMinimalConnector(ABC): for field in self_fields: setattr(self, field, getattr(info, field)) + def get_search_url(self, query): + """ format the query url """ + # Check if the query resembles an ISBN + isbn = re.sub(r"[\W_]", "", query) # removes filler characters + maybe_isbn = len(isbn) in [10, 13] # ISBN10 or ISBN13 + if maybe_isbn and self.isbn_search_url and self.isbn_search_url != "": + return f"{self.isbn_search_url}{query}" + + # NOTE: previously, we tried searching isbn and if that produces no results, + # searched as free text. This, instead, only searches isbn if it's isbn-y + return f"{self.search_url}{query}" + def search(self, query, min_confidence=None, timeout=settings.QUERY_TIMEOUT): """free text search""" params = {} @@ -254,9 +265,6 @@ def get_data(url, params=None, timeout=10): # check if the url is blocked raise_not_valid_url(url) - if models.FederatedServer.is_blocked(url): - raise ConnectorException(f"Attempting to load data from blocked url: {url}") - try: resp = requests.get( url, @@ -311,20 +319,6 @@ def get_image(url, timeout=10): return image_content, extension -def raise_not_valid_url(url): - """do some basic reality checks on the url""" - parsed = urlparse(url) - if not parsed.scheme in ["http", "https"]: - raise ConnectorException("Invalid scheme: ", url) - - try: - ipaddress.ip_address(parsed.netloc) - raise ConnectorException("Provided url is an IP address: ", url) - except ValueError: - # it's not an IP address, which is good - pass - - class Mapping: """associate a local database field with a field in an external dataset""" diff --git a/bookwyrm/connectors/connector_manager.py b/bookwyrm/connectors/connector_manager.py index 14bb702cb..2b5ab1c9d 100644 --- a/bookwyrm/connectors/connector_manager.py +++ b/bookwyrm/connectors/connector_manager.py @@ -1,10 +1,11 @@ """ interface with whatever connectors the app has """ -from datetime import datetime +import asyncio import importlib +import ipaddress import logging -import re from urllib.parse import urlparse +import aiohttp from django.dispatch import receiver from django.db.models import signals @@ -21,52 +22,42 @@ class ConnectorException(HTTPError): """when the connector can't do what was asked""" +async def async_connector_search(query, connectors, params): + """Try a number of requests simultaneously""" + timeout = aiohttp.ClientTimeout(total=SEARCH_TIMEOUT) + async with aiohttp.ClientSession(timeout=timeout) as session: + for connector in connectors: + url = connector.get_search_url(query) + raise_not_valid_url(url) + + async with session.get(url, params=params) as response: + print("Status:", response.status) + print(response.ok) + print("Content-type:", response.headers['content-type']) + + raw_response = await response.json() + yield { + "connector": connector, + "results": connector.parse_search_data(raw_response) + } + + def search(query, min_confidence=0.1, return_first=False): """find books based on arbitary keywords""" if not query: return [] results = [] - # Have we got a ISBN ? - isbn = re.sub(r"[\W_]", "", query) - maybe_isbn = len(isbn) in [10, 13] # ISBN10 or ISBN13 - start_time = datetime.now() - for connector in get_connectors(): - result_set = None - if maybe_isbn and connector.isbn_search_url and connector.isbn_search_url != "": - # Search on ISBN - try: - result_set = connector.isbn_search(isbn) - except Exception as err: # pylint: disable=broad-except - logger.info(err) - # if this fails, we can still try regular search + connectors = list(get_connectors()) - # if no isbn search results, we fallback to generic search - if not result_set: - try: - result_set = connector.search(query, min_confidence=min_confidence) - except Exception as err: # pylint: disable=broad-except - # we don't want *any* error to crash the whole search page - logger.info(err) - continue - - if return_first and result_set: - # if we found anything, return it - return result_set[0] - - if result_set: - results.append( - { - "connector": connector, - "results": result_set, - } - ) - if (datetime.now() - start_time).seconds >= SEARCH_TIMEOUT: - break + # load as many results as we can + params = {"min_confidence": min_confidence} + results = asyncio.run(async_connector_search(query, connectors, params)) if return_first: - return None + # find the best result from all the responses and return that + raise Exception("Not implemented yet") return results @@ -133,3 +124,20 @@ def create_connector(sender, instance, created, *args, **kwargs): """create a connector to an external bookwyrm server""" if instance.application_type == "bookwyrm": get_or_create_connector(f"https://{instance.server_name}") + + +def raise_not_valid_url(url): + """do some basic reality checks on the url""" + parsed = urlparse(url) + if not parsed.scheme in ["http", "https"]: + raise ConnectorException("Invalid scheme: ", url) + + try: + ipaddress.ip_address(parsed.netloc) + raise ConnectorException("Provided url is an IP address: ", url) + except ValueError: + # it's not an IP address, which is good + pass + + if models.FederatedServer.is_blocked(url): + raise ConnectorException(f"Attempting to load data from blocked url: {url}") diff --git a/bookwyrm/settings.py b/bookwyrm/settings.py index e16c576e1..dc0d71f30 100644 --- a/bookwyrm/settings.py +++ b/bookwyrm/settings.py @@ -212,7 +212,7 @@ STREAMS = [ # Search configuration # total time in seconds that the instance will spend searching connectors -SEARCH_TIMEOUT = int(env("SEARCH_TIMEOUT", 15)) +SEARCH_TIMEOUT = int(env("SEARCH_TIMEOUT", 8)) # timeout for a query to an individual connector QUERY_TIMEOUT = int(env("QUERY_TIMEOUT", 5)) diff --git a/requirements.txt b/requirements.txt index 7614dc421..c3bdaf757 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ +aiohttp==3.8.1 celery==5.2.2 colorthief==0.2.1 Django==3.2.13 From 0adda36da7a2de92ca36805b1b848a8eb100c98e Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 30 May 2022 10:34:03 -0700 Subject: [PATCH 02/21] Remove search endpoints from Connector Instead of having individual search functions that make individual requests, the connectors will always be searched asynchronously together. The process_seach_response combines the parse and format functions, which could probably be merged into one over-rideable function. The current to-do on this is to remove Inventaire search results that are below the confidence threshhold after search, which used to happen in the `search` function. --- bookwyrm/connectors/abstract_connector.py | 56 +++++++---------------- bookwyrm/connectors/connector_manager.py | 5 +- bookwyrm/connectors/inventaire.py | 8 ---- 3 files changed, 19 insertions(+), 50 deletions(-) diff --git a/bookwyrm/connectors/abstract_connector.py b/bookwyrm/connectors/abstract_connector.py index 6685d5a09..fa3624f82 100644 --- a/bookwyrm/connectors/abstract_connector.py +++ b/bookwyrm/connectors/abstract_connector.py @@ -39,52 +39,24 @@ class AbstractMinimalConnector(ABC): setattr(self, field, getattr(info, field)) def get_search_url(self, query): - """ format the query url """ + """format the query url""" # Check if the query resembles an ISBN - isbn = re.sub(r"[\W_]", "", query) # removes filler characters - maybe_isbn = len(isbn) in [10, 13] # ISBN10 or ISBN13 - if maybe_isbn and self.isbn_search_url and self.isbn_search_url != "": + if maybe_isbn(query) and self.isbn_search_url and self.isbn_search_url != "": return f"{self.isbn_search_url}{query}" # NOTE: previously, we tried searching isbn and if that produces no results, # searched as free text. This, instead, only searches isbn if it's isbn-y return f"{self.search_url}{query}" - def search(self, query, min_confidence=None, timeout=settings.QUERY_TIMEOUT): - """free text search""" - params = {} - if min_confidence: - params["min_confidence"] = min_confidence - - data = self.get_search_data( - f"{self.search_url}{query}", - params=params, - timeout=timeout, - ) - results = [] - - for doc in self.parse_search_data(data)[:10]: - results.append(self.format_search_result(doc)) - return results - - def isbn_search(self, query, timeout=settings.QUERY_TIMEOUT): - """isbn search""" - params = {} - data = self.get_search_data( - f"{self.isbn_search_url}{query}", - params=params, - timeout=timeout, - ) - results = [] - - # this shouldn't be returning mutliple results, but just in case - for doc in self.parse_isbn_search_data(data)[:10]: - results.append(self.format_isbn_search_result(doc)) - return results - - def get_search_data(self, remote_id, **kwargs): # pylint: disable=no-self-use - """this allows connectors to override the default behavior""" - return get_data(remote_id, **kwargs) + def process_search_response(self, query, data): + """Format the search results based on the formt of the query""" + # TODO: inventaire min confidence + parser = self.parse_search_data + formatter = self.format_search_result + if maybe_isbn(query): + parser = self.parse_isbn_search_data + formatter = self.format_isbn_search_result + return [formatter(doc) for doc in parser(data)[:10]] @abstractmethod def get_or_create_book(self, remote_id): @@ -360,3 +332,9 @@ def unique_physical_format(format_text): # try a direct match, so saving this would be redundant return None return format_text + + +def maybe_isbn(query): + """check if a query looks like an isbn""" + isbn = re.sub(r"[\W_]", "", query) # removes filler characters + return len(isbn) in [10, 13] # ISBN10 or ISBN13 diff --git a/bookwyrm/connectors/connector_manager.py b/bookwyrm/connectors/connector_manager.py index 2b5ab1c9d..3c90ba5fe 100644 --- a/bookwyrm/connectors/connector_manager.py +++ b/bookwyrm/connectors/connector_manager.py @@ -33,12 +33,12 @@ async def async_connector_search(query, connectors, params): async with session.get(url, params=params) as response: print("Status:", response.status) print(response.ok) - print("Content-type:", response.headers['content-type']) + print("Content-type:", response.headers["content-type"]) raw_response = await response.json() yield { "connector": connector, - "results": connector.parse_search_data(raw_response) + "results": connector.process_search_response(query, raw_response), } @@ -48,7 +48,6 @@ def search(query, min_confidence=0.1, return_first=False): return [] results = [] - connectors = list(get_connectors()) # load as many results as we can diff --git a/bookwyrm/connectors/inventaire.py b/bookwyrm/connectors/inventaire.py index a9aeb94f9..f25796125 100644 --- a/bookwyrm/connectors/inventaire.py +++ b/bookwyrm/connectors/inventaire.py @@ -77,14 +77,6 @@ class Connector(AbstractConnector): **{k: data.get(k) for k in ["uri", "image", "labels", "sitelinks", "type"]}, } - def search(self, query, min_confidence=None): # pylint: disable=arguments-differ - """overrides default search function with confidence ranking""" - results = super().search(query) - if min_confidence: - # filter the search results after the fact - return [r for r in results if r.confidence >= min_confidence] - return results - def parse_search_data(self, data): return data.get("results") From 9a9cef77665c9c32bf9b7a525564757e678fd549 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 30 May 2022 11:16:05 -0700 Subject: [PATCH 03/21] Verify url before async search The database lookup doesn't work during the asyn process, so this change loops through the connectors and grabs the formatted urls before sending it to the async handler. --- bookwyrm/connectors/connector_manager.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/bookwyrm/connectors/connector_manager.py b/bookwyrm/connectors/connector_manager.py index 3c90ba5fe..300f1e933 100644 --- a/bookwyrm/connectors/connector_manager.py +++ b/bookwyrm/connectors/connector_manager.py @@ -22,13 +22,13 @@ class ConnectorException(HTTPError): """when the connector can't do what was asked""" -async def async_connector_search(query, connectors, params): +async def async_connector_search(query, items, params): """Try a number of requests simultaneously""" timeout = aiohttp.ClientTimeout(total=SEARCH_TIMEOUT) async with aiohttp.ClientSession(timeout=timeout) as session: - for connector in connectors: + for url, connector in items: url = connector.get_search_url(query) - raise_not_valid_url(url) + # raise_not_valid_url(url) async with session.get(url, params=params) as response: print("Status:", response.status) @@ -36,7 +36,7 @@ async def async_connector_search(query, connectors, params): print("Content-type:", response.headers["content-type"]) raw_response = await response.json() - yield { + return { "connector": connector, "results": connector.process_search_response(query, raw_response), } @@ -48,11 +48,18 @@ def search(query, min_confidence=0.1, return_first=False): return [] results = [] - connectors = list(get_connectors()) + items = [] + for connector in get_connectors(): + # get the search url from the connector before sending + url = connector.get_search_url(query) + # check the URL is valid + raise_not_valid_url(url) + items.append((url, connector)) # load as many results as we can params = {"min_confidence": min_confidence} - results = asyncio.run(async_connector_search(query, connectors, params)) + results = asyncio.run(async_connector_search(query, items, params)) + raise Exception("Hi") if return_first: # find the best result from all the responses and return that From 5e81ec75fbf04a6b08d80b83ae90889e96f4e7a9 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 30 May 2022 11:19:16 -0700 Subject: [PATCH 04/21] Set request headers in async search get request Gotta ask for json --- bookwyrm/connectors/connector_manager.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/bookwyrm/connectors/connector_manager.py b/bookwyrm/connectors/connector_manager.py index 300f1e933..a94cdbc59 100644 --- a/bookwyrm/connectors/connector_manager.py +++ b/bookwyrm/connectors/connector_manager.py @@ -12,7 +12,7 @@ from django.db.models import signals from requests import HTTPError from bookwyrm import book_search, models -from bookwyrm.settings import SEARCH_TIMEOUT +from bookwyrm.settings import SEARCH_TIMEOUT, USER_AGENT from bookwyrm.tasks import app logger = logging.getLogger(__name__) @@ -25,12 +25,19 @@ class ConnectorException(HTTPError): async def async_connector_search(query, items, params): """Try a number of requests simultaneously""" timeout = aiohttp.ClientTimeout(total=SEARCH_TIMEOUT) + # pylint: disable=line-too-long + headers = { + "Accept": ( + 'application/json, application/activity+json, application/ld+json; profile="https://www.w3.org/ns/activitystreams"; charset=utf-8' + ), + "User-Agent": USER_AGENT, + } async with aiohttp.ClientSession(timeout=timeout) as session: for url, connector in items: url = connector.get_search_url(query) # raise_not_valid_url(url) - async with session.get(url, params=params) as response: + async with session.get(url, headers=headers, params=params) as response: print("Status:", response.status) print(response.ok) print("Content-type:", response.headers["content-type"]) From 45f2199c7120e20d4c098676b0d0b926eadd7e40 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 30 May 2022 11:58:39 -0700 Subject: [PATCH 05/21] Gather and wait on async requests This sends out the request tasks all at once and then aggregates the results, instead of just running them one after another asynchronously. --- bookwyrm/connectors/connector_manager.py | 50 +++++++++++++++--------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/bookwyrm/connectors/connector_manager.py b/bookwyrm/connectors/connector_manager.py index a94cdbc59..23cde632b 100644 --- a/bookwyrm/connectors/connector_manager.py +++ b/bookwyrm/connectors/connector_manager.py @@ -12,7 +12,7 @@ from django.db.models import signals from requests import HTTPError from bookwyrm import book_search, models -from bookwyrm.settings import SEARCH_TIMEOUT, USER_AGENT +from bookwyrm.settings import QUERY_TIMEOUT, USER_AGENT from bookwyrm.tasks import app logger = logging.getLogger(__name__) @@ -22,9 +22,8 @@ class ConnectorException(HTTPError): """when the connector can't do what was asked""" -async def async_connector_search(query, items, params): - """Try a number of requests simultaneously""" - timeout = aiohttp.ClientTimeout(total=SEARCH_TIMEOUT) +async def get_results(session, url, params, query, connector): + """try this specific connector""" # pylint: disable=line-too-long headers = { "Accept": ( @@ -32,21 +31,36 @@ async def async_connector_search(query, items, params): ), "User-Agent": USER_AGENT, } + try: + async with session.get(url, headers=headers, params=params) as response: + try: + raw_data = await response.json() + except aiohttp.client_exceptions.ContentTypeError as err: + logger.exception(err) + return None + + return { + "connector": connector, + "results": connector.process_search_response(query, raw_data), + } + except asyncio.TimeoutError: + logger.exception("Connection timout for url: %s", url) + + +async def async_connector_search(query, items, params): + """Try a number of requests simultaneously""" + timeout = aiohttp.ClientTimeout(total=QUERY_TIMEOUT) async with aiohttp.ClientSession(timeout=timeout) as session: + tasks = [] for url, connector in items: - url = connector.get_search_url(query) - # raise_not_valid_url(url) + tasks.append( + asyncio.ensure_future( + get_results(session, url, params, query, connector) + ) + ) - async with session.get(url, headers=headers, params=params) as response: - print("Status:", response.status) - print(response.ok) - print("Content-type:", response.headers["content-type"]) - - raw_response = await response.json() - return { - "connector": connector, - "results": connector.process_search_response(query, raw_response), - } + results = await asyncio.gather(*tasks) + return results def search(query, min_confidence=0.1, return_first=False): @@ -66,13 +80,13 @@ def search(query, min_confidence=0.1, return_first=False): # load as many results as we can params = {"min_confidence": min_confidence} results = asyncio.run(async_connector_search(query, items, params)) - raise Exception("Hi") if return_first: # find the best result from all the responses and return that raise Exception("Not implemented yet") - return results + # failed requests will return None, so filter those out + return [r for r in results if r] def first_search_result(query, min_confidence=0.1): From 525e2a591d1329c916355ac0ad549691425d7716 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 30 May 2022 12:35:17 -0700 Subject: [PATCH 06/21] More error handing Adds logging and error handling for some of the numerous ways a request could fail (the remote site is down, the url is blocked, etc). I also have the results boxes open by default, which makes it more legible imo. --- bookwyrm/connectors/connector_manager.py | 23 ++++++++++++++++------- bookwyrm/templates/search/book.html | 2 +- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/bookwyrm/connectors/connector_manager.py b/bookwyrm/connectors/connector_manager.py index 23cde632b..69d31a7ea 100644 --- a/bookwyrm/connectors/connector_manager.py +++ b/bookwyrm/connectors/connector_manager.py @@ -12,7 +12,7 @@ from django.db.models import signals from requests import HTTPError from bookwyrm import book_search, models -from bookwyrm.settings import QUERY_TIMEOUT, USER_AGENT +from bookwyrm.settings import SEARCH_TIMEOUT, USER_AGENT from bookwyrm.tasks import app logger = logging.getLogger(__name__) @@ -33,23 +33,29 @@ async def get_results(session, url, params, query, connector): } try: async with session.get(url, headers=headers, params=params) as response: + if not response.ok: + logger.info("Unable to connect to %s: %s", url, response.reason) + return + try: raw_data = await response.json() except aiohttp.client_exceptions.ContentTypeError as err: logger.exception(err) - return None + return return { "connector": connector, "results": connector.process_search_response(query, raw_data), } except asyncio.TimeoutError: - logger.exception("Connection timout for url: %s", url) + logger.info("Connection timed out for url: %s", url) + except aiohttp.ClientError as err: + logger.exception(err) async def async_connector_search(query, items, params): """Try a number of requests simultaneously""" - timeout = aiohttp.ClientTimeout(total=QUERY_TIMEOUT) + timeout = aiohttp.ClientTimeout(total=SEARCH_TIMEOUT) async with aiohttp.ClientSession(timeout=timeout) as session: tasks = [] for url, connector in items: @@ -73,8 +79,11 @@ def search(query, min_confidence=0.1, return_first=False): for connector in get_connectors(): # get the search url from the connector before sending url = connector.get_search_url(query) - # check the URL is valid - raise_not_valid_url(url) + try: + raise_not_valid_url(url) + except ConnectorException: + # if this URL is invalid we should skip it and move on + continue items.append((url, connector)) # load as many results as we can @@ -83,7 +92,7 @@ def search(query, min_confidence=0.1, return_first=False): if return_first: # find the best result from all the responses and return that - raise Exception("Not implemented yet") + raise Exception("Not implemented yet") # TODO # failed requests will return None, so filter those out return [r for r in results if r] diff --git a/bookwyrm/templates/search/book.html b/bookwyrm/templates/search/book.html index 7096a55de..d2828eabf 100644 --- a/bookwyrm/templates/search/book.html +++ b/bookwyrm/templates/search/book.html @@ -36,7 +36,7 @@ {% if result_set.results %}
{% if not result_set.connector.local %} -
+
{% endif %} {% if not result_set.connector.local %} From 87fe984462e6a412a09fddaa1508ec7ab1b2c9fa Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 30 May 2022 12:52:31 -0700 Subject: [PATCH 07/21] Combines search formatter and parser function The parser was extracting the list of search results from the json object returned by the search endpoint, and the formatter was converting an individual json entry into a SearchResult object. This just merged them into one function, because they are never used separately. --- bookwyrm/connectors/abstract_connector.py | 12 +---- bookwyrm/connectors/bookwyrm_connector.py | 14 ++--- bookwyrm/connectors/inventaire.py | 63 ++++++++++------------- bookwyrm/connectors/openlibrary.py | 56 ++++++++++---------- 4 files changed, 60 insertions(+), 85 deletions(-) diff --git a/bookwyrm/connectors/abstract_connector.py b/bookwyrm/connectors/abstract_connector.py index fa3624f82..6184a225a 100644 --- a/bookwyrm/connectors/abstract_connector.py +++ b/bookwyrm/connectors/abstract_connector.py @@ -52,11 +52,9 @@ class AbstractMinimalConnector(ABC): """Format the search results based on the formt of the query""" # TODO: inventaire min confidence parser = self.parse_search_data - formatter = self.format_search_result if maybe_isbn(query): parser = self.parse_isbn_search_data - formatter = self.format_isbn_search_result - return [formatter(doc) for doc in parser(data)[:10]] + return list(parser(data))[:10] @abstractmethod def get_or_create_book(self, remote_id): @@ -66,18 +64,10 @@ class AbstractMinimalConnector(ABC): def parse_search_data(self, data): """turn the result json from a search into a list""" - @abstractmethod - def format_search_result(self, search_result): - """create a SearchResult obj from json""" - @abstractmethod def parse_isbn_search_data(self, data): """turn the result json from a search into a list""" - @abstractmethod - def format_isbn_search_result(self, search_result): - """create a SearchResult obj from json""" - class AbstractConnector(AbstractMinimalConnector): """generic book data connector""" diff --git a/bookwyrm/connectors/bookwyrm_connector.py b/bookwyrm/connectors/bookwyrm_connector.py index 6dcba7c31..ec45c29b6 100644 --- a/bookwyrm/connectors/bookwyrm_connector.py +++ b/bookwyrm/connectors/bookwyrm_connector.py @@ -11,14 +11,10 @@ class Connector(AbstractMinimalConnector): return activitypub.resolve_remote_id(remote_id, model=models.Edition) def parse_search_data(self, data): - return data - - def format_search_result(self, search_result): - search_result["connector"] = self - return SearchResult(**search_result) + for search_result in data: + search_result["connector"] = self + yield SearchResult(**search_result) def parse_isbn_search_data(self, data): - return data - - def format_isbn_search_result(self, search_result): - return self.format_search_result(search_result) + for search_result in data: + yield self.format_search_result(search_result) diff --git a/bookwyrm/connectors/inventaire.py b/bookwyrm/connectors/inventaire.py index f25796125..7f6191271 100644 --- a/bookwyrm/connectors/inventaire.py +++ b/bookwyrm/connectors/inventaire.py @@ -78,44 +78,37 @@ class Connector(AbstractConnector): } def parse_search_data(self, data): - return data.get("results") - - def format_search_result(self, search_result): - images = search_result.get("image") - cover = f"{self.covers_url}/img/entities/{images[0]}" if images else None - # a deeply messy translation of inventaire's scores - confidence = float(search_result.get("_score", 0.1)) - confidence = 0.1 if confidence < 150 else 0.999 - return SearchResult( - title=search_result.get("label"), - key=self.get_remote_id(search_result.get("uri")), - author=search_result.get("description"), - view_link=f"{self.base_url}/entity/{search_result.get('uri')}", - cover=cover, - confidence=confidence, - connector=self, - ) + for search_result in data.get("results"): + images = search_result.get("image") + cover = f"{self.covers_url}/img/entities/{images[0]}" if images else None + # a deeply messy translation of inventaire's scores + confidence = float(search_result.get("_score", 0.1)) + confidence = 0.1 if confidence < 150 else 0.999 + yield SearchResult( + title=search_result.get("label"), + key=self.get_remote_id(search_result.get("uri")), + author=search_result.get("description"), + view_link=f"{self.base_url}/entity/{search_result.get('uri')}", + cover=cover, + confidence=confidence, + connector=self, + ) def parse_isbn_search_data(self, data): """got some daaaata""" - results = data.get("entities") - if not results: - return [] - return list(results.values()) - - def format_isbn_search_result(self, search_result): - """totally different format than a regular search result""" - title = search_result.get("claims", {}).get("wdt:P1476", []) - if not title: - return None - return SearchResult( - title=title[0], - key=self.get_remote_id(search_result.get("uri")), - author=search_result.get("description"), - view_link=f"{self.base_url}/entity/{search_result.get('uri')}", - cover=self.get_cover_url(search_result.get("image")), - connector=self, - ) + results = data.get("entities", []) + for search_result in list(results.values()): + title = search_result.get("claims", {}).get("wdt:P1476", []) + if not title: + continue + yield SearchResult( + title=title[0], + key=self.get_remote_id(search_result.get("uri")), + author=search_result.get("description"), + view_link=f"{self.base_url}/entity/{search_result.get('uri')}", + cover=self.get_cover_url(search_result.get("image")), + connector=self, + ) def is_work_data(self, data): return data.get("type") == "work" diff --git a/bookwyrm/connectors/openlibrary.py b/bookwyrm/connectors/openlibrary.py index 118222a16..fa9aeeb30 100644 --- a/bookwyrm/connectors/openlibrary.py +++ b/bookwyrm/connectors/openlibrary.py @@ -153,38 +153,34 @@ class Connector(AbstractConnector): return f"{self.covers_url}/b/id/{image_name}" def parse_search_data(self, data): - return data.get("docs") - - def format_search_result(self, search_result): - # build the remote id from the openlibrary key - key = self.books_url + search_result["key"] - author = search_result.get("author_name") or ["Unknown"] - cover_blob = search_result.get("cover_i") - cover = self.get_cover_url([cover_blob], size="M") if cover_blob else None - return SearchResult( - title=search_result.get("title"), - key=key, - author=", ".join(author), - connector=self, - year=search_result.get("first_publish_year"), - cover=cover, - ) + for search_result in data.get("docs"): + # build the remote id from the openlibrary key + key = self.books_url + search_result["key"] + author = search_result.get("author_name") or ["Unknown"] + cover_blob = search_result.get("cover_i") + cover = self.get_cover_url([cover_blob], size="M") if cover_blob else None + yield SearchResult( + title=search_result.get("title"), + key=key, + author=", ".join(author), + connector=self, + year=search_result.get("first_publish_year"), + cover=cover, + ) def parse_isbn_search_data(self, data): - return list(data.values()) - - def format_isbn_search_result(self, search_result): - # build the remote id from the openlibrary key - key = self.books_url + search_result["key"] - authors = search_result.get("authors") or [{"name": "Unknown"}] - author_names = [author.get("name") for author in authors] - return SearchResult( - title=search_result.get("title"), - key=key, - author=", ".join(author_names), - connector=self, - year=search_result.get("publish_date"), - ) + for search_result in list(data.values()): + # build the remote id from the openlibrary key + key = self.books_url + search_result["key"] + authors = search_result.get("authors") or [{"name": "Unknown"}] + author_names = [author.get("name") for author in authors] + yield SearchResult( + title=search_result.get("title"), + key=key, + author=", ".join(author_names), + connector=self, + year=search_result.get("publish_date"), + ) def load_edition_data(self, olkey): """query openlibrary for editions of a work""" From af19d728d2264592463b6211411d0850c5ad7b40 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 30 May 2022 16:16:10 -0700 Subject: [PATCH 08/21] Removes outdated unit tests --- bookwyrm/connectors/bookwyrm_connector.py | 3 +- bookwyrm/connectors/inventaire.py | 6 ++- .../connectors/test_abstract_connector.py | 6 --- .../test_abstract_minimal_connector.py | 46 ----------------- .../connectors/test_bookwyrm_connector.py | 12 ++--- .../connectors/test_connector_manager.py | 28 ----------- .../connectors/test_inventaire_connector.py | 50 +++---------------- bookwyrm/tests/test_book_search.py | 6 --- 8 files changed, 16 insertions(+), 141 deletions(-) diff --git a/bookwyrm/connectors/bookwyrm_connector.py b/bookwyrm/connectors/bookwyrm_connector.py index ec45c29b6..05612d9eb 100644 --- a/bookwyrm/connectors/bookwyrm_connector.py +++ b/bookwyrm/connectors/bookwyrm_connector.py @@ -17,4 +17,5 @@ class Connector(AbstractMinimalConnector): def parse_isbn_search_data(self, data): for search_result in data: - yield self.format_search_result(search_result) + search_result["connector"] = self + yield SearchResult(**search_result) diff --git a/bookwyrm/connectors/inventaire.py b/bookwyrm/connectors/inventaire.py index 7f6191271..0495d8c2f 100644 --- a/bookwyrm/connectors/inventaire.py +++ b/bookwyrm/connectors/inventaire.py @@ -78,7 +78,7 @@ class Connector(AbstractConnector): } def parse_search_data(self, data): - for search_result in data.get("results"): + for search_result in data.get("results", []): images = search_result.get("image") cover = f"{self.covers_url}/img/entities/{images[0]}" if images else None # a deeply messy translation of inventaire's scores @@ -96,7 +96,9 @@ class Connector(AbstractConnector): def parse_isbn_search_data(self, data): """got some daaaata""" - results = data.get("entities", []) + results = data.get("entities") + if not results: + return for search_result in list(results.values()): title = search_result.get("claims", {}).get("wdt:P1476", []) if not title: diff --git a/bookwyrm/tests/connectors/test_abstract_connector.py b/bookwyrm/tests/connectors/test_abstract_connector.py index 26742c05e..eb3a7b01a 100644 --- a/bookwyrm/tests/connectors/test_abstract_connector.py +++ b/bookwyrm/tests/connectors/test_abstract_connector.py @@ -42,15 +42,9 @@ class AbstractConnector(TestCase): generated_remote_link_field = "openlibrary_link" - def format_search_result(self, search_result): - return search_result - def parse_search_data(self, data): return data - def format_isbn_search_result(self, search_result): - return search_result - def parse_isbn_search_data(self, data): return data diff --git a/bookwyrm/tests/connectors/test_abstract_minimal_connector.py b/bookwyrm/tests/connectors/test_abstract_minimal_connector.py index a90ce0c7e..06da8741c 100644 --- a/bookwyrm/tests/connectors/test_abstract_minimal_connector.py +++ b/bookwyrm/tests/connectors/test_abstract_minimal_connector.py @@ -1,6 +1,5 @@ """ testing book data connectors """ from django.test import TestCase -import responses from bookwyrm import models from bookwyrm.connectors import abstract_connector @@ -25,18 +24,12 @@ class AbstractConnector(TestCase): class TestConnector(abstract_connector.AbstractMinimalConnector): """nothing added here""" - def format_search_result(self, search_result): - return search_result - def get_or_create_book(self, remote_id): pass def parse_search_data(self, data): return data - def format_isbn_search_result(self, search_result): - return search_result - def parse_isbn_search_data(self, data): return data @@ -54,45 +47,6 @@ class AbstractConnector(TestCase): self.assertIsNone(connector.name) self.assertEqual(connector.identifier, "example.com") - @responses.activate - def test_search(self): - """makes an http request to the outside service""" - responses.add( - responses.GET, - "https://example.com/search?q=a%20book%20title", - json=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"], - status=200, - ) - results = self.test_connector.search("a book title") - self.assertEqual(len(results), 10) - self.assertEqual(results[0], "a") - self.assertEqual(results[1], "b") - self.assertEqual(results[2], "c") - - @responses.activate - def test_search_min_confidence(self): - """makes an http request to the outside service""" - responses.add( - responses.GET, - "https://example.com/search?q=a%20book%20title&min_confidence=1", - json=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"], - status=200, - ) - results = self.test_connector.search("a book title", min_confidence=1) - self.assertEqual(len(results), 10) - - @responses.activate - def test_isbn_search(self): - """makes an http request to the outside service""" - responses.add( - responses.GET, - "https://example.com/isbn?q=123456", - json=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"], - status=200, - ) - results = self.test_connector.isbn_search("123456") - self.assertEqual(len(results), 10) - def test_create_mapping(self): """maps remote fields for book data to bookwyrm activitypub fields""" mapping = Mapping("isbn") diff --git a/bookwyrm/tests/connectors/test_bookwyrm_connector.py b/bookwyrm/tests/connectors/test_bookwyrm_connector.py index 585080e66..b9642a50e 100644 --- a/bookwyrm/tests/connectors/test_bookwyrm_connector.py +++ b/bookwyrm/tests/connectors/test_bookwyrm_connector.py @@ -30,14 +30,11 @@ class BookWyrmConnector(TestCase): result = self.connector.get_or_create_book(book.remote_id) self.assertEqual(book, result) - def test_format_search_result(self): + def test_parse_search_data(self): """create a SearchResult object from search response json""" datafile = pathlib.Path(__file__).parent.joinpath("../data/bw_search.json") search_data = json.loads(datafile.read_bytes()) - results = self.connector.parse_search_data(search_data) - self.assertIsInstance(results, list) - - result = self.connector.format_search_result(results[0]) + result = list(self.connector.parse_search_data(search_data))[0] self.assertIsInstance(result, SearchResult) self.assertEqual(result.title, "Jonathan Strange and Mr Norrell") self.assertEqual(result.key, "https://example.com/book/122") @@ -45,10 +42,9 @@ class BookWyrmConnector(TestCase): self.assertEqual(result.year, 2017) self.assertEqual(result.connector, self.connector) - def test_format_isbn_search_result(self): + def test_parse_isbn_search_data(self): """just gotta attach the connector""" datafile = pathlib.Path(__file__).parent.joinpath("../data/bw_search.json") search_data = json.loads(datafile.read_bytes()) - results = self.connector.parse_isbn_search_data(search_data) - result = self.connector.format_isbn_search_result(results[0]) + result = list(self.connector.parse_isbn_search_data(search_data))[0] self.assertEqual(result.connector, self.connector) diff --git a/bookwyrm/tests/connectors/test_connector_manager.py b/bookwyrm/tests/connectors/test_connector_manager.py index c88a8036a..c0c09147e 100644 --- a/bookwyrm/tests/connectors/test_connector_manager.py +++ b/bookwyrm/tests/connectors/test_connector_manager.py @@ -49,39 +49,11 @@ class ConnectorManager(TestCase): self.assertEqual(len(connectors), 1) self.assertIsInstance(connectors[0], BookWyrmConnector) - @responses.activate - def test_search_plaintext(self): - """search all connectors""" - responses.add( - responses.GET, - "http://fake.ciom/search/Example?min_confidence=0.1", - json=[{"title": "Hello", "key": "https://www.example.com/search/1"}], - ) - results = connector_manager.search("Example") - self.assertEqual(len(results), 1) - self.assertEqual(len(results[0]["results"]), 1) - self.assertEqual(results[0]["connector"].identifier, "test_connector_remote") - self.assertEqual(results[0]["results"][0].title, "Hello") - def test_search_empty_query(self): """don't panic on empty queries""" results = connector_manager.search("") self.assertEqual(results, []) - @responses.activate - def test_search_isbn(self): - """special handling if a query resembles an isbn""" - responses.add( - responses.GET, - "http://fake.ciom/isbn/0000000000", - json=[{"title": "Hello", "key": "https://www.example.com/search/1"}], - ) - results = connector_manager.search("0000000000") - self.assertEqual(len(results), 1) - self.assertEqual(len(results[0]["results"]), 1) - self.assertEqual(results[0]["connector"].identifier, "test_connector_remote") - self.assertEqual(results[0]["results"][0].title, "Hello") - def test_first_search_result(self): """only get one search result""" result = connector_manager.first_search_result("Example") diff --git a/bookwyrm/tests/connectors/test_inventaire_connector.py b/bookwyrm/tests/connectors/test_inventaire_connector.py index 55727a600..7b526f224 100644 --- a/bookwyrm/tests/connectors/test_inventaire_connector.py +++ b/bookwyrm/tests/connectors/test_inventaire_connector.py @@ -66,38 +66,14 @@ class Inventaire(TestCase): with self.assertRaises(ConnectorException): self.connector.get_book_data("https://test.url/ok") - @responses.activate - def test_search(self): - """min confidence filtering""" - responses.add( - responses.GET, - "https://inventaire.io/search?q=hi", - json={ - "results": [ - { - "_score": 200, - "label": "hello", - }, - { - "_score": 100, - "label": "hi", - }, - ], - }, - ) - results = self.connector.search("hi", min_confidence=0.5) - self.assertEqual(len(results), 1) - self.assertEqual(results[0].title, "hello") - - def test_format_search_result(self): + def test_parse_search_data(self): """json to search result objs""" search_file = pathlib.Path(__file__).parent.joinpath( "../data/inventaire_search.json" ) search_results = json.loads(search_file.read_bytes()) - results = self.connector.parse_search_data(search_results) - formatted = self.connector.format_search_result(results[0]) + formatted = list(self.connector.parse_search_data(search_results))[0] self.assertEqual(formatted.title, "The Stories of Vladimir Nabokov") self.assertEqual( @@ -178,15 +154,14 @@ class Inventaire(TestCase): result = self.connector.resolve_keys(keys) self.assertEqual(result, ["epistolary novel", "crime novel"]) - def test_isbn_search(self): + def test_pase_isbn_search_data(self): """another search type""" search_file = pathlib.Path(__file__).parent.joinpath( "../data/inventaire_isbn_search.json" ) search_results = json.loads(search_file.read_bytes()) - results = self.connector.parse_isbn_search_data(search_results) - formatted = self.connector.format_isbn_search_result(results[0]) + formatted = list(self.connector.parse_isbn_search_data(search_results))[0] self.assertEqual(formatted.title, "L'homme aux cercles bleus") self.assertEqual( @@ -198,25 +173,12 @@ class Inventaire(TestCase): "https://covers.inventaire.io/img/entities/12345", ) - def test_isbn_search_empty(self): + def test_parse_isbn_search_data_empty(self): """another search type""" search_results = {} - results = self.connector.parse_isbn_search_data(search_results) + results = list(self.connector.parse_isbn_search_data(search_results)) self.assertEqual(results, []) - def test_isbn_search_no_title(self): - """another search type""" - search_file = pathlib.Path(__file__).parent.joinpath( - "../data/inventaire_isbn_search.json" - ) - search_results = json.loads(search_file.read_bytes()) - search_results["entities"]["isbn:9782290349229"]["claims"]["wdt:P1476"] = None - - result = self.connector.format_isbn_search_result( - search_results.get("entities") - ) - self.assertIsNone(result) - def test_is_work_data(self): """is it a work""" work_file = pathlib.Path(__file__).parent.joinpath( diff --git a/bookwyrm/tests/test_book_search.py b/bookwyrm/tests/test_book_search.py index 16435ffff..141e3906b 100644 --- a/bookwyrm/tests/test_book_search.py +++ b/bookwyrm/tests/test_book_search.py @@ -102,18 +102,12 @@ class BookSearch(TestCase): class TestConnector(AbstractMinimalConnector): """nothing added here""" - def format_search_result(self, search_result): - return search_result - def get_or_create_book(self, remote_id): pass def parse_search_data(self, data): return data - def format_isbn_search_result(self, search_result): - return search_result - def parse_isbn_search_data(self, data): return data From 83ee5a756f48622243b5e0d0347092ca0564ebfa Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 30 May 2022 16:42:37 -0700 Subject: [PATCH 09/21] Filter intentaire results by confidence --- bookwyrm/connectors/abstract_connector.py | 10 ++++------ bookwyrm/connectors/bookwyrm_connector.py | 2 +- bookwyrm/connectors/connector_manager.py | 12 ++++++------ bookwyrm/connectors/inventaire.py | 4 +++- bookwyrm/connectors/openlibrary.py | 2 +- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/bookwyrm/connectors/abstract_connector.py b/bookwyrm/connectors/abstract_connector.py index 6184a225a..dc4be4b3d 100644 --- a/bookwyrm/connectors/abstract_connector.py +++ b/bookwyrm/connectors/abstract_connector.py @@ -48,20 +48,18 @@ class AbstractMinimalConnector(ABC): # searched as free text. This, instead, only searches isbn if it's isbn-y return f"{self.search_url}{query}" - def process_search_response(self, query, data): + def process_search_response(self, query, data, min_confidence): """Format the search results based on the formt of the query""" - # TODO: inventaire min confidence - parser = self.parse_search_data if maybe_isbn(query): - parser = self.parse_isbn_search_data - return list(parser(data))[:10] + return list(self.parse_isbn_search_data(data))[:10] + return list(self.parse_search_data(data, min_confidence))[:10] @abstractmethod def get_or_create_book(self, remote_id): """pull up a book record by whatever means possible""" @abstractmethod - def parse_search_data(self, data): + def parse_search_data(self, data, min_confidence): """turn the result json from a search into a list""" @abstractmethod diff --git a/bookwyrm/connectors/bookwyrm_connector.py b/bookwyrm/connectors/bookwyrm_connector.py index 05612d9eb..e07a0b281 100644 --- a/bookwyrm/connectors/bookwyrm_connector.py +++ b/bookwyrm/connectors/bookwyrm_connector.py @@ -10,7 +10,7 @@ class Connector(AbstractMinimalConnector): def get_or_create_book(self, remote_id): return activitypub.resolve_remote_id(remote_id, model=models.Edition) - def parse_search_data(self, data): + def parse_search_data(self, data, min_confidence): for search_result in data: search_result["connector"] = self yield SearchResult(**search_result) diff --git a/bookwyrm/connectors/connector_manager.py b/bookwyrm/connectors/connector_manager.py index 69d31a7ea..0488421e9 100644 --- a/bookwyrm/connectors/connector_manager.py +++ b/bookwyrm/connectors/connector_manager.py @@ -22,7 +22,7 @@ class ConnectorException(HTTPError): """when the connector can't do what was asked""" -async def get_results(session, url, params, query, connector): +async def get_results(session, url, min_confidence, query, connector): """try this specific connector""" # pylint: disable=line-too-long headers = { @@ -31,6 +31,7 @@ async def get_results(session, url, params, query, connector): ), "User-Agent": USER_AGENT, } + params = {"min_confidence": min_confidence} try: async with session.get(url, headers=headers, params=params) as response: if not response.ok: @@ -45,7 +46,7 @@ async def get_results(session, url, params, query, connector): return { "connector": connector, - "results": connector.process_search_response(query, raw_data), + "results": connector.process_search_response(query, raw_data, min_confidence), } except asyncio.TimeoutError: logger.info("Connection timed out for url: %s", url) @@ -53,7 +54,7 @@ async def get_results(session, url, params, query, connector): logger.exception(err) -async def async_connector_search(query, items, params): +async def async_connector_search(query, items, min_confidence): """Try a number of requests simultaneously""" timeout = aiohttp.ClientTimeout(total=SEARCH_TIMEOUT) async with aiohttp.ClientSession(timeout=timeout) as session: @@ -61,7 +62,7 @@ async def async_connector_search(query, items, params): for url, connector in items: tasks.append( asyncio.ensure_future( - get_results(session, url, params, query, connector) + get_results(session, url, min_confidence, query, connector) ) ) @@ -87,8 +88,7 @@ def search(query, min_confidence=0.1, return_first=False): items.append((url, connector)) # load as many results as we can - params = {"min_confidence": min_confidence} - results = asyncio.run(async_connector_search(query, items, params)) + results = asyncio.run(async_connector_search(query, items, min_confidence)) if return_first: # find the best result from all the responses and return that diff --git a/bookwyrm/connectors/inventaire.py b/bookwyrm/connectors/inventaire.py index 0495d8c2f..c13f4e3e6 100644 --- a/bookwyrm/connectors/inventaire.py +++ b/bookwyrm/connectors/inventaire.py @@ -77,13 +77,15 @@ class Connector(AbstractConnector): **{k: data.get(k) for k in ["uri", "image", "labels", "sitelinks", "type"]}, } - def parse_search_data(self, data): + def parse_search_data(self, data, min_confidence): for search_result in data.get("results", []): images = search_result.get("image") cover = f"{self.covers_url}/img/entities/{images[0]}" if images else None # a deeply messy translation of inventaire's scores confidence = float(search_result.get("_score", 0.1)) confidence = 0.1 if confidence < 150 else 0.999 + if confidence < min_confidence: + continue yield SearchResult( title=search_result.get("label"), key=self.get_remote_id(search_result.get("uri")), diff --git a/bookwyrm/connectors/openlibrary.py b/bookwyrm/connectors/openlibrary.py index fa9aeeb30..2b625dffc 100644 --- a/bookwyrm/connectors/openlibrary.py +++ b/bookwyrm/connectors/openlibrary.py @@ -152,7 +152,7 @@ class Connector(AbstractConnector): image_name = f"{cover_id}-{size}.jpg" return f"{self.covers_url}/b/id/{image_name}" - def parse_search_data(self, data): + def parse_search_data(self, data, min_confidence): for search_result in data.get("docs"): # build the remote id from the openlibrary key key = self.books_url + search_result["key"] From 98ed03b6b45701d526b48add7931121683723169 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 30 May 2022 17:00:34 -0700 Subject: [PATCH 10/21] Python formatting and test update --- bookwyrm/connectors/connector_manager.py | 4 +++- .../connectors/test_bookwyrm_connector.py | 2 +- .../connectors/test_inventaire_connector.py | 2 +- .../connectors/test_openlibrary_connector.py | 24 +++---------------- 4 files changed, 8 insertions(+), 24 deletions(-) diff --git a/bookwyrm/connectors/connector_manager.py b/bookwyrm/connectors/connector_manager.py index 0488421e9..fc7849249 100644 --- a/bookwyrm/connectors/connector_manager.py +++ b/bookwyrm/connectors/connector_manager.py @@ -46,7 +46,9 @@ async def get_results(session, url, min_confidence, query, connector): return { "connector": connector, - "results": connector.process_search_response(query, raw_data, min_confidence), + "results": connector.process_search_response( + query, raw_data, min_confidence + ), } except asyncio.TimeoutError: logger.info("Connection timed out for url: %s", url) diff --git a/bookwyrm/tests/connectors/test_bookwyrm_connector.py b/bookwyrm/tests/connectors/test_bookwyrm_connector.py index b9642a50e..1e369ca01 100644 --- a/bookwyrm/tests/connectors/test_bookwyrm_connector.py +++ b/bookwyrm/tests/connectors/test_bookwyrm_connector.py @@ -34,7 +34,7 @@ class BookWyrmConnector(TestCase): """create a SearchResult object from search response json""" datafile = pathlib.Path(__file__).parent.joinpath("../data/bw_search.json") search_data = json.loads(datafile.read_bytes()) - result = list(self.connector.parse_search_data(search_data))[0] + result = list(self.connector.parse_search_data(search_data, 0))[0] self.assertIsInstance(result, SearchResult) self.assertEqual(result.title, "Jonathan Strange and Mr Norrell") self.assertEqual(result.key, "https://example.com/book/122") diff --git a/bookwyrm/tests/connectors/test_inventaire_connector.py b/bookwyrm/tests/connectors/test_inventaire_connector.py index 7b526f224..3bba9ece3 100644 --- a/bookwyrm/tests/connectors/test_inventaire_connector.py +++ b/bookwyrm/tests/connectors/test_inventaire_connector.py @@ -73,7 +73,7 @@ class Inventaire(TestCase): ) search_results = json.loads(search_file.read_bytes()) - formatted = list(self.connector.parse_search_data(search_results))[0] + formatted = list(self.connector.parse_search_data(search_results, 0))[0] self.assertEqual(formatted.title, "The Stories of Vladimir Nabokov") self.assertEqual( diff --git a/bookwyrm/tests/connectors/test_openlibrary_connector.py b/bookwyrm/tests/connectors/test_openlibrary_connector.py index c05eb1a94..69e4f847c 100644 --- a/bookwyrm/tests/connectors/test_openlibrary_connector.py +++ b/bookwyrm/tests/connectors/test_openlibrary_connector.py @@ -122,21 +122,11 @@ class Openlibrary(TestCase): self.assertEqual(result, "https://covers.openlibrary.org/b/id/image-L.jpg") def test_parse_search_result(self): - """extract the results from the search json response""" - datafile = pathlib.Path(__file__).parent.joinpath("../data/ol_search.json") - search_data = json.loads(datafile.read_bytes()) - result = self.connector.parse_search_data(search_data) - self.assertIsInstance(result, list) - self.assertEqual(len(result), 2) - - def test_format_search_result(self): """translate json from openlibrary into SearchResult""" datafile = pathlib.Path(__file__).parent.joinpath("../data/ol_search.json") search_data = json.loads(datafile.read_bytes()) - results = self.connector.parse_search_data(search_data) - self.assertIsInstance(results, list) + result = list(self.connector.parse_search_data(search_data, 0))[0] - result = self.connector.format_search_result(results[0]) self.assertIsInstance(result, SearchResult) self.assertEqual(result.title, "This Is How You Lose the Time War") self.assertEqual(result.key, "https://openlibrary.org/works/OL20639540W") @@ -148,18 +138,10 @@ class Openlibrary(TestCase): """extract the results from the search json response""" datafile = pathlib.Path(__file__).parent.joinpath("../data/ol_isbn_search.json") search_data = json.loads(datafile.read_bytes()) - result = self.connector.parse_isbn_search_data(search_data) - self.assertIsInstance(result, list) + result = list(self.connector.parse_isbn_search_data(search_data)) self.assertEqual(len(result), 1) - def test_format_isbn_search_result(self): - """translate json from openlibrary into SearchResult""" - datafile = pathlib.Path(__file__).parent.joinpath("../data/ol_isbn_search.json") - search_data = json.loads(datafile.read_bytes()) - results = self.connector.parse_isbn_search_data(search_data) - self.assertIsInstance(results, list) - - result = self.connector.format_isbn_search_result(results[0]) + result = result[0] self.assertIsInstance(result, SearchResult) self.assertEqual(result.title, "Les ombres errantes") self.assertEqual(result.key, "https://openlibrary.org/books/OL16262504M") From a053f209619429706f33baeeb2844a48756acce3 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 31 May 2022 08:20:59 -0700 Subject: [PATCH 11/21] Re-implements return first option Since we get all the results quickly now, this aggregates all the results that came back and sorts them by confidence, and returns the highest confidence result. The confidences aren't great on free text search, but conceptually that's how it should work at least. It may make sense to aggregate the search results in all contexts, but I'll propose that in a separate PR. --- bookwyrm/book_search.py | 4 ++-- bookwyrm/connectors/connector_manager.py | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/bookwyrm/book_search.py b/bookwyrm/book_search.py index e42a6d8c3..4b0a6eab9 100644 --- a/bookwyrm/book_search.py +++ b/bookwyrm/book_search.py @@ -148,8 +148,8 @@ class SearchResult: def __repr__(self): # pylint: disable=consider-using-f-string - return "".format( - self.key, self.title, self.author + return "".format( + self.key, self.title, self.author, self.confidence ) def json(self): diff --git a/bookwyrm/connectors/connector_manager.py b/bookwyrm/connectors/connector_manager.py index fc7849249..5c8b43fdb 100644 --- a/bookwyrm/connectors/connector_manager.py +++ b/bookwyrm/connectors/connector_manager.py @@ -91,13 +91,16 @@ def search(query, min_confidence=0.1, return_first=False): # load as many results as we can results = asyncio.run(async_connector_search(query, items, min_confidence)) + results = [r for r in results if r] if return_first: # find the best result from all the responses and return that - raise Exception("Not implemented yet") # TODO + all_results = [r for con in results for r in con["results"]] + all_results = sorted(all_results, key=lambda r: r.confidence, reverse=True) + return all_results[0] # failed requests will return None, so filter those out - return [r for r in results if r] + return results def first_search_result(query, min_confidence=0.1): From 5e99002aad76fd8dcadf8b5b3f6ef9c4bcac262b Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 31 May 2022 08:25:02 -0700 Subject: [PATCH 12/21] Raise priority for external connectors in initdb By default, OpenLibrary and Inventaire were prioritzed below other BookWyrm nodes. In practice, people have gotten better search results from these connectors, hence the change. With the search refactor, this has much less impact, but it will show these search results higher in the list. If the results page shows all the connectors' results integrated, this field should be removed entirely. --- bookwyrm/management/commands/initdb.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bookwyrm/management/commands/initdb.py b/bookwyrm/management/commands/initdb.py index 160502ca0..23020a0a6 100644 --- a/bookwyrm/management/commands/initdb.py +++ b/bookwyrm/management/commands/initdb.py @@ -89,7 +89,7 @@ def init_connectors(): covers_url="https://inventaire.io", search_url="https://inventaire.io/api/search?types=works&types=works&search=", isbn_search_url="https://inventaire.io/api/entities?action=by-uris&uris=isbn%3A", - priority=3, + priority=1, ) models.Connector.objects.create( @@ -101,7 +101,7 @@ def init_connectors(): covers_url="https://covers.openlibrary.org", search_url="https://openlibrary.org/search?q=", isbn_search_url="https://openlibrary.org/api/books?jscmd=data&format=json&bibkeys=ISBN:", - priority=3, + priority=1, ) From 05fd30cfcf50338b694e9c8c1e07d2c30ade3317 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 31 May 2022 08:37:07 -0700 Subject: [PATCH 13/21] Pylint fixes in connector tests --- bookwyrm/tests/connectors/test_abstract_connector.py | 2 +- bookwyrm/tests/connectors/test_abstract_minimal_connector.py | 2 +- bookwyrm/tests/test_book_search.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bookwyrm/tests/connectors/test_abstract_connector.py b/bookwyrm/tests/connectors/test_abstract_connector.py index eb3a7b01a..02ac5c66a 100644 --- a/bookwyrm/tests/connectors/test_abstract_connector.py +++ b/bookwyrm/tests/connectors/test_abstract_connector.py @@ -42,7 +42,7 @@ class AbstractConnector(TestCase): generated_remote_link_field = "openlibrary_link" - def parse_search_data(self, data): + def parse_search_data(self, data, min_confidence): return data def parse_isbn_search_data(self, data): diff --git a/bookwyrm/tests/connectors/test_abstract_minimal_connector.py b/bookwyrm/tests/connectors/test_abstract_minimal_connector.py index 06da8741c..119ca3581 100644 --- a/bookwyrm/tests/connectors/test_abstract_minimal_connector.py +++ b/bookwyrm/tests/connectors/test_abstract_minimal_connector.py @@ -27,7 +27,7 @@ class AbstractConnector(TestCase): def get_or_create_book(self, remote_id): pass - def parse_search_data(self, data): + def parse_search_data(self, data, min_confidence): return data def parse_isbn_search_data(self, data): diff --git a/bookwyrm/tests/test_book_search.py b/bookwyrm/tests/test_book_search.py index 141e3906b..7274cb49c 100644 --- a/bookwyrm/tests/test_book_search.py +++ b/bookwyrm/tests/test_book_search.py @@ -105,7 +105,7 @@ class BookSearch(TestCase): def get_or_create_book(self, remote_id): pass - def parse_search_data(self, data): + def parse_search_data(self, data, min_confidence): return data def parse_isbn_search_data(self, data): From 969db13ff2c43421357509bbe3d5a562983ba06f Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 31 May 2022 08:49:23 -0700 Subject: [PATCH 14/21] Safely return None in remote search return_first --- bookwyrm/connectors/connector_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/connectors/connector_manager.py b/bookwyrm/connectors/connector_manager.py index 5c8b43fdb..af79b2483 100644 --- a/bookwyrm/connectors/connector_manager.py +++ b/bookwyrm/connectors/connector_manager.py @@ -97,7 +97,7 @@ def search(query, min_confidence=0.1, return_first=False): # find the best result from all the responses and return that all_results = [r for con in results for r in con["results"]] all_results = sorted(all_results, key=lambda r: r.confidence, reverse=True) - return all_results[0] + return all_results[0] if all_results else None # failed requests will return None, so filter those out return results From c3b35760a285faecc82a465835fc33e0fb006913 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 31 May 2022 09:32:32 -0700 Subject: [PATCH 15/21] Updates test mocks for remote search --- bookwyrm/connectors/connector_manager.py | 1 + bookwyrm/tests/views/test_search.py | 30 ++++++++++++------------ 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/bookwyrm/connectors/connector_manager.py b/bookwyrm/connectors/connector_manager.py index af79b2483..86774af56 100644 --- a/bookwyrm/connectors/connector_manager.py +++ b/bookwyrm/connectors/connector_manager.py @@ -86,6 +86,7 @@ def search(query, min_confidence=0.1, return_first=False): raise_not_valid_url(url) except ConnectorException: # if this URL is invalid we should skip it and move on + logger.info("Request denied to blocked domain: %s", url) continue items.append((url, connector)) diff --git a/bookwyrm/tests/views/test_search.py b/bookwyrm/tests/views/test_search.py index 2df04f588..51166f2fa 100644 --- a/bookwyrm/tests/views/test_search.py +++ b/bookwyrm/tests/views/test_search.py @@ -1,6 +1,5 @@ """ test for app action functionality """ import json -import pathlib from unittest.mock import patch from django.contrib.auth.models import AnonymousUser @@ -8,9 +7,9 @@ from django.http import JsonResponse from django.template.response import TemplateResponse from django.test import TestCase from django.test.client import RequestFactory -import responses from bookwyrm import models, views +from bookwyrm.book_search import SearchResult from bookwyrm.settings import DOMAIN from bookwyrm.tests.validate_html import validate_html @@ -65,12 +64,11 @@ class Views(TestCase): self.assertIsInstance(response, TemplateResponse) validate_html(response.render()) - @responses.activate def test_search_books(self): """searches remote connectors""" view = views.Search.as_view() - models.Connector.objects.create( + connector = models.Connector.objects.create( identifier="example.com", connector_file="openlibrary", base_url="https://example.com", @@ -78,26 +76,24 @@ class Views(TestCase): covers_url="https://example.com/covers", search_url="https://example.com/search?q=", ) - datafile = pathlib.Path(__file__).parent.joinpath("../data/ol_search.json") - search_data = json.loads(datafile.read_bytes()) - responses.add( - responses.GET, "https://example.com/search?q=Test%20Book", json=search_data - ) + mock_result = SearchResult(title="Mock Book", connector=connector, key="hello") request = self.factory.get("", {"q": "Test Book", "remote": True}) request.user = self.local_user with patch("bookwyrm.views.search.is_api_request") as is_api: is_api.return_value = False - response = view(request) + with patch("bookwyrm.connectors.connector_manager.search") as remote_search: + remote_search.return_value = [ + {"results": [mock_result], "connector": connector} + ] + response = view(request) + self.assertIsInstance(response, TemplateResponse) validate_html(response.render()) connector_results = response.context_data["results"] self.assertEqual(len(connector_results), 2) self.assertEqual(connector_results[0]["results"][0].title, "Test Book") - self.assertEqual( - connector_results[1]["results"][0].title, - "This Is How You Lose the Time War", - ) + self.assertEqual(connector_results[1]["results"][0].title, "Mock Book") # don't search remote request = self.factory.get("", {"q": "Test Book", "remote": True}) @@ -106,7 +102,11 @@ class Views(TestCase): request.user = anonymous_user with patch("bookwyrm.views.search.is_api_request") as is_api: is_api.return_value = False - response = view(request) + with patch("bookwyrm.connectors.connector_manager.search") as remote_search: + remote_search.return_value = [ + {"results": [mock_result], "connector": connector} + ] + response = view(request) self.assertIsInstance(response, TemplateResponse) validate_html(response.render()) connector_results = response.context_data["results"] From 374fdcf467a7dd386633b69ed4ad2b409df42b4b Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 31 May 2022 10:22:49 -0700 Subject: [PATCH 16/21] Use relative list order ranking in openlibrary search Set OpenLibrary search condifidence based on the provided result order, just using 1/(list index), so the first has rank 1, the second 0.5, the third 0.33, et cetera. --- bookwyrm/connectors/openlibrary.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/bookwyrm/connectors/openlibrary.py b/bookwyrm/connectors/openlibrary.py index 2b625dffc..c1527527e 100644 --- a/bookwyrm/connectors/openlibrary.py +++ b/bookwyrm/connectors/openlibrary.py @@ -153,12 +153,17 @@ class Connector(AbstractConnector): return f"{self.covers_url}/b/id/{image_name}" def parse_search_data(self, data, min_confidence): - for search_result in data.get("docs"): + for idx, search_result in enumerate(data.get("docs")): # build the remote id from the openlibrary key key = self.books_url + search_result["key"] author = search_result.get("author_name") or ["Unknown"] cover_blob = search_result.get("cover_i") cover = self.get_cover_url([cover_blob], size="M") if cover_blob else None + + # OL doesn't provide confidence, but it does sort by an internal ranking, so + # this confidence value is relative to the list position + confidence = 1 / (idx + 1) + yield SearchResult( title=search_result.get("title"), key=key, @@ -166,6 +171,7 @@ class Connector(AbstractConnector): connector=self, year=search_result.get("first_publish_year"), cover=cover, + confidence=confidence, ) def parse_isbn_search_data(self, data): From 20f452ebf4563e6b29ea7a2aec82ef65a246584c Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 31 May 2022 12:23:59 -0700 Subject: [PATCH 17/21] Clip column in about page Text in the superlatives section can cause this column to expand outside the container. --- bookwyrm/templates/about/layout.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/templates/about/layout.html b/bookwyrm/templates/about/layout.html index 458e4b1d1..e921fcd29 100644 --- a/bookwyrm/templates/about/layout.html +++ b/bookwyrm/templates/about/layout.html @@ -50,7 +50,7 @@ -
+
{% block about_content %}{% endblock %}
From 077c9bfe46746b14bd992f349e7e676c5242ec20 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 31 May 2022 16:53:46 -0700 Subject: [PATCH 18/21] Updates locales for stopped reading strings --- locale/de_DE/LC_MESSAGES/django.mo | Bin 30883 -> 89936 bytes locale/de_DE/LC_MESSAGES/django.po | 58 +++++------ locale/en_US/LC_MESSAGES/django.po | 138 ++++++++++++++++++--------- locale/es_ES/LC_MESSAGES/django.mo | Bin 93859 -> 93859 bytes locale/es_ES/LC_MESSAGES/django.po | 58 +++++------ locale/fi_FI/LC_MESSAGES/django.mo | Bin 92620 -> 92620 bytes locale/fi_FI/LC_MESSAGES/django.po | 58 +++++------ locale/fr_FR/LC_MESSAGES/django.mo | Bin 44850 -> 96386 bytes locale/fr_FR/LC_MESSAGES/django.po | 58 +++++------ locale/gl_ES/LC_MESSAGES/django.mo | Bin 91831 -> 91831 bytes locale/gl_ES/LC_MESSAGES/django.po | 58 +++++------ locale/it_IT/LC_MESSAGES/django.mo | Bin 93253 -> 93253 bytes locale/it_IT/LC_MESSAGES/django.po | 58 +++++------ locale/lt_LT/LC_MESSAGES/django.mo | Bin 95566 -> 95566 bytes locale/lt_LT/LC_MESSAGES/django.po | 58 +++++------ locale/no_NO/LC_MESSAGES/django.mo | Bin 79314 -> 79314 bytes locale/no_NO/LC_MESSAGES/django.po | 58 +++++------ locale/pt_BR/LC_MESSAGES/django.mo | Bin 92485 -> 92485 bytes locale/pt_BR/LC_MESSAGES/django.po | 58 +++++------ locale/pt_PT/LC_MESSAGES/django.mo | Bin 86645 -> 86645 bytes locale/pt_PT/LC_MESSAGES/django.po | 58 +++++------ locale/ro_RO/LC_MESSAGES/django.mo | Bin 94710 -> 94710 bytes locale/ro_RO/LC_MESSAGES/django.po | 58 +++++------ locale/sv_SE/LC_MESSAGES/django.mo | Bin 92432 -> 92432 bytes locale/sv_SE/LC_MESSAGES/django.po | 58 +++++------ locale/zh_Hans/LC_MESSAGES/django.mo | Bin 44096 -> 86950 bytes locale/zh_Hans/LC_MESSAGES/django.po | 58 +++++------ locale/zh_Hant/LC_MESSAGES/django.mo | Bin 38839 -> 36001 bytes locale/zh_Hant/LC_MESSAGES/django.po | 58 +++++------ 29 files changed, 500 insertions(+), 450 deletions(-) diff --git a/locale/de_DE/LC_MESSAGES/django.mo b/locale/de_DE/LC_MESSAGES/django.mo index 4ce83f72b3f3850c58528f13afcd23442a75a515..ccd061ca53329dcc362b7a17be946653965e94af 100644 GIT binary patch literal 89936 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 AHvj+t literal 30883 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 diff --git a/locale/de_DE/LC_MESSAGES/django.po b/locale/de_DE/LC_MESSAGES/django.po index 6f80c594e..0775ccaff 100644 --- a/locale/de_DE/LC_MESSAGES/django.po +++ b/locale/de_DE/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-04-08 21:00+0000\n" -"PO-Revision-Date: 2022-04-30 13:02\n" +"POT-Creation-Date: 2022-05-23 21:04+0000\n" +"PO-Revision-Date: 2022-05-24 01:06\n" "Last-Translator: Mouse Reeve \n" "Language-Team: German\n" "Language: de\n" @@ -121,25 +121,25 @@ msgstr "Gefahr" msgid "Automatically generated report" msgstr "Automatisch generierter Report" -#: bookwyrm/models/base_model.py:17 bookwyrm/models/link.py:72 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/link.py:72 #: bookwyrm/templates/import/import_status.html:200 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" msgstr "Ausstehend" -#: bookwyrm/models/base_model.py:18 +#: bookwyrm/models/base_model.py:19 msgid "Self deletion" msgstr "Selbstlöschung" -#: bookwyrm/models/base_model.py:19 +#: bookwyrm/models/base_model.py:20 msgid "Moderator suspension" msgstr "Moderator*in suspendieren" -#: bookwyrm/models/base_model.py:20 +#: bookwyrm/models/base_model.py:21 msgid "Moderator deletion" msgstr "Moderator*in löschen" -#: bookwyrm/models/base_model.py:21 +#: bookwyrm/models/base_model.py:22 msgid "Domain block" msgstr "Domainsperrung" @@ -734,7 +734,7 @@ msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:115 #: bookwyrm/templates/book/book.html:202 -#: bookwyrm/templates/book/edit/edit_book.html:127 +#: bookwyrm/templates/book/edit/edit_book.html:135 #: bookwyrm/templates/book/file_links/add_link_modal.html:60 #: bookwyrm/templates/book/file_links/edit_links.html:82 #: bookwyrm/templates/groups/form.html:32 @@ -757,8 +757,8 @@ msgstr "Speichern" #: bookwyrm/templates/author/sync_modal.html:23 #: bookwyrm/templates/book/book.html:203 #: bookwyrm/templates/book/cover_add_modal.html:33 -#: bookwyrm/templates/book/edit/edit_book.html:129 -#: bookwyrm/templates/book/edit/edit_book.html:132 +#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:140 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:25 #: bookwyrm/templates/book/sync_modal.html:23 @@ -780,7 +780,7 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Das Laden von Daten wird eine Verbindung zu %(source_name)s aufbauen und überprüfen, ob Autor*in-Informationen vorliegen, die hier noch nicht bekannt sind. Bestehende Informationen werden nicht überschrieben." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:114 +#: bookwyrm/templates/book/edit/edit_book.html:122 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/password_reset.html:42 @@ -949,42 +949,42 @@ msgstr "„%(book_title)s“ bearbeiten" msgid "Add Book" msgstr "Buch hinzufügen" -#: bookwyrm/templates/book/edit/edit_book.html:54 +#: bookwyrm/templates/book/edit/edit_book.html:62 msgid "Confirm Book Info" msgstr "Buchinfo bestätigen" -#: bookwyrm/templates/book/edit/edit_book.html:62 +#: bookwyrm/templates/book/edit/edit_book.html:70 #, python-format msgid "Is \"%(name)s\" one of these authors?" msgstr "Ist „%(name)s“ einer dieser Autor*innen?" -#: bookwyrm/templates/book/edit/edit_book.html:73 -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:81 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Author of " msgstr "Autor*in von " -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Find more information at isni.org" msgstr "Weitere Informationen auf isni.org finden" -#: bookwyrm/templates/book/edit/edit_book.html:85 +#: bookwyrm/templates/book/edit/edit_book.html:93 msgid "This is a new author" msgstr "Neue*r Autor*in" -#: bookwyrm/templates/book/edit/edit_book.html:92 +#: bookwyrm/templates/book/edit/edit_book.html:100 #, python-format msgid "Creating a new author: %(name)s" msgstr "Als neue*r Autor*in erstellen: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:99 +#: bookwyrm/templates/book/edit/edit_book.html:107 msgid "Is this an edition of an existing work?" msgstr "Ist das eine Ausgabe eines vorhandenen Werkes?" -#: bookwyrm/templates/book/edit/edit_book.html:107 +#: bookwyrm/templates/book/edit/edit_book.html:115 msgid "This is a new work" msgstr "Dies ist ein neues Werk." -#: bookwyrm/templates/book/edit/edit_book.html:116 +#: bookwyrm/templates/book/edit/edit_book.html:124 #: bookwyrm/templates/feed/status.html:21 msgid "Back" msgstr "Zurück" @@ -1970,33 +1970,33 @@ msgstr "Bücher importieren" msgid "Data source:" msgstr "Datenquelle:" -#: bookwyrm/templates/import/import.html:39 +#: bookwyrm/templates/import/import.html:42 msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." msgstr "Du kannst deine Goodreads-Daten von der Import / Export-Seite deines Goodreads-Kontos downloaden." -#: bookwyrm/templates/import/import.html:44 +#: bookwyrm/templates/import/import.html:47 msgid "Data file:" msgstr "Datei:" -#: bookwyrm/templates/import/import.html:52 +#: bookwyrm/templates/import/import.html:55 msgid "Include reviews" msgstr "Besprechungen einschließen" -#: bookwyrm/templates/import/import.html:57 +#: bookwyrm/templates/import/import.html:60 msgid "Privacy setting for imported reviews:" msgstr "Datenschutzeinstellung für importierte Besprechungen:" -#: bookwyrm/templates/import/import.html:63 +#: bookwyrm/templates/import/import.html:66 #: bookwyrm/templates/preferences/layout.html:31 #: bookwyrm/templates/settings/federation/instance_blocklist.html:76 msgid "Import" msgstr "Importieren" -#: bookwyrm/templates/import/import.html:68 +#: bookwyrm/templates/import/import.html:71 msgid "Recent Imports" msgstr "Zuletzt importiert" -#: bookwyrm/templates/import/import.html:70 +#: bookwyrm/templates/import/import.html:73 msgid "No recent imports" msgstr "Keine aktuellen Importe" @@ -5114,7 +5114,7 @@ msgstr "Datei überschreitet die maximale Größe von 10MB" msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/views/imports/import_data.py:67 +#: bookwyrm/views/imports/import_data.py:70 msgid "Not a valid csv file" msgstr "Keine gültige CSV-Datei" diff --git a/locale/en_US/LC_MESSAGES/django.po b/locale/en_US/LC_MESSAGES/django.po index e776c8268..4b96725bf 100644 --- a/locale/en_US/LC_MESSAGES/django.po +++ b/locale/en_US/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-23 21:04+0000\n" +"POT-Creation-Date: 2022-05-31 23:50+0000\n" "PO-Revision-Date: 2021-02-28 17:19-0800\n" "Last-Translator: Mouse Reeve \n" "Language-Team: English \n" @@ -47,6 +47,10 @@ msgstr "" msgid "Reading finish date cannot be before start date." msgstr "" +#: bookwyrm/forms/forms.py:59 +msgid "Reading stopped date cannot be before start date." +msgstr "" + #: bookwyrm/forms/landing.py:32 msgid "User with this username already exists" msgstr "" @@ -71,8 +75,8 @@ msgstr "" msgid "Book Title" msgstr "" -#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:155 -#: bookwyrm/templates/shelf/shelf.html:187 +#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:156 +#: bookwyrm/templates/shelf/shelf.html:188 #: bookwyrm/templates/snippets/create_status/review.html:32 msgid "Rating" msgstr "" @@ -1076,7 +1080,7 @@ msgid "Add Another Author" msgstr "" #: bookwyrm/templates/book/edit/edit_book_form.html:220 -#: bookwyrm/templates/shelf/shelf.html:146 +#: bookwyrm/templates/shelf/shelf.html:147 msgid "Cover" msgstr "" @@ -1710,13 +1714,13 @@ msgstr "" #: bookwyrm/templates/get_started/book_preview.html:10 #: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:33 -#: bookwyrm/templatetags/shelf_tags.py:46 +#: bookwyrm/templatetags/shelf_tags.py:48 msgid "To Read" msgstr "" #: bookwyrm/templates/get_started/book_preview.html:11 #: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:34 -#: bookwyrm/templatetags/shelf_tags.py:48 +#: bookwyrm/templatetags/shelf_tags.py:50 msgid "Currently Reading" msgstr "" @@ -1725,10 +1729,15 @@ msgstr "" #: bookwyrm/templates/snippets/shelf_selector.html:47 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12 -#: bookwyrm/templates/user/user.html:35 bookwyrm/templatetags/shelf_tags.py:50 +#: bookwyrm/templates/user/user.html:35 bookwyrm/templatetags/shelf_tags.py:52 msgid "Read" msgstr "" +#: bookwyrm/templates/get_started/book_preview.html:13 +#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:36 +msgid "Stopped Reading" +msgstr "" + #: bookwyrm/templates/get_started/books.html:6 msgid "What are you reading?" msgstr "" @@ -2056,8 +2065,8 @@ msgid "Row" msgstr "" #: bookwyrm/templates/import/import_status.html:103 -#: bookwyrm/templates/shelf/shelf.html:147 -#: bookwyrm/templates/shelf/shelf.html:169 +#: bookwyrm/templates/shelf/shelf.html:148 +#: bookwyrm/templates/shelf/shelf.html:170 msgid "Title" msgstr "" @@ -2070,8 +2079,8 @@ msgid "Openlibrary key" msgstr "" #: bookwyrm/templates/import/import_status.html:114 -#: bookwyrm/templates/shelf/shelf.html:148 -#: bookwyrm/templates/shelf/shelf.html:172 +#: bookwyrm/templates/shelf/shelf.html:149 +#: bookwyrm/templates/shelf/shelf.html:173 msgid "Author" msgstr "" @@ -2989,6 +2998,11 @@ msgstr "" msgid "Start \"%(book_title)s\"" msgstr "" +#: bookwyrm/templates/reading_progress/stop.html:5 +#, python-format +msgid "Stop Reading \"%(book_title)s\"" +msgstr "" + #: bookwyrm/templates/reading_progress/want.html:5 #, python-format msgid "Want to Read \"%(book_title)s\"" @@ -3013,6 +3027,7 @@ msgstr "" #: bookwyrm/templates/readthrough/readthrough_modal.html:38 #: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:24 #: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:21 +#: bookwyrm/templates/snippets/reading_modals/stop_reading_modal.html:24 msgid "Started reading" msgstr "" @@ -3021,7 +3036,7 @@ msgstr "" msgid "Progress" msgstr "" -#: bookwyrm/templates/readthrough/readthrough_form.html:24 +#: bookwyrm/templates/readthrough/readthrough_form.html:25 #: bookwyrm/templates/readthrough/readthrough_modal.html:63 #: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:32 msgid "Finished reading" @@ -3035,23 +3050,27 @@ msgstr "" msgid "finished" msgstr "" -#: bookwyrm/templates/readthrough/readthrough_list.html:25 +#: bookwyrm/templates/readthrough/readthrough_list.html:16 +msgid "stopped" +msgstr "" + +#: bookwyrm/templates/readthrough/readthrough_list.html:27 msgid "Show all updates" msgstr "" -#: bookwyrm/templates/readthrough/readthrough_list.html:41 +#: bookwyrm/templates/readthrough/readthrough_list.html:43 msgid "Delete this progress update" msgstr "" -#: bookwyrm/templates/readthrough/readthrough_list.html:53 +#: bookwyrm/templates/readthrough/readthrough_list.html:55 msgid "started" msgstr "" -#: bookwyrm/templates/readthrough/readthrough_list.html:60 +#: bookwyrm/templates/readthrough/readthrough_list.html:62 msgid "Edit read dates" msgstr "" -#: bookwyrm/templates/readthrough/readthrough_list.html:68 +#: bookwyrm/templates/readthrough/readthrough_list.html:70 msgid "Delete these read dates" msgstr "" @@ -4359,46 +4378,51 @@ msgid "User profile" msgstr "" #: bookwyrm/templates/shelf/shelf.html:39 -#: bookwyrm/templatetags/shelf_tags.py:44 bookwyrm/views/shelf/shelf.py:53 +#: bookwyrm/templatetags/shelf_tags.py:46 bookwyrm/views/shelf/shelf.py:53 msgid "All books" msgstr "" -#: bookwyrm/templates/shelf/shelf.html:96 +#: bookwyrm/templates/shelf/shelf.html:97 #, python-format msgid "%(formatted_count)s book" msgid_plural "%(formatted_count)s books" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templates/shelf/shelf.html:103 +#: bookwyrm/templates/shelf/shelf.html:104 #, python-format msgid "(showing %(start)s-%(end)s)" msgstr "" -#: bookwyrm/templates/shelf/shelf.html:115 +#: bookwyrm/templates/shelf/shelf.html:116 msgid "Edit shelf" msgstr "" -#: bookwyrm/templates/shelf/shelf.html:123 +#: bookwyrm/templates/shelf/shelf.html:124 msgid "Delete shelf" msgstr "" -#: bookwyrm/templates/shelf/shelf.html:151 -#: bookwyrm/templates/shelf/shelf.html:177 +#: bookwyrm/templates/shelf/shelf.html:152 +#: bookwyrm/templates/shelf/shelf.html:178 msgid "Shelved" msgstr "" -#: bookwyrm/templates/shelf/shelf.html:152 -#: bookwyrm/templates/shelf/shelf.html:180 +#: bookwyrm/templates/shelf/shelf.html:153 +#: bookwyrm/templates/shelf/shelf.html:181 msgid "Started" msgstr "" -#: bookwyrm/templates/shelf/shelf.html:153 -#: bookwyrm/templates/shelf/shelf.html:183 +#: bookwyrm/templates/shelf/shelf.html:154 +#: bookwyrm/templates/shelf/shelf.html:184 msgid "Finished" msgstr "" -#: bookwyrm/templates/shelf/shelf.html:209 +#: bookwyrm/templates/shelf/shelf.html:154 +#: bookwyrm/templates/shelf/shelf.html:184 +msgid "Until" +msgstr "" + +#: bookwyrm/templates/shelf/shelf.html:210 msgid "This shelf is empty." msgstr "" @@ -4728,7 +4752,7 @@ msgid "(Optional)" msgstr "" #: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:6 -#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:54 +#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:61 msgid "Update progress" msgstr "" @@ -4737,6 +4761,17 @@ msgstr "" msgid "Start \"%(book_title)s\"" msgstr "" +#: bookwyrm/templates/snippets/reading_modals/stop_reading_modal.html:6 +#, python-format +msgid "Stop Reading \"%(book_title)s\"" +msgstr "" + +#: bookwyrm/templates/snippets/reading_modals/stop_reading_modal.html:32 +#: bookwyrm/templates/snippets/shelf_selector.html:54 +#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:21 +msgid "Stopped reading" +msgstr "" + #: bookwyrm/templates/snippets/reading_modals/want_to_read_modal.html:6 #, python-format msgid "Want to Read \"%(book_title)s\"" @@ -4784,23 +4819,23 @@ msgstr "" #: bookwyrm/templates/snippets/shelf_selector.html:39 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:17 -#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:24 +#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:33 msgid "Start reading" msgstr "" -#: bookwyrm/templates/snippets/shelf_selector.html:54 -#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:31 -#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:38 +#: bookwyrm/templates/snippets/shelf_selector.html:61 +#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:38 +#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:55 msgid "Want to read" msgstr "" -#: bookwyrm/templates/snippets/shelf_selector.html:75 -#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:66 +#: bookwyrm/templates/snippets/shelf_selector.html:82 +#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:73 #, python-format msgid "Remove from %(name)s" msgstr "" -#: bookwyrm/templates/snippets/shelf_selector.html:88 +#: bookwyrm/templates/snippets/shelf_selector.html:95 msgid "Remove from" msgstr "" @@ -4808,7 +4843,12 @@ msgstr "" msgid "More shelves" msgstr "" -#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:31 +#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:31 +#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:48 +msgid "Stop reading" +msgstr "" + +#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:40 msgid "Finish reading" msgstr "" @@ -4903,6 +4943,16 @@ msgstr "" msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 +#, python-format +msgid "stopped reading %(book)s by %(author_name)s" +msgstr "" + +#: bookwyrm/templates/snippets/status/headers/stopped_reading.html:17 +#, python-format +msgid "stopped reading %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/to_read.html:10 #, python-format msgid "wants to read %(book)s by %(author_name)s" @@ -5043,29 +5093,29 @@ msgstr "" msgid "Edit profile" msgstr "" -#: bookwyrm/templates/user/user.html:37 +#: bookwyrm/templates/user/user.html:38 #, python-format msgid "View all %(size)s" msgstr "" -#: bookwyrm/templates/user/user.html:51 +#: bookwyrm/templates/user/user.html:52 msgid "View all books" msgstr "" -#: bookwyrm/templates/user/user.html:58 +#: bookwyrm/templates/user/user.html:59 #, python-format msgid "%(current_year)s Reading Goal" msgstr "" -#: bookwyrm/templates/user/user.html:65 +#: bookwyrm/templates/user/user.html:66 msgid "User Activity" msgstr "" -#: bookwyrm/templates/user/user.html:69 +#: bookwyrm/templates/user/user.html:70 msgid "RSS feed" msgstr "" -#: bookwyrm/templates/user/user.html:80 +#: bookwyrm/templates/user/user.html:81 msgid "No activities yet!" msgstr "" diff --git a/locale/es_ES/LC_MESSAGES/django.mo b/locale/es_ES/LC_MESSAGES/django.mo index d108960bfa49e878cdc4f279ef13f34c3c5d38a7..ac3c879c224b7d0ec19c665c5026d0f1457921b1 100644 GIT binary patch delta 25 hcmZ2{mv!-7)(y2cxlDD9OcV?ZtqjaIx8IbR3IK<63CI8d delta 25 hcmZ2{mv!-7)(y2cxlDA84HOIwtPD&xx8IbR3IK;U3BmvX diff --git a/locale/es_ES/LC_MESSAGES/django.po b/locale/es_ES/LC_MESSAGES/django.po index 9d31c52d8..92dc13654 100644 --- a/locale/es_ES/LC_MESSAGES/django.po +++ b/locale/es_ES/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-04-08 21:00+0000\n" -"PO-Revision-Date: 2022-04-30 10:04\n" +"POT-Creation-Date: 2022-05-23 21:04+0000\n" +"PO-Revision-Date: 2022-05-24 01:06\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Spanish\n" "Language: es\n" @@ -121,25 +121,25 @@ msgstr "Cuidado" msgid "Automatically generated report" msgstr "Informe generado automáticamente" -#: bookwyrm/models/base_model.py:17 bookwyrm/models/link.py:72 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/link.py:72 #: bookwyrm/templates/import/import_status.html:200 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" msgstr "Pendiente" -#: bookwyrm/models/base_model.py:18 +#: bookwyrm/models/base_model.py:19 msgid "Self deletion" msgstr "Auto-eliminación" -#: bookwyrm/models/base_model.py:19 +#: bookwyrm/models/base_model.py:20 msgid "Moderator suspension" msgstr "Suspensión de moderador" -#: bookwyrm/models/base_model.py:20 +#: bookwyrm/models/base_model.py:21 msgid "Moderator deletion" msgstr "Eliminación de moderador" -#: bookwyrm/models/base_model.py:21 +#: bookwyrm/models/base_model.py:22 msgid "Domain block" msgstr "Bloqueo de dominio" @@ -734,7 +734,7 @@ msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:115 #: bookwyrm/templates/book/book.html:202 -#: bookwyrm/templates/book/edit/edit_book.html:127 +#: bookwyrm/templates/book/edit/edit_book.html:135 #: bookwyrm/templates/book/file_links/add_link_modal.html:60 #: bookwyrm/templates/book/file_links/edit_links.html:82 #: bookwyrm/templates/groups/form.html:32 @@ -757,8 +757,8 @@ msgstr "Guardar" #: bookwyrm/templates/author/sync_modal.html:23 #: bookwyrm/templates/book/book.html:203 #: bookwyrm/templates/book/cover_add_modal.html:33 -#: bookwyrm/templates/book/edit/edit_book.html:129 -#: bookwyrm/templates/book/edit/edit_book.html:132 +#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:140 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:25 #: bookwyrm/templates/book/sync_modal.html:23 @@ -780,7 +780,7 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "La carga de datos se conectará a %(source_name)s y comprobará si hay metadatos sobre este autor que no están presentes aquí. Los metadatos existentes no serán sobrescritos." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:114 +#: bookwyrm/templates/book/edit/edit_book.html:122 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/password_reset.html:42 @@ -949,42 +949,42 @@ msgstr "Editar \"%(book_title)s\"" msgid "Add Book" msgstr "Agregar libro" -#: bookwyrm/templates/book/edit/edit_book.html:54 +#: bookwyrm/templates/book/edit/edit_book.html:62 msgid "Confirm Book Info" msgstr "Confirmar información de libro" -#: bookwyrm/templates/book/edit/edit_book.html:62 +#: bookwyrm/templates/book/edit/edit_book.html:70 #, python-format msgid "Is \"%(name)s\" one of these authors?" msgstr "¿Es \"%(name)s\" uno de estos autores?" -#: bookwyrm/templates/book/edit/edit_book.html:73 -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:81 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Author of " msgstr "Autor/a de " -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Find more information at isni.org" msgstr "Más información en isni.org" -#: bookwyrm/templates/book/edit/edit_book.html:85 +#: bookwyrm/templates/book/edit/edit_book.html:93 msgid "This is a new author" msgstr "Este es un autor nuevo" -#: bookwyrm/templates/book/edit/edit_book.html:92 +#: bookwyrm/templates/book/edit/edit_book.html:100 #, python-format msgid "Creating a new author: %(name)s" msgstr "Creando un autor nuevo: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:99 +#: bookwyrm/templates/book/edit/edit_book.html:107 msgid "Is this an edition of an existing work?" msgstr "¿Es esta una edición de una obra ya existente?" -#: bookwyrm/templates/book/edit/edit_book.html:107 +#: bookwyrm/templates/book/edit/edit_book.html:115 msgid "This is a new work" msgstr "Esta es una obra nueva" -#: bookwyrm/templates/book/edit/edit_book.html:116 +#: bookwyrm/templates/book/edit/edit_book.html:124 #: bookwyrm/templates/feed/status.html:21 msgid "Back" msgstr "Volver" @@ -1970,33 +1970,33 @@ msgstr "Importar libros" msgid "Data source:" msgstr "Fuente de datos:" -#: bookwyrm/templates/import/import.html:39 +#: bookwyrm/templates/import/import.html:42 msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." msgstr "Puedes descargar tus datos de Goodreads desde la página de importación/exportación de tu cuenta de Goodreads." -#: bookwyrm/templates/import/import.html:44 +#: bookwyrm/templates/import/import.html:47 msgid "Data file:" msgstr "Archivo de datos:" -#: bookwyrm/templates/import/import.html:52 +#: bookwyrm/templates/import/import.html:55 msgid "Include reviews" msgstr "Incluir reseñas" -#: bookwyrm/templates/import/import.html:57 +#: bookwyrm/templates/import/import.html:60 msgid "Privacy setting for imported reviews:" msgstr "Configuración de privacidad para las reseñas importadas:" -#: bookwyrm/templates/import/import.html:63 +#: bookwyrm/templates/import/import.html:66 #: bookwyrm/templates/preferences/layout.html:31 #: bookwyrm/templates/settings/federation/instance_blocklist.html:76 msgid "Import" msgstr "Importar" -#: bookwyrm/templates/import/import.html:68 +#: bookwyrm/templates/import/import.html:71 msgid "Recent Imports" msgstr "Importaciones recientes" -#: bookwyrm/templates/import/import.html:70 +#: bookwyrm/templates/import/import.html:73 msgid "No recent imports" msgstr "No hay ninguna importación reciente" @@ -5114,7 +5114,7 @@ msgstr "Archivo excede el tamaño máximo: 10MB" msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/views/imports/import_data.py:67 +#: bookwyrm/views/imports/import_data.py:70 msgid "Not a valid csv file" msgstr "No un archivo csv válido" diff --git a/locale/fi_FI/LC_MESSAGES/django.mo b/locale/fi_FI/LC_MESSAGES/django.mo index 91cf658f5016a3ec26cdf09513566445208c6f1d..a36c6c9337a59868d3f38cac2e617e96175c0262 100644 GIT binary patch delta 23 fcmX?enf1(N)(!PHIgCsc3=FLd%r>{*be#YIeMbq% delta 23 fcmX?enf1(N)(!PHISkAd3{9*|O*XgRbe#YIeT@mw diff --git a/locale/fi_FI/LC_MESSAGES/django.po b/locale/fi_FI/LC_MESSAGES/django.po index e2ceaad3d..0241e1e41 100644 --- a/locale/fi_FI/LC_MESSAGES/django.po +++ b/locale/fi_FI/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-04-08 21:00+0000\n" -"PO-Revision-Date: 2022-05-07 14:54\n" +"POT-Creation-Date: 2022-05-23 21:04+0000\n" +"PO-Revision-Date: 2022-05-24 01:06\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Finnish\n" "Language: fi\n" @@ -121,25 +121,25 @@ msgstr "Vaara" msgid "Automatically generated report" msgstr "Automaattisesti luotu raportti" -#: bookwyrm/models/base_model.py:17 bookwyrm/models/link.py:72 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/link.py:72 #: bookwyrm/templates/import/import_status.html:200 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" msgstr "Odottaa" -#: bookwyrm/models/base_model.py:18 +#: bookwyrm/models/base_model.py:19 msgid "Self deletion" msgstr "Itse poistettu" -#: bookwyrm/models/base_model.py:19 +#: bookwyrm/models/base_model.py:20 msgid "Moderator suspension" msgstr "Moderaattorin estämä" -#: bookwyrm/models/base_model.py:20 +#: bookwyrm/models/base_model.py:21 msgid "Moderator deletion" msgstr "Moderaattorin poistama" -#: bookwyrm/models/base_model.py:21 +#: bookwyrm/models/base_model.py:22 msgid "Domain block" msgstr "Verkkotunnuksen esto" @@ -734,7 +734,7 @@ msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:115 #: bookwyrm/templates/book/book.html:202 -#: bookwyrm/templates/book/edit/edit_book.html:127 +#: bookwyrm/templates/book/edit/edit_book.html:135 #: bookwyrm/templates/book/file_links/add_link_modal.html:60 #: bookwyrm/templates/book/file_links/edit_links.html:82 #: bookwyrm/templates/groups/form.html:32 @@ -757,8 +757,8 @@ msgstr "Tallenna" #: bookwyrm/templates/author/sync_modal.html:23 #: bookwyrm/templates/book/book.html:203 #: bookwyrm/templates/book/cover_add_modal.html:33 -#: bookwyrm/templates/book/edit/edit_book.html:129 -#: bookwyrm/templates/book/edit/edit_book.html:132 +#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:140 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:25 #: bookwyrm/templates/book/sync_modal.html:23 @@ -780,7 +780,7 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Tietoja ladattaessa muodostetaan yhteys lähteeseen %(source_name)s ja sieltä haetaan metatietoja, joita ei vielä ole täällä. Olemassa olevia metatietoja ei korvata uusilla." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:114 +#: bookwyrm/templates/book/edit/edit_book.html:122 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/password_reset.html:42 @@ -949,42 +949,42 @@ msgstr "Muokkaa teosta ”%(book_title)s”" msgid "Add Book" msgstr "Lisää kirja" -#: bookwyrm/templates/book/edit/edit_book.html:54 +#: bookwyrm/templates/book/edit/edit_book.html:62 msgid "Confirm Book Info" msgstr "Vahvista kirjan tiedot" -#: bookwyrm/templates/book/edit/edit_book.html:62 +#: bookwyrm/templates/book/edit/edit_book.html:70 #, python-format msgid "Is \"%(name)s\" one of these authors?" msgstr "Onko ”%(name)s” joku seuraavista tekijöistä?" -#: bookwyrm/templates/book/edit/edit_book.html:73 -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:81 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Author of " msgstr "Tekijänä teoksessa " -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Find more information at isni.org" msgstr "Lisätietoja osoitteessa isni.org" -#: bookwyrm/templates/book/edit/edit_book.html:85 +#: bookwyrm/templates/book/edit/edit_book.html:93 msgid "This is a new author" msgstr "Uusi tekijä" -#: bookwyrm/templates/book/edit/edit_book.html:92 +#: bookwyrm/templates/book/edit/edit_book.html:100 #, python-format msgid "Creating a new author: %(name)s" msgstr "Luodaan uusi tekijä: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:99 +#: bookwyrm/templates/book/edit/edit_book.html:107 msgid "Is this an edition of an existing work?" msgstr "Onko tämä aiemmin lisätyn teoksen laitos?" -#: bookwyrm/templates/book/edit/edit_book.html:107 +#: bookwyrm/templates/book/edit/edit_book.html:115 msgid "This is a new work" msgstr "Uusi teos" -#: bookwyrm/templates/book/edit/edit_book.html:116 +#: bookwyrm/templates/book/edit/edit_book.html:124 #: bookwyrm/templates/feed/status.html:21 msgid "Back" msgstr "Takaisin" @@ -1970,33 +1970,33 @@ msgstr "Tuo kirjoja" msgid "Data source:" msgstr "Tietolähde:" -#: bookwyrm/templates/import/import.html:39 +#: bookwyrm/templates/import/import.html:42 msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." msgstr "Goodreads-tiedot voi ladata Goodreads-käyttäjätilin Import/Export-sivun kautta." -#: bookwyrm/templates/import/import.html:44 +#: bookwyrm/templates/import/import.html:47 msgid "Data file:" msgstr "Datatiedosto:" -#: bookwyrm/templates/import/import.html:52 +#: bookwyrm/templates/import/import.html:55 msgid "Include reviews" msgstr "Myös arviot" -#: bookwyrm/templates/import/import.html:57 +#: bookwyrm/templates/import/import.html:60 msgid "Privacy setting for imported reviews:" msgstr "Tuotavien arvioiden yksityisyysvalinta:" -#: bookwyrm/templates/import/import.html:63 +#: bookwyrm/templates/import/import.html:66 #: bookwyrm/templates/preferences/layout.html:31 #: bookwyrm/templates/settings/federation/instance_blocklist.html:76 msgid "Import" msgstr "Tuo" -#: bookwyrm/templates/import/import.html:68 +#: bookwyrm/templates/import/import.html:71 msgid "Recent Imports" msgstr "Viimeksi tuotu" -#: bookwyrm/templates/import/import.html:70 +#: bookwyrm/templates/import/import.html:73 msgid "No recent imports" msgstr "Ei viimeaikaisia tuonteja" @@ -5114,7 +5114,7 @@ msgstr "Tiedosto on enimmäiskokoa 10 Mt suurempi" msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/views/imports/import_data.py:67 +#: bookwyrm/views/imports/import_data.py:70 msgid "Not a valid csv file" msgstr "Epäkelpo csv-tiedosto" diff --git a/locale/fr_FR/LC_MESSAGES/django.mo b/locale/fr_FR/LC_MESSAGES/django.mo index 4cdcbf8ea2a3ffdeed740317a055f435e5954b7c..1414a05541850774156dd0c1b35482baaca20e5d 100644 GIT binary patch literal 96386 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 delta 18721 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 g2Pl;0ff{U(e5sI\n" "Language-Team: French\n" "Language: fr\n" @@ -121,25 +121,25 @@ msgstr "Danger" msgid "Automatically generated report" msgstr "Rapport généré automatiquement" -#: bookwyrm/models/base_model.py:17 bookwyrm/models/link.py:72 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/link.py:72 #: bookwyrm/templates/import/import_status.html:200 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" msgstr "En attente" -#: bookwyrm/models/base_model.py:18 +#: bookwyrm/models/base_model.py:19 msgid "Self deletion" msgstr "Auto-suppression" -#: bookwyrm/models/base_model.py:19 +#: bookwyrm/models/base_model.py:20 msgid "Moderator suspension" msgstr "Suspension du modérateur" -#: bookwyrm/models/base_model.py:20 +#: bookwyrm/models/base_model.py:21 msgid "Moderator deletion" msgstr "Suppression du modérateur" -#: bookwyrm/models/base_model.py:21 +#: bookwyrm/models/base_model.py:22 msgid "Domain block" msgstr "Blocage de domaine" @@ -734,7 +734,7 @@ msgstr "ISNI :" #: bookwyrm/templates/author/edit_author.html:115 #: bookwyrm/templates/book/book.html:202 -#: bookwyrm/templates/book/edit/edit_book.html:127 +#: bookwyrm/templates/book/edit/edit_book.html:135 #: bookwyrm/templates/book/file_links/add_link_modal.html:60 #: bookwyrm/templates/book/file_links/edit_links.html:82 #: bookwyrm/templates/groups/form.html:32 @@ -757,8 +757,8 @@ msgstr "Enregistrer" #: bookwyrm/templates/author/sync_modal.html:23 #: bookwyrm/templates/book/book.html:203 #: bookwyrm/templates/book/cover_add_modal.html:33 -#: bookwyrm/templates/book/edit/edit_book.html:129 -#: bookwyrm/templates/book/edit/edit_book.html:132 +#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:140 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:25 #: bookwyrm/templates/book/sync_modal.html:23 @@ -780,7 +780,7 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Le chargement des données se connectera à %(source_name)s et vérifiera les métadonnées de cet auteur ou autrice qui ne sont pas présentes ici. Les métadonnées existantes ne seront pas écrasées." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:114 +#: bookwyrm/templates/book/edit/edit_book.html:122 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/password_reset.html:42 @@ -949,42 +949,42 @@ msgstr "Modifier « %(book_title)s »" msgid "Add Book" msgstr "Ajouter un livre" -#: bookwyrm/templates/book/edit/edit_book.html:54 +#: bookwyrm/templates/book/edit/edit_book.html:62 msgid "Confirm Book Info" msgstr "Confirmer les informations de ce livre" -#: bookwyrm/templates/book/edit/edit_book.html:62 +#: bookwyrm/templates/book/edit/edit_book.html:70 #, python-format msgid "Is \"%(name)s\" one of these authors?" msgstr "Est-ce que \"%(name)s\" fait partie de ces auteurs ou autrices ?" -#: bookwyrm/templates/book/edit/edit_book.html:73 -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:81 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Author of " msgstr "Auteur ou autrice de " -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Find more information at isni.org" msgstr "Trouver plus d’informations sur isni.org" -#: bookwyrm/templates/book/edit/edit_book.html:85 +#: bookwyrm/templates/book/edit/edit_book.html:93 msgid "This is a new author" msgstr "Il s’agit d’un nouvel auteur ou d’une nouvelle autrice." -#: bookwyrm/templates/book/edit/edit_book.html:92 +#: bookwyrm/templates/book/edit/edit_book.html:100 #, python-format msgid "Creating a new author: %(name)s" msgstr "Création d’un nouvel auteur/autrice : %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:99 +#: bookwyrm/templates/book/edit/edit_book.html:107 msgid "Is this an edition of an existing work?" msgstr "Est‑ce l’édition d’un ouvrage existant ?" -#: bookwyrm/templates/book/edit/edit_book.html:107 +#: bookwyrm/templates/book/edit/edit_book.html:115 msgid "This is a new work" msgstr "Il s’agit d’un nouvel ouvrage." -#: bookwyrm/templates/book/edit/edit_book.html:116 +#: bookwyrm/templates/book/edit/edit_book.html:124 #: bookwyrm/templates/feed/status.html:21 msgid "Back" msgstr "Retour" @@ -1970,33 +1970,33 @@ msgstr "Importer des livres" msgid "Data source:" msgstr "Source de données :" -#: bookwyrm/templates/import/import.html:39 +#: bookwyrm/templates/import/import.html:42 msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." msgstr "Vous pouvez télécharger vos données Goodreads depuis la page Import/Export de votre compte Goodreads." -#: bookwyrm/templates/import/import.html:44 +#: bookwyrm/templates/import/import.html:47 msgid "Data file:" msgstr "Fichier de données :" -#: bookwyrm/templates/import/import.html:52 +#: bookwyrm/templates/import/import.html:55 msgid "Include reviews" msgstr "Importer les critiques" -#: bookwyrm/templates/import/import.html:57 +#: bookwyrm/templates/import/import.html:60 msgid "Privacy setting for imported reviews:" msgstr "Confidentialité des critiques importées :" -#: bookwyrm/templates/import/import.html:63 +#: bookwyrm/templates/import/import.html:66 #: bookwyrm/templates/preferences/layout.html:31 #: bookwyrm/templates/settings/federation/instance_blocklist.html:76 msgid "Import" msgstr "Importer" -#: bookwyrm/templates/import/import.html:68 +#: bookwyrm/templates/import/import.html:71 msgid "Recent Imports" msgstr "Importations récentes" -#: bookwyrm/templates/import/import.html:70 +#: bookwyrm/templates/import/import.html:73 msgid "No recent imports" msgstr "Aucune importation récente" @@ -5114,7 +5114,7 @@ msgstr "Ce fichier dépasse la taille limite : 10 Mo" msgid "%(title)s: %(subtitle)s" msgstr "%(title)s (%(subtitle)s)" -#: bookwyrm/views/imports/import_data.py:67 +#: bookwyrm/views/imports/import_data.py:70 msgid "Not a valid csv file" msgstr "Fichier CSV non valide" diff --git a/locale/gl_ES/LC_MESSAGES/django.mo b/locale/gl_ES/LC_MESSAGES/django.mo index 94b9ad7671769593d3a617ccd92bd9ddca99cd18..7f76d9eef71720793e7517b3f59f9bb4709b56a8 100644 GIT binary patch delta 25 hcmdmfmUa7C)(y2cxlDD9OcV?ZtqjaIx8F4A1ptU}3EThx delta 25 hcmdmfmUa7C)(y2cxlD8oEENn*tPG4cx8F4A1ptVU3Eltz diff --git a/locale/gl_ES/LC_MESSAGES/django.po b/locale/gl_ES/LC_MESSAGES/django.po index 8d05e8d93..13ae25253 100644 --- a/locale/gl_ES/LC_MESSAGES/django.po +++ b/locale/gl_ES/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-04-08 21:00+0000\n" -"PO-Revision-Date: 2022-04-09 14:02\n" +"POT-Creation-Date: 2022-05-23 21:04+0000\n" +"PO-Revision-Date: 2022-05-24 01:06\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Galician\n" "Language: gl\n" @@ -121,25 +121,25 @@ msgstr "Perigo" msgid "Automatically generated report" msgstr "Denuncia creada automáticamente" -#: bookwyrm/models/base_model.py:17 bookwyrm/models/link.py:72 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/link.py:72 #: bookwyrm/templates/import/import_status.html:200 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" msgstr "Pendente" -#: bookwyrm/models/base_model.py:18 +#: bookwyrm/models/base_model.py:19 msgid "Self deletion" msgstr "Auto eliminación" -#: bookwyrm/models/base_model.py:19 +#: bookwyrm/models/base_model.py:20 msgid "Moderator suspension" msgstr "Suspendido pola moderación" -#: bookwyrm/models/base_model.py:20 +#: bookwyrm/models/base_model.py:21 msgid "Moderator deletion" msgstr "Eliminado pola moderación" -#: bookwyrm/models/base_model.py:21 +#: bookwyrm/models/base_model.py:22 msgid "Domain block" msgstr "Bloqueo de dominio" @@ -734,7 +734,7 @@ msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:115 #: bookwyrm/templates/book/book.html:202 -#: bookwyrm/templates/book/edit/edit_book.html:127 +#: bookwyrm/templates/book/edit/edit_book.html:135 #: bookwyrm/templates/book/file_links/add_link_modal.html:60 #: bookwyrm/templates/book/file_links/edit_links.html:82 #: bookwyrm/templates/groups/form.html:32 @@ -757,8 +757,8 @@ msgstr "Gardar" #: bookwyrm/templates/author/sync_modal.html:23 #: bookwyrm/templates/book/book.html:203 #: bookwyrm/templates/book/cover_add_modal.html:33 -#: bookwyrm/templates/book/edit/edit_book.html:129 -#: bookwyrm/templates/book/edit/edit_book.html:132 +#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:140 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:25 #: bookwyrm/templates/book/sync_modal.html:23 @@ -780,7 +780,7 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Ao cargar os datos vas conectar con %(source_name)s e comprobar se existen metadatos desta persoa autora que non están aquí presentes. Non se sobrescribirán os datos existentes." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:114 +#: bookwyrm/templates/book/edit/edit_book.html:122 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/password_reset.html:42 @@ -949,42 +949,42 @@ msgstr "Editar \"%(book_title)s\"" msgid "Add Book" msgstr "Engadir libro" -#: bookwyrm/templates/book/edit/edit_book.html:54 +#: bookwyrm/templates/book/edit/edit_book.html:62 msgid "Confirm Book Info" msgstr "Confirma info do libro" -#: bookwyrm/templates/book/edit/edit_book.html:62 +#: bookwyrm/templates/book/edit/edit_book.html:70 #, python-format msgid "Is \"%(name)s\" one of these authors?" msgstr "É \"%(name)s\" un destas autoras?" -#: bookwyrm/templates/book/edit/edit_book.html:73 -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:81 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Author of " msgstr "Autora de " -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Find more information at isni.org" msgstr "Atopa máis información en isni.org" -#: bookwyrm/templates/book/edit/edit_book.html:85 +#: bookwyrm/templates/book/edit/edit_book.html:93 msgid "This is a new author" msgstr "Esta é unha nova autora" -#: bookwyrm/templates/book/edit/edit_book.html:92 +#: bookwyrm/templates/book/edit/edit_book.html:100 #, python-format msgid "Creating a new author: %(name)s" msgstr "Creando nova autora: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:99 +#: bookwyrm/templates/book/edit/edit_book.html:107 msgid "Is this an edition of an existing work?" msgstr "É esta a edición dun traballo existente?" -#: bookwyrm/templates/book/edit/edit_book.html:107 +#: bookwyrm/templates/book/edit/edit_book.html:115 msgid "This is a new work" msgstr "Este é un novo traballo" -#: bookwyrm/templates/book/edit/edit_book.html:116 +#: bookwyrm/templates/book/edit/edit_book.html:124 #: bookwyrm/templates/feed/status.html:21 msgid "Back" msgstr "Atrás" @@ -1970,33 +1970,33 @@ msgstr "Importar libros" msgid "Data source:" msgstr "Fonte de datos:" -#: bookwyrm/templates/import/import.html:39 +#: bookwyrm/templates/import/import.html:42 msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." msgstr "Podes descargar os teus datos de Goodreads desde a páxina de Exportación/Importación da túa conta Goodreads." -#: bookwyrm/templates/import/import.html:44 +#: bookwyrm/templates/import/import.html:47 msgid "Data file:" msgstr "Ficheiro de datos:" -#: bookwyrm/templates/import/import.html:52 +#: bookwyrm/templates/import/import.html:55 msgid "Include reviews" msgstr "Incluír recensións" -#: bookwyrm/templates/import/import.html:57 +#: bookwyrm/templates/import/import.html:60 msgid "Privacy setting for imported reviews:" msgstr "Axuste de privacidade para recensións importadas:" -#: bookwyrm/templates/import/import.html:63 +#: bookwyrm/templates/import/import.html:66 #: bookwyrm/templates/preferences/layout.html:31 #: bookwyrm/templates/settings/federation/instance_blocklist.html:76 msgid "Import" msgstr "Importar" -#: bookwyrm/templates/import/import.html:68 +#: bookwyrm/templates/import/import.html:71 msgid "Recent Imports" msgstr "Importacións recentes" -#: bookwyrm/templates/import/import.html:70 +#: bookwyrm/templates/import/import.html:73 msgid "No recent imports" msgstr "Sen importacións recentes" @@ -5114,7 +5114,7 @@ msgstr "O ficheiro supera o tamaño máximo: 10MB" msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/views/imports/import_data.py:67 +#: bookwyrm/views/imports/import_data.py:70 msgid "Not a valid csv file" msgstr "Non é un ficheiro csv válido" diff --git a/locale/it_IT/LC_MESSAGES/django.mo b/locale/it_IT/LC_MESSAGES/django.mo index df949ed1c75517787badd903073f12e377497711..25657558b66666de4c3e924b32accca50c522b3f 100644 GIT binary patch delta 25 hcmX?lgZ1bQ)(y2cxlDD9OcV?ZtqjaIx8K}12>^}~3ZVc1 delta 25 hcmX?lgZ1bQ)(y2cxlDA83>1uvtV}F7x8K}12>^~B3Z?)6 diff --git a/locale/it_IT/LC_MESSAGES/django.po b/locale/it_IT/LC_MESSAGES/django.po index 80b09cbe6..5e53007b2 100644 --- a/locale/it_IT/LC_MESSAGES/django.po +++ b/locale/it_IT/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-04-08 21:00+0000\n" -"PO-Revision-Date: 2022-04-20 22:49\n" +"POT-Creation-Date: 2022-05-23 21:04+0000\n" +"PO-Revision-Date: 2022-05-24 01:06\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Italian\n" "Language: it\n" @@ -121,25 +121,25 @@ msgstr "Attenzione" msgid "Automatically generated report" msgstr "Rapporto generato automaticamente" -#: bookwyrm/models/base_model.py:17 bookwyrm/models/link.py:72 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/link.py:72 #: bookwyrm/templates/import/import_status.html:200 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" msgstr "In attesa" -#: bookwyrm/models/base_model.py:18 +#: bookwyrm/models/base_model.py:19 msgid "Self deletion" msgstr "Eliminazione automatica" -#: bookwyrm/models/base_model.py:19 +#: bookwyrm/models/base_model.py:20 msgid "Moderator suspension" msgstr "Sospensione del moderatore" -#: bookwyrm/models/base_model.py:20 +#: bookwyrm/models/base_model.py:21 msgid "Moderator deletion" msgstr "Cancellazione del moderatore" -#: bookwyrm/models/base_model.py:21 +#: bookwyrm/models/base_model.py:22 msgid "Domain block" msgstr "Blocco del dominio" @@ -734,7 +734,7 @@ msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:115 #: bookwyrm/templates/book/book.html:202 -#: bookwyrm/templates/book/edit/edit_book.html:127 +#: bookwyrm/templates/book/edit/edit_book.html:135 #: bookwyrm/templates/book/file_links/add_link_modal.html:60 #: bookwyrm/templates/book/file_links/edit_links.html:82 #: bookwyrm/templates/groups/form.html:32 @@ -757,8 +757,8 @@ msgstr "Salva" #: bookwyrm/templates/author/sync_modal.html:23 #: bookwyrm/templates/book/book.html:203 #: bookwyrm/templates/book/cover_add_modal.html:33 -#: bookwyrm/templates/book/edit/edit_book.html:129 -#: bookwyrm/templates/book/edit/edit_book.html:132 +#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:140 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:25 #: bookwyrm/templates/book/sync_modal.html:23 @@ -780,7 +780,7 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Il caricamento dei dati si collegherà a %(source_name)s e verificherà eventuali metadati relativi a questo autore che non sono presenti qui. I metadati esistenti non vengono sovrascritti." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:114 +#: bookwyrm/templates/book/edit/edit_book.html:122 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/password_reset.html:42 @@ -949,42 +949,42 @@ msgstr "Modifica \"%(book_title)s\"" msgid "Add Book" msgstr "Aggiungi libro" -#: bookwyrm/templates/book/edit/edit_book.html:54 +#: bookwyrm/templates/book/edit/edit_book.html:62 msgid "Confirm Book Info" msgstr "Conferma informazioni sul libro" -#: bookwyrm/templates/book/edit/edit_book.html:62 +#: bookwyrm/templates/book/edit/edit_book.html:70 #, python-format msgid "Is \"%(name)s\" one of these authors?" msgstr "È \"%(name)s\" uno di questi autori?" -#: bookwyrm/templates/book/edit/edit_book.html:73 -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:81 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Author of " msgstr "Autore di " -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Find more information at isni.org" msgstr "Trova maggiori informazioni su isni.org" -#: bookwyrm/templates/book/edit/edit_book.html:85 +#: bookwyrm/templates/book/edit/edit_book.html:93 msgid "This is a new author" msgstr "Questo è un nuovo autore" -#: bookwyrm/templates/book/edit/edit_book.html:92 +#: bookwyrm/templates/book/edit/edit_book.html:100 #, python-format msgid "Creating a new author: %(name)s" msgstr "Creazione di un nuovo autore: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:99 +#: bookwyrm/templates/book/edit/edit_book.html:107 msgid "Is this an edition of an existing work?" msgstr "È un'edizione di un'opera esistente?" -#: bookwyrm/templates/book/edit/edit_book.html:107 +#: bookwyrm/templates/book/edit/edit_book.html:115 msgid "This is a new work" msgstr "Si tratta di un nuovo lavoro" -#: bookwyrm/templates/book/edit/edit_book.html:116 +#: bookwyrm/templates/book/edit/edit_book.html:124 #: bookwyrm/templates/feed/status.html:21 msgid "Back" msgstr "Indietro" @@ -1970,33 +1970,33 @@ msgstr "Importa libri" msgid "Data source:" msgstr "Sorgenti dati:" -#: bookwyrm/templates/import/import.html:39 +#: bookwyrm/templates/import/import.html:42 msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." msgstr "Puoi scaricare i tuoi dati Goodreads dalla pagina \"Importa/Esporta\" del tuo account Goodreads." -#: bookwyrm/templates/import/import.html:44 +#: bookwyrm/templates/import/import.html:47 msgid "Data file:" msgstr "Dati file:" -#: bookwyrm/templates/import/import.html:52 +#: bookwyrm/templates/import/import.html:55 msgid "Include reviews" msgstr "Includi recensioni" -#: bookwyrm/templates/import/import.html:57 +#: bookwyrm/templates/import/import.html:60 msgid "Privacy setting for imported reviews:" msgstr "Impostazione della privacy per le recensioni importate:" -#: bookwyrm/templates/import/import.html:63 +#: bookwyrm/templates/import/import.html:66 #: bookwyrm/templates/preferences/layout.html:31 #: bookwyrm/templates/settings/federation/instance_blocklist.html:76 msgid "Import" msgstr "Importa" -#: bookwyrm/templates/import/import.html:68 +#: bookwyrm/templates/import/import.html:71 msgid "Recent Imports" msgstr "Importazioni recenti" -#: bookwyrm/templates/import/import.html:70 +#: bookwyrm/templates/import/import.html:73 msgid "No recent imports" msgstr "Nessuna importazione recente" @@ -5114,7 +5114,7 @@ msgstr "Il file supera la dimensione massima: 10MB" msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/views/imports/import_data.py:67 +#: bookwyrm/views/imports/import_data.py:70 msgid "Not a valid csv file" msgstr "Non è un file di csv valido" diff --git a/locale/lt_LT/LC_MESSAGES/django.mo b/locale/lt_LT/LC_MESSAGES/django.mo index 034db68595e2d9de93e752d0360b2007e2900104..cccee2cfc7740a9e736856d27b0052d4492deca3 100644 GIT binary patch delta 25 hcmX^2iuK$p)(y2cxlDD9OcV?ZtqjaIx8FQI8vv623h4j< delta 25 hcmX^2iuK$p)(y2cxlD8o4HOK_txQcex8FQI8vv633hV#? diff --git a/locale/lt_LT/LC_MESSAGES/django.po b/locale/lt_LT/LC_MESSAGES/django.po index a5bb31df0..a2a83ca86 100644 --- a/locale/lt_LT/LC_MESSAGES/django.po +++ b/locale/lt_LT/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-04-08 21:00+0000\n" -"PO-Revision-Date: 2022-04-10 07:54\n" +"POT-Creation-Date: 2022-05-23 21:04+0000\n" +"PO-Revision-Date: 2022-05-24 01:06\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Lithuanian\n" "Language: lt\n" @@ -121,25 +121,25 @@ msgstr "Pavojus" msgid "Automatically generated report" msgstr "Automatiškai sugeneruota ataskaita" -#: bookwyrm/models/base_model.py:17 bookwyrm/models/link.py:72 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/link.py:72 #: bookwyrm/templates/import/import_status.html:200 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" msgstr "Laukiama" -#: bookwyrm/models/base_model.py:18 +#: bookwyrm/models/base_model.py:19 msgid "Self deletion" msgstr "Išsitrina savaime" -#: bookwyrm/models/base_model.py:19 +#: bookwyrm/models/base_model.py:20 msgid "Moderator suspension" msgstr "Moderatorius nutraukė" -#: bookwyrm/models/base_model.py:20 +#: bookwyrm/models/base_model.py:21 msgid "Moderator deletion" msgstr "Moderatorius ištrynė" -#: bookwyrm/models/base_model.py:21 +#: bookwyrm/models/base_model.py:22 msgid "Domain block" msgstr "Blokuoti pagal domeną" @@ -742,7 +742,7 @@ msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:115 #: bookwyrm/templates/book/book.html:202 -#: bookwyrm/templates/book/edit/edit_book.html:127 +#: bookwyrm/templates/book/edit/edit_book.html:135 #: bookwyrm/templates/book/file_links/add_link_modal.html:60 #: bookwyrm/templates/book/file_links/edit_links.html:82 #: bookwyrm/templates/groups/form.html:32 @@ -765,8 +765,8 @@ msgstr "Išsaugoti" #: bookwyrm/templates/author/sync_modal.html:23 #: bookwyrm/templates/book/book.html:203 #: bookwyrm/templates/book/cover_add_modal.html:33 -#: bookwyrm/templates/book/edit/edit_book.html:129 -#: bookwyrm/templates/book/edit/edit_book.html:132 +#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:140 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:25 #: bookwyrm/templates/book/sync_modal.html:23 @@ -788,7 +788,7 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Duomenų įkėlimas prisijungs prie %(source_name)s ir patikrins ar nėra naujos informacijos. Esantys metaduomenys nebus perrašomi." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:114 +#: bookwyrm/templates/book/edit/edit_book.html:122 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/password_reset.html:42 @@ -961,42 +961,42 @@ msgstr "Redaguoti „%(book_title)s“" msgid "Add Book" msgstr "Pridėti knygą" -#: bookwyrm/templates/book/edit/edit_book.html:54 +#: bookwyrm/templates/book/edit/edit_book.html:62 msgid "Confirm Book Info" msgstr "Patvirtinti knygos informaciją" -#: bookwyrm/templates/book/edit/edit_book.html:62 +#: bookwyrm/templates/book/edit/edit_book.html:70 #, python-format msgid "Is \"%(name)s\" one of these authors?" msgstr "Ar \"%(name)s\" yra vienas iš šių autorių?" -#: bookwyrm/templates/book/edit/edit_book.html:73 -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:81 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Author of " msgstr "Autorius " -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Find more information at isni.org" msgstr "Daugiau informacijos isni.org" -#: bookwyrm/templates/book/edit/edit_book.html:85 +#: bookwyrm/templates/book/edit/edit_book.html:93 msgid "This is a new author" msgstr "Tai naujas autorius" -#: bookwyrm/templates/book/edit/edit_book.html:92 +#: bookwyrm/templates/book/edit/edit_book.html:100 #, python-format msgid "Creating a new author: %(name)s" msgstr "Kuriamas naujas autorius: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:99 +#: bookwyrm/templates/book/edit/edit_book.html:107 msgid "Is this an edition of an existing work?" msgstr "Ar tai egzistuojančio darbo leidimas?" -#: bookwyrm/templates/book/edit/edit_book.html:107 +#: bookwyrm/templates/book/edit/edit_book.html:115 msgid "This is a new work" msgstr "Tai naujas darbas" -#: bookwyrm/templates/book/edit/edit_book.html:116 +#: bookwyrm/templates/book/edit/edit_book.html:124 #: bookwyrm/templates/feed/status.html:21 msgid "Back" msgstr "Atgal" @@ -1990,33 +1990,33 @@ msgstr "Importuoti knygas" msgid "Data source:" msgstr "Duomenų šaltinis:" -#: bookwyrm/templates/import/import.html:39 +#: bookwyrm/templates/import/import.html:42 msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." msgstr "Galite atsisiųsti savo „Goodreads“ duomenis iš Importavimo ir eksportavimo puslapio, esančio jūsų „Goodreads“ paskyroje." -#: bookwyrm/templates/import/import.html:44 +#: bookwyrm/templates/import/import.html:47 msgid "Data file:" msgstr "Duomenų failas:" -#: bookwyrm/templates/import/import.html:52 +#: bookwyrm/templates/import/import.html:55 msgid "Include reviews" msgstr "Įtraukti atsiliepimus" -#: bookwyrm/templates/import/import.html:57 +#: bookwyrm/templates/import/import.html:60 msgid "Privacy setting for imported reviews:" msgstr "Privatumo nustatymai svarbiems atsiliepimams:" -#: bookwyrm/templates/import/import.html:63 +#: bookwyrm/templates/import/import.html:66 #: bookwyrm/templates/preferences/layout.html:31 #: bookwyrm/templates/settings/federation/instance_blocklist.html:76 msgid "Import" msgstr "Importuoti" -#: bookwyrm/templates/import/import.html:68 +#: bookwyrm/templates/import/import.html:71 msgid "Recent Imports" msgstr "Pastaruoju metu importuota" -#: bookwyrm/templates/import/import.html:70 +#: bookwyrm/templates/import/import.html:73 msgid "No recent imports" msgstr "Pastaruoju metu neimportuota" @@ -5164,7 +5164,7 @@ msgstr "Failas viršijo maksimalų dydį: 10 MB" msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/views/imports/import_data.py:67 +#: bookwyrm/views/imports/import_data.py:70 msgid "Not a valid csv file" msgstr "Netinkamas csv failas" diff --git a/locale/no_NO/LC_MESSAGES/django.mo b/locale/no_NO/LC_MESSAGES/django.mo index 8df82422a7b568c2600bf83432194b9d511b36fa..5ed2511ca983f6df576a7eecf3a41cbd3f52325e 100644 GIT binary patch delta 25 hcmccgn&r}KmJJ*CbD8QInJ5?-S{aya-o0PE3;>j;3Qzz5 delta 25 hcmccgn&r}KmJJ*CbD8KGSST17TA3Pb-o0PE3;>kD3Q_<7 diff --git a/locale/no_NO/LC_MESSAGES/django.po b/locale/no_NO/LC_MESSAGES/django.po index 21cd784c6..3d94300af 100644 --- a/locale/no_NO/LC_MESSAGES/django.po +++ b/locale/no_NO/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-04-08 21:00+0000\n" -"PO-Revision-Date: 2022-04-08 21:50\n" +"POT-Creation-Date: 2022-05-23 21:04+0000\n" +"PO-Revision-Date: 2022-05-24 01:06\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Norwegian\n" "Language: no\n" @@ -121,25 +121,25 @@ msgstr "" msgid "Automatically generated report" msgstr "" -#: bookwyrm/models/base_model.py:17 bookwyrm/models/link.py:72 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/link.py:72 #: bookwyrm/templates/import/import_status.html:200 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" msgstr "Avventer" -#: bookwyrm/models/base_model.py:18 +#: bookwyrm/models/base_model.py:19 msgid "Self deletion" msgstr "Selvsletting" -#: bookwyrm/models/base_model.py:19 +#: bookwyrm/models/base_model.py:20 msgid "Moderator suspension" msgstr "Moderatør suspensjon" -#: bookwyrm/models/base_model.py:20 +#: bookwyrm/models/base_model.py:21 msgid "Moderator deletion" msgstr "Moderatør sletting" -#: bookwyrm/models/base_model.py:21 +#: bookwyrm/models/base_model.py:22 msgid "Domain block" msgstr "Domeneblokkering" @@ -734,7 +734,7 @@ msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:115 #: bookwyrm/templates/book/book.html:202 -#: bookwyrm/templates/book/edit/edit_book.html:127 +#: bookwyrm/templates/book/edit/edit_book.html:135 #: bookwyrm/templates/book/file_links/add_link_modal.html:60 #: bookwyrm/templates/book/file_links/edit_links.html:82 #: bookwyrm/templates/groups/form.html:32 @@ -757,8 +757,8 @@ msgstr "Lagre" #: bookwyrm/templates/author/sync_modal.html:23 #: bookwyrm/templates/book/book.html:203 #: bookwyrm/templates/book/cover_add_modal.html:33 -#: bookwyrm/templates/book/edit/edit_book.html:129 -#: bookwyrm/templates/book/edit/edit_book.html:132 +#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:140 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:25 #: bookwyrm/templates/book/sync_modal.html:23 @@ -780,7 +780,7 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Laster inn data kobler til %(source_name)s og finner metadata om denne forfatteren som enda ikke finnes her. Eksisterende metadata vil ikke bli overskrevet." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:114 +#: bookwyrm/templates/book/edit/edit_book.html:122 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/password_reset.html:42 @@ -949,42 +949,42 @@ msgstr "Rediger \"%(book_title)s" msgid "Add Book" msgstr "Legg til bok" -#: bookwyrm/templates/book/edit/edit_book.html:54 +#: bookwyrm/templates/book/edit/edit_book.html:62 msgid "Confirm Book Info" msgstr "Bekreft bokinformasjon" -#: bookwyrm/templates/book/edit/edit_book.html:62 +#: bookwyrm/templates/book/edit/edit_book.html:70 #, python-format msgid "Is \"%(name)s\" one of these authors?" msgstr "Er \"%(name)s\" en av disse forfatterne?" -#: bookwyrm/templates/book/edit/edit_book.html:73 -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:81 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Author of " msgstr "Forfatter av " -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Find more information at isni.org" msgstr "Finn mer informasjon på isni.org" -#: bookwyrm/templates/book/edit/edit_book.html:85 +#: bookwyrm/templates/book/edit/edit_book.html:93 msgid "This is a new author" msgstr "Dette er en ny forfatter" -#: bookwyrm/templates/book/edit/edit_book.html:92 +#: bookwyrm/templates/book/edit/edit_book.html:100 #, python-format msgid "Creating a new author: %(name)s" msgstr "Oppretter en ny forfatter: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:99 +#: bookwyrm/templates/book/edit/edit_book.html:107 msgid "Is this an edition of an existing work?" msgstr "Er dette en utgave av et eksisterende verk?" -#: bookwyrm/templates/book/edit/edit_book.html:107 +#: bookwyrm/templates/book/edit/edit_book.html:115 msgid "This is a new work" msgstr "Dette er et nytt verk" -#: bookwyrm/templates/book/edit/edit_book.html:116 +#: bookwyrm/templates/book/edit/edit_book.html:124 #: bookwyrm/templates/feed/status.html:21 msgid "Back" msgstr "Tilbake" @@ -1970,33 +1970,33 @@ msgstr "Importer bøker" msgid "Data source:" msgstr "Datakilde:" -#: bookwyrm/templates/import/import.html:39 +#: bookwyrm/templates/import/import.html:42 msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." msgstr "Du kan laste ned Goodread-dataene dine fra Import/Export sida på Goodread-kontoen din." -#: bookwyrm/templates/import/import.html:44 +#: bookwyrm/templates/import/import.html:47 msgid "Data file:" msgstr "Datafil:" -#: bookwyrm/templates/import/import.html:52 +#: bookwyrm/templates/import/import.html:55 msgid "Include reviews" msgstr "Inkluder anmeldelser" -#: bookwyrm/templates/import/import.html:57 +#: bookwyrm/templates/import/import.html:60 msgid "Privacy setting for imported reviews:" msgstr "Personverninnstilling for importerte anmeldelser:" -#: bookwyrm/templates/import/import.html:63 +#: bookwyrm/templates/import/import.html:66 #: bookwyrm/templates/preferences/layout.html:31 #: bookwyrm/templates/settings/federation/instance_blocklist.html:76 msgid "Import" msgstr "Importér" -#: bookwyrm/templates/import/import.html:68 +#: bookwyrm/templates/import/import.html:71 msgid "Recent Imports" msgstr "Nylig importer" -#: bookwyrm/templates/import/import.html:70 +#: bookwyrm/templates/import/import.html:73 msgid "No recent imports" msgstr "Ingen nylige importer" @@ -5112,7 +5112,7 @@ msgstr "Filen overskrider maksimal størrelse: 10MB" msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/views/imports/import_data.py:67 +#: bookwyrm/views/imports/import_data.py:70 msgid "Not a valid csv file" msgstr "Ikke en gyldig csv-fil" diff --git a/locale/pt_BR/LC_MESSAGES/django.mo b/locale/pt_BR/LC_MESSAGES/django.mo index 88416d0ef1ee11c1448546b7531ef935f76c9ccb..a67f03752977dd5bf848eb84e8426cff2b52f4c2 100644 GIT binary patch delta 25 hcmX?liS_6u)(y2cxlDD9OcV?ZtqjaIx8K~?4*-n;3X%W- delta 25 hcmX?liS_6u)(y2cxlD8oEEJ54tqhGex8K~?4*-oF3X}i< diff --git a/locale/pt_BR/LC_MESSAGES/django.po b/locale/pt_BR/LC_MESSAGES/django.po index 617f15811..371e46ec6 100644 --- a/locale/pt_BR/LC_MESSAGES/django.po +++ b/locale/pt_BR/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-04-08 21:00+0000\n" -"PO-Revision-Date: 2022-04-08 23:12\n" +"POT-Creation-Date: 2022-05-23 21:04+0000\n" +"PO-Revision-Date: 2022-05-24 01:06\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Portuguese, Brazilian\n" "Language: pt\n" @@ -121,25 +121,25 @@ msgstr "Perigo" msgid "Automatically generated report" msgstr "Relatório gerado automaticamente" -#: bookwyrm/models/base_model.py:17 bookwyrm/models/link.py:72 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/link.py:72 #: bookwyrm/templates/import/import_status.html:200 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" msgstr "Pendente" -#: bookwyrm/models/base_model.py:18 +#: bookwyrm/models/base_model.py:19 msgid "Self deletion" msgstr "Autoexclusão" -#: bookwyrm/models/base_model.py:19 +#: bookwyrm/models/base_model.py:20 msgid "Moderator suspension" msgstr "Suspensão de moderador" -#: bookwyrm/models/base_model.py:20 +#: bookwyrm/models/base_model.py:21 msgid "Moderator deletion" msgstr "Exclusão de moderador" -#: bookwyrm/models/base_model.py:21 +#: bookwyrm/models/base_model.py:22 msgid "Domain block" msgstr "Bloqueio de domínio" @@ -734,7 +734,7 @@ msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:115 #: bookwyrm/templates/book/book.html:202 -#: bookwyrm/templates/book/edit/edit_book.html:127 +#: bookwyrm/templates/book/edit/edit_book.html:135 #: bookwyrm/templates/book/file_links/add_link_modal.html:60 #: bookwyrm/templates/book/file_links/edit_links.html:82 #: bookwyrm/templates/groups/form.html:32 @@ -757,8 +757,8 @@ msgstr "Salvar" #: bookwyrm/templates/author/sync_modal.html:23 #: bookwyrm/templates/book/book.html:203 #: bookwyrm/templates/book/cover_add_modal.html:33 -#: bookwyrm/templates/book/edit/edit_book.html:129 -#: bookwyrm/templates/book/edit/edit_book.html:132 +#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:140 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:25 #: bookwyrm/templates/book/sync_modal.html:23 @@ -780,7 +780,7 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Para carregar informações nos conectaremos a %(source_name)s e buscaremos metadados que ainda não temos sobre este/a autor/a. Metadados já existentes não serão substituídos." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:114 +#: bookwyrm/templates/book/edit/edit_book.html:122 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/password_reset.html:42 @@ -949,42 +949,42 @@ msgstr "Editar \"%(book_title)s\"" msgid "Add Book" msgstr "Adicionar livro" -#: bookwyrm/templates/book/edit/edit_book.html:54 +#: bookwyrm/templates/book/edit/edit_book.html:62 msgid "Confirm Book Info" msgstr "Confirmar informações do livro" -#: bookwyrm/templates/book/edit/edit_book.html:62 +#: bookwyrm/templates/book/edit/edit_book.html:70 #, python-format msgid "Is \"%(name)s\" one of these authors?" msgstr "\"%(name)s\" é uma das pessoas citadas abaixo?" -#: bookwyrm/templates/book/edit/edit_book.html:73 -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:81 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Author of " msgstr "Autor/a de " -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Find more information at isni.org" msgstr "Conheça mais em isni.org" -#: bookwyrm/templates/book/edit/edit_book.html:85 +#: bookwyrm/templates/book/edit/edit_book.html:93 msgid "This is a new author" msgstr "É um/a novo/a autor/a" -#: bookwyrm/templates/book/edit/edit_book.html:92 +#: bookwyrm/templates/book/edit/edit_book.html:100 #, python-format msgid "Creating a new author: %(name)s" msgstr "Criando um/a novo/a autor/a: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:99 +#: bookwyrm/templates/book/edit/edit_book.html:107 msgid "Is this an edition of an existing work?" msgstr "É uma edição de uma obra já registrada?" -#: bookwyrm/templates/book/edit/edit_book.html:107 +#: bookwyrm/templates/book/edit/edit_book.html:115 msgid "This is a new work" msgstr "É uma nova obra" -#: bookwyrm/templates/book/edit/edit_book.html:116 +#: bookwyrm/templates/book/edit/edit_book.html:124 #: bookwyrm/templates/feed/status.html:21 msgid "Back" msgstr "Voltar" @@ -1970,33 +1970,33 @@ msgstr "Importar livros" msgid "Data source:" msgstr "Fonte dos dados:" -#: bookwyrm/templates/import/import.html:39 +#: bookwyrm/templates/import/import.html:42 msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." msgstr "Você pode baixar seus dados do Goodreads na página de Importar/Exportar da sua conta." -#: bookwyrm/templates/import/import.html:44 +#: bookwyrm/templates/import/import.html:47 msgid "Data file:" msgstr "Arquivo de dados:" -#: bookwyrm/templates/import/import.html:52 +#: bookwyrm/templates/import/import.html:55 msgid "Include reviews" msgstr "Incluir resenhas" -#: bookwyrm/templates/import/import.html:57 +#: bookwyrm/templates/import/import.html:60 msgid "Privacy setting for imported reviews:" msgstr "Configurações de privacidade para resenhas importadas:" -#: bookwyrm/templates/import/import.html:63 +#: bookwyrm/templates/import/import.html:66 #: bookwyrm/templates/preferences/layout.html:31 #: bookwyrm/templates/settings/federation/instance_blocklist.html:76 msgid "Import" msgstr "Importar" -#: bookwyrm/templates/import/import.html:68 +#: bookwyrm/templates/import/import.html:71 msgid "Recent Imports" msgstr "Importações recentes" -#: bookwyrm/templates/import/import.html:70 +#: bookwyrm/templates/import/import.html:73 msgid "No recent imports" msgstr "Nenhuma importação recente" @@ -5114,7 +5114,7 @@ msgstr "Arquivo excede o tamanho máximo: 10MB" msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/views/imports/import_data.py:67 +#: bookwyrm/views/imports/import_data.py:70 msgid "Not a valid csv file" msgstr "Não é um arquivo csv válido" diff --git a/locale/pt_PT/LC_MESSAGES/django.mo b/locale/pt_PT/LC_MESSAGES/django.mo index ad1072d56454e18c3a50ed80261ad52c471dcaa8..640fa53364f694b3920832f90c1245d5261bcb29 100644 GIT binary patch delta 23 fcmeymg!StZ)(ugoIgCsc3=FLd%r+;T7H$UscvcA; delta 23 fcmeymg!StZ)(ugoISkAcjEt>}%r_^U7H$Usc#a7o diff --git a/locale/pt_PT/LC_MESSAGES/django.po b/locale/pt_PT/LC_MESSAGES/django.po index 844605068..fa7c865aa 100644 --- a/locale/pt_PT/LC_MESSAGES/django.po +++ b/locale/pt_PT/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-04-08 21:00+0000\n" -"PO-Revision-Date: 2022-05-06 23:27\n" +"POT-Creation-Date: 2022-05-23 21:04+0000\n" +"PO-Revision-Date: 2022-05-24 01:06\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Portuguese\n" "Language: pt\n" @@ -121,25 +121,25 @@ msgstr "Perigo" msgid "Automatically generated report" msgstr "Relatório gerado automaticamente" -#: bookwyrm/models/base_model.py:17 bookwyrm/models/link.py:72 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/link.py:72 #: bookwyrm/templates/import/import_status.html:200 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" msgstr "Pendente" -#: bookwyrm/models/base_model.py:18 +#: bookwyrm/models/base_model.py:19 msgid "Self deletion" msgstr "Auto-exclusão" -#: bookwyrm/models/base_model.py:19 +#: bookwyrm/models/base_model.py:20 msgid "Moderator suspension" msgstr "Suspensão do moderador" -#: bookwyrm/models/base_model.py:20 +#: bookwyrm/models/base_model.py:21 msgid "Moderator deletion" msgstr "Exclusão do moderador" -#: bookwyrm/models/base_model.py:21 +#: bookwyrm/models/base_model.py:22 msgid "Domain block" msgstr "Bloqueio de domínio" @@ -734,7 +734,7 @@ msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:115 #: bookwyrm/templates/book/book.html:202 -#: bookwyrm/templates/book/edit/edit_book.html:127 +#: bookwyrm/templates/book/edit/edit_book.html:135 #: bookwyrm/templates/book/file_links/add_link_modal.html:60 #: bookwyrm/templates/book/file_links/edit_links.html:82 #: bookwyrm/templates/groups/form.html:32 @@ -757,8 +757,8 @@ msgstr "Salvar" #: bookwyrm/templates/author/sync_modal.html:23 #: bookwyrm/templates/book/book.html:203 #: bookwyrm/templates/book/cover_add_modal.html:33 -#: bookwyrm/templates/book/edit/edit_book.html:129 -#: bookwyrm/templates/book/edit/edit_book.html:132 +#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:140 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:25 #: bookwyrm/templates/book/sync_modal.html:23 @@ -780,7 +780,7 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Carregar os dados irá conectar a %(source_name)s e verificar se há metadados sobre este autor que não estão aqui presentes. Os metadados existentes não serão substituídos." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:114 +#: bookwyrm/templates/book/edit/edit_book.html:122 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/password_reset.html:42 @@ -949,42 +949,42 @@ msgstr "Editar \"%(book_title)s\"" msgid "Add Book" msgstr "Adicionar um Livro" -#: bookwyrm/templates/book/edit/edit_book.html:54 +#: bookwyrm/templates/book/edit/edit_book.html:62 msgid "Confirm Book Info" msgstr "Confirmar informações do livro" -#: bookwyrm/templates/book/edit/edit_book.html:62 +#: bookwyrm/templates/book/edit/edit_book.html:70 #, python-format msgid "Is \"%(name)s\" one of these authors?" msgstr "\"%(name)s\" é um destes autores?" -#: bookwyrm/templates/book/edit/edit_book.html:73 -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:81 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Author of " msgstr "Autor de " -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Find more information at isni.org" msgstr "Podes encontrar mais informações em isni.org" -#: bookwyrm/templates/book/edit/edit_book.html:85 +#: bookwyrm/templates/book/edit/edit_book.html:93 msgid "This is a new author" msgstr "Este é um novo autor" -#: bookwyrm/templates/book/edit/edit_book.html:92 +#: bookwyrm/templates/book/edit/edit_book.html:100 #, python-format msgid "Creating a new author: %(name)s" msgstr "Criar um novo autor: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:99 +#: bookwyrm/templates/book/edit/edit_book.html:107 msgid "Is this an edition of an existing work?" msgstr "Esta é uma edição de um trabalho existente?" -#: bookwyrm/templates/book/edit/edit_book.html:107 +#: bookwyrm/templates/book/edit/edit_book.html:115 msgid "This is a new work" msgstr "Este é um novo trabalho" -#: bookwyrm/templates/book/edit/edit_book.html:116 +#: bookwyrm/templates/book/edit/edit_book.html:124 #: bookwyrm/templates/feed/status.html:21 msgid "Back" msgstr "Voltar" @@ -1970,33 +1970,33 @@ msgstr "Importar livros" msgid "Data source:" msgstr "Origem dos dados:" -#: bookwyrm/templates/import/import.html:39 +#: bookwyrm/templates/import/import.html:42 msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." msgstr "Podes fazer download dos teus dados do Goodreads na Importar/Exportar página da tua conta do Goodreads." -#: bookwyrm/templates/import/import.html:44 +#: bookwyrm/templates/import/import.html:47 msgid "Data file:" msgstr "Ficheiro de dados:" -#: bookwyrm/templates/import/import.html:52 +#: bookwyrm/templates/import/import.html:55 msgid "Include reviews" msgstr "Incluir criticas" -#: bookwyrm/templates/import/import.html:57 +#: bookwyrm/templates/import/import.html:60 msgid "Privacy setting for imported reviews:" msgstr "Configuração de privacidade para criticas importadas:" -#: bookwyrm/templates/import/import.html:63 +#: bookwyrm/templates/import/import.html:66 #: bookwyrm/templates/preferences/layout.html:31 #: bookwyrm/templates/settings/federation/instance_blocklist.html:76 msgid "Import" msgstr "Importar" -#: bookwyrm/templates/import/import.html:68 +#: bookwyrm/templates/import/import.html:71 msgid "Recent Imports" msgstr "Importações recentes" -#: bookwyrm/templates/import/import.html:70 +#: bookwyrm/templates/import/import.html:73 msgid "No recent imports" msgstr "Nenhuma importação recente" @@ -5114,7 +5114,7 @@ msgstr "Ficheiro excede o tamanho máximo: 10MB" msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/views/imports/import_data.py:67 +#: bookwyrm/views/imports/import_data.py:70 msgid "Not a valid csv file" msgstr "Não é um ficheiro csv válido" diff --git a/locale/ro_RO/LC_MESSAGES/django.mo b/locale/ro_RO/LC_MESSAGES/django.mo index f64e15d56941a5d05dba5a360a979b9346f9db05..e9b278ecbb2e3d98a75cc249f521826394ea599b 100644 GIT binary patch delta 23 fcmezNnDyIZ)(!PHIgCsc3=FLd%r>{*%%1@Ohd~N% delta 23 fcmezNnDyIZ)(!PHISkDdj0~*|jW@U7%%1@OhgAx1 diff --git a/locale/ro_RO/LC_MESSAGES/django.po b/locale/ro_RO/LC_MESSAGES/django.po index 48fd49161..8d20397dd 100644 --- a/locale/ro_RO/LC_MESSAGES/django.po +++ b/locale/ro_RO/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-04-08 21:00+0000\n" -"PO-Revision-Date: 2022-05-16 21:13\n" +"POT-Creation-Date: 2022-05-23 21:04+0000\n" +"PO-Revision-Date: 2022-05-24 01:06\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Romanian\n" "Language: ro\n" @@ -121,25 +121,25 @@ msgstr "Pericol" msgid "Automatically generated report" msgstr "Raport generat automat" -#: bookwyrm/models/base_model.py:17 bookwyrm/models/link.py:72 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/link.py:72 #: bookwyrm/templates/import/import_status.html:200 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" msgstr "În așteptare" -#: bookwyrm/models/base_model.py:18 +#: bookwyrm/models/base_model.py:19 msgid "Self deletion" msgstr "Ștergere automată" -#: bookwyrm/models/base_model.py:19 +#: bookwyrm/models/base_model.py:20 msgid "Moderator suspension" msgstr "Suspendat de moderator" -#: bookwyrm/models/base_model.py:20 +#: bookwyrm/models/base_model.py:21 msgid "Moderator deletion" msgstr "Șters de moderator" -#: bookwyrm/models/base_model.py:21 +#: bookwyrm/models/base_model.py:22 msgid "Domain block" msgstr "Blocat de domeniu" @@ -738,7 +738,7 @@ msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:115 #: bookwyrm/templates/book/book.html:202 -#: bookwyrm/templates/book/edit/edit_book.html:127 +#: bookwyrm/templates/book/edit/edit_book.html:135 #: bookwyrm/templates/book/file_links/add_link_modal.html:60 #: bookwyrm/templates/book/file_links/edit_links.html:82 #: bookwyrm/templates/groups/form.html:32 @@ -761,8 +761,8 @@ msgstr "Salvați" #: bookwyrm/templates/author/sync_modal.html:23 #: bookwyrm/templates/book/book.html:203 #: bookwyrm/templates/book/cover_add_modal.html:33 -#: bookwyrm/templates/book/edit/edit_book.html:129 -#: bookwyrm/templates/book/edit/edit_book.html:132 +#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:140 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:25 #: bookwyrm/templates/book/sync_modal.html:23 @@ -784,7 +784,7 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Încărcatul de date se va conecta la %(source_name)s și verifica orice metadate despre autor care nu sunt prezente aici. Metadatele existente nu vor fi suprascrise." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:114 +#: bookwyrm/templates/book/edit/edit_book.html:122 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/password_reset.html:42 @@ -955,42 +955,42 @@ msgstr "Editați „%(book_title)s”" msgid "Add Book" msgstr "Adăugați carte" -#: bookwyrm/templates/book/edit/edit_book.html:54 +#: bookwyrm/templates/book/edit/edit_book.html:62 msgid "Confirm Book Info" msgstr "Confirmați informațiile cărții" -#: bookwyrm/templates/book/edit/edit_book.html:62 +#: bookwyrm/templates/book/edit/edit_book.html:70 #, python-format msgid "Is \"%(name)s\" one of these authors?" msgstr "Este „%(name)s” unul dintre acești autori?" -#: bookwyrm/templates/book/edit/edit_book.html:73 -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:81 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Author of " msgstr "Autor al " -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Find more information at isni.org" msgstr "Aflați mai multe la isni.org" -#: bookwyrm/templates/book/edit/edit_book.html:85 +#: bookwyrm/templates/book/edit/edit_book.html:93 msgid "This is a new author" msgstr "Acesta este un autor nou" -#: bookwyrm/templates/book/edit/edit_book.html:92 +#: bookwyrm/templates/book/edit/edit_book.html:100 #, python-format msgid "Creating a new author: %(name)s" msgstr "Creați un autor nou: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:99 +#: bookwyrm/templates/book/edit/edit_book.html:107 msgid "Is this an edition of an existing work?" msgstr "Este această o ediție a unei opere existente?" -#: bookwyrm/templates/book/edit/edit_book.html:107 +#: bookwyrm/templates/book/edit/edit_book.html:115 msgid "This is a new work" msgstr "Aceasta este o operă nouă" -#: bookwyrm/templates/book/edit/edit_book.html:116 +#: bookwyrm/templates/book/edit/edit_book.html:124 #: bookwyrm/templates/feed/status.html:21 msgid "Back" msgstr "Înapoi" @@ -1980,33 +1980,33 @@ msgstr "Importați cărți" msgid "Data source:" msgstr "Sursa de date:" -#: bookwyrm/templates/import/import.html:39 +#: bookwyrm/templates/import/import.html:42 msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." msgstr "Puteți descărca datele dvs. GoodReads de pe pagina Import/Export a contului dvs. GoodReads." -#: bookwyrm/templates/import/import.html:44 +#: bookwyrm/templates/import/import.html:47 msgid "Data file:" msgstr "Fișierul de date:" -#: bookwyrm/templates/import/import.html:52 +#: bookwyrm/templates/import/import.html:55 msgid "Include reviews" msgstr "Includeți recenzii" -#: bookwyrm/templates/import/import.html:57 +#: bookwyrm/templates/import/import.html:60 msgid "Privacy setting for imported reviews:" msgstr "Setare de confidențialitate pentru recenziile importate:" -#: bookwyrm/templates/import/import.html:63 +#: bookwyrm/templates/import/import.html:66 #: bookwyrm/templates/preferences/layout.html:31 #: bookwyrm/templates/settings/federation/instance_blocklist.html:76 msgid "Import" msgstr "Importați" -#: bookwyrm/templates/import/import.html:68 +#: bookwyrm/templates/import/import.html:71 msgid "Recent Imports" msgstr "Importuri recente" -#: bookwyrm/templates/import/import.html:70 +#: bookwyrm/templates/import/import.html:73 msgid "No recent imports" msgstr "Niciun import recent" @@ -5139,7 +5139,7 @@ msgstr "Fișierul depășește dimensiuneaz maximă: 10Mo" msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/views/imports/import_data.py:67 +#: bookwyrm/views/imports/import_data.py:70 msgid "Not a valid csv file" msgstr "Nu este un fișier csv valid" diff --git a/locale/sv_SE/LC_MESSAGES/django.mo b/locale/sv_SE/LC_MESSAGES/django.mo index 70fc627ef844b901dddf4a7d75e721719fa7cb70..0779ff8e38ab3604aaefede79a801676e6d7ed26 100644 GIT binary patch delta 25 hcmbPmiFLvy)(xCDxlDD9OcV?ZtqjaI3*Y?P4*+@034Z_p delta 25 hcmbPmiFLvy)(xCDxlD8oEEJ3ktxOFz3*Y?P4*+@Q34s6r diff --git a/locale/sv_SE/LC_MESSAGES/django.po b/locale/sv_SE/LC_MESSAGES/django.po index 0ff609298..880919874 100644 --- a/locale/sv_SE/LC_MESSAGES/django.po +++ b/locale/sv_SE/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-04-08 21:00+0000\n" -"PO-Revision-Date: 2022-04-08 21:50\n" +"POT-Creation-Date: 2022-05-23 21:04+0000\n" +"PO-Revision-Date: 2022-05-24 01:06\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Swedish\n" "Language: sv\n" @@ -121,25 +121,25 @@ msgstr "Observera" msgid "Automatically generated report" msgstr "Automatiskt genererad rapport" -#: bookwyrm/models/base_model.py:17 bookwyrm/models/link.py:72 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/link.py:72 #: bookwyrm/templates/import/import_status.html:200 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" msgstr "Pågående" -#: bookwyrm/models/base_model.py:18 +#: bookwyrm/models/base_model.py:19 msgid "Self deletion" msgstr "Självborttagning" -#: bookwyrm/models/base_model.py:19 +#: bookwyrm/models/base_model.py:20 msgid "Moderator suspension" msgstr "Moderator-avstängning" -#: bookwyrm/models/base_model.py:20 +#: bookwyrm/models/base_model.py:21 msgid "Moderator deletion" msgstr "Borttagning av moderator" -#: bookwyrm/models/base_model.py:21 +#: bookwyrm/models/base_model.py:22 msgid "Domain block" msgstr "Domänblockering" @@ -734,7 +734,7 @@ msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:115 #: bookwyrm/templates/book/book.html:202 -#: bookwyrm/templates/book/edit/edit_book.html:127 +#: bookwyrm/templates/book/edit/edit_book.html:135 #: bookwyrm/templates/book/file_links/add_link_modal.html:60 #: bookwyrm/templates/book/file_links/edit_links.html:82 #: bookwyrm/templates/groups/form.html:32 @@ -757,8 +757,8 @@ msgstr "Spara" #: bookwyrm/templates/author/sync_modal.html:23 #: bookwyrm/templates/book/book.html:203 #: bookwyrm/templates/book/cover_add_modal.html:33 -#: bookwyrm/templates/book/edit/edit_book.html:129 -#: bookwyrm/templates/book/edit/edit_book.html:132 +#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:140 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:25 #: bookwyrm/templates/book/sync_modal.html:23 @@ -780,7 +780,7 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Att ladda in data kommer att ansluta till %(source_name)s och kontrollera eventuella metadata om den här författaren som inte finns här. Befintliga metadata kommer inte att skrivas över." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:114 +#: bookwyrm/templates/book/edit/edit_book.html:122 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/password_reset.html:42 @@ -949,42 +949,42 @@ msgstr "Redigera \"%(book_title)s\"" msgid "Add Book" msgstr "Lägg till bok" -#: bookwyrm/templates/book/edit/edit_book.html:54 +#: bookwyrm/templates/book/edit/edit_book.html:62 msgid "Confirm Book Info" msgstr "Bekräfta bokens info" -#: bookwyrm/templates/book/edit/edit_book.html:62 +#: bookwyrm/templates/book/edit/edit_book.html:70 #, python-format msgid "Is \"%(name)s\" one of these authors?" msgstr "Är \"%(name)s\" en utav dessa författare?" -#: bookwyrm/templates/book/edit/edit_book.html:73 -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:81 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Author of " msgstr "Författare av " -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Find more information at isni.org" msgstr "Hitta mer information på isni.org" -#: bookwyrm/templates/book/edit/edit_book.html:85 +#: bookwyrm/templates/book/edit/edit_book.html:93 msgid "This is a new author" msgstr "Det här är en ny författare" -#: bookwyrm/templates/book/edit/edit_book.html:92 +#: bookwyrm/templates/book/edit/edit_book.html:100 #, python-format msgid "Creating a new author: %(name)s" msgstr "Skapar en ny författare: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:99 +#: bookwyrm/templates/book/edit/edit_book.html:107 msgid "Is this an edition of an existing work?" msgstr "Är det här en version av ett redan befintligt verk?" -#: bookwyrm/templates/book/edit/edit_book.html:107 +#: bookwyrm/templates/book/edit/edit_book.html:115 msgid "This is a new work" msgstr "Det här är ett nytt verk" -#: bookwyrm/templates/book/edit/edit_book.html:116 +#: bookwyrm/templates/book/edit/edit_book.html:124 #: bookwyrm/templates/feed/status.html:21 msgid "Back" msgstr "Bakåt" @@ -1970,33 +1970,33 @@ msgstr "Importera böcker" msgid "Data source:" msgstr "Datakälla:" -#: bookwyrm/templates/import/import.html:39 +#: bookwyrm/templates/import/import.html:42 msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." msgstr "Du kan ladda ner Goodreads-data från Import/Export-sidan på ditt Goodreads-konto." -#: bookwyrm/templates/import/import.html:44 +#: bookwyrm/templates/import/import.html:47 msgid "Data file:" msgstr "Datafil:" -#: bookwyrm/templates/import/import.html:52 +#: bookwyrm/templates/import/import.html:55 msgid "Include reviews" msgstr "Inkludera recensioner" -#: bookwyrm/templates/import/import.html:57 +#: bookwyrm/templates/import/import.html:60 msgid "Privacy setting for imported reviews:" msgstr "Integritetsinställning för importerade recensioner:" -#: bookwyrm/templates/import/import.html:63 +#: bookwyrm/templates/import/import.html:66 #: bookwyrm/templates/preferences/layout.html:31 #: bookwyrm/templates/settings/federation/instance_blocklist.html:76 msgid "Import" msgstr "Importera" -#: bookwyrm/templates/import/import.html:68 +#: bookwyrm/templates/import/import.html:71 msgid "Recent Imports" msgstr "Senaste importer" -#: bookwyrm/templates/import/import.html:70 +#: bookwyrm/templates/import/import.html:73 msgid "No recent imports" msgstr "Ingen importering nyligen" @@ -5114,7 +5114,7 @@ msgstr "Filen överskrider maximal storlek: 10 MB" msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/views/imports/import_data.py:67 +#: bookwyrm/views/imports/import_data.py:70 msgid "Not a valid csv file" msgstr "Inte en giltig csv-fil" diff --git a/locale/zh_Hans/LC_MESSAGES/django.mo b/locale/zh_Hans/LC_MESSAGES/django.mo index 1d1227f8092b70c68bb692fb532759090142aa83..4c2a6c1f556905de752d63e136b4b7d802a1c56c 100644 GIT binary patch literal 86950 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ÆKCw;n~*y z7t1@KeR_y`NQ9%LM^G*Y?SBQ;$*_YLv5s?~DS&jRK^YJ>)DG@bgLV@kt7L$Tp)fqz z4O$@jv}@JVuGyge1ZXh= zXSPC88z_#ZS^?RH0qJFdSI&c?8%YZew}37?fVPn^@5+7(b|J_GNCtuS z3xTHsK|ut{A+SX^kUlBIf#4z%es`?`=ok=iUjkA86fmXV8gNEK9K7tGsfN~XRWC(Uu1Vj$h>hUlpG3ZULnw@bU;)83kVaN3ehbW#Tz2AXyYLYY28dY}6A{*g=8}GLHm4 z?tK=hY=exGLC#MFC51VlOHEK_BwK2WZDPhBGBeLaCL)xtQ=&36Ex-u>)Aph3OXb{VIpWh33!edGH#7UDWnbs9ptcS zA*koMza3--=oGs>EwGaY8bRI#^;^I@_OLA&1nB{VLH~3}M+b)*v|%5}sk7jk9&{=q zifpoR~zrb2@P;upwJ3@8zSLJZs_gN!OewjaXh1VJNN>zYB;ETod_X?@nc1~Ntm zD!!)8c{Xg1B0dt&|p#%%+=uR3F@6dyaZhV2jL*=1*w0!ekZmjGsIZXA`*x;=vo)Z(Knz| z1Hh+sK{601D#6yRz~Dg#L@ET|fsHT%%!RB;1EomN!QfAJ^g&Z0Xk86x1sArfv7hYih3r9wE;)g= zo4_}IfyRW;q87By1u~Ea-fiAL5j5)u86*M~aNwh}kux&JZ4{uR`oZVJgTnxM3J^4~ z2}vg)A0Ui}1Of$yLedMB4TU5iQVoUl0KvK-d(c1&HbK4oU2Vu71cwbGazR|s;9a5} zcID8!sSz5W0*Leg3R~hVfG+=rY!3j%HmLMNEPCC(39{1_G<*SC_SrE3dPW5#9};H= zXeHWQQ0EOS6@C3-W5cfdWH9<;5PzeHQ4?&VDxVQj!Wk5wEm;u@|0-5vy9aal2 z6G*${SOL;#gS3dAw(kND`%T#iE&~vm7knNV(%NVUA2qrlySvHP4;rmnzJYxGki)nj zXSai68(buUnya%~Af6;GWEdcAY0FS46JGiyk00&!6ba%9ED zC5a`a#c<__qycd?qK3fZQ}7HcsHlPrfSt>fLPjw`cT$7a fT}|B&THkHCPE8uoE!f&buog@VSLZ{3E delta 19367 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 diff --git a/locale/zh_Hans/LC_MESSAGES/django.po b/locale/zh_Hans/LC_MESSAGES/django.po index b1b37dc3d..8bd28ceab 100644 --- a/locale/zh_Hans/LC_MESSAGES/django.po +++ b/locale/zh_Hans/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-04-08 21:00+0000\n" -"PO-Revision-Date: 2022-04-29 14:20\n" +"POT-Creation-Date: 2022-05-23 21:04+0000\n" +"PO-Revision-Date: 2022-05-24 01:06\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Chinese Simplified\n" "Language: zh\n" @@ -121,25 +121,25 @@ msgstr "危险" msgid "Automatically generated report" msgstr "自动生成的举报" -#: bookwyrm/models/base_model.py:17 bookwyrm/models/link.py:72 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/link.py:72 #: bookwyrm/templates/import/import_status.html:200 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" msgstr "待处理" -#: bookwyrm/models/base_model.py:18 +#: bookwyrm/models/base_model.py:19 msgid "Self deletion" msgstr "自我删除" -#: bookwyrm/models/base_model.py:19 +#: bookwyrm/models/base_model.py:20 msgid "Moderator suspension" msgstr "仲裁员停用" -#: bookwyrm/models/base_model.py:20 +#: bookwyrm/models/base_model.py:21 msgid "Moderator deletion" msgstr "仲裁员删除" -#: bookwyrm/models/base_model.py:21 +#: bookwyrm/models/base_model.py:22 msgid "Domain block" msgstr "域名屏蔽" @@ -730,7 +730,7 @@ msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:115 #: bookwyrm/templates/book/book.html:202 -#: bookwyrm/templates/book/edit/edit_book.html:127 +#: bookwyrm/templates/book/edit/edit_book.html:135 #: bookwyrm/templates/book/file_links/add_link_modal.html:60 #: bookwyrm/templates/book/file_links/edit_links.html:82 #: bookwyrm/templates/groups/form.html:32 @@ -753,8 +753,8 @@ msgstr "保存" #: bookwyrm/templates/author/sync_modal.html:23 #: bookwyrm/templates/book/book.html:203 #: bookwyrm/templates/book/cover_add_modal.html:33 -#: bookwyrm/templates/book/edit/edit_book.html:129 -#: bookwyrm/templates/book/edit/edit_book.html:132 +#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:140 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:25 #: bookwyrm/templates/book/sync_modal.html:23 @@ -776,7 +776,7 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "加载数据会连接到 %(source_name)s 并检查这里还没有记录的与作者相关的元数据。现存的元数据不会被覆盖。" #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:114 +#: bookwyrm/templates/book/edit/edit_book.html:122 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/password_reset.html:42 @@ -943,42 +943,42 @@ msgstr "编辑《%(book_title)s》" msgid "Add Book" msgstr "添加书目" -#: bookwyrm/templates/book/edit/edit_book.html:54 +#: bookwyrm/templates/book/edit/edit_book.html:62 msgid "Confirm Book Info" msgstr "确认书目信息" -#: bookwyrm/templates/book/edit/edit_book.html:62 +#: bookwyrm/templates/book/edit/edit_book.html:70 #, python-format msgid "Is \"%(name)s\" one of these authors?" msgstr "“%(name)s” 是这些作者之一吗?" -#: bookwyrm/templates/book/edit/edit_book.html:73 -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:81 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Author of " msgstr "所著书有 " -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Find more information at isni.org" msgstr "在 isni.org 查找更多信息" -#: bookwyrm/templates/book/edit/edit_book.html:85 +#: bookwyrm/templates/book/edit/edit_book.html:93 msgid "This is a new author" msgstr "这是一位新的作者" -#: bookwyrm/templates/book/edit/edit_book.html:92 +#: bookwyrm/templates/book/edit/edit_book.html:100 #, python-format msgid "Creating a new author: %(name)s" msgstr "正在创建新的作者: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:99 +#: bookwyrm/templates/book/edit/edit_book.html:107 msgid "Is this an edition of an existing work?" msgstr "这是已存在的作品的一个版本吗?" -#: bookwyrm/templates/book/edit/edit_book.html:107 +#: bookwyrm/templates/book/edit/edit_book.html:115 msgid "This is a new work" msgstr "这是一个新的作品。" -#: bookwyrm/templates/book/edit/edit_book.html:116 +#: bookwyrm/templates/book/edit/edit_book.html:124 #: bookwyrm/templates/feed/status.html:21 msgid "Back" msgstr "返回" @@ -1960,33 +1960,33 @@ msgstr "导入书目" msgid "Data source:" msgstr "数据来源:" -#: bookwyrm/templates/import/import.html:39 +#: bookwyrm/templates/import/import.html:42 msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." msgstr "您可以从 Import/Export page 下载或导出您的 Goodread 数据。" -#: bookwyrm/templates/import/import.html:44 +#: bookwyrm/templates/import/import.html:47 msgid "Data file:" msgstr "数据文件:" -#: bookwyrm/templates/import/import.html:52 +#: bookwyrm/templates/import/import.html:55 msgid "Include reviews" msgstr "纳入书评" -#: bookwyrm/templates/import/import.html:57 +#: bookwyrm/templates/import/import.html:60 msgid "Privacy setting for imported reviews:" msgstr "导入书评的隐私设定" -#: bookwyrm/templates/import/import.html:63 +#: bookwyrm/templates/import/import.html:66 #: bookwyrm/templates/preferences/layout.html:31 #: bookwyrm/templates/settings/federation/instance_blocklist.html:76 msgid "Import" msgstr "导入" -#: bookwyrm/templates/import/import.html:68 +#: bookwyrm/templates/import/import.html:71 msgid "Recent Imports" msgstr "最近的导入" -#: bookwyrm/templates/import/import.html:70 +#: bookwyrm/templates/import/import.html:73 msgid "No recent imports" msgstr "无最近的导入" @@ -5089,7 +5089,7 @@ msgstr "文件超过了最大大小: 10MB" msgid "%(title)s: %(subtitle)s" msgstr "%(title)s:%(subtitle)s" -#: bookwyrm/views/imports/import_data.py:67 +#: bookwyrm/views/imports/import_data.py:70 msgid "Not a valid csv file" msgstr "不是有效的 csv 文件" diff --git a/locale/zh_Hant/LC_MESSAGES/django.mo b/locale/zh_Hant/LC_MESSAGES/django.mo index f9ca27be9b891b3b13c30e68d084e0cd54184a43..20be041a8670213f5d046504898a50751bba77e8 100644 GIT binary patch delta 13136 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 XpO}_5*=~BJ)bkAs;fWU|B{Kj3bV~>t delta 15265 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 diff --git a/locale/zh_Hant/LC_MESSAGES/django.po b/locale/zh_Hant/LC_MESSAGES/django.po index 4d4f155d6..14ad19a24 100644 --- a/locale/zh_Hant/LC_MESSAGES/django.po +++ b/locale/zh_Hant/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-04-08 21:00+0000\n" -"PO-Revision-Date: 2022-04-08 21:50\n" +"POT-Creation-Date: 2022-05-23 21:04+0000\n" +"PO-Revision-Date: 2022-05-24 01:06\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Chinese Traditional\n" "Language: zh\n" @@ -121,25 +121,25 @@ msgstr "" msgid "Automatically generated report" msgstr "" -#: bookwyrm/models/base_model.py:17 bookwyrm/models/link.py:72 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/link.py:72 #: bookwyrm/templates/import/import_status.html:200 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" msgstr "" -#: bookwyrm/models/base_model.py:18 +#: bookwyrm/models/base_model.py:19 msgid "Self deletion" msgstr "" -#: bookwyrm/models/base_model.py:19 +#: bookwyrm/models/base_model.py:20 msgid "Moderator suspension" msgstr "" -#: bookwyrm/models/base_model.py:20 +#: bookwyrm/models/base_model.py:21 msgid "Moderator deletion" msgstr "" -#: bookwyrm/models/base_model.py:21 +#: bookwyrm/models/base_model.py:22 msgid "Domain block" msgstr "" @@ -730,7 +730,7 @@ msgstr "" #: bookwyrm/templates/author/edit_author.html:115 #: bookwyrm/templates/book/book.html:202 -#: bookwyrm/templates/book/edit/edit_book.html:127 +#: bookwyrm/templates/book/edit/edit_book.html:135 #: bookwyrm/templates/book/file_links/add_link_modal.html:60 #: bookwyrm/templates/book/file_links/edit_links.html:82 #: bookwyrm/templates/groups/form.html:32 @@ -753,8 +753,8 @@ msgstr "儲存" #: bookwyrm/templates/author/sync_modal.html:23 #: bookwyrm/templates/book/book.html:203 #: bookwyrm/templates/book/cover_add_modal.html:33 -#: bookwyrm/templates/book/edit/edit_book.html:129 -#: bookwyrm/templates/book/edit/edit_book.html:132 +#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:140 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:25 #: bookwyrm/templates/book/sync_modal.html:23 @@ -776,7 +776,7 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "" #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:114 +#: bookwyrm/templates/book/edit/edit_book.html:122 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/password_reset.html:42 @@ -943,42 +943,42 @@ msgstr "編輯 \"%(book_title)s\"" msgid "Add Book" msgstr "新增書目" -#: bookwyrm/templates/book/edit/edit_book.html:54 +#: bookwyrm/templates/book/edit/edit_book.html:62 msgid "Confirm Book Info" msgstr "確認書目資料" -#: bookwyrm/templates/book/edit/edit_book.html:62 +#: bookwyrm/templates/book/edit/edit_book.html:70 #, python-format msgid "Is \"%(name)s\" one of these authors?" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:73 -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:81 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Author of " msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:75 +#: bookwyrm/templates/book/edit/edit_book.html:83 msgid "Find more information at isni.org" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:85 +#: bookwyrm/templates/book/edit/edit_book.html:93 msgid "This is a new author" msgstr "這是一位新的作者" -#: bookwyrm/templates/book/edit/edit_book.html:92 +#: bookwyrm/templates/book/edit/edit_book.html:100 #, python-format msgid "Creating a new author: %(name)s" msgstr "正在建立新的作者: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:99 +#: bookwyrm/templates/book/edit/edit_book.html:107 msgid "Is this an edition of an existing work?" msgstr "這是已存在的作品的另一個版本嗎?" -#: bookwyrm/templates/book/edit/edit_book.html:107 +#: bookwyrm/templates/book/edit/edit_book.html:115 msgid "This is a new work" msgstr "這是一個新的作品。" -#: bookwyrm/templates/book/edit/edit_book.html:116 +#: bookwyrm/templates/book/edit/edit_book.html:124 #: bookwyrm/templates/feed/status.html:21 msgid "Back" msgstr "返回" @@ -1960,33 +1960,33 @@ msgstr "匯入書目" msgid "Data source:" msgstr "資料來源:" -#: bookwyrm/templates/import/import.html:39 +#: bookwyrm/templates/import/import.html:42 msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." msgstr "" -#: bookwyrm/templates/import/import.html:44 +#: bookwyrm/templates/import/import.html:47 msgid "Data file:" msgstr "資料檔案:" -#: bookwyrm/templates/import/import.html:52 +#: bookwyrm/templates/import/import.html:55 msgid "Include reviews" msgstr "納入書評" -#: bookwyrm/templates/import/import.html:57 +#: bookwyrm/templates/import/import.html:60 msgid "Privacy setting for imported reviews:" msgstr "匯入書評的隱私設定" -#: bookwyrm/templates/import/import.html:63 +#: bookwyrm/templates/import/import.html:66 #: bookwyrm/templates/preferences/layout.html:31 #: bookwyrm/templates/settings/federation/instance_blocklist.html:76 msgid "Import" msgstr "匯入" -#: bookwyrm/templates/import/import.html:68 +#: bookwyrm/templates/import/import.html:71 msgid "Recent Imports" msgstr "最近的匯入" -#: bookwyrm/templates/import/import.html:70 +#: bookwyrm/templates/import/import.html:73 msgid "No recent imports" msgstr "無最近的匯入" @@ -5087,7 +5087,7 @@ msgstr "檔案超過了最大大小: 10MB" msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/views/imports/import_data.py:67 +#: bookwyrm/views/imports/import_data.py:70 msgid "Not a valid csv file" msgstr "不是有效的 csv 檔案" From 6d6ab9a53193b20ba3f2e6d8691fc50f287616d0 Mon Sep 17 00:00:00 2001 From: Joel Bradshaw Date: Sun, 5 Jun 2022 14:38:03 -0700 Subject: [PATCH 19/21] Add .pylintrc with fixes for new pylint version --- .pylintrc | 6 ++++++ bookwyrm/tests/connectors/test_openlibrary_connector.py | 2 +- bookwyrm/tests/models/test_import_model.py | 2 +- bookwyrm/tests/views/test_status.py | 4 ++-- 4 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 .pylintrc diff --git a/.pylintrc b/.pylintrc new file mode 100644 index 000000000..7f92d0168 --- /dev/null +++ b/.pylintrc @@ -0,0 +1,6 @@ +[MAIN] +ignore=migrations +load-plugins=pylint.extensions.no_self_use + +[MESSAGES CONTROL] +disable=E1101,E1135,E1136,R0903,R0901,R0902,W0707,W0511,W0406,R0401,R0801,C3001 diff --git a/bookwyrm/tests/connectors/test_openlibrary_connector.py b/bookwyrm/tests/connectors/test_openlibrary_connector.py index c05eb1a94..8f81b2073 100644 --- a/bookwyrm/tests/connectors/test_openlibrary_connector.py +++ b/bookwyrm/tests/connectors/test_openlibrary_connector.py @@ -229,7 +229,7 @@ class Openlibrary(TestCase): status=200, ) with patch( - "bookwyrm.connectors.openlibrary.Connector." "get_authors_from_data" + "bookwyrm.connectors.openlibrary.Connector.get_authors_from_data" ) as mock: mock.return_value = [] result = self.connector.create_edition_from_data(work, self.edition_data) diff --git a/bookwyrm/tests/models/test_import_model.py b/bookwyrm/tests/models/test_import_model.py index 7cecfe416..d1ff209f4 100644 --- a/bookwyrm/tests/models/test_import_model.py +++ b/bookwyrm/tests/models/test_import_model.py @@ -195,7 +195,7 @@ class ImportJob(TestCase): ) as search: search.return_value = result with patch( - "bookwyrm.connectors.openlibrary.Connector." "get_authors_from_data" + "bookwyrm.connectors.openlibrary.Connector.get_authors_from_data" ): book = item.get_book_from_identifier() diff --git a/bookwyrm/tests/views/test_status.py b/bookwyrm/tests/views/test_status.py index 355071573..0026c52b5 100644 --- a/bookwyrm/tests/views/test_status.py +++ b/bookwyrm/tests/views/test_status.py @@ -281,7 +281,7 @@ http://www.fish.com/""" result = views.status.to_markdown(text) self.assertEqual( result, - '

hi and fish.com ' "is rad

", + '

hi and fish.com is rad

', ) def test_to_markdown_detect_url(self, *_): @@ -297,7 +297,7 @@ http://www.fish.com/""" """this is mostly handled in other places, but nonetheless""" text = "[hi](http://fish.com) is rad" result = views.status.to_markdown(text) - self.assertEqual(result, '

hi ' "is rad

") + self.assertEqual(result, '

hi is rad

') def test_delete_status(self, mock, *_): """marks a status as deleted""" From b3603c04c54d67eb9e8d81737fc940c476d0101b Mon Sep 17 00:00:00 2001 From: Joel Bradshaw Date: Sun, 5 Jun 2022 14:49:21 -0700 Subject: [PATCH 20/21] Add pylint to bw-dev Because pylint requires the app to be fully parseable with all its dependencies, we run it in the web container, and add pylint as a dev dependency. --- Dockerfile | 6 +++++- bw-dev | 5 +++++ requirements.dev.txt | 7 +++++++ requirements.txt | 8 -------- 4 files changed, 17 insertions(+), 9 deletions(-) create mode 100644 requirements.dev.txt diff --git a/Dockerfile b/Dockerfile index 349dd82b1..99a25768b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,6 +6,10 @@ RUN mkdir /app /app/static /app/images WORKDIR /app +RUN apt-get update && apt-get install -y gettext libgettextpo-dev tidy && apt-get clean + COPY requirements.txt /app/ RUN pip install -r requirements.txt --no-cache-dir -RUN apt-get update && apt-get install -y gettext libgettextpo-dev tidy && apt-get clean + +COPY requirements.dev.txt /app/ +RUN pip install -r requirements.dev.txt --no-cache-dir diff --git a/bw-dev b/bw-dev index 058f2639b..4dd543c0a 100755 --- a/bw-dev +++ b/bw-dev @@ -140,6 +140,10 @@ case "$CMD" in black) docker-compose run --rm dev-tools black celerywyrm bookwyrm ;; + pylint) + # pylint depends on having the app dependencies in place, so we run it in the web container + runweb pylint bookwyrm/ + ;; prettier) docker-compose run --rm dev-tools npx prettier --write bookwyrm/static/js/*.js ;; @@ -149,6 +153,7 @@ case "$CMD" in --config dev-tools/.stylelintrc.js ;; formatters) + runweb pylint bookwyrm/ docker-compose run --rm dev-tools black celerywyrm bookwyrm docker-compose run --rm dev-tools npx prettier --write bookwyrm/static/js/*.js docker-compose run --rm dev-tools npx stylelint \ diff --git a/requirements.dev.txt b/requirements.dev.txt new file mode 100644 index 000000000..d731ca92e --- /dev/null +++ b/requirements.dev.txt @@ -0,0 +1,7 @@ +pytest-django==4.1.0 +pytest==6.1.2 +pytest-cov==2.10.1 +pytest-env==0.6.2 +pytest-xdist==2.3.0 +pytidylib==0.3.2 +pylint==2.14.0 diff --git a/requirements.txt b/requirements.txt index 7614dc421..f1ece86db 100644 --- a/requirements.txt +++ b/requirements.txt @@ -26,11 +26,3 @@ opentelemetry-sdk==1.8.0 opentelemetry-exporter-otlp-proto-grpc==1.8.0 opentelemetry-instrumentation-django==0.27b0 opentelemetry-instrumentation-celery==0.27b0 - -# Dev -pytest-django==4.1.0 -pytest==6.1.2 -pytest-cov==2.10.1 -pytest-env==0.6.2 -pytest-xdist==2.3.0 -pytidylib==0.3.2 From 6584cb640453c8de5a6849e19e25756c263dcd73 Mon Sep 17 00:00:00 2001 From: Joel Bradshaw Date: Sun, 5 Jun 2022 14:56:47 -0700 Subject: [PATCH 21/21] Go back to one requirements.txt, simplify workflow The workflow can now use .pylintrc and the pylint req in requirements.txt rather than having the options inline and installing it separately --- .github/workflows/pylint.yml | 3 +-- Dockerfile | 3 --- requirements.dev.txt | 7 ------- requirements.txt | 9 +++++++++ 4 files changed, 10 insertions(+), 12 deletions(-) delete mode 100644 requirements.dev.txt diff --git a/.github/workflows/pylint.yml b/.github/workflows/pylint.yml index 08661e9c2..a3117f7cb 100644 --- a/.github/workflows/pylint.yml +++ b/.github/workflows/pylint.yml @@ -21,8 +21,7 @@ jobs: run: | python -m pip install --upgrade pip pip install -r requirements.txt - pip install pylint - name: Analysing the code with pylint run: | - pylint bookwyrm/ --ignore=migrations --disable=E1101,E1135,E1136,R0903,R0901,R0902,W0707,W0511,W0406,R0401,R0801 + pylint bookwyrm/ diff --git a/Dockerfile b/Dockerfile index 99a25768b..b3cd26e88 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,6 +10,3 @@ RUN apt-get update && apt-get install -y gettext libgettextpo-dev tidy && apt-ge COPY requirements.txt /app/ RUN pip install -r requirements.txt --no-cache-dir - -COPY requirements.dev.txt /app/ -RUN pip install -r requirements.dev.txt --no-cache-dir diff --git a/requirements.dev.txt b/requirements.dev.txt deleted file mode 100644 index d731ca92e..000000000 --- a/requirements.dev.txt +++ /dev/null @@ -1,7 +0,0 @@ -pytest-django==4.1.0 -pytest==6.1.2 -pytest-cov==2.10.1 -pytest-env==0.6.2 -pytest-xdist==2.3.0 -pytidylib==0.3.2 -pylint==2.14.0 diff --git a/requirements.txt b/requirements.txt index f1ece86db..96d98707c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -26,3 +26,12 @@ opentelemetry-sdk==1.8.0 opentelemetry-exporter-otlp-proto-grpc==1.8.0 opentelemetry-instrumentation-django==0.27b0 opentelemetry-instrumentation-celery==0.27b0 + +# Dev +pytest-django==4.1.0 +pytest==6.1.2 +pytest-cov==2.10.1 +pytest-env==0.6.2 +pytest-xdist==2.3.0 +pytidylib==0.3.2 +pylint==2.14.0