Compare commits

..

1 commit

Author SHA1 Message Date
Mouse Reeve 6a68f07b0b
Revert "Stopped shelf" 2022-05-26 10:12:06 -07:00
88 changed files with 870 additions and 1091 deletions

View file

@ -21,7 +21,8 @@ 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/
pylint bookwyrm/ --ignore=migrations --disable=E1101,E1135,E1136,R0903,R0901,R0902,W0707,W0511,W0406,R0401,R0801

View file

@ -1,6 +0,0 @@
[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

View file

@ -6,7 +6,6 @@ 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

View file

@ -1,7 +1,6 @@
""" basics for an activitypub serializer """
from dataclasses import dataclass, fields, MISSING
from json import JSONEncoder
import logging
from django.apps import apps
from django.db import IntegrityError, transaction
@ -9,8 +8,6 @@ from django.db import IntegrityError, transaction
from bookwyrm.connectors import ConnectorException, get_data
from bookwyrm.tasks import app
logger = logging.getLogger(__name__)
class ActivitySerializerError(ValueError):
"""routine problems serializing activitypub json"""
@ -68,7 +65,7 @@ class ActivityObject:
try:
value = kwargs[field.name]
if value in (None, MISSING, {}):
raise KeyError("Missing required field", field.name)
raise KeyError()
try:
is_subclass = issubclass(field.type, ActivityObject)
except TypeError:
@ -271,9 +268,9 @@ def resolve_remote_id(
try:
data = get_data(remote_id)
except ConnectorException:
logger.exception("Could not connect to host for remote_id: %s", remote_id)
return None
raise ActivitySerializerError(
f"Could not connect to host for remote_id: {remote_id}"
)
# determine the model implicitly, if not provided
# or if it's a model with subclasses like Status, check again
if not model or hasattr(model.objects, "select_subclasses"):

View file

@ -148,8 +148,8 @@ class SearchResult:
def __repr__(self):
# pylint: disable=consider-using-f-string
return "<SearchResult key={!r} title={!r} author={!r} confidence={!r}>".format(
self.key, self.title, self.author, self.confidence
return "<SearchResult key={!r} title={!r} author={!r}>".format(
self.key, self.title, self.author
)
def json(self):

View file

@ -1,8 +1,9 @@
""" functionality outline for a book data connector """
from abc import ABC, abstractmethod
import imghdr
import ipaddress
import logging
import re
from urllib.parse import urlparse
from django.core.files.base import ContentFile
from django.db import transaction
@ -10,7 +11,7 @@ import requests
from requests.exceptions import RequestException
from bookwyrm import activitypub, models, settings
from .connector_manager import load_more_data, ConnectorException, raise_not_valid_url
from .connector_manager import load_more_data, ConnectorException
from .format_mappings import format_mappings
@ -38,34 +39,62 @@ 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
if maybe_isbn(query) and self.isbn_search_url and self.isbn_search_url != "":
return f"{self.isbn_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
# 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}"
data = self.get_search_data(
f"{self.search_url}{query}",
params=params,
timeout=timeout,
)
results = []
def process_search_response(self, query, data, min_confidence):
"""Format the search results based on the formt of the query"""
if maybe_isbn(query):
return list(self.parse_isbn_search_data(data))[:10]
return list(self.parse_search_data(data, min_confidence))[:10]
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)
@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, min_confidence):
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"""
@ -225,6 +254,9 @@ 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,
@ -279,6 +311,20 @@ 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"""
@ -320,9 +366,3 @@ 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

View file

@ -10,12 +10,15 @@ 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, min_confidence):
for search_result in data:
search_result["connector"] = self
yield SearchResult(**search_result)
def parse_search_data(self, data):
return data
def format_search_result(self, search_result):
search_result["connector"] = self
return SearchResult(**search_result)
def parse_isbn_search_data(self, data):
for search_result in data:
search_result["connector"] = self
yield SearchResult(**search_result)
return data
def format_isbn_search_result(self, search_result):
return self.format_search_result(search_result)

View file

@ -1,18 +1,17 @@
""" interface with whatever connectors the app has """
import asyncio
from datetime import datetime
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
from requests import HTTPError
from bookwyrm import book_search, models
from bookwyrm.settings import SEARCH_TIMEOUT, USER_AGENT
from bookwyrm.settings import SEARCH_TIMEOUT
from bookwyrm.tasks import app
logger = logging.getLogger(__name__)
@ -22,85 +21,53 @@ class ConnectorException(HTTPError):
"""when the connector can't do what was asked"""
async def get_results(session, url, min_confidence, query, connector):
"""try this specific connector"""
# 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,
}
params = {"min_confidence": min_confidence}
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
return {
"connector": connector,
"results": connector.process_search_response(
query, raw_data, min_confidence
),
}
except asyncio.TimeoutError:
logger.info("Connection timed out for url: %s", url)
except aiohttp.ClientError as err:
logger.exception(err)
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:
tasks = []
for url, connector in items:
tasks.append(
asyncio.ensure_future(
get_results(session, url, min_confidence, query, connector)
)
)
results = await asyncio.gather(*tasks)
return results
def search(query, min_confidence=0.1, return_first=False):
"""find books based on arbitary keywords"""
if not query:
return []
results = []
items = []
for connector in get_connectors():
# get the search url from the connector before sending
url = connector.get_search_url(query)
try:
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))
# Have we got a ISBN ?
isbn = re.sub(r"[\W_]", "", query)
maybe_isbn = len(isbn) in [10, 13] # ISBN10 or ISBN13
# 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]
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
# 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
if return_first:
# 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] if all_results else None
return None
# failed requests will return None, so filter those out
return results
@ -166,20 +133,3 @@ 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}")

View file

@ -77,42 +77,53 @@ class Connector(AbstractConnector):
**{k: data.get(k) for k in ["uri", "image", "labels", "sitelinks", "type"]},
}
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")),
author=search_result.get("description"),
view_link=f"{self.base_url}/entity/{search_result.get('uri')}",
cover=cover,
confidence=confidence,
connector=self,
)
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")
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,
)
def parse_isbn_search_data(self, data):
"""got some daaaata"""
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:
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,
)
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,
)
def is_work_data(self, data):
return data.get("type") == "work"

View file

@ -152,41 +152,39 @@ 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, min_confidence):
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
def parse_search_data(self, data):
return data.get("docs")
# 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,
author=", ".join(author),
connector=self,
year=search_result.get("first_publish_year"),
cover=cover,
confidence=confidence,
)
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,
)
def parse_isbn_search_data(self, data):
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"),
)
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"),
)
def load_edition_data(self, olkey):
"""query openlibrary for editions of a work"""

View file

@ -53,12 +53,7 @@ class ReadThroughForm(CustomForm):
self.add_error(
"finish_date", _("Reading finish date cannot be before start date.")
)
stopped_date = cleaned_data.get("stopped_date")
if start_date and stopped_date and start_date > stopped_date:
self.add_error(
"stopped_date", _("Reading stopped date cannot be before start date.")
)
class Meta:
model = models.ReadThrough
fields = ["user", "book", "start_date", "finish_date", "stopped_date"]
fields = ["user", "book", "start_date", "finish_date"]

View file

@ -56,17 +56,12 @@ class Command(BaseCommand):
self.stdout.write(" OK 🖼")
# Books
book_ids = (
models.Book.objects.select_subclasses()
.filter()
.values_list("id", flat=True)
)
books = models.Book.objects.select_subclasses().filter()
self.stdout.write(
" → Book preview images ({}): ".format(len(book_ids)), ending=""
" → Book preview images ({}): ".format(len(books)), ending=""
)
for book_id in book_ids:
preview_images.generate_edition_preview_image_task.delay(book_id)
for book in books:
preview_images.generate_edition_preview_image_task.delay(book.id)
self.stdout.write(".", ending="")
self.stdout.write(" OK 🖼")

View file

@ -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=1,
priority=3,
)
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=1,
priority=3,
)

View file

@ -1,80 +0,0 @@
# Generated by Django 3.2.12 on 2022-03-16 23:20
import bookwyrm.models.fields
from django.db import migrations
from bookwyrm.models import Shelf
def add_shelves(apps, schema_editor):
"""add any superusers to the "admin" group"""
db_alias = schema_editor.connection.alias
shelf_model = apps.get_model("bookwyrm", "Shelf")
users = apps.get_model("bookwyrm", "User")
local_users = users.objects.using(db_alias).filter(local=True)
for user in local_users:
remote_id = f"{user.remote_id}/books/stopped"
shelf_model.objects.using(db_alias).create(
name="Stopped reading",
identifier=Shelf.STOPPED_READING,
user=user,
editable=False,
remote_id=remote_id,
)
class Migration(migrations.Migration):
dependencies = [
("bookwyrm", "0145_sitesettings_version"),
]
operations = [
migrations.AlterField(
model_name="comment",
name="reading_status",
field=bookwyrm.models.fields.CharField(
blank=True,
choices=[
("to-read", "To-Read"),
("reading", "Reading"),
("read", "Read"),
("stopped-reading", "Stopped-Reading"),
],
max_length=255,
null=True,
),
),
migrations.AlterField(
model_name="quotation",
name="reading_status",
field=bookwyrm.models.fields.CharField(
blank=True,
choices=[
("to-read", "To-Read"),
("reading", "Reading"),
("read", "Read"),
("stopped-reading", "Stopped-Reading"),
],
max_length=255,
null=True,
),
),
migrations.AlterField(
model_name="review",
name="reading_status",
field=bookwyrm.models.fields.CharField(
blank=True,
choices=[
("to-read", "To-Read"),
("reading", "Reading"),
("read", "Read"),
("stopped-reading", "Stopped-Reading"),
],
max_length=255,
null=True,
),
),
migrations.RunPython(add_shelves, reverse_code=migrations.RunPython.noop),
]

View file

@ -1,13 +0,0 @@
# Generated by Django 3.2.12 on 2022-03-26 20:06
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("bookwyrm", "0146_auto_20220316_2320"),
("bookwyrm", "0147_alter_user_preferred_language"),
]
operations = []

View file

@ -1,13 +0,0 @@
# Generated by Django 3.2.13 on 2022-05-26 17:16
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("bookwyrm", "0148_alter_user_preferred_language"),
("bookwyrm", "0148_merge_20220326_2006"),
]
operations = []

View file

@ -1,18 +0,0 @@
# Generated by Django 3.2.13 on 2022-05-26 18:33
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("bookwyrm", "0149_merge_20220526_1716"),
]
operations = [
migrations.AddField(
model_name="readthrough",
name="stopped_date",
field=models.DateTimeField(blank=True, null=True),
),
]

View file

@ -27,7 +27,6 @@ class ReadThrough(BookWyrmModel):
)
start_date = models.DateTimeField(blank=True, null=True)
finish_date = models.DateTimeField(blank=True, null=True)
stopped_date = models.DateTimeField(blank=True, null=True)
is_active = models.BooleanField(default=True)
def save(self, *args, **kwargs):
@ -35,7 +34,7 @@ class ReadThrough(BookWyrmModel):
cache.delete(f"latest_read_through-{self.user.id}-{self.book.id}")
self.user.update_active_date()
# an active readthrough must have an unset finish date
if self.finish_date or self.stopped_date:
if self.finish_date:
self.is_active = False
super().save(*args, **kwargs)

View file

@ -18,9 +18,8 @@ class Shelf(OrderedCollectionMixin, BookWyrmModel):
TO_READ = "to-read"
READING = "reading"
READ_FINISHED = "read"
STOPPED_READING = "stopped-reading"
READ_STATUS_IDENTIFIERS = (TO_READ, READING, READ_FINISHED, STOPPED_READING)
READ_STATUS_IDENTIFIERS = (TO_READ, READING, READ_FINISHED)
name = fields.CharField(max_length=100)
identifier = models.CharField(max_length=100)

View file

@ -116,8 +116,11 @@ class Status(OrderedCollectionPageMixin, BookWyrmModel):
def ignore_activity(cls, activity): # pylint: disable=too-many-return-statements
"""keep notes if they are replies to existing statuses"""
if activity.type == "Announce":
boosted = activitypub.resolve_remote_id(activity.object, get_activity=True)
if not boosted:
try:
boosted = activitypub.resolve_remote_id(
activity.object, get_activity=True
)
except activitypub.ActivitySerializerError:
# if we can't load the status, definitely ignore it
return True
# keep the boost if we would keep the status
@ -262,7 +265,7 @@ class GeneratedNote(Status):
ReadingStatusChoices = models.TextChoices(
"ReadingStatusChoices", ["to-read", "reading", "read", "stopped-reading"]
"ReadingStatusChoices", ["to-read", "reading", "read"]
)
@ -303,17 +306,10 @@ class Comment(BookStatus):
@property
def pure_content(self):
"""indicate the book in question for mastodon (or w/e) users"""
if self.progress_mode == "PG" and self.progress and (self.progress > 0):
return_value = (
f'{self.content}<p>(comment on <a href="{self.book.remote_id}">'
f'"{self.book.title}"</a>, page {self.progress})</p>'
)
else:
return_value = (
f'{self.content}<p>(comment on <a href="{self.book.remote_id}">'
f'"{self.book.title}"</a>)</p>'
)
return return_value
return (
f'{self.content}<p>(comment on <a href="{self.book.remote_id}">'
f'"{self.book.title}"</a>)</p>'
)
activity_serializer = activitypub.Comment
@ -339,17 +335,10 @@ class Quotation(BookStatus):
"""indicate the book in question for mastodon (or w/e) users"""
quote = re.sub(r"^<p>", '<p>"', self.quote)
quote = re.sub(r"</p>$", '"</p>', quote)
if self.position_mode == "PG" and self.position and (self.position > 0):
return_value = (
f'{quote} <p>-- <a href="{self.book.remote_id}">'
f'"{self.book.title}"</a>, page {self.position}</p>{self.content}'
)
else:
return_value = (
f'{quote} <p>-- <a href="{self.book.remote_id}">'
f'"{self.book.title}"</a></p>{self.content}'
)
return return_value
return (
f'{quote} <p>-- <a href="{self.book.remote_id}">'
f'"{self.book.title}"</a></p>{self.content}'
)
activity_serializer = activitypub.Quotation
@ -388,7 +377,7 @@ class Review(BookStatus):
def save(self, *args, **kwargs):
"""clear rating caches"""
if self.book.parent_work:
cache.delete(f"book-rating-{self.book.parent_work.id}")
cache.delete(f"book-rating-{self.book.parent_work.id}-*")
super().save(*args, **kwargs)

View file

@ -374,10 +374,6 @@ class User(OrderedCollectionPageMixin, AbstractUser):
"name": "Read",
"identifier": "read",
},
{
"name": "Stopped Reading",
"identifier": "stopped-reading",
},
]
for shelf in shelves:

View file

@ -11,7 +11,7 @@ from django.utils.translation import gettext_lazy as _
env = Env()
env.read_env()
DOMAIN = env("DOMAIN")
VERSION = "0.4.0"
VERSION = "0.3.4"
RELEASE_API = env(
"RELEASE_API",
@ -21,7 +21,7 @@ RELEASE_API = env(
PAGE_LENGTH = env("PAGE_LENGTH", 15)
DEFAULT_LANGUAGE = env("DEFAULT_LANGUAGE", "English")
JS_CACHE = "e678183b"
JS_CACHE = "bc93172a"
# email
EMAIL_BACKEND = env("EMAIL_BACKEND", "django.core.mail.backends.smtp.EmailBackend")
@ -212,7 +212,7 @@ STREAMS = [
# Search configuration
# total time in seconds that the instance will spend searching connectors
SEARCH_TIMEOUT = int(env("SEARCH_TIMEOUT", 8))
SEARCH_TIMEOUT = int(env("SEARCH_TIMEOUT", 15))
# timeout for a query to an individual connector
QUERY_TIMEOUT = int(env("QUERY_TIMEOUT", 5))

View file

@ -203,8 +203,6 @@ let StatusCache = new (class {
.forEach((item) => (item.disabled = false));
next_identifier = next_identifier == "complete" ? "read" : next_identifier;
next_identifier =
next_identifier == "stopped-reading-complete" ? "stopped-reading" : next_identifier;
// Disable the current state
button.querySelector(

View file

@ -50,7 +50,7 @@
</ul>
</nav>
<div class="column is-clipped">
<div class="column">
{% block about_content %}{% endblock %}
</div>
</div>

View file

@ -10,7 +10,6 @@
{% if shelf.identifier == 'to-read' %}{% trans "To Read" %}
{% elif shelf.identifier == 'reading' %}{% trans "Currently Reading" %}
{% elif shelf.identifier == 'read' %}{% trans "Read" %}
{% elif shelf.identifier == 'stopped-reading' %}{% trans "Stopped Reading" %}
{% else %}{{ shelf.name }}{% endif %}
</option>
{% endfor %}

View file

@ -1,14 +0,0 @@
{% extends 'layout.html' %}
{% load i18n %}
{% block title %}
{% blocktrans trimmed with book_title=book.title %}
Stop Reading "{{ book_title }}"
{% endblocktrans %}
{% endblock %}
{% block content %}
{% include "snippets/reading_modals/stop_reading_modal.html" with book=book active=True static=True %}
{% endblock %}

View file

@ -19,7 +19,6 @@
</label>
{% include "snippets/progress_field.html" with id=field_id %}
{% endif %}
<div class="field">
<label class="label" for="id_finish_date_{{ readthrough.id }}">
{% trans "Finished reading" %}

View file

@ -8,12 +8,10 @@
<div class="column">
{% trans "Progress Updates:" %}
<ul>
{% if readthrough.finish_date or readthrough.stopped_date or readthrough.progress %}
{% if readthrough.finish_date or readthrough.progress %}
<li>
{% if readthrough.finish_date %}
{{ readthrough.finish_date | localtime | naturalday }}: {% trans "finished" %}
{% elif readthrough.stopped_date %}
{{ readthrough.stopped_date | localtime | naturalday }}: {% trans "stopped" %}
{% else %}
{% if readthrough.progress_mode == 'PG' %}

View file

@ -36,7 +36,7 @@
{% if result_set.results %}
<section class="mb-5">
{% if not result_set.connector.local %}
<details class="details-panel box" open>
<details class="details-panel box" {% if forloop.first %}open{% endif %}>
{% endif %}
{% if not result_set.connector.local %}
<summary class="is-flex is-align-items-center is-flex-wrap-wrap is-gap-2">

View file

@ -86,7 +86,6 @@
{% if shelf.identifier == 'to-read' %}{% trans "To Read" %}
{% elif shelf.identifier == 'reading' %}{% trans "Currently Reading" %}
{% elif shelf.identifier == 'read' %}{% trans "Read" %}
{% elif shelf.identifier == 'stopped-reading' %}{% trans "Stopped Reading" %}
{% else %}{{ shelf.name }}{% endif %}
<span class="subtitle">
{% include 'snippets/privacy-icons.html' with item=shelf %}
@ -151,7 +150,7 @@
{% if is_self %}
<th>{% trans "Shelved" as text %}{% include 'snippets/table-sort-header.html' with field="shelved_date" sort=sort text=text %}</th>
<th>{% trans "Started" as text %}{% include 'snippets/table-sort-header.html' with field="start_date" sort=sort text=text %}</th>
<th>{% if shelf.identifier == 'read' %}{% trans "Finished" as text %}{% else %}{% trans "Until" as text %}{% endif %}{% include 'snippets/table-sort-header.html' with field="finish_date" sort=sort text=text %}</th>
<th>{% trans "Finished" as text %}{% include 'snippets/table-sort-header.html' with field="finish_date" sort=sort text=text %}</th>
{% endif %}
<th>{% trans "Rating" as text %}{% include 'snippets/table-sort-header.html' with field="rating" sort=sort text=text %}</th>
{% endif %}
@ -181,7 +180,7 @@
<td data-title="{% trans "Started" %}">
{{ book.start_date|naturalday|default_if_none:""}}
</td>
<td data-title="{% if shelf.identifier == 'read' %}{% trans "Finished" as text %}{% else %}{% trans "Until" as text %}{% endif %}">
<td data-title="{% trans "Finished" %}">
{{ book.finish_date|naturalday|default_if_none:""}}
</td>
{% endif %}

View file

@ -1,42 +0,0 @@
{% extends 'snippets/reading_modals/layout.html' %}
{% load i18n %}
{% load utilities %}
{% block modal-title %}
{% blocktrans trimmed with book_title=book|book_title %}
Stop Reading "<em>{{ book_title }}</em>"
{% endblocktrans %}
{% endblock %}
{% block modal-form-open %}
<form name="stop-reading-{{ uuid }}" action="{% url 'reading-status' 'stop' book.id %}" method="post" {% if not refresh %}class="submit-status"{% endif %}>
{% csrf_token %}
<input type="hidden" name="id" value="{{ readthrough.id }}">
<input type="hidden" name="reading_status" value="stopped-reading">
<input type="hidden" name="shelf" value="{{ move_from }}">
{% endblock %}
{% block reading-dates %}
<div class="columns">
<div class="column is-half">
<div class="field">
<label class="label" for="stop_id_start_date_{{ uuid }}">
{% trans "Started reading" %}
</label>
<input type="date" name="start_date" class="input" id="stop_id_start_date_{{ uuid }}" value="{{ readthrough.start_date | date:"Y-m-d" }}">
</div>
</div>
<div class="column is-half">
<div class="field">
<label class="label" for="id_read_until_date_{{ uuid }}">
{% trans "Stopped reading" %}
</label>
<input type="date" name="stopped_date" class="input" id="id_read_until_date_{{ uuid }}" value="{% now "Y-m-d" %}">
</div>
</div>
</div>
{% endblock %}
{% block form %}
{% include "snippets/reading_modals/form.html" with optional=True type="stop_modal" %}
{% endblock %}

View file

@ -49,13 +49,6 @@
{% join "finish_reading" uuid as modal_id %}
{% include 'snippets/shelve_button/modal_button.html' with class=button_class fallback_url=fallback_url %}
{% elif shelf.identifier == 'stopped-reading' %}
{% trans "Stopped reading" as button_text %}
{% url 'reading-status' 'stop' book.id as fallback_url %}
{% join "stop_reading" uuid as modal_id %}
{% include 'snippets/shelve_button/modal_button.html' with class=button_class fallback_url=fallback_url %}
{% elif shelf.identifier == 'to-read' %}
{% trans "Want to read" as button_text %}
@ -106,8 +99,5 @@
{% join "finish_reading" uuid as modal_id %}
{% include 'snippets/reading_modals/finish_reading_modal.html' with book=active_shelf.book id=modal_id move_from=current.id readthrough=readthrough refresh=True class="" %}
{% join "stop_reading" uuid as modal_id %}
{% include 'snippets/reading_modals/stop_reading_modal.html' with book=active_shelf.book id=modal_id move_from=current.id readthrough=readthrough refresh=True class="" %}
{% endwith %}
{% endblock %}

View file

@ -29,9 +29,6 @@
{% join "finish_reading" uuid as modal_id %}
{% include 'snippets/reading_modals/finish_reading_modal.html' with book=active_shelf_book id=modal_id readthrough=readthrough class="" %}
{% join "stop_reading" uuid as modal_id %}
{% include 'snippets/reading_modals/stop_reading_modal.html' with book=active_shelf_book id=modal_id readthrough=readthrough class="" %}
{% join "progress_update" uuid as modal_id %}
{% include 'snippets/reading_modals/progress_update_modal.html' with book=active_shelf_book id=modal_id readthrough=readthrough class="" %}

View file

@ -8,7 +8,7 @@
{% comparison_bool shelf.identifier active_shelf.shelf.identifier as is_current %}
<li role="menuitem" class="dropdown-item p-0">
<div
class="{% if is_current or next_shelf_identifier == shelf.identifier %}is-hidden{% elif shelf.identifier == 'stopped-reading' and active_shelf.shelf.identifier != "reading" %}is-hidden{% endif %}"
class="{% if next_shelf_identifier == shelf.identifier %}is-hidden{% endif %}"
data-shelf-dropdown-identifier="{{ shelf.identifier }}"
data-shelf-next="{{ shelf.identifier|next_shelf }}"
>
@ -26,13 +26,6 @@
{% join "finish_reading" button_uuid as modal_id %}
{% include 'snippets/shelve_button/modal_button.html' with class=class fallback_url=fallback_url %}
{% elif shelf.identifier == 'stopped-reading' %}
{% trans "Stop reading" as button_text %}
{% url 'reading-status' 'stop' book.id as fallback_url %}
{% join "stop_reading" button_uuid as modal_id %}
{% include 'snippets/shelve_button/modal_button.html' with class=class fallback_url=fallback_url %}
{% elif shelf.identifier == 'to-read' %}
{% trans "Want to read" as button_text %}

View file

@ -13,15 +13,6 @@
</button>
</div>
<div
class="{% if next_shelf_identifier != 'stopped-reading-complete' %}is-hidden{% endif %}"
data-shelf-identifier="stopped-reading-complete"
>
<button type="button" class="button {{ class }}" disabled>
<span>{% trans "Stopped reading" %}</span>
</button>
</div>
{% for shelf in shelves %}
<div
class="{% if next_shelf_identifier != shelf.identifier %}is-hidden{% endif %}"
@ -42,14 +33,6 @@
{% join "finish_reading" button_uuid as modal_id %}
{% include 'snippets/shelve_button/modal_button.html' with class=class fallback_url=fallback_url %}
{% elif shelf.identifier == 'stopped-reading' %}
{% trans "Stop reading" as button_text %}
{% url 'reading-status' 'finish' book.id as fallback_url %}
{% join "stop_reading" button_uuid as modal_id %}
{% include 'snippets/shelve_button/modal_button.html' with class=class fallback_url=fallback_url %}
{% elif shelf.identifier == 'to-read' %}
{% trans "Want to read" as button_text %}

View file

@ -112,9 +112,6 @@
{% with full=status.content|safe no_trim=status.content_warning itemprop="reviewBody" %}
{% include 'snippets/trimmed_text.html' %}
{% endwith %}
{% if status.progress %}
<div class="is-small is-italic has-text-right mr-3">{% trans "page" %} {{ status.progress }}</div>
{% endif %}
{% endif %}
{% if status.attachments.exists %}

View file

@ -1,23 +0,0 @@
{% spaceless %}
{% load i18n %}
{% load utilities %}
{% load status_display %}
{% load_book status as book %}
{% if book.authors.exists %}
{% with author=book.authors.first %}
{% blocktrans trimmed with book_path=book.local_path book=book|book_title author_name=author.name author_path=author.local_path %}
stopped reading <a href="{{ book_path }}">{{ book }}</a> by <a href="{{ author_path }}">{{ author_name }}</a>
{% endblocktrans %}
{% endwith %}
{% else %}
{% blocktrans trimmed with book_path=book.local_path book=book|book_title %}
stopped reading <a href="{{ book_path }}">{{ book }}</a>
{% endblocktrans %}
{% endif %}
{% endspaceless %}

View file

@ -33,9 +33,8 @@
{% if shelf.name == 'To Read' %}{% trans "To Read" %}
{% elif shelf.name == 'Currently Reading' %}{% trans "Currently Reading" %}
{% elif shelf.name == 'Read' %}{% trans "Read" %}
{% elif shelf.name == 'Stopped Reading' %}{% trans "Stopped Reading" %}
{% else %}{{ shelf.name }}{% endif %}
{% if shelf.size > 4 %}<small>(<a href="{{ shelf.local_path }}">{% blocktrans with size=shelf.size %}View all {{ size }}{% endblocktrans %}</a>)</small>{% endif %}
{% if shelf.size > 3 %}<small>(<a href="{{ shelf.local_path }}">{% blocktrans with size=shelf.size %}View all {{ size }}{% endblocktrans %}</a>)</small>{% endif %}
</h3>
<div class="is-mobile field is-grouped">
{% for book in shelf.books %}

View file

@ -13,10 +13,10 @@ register = template.Library()
def get_rating(book, user):
"""get the overall rating of a book"""
return cache.get_or_set(
f"book-rating-{book.parent_work.id}",
lambda u, b: models.Review.objects.filter(
book__parent_work__editions=b, rating__gt=0
).aggregate(Avg("rating"))["rating__avg"]
f"book-rating-{book.parent_work.id}-{user.id}",
lambda u, b: models.Review.privacy_filter(u)
.filter(book__parent_work__editions=b, rating__gt=0)
.aggregate(Avg("rating"))["rating__avg"]
or 0,
user,
book,

View file

@ -30,8 +30,6 @@ def get_next_shelf(current_shelf):
return "read"
if current_shelf == "read":
return "complete"
if current_shelf == "stopped-reading":
return "stopped-reading-complete"
return "to-read"

View file

@ -42,9 +42,15 @@ class AbstractConnector(TestCase):
generated_remote_link_field = "openlibrary_link"
def parse_search_data(self, data, min_confidence):
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

View file

@ -1,5 +1,6 @@
""" testing book data connectors """
from django.test import TestCase
import responses
from bookwyrm import models
from bookwyrm.connectors import abstract_connector
@ -24,12 +25,18 @@ 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, min_confidence):
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
@ -47,6 +54,45 @@ 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")

View file

@ -30,11 +30,14 @@ class BookWyrmConnector(TestCase):
result = self.connector.get_or_create_book(book.remote_id)
self.assertEqual(book, result)
def test_parse_search_data(self):
def test_format_search_result(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())
result = list(self.connector.parse_search_data(search_data, 0))[0]
results = self.connector.parse_search_data(search_data)
self.assertIsInstance(results, list)
result = self.connector.format_search_result(results[0])
self.assertIsInstance(result, SearchResult)
self.assertEqual(result.title, "Jonathan Strange and Mr Norrell")
self.assertEqual(result.key, "https://example.com/book/122")
@ -42,9 +45,10 @@ class BookWyrmConnector(TestCase):
self.assertEqual(result.year, 2017)
self.assertEqual(result.connector, self.connector)
def test_parse_isbn_search_data(self):
def test_format_isbn_search_result(self):
"""just gotta attach the connector"""
datafile = pathlib.Path(__file__).parent.joinpath("../data/bw_search.json")
search_data = json.loads(datafile.read_bytes())
result = list(self.connector.parse_isbn_search_data(search_data))[0]
results = self.connector.parse_isbn_search_data(search_data)
result = self.connector.format_isbn_search_result(results[0])
self.assertEqual(result.connector, self.connector)

View file

@ -49,11 +49,39 @@ 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")

View file

@ -66,14 +66,38 @@ class Inventaire(TestCase):
with self.assertRaises(ConnectorException):
self.connector.get_book_data("https://test.url/ok")
def test_parse_search_data(self):
@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):
"""json to search result objs"""
search_file = pathlib.Path(__file__).parent.joinpath(
"../data/inventaire_search.json"
)
search_results = json.loads(search_file.read_bytes())
formatted = list(self.connector.parse_search_data(search_results, 0))[0]
results = self.connector.parse_search_data(search_results)
formatted = self.connector.format_search_result(results[0])
self.assertEqual(formatted.title, "The Stories of Vladimir Nabokov")
self.assertEqual(
@ -154,14 +178,15 @@ class Inventaire(TestCase):
result = self.connector.resolve_keys(keys)
self.assertEqual(result, ["epistolary novel", "crime novel"])
def test_pase_isbn_search_data(self):
def test_isbn_search(self):
"""another search type"""
search_file = pathlib.Path(__file__).parent.joinpath(
"../data/inventaire_isbn_search.json"
)
search_results = json.loads(search_file.read_bytes())
formatted = list(self.connector.parse_isbn_search_data(search_results))[0]
results = self.connector.parse_isbn_search_data(search_results)
formatted = self.connector.format_isbn_search_result(results[0])
self.assertEqual(formatted.title, "L'homme aux cercles bleus")
self.assertEqual(
@ -173,12 +198,25 @@ class Inventaire(TestCase):
"https://covers.inventaire.io/img/entities/12345",
)
def test_parse_isbn_search_data_empty(self):
def test_isbn_search_empty(self):
"""another search type"""
search_results = {}
results = list(self.connector.parse_isbn_search_data(search_results))
results = 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(

View file

@ -122,11 +122,21 @@ 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())
result = list(self.connector.parse_search_data(search_data, 0))[0]
results = self.connector.parse_search_data(search_data)
self.assertIsInstance(results, list)
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")
@ -138,10 +148,18 @@ 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 = list(self.connector.parse_isbn_search_data(search_data))
result = self.connector.parse_isbn_search_data(search_data)
self.assertIsInstance(result, list)
self.assertEqual(len(result), 1)
result = result[0]
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])
self.assertIsInstance(result, SearchResult)
self.assertEqual(result.title, "Les ombres errantes")
self.assertEqual(result.key, "https://openlibrary.org/books/OL16262504M")
@ -211,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)

View file

@ -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()

View file

@ -462,8 +462,6 @@ class Status(TestCase):
@responses.activate
def test_ignore_activity_boost(self, *_):
"""don't bother with most remote statuses"""
responses.add(responses.GET, "http://fish.com/nothing")
activity = activitypub.Announce(
id="http://www.faraway.com/boost/12",
actor=self.remote_user.remote_id,

View file

@ -53,17 +53,15 @@ class User(TestCase):
def test_user_shelves(self):
shelves = models.Shelf.objects.filter(user=self.user).all()
self.assertEqual(len(shelves), 4)
self.assertEqual(len(shelves), 3)
names = [s.name for s in shelves]
self.assertTrue("To Read" in names)
self.assertTrue("Currently Reading" in names)
self.assertTrue("Read" in names)
self.assertTrue("Stopped Reading" in names)
ids = [s.identifier for s in shelves]
self.assertTrue("to-read" in ids)
self.assertTrue("reading" in ids)
self.assertTrue("read" in ids)
self.assertTrue("stopped-reading" in ids)
def test_activitypub_serialize(self):
activity = self.user.to_activity()

View file

@ -40,8 +40,7 @@ class RatingTags(TestCase):
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async")
def test_get_rating(self, *_):
"""privacy filtered rating. Commented versions are how it ought to work with
subjective ratings, which are currenly not used for performance reasons."""
"""privacy filtered rating"""
# follows-only: not included
models.ReviewRating.objects.create(
user=self.remote_user,
@ -49,8 +48,7 @@ class RatingTags(TestCase):
book=self.book,
privacy="followers",
)
# self.assertEqual(rating_tags.get_rating(self.book, self.local_user), 0)
self.assertEqual(rating_tags.get_rating(self.book, self.local_user), 5)
self.assertEqual(rating_tags.get_rating(self.book, self.local_user), 0)
# public: included
models.ReviewRating.objects.create(

View file

@ -102,12 +102,18 @@ 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, min_confidence):
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

View file

@ -1,5 +1,6 @@
""" test for app action functionality """
import json
import pathlib
from unittest.mock import patch
from django.contrib.auth.models import AnonymousUser
@ -7,9 +8,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
@ -64,11 +65,12 @@ 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()
connector = models.Connector.objects.create(
models.Connector.objects.create(
identifier="example.com",
connector_file="openlibrary",
base_url="https://example.com",
@ -76,24 +78,26 @@ class Views(TestCase):
covers_url="https://example.com/covers",
search_url="https://example.com/search?q=",
)
mock_result = SearchResult(title="Mock Book", connector=connector, key="hello")
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
)
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
with patch("bookwyrm.connectors.connector_manager.search") as remote_search:
remote_search.return_value = [
{"results": [mock_result], "connector": connector}
]
response = view(request)
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, "Mock Book")
self.assertEqual(
connector_results[1]["results"][0].title,
"This Is How You Lose the Time War",
)
# don't search remote
request = self.factory.get("", {"q": "Test Book", "remote": True})
@ -102,11 +106,7 @@ class Views(TestCase):
request.user = anonymous_user
with patch("bookwyrm.views.search.is_api_request") as is_api:
is_api.return_value = False
with patch("bookwyrm.connectors.connector_manager.search") as remote_search:
remote_search.return_value = [
{"results": [mock_result], "connector": connector}
]
response = view(request)
response = view(request)
self.assertIsInstance(response, TemplateResponse)
validate_html(response.render())
connector_results = response.context_data["results"]

View file

@ -281,7 +281,7 @@ http://www.fish.com/"""
result = views.status.to_markdown(text)
self.assertEqual(
result,
'<p><em>hi</em> and <a href="http://fish.com">fish.com</a> is rad</p>',
'<p><em>hi</em> and <a href="http://fish.com">fish.com</a> ' "is rad</p>",
)
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 <marquee>rad</marquee>"
result = views.status.to_markdown(text)
self.assertEqual(result, '<p><a href="http://fish.com">hi</a> is rad</p>')
self.assertEqual(result, '<p><a href="http://fish.com">hi</a> ' "is rad</p>")
def test_delete_status(self, mock, *_):
"""marks a status as deleted"""

View file

@ -622,7 +622,7 @@ urlpatterns = [
name="reading-status-update",
),
re_path(
r"^reading-status/(?P<status>want|start|finish|stop)/(?P<book_id>\d+)/?$",
r"^reading-status/(?P<status>want|start|finish)/(?P<book_id>\d+)/?$",
views.ReadingStatus.as_view(),
name="reading-status",
),

View file

@ -138,7 +138,6 @@ def handle_reading_status(user, shelf, book, privacy):
"to-read": "wants to read",
"reading": "started reading",
"read": "finished reading",
"stopped-reading": "stopped reading",
}[shelf.identifier]
except KeyError:
# it's a non-standard shelf, don't worry about it

View file

@ -1,5 +1,4 @@
""" the good stuff! the books! """
import logging
from django.contrib.auth.decorators import login_required
from django.core.cache import cache
from django.db import transaction
@ -16,8 +15,6 @@ from .status import CreateStatus
from .helpers import get_edition, handle_reading_status, is_api_request
from .helpers import load_date_in_user_tz_as_utc
logger = logging.getLogger(__name__)
# pylint: disable=no-self-use
# pylint: disable=too-many-return-statements
@ -32,24 +29,20 @@ class ReadingStatus(View):
"want": "want.html",
"start": "start.html",
"finish": "finish.html",
"stop": "stop.html",
}.get(status)
if not template:
return HttpResponseNotFound()
# redirect if we're already on this shelf
return TemplateResponse(request, f"reading_progress/{template}", {"book": book})
@transaction.atomic
def post(self, request, status, book_id):
"""Change the state of a book by shelving it and adding reading dates"""
identifier = {
"want": models.Shelf.TO_READ,
"start": models.Shelf.READING,
"finish": models.Shelf.READ_FINISHED,
"stop": models.Shelf.STOPPED_READING,
}.get(status)
if not identifier:
logger.exception("Invalid reading status type: %s", status)
return HttpResponseBadRequest()
# invalidate related caches
@ -92,7 +85,6 @@ class ReadingStatus(View):
desired_shelf.identifier,
start_date=request.POST.get("start_date"),
finish_date=request.POST.get("finish_date"),
stopped_date=request.POST.get("stopped_date"),
)
# post about it (if you want)
@ -161,9 +153,8 @@ class ReadThrough(View):
@transaction.atomic
# pylint: disable=too-many-arguments
def update_readthrough_on_shelve(
user, annotated_book, status, start_date=None, finish_date=None, stopped_date=None
user, annotated_book, status, start_date=None, finish_date=None
):
"""update the current readthrough for a book when it is re-shelved"""
# there *should* only be one of current active readthrough, but it's a list
@ -185,9 +176,8 @@ def update_readthrough_on_shelve(
)
# santiize and set dates
active_readthrough.start_date = load_date_in_user_tz_as_utc(start_date, user)
# if the stop or finish date is set, the readthrough will be set as inactive
# if the finish date is set, the readthrough will be automatically set as inactive
active_readthrough.finish_date = load_date_in_user_tz_as_utc(finish_date, user)
active_readthrough.stopped_date = load_date_in_user_tz_as_utc(stopped_date, user)
active_readthrough.save()

View file

@ -1,6 +1,5 @@
""" what are we here for if not for posting """
import re
import logging
from urllib.parse import urlparse
from django.contrib.auth.decorators import login_required
@ -22,8 +21,6 @@ from bookwyrm.utils import regex
from .helpers import handle_remote_webfinger, is_api_request
from .helpers import load_date_in_user_tz_as_utc
logger = logging.getLogger(__name__)
# pylint: disable= no-self-use
@method_decorator(login_required, name="dispatch")
@ -75,14 +72,11 @@ class CreateStatus(View):
form = getattr(forms, f"{status_type}Form")(
request.POST, instance=existing_status
)
except AttributeError as err:
logger.exception(err)
except AttributeError:
return HttpResponseBadRequest()
if not form.is_valid():
if is_api_request(request):
logger.exception(form.errors)
return HttpResponseBadRequest()
return HttpResponse(status=500)
return redirect(request.headers.get("Referer", "/"))
status = form.save(commit=False)

5
bw-dev
View file

@ -140,10 +140,6 @@ 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
;;
@ -153,7 +149,6 @@ 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 \

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-23 21:04+0000\n"
"PO-Revision-Date: 2022-05-24 01:06\n"
"POT-Creation-Date: 2022-04-08 21:00+0000\n"
"PO-Revision-Date: 2022-04-30 13:02\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\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:18 bookwyrm/models/link.py:72
#: bookwyrm/models/base_model.py:17 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:19
#: bookwyrm/models/base_model.py:18
msgid "Self deletion"
msgstr "Selbstlöschung"
#: bookwyrm/models/base_model.py:20
#: bookwyrm/models/base_model.py:19
msgid "Moderator suspension"
msgstr "Moderator*in suspendieren"
#: bookwyrm/models/base_model.py:21
#: bookwyrm/models/base_model.py:20
msgid "Moderator deletion"
msgstr "Moderator*in löschen"
#: bookwyrm/models/base_model.py:22
#: bookwyrm/models/base_model.py:21
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:135
#: bookwyrm/templates/book/edit/edit_book.html:127
#: 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:137
#: bookwyrm/templates/book/edit/edit_book.html:140
#: bookwyrm/templates/book/edit/edit_book.html:129
#: bookwyrm/templates/book/edit/edit_book.html:132
#: 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 <strong>%(source_name)s</strong> and check f
msgstr "Das Laden von Daten wird eine Verbindung zu <strong>%(source_name)s</strong> 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:122
#: bookwyrm/templates/book/edit/edit_book.html:114
#: 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:62
#: bookwyrm/templates/book/edit/edit_book.html:54
msgid "Confirm Book Info"
msgstr "Buchinfo bestätigen"
#: bookwyrm/templates/book/edit/edit_book.html:70
#: bookwyrm/templates/book/edit/edit_book.html:62
#, 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:81
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:73
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Author of "
msgstr "Autor*in von "
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Find more information at isni.org"
msgstr "Weitere Informationen auf isni.org finden"
#: bookwyrm/templates/book/edit/edit_book.html:93
#: bookwyrm/templates/book/edit/edit_book.html:85
msgid "This is a new author"
msgstr "Neue*r Autor*in"
#: bookwyrm/templates/book/edit/edit_book.html:100
#: bookwyrm/templates/book/edit/edit_book.html:92
#, 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:107
#: bookwyrm/templates/book/edit/edit_book.html:99
msgid "Is this an edition of an existing work?"
msgstr "Ist das eine Ausgabe eines vorhandenen Werkes?"
#: bookwyrm/templates/book/edit/edit_book.html:115
#: bookwyrm/templates/book/edit/edit_book.html:107
msgid "This is a new work"
msgstr "Dies ist ein neues Werk."
#: bookwyrm/templates/book/edit/edit_book.html:124
#: bookwyrm/templates/book/edit/edit_book.html:116
#: 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:42
#: bookwyrm/templates/import/import.html:39
msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">Import/Export page</a> of your Goodreads account."
msgstr "Du kannst deine Goodreads-Daten von der <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">Import&nbsp;/&nbsp;Export-Seite</a> deines Goodreads-Kontos downloaden."
#: bookwyrm/templates/import/import.html:47
#: bookwyrm/templates/import/import.html:44
msgid "Data file:"
msgstr "Datei:"
#: bookwyrm/templates/import/import.html:55
#: bookwyrm/templates/import/import.html:52
msgid "Include reviews"
msgstr "Besprechungen einschließen"
#: bookwyrm/templates/import/import.html:60
#: bookwyrm/templates/import/import.html:57
msgid "Privacy setting for imported reviews:"
msgstr "Datenschutzeinstellung für importierte Besprechungen:"
#: bookwyrm/templates/import/import.html:66
#: bookwyrm/templates/import/import.html:63
#: bookwyrm/templates/preferences/layout.html:31
#: bookwyrm/templates/settings/federation/instance_blocklist.html:76
msgid "Import"
msgstr "Importieren"
#: bookwyrm/templates/import/import.html:71
#: bookwyrm/templates/import/import.html:68
msgid "Recent Imports"
msgstr "Zuletzt importiert"
#: bookwyrm/templates/import/import.html:73
#: bookwyrm/templates/import/import.html:70
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:70
#: bookwyrm/views/imports/import_data.py:67
msgid "Not a valid csv file"
msgstr "Keine gültige CSV-Datei"

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-31 23:50+0000\n"
"POT-Creation-Date: 2022-05-23 21:04+0000\n"
"PO-Revision-Date: 2021-02-28 17:19-0800\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: English <LL@li.org>\n"
@ -47,10 +47,6 @@ 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 ""
@ -75,8 +71,8 @@ msgstr ""
msgid "Book Title"
msgstr ""
#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:156
#: bookwyrm/templates/shelf/shelf.html:188
#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:155
#: bookwyrm/templates/shelf/shelf.html:187
#: bookwyrm/templates/snippets/create_status/review.html:32
msgid "Rating"
msgstr ""
@ -1080,7 +1076,7 @@ msgid "Add Another Author"
msgstr ""
#: bookwyrm/templates/book/edit/edit_book_form.html:220
#: bookwyrm/templates/shelf/shelf.html:147
#: bookwyrm/templates/shelf/shelf.html:146
msgid "Cover"
msgstr ""
@ -1714,13 +1710,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:48
#: bookwyrm/templatetags/shelf_tags.py:46
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:50
#: bookwyrm/templatetags/shelf_tags.py:48
msgid "Currently Reading"
msgstr ""
@ -1729,15 +1725,10 @@ 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:52
#: bookwyrm/templates/user/user.html:35 bookwyrm/templatetags/shelf_tags.py:50
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 ""
@ -2065,8 +2056,8 @@ msgid "Row"
msgstr ""
#: bookwyrm/templates/import/import_status.html:103
#: bookwyrm/templates/shelf/shelf.html:148
#: bookwyrm/templates/shelf/shelf.html:170
#: bookwyrm/templates/shelf/shelf.html:147
#: bookwyrm/templates/shelf/shelf.html:169
msgid "Title"
msgstr ""
@ -2079,8 +2070,8 @@ msgid "Openlibrary key"
msgstr ""
#: bookwyrm/templates/import/import_status.html:114
#: bookwyrm/templates/shelf/shelf.html:149
#: bookwyrm/templates/shelf/shelf.html:173
#: bookwyrm/templates/shelf/shelf.html:148
#: bookwyrm/templates/shelf/shelf.html:172
msgid "Author"
msgstr ""
@ -2998,11 +2989,6 @@ 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\""
@ -3027,7 +3013,6 @@ 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 ""
@ -3036,7 +3021,7 @@ msgstr ""
msgid "Progress"
msgstr ""
#: bookwyrm/templates/readthrough/readthrough_form.html:25
#: bookwyrm/templates/readthrough/readthrough_form.html:24
#: bookwyrm/templates/readthrough/readthrough_modal.html:63
#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:32
msgid "Finished reading"
@ -3050,27 +3035,23 @@ msgstr ""
msgid "finished"
msgstr ""
#: bookwyrm/templates/readthrough/readthrough_list.html:16
msgid "stopped"
msgstr ""
#: bookwyrm/templates/readthrough/readthrough_list.html:27
#: bookwyrm/templates/readthrough/readthrough_list.html:25
msgid "Show all updates"
msgstr ""
#: bookwyrm/templates/readthrough/readthrough_list.html:43
#: bookwyrm/templates/readthrough/readthrough_list.html:41
msgid "Delete this progress update"
msgstr ""
#: bookwyrm/templates/readthrough/readthrough_list.html:55
#: bookwyrm/templates/readthrough/readthrough_list.html:53
msgid "started"
msgstr ""
#: bookwyrm/templates/readthrough/readthrough_list.html:62
#: bookwyrm/templates/readthrough/readthrough_list.html:60
msgid "Edit read dates"
msgstr ""
#: bookwyrm/templates/readthrough/readthrough_list.html:70
#: bookwyrm/templates/readthrough/readthrough_list.html:68
msgid "Delete these read dates"
msgstr ""
@ -4378,51 +4359,46 @@ msgid "User profile"
msgstr ""
#: bookwyrm/templates/shelf/shelf.html:39
#: bookwyrm/templatetags/shelf_tags.py:46 bookwyrm/views/shelf/shelf.py:53
#: bookwyrm/templatetags/shelf_tags.py:44 bookwyrm/views/shelf/shelf.py:53
msgid "All books"
msgstr ""
#: bookwyrm/templates/shelf/shelf.html:97
#: bookwyrm/templates/shelf/shelf.html:96
#, python-format
msgid "%(formatted_count)s book"
msgid_plural "%(formatted_count)s books"
msgstr[0] ""
msgstr[1] ""
#: bookwyrm/templates/shelf/shelf.html:104
#: bookwyrm/templates/shelf/shelf.html:103
#, python-format
msgid "(showing %(start)s-%(end)s)"
msgstr ""
#: bookwyrm/templates/shelf/shelf.html:116
#: bookwyrm/templates/shelf/shelf.html:115
msgid "Edit shelf"
msgstr ""
#: bookwyrm/templates/shelf/shelf.html:124
#: bookwyrm/templates/shelf/shelf.html:123
msgid "Delete shelf"
msgstr ""
#: bookwyrm/templates/shelf/shelf.html:152
#: bookwyrm/templates/shelf/shelf.html:178
#: bookwyrm/templates/shelf/shelf.html:151
#: bookwyrm/templates/shelf/shelf.html:177
msgid "Shelved"
msgstr ""
#: bookwyrm/templates/shelf/shelf.html:153
#: bookwyrm/templates/shelf/shelf.html:181
#: bookwyrm/templates/shelf/shelf.html:152
#: bookwyrm/templates/shelf/shelf.html:180
msgid "Started"
msgstr ""
#: bookwyrm/templates/shelf/shelf.html:154
#: bookwyrm/templates/shelf/shelf.html:184
#: bookwyrm/templates/shelf/shelf.html:153
#: bookwyrm/templates/shelf/shelf.html:183
msgid "Finished"
msgstr ""
#: bookwyrm/templates/shelf/shelf.html:154
#: bookwyrm/templates/shelf/shelf.html:184
msgid "Until"
msgstr ""
#: bookwyrm/templates/shelf/shelf.html:210
#: bookwyrm/templates/shelf/shelf.html:209
msgid "This shelf is empty."
msgstr ""
@ -4752,7 +4728,7 @@ msgid "(Optional)"
msgstr ""
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:6
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:61
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:54
msgid "Update progress"
msgstr ""
@ -4761,17 +4737,6 @@ msgstr ""
msgid "Start \"<em>%(book_title)s</em>\""
msgstr ""
#: bookwyrm/templates/snippets/reading_modals/stop_reading_modal.html:6
#, python-format
msgid "Stop Reading \"<em>%(book_title)s</em>\""
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 \"<em>%(book_title)s</em>\""
@ -4819,23 +4784,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:33
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:24
msgid "Start reading"
msgstr ""
#: 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
#: 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
msgid "Want to read"
msgstr ""
#: bookwyrm/templates/snippets/shelf_selector.html:82
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:73
#: bookwyrm/templates/snippets/shelf_selector.html:75
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:66
#, python-format
msgid "Remove from %(name)s"
msgstr ""
#: bookwyrm/templates/snippets/shelf_selector.html:95
#: bookwyrm/templates/snippets/shelf_selector.html:88
msgid "Remove from"
msgstr ""
@ -4843,12 +4808,7 @@ msgstr ""
msgid "More shelves"
msgstr ""
#: 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
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:31
msgid "Finish reading"
msgstr ""
@ -4943,16 +4903,6 @@ msgstr ""
msgid "reviewed <a href=\"%(book_path)s\">%(book)s</a>"
msgstr ""
#: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10
#, python-format
msgid "stopped reading <a href=\"%(book_path)s\">%(book)s</a> by <a href=\"%(author_path)s\">%(author_name)s</a>"
msgstr ""
#: bookwyrm/templates/snippets/status/headers/stopped_reading.html:17
#, python-format
msgid "stopped reading <a href=\"%(book_path)s\">%(book)s</a>"
msgstr ""
#: bookwyrm/templates/snippets/status/headers/to_read.html:10
#, python-format
msgid "wants to read <a href=\"%(book_path)s\">%(book)s</a> by <a href=\"%(author_path)s\">%(author_name)s</a>"
@ -5093,29 +5043,29 @@ msgstr ""
msgid "Edit profile"
msgstr ""
#: bookwyrm/templates/user/user.html:38
#: bookwyrm/templates/user/user.html:37
#, python-format
msgid "View all %(size)s"
msgstr ""
#: bookwyrm/templates/user/user.html:52
#: bookwyrm/templates/user/user.html:51
msgid "View all books"
msgstr ""
#: bookwyrm/templates/user/user.html:59
#: bookwyrm/templates/user/user.html:58
#, python-format
msgid "%(current_year)s Reading Goal"
msgstr ""
#: bookwyrm/templates/user/user.html:66
#: bookwyrm/templates/user/user.html:65
msgid "User Activity"
msgstr ""
#: bookwyrm/templates/user/user.html:70
#: bookwyrm/templates/user/user.html:69
msgid "RSS feed"
msgstr ""
#: bookwyrm/templates/user/user.html:81
#: bookwyrm/templates/user/user.html:80
msgid "No activities yet!"
msgstr ""

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-23 21:04+0000\n"
"PO-Revision-Date: 2022-05-24 01:06\n"
"POT-Creation-Date: 2022-04-08 21:00+0000\n"
"PO-Revision-Date: 2022-04-30 10:04\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\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:18 bookwyrm/models/link.py:72
#: bookwyrm/models/base_model.py:17 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:19
#: bookwyrm/models/base_model.py:18
msgid "Self deletion"
msgstr "Auto-eliminación"
#: bookwyrm/models/base_model.py:20
#: bookwyrm/models/base_model.py:19
msgid "Moderator suspension"
msgstr "Suspensión de moderador"
#: bookwyrm/models/base_model.py:21
#: bookwyrm/models/base_model.py:20
msgid "Moderator deletion"
msgstr "Eliminación de moderador"
#: bookwyrm/models/base_model.py:22
#: bookwyrm/models/base_model.py:21
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:135
#: bookwyrm/templates/book/edit/edit_book.html:127
#: 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:137
#: bookwyrm/templates/book/edit/edit_book.html:140
#: bookwyrm/templates/book/edit/edit_book.html:129
#: bookwyrm/templates/book/edit/edit_book.html:132
#: 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 <strong>%(source_name)s</strong> and check f
msgstr "La carga de datos se conectará a <strong>%(source_name)s</strong> 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:122
#: bookwyrm/templates/book/edit/edit_book.html:114
#: 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:62
#: bookwyrm/templates/book/edit/edit_book.html:54
msgid "Confirm Book Info"
msgstr "Confirmar información de libro"
#: bookwyrm/templates/book/edit/edit_book.html:70
#: bookwyrm/templates/book/edit/edit_book.html:62
#, 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:81
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:73
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Author of "
msgstr "Autor/a de "
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Find more information at isni.org"
msgstr "Más información en isni.org"
#: bookwyrm/templates/book/edit/edit_book.html:93
#: bookwyrm/templates/book/edit/edit_book.html:85
msgid "This is a new author"
msgstr "Este es un autor nuevo"
#: bookwyrm/templates/book/edit/edit_book.html:100
#: bookwyrm/templates/book/edit/edit_book.html:92
#, python-format
msgid "Creating a new author: %(name)s"
msgstr "Creando un autor nuevo: %(name)s"
#: bookwyrm/templates/book/edit/edit_book.html:107
#: bookwyrm/templates/book/edit/edit_book.html:99
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:115
#: bookwyrm/templates/book/edit/edit_book.html:107
msgid "This is a new work"
msgstr "Esta es una obra nueva"
#: bookwyrm/templates/book/edit/edit_book.html:124
#: bookwyrm/templates/book/edit/edit_book.html:116
#: 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:42
#: bookwyrm/templates/import/import.html:39
msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">Import/Export page</a> of your Goodreads account."
msgstr "Puedes descargar tus datos de Goodreads desde la <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">página de importación/exportación</a> de tu cuenta de Goodreads."
#: bookwyrm/templates/import/import.html:47
#: bookwyrm/templates/import/import.html:44
msgid "Data file:"
msgstr "Archivo de datos:"
#: bookwyrm/templates/import/import.html:55
#: bookwyrm/templates/import/import.html:52
msgid "Include reviews"
msgstr "Incluir reseñas"
#: bookwyrm/templates/import/import.html:60
#: bookwyrm/templates/import/import.html:57
msgid "Privacy setting for imported reviews:"
msgstr "Configuración de privacidad para las reseñas importadas:"
#: bookwyrm/templates/import/import.html:66
#: bookwyrm/templates/import/import.html:63
#: bookwyrm/templates/preferences/layout.html:31
#: bookwyrm/templates/settings/federation/instance_blocklist.html:76
msgid "Import"
msgstr "Importar"
#: bookwyrm/templates/import/import.html:71
#: bookwyrm/templates/import/import.html:68
msgid "Recent Imports"
msgstr "Importaciones recientes"
#: bookwyrm/templates/import/import.html:73
#: bookwyrm/templates/import/import.html:70
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:70
#: bookwyrm/views/imports/import_data.py:67
msgid "Not a valid csv file"
msgstr "No un archivo csv válido"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-23 21:04+0000\n"
"PO-Revision-Date: 2022-05-24 01:06\n"
"POT-Creation-Date: 2022-04-08 21:00+0000\n"
"PO-Revision-Date: 2022-05-07 14:54\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\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:18 bookwyrm/models/link.py:72
#: bookwyrm/models/base_model.py:17 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:19
#: bookwyrm/models/base_model.py:18
msgid "Self deletion"
msgstr "Itse poistettu"
#: bookwyrm/models/base_model.py:20
#: bookwyrm/models/base_model.py:19
msgid "Moderator suspension"
msgstr "Moderaattorin estämä"
#: bookwyrm/models/base_model.py:21
#: bookwyrm/models/base_model.py:20
msgid "Moderator deletion"
msgstr "Moderaattorin poistama"
#: bookwyrm/models/base_model.py:22
#: bookwyrm/models/base_model.py:21
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:135
#: bookwyrm/templates/book/edit/edit_book.html:127
#: 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:137
#: bookwyrm/templates/book/edit/edit_book.html:140
#: bookwyrm/templates/book/edit/edit_book.html:129
#: bookwyrm/templates/book/edit/edit_book.html:132
#: 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 <strong>%(source_name)s</strong> and check f
msgstr "Tietoja ladattaessa muodostetaan yhteys lähteeseen <strong>%(source_name)s</strong> 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:122
#: bookwyrm/templates/book/edit/edit_book.html:114
#: 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:62
#: bookwyrm/templates/book/edit/edit_book.html:54
msgid "Confirm Book Info"
msgstr "Vahvista kirjan tiedot"
#: bookwyrm/templates/book/edit/edit_book.html:70
#: bookwyrm/templates/book/edit/edit_book.html:62
#, 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:81
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:73
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Author of "
msgstr "Tekijänä teoksessa "
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Find more information at isni.org"
msgstr "Lisätietoja osoitteessa isni.org"
#: bookwyrm/templates/book/edit/edit_book.html:93
#: bookwyrm/templates/book/edit/edit_book.html:85
msgid "This is a new author"
msgstr "Uusi tekijä"
#: bookwyrm/templates/book/edit/edit_book.html:100
#: bookwyrm/templates/book/edit/edit_book.html:92
#, python-format
msgid "Creating a new author: %(name)s"
msgstr "Luodaan uusi tekijä: %(name)s"
#: bookwyrm/templates/book/edit/edit_book.html:107
#: bookwyrm/templates/book/edit/edit_book.html:99
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:115
#: bookwyrm/templates/book/edit/edit_book.html:107
msgid "This is a new work"
msgstr "Uusi teos"
#: bookwyrm/templates/book/edit/edit_book.html:124
#: bookwyrm/templates/book/edit/edit_book.html:116
#: 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:42
#: bookwyrm/templates/import/import.html:39
msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">Import/Export page</a> of your Goodreads account."
msgstr "Goodreads-tiedot voi ladata Goodreads-käyttäjätilin <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">Import/Export-sivun</a> kautta."
#: bookwyrm/templates/import/import.html:47
#: bookwyrm/templates/import/import.html:44
msgid "Data file:"
msgstr "Datatiedosto:"
#: bookwyrm/templates/import/import.html:55
#: bookwyrm/templates/import/import.html:52
msgid "Include reviews"
msgstr "Myös arviot"
#: bookwyrm/templates/import/import.html:60
#: bookwyrm/templates/import/import.html:57
msgid "Privacy setting for imported reviews:"
msgstr "Tuotavien arvioiden yksityisyysvalinta:"
#: bookwyrm/templates/import/import.html:66
#: bookwyrm/templates/import/import.html:63
#: bookwyrm/templates/preferences/layout.html:31
#: bookwyrm/templates/settings/federation/instance_blocklist.html:76
msgid "Import"
msgstr "Tuo"
#: bookwyrm/templates/import/import.html:71
#: bookwyrm/templates/import/import.html:68
msgid "Recent Imports"
msgstr "Viimeksi tuotu"
#: bookwyrm/templates/import/import.html:73
#: bookwyrm/templates/import/import.html:70
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:70
#: bookwyrm/views/imports/import_data.py:67
msgid "Not a valid csv file"
msgstr "Epäkelpo csv-tiedosto"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-23 21:04+0000\n"
"PO-Revision-Date: 2022-05-24 01:06\n"
"POT-Creation-Date: 2022-04-08 21:00+0000\n"
"PO-Revision-Date: 2022-04-09 08:36\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\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:18 bookwyrm/models/link.py:72
#: bookwyrm/models/base_model.py:17 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:19
#: bookwyrm/models/base_model.py:18
msgid "Self deletion"
msgstr "Auto-suppression"
#: bookwyrm/models/base_model.py:20
#: bookwyrm/models/base_model.py:19
msgid "Moderator suspension"
msgstr "Suspension du modérateur"
#: bookwyrm/models/base_model.py:21
#: bookwyrm/models/base_model.py:20
msgid "Moderator deletion"
msgstr "Suppression du modérateur"
#: bookwyrm/models/base_model.py:22
#: bookwyrm/models/base_model.py:21
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:135
#: bookwyrm/templates/book/edit/edit_book.html:127
#: 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:137
#: bookwyrm/templates/book/edit/edit_book.html:140
#: bookwyrm/templates/book/edit/edit_book.html:129
#: bookwyrm/templates/book/edit/edit_book.html:132
#: 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 <strong>%(source_name)s</strong> and check f
msgstr "Le chargement des données se connectera à <strong>%(source_name)s</strong> 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:122
#: bookwyrm/templates/book/edit/edit_book.html:114
#: 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:62
#: bookwyrm/templates/book/edit/edit_book.html:54
msgid "Confirm Book Info"
msgstr "Confirmer les informations de ce livre"
#: bookwyrm/templates/book/edit/edit_book.html:70
#: bookwyrm/templates/book/edit/edit_book.html:62
#, 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:81
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:73
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Author of "
msgstr "Auteur ou autrice de "
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Find more information at isni.org"
msgstr "Trouver plus dinformations sur isni.org"
#: bookwyrm/templates/book/edit/edit_book.html:93
#: bookwyrm/templates/book/edit/edit_book.html:85
msgid "This is a new author"
msgstr "Il sagit dun nouvel auteur ou dune nouvelle autrice."
#: bookwyrm/templates/book/edit/edit_book.html:100
#: bookwyrm/templates/book/edit/edit_book.html:92
#, python-format
msgid "Creating a new author: %(name)s"
msgstr "Création dun nouvel auteur/autrice: %(name)s"
#: bookwyrm/templates/book/edit/edit_book.html:107
#: bookwyrm/templates/book/edit/edit_book.html:99
msgid "Is this an edition of an existing work?"
msgstr "Estce lédition dun ouvrage existant?"
#: bookwyrm/templates/book/edit/edit_book.html:115
#: bookwyrm/templates/book/edit/edit_book.html:107
msgid "This is a new work"
msgstr "Il sagit dun nouvel ouvrage."
#: bookwyrm/templates/book/edit/edit_book.html:124
#: bookwyrm/templates/book/edit/edit_book.html:116
#: 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:42
#: bookwyrm/templates/import/import.html:39
msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">Import/Export page</a> of your Goodreads account."
msgstr "Vous pouvez télécharger vos données Goodreads depuis la page <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">Import/Export</a> de votre compte Goodreads."
#: bookwyrm/templates/import/import.html:47
#: bookwyrm/templates/import/import.html:44
msgid "Data file:"
msgstr "Fichier de données:"
#: bookwyrm/templates/import/import.html:55
#: bookwyrm/templates/import/import.html:52
msgid "Include reviews"
msgstr "Importer les critiques"
#: bookwyrm/templates/import/import.html:60
#: bookwyrm/templates/import/import.html:57
msgid "Privacy setting for imported reviews:"
msgstr "Confidentialité des critiques importées:"
#: bookwyrm/templates/import/import.html:66
#: bookwyrm/templates/import/import.html:63
#: bookwyrm/templates/preferences/layout.html:31
#: bookwyrm/templates/settings/federation/instance_blocklist.html:76
msgid "Import"
msgstr "Importer"
#: bookwyrm/templates/import/import.html:71
#: bookwyrm/templates/import/import.html:68
msgid "Recent Imports"
msgstr "Importations récentes"
#: bookwyrm/templates/import/import.html:73
#: bookwyrm/templates/import/import.html:70
msgid "No recent imports"
msgstr "Aucune importation récente"
@ -5114,7 +5114,7 @@ msgstr "Ce fichier dépasse la taille limite: 10Mo"
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s (%(subtitle)s)"
#: bookwyrm/views/imports/import_data.py:70
#: bookwyrm/views/imports/import_data.py:67
msgid "Not a valid csv file"
msgstr "Fichier CSV non valide"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-23 21:04+0000\n"
"PO-Revision-Date: 2022-05-24 01:06\n"
"POT-Creation-Date: 2022-04-08 21:00+0000\n"
"PO-Revision-Date: 2022-04-09 14:02\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\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:18 bookwyrm/models/link.py:72
#: bookwyrm/models/base_model.py:17 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:19
#: bookwyrm/models/base_model.py:18
msgid "Self deletion"
msgstr "Auto eliminación"
#: bookwyrm/models/base_model.py:20
#: bookwyrm/models/base_model.py:19
msgid "Moderator suspension"
msgstr "Suspendido pola moderación"
#: bookwyrm/models/base_model.py:21
#: bookwyrm/models/base_model.py:20
msgid "Moderator deletion"
msgstr "Eliminado pola moderación"
#: bookwyrm/models/base_model.py:22
#: bookwyrm/models/base_model.py:21
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:135
#: bookwyrm/templates/book/edit/edit_book.html:127
#: 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:137
#: bookwyrm/templates/book/edit/edit_book.html:140
#: bookwyrm/templates/book/edit/edit_book.html:129
#: bookwyrm/templates/book/edit/edit_book.html:132
#: 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 <strong>%(source_name)s</strong> and check f
msgstr "Ao cargar os datos vas conectar con <strong>%(source_name)s</strong> 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:122
#: bookwyrm/templates/book/edit/edit_book.html:114
#: 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:62
#: bookwyrm/templates/book/edit/edit_book.html:54
msgid "Confirm Book Info"
msgstr "Confirma info do libro"
#: bookwyrm/templates/book/edit/edit_book.html:70
#: bookwyrm/templates/book/edit/edit_book.html:62
#, python-format
msgid "Is \"%(name)s\" one of these authors?"
msgstr "É \"%(name)s\" un destas autoras?"
#: bookwyrm/templates/book/edit/edit_book.html:81
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:73
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Author of "
msgstr "Autora de "
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Find more information at isni.org"
msgstr "Atopa máis información en isni.org"
#: bookwyrm/templates/book/edit/edit_book.html:93
#: bookwyrm/templates/book/edit/edit_book.html:85
msgid "This is a new author"
msgstr "Esta é unha nova autora"
#: bookwyrm/templates/book/edit/edit_book.html:100
#: bookwyrm/templates/book/edit/edit_book.html:92
#, python-format
msgid "Creating a new author: %(name)s"
msgstr "Creando nova autora: %(name)s"
#: bookwyrm/templates/book/edit/edit_book.html:107
#: bookwyrm/templates/book/edit/edit_book.html:99
msgid "Is this an edition of an existing work?"
msgstr "É esta a edición dun traballo existente?"
#: bookwyrm/templates/book/edit/edit_book.html:115
#: bookwyrm/templates/book/edit/edit_book.html:107
msgid "This is a new work"
msgstr "Este é un novo traballo"
#: bookwyrm/templates/book/edit/edit_book.html:124
#: bookwyrm/templates/book/edit/edit_book.html:116
#: 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:42
#: bookwyrm/templates/import/import.html:39
msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">Import/Export page</a> of your Goodreads account."
msgstr "Podes descargar os teus datos de Goodreads desde a <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">páxina de Exportación/Importación</a> da túa conta Goodreads."
#: bookwyrm/templates/import/import.html:47
#: bookwyrm/templates/import/import.html:44
msgid "Data file:"
msgstr "Ficheiro de datos:"
#: bookwyrm/templates/import/import.html:55
#: bookwyrm/templates/import/import.html:52
msgid "Include reviews"
msgstr "Incluír recensións"
#: bookwyrm/templates/import/import.html:60
#: bookwyrm/templates/import/import.html:57
msgid "Privacy setting for imported reviews:"
msgstr "Axuste de privacidade para recensións importadas:"
#: bookwyrm/templates/import/import.html:66
#: bookwyrm/templates/import/import.html:63
#: bookwyrm/templates/preferences/layout.html:31
#: bookwyrm/templates/settings/federation/instance_blocklist.html:76
msgid "Import"
msgstr "Importar"
#: bookwyrm/templates/import/import.html:71
#: bookwyrm/templates/import/import.html:68
msgid "Recent Imports"
msgstr "Importacións recentes"
#: bookwyrm/templates/import/import.html:73
#: bookwyrm/templates/import/import.html:70
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:70
#: bookwyrm/views/imports/import_data.py:67
msgid "Not a valid csv file"
msgstr "Non é un ficheiro csv válido"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-23 21:04+0000\n"
"PO-Revision-Date: 2022-05-24 01:06\n"
"POT-Creation-Date: 2022-04-08 21:00+0000\n"
"PO-Revision-Date: 2022-04-20 22:49\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\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:18 bookwyrm/models/link.py:72
#: bookwyrm/models/base_model.py:17 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:19
#: bookwyrm/models/base_model.py:18
msgid "Self deletion"
msgstr "Eliminazione automatica"
#: bookwyrm/models/base_model.py:20
#: bookwyrm/models/base_model.py:19
msgid "Moderator suspension"
msgstr "Sospensione del moderatore"
#: bookwyrm/models/base_model.py:21
#: bookwyrm/models/base_model.py:20
msgid "Moderator deletion"
msgstr "Cancellazione del moderatore"
#: bookwyrm/models/base_model.py:22
#: bookwyrm/models/base_model.py:21
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:135
#: bookwyrm/templates/book/edit/edit_book.html:127
#: 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:137
#: bookwyrm/templates/book/edit/edit_book.html:140
#: bookwyrm/templates/book/edit/edit_book.html:129
#: bookwyrm/templates/book/edit/edit_book.html:132
#: 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 <strong>%(source_name)s</strong> and check f
msgstr "Il caricamento dei dati si collegherà a <strong>%(source_name)s</strong> 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:122
#: bookwyrm/templates/book/edit/edit_book.html:114
#: 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:62
#: bookwyrm/templates/book/edit/edit_book.html:54
msgid "Confirm Book Info"
msgstr "Conferma informazioni sul libro"
#: bookwyrm/templates/book/edit/edit_book.html:70
#: bookwyrm/templates/book/edit/edit_book.html:62
#, python-format
msgid "Is \"%(name)s\" one of these authors?"
msgstr "È \"%(name)s\" uno di questi autori?"
#: bookwyrm/templates/book/edit/edit_book.html:81
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:73
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Author of "
msgstr "Autore di "
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Find more information at isni.org"
msgstr "Trova maggiori informazioni su isni.org"
#: bookwyrm/templates/book/edit/edit_book.html:93
#: bookwyrm/templates/book/edit/edit_book.html:85
msgid "This is a new author"
msgstr "Questo è un nuovo autore"
#: bookwyrm/templates/book/edit/edit_book.html:100
#: bookwyrm/templates/book/edit/edit_book.html:92
#, python-format
msgid "Creating a new author: %(name)s"
msgstr "Creazione di un nuovo autore: %(name)s"
#: bookwyrm/templates/book/edit/edit_book.html:107
#: bookwyrm/templates/book/edit/edit_book.html:99
msgid "Is this an edition of an existing work?"
msgstr "È un'edizione di un'opera esistente?"
#: bookwyrm/templates/book/edit/edit_book.html:115
#: bookwyrm/templates/book/edit/edit_book.html:107
msgid "This is a new work"
msgstr "Si tratta di un nuovo lavoro"
#: bookwyrm/templates/book/edit/edit_book.html:124
#: bookwyrm/templates/book/edit/edit_book.html:116
#: 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:42
#: bookwyrm/templates/import/import.html:39
msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">Import/Export page</a> of your Goodreads account."
msgstr "Puoi scaricare i tuoi dati Goodreads dalla pagina <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">\"Importa/Esporta\"</a> del tuo account Goodreads."
#: bookwyrm/templates/import/import.html:47
#: bookwyrm/templates/import/import.html:44
msgid "Data file:"
msgstr "Dati file:"
#: bookwyrm/templates/import/import.html:55
#: bookwyrm/templates/import/import.html:52
msgid "Include reviews"
msgstr "Includi recensioni"
#: bookwyrm/templates/import/import.html:60
#: bookwyrm/templates/import/import.html:57
msgid "Privacy setting for imported reviews:"
msgstr "Impostazione della privacy per le recensioni importate:"
#: bookwyrm/templates/import/import.html:66
#: bookwyrm/templates/import/import.html:63
#: bookwyrm/templates/preferences/layout.html:31
#: bookwyrm/templates/settings/federation/instance_blocklist.html:76
msgid "Import"
msgstr "Importa"
#: bookwyrm/templates/import/import.html:71
#: bookwyrm/templates/import/import.html:68
msgid "Recent Imports"
msgstr "Importazioni recenti"
#: bookwyrm/templates/import/import.html:73
#: bookwyrm/templates/import/import.html:70
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:70
#: bookwyrm/views/imports/import_data.py:67
msgid "Not a valid csv file"
msgstr "Non è un file di csv valido"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-23 21:04+0000\n"
"PO-Revision-Date: 2022-05-24 01:06\n"
"POT-Creation-Date: 2022-04-08 21:00+0000\n"
"PO-Revision-Date: 2022-04-10 07:54\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\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:18 bookwyrm/models/link.py:72
#: bookwyrm/models/base_model.py:17 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:19
#: bookwyrm/models/base_model.py:18
msgid "Self deletion"
msgstr "Išsitrina savaime"
#: bookwyrm/models/base_model.py:20
#: bookwyrm/models/base_model.py:19
msgid "Moderator suspension"
msgstr "Moderatorius nutraukė"
#: bookwyrm/models/base_model.py:21
#: bookwyrm/models/base_model.py:20
msgid "Moderator deletion"
msgstr "Moderatorius ištrynė"
#: bookwyrm/models/base_model.py:22
#: bookwyrm/models/base_model.py:21
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:135
#: bookwyrm/templates/book/edit/edit_book.html:127
#: 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:137
#: bookwyrm/templates/book/edit/edit_book.html:140
#: bookwyrm/templates/book/edit/edit_book.html:129
#: bookwyrm/templates/book/edit/edit_book.html:132
#: 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 <strong>%(source_name)s</strong> and check f
msgstr "Duomenų įkėlimas prisijungs prie <strong>%(source_name)s</strong> 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:122
#: bookwyrm/templates/book/edit/edit_book.html:114
#: 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:62
#: bookwyrm/templates/book/edit/edit_book.html:54
msgid "Confirm Book Info"
msgstr "Patvirtinti knygos informaciją"
#: bookwyrm/templates/book/edit/edit_book.html:70
#: bookwyrm/templates/book/edit/edit_book.html:62
#, 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:81
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:73
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Author of "
msgstr "Autorius "
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Find more information at isni.org"
msgstr "Daugiau informacijos isni.org"
#: bookwyrm/templates/book/edit/edit_book.html:93
#: bookwyrm/templates/book/edit/edit_book.html:85
msgid "This is a new author"
msgstr "Tai naujas autorius"
#: bookwyrm/templates/book/edit/edit_book.html:100
#: bookwyrm/templates/book/edit/edit_book.html:92
#, python-format
msgid "Creating a new author: %(name)s"
msgstr "Kuriamas naujas autorius: %(name)s"
#: bookwyrm/templates/book/edit/edit_book.html:107
#: bookwyrm/templates/book/edit/edit_book.html:99
msgid "Is this an edition of an existing work?"
msgstr "Ar tai egzistuojančio darbo leidimas?"
#: bookwyrm/templates/book/edit/edit_book.html:115
#: bookwyrm/templates/book/edit/edit_book.html:107
msgid "This is a new work"
msgstr "Tai naujas darbas"
#: bookwyrm/templates/book/edit/edit_book.html:124
#: bookwyrm/templates/book/edit/edit_book.html:116
#: 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:42
#: bookwyrm/templates/import/import.html:39
msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">Import/Export page</a> of your Goodreads account."
msgstr "Galite atsisiųsti savo „Goodreads“ duomenis iš <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">Importavimo ir eksportavimo puslapio</a>, esančio jūsų „Goodreads“ paskyroje."
#: bookwyrm/templates/import/import.html:47
#: bookwyrm/templates/import/import.html:44
msgid "Data file:"
msgstr "Duomenų failas:"
#: bookwyrm/templates/import/import.html:55
#: bookwyrm/templates/import/import.html:52
msgid "Include reviews"
msgstr "Įtraukti atsiliepimus"
#: bookwyrm/templates/import/import.html:60
#: bookwyrm/templates/import/import.html:57
msgid "Privacy setting for imported reviews:"
msgstr "Privatumo nustatymai svarbiems atsiliepimams:"
#: bookwyrm/templates/import/import.html:66
#: bookwyrm/templates/import/import.html:63
#: bookwyrm/templates/preferences/layout.html:31
#: bookwyrm/templates/settings/federation/instance_blocklist.html:76
msgid "Import"
msgstr "Importuoti"
#: bookwyrm/templates/import/import.html:71
#: bookwyrm/templates/import/import.html:68
msgid "Recent Imports"
msgstr "Pastaruoju metu importuota"
#: bookwyrm/templates/import/import.html:73
#: bookwyrm/templates/import/import.html:70
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:70
#: bookwyrm/views/imports/import_data.py:67
msgid "Not a valid csv file"
msgstr "Netinkamas csv failas"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-23 21:04+0000\n"
"PO-Revision-Date: 2022-05-24 01:06\n"
"POT-Creation-Date: 2022-04-08 21:00+0000\n"
"PO-Revision-Date: 2022-04-08 21:50\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Norwegian\n"
"Language: no\n"
@ -121,25 +121,25 @@ msgstr ""
msgid "Automatically generated report"
msgstr ""
#: bookwyrm/models/base_model.py:18 bookwyrm/models/link.py:72
#: bookwyrm/models/base_model.py:17 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:19
#: bookwyrm/models/base_model.py:18
msgid "Self deletion"
msgstr "Selvsletting"
#: bookwyrm/models/base_model.py:20
#: bookwyrm/models/base_model.py:19
msgid "Moderator suspension"
msgstr "Moderatør suspensjon"
#: bookwyrm/models/base_model.py:21
#: bookwyrm/models/base_model.py:20
msgid "Moderator deletion"
msgstr "Moderatør sletting"
#: bookwyrm/models/base_model.py:22
#: bookwyrm/models/base_model.py:21
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:135
#: bookwyrm/templates/book/edit/edit_book.html:127
#: 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:137
#: bookwyrm/templates/book/edit/edit_book.html:140
#: bookwyrm/templates/book/edit/edit_book.html:129
#: bookwyrm/templates/book/edit/edit_book.html:132
#: 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 <strong>%(source_name)s</strong> and check f
msgstr "Laster inn data kobler til <strong>%(source_name)s</strong> 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:122
#: bookwyrm/templates/book/edit/edit_book.html:114
#: 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:62
#: bookwyrm/templates/book/edit/edit_book.html:54
msgid "Confirm Book Info"
msgstr "Bekreft bokinformasjon"
#: bookwyrm/templates/book/edit/edit_book.html:70
#: bookwyrm/templates/book/edit/edit_book.html:62
#, 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:81
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:73
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Author of "
msgstr "Forfatter av "
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Find more information at isni.org"
msgstr "Finn mer informasjon på isni.org"
#: bookwyrm/templates/book/edit/edit_book.html:93
#: bookwyrm/templates/book/edit/edit_book.html:85
msgid "This is a new author"
msgstr "Dette er en ny forfatter"
#: bookwyrm/templates/book/edit/edit_book.html:100
#: bookwyrm/templates/book/edit/edit_book.html:92
#, python-format
msgid "Creating a new author: %(name)s"
msgstr "Oppretter en ny forfatter: %(name)s"
#: bookwyrm/templates/book/edit/edit_book.html:107
#: bookwyrm/templates/book/edit/edit_book.html:99
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:115
#: bookwyrm/templates/book/edit/edit_book.html:107
msgid "This is a new work"
msgstr "Dette er et nytt verk"
#: bookwyrm/templates/book/edit/edit_book.html:124
#: bookwyrm/templates/book/edit/edit_book.html:116
#: 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:42
#: bookwyrm/templates/import/import.html:39
msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">Import/Export page</a> of your Goodreads account."
msgstr "Du kan laste ned Goodread-dataene dine fra <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">Import/Export sida</a> på Goodread-kontoen din."
#: bookwyrm/templates/import/import.html:47
#: bookwyrm/templates/import/import.html:44
msgid "Data file:"
msgstr "Datafil:"
#: bookwyrm/templates/import/import.html:55
#: bookwyrm/templates/import/import.html:52
msgid "Include reviews"
msgstr "Inkluder anmeldelser"
#: bookwyrm/templates/import/import.html:60
#: bookwyrm/templates/import/import.html:57
msgid "Privacy setting for imported reviews:"
msgstr "Personverninnstilling for importerte anmeldelser:"
#: bookwyrm/templates/import/import.html:66
#: bookwyrm/templates/import/import.html:63
#: bookwyrm/templates/preferences/layout.html:31
#: bookwyrm/templates/settings/federation/instance_blocklist.html:76
msgid "Import"
msgstr "Importér"
#: bookwyrm/templates/import/import.html:71
#: bookwyrm/templates/import/import.html:68
msgid "Recent Imports"
msgstr "Nylig importer"
#: bookwyrm/templates/import/import.html:73
#: bookwyrm/templates/import/import.html:70
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:70
#: bookwyrm/views/imports/import_data.py:67
msgid "Not a valid csv file"
msgstr "Ikke en gyldig csv-fil"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-23 21:04+0000\n"
"PO-Revision-Date: 2022-05-24 01:06\n"
"POT-Creation-Date: 2022-04-08 21:00+0000\n"
"PO-Revision-Date: 2022-04-08 23:12\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\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:18 bookwyrm/models/link.py:72
#: bookwyrm/models/base_model.py:17 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:19
#: bookwyrm/models/base_model.py:18
msgid "Self deletion"
msgstr "Autoexclusão"
#: bookwyrm/models/base_model.py:20
#: bookwyrm/models/base_model.py:19
msgid "Moderator suspension"
msgstr "Suspensão de moderador"
#: bookwyrm/models/base_model.py:21
#: bookwyrm/models/base_model.py:20
msgid "Moderator deletion"
msgstr "Exclusão de moderador"
#: bookwyrm/models/base_model.py:22
#: bookwyrm/models/base_model.py:21
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:135
#: bookwyrm/templates/book/edit/edit_book.html:127
#: 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:137
#: bookwyrm/templates/book/edit/edit_book.html:140
#: bookwyrm/templates/book/edit/edit_book.html:129
#: bookwyrm/templates/book/edit/edit_book.html:132
#: 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 <strong>%(source_name)s</strong> and check f
msgstr "Para carregar informações nos conectaremos a <strong>%(source_name)s</strong> 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:122
#: bookwyrm/templates/book/edit/edit_book.html:114
#: 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:62
#: bookwyrm/templates/book/edit/edit_book.html:54
msgid "Confirm Book Info"
msgstr "Confirmar informações do livro"
#: bookwyrm/templates/book/edit/edit_book.html:70
#: bookwyrm/templates/book/edit/edit_book.html:62
#, 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:81
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:73
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Author of "
msgstr "Autor/a de "
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Find more information at isni.org"
msgstr "Conheça mais em isni.org"
#: bookwyrm/templates/book/edit/edit_book.html:93
#: bookwyrm/templates/book/edit/edit_book.html:85
msgid "This is a new author"
msgstr "É um/a novo/a autor/a"
#: bookwyrm/templates/book/edit/edit_book.html:100
#: bookwyrm/templates/book/edit/edit_book.html:92
#, 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:107
#: bookwyrm/templates/book/edit/edit_book.html:99
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:115
#: bookwyrm/templates/book/edit/edit_book.html:107
msgid "This is a new work"
msgstr "É uma nova obra"
#: bookwyrm/templates/book/edit/edit_book.html:124
#: bookwyrm/templates/book/edit/edit_book.html:116
#: 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:42
#: bookwyrm/templates/import/import.html:39
msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">Import/Export page</a> of your Goodreads account."
msgstr "Você pode baixar seus dados do Goodreads na <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">página de Importar/Exportar</a> da sua conta."
#: bookwyrm/templates/import/import.html:47
#: bookwyrm/templates/import/import.html:44
msgid "Data file:"
msgstr "Arquivo de dados:"
#: bookwyrm/templates/import/import.html:55
#: bookwyrm/templates/import/import.html:52
msgid "Include reviews"
msgstr "Incluir resenhas"
#: bookwyrm/templates/import/import.html:60
#: bookwyrm/templates/import/import.html:57
msgid "Privacy setting for imported reviews:"
msgstr "Configurações de privacidade para resenhas importadas:"
#: bookwyrm/templates/import/import.html:66
#: bookwyrm/templates/import/import.html:63
#: bookwyrm/templates/preferences/layout.html:31
#: bookwyrm/templates/settings/federation/instance_blocklist.html:76
msgid "Import"
msgstr "Importar"
#: bookwyrm/templates/import/import.html:71
#: bookwyrm/templates/import/import.html:68
msgid "Recent Imports"
msgstr "Importações recentes"
#: bookwyrm/templates/import/import.html:73
#: bookwyrm/templates/import/import.html:70
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:70
#: bookwyrm/views/imports/import_data.py:67
msgid "Not a valid csv file"
msgstr "Não é um arquivo csv válido"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-23 21:04+0000\n"
"PO-Revision-Date: 2022-05-24 01:06\n"
"POT-Creation-Date: 2022-04-08 21:00+0000\n"
"PO-Revision-Date: 2022-05-06 23:27\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\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:18 bookwyrm/models/link.py:72
#: bookwyrm/models/base_model.py:17 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:19
#: bookwyrm/models/base_model.py:18
msgid "Self deletion"
msgstr "Auto-exclusão"
#: bookwyrm/models/base_model.py:20
#: bookwyrm/models/base_model.py:19
msgid "Moderator suspension"
msgstr "Suspensão do moderador"
#: bookwyrm/models/base_model.py:21
#: bookwyrm/models/base_model.py:20
msgid "Moderator deletion"
msgstr "Exclusão do moderador"
#: bookwyrm/models/base_model.py:22
#: bookwyrm/models/base_model.py:21
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:135
#: bookwyrm/templates/book/edit/edit_book.html:127
#: 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:137
#: bookwyrm/templates/book/edit/edit_book.html:140
#: bookwyrm/templates/book/edit/edit_book.html:129
#: bookwyrm/templates/book/edit/edit_book.html:132
#: 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 <strong>%(source_name)s</strong> and check f
msgstr "Carregar os dados irá conectar a <strong>%(source_name)s</strong> 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:122
#: bookwyrm/templates/book/edit/edit_book.html:114
#: 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:62
#: bookwyrm/templates/book/edit/edit_book.html:54
msgid "Confirm Book Info"
msgstr "Confirmar informações do livro"
#: bookwyrm/templates/book/edit/edit_book.html:70
#: bookwyrm/templates/book/edit/edit_book.html:62
#, python-format
msgid "Is \"%(name)s\" one of these authors?"
msgstr "\"%(name)s\" é um destes autores?"
#: bookwyrm/templates/book/edit/edit_book.html:81
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:73
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Author of "
msgstr "Autor de "
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Find more information at isni.org"
msgstr "Podes encontrar mais informações em isni.org"
#: bookwyrm/templates/book/edit/edit_book.html:93
#: bookwyrm/templates/book/edit/edit_book.html:85
msgid "This is a new author"
msgstr "Este é um novo autor"
#: bookwyrm/templates/book/edit/edit_book.html:100
#: bookwyrm/templates/book/edit/edit_book.html:92
#, python-format
msgid "Creating a new author: %(name)s"
msgstr "Criar um novo autor: %(name)s"
#: bookwyrm/templates/book/edit/edit_book.html:107
#: bookwyrm/templates/book/edit/edit_book.html:99
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:115
#: bookwyrm/templates/book/edit/edit_book.html:107
msgid "This is a new work"
msgstr "Este é um novo trabalho"
#: bookwyrm/templates/book/edit/edit_book.html:124
#: bookwyrm/templates/book/edit/edit_book.html:116
#: 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:42
#: bookwyrm/templates/import/import.html:39
msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">Import/Export page</a> of your Goodreads account."
msgstr "Podes fazer download dos teus dados do Goodreads na <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">Importar/Exportar página</a> da tua conta do Goodreads."
#: bookwyrm/templates/import/import.html:47
#: bookwyrm/templates/import/import.html:44
msgid "Data file:"
msgstr "Ficheiro de dados:"
#: bookwyrm/templates/import/import.html:55
#: bookwyrm/templates/import/import.html:52
msgid "Include reviews"
msgstr "Incluir criticas"
#: bookwyrm/templates/import/import.html:60
#: bookwyrm/templates/import/import.html:57
msgid "Privacy setting for imported reviews:"
msgstr "Configuração de privacidade para criticas importadas:"
#: bookwyrm/templates/import/import.html:66
#: bookwyrm/templates/import/import.html:63
#: bookwyrm/templates/preferences/layout.html:31
#: bookwyrm/templates/settings/federation/instance_blocklist.html:76
msgid "Import"
msgstr "Importar"
#: bookwyrm/templates/import/import.html:71
#: bookwyrm/templates/import/import.html:68
msgid "Recent Imports"
msgstr "Importações recentes"
#: bookwyrm/templates/import/import.html:73
#: bookwyrm/templates/import/import.html:70
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:70
#: bookwyrm/views/imports/import_data.py:67
msgid "Not a valid csv file"
msgstr "Não é um ficheiro csv válido"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-23 21:04+0000\n"
"PO-Revision-Date: 2022-05-24 01:06\n"
"POT-Creation-Date: 2022-04-08 21:00+0000\n"
"PO-Revision-Date: 2022-05-16 21:13\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\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:18 bookwyrm/models/link.py:72
#: bookwyrm/models/base_model.py:17 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:19
#: bookwyrm/models/base_model.py:18
msgid "Self deletion"
msgstr "Ștergere automată"
#: bookwyrm/models/base_model.py:20
#: bookwyrm/models/base_model.py:19
msgid "Moderator suspension"
msgstr "Suspendat de moderator"
#: bookwyrm/models/base_model.py:21
#: bookwyrm/models/base_model.py:20
msgid "Moderator deletion"
msgstr "Șters de moderator"
#: bookwyrm/models/base_model.py:22
#: bookwyrm/models/base_model.py:21
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:135
#: bookwyrm/templates/book/edit/edit_book.html:127
#: 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:137
#: bookwyrm/templates/book/edit/edit_book.html:140
#: bookwyrm/templates/book/edit/edit_book.html:129
#: bookwyrm/templates/book/edit/edit_book.html:132
#: 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 <strong>%(source_name)s</strong> and check f
msgstr "Încărcatul de date se va conecta la <strong>%(source_name)s</strong> ș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:122
#: bookwyrm/templates/book/edit/edit_book.html:114
#: 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:62
#: bookwyrm/templates/book/edit/edit_book.html:54
msgid "Confirm Book Info"
msgstr "Confirmați informațiile cărții"
#: bookwyrm/templates/book/edit/edit_book.html:70
#: bookwyrm/templates/book/edit/edit_book.html:62
#, 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:81
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:73
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Author of "
msgstr "Autor al "
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Find more information at isni.org"
msgstr "Aflați mai multe la isni.org"
#: bookwyrm/templates/book/edit/edit_book.html:93
#: bookwyrm/templates/book/edit/edit_book.html:85
msgid "This is a new author"
msgstr "Acesta este un autor nou"
#: bookwyrm/templates/book/edit/edit_book.html:100
#: bookwyrm/templates/book/edit/edit_book.html:92
#, python-format
msgid "Creating a new author: %(name)s"
msgstr "Creați un autor nou: %(name)s"
#: bookwyrm/templates/book/edit/edit_book.html:107
#: bookwyrm/templates/book/edit/edit_book.html:99
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:115
#: bookwyrm/templates/book/edit/edit_book.html:107
msgid "This is a new work"
msgstr "Aceasta este o operă nouă"
#: bookwyrm/templates/book/edit/edit_book.html:124
#: bookwyrm/templates/book/edit/edit_book.html:116
#: 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:42
#: bookwyrm/templates/import/import.html:39
msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">Import/Export page</a> of your Goodreads account."
msgstr "Puteți descărca datele dvs. GoodReads de pe <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">pagina Import/Export</a> a contului dvs. GoodReads."
#: bookwyrm/templates/import/import.html:47
#: bookwyrm/templates/import/import.html:44
msgid "Data file:"
msgstr "Fișierul de date:"
#: bookwyrm/templates/import/import.html:55
#: bookwyrm/templates/import/import.html:52
msgid "Include reviews"
msgstr "Includeți recenzii"
#: bookwyrm/templates/import/import.html:60
#: bookwyrm/templates/import/import.html:57
msgid "Privacy setting for imported reviews:"
msgstr "Setare de confidențialitate pentru recenziile importate:"
#: bookwyrm/templates/import/import.html:66
#: bookwyrm/templates/import/import.html:63
#: bookwyrm/templates/preferences/layout.html:31
#: bookwyrm/templates/settings/federation/instance_blocklist.html:76
msgid "Import"
msgstr "Importați"
#: bookwyrm/templates/import/import.html:71
#: bookwyrm/templates/import/import.html:68
msgid "Recent Imports"
msgstr "Importuri recente"
#: bookwyrm/templates/import/import.html:73
#: bookwyrm/templates/import/import.html:70
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:70
#: bookwyrm/views/imports/import_data.py:67
msgid "Not a valid csv file"
msgstr "Nu este un fișier csv valid"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-23 21:04+0000\n"
"PO-Revision-Date: 2022-05-24 01:06\n"
"POT-Creation-Date: 2022-04-08 21:00+0000\n"
"PO-Revision-Date: 2022-04-08 21:50\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\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:18 bookwyrm/models/link.py:72
#: bookwyrm/models/base_model.py:17 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:19
#: bookwyrm/models/base_model.py:18
msgid "Self deletion"
msgstr "Självborttagning"
#: bookwyrm/models/base_model.py:20
#: bookwyrm/models/base_model.py:19
msgid "Moderator suspension"
msgstr "Moderator-avstängning"
#: bookwyrm/models/base_model.py:21
#: bookwyrm/models/base_model.py:20
msgid "Moderator deletion"
msgstr "Borttagning av moderator"
#: bookwyrm/models/base_model.py:22
#: bookwyrm/models/base_model.py:21
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:135
#: bookwyrm/templates/book/edit/edit_book.html:127
#: 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:137
#: bookwyrm/templates/book/edit/edit_book.html:140
#: bookwyrm/templates/book/edit/edit_book.html:129
#: bookwyrm/templates/book/edit/edit_book.html:132
#: 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 <strong>%(source_name)s</strong> and check f
msgstr "Att ladda in data kommer att ansluta till <strong>%(source_name)s</strong> 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:122
#: bookwyrm/templates/book/edit/edit_book.html:114
#: 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:62
#: bookwyrm/templates/book/edit/edit_book.html:54
msgid "Confirm Book Info"
msgstr "Bekräfta bokens info"
#: bookwyrm/templates/book/edit/edit_book.html:70
#: bookwyrm/templates/book/edit/edit_book.html:62
#, 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:81
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:73
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Author of "
msgstr "Författare av "
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Find more information at isni.org"
msgstr "Hitta mer information på isni.org"
#: bookwyrm/templates/book/edit/edit_book.html:93
#: bookwyrm/templates/book/edit/edit_book.html:85
msgid "This is a new author"
msgstr "Det här är en ny författare"
#: bookwyrm/templates/book/edit/edit_book.html:100
#: bookwyrm/templates/book/edit/edit_book.html:92
#, python-format
msgid "Creating a new author: %(name)s"
msgstr "Skapar en ny författare: %(name)s"
#: bookwyrm/templates/book/edit/edit_book.html:107
#: bookwyrm/templates/book/edit/edit_book.html:99
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:115
#: bookwyrm/templates/book/edit/edit_book.html:107
msgid "This is a new work"
msgstr "Det här är ett nytt verk"
#: bookwyrm/templates/book/edit/edit_book.html:124
#: bookwyrm/templates/book/edit/edit_book.html:116
#: 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:42
#: bookwyrm/templates/import/import.html:39
msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">Import/Export page</a> of your Goodreads account."
msgstr "Du kan ladda ner Goodreads-data från <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">Import/Export-sidan</a> på ditt Goodreads-konto."
#: bookwyrm/templates/import/import.html:47
#: bookwyrm/templates/import/import.html:44
msgid "Data file:"
msgstr "Datafil:"
#: bookwyrm/templates/import/import.html:55
#: bookwyrm/templates/import/import.html:52
msgid "Include reviews"
msgstr "Inkludera recensioner"
#: bookwyrm/templates/import/import.html:60
#: bookwyrm/templates/import/import.html:57
msgid "Privacy setting for imported reviews:"
msgstr "Integritetsinställning för importerade recensioner:"
#: bookwyrm/templates/import/import.html:66
#: bookwyrm/templates/import/import.html:63
#: bookwyrm/templates/preferences/layout.html:31
#: bookwyrm/templates/settings/federation/instance_blocklist.html:76
msgid "Import"
msgstr "Importera"
#: bookwyrm/templates/import/import.html:71
#: bookwyrm/templates/import/import.html:68
msgid "Recent Imports"
msgstr "Senaste importer"
#: bookwyrm/templates/import/import.html:73
#: bookwyrm/templates/import/import.html:70
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:70
#: bookwyrm/views/imports/import_data.py:67
msgid "Not a valid csv file"
msgstr "Inte en giltig csv-fil"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-23 21:04+0000\n"
"PO-Revision-Date: 2022-05-24 01:06\n"
"POT-Creation-Date: 2022-04-08 21:00+0000\n"
"PO-Revision-Date: 2022-04-29 14:20\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Chinese Simplified\n"
"Language: zh\n"
@ -121,25 +121,25 @@ msgstr "危险"
msgid "Automatically generated report"
msgstr "自动生成的举报"
#: bookwyrm/models/base_model.py:18 bookwyrm/models/link.py:72
#: bookwyrm/models/base_model.py:17 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:19
#: bookwyrm/models/base_model.py:18
msgid "Self deletion"
msgstr "自我删除"
#: bookwyrm/models/base_model.py:20
#: bookwyrm/models/base_model.py:19
msgid "Moderator suspension"
msgstr "仲裁员停用"
#: bookwyrm/models/base_model.py:21
#: bookwyrm/models/base_model.py:20
msgid "Moderator deletion"
msgstr "仲裁员删除"
#: bookwyrm/models/base_model.py:22
#: bookwyrm/models/base_model.py:21
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:135
#: bookwyrm/templates/book/edit/edit_book.html:127
#: 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:137
#: bookwyrm/templates/book/edit/edit_book.html:140
#: bookwyrm/templates/book/edit/edit_book.html:129
#: bookwyrm/templates/book/edit/edit_book.html:132
#: 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 <strong>%(source_name)s</strong> and check f
msgstr "加载数据会连接到 <strong>%(source_name)s</strong> 并检查这里还没有记录的与作者相关的元数据。现存的元数据不会被覆盖。"
#: bookwyrm/templates/author/sync_modal.html:24
#: bookwyrm/templates/book/edit/edit_book.html:122
#: bookwyrm/templates/book/edit/edit_book.html:114
#: 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:62
#: bookwyrm/templates/book/edit/edit_book.html:54
msgid "Confirm Book Info"
msgstr "确认书目信息"
#: bookwyrm/templates/book/edit/edit_book.html:70
#: bookwyrm/templates/book/edit/edit_book.html:62
#, python-format
msgid "Is \"%(name)s\" one of these authors?"
msgstr "“%(name)s” 是这些作者之一吗?"
#: bookwyrm/templates/book/edit/edit_book.html:81
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:73
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Author of "
msgstr "所著书有 "
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Find more information at isni.org"
msgstr "在 isni.org 查找更多信息"
#: bookwyrm/templates/book/edit/edit_book.html:93
#: bookwyrm/templates/book/edit/edit_book.html:85
msgid "This is a new author"
msgstr "这是一位新的作者"
#: bookwyrm/templates/book/edit/edit_book.html:100
#: bookwyrm/templates/book/edit/edit_book.html:92
#, python-format
msgid "Creating a new author: %(name)s"
msgstr "正在创建新的作者: %(name)s"
#: bookwyrm/templates/book/edit/edit_book.html:107
#: bookwyrm/templates/book/edit/edit_book.html:99
msgid "Is this an edition of an existing work?"
msgstr "这是已存在的作品的一个版本吗?"
#: bookwyrm/templates/book/edit/edit_book.html:115
#: bookwyrm/templates/book/edit/edit_book.html:107
msgid "This is a new work"
msgstr "这是一个新的作品。"
#: bookwyrm/templates/book/edit/edit_book.html:124
#: bookwyrm/templates/book/edit/edit_book.html:116
#: bookwyrm/templates/feed/status.html:21
msgid "Back"
msgstr "返回"
@ -1960,33 +1960,33 @@ msgstr "导入书目"
msgid "Data source:"
msgstr "数据来源:"
#: bookwyrm/templates/import/import.html:42
#: bookwyrm/templates/import/import.html:39
msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">Import/Export page</a> of your Goodreads account."
msgstr "您可以从 <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">Import/Export page</a> 下载或导出您的 Goodread 数据。"
#: bookwyrm/templates/import/import.html:47
#: bookwyrm/templates/import/import.html:44
msgid "Data file:"
msgstr "数据文件:"
#: bookwyrm/templates/import/import.html:55
#: bookwyrm/templates/import/import.html:52
msgid "Include reviews"
msgstr "纳入书评"
#: bookwyrm/templates/import/import.html:60
#: bookwyrm/templates/import/import.html:57
msgid "Privacy setting for imported reviews:"
msgstr "导入书评的隐私设定"
#: bookwyrm/templates/import/import.html:66
#: bookwyrm/templates/import/import.html:63
#: bookwyrm/templates/preferences/layout.html:31
#: bookwyrm/templates/settings/federation/instance_blocklist.html:76
msgid "Import"
msgstr "导入"
#: bookwyrm/templates/import/import.html:71
#: bookwyrm/templates/import/import.html:68
msgid "Recent Imports"
msgstr "最近的导入"
#: bookwyrm/templates/import/import.html:73
#: bookwyrm/templates/import/import.html:70
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:70
#: bookwyrm/views/imports/import_data.py:67
msgid "Not a valid csv file"
msgstr "不是有效的 csv 文件"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-23 21:04+0000\n"
"PO-Revision-Date: 2022-05-24 01:06\n"
"POT-Creation-Date: 2022-04-08 21:00+0000\n"
"PO-Revision-Date: 2022-04-08 21:50\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Chinese Traditional\n"
"Language: zh\n"
@ -121,25 +121,25 @@ msgstr ""
msgid "Automatically generated report"
msgstr ""
#: bookwyrm/models/base_model.py:18 bookwyrm/models/link.py:72
#: bookwyrm/models/base_model.py:17 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:19
#: bookwyrm/models/base_model.py:18
msgid "Self deletion"
msgstr ""
#: bookwyrm/models/base_model.py:20
#: bookwyrm/models/base_model.py:19
msgid "Moderator suspension"
msgstr ""
#: bookwyrm/models/base_model.py:21
#: bookwyrm/models/base_model.py:20
msgid "Moderator deletion"
msgstr ""
#: bookwyrm/models/base_model.py:22
#: bookwyrm/models/base_model.py:21
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:135
#: bookwyrm/templates/book/edit/edit_book.html:127
#: 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:137
#: bookwyrm/templates/book/edit/edit_book.html:140
#: bookwyrm/templates/book/edit/edit_book.html:129
#: bookwyrm/templates/book/edit/edit_book.html:132
#: 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 <strong>%(source_name)s</strong> and check f
msgstr ""
#: bookwyrm/templates/author/sync_modal.html:24
#: bookwyrm/templates/book/edit/edit_book.html:122
#: bookwyrm/templates/book/edit/edit_book.html:114
#: 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:62
#: bookwyrm/templates/book/edit/edit_book.html:54
msgid "Confirm Book Info"
msgstr "確認書目資料"
#: bookwyrm/templates/book/edit/edit_book.html:70
#: bookwyrm/templates/book/edit/edit_book.html:62
#, python-format
msgid "Is \"%(name)s\" one of these authors?"
msgstr ""
#: bookwyrm/templates/book/edit/edit_book.html:81
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:73
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Author of "
msgstr ""
#: bookwyrm/templates/book/edit/edit_book.html:83
#: bookwyrm/templates/book/edit/edit_book.html:75
msgid "Find more information at isni.org"
msgstr ""
#: bookwyrm/templates/book/edit/edit_book.html:93
#: bookwyrm/templates/book/edit/edit_book.html:85
msgid "This is a new author"
msgstr "這是一位新的作者"
#: bookwyrm/templates/book/edit/edit_book.html:100
#: bookwyrm/templates/book/edit/edit_book.html:92
#, python-format
msgid "Creating a new author: %(name)s"
msgstr "正在建立新的作者: %(name)s"
#: bookwyrm/templates/book/edit/edit_book.html:107
#: bookwyrm/templates/book/edit/edit_book.html:99
msgid "Is this an edition of an existing work?"
msgstr "這是已存在的作品的另一個版本嗎?"
#: bookwyrm/templates/book/edit/edit_book.html:115
#: bookwyrm/templates/book/edit/edit_book.html:107
msgid "This is a new work"
msgstr "這是一個新的作品。"
#: bookwyrm/templates/book/edit/edit_book.html:124
#: bookwyrm/templates/book/edit/edit_book.html:116
#: bookwyrm/templates/feed/status.html:21
msgid "Back"
msgstr "返回"
@ -1960,33 +1960,33 @@ msgstr "匯入書目"
msgid "Data source:"
msgstr "資料來源:"
#: bookwyrm/templates/import/import.html:42
#: bookwyrm/templates/import/import.html:39
msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">Import/Export page</a> of your Goodreads account."
msgstr ""
#: bookwyrm/templates/import/import.html:47
#: bookwyrm/templates/import/import.html:44
msgid "Data file:"
msgstr "資料檔案:"
#: bookwyrm/templates/import/import.html:55
#: bookwyrm/templates/import/import.html:52
msgid "Include reviews"
msgstr "納入書評"
#: bookwyrm/templates/import/import.html:60
#: bookwyrm/templates/import/import.html:57
msgid "Privacy setting for imported reviews:"
msgstr "匯入書評的隱私設定"
#: bookwyrm/templates/import/import.html:66
#: bookwyrm/templates/import/import.html:63
#: bookwyrm/templates/preferences/layout.html:31
#: bookwyrm/templates/settings/federation/instance_blocklist.html:76
msgid "Import"
msgstr "匯入"
#: bookwyrm/templates/import/import.html:71
#: bookwyrm/templates/import/import.html:68
msgid "Recent Imports"
msgstr "最近的匯入"
#: bookwyrm/templates/import/import.html:73
#: bookwyrm/templates/import/import.html:70
msgid "No recent imports"
msgstr "無最近的匯入"
@ -5087,7 +5087,7 @@ msgstr "檔案超過了最大大小: 10MB"
msgid "%(title)s: %(subtitle)s"
msgstr ""
#: bookwyrm/views/imports/import_data.py:70
#: bookwyrm/views/imports/import_data.py:67
msgid "Not a valid csv file"
msgstr "不是有效的 csv 檔案"

View file

@ -1,4 +1,3 @@
aiohttp==3.8.1
celery==5.2.2
colorthief==0.2.1
Django==3.2.13
@ -35,4 +34,3 @@ pytest-cov==2.10.1
pytest-env==0.6.2
pytest-xdist==2.3.0
pytidylib==0.3.2
pylint==2.14.0