diff --git a/.env.dev.example b/.env.dev.example index 1e4fb981..9a4366e0 100644 --- a/.env.dev.example +++ b/.env.dev.example @@ -36,7 +36,7 @@ FLOWER_PORT=8888 #FLOWER_USER=mouse #FLOWER_PASSWORD=changeme -EMAIL_HOST="smtp.mailgun.org" +EMAIL_HOST=smtp.mailgun.org EMAIL_PORT=587 EMAIL_HOST_USER=mail@your.domain.here EMAIL_HOST_PASSWORD=emailpassword123 diff --git a/.env.prod.example b/.env.prod.example index 49729d53..56f52a28 100644 --- a/.env.prod.example +++ b/.env.prod.example @@ -36,7 +36,7 @@ FLOWER_PORT=8888 FLOWER_USER=mouse FLOWER_PASSWORD=changeme -EMAIL_HOST="smtp.mailgun.org" +EMAIL_HOST=smtp.mailgun.org EMAIL_PORT=587 EMAIL_HOST_USER=mail@your.domain.here EMAIL_HOST_PASSWORD=emailpassword123 diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index 4896e07d..e1a52d26 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -7,7 +7,7 @@ from django.utils import timezone from bookwyrm import models from bookwyrm.redis_store import RedisStore, r -from bookwyrm.tasks import app +from bookwyrm.tasks import app, LOW, MEDIUM, HIGH class ActivityStream(RedisStore): @@ -277,7 +277,18 @@ def add_status_on_create(sender, instance, created, *args, **kwargs): def add_status_on_create_command(sender, instance, created): """runs this code only after the database commit completes""" - add_status_task.delay(instance.id, increment_unread=created) + priority = HIGH + # check if this is an old status, de-prioritize if so + # (this will happen if federation is very slow, or, more expectedly, on csv import) + one_day = 60 * 60 * 24 + if (instance.created_date - instance.published_date).seconds > one_day: + priority = LOW + + add_status_task.apply_async( + args=(instance.id,), + kwargs={"increment_unread": created}, + queue=priority, + ) if sender == models.Boost: handle_boost_task.delay(instance.id) @@ -409,7 +420,7 @@ def remove_statuses_on_unshelve(sender, instance, *args, **kwargs): # ---- TASKS -@app.task(queue="low_priority") +@app.task(queue=LOW) def add_book_statuses_task(user_id, book_id): """add statuses related to a book on shelve""" user = models.User.objects.get(id=user_id) @@ -417,7 +428,7 @@ def add_book_statuses_task(user_id, book_id): BooksStream().add_book_statuses(user, book) -@app.task(queue="low_priority") +@app.task(queue=LOW) def remove_book_statuses_task(user_id, book_id): """remove statuses about a book from a user's books feed""" user = models.User.objects.get(id=user_id) @@ -425,7 +436,7 @@ def remove_book_statuses_task(user_id, book_id): BooksStream().remove_book_statuses(user, book) -@app.task(queue="medium_priority") +@app.task(queue=MEDIUM) def populate_stream_task(stream, user_id): """background task for populating an empty activitystream""" user = models.User.objects.get(id=user_id) @@ -433,7 +444,7 @@ def populate_stream_task(stream, user_id): stream.populate_streams(user) -@app.task(queue="medium_priority") +@app.task(queue=MEDIUM) def remove_status_task(status_ids): """remove a status from any stream it might be in""" # this can take an id or a list of ids @@ -446,7 +457,7 @@ def remove_status_task(status_ids): stream.remove_object_from_related_stores(status) -@app.task(queue="high_priority") +@app.task(queue=HIGH) def add_status_task(status_id, increment_unread=False): """add a status to any stream it should be in""" status = models.Status.objects.get(id=status_id) @@ -458,7 +469,7 @@ def add_status_task(status_id, increment_unread=False): stream.add_status(status, increment_unread=increment_unread) -@app.task(queue="medium_priority") +@app.task(queue=MEDIUM) def remove_user_statuses_task(viewer_id, user_id, stream_list=None): """remove all statuses by a user from a viewer's stream""" stream_list = [streams[s] for s in stream_list] if stream_list else streams.values() @@ -468,7 +479,7 @@ def remove_user_statuses_task(viewer_id, user_id, stream_list=None): stream.remove_user_statuses(viewer, user) -@app.task(queue="medium_priority") +@app.task(queue=MEDIUM) def add_user_statuses_task(viewer_id, user_id, stream_list=None): """add all statuses by a user to a viewer's stream""" stream_list = [streams[s] for s in stream_list] if stream_list else streams.values() @@ -478,7 +489,7 @@ def add_user_statuses_task(viewer_id, user_id, stream_list=None): stream.add_user_statuses(viewer, user) -@app.task(queue="medium_priority") +@app.task(queue=MEDIUM) def handle_boost_task(boost_id): """remove the original post and other, earlier boosts""" instance = models.Status.objects.get(id=boost_id) diff --git a/bookwyrm/book_search.py b/bookwyrm/book_search.py index 6c89b61f..e42a6d8c 100644 --- a/bookwyrm/book_search.py +++ b/bookwyrm/book_search.py @@ -82,6 +82,8 @@ def search_identifiers(query, *filters, return_first=False): *filters, reduce(operator.or_, (Q(**f) for f in or_filters)) ).distinct() if results.count() <= 1: + if return_first: + return results.first() return results # when there are multiple editions of the same work, pick the default. @@ -124,6 +126,7 @@ def search_title_author(query, min_confidence, *filters, return_first=False): result = default else: result = editions.first() + if return_first: return result list_results.append(result) diff --git a/bookwyrm/forms.py b/bookwyrm/forms.py index 298f73da..847ca05c 100644 --- a/bookwyrm/forms.py +++ b/bookwyrm/forms.py @@ -201,12 +201,18 @@ class EditionForm(CustomForm): class AuthorForm(CustomForm): class Meta: model = models.Author - exclude = [ - "remote_id", - "origin_id", - "created_date", - "updated_date", - "search_vector", + fields = [ + "last_edited_by", + "name", + "aliases", + "bio", + "wikipedia_link", + "born", + "died", + "openlibrary_key", + "inventaire_id", + "librarything_key", + "goodreads_key", ] diff --git a/bookwyrm/importers/goodreads_import.py b/bookwyrm/importers/goodreads_import.py index c62e6582..c0dc0ea2 100644 --- a/bookwyrm/importers/goodreads_import.py +++ b/bookwyrm/importers/goodreads_import.py @@ -7,10 +7,3 @@ class GoodreadsImporter(Importer): For a more complete example of overriding see librarything_import.py""" service = "Goodreads" - - def parse_fields(self, entry): - """handle the specific fields in goodreads csvs""" - entry.update({"import_source": self.service}) - # add missing 'Date Started' field - entry.update({"Date Started": None}) - return entry diff --git a/bookwyrm/importers/importer.py b/bookwyrm/importers/importer.py index 6d898a2a..94e6734e 100644 --- a/bookwyrm/importers/importer.py +++ b/bookwyrm/importers/importer.py @@ -7,7 +7,7 @@ from django.utils.translation import gettext_lazy as _ from bookwyrm import models from bookwyrm.models import ImportJob, ImportItem -from bookwyrm.tasks import app +from bookwyrm.tasks import app, LOW logger = logging.getLogger(__name__) @@ -15,33 +15,90 @@ logger = logging.getLogger(__name__) class Importer: """Generic class for csv data import from an outside service""" - service = "Unknown" + service = "Import" delimiter = "," encoding = "UTF-8" - mandatory_fields = ["Title", "Author"] + + # these are from Goodreads + row_mappings_guesses = [ + ("id", ["id", "book id"]), + ("title", ["title"]), + ("authors", ["author", "authors", "primary author"]), + ("isbn_10", ["isbn10", "isbn"]), + ("isbn_13", ["isbn13", "isbn", "isbns"]), + ("shelf", ["shelf", "exclusive shelf", "read status"]), + ("review_name", ["review name"]), + ("review_body", ["my review", "review"]), + ("rating", ["my rating", "rating", "star rating"]), + ("date_added", ["date added", "entry date", "added"]), + ("date_started", ["date started", "started"]), + ("date_finished", ["date finished", "last date read", "date read", "finished"]), + ] + date_fields = ["date_added", "date_started", "date_finished"] + shelf_mapping_guesses = { + "to-read": ["to-read"], + "read": ["read"], + "reading": ["currently-reading", "reading"], + } def create_job(self, user, csv_file, include_reviews, privacy): """check over a csv and creates a database entry for the job""" + csv_reader = csv.DictReader(csv_file, delimiter=self.delimiter) + rows = enumerate(list(csv_reader)) job = ImportJob.objects.create( - user=user, include_reviews=include_reviews, privacy=privacy + user=user, + include_reviews=include_reviews, + privacy=privacy, + mappings=self.create_row_mappings(csv_reader.fieldnames), + source=self.service, ) - for index, entry in enumerate( - list(csv.DictReader(csv_file, delimiter=self.delimiter)) - ): - if not all(x in entry for x in self.mandatory_fields): - raise ValueError("Author and title must be in data.") - entry = self.parse_fields(entry) - self.save_item(job, index, entry) + + for index, entry in rows: + self.create_item(job, index, entry) return job - def save_item(self, job, index, data): # pylint: disable=no-self-use - """creates and saves an import item""" - ImportItem(job=job, index=index, data=data).save() + def update_legacy_job(self, job): + """patch up a job that was in the old format""" + items = job.items + headers = list(items.first().data.keys()) + job.mappings = self.create_row_mappings(headers) + job.updated_date = timezone.now() + job.save() - def parse_fields(self, entry): - """updates csv data with additional info""" - entry.update({"import_source": self.service}) - return entry + for item in items.all(): + normalized = self.normalize_row(item.data, job.mappings) + normalized["shelf"] = self.get_shelf(normalized) + item.normalized_data = normalized + item.save() + + def create_row_mappings(self, headers): + """guess what the headers mean""" + mappings = {} + for (key, guesses) in self.row_mappings_guesses: + value = [h for h in headers if h.lower() in guesses] + value = value[0] if len(value) else None + if value: + headers.remove(value) + mappings[key] = value + return mappings + + def create_item(self, job, index, data): + """creates and saves an import item""" + normalized = self.normalize_row(data, job.mappings) + normalized["shelf"] = self.get_shelf(normalized) + ImportItem(job=job, index=index, data=data, normalized_data=normalized).save() + + def get_shelf(self, normalized_row): + """determine which shelf to use""" + shelf_name = normalized_row["shelf"] + shelf = [ + s for (s, gs) in self.shelf_mapping_guesses.items() if shelf_name in gs + ] + return shelf[0] if shelf else None + + def normalize_row(self, entry, mappings): # pylint: disable=no-self-use + """use the dataclass to create the formatted row of data""" + return {k: entry.get(v) for k, v in mappings.items()} def create_retry_job(self, user, original_job, items): """retry items that didn't import""" @@ -49,55 +106,65 @@ class Importer: user=user, include_reviews=original_job.include_reviews, privacy=original_job.privacy, + # TODO: allow users to adjust mappings + mappings=original_job.mappings, retry=True, ) for item in items: - self.save_item(job, item.index, item.data) + # this will re-normalize the raw data + self.create_item(job, item.index, item.data) return job - def start_import(self, job): + def start_import(self, job): # pylint: disable=no-self-use """initalizes a csv import job""" - result = import_data.delay(self.service, job.id) + result = start_import_task.delay(job.id) job.task_id = result.id job.save() @app.task(queue="low_priority") -def import_data(source, job_id): - """does the actual lookup work in a celery task""" +def start_import_task(job_id): + """trigger the child tasks for each row""" job = ImportJob.objects.get(id=job_id) + # these are sub-tasks so that one big task doesn't use up all the memory in celery + for item in job.items.values_list("id", flat=True).all(): + import_item_task.delay(item) + + +@app.task(queue="low_priority") +def import_item_task(item_id): + """resolve a row into a book""" + item = models.ImportItem.objects.get(id=item_id) try: - for item in job.items.all(): - try: - item.resolve() - except Exception as err: # pylint: disable=broad-except - logger.exception(err) - item.fail_reason = _("Error loading book") - item.save() - continue + item.resolve() + except Exception as err: # pylint: disable=broad-except + item.fail_reason = _("Error loading book") + item.save() + item.update_job() + raise err - if item.book or item.book_guess: - item.save() + if item.book: + # shelves book and handles reviews + handle_imported_book(item) + else: + item.fail_reason = _("Could not find a match for book") - if item.book: - # shelves book and handles reviews - handle_imported_book( - source, job.user, item, job.include_reviews, job.privacy - ) - else: - item.fail_reason = _("Could not find a match for book") - item.save() - finally: - job.complete = True - job.save() + item.save() + item.update_job() -def handle_imported_book(source, user, item, include_reviews, privacy): +def handle_imported_book(item): """process a csv and then post about it""" + job = item.job + user = job.user if isinstance(item.book, models.Work): item.book = item.book.default_edition if not item.book: + item.fail_reason = _("Error loading book") + item.save() return + if not isinstance(item.book, models.Edition): + item.book = item.book.edition existing_shelf = models.ShelfBook.objects.filter(book=item.book, user=user).exists() @@ -105,9 +172,9 @@ def handle_imported_book(source, user, item, include_reviews, privacy): if item.shelf and not existing_shelf: desired_shelf = models.Shelf.objects.get(identifier=item.shelf, user=user) shelved_date = item.date_added or timezone.now() - models.ShelfBook.objects.create( + models.ShelfBook( book=item.book, shelf=desired_shelf, user=user, shelved_date=shelved_date - ) + ).save(priority=LOW) for read in item.reads: # check for an existing readthrough with the same dates @@ -122,35 +189,52 @@ def handle_imported_book(source, user, item, include_reviews, privacy): read.user = user read.save() - if include_reviews and (item.rating or item.review): + if job.include_reviews and (item.rating or item.review) and not item.linked_review: # we don't know the publication date of the review, # but "now" is a bad guess published_date_guess = item.date_read or item.date_added if item.review: # pylint: disable=consider-using-f-string - review_title = ( - "Review of {!r} on {!r}".format( - item.book.title, - source, - ) - if item.review - else "" + review_title = "Review of {!r} on {!r}".format( + item.book.title, + job.source, ) - models.Review.objects.create( + review = models.Review.objects.filter( user=user, book=item.book, name=review_title, - content=item.review, rating=item.rating, published_date=published_date_guess, - privacy=privacy, - ) + ).first() + if not review: + review = models.Review( + user=user, + book=item.book, + name=review_title, + content=item.review, + rating=item.rating, + published_date=published_date_guess, + privacy=job.privacy, + ) + review.save(software="bookwyrm", priority=LOW) else: # just a rating - models.ReviewRating.objects.create( + review = models.ReviewRating.objects.filter( user=user, book=item.book, - rating=item.rating, published_date=published_date_guess, - privacy=privacy, - ) + rating=item.rating, + ).first() + if not review: + review = models.ReviewRating( + user=user, + book=item.book, + rating=item.rating, + published_date=published_date_guess, + privacy=job.privacy, + ) + review.save(software="bookwyrm", priority=LOW) + + # only broadcast this review to other bookwyrm instances + item.linked_review = review + item.save() diff --git a/bookwyrm/importers/librarything_import.py b/bookwyrm/importers/librarything_import.py index b3175a82..1b61a6f1 100644 --- a/bookwyrm/importers/librarything_import.py +++ b/bookwyrm/importers/librarything_import.py @@ -1,7 +1,5 @@ -""" handle reading a csv from librarything """ +""" handle reading a tsv from librarything """ import re -import math - from . import Importer @@ -11,32 +9,18 @@ class LibrarythingImporter(Importer): service = "LibraryThing" delimiter = "\t" encoding = "ISO-8859-1" - # mandatory_fields : fields matching the book title and author - mandatory_fields = ["Title", "Primary Author"] - def parse_fields(self, entry): - """custom parsing for librarything""" - data = {} - data["import_source"] = self.service - data["Book Id"] = entry["Book Id"] - data["Title"] = entry["Title"] - data["Author"] = entry["Primary Author"] - data["ISBN13"] = entry["ISBN"] - data["My Review"] = entry["Review"] - if entry["Rating"]: - data["My Rating"] = math.ceil(float(entry["Rating"])) - else: - data["My Rating"] = "" - data["Date Added"] = re.sub(r"\[|\]", "", entry["Entry Date"]) - data["Date Started"] = re.sub(r"\[|\]", "", entry["Date Started"]) - data["Date Read"] = re.sub(r"\[|\]", "", entry["Date Read"]) + def normalize_row(self, entry, mappings): # pylint: disable=no-self-use + """use the dataclass to create the formatted row of data""" + remove_brackets = lambda v: re.sub(r"\[|\]", "", v) if v else None + normalized = {k: remove_brackets(entry.get(v)) for k, v in mappings.items()} + isbn_13 = normalized["isbn_13"].split(", ") + normalized["isbn_13"] = isbn_13[1] if len(isbn_13) > 0 else None + return normalized - data["Exclusive Shelf"] = None - if data["Date Read"]: - data["Exclusive Shelf"] = "read" - elif data["Date Started"]: - data["Exclusive Shelf"] = "reading" - else: - data["Exclusive Shelf"] = "to-read" - - return data + def get_shelf(self, normalized_row): + if normalized_row["date_finished"]: + return "read" + if normalized_row["date_started"]: + return "reading" + return "to-read" diff --git a/bookwyrm/importers/storygraph_import.py b/bookwyrm/importers/storygraph_import.py index 25498432..9368115d 100644 --- a/bookwyrm/importers/storygraph_import.py +++ b/bookwyrm/importers/storygraph_import.py @@ -1,7 +1,4 @@ -""" handle reading a csv from librarything """ -import re -import math - +""" handle reading a csv from storygraph""" from . import Importer @@ -9,26 +6,3 @@ class StorygraphImporter(Importer): """csv downloads from librarything""" service = "Storygraph" - # mandatory_fields : fields matching the book title and author - mandatory_fields = ["Title"] - - def parse_fields(self, entry): - """custom parsing for storygraph""" - data = {} - data["import_source"] = self.service - data["Title"] = entry["Title"] - data["Author"] = entry["Authors"] if "Authors" in entry else entry["Author"] - data["ISBN13"] = entry["ISBN"] - data["My Review"] = entry["Review"] - if entry["Star Rating"]: - data["My Rating"] = math.ceil(float(entry["Star Rating"])) - else: - data["My Rating"] = "" - - data["Date Added"] = re.sub(r"[/]", "-", entry["Date Added"]) - data["Date Read"] = re.sub(r"[/]", "-", entry["Last Date Read"]) - - data["Exclusive Shelf"] = ( - {"read": "read", "currently-reading": "reading", "to-read": "to-read"} - ).get(entry["Read Status"], None) - return data diff --git a/bookwyrm/migrations/0113_auto_20211110_2104.py b/bookwyrm/migrations/0113_auto_20211110_2104.py new file mode 100644 index 00000000..572ba280 --- /dev/null +++ b/bookwyrm/migrations/0113_auto_20211110_2104.py @@ -0,0 +1,25 @@ +# Generated by Django 3.2.5 on 2021-11-10 21:04 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0112_auto_20211022_0844"), + ] + + operations = [ + migrations.AddField( + model_name="importitem", + name="normalized_data", + field=models.JSONField(default={}), + preserve_default=False, + ), + migrations.AddField( + model_name="importjob", + name="mappings", + field=models.JSONField(default={}), + preserve_default=False, + ), + ] diff --git a/bookwyrm/migrations/0114_importjob_source.py b/bookwyrm/migrations/0114_importjob_source.py new file mode 100644 index 00000000..3ec1432e --- /dev/null +++ b/bookwyrm/migrations/0114_importjob_source.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.5 on 2021-11-13 00:56 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0113_auto_20211110_2104"), + ] + + operations = [ + migrations.AddField( + model_name="importjob", + name="source", + field=models.CharField(default="Import", max_length=100), + preserve_default=False, + ), + ] diff --git a/bookwyrm/migrations/0115_importitem_linked_review.py b/bookwyrm/migrations/0115_importitem_linked_review.py new file mode 100644 index 00000000..8cff9b8c --- /dev/null +++ b/bookwyrm/migrations/0115_importitem_linked_review.py @@ -0,0 +1,24 @@ +# Generated by Django 3.2.5 on 2021-11-13 19:35 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0114_importjob_source"), + ] + + operations = [ + migrations.AddField( + model_name="importitem", + name="linked_review", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="bookwyrm.review", + ), + ), + ] diff --git a/bookwyrm/migrations/0116_auto_20211114_1734.py b/bookwyrm/migrations/0116_auto_20211114_1734.py new file mode 100644 index 00000000..1da001bd --- /dev/null +++ b/bookwyrm/migrations/0116_auto_20211114_1734.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.5 on 2021-11-14 17:34 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0115_importitem_linked_review"), + ] + + operations = [ + migrations.RemoveField( + model_name="importjob", + name="task_id", + ), + migrations.AddField( + model_name="importjob", + name="updated_date", + field=models.DateTimeField(default=django.utils.timezone.now), + ), + ] diff --git a/bookwyrm/migrations/0117_alter_user_preferred_language.py b/bookwyrm/migrations/0117_alter_user_preferred_language.py new file mode 100644 index 00000000..c892b051 --- /dev/null +++ b/bookwyrm/migrations/0117_alter_user_preferred_language.py @@ -0,0 +1,32 @@ +# Generated by Django 3.2.5 on 2021-11-15 18:22 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0116_auto_20211114_1734"), + ] + + operations = [ + migrations.AlterField( + model_name="user", + name="preferred_language", + field=models.CharField( + blank=True, + choices=[ + ("en-us", "English"), + ("de-de", "Deutsch (German)"), + ("es-es", "Español (Spanish)"), + ("fr-fr", "Français (French)"), + ("lt-lt", "lietuvių (Lithuanian)"), + ("pt-br", "Português - Brasil (Brazilian Portuguese)"), + ("zh-hans", "简体中文 (Simplified Chinese)"), + ("zh-hant", "繁體中文 (Traditional Chinese)"), + ], + max_length=255, + null=True, + ), + ), + ] diff --git a/bookwyrm/models/activitypub_mixin.py b/bookwyrm/models/activitypub_mixin.py index 3a88c524..402cb040 100644 --- a/bookwyrm/models/activitypub_mixin.py +++ b/bookwyrm/models/activitypub_mixin.py @@ -20,7 +20,7 @@ from django.utils.http import http_date from bookwyrm import activitypub from bookwyrm.settings import USER_AGENT, PAGE_LENGTH from bookwyrm.signatures import make_signature, make_digest -from bookwyrm.tasks import app +from bookwyrm.tasks import app, MEDIUM from bookwyrm.models.fields import ImageField, ManyToManyField logger = logging.getLogger(__name__) @@ -29,7 +29,6 @@ logger = logging.getLogger(__name__) PropertyField = namedtuple("PropertyField", ("set_activity_from_field")) - # pylint: disable=invalid-name def set_activity_from_property_field(activity, obj, field): """assign a model property value to the activity json""" @@ -126,12 +125,15 @@ class ActivitypubMixin: # there OUGHT to be only one match return match.first() - def broadcast(self, activity, sender, software=None): + def broadcast(self, activity, sender, software=None, queue=MEDIUM): """send out an activity""" - broadcast_task.delay( - sender.id, - json.dumps(activity, cls=activitypub.ActivityEncoder), - self.get_recipients(software=software), + broadcast_task.apply_async( + args=( + sender.id, + json.dumps(activity, cls=activitypub.ActivityEncoder), + self.get_recipients(software=software), + ), + queue=queue, ) def get_recipients(self, software=None): @@ -195,7 +197,7 @@ class ActivitypubMixin: class ObjectMixin(ActivitypubMixin): """add this mixin for object models that are AP serializable""" - def save(self, *args, created=None, **kwargs): + def save(self, *args, created=None, software=None, priority=MEDIUM, **kwargs): """broadcast created/updated/deleted objects as appropriate""" broadcast = kwargs.get("broadcast", True) # this bonus kwarg would cause an error in the base save method @@ -219,15 +221,17 @@ class ObjectMixin(ActivitypubMixin): return try: - software = None # do we have a "pure" activitypub version of this for mastodon? - if hasattr(self, "pure_content"): + if software != "bookwyrm" and hasattr(self, "pure_content"): pure_activity = self.to_create_activity(user, pure=True) - self.broadcast(pure_activity, user, software="other") + self.broadcast( + pure_activity, user, software="other", queue=priority + ) + # set bookwyrm so that that type is also sent software = "bookwyrm" # sends to BW only if we just did a pure version for masto activity = self.to_create_activity(user) - self.broadcast(activity, user, software=software) + self.broadcast(activity, user, software=software, queue=priority) except AttributeError: # janky as heck, this catches the mutliple inheritence chain # for boosts and ignores this auxilliary broadcast @@ -241,8 +245,7 @@ class ObjectMixin(ActivitypubMixin): if isinstance(self, user_model): user = self # book data tracks last editor - elif hasattr(self, "last_edited_by"): - user = self.last_edited_by + user = user or getattr(self, "last_edited_by", None) # again, if we don't know the user or they're remote, don't bother if not user or not user.local: return @@ -252,7 +255,7 @@ class ObjectMixin(ActivitypubMixin): activity = self.to_delete_activity(user) else: activity = self.to_update_activity(user) - self.broadcast(activity, user) + self.broadcast(activity, user, queue=priority) def to_create_activity(self, user, **kwargs): """returns the object wrapped in a Create activity""" @@ -375,9 +378,9 @@ class CollectionItemMixin(ActivitypubMixin): activity_serializer = activitypub.CollectionItem - def broadcast(self, activity, sender, software="bookwyrm"): + def broadcast(self, activity, sender, software="bookwyrm", queue=MEDIUM): """only send book collection updates to other bookwyrm instances""" - super().broadcast(activity, sender, software=software) + super().broadcast(activity, sender, software=software, queue=queue) @property def privacy(self): @@ -396,7 +399,7 @@ class CollectionItemMixin(ActivitypubMixin): return [] return [collection_field.user] - def save(self, *args, broadcast=True, **kwargs): + def save(self, *args, broadcast=True, priority=MEDIUM, **kwargs): """broadcast updated""" # first off, we want to save normally no matter what super().save(*args, **kwargs) @@ -407,7 +410,7 @@ class CollectionItemMixin(ActivitypubMixin): # adding an obj to the collection activity = self.to_add_activity(self.user) - self.broadcast(activity, self.user) + self.broadcast(activity, self.user, queue=priority) def delete(self, *args, broadcast=True, **kwargs): """broadcast a remove activity""" @@ -440,12 +443,12 @@ class CollectionItemMixin(ActivitypubMixin): class ActivityMixin(ActivitypubMixin): """add this mixin for models that are AP serializable""" - def save(self, *args, broadcast=True, **kwargs): + def save(self, *args, broadcast=True, priority=MEDIUM, **kwargs): """broadcast activity""" super().save(*args, **kwargs) user = self.user if hasattr(self, "user") else self.user_subject if broadcast and user.local: - self.broadcast(self.to_activity(), user) + self.broadcast(self.to_activity(), user, queue=priority) def delete(self, *args, broadcast=True, **kwargs): """nevermind, undo that activity""" @@ -502,7 +505,7 @@ def unfurl_related_field(related_field, sort_field=None): return related_field.remote_id -@app.task(queue="medium_priority") +@app.task(queue=MEDIUM) def broadcast_task(sender_id, activity, recipients): """the celery task for broadcast""" user_model = apps.get_model("bookwyrm.User", require_ready=True) diff --git a/bookwyrm/models/book.py b/bookwyrm/models/book.py index 8ae75baf..d97a1b8a 100644 --- a/bookwyrm/models/book.py +++ b/bookwyrm/models/book.py @@ -66,9 +66,10 @@ class BookDataModel(ObjectMixin, BookWyrmModel): self.remote_id = None return super().save(*args, **kwargs) - def broadcast(self, activity, sender, software="bookwyrm"): + # pylint: disable=arguments-differ + def broadcast(self, activity, sender, software="bookwyrm", **kwargs): """only send book data updates to other bookwyrm instances""" - super().broadcast(activity, sender, software=software) + super().broadcast(activity, sender, software=software, **kwargs) class Book(BookDataModel): diff --git a/bookwyrm/models/fields.py b/bookwyrm/models/fields.py index ccd669cb..36107990 100644 --- a/bookwyrm/models/fields.py +++ b/bookwyrm/models/fields.py @@ -3,6 +3,7 @@ from dataclasses import MISSING import imghdr import re from uuid import uuid4 +from urllib.parse import urljoin import dateutil.parser from dateutil.parser import ParserError @@ -13,11 +14,12 @@ from django.db import models from django.forms import ClearableFileInput, ImageField as DjangoImageField from django.utils import timezone from django.utils.translation import gettext_lazy as _ +from django.utils.encoding import filepath_to_uri from bookwyrm import activitypub from bookwyrm.connectors import get_image from bookwyrm.sanitize_html import InputHtmlParser -from bookwyrm.settings import DOMAIN +from bookwyrm.settings import MEDIA_FULL_URL def validate_remote_id(value): @@ -381,17 +383,6 @@ class CustomImageField(DjangoImageField): widget = ClearableFileInputWithWarning -def image_serializer(value, alt): - """helper for serializing images""" - if value and hasattr(value, "url"): - url = value.url - else: - return None - if not url[:4] == "http": - url = f"https://{DOMAIN}{url}" - return activitypub.Document(url=url, name=alt) - - class ImageField(ActivitypubFieldMixin, models.ImageField): """activitypub-aware image field""" @@ -424,7 +415,12 @@ class ImageField(ActivitypubFieldMixin, models.ImageField): activity[key] = formatted def field_to_activity(self, value, alt=None): - return image_serializer(value, alt) + url = get_absolute_url(value) + + if not url: + return None + + return activitypub.Document(url=url, name=alt) def field_from_activity(self, value): image_slug = value @@ -461,6 +457,20 @@ class ImageField(ActivitypubFieldMixin, models.ImageField): ) +def get_absolute_url(value): + """returns an absolute URL for the image""" + name = getattr(value, "name") + if not name: + return None + + url = filepath_to_uri(name) + if url is not None: + url = url.lstrip("/") + url = urljoin(MEDIA_FULL_URL, url) + + return url + + class DateTimeField(ActivitypubFieldMixin, models.DateTimeField): """activitypub-aware datetime field""" diff --git a/bookwyrm/models/import_job.py b/bookwyrm/models/import_job.py index 22253fef..c4679585 100644 --- a/bookwyrm/models/import_job.py +++ b/bookwyrm/models/import_job.py @@ -6,20 +6,14 @@ from django.db import models from django.utils import timezone from bookwyrm.connectors import connector_manager -from bookwyrm.models import ReadThrough, User, Book +from bookwyrm.models import ReadThrough, User, Book, Edition from .fields import PrivacyLevels -# Mapping goodreads -> bookwyrm shelf titles. -GOODREADS_SHELVES = { - "read": "read", - "currently-reading": "reading", - "to-read": "to-read", -} - - def unquote_string(text): """resolve csv quote weirdness""" + if not text: + return None match = re.match(r'="([^"]*)"', text) if match: return match.group(1) @@ -41,14 +35,21 @@ class ImportJob(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) created_date = models.DateTimeField(default=timezone.now) - task_id = models.CharField(max_length=100, null=True) + updated_date = models.DateTimeField(default=timezone.now) include_reviews = models.BooleanField(default=True) + mappings = models.JSONField() complete = models.BooleanField(default=False) + source = models.CharField(max_length=100) privacy = models.CharField( max_length=255, default="public", choices=PrivacyLevels.choices ) retry = models.BooleanField(default=False) + @property + def pending_items(self): + """items that haven't been processed yet""" + return self.items.filter(fail_reason__isnull=True, book__isnull=True) + class ImportItem(models.Model): """a single line of a csv being imported""" @@ -56,6 +57,7 @@ class ImportItem(models.Model): job = models.ForeignKey(ImportJob, on_delete=models.CASCADE, related_name="items") index = models.IntegerField() data = models.JSONField() + normalized_data = models.JSONField() book = models.ForeignKey(Book, on_delete=models.SET_NULL, null=True, blank=True) book_guess = models.ForeignKey( Book, @@ -65,9 +67,26 @@ class ImportItem(models.Model): related_name="book_guess", ) fail_reason = models.TextField(null=True) + linked_review = models.ForeignKey( + "Review", on_delete=models.SET_NULL, null=True, blank=True + ) + + def update_job(self): + """let the job know when the items get work done""" + job = self.job + job.updated_date = timezone.now() + job.save() + if not job.pending_items.exists() and not job.complete: + job.complete = True + job.save(update_fields=["complete"]) def resolve(self): """try various ways to lookup a book""" + # we might be calling this after manually adding the book, + # so no need to do searches + if self.book: + return + if self.isbn: self.book = self.get_book_from_isbn() else: @@ -85,6 +104,10 @@ class ImportItem(models.Model): self.isbn, min_confidence=0.999 ) if search_result: + # it's already in the right format + if isinstance(search_result, Edition): + return search_result + # it's just a search result, book needs to be created # raises ConnectorException return search_result.connector.get_or_create_book(search_result.key) return None @@ -96,6 +119,8 @@ class ImportItem(models.Model): search_term, min_confidence=0.1 ) if search_result: + if isinstance(search_result, Edition): + return (search_result, 1) # raises ConnectorException return ( search_result.connector.get_or_create_book(search_result.key), @@ -106,56 +131,62 @@ class ImportItem(models.Model): @property def title(self): """get the book title""" - return self.data["Title"] + return self.normalized_data.get("title") @property def author(self): - """get the book title""" - return self.data["Author"] + """get the book's authors""" + return self.normalized_data.get("authors") @property def isbn(self): """pulls out the isbn13 field from the csv line data""" - return unquote_string(self.data["ISBN13"]) + return unquote_string(self.normalized_data.get("isbn_13")) or unquote_string( + self.normalized_data.get("isbn_10") + ) @property def shelf(self): """the goodreads shelf field""" - if self.data["Exclusive Shelf"]: - return GOODREADS_SHELVES.get(self.data["Exclusive Shelf"]) - return None + return self.normalized_data.get("shelf") @property def review(self): """a user-written review, to be imported with the book data""" - return self.data["My Review"] + return self.normalized_data.get("review_body") @property def rating(self): """x/5 star rating for a book""" - if self.data.get("My Rating", None): - return int(self.data["My Rating"]) + if self.normalized_data.get("rating"): + return float(self.normalized_data.get("rating")) return None @property def date_added(self): """when the book was added to this dataset""" - if self.data["Date Added"]: - return timezone.make_aware(dateutil.parser.parse(self.data["Date Added"])) + if self.normalized_data.get("date_added"): + return timezone.make_aware( + dateutil.parser.parse(self.normalized_data.get("date_added")) + ) return None @property def date_started(self): """when the book was started""" - if "Date Started" in self.data and self.data["Date Started"]: - return timezone.make_aware(dateutil.parser.parse(self.data["Date Started"])) + if self.normalized_data.get("date_started"): + return timezone.make_aware( + dateutil.parser.parse(self.normalized_data.get("date_started")) + ) return None @property def date_read(self): """the date a book was completed""" - if self.data["Date Read"]: - return timezone.make_aware(dateutil.parser.parse(self.data["Date Read"])) + if self.normalized_data.get("date_finished"): + return timezone.make_aware( + dateutil.parser.parse(self.normalized_data.get("date_finished")) + ) return None @property @@ -174,7 +205,9 @@ class ImportItem(models.Model): if start_date and start_date is not None and not self.date_read: return [ReadThrough(start_date=start_date)] if self.date_read: - start_date = start_date if start_date < self.date_read else None + start_date = ( + start_date if start_date and start_date < self.date_read else None + ) return [ ReadThrough( start_date=start_date, @@ -185,8 +218,10 @@ class ImportItem(models.Model): def __repr__(self): # pylint: disable=consider-using-f-string - return "<{!r}Item {!r}>".format(self.data["import_source"], self.data["Title"]) + return "<{!r} Item {!r}>".format(self.index, self.normalized_data.get("title")) def __str__(self): # pylint: disable=consider-using-f-string - return "{} by {}".format(self.data["Title"], self.data["Author"]) + return "{} by {}".format( + self.normalized_data.get("title"), self.normalized_data.get("authors") + ) diff --git a/bookwyrm/models/notification.py b/bookwyrm/models/notification.py index 2f1aae4f..417bf759 100644 --- a/bookwyrm/models/notification.py +++ b/bookwyrm/models/notification.py @@ -157,9 +157,12 @@ def notify_user_on_unboost(sender, instance, *args, **kwargs): @receiver(models.signals.post_save, sender=ImportJob) # pylint: disable=unused-argument -def notify_user_on_import_complete(sender, instance, *args, **kwargs): +def notify_user_on_import_complete( + sender, instance, *args, update_fields=None, **kwargs +): """we imported your books! aren't you proud of us""" - if not instance.complete: + update_fields = update_fields or [] + if not instance.complete or "complete" not in update_fields: return Notification.objects.create( user=instance.user, diff --git a/bookwyrm/models/status.py b/bookwyrm/models/status.py index 2b395ec8..c7c0a425 100644 --- a/bookwyrm/models/status.py +++ b/bookwyrm/models/status.py @@ -19,7 +19,6 @@ from bookwyrm.settings import ENABLE_PREVIEW_IMAGES from .activitypub_mixin import ActivitypubMixin, ActivityMixin from .activitypub_mixin import OrderedCollectionPageMixin from .base_model import BookWyrmModel -from .fields import image_serializer from .readthrough import ProgressMode from . import fields @@ -190,15 +189,26 @@ class Status(OrderedCollectionPageMixin, BookWyrmModel): if hasattr(activity, "name"): activity.name = self.pure_name activity.type = self.pure_type - activity.attachment = [ - image_serializer(b.cover, b.alt_text) - for b in self.mention_books.all()[:4] - if b.cover - ] - if hasattr(self, "book") and self.book.cover: - activity.attachment.append( - image_serializer(self.book.cover, self.book.alt_text) - ) + book = getattr(self, "book", None) + books = [book] if book else [] + books += list(self.mention_books.all()) + if len(books) == 1 and getattr(books[0], "preview_image", None): + covers = [ + activitypub.Document( + url=fields.get_absolute_url(books[0].preview_image), + name=books[0].alt_text, + ) + ] + else: + covers = [ + activitypub.Document( + url=fields.get_absolute_url(b.cover), + name=b.alt_text, + ) + for b in books + if b and b.cover + ] + activity.attachment = covers return activity def to_activity(self, pure=False): # pylint: disable=arguments-differ diff --git a/bookwyrm/settings.py b/bookwyrm/settings.py index 44d65cca..d469e6fe 100644 --- a/bookwyrm/settings.py +++ b/bookwyrm/settings.py @@ -166,6 +166,7 @@ LANGUAGES = [ ("de-de", _("Deutsch (German)")), ("es-es", _("Español (Spanish)")), ("fr-fr", _("Français (French)")), + ("lt-lt", _("lietuvių (Lithuanian)")), ("pt-br", _("Português - Brasil (Brazilian Portuguese)")), ("zh-hans", _("简体中文 (Simplified Chinese)")), ("zh-hant", _("繁體中文 (Traditional Chinese)")), diff --git a/bookwyrm/tasks.py b/bookwyrm/tasks.py index b860e018..09e1d267 100644 --- a/bookwyrm/tasks.py +++ b/bookwyrm/tasks.py @@ -9,3 +9,8 @@ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "celerywyrm.settings") app = Celery( "tasks", broker=settings.CELERY_BROKER_URL, backend=settings.CELERY_RESULT_BACKEND ) + +# priorities +LOW = "low_priority" +MEDIUM = "medium_priority" +HIGH = "high_priority" diff --git a/bookwyrm/templates/discover/card-header.html b/bookwyrm/templates/discover/card-header.html index 0eb9a678..8b9f6fc1 100644 --- a/bookwyrm/templates/discover/card-header.html +++ b/bookwyrm/templates/discover/card-header.html @@ -1,10 +1,24 @@ {% load i18n %} {% load utilities %} -{% with user_path=status.user.local_path username=status.user.display_name book_path=status.book.local_poth book_title=book|book_title %} +{% with user_path=status.user.local_path username=status.user.display_name book_path=book.local_path book_title=book|book_title %} {% if status.status_type == 'GeneratedNote' %} - {{ status.content|safe }} + {% if status.content == 'wants to read' %} + {% blocktrans trimmed %} + {{ username }} wants to read {{ book_title }} + {% endblocktrans %} + {% endif %} + {% if status.content == 'finished reading' %} + {% blocktrans trimmed %} + {{ username }} finished reading {{ book_title }} + {% endblocktrans %} + {% endif %} + {% if status.content == 'started reading' %} + {% blocktrans trimmed %} + {{ username }} started reading {{ book_title }} + {% endblocktrans %} + {% endif %} {% elif status.status_type == 'Rating' %} {% blocktrans trimmed %} {{ username }} rated {{ book_title }} diff --git a/bookwyrm/templates/feed/layout.html b/bookwyrm/templates/feed/layout.html index 8d79781b..6e7ec849 100644 --- a/bookwyrm/templates/feed/layout.html +++ b/bookwyrm/templates/feed/layout.html @@ -9,7 +9,7 @@ {% if user.is_authenticated %}
-

{% trans "Your books" %}

+

{% trans "Your Books" %}

{% if not suggested_books %}

{% trans "There are no books here right now! Try searching for a book to get started" %}

{% else %} diff --git a/bookwyrm/templates/import/import.html b/bookwyrm/templates/import/import.html index 81f0daa5..314a6861 100644 --- a/bookwyrm/templates/import/import.html +++ b/bookwyrm/templates/import/import.html @@ -46,10 +46,10 @@
-
diff --git a/bookwyrm/templates/import/import_status.html b/bookwyrm/templates/import/import_status.html index 1c073944..9b437969 100644 --- a/bookwyrm/templates/import/import_status.html +++ b/bookwyrm/templates/import/import_status.html @@ -6,153 +6,223 @@ {% block title %}{% trans "Import Status" %}{% endblock %} {% block content %}{% spaceless %} -
-

{% trans "Import Status" %}

- {% trans "Back to imports" %} - -
-
-
{% trans "Import started:" %}
-
{{ job.created_date | naturaltime }}
-
- {% if job.complete %} -
-
{% trans "Import completed:" %}
-
{{ task.date_done | naturaltime }}
-
- {% elif task.failed %} -
{% trans "TASK FAILED" %}
+
+

+ {% block page_title %} + {% if job.retry %} + {% trans "Retry Status" %} + {% else %} + {% trans "Import Status" %} {% endif %} -

-
+ {% endblock %} + + + + +
+
+
{% trans "Import started:" %}
+
{{ job.created_date | naturaltime }}
+
+
-
{% if not job.complete %} -

- {% trans "Import still in progress." %} -
- {% trans "(Hit reload to update!)" %} -

+
+
+ + {% trans "In progress" %} + + {% trans "Refresh" %} + +
+
+ + {{ percent }} % + + {{ percent }}% +
+
+ {% endif %} + + {% if manual_review_count and not legacy %} +
+ {% blocktrans trimmed count counter=manual_review_count with display_counter=manual_review_count|intcomma %} + {{ display_counter }} item needs manual approval. + {% plural %} + {{ display_counter }} items need manual approval. + {% endblocktrans %} + {% trans "Review items" %} +
+ {% endif %} + + {% if job.complete and fail_count and not job.retry and not legacy %} +
+ {% blocktrans trimmed count counter=fail_count with display_counter=fail_count|intcomma %} + {{ display_counter }} item failed to import. + {% plural %} + {{ display_counter }} items failed to import. + {% endblocktrans %} + + {% trans "View and troubleshoot failed items" %} + +
+ {% endif %} + + +
+ {% block actions %}{% endblock %} +
+ + + + + + + + + {% block import_cols_headers %} + + + {% endblock %} + + {% if legacy %} + + + + {% else %} + {% for item in items %} + + {% block index_col %} + + {% endblock %} + + + + + + {% block import_cols %} + + + {% endblock %} + + {% block action_row %}{% endblock %} + {% endfor %} + {% endif %} +
+ {% trans "Row" %} + + {% trans "Title" %} + + {% trans "ISBN" %} + + {% trans "Author" %} + + {% trans "Shelf" %} + + {% trans "Review" %} + + {% trans "Book" %} + + {% trans "Status" %} +
+

+ {% trans "Import preview unavailable." %} +

+
+ {{ item.index }} + + {{ item.normalized_data.title }} + + {{ item.isbn|default:'' }} + + {{ item.normalized_data.authors }} + + {{ item.normalized_data.shelf }} + + {% if item.rating %} +

{% include 'snippets/stars.html' with rating=item.rating %}

+ {% endif %} + {% if item.review %} +

{{ item.review|truncatechars:100 }}

+ {% endif %} + {% if item.linked_review %} + {% trans "View imported review" %} + {% endif %} +
+ {% if item.book %} + + {% include 'snippets/book_cover.html' with book=item.book cover_class='is-h-s' size='small' %} + + {% endif %} + + {% if item.book %} + + {% trans "Imported" %} + + {% elif item.fail_reason %} + + + {% if item.book_guess %} + {% trans "Needs manual review" %} + {% else %} + {{ item.fail_reason }} + {% endif %} + + {% else %} +
+ + {% trans "Pending" %} + {# retry option if an item appears to be hanging #} + {% if job.created_date != job.updated_date and inactive_time > 24 %} +
+ {% csrf_token %} + +
+ {% endif %} +
+ {% endif %} +
+
+ {% if legacy %} +
+
+ {% csrf_token %} +

+ {% trans "This import is in an old format that is no longer supported. If you would like to troubleshoot missing items from this import, click the button below to update the import format." %} +

+ +
+
{% endif %}
-{% if failed_items %} -
-

{% trans "Failed to load" %}

- {% if not job.retry %} -
- {% csrf_token %} - - {% with failed_count=failed_items|length %} - {% if failed_count > 10 %} -

- - {% blocktrans %}Jump to the bottom of the list to select the {{ failed_count }} items which failed to import.{% endblocktrans %} - -

- {% endif %} - {% endwith %} - -
-
    - {% for item in failed_items %} -
  • - - -
  • - {% endfor %} -
-
- -
- - - - - -
-
- -
- - {% else %} - - {% endif %} +{% if not legacy %} +
+ {% include 'snippets/pagination.html' with page=items %}
{% endif %} - -
- {% if job.complete %} -

{% trans "Successfully imported" %}

- {% else %} -

{% trans "Import Progress" %}

- {% endif %} - - - - - - - - {% for item in items %} - - - - - - - {% endfor %} -
- {% trans "Book" %} - - {% trans "Title" %} - - {% trans "Author" %} - -
- {% if item.book %} - - {% include 'snippets/book_cover.html' with book=item.book cover_class='is-h-s' size='small' %} - - {% endif %} - - {{ item.data.Title }} - - {{ item.data.Author }} - - {% if item.book %} - - {% trans "Imported" %} - - {% endif %} -
-
{% endspaceless %}{% endblock %} {% block scripts %} diff --git a/bookwyrm/templates/import/manual_review.html b/bookwyrm/templates/import/manual_review.html new file mode 100644 index 00000000..7e429a0f --- /dev/null +++ b/bookwyrm/templates/import/manual_review.html @@ -0,0 +1,75 @@ +{% extends 'import/import_status.html' %} +{% load i18n %} +{% load utilities %} + +{% block title %}{% trans "Import Troubleshooting" %}{% endblock %} + +{% block page_title %} +{% trans "Review items" %} +{% endblock %} + +{% block breadcrumbs %} +
  • + {% trans "Review" %} +
  • +{% endblock %} + +{% block actions %} +
    +
    +

    + {% trans "Approving a suggestion will permanently add the suggested book to your shelves and associate your reading dates, reviews, and ratings with that book." %} +

    +
    +
    +{% endblock %} + +{% block import_cols_headers %} +{% endblock %} + +{% block index_col %} + + {{ item.index }} + +{% endblock %} + +{% block import_cols %} +{% endblock %} + +{% block action_row %} + + +
    + {% with guess=item.book_guess %} + +
    +

    + {% include 'snippets/book_titleby.html' with book=guess %} +

    +
    +
    + {% csrf_token %} + +
    + +
    + {% csrf_token %} + +
    +
    +
    + {% endwith %} +
    + + +{% endblock %} diff --git a/bookwyrm/templates/import/troubleshoot.html b/bookwyrm/templates/import/troubleshoot.html new file mode 100644 index 00000000..d73be6d0 --- /dev/null +++ b/bookwyrm/templates/import/troubleshoot.html @@ -0,0 +1,36 @@ +{% extends 'import/import_status.html' %} +{% load i18n %} + +{% block title %}{% trans "Import Troubleshooting" %}{% endblock %} + +{% block page_title %} +{% trans "Failed items" %} +{% endblock %} + +{% block breadcrumbs %} +
  • + {% trans "Troubleshooting" %} +
  • +{% endblock %} + +{% block actions %} +
    +
    +

    + {% trans "Re-trying an import can fix missing items in cases such as:" %} +

    +
      +
    • {% trans "The book has been added to the instance since this import" %}
    • +
    • {% trans "A transient error or timeout caused the external data source to be unavailable." %}
    • +
    • {% trans "BookWyrm has been updated since this import with a bug fix" %}
    • +
    +

    + {% trans "Contact your admin or open an issue if you are seeing unexpected failed items." %} +

    +
    +
    + {% csrf_token %} + +
    +
    +{% endblock %} diff --git a/bookwyrm/templates/shelf/shelf.html b/bookwyrm/templates/shelf/shelf.html index 662d7507..01d41aa0 100644 --- a/bookwyrm/templates/shelf/shelf.html +++ b/bookwyrm/templates/shelf/shelf.html @@ -5,7 +5,7 @@ {% load i18n %} {% block title %} -{% include 'user/books_header.html' %} +{% include 'user/books_header.html' with shelf=shelf %} {% endblock %} {% block opengraph_images %} diff --git a/bookwyrm/templates/snippets/book_titleby.html b/bookwyrm/templates/snippets/book_titleby.html index 1c2bb176..6dbaeb26 100644 --- a/bookwyrm/templates/snippets/book_titleby.html +++ b/bookwyrm/templates/snippets/book_titleby.html @@ -5,11 +5,9 @@ {% if book.authors.exists %} {% blocktrans trimmed with path=book.local_path title=book|book_title %} {{ title }} by -{% endblocktrans %} -{% include 'snippets/authors.html' with book=book limit=3 %} +{% endblocktrans %} {% include 'snippets/authors.html' with book=book limit=3 %} {% else %} {{ book|book_title }} {% endif %} - {% endspaceless %} diff --git a/bookwyrm/templates/user/books_header.html b/bookwyrm/templates/user/books_header.html index 8fea84c7..7311e242 100644 --- a/bookwyrm/templates/user/books_header.html +++ b/bookwyrm/templates/user/books_header.html @@ -1,6 +1,16 @@ {% load i18n %} {% if is_self %} +{% if shelf.identifier == 'to-read' %} +{% trans "To Read" %} +{% elif shelf.identifier == 'reading' %} +{% trans "Currently Reading" %} +{% elif shelf.identifier == 'read' %} +{% trans "Read" %} +{% elif shelf.identifier == 'all' %} {% trans "Your books" %} {% else %} +{{ shelf.name }} +{% endif %} +{% else %} {% blocktrans with username=user.display_name %}{{ username }}'s books{% endblocktrans %} {% endif %} diff --git a/bookwyrm/tests/activitypub/test_base_activity.py b/bookwyrm/tests/activitypub/test_base_activity.py index 7117eb52..b951c7ab 100644 --- a/bookwyrm/tests/activitypub/test_base_activity.py +++ b/bookwyrm/tests/activitypub/test_base_activity.py @@ -146,7 +146,7 @@ class BaseActivity(TestCase): self.user.avatar.file # pylint: disable=pointless-statement # this would trigger a broadcast because it's a local user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): activity.to_model(model=models.User, instance=self.user) self.assertIsNotNone(self.user.avatar.file) self.assertEqual(self.user.name, "New Name") @@ -154,7 +154,7 @@ class BaseActivity(TestCase): def test_to_model_many_to_many(self, *_): """annoying that these all need special handling""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): status = models.Status.objects.create( content="test status", user=self.user, @@ -186,7 +186,7 @@ class BaseActivity(TestCase): def test_to_model_one_to_many(self, *_): """these are reversed relationships, where the secondary object keys the primary object but not vice versa""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): status = models.Status.objects.create( content="test status", user=self.user, @@ -224,7 +224,7 @@ class BaseActivity(TestCase): @responses.activate def test_set_related_field(self, *_): """celery task to add back-references to created objects""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): status = models.Status.objects.create( content="test status", user=self.user, diff --git a/bookwyrm/tests/activitystreams/test_abstractstream.py b/bookwyrm/tests/activitystreams/test_abstractstream.py index f9674286..17a1b587 100644 --- a/bookwyrm/tests/activitystreams/test_abstractstream.py +++ b/bookwyrm/tests/activitystreams/test_abstractstream.py @@ -4,7 +4,7 @@ from django.test import TestCase from bookwyrm import activitystreams, models -@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") +@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") @patch("bookwyrm.activitystreams.add_status_task.delay") @patch("bookwyrm.activitystreams.add_book_statuses_task.delay") @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay") diff --git a/bookwyrm/tests/activitystreams/test_booksstream.py b/bookwyrm/tests/activitystreams/test_booksstream.py index d6d94b73..347e7a94 100644 --- a/bookwyrm/tests/activitystreams/test_booksstream.py +++ b/bookwyrm/tests/activitystreams/test_booksstream.py @@ -4,7 +4,7 @@ from django.test import TestCase from bookwyrm import activitystreams, models -@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") +@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") @patch("bookwyrm.activitystreams.add_status_task.delay") @patch("bookwyrm.activitystreams.add_book_statuses_task.delay") @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay") diff --git a/bookwyrm/tests/activitystreams/test_homestream.py b/bookwyrm/tests/activitystreams/test_homestream.py index 42a73f3c..d48bdfba 100644 --- a/bookwyrm/tests/activitystreams/test_homestream.py +++ b/bookwyrm/tests/activitystreams/test_homestream.py @@ -4,7 +4,7 @@ from django.test import TestCase from bookwyrm import activitystreams, models -@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") +@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") @patch("bookwyrm.activitystreams.add_status_task.delay") @patch("bookwyrm.activitystreams.add_book_statuses_task.delay") @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay") diff --git a/bookwyrm/tests/activitystreams/test_localstream.py b/bookwyrm/tests/activitystreams/test_localstream.py index e6b05557..fa1a6741 100644 --- a/bookwyrm/tests/activitystreams/test_localstream.py +++ b/bookwyrm/tests/activitystreams/test_localstream.py @@ -4,7 +4,7 @@ from django.test import TestCase from bookwyrm import activitystreams, models -@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") +@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") @patch("bookwyrm.activitystreams.add_status_task.delay") @patch("bookwyrm.activitystreams.add_book_statuses_task.delay") @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay") diff --git a/bookwyrm/tests/activitystreams/test_signals.py b/bookwyrm/tests/activitystreams/test_signals.py index eb70d28e..34aeb947 100644 --- a/bookwyrm/tests/activitystreams/test_signals.py +++ b/bookwyrm/tests/activitystreams/test_signals.py @@ -4,7 +4,7 @@ from django.test import TestCase from bookwyrm import activitystreams, models -@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") +@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") class ActivitystreamsSignals(TestCase): """using redis to build activity streams""" @@ -53,11 +53,12 @@ class ActivitystreamsSignals(TestCase): status = models.Status.objects.create( user=self.remote_user, content="hi", privacy="public" ) - with patch("bookwyrm.activitystreams.add_status_task.delay") as mock: + with patch("bookwyrm.activitystreams.add_status_task.apply_async") as mock: activitystreams.add_status_on_create_command(models.Status, status, False) self.assertEqual(mock.call_count, 1) - args = mock.call_args[0] - self.assertEqual(args[0], status.id) + args = mock.call_args[1] + self.assertEqual(args["args"][0], status.id) + self.assertEqual(args["queue"], "high_priority") def test_populate_streams_on_account_create(self, _): """create streams for a user""" diff --git a/bookwyrm/tests/activitystreams/test_tasks.py b/bookwyrm/tests/activitystreams/test_tasks.py index 80b0b771..f5750763 100644 --- a/bookwyrm/tests/activitystreams/test_tasks.py +++ b/bookwyrm/tests/activitystreams/test_tasks.py @@ -34,7 +34,7 @@ class Activitystreams(TestCase): ) work = models.Work.objects.create(title="test work") self.book = models.Edition.objects.create(title="test book", parent_work=work) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): self.status = models.Status.objects.create( content="hi", user=self.local_user ) @@ -133,7 +133,7 @@ class Activitystreams(TestCase): @patch("bookwyrm.activitystreams.LocalStream.remove_object_from_related_stores") @patch("bookwyrm.activitystreams.BooksStream.remove_object_from_related_stores") - @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") + @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") def test_boost_to_another_timeline(self, *_): """boost from a non-follower doesn't remove original status from feed""" status = models.Status.objects.create(user=self.local_user, content="hi") @@ -155,7 +155,7 @@ class Activitystreams(TestCase): @patch("bookwyrm.activitystreams.LocalStream.remove_object_from_related_stores") @patch("bookwyrm.activitystreams.BooksStream.remove_object_from_related_stores") - @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") + @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") def test_boost_to_another_timeline_remote(self, *_): """boost from a remote non-follower doesn't remove original status from feed""" status = models.Status.objects.create(user=self.local_user, content="hi") @@ -177,7 +177,7 @@ class Activitystreams(TestCase): @patch("bookwyrm.activitystreams.LocalStream.remove_object_from_related_stores") @patch("bookwyrm.activitystreams.BooksStream.remove_object_from_related_stores") - @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") + @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") def test_boost_to_following_timeline(self, *_): """add a boost and deduplicate the boosted status on the timeline""" self.local_user.following.add(self.another_user) @@ -199,7 +199,7 @@ class Activitystreams(TestCase): @patch("bookwyrm.activitystreams.LocalStream.remove_object_from_related_stores") @patch("bookwyrm.activitystreams.BooksStream.remove_object_from_related_stores") - @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") + @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") def test_boost_to_same_timeline(self, *_): """add a boost and deduplicate the boosted status on the timeline""" status = models.Status.objects.create(user=self.local_user, content="hi") diff --git a/bookwyrm/tests/data/generic.csv b/bookwyrm/tests/data/generic.csv new file mode 100644 index 00000000..470ce7a8 --- /dev/null +++ b/bookwyrm/tests/data/generic.csv @@ -0,0 +1,5 @@ +id,title,author,ISBN13,rating,shelf,review,added,finished +38,Gideon the Ninth,Tamsyn Muir,"9781250313195",,read,,2021-11-10,2021-11-11 +48,Harrow the Ninth,Tamsyn Muir,,3,read,,2021-11-10 +23,Subcutanean,Aaron A. Reed,,,read,,2021-11-10 +10,Patisserie at Home,Mélanie Dupuis,"9780062445315",2,read,"mixed feelings",2021-11-10,2021-11-11 diff --git a/bookwyrm/tests/data/goodreads-rating.csv b/bookwyrm/tests/data/goodreads-rating.csv deleted file mode 100644 index fec0c77d..00000000 --- a/bookwyrm/tests/data/goodreads-rating.csv +++ /dev/null @@ -1,5 +0,0 @@ -Book Id,Title,Author,Author l-f,Additional Authors,ISBN,ISBN13,My Rating,Average Rating,Publisher,Binding,Number of Pages,Year Published,Original Publication Year,Date Read,Date Added,Bookshelves,Bookshelves with positions,Exclusive Shelf,My Review,Spoiler,Private Notes,Read Count,Recommended For,Recommended By,Owned Copies,Original Purchase Date,Original Purchase Location,Condition,Condition Description,BCID -42036538,Gideon the Ninth (The Locked Tomb #1),Tamsyn Muir,"Muir, Tamsyn",,"=""1250313198""","=""9781250313195""",0,4.20,Tor,Hardcover,448,2019,2019,2020/10/25,2020/10/21,,,read,,,,1,,,0,,,,, -52691223,Subcutanean,Aaron A. Reed,"Reed, Aaron A.",,"=""""","=""""",0,4.45,,Paperback,232,2020,,2020/03/06,2020/03/05,,,read,,,,1,,,0,,,,, -28694510,Patisserie at Home,Mélanie Dupuis,"Dupuis, Mélanie",Anne Cazor,"=""0062445316""","=""9780062445315""",2,4.60,Harper Design,Hardcover,288,2016,,,2019/07/08,,,read,,,,2,,,0,,,,, - diff --git a/bookwyrm/tests/data/goodreads.csv b/bookwyrm/tests/data/goodreads.csv index 5f124edc..a0a8232e 100644 --- a/bookwyrm/tests/data/goodreads.csv +++ b/bookwyrm/tests/data/goodreads.csv @@ -1,4 +1,4 @@ Book Id,Title,Author,Author l-f,Additional Authors,ISBN,ISBN13,My Rating,Average Rating,Publisher,Binding,Number of Pages,Year Published,Original Publication Year,Date Read,Date Added,Bookshelves,Bookshelves with positions,Exclusive Shelf,My Review,Spoiler,Private Notes,Read Count,Recommended For,Recommended By,Owned Copies,Original Purchase Date,Original Purchase Location,Condition,Condition Description,BCID -42036538,Gideon the Ninth (The Locked Tomb #1),Tamsyn Muir,"Muir, Tamsyn",,"=""1250313198""","=""9781250313195""",0,4.20,Tor,Hardcover,448,2019,2019,2020/10/25,2020/10/21,,,read,,,,1,,,0,,,,, +42036538,Gideon the Ninth (The Locked Tomb #1),Tamsyn Muir,"Muir, Tamsyn",,"=""1250313198""","=""9781250313195""",3,4.20,Tor,Hardcover,448,2019,2019,2020/10/25,2020/10/21,,,read,,,,1,,,0,,,,, 52691223,Subcutanean,Aaron A. Reed,"Reed, Aaron A.",,"=""""","=""""",0,4.45,,Paperback,232,2020,,2020/03/06,2020/03/05,,,read,,,,1,,,0,,,,, 28694510,Patisserie at Home,Mélanie Dupuis,"Dupuis, Mélanie",Anne Cazor,"=""0062445316""","=""9780062445315""",2,4.60,Harper Design,Hardcover,288,2016,,,2019/07/08,,,read,"mixed feelings",,,2,,,0,,,,, diff --git a/bookwyrm/tests/data/librarything.tsv b/bookwyrm/tests/data/librarything.tsv index a707f2a9..68bbe48e 100644 --- a/bookwyrm/tests/data/librarything.tsv +++ b/bookwyrm/tests/data/librarything.tsv @@ -1,4 +1,4 @@ Book Id Title Sort Character Primary Author Primary Author Role Secondary Author Secondary Author Roles Publication Date Review Rating Comment Private Comment Summary Media Physical Description Weight Height Thickness Length Dimensions Page Count LCCN Acquired Date Started Date Read Barcode BCID Tags Collections Languages Original Languages LC Classification ISBN ISBNs Subjects Dewey Decimal Dewey Wording Other Call Number Copies Source Entry Date From Where OCLC Work id Lending Patron Lending Status Lending Start Lending End -5498194 Marelle 1 Cortázar, Julio Gallimard (1979), Poche 1979 chef d'oeuvre 4.5 Marelle by Julio Cortázar (1979) Broché 590 p.; 7.24 inches 1.28 pounds 7.24 inches 1.26 inches 4.96 inches 7.24 x 4.96 x 1.26 inches 590 [2007-04-16] [2007-05-08] roman, espagnol, expérimental, bohème, philosophie Your library French Spanish PQ7797 .C7145 [2070291340] 2070291340, 9782070291342 Cortazar, Julio. Rayuela 863 Literature > Spanish And Portuguese > Spanish fiction 1 Amazon.fr [2006-08-09] 57814 +5498194 Marelle 1 Cortazar, Julio Gallimard (1979), Poche 1979 chef d'oeuvre 4.5 Marelle by Julio Cortázar (1979) Broché 590 p.; 7.24 inches 1.28 pounds 7.24 inches 1.26 inches 4.96 inches 7.24 x 4.96 x 1.26 inches 590 [2007-04-16] [2007-05-08] roman, espagnol, expérimental, bohème, philosophie Your library French Spanish PQ7797 .C7145 [2070291340] 2070291340, 9782070291342 Cortazar, Julio. Rayuela 863 Literature > Spanish And Portuguese > Spanish fiction 1 Amazon.fr [2006-08-09] 57814 5015319 Le grand incendie de Londres: Récit, avec incises et bifurcations, 1985-1987 (Fiction & Cie) 1 Roubaud, Jacques Seuil (1989), Unknown Binding 1989 5 Le grand incendie de Londres: Récit, avec incises et bifurcations, 1985-1987 (Fiction & Cie) by Jacques Roubaud (1989) Broché 411 p.; 7.72 inches 0.88 pounds 7.72 inches 1.02 inches 5.43 inches 7.72 x 5.43 x 1.02 inches 411 Your library English PQ2678 .O77 [2020104725] 2020104725, 9782020104722 Autobiographical fiction|Roubaud, Jacques > Fiction 813 American And Canadian > Fiction > Literature 1 Amazon.com [2006-07-25] 478910 5015399 Le Maître et Marguerite 1 Boulgakov, Mikhaïl Pocket (1994), Poche 1994 Le Maître et Marguerite by Mikhaïl Boulgakov (1994) Broché 579 p.; 7.09 inches 0.66 pounds 7.09 inches 1.18 inches 4.33 inches 7.09 x 4.33 x 1.18 inches 579 Your library French PG3476 .B78 [2266062328] 2266062328, 9782266062329 Allegories|Bulgakov|Good and evil > Fiction|Humanities|Jerusalem > Fiction|Jesus Christ > Fiction|Literature|Mental illness > Fiction|Moscow (Russia) > Fiction|Novel|Pilate, Pontius, 1st cent. > Fiction|Political fiction|Russia > Fiction|Russian fiction|Russian publications (Form Entry)|Soviet Union > History > 1925-1953 > Fiction|literature 891.7342 1917-1945 > 1917-1991 (USSR) > Literature > Literature of other Indo-European languages > Other Languages > Russian > Russian Fiction 1 Amazon.fr [2006-07-25] 10151 diff --git a/bookwyrm/tests/data/storygraph.csv b/bookwyrm/tests/data/storygraph.csv new file mode 100644 index 00000000..4dd0b16e --- /dev/null +++ b/bookwyrm/tests/data/storygraph.csv @@ -0,0 +1,3 @@ +Title,Authors,Contributors,ISBN,Format,Read Status,Date Added,Last Date Read,Dates Read,Read Count,Moods,Pace,Character- or Plot-Driven?,Strong Character Development?,Loveable Characters?,Diverse Characters?,Flawed Characters?,Star Rating,Review,Content Warnings,Content Warning Description,Tags,Owned? +Always Coming Home,"Ursula K. Le Guin, Todd Barton, Margaret Chodos-Irvine","",,,to-read,2021/05/10,"","",0,"",,,,,,,,,"",,"",No +Subprime Attention Crisis,Tim Hwang,"",,,read,2021/05/10,"","",1,informative,fast,,,,,,5.0,"","","","",No diff --git a/bookwyrm/tests/importers/test_goodreads_import.py b/bookwyrm/tests/importers/test_goodreads_import.py index d2b0ea7d..0a421df4 100644 --- a/bookwyrm/tests/importers/test_goodreads_import.py +++ b/bookwyrm/tests/importers/test_goodreads_import.py @@ -1,17 +1,14 @@ """ testing import """ -from collections import namedtuple -import csv import pathlib from unittest.mock import patch import datetime import pytz from django.test import TestCase -import responses from bookwyrm import models from bookwyrm.importers import GoodreadsImporter -from bookwyrm.importers.importer import import_data, handle_imported_book +from bookwyrm.importers.importer import handle_imported_book def make_date(*args): @@ -34,7 +31,7 @@ class GoodreadsImport(TestCase): with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" ): - self.user = models.User.objects.create_user( + self.local_user = models.User.objects.create_user( "mouse", "mouse@mouse.mouse", "password", local=True ) @@ -47,15 +44,17 @@ class GoodreadsImport(TestCase): def test_create_job(self, *_): """creates the import job entry and checks csv""" - import_job = self.importer.create_job(self.user, self.csv, False, "public") - self.assertEqual(import_job.user, self.user) - self.assertEqual(import_job.include_reviews, False) - self.assertEqual(import_job.privacy, "public") + import_job = self.importer.create_job( + self.local_user, self.csv, False, "public" + ) import_items = models.ImportItem.objects.filter(job=import_job).all() self.assertEqual(len(import_items), 3) self.assertEqual(import_items[0].index, 0) self.assertEqual(import_items[0].data["Book Id"], "42036538") + self.assertEqual(import_items[0].normalized_data["isbn_13"], '="9781250313195"') + self.assertEqual(import_items[0].normalized_data["isbn_10"], '="1250313198"') + self.assertEqual(import_items[1].index, 1) self.assertEqual(import_items[1].data["Book Id"], "52691223") self.assertEqual(import_items[2].index, 2) @@ -63,12 +62,16 @@ class GoodreadsImport(TestCase): def test_create_retry_job(self, *_): """trying again with items that didn't import""" - import_job = self.importer.create_job(self.user, self.csv, False, "unlisted") + import_job = self.importer.create_job( + self.local_user, self.csv, False, "unlisted" + ) import_items = models.ImportItem.objects.filter(job=import_job).all()[:2] - retry = self.importer.create_retry_job(self.user, import_job, import_items) + retry = self.importer.create_retry_job( + self.local_user, import_job, import_items + ) self.assertNotEqual(import_job, retry) - self.assertEqual(retry.user, self.user) + self.assertEqual(retry.user, self.local_user) self.assertEqual(retry.include_reviews, False) self.assertEqual(retry.privacy, "unlisted") @@ -79,52 +82,20 @@ class GoodreadsImport(TestCase): self.assertEqual(retry_items[1].index, 1) self.assertEqual(retry_items[1].data["Book Id"], "52691223") - def test_start_import(self, *_): - """begin loading books""" - import_job = self.importer.create_job(self.user, self.csv, False, "unlisted") - MockTask = namedtuple("Task", ("id")) - mock_task = MockTask(7) - with patch("bookwyrm.importers.importer.import_data.delay") as start: - start.return_value = mock_task - self.importer.start_import(import_job) - import_job.refresh_from_db() - self.assertEqual(import_job.task_id, "7") - - @responses.activate - def test_import_data(self, *_): - """resolve entry""" - import_job = self.importer.create_job(self.user, self.csv, False, "unlisted") - book = models.Edition.objects.create(title="Test Book") - - with patch( - "bookwyrm.models.import_job.ImportItem.get_book_from_isbn" - ) as resolve: - resolve.return_value = book - with patch("bookwyrm.importers.importer.handle_imported_book"): - import_data(self.importer.service, import_job.id) - - import_item = models.ImportItem.objects.get(job=import_job, index=0) - self.assertEqual(import_item.book.id, book.id) - def test_handle_imported_book(self, *_): """goodreads import added a book, this adds related connections""" - shelf = self.user.shelf_set.filter(identifier="read").first() + shelf = self.local_user.shelf_set.filter(identifier="read").first() self.assertIsNone(shelf.books.first()) - import_job = models.ImportJob.objects.create(user=self.user) - datafile = pathlib.Path(__file__).parent.joinpath("../data/goodreads.csv") - csv_file = open(datafile, "r") # pylint: disable=unspecified-encoding - for index, entry in enumerate(list(csv.DictReader(csv_file))): - entry = self.importer.parse_fields(entry) - import_item = models.ImportItem.objects.create( - job_id=import_job.id, index=index, data=entry, book=self.book - ) - break + import_job = self.importer.create_job( + self.local_user, self.csv, False, "public" + ) + import_item = import_job.items.first() + import_item.book = self.book + import_item.save() - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): - handle_imported_book( - self.importer.service, self.user, import_item, False, "public" - ) + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): + handle_imported_book(import_item) shelf.refresh_from_db() self.assertEqual(shelf.books.first(), self.book) @@ -132,77 +103,7 @@ class GoodreadsImport(TestCase): shelf.shelfbook_set.first().shelved_date, make_date(2020, 10, 21) ) - readthrough = models.ReadThrough.objects.get(user=self.user) - self.assertEqual(readthrough.book, self.book) - self.assertEqual(readthrough.start_date, make_date(2020, 10, 21)) - self.assertEqual(readthrough.finish_date, make_date(2020, 10, 25)) - - def test_handle_imported_book_already_shelved(self, *_): - """goodreads import added a book, this adds related connections""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): - shelf = self.user.shelf_set.filter(identifier="to-read").first() - models.ShelfBook.objects.create( - shelf=shelf, - user=self.user, - book=self.book, - shelved_date=make_date(2020, 2, 2), - ) - - import_job = models.ImportJob.objects.create(user=self.user) - datafile = pathlib.Path(__file__).parent.joinpath("../data/goodreads.csv") - csv_file = open(datafile, "r") # pylint: disable=unspecified-encoding - for index, entry in enumerate(list(csv.DictReader(csv_file))): - entry = self.importer.parse_fields(entry) - import_item = models.ImportItem.objects.create( - job_id=import_job.id, index=index, data=entry, book=self.book - ) - break - - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): - handle_imported_book( - self.importer.service, self.user, import_item, False, "public" - ) - - shelf.refresh_from_db() - self.assertEqual(shelf.books.first(), self.book) - self.assertEqual( - shelf.shelfbook_set.first().shelved_date, make_date(2020, 2, 2) - ) - self.assertIsNone(self.user.shelf_set.get(identifier="read").books.first()) - - readthrough = models.ReadThrough.objects.get(user=self.user) - self.assertEqual(readthrough.book, self.book) - self.assertEqual(readthrough.start_date, make_date(2020, 10, 21)) - self.assertEqual(readthrough.finish_date, make_date(2020, 10, 25)) - - def test_handle_import_twice(self, *_): - """re-importing books""" - shelf = self.user.shelf_set.filter(identifier="read").first() - import_job = models.ImportJob.objects.create(user=self.user) - datafile = pathlib.Path(__file__).parent.joinpath("../data/goodreads.csv") - csv_file = open(datafile, "r") # pylint: disable=unspecified-encoding - for index, entry in enumerate(list(csv.DictReader(csv_file))): - entry = self.importer.parse_fields(entry) - import_item = models.ImportItem.objects.create( - job_id=import_job.id, index=index, data=entry, book=self.book - ) - break - - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): - handle_imported_book( - self.importer.service, self.user, import_item, False, "public" - ) - handle_imported_book( - self.importer.service, self.user, import_item, False, "public" - ) - - shelf.refresh_from_db() - self.assertEqual(shelf.books.first(), self.book) - self.assertEqual( - shelf.shelfbook_set.first().shelved_date, make_date(2020, 10, 21) - ) - - readthrough = models.ReadThrough.objects.get(user=self.user) + readthrough = models.ReadThrough.objects.get(user=self.local_user) self.assertEqual(readthrough.book, self.book) self.assertEqual(readthrough.start_date, make_date(2020, 10, 21)) self.assertEqual(readthrough.finish_date, make_date(2020, 10, 25)) @@ -210,20 +111,17 @@ class GoodreadsImport(TestCase): @patch("bookwyrm.activitystreams.add_status_task.delay") def test_handle_imported_book_review(self, *_): """goodreads review import""" - import_job = models.ImportJob.objects.create(user=self.user) - datafile = pathlib.Path(__file__).parent.joinpath("../data/goodreads.csv") - csv_file = open(datafile, "r") # pylint: disable=unspecified-encoding - entry = list(csv.DictReader(csv_file))[2] - entry = self.importer.parse_fields(entry) - import_item = models.ImportItem.objects.create( - job_id=import_job.id, index=0, data=entry, book=self.book + import_job = self.importer.create_job( + self.local_user, self.csv, True, "unlisted" ) + import_item = import_job.items.get(index=2) + import_item.book = self.book + import_item.save() - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): - handle_imported_book( - self.importer.service, self.user, import_item, True, "unlisted" - ) - review = models.Review.objects.get(book=self.book, user=self.user) + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): + handle_imported_book(import_item) + + review = models.Review.objects.get(book=self.book, user=self.local_user) self.assertEqual(review.content, "mixed feelings") self.assertEqual(review.rating, 2) self.assertEqual(review.published_date, make_date(2019, 7, 8)) @@ -232,42 +130,18 @@ class GoodreadsImport(TestCase): @patch("bookwyrm.activitystreams.add_status_task.delay") def test_handle_imported_book_rating(self, *_): """goodreads rating import""" - import_job = models.ImportJob.objects.create(user=self.user) - datafile = pathlib.Path(__file__).parent.joinpath( - "../data/goodreads-rating.csv" - ) - csv_file = open(datafile, "r") # pylint: disable=unspecified-encoding - entry = list(csv.DictReader(csv_file))[2] - entry = self.importer.parse_fields(entry) - import_item = models.ImportItem.objects.create( - job_id=import_job.id, index=0, data=entry, book=self.book + import_job = self.importer.create_job( + self.local_user, self.csv, True, "unlisted" ) + import_item = import_job.items.filter(index=0).first() + import_item.book = self.book + import_item.save() - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): - handle_imported_book( - self.importer.service, self.user, import_item, True, "unlisted" - ) - review = models.ReviewRating.objects.get(book=self.book, user=self.user) + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): + handle_imported_book(import_item) + + review = models.ReviewRating.objects.get(book=self.book, user=self.local_user) self.assertIsInstance(review, models.ReviewRating) - self.assertEqual(review.rating, 2) - self.assertEqual(review.published_date, make_date(2019, 7, 8)) + self.assertEqual(review.rating, 3) + self.assertEqual(review.published_date, make_date(2020, 10, 25)) self.assertEqual(review.privacy, "unlisted") - - def test_handle_imported_book_reviews_disabled(self, *_): - """goodreads review import""" - import_job = models.ImportJob.objects.create(user=self.user) - datafile = pathlib.Path(__file__).parent.joinpath("../data/goodreads.csv") - csv_file = open(datafile, "r") # pylint: disable=unspecified-encoding - entry = list(csv.DictReader(csv_file))[2] - entry = self.importer.parse_fields(entry) - import_item = models.ImportItem.objects.create( - job_id=import_job.id, index=0, data=entry, book=self.book - ) - - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): - handle_imported_book( - self.importer.service, self.user, import_item, False, "unlisted" - ) - self.assertFalse( - models.Review.objects.filter(book=self.book, user=self.user).exists() - ) diff --git a/bookwyrm/tests/importers/test_importer.py b/bookwyrm/tests/importers/test_importer.py new file mode 100644 index 00000000..5c3b2031 --- /dev/null +++ b/bookwyrm/tests/importers/test_importer.py @@ -0,0 +1,346 @@ +""" testing import """ +import pathlib +from unittest.mock import patch +import datetime +import pytz + +from django.test import TestCase +import responses + +from bookwyrm import models +from bookwyrm.importers import Importer +from bookwyrm.importers.importer import start_import_task, import_item_task +from bookwyrm.importers.importer import handle_imported_book + + +def make_date(*args): + """helper function to easily generate a date obj""" + return datetime.datetime(*args, tzinfo=pytz.UTC) + + +# pylint: disable=consider-using-with +@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay") +@patch("bookwyrm.activitystreams.populate_stream_task.delay") +@patch("bookwyrm.activitystreams.add_book_statuses_task.delay") +class GenericImporter(TestCase): + """importing from csv""" + + def setUp(self): + """use a test csv""" + + self.importer = Importer() + datafile = pathlib.Path(__file__).parent.joinpath("../data/generic.csv") + self.csv = open(datafile, "r", encoding=self.importer.encoding) + with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( + "bookwyrm.activitystreams.populate_stream_task.delay" + ): + self.local_user = models.User.objects.create_user( + "mouse", "mouse@mouse.mouse", "password", local=True + ) + + work = models.Work.objects.create(title="Test Work") + self.book = models.Edition.objects.create( + title="Example Edition", + remote_id="https://example.com/book/1", + parent_work=work, + ) + + def test_create_job(self, *_): + """creates the import job entry and checks csv""" + import_job = self.importer.create_job( + self.local_user, self.csv, False, "public" + ) + self.assertEqual(import_job.user, self.local_user) + self.assertEqual(import_job.include_reviews, False) + self.assertEqual(import_job.privacy, "public") + + import_items = models.ImportItem.objects.filter(job=import_job).all() + self.assertEqual(len(import_items), 4) + self.assertEqual(import_items[0].index, 0) + self.assertEqual(import_items[0].normalized_data["id"], "38") + self.assertEqual(import_items[0].normalized_data["title"], "Gideon the Ninth") + self.assertEqual(import_items[0].normalized_data["authors"], "Tamsyn Muir") + self.assertEqual(import_items[0].normalized_data["isbn_13"], "9781250313195") + self.assertIsNone(import_items[0].normalized_data["isbn_10"]) + self.assertEqual(import_items[0].normalized_data["shelf"], "read") + + self.assertEqual(import_items[1].index, 1) + self.assertEqual(import_items[1].normalized_data["id"], "48") + self.assertEqual(import_items[1].normalized_data["title"], "Harrow the Ninth") + + self.assertEqual(import_items[2].index, 2) + self.assertEqual(import_items[2].normalized_data["id"], "23") + self.assertEqual(import_items[2].normalized_data["title"], "Subcutanean") + + self.assertEqual(import_items[3].index, 3) + self.assertEqual(import_items[3].normalized_data["id"], "10") + self.assertEqual(import_items[3].normalized_data["title"], "Patisserie at Home") + + def test_create_retry_job(self, *_): + """trying again with items that didn't import""" + import_job = self.importer.create_job( + self.local_user, self.csv, False, "unlisted" + ) + import_items = models.ImportItem.objects.filter(job=import_job).all()[:2] + + retry = self.importer.create_retry_job( + self.local_user, import_job, import_items + ) + self.assertNotEqual(import_job, retry) + self.assertEqual(retry.user, self.local_user) + self.assertEqual(retry.include_reviews, False) + self.assertEqual(retry.privacy, "unlisted") + + retry_items = models.ImportItem.objects.filter(job=retry).all() + self.assertEqual(len(retry_items), 2) + self.assertEqual(retry_items[0].index, 0) + self.assertEqual(retry_items[0].normalized_data["id"], "38") + self.assertEqual(retry_items[1].index, 1) + self.assertEqual(retry_items[1].normalized_data["id"], "48") + + def test_start_import(self, *_): + """check that a task was created""" + import_job = self.importer.create_job( + self.local_user, self.csv, False, "unlisted" + ) + with patch("bookwyrm.importers.importer.start_import_task.delay") as mock: + self.importer.start_import(import_job) + self.assertEqual(mock.call_count, 1) + + @responses.activate + def test_start_import_task(self, *_): + """resolve entry""" + import_job = self.importer.create_job( + self.local_user, self.csv, False, "unlisted" + ) + + with patch("bookwyrm.importers.importer.import_item_task.delay") as mock: + start_import_task(import_job.id) + + self.assertEqual(mock.call_count, 4) + + @responses.activate + def test_import_item_task(self, *_): + """resolve entry""" + import_job = self.importer.create_job( + self.local_user, self.csv, False, "unlisted" + ) + + import_item = models.ImportItem.objects.get(job=import_job, index=0) + with patch( + "bookwyrm.models.import_job.ImportItem.get_book_from_isbn" + ) as resolve: + resolve.return_value = self.book + + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ) as mock: + import_item_task(import_item.id) + kwargs = mock.call_args.kwargs + self.assertEqual(kwargs["queue"], "low_priority") + import_item.refresh_from_db() + + def test_complete_job(self, *_): + """test notification""" + import_job = self.importer.create_job( + self.local_user, self.csv, False, "unlisted" + ) + items = import_job.items.all() + for item in items[:3]: + item.fail_reason = "hello" + item.save() + item.update_job() + self.assertFalse( + models.Notification.objects.filter( + user=self.local_user, + related_import=import_job, + notification_type="IMPORT", + ).exists() + ) + + item = items[3] + item.fail_reason = "hello" + item.save() + item.update_job() + import_job.refresh_from_db() + self.assertTrue(import_job.complete) + self.assertTrue( + models.Notification.objects.filter( + user=self.local_user, + related_import=import_job, + notification_type="IMPORT", + ).exists() + ) + + def test_handle_imported_book(self, *_): + """import added a book, this adds related connections""" + shelf = self.local_user.shelf_set.filter(identifier="read").first() + self.assertIsNone(shelf.books.first()) + + import_job = self.importer.create_job( + self.local_user, self.csv, False, "public" + ) + import_item = import_job.items.first() + import_item.book = self.book + import_item.save() + + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): + handle_imported_book(import_item) + + shelf.refresh_from_db() + self.assertEqual(shelf.books.first(), self.book) + + def test_handle_imported_book_already_shelved(self, *_): + """import added a book, this adds related connections""" + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): + shelf = self.local_user.shelf_set.filter(identifier="to-read").first() + models.ShelfBook.objects.create( + shelf=shelf, + user=self.local_user, + book=self.book, + shelved_date=make_date(2020, 2, 2), + ) + + import_job = self.importer.create_job( + self.local_user, self.csv, False, "public" + ) + import_item = import_job.items.first() + import_item.book = self.book + import_item.save() + + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): + handle_imported_book(import_item) + + shelf.refresh_from_db() + self.assertEqual(shelf.books.first(), self.book) + self.assertEqual( + shelf.shelfbook_set.first().shelved_date, make_date(2020, 2, 2) + ) + self.assertIsNone( + self.local_user.shelf_set.get(identifier="read").books.first() + ) + + def test_handle_import_twice(self, *_): + """re-importing books""" + shelf = self.local_user.shelf_set.filter(identifier="read").first() + import_job = self.importer.create_job( + self.local_user, self.csv, False, "public" + ) + import_item = import_job.items.first() + import_item.book = self.book + import_item.save() + + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): + handle_imported_book(import_item) + handle_imported_book(import_item) + + shelf.refresh_from_db() + self.assertEqual(shelf.books.first(), self.book) + self.assertEqual(models.ReadThrough.objects.count(), 1) + + @patch("bookwyrm.activitystreams.add_status_task.delay") + def test_handle_imported_book_review(self, *_): + """review import""" + import_job = self.importer.create_job( + self.local_user, self.csv, True, "unlisted" + ) + import_item = import_job.items.filter(index=3).first() + import_item.book = self.book + import_item.save() + + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): + with patch("bookwyrm.models.Status.broadcast") as broadcast_mock: + handle_imported_book(import_item) + kwargs = broadcast_mock.call_args.kwargs + self.assertEqual(kwargs["software"], "bookwyrm") + review = models.Review.objects.get(book=self.book, user=self.local_user) + self.assertEqual(review.content, "mixed feelings") + self.assertEqual(review.rating, 2.0) + self.assertEqual(review.privacy, "unlisted") + + import_item.refresh_from_db() + self.assertEqual(import_item.linked_review, review) + + @patch("bookwyrm.activitystreams.add_status_task.delay") + def test_handle_imported_book_rating(self, *_): + """rating import""" + import_job = self.importer.create_job( + self.local_user, self.csv, True, "unlisted" + ) + import_item = import_job.items.filter(index=1).first() + import_item.book = self.book + import_item.save() + + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): + handle_imported_book(import_item) + review = models.ReviewRating.objects.get(book=self.book, user=self.local_user) + self.assertIsInstance(review, models.ReviewRating) + self.assertEqual(review.rating, 3.0) + self.assertEqual(review.privacy, "unlisted") + + import_item.refresh_from_db() + self.assertEqual(import_item.linked_review.id, review.id) + + @patch("bookwyrm.activitystreams.add_status_task.delay") + def test_handle_imported_book_rating_duplicate_with_link(self, *_): + """rating import twice""" + import_job = self.importer.create_job( + self.local_user, self.csv, True, "unlisted" + ) + import_item = import_job.items.filter(index=1).first() + import_item.book = self.book + import_item.save() + + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): + handle_imported_book(import_item) + handle_imported_book(import_item) + + review = models.ReviewRating.objects.get(book=self.book, user=self.local_user) + self.assertIsInstance(review, models.ReviewRating) + self.assertEqual(review.rating, 3.0) + self.assertEqual(review.privacy, "unlisted") + + import_item.refresh_from_db() + self.assertEqual(import_item.linked_review.id, review.id) + + @patch("bookwyrm.activitystreams.add_status_task.delay") + def test_handle_imported_book_rating_duplicate_without_link(self, *_): + """rating import twice""" + import_job = self.importer.create_job( + self.local_user, self.csv, True, "unlisted" + ) + import_item = import_job.items.filter(index=1).first() + import_item.book = self.book + import_item.save() + + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): + handle_imported_book(import_item) + import_item.refresh_from_db() + import_item.linked_review = None + import_item.save() + + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): + handle_imported_book(import_item) + + review = models.ReviewRating.objects.get(book=self.book, user=self.local_user) + self.assertIsInstance(review, models.ReviewRating) + self.assertEqual(review.rating, 3.0) + self.assertEqual(review.privacy, "unlisted") + + import_item.refresh_from_db() + self.assertEqual(import_item.linked_review.id, review.id) + + def test_handle_imported_book_reviews_disabled(self, *_): + """review import""" + import_job = self.importer.create_job( + self.local_user, self.csv, False, "unlisted" + ) + import_item = import_job.items.filter(index=3).first() + import_item.book = self.book + import_item.save() + + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): + handle_imported_book(import_item) + self.assertFalse( + models.Review.objects.filter(book=self.book, user=self.local_user).exists() + ) diff --git a/bookwyrm/tests/importers/test_librarything_import.py b/bookwyrm/tests/importers/test_librarything_import.py index ab92c11b..49354b36 100644 --- a/bookwyrm/tests/importers/test_librarything_import.py +++ b/bookwyrm/tests/importers/test_librarything_import.py @@ -1,16 +1,14 @@ """ testing import """ -import csv import pathlib from unittest.mock import patch import datetime import pytz from django.test import TestCase -import responses from bookwyrm import models from bookwyrm.importers import LibrarythingImporter -from bookwyrm.importers.importer import import_data, handle_imported_book +from bookwyrm.importers.importer import handle_imported_book def make_date(*args): @@ -35,7 +33,7 @@ class LibrarythingImport(TestCase): with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" ): - self.user = models.User.objects.create_user( + self.local_user = models.User.objects.create_user( "mmai", "mmai@mmai.mmai", "password", local=True ) work = models.Work.objects.create(title="Test Work") @@ -47,8 +45,10 @@ class LibrarythingImport(TestCase): def test_create_job(self, *_): """creates the import job entry and checks csv""" - import_job = self.importer.create_job(self.user, self.csv, False, "public") - self.assertEqual(import_job.user, self.user) + import_job = self.importer.create_job( + self.local_user, self.csv, False, "public" + ) + self.assertEqual(import_job.user, self.local_user) self.assertEqual(import_job.include_reviews, False) self.assertEqual(import_job.privacy, "public") @@ -56,6 +56,14 @@ class LibrarythingImport(TestCase): self.assertEqual(len(import_items), 3) self.assertEqual(import_items[0].index, 0) self.assertEqual(import_items[0].data["Book Id"], "5498194") + self.assertEqual(import_items[0].normalized_data["isbn_13"], "9782070291342") + self.assertEqual(import_items[0].normalized_data["isbn_10"], "2070291340") + self.assertEqual(import_items[0].normalized_data["title"], "Marelle") + self.assertEqual(import_items[0].normalized_data["authors"], "Cortazar, Julio") + self.assertEqual(import_items[0].normalized_data["date_added"], "2006-08-09") + self.assertEqual(import_items[0].normalized_data["date_started"], "2007-04-16") + self.assertEqual(import_items[0].normalized_data["date_finished"], "2007-05-08") + self.assertEqual(import_items[1].index, 1) self.assertEqual(import_items[1].data["Book Id"], "5015319") self.assertEqual(import_items[2].index, 2) @@ -63,12 +71,16 @@ class LibrarythingImport(TestCase): def test_create_retry_job(self, *_): """trying again with items that didn't import""" - import_job = self.importer.create_job(self.user, self.csv, False, "unlisted") + import_job = self.importer.create_job( + self.local_user, self.csv, False, "unlisted" + ) import_items = models.ImportItem.objects.filter(job=import_job).all()[:2] - retry = self.importer.create_retry_job(self.user, import_job, import_items) + retry = self.importer.create_retry_job( + self.local_user, import_job, import_items + ) self.assertNotEqual(import_job, retry) - self.assertEqual(retry.user, self.user) + self.assertEqual(retry.user, self.local_user) self.assertEqual(retry.include_reviews, False) self.assertEqual(retry.privacy, "unlisted") @@ -79,111 +91,54 @@ class LibrarythingImport(TestCase): self.assertEqual(retry_items[1].index, 1) self.assertEqual(retry_items[1].data["Book Id"], "5015319") - @responses.activate - def test_import_data(self, *_): - """resolve entry""" - import_job = self.importer.create_job(self.user, self.csv, False, "unlisted") - book = models.Edition.objects.create(title="Test Book") - - with patch( - "bookwyrm.models.import_job.ImportItem.get_book_from_isbn" - ) as resolve: - resolve.return_value = book - with patch("bookwyrm.importers.importer.handle_imported_book"): - import_data(self.importer.service, import_job.id) - - import_item = models.ImportItem.objects.get(job=import_job, index=0) - self.assertEqual(import_item.book.id, book.id) - def test_handle_imported_book(self, *_): """librarything import added a book, this adds related connections""" - shelf = self.user.shelf_set.filter(identifier="read").first() + shelf = self.local_user.shelf_set.filter(identifier="read").first() self.assertIsNone(shelf.books.first()) - import_job = models.ImportJob.objects.create(user=self.user) - datafile = pathlib.Path(__file__).parent.joinpath("../data/librarything.tsv") - csv_file = open(datafile, "r", encoding=self.importer.encoding) - for index, entry in enumerate( - list(csv.DictReader(csv_file, delimiter=self.importer.delimiter)) - ): - entry = self.importer.parse_fields(entry) - import_item = models.ImportItem.objects.create( - job_id=import_job.id, index=index, data=entry, book=self.book - ) - break + import_job = self.importer.create_job( + self.local_user, self.csv, False, "public" + ) + import_item = import_job.items.first() + import_item.book = self.book + import_item.save() - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): - handle_imported_book( - self.importer.service, self.user, import_item, False, "public" - ) + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): + handle_imported_book(import_item) shelf.refresh_from_db() self.assertEqual(shelf.books.first(), self.book) - readthrough = models.ReadThrough.objects.get(user=self.user) + readthrough = models.ReadThrough.objects.get(user=self.local_user) self.assertEqual(readthrough.book, self.book) self.assertEqual(readthrough.start_date, make_date(2007, 4, 16)) self.assertEqual(readthrough.finish_date, make_date(2007, 5, 8)) def test_handle_imported_book_already_shelved(self, *_): """librarything import added a book, this adds related connections""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): - shelf = self.user.shelf_set.filter(identifier="to-read").first() - models.ShelfBook.objects.create(shelf=shelf, user=self.user, book=self.book) - - import_job = models.ImportJob.objects.create(user=self.user) - datafile = pathlib.Path(__file__).parent.joinpath("../data/librarything.tsv") - csv_file = open(datafile, "r", encoding=self.importer.encoding) - for index, entry in enumerate( - list(csv.DictReader(csv_file, delimiter=self.importer.delimiter)) - ): - entry = self.importer.parse_fields(entry) - import_item = models.ImportItem.objects.create( - job_id=import_job.id, index=index, data=entry, book=self.book + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): + shelf = self.local_user.shelf_set.filter(identifier="to-read").first() + models.ShelfBook.objects.create( + shelf=shelf, user=self.local_user, book=self.book ) - break - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): - handle_imported_book( - self.importer.service, self.user, import_item, False, "public" - ) + import_job = self.importer.create_job( + self.local_user, self.csv, False, "public" + ) + import_item = import_job.items.first() + import_item.book = self.book + import_item.save() + + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): + handle_imported_book(import_item) shelf.refresh_from_db() self.assertEqual(shelf.books.first(), self.book) - self.assertIsNone(self.user.shelf_set.get(identifier="read").books.first()) + self.assertIsNone( + self.local_user.shelf_set.get(identifier="read").books.first() + ) - readthrough = models.ReadThrough.objects.get(user=self.user) - self.assertEqual(readthrough.book, self.book) - self.assertEqual(readthrough.start_date, make_date(2007, 4, 16)) - self.assertEqual(readthrough.finish_date, make_date(2007, 5, 8)) - - def test_handle_import_twice(self, *_): - """re-importing books""" - shelf = self.user.shelf_set.filter(identifier="read").first() - import_job = models.ImportJob.objects.create(user=self.user) - datafile = pathlib.Path(__file__).parent.joinpath("../data/librarything.tsv") - csv_file = open(datafile, "r", encoding=self.importer.encoding) - for index, entry in enumerate( - list(csv.DictReader(csv_file, delimiter=self.importer.delimiter)) - ): - entry = self.importer.parse_fields(entry) - import_item = models.ImportItem.objects.create( - job_id=import_job.id, index=index, data=entry, book=self.book - ) - break - - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): - handle_imported_book( - self.importer.service, self.user, import_item, False, "public" - ) - handle_imported_book( - self.importer.service, self.user, import_item, False, "public" - ) - - shelf.refresh_from_db() - self.assertEqual(shelf.books.first(), self.book) - - readthrough = models.ReadThrough.objects.get(user=self.user) + readthrough = models.ReadThrough.objects.get(user=self.local_user) self.assertEqual(readthrough.book, self.book) self.assertEqual(readthrough.start_date, make_date(2007, 4, 16)) self.assertEqual(readthrough.finish_date, make_date(2007, 5, 8)) @@ -191,40 +146,18 @@ class LibrarythingImport(TestCase): @patch("bookwyrm.activitystreams.add_status_task.delay") def test_handle_imported_book_review(self, *_): """librarything review import""" - import_job = models.ImportJob.objects.create(user=self.user) - datafile = pathlib.Path(__file__).parent.joinpath("../data/librarything.tsv") - csv_file = open(datafile, "r", encoding=self.importer.encoding) - entry = list(csv.DictReader(csv_file, delimiter=self.importer.delimiter))[0] - entry = self.importer.parse_fields(entry) - import_item = models.ImportItem.objects.create( - job_id=import_job.id, index=0, data=entry, book=self.book + import_job = self.importer.create_job( + self.local_user, self.csv, True, "unlisted" ) + import_item = import_job.items.filter(index=0).first() + import_item.book = self.book + import_item.save() - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): - handle_imported_book( - self.importer.service, self.user, import_item, True, "unlisted" - ) - review = models.Review.objects.get(book=self.book, user=self.user) + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): + handle_imported_book(import_item) + + review = models.Review.objects.get(book=self.book, user=self.local_user) self.assertEqual(review.content, "chef d'oeuvre") - self.assertEqual(review.rating, 5) + self.assertEqual(review.rating, 4.5) self.assertEqual(review.published_date, make_date(2007, 5, 8)) self.assertEqual(review.privacy, "unlisted") - - def test_handle_imported_book_reviews_disabled(self, *_): - """librarything review import""" - import_job = models.ImportJob.objects.create(user=self.user) - datafile = pathlib.Path(__file__).parent.joinpath("../data/librarything.tsv") - csv_file = open(datafile, "r", encoding=self.importer.encoding) - entry = list(csv.DictReader(csv_file, delimiter=self.importer.delimiter))[2] - entry = self.importer.parse_fields(entry) - import_item = models.ImportItem.objects.create( - job_id=import_job.id, index=0, data=entry, book=self.book - ) - - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): - handle_imported_book( - self.importer.service, self.user, import_item, False, "unlisted" - ) - self.assertFalse( - models.Review.objects.filter(book=self.book, user=self.user).exists() - ) diff --git a/bookwyrm/tests/importers/test_storygraph_import.py b/bookwyrm/tests/importers/test_storygraph_import.py new file mode 100644 index 00000000..09cf32dc --- /dev/null +++ b/bookwyrm/tests/importers/test_storygraph_import.py @@ -0,0 +1,99 @@ +""" testing import """ +import pathlib +from unittest.mock import patch +import datetime +import pytz + +from django.test import TestCase + +from bookwyrm import models +from bookwyrm.importers import StorygraphImporter +from bookwyrm.importers.importer import handle_imported_book + + +def make_date(*args): + """helper function to easily generate a date obj""" + return datetime.datetime(*args, tzinfo=pytz.UTC) + + +# pylint: disable=consider-using-with +@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay") +@patch("bookwyrm.activitystreams.populate_stream_task.delay") +@patch("bookwyrm.activitystreams.add_book_statuses_task.delay") +class StorygraphImport(TestCase): + """importing from storygraph csv""" + + def setUp(self): + """use a test csv""" + self.importer = StorygraphImporter() + datafile = pathlib.Path(__file__).parent.joinpath("../data/storygraph.csv") + self.csv = open(datafile, "r", encoding=self.importer.encoding) + with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( + "bookwyrm.activitystreams.populate_stream_task.delay" + ): + self.local_user = models.User.objects.create_user( + "mouse", "mouse@mouse.mouse", "password", local=True + ) + + work = models.Work.objects.create(title="Test Work") + self.book = models.Edition.objects.create( + title="Example Edition", + remote_id="https://example.com/book/1", + parent_work=work, + ) + + def test_create_job(self, *_): + """creates the import job entry and checks csv""" + import_job = self.importer.create_job( + self.local_user, self.csv, False, "public" + ) + + import_items = models.ImportItem.objects.filter(job=import_job).all() + self.assertEqual(len(import_items), 2) + self.assertEqual(import_items[0].index, 0) + self.assertEqual(import_items[0].normalized_data["title"], "Always Coming Home") + self.assertEqual(import_items[1].index, 1) + self.assertEqual( + import_items[1].normalized_data["title"], "Subprime Attention Crisis" + ) + self.assertEqual(import_items[1].normalized_data["rating"], "5.0") + + def test_handle_imported_book(self, *_): + """storygraph import added a book, this adds related connections""" + shelf = self.local_user.shelf_set.filter(identifier="to-read").first() + self.assertIsNone(shelf.books.first()) + + import_job = self.importer.create_job( + self.local_user, self.csv, False, "public" + ) + import_item = import_job.items.first() + import_item.book = self.book + import_item.save() + + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): + handle_imported_book(import_item) + + shelf.refresh_from_db() + self.assertEqual(shelf.books.first(), self.book) + self.assertEqual( + shelf.shelfbook_set.first().shelved_date, make_date(2021, 5, 10) + ) + + @patch("bookwyrm.activitystreams.add_status_task.delay") + def test_handle_imported_book_rating(self, *_): + """storygraph rating import""" + import_job = self.importer.create_job( + self.local_user, self.csv, True, "unlisted" + ) + import_item = import_job.items.filter(index=1).first() + import_item.book = self.book + import_item.save() + + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): + handle_imported_book(import_item) + + review = models.ReviewRating.objects.get(book=self.book, user=self.local_user) + self.assertIsInstance(review, models.ReviewRating) + self.assertEqual(review.rating, 5.0) + self.assertEqual(review.published_date, make_date(2021, 5, 10)) + self.assertEqual(review.privacy, "unlisted") diff --git a/bookwyrm/tests/management/test_populate_streams.py b/bookwyrm/tests/management/test_populate_streams.py index ca21b0ee..5be1774d 100644 --- a/bookwyrm/tests/management/test_populate_streams.py +++ b/bookwyrm/tests/management/test_populate_streams.py @@ -6,7 +6,7 @@ from bookwyrm import models from bookwyrm.management.commands.populate_streams import populate_streams -@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") +@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") class Activitystreams(TestCase): """using redis to build activity streams""" diff --git a/bookwyrm/tests/models/test_activitypub_mixin.py b/bookwyrm/tests/models/test_activitypub_mixin.py index 911cca5c..91a1fe7c 100644 --- a/bookwyrm/tests/models/test_activitypub_mixin.py +++ b/bookwyrm/tests/models/test_activitypub_mixin.py @@ -21,7 +21,7 @@ from bookwyrm.settings import PAGE_LENGTH # pylint: disable=invalid-name @patch("bookwyrm.activitystreams.add_status_task.delay") -@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") +@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") class ActivitypubMixins(TestCase): """functionality shared across models""" diff --git a/bookwyrm/tests/models/test_fields.py b/bookwyrm/tests/models/test_fields.py index 1796b84b..74f4c48b 100644 --- a/bookwyrm/tests/models/test_fields.py +++ b/bookwyrm/tests/models/test_fields.py @@ -22,6 +22,7 @@ from bookwyrm.activitypub.base_activity import ActivityObject from bookwyrm.models import fields, User, Status from bookwyrm.models.base_model import BookWyrmModel from bookwyrm.models.activitypub_mixin import ActivitypubMixin +from bookwyrm.settings import DOMAIN # pylint: disable=too-many-public-methods @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay") @@ -424,21 +425,18 @@ class ModelFields(TestCase): image.save(output, format=image.format) user.avatar.save("test.jpg", ContentFile(output.getvalue())) - output = fields.image_serializer(user.avatar, alt="alt text") + instance = fields.ImageField() + + output = instance.field_to_activity(user.avatar) self.assertIsNotNone( re.match( - r".*\.jpg", + fr"https:\/\/{DOMAIN}\/.*\.jpg", output.url, ) ) - self.assertEqual(output.name, "alt text") + self.assertEqual(output.name, "") self.assertEqual(output.type, "Document") - instance = fields.ImageField() - - output = fields.image_serializer(user.avatar, alt=None) - self.assertEqual(instance.field_to_activity(user.avatar), output) - responses.add( responses.GET, "http://www.example.com/image.jpg", @@ -449,15 +447,6 @@ class ModelFields(TestCase): self.assertIsInstance(loaded_image, list) self.assertIsInstance(loaded_image[1], ContentFile) - def test_image_serialize(self, *_): - """make sure we're creating sensible image paths""" - ValueMock = namedtuple("ValueMock", ("url")) - value_mock = ValueMock("/images/fish.jpg") - result = fields.image_serializer(value_mock, "hello") - self.assertEqual(result.type, "Document") - self.assertEqual(result.url, "https://your.domain.here/images/fish.jpg") - self.assertEqual(result.name, "hello") - def test_datetime_field(self, *_): """this one is pretty simple, it just has to use isoformat""" instance = fields.DateTimeField() diff --git a/bookwyrm/tests/models/test_group.py b/bookwyrm/tests/models/test_group.py index 33341d19..2dd3cee1 100644 --- a/bookwyrm/tests/models/test_group.py +++ b/bookwyrm/tests/models/test_group.py @@ -5,7 +5,7 @@ from django.test import TestCase from bookwyrm import models, settings -@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") +@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") class Group(TestCase): """some activitypub oddness ahead""" @@ -87,7 +87,7 @@ class Group(TestCase): def test_group_members_can_see_followers_only_lists(self, _): """follower-only group booklists should not be excluded from group booklist listing for group members who do not follower list owner""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): followers_list = models.List.objects.create( name="Followers List", curation="group", @@ -107,7 +107,7 @@ class Group(TestCase): def test_group_members_can_see_private_lists(self, _): """private group booklists should not be excluded from group booklist listing for group members""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): private_list = models.List.objects.create( name="Private List", diff --git a/bookwyrm/tests/models/test_import_model.py b/bookwyrm/tests/models/test_import_model.py index 0e5d6760..f48143d0 100644 --- a/bookwyrm/tests/models/test_import_model.py +++ b/bookwyrm/tests/models/test_import_model.py @@ -18,83 +18,68 @@ class ImportJob(TestCase): def setUp(self): """data is from a goodreads export of The Raven Tower""" - read_data = { - "Book Id": 39395857, - "Title": "The Raven Tower", - "Author": "Ann Leckie", - "Author l-f": "Leckie, Ann", - "Additional Authors": "", - "ISBN": '="0356506991"', - "ISBN13": '="9780356506999"', - "My Rating": 0, - "Average Rating": 4.06, - "Publisher": "Orbit", - "Binding": "Hardcover", - "Number of Pages": 416, - "Year Published": 2019, - "Original Publication Year": 2019, - "Date Read": "2019/04/12", - "Date Added": "2019/04/09", - "Bookshelves": "", - "Bookshelves with positions": "", - "Exclusive Shelf": "read", - "My Review": "", - "Spoiler": "", - "Private Notes": "", - "Read Count": 1, - "Recommended For": "", - "Recommended By": "", - "Owned Copies": 0, - "Original Purchase Date": "", - "Original Purchase Location": "", - "Condition": "", - "Condition Description": "", - "BCID": "", - } - currently_reading_data = read_data.copy() - currently_reading_data["Exclusive Shelf"] = "currently-reading" - currently_reading_data["Date Read"] = "" - - unknown_read_data = currently_reading_data.copy() - unknown_read_data["Exclusive Shelf"] = "read" - unknown_read_data["Date Read"] = "" - with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" ): - user = models.User.objects.create_user( - "mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse" + self.local_user = models.User.objects.create_user( + "mouse", "mouse@mouse.mouse", "password", local=True ) - job = models.ImportJob.objects.create(user=user) - self.item_1 = models.ImportItem.objects.create( - job=job, index=1, data=currently_reading_data - ) - self.item_2 = models.ImportItem.objects.create(job=job, index=2, data=read_data) - self.item_3 = models.ImportItem.objects.create( - job=job, index=3, data=unknown_read_data - ) + self.job = models.ImportJob.objects.create(user=self.local_user, mappings={}) def test_isbn(self): """it unquotes the isbn13 field from data""" - expected = "9780356506999" - item = models.ImportItem.objects.get(index=1) - self.assertEqual(item.isbn, expected) + item = models.ImportItem.objects.create( + index=1, + job=self.job, + data={}, + normalized_data={ + "isbn_13": '="9780356506999"', + }, + ) + self.assertEqual(item.isbn, "9780356506999") def test_shelf(self): """converts to the local shelf typology""" - expected = "reading" - self.assertEqual(self.item_1.shelf, expected) + item = models.ImportItem.objects.create( + index=1, + job=self.job, + data={}, + normalized_data={ + "isbn_13": '="9780356506999"', + "shelf": "reading", + }, + ) + self.assertEqual(item.shelf, "reading") def test_date_added(self): """converts to the local shelf typology""" expected = datetime.datetime(2019, 4, 9, 0, 0, tzinfo=timezone.utc) - item = models.ImportItem.objects.get(index=1) + item = models.ImportItem.objects.create( + index=1, + job=self.job, + data={}, + normalized_data={ + "isbn_13": '="9780356506999"', + "shelf": "reading", + "date_added": "2019/04/09", + }, + ) self.assertEqual(item.date_added, expected) def test_date_read(self): """converts to the local shelf typology""" expected = datetime.datetime(2019, 4, 12, 0, 0, tzinfo=timezone.utc) - item = models.ImportItem.objects.get(index=2) + item = models.ImportItem.objects.create( + index=1, + job=self.job, + data={}, + normalized_data={ + "isbn_13": '="9780356506999"', + "shelf": "reading", + "date_added": "2019/04/09", + "date_finished": "2019/04/12", + }, + ) self.assertEqual(item.date_read, expected) def test_currently_reading_reads(self): @@ -104,31 +89,66 @@ class ImportJob(TestCase): start_date=datetime.datetime(2019, 4, 9, 0, 0, tzinfo=timezone.utc) ) ] - actual = models.ImportItem.objects.get(index=1) - self.assertEqual(actual.reads[0].start_date, expected[0].start_date) - self.assertEqual(actual.reads[0].finish_date, expected[0].finish_date) + item = models.ImportItem.objects.create( + index=1, + job=self.job, + data={}, + normalized_data={ + "isbn_13": '="9780356506999"', + "shelf": "reading", + "date_added": "2019/04/09", + }, + ) + self.assertEqual(item.reads[0].start_date, expected[0].start_date) + self.assertIsNone(item.reads[0].finish_date) def test_read_reads(self): """infer read dates where available""" - actual = self.item_2 + item = models.ImportItem.objects.create( + index=1, + job=self.job, + data={}, + normalized_data={ + "isbn_13": '="9780356506999"', + "shelf": "reading", + "date_added": "2019/04/09", + "date_finished": "2019/04/12", + }, + ) self.assertEqual( - actual.reads[0].start_date, + item.reads[0].start_date, datetime.datetime(2019, 4, 9, 0, 0, tzinfo=timezone.utc), ) self.assertEqual( - actual.reads[0].finish_date, + item.reads[0].finish_date, datetime.datetime(2019, 4, 12, 0, 0, tzinfo=timezone.utc), ) def test_unread_reads(self): """handle books with no read dates""" expected = [] - actual = models.ImportItem.objects.get(index=3) - self.assertEqual(actual.reads, expected) + item = models.ImportItem.objects.create( + index=1, + job=self.job, + data={}, + normalized_data={ + "isbn_13": '="9780356506999"', + "shelf": "reading", + }, + ) + self.assertEqual(item.reads, expected) @responses.activate def test_get_book_from_isbn(self): """search and load books by isbn (9780356506999)""" + item = models.ImportItem.objects.create( + index=1, + job=self.job, + data={}, + normalized_data={ + "isbn_13": '="9780356506999"', + }, + ) connector_info = models.Connector.objects.create( identifier="openlibrary.org", name="OpenLibrary", @@ -177,6 +197,6 @@ class ImportJob(TestCase): with patch( "bookwyrm.connectors.openlibrary.Connector." "get_authors_from_data" ): - book = self.item_1.get_book_from_isbn() + book = item.get_book_from_isbn() self.assertEqual(book.title, "Sabriel") diff --git a/bookwyrm/tests/models/test_list.py b/bookwyrm/tests/models/test_list.py index 0d749453..254005bc 100644 --- a/bookwyrm/tests/models/test_list.py +++ b/bookwyrm/tests/models/test_list.py @@ -5,7 +5,7 @@ from django.test import TestCase from bookwyrm import models, settings -@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") +@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") class List(TestCase): """some activitypub oddness ahead""" @@ -22,7 +22,7 @@ class List(TestCase): def test_remote_id(self, _): """shelves use custom remote ids""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): book_list = models.List.objects.create( name="Test List", user=self.local_user ) @@ -31,7 +31,7 @@ class List(TestCase): def test_to_activity(self, _): """jsonify it""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): book_list = models.List.objects.create( name="Test List", user=self.local_user ) @@ -45,7 +45,7 @@ class List(TestCase): def test_list_item(self, _): """a list entry""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): book_list = models.List.objects.create( name="Test List", user=self.local_user, privacy="unlisted" ) @@ -63,7 +63,7 @@ class List(TestCase): def test_list_item_pending(self, _): """a list entry""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): book_list = models.List.objects.create( name="Test List", user=self.local_user ) diff --git a/bookwyrm/tests/models/test_relationship_models.py b/bookwyrm/tests/models/test_relationship_models.py index 04dbe1a3..2b388398 100644 --- a/bookwyrm/tests/models/test_relationship_models.py +++ b/bookwyrm/tests/models/test_relationship_models.py @@ -33,11 +33,13 @@ class Relationship(TestCase): def test_user_follows_from_request(self, _): """convert a follow request into a follow""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") as mock: + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ) as mock: request = models.UserFollowRequest.objects.create( user_subject=self.local_user, user_object=self.remote_user ) - activity = json.loads(mock.call_args[0][1]) + activity = json.loads(mock.call_args[1]["args"][1]) self.assertEqual(activity["type"], "Follow") self.assertEqual( request.remote_id, "http://local.com/user/mouse#follows/%d" % request.id @@ -54,7 +56,7 @@ class Relationship(TestCase): def test_user_follows_from_request_custom_remote_id(self, _): """store a specific remote id for a relationship provided by remote""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): request = models.UserFollowRequest.objects.create( user_subject=self.local_user, user_object=self.remote_user, @@ -69,19 +71,19 @@ class Relationship(TestCase): self.assertEqual(rel.user_subject, self.local_user) self.assertEqual(rel.user_object, self.remote_user) - @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") + @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") def test_follow_request_activity(self, broadcast_mock, _): """accept a request and make it a relationship""" models.UserFollowRequest.objects.create( user_subject=self.local_user, user_object=self.remote_user, ) - activity = json.loads(broadcast_mock.call_args[0][1]) + activity = json.loads(broadcast_mock.call_args[1]["args"][1]) self.assertEqual(activity["actor"], self.local_user.remote_id) self.assertEqual(activity["object"], self.remote_user.remote_id) self.assertEqual(activity["type"], "Follow") - @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") + @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") def test_follow_request_accept(self, broadcast_mock, _): """accept a request and make it a relationship""" self.local_user.manually_approves_followers = True @@ -96,7 +98,7 @@ class Relationship(TestCase): ) request.accept() - activity = json.loads(broadcast_mock.call_args[0][1]) + activity = json.loads(broadcast_mock.call_args[1]["args"][1]) self.assertEqual(activity["type"], "Accept") self.assertEqual(activity["actor"], self.local_user.remote_id) self.assertEqual(activity["object"]["id"], "https://www.hi.com/") @@ -107,7 +109,7 @@ class Relationship(TestCase): self.assertEqual(rel.user_subject, self.remote_user) self.assertEqual(rel.user_object, self.local_user) - @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") + @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") def test_follow_request_reject(self, broadcast_mock, _): """accept a request and make it a relationship""" self.local_user.manually_approves_followers = True @@ -120,7 +122,7 @@ class Relationship(TestCase): ) request.reject() - activity = json.loads(broadcast_mock.call_args[0][1]) + activity = json.loads(broadcast_mock.call_args[1]["args"][1]) self.assertEqual(activity["type"], "Reject") self.assertEqual(activity["actor"], self.local_user.remote_id) self.assertEqual(activity["object"]["id"], request.remote_id) diff --git a/bookwyrm/tests/models/test_shelf_model.py b/bookwyrm/tests/models/test_shelf_model.py index fe179e88..0683fbef 100644 --- a/bookwyrm/tests/models/test_shelf_model.py +++ b/bookwyrm/tests/models/test_shelf_model.py @@ -27,7 +27,7 @@ class Shelf(TestCase): def test_remote_id(self, *_): """shelves use custom remote ids""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): shelf = models.Shelf.objects.create( name="Test Shelf", identifier="test-shelf", user=self.local_user ) @@ -36,7 +36,7 @@ class Shelf(TestCase): def test_to_activity(self, *_): """jsonify it""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): shelf = models.Shelf.objects.create( name="Test Shelf", identifier="test-shelf", user=self.local_user ) @@ -51,19 +51,23 @@ class Shelf(TestCase): def test_create_update_shelf(self, *_): """create and broadcast shelf creation""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") as mock: + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ) as mock: shelf = models.Shelf.objects.create( name="Test Shelf", identifier="test-shelf", user=self.local_user ) - activity = json.loads(mock.call_args[0][1]) + activity = json.loads(mock.call_args[1]["args"][1]) self.assertEqual(activity["type"], "Create") self.assertEqual(activity["actor"], self.local_user.remote_id) self.assertEqual(activity["object"]["name"], "Test Shelf") shelf.name = "arthur russel" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") as mock: + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ) as mock: shelf.save() - activity = json.loads(mock.call_args[0][1]) + activity = json.loads(mock.call_args[1]["args"][1]) self.assertEqual(activity["type"], "Update") self.assertEqual(activity["actor"], self.local_user.remote_id) self.assertEqual(activity["object"]["name"], "arthur russel") @@ -71,27 +75,31 @@ class Shelf(TestCase): def test_shelve(self, *_): """create and broadcast shelf creation""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): shelf = models.Shelf.objects.create( name="Test Shelf", identifier="test-shelf", user=self.local_user ) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") as mock: + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ) as mock: shelf_book = models.ShelfBook.objects.create( shelf=shelf, user=self.local_user, book=self.book ) self.assertEqual(mock.call_count, 1) - activity = json.loads(mock.call_args[0][1]) + activity = json.loads(mock.call_args[1]["args"][1]) self.assertEqual(activity["type"], "Add") self.assertEqual(activity["actor"], self.local_user.remote_id) self.assertEqual(activity["object"]["id"], shelf_book.remote_id) self.assertEqual(activity["target"], shelf.remote_id) self.assertEqual(shelf.books.first(), self.book) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") as mock: + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ) as mock: shelf_book.delete() self.assertEqual(mock.call_count, 1) - activity = json.loads(mock.call_args[0][1]) + activity = json.loads(mock.call_args[1]["args"][1]) self.assertEqual(activity["type"], "Remove") self.assertEqual(activity["actor"], self.local_user.remote_id) self.assertEqual(activity["object"]["id"], shelf_book.remote_id) diff --git a/bookwyrm/tests/models/test_status_model.py b/bookwyrm/tests/models/test_status_model.py index 00f8a81c..822d837a 100644 --- a/bookwyrm/tests/models/test_status_model.py +++ b/bookwyrm/tests/models/test_status_model.py @@ -2,6 +2,7 @@ from unittest.mock import patch from io import BytesIO import pathlib +import re from django.http import Http404 from django.core.files.base import ContentFile @@ -190,9 +191,11 @@ class Status(TestCase): self.assertEqual(activity["sensitive"], False) self.assertIsInstance(activity["attachment"], list) self.assertEqual(activity["attachment"][0].type, "Document") - self.assertEqual( - activity["attachment"][0].url, - f"https://{settings.DOMAIN}{self.book.cover.url}", + self.assertTrue( + re.match( + r"https:\/\/your.domain.here\/images\/covers\/test_[A-z0-9]+.jpg", + activity["attachment"][0].url, + ) ) self.assertEqual(activity["attachment"][0].name, "Test Edition") @@ -220,9 +223,11 @@ class Status(TestCase): f'test content

    (comment on "Test Edition")

    ', ) self.assertEqual(activity["attachment"][0].type, "Document") - self.assertEqual( - activity["attachment"][0].url, - f"https://{settings.DOMAIN}{self.book.cover.url}", + self.assertTrue( + re.match( + r"https:\/\/your.domain.here\/images\/covers\/test_[A-z0-9]+.jpg", + activity["attachment"][0].url, + ) ) self.assertEqual(activity["attachment"][0].name, "Test Edition") @@ -257,9 +262,11 @@ class Status(TestCase): f'a sickening sense

    -- "Test Edition"

    test content', ) self.assertEqual(activity["attachment"][0].type, "Document") - self.assertEqual( - activity["attachment"][0].url, - f"https://{settings.DOMAIN}{self.book.cover.url}", + self.assertTrue( + re.match( + r"https:\/\/your.domain.here\/images\/covers\/test_[A-z0-9]+.jpg", + activity["attachment"][0].url, + ) ) self.assertEqual(activity["attachment"][0].name, "Test Edition") @@ -298,9 +305,11 @@ class Status(TestCase): ) self.assertEqual(activity["content"], "test content") self.assertEqual(activity["attachment"][0].type, "Document") - self.assertEqual( - activity["attachment"][0].url, - f"https://{settings.DOMAIN}{self.book.cover.url}", + self.assertTrue( + re.match( + r"https:\/\/your.domain.here\/images\/covers\/test_[A-z0-9]+.jpg", + activity["attachment"][0].url, + ) ) self.assertEqual(activity["attachment"][0].name, "Test Edition") @@ -320,9 +329,11 @@ class Status(TestCase): ) self.assertEqual(activity["content"], "test content") self.assertEqual(activity["attachment"][0].type, "Document") - self.assertEqual( - activity["attachment"][0].url, - f"https://{settings.DOMAIN}{self.book.cover.url}", + self.assertTrue( + re.match( + r"https:\/\/your.domain.here\/images\/covers\/test_[A-z0-9]+.jpg", + activity["attachment"][0].url, + ) ) self.assertEqual(activity["attachment"][0].name, "Test Edition") @@ -341,27 +352,25 @@ class Status(TestCase): f'rated {self.book.title}: 3 stars', ) self.assertEqual(activity["attachment"][0].type, "Document") - self.assertEqual( - activity["attachment"][0].url, - f"https://{settings.DOMAIN}{self.book.cover.url}", + self.assertTrue( + re.match( + r"https:\/\/your.domain.here\/images\/covers\/test_[A-z0-9]+.jpg", + activity["attachment"][0].url, + ) ) self.assertEqual(activity["attachment"][0].name, "Test Edition") def test_favorite(self, *_): """fav a status""" - real_broadcast = models.Favorite.broadcast - - def fav_broadcast_mock(_, activity, user): - """ok""" - self.assertEqual(user.remote_id, self.local_user.remote_id) - self.assertEqual(activity["type"], "Like") - - models.Favorite.broadcast = fav_broadcast_mock - status = models.Status.objects.create( content="test content", user=self.local_user ) - fav = models.Favorite.objects.create(status=status, user=self.local_user) + + with patch("bookwyrm.models.Favorite.broadcast") as mock: + fav = models.Favorite.objects.create(status=status, user=self.local_user) + args = mock.call_args[0] + self.assertEqual(args[1].remote_id, self.local_user.remote_id) + self.assertEqual(args[0]["type"], "Like") # can't fav a status twice with self.assertRaises(IntegrityError): @@ -371,7 +380,6 @@ class Status(TestCase): self.assertEqual(activity["type"], "Like") self.assertEqual(activity["actor"], self.local_user.remote_id) self.assertEqual(activity["object"], status.remote_id) - models.Favorite.broadcast = real_broadcast def test_boost(self, *_): """boosting, this one's a bit fussy""" diff --git a/bookwyrm/tests/models/test_user_model.py b/bookwyrm/tests/models/test_user_model.py index 528d3fdc..389928cd 100644 --- a/bookwyrm/tests/models/test_user_model.py +++ b/bookwyrm/tests/models/test_user_model.py @@ -165,12 +165,12 @@ class User(TestCase): """deactivate a user""" self.assertTrue(self.user.is_active) with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.delay" + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" ) as broadcast_mock: self.user.delete() self.assertEqual(broadcast_mock.call_count, 1) - activity = json.loads(broadcast_mock.call_args[0][1]) + activity = json.loads(broadcast_mock.call_args[1]["args"][1]) self.assertEqual(activity["type"], "Delete") self.assertEqual(activity["object"], self.user.remote_id) self.assertFalse(self.user.is_active) diff --git a/bookwyrm/tests/test_book_search.py b/bookwyrm/tests/test_book_search.py index 4b9a0681..16435fff 100644 --- a/bookwyrm/tests/test_book_search.py +++ b/bookwyrm/tests/test_book_search.py @@ -57,12 +57,24 @@ class BookSearch(TestCase): self.assertEqual(len(results), 1) self.assertEqual(results[0], self.second_edition) + def test_search_identifiers_return_first(self): + """search by unique identifiers""" + result = book_search.search_identifiers("hello", return_first=True) + self.assertEqual(result, self.second_edition) + def test_search_title_author(self): """search by unique identifiers""" results = book_search.search_title_author("Another", min_confidence=0) self.assertEqual(len(results), 1) self.assertEqual(results[0], self.second_edition) + def test_search_title_author_return_first(self): + """search by unique identifiers""" + results = book_search.search_title_author( + "Another", min_confidence=0, return_first=True + ) + self.assertEqual(results, self.second_edition) + def test_format_search_result(self): """format a search result""" result = book_search.format_search_result(self.first_edition) diff --git a/bookwyrm/tests/test_postgres.py b/bookwyrm/tests/test_postgres.py index 70775d47..62451257 100644 --- a/bookwyrm/tests/test_postgres.py +++ b/bookwyrm/tests/test_postgres.py @@ -5,7 +5,7 @@ from django.test import TestCase from bookwyrm import models -@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") +@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") class PostgresTriggers(TestCase): """special migrations, fancy stuff ya know""" diff --git a/bookwyrm/tests/test_suggested_users.py b/bookwyrm/tests/test_suggested_users.py index f625ac10..dce5d770 100644 --- a/bookwyrm/tests/test_suggested_users.py +++ b/bookwyrm/tests/test_suggested_users.py @@ -9,7 +9,7 @@ from bookwyrm import models from bookwyrm.suggested_users import suggested_users, get_annotated_users -@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") +@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") @patch("bookwyrm.activitystreams.add_status_task.delay") @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay") @patch("bookwyrm.activitystreams.populate_stream_task.delay") @@ -168,7 +168,7 @@ class SuggestedUsers(TestCase): remote_id="https://example.com/book/1", parent_work=work, ) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): # 1 shared follow self.local_user.following.add(user_2) user_1.followers.add(user_2) @@ -213,7 +213,7 @@ class SuggestedUsers(TestCase): user.following.add(user_1) user.followers.add(self.local_user) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): for i in range(3): book = models.Edition.objects.create( title=i, diff --git a/bookwyrm/tests/test_templatetags.py b/bookwyrm/tests/test_templatetags.py index 5954ce27..ed4466f5 100644 --- a/bookwyrm/tests/test_templatetags.py +++ b/bookwyrm/tests/test_templatetags.py @@ -44,7 +44,7 @@ class TemplateTags(TestCase): def test_get_user_rating(self, *_): """get a user's most recent rating of a book""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): models.Review.objects.create(user=self.user, book=self.book, rating=3) self.assertEqual(bookwyrm_tags.get_user_rating(self.book, self.user), 3) @@ -63,7 +63,7 @@ class TemplateTags(TestCase): utilities.get_user_identifier(self.remote_user), "rat@example.com" ) - @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") + @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") def test_get_replies(self, *_): """direct replies to a status""" parent = models.Review.objects.create( @@ -90,7 +90,7 @@ class TemplateTags(TestCase): def test_get_parent(self, *_): """get the reply parent of a status""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): parent = models.Review.objects.create( user=self.user, book=self.book, content="hi" ) @@ -107,7 +107,7 @@ class TemplateTags(TestCase): status = models.Review.objects.create(user=self.remote_user, book=self.book) self.assertFalse(interaction.get_user_liked(self.user, status)) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): models.Favorite.objects.create(user=self.user, status=status) self.assertTrue(interaction.get_user_liked(self.user, status)) @@ -116,13 +116,13 @@ class TemplateTags(TestCase): status = models.Review.objects.create(user=self.remote_user, book=self.book) self.assertFalse(interaction.get_user_boosted(self.user, status)) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): models.Boost.objects.create(user=self.user, boosted_status=status) self.assertTrue(interaction.get_user_boosted(self.user, status)) def test_get_boosted(self, *_): """load a boosted status""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): status = models.Review.objects.create(user=self.remote_user, book=self.book) boost = models.Boost.objects.create(user=self.user, boosted_status=status) boosted = status_display.get_boosted(boost) @@ -166,7 +166,7 @@ class TemplateTags(TestCase): def test_related_status(self, *_): """gets the subclass model for a notification status""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): status = models.Status.objects.create(content="hi", user=self.user) notification = models.Notification.objects.create( user=self.user, notification_type="MENTION", related_status=status diff --git a/bookwyrm/tests/views/admin/test_reports.py b/bookwyrm/tests/views/admin/test_reports.py index 2b063446..8b9fe9f5 100644 --- a/bookwyrm/tests/views/admin/test_reports.py +++ b/bookwyrm/tests/views/admin/test_reports.py @@ -151,10 +151,12 @@ class ReportViews(TestCase): request.user.is_superuser = True # de-activate - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") as mock: + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ) as mock: views.moderator_delete_user(request, self.rat.id) self.assertEqual(mock.call_count, 1) - activity = json.loads(mock.call_args[0][1]) + activity = json.loads(mock.call_args[1]["args"][1]) self.assertEqual(activity["type"], "Delete") self.rat.refresh_from_db() diff --git a/bookwyrm/tests/views/admin/test_user_admin.py b/bookwyrm/tests/views/admin/test_user_admin.py index ef35c220..486fe45e 100644 --- a/bookwyrm/tests/views/admin/test_user_admin.py +++ b/bookwyrm/tests/views/admin/test_user_admin.py @@ -67,7 +67,7 @@ class UserAdminViews(TestCase): request.user = self.local_user request.user.is_superuser = True - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): result = view(request, self.local_user.id) self.assertIsInstance(result, TemplateResponse) diff --git a/bookwyrm/tests/views/books/test_book.py b/bookwyrm/tests/views/books/test_book.py index a078f161..561e2192 100644 --- a/bookwyrm/tests/views/books/test_book.py +++ b/bookwyrm/tests/views/books/test_book.py @@ -78,7 +78,7 @@ class BookViews(TestCase): self.assertIsInstance(result, ActivitypubResponse) self.assertEqual(result.status_code, 200) - @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") + @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") @patch("bookwyrm.activitystreams.add_status_task.delay") def test_book_page_statuses(self, *_): """there are so many views, this just makes sure it LOADS""" @@ -169,7 +169,7 @@ class BookViews(TestCase): request.user = self.local_user with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.delay" + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" ) as delay_mock: views.upload_cover(request, self.book.id) self.assertEqual(delay_mock.call_count, 1) @@ -188,7 +188,7 @@ class BookViews(TestCase): request.user = self.local_user with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.delay" + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" ) as delay_mock: views.upload_cover(request, self.book.id) self.assertEqual(delay_mock.call_count, 1) @@ -202,7 +202,7 @@ class BookViews(TestCase): request = self.factory.post("", {"description": "new description hi"}) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.add_description(request, self.book.id) self.book.refresh_from_db() diff --git a/bookwyrm/tests/views/books/test_edit_book.py b/bookwyrm/tests/views/books/test_edit_book.py index 7bf5708f..cd957858 100644 --- a/bookwyrm/tests/views/books/test_edit_book.py +++ b/bookwyrm/tests/views/books/test_edit_book.py @@ -79,7 +79,7 @@ class EditBookViews(TestCase): request = self.factory.post("", form.data) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): view(request, self.book.id) self.book.refresh_from_db() @@ -115,7 +115,7 @@ class EditBookViews(TestCase): request = self.factory.post("", form.data) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): view(request, self.book.id) self.book.refresh_from_db() @@ -136,7 +136,7 @@ class EditBookViews(TestCase): request = self.factory.post("", form.data) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): view(request, self.book.id) self.book.refresh_from_db() self.assertEqual(self.book.title, "New Title") @@ -207,7 +207,7 @@ class EditBookViews(TestCase): request.user = self.local_user with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.delay" + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" ) as delay_mock: views.upload_cover(request, self.book.id) self.assertEqual(delay_mock.call_count, 1) diff --git a/bookwyrm/tests/views/books/test_editions.py b/bookwyrm/tests/views/books/test_editions.py index 2f41fe66..17f15654 100644 --- a/bookwyrm/tests/views/books/test_editions.py +++ b/bookwyrm/tests/views/books/test_editions.py @@ -111,7 +111,7 @@ class BookViews(TestCase): work = models.Work.objects.create(title="test work") edition1 = models.Edition.objects.create(title="first ed", parent_work=work) edition2 = models.Edition.objects.create(title="second ed", parent_work=work) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): shelf = models.Shelf.objects.create(name="Test Shelf", user=self.local_user) models.ShelfBook.objects.create( book=edition1, @@ -124,7 +124,7 @@ class BookViews(TestCase): self.assertEqual(models.ReadThrough.objects.get().book, edition1) request = self.factory.post("", {"edition": edition2.id}) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.switch_edition(request) self.assertEqual(models.ShelfBook.objects.get().book, edition2) diff --git a/bookwyrm/tests/views/imports/__init__.py b/bookwyrm/tests/views/imports/__init__.py new file mode 100644 index 00000000..b6e690fd --- /dev/null +++ b/bookwyrm/tests/views/imports/__init__.py @@ -0,0 +1 @@ +from . import * diff --git a/bookwyrm/tests/views/test_import.py b/bookwyrm/tests/views/imports/test_import.py similarity index 72% rename from bookwyrm/tests/views/test_import.py rename to bookwyrm/tests/views/imports/test_import.py index 2027d284..b8b8b328 100644 --- a/bookwyrm/tests/views/test_import.py +++ b/bookwyrm/tests/views/imports/test_import.py @@ -5,6 +5,7 @@ from django.core.files.uploadedfile import SimpleUploadedFile from django.template.response import TemplateResponse from django.test import TestCase from django.test.client import RequestFactory +from bookwyrm.tests.validate_html import validate_html from bookwyrm import forms, models, views @@ -34,32 +35,35 @@ class ImportViews(TestCase): request.user = self.local_user result = view(request) self.assertIsInstance(result, TemplateResponse) - result.render() + validate_html(result.render()) self.assertEqual(result.status_code, 200) def test_import_status(self): """there are so many views, this just makes sure it LOADS""" view = views.ImportStatus.as_view() - import_job = models.ImportJob.objects.create(user=self.local_user) + import_job = models.ImportJob.objects.create(user=self.local_user, mappings={}) request = self.factory.get("") request.user = self.local_user with patch("bookwyrm.tasks.app.AsyncResult") as async_result: async_result.return_value = [] result = view(request, import_job.id) self.assertIsInstance(result, TemplateResponse) - result.render() + validate_html(result.render()) self.assertEqual(result.status_code, 200) def test_start_import(self): """retry failed items""" view = views.Import.as_view() form = forms.ImportForm() - form.data["source"] = "LibraryThing" + form.data["source"] = "Goodreads" form.data["privacy"] = "public" form.data["include_reviews"] = False - csv_file = pathlib.Path(__file__).parent.joinpath("../data/goodreads.csv") + csv_file = pathlib.Path(__file__).parent.joinpath("../../data/goodreads.csv") form.data["csv_file"] = SimpleUploadedFile( - csv_file, open(csv_file, "rb").read(), content_type="text/csv" + # pylint: disable=consider-using-with + csv_file, + open(csv_file, "rb").read(), + content_type="text/csv", ) request = self.factory.post("", form.data) @@ -70,22 +74,3 @@ class ImportViews(TestCase): job = models.ImportJob.objects.get() self.assertFalse(job.include_reviews) self.assertEqual(job.privacy, "public") - - def test_retry_import(self): - """retry failed items""" - view = views.ImportStatus.as_view() - import_job = models.ImportJob.objects.create( - user=self.local_user, privacy="unlisted" - ) - request = self.factory.post("") - request.user = self.local_user - - with patch("bookwyrm.importers.Importer.start_import"): - view(request, import_job.id) - - self.assertEqual(models.ImportJob.objects.count(), 2) - retry_job = models.ImportJob.objects.last() - - self.assertTrue(retry_job.retry) - self.assertEqual(retry_job.user, self.local_user) - self.assertEqual(retry_job.privacy, "unlisted") diff --git a/bookwyrm/tests/views/imports/test_import_review.py b/bookwyrm/tests/views/imports/test_import_review.py new file mode 100644 index 00000000..2ab48468 --- /dev/null +++ b/bookwyrm/tests/views/imports/test_import_review.py @@ -0,0 +1,87 @@ +""" test for app action functionality """ +from unittest.mock import patch +from django.template.response import TemplateResponse +from django.test import TestCase +from django.test.client import RequestFactory +from bookwyrm.tests.validate_html import validate_html + +from bookwyrm import models, views + + +class ImportManualReviewViews(TestCase): + """goodreads import views""" + + def setUp(self): + """we need basic test data and mocks""" + self.factory = RequestFactory() + with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( + "bookwyrm.activitystreams.populate_stream_task.delay" + ): + self.local_user = models.User.objects.create_user( + "mouse@local.com", + "mouse@mouse.mouse", + "password", + local=True, + localname="mouse", + ) + models.SiteSettings.objects.create() + self.job = models.ImportJob.objects.create(user=self.local_user, mappings={}) + + work = models.Work.objects.create(title="Test Work") + self.book = models.Edition.objects.create( + title="Example Edition", + remote_id="https://example.com/book/1", + parent_work=work, + ) + + def test_import_troubleshoot_get(self): + """there are so many views, this just makes sure it LOADS""" + view = views.ImportManualReview.as_view() + request = self.factory.get("") + request.user = self.local_user + with patch("bookwyrm.tasks.app.AsyncResult") as async_result: + async_result.return_value = [] + result = view(request, self.job.id) + self.assertIsInstance(result, TemplateResponse) + validate_html(result.render()) + self.assertEqual(result.status_code, 200) + + def test_approve_item(self): + """a guess is correct""" + import_item = models.ImportItem.objects.create( + index=0, + job=self.job, + book_guess=self.book, + fail_reason="no match", + data={}, + normalized_data={}, + ) + request = self.factory.post("") + request.user = self.local_user + + with patch("bookwyrm.importers.importer.import_item_task.delay") as mock: + views.approve_import_item(request, self.job.id, import_item.id) + self.assertEqual(mock.call_count, 1) + import_item.refresh_from_db() + self.assertIsNone(import_item.fail_reason) + self.assertIsNone(import_item.book_guess) + self.assertEqual(import_item.book.id, self.book.id) + + def test_delete_item(self): + """a guess is correct""" + import_item = models.ImportItem.objects.create( + index=0, + job=self.job, + book_guess=self.book, + fail_reason="no match", + data={}, + normalized_data={}, + ) + request = self.factory.post("") + request.user = self.local_user + + views.delete_import_item(request, self.job.id, import_item.id) + import_item.refresh_from_db() + self.assertEqual(import_item.fail_reason, "no match") + self.assertIsNone(import_item.book_guess) + self.assertIsNone(import_item.book) diff --git a/bookwyrm/tests/views/imports/test_import_troubleshoot.py b/bookwyrm/tests/views/imports/test_import_troubleshoot.py new file mode 100644 index 00000000..5359cc1e --- /dev/null +++ b/bookwyrm/tests/views/imports/test_import_troubleshoot.py @@ -0,0 +1,59 @@ +""" test for app action functionality """ +from unittest.mock import patch +from django.template.response import TemplateResponse +from django.test import TestCase +from django.test.client import RequestFactory +from bookwyrm.tests.validate_html import validate_html + +from bookwyrm import models, views + + +class ImportTroubleshootViews(TestCase): + """goodreads import views""" + + def setUp(self): + """we need basic test data and mocks""" + self.factory = RequestFactory() + with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( + "bookwyrm.activitystreams.populate_stream_task.delay" + ): + self.local_user = models.User.objects.create_user( + "mouse@local.com", + "mouse@mouse.mouse", + "password", + local=True, + localname="mouse", + ) + models.SiteSettings.objects.create() + + def test_import_troubleshoot_get(self): + """there are so many views, this just makes sure it LOADS""" + view = views.ImportTroubleshoot.as_view() + import_job = models.ImportJob.objects.create(user=self.local_user, mappings={}) + request = self.factory.get("") + request.user = self.local_user + with patch("bookwyrm.tasks.app.AsyncResult") as async_result: + async_result.return_value = [] + result = view(request, import_job.id) + self.assertIsInstance(result, TemplateResponse) + validate_html(result.render()) + self.assertEqual(result.status_code, 200) + + def test_retry_import(self): + """retry failed items""" + view = views.ImportTroubleshoot.as_view() + import_job = models.ImportJob.objects.create( + user=self.local_user, privacy="unlisted", mappings={} + ) + request = self.factory.post("") + request.user = self.local_user + + with patch("bookwyrm.importers.Importer.start_import"): + view(request, import_job.id) + + self.assertEqual(models.ImportJob.objects.count(), 2) + retry_job = models.ImportJob.objects.last() + + self.assertTrue(retry_job.retry) + self.assertEqual(retry_job.user, self.local_user) + self.assertEqual(retry_job.privacy, "unlisted") diff --git a/bookwyrm/tests/views/inbox/test_inbox_announce.py b/bookwyrm/tests/views/inbox/test_inbox_announce.py index 3a108878..a291552d 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_announce.py +++ b/bookwyrm/tests/views/inbox/test_inbox_announce.py @@ -36,7 +36,7 @@ class InboxActivities(TestCase): outbox="https://example.com/users/rat/outbox", ) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): with patch("bookwyrm.activitystreams.add_status_task.delay"): self.status = models.Status.objects.create( user=self.local_user, diff --git a/bookwyrm/tests/views/inbox/test_inbox_block.py b/bookwyrm/tests/views/inbox/test_inbox_block.py index ffd74dbd..f6898fc6 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_block.py +++ b/bookwyrm/tests/views/inbox/test_inbox_block.py @@ -40,7 +40,7 @@ class InboxBlock(TestCase): def test_handle_blocks(self): """create a "block" database entry from an activity""" self.local_user.followers.add(self.remote_user) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): models.UserFollowRequest.objects.create( user_subject=self.local_user, user_object=self.remote_user ) diff --git a/bookwyrm/tests/views/inbox/test_inbox_create.py b/bookwyrm/tests/views/inbox/test_inbox_create.py index 76fd366c..53b17d68 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_create.py +++ b/bookwyrm/tests/views/inbox/test_inbox_create.py @@ -10,7 +10,7 @@ from bookwyrm.activitypub import ActivitySerializerError # pylint: disable=too-many-public-methods -@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") +@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") @patch("bookwyrm.activitystreams.add_book_statuses_task.delay") class InboxCreate(TestCase): """readthrough tests""" diff --git a/bookwyrm/tests/views/inbox/test_inbox_follow.py b/bookwyrm/tests/views/inbox/test_inbox_follow.py index 6b629c2f..71f101ca 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_follow.py +++ b/bookwyrm/tests/views/inbox/test_inbox_follow.py @@ -49,10 +49,12 @@ class InboxRelationships(TestCase): } self.assertFalse(models.UserFollowRequest.objects.exists()) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") as mock: + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ) as mock: views.inbox.activity_task(activity) self.assertEqual(mock.call_count, 1) - response_activity = json.loads(mock.call_args[0][1]) + response_activity = json.loads(mock.call_args[1]["args"][1]) self.assertEqual(response_activity["type"], "Accept") # notification created @@ -77,17 +79,19 @@ class InboxRelationships(TestCase): "object": "https://example.com/user/mouse", } - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.inbox.activity_task(activity) # the follow relationship should exist follow = models.UserFollows.objects.get(user_object=self.local_user) self.assertEqual(follow.user_subject, self.remote_user) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") as mock: + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ) as mock: views.inbox.activity_task(activity) self.assertEqual(mock.call_count, 1) - response_activity = json.loads(mock.call_args[0][1]) + response_activity = json.loads(mock.call_args[1]["args"][1]) self.assertEqual(response_activity["type"], "Accept") # the follow relationship should STILL exist @@ -109,7 +113,7 @@ class InboxRelationships(TestCase): broadcast=False, update_fields=["manually_approves_followers"] ) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.inbox.activity_task(activity) # notification created @@ -132,7 +136,7 @@ class InboxRelationships(TestCase): self.local_user.save( broadcast=False, update_fields=["manually_approves_followers"] ) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): request = models.UserFollowRequest.objects.create( user_subject=self.remote_user, user_object=self.local_user ) @@ -160,7 +164,7 @@ class InboxRelationships(TestCase): def test_unfollow(self): """remove a relationship""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): rel = models.UserFollows.objects.create( user_subject=self.remote_user, user_object=self.local_user ) @@ -186,7 +190,7 @@ class InboxRelationships(TestCase): @patch("bookwyrm.activitystreams.add_user_statuses_task.delay") def test_follow_accept(self, _): """a remote user approved a follow request from local""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): rel = models.UserFollowRequest.objects.create( user_subject=self.local_user, user_object=self.remote_user ) @@ -217,7 +221,7 @@ class InboxRelationships(TestCase): def test_follow_reject(self): """turn down a follow request""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): rel = models.UserFollowRequest.objects.create( user_subject=self.local_user, user_object=self.remote_user ) diff --git a/bookwyrm/tests/views/inbox/test_inbox_like.py b/bookwyrm/tests/views/inbox/test_inbox_like.py index db8f1fca..2f1b6629 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_like.py +++ b/bookwyrm/tests/views/inbox/test_inbox_like.py @@ -35,7 +35,7 @@ class InboxActivities(TestCase): outbox="https://example.com/users/rat/outbox", ) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): with patch("bookwyrm.activitystreams.add_status_task.delay"): self.status = models.Status.objects.create( user=self.local_user, diff --git a/bookwyrm/tests/views/inbox/test_inbox_remove.py b/bookwyrm/tests/views/inbox/test_inbox_remove.py index cb4e4a16..55cc8120 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_remove.py +++ b/bookwyrm/tests/views/inbox/test_inbox_remove.py @@ -75,7 +75,7 @@ class InboxRemove(TestCase): def test_handle_remove_book_from_list(self): """listing a book""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): booklist = models.List.objects.create( name="test list", user=self.local_user, diff --git a/bookwyrm/tests/views/inbox/test_inbox_update.py b/bookwyrm/tests/views/inbox/test_inbox_update.py index 0efeac0c..248c1ad2 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_update.py +++ b/bookwyrm/tests/views/inbox/test_inbox_update.py @@ -50,7 +50,7 @@ class InboxUpdate(TestCase): def test_update_list(self): """a new list""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): book_list = models.List.objects.create( name="hi", remote_id="https://example.com/list/22", user=self.local_user ) @@ -171,7 +171,7 @@ class InboxUpdate(TestCase): book = models.Work.objects.get(id=book.id) self.assertEqual(book.title, "Piranesi") - @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") + @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") @patch("bookwyrm.activitystreams.add_status_task.delay") def test_update_status(self, *_): """edit a status""" diff --git a/bookwyrm/tests/views/preferences/test_block.py b/bookwyrm/tests/views/preferences/test_block.py index b23a6cbc..975142a1 100644 --- a/bookwyrm/tests/views/preferences/test_block.py +++ b/bookwyrm/tests/views/preferences/test_block.py @@ -9,7 +9,7 @@ from bookwyrm import models, views from bookwyrm.tests.validate_html import validate_html -@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") +@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") class BlockViews(TestCase): """view user and edit profile""" diff --git a/bookwyrm/tests/views/preferences/test_delete_user.py b/bookwyrm/tests/views/preferences/test_delete_user.py index 09f722f7..b6d87ccd 100644 --- a/bookwyrm/tests/views/preferences/test_delete_user.py +++ b/bookwyrm/tests/views/preferences/test_delete_user.py @@ -35,9 +35,9 @@ class DeleteUserViews(TestCase): self.book = models.Edition.objects.create( title="test", parent_work=models.Work.objects.create(title="test work") ) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"), patch( - "bookwyrm.activitystreams.add_book_statuses_task.delay" - ): + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ), patch("bookwyrm.activitystreams.add_book_statuses_task.delay"): models.ShelfBook.objects.create( book=self.book, user=self.local_user, @@ -70,11 +70,11 @@ class DeleteUserViews(TestCase): self.assertIsNone(self.local_user.name) with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.delay" + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" ) as delay_mock: view(request) self.assertEqual(delay_mock.call_count, 1) - activity = json.loads(delay_mock.call_args[0][1]) + activity = json.loads(delay_mock.call_args[1]["args"][1]) self.assertEqual(activity["type"], "Delete") self.assertEqual(activity["actor"], self.local_user.remote_id) self.assertEqual( diff --git a/bookwyrm/tests/views/preferences/test_edit_user.py b/bookwyrm/tests/views/preferences/test_edit_user.py index b52875a9..7a845fbe 100644 --- a/bookwyrm/tests/views/preferences/test_edit_user.py +++ b/bookwyrm/tests/views/preferences/test_edit_user.py @@ -38,9 +38,9 @@ class EditUserViews(TestCase): self.book = models.Edition.objects.create( title="test", parent_work=models.Work.objects.create(title="test work") ) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"), patch( - "bookwyrm.activitystreams.add_book_statuses_task.delay" - ): + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ), patch("bookwyrm.activitystreams.add_book_statuses_task.delay"): models.ShelfBook.objects.create( book=self.book, user=self.local_user, @@ -74,7 +74,7 @@ class EditUserViews(TestCase): self.assertIsNone(self.local_user.name) with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.delay" + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" ) as delay_mock: view(request) self.assertEqual(delay_mock.call_count, 1) @@ -100,7 +100,7 @@ class EditUserViews(TestCase): request.user = self.local_user with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.delay" + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" ) as delay_mock: view(request) self.assertEqual(delay_mock.call_count, 1) diff --git a/bookwyrm/tests/views/shelf/test_shelf.py b/bookwyrm/tests/views/shelf/test_shelf.py index 71df3631..ab88de0a 100644 --- a/bookwyrm/tests/views/shelf/test_shelf.py +++ b/bookwyrm/tests/views/shelf/test_shelf.py @@ -11,7 +11,7 @@ from bookwyrm.activitypub import ActivitypubResponse from bookwyrm.tests.validate_html import validate_html -@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") +@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay") @patch("bookwyrm.activitystreams.populate_stream_task.delay") @patch("bookwyrm.activitystreams.add_book_statuses_task.delay") @@ -39,7 +39,7 @@ class ShelfViews(TestCase): remote_id="https://example.com/book/1", parent_work=self.work, ) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): self.shelf = models.Shelf.objects.create( name="Test Shelf", identifier="test-shelf", user=self.local_user ) @@ -142,7 +142,7 @@ class ShelfViews(TestCase): "", {"privacy": "public", "user": self.local_user.id, "name": "cool name"} ) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): view(request, request.user.username, shelf.identifier) shelf.refresh_from_db() @@ -159,7 +159,7 @@ class ShelfViews(TestCase): "", {"privacy": "public", "user": self.local_user.id, "name": "cool name"} ) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): view(request, request.user.username, shelf.identifier) self.assertEqual(shelf.name, "To Read") diff --git a/bookwyrm/tests/views/shelf/test_shelf_actions.py b/bookwyrm/tests/views/shelf/test_shelf_actions.py index 3efae0f4..1a7d56fd 100644 --- a/bookwyrm/tests/views/shelf/test_shelf_actions.py +++ b/bookwyrm/tests/views/shelf/test_shelf_actions.py @@ -9,7 +9,7 @@ from django.test.client import RequestFactory from bookwyrm import forms, models, views -@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") +@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay") @patch("bookwyrm.activitystreams.populate_stream_task.delay") @patch("bookwyrm.activitystreams.add_book_statuses_task.delay") @@ -37,7 +37,7 @@ class ShelfActionViews(TestCase): remote_id="https://example.com/book/1", parent_work=self.work, ) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): self.shelf = models.Shelf.objects.create( name="Test Shelf", identifier="test-shelf", user=self.local_user ) @@ -49,11 +49,13 @@ class ShelfActionViews(TestCase): "", {"book": self.book.id, "shelf": self.shelf.identifier} ) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") as mock: + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ) as mock: views.shelve(request) self.assertEqual(mock.call_count, 1) - activity = json.loads(mock.call_args[0][1]) + activity = json.loads(mock.call_args[1]["args"][1]) self.assertEqual(activity["type"], "Add") item = models.ShelfBook.objects.get() @@ -69,7 +71,7 @@ class ShelfActionViews(TestCase): ) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.shelve(request) # make sure the book is on the shelf self.assertEqual(shelf.books.get(), self.book) @@ -82,7 +84,7 @@ class ShelfActionViews(TestCase): ) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.shelve(request) # make sure the book is on the shelf self.assertEqual(shelf.books.get(), self.book) @@ -95,7 +97,7 @@ class ShelfActionViews(TestCase): ) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.shelve(request) # make sure the book is on the shelf self.assertEqual(shelf.books.get(), self.book) @@ -118,7 +120,7 @@ class ShelfActionViews(TestCase): ) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.shelve(request) # make sure the book is on the shelf self.assertEqual(shelf.books.get(), self.book) @@ -126,7 +128,7 @@ class ShelfActionViews(TestCase): def test_unshelve(self, *_): """remove a book from a shelf""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): models.ShelfBook.objects.create( book=self.book, user=self.local_user, shelf=self.shelf ) @@ -136,9 +138,11 @@ class ShelfActionViews(TestCase): self.assertEqual(self.shelf.books.count(), 1) request = self.factory.post("", {"book": self.book.id, "shelf": self.shelf.id}) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") as mock: + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ) as mock: views.unshelve(request) - activity = json.loads(mock.call_args[0][1]) + activity = json.loads(mock.call_args[1]["args"][1]) self.assertEqual(activity["type"], "Remove") self.assertEqual(activity["object"]["id"], item.remote_id) self.assertEqual(self.shelf.books.count(), 0) @@ -192,7 +196,7 @@ class ShelfActionViews(TestCase): def test_delete_shelf_has_book(self, *_): """delete a brand new custom shelf""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): models.ShelfBook.objects.create( book=self.book, user=self.local_user, shelf=self.shelf ) diff --git a/bookwyrm/tests/views/test_author.py b/bookwyrm/tests/views/test_author.py index ccbfe549..32b1565e 100644 --- a/bookwyrm/tests/views/test_author.py +++ b/bookwyrm/tests/views/test_author.py @@ -111,7 +111,7 @@ class AuthorViews(TestCase): request = self.factory.post("", form.data) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): view(request, author.id) author.refresh_from_db() self.assertEqual(author.name, "New Name") diff --git a/bookwyrm/tests/views/test_discover.py b/bookwyrm/tests/views/test_discover.py index 4b8927bc..b2a82241 100644 --- a/bookwyrm/tests/views/test_discover.py +++ b/bookwyrm/tests/views/test_discover.py @@ -41,7 +41,7 @@ class DiscoverViews(TestCase): self.assertEqual(result.status_code, 200) result.render() - @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") + @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") @patch("bookwyrm.activitystreams.add_status_task.delay") def test_discover_page(self, *_): """there are so many views, this just makes sure it LOADS""" diff --git a/bookwyrm/tests/views/test_feed.py b/bookwyrm/tests/views/test_feed.py index a6f220b5..5c6a4dd3 100644 --- a/bookwyrm/tests/views/test_feed.py +++ b/bookwyrm/tests/views/test_feed.py @@ -57,7 +57,7 @@ class FeedViews(TestCase): def test_status_page(self, *_): """there are so many views, this just makes sure it LOADS""" view = views.Status.as_view() - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): status = models.Status.objects.create(content="hi", user=self.local_user) request = self.factory.get("") request.user = self.local_user @@ -95,7 +95,7 @@ class FeedViews(TestCase): local=True, localname="rat", ) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): status = models.Status.objects.create(content="hi", user=another_user) request = self.factory.get("") @@ -115,7 +115,7 @@ class FeedViews(TestCase): image = Image.open(image_file) output = BytesIO() image.save(output, format=image.format) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): status = models.Review.objects.create( content="hi", user=self.local_user, @@ -144,7 +144,7 @@ class FeedViews(TestCase): def test_replies_page(self, *_): """there are so many views, this just makes sure it LOADS""" view = views.Replies.as_view() - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): status = models.Status.objects.create(content="hi", user=self.local_user) request = self.factory.get("") request.user = self.local_user @@ -171,7 +171,7 @@ class FeedViews(TestCase): result.render() self.assertEqual(result.status_code, 200) - @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") + @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") @patch("bookwyrm.activitystreams.add_book_statuses_task.delay") def test_get_suggested_book(self, *_): """gets books the ~*~ algorithm ~*~ thinks you want to post about""" diff --git a/bookwyrm/tests/views/test_follow.py b/bookwyrm/tests/views/test_follow.py index 947c55cf..25b5a014 100644 --- a/bookwyrm/tests/views/test_follow.py +++ b/bookwyrm/tests/views/test_follow.py @@ -59,7 +59,7 @@ class FollowViews(TestCase): request.user = self.local_user self.assertEqual(models.UserFollowRequest.objects.count(), 0) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.follow(request) rel = models.UserFollowRequest.objects.get() @@ -86,7 +86,7 @@ class FollowViews(TestCase): request.user = self.local_user self.assertEqual(models.UserFollowRequest.objects.count(), 0) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.follow(request) rel = models.UserFollowRequest.objects.get() @@ -111,7 +111,7 @@ class FollowViews(TestCase): request.user = self.local_user self.assertEqual(models.UserFollowRequest.objects.count(), 0) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.follow(request) rel = models.UserFollows.objects.get() @@ -127,10 +127,12 @@ class FollowViews(TestCase): request.user = self.local_user self.remote_user.followers.add(self.local_user) self.assertEqual(self.remote_user.followers.count(), 1) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") as mock: + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ) as mock: views.unfollow(request) self.assertEqual(mock.call_count, 1) - activity = json.loads(mock.call_args_list[0][0][1]) + activity = json.loads(mock.call_args_list[0][1]["args"][1]) self.assertEqual(activity["type"], "Undo") self.assertEqual(self.remote_user.followers.count(), 0) @@ -147,7 +149,7 @@ class FollowViews(TestCase): user_subject=self.remote_user, user_object=self.local_user ) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.accept_follow_request(request) # request should be deleted self.assertEqual(models.UserFollowRequest.objects.filter(id=rel.id).count(), 0) @@ -166,7 +168,7 @@ class FollowViews(TestCase): user_subject=self.remote_user, user_object=self.local_user ) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.delete_follow_request(request) # request should be deleted self.assertEqual(models.UserFollowRequest.objects.filter(id=rel.id).count(), 0) diff --git a/bookwyrm/tests/views/test_get_started.py b/bookwyrm/tests/views/test_get_started.py index ff441b57..6d1819a4 100644 --- a/bookwyrm/tests/views/test_get_started.py +++ b/bookwyrm/tests/views/test_get_started.py @@ -56,7 +56,7 @@ class GetStartedViews(TestCase): self.assertIsNone(self.local_user.name) with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.delay" + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" ) as delay_mock: view(request) self.assertEqual(delay_mock.call_count, 1) @@ -98,7 +98,7 @@ class GetStartedViews(TestCase): self.assertFalse(self.local_user.shelfbook_set.exists()) with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.delay" + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" ) as delay_mock: view(request) self.assertEqual(delay_mock.call_count, 1) diff --git a/bookwyrm/tests/views/test_goal.py b/bookwyrm/tests/views/test_goal.py index 557510d7..73207240 100644 --- a/bookwyrm/tests/views/test_goal.py +++ b/bookwyrm/tests/views/test_goal.py @@ -123,7 +123,7 @@ class GoalViews(TestCase): }, ) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): view(request, self.local_user.localname, self.year) goal = models.AnnualGoal.objects.get() diff --git a/bookwyrm/tests/views/test_group.py b/bookwyrm/tests/views/test_group.py index c7e0a0f7..b18ce6b4 100644 --- a/bookwyrm/tests/views/test_group.py +++ b/bookwyrm/tests/views/test_group.py @@ -10,7 +10,7 @@ from bookwyrm import models, views, forms from bookwyrm.tests.validate_html import validate_html -@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") +@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") class GroupViews(TestCase): """view group and edit details""" diff --git a/bookwyrm/tests/views/test_helpers.py b/bookwyrm/tests/views/test_helpers.py index 8f7b45a3..1aae830f 100644 --- a/bookwyrm/tests/views/test_helpers.py +++ b/bookwyrm/tests/views/test_helpers.py @@ -55,7 +55,7 @@ class ViewsHelpers(TestCase): datafile = pathlib.Path(__file__).parent.joinpath("../data/ap_user.json") self.userdata = json.loads(datafile.read_bytes()) del self.userdata["icon"] - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): self.shelf = models.Shelf.objects.create( name="Test Shelf", identifier="test-shelf", user=self.local_user ) @@ -166,7 +166,7 @@ class ViewsHelpers(TestCase): def test_handle_reading_status_to_read(self, *_): """posts shelve activities""" shelf = self.local_user.shelf_set.get(identifier="to-read") - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.helpers.handle_reading_status( self.local_user, shelf, self.book, "public" ) @@ -178,7 +178,7 @@ class ViewsHelpers(TestCase): def test_handle_reading_status_reading(self, *_): """posts shelve activities""" shelf = self.local_user.shelf_set.get(identifier="reading") - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.helpers.handle_reading_status( self.local_user, shelf, self.book, "public" ) @@ -190,7 +190,7 @@ class ViewsHelpers(TestCase): def test_handle_reading_status_read(self, *_): """posts shelve activities""" shelf = self.local_user.shelf_set.get(identifier="read") - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.helpers.handle_reading_status( self.local_user, shelf, self.book, "public" ) @@ -201,7 +201,7 @@ class ViewsHelpers(TestCase): def test_handle_reading_status_other(self, *_): """posts shelve activities""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.helpers.handle_reading_status( self.local_user, self.shelf, self.book, "public" ) diff --git a/bookwyrm/tests/views/test_interaction.py b/bookwyrm/tests/views/test_interaction.py index e8b9353e..aa402952 100644 --- a/bookwyrm/tests/views/test_interaction.py +++ b/bookwyrm/tests/views/test_interaction.py @@ -7,7 +7,7 @@ from django.test.client import RequestFactory from bookwyrm import models, views -@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") +@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") @patch("bookwyrm.activitystreams.remove_status_task.delay") class InteractionViews(TestCase): """viewing and creating statuses""" @@ -74,7 +74,7 @@ class InteractionViews(TestCase): self.assertEqual(models.Favorite.objects.count(), 1) self.assertEqual(models.Notification.objects.count(), 1) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): view(request, status.id) self.assertEqual(models.Favorite.objects.count(), 0) self.assertEqual(models.Notification.objects.count(), 0) @@ -110,12 +110,12 @@ class InteractionViews(TestCase): status = models.Status.objects.create(user=self.local_user, content="hi") with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.delay" + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" ) as broadcast_mock: view(request, status.id) self.assertEqual(broadcast_mock.call_count, 1) - activity = json.loads(broadcast_mock.call_args[0][1]) + activity = json.loads(broadcast_mock.call_args[1]["args"][1]) self.assertEqual(activity["type"], "Announce") boost = models.Boost.objects.get() diff --git a/bookwyrm/tests/views/test_list.py b/bookwyrm/tests/views/test_list.py index 35befec6..c670ad18 100644 --- a/bookwyrm/tests/views/test_list.py +++ b/bookwyrm/tests/views/test_list.py @@ -61,7 +61,7 @@ class ListViews(TestCase): parent_work=work_four, ) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): self.list = models.List.objects.create( name="Test List", user=self.local_user ) @@ -73,7 +73,7 @@ class ListViews(TestCase): def test_lists_page(self): """there are so many views, this just makes sure it LOADS""" view = views.Lists.as_view() - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): models.List.objects.create(name="Public list", user=self.local_user) models.List.objects.create( name="Private list", privacy="direct", user=self.local_user @@ -96,7 +96,7 @@ class ListViews(TestCase): def test_saved_lists_page(self): """there are so many views, this just makes sure it LOADS""" view = views.SavedLists.as_view() - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): booklist = models.List.objects.create( name="Public list", user=self.local_user ) @@ -116,7 +116,7 @@ class ListViews(TestCase): def test_saved_lists_page_empty(self): """there are so many views, this just makes sure it LOADS""" view = views.SavedLists.as_view() - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): models.List.objects.create(name="Public list", user=self.local_user) models.List.objects.create( name="Private list", privacy="direct", user=self.local_user @@ -153,11 +153,13 @@ class ListViews(TestCase): }, ) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") as mock: + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ) as mock: result = view(request) self.assertEqual(mock.call_count, 1) - activity = json.loads(mock.call_args[0][1]) + activity = json.loads(mock.call_args[1]["args"][1]) self.assertEqual(activity["type"], "Create") self.assertEqual(activity["actor"], self.local_user.remote_id) @@ -172,7 +174,7 @@ class ListViews(TestCase): view = views.List.as_view() request = self.factory.get("") request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): models.ListItem.objects.create( book_list=self.list, user=self.local_user, @@ -191,7 +193,7 @@ class ListViews(TestCase): def test_list_page_sorted(self): """there are so many views, this just makes sure it LOADS""" view = views.List.as_view() - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): for (i, book) in enumerate([self.book, self.book_two, self.book_three]): models.ListItem.objects.create( book_list=self.list, @@ -253,7 +255,7 @@ class ListViews(TestCase): def test_list_page_logged_out(self): """there are so many views, this just makes sure it LOADS""" view = views.List.as_view() - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): models.ListItem.objects.create( book_list=self.list, user=self.local_user, @@ -276,7 +278,7 @@ class ListViews(TestCase): view = views.List.as_view() request = self.factory.get("") request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): models.ListItem.objects.create( book_list=self.list, user=self.local_user, @@ -320,11 +322,13 @@ class ListViews(TestCase): ) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") as mock: + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ) as mock: result = view(request, self.list.id) self.assertEqual(mock.call_count, 1) - activity = json.loads(mock.call_args[0][1]) + activity = json.loads(mock.call_args[1]["args"][1]) self.assertEqual(activity["type"], "Update") self.assertEqual(activity["actor"], self.local_user.remote_id) self.assertEqual(activity["object"]["id"], self.list.remote_id) @@ -340,7 +344,7 @@ class ListViews(TestCase): def test_curate_page(self): """there are so many views, this just makes sure it LOADS""" view = views.Curate.as_view() - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): models.List.objects.create(name="Public list", user=self.local_user) models.List.objects.create( name="Private list", privacy="direct", user=self.local_user @@ -360,7 +364,7 @@ class ListViews(TestCase): def test_user_lists_page(self): """there are so many views, this just makes sure it LOADS""" view = views.UserLists.as_view() - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): models.List.objects.create(name="Public list", user=self.local_user) models.List.objects.create( name="Private list", privacy="direct", user=self.local_user diff --git a/bookwyrm/tests/views/test_list_actions.py b/bookwyrm/tests/views/test_list_actions.py index f7775d19..1d9f46b3 100644 --- a/bookwyrm/tests/views/test_list_actions.py +++ b/bookwyrm/tests/views/test_list_actions.py @@ -61,7 +61,7 @@ class ListActionViews(TestCase): parent_work=work_four, ) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): self.list = models.List.objects.create( name="Test List", user=self.local_user ) @@ -71,7 +71,7 @@ class ListActionViews(TestCase): def test_delete_list(self): """delete an entire list""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): models.ListItem.objects.create( book_list=self.list, user=self.local_user, @@ -88,9 +88,11 @@ class ListActionViews(TestCase): ) request = self.factory.post("") request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") as mock: + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ) as mock: views.delete_list(request, self.list.id) - activity = json.loads(mock.call_args[0][1]) + activity = json.loads(mock.call_args[1]["args"][1]) self.assertEqual(activity["type"], "Delete") self.assertEqual(activity["actor"], self.local_user.remote_id) self.assertEqual(activity["object"]["id"], self.list.remote_id) @@ -110,7 +112,7 @@ class ListActionViews(TestCase): def test_curate_approve(self): """approve a pending item""" view = views.Curate.as_view() - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): pending = models.ListItem.objects.create( book_list=self.list, user=self.local_user, @@ -128,11 +130,13 @@ class ListActionViews(TestCase): ) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") as mock: + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ) as mock: view(request, self.list.id) self.assertEqual(mock.call_count, 2) - activity = json.loads(mock.call_args[0][1]) + activity = json.loads(mock.call_args[1]["args"][1]) self.assertEqual(activity["type"], "Add") self.assertEqual(activity["actor"], self.local_user.remote_id) self.assertEqual(activity["target"], self.list.remote_id) @@ -145,7 +149,7 @@ class ListActionViews(TestCase): def test_curate_reject(self): """approve a pending item""" view = views.Curate.as_view() - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): pending = models.ListItem.objects.create( book_list=self.list, user=self.local_user, @@ -179,10 +183,12 @@ class ListActionViews(TestCase): ) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") as mock: + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ) as mock: views.list.add_book(request) self.assertEqual(mock.call_count, 1) - activity = json.loads(mock.call_args[0][1]) + activity = json.loads(mock.call_args[1]["args"][1]) self.assertEqual(activity["type"], "Add") self.assertEqual(activity["actor"], self.local_user.remote_id) self.assertEqual(activity["target"], self.list.remote_id) @@ -214,7 +220,7 @@ class ListActionViews(TestCase): }, ) request_two.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.list.add_book(request_one) views.list.add_book(request_two) @@ -256,7 +262,7 @@ class ListActionViews(TestCase): ) request_three.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.list.add_book(request_one) views.list.add_book(request_two) views.list.add_book(request_three) @@ -271,7 +277,7 @@ class ListActionViews(TestCase): remove_request = self.factory.post("", {"item": items[1].id}) remove_request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.list.remove_book(remove_request, self.list.id) items = self.list.listitem_set.order_by("order").all() self.assertEqual(items[0].book, self.book) @@ -293,7 +299,7 @@ class ListActionViews(TestCase): }, ) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): models.ListItem.objects.create( book_list=self.list, user=self.local_user, @@ -330,7 +336,7 @@ class ListActionViews(TestCase): its order should be at the end of the approved books and before the remaining pending books. """ - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): models.ListItem.objects.create( book_list=self.list, user=self.local_user, @@ -370,7 +376,7 @@ class ListActionViews(TestCase): ) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): view(request, self.list.id) items = self.list.listitem_set.order_by("order").all() @@ -422,7 +428,7 @@ class ListActionViews(TestCase): ) request_three.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.list.add_book(request_one) views.list.add_book(request_two) views.list.add_book(request_three) @@ -437,7 +443,7 @@ class ListActionViews(TestCase): set_position_request = self.factory.post("", {"position": 1}) set_position_request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.list.set_book_position(set_position_request, items[2].id) items = self.list.listitem_set.order_by("order").all() self.assertEqual(items[0].book, self.book_three) @@ -460,10 +466,12 @@ class ListActionViews(TestCase): ) request.user = self.rat - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") as mock: + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ) as mock: views.list.add_book(request) self.assertEqual(mock.call_count, 1) - activity = json.loads(mock.call_args[0][1]) + activity = json.loads(mock.call_args[1]["args"][1]) self.assertEqual(activity["type"], "Add") self.assertEqual(activity["actor"], self.rat.remote_id) self.assertEqual(activity["target"], self.list.remote_id) @@ -486,11 +494,13 @@ class ListActionViews(TestCase): ) request.user = self.rat - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") as mock: + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ) as mock: views.list.add_book(request) self.assertEqual(mock.call_count, 1) - activity = json.loads(mock.call_args[0][1]) + activity = json.loads(mock.call_args[1]["args"][1]) self.assertEqual(activity["type"], "Add") self.assertEqual(activity["actor"], self.rat.remote_id) @@ -516,10 +526,12 @@ class ListActionViews(TestCase): ) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") as mock: + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ) as mock: views.list.add_book(request) self.assertEqual(mock.call_count, 1) - activity = json.loads(mock.call_args[0][1]) + activity = json.loads(mock.call_args[1]["args"][1]) self.assertEqual(activity["type"], "Add") self.assertEqual(activity["actor"], self.local_user.remote_id) self.assertEqual(activity["target"], self.list.remote_id) @@ -532,7 +544,7 @@ class ListActionViews(TestCase): def test_remove_book(self): """take an item off a list""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): item = models.ListItem.objects.create( book_list=self.list, user=self.local_user, @@ -549,13 +561,13 @@ class ListActionViews(TestCase): ) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.list.remove_book(request, self.list.id) self.assertFalse(self.list.listitem_set.exists()) def test_remove_book_unauthorized(self): """take an item off a list""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): item = models.ListItem.objects.create( book_list=self.list, user=self.local_user, book=self.book, order=1 ) diff --git a/bookwyrm/tests/views/test_notifications.py b/bookwyrm/tests/views/test_notifications.py index dd28a811..5df62b1d 100644 --- a/bookwyrm/tests/views/test_notifications.py +++ b/bookwyrm/tests/views/test_notifications.py @@ -25,7 +25,7 @@ class NotificationViews(TestCase): local=True, localname="mouse", ) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): self.status = models.Status.objects.create( content="hi", user=self.local_user, diff --git a/bookwyrm/tests/views/test_outbox.py b/bookwyrm/tests/views/test_outbox.py index a1f62cc6..5c5d47b0 100644 --- a/bookwyrm/tests/views/test_outbox.py +++ b/bookwyrm/tests/views/test_outbox.py @@ -11,7 +11,7 @@ from bookwyrm.settings import USER_AGENT # pylint: disable=too-many-public-methods -@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") +@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") class OutboxView(TestCase): """sends out activities""" diff --git a/bookwyrm/tests/views/test_reading.py b/bookwyrm/tests/views/test_reading.py index 4e5206f6..4ec50165 100644 --- a/bookwyrm/tests/views/test_reading.py +++ b/bookwyrm/tests/views/test_reading.py @@ -64,7 +64,7 @@ class ReadingViews(TestCase): }, ) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.ReadingStatus.as_view()(request, "start", self.book.id) self.assertEqual(shelf.books.get(), self.book) @@ -100,7 +100,7 @@ class ReadingViews(TestCase): }, ) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.ReadingStatus.as_view()(request, "start", self.book.id) self.assertEqual(shelf.books.get(), self.book) @@ -124,7 +124,7 @@ class ReadingViews(TestCase): def test_start_reading_reshelve(self, *_): """begin a book""" to_read_shelf = self.local_user.shelf_set.get(identifier=models.Shelf.TO_READ) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): models.ShelfBook.objects.create( shelf=to_read_shelf, book=self.book, user=self.local_user ) @@ -135,7 +135,7 @@ class ReadingViews(TestCase): request = self.factory.post("") request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.ReadingStatus.as_view()(request, "start", self.book.id) self.assertFalse(to_read_shelf.books.exists()) @@ -162,7 +162,7 @@ class ReadingViews(TestCase): ) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.ReadingStatus.as_view()(request, "finish", self.book.id) self.assertEqual(shelf.books.get(), self.book) @@ -267,7 +267,7 @@ class ReadingViews(TestCase): }, ) request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): views.update_progress(request, self.book.id) status = models.Comment.objects.get() diff --git a/bookwyrm/tests/views/test_readthrough.py b/bookwyrm/tests/views/test_readthrough.py index ef149ce3..5b554748 100644 --- a/bookwyrm/tests/views/test_readthrough.py +++ b/bookwyrm/tests/views/test_readthrough.py @@ -9,7 +9,7 @@ from bookwyrm import models @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay") @patch("bookwyrm.activitystreams.populate_stream_task.delay") -@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") +@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") @patch("bookwyrm.activitystreams.add_book_statuses_task.delay") @patch("bookwyrm.activitystreams.remove_book_statuses_task.delay") class ReadThrough(TestCase): @@ -32,7 +32,7 @@ class ReadThrough(TestCase): "cinco", "cinco@example.com", "seissiete", local=True, localname="cinco" ) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): self.client.force_login(self.user) @patch("bookwyrm.activitystreams.remove_user_statuses_task.delay") diff --git a/bookwyrm/tests/views/test_rss_feed.py b/bookwyrm/tests/views/test_rss_feed.py index d4d11261..409c306d 100644 --- a/bookwyrm/tests/views/test_rss_feed.py +++ b/bookwyrm/tests/views/test_rss_feed.py @@ -6,7 +6,7 @@ from bookwyrm import models from bookwyrm.views import rss_feed -@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") +@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") @patch("bookwyrm.activitystreams.ActivityStream.get_activity_stream") @patch("bookwyrm.activitystreams.add_status_task.delay") class RssFeedView(TestCase): diff --git a/bookwyrm/tests/views/test_search.py b/bookwyrm/tests/views/test_search.py index 3299249a..f8045511 100644 --- a/bookwyrm/tests/views/test_search.py +++ b/bookwyrm/tests/views/test_search.py @@ -139,7 +139,7 @@ class Views(TestCase): def test_search_lists(self): """searches remote connectors""" - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): booklist = models.List.objects.create( user=self.local_user, name="test list" ) diff --git a/bookwyrm/tests/views/test_status.py b/bookwyrm/tests/views/test_status.py index db61b152..b5d7ac16 100644 --- a/bookwyrm/tests/views/test_status.py +++ b/bookwyrm/tests/views/test_status.py @@ -14,7 +14,7 @@ from bookwyrm.tests.validate_html import validate_html @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay") @patch("bookwyrm.activitystreams.populate_stream_task.delay") @patch("bookwyrm.activitystreams.remove_status_task.delay") -@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") +@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") class StatusViews(TestCase): """viewing and creating statuses""" @@ -310,7 +310,7 @@ http://www.fish.com/""" with patch("bookwyrm.activitystreams.remove_status_task.delay") as redis_mock: view(request, status.id) self.assertTrue(redis_mock.called) - activity = json.loads(mock.call_args_list[1][0][1]) + activity = json.loads(mock.call_args_list[1][1]["args"][1]) self.assertEqual(activity["type"], "Delete") self.assertEqual(activity["object"]["type"], "Tombstone") status.refresh_from_db() @@ -344,7 +344,7 @@ http://www.fish.com/""" with patch("bookwyrm.activitystreams.remove_status_task.delay") as redis_mock: view(request, status.id) self.assertTrue(redis_mock.called) - activity = json.loads(mock.call_args_list[1][0][1]) + activity = json.loads(mock.call_args_list[1][1]["args"][1]) self.assertEqual(activity["type"], "Delete") self.assertEqual(activity["object"]["type"], "Tombstone") status.refresh_from_db() @@ -396,7 +396,7 @@ http://www.fish.com/""" request.user = self.local_user view(request, "comment", existing_status_id=status.id) - activity = json.loads(mock.call_args_list[1][0][1]) + activity = json.loads(mock.call_args_list[1][1]["args"][1]) self.assertEqual(activity["type"], "Update") self.assertEqual(activity["object"]["id"], status.remote_id) diff --git a/bookwyrm/tests/views/test_user.py b/bookwyrm/tests/views/test_user.py index 1183fa24..ddb029cc 100644 --- a/bookwyrm/tests/views/test_user.py +++ b/bookwyrm/tests/views/test_user.py @@ -34,9 +34,11 @@ class UserViews(TestCase): self.book = models.Edition.objects.create( title="test", parent_work=models.Work.objects.create(title="test work") ) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"), patch( - "bookwyrm.suggested_users.rerank_suggestions_task.delay" - ), patch("bookwyrm.activitystreams.add_book_statuses_task.delay"): + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ), patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( + "bookwyrm.activitystreams.add_book_statuses_task.delay" + ): models.ShelfBook.objects.create( book=self.book, user=self.local_user, diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index 839d783f..514bb7e6 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -237,7 +237,41 @@ urlpatterns = [ re_path(r"^search/?$", views.Search.as_view(), name="search"), # imports re_path(r"^import/?$", views.Import.as_view(), name="import"), - re_path(r"^import/(\d+)/?$", views.ImportStatus.as_view(), name="import-status"), + re_path( + r"^import/(?P\d+)/?$", + views.ImportStatus.as_view(), + name="import-status", + ), + re_path( + r"^import/(?P\d+)/retry/(?P\d+)/?$", + views.retry_item, + name="import-item-retry", + ), + re_path( + r"^import/(?P\d+)/failed/?$", + views.ImportTroubleshoot.as_view(), + name="import-troubleshoot", + ), + re_path( + r"^import/(?P\d+)/review/?$", + views.ImportManualReview.as_view(), + name="import-review", + ), + re_path( + r"^import/(?P\d+)/review/?$", + views.ImportManualReview.as_view(), + name="import-review", + ), + re_path( + r"^import/(?P\d+)/review/(?P\d+)/approve/?$", + views.approve_import_item, + name="import-approve", + ), + re_path( + r"^import/(?P\d+)/review/(?P\d+)/delete/?$", + views.delete_import_item, + name="import-delete", + ), # users re_path(rf"{USER_PATH}\.json$", views.User.as_view()), re_path(rf"{USER_PATH}/?$", views.User.as_view(), name="user-feed"), diff --git a/bookwyrm/views/__init__.py b/bookwyrm/views/__init__.py index e1dd8355..d79de424 100644 --- a/bookwyrm/views/__init__.py +++ b/bookwyrm/views/__init__.py @@ -43,6 +43,16 @@ from .shelf.shelf import Shelf from .shelf.shelf_actions import create_shelf, delete_shelf from .shelf.shelf_actions import shelve, unshelve +# csv import +from .imports.import_data import Import +from .imports.import_status import ImportStatus, retry_item +from .imports.troubleshoot import ImportTroubleshoot +from .imports.manually_review import ( + ImportManualReview, + approve_import_item, + delete_import_item, +) + # misc views from .author import Author, EditAuthor from .directory import Directory @@ -62,7 +72,6 @@ from .group import ( accept_membership, reject_membership, ) -from .import_data import Import, ImportStatus from .inbox import Inbox from .interaction import Favorite, Unfavorite, Boost, Unboost from .isbn import Isbn diff --git a/bookwyrm/views/imports/__init__.py b/bookwyrm/views/imports/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/bookwyrm/views/import_data.py b/bookwyrm/views/imports/import_data.py similarity index 58% rename from bookwyrm/views/import_data.py rename to bookwyrm/views/imports/import_data.py index 5e113be8..7f6a4d13 100644 --- a/bookwyrm/views/import_data.py +++ b/bookwyrm/views/imports/import_data.py @@ -2,9 +2,8 @@ from io import TextIOWrapper from django.contrib.auth.decorators import login_required -from django.core.exceptions import PermissionDenied from django.http import HttpResponseBadRequest -from django.shortcuts import get_object_or_404, redirect +from django.shortcuts import redirect from django.template.response import TemplateResponse from django.utils.decorators import method_decorator from django.utils.translation import gettext_lazy as _ @@ -12,12 +11,10 @@ from django.views import View from bookwyrm import forms, models from bookwyrm.importers import ( - Importer, LibrarythingImporter, GoodreadsImporter, StorygraphImporter, ) -from bookwyrm.tasks import app # pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") @@ -70,46 +67,3 @@ class Import(View): return redirect(f"/import/{job.id}") return HttpResponseBadRequest() - - -@method_decorator(login_required, name="dispatch") -class ImportStatus(View): - """status of an existing import""" - - def get(self, request, job_id): - """status of an import job""" - job = get_object_or_404(models.ImportJob, id=job_id) - if job.user != request.user: - raise PermissionDenied() - - try: - task = app.AsyncResult(job.task_id) - # triggers attribute error if the task won't load - task.status # pylint: disable=pointless-statement - except (ValueError, AttributeError): - task = None - - items = job.items.order_by("index").all() - failed_items = [i for i in items if i.fail_reason] - items = [i for i in items if not i.fail_reason] - return TemplateResponse( - request, - "import/import_status.html", - {"job": job, "items": items, "failed_items": failed_items, "task": task}, - ) - - def post(self, request, job_id): - """retry lines from an import""" - job = get_object_or_404(models.ImportJob, id=job_id) - items = [] - for item in request.POST.getlist("import_item"): - items.append(get_object_or_404(models.ImportItem, id=item)) - - importer = Importer() - job = importer.create_retry_job( - request.user, - job, - items, - ) - importer.start_import(job) - return redirect(f"/import/{job.id}") diff --git a/bookwyrm/views/imports/import_status.py b/bookwyrm/views/imports/import_status.py new file mode 100644 index 00000000..26ff8cde --- /dev/null +++ b/bookwyrm/views/imports/import_status.py @@ -0,0 +1,79 @@ +""" import books from another app """ +import math + +from django.contrib.auth.decorators import login_required +from django.core.exceptions import PermissionDenied +from django.core.paginator import Paginator +from django.shortcuts import get_object_or_404, redirect +from django.template.response import TemplateResponse +from django.utils import timezone +from django.utils.decorators import method_decorator +from django.views import View +from django.views.decorators.http import require_POST + +from bookwyrm import models +from bookwyrm.importers import GoodreadsImporter +from bookwyrm.importers.importer import import_item_task +from bookwyrm.settings import PAGE_LENGTH + +# pylint: disable= no-self-use +@method_decorator(login_required, name="dispatch") +class ImportStatus(View): + """status of an existing import""" + + def get(self, request, job_id): + """status of an import job""" + job = get_object_or_404(models.ImportJob, id=job_id) + if job.user != request.user: + raise PermissionDenied() + + items = job.items.order_by("index") + item_count = items.count() or 1 + + paginated = Paginator(items, PAGE_LENGTH) + page = paginated.get_page(request.GET.get("page")) + manual_review_count = items.filter( + fail_reason__isnull=False, book_guess__isnull=False, book__isnull=True + ).count() + fail_count = items.filter( + fail_reason__isnull=False, book_guess__isnull=True + ).count() + pending_item_count = job.pending_items.count() + data = { + "job": job, + "items": page, + "manual_review_count": manual_review_count, + "fail_count": fail_count, + "page_range": paginated.get_elided_page_range( + page.number, on_each_side=2, on_ends=1 + ), + "item_count": item_count, + "complete_count": item_count - pending_item_count, + "percent": math.floor( # pylint: disable=c-extension-no-member + (item_count - pending_item_count) / item_count * 100 + ), + # hours since last import item update + "inactive_time": (job.updated_date - timezone.now()).seconds / 60 / 60, + "legacy": not job.mappings, + } + + return TemplateResponse(request, "import/import_status.html", data) + + def post(self, request, job_id): + """bring a legacy import into the latest format""" + job = get_object_or_404(models.ImportJob, id=job_id) + if job.user != request.user: + raise PermissionDenied() + GoodreadsImporter().update_legacy_job(job) + return redirect("import-status", job_id) + + +@login_required +@require_POST +def retry_item(request, job_id, item_id): + """retry an item""" + item = get_object_or_404( + models.ImportItem, id=item_id, job__id=job_id, job__user=request.user + ) + import_item_task.delay(item.id) + return redirect("import-status", job_id) diff --git a/bookwyrm/views/imports/manually_review.py b/bookwyrm/views/imports/manually_review.py new file mode 100644 index 00000000..723fd4bb --- /dev/null +++ b/bookwyrm/views/imports/manually_review.py @@ -0,0 +1,72 @@ +""" verify books we're unsure about """ +from django.contrib.auth.decorators import login_required +from django.core.exceptions import PermissionDenied +from django.core.paginator import Paginator +from django.shortcuts import get_object_or_404, redirect +from django.template.response import TemplateResponse +from django.utils.decorators import method_decorator +from django.views import View +from django.views.decorators.http import require_POST + +from bookwyrm import models +from bookwyrm.importers.importer import import_item_task +from bookwyrm.settings import PAGE_LENGTH + +# pylint: disable= no-self-use +@method_decorator(login_required, name="dispatch") +class ImportManualReview(View): + """problems items in an existing import""" + + def get(self, request, job_id): + """status of an import job""" + job = get_object_or_404(models.ImportJob, id=job_id) + if job.user != request.user: + raise PermissionDenied() + + items = job.items.order_by("index").filter( + book__isnull=True, book_guess__isnull=False + ) + + paginated = Paginator(items, PAGE_LENGTH) + page = paginated.get_page(request.GET.get("page")) + data = { + "job": job, + "items": page, + "page_range": paginated.get_elided_page_range( + page.number, on_each_side=2, on_ends=1 + ), + "complete": True, + } + + return TemplateResponse(request, "import/manual_review.html", data) + + +@login_required +@require_POST +# pylint: disable=unused-argument +def approve_import_item(request, job_id, item_id): + """we guessed right""" + item = get_object_or_404( + models.ImportItem, id=item_id, job__id=job_id, book_guess__isnull=False + ) + item.fail_reason = None + item.book = item.book_guess + item.book_guess = None + item.save() + + # the good stuff - actually import the data + import_item_task.delay(item.id) + return redirect("import-review", job_id) + + +@login_required +@require_POST +# pylint: disable=unused-argument +def delete_import_item(request, job_id, item_id): + """we guessed right""" + item = get_object_or_404( + models.ImportItem, id=item_id, job__id=job_id, book_guess__isnull=False + ) + item.book_guess = None + item.save() + return redirect("import-review", job_id) diff --git a/bookwyrm/views/imports/troubleshoot.py b/bookwyrm/views/imports/troubleshoot.py new file mode 100644 index 00000000..f637b966 --- /dev/null +++ b/bookwyrm/views/imports/troubleshoot.py @@ -0,0 +1,54 @@ +""" import books from another app """ +from django.contrib.auth.decorators import login_required +from django.core.exceptions import PermissionDenied +from django.core.paginator import Paginator +from django.shortcuts import get_object_or_404, redirect +from django.template.response import TemplateResponse +from django.utils.decorators import method_decorator +from django.views import View + +from bookwyrm import models +from bookwyrm.importers import Importer +from bookwyrm.settings import PAGE_LENGTH + +# pylint: disable= no-self-use +@method_decorator(login_required, name="dispatch") +class ImportTroubleshoot(View): + """problems items in an existing import""" + + def get(self, request, job_id): + """status of an import job""" + job = get_object_or_404(models.ImportJob, id=job_id) + if job.user != request.user: + raise PermissionDenied() + + items = job.items.order_by("index").filter( + fail_reason__isnull=False, book_guess__isnull=True + ) + + paginated = Paginator(items, PAGE_LENGTH) + page = paginated.get_page(request.GET.get("page")) + data = { + "job": job, + "items": page, + "page_range": paginated.get_elided_page_range( + page.number, on_each_side=2, on_ends=1 + ), + "complete": True, + } + + return TemplateResponse(request, "import/troubleshoot.html", data) + + def post(self, request, job_id): + """retry lines from an import""" + job = get_object_or_404(models.ImportJob, id=job_id) + items = job.items.filter(fail_reason__isnull=False) + + importer = Importer() + job = importer.create_retry_job( + request.user, + job, + items, + ) + importer.start_import(job) + return redirect(f"/import/{job.id}") diff --git a/bookwyrm/views/user.py b/bookwyrm/views/user.py index b7ab1d3c..082408f9 100644 --- a/bookwyrm/views/user.py +++ b/bookwyrm/views/user.py @@ -1,6 +1,7 @@ """ non-interactive pages """ from django.contrib.auth.decorators import login_required from django.core.paginator import Paginator +from django.db.models import Q, Count from django.http import Http404 from django.shortcuts import redirect from django.template.response import TemplateResponse @@ -105,9 +106,8 @@ class Followers(View): if is_api_request(request): return ActivitypubResponse(user.to_followers_activity(**request.GET)) - paginated = Paginator( - user.followers.order_by("-created_date").all(), PAGE_LENGTH - ) + followers = annotate_if_follows(request.user, user.followers) + paginated = Paginator(followers.all(), PAGE_LENGTH) data = { "user": user, "is_self": request.user.id == user.id, @@ -126,9 +126,8 @@ class Following(View): if is_api_request(request): return ActivitypubResponse(user.to_following_activity(**request.GET)) - paginated = Paginator( - user.following.order_by("-created_date").all(), PAGE_LENGTH - ) + following = annotate_if_follows(request.user, user.following) + paginated = Paginator(following.all(), PAGE_LENGTH) data = { "user": user, "is_self": request.user.id == user.id, @@ -137,6 +136,16 @@ class Following(View): return TemplateResponse(request, "user/relationships/following.html", data) +def annotate_if_follows(user, queryset): + """Sort a list of users by if you follow them""" + if not user.is_authenticated: + return queryset.order_by("-created_date") + + return queryset.annotate( + request_user_follows=Count("followers", filter=Q(followers=user)) + ).order_by("-request_user_follows", "-created_date") + + class Groups(View): """list of user's groups view""" diff --git a/bw-dev b/bw-dev index 6c9def8f..5da97170 100755 --- a/bw-dev +++ b/bw-dev @@ -61,7 +61,7 @@ case "$CMD" in up) docker-compose up --build "$@" ;; - run) + service_ports_web) docker-compose run --rm --service-ports web ;; initdb) @@ -96,9 +96,6 @@ case "$CMD" in restart_celery) docker-compose restart celery_worker ;; - test) - runweb coverage run --source='.' --omit="*/test*,celerywyrm*,bookwyrm/migrations/*" manage.py test "$@" - ;; pytest) execweb pytest --no-cov-on-fail "$@" ;; @@ -111,6 +108,17 @@ case "$CMD" in compilemessages) runweb django-admin compilemessages --ignore venv $@ ;; + update_locales) + git fetch origin l10n_main:l10n_main + git checkout l10n_main locale/de_DE + git checkout l10n_main locale/es_ES + git checkout l10n_main locale/fr_FR + git checkout l10n_main locale/lt_LT + git checkout l10n_main locale/pt_BR + git checkout l10n_main locale/zh_Hans + git checkout l10n_main locale/zh_Hant + runweb django-admin compilemessages --ignore venv + ;; build) docker-compose build ;; @@ -148,14 +156,11 @@ case "$CMD" in runweb) runweb "$@" ;; - rundb) - rundb "$@" - ;; *) set +x # No need to echo echo echo "Unrecognised command. Try:" echo " up [container]" - echo " run" + echo " service_ports_web" echo " initdb" echo " resetdb" echo " makemigrations [migration]" @@ -164,12 +169,11 @@ case "$CMD" in echo " shell" echo " dbshell" echo " restart_celery" - echo " test [path]" echo " pytest [path]" echo " collectstatic" - echo " add_locale [locale]" echo " makemessages" echo " compilemessages [locale]" + echo " update_locales" echo " build" echo " clean" echo " black" @@ -180,6 +184,5 @@ case "$CMD" in echo " copy_media_to_s3" echo " set_cors_to_s3 [cors file]" echo " runweb [command]" - echo " rundb [command]" ;; esac diff --git a/locale/de_DE/LC_MESSAGES/django.mo b/locale/de_DE/LC_MESSAGES/django.mo index 516685a0..f4937760 100644 Binary files a/locale/de_DE/LC_MESSAGES/django.mo and b/locale/de_DE/LC_MESSAGES/django.mo differ diff --git a/locale/de_DE/LC_MESSAGES/django.po b/locale/de_DE/LC_MESSAGES/django.po index 8fd930fe..6ebce09a 100644 --- a/locale/de_DE/LC_MESSAGES/django.po +++ b/locale/de_DE/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-15 22:03+0000\n" -"PO-Revision-Date: 2021-10-20 17:38\n" +"POT-Creation-Date: 2021-11-14 15:08+0000\n" +"PO-Revision-Date: 2021-11-15 18:03\n" "Last-Translator: Mouse Reeve \n" "Language-Team: German\n" "Language: de\n" @@ -19,7 +19,7 @@ msgstr "" #: bookwyrm/forms.py:242 msgid "A user with this email already exists." -msgstr "Es existiert bereits ein Account mit dieser E-Mail-Adresse." +msgstr "Es existiert bereits ein Benutzer*inkonto mit dieser E-Mail-Adresse." #: bookwyrm/forms.py:256 msgid "One Day" @@ -35,7 +35,7 @@ msgstr "Ein Monat" #: bookwyrm/forms.py:259 msgid "Does Not Expire" -msgstr "Läuft nicht aus" +msgstr "Läuft nicht ab" #: bookwyrm/forms.py:263 #, python-brace-format @@ -46,41 +46,42 @@ msgstr "{i}-mal verwendbar" msgid "Unlimited" msgstr "Unbegrenzt" -#: bookwyrm/forms.py:326 +#: bookwyrm/forms.py:332 msgid "List Order" msgstr "Reihenfolge der Liste" -#: bookwyrm/forms.py:327 +#: bookwyrm/forms.py:333 msgid "Book Title" msgstr "Buchtitel" -#: bookwyrm/forms.py:328 bookwyrm/templates/shelf/shelf.html:136 -#: bookwyrm/templates/shelf/shelf.html:168 +#: bookwyrm/forms.py:334 bookwyrm/templates/shelf/shelf.html:149 +#: bookwyrm/templates/shelf/shelf.html:181 #: bookwyrm/templates/snippets/create_status/review.html:33 msgid "Rating" msgstr "Bewertung" -#: bookwyrm/forms.py:330 bookwyrm/templates/lists/list.html:109 +#: bookwyrm/forms.py:336 bookwyrm/templates/lists/list.html:110 msgid "Sort By" msgstr "Sortieren nach" -#: bookwyrm/forms.py:334 +#: bookwyrm/forms.py:340 msgid "Ascending" msgstr "Aufsteigend" -#: bookwyrm/forms.py:335 +#: bookwyrm/forms.py:341 msgid "Descending" msgstr "Absteigend" -#: bookwyrm/importers/importer.py:75 +#: bookwyrm/importers/importer.py:127 msgid "Error loading book" msgstr "Fehler beim Laden des Buches" -#: bookwyrm/importers/importer.py:88 +#: bookwyrm/importers/importer.py:135 msgid "Could not find a match for book" msgstr "Keine Übereinstimmung für das Buch gefunden" #: bookwyrm/models/base_model.py:17 +#: bookwyrm/templates/import/import_status.html:171 msgid "Pending" msgstr "Ausstehend" @@ -100,23 +101,23 @@ msgstr "Moderator*in löschen" msgid "Domain block" msgstr "Domainsperrung" -#: bookwyrm/models/book.py:232 +#: bookwyrm/models/book.py:233 msgid "Audiobook" msgstr "Hörbuch" -#: bookwyrm/models/book.py:233 +#: bookwyrm/models/book.py:234 msgid "eBook" msgstr "E-Book" -#: bookwyrm/models/book.py:234 +#: bookwyrm/models/book.py:235 msgid "Graphic novel" msgstr "Graphic Novel" -#: bookwyrm/models/book.py:235 +#: bookwyrm/models/book.py:236 msgid "Hardcover" msgstr "Hardcover" -#: bookwyrm/models/book.py:236 +#: bookwyrm/models/book.py:237 msgid "Paperback" msgstr "Taschenbuch" @@ -133,23 +134,23 @@ msgstr "Föderiert" msgid "Blocked" msgstr "Blockiert" -#: bookwyrm/models/fields.py:27 +#: bookwyrm/models/fields.py:29 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "%(value)s ist keine gültige remote_id" -#: bookwyrm/models/fields.py:36 bookwyrm/models/fields.py:45 +#: bookwyrm/models/fields.py:38 bookwyrm/models/fields.py:47 #, python-format msgid "%(value)s is not a valid username" -msgstr "%(value)s ist kein gültiger Username" +msgstr "%(value)s ist kein gültiger Benutzer*inname" -#: bookwyrm/models/fields.py:181 bookwyrm/templates/layout.html:171 +#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:171 msgid "username" -msgstr "Username" +msgstr "Benutzer*inname" -#: bookwyrm/models/fields.py:186 +#: bookwyrm/models/fields.py:188 msgid "A user with that username already exists." -msgstr "Dieser Benutzename ist bereits vergeben." +msgstr "Dieser Benutzer*inname ist bereits vergeben." #: bookwyrm/settings.py:118 msgid "Home Timeline" @@ -161,11 +162,11 @@ msgstr "Startseite" #: bookwyrm/settings.py:119 msgid "Books Timeline" -msgstr "Bücher-Zeitachse" +msgstr "Bücher-Zeitleiste" #: bookwyrm/settings.py:119 bookwyrm/templates/search/layout.html:21 #: bookwyrm/templates/search/layout.html:42 -#: bookwyrm/templates/user/layout.html:81 +#: bookwyrm/templates/user/layout.html:88 msgid "Books" msgstr "Bücher" @@ -191,7 +192,7 @@ msgstr "Português (Portugiesisch)" #: bookwyrm/settings.py:170 msgid "简体中文 (Simplified Chinese)" -msgstr "简体中文 (Vereinfachtes Chinesisch)" +msgstr "简体中文 (vereinfachtes Chinesisch)" #: bookwyrm/settings.py:171 msgid "繁體中文 (Traditional Chinese)" @@ -203,7 +204,7 @@ msgstr "Nicht gefunden" #: bookwyrm/templates/404.html:9 msgid "The page you requested doesn't seem to exist!" -msgstr "Die Seite die du angefordert hast scheint nicht zu existieren!" +msgstr "Die Seite, die du angefordert hast, scheint nicht zu existieren!" #: bookwyrm/templates/500.html:4 msgid "Oops!" @@ -215,25 +216,25 @@ msgstr "Serverfehler" #: bookwyrm/templates/500.html:9 msgid "Something went wrong! Sorry about that." -msgstr "Etwas lief schief. Entschuldigung!" +msgstr "Etwas ist schief gelaufen! Tut uns leid." #: bookwyrm/templates/author/author.html:17 #: bookwyrm/templates/author/author.html:18 msgid "Edit Author" -msgstr "Autor*in editieren" +msgstr "Autor*in bearbeiten" #: bookwyrm/templates/author/author.html:34 -#: bookwyrm/templates/author/edit_author.html:41 +#: bookwyrm/templates/author/edit_author.html:43 msgid "Aliases:" msgstr "Alternative Namen:" #: bookwyrm/templates/author/author.html:45 msgid "Born:" -msgstr "Geboren" +msgstr "Geboren:" #: bookwyrm/templates/author/author.html:52 msgid "Died:" -msgstr "Gestorben" +msgstr "Gestorben:" #: bookwyrm/templates/author/author.html:61 msgid "Wikipedia" @@ -242,7 +243,7 @@ msgstr "Wikipedia" #: bookwyrm/templates/author/author.html:69 #: bookwyrm/templates/book/book.html:94 msgid "View on OpenLibrary" -msgstr "In OpenLibrary ansehen" +msgstr "Auf OpenLibrary ansehen" #: bookwyrm/templates/author/author.html:77 #: bookwyrm/templates/book/book.html:97 @@ -276,71 +277,72 @@ msgstr "Hinzugefügt:" msgid "Updated:" msgstr "Aktualisiert:" -#: bookwyrm/templates/author/edit_author.html:15 +#: bookwyrm/templates/author/edit_author.html:16 #: bookwyrm/templates/book/edit/edit_book.html:25 msgid "Last edited by:" msgstr "Zuletzt bearbeitet von:" -#: bookwyrm/templates/author/edit_author.html:31 +#: bookwyrm/templates/author/edit_author.html:33 #: bookwyrm/templates/book/edit/edit_book_form.html:15 msgid "Metadata" msgstr "Metadaten" -#: bookwyrm/templates/author/edit_author.html:33 -#: bookwyrm/templates/lists/form.html:8 bookwyrm/templates/shelf/form.html:9 +#: bookwyrm/templates/author/edit_author.html:35 +#: bookwyrm/templates/lists/form.html:9 bookwyrm/templates/shelf/form.html:9 msgid "Name:" msgstr "Name:" -#: bookwyrm/templates/author/edit_author.html:43 +#: bookwyrm/templates/author/edit_author.html:45 #: bookwyrm/templates/book/edit/edit_book_form.html:65 #: bookwyrm/templates/book/edit/edit_book_form.html:79 #: bookwyrm/templates/book/edit/edit_book_form.html:124 msgid "Separate multiple values with commas." msgstr "Mehrere Werte durch Kommas getrennt eingeben." -#: bookwyrm/templates/author/edit_author.html:50 +#: bookwyrm/templates/author/edit_author.html:52 msgid "Bio:" msgstr "Über mich:" -#: bookwyrm/templates/author/edit_author.html:57 +#: bookwyrm/templates/author/edit_author.html:59 msgid "Wikipedia link:" msgstr "Wikipedialink:" -#: bookwyrm/templates/author/edit_author.html:63 +#: bookwyrm/templates/author/edit_author.html:65 msgid "Birth date:" msgstr "Geburtsdatum:" -#: bookwyrm/templates/author/edit_author.html:71 +#: bookwyrm/templates/author/edit_author.html:73 msgid "Death date:" msgstr "Todesdatum:" -#: bookwyrm/templates/author/edit_author.html:79 -msgid "Author Identifiers" -msgstr "Autor*innenidentifikatoren" - #: bookwyrm/templates/author/edit_author.html:81 +msgid "Author Identifiers" +msgstr "Autor*in-Identifikatoren" + +#: bookwyrm/templates/author/edit_author.html:83 msgid "Openlibrary key:" msgstr "Openlibrary-Schlüssel:" -#: bookwyrm/templates/author/edit_author.html:89 +#: bookwyrm/templates/author/edit_author.html:91 #: bookwyrm/templates/book/edit/edit_book_form.html:224 msgid "Inventaire ID:" msgstr "Inventaire-ID:" -#: bookwyrm/templates/author/edit_author.html:97 +#: bookwyrm/templates/author/edit_author.html:99 msgid "Librarything key:" msgstr "Librarything-Schlüssel:" -#: bookwyrm/templates/author/edit_author.html:105 +#: bookwyrm/templates/author/edit_author.html:107 msgid "Goodreads key:" msgstr "Goodreads-Schlüssel:" -#: bookwyrm/templates/author/edit_author.html:116 +#: bookwyrm/templates/author/edit_author.html:118 #: bookwyrm/templates/book/book.html:140 #: bookwyrm/templates/book/edit/edit_book.html:110 #: bookwyrm/templates/book/readthrough.html:76 +#: bookwyrm/templates/groups/form.html:24 #: bookwyrm/templates/lists/bookmark_button.html:15 -#: bookwyrm/templates/lists/form.html:44 +#: bookwyrm/templates/lists/form.html:75 #: bookwyrm/templates/preferences/edit_user.html:124 #: bookwyrm/templates/settings/announcements/announcement_form.html:69 #: bookwyrm/templates/settings/federation/edit_instance.html:74 @@ -352,11 +354,13 @@ msgstr "Goodreads-Schlüssel:" msgid "Save" msgstr "Speichern" -#: bookwyrm/templates/author/edit_author.html:117 +#: bookwyrm/templates/author/edit_author.html:119 #: bookwyrm/templates/book/book.html:141 bookwyrm/templates/book/book.html:190 #: bookwyrm/templates/book/cover_modal.html:32 -#: bookwyrm/templates/book/edit/edit_book.html:111 +#: bookwyrm/templates/book/edit/edit_book.html:112 +#: bookwyrm/templates/book/edit/edit_book.html:115 #: bookwyrm/templates/book/readthrough.html:77 +#: bookwyrm/templates/groups/delete_group_modal.html:17 #: bookwyrm/templates/lists/delete_list_modal.html:17 #: bookwyrm/templates/settings/federation/instance.html:88 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:17 @@ -373,12 +377,12 @@ msgstr "von" #: bookwyrm/templates/book/book.html:55 bookwyrm/templates/book/book.html:56 msgid "Edit Book" -msgstr "Buch editieren" +msgstr "Buch bearbeiten" #: bookwyrm/templates/book/book.html:73 #: bookwyrm/templates/book/cover_modal.html:5 msgid "Add cover" -msgstr "Cover hinzufügen" +msgstr "Titelbild hinzufügen" #: bookwyrm/templates/book/book.html:77 msgid "Failed to load cover" @@ -388,8 +392,8 @@ msgstr "Fehler beim Laden des Titelbilds" #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" -msgstr[0] "(%(review_count)s Bewertung)" -msgstr[1] "(%(review_count)s Bewertungen)" +msgstr[0] "(%(review_count)s Besprechung)" +msgstr[1] "(%(review_count)s Besprechungen)" #: bookwyrm/templates/book/book.html:129 msgid "Add Description" @@ -397,7 +401,7 @@ msgstr "Beschreibung hinzufügen" #: bookwyrm/templates/book/book.html:136 #: bookwyrm/templates/book/edit/edit_book_form.html:34 -#: bookwyrm/templates/lists/form.html:12 bookwyrm/templates/shelf/form.html:17 +#: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Beschreibung:" @@ -460,7 +464,7 @@ msgstr "Orte" #: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12 #: bookwyrm/templates/search/layout.html:25 #: bookwyrm/templates/search/layout.html:50 -#: bookwyrm/templates/user/layout.html:75 +#: bookwyrm/templates/user/layout.html:82 msgid "Lists" msgstr "Listen" @@ -470,7 +474,7 @@ msgstr "Zur Liste hinzufügen" #: bookwyrm/templates/book/book.html:315 #: bookwyrm/templates/book/cover_modal.html:31 -#: bookwyrm/templates/lists/list.html:181 +#: bookwyrm/templates/lists/list.html:182 #: bookwyrm/templates/settings/email_blocklist/domain_form.html:26 #: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:32 msgid "Add" @@ -483,7 +487,7 @@ msgstr "ISBN:" #: bookwyrm/templates/book/book_identifiers.html:15 #: bookwyrm/templates/book/edit/edit_book_form.html:232 msgid "OCLC Number:" -msgstr "OCLC Nummer:" +msgstr "OCLC-Nummer:" #: bookwyrm/templates/book/book_identifiers.html:22 #: bookwyrm/templates/book/edit/edit_book_form.html:240 @@ -498,13 +502,13 @@ msgstr "Titelbild hochladen:" #: bookwyrm/templates/book/cover_modal.html:23 #: bookwyrm/templates/book/edit/edit_book_form.html:148 msgid "Load cover from url:" -msgstr "Cover von URL laden:" +msgstr "Titelbild von URL laden:" #: bookwyrm/templates/book/edit/edit_book.html:5 #: bookwyrm/templates/book/edit/edit_book.html:11 #, python-format msgid "Edit \"%(book_title)s\"" -msgstr "\"%(book_title)s \" bearbeiten" +msgstr "„%(book_title)s“ bearbeiten" #: bookwyrm/templates/book/edit/edit_book.html:5 #: bookwyrm/templates/book/edit/edit_book.html:13 @@ -518,7 +522,7 @@ msgstr "Buchinfo bestätigen" #: bookwyrm/templates/book/edit/edit_book.html:55 #, python-format msgid "Is \"%(name)s\" an existing author?" -msgstr "Existiert \"%(name)s\" bereits als Autor:in?" +msgstr "Existiert „%(name)s“ bereits als Autor*in?" #: bookwyrm/templates/book/edit/edit_book.html:64 #, python-format @@ -527,23 +531,25 @@ msgstr "Autor*in von %(book_title)s" #: bookwyrm/templates/book/edit/edit_book.html:68 msgid "This is a new author" -msgstr "Neue:r Autor:in" +msgstr "Neue*r Autor*in" #: bookwyrm/templates/book/edit/edit_book.html:75 #, python-format msgid "Creating a new author: %(name)s" -msgstr "Neu als Autor:in erstellen: %(name)s" +msgstr "Als neue*r Autor*in erstellen: %(name)s" #: bookwyrm/templates/book/edit/edit_book.html:82 msgid "Is this an edition of an existing work?" -msgstr "Ist das eine Edition eines vorhandenen Werkes?" +msgstr "Ist das eine Ausgabe eines vorhandenen Werkes?" #: bookwyrm/templates/book/edit/edit_book.html:90 msgid "This is a new work" msgstr "Dies ist ein neues Werk." #: bookwyrm/templates/book/edit/edit_book.html:97 -#: bookwyrm/templates/password_reset.html:30 +#: bookwyrm/templates/groups/members.html:16 +#: bookwyrm/templates/landing/password_reset.html:30 +#: bookwyrm/templates/snippets/remove_from_group_button.html:16 msgid "Confirm" msgstr "Bestätigen" @@ -567,7 +573,7 @@ msgstr "Serie:" #: bookwyrm/templates/book/edit/edit_book_form.html:53 msgid "Series number:" -msgstr "Seriennummer:" +msgstr "Nummer in der Serie:" #: bookwyrm/templates/book/edit/edit_book_form.html:63 msgid "Languages:" @@ -601,7 +607,7 @@ msgstr "%(name)s entfernen" #: bookwyrm/templates/book/edit/edit_book_form.html:115 #, python-format msgid "Author page for %(name)s" -msgstr "Autor*innenseite für %(name)s" +msgstr "Autor*inseite für %(name)s" #: bookwyrm/templates/book/edit/edit_book_form.html:122 msgid "Add Authors:" @@ -612,7 +618,7 @@ msgid "John Doe, Jane Smith" msgstr "Max Mustermann, Maria Musterfrau" #: bookwyrm/templates/book/edit/edit_book_form.html:132 -#: bookwyrm/templates/shelf/shelf.html:127 +#: bookwyrm/templates/shelf/shelf.html:140 msgid "Cover" msgstr "Titelbild" @@ -635,7 +641,7 @@ msgstr "Seiten:" #: bookwyrm/templates/book/edit/edit_book_form.html:197 msgid "Book Identifiers" -msgstr "Buchidentifikatoren" +msgstr "Buch-Identifikatoren" #: bookwyrm/templates/book/edit/edit_book_form.html:200 msgid "ISBN 13:" @@ -652,22 +658,22 @@ msgstr "OpenLibrary-ID:" #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" -msgstr "Editionen von %(book_title)s" +msgstr "Ausgaben von %(book_title)s" #: bookwyrm/templates/book/editions/editions.html:8 #, python-format msgid "Editions of \"%(work_title)s\"" -msgstr "Editionen von \"%(work_title)s\"" +msgstr "Ausgaben von \"%(work_title)s\"" #: bookwyrm/templates/book/editions/format_filter.html:8 #: bookwyrm/templates/book/editions/language_filter.html:8 msgid "Any" -msgstr "Beliebig" +msgstr "Beliebig(e)" #: bookwyrm/templates/book/editions/language_filter.html:5 #: bookwyrm/templates/preferences/edit_user.html:95 msgid "Language:" -msgstr "Sprache" +msgstr "Sprache:" #: bookwyrm/templates/book/editions/search_filter.html:5 msgid "Search editions" @@ -709,23 +715,23 @@ msgstr "bewertet" #: bookwyrm/templates/book/readthrough.html:8 msgid "Progress Updates:" -msgstr "Fortschrittsupdates:" +msgstr "Zwischenstände:" #: bookwyrm/templates/book/readthrough.html:13 msgid "finished" -msgstr "Abgeschlossen" +msgstr "abgeschlossen" #: bookwyrm/templates/book/readthrough.html:24 msgid "Show all updates" -msgstr "Zeige alle Updates" +msgstr "Zeige alle Zwischenstände" #: bookwyrm/templates/book/readthrough.html:40 msgid "Delete this progress update" -msgstr "Dieses Fortschrittsupdate löschen" +msgstr "Diesen Zwischenstand löschen" #: bookwyrm/templates/book/readthrough.html:51 msgid "started" -msgstr "Angefangen" +msgstr "angefangen" #: bookwyrm/templates/book/readthrough.html:58 #: bookwyrm/templates/book/readthrough.html:72 @@ -765,11 +771,11 @@ msgstr "Bestätige deine E-Mail-Adresse" #: bookwyrm/templates/confirm_email/confirm_email.html:13 msgid "A confirmation code has been sent to the email address you used to register your account." -msgstr "Der Bestätigungscode um deinen Account zu registrieren wurde an die E-Mail-Adresse gesendet." +msgstr "Der Bestätigungscode zur Registrierung eines Benutzer*inkontos wurde an deine E-Mail-Adresse gesendet." #: bookwyrm/templates/confirm_email/confirm_email.html:15 msgid "Sorry! We couldn't find that code." -msgstr "Sorry! Dieser Code ist uns nicht bekannt." +msgstr "Tut uns leid! Dieser Code ist uns nicht bekannt." #: bookwyrm/templates/confirm_email/confirm_email.html:19 #: bookwyrm/templates/settings/users/user_info.html:85 @@ -793,11 +799,11 @@ msgstr "Bestätigungslink erneut senden" #: bookwyrm/templates/confirm_email/resend_form.html:11 #: bookwyrm/templates/landing/layout.html:67 -#: bookwyrm/templates/password_reset_request.html:18 +#: bookwyrm/templates/landing/password_reset_request.html:18 #: bookwyrm/templates/preferences/edit_user.html:56 #: bookwyrm/templates/snippets/register_form.html:13 msgid "Email address:" -msgstr "E-Mail Adresse" +msgstr "E-Mail-Adresse:" #: bookwyrm/templates/confirm_email/resend_form.html:17 msgid "Resend link" @@ -823,7 +829,7 @@ msgstr "Verzeichnis" #: bookwyrm/templates/directory/directory.html:17 msgid "Make your profile discoverable to other BookWyrm users." -msgstr "Mach dein Profil entdeckbar für andere User" +msgstr "Mach dein Profil entdeckbar für andere BookWyrm-Benutzer*innen." #: bookwyrm/templates/directory/directory.html:24 #, python-format @@ -834,7 +840,7 @@ msgstr "Du kannst dich jederzeit in deinen Profileinstellun #: bookwyrm/templates/feed/goal_card.html:17 #: bookwyrm/templates/snippets/announcement.html:34 msgid "Dismiss message" -msgstr "Nachricht verwerfen" +msgstr "Nachricht schließen" #: bookwyrm/templates/directory/sort_filter.html:5 msgid "Order by" @@ -881,28 +887,43 @@ msgstr "Benutzer*in-Typ" #: bookwyrm/templates/directory/user_type_filter.html:8 msgid "BookWyrm users" -msgstr "Bookwyrmnutzer*innen" +msgstr "Bookwyrm-Benutzer*innen" #: bookwyrm/templates/directory/user_type_filter.html:12 msgid "All known users" -msgstr "Alle bekannten Nutzer*innen" +msgstr "Alle bekannten Benutzer*innen" -#: bookwyrm/templates/discover/card-header.html:9 +#: bookwyrm/templates/discover/card-header.html:8 +#, python-format +msgid "%(username)s wants to read %(book_title)s" +msgstr "" + +#: bookwyrm/templates/discover/card-header.html:13 +#, python-format +msgid "%(username)s finished reading %(book_title)s" +msgstr "" + +#: bookwyrm/templates/discover/card-header.html:18 +#, python-format +msgid "%(username)s started reading %(book_title)s" +msgstr "" + +#: bookwyrm/templates/discover/card-header.html:23 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)s hat %(book_title)s bewertet" -#: bookwyrm/templates/discover/card-header.html:13 +#: bookwyrm/templates/discover/card-header.html:27 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s hat %(book_title)s besprochen" -#: bookwyrm/templates/discover/card-header.html:17 +#: bookwyrm/templates/discover/card-header.html:31 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s hat %(book_title)s kommentiert" -#: bookwyrm/templates/discover/card-header.html:21 +#: bookwyrm/templates/discover/card-header.html:35 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s hat %(book_title)s zitiert" @@ -916,18 +937,18 @@ msgstr "Entdecken" #: bookwyrm/templates/discover/discover.html:12 #, python-format msgid "See what's new in the local %(site_name)s community" -msgstr "Schau, was in der %(site_name)s Community neu ist" +msgstr "Was gibt es Neues in der %(site_name)s-Gemeinschaft" #: bookwyrm/templates/discover/large-book.html:52 #: bookwyrm/templates/discover/small-book.html:36 msgid "View status" -msgstr "Status ansehen" +msgstr "Status anzeigen" #: bookwyrm/templates/email/confirm/html_content.html:6 #: bookwyrm/templates/email/confirm/text_content.html:4 #, python-format msgid "One last step before you join %(site_name)s! Please confirm your email address by clicking the link below:" -msgstr "Als letzten Schritt bevor du %(site_name)s beitrittst - bestätige bitte deine Emailadresse indem du den Link klickst" +msgstr "Als letzten Schritt bevor du %(site_name)s beitrittst bestätige bitte deine E-Mail-Adresse, indem du den folgenden Link klickst:" #: bookwyrm/templates/email/confirm/html_content.html:11 msgid "Confirm Email" @@ -936,7 +957,7 @@ msgstr "E-Mail-Adresse bestätigen" #: bookwyrm/templates/email/confirm/html_content.html:15 #, python-format msgid "Or enter the code \"%(confirmation_code)s\" at login." -msgstr "Oder gibt den code \"%(confirmation_code)s\" beim Login ein." +msgstr "Oder gibt den Code „%(confirmation_code)s“ bei der Anmeldung ein." #: bookwyrm/templates/email/confirm/subject.html:2 msgid "Please confirm your email" @@ -945,12 +966,12 @@ msgstr "Bitte bestätige deine E-Mail-Adresse" #: bookwyrm/templates/email/confirm/text_content.html:10 #, python-format msgid "Or enter the code \"%(confirmation_code)s\" at login." -msgstr "Oder gibt den code \"%(confirmation_code)s\" beim Login ein." +msgstr "Oder gibt den Code „%(confirmation_code)s“ bei der Anmeldung ein." #: bookwyrm/templates/email/html_layout.html:15 #: bookwyrm/templates/email/text_layout.html:2 msgid "Hi there," -msgstr "Moin," +msgstr "Hallo," #: bookwyrm/templates/email/html_layout.html:21 #, python-format @@ -959,7 +980,7 @@ msgstr "BookWyrm wird auf über %(site_n #: bookwyrm/templates/email/invite/text_content.html:4 #, python-format msgid "You're invited to join %(site_name)s! Click the link below to create an account." -msgstr "Du bist eingeladen, %(site_name)s beizutreten! Klicke auf den Link unten um einen Account zu erstellen." +msgstr "Du bist eingeladen, %(site_name)s beizutreten! Klicke auf den Link unten, um ein Benutzer*inkonto zu erstellen." #: bookwyrm/templates/email/invite/text_content.html:8 #, python-format @@ -990,15 +1011,15 @@ msgstr "Erfahre mehr über %(site_name)s:" #: bookwyrm/templates/email/password_reset/text_content.html:4 #, python-format msgid "You requested to reset your %(site_name)s password. Click the link below to set a new password and log in to your account." -msgstr "Du hast beantragt, dein %(site_name)s Passwort zu ändern. Klicke auf den Link unten, um ein neues Passwort zu erstellen und dich einzuloggen." +msgstr "Du hast beantragt, dein %(site_name)s-Passwort zu ändern. Klicke auf den Link unten, um ein neues Passwort zu erstellen und dich anzumelden." #: bookwyrm/templates/email/password_reset/html_content.html:9 -#: bookwyrm/templates/password_reset.html:4 -#: bookwyrm/templates/password_reset.html:10 -#: bookwyrm/templates/password_reset_request.html:4 -#: bookwyrm/templates/password_reset_request.html:10 +#: bookwyrm/templates/landing/password_reset.html:4 +#: bookwyrm/templates/landing/password_reset.html:10 +#: bookwyrm/templates/landing/password_reset_request.html:4 +#: bookwyrm/templates/landing/password_reset_request.html:10 msgid "Reset Password" -msgstr "Passwort zurücksetzen!" +msgstr "Passwort zurücksetzen" #: bookwyrm/templates/email/password_reset/html_content.html:13 #: bookwyrm/templates/email/password_reset/text_content.html:8 @@ -1008,7 +1029,7 @@ msgstr "Falls du dein Passwort gar nicht zurücksetzen wolltest, kannst du diese #: bookwyrm/templates/email/password_reset/subject.html:2 #, python-format msgid "Reset your %(site_name)s password" -msgstr "Dein Passwort für %(site_name)s zurücksetzen" +msgstr "Passwort für %(site_name)s zurücksetzen" #: bookwyrm/templates/feed/direct_messages.html:8 #, python-format @@ -1031,44 +1052,45 @@ msgstr "Du hast momentan keine Nachrichten." #: bookwyrm/templates/feed/feed.html:22 #, python-format msgid "load 0 unread status(es)" -msgstr "lese 0 ungelesene Status" +msgstr "lade 0 ungelesene Statusmeldung(en)" #: bookwyrm/templates/feed/feed.html:38 msgid "There aren't any activities right now! Try following a user to get started" -msgstr "Hier sind noch keine Aktivitäten! Folge anderen, um loszulegen" +msgstr "Hier sind noch keine Aktivitäten! Folge Anderen, um loszulegen" #: bookwyrm/templates/feed/goal_card.html:6 #: bookwyrm/templates/feed/layout.html:90 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" -msgstr "%(year)s Leseziel" +msgstr "Leseziel für %(year)s" #: bookwyrm/templates/feed/goal_card.html:18 #, python-format msgid "You can set or change your reading goal any time from your profile page" -msgstr "Du kannst dein Leseziel jederzeit auf deiner Profilseite setzen oder ändern." +msgstr "Du kannst dein Leseziel jederzeit auf deiner Profilseite festlegen oder ändern" #: bookwyrm/templates/feed/layout.html:5 msgid "Updates" msgstr "Updates" -#: bookwyrm/templates/feed/layout.html:12 -#: bookwyrm/templates/user/books_header.html:3 -msgid "Your books" +#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:106 +msgid "Your Books" msgstr "Deine Bücher" #: bookwyrm/templates/feed/layout.html:14 msgid "There are no books here right now! Try searching for a book to get started" -msgstr "Hier sind noch keine Bücher! Versuche nach Büchern zu suchen um loszulegen" +msgstr "Hier sind noch keine Bücher! Versuche, nach Büchern zu suchen, um loszulegen" #: bookwyrm/templates/feed/layout.html:25 #: bookwyrm/templates/shelf/shelf.html:38 +#: bookwyrm/templates/user/books_header.html:4 msgid "To Read" msgstr "Zu lesen" #: bookwyrm/templates/feed/layout.html:26 #: bookwyrm/templates/shelf/shelf.html:40 +#: bookwyrm/templates/user/books_header.html:6 msgid "Currently Reading" msgstr "Lese ich gerade" @@ -1076,6 +1098,7 @@ msgstr "Lese ich gerade" #: bookwyrm/templates/shelf/shelf.html:42 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:23 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12 +#: bookwyrm/templates/user/books_header.html:8 msgid "Read" msgstr "Gelesen" @@ -1086,11 +1109,11 @@ msgstr "Wem noch folgen?" #: bookwyrm/templates/feed/suggested_users.html:9 msgid "Don't show suggested users" -msgstr "Keine vorgeschlagenen User anzeigen" +msgstr "Keine vorgeschlagenen Benutzer*innen anzeigen" #: bookwyrm/templates/feed/suggested_users.html:14 msgid "View directory" -msgstr "Zeige Verzeichnis" +msgstr "Verzeichnis anzeigen" #: bookwyrm/templates/get_started/book_preview.html:6 #, python-format @@ -1102,14 +1125,14 @@ msgid "What are you reading?" msgstr "Was liest du gerade?" #: bookwyrm/templates/get_started/books.html:9 -#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:137 +#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:138 msgid "Search for a book" msgstr "Nach einem Buch suchen" #: bookwyrm/templates/get_started/books.html:11 #, python-format msgid "No books found for \"%(query)s\"" -msgstr "Keine Bücher für \"%(query)s\" gefunden" +msgstr "Keine Bücher für „%(query)s“ gefunden" #: bookwyrm/templates/get_started/books.html:11 #, python-format @@ -1120,8 +1143,9 @@ msgstr "Du kannst Bücher hinzufügen, wenn du %(site_name)s benutzt." #: bookwyrm/templates/get_started/books.html:17 #: bookwyrm/templates/get_started/users.html:18 #: bookwyrm/templates/get_started/users.html:19 -#: bookwyrm/templates/layout.html:51 bookwyrm/templates/layout.html:52 -#: bookwyrm/templates/lists/list.html:141 +#: bookwyrm/templates/groups/group.html:19 +#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:51 +#: bookwyrm/templates/layout.html:52 bookwyrm/templates/lists/list.html:142 #: bookwyrm/templates/search/layout.html:4 #: bookwyrm/templates/search/layout.html:9 msgid "Search" @@ -1137,7 +1161,7 @@ msgid "Popular on %(site_name)s" msgstr "Auf %(site_name)s beliebt" #: bookwyrm/templates/get_started/books.html:58 -#: bookwyrm/templates/lists/list.html:154 +#: bookwyrm/templates/lists/list.html:155 msgid "No books found" msgstr "Keine Bücher gefunden" @@ -1184,16 +1208,16 @@ msgstr "Fertigstellen" #: bookwyrm/templates/get_started/profile.html:15 #: bookwyrm/templates/preferences/edit_user.html:42 msgid "Display name:" -msgstr "Displayname:" +msgstr "Anzeigename:" #: bookwyrm/templates/get_started/profile.html:22 #: bookwyrm/templates/preferences/edit_user.html:49 msgid "Summary:" -msgstr "Bio:" +msgstr "Zusammenfassung:" #: bookwyrm/templates/get_started/profile.html:23 msgid "A little bit about you" -msgstr "Etwas über dich" +msgstr "Einige Angaben zu dir" #: bookwyrm/templates/get_started/profile.html:32 #: bookwyrm/templates/preferences/edit_user.html:27 @@ -1203,16 +1227,16 @@ msgstr "Avatar:" #: bookwyrm/templates/get_started/profile.html:42 #: bookwyrm/templates/preferences/edit_user.html:110 msgid "Manually approve followers:" -msgstr "Folgende manuell bestätigen" +msgstr "Follower*innen manuell bestätigen:" #: bookwyrm/templates/get_started/profile.html:48 #: bookwyrm/templates/preferences/edit_user.html:80 msgid "Show this account in suggested users:" -msgstr "Diesen Account in vorgeschlagenen Usern zeigen" +msgstr "Dieses Benutzer*inkonto in vorgeschlagene Benutzer*innen einschließen:" #: bookwyrm/templates/get_started/profile.html:52 msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users." -msgstr "Dein Account wird im Verzeichnis gezeigt und möglicherweise anderen Usern vorgeschlagen." +msgstr "Dein Benutzer*inkonto wird im Verzeichnis gezeigt und möglicherweise anderen Benutzer*innen vorgeschlagen." #: bookwyrm/templates/get_started/users.html:11 msgid "Search for a user" @@ -1221,11 +1245,112 @@ msgstr "Benutzer*in suchen" #: bookwyrm/templates/get_started/users.html:13 #, python-format msgid "No users found for \"%(query)s\"" -msgstr "Keine Nutzer*innen für \"%(query)s\" gefunden" +msgstr "Keine Benutzer*innen für „%(query)s“ gefunden" + +#: bookwyrm/templates/groups/create_form.html:5 +msgid "Create Group" +msgstr "Gruppe erstellen" + +#: bookwyrm/templates/groups/created_text.html:4 +#, python-format +msgid "Managed by %(username)s" +msgstr "Administriert von %(username)s" + +#: bookwyrm/templates/groups/delete_group_modal.html:4 +msgid "Delete this group?" +msgstr "Diese Gruppe löschen?" + +#: bookwyrm/templates/groups/delete_group_modal.html:7 +#: bookwyrm/templates/lists/delete_list_modal.html:7 +msgid "This action cannot be un-done" +msgstr "Diese Aktion kann nicht rückgängig gemacht werden" + +#: bookwyrm/templates/groups/delete_group_modal.html:15 +#: bookwyrm/templates/lists/delete_list_modal.html:15 +#: bookwyrm/templates/settings/announcements/announcement.html:20 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36 +#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 +#: bookwyrm/templates/snippets/follow_request_buttons.html:12 +#: bookwyrm/templates/snippets/join_invitation_buttons.html:13 +msgid "Delete" +msgstr "Löschen" + +#: bookwyrm/templates/groups/edit_form.html:5 +msgid "Edit Group" +msgstr "Gruppe bearbeiten" + +#: bookwyrm/templates/groups/find_users.html:6 +msgid "Add new members!" +msgstr "Mitglieder hinzufügen!" + +#: bookwyrm/templates/groups/form.html:8 +msgid "Group Name:" +msgstr "Gruppenname:" + +#: bookwyrm/templates/groups/form.html:12 +msgid "Group Description:" +msgstr "Gruppenbeschreibung:" + +#: bookwyrm/templates/groups/form.html:30 +msgid "Delete group" +msgstr "Gruppe löschen" + +#: bookwyrm/templates/groups/group.html:15 +msgid "Search to add a user" +msgstr "Hinzuzufügende*n Benutzer*in suchen" + +#: bookwyrm/templates/groups/group.html:36 +msgid "This group has no lists" +msgstr "Diese Gruppe enthält keine Listen" + +#: bookwyrm/templates/groups/layout.html:16 +msgid "Edit group" +msgstr "Gruppe bearbeiten" + +#: bookwyrm/templates/groups/members.html:8 +msgid "Members can add and remove books on a group's book lists" +msgstr "Mitglieder können Bücher in den Buchlisten einer Gruppe hinzufügen und entfernen" + +#: bookwyrm/templates/groups/members.html:19 +msgid "Leave group" +msgstr "Gruppe verlassen" + +#: bookwyrm/templates/groups/members.html:41 +#: bookwyrm/templates/groups/suggested_users.html:32 +#: bookwyrm/templates/snippets/suggested_users.html:31 +#: bookwyrm/templates/user/user_preview.html:36 +msgid "Follows you" +msgstr "Folgt dir" + +#: bookwyrm/templates/groups/suggested_users.html:17 +#: bookwyrm/templates/snippets/suggested_users.html:16 +#, python-format +msgid "%(mutuals)s follower you follow" +msgid_plural "%(mutuals)s followers you follow" +msgstr[0] "%(mutuals)s Follower*in, der*die du folgst" +msgstr[1] "%(mutuals)s Follower*innen, denen du folgst" + +#: bookwyrm/templates/groups/suggested_users.html:24 +#: bookwyrm/templates/snippets/suggested_users.html:23 +#, python-format +msgid "%(shared_books)s book on your shelves" +msgid_plural "%(shared_books)s books on your shelves" +msgstr[0] "%(shared_books)s Buch in deinen Regalen" +msgstr[1] "%(shared_books)s Bücher in deinen Regalen" + +#: bookwyrm/templates/groups/suggested_users.html:40 +#, python-format +msgid "No potential members found for \"%(user_query)s\"" +msgstr "Keine potentiellen Mitglieder für „%(user_query)s“ gefunden" + +#: bookwyrm/templates/groups/user_groups.html:15 +msgid "Manager" +msgstr "Gruppenadministrator*in" #: bookwyrm/templates/import/import.html:5 #: bookwyrm/templates/import/import.html:9 -#: bookwyrm/templates/shelf/shelf.html:57 +#: bookwyrm/templates/shelf/shelf.html:61 msgid "Import Books" msgstr "Bücher importieren" @@ -1239,11 +1364,11 @@ msgstr "Datei:" #: bookwyrm/templates/import/import.html:45 msgid "Include reviews" -msgstr "Bewertungen importieren" +msgstr "Besprechungen einschließen" #: bookwyrm/templates/import/import.html:50 msgid "Privacy setting for imported reviews:" -msgstr "Datenschutzeinstellung für importierte Bewertungen" +msgstr "Datenschutzeinstellung für importierte Besprechungen:" #: bookwyrm/templates/import/import.html:56 #: bookwyrm/templates/settings/federation/instance_blocklist.html:64 @@ -1252,107 +1377,167 @@ msgstr "Importieren" #: bookwyrm/templates/import/import.html:61 msgid "Recent Imports" -msgstr "Aktuelle Importe" +msgstr "Zuletzt importiert" #: bookwyrm/templates/import/import.html:63 msgid "No recent imports" msgstr "Keine aktuellen Importe" #: bookwyrm/templates/import/import_status.html:6 -#: bookwyrm/templates/import/import_status.html:10 +#: bookwyrm/templates/import/import_status.html:15 +#: bookwyrm/templates/import/import_status.html:29 msgid "Import Status" msgstr "Importstatus" -#: bookwyrm/templates/import/import_status.html:11 -msgid "Back to imports" -msgstr "Zurück zu Importen" +#: bookwyrm/templates/import/import_status.html:13 +#: bookwyrm/templates/import/import_status.html:27 +msgid "Retry Status" +msgstr "" -#: bookwyrm/templates/import/import_status.html:15 +#: bookwyrm/templates/import/import_status.html:22 +msgid "Imports" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:39 msgid "Import started:" msgstr "Import gestartet:" -#: bookwyrm/templates/import/import_status.html:20 -msgid "Import completed:" -msgstr "Import abgeschlossen:" - -#: bookwyrm/templates/import/import_status.html:24 -msgid "TASK FAILED" -msgstr "AUFGABE GESCHEITERT" - -#: bookwyrm/templates/import/import_status.html:32 -msgid "Import still in progress." -msgstr "Import läuft noch." - -#: bookwyrm/templates/import/import_status.html:34 -msgid "(Hit reload to update!)" -msgstr "(Aktualisiere für ein Update!)" - -#: bookwyrm/templates/import/import_status.html:41 -msgid "Failed to load" -msgstr "Laden fehlgeschlagen" +#: bookwyrm/templates/import/import_status.html:48 +msgid "In progress" +msgstr "" #: bookwyrm/templates/import/import_status.html:50 -#, python-format -msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import." -msgstr "Zum Ende der Liste springen, um die %(failed_count)s Einträge, deren Import fehlschlug, auszuwählen." +msgid "Refresh" +msgstr "" #: bookwyrm/templates/import/import_status.html:62 #, python-format -msgid "Line %(index)s: %(title)s by %(author)s" -msgstr "Zeile %(index)s: %(title)s von %(author)s" +msgid "%(display_counter)s item needs manual approval." +msgid_plural "%(display_counter)s items need manual approval." +msgstr[0] "" +msgstr[1] "" -#: bookwyrm/templates/import/import_status.html:82 -msgid "Select all" -msgstr "Alle auswählen" +#: bookwyrm/templates/import/import_status.html:67 +#: bookwyrm/templates/import/manual_review.html:8 +msgid "Review items" +msgstr "" -#: bookwyrm/templates/import/import_status.html:85 -msgid "Retry items" -msgstr "Punkte erneut versuchen" +#: bookwyrm/templates/import/import_status.html:73 +#, python-format +msgid "%(display_counter)s item failed to import." +msgid_plural "%(display_counter)s items failed to import." +msgstr[0] "" +msgstr[1] "" -#: bookwyrm/templates/import/import_status.html:112 -msgid "Successfully imported" -msgstr "Erfolgreich importiert" +#: bookwyrm/templates/import/import_status.html:79 +msgid "View and troubleshoot failed items" +msgstr "" -#: bookwyrm/templates/import/import_status.html:114 -msgid "Import Progress" -msgstr "Import-Fortschritt" +#: bookwyrm/templates/import/import_status.html:91 +msgid "Row" +msgstr "" -#: bookwyrm/templates/import/import_status.html:119 -msgid "Book" -msgstr "Buch" - -#: bookwyrm/templates/import/import_status.html:122 -#: bookwyrm/templates/shelf/shelf.html:128 -#: bookwyrm/templates/shelf/shelf.html:150 +#: bookwyrm/templates/import/import_status.html:94 +#: bookwyrm/templates/shelf/shelf.html:141 +#: bookwyrm/templates/shelf/shelf.html:163 msgid "Title" msgstr "Titel" -#: bookwyrm/templates/import/import_status.html:125 -#: bookwyrm/templates/shelf/shelf.html:129 -#: bookwyrm/templates/shelf/shelf.html:153 +#: bookwyrm/templates/import/import_status.html:97 +msgid "ISBN" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:100 +#: bookwyrm/templates/shelf/shelf.html:142 +#: bookwyrm/templates/shelf/shelf.html:166 msgid "Author" msgstr "Autor*in" -#: bookwyrm/templates/import/import_status.html:148 +#: bookwyrm/templates/import/import_status.html:103 +msgid "Shelf" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:106 +#: bookwyrm/templates/import/manual_review.html:13 +#: bookwyrm/templates/snippets/create_status.html:17 +msgid "Review" +msgstr "Besprechen" + +#: bookwyrm/templates/import/import_status.html:110 +msgid "Book" +msgstr "Buch" + +#: bookwyrm/templates/import/import_status.html:113 +#: bookwyrm/templates/settings/announcements/announcements.html:38 +#: bookwyrm/templates/settings/federation/instance_list.html:46 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44 +#: bookwyrm/templates/settings/invites/status_filter.html:5 +#: bookwyrm/templates/settings/users/user_admin.html:34 +#: bookwyrm/templates/settings/users/user_info.html:20 +msgid "Status" +msgstr "Status" + +#: bookwyrm/templates/import/import_status.html:144 +msgid "View imported review" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:158 msgid "Imported" msgstr "Importiert" +#: bookwyrm/templates/import/import_status.html:164 +msgid "Needs manual review" +msgstr "" + +#: bookwyrm/templates/import/manual_review.html:5 +#: bookwyrm/templates/import/troubleshoot.html:4 +msgid "Import Troubleshooting" +msgstr "" + +#: bookwyrm/templates/import/manual_review.html:21 +msgid "Approving a suggestion will permanently add the suggested book to your shelves and associate your reading dates, reviews, and ratings with that book." +msgstr "" + +#: bookwyrm/templates/import/manual_review.html:56 +#: bookwyrm/templates/lists/curate.html:57 +msgid "Approve" +msgstr "Bestätigen" + +#: bookwyrm/templates/import/manual_review.html:64 +msgid "Reject" +msgstr "" + #: bookwyrm/templates/import/tooltip.html:6 msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." msgstr "Du kannst deine Goodreads-Daten von der Import/Export-Seite deines Goodreads-Kontos downloaden." -#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:8 -#: bookwyrm/templates/login.html:49 -msgid "Create an Account" -msgstr "Erstelle einen Account" +#: bookwyrm/templates/import/troubleshoot.html:7 +msgid "Failed items" +msgstr "" -#: bookwyrm/templates/invite.html:21 -msgid "Permission Denied" -msgstr "Zugiff verweigert" +#: bookwyrm/templates/import/troubleshoot.html:12 +msgid "Troubleshooting" +msgstr "" -#: bookwyrm/templates/invite.html:22 -msgid "Sorry! This invite code is no longer valid." -msgstr "Sorry! Dieser Einladecode ist mehr gültig." +#: bookwyrm/templates/import/troubleshoot.html:20 +msgid "Re-trying an import can fix missing items in cases such as:" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:23 +msgid "The book has been added to the instance since this import" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:24 +msgid "A transient error or timeout caused the external data source to be unavailable." +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:25 +msgid "BookWyrm has been updated since this import with a bug fix" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:28 +msgid "Contact your admin or open an issue if you are seeing unexpected failed items." +msgstr "" #: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:230 #, python-format @@ -1369,9 +1554,23 @@ msgstr "Verhaltenskodex" msgid "Privacy Policy" msgstr "Datenschutzerklärung" +#: bookwyrm/templates/landing/invite.html:4 +#: bookwyrm/templates/landing/invite.html:8 +#: bookwyrm/templates/landing/login.html:49 +msgid "Create an Account" +msgstr "Erstelle ein Benutzer*inkonto" + +#: bookwyrm/templates/landing/invite.html:21 +msgid "Permission Denied" +msgstr "Zugiff verweigert" + +#: bookwyrm/templates/landing/invite.html:22 +msgid "Sorry! This invite code is no longer valid." +msgstr "Tut uns leid! Dieser Einladungscode ist mehr gültig." + #: bookwyrm/templates/landing/landing.html:6 msgid "Recent Books" -msgstr "Aktive Bücher" +msgstr "Zuletzt aktive Bücher" #: bookwyrm/templates/landing/layout.html:17 msgid "Decentralized" @@ -1388,7 +1587,7 @@ msgstr "Nichtkommerziell" #: bookwyrm/templates/landing/layout.html:45 #, python-format msgid "Join %(name)s" -msgstr "Tritt %(name)s bei" +msgstr "%(name)s beitreten" #: bookwyrm/templates/landing/layout.html:47 msgid "Request an Invitation" @@ -1405,7 +1604,54 @@ msgstr "Danke! Deine Anfrage ist eingegangen." #: bookwyrm/templates/landing/layout.html:82 msgid "Your Account" -msgstr "Dein Account" +msgstr "Dein Benutzer*inkonto" + +#: bookwyrm/templates/landing/login.html:4 +msgid "Login" +msgstr "Anmeldung" + +#: bookwyrm/templates/landing/login.html:7 +#: bookwyrm/templates/landing/login.html:37 bookwyrm/templates/layout.html:179 +msgid "Log in" +msgstr "Anmelden" + +#: bookwyrm/templates/landing/login.html:15 +msgid "Success! Email address confirmed." +msgstr "Alles klar! E-Mail-Adresse bestätigt." + +#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:170 +#: bookwyrm/templates/snippets/register_form.html:4 +msgid "Username:" +msgstr "Benutzer*inname:" + +#: bookwyrm/templates/landing/login.html:27 +#: bookwyrm/templates/landing/password_reset.html:17 +#: bookwyrm/templates/layout.html:174 +#: bookwyrm/templates/snippets/register_form.html:22 +msgid "Password:" +msgstr "Passwort:" + +#: bookwyrm/templates/landing/login.html:40 bookwyrm/templates/layout.html:176 +msgid "Forgot your password?" +msgstr "Passwort vergessen?" + +#: bookwyrm/templates/landing/login.html:62 +msgid "More about this site" +msgstr "Mehr über diese Seite" + +#: bookwyrm/templates/landing/password_reset.html:23 +#: bookwyrm/templates/preferences/change_password.html:18 +#: bookwyrm/templates/preferences/delete_user.html:20 +msgid "Confirm password:" +msgstr "Passwort bestätigen:" + +#: bookwyrm/templates/landing/password_reset_request.html:14 +msgid "A link to reset your password will be sent to your email address" +msgstr "Ein Link zum Zurücksetzen deines Passworts wird an deine E-Mail-Adresse geschickt" + +#: bookwyrm/templates/landing/password_reset_request.html:28 +msgid "Reset password" +msgstr "Passwort zurücksetzen" #: bookwyrm/templates/layout.html:13 #, python-format @@ -1418,16 +1664,12 @@ msgstr "Nach einem Buch, einem*r Benutzer*in oder einer Liste suchen" #: bookwyrm/templates/layout.html:61 bookwyrm/templates/layout.html:62 msgid "Main navigation menu" -msgstr "Navigationshauptmenü" +msgstr "Navigations-Hauptmenü" #: bookwyrm/templates/layout.html:72 msgid "Feed" msgstr "Feed" -#: bookwyrm/templates/layout.html:106 -msgid "Your Books" -msgstr "Deine Bücher" - #: bookwyrm/templates/layout.html:116 msgid "Settings" msgstr "Einstellungen" @@ -1454,25 +1696,10 @@ msgstr "Abmelden" msgid "Notifications" msgstr "Benachrichtigungen" -#: bookwyrm/templates/layout.html:170 bookwyrm/templates/layout.html:174 -#: bookwyrm/templates/login.html:21 -#: bookwyrm/templates/snippets/register_form.html:4 -msgid "Username:" -msgstr "Benutzer*inname:" - #: bookwyrm/templates/layout.html:175 msgid "password" msgstr "Passwort" -#: bookwyrm/templates/layout.html:176 bookwyrm/templates/login.html:40 -msgid "Forgot your password?" -msgstr "Passwort vergessen?" - -#: bookwyrm/templates/layout.html:179 bookwyrm/templates/login.html:7 -#: bookwyrm/templates/login.html:37 -msgid "Log in" -msgstr "Anmelden" - #: bookwyrm/templates/layout.html:187 msgid "Join" msgstr "Beitreten" @@ -1487,7 +1714,7 @@ msgstr "Fehler beim veröffentlichen des Status" #: bookwyrm/templates/layout.html:234 msgid "Contact site admin" -msgstr "Admin kontaktieren" +msgstr "Administrator*in kontaktieren" #: bookwyrm/templates/layout.html:238 msgid "Documentation" @@ -1513,10 +1740,15 @@ msgstr "Liste erstellen" #: bookwyrm/templates/lists/created_text.html:5 #, python-format +msgid "Created by %(username)s and managed by %(groupname)s" +msgstr "Erstellt von %(username)s und administriert von %(groupname)s" + +#: bookwyrm/templates/lists/created_text.html:7 +#, python-format msgid "Created and curated by %(username)s" msgstr "Erstellt und betreut von %(username)s" -#: bookwyrm/templates/lists/created_text.html:7 +#: bookwyrm/templates/lists/created_text.html:9 #, python-format msgid "Created by %(username)s" msgstr "Erstellt von %(username)s" @@ -1537,10 +1769,6 @@ msgstr "Du bist soweit!" msgid "Suggested by" msgstr "Vorgeschlagen von" -#: bookwyrm/templates/lists/curate.html:57 -msgid "Approve" -msgstr "Bestätigen" - #: bookwyrm/templates/lists/curate.html:63 msgid "Discard" msgstr "Ablehnen" @@ -1549,118 +1777,130 @@ msgstr "Ablehnen" msgid "Delete this list?" msgstr "Diese Liste löschen?" -#: bookwyrm/templates/lists/delete_list_modal.html:7 -msgid "This action cannot be un-done" -msgstr "Diese Aktion kann nicht rückgängig gemacht werden" - -#: bookwyrm/templates/lists/delete_list_modal.html:15 -#: bookwyrm/templates/settings/announcements/announcement.html:20 -#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49 -#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36 -#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 -#: bookwyrm/templates/snippets/follow_request_buttons.html:12 -msgid "Delete" -msgstr "Löschen" - #: bookwyrm/templates/lists/edit_form.html:5 #: bookwyrm/templates/lists/layout.html:16 msgid "Edit List" msgstr "Liste bearbeiten" -#: bookwyrm/templates/lists/form.html:18 +#: bookwyrm/templates/lists/form.html:19 msgid "List curation:" msgstr "Listenkuratierung:" -#: bookwyrm/templates/lists/form.html:21 +#: bookwyrm/templates/lists/form.html:22 msgid "Closed" msgstr "Geschlossen" -#: bookwyrm/templates/lists/form.html:22 +#: bookwyrm/templates/lists/form.html:23 msgid "Only you can add and remove books to this list" msgstr "Nur du kannst Bücher hinzufügen oder entfernen" -#: bookwyrm/templates/lists/form.html:26 +#: bookwyrm/templates/lists/form.html:27 msgid "Curated" msgstr "Kuratiert" -#: bookwyrm/templates/lists/form.html:27 +#: bookwyrm/templates/lists/form.html:28 msgid "Anyone can suggest books, subject to your approval" -msgstr "Alle können Bücher vorschlagen, du kannst diese bestätigen" +msgstr "Jede*r kann Bücher vorschlagen, du musst diese bestätigen" -#: bookwyrm/templates/lists/form.html:31 +#: bookwyrm/templates/lists/form.html:32 msgctxt "curation type" msgid "Open" msgstr "Offen" -#: bookwyrm/templates/lists/form.html:32 +#: bookwyrm/templates/lists/form.html:33 msgid "Anyone can add books to this list" -msgstr "Alle können Bücher hinzufügen" +msgstr "Jede*r kann Bücher hinzufügen" -#: bookwyrm/templates/lists/form.html:50 +#: bookwyrm/templates/lists/form.html:37 +msgid "Group" +msgstr "Gruppe" + +#: bookwyrm/templates/lists/form.html:38 +msgid "Group members can add to and remove from this list" +msgstr "Gruppenmitglieder können Bücher zu dieser Liste hinzufügen und von dieser entfernen" + +#: bookwyrm/templates/lists/form.html:41 +msgid "Select Group" +msgstr "Gruppe auswählen" + +#: bookwyrm/templates/lists/form.html:45 +msgid "Select a group" +msgstr "Eine Gruppe auswählen" + +#: bookwyrm/templates/lists/form.html:56 +msgid "You don't have any Groups yet!" +msgstr "Du hast noch keine Gruppen!" + +#: bookwyrm/templates/lists/form.html:58 +msgid "Create a Group" +msgstr "Gruppe erstellen" + +#: bookwyrm/templates/lists/form.html:81 msgid "Delete list" msgstr "Liste löschen" -#: bookwyrm/templates/lists/list.html:20 +#: bookwyrm/templates/lists/list.html:21 msgid "You successfully suggested a book for this list!" -msgstr "Du hast erfolgreich ein Buch für diese Liste vorgeschlagen!" +msgstr "Dein Buchvorschlag wurde dieser Liste hinzugefügt!" -#: bookwyrm/templates/lists/list.html:22 +#: bookwyrm/templates/lists/list.html:23 msgid "You successfully added a book to this list!" -msgstr "Du hast erfolgreich ein Buch zu dieser Liste hinzugefügt!" +msgstr "Du hast ein Buch zu dieser Liste hinzugefügt!" -#: bookwyrm/templates/lists/list.html:28 +#: bookwyrm/templates/lists/list.html:29 msgid "This list is currently empty" msgstr "Diese Liste ist momentan leer" -#: bookwyrm/templates/lists/list.html:66 +#: bookwyrm/templates/lists/list.html:67 #, python-format msgid "Added by %(username)s" msgstr "Hinzugefügt von %(username)s" -#: bookwyrm/templates/lists/list.html:75 +#: bookwyrm/templates/lists/list.html:76 msgid "List position" msgstr "Listenposition" -#: bookwyrm/templates/lists/list.html:81 +#: bookwyrm/templates/lists/list.html:82 msgid "Set" msgstr "Übernehmen" -#: bookwyrm/templates/lists/list.html:91 +#: bookwyrm/templates/lists/list.html:92 +#: bookwyrm/templates/snippets/remove_from_group_button.html:19 #: bookwyrm/templates/snippets/shelf_selector.html:26 msgid "Remove" msgstr "Entfernen" -#: bookwyrm/templates/lists/list.html:105 -#: bookwyrm/templates/lists/list.html:122 +#: bookwyrm/templates/lists/list.html:106 +#: bookwyrm/templates/lists/list.html:123 msgid "Sort List" msgstr "Liste sortieren" -#: bookwyrm/templates/lists/list.html:115 +#: bookwyrm/templates/lists/list.html:116 msgid "Direction" msgstr "Reihenfolge" -#: bookwyrm/templates/lists/list.html:129 +#: bookwyrm/templates/lists/list.html:130 msgid "Add Books" msgstr "Bücher hinzufügen" -#: bookwyrm/templates/lists/list.html:131 +#: bookwyrm/templates/lists/list.html:132 msgid "Suggest Books" msgstr "Bücher vorschlagen" -#: bookwyrm/templates/lists/list.html:142 +#: bookwyrm/templates/lists/list.html:143 msgid "search" msgstr "suchen" -#: bookwyrm/templates/lists/list.html:148 +#: bookwyrm/templates/lists/list.html:149 msgid "Clear search" -msgstr "Suche leeren" +msgstr "Suche zurücksetzen" -#: bookwyrm/templates/lists/list.html:153 +#: bookwyrm/templates/lists/list.html:154 #, python-format msgid "No books found matching the query \"%(query)s\"" -msgstr "Keine passenden Bücher zu \"%(query)s\" gefunden" +msgstr "Keine passenden Bücher zu „%(query)s“ gefunden" -#: bookwyrm/templates/lists/list.html:181 +#: bookwyrm/templates/lists/list.html:182 msgid "Suggest" msgstr "Vorschlagen" @@ -1672,35 +1912,23 @@ msgstr "Gespeichert" msgid "Your Lists" msgstr "Deine Listen" -#: bookwyrm/templates/lists/lists.html:35 +#: bookwyrm/templates/lists/lists.html:36 msgid "All Lists" msgstr "Alle Listen" -#: bookwyrm/templates/lists/lists.html:39 +#: bookwyrm/templates/lists/lists.html:40 msgid "Saved Lists" msgstr "Gespeicherte Listen" -#: bookwyrm/templates/login.html:4 -msgid "Login" -msgstr "Anmeldung" - -#: bookwyrm/templates/login.html:15 -msgid "Success! Email address confirmed." -msgstr "Alles klar! E-Mai- Adresse bestätigt." - -#: bookwyrm/templates/login.html:27 bookwyrm/templates/password_reset.html:17 -#: bookwyrm/templates/snippets/register_form.html:22 -msgid "Password:" -msgstr "Passwort:" - -#: bookwyrm/templates/login.html:62 -msgid "More about this site" -msgstr "Mehr über diese Seite" +#: bookwyrm/templates/notifications/items/accept.html:16 +#, python-format +msgid "accepted your invitation to join group \"%(group_name)s\"" +msgstr "hat deine Einladung angenommen, der Gruppe „%(group_name)s“ beizutreten" #: bookwyrm/templates/notifications/items/add.html:24 #, python-format msgid "added %(book_title)s to your list \"%(list_name)s\"" -msgstr "%(book_title)s zu deiner Liste \"%(list_name)s\" hinzugefügt" +msgstr "%(book_title)s zu deiner Liste „%(list_name)s“ hinzugefügt" #: bookwyrm/templates/notifications/items/add.html:31 #, python-format @@ -1710,7 +1938,7 @@ msgstr "hat vorgeschlagen, %(book_title)s #: bookwyrm/templates/notifications/items/boost.html:19 #, python-format msgid "boosted your review of %(book_title)s" -msgstr "hat deine Bewertung von %(book_title)s geteilt" +msgstr "hat deine Besprechung von %(book_title)s geteilt" #: bookwyrm/templates/notifications/items/boost.html:25 #, python-format @@ -1730,11 +1958,11 @@ msgstr "hat deinen Status geteilt" #: bookwyrm/templates/notifications/items/fav.html:19 #, python-format msgid "liked your review of %(book_title)s" -msgstr "hat deine Besprechung von %(book_title)s favorisiert" +msgstr "hat deine Besprechung von %(book_title)s favorisiert" #: bookwyrm/templates/notifications/items/fav.html:25 #, python-format -msgid "liked your comment on%(book_title)s" +msgid "liked your comment on %(book_title)s" msgstr "hat deinen Kommentar zu %(book_title)s favorisiert" #: bookwyrm/templates/notifications/items/fav.html:31 @@ -1753,17 +1981,32 @@ msgstr "folgt dir" #: bookwyrm/templates/notifications/items/follow_request.html:11 msgid "sent you a follow request" -msgstr "hat dir eine Folgeanfrage geschickt" +msgstr "möchte dir folgen" #: bookwyrm/templates/notifications/items/import.html:14 #, python-format msgid "Your import completed." msgstr "Dein Import ist fertig." +#: bookwyrm/templates/notifications/items/invite.html:15 +#, python-format +msgid "invited you to join the group \"%(group_name)s\"" +msgstr "hat dich eingeladen, der Gruppe „%(group_name)s“ beizutreten" + +#: bookwyrm/templates/notifications/items/join.html:16 +#, python-format +msgid "has joined your group \"%(group_name)s\"" +msgstr "ist deiner Gruppe „%(group_name)s“ beigetreten" + +#: bookwyrm/templates/notifications/items/leave.html:16 +#, python-format +msgid "has left your group \"%(group_name)s\"" +msgstr "hat deine Gruppe „%(group_name)s“ verlassen" + #: bookwyrm/templates/notifications/items/mention.html:20 #, python-format msgid "mentioned you in a review of %(book_title)s" -msgstr "hat dich in einer Bewertung von %(book_title)s erwähnt" +msgstr "hat dich in einer Besprechung von %(book_title)s erwähnt" #: bookwyrm/templates/notifications/items/mention.html:26 #, python-format @@ -1780,10 +2023,20 @@ msgstr "hat dich in einem Zitat von %(book_titl msgid "mentioned you in a status" msgstr "hat dich in einem Status erwähnt" +#: bookwyrm/templates/notifications/items/remove.html:17 +#, python-format +msgid "has been removed from your group \"%(group_name)s\"" +msgstr "wurde aus deiner Gruppe „%(group_name)s“ entfernt" + +#: bookwyrm/templates/notifications/items/remove.html:23 +#, python-format +msgid "You have been removed from the \"%(group_name)s\" group" +msgstr "Du wurdest aus der Gruppe „%(group_name)s“ entfernt" + #: bookwyrm/templates/notifications/items/reply.html:21 #, python-format msgid "replied to your review of %(book_title)s" -msgstr "hat auf deine Bewertung von %(book_title)s geantwortet " +msgstr "hat auf deine Besprechung von %(book_title)s geantwortet" #: bookwyrm/templates/notifications/items/reply.html:27 #, python-format @@ -1805,6 +2058,21 @@ msgstr "hat auf deinen Status report needs moderation." msgstr "Eine neue Meldung muss moderiert werden." +#: bookwyrm/templates/notifications/items/update.html:16 +#, python-format +msgid "has changed the privacy level for %(group_name)s" +msgstr "hat die Sichtbarkeit von %(group_name)s geändert" + +#: bookwyrm/templates/notifications/items/update.html:20 +#, python-format +msgid "has changed the name of %(group_name)s" +msgstr "hat den Namen von %(group_name)s geändert" + +#: bookwyrm/templates/notifications/items/update.html:24 +#, python-format +msgid "has changed the description of %(group_name)s" +msgstr "hat die Beschreibung von %(group_name)s geändert" + #: bookwyrm/templates/notifications/notifications_page.html:18 msgid "Delete notifications" msgstr "Benachrichtigungen löschen" @@ -1821,29 +2089,15 @@ msgstr "Erwähnungen" msgid "You're all caught up!" msgstr "Du bist auf dem neusten Stand!" -#: bookwyrm/templates/password_reset.html:23 -#: bookwyrm/templates/preferences/change_password.html:18 -#: bookwyrm/templates/preferences/delete_user.html:20 -msgid "Confirm password:" -msgstr "Passwort bestätigen:" - -#: bookwyrm/templates/password_reset_request.html:14 -msgid "A link to reset your password will be sent to your email address" -msgstr "Ein Link zum Zurücksetzen deines Passworts wird an deine Mailadresse geschickt" - -#: bookwyrm/templates/password_reset_request.html:28 -msgid "Reset password" -msgstr "Passwort zurücksetzen" - #: bookwyrm/templates/preferences/blocks.html:4 #: bookwyrm/templates/preferences/blocks.html:7 #: bookwyrm/templates/preferences/layout.html:31 msgid "Blocked Users" -msgstr "Blockierte Nutzer*innen" +msgstr "Gesperrte Benutzer*innen" #: bookwyrm/templates/preferences/blocks.html:12 msgid "No users currently blocked." -msgstr "Momentan keine Nutzer*innen blockiert." +msgstr "Momentan keine Benutzer*innen gesperrt." #: bookwyrm/templates/preferences/change_password.html:4 #: bookwyrm/templates/preferences/change_password.html:7 @@ -1866,11 +2120,11 @@ msgstr "Benutzer*inkonto löschen" #: bookwyrm/templates/preferences/delete_user.html:12 msgid "Permanently delete account" -msgstr "Account permanent löschen" +msgstr "Benutzer*inkonto dauerhaft löschen" #: bookwyrm/templates/preferences/delete_user.html:14 msgid "Deleting your account cannot be undone. The username will not be available to register in the future." -msgstr "Das Löschen des Accounts kann nicht rückgängig gemacht werden. Der Username kann nicht erneut registriert werden." +msgstr "Das Löschen des Benutzer*inkonto kann nicht rückgängig gemacht werden. Der Benutzer*inname kann nicht erneut registriert werden." #: bookwyrm/templates/preferences/edit_user.html:4 #: bookwyrm/templates/preferences/edit_user.html:7 @@ -1896,7 +2150,7 @@ msgstr "Privatsphäre" #: bookwyrm/templates/preferences/edit_user.html:72 msgid "Show reading goal prompt in feed:" -msgstr "Zeige Leseziel-Abfrage im Feed:" +msgstr "Frage Leseziel im Feed ab:" #: bookwyrm/templates/preferences/edit_user.html:76 msgid "Show suggested users:" @@ -1905,7 +2159,7 @@ msgstr "Zeige vorgeschlagene Benutzer*innen:" #: bookwyrm/templates/preferences/edit_user.html:85 #, python-format msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users." -msgstr "Dein Account wird im directory angezeigt und eventuell anderen Usern empfohlen." +msgstr "Dein Benutzer*inkonto wird im Verzeichnis angezeigt und eventuell anderen Benutzer*innen empfohlen." #: bookwyrm/templates/preferences/edit_user.html:89 msgid "Preferred Timezone: " @@ -1926,17 +2180,17 @@ msgstr "Beziehungen" #: bookwyrm/templates/reading_progress/finish.html:5 #, python-format msgid "Finish \"%(book_title)s\"" -msgstr "\"%(book_title)s\" abschließen" +msgstr "„%(book_title)s“ abschließen" #: bookwyrm/templates/reading_progress/start.html:5 #, python-format msgid "Start \"%(book_title)s\"" -msgstr "\"%(book_title)s\" beginnen" +msgstr "„%(book_title)s“ beginnen" #: bookwyrm/templates/reading_progress/want.html:5 #, python-format msgid "Want to Read \"%(book_title)s\"" -msgstr "\"%(book_title)s\" auf Leseliste setzen" +msgstr "„%(book_title)s“ auf Leseliste setzen" #: bookwyrm/templates/search/book.html:47 #: bookwyrm/templates/settings/reports/reports.html:25 @@ -1958,7 +2212,7 @@ msgstr "Buch manuell hinzufügen" #: bookwyrm/templates/search/book.html:116 msgid "Log in to import or add books." -msgstr "Log dich ein, um Bücher zu importieren oder hinzuzufügen." +msgstr "Melde dich an, um Bücher zu importieren oder hinzuzufügen." #: bookwyrm/templates/search/layout.html:16 msgid "Search query" @@ -2000,7 +2254,7 @@ msgstr "Ankündigung bearbeiten" #: bookwyrm/templates/settings/announcements/announcement.html:35 msgid "Visible:" -msgstr "Sichtbar" +msgstr "Sichtbar:" #: bookwyrm/templates/settings/announcements/announcement.html:38 msgid "True" @@ -2067,15 +2321,6 @@ msgstr "Startdatum" msgid "End date" msgstr "Enddatum" -#: bookwyrm/templates/settings/announcements/announcements.html:38 -#: bookwyrm/templates/settings/federation/instance_list.html:46 -#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44 -#: bookwyrm/templates/settings/invites/status_filter.html:5 -#: bookwyrm/templates/settings/users/user_admin.html:34 -#: bookwyrm/templates/settings/users/user_info.html:20 -msgid "Status" -msgstr "Status" - #: bookwyrm/templates/settings/announcements/announcements.html:48 msgid "active" msgstr "aktiv" @@ -2184,7 +2429,7 @@ msgstr "E-Mail-Sperrliste" #: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:18 msgid "When someone tries to register with an email from this domain, no account will be created. The registration process will appear to have worked." -msgstr "Wenn sich jemand mit einer E-Mail-Adresse von dieser Domain zu registrieren versucht, wird kein Account erstellt. Die Registrierung wird so aussehen als hätte sie funktioniert." +msgstr "Wenn sich jemand mit einer E-Mail-Adresse von dieser Domain zu registrieren versucht, wird kein Benutzer*inkonto erstellt. Es wird aber so aussehen, als ob die Registrierung funktioniert hätte." #: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:25 msgid "Domain" @@ -2257,7 +2502,7 @@ msgid "Details" msgstr "Details" #: bookwyrm/templates/settings/federation/instance.html:35 -#: bookwyrm/templates/user/layout.html:63 +#: bookwyrm/templates/user/layout.html:64 msgid "Activity" msgstr "Aktivität" @@ -2268,7 +2513,7 @@ msgstr "Benutzer*innen:" #: bookwyrm/templates/settings/federation/instance.html:41 #: bookwyrm/templates/settings/federation/instance.html:47 msgid "View all" -msgstr "Alle anzeigen" +msgstr "Alle(s) anzeigen" #: bookwyrm/templates/settings/federation/instance.html:44 #: bookwyrm/templates/settings/users/user_info.html:56 @@ -2281,7 +2526,7 @@ msgstr "Folgen wir:" #: bookwyrm/templates/settings/federation/instance.html:55 msgid "Followed by them:" -msgstr "Folgen:" +msgstr "Folgen uns:" #: bookwyrm/templates/settings/federation/instance.html:60 msgid "Blocked by us:" @@ -2331,7 +2576,7 @@ msgstr "Sperrliste importieren" #: bookwyrm/templates/settings/federation/instance_blocklist.html:26 #: bookwyrm/templates/snippets/goal_progress.html:7 msgid "Success!" -msgstr "Erfolg!" +msgstr "Hat funktioniert!" #: bookwyrm/templates/settings/federation/instance_blocklist.html:30 msgid "Successfully blocked:" @@ -2339,7 +2584,7 @@ msgstr "Erfolgreich gesperrt:" #: bookwyrm/templates/settings/federation/instance_blocklist.html:32 msgid "Failed:" -msgstr "Fehlgeschlagen" +msgstr "Fehlgeschlagen:" #: bookwyrm/templates/settings/federation/instance_list.html:3 #: bookwyrm/templates/settings/federation/instance_list.html:5 @@ -2420,11 +2665,11 @@ msgstr "Ignorieren" #: bookwyrm/templates/settings/invites/manage_invite_requests.html:97 msgid "Un-ignore" -msgstr "Un-ignorieren" +msgstr "Doch nicht ignorieren" #: bookwyrm/templates/settings/invites/manage_invite_requests.html:108 msgid "Back to pending requests" -msgstr "Zurück zu ausstehenden Anfragen" +msgstr "Zurück zu den ausstehenden Anfragen" #: bookwyrm/templates/settings/invites/manage_invite_requests.html:110 msgid "View ignored requests" @@ -2436,11 +2681,11 @@ msgstr "Neue Einladung erzeugen" #: bookwyrm/templates/settings/invites/manage_invites.html:27 msgid "Expiry:" -msgstr "Ablaufen:" +msgstr "Ablaufdatum:" #: bookwyrm/templates/settings/invites/manage_invites.html:33 msgid "Use limit:" -msgstr "Begrenzte Benutzung" +msgstr "Verwendungslimit:" #: bookwyrm/templates/settings/invites/manage_invites.html:40 msgid "Create Invite" @@ -2452,15 +2697,15 @@ msgstr "Link" #: bookwyrm/templates/settings/invites/manage_invites.html:48 msgid "Expires" -msgstr "Läuft aus" +msgstr "Läuft ab am" #: bookwyrm/templates/settings/invites/manage_invites.html:49 msgid "Max uses" -msgstr "Maximale Benutzungen" +msgstr "Maximale Verwendungen" #: bookwyrm/templates/settings/invites/manage_invites.html:50 msgid "Times used" -msgstr "Mal benutzt" +msgstr "Anzahl Verwendungen" #: bookwyrm/templates/settings/invites/manage_invites.html:53 msgid "No active invites" @@ -2487,7 +2732,7 @@ msgstr "IP-Addressen-Sperrliste" #: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:18 msgid "Any traffic from this IP address will get a 404 response when trying to access any part of the application." -msgstr "Jeder Datenverkehr von dieser IP-Adresse erhält eine 404-Antwort, wenn versucht wird, auf einen beliebigen Teil der Anwendung zuzugreifen." +msgstr "Datenverkehr von dieser IP-Adresse erhält eine 404-Antwort, wenn versucht wird, auf einen beliebigen Teil der Anwendung zuzugreifen." #: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:24 msgid "Address" @@ -2499,7 +2744,7 @@ msgstr "Derzeit sind keine IP-Adressen gesperrt" #: bookwyrm/templates/settings/ip_blocklist/ip_tooltip.html:6 msgid "You can block IP ranges using CIDR syntax." -msgstr "Du kannst IP-Bereiche mittels CIDR-Syntax blockieren." +msgstr "Du kannst IP-Bereiche mittels CIDR-Syntax sperren." #: bookwyrm/templates/settings/layout.html:4 msgid "Administration" @@ -2507,7 +2752,7 @@ msgstr "Administration" #: bookwyrm/templates/settings/layout.html:29 msgid "Manage Users" -msgstr "Nutzer*innen verwalten" +msgstr "Benutzer*innen verwalten" #: bookwyrm/templates/settings/layout.html:51 msgid "Moderation" @@ -2542,7 +2787,7 @@ msgstr "Zurück zu den Meldungen" #: bookwyrm/templates/settings/reports/report.html:23 msgid "Moderator Comments" -msgstr "Moderator:innenkommentare" +msgstr "Moderator*innenkommentare" #: bookwyrm/templates/settings/reports/report.html:41 #: bookwyrm/templates/snippets/create_status.html:28 @@ -2555,7 +2800,7 @@ msgstr "Gemeldete Statusmeldungen" #: bookwyrm/templates/settings/reports/report.html:48 msgid "No statuses reported" -msgstr "Keine Beiträge gemeldet" +msgstr "Keine Statusmeldungen gemeldet" #: bookwyrm/templates/settings/reports/report.html:54 msgid "Status has been deleted" @@ -2572,11 +2817,11 @@ msgstr "Gemeldet von %(username)s" #: bookwyrm/templates/settings/reports/report_preview.html:30 msgid "Re-open" -msgstr "Wiedereröffnen" +msgstr "Erneut öffnen" #: bookwyrm/templates/settings/reports/report_preview.html:32 msgid "Resolve" -msgstr "Lösen" +msgstr "Beheben" #: bookwyrm/templates/settings/reports/reports.html:6 #, python-format @@ -2609,7 +2854,7 @@ msgstr "Bilder" #: bookwyrm/templates/settings/site.html:12 #: bookwyrm/templates/settings/site.html:74 msgid "Footer Content" -msgstr "Inhalt des Footers" +msgstr "Inhalt der Fußzeile" #: bookwyrm/templates/settings/site.html:13 #: bookwyrm/templates/settings/site.html:98 @@ -2618,7 +2863,7 @@ msgstr "Registrierung" #: bookwyrm/templates/settings/site.html:24 msgid "Instance Name:" -msgstr "Instanzname" +msgstr "Instanzname:" #: bookwyrm/templates/settings/site.html:28 msgid "Tagline:" @@ -2626,7 +2871,7 @@ msgstr "Motto:" #: bookwyrm/templates/settings/site.html:32 msgid "Instance description:" -msgstr "Instanzbeschreibung" +msgstr "Instanzbeschreibung:" #: bookwyrm/templates/settings/site.html:36 msgid "Short description:" @@ -2642,7 +2887,7 @@ msgstr "Verhaltenskodex:" #: bookwyrm/templates/settings/site.html:45 msgid "Privacy Policy:" -msgstr "Datenschutzerklärung" +msgstr "Datenschutzerklärung:" #: bookwyrm/templates/settings/site.html:57 msgid "Logo:" @@ -2650,7 +2895,7 @@ msgstr "Logo:" #: bookwyrm/templates/settings/site.html:61 msgid "Logo small:" -msgstr "Logo klein" +msgstr "Kleines Logo:" #: bookwyrm/templates/settings/site.html:65 msgid "Favicon:" @@ -2658,11 +2903,11 @@ msgstr "Favicon:" #: bookwyrm/templates/settings/site.html:77 msgid "Support link:" -msgstr "Unterstützungslink" +msgstr "Support-Link:" #: bookwyrm/templates/settings/site.html:81 msgid "Support title:" -msgstr "Unterstützungstitel" +msgstr "Support-Titel:" #: bookwyrm/templates/settings/site.html:85 msgid "Admin email:" @@ -2670,7 +2915,7 @@ msgstr "E-Mail-Adresse des*r Administrator*in:" #: bookwyrm/templates/settings/site.html:89 msgid "Additional info:" -msgstr "Zusätzliche Info:" +msgstr "Zusätzliche Angaben:" #: bookwyrm/templates/settings/site.html:103 msgid "Allow registration" @@ -2682,15 +2927,15 @@ msgstr "Einladungsanfragen zulassen" #: bookwyrm/templates/settings/site.html:115 msgid "Require users to confirm email address" -msgstr "User müssen ihre E-Mail-Adresse bestätigen" +msgstr "Benutzer*innen müssen ihre E-Mail-Adresse bestätigen" #: bookwyrm/templates/settings/site.html:117 msgid "(Recommended if registration is open)" -msgstr "(Vorschlagen falls die Registrierung offen ist)" +msgstr "(empfohlen, falls Selbstregistrierung zulässig ist)" #: bookwyrm/templates/settings/site.html:120 msgid "Registration closed text:" -msgstr "Registrierungen geschlossen text" +msgstr "Hinweis, wenn Selbtregistrierung nicht erlaubt ist:" #: bookwyrm/templates/settings/site.html:124 msgid "Invite request text:" @@ -2699,12 +2944,12 @@ msgstr "Hinweis für Einladungsanfragen:" #: bookwyrm/templates/settings/users/delete_user_form.html:5 #: bookwyrm/templates/settings/users/user_moderation_actions.html:31 msgid "Permanently delete user" -msgstr "User permanent löschen" +msgstr "Benutzer*in dauerhaft löschen" #: bookwyrm/templates/settings/users/delete_user_form.html:12 #, python-format msgid "Are you sure you want to delete %(username)s's account? This action cannot be undone. To proceed, please enter your password to confirm deletion." -msgstr "Bist du sicher, dass du %(username)ss Account löschen möchtest? Diese Aktion kann nicht rückgängig gemacht werden. Zur Bestätigung gib bitte dein Passwort ein." +msgstr "Bist du sicher, dass du das Benutzer*inkonto „%(username)s“ löschen möchtest? Diese Aktion kann nicht rückgängig gemacht werden. Zur Bestätigung gib bitte dein Passwort ein." #: bookwyrm/templates/settings/users/delete_user_form.html:17 msgid "Your password:" @@ -2712,7 +2957,7 @@ msgstr "Dein Passwort:" #: bookwyrm/templates/settings/users/user.html:7 msgid "Back to users" -msgstr "Zurück zu Benutzer*innen" +msgstr "Zurück zu den Benutzer*innen" #: bookwyrm/templates/settings/users/user_admin.html:7 #, python-format @@ -2749,7 +2994,7 @@ msgstr "Inaktiv" #: bookwyrm/templates/settings/users/user_admin.html:52 #: bookwyrm/templates/settings/users/user_info.html:120 msgid "Not set" -msgstr "Nicht gesetzt" +msgstr "Nicht festgelegt" #: bookwyrm/templates/settings/users/user_info.html:16 msgid "View user profile" @@ -2805,7 +3050,7 @@ msgstr "Instanz anzeigen" #: bookwyrm/templates/settings/users/user_moderation_actions.html:5 msgid "Permanently deleted" -msgstr "Permanent gelöscht" +msgstr "Dauerhaft gelöscht" #: bookwyrm/templates/settings/users/user_moderation_actions.html:13 #: bookwyrm/templates/snippets/status/status_options.html:32 @@ -2833,57 +3078,70 @@ msgstr "Regal erstellen" msgid "Edit Shelf" msgstr "Regal bearbeiten" -#: bookwyrm/templates/shelf/shelf.html:28 bookwyrm/views/shelf.py:55 +#: bookwyrm/templates/shelf/shelf.html:28 bookwyrm/views/shelf/shelf.py:53 msgid "All books" msgstr "Alle Bücher" -#: bookwyrm/templates/shelf/shelf.html:55 +#: bookwyrm/templates/shelf/shelf.html:69 msgid "Create shelf" msgstr "Regal erstellen" -#: bookwyrm/templates/shelf/shelf.html:77 +#: bookwyrm/templates/shelf/shelf.html:90 #, python-format msgid "%(formatted_count)s book" msgid_plural "%(formatted_count)s books" msgstr[0] "%(formatted_count)s Buch" msgstr[1] "%(formatted_count)s Bücher" -#: bookwyrm/templates/shelf/shelf.html:84 +#: bookwyrm/templates/shelf/shelf.html:97 #, python-format msgid "(showing %(start)s-%(end)s)" -msgstr "(zeige %(start)s-%(end)s)" +msgstr "(Anzeige: %(start)s&endash;%(end)s)" -#: bookwyrm/templates/shelf/shelf.html:96 +#: bookwyrm/templates/shelf/shelf.html:109 msgid "Edit shelf" msgstr "Regal bearbeiten" -#: bookwyrm/templates/shelf/shelf.html:104 +#: bookwyrm/templates/shelf/shelf.html:117 msgid "Delete shelf" msgstr "Regal löschen" -#: bookwyrm/templates/shelf/shelf.html:132 -#: bookwyrm/templates/shelf/shelf.html:158 +#: bookwyrm/templates/shelf/shelf.html:145 +#: bookwyrm/templates/shelf/shelf.html:171 msgid "Shelved" msgstr "Ins Regal gestellt" -#: bookwyrm/templates/shelf/shelf.html:133 -#: bookwyrm/templates/shelf/shelf.html:161 +#: bookwyrm/templates/shelf/shelf.html:146 +#: bookwyrm/templates/shelf/shelf.html:174 msgid "Started" msgstr "Gestartet" -#: bookwyrm/templates/shelf/shelf.html:134 -#: bookwyrm/templates/shelf/shelf.html:164 +#: bookwyrm/templates/shelf/shelf.html:147 +#: bookwyrm/templates/shelf/shelf.html:177 msgid "Finished" msgstr "Abgeschlossen" -#: bookwyrm/templates/shelf/shelf.html:190 +#: bookwyrm/templates/shelf/shelf.html:203 msgid "This shelf is empty." msgstr "Dieses Regal ist leer." +#: bookwyrm/templates/snippets/add_to_group_button.html:15 +msgid "Invite" +msgstr "Einladen" + +#: bookwyrm/templates/snippets/add_to_group_button.html:24 +msgid "Uninvite" +msgstr "Einladung stornieren" + +#: bookwyrm/templates/snippets/add_to_group_button.html:28 +#, python-format +msgid "Remove @%(username)s" +msgstr "@%(username)s entfernen" + #: bookwyrm/templates/snippets/announcement.html:31 #, python-format msgid "Posted by %(username)s" -msgstr "Von %(username)s veröffentlicht" +msgstr "Veröffentlicht von %(username)s" #: bookwyrm/templates/snippets/authors.html:22 #, python-format @@ -2911,10 +3169,6 @@ msgstr "Teilen" msgid "Un-boost" msgstr "Teilen zurücknehmen" -#: bookwyrm/templates/snippets/create_status.html:17 -msgid "Review" -msgstr "Bewerten" - #: bookwyrm/templates/snippets/create_status.html:39 msgid "Quote" msgstr "Zitieren" @@ -2948,7 +3202,7 @@ msgstr "von %(pages)s Seiten" #: bookwyrm/templates/snippets/status/layout.html:52 #: bookwyrm/templates/snippets/status/layout.html:53 msgid "Reply" -msgstr "Antwort" +msgstr "Antworten" #: bookwyrm/templates/snippets/create_status/content_field.html:17 msgid "Content" @@ -2975,12 +3229,13 @@ msgstr "Kommentar:" #: bookwyrm/templates/snippets/privacy-icons.html:15 #: bookwyrm/templates/snippets/privacy-icons.html:16 #: bookwyrm/templates/snippets/privacy_select.html:20 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:17 msgid "Private" msgstr "Privat" #: bookwyrm/templates/snippets/create_status/post_options_block.html:21 msgid "Post" -msgstr "Absenden" +msgstr "Veröffentlichen" #: bookwyrm/templates/snippets/create_status/quotation.html:17 msgid "Quote:" @@ -3019,7 +3274,7 @@ msgstr "Diese Lesedaten löschen?" #: bookwyrm/templates/snippets/delete_readthrough_modal.html:7 #, python-format msgid "You are deleting this readthrough and its %(count)s associated progress updates." -msgstr "Du löscht diesen Leseforschritt und %(count)s zugehörige Fortschrittsupdates." +msgstr "Du löscht diesen Leseforschritt und %(count)s zugehörige Zwischenstände." #: bookwyrm/templates/snippets/fav_button.html:16 #: bookwyrm/templates/snippets/fav_button.html:17 @@ -3070,13 +3325,14 @@ msgid "Unfollow" msgstr "Entfolgen" #: bookwyrm/templates/snippets/follow_request_buttons.html:7 +#: bookwyrm/templates/snippets/join_invitation_buttons.html:8 msgid "Accept" msgstr "Annehmen" #: bookwyrm/templates/snippets/form_rate_stars.html:20 #: bookwyrm/templates/snippets/stars.html:13 msgid "No rating" -msgstr "Kein Rating" +msgstr "Keine Bewertung" #: bookwyrm/templates/snippets/form_rate_stars.html:28 #, python-format @@ -3097,8 +3353,8 @@ msgstr[1] "%(rating)s Sterne" #, python-format msgid "set a goal to read %(counter)s book in %(year)s" msgid_plural "set a goal to read %(counter)s books in %(year)s" -msgstr[0] "Setze das Ziel, %(year)s %(counter)s Buch zu lesen" -msgstr[1] "Setze das Ziel, %(year)s %(counter)s Bücher zu lesen" +msgstr[0] "setze dir das Ziel, %(year)s %(counter)s Buch zu lesen" +msgstr[1] "setze dir das Ziel, %(year)s %(counter)s Bücher zu lesen" #: bookwyrm/templates/snippets/generated_status/rating.html:3 #, python-format @@ -3117,12 +3373,12 @@ msgstr[1] "Besprechung von „%(book_title)s“ (%(display_rating)s Sterne): %(r #: bookwyrm/templates/snippets/generated_status/review_pure_name.html:8 #, python-format msgid "Review of \"%(book_title)s\": %(review_title)s" -msgstr "Review von \"%(book_title)s\": %(review_title)s" +msgstr "Besprechung von „%(book_title)s“: %(review_title)s" #: bookwyrm/templates/snippets/goal_form.html:4 #, python-format msgid "Set a goal for how many books you'll finish reading in %(year)s, and track your progress throughout the year." -msgstr "Setze dir ein Ziel, wie viele Bücher du %(year)s lesen wirst und behalte deinen Fortschritt über's Jahr im Auge." +msgstr "Setze dir ein Ziel, wie viele Bücher du %(year)s lesen willst und behalte deinen Fortschritt während des Jahrs im Blick." #: bookwyrm/templates/snippets/goal_form.html:16 msgid "Reading goal:" @@ -3134,12 +3390,12 @@ msgstr "Bücher" #: bookwyrm/templates/snippets/goal_form.html:26 msgid "Goal privacy:" -msgstr "Sichtbarkeit des Ziels" +msgstr "Sichtbarkeit des Ziels:" #: bookwyrm/templates/snippets/goal_form.html:33 #: bookwyrm/templates/snippets/reading_modals/layout.html:13 msgid "Post to feed" -msgstr "Posten" +msgstr "Im Feed veröffentlichen" #: bookwyrm/templates/snippets/goal_form.html:37 msgid "Set goal" @@ -3148,7 +3404,7 @@ msgstr "Ziel setzen" #: bookwyrm/templates/snippets/goal_progress.html:9 #, python-format msgid "%(percent)s%% complete!" -msgstr "%(percent)s%% komplett!" +msgstr "%(percent)s%% geschafft!" #: bookwyrm/templates/snippets/goal_progress.html:12 #, python-format @@ -3181,20 +3437,23 @@ msgstr "Weiter" #: bookwyrm/templates/snippets/privacy-icons.html:3 #: bookwyrm/templates/snippets/privacy-icons.html:4 #: bookwyrm/templates/snippets/privacy_select.html:11 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:11 msgid "Public" msgstr "Öffentlich" #: bookwyrm/templates/snippets/privacy-icons.html:7 #: bookwyrm/templates/snippets/privacy-icons.html:8 #: bookwyrm/templates/snippets/privacy_select.html:14 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:14 msgid "Unlisted" msgstr "Ungelistet" #: bookwyrm/templates/snippets/privacy-icons.html:12 msgid "Followers-only" -msgstr "Nur für Folgende" +msgstr "Nur für Follower*innen" #: bookwyrm/templates/snippets/privacy_select.html:6 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:6 msgid "Post privacy" msgstr "Beitragssichtbarkeit" @@ -3202,11 +3461,11 @@ msgstr "Beitragssichtbarkeit" #: bookwyrm/templates/user/relationships/followers.html:6 #: bookwyrm/templates/user/relationships/layout.html:11 msgid "Followers" -msgstr "Folgende" +msgstr "Follower*innen" #: bookwyrm/templates/snippets/rate_action.html:4 msgid "Leave a rating" -msgstr "Raten" +msgstr "Bewerten" #: bookwyrm/templates/snippets/rate_action.html:19 msgid "Rate" @@ -3215,7 +3474,7 @@ msgstr "Bewerten" #: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:6 #, python-format msgid "Finish \"%(book_title)s\"" -msgstr "\"%(book_title)s\" abschließen" +msgstr "„%(book_title)s“ abschließen" #: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:23 #: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:20 @@ -3226,7 +3485,7 @@ msgstr "Zu lesen angefangen" #: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:31 #: bookwyrm/templates/snippets/readthrough_form.html:20 msgid "Finished reading" -msgstr "Zu Ende gelesen" +msgstr "Lesen abgeschlossen" #: bookwyrm/templates/snippets/reading_modals/form.html:9 msgid "(Optional)" @@ -3235,17 +3494,17 @@ msgstr "(Optional)" #: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:5 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:50 msgid "Update progress" -msgstr "Update-Fortschritt" +msgstr "Zwischenstand" #: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:6 #, python-format msgid "Start \"%(book_title)s\"" -msgstr "\"%(book_title)s\" beginnen" +msgstr "„%(book_title)s“ beginnen" #: bookwyrm/templates/snippets/reading_modals/want_to_read_modal.html:6 #, python-format msgid "Want to Read \"%(book_title)s\"" -msgstr "\"%(book_title)s\" auf Leseliste setzen" +msgstr "„%(book_title)s“ auf Leseliste setzen" #: bookwyrm/templates/snippets/readthrough_form.html:14 msgid "Progress" @@ -3267,11 +3526,11 @@ msgstr "@%(username)s melden" #: bookwyrm/templates/snippets/report_modal.html:23 #, python-format msgid "This report will be sent to %(site_name)s's moderators for review." -msgstr "Diese Meldung wird an die Moderator:innen von %(site_name)s weitergeletiet." +msgstr "Diese Meldung wird an die Moderato*innen von %(site_name)s weitergeleitet." #: bookwyrm/templates/snippets/report_modal.html:24 msgid "More info about this report:" -msgstr "Weitere Angeben zu dieser Meldung:" +msgstr "Weitere Angaben zu dieser Meldung:" #: bookwyrm/templates/snippets/shelf_selector.html:4 msgid "Move book" @@ -3336,7 +3595,7 @@ msgstr "%(date)s bearbeitet" msgid "commented on %(book)s" msgstr "hat %(book)s kommentiert" -#: bookwyrm/templates/snippets/status/headers/note.html:15 +#: bookwyrm/templates/snippets/status/headers/note.html:8 #, python-format msgid "replied to %(username)s's status" msgstr "hat auf die Statusmeldung von %(username)s geantwortet" @@ -3354,7 +3613,7 @@ msgstr "hat %(book)s bewertet:" #: bookwyrm/templates/snippets/status/headers/read.html:7 #, python-format msgid "finished reading %(book)s" -msgstr "hat %(book)s ausgelesen" +msgstr "hat %(book)s abgeschlossen" #: bookwyrm/templates/snippets/status/headers/reading.html:7 #, python-format @@ -3374,7 +3633,7 @@ msgstr "%(username)s hat \n" "Language-Team: English \n" @@ -73,15 +73,16 @@ msgstr "" msgid "Descending" msgstr "" -#: bookwyrm/importers/importer.py:75 +#: bookwyrm/importers/importer.py:127 msgid "Error loading book" msgstr "" -#: bookwyrm/importers/importer.py:88 +#: bookwyrm/importers/importer.py:135 msgid "Could not find a match for book" msgstr "" #: bookwyrm/models/base_model.py:17 +#: bookwyrm/templates/import/import_status.html:171 msgid "Pending" msgstr "" @@ -101,23 +102,23 @@ msgstr "" msgid "Domain block" msgstr "" -#: bookwyrm/models/book.py:232 +#: bookwyrm/models/book.py:233 msgid "Audiobook" msgstr "" -#: bookwyrm/models/book.py:233 +#: bookwyrm/models/book.py:234 msgid "eBook" msgstr "" -#: bookwyrm/models/book.py:234 +#: bookwyrm/models/book.py:235 msgid "Graphic novel" msgstr "" -#: bookwyrm/models/book.py:235 +#: bookwyrm/models/book.py:236 msgid "Hardcover" msgstr "" -#: bookwyrm/models/book.py:236 +#: bookwyrm/models/book.py:237 msgid "Paperback" msgstr "" @@ -134,21 +135,21 @@ msgstr "" msgid "Blocked" msgstr "" -#: bookwyrm/models/fields.py:27 +#: bookwyrm/models/fields.py:29 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "" -#: bookwyrm/models/fields.py:36 bookwyrm/models/fields.py:45 +#: bookwyrm/models/fields.py:38 bookwyrm/models/fields.py:47 #, python-format msgid "%(value)s is not a valid username" msgstr "" -#: bookwyrm/models/fields.py:181 bookwyrm/templates/layout.html:171 +#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:171 msgid "username" msgstr "" -#: bookwyrm/models/fields.py:186 +#: bookwyrm/models/fields.py:188 msgid "A user with that username already exists." msgstr "" @@ -893,22 +894,37 @@ msgstr "" msgid "All known users" msgstr "" -#: bookwyrm/templates/discover/card-header.html:9 +#: bookwyrm/templates/discover/card-header.html:8 #, python-format -msgid "%(username)s rated %(book_title)s" +msgid "%(username)s wants to read %(book_title)s" msgstr "" #: bookwyrm/templates/discover/card-header.html:13 #, python-format +msgid "%(username)s finished reading %(book_title)s" +msgstr "" + +#: bookwyrm/templates/discover/card-header.html:18 +#, python-format +msgid "%(username)s started reading %(book_title)s" +msgstr "" + +#: bookwyrm/templates/discover/card-header.html:23 +#, python-format +msgid "%(username)s rated %(book_title)s" +msgstr "" + +#: bookwyrm/templates/discover/card-header.html:27 +#, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:17 +#: bookwyrm/templates/discover/card-header.html:31 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:21 +#: bookwyrm/templates/discover/card-header.html:35 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "" @@ -1059,9 +1075,8 @@ msgstr "" msgid "Updates" msgstr "" -#: bookwyrm/templates/feed/layout.html:12 -#: bookwyrm/templates/user/books_header.html:3 -msgid "Your books" +#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:106 +msgid "Your Books" msgstr "" #: bookwyrm/templates/feed/layout.html:14 @@ -1070,11 +1085,13 @@ msgstr "" #: bookwyrm/templates/feed/layout.html:25 #: bookwyrm/templates/shelf/shelf.html:38 +#: bookwyrm/templates/user/books_header.html:4 msgid "To Read" msgstr "" #: bookwyrm/templates/feed/layout.html:26 #: bookwyrm/templates/shelf/shelf.html:40 +#: bookwyrm/templates/user/books_header.html:6 msgid "Currently Reading" msgstr "" @@ -1082,6 +1099,7 @@ msgstr "" #: bookwyrm/templates/shelf/shelf.html:42 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:23 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12 +#: bookwyrm/templates/user/books_header.html:8 msgid "Read" msgstr "" @@ -1367,88 +1385,161 @@ msgid "No recent imports" msgstr "" #: bookwyrm/templates/import/import_status.html:6 -#: bookwyrm/templates/import/import_status.html:10 +#: bookwyrm/templates/import/import_status.html:15 +#: bookwyrm/templates/import/import_status.html:29 msgid "Import Status" msgstr "" -#: bookwyrm/templates/import/import_status.html:11 -msgid "Back to imports" +#: bookwyrm/templates/import/import_status.html:13 +#: bookwyrm/templates/import/import_status.html:27 +msgid "Retry Status" msgstr "" -#: bookwyrm/templates/import/import_status.html:15 +#: bookwyrm/templates/import/import_status.html:22 +msgid "Imports" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:39 msgid "Import started:" msgstr "" -#: bookwyrm/templates/import/import_status.html:20 -msgid "Import completed:" -msgstr "" - -#: bookwyrm/templates/import/import_status.html:24 -msgid "TASK FAILED" -msgstr "" - -#: bookwyrm/templates/import/import_status.html:32 -msgid "Import still in progress." -msgstr "" - -#: bookwyrm/templates/import/import_status.html:34 -msgid "(Hit reload to update!)" -msgstr "" - -#: bookwyrm/templates/import/import_status.html:41 -msgid "Failed to load" +#: bookwyrm/templates/import/import_status.html:48 +msgid "In progress" msgstr "" #: bookwyrm/templates/import/import_status.html:50 -#, python-format -msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import." +msgid "Refresh" msgstr "" #: bookwyrm/templates/import/import_status.html:62 #, python-format -msgid "Line %(index)s: %(title)s by %(author)s" +msgid "%(display_counter)s item needs manual approval." +msgid_plural "%(display_counter)s items need manual approval." +msgstr[0] "" +msgstr[1] "" + +#: bookwyrm/templates/import/import_status.html:67 +#: bookwyrm/templates/import/manual_review.html:8 +msgid "Review items" msgstr "" -#: bookwyrm/templates/import/import_status.html:82 -msgid "Select all" +#: bookwyrm/templates/import/import_status.html:73 +#, python-format +msgid "%(display_counter)s item failed to import." +msgid_plural "%(display_counter)s items failed to import." +msgstr[0] "" +msgstr[1] "" + +#: bookwyrm/templates/import/import_status.html:79 +msgid "View and troubleshoot failed items" msgstr "" -#: bookwyrm/templates/import/import_status.html:85 -msgid "Retry items" +#: bookwyrm/templates/import/import_status.html:91 +msgid "Row" msgstr "" -#: bookwyrm/templates/import/import_status.html:112 -msgid "Successfully imported" -msgstr "" - -#: bookwyrm/templates/import/import_status.html:114 -msgid "Import Progress" -msgstr "" - -#: bookwyrm/templates/import/import_status.html:119 -msgid "Book" -msgstr "" - -#: bookwyrm/templates/import/import_status.html:122 +#: bookwyrm/templates/import/import_status.html:94 #: bookwyrm/templates/shelf/shelf.html:141 #: bookwyrm/templates/shelf/shelf.html:163 msgid "Title" msgstr "" -#: bookwyrm/templates/import/import_status.html:125 +#: bookwyrm/templates/import/import_status.html:97 +msgid "ISBN" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:100 #: bookwyrm/templates/shelf/shelf.html:142 #: bookwyrm/templates/shelf/shelf.html:166 msgid "Author" msgstr "" -#: bookwyrm/templates/import/import_status.html:148 +#: bookwyrm/templates/import/import_status.html:103 +msgid "Shelf" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:106 +#: bookwyrm/templates/import/manual_review.html:13 +#: bookwyrm/templates/snippets/create_status.html:17 +msgid "Review" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:110 +msgid "Book" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:113 +#: bookwyrm/templates/settings/announcements/announcements.html:38 +#: bookwyrm/templates/settings/federation/instance_list.html:46 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44 +#: bookwyrm/templates/settings/invites/status_filter.html:5 +#: bookwyrm/templates/settings/users/user_admin.html:34 +#: bookwyrm/templates/settings/users/user_info.html:20 +msgid "Status" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:144 +msgid "View imported review" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:158 msgid "Imported" msgstr "" +#: bookwyrm/templates/import/import_status.html:164 +msgid "Needs manual review" +msgstr "" + +#: bookwyrm/templates/import/manual_review.html:5 +#: bookwyrm/templates/import/troubleshoot.html:4 +msgid "Import Troubleshooting" +msgstr "" + +#: bookwyrm/templates/import/manual_review.html:21 +msgid "Approving a suggestion will permanently add the suggested book to your shelves and associate your reading dates, reviews, and ratings with that book." +msgstr "" + +#: bookwyrm/templates/import/manual_review.html:56 +#: bookwyrm/templates/lists/curate.html:57 +msgid "Approve" +msgstr "" + +#: bookwyrm/templates/import/manual_review.html:64 +msgid "Reject" +msgstr "" + #: bookwyrm/templates/import/tooltip.html:6 msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." msgstr "" +#: bookwyrm/templates/import/troubleshoot.html:7 +msgid "Failed items" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:12 +msgid "Troubleshooting" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:20 +msgid "Re-trying an import can fix missing items in cases such as:" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:23 +msgid "The book has been added to the instance since this import" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:24 +msgid "A transient error or timeout caused the external data source to be unavailable." +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:25 +msgid "BookWyrm has been updated since this import with a bug fix" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:28 +msgid "Contact your admin or open an issue if you are seeing unexpected failed items." +msgstr "" + #: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:230 #, python-format msgid "About %(site_name)s" @@ -1580,10 +1671,6 @@ msgstr "" msgid "Feed" msgstr "" -#: bookwyrm/templates/layout.html:106 -msgid "Your Books" -msgstr "" - #: bookwyrm/templates/layout.html:116 msgid "Settings" msgstr "" @@ -1683,10 +1770,6 @@ msgstr "" msgid "Suggested by" msgstr "" -#: bookwyrm/templates/lists/curate.html:57 -msgid "Approve" -msgstr "" - #: bookwyrm/templates/lists/curate.html:63 msgid "Discard" msgstr "" @@ -2239,15 +2322,6 @@ msgstr "" msgid "End date" msgstr "" -#: bookwyrm/templates/settings/announcements/announcements.html:38 -#: bookwyrm/templates/settings/federation/instance_list.html:46 -#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44 -#: bookwyrm/templates/settings/invites/status_filter.html:5 -#: bookwyrm/templates/settings/users/user_admin.html:34 -#: bookwyrm/templates/settings/users/user_info.html:20 -msgid "Status" -msgstr "" - #: bookwyrm/templates/settings/announcements/announcements.html:48 msgid "active" msgstr "" @@ -3096,10 +3170,6 @@ msgstr "" msgid "Un-boost" msgstr "" -#: bookwyrm/templates/snippets/create_status.html:17 -msgid "Review" -msgstr "" - #: bookwyrm/templates/snippets/create_status.html:39 msgid "Quote" msgstr "" @@ -3526,7 +3596,7 @@ msgstr "" msgid "commented on %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/note.html:15 +#: bookwyrm/templates/snippets/status/headers/note.html:8 #, python-format msgid "replied to %(username)s's status" msgstr "" @@ -3605,7 +3675,11 @@ msgstr "" msgid "Show less" msgstr "" -#: bookwyrm/templates/user/books_header.html:5 +#: bookwyrm/templates/user/books_header.html:10 +msgid "Your books" +msgstr "" + +#: bookwyrm/templates/user/books_header.html:15 #, python-format msgid "%(username)s's books" msgstr "" @@ -3749,7 +3823,7 @@ msgstr "" msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/views/import_data.py:67 +#: bookwyrm/views/imports/import_data.py:64 msgid "Not a valid csv file" msgstr "" diff --git a/locale/es_ES/LC_MESSAGES/django.mo b/locale/es_ES/LC_MESSAGES/django.mo index 7df75031..9614a669 100644 Binary files a/locale/es_ES/LC_MESSAGES/django.mo and b/locale/es_ES/LC_MESSAGES/django.mo differ diff --git a/locale/es_ES/LC_MESSAGES/django.po b/locale/es_ES/LC_MESSAGES/django.po index ab71feb8..b5fc1ce3 100644 --- a/locale/es_ES/LC_MESSAGES/django.po +++ b/locale/es_ES/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-15 22:03+0000\n" -"PO-Revision-Date: 2021-10-21 21:00\n" +"POT-Creation-Date: 2021-11-14 15:08+0000\n" +"PO-Revision-Date: 2021-11-15 18:03\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Spanish\n" "Language: es\n" @@ -35,7 +35,7 @@ msgstr "Un mes" #: bookwyrm/forms.py:259 msgid "Does Not Expire" -msgstr "Nunca se vence" +msgstr "No expira" #: bookwyrm/forms.py:263 #, python-brace-format @@ -46,41 +46,42 @@ msgstr "{i} usos" msgid "Unlimited" msgstr "Sin límite" -#: bookwyrm/forms.py:326 +#: bookwyrm/forms.py:332 msgid "List Order" msgstr "Orden de la lista" -#: bookwyrm/forms.py:327 +#: bookwyrm/forms.py:333 msgid "Book Title" msgstr "Título" -#: bookwyrm/forms.py:328 bookwyrm/templates/shelf/shelf.html:136 -#: bookwyrm/templates/shelf/shelf.html:168 +#: bookwyrm/forms.py:334 bookwyrm/templates/shelf/shelf.html:149 +#: bookwyrm/templates/shelf/shelf.html:181 #: bookwyrm/templates/snippets/create_status/review.html:33 msgid "Rating" msgstr "Calificación" -#: bookwyrm/forms.py:330 bookwyrm/templates/lists/list.html:109 +#: bookwyrm/forms.py:336 bookwyrm/templates/lists/list.html:110 msgid "Sort By" msgstr "Ordenar por" -#: bookwyrm/forms.py:334 +#: bookwyrm/forms.py:340 msgid "Ascending" msgstr "Ascendente" -#: bookwyrm/forms.py:335 +#: bookwyrm/forms.py:341 msgid "Descending" msgstr "Descendente" -#: bookwyrm/importers/importer.py:75 +#: bookwyrm/importers/importer.py:127 msgid "Error loading book" msgstr "Error en cargar libro" -#: bookwyrm/importers/importer.py:88 +#: bookwyrm/importers/importer.py:135 msgid "Could not find a match for book" msgstr "No se pudo encontrar el libro" #: bookwyrm/models/base_model.py:17 +#: bookwyrm/templates/import/import_status.html:171 msgid "Pending" msgstr "Pendiente" @@ -100,23 +101,23 @@ msgstr "Eliminación de moderador" msgid "Domain block" msgstr "Bloqueo de dominio" -#: bookwyrm/models/book.py:232 +#: bookwyrm/models/book.py:233 msgid "Audiobook" msgstr "Audio libro" -#: bookwyrm/models/book.py:233 +#: bookwyrm/models/book.py:234 msgid "eBook" msgstr "Libro electrónico" -#: bookwyrm/models/book.py:234 +#: bookwyrm/models/book.py:235 msgid "Graphic novel" msgstr "Novela gráfica" -#: bookwyrm/models/book.py:235 +#: bookwyrm/models/book.py:236 msgid "Hardcover" msgstr "Tapa dura" -#: bookwyrm/models/book.py:236 +#: bookwyrm/models/book.py:237 msgid "Paperback" msgstr "Tapa blanda" @@ -133,21 +134,21 @@ msgstr "Federalizado" msgid "Blocked" msgstr "Bloqueado" -#: bookwyrm/models/fields.py:27 +#: bookwyrm/models/fields.py:29 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "%(value)s no es un remote_id válido" -#: bookwyrm/models/fields.py:36 bookwyrm/models/fields.py:45 +#: bookwyrm/models/fields.py:38 bookwyrm/models/fields.py:47 #, python-format msgid "%(value)s is not a valid username" msgstr "%(value)s no es un usuario válido" -#: bookwyrm/models/fields.py:181 bookwyrm/templates/layout.html:171 +#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:171 msgid "username" msgstr "nombre de usuario" -#: bookwyrm/models/fields.py:186 +#: bookwyrm/models/fields.py:188 msgid "A user with that username already exists." msgstr "Ya existe un usuario con ese nombre." @@ -165,7 +166,7 @@ msgstr "Línea temporal de libros" #: bookwyrm/settings.py:119 bookwyrm/templates/search/layout.html:21 #: bookwyrm/templates/search/layout.html:42 -#: bookwyrm/templates/user/layout.html:81 +#: bookwyrm/templates/user/layout.html:88 msgid "Books" msgstr "Libros" @@ -223,7 +224,7 @@ msgid "Edit Author" msgstr "Editar Autor/Autora" #: bookwyrm/templates/author/author.html:34 -#: bookwyrm/templates/author/edit_author.html:41 +#: bookwyrm/templates/author/edit_author.html:43 msgid "Aliases:" msgstr "Alias:" @@ -276,71 +277,72 @@ msgstr "Agregado:" msgid "Updated:" msgstr "Actualizado:" -#: bookwyrm/templates/author/edit_author.html:15 +#: bookwyrm/templates/author/edit_author.html:16 #: bookwyrm/templates/book/edit/edit_book.html:25 msgid "Last edited by:" msgstr "Editado más recientemente por:" -#: bookwyrm/templates/author/edit_author.html:31 +#: bookwyrm/templates/author/edit_author.html:33 #: bookwyrm/templates/book/edit/edit_book_form.html:15 msgid "Metadata" msgstr "Metadatos" -#: bookwyrm/templates/author/edit_author.html:33 -#: bookwyrm/templates/lists/form.html:8 bookwyrm/templates/shelf/form.html:9 +#: bookwyrm/templates/author/edit_author.html:35 +#: bookwyrm/templates/lists/form.html:9 bookwyrm/templates/shelf/form.html:9 msgid "Name:" msgstr "Nombre:" -#: bookwyrm/templates/author/edit_author.html:43 +#: bookwyrm/templates/author/edit_author.html:45 #: bookwyrm/templates/book/edit/edit_book_form.html:65 #: bookwyrm/templates/book/edit/edit_book_form.html:79 #: bookwyrm/templates/book/edit/edit_book_form.html:124 msgid "Separate multiple values with commas." msgstr "Separar varios valores con comas." -#: bookwyrm/templates/author/edit_author.html:50 +#: bookwyrm/templates/author/edit_author.html:52 msgid "Bio:" msgstr "Biografía:" -#: bookwyrm/templates/author/edit_author.html:57 +#: bookwyrm/templates/author/edit_author.html:59 msgid "Wikipedia link:" msgstr "Enlace de Wikipedia:" -#: bookwyrm/templates/author/edit_author.html:63 +#: bookwyrm/templates/author/edit_author.html:65 msgid "Birth date:" msgstr "Fecha de nacimiento:" -#: bookwyrm/templates/author/edit_author.html:71 +#: bookwyrm/templates/author/edit_author.html:73 msgid "Death date:" msgstr "Fecha de muerte:" -#: bookwyrm/templates/author/edit_author.html:79 +#: bookwyrm/templates/author/edit_author.html:81 msgid "Author Identifiers" msgstr "Identificadores de autor/autora" -#: bookwyrm/templates/author/edit_author.html:81 +#: bookwyrm/templates/author/edit_author.html:83 msgid "Openlibrary key:" msgstr "Clave OpenLibrary:" -#: bookwyrm/templates/author/edit_author.html:89 +#: bookwyrm/templates/author/edit_author.html:91 #: bookwyrm/templates/book/edit/edit_book_form.html:224 msgid "Inventaire ID:" msgstr "ID Inventaire:" -#: bookwyrm/templates/author/edit_author.html:97 +#: bookwyrm/templates/author/edit_author.html:99 msgid "Librarything key:" msgstr "Clave Librarything:" -#: bookwyrm/templates/author/edit_author.html:105 +#: bookwyrm/templates/author/edit_author.html:107 msgid "Goodreads key:" msgstr "Clave Goodreads:" -#: bookwyrm/templates/author/edit_author.html:116 +#: bookwyrm/templates/author/edit_author.html:118 #: bookwyrm/templates/book/book.html:140 #: bookwyrm/templates/book/edit/edit_book.html:110 #: bookwyrm/templates/book/readthrough.html:76 +#: bookwyrm/templates/groups/form.html:24 #: bookwyrm/templates/lists/bookmark_button.html:15 -#: bookwyrm/templates/lists/form.html:44 +#: bookwyrm/templates/lists/form.html:75 #: bookwyrm/templates/preferences/edit_user.html:124 #: bookwyrm/templates/settings/announcements/announcement_form.html:69 #: bookwyrm/templates/settings/federation/edit_instance.html:74 @@ -352,11 +354,13 @@ msgstr "Clave Goodreads:" msgid "Save" msgstr "Guardar" -#: bookwyrm/templates/author/edit_author.html:117 +#: bookwyrm/templates/author/edit_author.html:119 #: bookwyrm/templates/book/book.html:141 bookwyrm/templates/book/book.html:190 #: bookwyrm/templates/book/cover_modal.html:32 -#: bookwyrm/templates/book/edit/edit_book.html:111 +#: bookwyrm/templates/book/edit/edit_book.html:112 +#: bookwyrm/templates/book/edit/edit_book.html:115 #: bookwyrm/templates/book/readthrough.html:77 +#: bookwyrm/templates/groups/delete_group_modal.html:17 #: bookwyrm/templates/lists/delete_list_modal.html:17 #: bookwyrm/templates/settings/federation/instance.html:88 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:17 @@ -397,7 +401,7 @@ msgstr "Agregar descripción" #: bookwyrm/templates/book/book.html:136 #: bookwyrm/templates/book/edit/edit_book_form.html:34 -#: bookwyrm/templates/lists/form.html:12 bookwyrm/templates/shelf/form.html:17 +#: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Descripción:" @@ -460,7 +464,7 @@ msgstr "Lugares" #: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12 #: bookwyrm/templates/search/layout.html:25 #: bookwyrm/templates/search/layout.html:50 -#: bookwyrm/templates/user/layout.html:75 +#: bookwyrm/templates/user/layout.html:82 msgid "Lists" msgstr "Listas" @@ -470,7 +474,7 @@ msgstr "Agregar a lista" #: bookwyrm/templates/book/book.html:315 #: bookwyrm/templates/book/cover_modal.html:31 -#: bookwyrm/templates/lists/list.html:181 +#: bookwyrm/templates/lists/list.html:182 #: bookwyrm/templates/settings/email_blocklist/domain_form.html:26 #: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:32 msgid "Add" @@ -543,7 +547,9 @@ msgid "This is a new work" msgstr "Esta es una obra nueva" #: bookwyrm/templates/book/edit/edit_book.html:97 -#: bookwyrm/templates/password_reset.html:30 +#: bookwyrm/templates/groups/members.html:16 +#: bookwyrm/templates/landing/password_reset.html:30 +#: bookwyrm/templates/snippets/remove_from_group_button.html:16 msgid "Confirm" msgstr "Confirmar" @@ -612,7 +618,7 @@ msgid "John Doe, Jane Smith" msgstr "Juan Nadie, Natalia Natalia" #: bookwyrm/templates/book/edit/edit_book_form.html:132 -#: bookwyrm/templates/shelf/shelf.html:127 +#: bookwyrm/templates/shelf/shelf.html:140 msgid "Cover" msgstr "Portada" @@ -686,17 +692,17 @@ msgstr "%(pages)s páginas" #: bookwyrm/templates/book/publisher_info.html:38 #, python-format msgid "%(languages)s language" -msgstr "idioma %(languages)s" +msgstr "Idioma %(languages)s" #: bookwyrm/templates/book/publisher_info.html:65 #, python-format msgid "Published %(date)s by %(publisher)s." -msgstr "Publicado %(date)s por %(publisher)s." +msgstr "Publicado el %(date)s por %(publisher)s." #: bookwyrm/templates/book/publisher_info.html:67 #, python-format msgid "Published %(date)s" -msgstr "Publicado %(date)s" +msgstr "Publicado el %(date)s" #: bookwyrm/templates/book/publisher_info.html:69 #, python-format @@ -793,7 +799,7 @@ msgstr "Reenviar enlace de confirmación" #: bookwyrm/templates/confirm_email/resend_form.html:11 #: bookwyrm/templates/landing/layout.html:67 -#: bookwyrm/templates/password_reset_request.html:18 +#: bookwyrm/templates/landing/password_reset_request.html:18 #: bookwyrm/templates/preferences/edit_user.html:56 #: bookwyrm/templates/snippets/register_form.html:13 msgid "Email address:" @@ -842,7 +848,7 @@ msgstr "Ordenar por" #: bookwyrm/templates/directory/sort_filter.html:8 msgid "Recently active" -msgstr "Activ@ recientemente" +msgstr "Activo recientemente" #: bookwyrm/templates/directory/sort_filter.html:9 msgid "Suggested" @@ -887,22 +893,37 @@ msgstr "Usuarios de BookWyrm" msgid "All known users" msgstr "Todos los usuarios conocidos" -#: bookwyrm/templates/discover/card-header.html:9 +#: bookwyrm/templates/discover/card-header.html:8 +#, python-format +msgid "%(username)s wants to read %(book_title)s" +msgstr "" + +#: bookwyrm/templates/discover/card-header.html:13 +#, python-format +msgid "%(username)s finished reading %(book_title)s" +msgstr "" + +#: bookwyrm/templates/discover/card-header.html:18 +#, python-format +msgid "%(username)s started reading %(book_title)s" +msgstr "" + +#: bookwyrm/templates/discover/card-header.html:23 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)s calificó %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:13 +#: bookwyrm/templates/discover/card-header.html:27 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s reseñó %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:17 +#: bookwyrm/templates/discover/card-header.html:31 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s comentó en %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:21 +#: bookwyrm/templates/discover/card-header.html:35 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s citó %(book_title)s" @@ -921,7 +942,7 @@ msgstr "Ver que es nuevo en la comunidad local de %(site_name)s" #: bookwyrm/templates/discover/large-book.html:52 #: bookwyrm/templates/discover/small-book.html:36 msgid "View status" -msgstr "Ver status" +msgstr "Ver estado" #: bookwyrm/templates/email/confirm/html_content.html:6 #: bookwyrm/templates/email/confirm/text_content.html:4 @@ -993,10 +1014,10 @@ msgid "You requested to reset your %(site_name)s password. Click the link below msgstr "Tú solicitaste reestablecer tu %(site_name)s contraseña. Haz clic en el enlace a continuación para establecer una nueva contraseña e ingresar a tu cuenta." #: bookwyrm/templates/email/password_reset/html_content.html:9 -#: bookwyrm/templates/password_reset.html:4 -#: bookwyrm/templates/password_reset.html:10 -#: bookwyrm/templates/password_reset_request.html:4 -#: bookwyrm/templates/password_reset_request.html:10 +#: bookwyrm/templates/landing/password_reset.html:4 +#: bookwyrm/templates/landing/password_reset.html:10 +#: bookwyrm/templates/landing/password_reset_request.html:4 +#: bookwyrm/templates/landing/password_reset_request.html:10 msgid "Reset Password" msgstr "Restablecer contraseña" @@ -1031,7 +1052,7 @@ msgstr "No tienes ningún mensaje en este momento." #: bookwyrm/templates/feed/feed.html:22 #, python-format msgid "load 0 unread status(es)" -msgstr "cargar 0 status(es) no leído(s)" +msgstr "cargar 0 estado(s) no leído(s)" #: bookwyrm/templates/feed/feed.html:38 msgid "There aren't any activities right now! Try following a user to get started" @@ -1042,20 +1063,19 @@ msgstr "¡No hay actividad ahora mismo! Sigue a otro usuario para empezar" #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" -msgstr "%(year)s Meta de lectura" +msgstr "Objetivo de lectura de %(year)s" #: bookwyrm/templates/feed/goal_card.html:18 #, python-format msgid "You can set or change your reading goal any time from your profile page" -msgstr "Puedes establecer o cambiar tu meta de lectura en cualquier momento que desees desde tu perfil" +msgstr "Puedes establecer o cambiar tu objetivo de lectura en cualquier momento desde tu página de perfil" #: bookwyrm/templates/feed/layout.html:5 msgid "Updates" msgstr "Actualizaciones" -#: bookwyrm/templates/feed/layout.html:12 -#: bookwyrm/templates/user/books_header.html:3 -msgid "Your books" +#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:106 +msgid "Your Books" msgstr "Tus libros" #: bookwyrm/templates/feed/layout.html:14 @@ -1064,11 +1084,13 @@ msgstr "¡No hay ningún libro aquí ahorita! Busca a un libro para empezar" #: bookwyrm/templates/feed/layout.html:25 #: bookwyrm/templates/shelf/shelf.html:38 +#: bookwyrm/templates/user/books_header.html:4 msgid "To Read" msgstr "Para leer" #: bookwyrm/templates/feed/layout.html:26 #: bookwyrm/templates/shelf/shelf.html:40 +#: bookwyrm/templates/user/books_header.html:6 msgid "Currently Reading" msgstr "Leyendo actualmente" @@ -1076,8 +1098,9 @@ msgstr "Leyendo actualmente" #: bookwyrm/templates/shelf/shelf.html:42 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:23 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12 +#: bookwyrm/templates/user/books_header.html:8 msgid "Read" -msgstr "Leido" +msgstr "Leído" #: bookwyrm/templates/feed/suggested_users.html:5 #: bookwyrm/templates/get_started/users.html:6 @@ -1102,7 +1125,7 @@ msgid "What are you reading?" msgstr "¿Qué estás leyendo?" #: bookwyrm/templates/get_started/books.html:9 -#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:137 +#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:138 msgid "Search for a book" msgstr "Buscar libros" @@ -1120,8 +1143,9 @@ msgstr "Puedes agregar libros cuando comiences a usar %(site_name)s." #: bookwyrm/templates/get_started/books.html:17 #: bookwyrm/templates/get_started/users.html:18 #: bookwyrm/templates/get_started/users.html:19 -#: bookwyrm/templates/layout.html:51 bookwyrm/templates/layout.html:52 -#: bookwyrm/templates/lists/list.html:141 +#: bookwyrm/templates/groups/group.html:19 +#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:51 +#: bookwyrm/templates/layout.html:52 bookwyrm/templates/lists/list.html:142 #: bookwyrm/templates/search/layout.html:4 #: bookwyrm/templates/search/layout.html:9 msgid "Search" @@ -1137,7 +1161,7 @@ msgid "Popular on %(site_name)s" msgstr "Popular en %(site_name)s" #: bookwyrm/templates/get_started/books.html:58 -#: bookwyrm/templates/lists/list.html:154 +#: bookwyrm/templates/lists/list.html:155 msgid "No books found" msgstr "No se encontró ningún libro" @@ -1223,9 +1247,110 @@ msgstr "Buscar un usuario" msgid "No users found for \"%(query)s\"" msgstr "No se encontró ningún usuario correspondiente a \"%(query)s\"" +#: bookwyrm/templates/groups/create_form.html:5 +msgid "Create Group" +msgstr "Crear grupo" + +#: bookwyrm/templates/groups/created_text.html:4 +#, python-format +msgid "Managed by %(username)s" +msgstr "Gestionado por %(username)s" + +#: bookwyrm/templates/groups/delete_group_modal.html:4 +msgid "Delete this group?" +msgstr "¿Eliminar este grupo?" + +#: bookwyrm/templates/groups/delete_group_modal.html:7 +#: bookwyrm/templates/lists/delete_list_modal.html:7 +msgid "This action cannot be un-done" +msgstr "Esta acción no se puede deshacer" + +#: bookwyrm/templates/groups/delete_group_modal.html:15 +#: bookwyrm/templates/lists/delete_list_modal.html:15 +#: bookwyrm/templates/settings/announcements/announcement.html:20 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36 +#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 +#: bookwyrm/templates/snippets/follow_request_buttons.html:12 +#: bookwyrm/templates/snippets/join_invitation_buttons.html:13 +msgid "Delete" +msgstr "Eliminar" + +#: bookwyrm/templates/groups/edit_form.html:5 +msgid "Edit Group" +msgstr "Editar Grupo" + +#: bookwyrm/templates/groups/find_users.html:6 +msgid "Add new members!" +msgstr "¡Agrega nuevos miembros!" + +#: bookwyrm/templates/groups/form.html:8 +msgid "Group Name:" +msgstr "Nombre del grupo:" + +#: bookwyrm/templates/groups/form.html:12 +msgid "Group Description:" +msgstr "Descripción del grupo:" + +#: bookwyrm/templates/groups/form.html:30 +msgid "Delete group" +msgstr "Eliminar grupo" + +#: bookwyrm/templates/groups/group.html:15 +msgid "Search to add a user" +msgstr "Buscar para agregar un usuario" + +#: bookwyrm/templates/groups/group.html:36 +msgid "This group has no lists" +msgstr "Este grupo no tiene listas" + +#: bookwyrm/templates/groups/layout.html:16 +msgid "Edit group" +msgstr "Editar grupo" + +#: bookwyrm/templates/groups/members.html:8 +msgid "Members can add and remove books on a group's book lists" +msgstr "Los miembros pueden agregar y eliminar libros en las listas de libros de un grupo" + +#: bookwyrm/templates/groups/members.html:19 +msgid "Leave group" +msgstr "Dejar grupo" + +#: bookwyrm/templates/groups/members.html:41 +#: bookwyrm/templates/groups/suggested_users.html:32 +#: bookwyrm/templates/snippets/suggested_users.html:31 +#: bookwyrm/templates/user/user_preview.html:36 +msgid "Follows you" +msgstr "Te sigue" + +#: bookwyrm/templates/groups/suggested_users.html:17 +#: bookwyrm/templates/snippets/suggested_users.html:16 +#, python-format +msgid "%(mutuals)s follower you follow" +msgid_plural "%(mutuals)s followers you follow" +msgstr[0] "%(mutuals)s seguidor que sigues" +msgstr[1] "%(mutuals)s seguidores que sigues" + +#: bookwyrm/templates/groups/suggested_users.html:24 +#: bookwyrm/templates/snippets/suggested_users.html:23 +#, python-format +msgid "%(shared_books)s book on your shelves" +msgid_plural "%(shared_books)s books on your shelves" +msgstr[0] "%(shared_books)s libro en tus estantes" +msgstr[1] "%(shared_books)s libros en tus estantes" + +#: bookwyrm/templates/groups/suggested_users.html:40 +#, python-format +msgid "No potential members found for \"%(user_query)s\"" +msgstr "No se encontraron miembros potenciales para «%(user_query)s»" + +#: bookwyrm/templates/groups/user_groups.html:15 +msgid "Manager" +msgstr "Gestor" + #: bookwyrm/templates/import/import.html:5 #: bookwyrm/templates/import/import.html:9 -#: bookwyrm/templates/shelf/shelf.html:57 +#: bookwyrm/templates/shelf/shelf.html:61 msgid "Import Books" msgstr "Importar libros" @@ -1259,100 +1384,160 @@ msgid "No recent imports" msgstr "No hay ninguna importación reciente" #: bookwyrm/templates/import/import_status.html:6 -#: bookwyrm/templates/import/import_status.html:10 -msgid "Import Status" -msgstr "Status de importación" - -#: bookwyrm/templates/import/import_status.html:11 -msgid "Back to imports" -msgstr "Volver a las importaciones" - #: bookwyrm/templates/import/import_status.html:15 +#: bookwyrm/templates/import/import_status.html:29 +msgid "Import Status" +msgstr "Importar estado" + +#: bookwyrm/templates/import/import_status.html:13 +#: bookwyrm/templates/import/import_status.html:27 +msgid "Retry Status" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:22 +msgid "Imports" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:39 msgid "Import started:" msgstr "Importación ha empezado:" -#: bookwyrm/templates/import/import_status.html:20 -msgid "Import completed:" -msgstr "Importación ha terminado:" - -#: bookwyrm/templates/import/import_status.html:24 -msgid "TASK FAILED" -msgstr "TAREA FALLÓ" - -#: bookwyrm/templates/import/import_status.html:32 -msgid "Import still in progress." -msgstr "Importación todavia en progreso." - -#: bookwyrm/templates/import/import_status.html:34 -msgid "(Hit reload to update!)" -msgstr "(¡Refresca para actualizar!)" - -#: bookwyrm/templates/import/import_status.html:41 -msgid "Failed to load" -msgstr "No se pudo cargar" +#: bookwyrm/templates/import/import_status.html:48 +msgid "In progress" +msgstr "" #: bookwyrm/templates/import/import_status.html:50 -#, python-format -msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import." -msgstr "Saltar al final de la lista para seleccionar los %(failed_count)s artículos que no se pudieron importar." +msgid "Refresh" +msgstr "" #: bookwyrm/templates/import/import_status.html:62 #, python-format -msgid "Line %(index)s: %(title)s by %(author)s" -msgstr "Renglón %(index)s: %(title)s por %(author)s" +msgid "%(display_counter)s item needs manual approval." +msgid_plural "%(display_counter)s items need manual approval." +msgstr[0] "" +msgstr[1] "" -#: bookwyrm/templates/import/import_status.html:82 -msgid "Select all" -msgstr "Seleccionar todo" +#: bookwyrm/templates/import/import_status.html:67 +#: bookwyrm/templates/import/manual_review.html:8 +msgid "Review items" +msgstr "" -#: bookwyrm/templates/import/import_status.html:85 -msgid "Retry items" -msgstr "Reintentar ítems" +#: bookwyrm/templates/import/import_status.html:73 +#, python-format +msgid "%(display_counter)s item failed to import." +msgid_plural "%(display_counter)s items failed to import." +msgstr[0] "" +msgstr[1] "" -#: bookwyrm/templates/import/import_status.html:112 -msgid "Successfully imported" -msgstr "Importado exitosamente" +#: bookwyrm/templates/import/import_status.html:79 +msgid "View and troubleshoot failed items" +msgstr "" -#: bookwyrm/templates/import/import_status.html:114 -msgid "Import Progress" -msgstr "Progreso de importación" +#: bookwyrm/templates/import/import_status.html:91 +msgid "Row" +msgstr "" -#: bookwyrm/templates/import/import_status.html:119 -msgid "Book" -msgstr "Libro" - -#: bookwyrm/templates/import/import_status.html:122 -#: bookwyrm/templates/shelf/shelf.html:128 -#: bookwyrm/templates/shelf/shelf.html:150 +#: bookwyrm/templates/import/import_status.html:94 +#: bookwyrm/templates/shelf/shelf.html:141 +#: bookwyrm/templates/shelf/shelf.html:163 msgid "Title" msgstr "Título" -#: bookwyrm/templates/import/import_status.html:125 -#: bookwyrm/templates/shelf/shelf.html:129 -#: bookwyrm/templates/shelf/shelf.html:153 +#: bookwyrm/templates/import/import_status.html:97 +msgid "ISBN" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:100 +#: bookwyrm/templates/shelf/shelf.html:142 +#: bookwyrm/templates/shelf/shelf.html:166 msgid "Author" msgstr "Autor/Autora" -#: bookwyrm/templates/import/import_status.html:148 +#: bookwyrm/templates/import/import_status.html:103 +msgid "Shelf" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:106 +#: bookwyrm/templates/import/manual_review.html:13 +#: bookwyrm/templates/snippets/create_status.html:17 +msgid "Review" +msgstr "Reseña" + +#: bookwyrm/templates/import/import_status.html:110 +msgid "Book" +msgstr "Libro" + +#: bookwyrm/templates/import/import_status.html:113 +#: bookwyrm/templates/settings/announcements/announcements.html:38 +#: bookwyrm/templates/settings/federation/instance_list.html:46 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44 +#: bookwyrm/templates/settings/invites/status_filter.html:5 +#: bookwyrm/templates/settings/users/user_admin.html:34 +#: bookwyrm/templates/settings/users/user_info.html:20 +msgid "Status" +msgstr "Estado" + +#: bookwyrm/templates/import/import_status.html:144 +msgid "View imported review" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:158 msgid "Imported" msgstr "Importado" +#: bookwyrm/templates/import/import_status.html:164 +msgid "Needs manual review" +msgstr "" + +#: bookwyrm/templates/import/manual_review.html:5 +#: bookwyrm/templates/import/troubleshoot.html:4 +msgid "Import Troubleshooting" +msgstr "" + +#: bookwyrm/templates/import/manual_review.html:21 +msgid "Approving a suggestion will permanently add the suggested book to your shelves and associate your reading dates, reviews, and ratings with that book." +msgstr "" + +#: bookwyrm/templates/import/manual_review.html:56 +#: bookwyrm/templates/lists/curate.html:57 +msgid "Approve" +msgstr "Aprobar" + +#: bookwyrm/templates/import/manual_review.html:64 +msgid "Reject" +msgstr "" + #: bookwyrm/templates/import/tooltip.html:6 msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." msgstr "Puede descargar sus datos de Goodreads desde la página de Importación/Exportación de su cuenta de Goodreads." -#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:8 -#: bookwyrm/templates/login.html:49 -msgid "Create an Account" -msgstr "Crear una cuenta" +#: bookwyrm/templates/import/troubleshoot.html:7 +msgid "Failed items" +msgstr "" -#: bookwyrm/templates/invite.html:21 -msgid "Permission Denied" -msgstr "Permiso denegado" +#: bookwyrm/templates/import/troubleshoot.html:12 +msgid "Troubleshooting" +msgstr "" -#: bookwyrm/templates/invite.html:22 -msgid "Sorry! This invite code is no longer valid." -msgstr "¡Disculpa! Este código de invitación no queda válido." +#: bookwyrm/templates/import/troubleshoot.html:20 +msgid "Re-trying an import can fix missing items in cases such as:" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:23 +msgid "The book has been added to the instance since this import" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:24 +msgid "A transient error or timeout caused the external data source to be unavailable." +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:25 +msgid "BookWyrm has been updated since this import with a bug fix" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:28 +msgid "Contact your admin or open an issue if you are seeing unexpected failed items." +msgstr "" #: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:230 #, python-format @@ -1369,6 +1554,20 @@ msgstr "Código de conducta" msgid "Privacy Policy" msgstr "Política de privacidad" +#: bookwyrm/templates/landing/invite.html:4 +#: bookwyrm/templates/landing/invite.html:8 +#: bookwyrm/templates/landing/login.html:49 +msgid "Create an Account" +msgstr "Crear una cuenta" + +#: bookwyrm/templates/landing/invite.html:21 +msgid "Permission Denied" +msgstr "Permiso denegado" + +#: bookwyrm/templates/landing/invite.html:22 +msgid "Sorry! This invite code is no longer valid." +msgstr "¡Disculpa! Este código de invitación no queda válido." + #: bookwyrm/templates/landing/landing.html:6 msgid "Recent Books" msgstr "Libros recientes" @@ -1407,6 +1606,53 @@ msgstr "¡Gracias! Tu solicitud ha sido recibido." msgid "Your Account" msgstr "Tu cuenta" +#: bookwyrm/templates/landing/login.html:4 +msgid "Login" +msgstr "Iniciar sesión" + +#: bookwyrm/templates/landing/login.html:7 +#: bookwyrm/templates/landing/login.html:37 bookwyrm/templates/layout.html:179 +msgid "Log in" +msgstr "Iniciar sesión" + +#: bookwyrm/templates/landing/login.html:15 +msgid "Success! Email address confirmed." +msgstr "¡Éxito! Dirección de correo electrónico confirmada." + +#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:170 +#: bookwyrm/templates/snippets/register_form.html:4 +msgid "Username:" +msgstr "Nombre de usuario:" + +#: bookwyrm/templates/landing/login.html:27 +#: bookwyrm/templates/landing/password_reset.html:17 +#: bookwyrm/templates/layout.html:174 +#: bookwyrm/templates/snippets/register_form.html:22 +msgid "Password:" +msgstr "Contraseña:" + +#: bookwyrm/templates/landing/login.html:40 bookwyrm/templates/layout.html:176 +msgid "Forgot your password?" +msgstr "¿Olvidaste tu contraseña?" + +#: bookwyrm/templates/landing/login.html:62 +msgid "More about this site" +msgstr "Más sobre este sitio" + +#: bookwyrm/templates/landing/password_reset.html:23 +#: bookwyrm/templates/preferences/change_password.html:18 +#: bookwyrm/templates/preferences/delete_user.html:20 +msgid "Confirm password:" +msgstr "Confirmar contraseña:" + +#: bookwyrm/templates/landing/password_reset_request.html:14 +msgid "A link to reset your password will be sent to your email address" +msgstr "Un enlace para restablecer tu contraseña se enviará a tu dirección de correo electrónico" + +#: bookwyrm/templates/landing/password_reset_request.html:28 +msgid "Reset password" +msgstr "Restablecer contraseña" + #: bookwyrm/templates/layout.html:13 #, python-format msgid "%(site_name)s search" @@ -1424,10 +1670,6 @@ msgstr "Menú de navigación central" msgid "Feed" msgstr "Actividad" -#: bookwyrm/templates/layout.html:106 -msgid "Your Books" -msgstr "Tus libros" - #: bookwyrm/templates/layout.html:116 msgid "Settings" msgstr "Configuración" @@ -1454,40 +1696,25 @@ msgstr "Cerrar sesión" msgid "Notifications" msgstr "Notificaciones" -#: bookwyrm/templates/layout.html:170 bookwyrm/templates/layout.html:174 -#: bookwyrm/templates/login.html:21 -#: bookwyrm/templates/snippets/register_form.html:4 -msgid "Username:" -msgstr "Nombre de usuario:" - #: bookwyrm/templates/layout.html:175 msgid "password" msgstr "contraseña" -#: bookwyrm/templates/layout.html:176 bookwyrm/templates/login.html:40 -msgid "Forgot your password?" -msgstr "¿Olvidaste tu contraseña?" - -#: bookwyrm/templates/layout.html:179 bookwyrm/templates/login.html:7 -#: bookwyrm/templates/login.html:37 -msgid "Log in" -msgstr "Iniciar sesión" - #: bookwyrm/templates/layout.html:187 msgid "Join" msgstr "Unirse" #: bookwyrm/templates/layout.html:221 msgid "Successfully posted status" -msgstr "Status publicado exitosamente" +msgstr "Estado publicado con éxito" #: bookwyrm/templates/layout.html:222 msgid "Error posting status" -msgstr "Error en publicar status" +msgstr "Error al publicar el estado" #: bookwyrm/templates/layout.html:234 msgid "Contact site admin" -msgstr "Contactarse con administradores del sitio" +msgstr "Comuníquese con el administrador del sitio" #: bookwyrm/templates/layout.html:238 msgid "Documentation" @@ -1513,10 +1740,15 @@ msgstr "Crear lista" #: bookwyrm/templates/lists/created_text.html:5 #, python-format +msgid "Created by %(username)s and managed by %(groupname)s" +msgstr "Creado por %(username)s y gestionado por %(groupname)s" + +#: bookwyrm/templates/lists/created_text.html:7 +#, python-format msgid "Created and curated by %(username)s" msgstr "Agregado y comisariado por %(username)s" -#: bookwyrm/templates/lists/created_text.html:7 +#: bookwyrm/templates/lists/created_text.html:9 #, python-format msgid "Created by %(username)s" msgstr "Creado por %(username)s" @@ -1537,10 +1769,6 @@ msgstr "¡Está todo listo!" msgid "Suggested by" msgstr "Sugerido por" -#: bookwyrm/templates/lists/curate.html:57 -msgid "Approve" -msgstr "Aprobar" - #: bookwyrm/templates/lists/curate.html:63 msgid "Discard" msgstr "Desechar" @@ -1549,118 +1777,130 @@ msgstr "Desechar" msgid "Delete this list?" msgstr "¿Eliminar esta lista?" -#: bookwyrm/templates/lists/delete_list_modal.html:7 -msgid "This action cannot be un-done" -msgstr "Esta acción no se puede deshacer" - -#: bookwyrm/templates/lists/delete_list_modal.html:15 -#: bookwyrm/templates/settings/announcements/announcement.html:20 -#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49 -#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36 -#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 -#: bookwyrm/templates/snippets/follow_request_buttons.html:12 -msgid "Delete" -msgstr "Eliminar" - #: bookwyrm/templates/lists/edit_form.html:5 #: bookwyrm/templates/lists/layout.html:16 msgid "Edit List" msgstr "Editar lista" -#: bookwyrm/templates/lists/form.html:18 +#: bookwyrm/templates/lists/form.html:19 msgid "List curation:" msgstr "Enumerar lista de comisariado:" -#: bookwyrm/templates/lists/form.html:21 +#: bookwyrm/templates/lists/form.html:22 msgid "Closed" msgstr "Cerrado" -#: bookwyrm/templates/lists/form.html:22 +#: bookwyrm/templates/lists/form.html:23 msgid "Only you can add and remove books to this list" msgstr "Solo tú puedes agregar a y sacar libros de esta lista" -#: bookwyrm/templates/lists/form.html:26 +#: bookwyrm/templates/lists/form.html:27 msgid "Curated" msgstr "De comisariado" -#: bookwyrm/templates/lists/form.html:27 +#: bookwyrm/templates/lists/form.html:28 msgid "Anyone can suggest books, subject to your approval" msgstr "Cualquier usuario puede sugerir libros, en cuanto lo hayas aprobado" -#: bookwyrm/templates/lists/form.html:31 +#: bookwyrm/templates/lists/form.html:32 msgctxt "curation type" msgid "Open" msgstr "Abrir" -#: bookwyrm/templates/lists/form.html:32 +#: bookwyrm/templates/lists/form.html:33 msgid "Anyone can add books to this list" msgstr "Cualquer usuario puede agregar libros a esta lista" -#: bookwyrm/templates/lists/form.html:50 +#: bookwyrm/templates/lists/form.html:37 +msgid "Group" +msgstr "Grupo" + +#: bookwyrm/templates/lists/form.html:38 +msgid "Group members can add to and remove from this list" +msgstr "Los miembros del grupo pueden agregar y eliminar de esta lista" + +#: bookwyrm/templates/lists/form.html:41 +msgid "Select Group" +msgstr "Seleccionar grupo" + +#: bookwyrm/templates/lists/form.html:45 +msgid "Select a group" +msgstr "Seleccionar un grupo" + +#: bookwyrm/templates/lists/form.html:56 +msgid "You don't have any Groups yet!" +msgstr "¡Aún no tienes ningún grupo!" + +#: bookwyrm/templates/lists/form.html:58 +msgid "Create a Group" +msgstr "Crear un grupo" + +#: bookwyrm/templates/lists/form.html:81 msgid "Delete list" msgstr "Eliminar lista" -#: bookwyrm/templates/lists/list.html:20 +#: bookwyrm/templates/lists/list.html:21 msgid "You successfully suggested a book for this list!" msgstr "¡Has sugerido un libro para esta lista exitosamente!" -#: bookwyrm/templates/lists/list.html:22 +#: bookwyrm/templates/lists/list.html:23 msgid "You successfully added a book to this list!" msgstr "¡Has agregado un libro a esta lista exitosamente!" -#: bookwyrm/templates/lists/list.html:28 +#: bookwyrm/templates/lists/list.html:29 msgid "This list is currently empty" msgstr "Esta lista está vacia" -#: bookwyrm/templates/lists/list.html:66 +#: bookwyrm/templates/lists/list.html:67 #, python-format msgid "Added by %(username)s" msgstr "Agregado por %(username)s" -#: bookwyrm/templates/lists/list.html:75 +#: bookwyrm/templates/lists/list.html:76 msgid "List position" msgstr "Posición" -#: bookwyrm/templates/lists/list.html:81 +#: bookwyrm/templates/lists/list.html:82 msgid "Set" msgstr "Establecido" -#: bookwyrm/templates/lists/list.html:91 +#: bookwyrm/templates/lists/list.html:92 +#: bookwyrm/templates/snippets/remove_from_group_button.html:19 #: bookwyrm/templates/snippets/shelf_selector.html:26 msgid "Remove" msgstr "Quitar" -#: bookwyrm/templates/lists/list.html:105 -#: bookwyrm/templates/lists/list.html:122 +#: bookwyrm/templates/lists/list.html:106 +#: bookwyrm/templates/lists/list.html:123 msgid "Sort List" msgstr "Ordena la lista" -#: bookwyrm/templates/lists/list.html:115 +#: bookwyrm/templates/lists/list.html:116 msgid "Direction" msgstr "Dirección" -#: bookwyrm/templates/lists/list.html:129 +#: bookwyrm/templates/lists/list.html:130 msgid "Add Books" msgstr "Agregar libros" -#: bookwyrm/templates/lists/list.html:131 +#: bookwyrm/templates/lists/list.html:132 msgid "Suggest Books" msgstr "Sugerir libros" -#: bookwyrm/templates/lists/list.html:142 +#: bookwyrm/templates/lists/list.html:143 msgid "search" msgstr "buscar" -#: bookwyrm/templates/lists/list.html:148 +#: bookwyrm/templates/lists/list.html:149 msgid "Clear search" msgstr "Borrar búsqueda" -#: bookwyrm/templates/lists/list.html:153 +#: bookwyrm/templates/lists/list.html:154 #, python-format msgid "No books found matching the query \"%(query)s\"" msgstr "No se encontró ningún libro correspondiente a la búsqueda: \"%(query)s\"" -#: bookwyrm/templates/lists/list.html:181 +#: bookwyrm/templates/lists/list.html:182 msgid "Suggest" msgstr "Sugerir" @@ -1672,30 +1912,18 @@ msgstr "Guardado" msgid "Your Lists" msgstr "Tus listas" -#: bookwyrm/templates/lists/lists.html:35 +#: bookwyrm/templates/lists/lists.html:36 msgid "All Lists" msgstr "Todas las listas" -#: bookwyrm/templates/lists/lists.html:39 +#: bookwyrm/templates/lists/lists.html:40 msgid "Saved Lists" msgstr "Listas guardadas" -#: bookwyrm/templates/login.html:4 -msgid "Login" -msgstr "Iniciar sesión" - -#: bookwyrm/templates/login.html:15 -msgid "Success! Email address confirmed." -msgstr "¡Éxito! Dirección de correo electrónico confirmada." - -#: bookwyrm/templates/login.html:27 bookwyrm/templates/password_reset.html:17 -#: bookwyrm/templates/snippets/register_form.html:22 -msgid "Password:" -msgstr "Contraseña:" - -#: bookwyrm/templates/login.html:62 -msgid "More about this site" -msgstr "Más sobre este sitio" +#: bookwyrm/templates/notifications/items/accept.html:16 +#, python-format +msgid "accepted your invitation to join group \"%(group_name)s\"" +msgstr "aceptó su invitación para unirse al grupo «%(group_name)s»" #: bookwyrm/templates/notifications/items/add.html:24 #, python-format @@ -1710,22 +1938,22 @@ msgstr "sugirió agregar %(book_title)s a #: bookwyrm/templates/notifications/items/boost.html:19 #, python-format msgid "boosted your review of %(book_title)s" -msgstr "respaldó tu reseña de %(book_title)s" +msgstr "impulsó tu reseña de %(book_title)s" #: bookwyrm/templates/notifications/items/boost.html:25 #, python-format msgid "boosted your comment on%(book_title)s" -msgstr "respaldó tu comentario en%(book_title)s" +msgstr "impulsó tu comentario en%(book_title)s" #: bookwyrm/templates/notifications/items/boost.html:31 #, python-format msgid "boosted your quote from %(book_title)s" -msgstr "respaldó tucita de %(book_title)s" +msgstr "impulsó tucita de %(book_title)s" #: bookwyrm/templates/notifications/items/boost.html:37 #, python-format msgid "boosted your status" -msgstr "respaldó tu status" +msgstr "impulsó tu estado" #: bookwyrm/templates/notifications/items/fav.html:19 #, python-format @@ -1734,7 +1962,7 @@ msgstr "le gustó tu reseña de %(book_title)s< #: bookwyrm/templates/notifications/items/fav.html:25 #, python-format -msgid "liked your comment on%(book_title)s" +msgid "liked your comment on %(book_title)s" msgstr "le gustó tu comentario sobre %(book_title)s" #: bookwyrm/templates/notifications/items/fav.html:31 @@ -1760,6 +1988,21 @@ msgstr "te quiere seguir" msgid "Your import completed." msgstr "Tu importación ha terminado." +#: bookwyrm/templates/notifications/items/invite.html:15 +#, python-format +msgid "invited you to join the group \"%(group_name)s\"" +msgstr "te invitó a unirte al grupo «%(group_name)s»" + +#: bookwyrm/templates/notifications/items/join.html:16 +#, python-format +msgid "has joined your group \"%(group_name)s\"" +msgstr "se ha unido a tu grupo «%(group_name)s»" + +#: bookwyrm/templates/notifications/items/leave.html:16 +#, python-format +msgid "has left your group \"%(group_name)s\"" +msgstr "ha dejado tu grupo «%(group_name)s»" + #: bookwyrm/templates/notifications/items/mention.html:20 #, python-format msgid "mentioned you in a review of %(book_title)s" @@ -1778,7 +2021,17 @@ msgstr "te mencionó en una cita de %(book_titl #: bookwyrm/templates/notifications/items/mention.html:38 #, python-format msgid "mentioned you in a status" -msgstr "te mencionó en un status" +msgstr "te mencionó en un estado" + +#: bookwyrm/templates/notifications/items/remove.html:17 +#, python-format +msgid "has been removed from your group \"%(group_name)s\"" +msgstr "ha sido eliminado de tu grupo «%(group_name)s»" + +#: bookwyrm/templates/notifications/items/remove.html:23 +#, python-format +msgid "You have been removed from the \"%(group_name)s\" group" +msgstr "Te han eliminado del grupo «%(group_name)s»" #: bookwyrm/templates/notifications/items/reply.html:21 #, python-format @@ -1798,13 +2051,28 @@ msgstr "respondió a tu replied to your status" -msgstr "respondió a tu status" +msgstr "respondió a tu estado" #: bookwyrm/templates/notifications/items/report.html:15 #, python-format msgid "A new report needs moderation." msgstr "Un informe nuevo se requiere moderación." +#: bookwyrm/templates/notifications/items/update.html:16 +#, python-format +msgid "has changed the privacy level for %(group_name)s" +msgstr "ha cambiado el nivel de privacidad del grupo «%(group_name)s»" + +#: bookwyrm/templates/notifications/items/update.html:20 +#, python-format +msgid "has changed the name of %(group_name)s" +msgstr "ha cambiado el nombre del grupo «%(group_name)s»" + +#: bookwyrm/templates/notifications/items/update.html:24 +#, python-format +msgid "has changed the description of %(group_name)s" +msgstr "ha cambiado la descripción del grupo «%(group_name)s»" + #: bookwyrm/templates/notifications/notifications_page.html:18 msgid "Delete notifications" msgstr "Borrar notificaciones" @@ -1821,20 +2089,6 @@ msgstr "Menciones" msgid "You're all caught up!" msgstr "¡Estás al día!" -#: bookwyrm/templates/password_reset.html:23 -#: bookwyrm/templates/preferences/change_password.html:18 -#: bookwyrm/templates/preferences/delete_user.html:20 -msgid "Confirm password:" -msgstr "Confirmar contraseña:" - -#: bookwyrm/templates/password_reset_request.html:14 -msgid "A link to reset your password will be sent to your email address" -msgstr "Un enlace para restablecer tu contraseña se enviará a tu dirección de correo electrónico" - -#: bookwyrm/templates/password_reset_request.html:28 -msgid "Reset password" -msgstr "Restablecer contraseña" - #: bookwyrm/templates/preferences/blocks.html:4 #: bookwyrm/templates/preferences/blocks.html:7 #: bookwyrm/templates/preferences/layout.html:31 @@ -1870,7 +2124,7 @@ msgstr "Eliminar cuenta permanentemente" #: bookwyrm/templates/preferences/delete_user.html:14 msgid "Deleting your account cannot be undone. The username will not be available to register in the future." -msgstr "Eliminar tu cuenta no puede ser deshecho. El nombre de usuario no será disponible para registrar en el futuro." +msgstr "La eliminación de tu cuenta no se puede deshacer. El nombre de usuario no estará disponible para registrarse en el futuro." #: bookwyrm/templates/preferences/edit_user.html:4 #: bookwyrm/templates/preferences/edit_user.html:7 @@ -1896,7 +2150,7 @@ msgstr "Privacidad" #: bookwyrm/templates/preferences/edit_user.html:72 msgid "Show reading goal prompt in feed:" -msgstr "Mostrar sugerencia de meta de lectura en el feed:" +msgstr "Mostrar indicador de objetivo de lectura en el feed:" #: bookwyrm/templates/preferences/edit_user.html:76 msgid "Show suggested users:" @@ -2025,7 +2279,7 @@ msgstr "Fecha final:" #: bookwyrm/templates/settings/announcements/announcement.html:60 #: bookwyrm/templates/settings/announcements/announcement_form.html:58 msgid "Active:" -msgstr "Activ@:" +msgstr "Activo:" #: bookwyrm/templates/settings/announcements/announcement_form.html:8 #: bookwyrm/templates/settings/announcements/announcements.html:8 @@ -2067,15 +2321,6 @@ msgstr "Fecha de inicio" msgid "End date" msgstr "Fecha final" -#: bookwyrm/templates/settings/announcements/announcements.html:38 -#: bookwyrm/templates/settings/federation/instance_list.html:46 -#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44 -#: bookwyrm/templates/settings/invites/status_filter.html:5 -#: bookwyrm/templates/settings/users/user_admin.html:34 -#: bookwyrm/templates/settings/users/user_info.html:20 -msgid "Status" -msgstr "Estado" - #: bookwyrm/templates/settings/announcements/announcements.html:48 msgid "active" msgstr "activo" @@ -2149,7 +2394,7 @@ msgstr "Actividad de inscripciones de usuarios" #: bookwyrm/templates/settings/dashboard/dashboard.html:112 msgid "Status activity" -msgstr "Actividad de status" +msgstr "Actividad de estado" #: bookwyrm/templates/settings/dashboard/dashboard.html:118 msgid "Works created" @@ -2161,7 +2406,7 @@ msgstr "Inscripciones" #: bookwyrm/templates/settings/dashboard/status_chart.html:11 msgid "Statuses posted" -msgstr "Statuses publicados" +msgstr "Estados publicados" #: bookwyrm/templates/settings/dashboard/user_chart.html:11 msgid "Total" @@ -2257,7 +2502,7 @@ msgid "Details" msgstr "Detalles" #: bookwyrm/templates/settings/federation/instance.html:35 -#: bookwyrm/templates/user/layout.html:63 +#: bookwyrm/templates/user/layout.html:64 msgid "Activity" msgstr "Actividad" @@ -2551,15 +2796,15 @@ msgstr "Comentario" #: bookwyrm/templates/settings/reports/report.html:46 msgid "Reported statuses" -msgstr "Statuses reportados" +msgstr "Estados reportados" #: bookwyrm/templates/settings/reports/report.html:48 msgid "No statuses reported" -msgstr "Ningún estatus reportado" +msgstr "No se reportaron estados" #: bookwyrm/templates/settings/reports/report.html:54 msgid "Status has been deleted" -msgstr "Status ha sido eliminado" +msgstr "El estado ha sido eliminado" #: bookwyrm/templates/settings/reports/report_preview.html:13 msgid "No notes provided" @@ -2833,53 +3078,66 @@ msgstr "Crear estante" msgid "Edit Shelf" msgstr "Editar estante" -#: bookwyrm/templates/shelf/shelf.html:28 bookwyrm/views/shelf.py:55 +#: bookwyrm/templates/shelf/shelf.html:28 bookwyrm/views/shelf/shelf.py:53 msgid "All books" msgstr "Todos los libros" -#: bookwyrm/templates/shelf/shelf.html:55 +#: bookwyrm/templates/shelf/shelf.html:69 msgid "Create shelf" msgstr "Crear estante" -#: bookwyrm/templates/shelf/shelf.html:77 +#: bookwyrm/templates/shelf/shelf.html:90 #, python-format msgid "%(formatted_count)s book" msgid_plural "%(formatted_count)s books" msgstr[0] "%(formatted_count)s libro" msgstr[1] "%(formatted_count)s libros" -#: bookwyrm/templates/shelf/shelf.html:84 +#: bookwyrm/templates/shelf/shelf.html:97 #, python-format msgid "(showing %(start)s-%(end)s)" msgstr "(mostrando %(start)s-%(end)s)" -#: bookwyrm/templates/shelf/shelf.html:96 +#: bookwyrm/templates/shelf/shelf.html:109 msgid "Edit shelf" msgstr "Editar estante" -#: bookwyrm/templates/shelf/shelf.html:104 +#: bookwyrm/templates/shelf/shelf.html:117 msgid "Delete shelf" msgstr "Eliminar estante" -#: bookwyrm/templates/shelf/shelf.html:132 -#: bookwyrm/templates/shelf/shelf.html:158 +#: bookwyrm/templates/shelf/shelf.html:145 +#: bookwyrm/templates/shelf/shelf.html:171 msgid "Shelved" msgstr "Archivado" -#: bookwyrm/templates/shelf/shelf.html:133 -#: bookwyrm/templates/shelf/shelf.html:161 +#: bookwyrm/templates/shelf/shelf.html:146 +#: bookwyrm/templates/shelf/shelf.html:174 msgid "Started" msgstr "Empezado" -#: bookwyrm/templates/shelf/shelf.html:134 -#: bookwyrm/templates/shelf/shelf.html:164 +#: bookwyrm/templates/shelf/shelf.html:147 +#: bookwyrm/templates/shelf/shelf.html:177 msgid "Finished" msgstr "Terminado" -#: bookwyrm/templates/shelf/shelf.html:190 +#: bookwyrm/templates/shelf/shelf.html:203 msgid "This shelf is empty." msgstr "Este estante está vacio." +#: bookwyrm/templates/snippets/add_to_group_button.html:15 +msgid "Invite" +msgstr "Invitar" + +#: bookwyrm/templates/snippets/add_to_group_button.html:24 +msgid "Uninvite" +msgstr "Anular la invitación" + +#: bookwyrm/templates/snippets/add_to_group_button.html:28 +#, python-format +msgid "Remove @%(username)s" +msgstr "Eliminar a @%(username)s" + #: bookwyrm/templates/snippets/announcement.html:31 #, python-format msgid "Posted by %(username)s" @@ -2904,16 +3162,12 @@ msgstr "%(title)s por" #: bookwyrm/templates/snippets/boost_button.html:20 #: bookwyrm/templates/snippets/boost_button.html:21 msgid "Boost" -msgstr "Respaldar" +msgstr "Impulsar" #: bookwyrm/templates/snippets/boost_button.html:33 #: bookwyrm/templates/snippets/boost_button.html:34 msgid "Un-boost" -msgstr "Des-respaldar" - -#: bookwyrm/templates/snippets/create_status.html:17 -msgid "Review" -msgstr "Reseña" +msgstr "Des-impulsar" #: bookwyrm/templates/snippets/create_status.html:39 msgid "Quote" @@ -2948,7 +3202,7 @@ msgstr "de %(pages)s páginas" #: bookwyrm/templates/snippets/status/layout.html:52 #: bookwyrm/templates/snippets/status/layout.html:53 msgid "Reply" -msgstr "Respuesta" +msgstr "Responder" #: bookwyrm/templates/snippets/create_status/content_field.html:17 msgid "Content" @@ -2975,6 +3229,7 @@ msgstr "Comentario:" #: bookwyrm/templates/snippets/privacy-icons.html:15 #: bookwyrm/templates/snippets/privacy-icons.html:16 #: bookwyrm/templates/snippets/privacy_select.html:20 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:17 msgid "Private" msgstr "Privada" @@ -3050,7 +3305,7 @@ msgstr "Borrar filtros" #: bookwyrm/templates/snippets/follow_button.html:14 #, python-format msgid "Follow @%(username)s" -msgstr "Seguir @%(username)s" +msgstr "Seguir a @%(username)s" #: bookwyrm/templates/snippets/follow_button.html:16 msgid "Follow" @@ -3063,13 +3318,14 @@ msgstr "Des-enviar solicitud de seguidor" #: bookwyrm/templates/snippets/follow_button.html:30 #, python-format msgid "Unfollow @%(username)s" -msgstr "Dejar de seguir @%(username)s" +msgstr "Dejar de seguir a @%(username)s" #: bookwyrm/templates/snippets/follow_button.html:32 msgid "Unfollow" msgstr "Dejar de seguir" #: bookwyrm/templates/snippets/follow_request_buttons.html:7 +#: bookwyrm/templates/snippets/join_invitation_buttons.html:8 msgid "Accept" msgstr "Aceptar" @@ -3097,7 +3353,7 @@ msgstr[1] "%(rating)s estrellas" #, python-format msgid "set a goal to read %(counter)s book in %(year)s" msgid_plural "set a goal to read %(counter)s books in %(year)s" -msgstr[0] "estableció una meta de leer %(counter)s libro en %(year)s" +msgstr[0] "establecer el objetivo de leer %(counter)s libro en %(year)s" msgstr[1] "estableció una meta de leer %(counter)s libros en %(year)s" #: bookwyrm/templates/snippets/generated_status/rating.html:3 @@ -3126,7 +3382,7 @@ msgstr "Establece una meta para cuantos libros leerás en %(year)s, y seguir tu #: bookwyrm/templates/snippets/goal_form.html:16 msgid "Reading goal:" -msgstr "Meta de lectura:" +msgstr "Objetivo de lectura:" #: bookwyrm/templates/snippets/goal_form.html:21 msgid "books" @@ -3134,12 +3390,12 @@ msgstr "libros" #: bookwyrm/templates/snippets/goal_form.html:26 msgid "Goal privacy:" -msgstr "Privacidad de meta:" +msgstr "Privacidad del objetivo:" #: bookwyrm/templates/snippets/goal_form.html:33 #: bookwyrm/templates/snippets/reading_modals/layout.html:13 msgid "Post to feed" -msgstr "Compartir con tu feed" +msgstr "Publicar en el feed" #: bookwyrm/templates/snippets/goal_form.html:37 msgid "Set goal" @@ -3148,7 +3404,7 @@ msgstr "Establecer meta" #: bookwyrm/templates/snippets/goal_progress.html:9 #, python-format msgid "%(percent)s%% complete!" -msgstr "%(percent)s%% terminado!" +msgstr "¡%(percent)s%% terminado!" #: bookwyrm/templates/snippets/goal_progress.html:12 #, python-format @@ -3181,12 +3437,14 @@ msgstr "Siguiente" #: bookwyrm/templates/snippets/privacy-icons.html:3 #: bookwyrm/templates/snippets/privacy-icons.html:4 #: bookwyrm/templates/snippets/privacy_select.html:11 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:11 msgid "Public" msgstr "Público" #: bookwyrm/templates/snippets/privacy-icons.html:7 #: bookwyrm/templates/snippets/privacy-icons.html:8 #: bookwyrm/templates/snippets/privacy_select.html:14 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:14 msgid "Unlisted" msgstr "Privado" @@ -3195,6 +3453,7 @@ msgid "Followers-only" msgstr "Solo seguidores" #: bookwyrm/templates/snippets/privacy_select.html:6 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:6 msgid "Post privacy" msgstr "Privacidad de publicación" @@ -3235,7 +3494,7 @@ msgstr "(Opcional)" #: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:5 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:50 msgid "Update progress" -msgstr "Progreso de actualización" +msgstr "Actualizar progreso" #: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:6 #, python-format @@ -3306,7 +3565,7 @@ msgstr "Advertencia de contenido" #: bookwyrm/templates/snippets/status/content_status.html:79 msgid "Show status" -msgstr "Ver status" +msgstr "Mostrar estado" #: bookwyrm/templates/snippets/status/content_status.html:101 #, python-format @@ -3324,7 +3583,7 @@ msgstr "Abrir imagen en una nueva ventana" #: bookwyrm/templates/snippets/status/content_status.html:144 msgid "Hide status" -msgstr "Ocultar status" +msgstr "Ocultar estado" #: bookwyrm/templates/snippets/status/header.html:45 #, python-format @@ -3336,10 +3595,10 @@ msgstr "editado %(date)s" msgid "commented on %(book)s" msgstr "comentó en \"%(book)s\"" -#: bookwyrm/templates/snippets/status/headers/note.html:15 +#: bookwyrm/templates/snippets/status/headers/note.html:8 #, python-format msgid "replied to %(username)s's status" -msgstr "respondió al status de %(username)s" +msgstr "respondió al estado de %(username)s" #: bookwyrm/templates/snippets/status/headers/quotation.html:2 #, python-format @@ -3379,12 +3638,12 @@ msgstr "Eliminar status" #: bookwyrm/templates/snippets/status/layout.html:56 #: bookwyrm/templates/snippets/status/layout.html:57 msgid "Boost status" -msgstr "Respaldar status" +msgstr "Impulsar estado" #: bookwyrm/templates/snippets/status/layout.html:60 #: bookwyrm/templates/snippets/status/layout.html:61 msgid "Like status" -msgstr "Me gusta status" +msgstr "Me gusta estado" #: bookwyrm/templates/snippets/status/status.html:10 msgid "boosted" @@ -3395,25 +3654,6 @@ msgstr "respaldó" msgid "More options" msgstr "Más opciones" -#: bookwyrm/templates/snippets/suggested_users.html:16 -#, python-format -msgid "%(mutuals)s follower you follow" -msgid_plural "%(mutuals)s followers you follow" -msgstr[0] "%(mutuals)s seguidor que sigues" -msgstr[1] "%(mutuals)s seguidores que sigues" - -#: bookwyrm/templates/snippets/suggested_users.html:23 -#, python-format -msgid "%(shared_books)s book on your shelves" -msgid_plural "%(shared_books)s books on your shelves" -msgstr[0] "%(shared_books)s libro en tus estantes" -msgstr[1] "%(shared_books)s libros en tus estantes" - -#: bookwyrm/templates/snippets/suggested_users.html:31 -#: bookwyrm/templates/user/user_preview.html:36 -msgid "Follows you" -msgstr "Te sigue" - #: bookwyrm/templates/snippets/switch_edition_button.html:5 msgid "Switch to this edition" msgstr "Cambiar a esta edición" @@ -3434,7 +3674,11 @@ msgstr "Mostrar más" msgid "Show less" msgstr "Mostrar menos" -#: bookwyrm/templates/user/books_header.html:5 +#: bookwyrm/templates/user/books_header.html:10 +msgid "Your books" +msgstr "Tus libros" + +#: bookwyrm/templates/user/books_header.html:15 #, python-format msgid "%(username)s's books" msgstr "Los libros de %(username)s" @@ -3442,7 +3686,7 @@ msgstr "Los libros de %(username)s" #: bookwyrm/templates/user/goal.html:8 #, python-format msgid "%(year)s Reading Progress" -msgstr "%(year)s Progreso de la meta de lectura" +msgstr "Progreso de lectura de %(year)s" #: bookwyrm/templates/user/goal.html:12 msgid "Edit Goal" @@ -3451,7 +3695,7 @@ msgstr "Editar meta" #: bookwyrm/templates/user/goal.html:28 #, python-format msgid "%(name)s hasn't set a reading goal for %(year)s." -msgstr "%(name)s no ha establecido una meta de lectura para %(year)s." +msgstr "%(name)s no se ha fijado un objetivo de lectura para %(year)s." #: bookwyrm/templates/user/goal.html:40 #, python-format @@ -3463,17 +3707,34 @@ msgstr "Tus libros de %(year)s" msgid "%(username)s's %(year)s Books" msgstr "Los libros de %(username)s para %(year)s" -#: bookwyrm/templates/user/layout.html:18 bookwyrm/templates/user/user.html:10 +#: bookwyrm/templates/user/groups.html:9 +msgid "Your Groups" +msgstr "Tus grupos" + +#: bookwyrm/templates/user/groups.html:11 +#, python-format +msgid "Groups: %(username)s" +msgstr "Grupos: %(username)s" + +#: bookwyrm/templates/user/groups.html:17 +msgid "Create group" +msgstr "Crear grupo" + +#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:10 msgid "User Profile" msgstr "Perfil de usuario" -#: bookwyrm/templates/user/layout.html:44 +#: bookwyrm/templates/user/layout.html:45 msgid "Follow Requests" msgstr "Solicitudes de seguidor" -#: bookwyrm/templates/user/layout.html:69 +#: bookwyrm/templates/user/layout.html:70 msgid "Reading Goal" -msgstr "Meta de lectura" +msgstr "Objetivo de lectura" + +#: bookwyrm/templates/user/layout.html:76 +msgid "Groups" +msgstr "Grupos" #: bookwyrm/templates/user/lists.html:11 #, python-format @@ -3506,7 +3767,7 @@ msgstr "Editar perfil" #: bookwyrm/templates/user/user.html:33 #, python-format msgid "View all %(size)s" -msgstr "Ver todos los %(size)s" +msgstr "Ver los %(size)s" #: bookwyrm/templates/user/user.html:46 msgid "View all books" @@ -3514,7 +3775,7 @@ msgstr "Ver todos los libros" #: bookwyrm/templates/user/user.html:59 msgid "User Activity" -msgstr "Actividad de usuario" +msgstr "Actividad del usuario" #: bookwyrm/templates/user/user.html:63 msgid "RSS feed" @@ -3561,19 +3822,19 @@ msgstr "Archivo excede el tamaño máximo: 10MB" msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/views/import_data.py:67 +#: bookwyrm/views/imports/import_data.py:64 msgid "Not a valid csv file" msgstr "No un archivo csv válido" -#: bookwyrm/views/login.py:69 +#: bookwyrm/views/landing/login.py:69 msgid "Username or password are incorrect" msgstr "Nombre de usuario o contraseña es incorrecta" -#: bookwyrm/views/password.py:32 +#: bookwyrm/views/landing/password.py:32 msgid "No user with that email address was found." msgstr "No se pudo encontrar un usuario con esa dirección de correo electrónico." -#: bookwyrm/views/password.py:41 +#: bookwyrm/views/landing/password.py:43 #, python-brace-format msgid "A password reset link was sent to {email}" msgstr "Un enlace para reestablecer tu contraseña se envió a {email}" diff --git a/locale/fr_FR/LC_MESSAGES/django.mo b/locale/fr_FR/LC_MESSAGES/django.mo index 5e8dfa66..1e81ac6e 100644 Binary files a/locale/fr_FR/LC_MESSAGES/django.mo and b/locale/fr_FR/LC_MESSAGES/django.mo differ diff --git a/locale/fr_FR/LC_MESSAGES/django.po b/locale/fr_FR/LC_MESSAGES/django.po index 141bd894..ee9850e2 100644 --- a/locale/fr_FR/LC_MESSAGES/django.po +++ b/locale/fr_FR/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-15 22:03+0000\n" -"PO-Revision-Date: 2021-10-16 14:36\n" +"POT-Creation-Date: 2021-11-14 15:08+0000\n" +"PO-Revision-Date: 2021-11-15 22:27\n" "Last-Translator: Mouse Reeve \n" "Language-Team: French\n" "Language: fr\n" @@ -40,47 +40,48 @@ msgstr "Sans expiration" #: bookwyrm/forms.py:263 #, python-brace-format msgid "{i} uses" -msgstr "" +msgstr "{i} utilisations" #: bookwyrm/forms.py:264 msgid "Unlimited" msgstr "Sans limite" -#: bookwyrm/forms.py:326 +#: bookwyrm/forms.py:332 msgid "List Order" msgstr "Ordre de la liste" -#: bookwyrm/forms.py:327 +#: bookwyrm/forms.py:333 msgid "Book Title" msgstr "Titre du livre" -#: bookwyrm/forms.py:328 bookwyrm/templates/shelf/shelf.html:136 -#: bookwyrm/templates/shelf/shelf.html:168 +#: bookwyrm/forms.py:334 bookwyrm/templates/shelf/shelf.html:149 +#: bookwyrm/templates/shelf/shelf.html:181 #: bookwyrm/templates/snippets/create_status/review.html:33 msgid "Rating" msgstr "Note" -#: bookwyrm/forms.py:330 bookwyrm/templates/lists/list.html:109 +#: bookwyrm/forms.py:336 bookwyrm/templates/lists/list.html:110 msgid "Sort By" msgstr "Trier par" -#: bookwyrm/forms.py:334 +#: bookwyrm/forms.py:340 msgid "Ascending" msgstr "Ordre croissant" -#: bookwyrm/forms.py:335 +#: bookwyrm/forms.py:341 msgid "Descending" msgstr "Ordre décroissant" -#: bookwyrm/importers/importer.py:75 +#: bookwyrm/importers/importer.py:127 msgid "Error loading book" msgstr "Erreur lors du chargement du livre" -#: bookwyrm/importers/importer.py:88 +#: bookwyrm/importers/importer.py:135 msgid "Could not find a match for book" msgstr "Impossible de trouver une correspondance pour le livre" #: bookwyrm/models/base_model.py:17 +#: bookwyrm/templates/import/import_status.html:171 msgid "Pending" msgstr "En attente" @@ -98,27 +99,27 @@ msgstr "Suppression du modérateur" #: bookwyrm/models/base_model.py:21 msgid "Domain block" -msgstr "" +msgstr "Bloc de domaine" -#: bookwyrm/models/book.py:232 +#: bookwyrm/models/book.py:233 msgid "Audiobook" msgstr "Livre audio" -#: bookwyrm/models/book.py:233 +#: bookwyrm/models/book.py:234 msgid "eBook" msgstr "eBook" -#: bookwyrm/models/book.py:234 +#: bookwyrm/models/book.py:235 msgid "Graphic novel" msgstr "Roman Graphique" -#: bookwyrm/models/book.py:235 +#: bookwyrm/models/book.py:236 msgid "Hardcover" msgstr "Couverture rigide" -#: bookwyrm/models/book.py:236 +#: bookwyrm/models/book.py:237 msgid "Paperback" -msgstr "" +msgstr "Couverture souple" #: bookwyrm/models/federated_server.py:11 #: bookwyrm/templates/settings/federation/edit_instance.html:42 @@ -133,21 +134,21 @@ msgstr "Fédéré" msgid "Blocked" msgstr "Bloqué" -#: bookwyrm/models/fields.py:27 +#: bookwyrm/models/fields.py:29 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "%(value)s n’est pas une remote_id valide." -#: bookwyrm/models/fields.py:36 bookwyrm/models/fields.py:45 +#: bookwyrm/models/fields.py:38 bookwyrm/models/fields.py:47 #, python-format msgid "%(value)s is not a valid username" msgstr "%(value)s n’est pas un nom de compte valide." -#: bookwyrm/models/fields.py:181 bookwyrm/templates/layout.html:171 +#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:171 msgid "username" msgstr "nom du compte :" -#: bookwyrm/models/fields.py:186 +#: bookwyrm/models/fields.py:188 msgid "A user with that username already exists." msgstr "Ce nom est déjà associé à un compte." @@ -161,11 +162,11 @@ msgstr "Accueil" #: bookwyrm/settings.py:119 msgid "Books Timeline" -msgstr "" +msgstr "Actualité de mes livres" #: bookwyrm/settings.py:119 bookwyrm/templates/search/layout.html:21 #: bookwyrm/templates/search/layout.html:42 -#: bookwyrm/templates/user/layout.html:81 +#: bookwyrm/templates/user/layout.html:88 msgid "Books" msgstr "Livres" @@ -187,7 +188,7 @@ msgstr "Français" #: bookwyrm/settings.py:169 msgid "Português - Brasil (Brazilian Portuguese)" -msgstr "" +msgstr "Português - Brasil (Portugais brésilien)" #: bookwyrm/settings.py:170 msgid "简体中文 (Simplified Chinese)" @@ -223,7 +224,7 @@ msgid "Edit Author" msgstr "Modifier l’auteur ou autrice" #: bookwyrm/templates/author/author.html:34 -#: bookwyrm/templates/author/edit_author.html:41 +#: bookwyrm/templates/author/edit_author.html:43 msgid "Aliases:" msgstr "Pseudonymes :" @@ -260,7 +261,7 @@ msgstr "Voir sur Goodreads" #: bookwyrm/templates/author/author.html:108 #, python-format msgid "Books by %(name)s" -msgstr "Livres par %(name)s" +msgstr "Livres de %(name)s" #: bookwyrm/templates/author/edit_author.html:5 msgid "Edit Author:" @@ -276,71 +277,72 @@ msgstr "Ajouté :" msgid "Updated:" msgstr "Mis à jour :" -#: bookwyrm/templates/author/edit_author.html:15 +#: bookwyrm/templates/author/edit_author.html:16 #: bookwyrm/templates/book/edit/edit_book.html:25 msgid "Last edited by:" msgstr "Dernière modification par :" -#: bookwyrm/templates/author/edit_author.html:31 +#: bookwyrm/templates/author/edit_author.html:33 #: bookwyrm/templates/book/edit/edit_book_form.html:15 msgid "Metadata" msgstr "Métadonnées" -#: bookwyrm/templates/author/edit_author.html:33 -#: bookwyrm/templates/lists/form.html:8 bookwyrm/templates/shelf/form.html:9 +#: bookwyrm/templates/author/edit_author.html:35 +#: bookwyrm/templates/lists/form.html:9 bookwyrm/templates/shelf/form.html:9 msgid "Name:" msgstr "Nom :" -#: bookwyrm/templates/author/edit_author.html:43 +#: bookwyrm/templates/author/edit_author.html:45 #: bookwyrm/templates/book/edit/edit_book_form.html:65 #: bookwyrm/templates/book/edit/edit_book_form.html:79 #: bookwyrm/templates/book/edit/edit_book_form.html:124 msgid "Separate multiple values with commas." msgstr "Séparez plusieurs valeurs par une virgule." -#: bookwyrm/templates/author/edit_author.html:50 +#: bookwyrm/templates/author/edit_author.html:52 msgid "Bio:" msgstr "Bio :" -#: bookwyrm/templates/author/edit_author.html:57 +#: bookwyrm/templates/author/edit_author.html:59 msgid "Wikipedia link:" msgstr "Wikipedia :" -#: bookwyrm/templates/author/edit_author.html:63 +#: bookwyrm/templates/author/edit_author.html:65 msgid "Birth date:" msgstr "Date de naissance :" -#: bookwyrm/templates/author/edit_author.html:71 +#: bookwyrm/templates/author/edit_author.html:73 msgid "Death date:" msgstr "Date de décès :" -#: bookwyrm/templates/author/edit_author.html:79 +#: bookwyrm/templates/author/edit_author.html:81 msgid "Author Identifiers" msgstr "Identifiants de l’auteur ou autrice" -#: bookwyrm/templates/author/edit_author.html:81 +#: bookwyrm/templates/author/edit_author.html:83 msgid "Openlibrary key:" msgstr "Clé Openlibrary :" -#: bookwyrm/templates/author/edit_author.html:89 +#: bookwyrm/templates/author/edit_author.html:91 #: bookwyrm/templates/book/edit/edit_book_form.html:224 msgid "Inventaire ID:" msgstr "Identifiant Inventaire :" -#: bookwyrm/templates/author/edit_author.html:97 +#: bookwyrm/templates/author/edit_author.html:99 msgid "Librarything key:" msgstr "Clé Librarything :" -#: bookwyrm/templates/author/edit_author.html:105 +#: bookwyrm/templates/author/edit_author.html:107 msgid "Goodreads key:" msgstr "Clé Goodreads :" -#: bookwyrm/templates/author/edit_author.html:116 +#: bookwyrm/templates/author/edit_author.html:118 #: bookwyrm/templates/book/book.html:140 #: bookwyrm/templates/book/edit/edit_book.html:110 #: bookwyrm/templates/book/readthrough.html:76 +#: bookwyrm/templates/groups/form.html:24 #: bookwyrm/templates/lists/bookmark_button.html:15 -#: bookwyrm/templates/lists/form.html:44 +#: bookwyrm/templates/lists/form.html:75 #: bookwyrm/templates/preferences/edit_user.html:124 #: bookwyrm/templates/settings/announcements/announcement_form.html:69 #: bookwyrm/templates/settings/federation/edit_instance.html:74 @@ -352,11 +354,13 @@ msgstr "Clé Goodreads :" msgid "Save" msgstr "Enregistrer" -#: bookwyrm/templates/author/edit_author.html:117 +#: bookwyrm/templates/author/edit_author.html:119 #: bookwyrm/templates/book/book.html:141 bookwyrm/templates/book/book.html:190 #: bookwyrm/templates/book/cover_modal.html:32 -#: bookwyrm/templates/book/edit/edit_book.html:111 +#: bookwyrm/templates/book/edit/edit_book.html:112 +#: bookwyrm/templates/book/edit/edit_book.html:115 #: bookwyrm/templates/book/readthrough.html:77 +#: bookwyrm/templates/groups/delete_group_modal.html:17 #: bookwyrm/templates/lists/delete_list_modal.html:17 #: bookwyrm/templates/settings/federation/instance.html:88 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:17 @@ -369,7 +373,7 @@ msgstr "Annuler" #: bookwyrm/templates/landing/large-book.html:25 #: bookwyrm/templates/landing/small-book.html:18 msgid "by" -msgstr "par" +msgstr "de" #: bookwyrm/templates/book/book.html:55 bookwyrm/templates/book/book.html:56 msgid "Edit Book" @@ -397,7 +401,7 @@ msgstr "Ajouter une description" #: bookwyrm/templates/book/book.html:136 #: bookwyrm/templates/book/edit/edit_book_form.html:34 -#: bookwyrm/templates/lists/form.html:12 bookwyrm/templates/shelf/form.html:17 +#: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Description :" @@ -460,7 +464,7 @@ msgstr "Lieux" #: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12 #: bookwyrm/templates/search/layout.html:25 #: bookwyrm/templates/search/layout.html:50 -#: bookwyrm/templates/user/layout.html:75 +#: bookwyrm/templates/user/layout.html:82 msgid "Lists" msgstr "Listes" @@ -470,7 +474,7 @@ msgstr "Ajouter à la liste" #: bookwyrm/templates/book/book.html:315 #: bookwyrm/templates/book/cover_modal.html:31 -#: bookwyrm/templates/lists/list.html:181 +#: bookwyrm/templates/lists/list.html:182 #: bookwyrm/templates/settings/email_blocklist/domain_form.html:26 #: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:32 msgid "Add" @@ -543,7 +547,9 @@ msgid "This is a new work" msgstr "Il s’agit d’un nouvel ouvrage." #: bookwyrm/templates/book/edit/edit_book.html:97 -#: bookwyrm/templates/password_reset.html:30 +#: bookwyrm/templates/groups/members.html:16 +#: bookwyrm/templates/landing/password_reset.html:30 +#: bookwyrm/templates/snippets/remove_from_group_button.html:16 msgid "Confirm" msgstr "Confirmer" @@ -612,7 +618,7 @@ msgid "John Doe, Jane Smith" msgstr "Claude Dupont, Dominique Durand" #: bookwyrm/templates/book/edit/edit_book_form.html:132 -#: bookwyrm/templates/shelf/shelf.html:127 +#: bookwyrm/templates/shelf/shelf.html:140 msgid "Cover" msgstr "Couverture" @@ -753,7 +759,7 @@ msgstr "Aide" #: bookwyrm/templates/compose.html:5 bookwyrm/templates/compose.html:8 msgid "Edit status" -msgstr "" +msgstr "Modifier le statut" #: bookwyrm/templates/confirm_email/confirm_email.html:4 msgid "Confirm email" @@ -793,7 +799,7 @@ msgstr "Envoyer le lien de confirmation de nouveau" #: bookwyrm/templates/confirm_email/resend_form.html:11 #: bookwyrm/templates/landing/layout.html:67 -#: bookwyrm/templates/password_reset_request.html:18 +#: bookwyrm/templates/landing/password_reset_request.html:18 #: bookwyrm/templates/preferences/edit_user.html:56 #: bookwyrm/templates/snippets/register_form.html:13 msgid "Email address:" @@ -887,25 +893,40 @@ msgstr "Comptes BookWyrm" msgid "All known users" msgstr "Tous les comptes connus" -#: bookwyrm/templates/discover/card-header.html:9 +#: bookwyrm/templates/discover/card-header.html:8 #, python-format -msgid "%(username)s rated %(book_title)s" -msgstr "" +msgid "%(username)s wants to read %(book_title)s" +msgstr "%(username)s veut lire %(book_title)s" #: bookwyrm/templates/discover/card-header.html:13 #, python-format -msgid "%(username)s reviewed %(book_title)s" -msgstr "" +msgid "%(username)s finished reading %(book_title)s" +msgstr "%(username)s a terminé %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:17 +#: bookwyrm/templates/discover/card-header.html:18 +#, python-format +msgid "%(username)s started reading %(book_title)s" +msgstr "%(username)s a commencé %(book_title)s" + +#: bookwyrm/templates/discover/card-header.html:23 +#, python-format +msgid "%(username)s rated %(book_title)s" +msgstr "%(username)s a noté %(book_title)s" + +#: bookwyrm/templates/discover/card-header.html:27 +#, python-format +msgid "%(username)s reviewed %(book_title)s" +msgstr "%(username)s a critiqué %(book_title)s" + +#: bookwyrm/templates/discover/card-header.html:31 #, python-format msgid "%(username)s commented on %(book_title)s" -msgstr "" +msgstr "%(username)s a commenté %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:21 +#: bookwyrm/templates/discover/card-header.html:35 #, python-format msgid "%(username)s quoted %(book_title)s" -msgstr "" +msgstr "%(username)s a cité un passage de %(book_title)s" #: bookwyrm/templates/discover/discover.html:4 #: bookwyrm/templates/discover/discover.html:10 @@ -921,7 +942,7 @@ msgstr "Voir les nouveautés de la communauté locale %(site_name)s" #: bookwyrm/templates/discover/large-book.html:52 #: bookwyrm/templates/discover/small-book.html:36 msgid "View status" -msgstr "Afficher tous les status" +msgstr "Afficher le statut" #: bookwyrm/templates/email/confirm/html_content.html:6 #: bookwyrm/templates/email/confirm/text_content.html:4 @@ -974,7 +995,7 @@ msgstr "S’enregistrer maintenant" #: bookwyrm/templates/email/invite/html_content.html:15 #, python-format msgid "Learn more about %(site_name)s." -msgstr "" +msgstr "En savoir plus sur %(site_name)s." #: bookwyrm/templates/email/invite/text_content.html:4 #, python-format @@ -984,7 +1005,7 @@ msgstr "Vous avez reçu une invitation à rejoindre %(site_name)s ! Cliquez le #: bookwyrm/templates/email/invite/text_content.html:8 #, python-format msgid "Learn more about %(site_name)s:" -msgstr "" +msgstr "En savoir plus sur %(site_name)s :" #: bookwyrm/templates/email/password_reset/html_content.html:6 #: bookwyrm/templates/email/password_reset/text_content.html:4 @@ -993,10 +1014,10 @@ msgid "You requested to reset your %(site_name)s password. Click the link below msgstr "Une demande de réinitialisation de votre mot de passe sur %(site_name)s a été initialisée. Cliquez le lien suivant pour définir un nouveau mot de passe et vous connecter à votre compte." #: bookwyrm/templates/email/password_reset/html_content.html:9 -#: bookwyrm/templates/password_reset.html:4 -#: bookwyrm/templates/password_reset.html:10 -#: bookwyrm/templates/password_reset_request.html:4 -#: bookwyrm/templates/password_reset_request.html:10 +#: bookwyrm/templates/landing/password_reset.html:4 +#: bookwyrm/templates/landing/password_reset.html:10 +#: bookwyrm/templates/landing/password_reset_request.html:4 +#: bookwyrm/templates/landing/password_reset_request.html:10 msgid "Reset Password" msgstr "Changez le mot de passe" @@ -1053,10 +1074,9 @@ msgstr "Vous pouvez définir ou changer votre défi lecture à n’importe quel msgid "Updates" msgstr "Mises à jour" -#: bookwyrm/templates/feed/layout.html:12 -#: bookwyrm/templates/user/books_header.html:3 -msgid "Your books" -msgstr "Vos livres" +#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:106 +msgid "Your Books" +msgstr "Vos Livres" #: bookwyrm/templates/feed/layout.html:14 msgid "There are no books here right now! Try searching for a book to get started" @@ -1064,11 +1084,13 @@ msgstr "Aucun livre ici pour l’instant ! Cherchez un livre pour commencer" #: bookwyrm/templates/feed/layout.html:25 #: bookwyrm/templates/shelf/shelf.html:38 +#: bookwyrm/templates/user/books_header.html:4 msgid "To Read" msgstr "À lire" #: bookwyrm/templates/feed/layout.html:26 #: bookwyrm/templates/shelf/shelf.html:40 +#: bookwyrm/templates/user/books_header.html:6 msgid "Currently Reading" msgstr "Lectures en cours" @@ -1076,6 +1098,7 @@ msgstr "Lectures en cours" #: bookwyrm/templates/shelf/shelf.html:42 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:23 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12 +#: bookwyrm/templates/user/books_header.html:8 msgid "Read" msgstr "Lu" @@ -1102,7 +1125,7 @@ msgid "What are you reading?" msgstr "Que lisez‑vous ?" #: bookwyrm/templates/get_started/books.html:9 -#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:137 +#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:138 msgid "Search for a book" msgstr "Chercher un livre" @@ -1120,8 +1143,9 @@ msgstr "Vous pourrez ajouter des livres lorsque vous commencerez à utiliser %(s #: bookwyrm/templates/get_started/books.html:17 #: bookwyrm/templates/get_started/users.html:18 #: bookwyrm/templates/get_started/users.html:19 -#: bookwyrm/templates/layout.html:51 bookwyrm/templates/layout.html:52 -#: bookwyrm/templates/lists/list.html:141 +#: bookwyrm/templates/groups/group.html:19 +#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:51 +#: bookwyrm/templates/layout.html:52 bookwyrm/templates/lists/list.html:142 #: bookwyrm/templates/search/layout.html:4 #: bookwyrm/templates/search/layout.html:9 msgid "Search" @@ -1137,7 +1161,7 @@ msgid "Popular on %(site_name)s" msgstr "Populaire sur %(site_name)s" #: bookwyrm/templates/get_started/books.html:58 -#: bookwyrm/templates/lists/list.html:154 +#: bookwyrm/templates/lists/list.html:155 msgid "No books found" msgstr "Aucun livre trouvé" @@ -1223,9 +1247,110 @@ msgstr "Chercher un compte" msgid "No users found for \"%(query)s\"" msgstr "Aucun compte trouvé pour « %(query)s »" +#: bookwyrm/templates/groups/create_form.html:5 +msgid "Create Group" +msgstr "Créer un Groupe" + +#: bookwyrm/templates/groups/created_text.html:4 +#, python-format +msgid "Managed by %(username)s" +msgstr "Géré par %(username)s" + +#: bookwyrm/templates/groups/delete_group_modal.html:4 +msgid "Delete this group?" +msgstr "Supprimer ce groupe ?" + +#: bookwyrm/templates/groups/delete_group_modal.html:7 +#: bookwyrm/templates/lists/delete_list_modal.html:7 +msgid "This action cannot be un-done" +msgstr "Cette action ne peut pas être annulée" + +#: bookwyrm/templates/groups/delete_group_modal.html:15 +#: bookwyrm/templates/lists/delete_list_modal.html:15 +#: bookwyrm/templates/settings/announcements/announcement.html:20 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36 +#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 +#: bookwyrm/templates/snippets/follow_request_buttons.html:12 +#: bookwyrm/templates/snippets/join_invitation_buttons.html:13 +msgid "Delete" +msgstr "Supprimer" + +#: bookwyrm/templates/groups/edit_form.html:5 +msgid "Edit Group" +msgstr "Modifier le Groupe" + +#: bookwyrm/templates/groups/find_users.html:6 +msgid "Add new members!" +msgstr "Ajouter de nouveaux membres !" + +#: bookwyrm/templates/groups/form.html:8 +msgid "Group Name:" +msgstr "Nom du groupe :" + +#: bookwyrm/templates/groups/form.html:12 +msgid "Group Description:" +msgstr "Description du groupe :" + +#: bookwyrm/templates/groups/form.html:30 +msgid "Delete group" +msgstr "Supprimer le groupe" + +#: bookwyrm/templates/groups/group.html:15 +msgid "Search to add a user" +msgstr "Chercher et ajouter un·e utilisateur·rice" + +#: bookwyrm/templates/groups/group.html:36 +msgid "This group has no lists" +msgstr "Ce groupe n'a pas de liste" + +#: bookwyrm/templates/groups/layout.html:16 +msgid "Edit group" +msgstr "Modifier le groupe" + +#: bookwyrm/templates/groups/members.html:8 +msgid "Members can add and remove books on a group's book lists" +msgstr "Les membres peuvent ajouter et supprimer des livres sur les listes de livres d'un groupe" + +#: bookwyrm/templates/groups/members.html:19 +msgid "Leave group" +msgstr "Quitter le groupe" + +#: bookwyrm/templates/groups/members.html:41 +#: bookwyrm/templates/groups/suggested_users.html:32 +#: bookwyrm/templates/snippets/suggested_users.html:31 +#: bookwyrm/templates/user/user_preview.html:36 +msgid "Follows you" +msgstr "Vous suit" + +#: bookwyrm/templates/groups/suggested_users.html:17 +#: bookwyrm/templates/snippets/suggested_users.html:16 +#, python-format +msgid "%(mutuals)s follower you follow" +msgid_plural "%(mutuals)s followers you follow" +msgstr[0] "%(mutuals)s abonné(e) que vous suivez" +msgstr[1] "%(mutuals)s abonné(e)s que vous suivez" + +#: bookwyrm/templates/groups/suggested_users.html:24 +#: bookwyrm/templates/snippets/suggested_users.html:23 +#, python-format +msgid "%(shared_books)s book on your shelves" +msgid_plural "%(shared_books)s books on your shelves" +msgstr[0] "%(shared_books)s livre sur vos étagères" +msgstr[1] "%(shared_books)s livres sur vos étagères" + +#: bookwyrm/templates/groups/suggested_users.html:40 +#, python-format +msgid "No potential members found for \"%(user_query)s\"" +msgstr "Aucun membre potentiel trouvé pour \"%(user_query)s\"" + +#: bookwyrm/templates/groups/user_groups.html:15 +msgid "Manager" +msgstr "Responsable" + #: bookwyrm/templates/import/import.html:5 #: bookwyrm/templates/import/import.html:9 -#: bookwyrm/templates/shelf/shelf.html:57 +#: bookwyrm/templates/shelf/shelf.html:61 msgid "Import Books" msgstr "Importer des livres" @@ -1259,100 +1384,160 @@ msgid "No recent imports" msgstr "Aucune importation récente" #: bookwyrm/templates/import/import_status.html:6 -#: bookwyrm/templates/import/import_status.html:10 +#: bookwyrm/templates/import/import_status.html:15 +#: bookwyrm/templates/import/import_status.html:29 msgid "Import Status" msgstr "Statut de l’importation" -#: bookwyrm/templates/import/import_status.html:11 -msgid "Back to imports" -msgstr "Retourner à l’importation" +#: bookwyrm/templates/import/import_status.html:13 +#: bookwyrm/templates/import/import_status.html:27 +msgid "Retry Status" +msgstr "" -#: bookwyrm/templates/import/import_status.html:15 +#: bookwyrm/templates/import/import_status.html:22 +msgid "Imports" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:39 msgid "Import started:" msgstr "Début de l’importation :" -#: bookwyrm/templates/import/import_status.html:20 -msgid "Import completed:" -msgstr "Fin de l’importation :" - -#: bookwyrm/templates/import/import_status.html:24 -msgid "TASK FAILED" -msgstr "la tâche a échoué" - -#: bookwyrm/templates/import/import_status.html:32 -msgid "Import still in progress." -msgstr "L’importation est toujours en cours" - -#: bookwyrm/templates/import/import_status.html:34 -msgid "(Hit reload to update!)" -msgstr "(Rechargez la page pour la mettre à jour !)" - -#: bookwyrm/templates/import/import_status.html:41 -msgid "Failed to load" -msgstr "Éléments non importés" +#: bookwyrm/templates/import/import_status.html:48 +msgid "In progress" +msgstr "" #: bookwyrm/templates/import/import_status.html:50 -#, python-format -msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import." -msgstr "Sauter en bas de liste pour sélectionner les %(failed_count)s items n’ayant pu être importés." +msgid "Refresh" +msgstr "" #: bookwyrm/templates/import/import_status.html:62 #, python-format -msgid "Line %(index)s: %(title)s by %(author)s" -msgstr "Ligne %(index)s : %(title)s par %(author)s" +msgid "%(display_counter)s item needs manual approval." +msgid_plural "%(display_counter)s items need manual approval." +msgstr[0] "" +msgstr[1] "" -#: bookwyrm/templates/import/import_status.html:82 -msgid "Select all" -msgstr "Tout sélectionner" +#: bookwyrm/templates/import/import_status.html:67 +#: bookwyrm/templates/import/manual_review.html:8 +msgid "Review items" +msgstr "" -#: bookwyrm/templates/import/import_status.html:85 -msgid "Retry items" -msgstr "Réessayer l’importation de ces éléments" +#: bookwyrm/templates/import/import_status.html:73 +#, python-format +msgid "%(display_counter)s item failed to import." +msgid_plural "%(display_counter)s items failed to import." +msgstr[0] "" +msgstr[1] "" -#: bookwyrm/templates/import/import_status.html:112 -msgid "Successfully imported" -msgstr "Importation réussie" +#: bookwyrm/templates/import/import_status.html:79 +msgid "View and troubleshoot failed items" +msgstr "" -#: bookwyrm/templates/import/import_status.html:114 -msgid "Import Progress" -msgstr "Importation en cours" +#: bookwyrm/templates/import/import_status.html:91 +msgid "Row" +msgstr "" -#: bookwyrm/templates/import/import_status.html:119 -msgid "Book" -msgstr "Livre" - -#: bookwyrm/templates/import/import_status.html:122 -#: bookwyrm/templates/shelf/shelf.html:128 -#: bookwyrm/templates/shelf/shelf.html:150 +#: bookwyrm/templates/import/import_status.html:94 +#: bookwyrm/templates/shelf/shelf.html:141 +#: bookwyrm/templates/shelf/shelf.html:163 msgid "Title" msgstr "Titre" -#: bookwyrm/templates/import/import_status.html:125 -#: bookwyrm/templates/shelf/shelf.html:129 -#: bookwyrm/templates/shelf/shelf.html:153 +#: bookwyrm/templates/import/import_status.html:97 +msgid "ISBN" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:100 +#: bookwyrm/templates/shelf/shelf.html:142 +#: bookwyrm/templates/shelf/shelf.html:166 msgid "Author" msgstr "Auteur/autrice" -#: bookwyrm/templates/import/import_status.html:148 +#: bookwyrm/templates/import/import_status.html:103 +msgid "Shelf" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:106 +#: bookwyrm/templates/import/manual_review.html:13 +#: bookwyrm/templates/snippets/create_status.html:17 +msgid "Review" +msgstr "Critique" + +#: bookwyrm/templates/import/import_status.html:110 +msgid "Book" +msgstr "Livre" + +#: bookwyrm/templates/import/import_status.html:113 +#: bookwyrm/templates/settings/announcements/announcements.html:38 +#: bookwyrm/templates/settings/federation/instance_list.html:46 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44 +#: bookwyrm/templates/settings/invites/status_filter.html:5 +#: bookwyrm/templates/settings/users/user_admin.html:34 +#: bookwyrm/templates/settings/users/user_info.html:20 +msgid "Status" +msgstr "Statut" + +#: bookwyrm/templates/import/import_status.html:144 +msgid "View imported review" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:158 msgid "Imported" msgstr "Importé" -#: bookwyrm/templates/import/tooltip.html:6 -msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." +#: bookwyrm/templates/import/import_status.html:164 +msgid "Needs manual review" msgstr "" -#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:8 -#: bookwyrm/templates/login.html:49 -msgid "Create an Account" -msgstr "Créer un compte" +#: bookwyrm/templates/import/manual_review.html:5 +#: bookwyrm/templates/import/troubleshoot.html:4 +msgid "Import Troubleshooting" +msgstr "" -#: bookwyrm/templates/invite.html:21 -msgid "Permission Denied" -msgstr "Autorisation refusée" +#: bookwyrm/templates/import/manual_review.html:21 +msgid "Approving a suggestion will permanently add the suggested book to your shelves and associate your reading dates, reviews, and ratings with that book." +msgstr "" -#: bookwyrm/templates/invite.html:22 -msgid "Sorry! This invite code is no longer valid." -msgstr "Cette invitation n’est plus valide ; désolé !" +#: bookwyrm/templates/import/manual_review.html:56 +#: bookwyrm/templates/lists/curate.html:57 +msgid "Approve" +msgstr "Approuver" + +#: bookwyrm/templates/import/manual_review.html:64 +msgid "Reject" +msgstr "" + +#: bookwyrm/templates/import/tooltip.html:6 +msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." +msgstr "Vous pouvez télécharger vos données GoodReads depuis la page Import/Export de votre compte GoodReads." + +#: bookwyrm/templates/import/troubleshoot.html:7 +msgid "Failed items" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:12 +msgid "Troubleshooting" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:20 +msgid "Re-trying an import can fix missing items in cases such as:" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:23 +msgid "The book has been added to the instance since this import" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:24 +msgid "A transient error or timeout caused the external data source to be unavailable." +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:25 +msgid "BookWyrm has been updated since this import with a bug fix" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:28 +msgid "Contact your admin or open an issue if you are seeing unexpected failed items." +msgstr "" #: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:230 #, python-format @@ -1369,6 +1554,20 @@ msgstr "Code de conduite" msgid "Privacy Policy" msgstr "Politique de vie privée" +#: bookwyrm/templates/landing/invite.html:4 +#: bookwyrm/templates/landing/invite.html:8 +#: bookwyrm/templates/landing/login.html:49 +msgid "Create an Account" +msgstr "Créer un compte" + +#: bookwyrm/templates/landing/invite.html:21 +msgid "Permission Denied" +msgstr "Autorisation refusée" + +#: bookwyrm/templates/landing/invite.html:22 +msgid "Sorry! This invite code is no longer valid." +msgstr "Cette invitation n’est plus valide ; désolé !" + #: bookwyrm/templates/landing/landing.html:6 msgid "Recent Books" msgstr "Livres récents" @@ -1407,6 +1606,53 @@ msgstr "Merci ! Votre demande a bien été reçue." msgid "Your Account" msgstr "Votre compte" +#: bookwyrm/templates/landing/login.html:4 +msgid "Login" +msgstr "Connexion" + +#: bookwyrm/templates/landing/login.html:7 +#: bookwyrm/templates/landing/login.html:37 bookwyrm/templates/layout.html:179 +msgid "Log in" +msgstr "Se connecter" + +#: bookwyrm/templates/landing/login.html:15 +msgid "Success! Email address confirmed." +msgstr "Bravo ! L’adresse email a été confirmée." + +#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:170 +#: bookwyrm/templates/snippets/register_form.html:4 +msgid "Username:" +msgstr "Nom du compte :" + +#: bookwyrm/templates/landing/login.html:27 +#: bookwyrm/templates/landing/password_reset.html:17 +#: bookwyrm/templates/layout.html:174 +#: bookwyrm/templates/snippets/register_form.html:22 +msgid "Password:" +msgstr "Mot de passe :" + +#: bookwyrm/templates/landing/login.html:40 bookwyrm/templates/layout.html:176 +msgid "Forgot your password?" +msgstr "Mot de passe oublié ?" + +#: bookwyrm/templates/landing/login.html:62 +msgid "More about this site" +msgstr "En savoir plus sur ce site" + +#: bookwyrm/templates/landing/password_reset.html:23 +#: bookwyrm/templates/preferences/change_password.html:18 +#: bookwyrm/templates/preferences/delete_user.html:20 +msgid "Confirm password:" +msgstr "Confirmez le mot de passe :" + +#: bookwyrm/templates/landing/password_reset_request.html:14 +msgid "A link to reset your password will be sent to your email address" +msgstr "Un lien pour changer votre mot de passe sera envoyé à votre addresse email" + +#: bookwyrm/templates/landing/password_reset_request.html:28 +msgid "Reset password" +msgstr "Changer de mot de passe" + #: bookwyrm/templates/layout.html:13 #, python-format msgid "%(site_name)s search" @@ -1424,10 +1670,6 @@ msgstr "Menu de navigation principal " msgid "Feed" msgstr "Fil d’actualité" -#: bookwyrm/templates/layout.html:106 -msgid "Your Books" -msgstr "Vos Livres" - #: bookwyrm/templates/layout.html:116 msgid "Settings" msgstr "Paramètres" @@ -1454,25 +1696,10 @@ msgstr "Se déconnecter" msgid "Notifications" msgstr "Notifications" -#: bookwyrm/templates/layout.html:170 bookwyrm/templates/layout.html:174 -#: bookwyrm/templates/login.html:21 -#: bookwyrm/templates/snippets/register_form.html:4 -msgid "Username:" -msgstr "Nom du compte :" - #: bookwyrm/templates/layout.html:175 msgid "password" msgstr "Mot de passe" -#: bookwyrm/templates/layout.html:176 bookwyrm/templates/login.html:40 -msgid "Forgot your password?" -msgstr "Mot de passe oublié ?" - -#: bookwyrm/templates/layout.html:179 bookwyrm/templates/login.html:7 -#: bookwyrm/templates/login.html:37 -msgid "Log in" -msgstr "Se connecter" - #: bookwyrm/templates/layout.html:187 msgid "Join" msgstr "Rejoindre" @@ -1513,10 +1740,15 @@ msgstr "Créer une liste" #: bookwyrm/templates/lists/created_text.html:5 #, python-format +msgid "Created by %(username)s and managed by %(groupname)s" +msgstr "Créé par %(username)s et géré par %(groupname)s" + +#: bookwyrm/templates/lists/created_text.html:7 +#, python-format msgid "Created and curated by %(username)s" msgstr "Créée et modérée par %(username)s" -#: bookwyrm/templates/lists/created_text.html:7 +#: bookwyrm/templates/lists/created_text.html:9 #, python-format msgid "Created by %(username)s" msgstr "Créée par %(username)s" @@ -1537,10 +1769,6 @@ msgstr "Aucun livre en attente de validation !" msgid "Suggested by" msgstr "Suggéré par" -#: bookwyrm/templates/lists/curate.html:57 -msgid "Approve" -msgstr "Approuver" - #: bookwyrm/templates/lists/curate.html:63 msgid "Discard" msgstr "Rejeter" @@ -1549,118 +1777,130 @@ msgstr "Rejeter" msgid "Delete this list?" msgstr "Supprimer cette liste ?" -#: bookwyrm/templates/lists/delete_list_modal.html:7 -msgid "This action cannot be un-done" -msgstr "Cette action ne peut pas être annulée" - -#: bookwyrm/templates/lists/delete_list_modal.html:15 -#: bookwyrm/templates/settings/announcements/announcement.html:20 -#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49 -#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36 -#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 -#: bookwyrm/templates/snippets/follow_request_buttons.html:12 -msgid "Delete" -msgstr "Supprimer" - #: bookwyrm/templates/lists/edit_form.html:5 #: bookwyrm/templates/lists/layout.html:16 msgid "Edit List" msgstr "Modifier la liste" -#: bookwyrm/templates/lists/form.html:18 +#: bookwyrm/templates/lists/form.html:19 msgid "List curation:" msgstr "Modération de la liste :" -#: bookwyrm/templates/lists/form.html:21 +#: bookwyrm/templates/lists/form.html:22 msgid "Closed" msgstr "Fermée" -#: bookwyrm/templates/lists/form.html:22 +#: bookwyrm/templates/lists/form.html:23 msgid "Only you can add and remove books to this list" msgstr "Vous seulement pouvez ajouter ou retirer des livres dans cette liste" -#: bookwyrm/templates/lists/form.html:26 +#: bookwyrm/templates/lists/form.html:27 msgid "Curated" msgstr "Modérée" -#: bookwyrm/templates/lists/form.html:27 +#: bookwyrm/templates/lists/form.html:28 msgid "Anyone can suggest books, subject to your approval" msgstr "N’importe qui peut suggérer des livres, soumis à votre approbation" -#: bookwyrm/templates/lists/form.html:31 +#: bookwyrm/templates/lists/form.html:32 msgctxt "curation type" msgid "Open" msgstr "Ouvrir" -#: bookwyrm/templates/lists/form.html:32 +#: bookwyrm/templates/lists/form.html:33 msgid "Anyone can add books to this list" msgstr "N’importe qui peut suggérer des livres" -#: bookwyrm/templates/lists/form.html:50 +#: bookwyrm/templates/lists/form.html:37 +msgid "Group" +msgstr "Groupe" + +#: bookwyrm/templates/lists/form.html:38 +msgid "Group members can add to and remove from this list" +msgstr "Les membres du groupe peuvent ajouter et supprimer des livres de cette liste" + +#: bookwyrm/templates/lists/form.html:41 +msgid "Select Group" +msgstr "Sélectionner un Groupe" + +#: bookwyrm/templates/lists/form.html:45 +msgid "Select a group" +msgstr "Sélectionner un groupe" + +#: bookwyrm/templates/lists/form.html:56 +msgid "You don't have any Groups yet!" +msgstr "Vous n'avez pas encore de Groupe !" + +#: bookwyrm/templates/lists/form.html:58 +msgid "Create a Group" +msgstr "Créer un Groupe" + +#: bookwyrm/templates/lists/form.html:81 msgid "Delete list" msgstr "Supprimer la liste" -#: bookwyrm/templates/lists/list.html:20 +#: bookwyrm/templates/lists/list.html:21 msgid "You successfully suggested a book for this list!" msgstr "Vous avez suggéré un livre à cette liste !" -#: bookwyrm/templates/lists/list.html:22 +#: bookwyrm/templates/lists/list.html:23 msgid "You successfully added a book to this list!" msgstr "Vous avez ajouté un livre à cette liste !" -#: bookwyrm/templates/lists/list.html:28 +#: bookwyrm/templates/lists/list.html:29 msgid "This list is currently empty" msgstr "Cette liste est actuellement vide" -#: bookwyrm/templates/lists/list.html:66 +#: bookwyrm/templates/lists/list.html:67 #, python-format msgid "Added by %(username)s" msgstr "Ajouté par %(username)s" -#: bookwyrm/templates/lists/list.html:75 +#: bookwyrm/templates/lists/list.html:76 msgid "List position" msgstr "Position" -#: bookwyrm/templates/lists/list.html:81 +#: bookwyrm/templates/lists/list.html:82 msgid "Set" msgstr "Appliquer" -#: bookwyrm/templates/lists/list.html:91 +#: bookwyrm/templates/lists/list.html:92 +#: bookwyrm/templates/snippets/remove_from_group_button.html:19 #: bookwyrm/templates/snippets/shelf_selector.html:26 msgid "Remove" msgstr "Retirer" -#: bookwyrm/templates/lists/list.html:105 -#: bookwyrm/templates/lists/list.html:122 +#: bookwyrm/templates/lists/list.html:106 +#: bookwyrm/templates/lists/list.html:123 msgid "Sort List" msgstr "Trier la liste" -#: bookwyrm/templates/lists/list.html:115 +#: bookwyrm/templates/lists/list.html:116 msgid "Direction" msgstr "Direction" -#: bookwyrm/templates/lists/list.html:129 +#: bookwyrm/templates/lists/list.html:130 msgid "Add Books" msgstr "Ajouter des livres" -#: bookwyrm/templates/lists/list.html:131 +#: bookwyrm/templates/lists/list.html:132 msgid "Suggest Books" msgstr "Suggérer des livres" -#: bookwyrm/templates/lists/list.html:142 +#: bookwyrm/templates/lists/list.html:143 msgid "search" msgstr "chercher" -#: bookwyrm/templates/lists/list.html:148 +#: bookwyrm/templates/lists/list.html:149 msgid "Clear search" msgstr "Vider la requête" -#: bookwyrm/templates/lists/list.html:153 +#: bookwyrm/templates/lists/list.html:154 #, python-format msgid "No books found matching the query \"%(query)s\"" msgstr "Aucun livre trouvé pour la requête « %(query)s »" -#: bookwyrm/templates/lists/list.html:181 +#: bookwyrm/templates/lists/list.html:182 msgid "Suggest" msgstr "Suggérer" @@ -1672,30 +1912,18 @@ msgstr "Sauvegardé" msgid "Your Lists" msgstr "Vos listes" -#: bookwyrm/templates/lists/lists.html:35 +#: bookwyrm/templates/lists/lists.html:36 msgid "All Lists" msgstr "Toutes les listes" -#: bookwyrm/templates/lists/lists.html:39 +#: bookwyrm/templates/lists/lists.html:40 msgid "Saved Lists" msgstr "Listes sauvegardées" -#: bookwyrm/templates/login.html:4 -msgid "Login" -msgstr "Connexion" - -#: bookwyrm/templates/login.html:15 -msgid "Success! Email address confirmed." -msgstr "Bravo ! L’adresse email a été confirmée." - -#: bookwyrm/templates/login.html:27 bookwyrm/templates/password_reset.html:17 -#: bookwyrm/templates/snippets/register_form.html:22 -msgid "Password:" -msgstr "Mot de passe :" - -#: bookwyrm/templates/login.html:62 -msgid "More about this site" -msgstr "En savoir plus sur ce site" +#: bookwyrm/templates/notifications/items/accept.html:16 +#, python-format +msgid "accepted your invitation to join group \"%(group_name)s\"" +msgstr "a accepté votre invitation à rejoindre le groupe \"%(group_name)s\"" #: bookwyrm/templates/notifications/items/add.html:24 #, python-format @@ -1730,22 +1958,22 @@ msgstr "a partagé votre statut" #: bookwyrm/templates/notifications/items/fav.html:19 #, python-format msgid "liked your review of %(book_title)s" -msgstr "" +msgstr "a ajouté votre critique de %(book_title)s à ses favoris" #: bookwyrm/templates/notifications/items/fav.html:25 #, python-format -msgid "liked your comment on%(book_title)s" -msgstr "" +msgid "liked your comment on %(book_title)s" +msgstr "a ajouté votre commentaire sur %(book_title)s à ses favoris" #: bookwyrm/templates/notifications/items/fav.html:31 #, python-format msgid "liked your quote from %(book_title)s" -msgstr "" +msgstr "a ajouté votre citation de %(book_title)s à ses favoris" #: bookwyrm/templates/notifications/items/fav.html:37 #, python-format msgid "liked your status" -msgstr "" +msgstr "a ajouté votre statut à ses favoris" #: bookwyrm/templates/notifications/items/follow.html:15 msgid "followed you" @@ -1760,6 +1988,21 @@ msgstr "vous a envoyé une demande d’abonnement" msgid "Your import completed." msgstr "Votre importation est terminée." +#: bookwyrm/templates/notifications/items/invite.html:15 +#, python-format +msgid "invited you to join the group \"%(group_name)s\"" +msgstr "vous a invité·e à rejoindre le groupe \"%(group_name)s\"" + +#: bookwyrm/templates/notifications/items/join.html:16 +#, python-format +msgid "has joined your group \"%(group_name)s\"" +msgstr "a rejoint votre groupe \"%(group_name)s\"" + +#: bookwyrm/templates/notifications/items/leave.html:16 +#, python-format +msgid "has left your group \"%(group_name)s\"" +msgstr "a quitté votre groupe \"%(group_name)s\"" + #: bookwyrm/templates/notifications/items/mention.html:20 #, python-format msgid "mentioned you in a review of %(book_title)s" @@ -1780,6 +2023,16 @@ msgstr "vous a mentionné dans sa citation de % msgid "mentioned you in a status" msgstr "vous a mentionné dans son statut" +#: bookwyrm/templates/notifications/items/remove.html:17 +#, python-format +msgid "has been removed from your group \"%(group_name)s\"" +msgstr "a été retiré·e de votre groupe \"%(group_name)s\"" + +#: bookwyrm/templates/notifications/items/remove.html:23 +#, python-format +msgid "You have been removed from the \"%(group_name)s\" group" +msgstr "Vous avez été retiré·e du groupe \"%(group_name)s\"" + #: bookwyrm/templates/notifications/items/reply.html:21 #, python-format msgid "replied to your review of %(book_title)s" @@ -1805,6 +2058,21 @@ msgstr "a répondu à votre report needs moderation." msgstr "Un nouveau signalement a besoin d’être traité." +#: bookwyrm/templates/notifications/items/update.html:16 +#, python-format +msgid "has changed the privacy level for %(group_name)s" +msgstr "a changé le niveau de confidentialité du groupe %(group_name)s" + +#: bookwyrm/templates/notifications/items/update.html:20 +#, python-format +msgid "has changed the name of %(group_name)s" +msgstr "a changé le nom du groupe %(group_name)s" + +#: bookwyrm/templates/notifications/items/update.html:24 +#, python-format +msgid "has changed the description of %(group_name)s" +msgstr "a changé la description du groupe %(group_name)s" + #: bookwyrm/templates/notifications/notifications_page.html:18 msgid "Delete notifications" msgstr "Supprimer les notifications" @@ -1821,20 +2089,6 @@ msgstr "Mentions" msgid "You're all caught up!" msgstr "Aucune nouvelle notification !" -#: bookwyrm/templates/password_reset.html:23 -#: bookwyrm/templates/preferences/change_password.html:18 -#: bookwyrm/templates/preferences/delete_user.html:20 -msgid "Confirm password:" -msgstr "Confirmez le mot de passe :" - -#: bookwyrm/templates/password_reset_request.html:14 -msgid "A link to reset your password will be sent to your email address" -msgstr "Un lien pour changer votre mot de passe sera envoyé à votre addresse email" - -#: bookwyrm/templates/password_reset_request.html:28 -msgid "Reset password" -msgstr "Changer de mot de passe" - #: bookwyrm/templates/preferences/blocks.html:4 #: bookwyrm/templates/preferences/blocks.html:7 #: bookwyrm/templates/preferences/layout.html:31 @@ -1896,7 +2150,7 @@ msgstr "Confidentialité" #: bookwyrm/templates/preferences/edit_user.html:72 msgid "Show reading goal prompt in feed:" -msgstr "" +msgstr "Afficher l'invite d'objectif de lecture dans le fil d'actualité :" #: bookwyrm/templates/preferences/edit_user.html:76 msgid "Show suggested users:" @@ -1936,7 +2190,7 @@ msgstr "Commencer \"%(book_title)s\"" #: bookwyrm/templates/reading_progress/want.html:5 #, python-format msgid "Want to Read \"%(book_title)s\"" -msgstr "" +msgstr "Je veux lire \"%(book_title)s\"" #: bookwyrm/templates/search/book.html:47 #: bookwyrm/templates/settings/reports/reports.html:25 @@ -2042,7 +2296,7 @@ msgstr "Contenu :" #: bookwyrm/templates/settings/announcements/announcement_form.html:30 msgid "Event date:" -msgstr "" +msgstr "Date de l'événement :" #: bookwyrm/templates/settings/announcements/announcements.html:3 #: bookwyrm/templates/settings/announcements/announcements.html:5 @@ -2067,15 +2321,6 @@ msgstr "Date de début" msgid "End date" msgstr "Date de fin" -#: bookwyrm/templates/settings/announcements/announcements.html:38 -#: bookwyrm/templates/settings/federation/instance_list.html:46 -#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44 -#: bookwyrm/templates/settings/invites/status_filter.html:5 -#: bookwyrm/templates/settings/users/user_admin.html:34 -#: bookwyrm/templates/settings/users/user_info.html:20 -msgid "Status" -msgstr "Statut" - #: bookwyrm/templates/settings/announcements/announcements.html:48 msgid "active" msgstr "active" @@ -2086,54 +2331,54 @@ msgstr "inactive" #: bookwyrm/templates/settings/announcements/announcements.html:52 msgid "No announcements found" -msgstr "" +msgstr "Aucune annonce trouvée" #: bookwyrm/templates/settings/dashboard/dashboard.html:6 #: bookwyrm/templates/settings/dashboard/dashboard.html:8 #: bookwyrm/templates/settings/layout.html:26 msgid "Dashboard" -msgstr "" +msgstr "Tableau de bord" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 #: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Total users" -msgstr "" +msgstr "Nombre total d'utilisateurs·rices" #: bookwyrm/templates/settings/dashboard/dashboard.html:21 #: bookwyrm/templates/settings/dashboard/user_chart.html:16 msgid "Active this month" -msgstr "" +msgstr "Actifs ce mois" #: bookwyrm/templates/settings/dashboard/dashboard.html:27 msgid "Statuses" -msgstr "" +msgstr "Statuts" #: bookwyrm/templates/settings/dashboard/dashboard.html:33 #: bookwyrm/templates/settings/dashboard/works_chart.html:11 msgid "Works" -msgstr "" +msgstr "Œuvres" #: bookwyrm/templates/settings/dashboard/dashboard.html:43 #, python-format msgid "%(display_count)s open report" msgid_plural "%(display_count)s open reports" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%(display_count)s signalement ouvert" +msgstr[1] "%(display_count)s signalements ouverts" #: bookwyrm/templates/settings/dashboard/dashboard.html:54 #, python-format msgid "%(display_count)s invite request" msgid_plural "%(display_count)s invite requests" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%(display_count)s demande d'invitation" +msgstr[1] "%(display_count)s demandes d'invitation" #: bookwyrm/templates/settings/dashboard/dashboard.html:65 msgid "Instance Activity" -msgstr "" +msgstr "Activité de l'instance" #: bookwyrm/templates/settings/dashboard/dashboard.html:83 msgid "Interval:" -msgstr "" +msgstr "Intervalle :" #: bookwyrm/templates/settings/dashboard/dashboard.html:87 msgid "Days" @@ -2145,15 +2390,15 @@ msgstr "Semaines" #: bookwyrm/templates/settings/dashboard/dashboard.html:106 msgid "User signup activity" -msgstr "" +msgstr "Nouvelles inscriptions" #: bookwyrm/templates/settings/dashboard/dashboard.html:112 msgid "Status activity" -msgstr "" +msgstr "Nouveaux statuts" #: bookwyrm/templates/settings/dashboard/dashboard.html:118 msgid "Works created" -msgstr "" +msgstr "Œuvres créées" #: bookwyrm/templates/settings/dashboard/registration_chart.html:10 msgid "Registrations" @@ -2161,26 +2406,26 @@ msgstr "Inscriptions" #: bookwyrm/templates/settings/dashboard/status_chart.html:11 msgid "Statuses posted" -msgstr "" +msgstr "Statuts publiés" #: bookwyrm/templates/settings/dashboard/user_chart.html:11 msgid "Total" -msgstr "" +msgstr "Total" #: bookwyrm/templates/settings/email_blocklist/domain_form.html:5 #: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:10 msgid "Add domain" -msgstr "" +msgstr "Ajouter un domaine" #: bookwyrm/templates/settings/email_blocklist/domain_form.html:11 msgid "Domain:" -msgstr "" +msgstr "Domaine :" #: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:5 #: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:7 #: bookwyrm/templates/settings/layout.html:59 msgid "Email Blocklist" -msgstr "" +msgstr "Liste des e-mails bloqués" #: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:18 msgid "When someone tries to register with an email from this domain, no account will be created. The registration process will appear to have worked." @@ -2188,7 +2433,7 @@ msgstr "Quand quelqu'un essaiera de s'inscrire avec un e-mail de ce domaine, auc #: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:25 msgid "Domain" -msgstr "" +msgstr "Domaine" #: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:29 #: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:27 @@ -2199,12 +2444,12 @@ msgstr "Options" #, python-format msgid "%(display_count)s user" msgid_plural "%(display_count)s users" -msgstr[0] "%(display_count)s utilisateur" -msgstr[1] "%(display_count)s utilisateurs" +msgstr[0] "%(display_count)s utilisateur·rice" +msgstr[1] "%(display_count)s utilisateurs·rices" #: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:59 msgid "No email domains currently blocked" -msgstr "" +msgstr "Aucun domaine de messagerie n’est actuellement bloqué" #: bookwyrm/templates/settings/federation/edit_instance.html:3 #: bookwyrm/templates/settings/federation/edit_instance.html:6 @@ -2257,7 +2502,7 @@ msgid "Details" msgstr "Détails" #: bookwyrm/templates/settings/federation/instance.html:35 -#: bookwyrm/templates/user/layout.html:63 +#: bookwyrm/templates/user/layout.html:64 msgid "Activity" msgstr "Activité" @@ -2299,7 +2544,7 @@ msgstr "Modifier" #: bookwyrm/templates/settings/federation/instance.html:79 msgid "No notes" -msgstr "" +msgstr "Aucune note" #: bookwyrm/templates/settings/federation/instance.html:94 #: bookwyrm/templates/settings/users/user_moderation_actions.html:8 @@ -2499,7 +2744,7 @@ msgstr "Aucune adresse IP n'est actuellement bloquée" #: bookwyrm/templates/settings/ip_blocklist/ip_tooltip.html:6 msgid "You can block IP ranges using CIDR syntax." -msgstr "" +msgstr "Vous pouvez bloquer des plages d'adresses IP en utilisant la syntaxe CIDR." #: bookwyrm/templates/settings/layout.html:4 msgid "Administration" @@ -2634,7 +2879,7 @@ msgstr "Description courte :" #: bookwyrm/templates/settings/site.html:37 msgid "Used when the instance is previewed on joinbookwyrm.com. Does not support HTML or Markdown." -msgstr "" +msgstr "Utilisé dans l'aperçu de l'instance sur joinbookwyrm.com. Ne prend pas en charge l'HTML ou le Markdown." #: bookwyrm/templates/settings/site.html:41 msgid "Code of conduct:" @@ -2761,7 +3006,7 @@ msgstr "Local" #: bookwyrm/templates/settings/users/user_info.html:38 msgid "Remote" -msgstr "" +msgstr "Distant·e" #: bookwyrm/templates/settings/users/user_info.html:47 msgid "User details" @@ -2789,7 +3034,7 @@ msgstr "Abonné(e)s approuvés manuellement :" #: bookwyrm/templates/settings/users/user_info.html:76 msgid "Discoverable:" -msgstr "" +msgstr "Visible publiquement :" #: bookwyrm/templates/settings/users/user_info.html:80 msgid "Deactivation reason:" @@ -2833,53 +3078,66 @@ msgstr "Créer une étagère" msgid "Edit Shelf" msgstr "Modifier l’étagère" -#: bookwyrm/templates/shelf/shelf.html:28 bookwyrm/views/shelf.py:55 +#: bookwyrm/templates/shelf/shelf.html:28 bookwyrm/views/shelf/shelf.py:53 msgid "All books" msgstr "Tous les livres" -#: bookwyrm/templates/shelf/shelf.html:55 +#: bookwyrm/templates/shelf/shelf.html:69 msgid "Create shelf" msgstr "Créer une étagère" -#: bookwyrm/templates/shelf/shelf.html:77 +#: bookwyrm/templates/shelf/shelf.html:90 #, python-format msgid "%(formatted_count)s book" msgid_plural "%(formatted_count)s books" msgstr[0] "%(formatted_count)s livre" msgstr[1] "%(formatted_count)s livres" -#: bookwyrm/templates/shelf/shelf.html:84 +#: bookwyrm/templates/shelf/shelf.html:97 #, python-format msgid "(showing %(start)s-%(end)s)" -msgstr "" +msgstr "(affichage de %(start)s-%(end)s)" -#: bookwyrm/templates/shelf/shelf.html:96 +#: bookwyrm/templates/shelf/shelf.html:109 msgid "Edit shelf" msgstr "Modifier l’étagère" -#: bookwyrm/templates/shelf/shelf.html:104 +#: bookwyrm/templates/shelf/shelf.html:117 msgid "Delete shelf" msgstr "Supprimer l’étagère" -#: bookwyrm/templates/shelf/shelf.html:132 -#: bookwyrm/templates/shelf/shelf.html:158 +#: bookwyrm/templates/shelf/shelf.html:145 +#: bookwyrm/templates/shelf/shelf.html:171 msgid "Shelved" msgstr "Date d’ajout" -#: bookwyrm/templates/shelf/shelf.html:133 -#: bookwyrm/templates/shelf/shelf.html:161 +#: bookwyrm/templates/shelf/shelf.html:146 +#: bookwyrm/templates/shelf/shelf.html:174 msgid "Started" msgstr "Commencé" -#: bookwyrm/templates/shelf/shelf.html:134 -#: bookwyrm/templates/shelf/shelf.html:164 +#: bookwyrm/templates/shelf/shelf.html:147 +#: bookwyrm/templates/shelf/shelf.html:177 msgid "Finished" msgstr "Terminé" -#: bookwyrm/templates/shelf/shelf.html:190 +#: bookwyrm/templates/shelf/shelf.html:203 msgid "This shelf is empty." msgstr "Cette étagère est vide" +#: bookwyrm/templates/snippets/add_to_group_button.html:15 +msgid "Invite" +msgstr "Inviter" + +#: bookwyrm/templates/snippets/add_to_group_button.html:24 +msgid "Uninvite" +msgstr "Annuler l'invitation" + +#: bookwyrm/templates/snippets/add_to_group_button.html:28 +#, python-format +msgid "Remove @%(username)s" +msgstr "Retirer @%(username)s" + #: bookwyrm/templates/snippets/announcement.html:31 #, python-format msgid "Posted by %(username)s" @@ -2899,7 +3157,7 @@ msgstr "Pas de couverture" #: bookwyrm/templates/snippets/book_titleby.html:6 #, python-format msgid "%(title)s by" -msgstr "" +msgstr "%(title)s de" #: bookwyrm/templates/snippets/boost_button.html:20 #: bookwyrm/templates/snippets/boost_button.html:21 @@ -2911,17 +3169,13 @@ msgstr "Partager" msgid "Un-boost" msgstr "Annuler le partage" -#: bookwyrm/templates/snippets/create_status.html:17 -msgid "Review" -msgstr "Critique" - #: bookwyrm/templates/snippets/create_status.html:39 msgid "Quote" msgstr "Citation" #: bookwyrm/templates/snippets/create_status/comment.html:15 msgid "Some thoughts on the book" -msgstr "" +msgstr "Quelques réflexions sur ce livre" #: bookwyrm/templates/snippets/create_status/comment.html:27 #: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:15 @@ -2956,7 +3210,7 @@ msgstr "Contenu" #: bookwyrm/templates/snippets/create_status/content_warning_field.html:10 msgid "Content warning:" -msgstr "" +msgstr "Avertissement sur le contenu :" #: bookwyrm/templates/snippets/create_status/content_warning_field.html:18 msgid "Spoilers ahead!" @@ -2975,6 +3229,7 @@ msgstr "Commentaire :" #: bookwyrm/templates/snippets/privacy-icons.html:15 #: bookwyrm/templates/snippets/privacy-icons.html:16 #: bookwyrm/templates/snippets/privacy_select.html:20 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:17 msgid "Private" msgstr "Privé" @@ -2989,24 +3244,24 @@ msgstr "Citation :" #: bookwyrm/templates/snippets/create_status/quotation.html:25 #, python-format msgid "An excerpt from '%(book_title)s'" -msgstr "" +msgstr "Un extrait de '%(book_title)s'" #: bookwyrm/templates/snippets/create_status/quotation.html:32 msgid "Position:" -msgstr "" +msgstr "Emplacement :" #: bookwyrm/templates/snippets/create_status/quotation.html:45 msgid "On page:" -msgstr "" +msgstr "À la page :" #: bookwyrm/templates/snippets/create_status/quotation.html:51 msgid "At percent:" -msgstr "" +msgstr "Au pourcentage :" #: bookwyrm/templates/snippets/create_status/review.html:25 #, python-format msgid "Your review of '%(book_title)s'" -msgstr "" +msgstr "Votre critique de '%(book_title)s'" #: bookwyrm/templates/snippets/create_status/review.html:40 msgid "Review:" @@ -3050,7 +3305,7 @@ msgstr "Annuler les filtres" #: bookwyrm/templates/snippets/follow_button.html:14 #, python-format msgid "Follow @%(username)s" -msgstr "" +msgstr "S'abonner à @%(username)s" #: bookwyrm/templates/snippets/follow_button.html:16 msgid "Follow" @@ -3063,13 +3318,14 @@ msgstr "Annuler la demande d’abonnement" #: bookwyrm/templates/snippets/follow_button.html:30 #, python-format msgid "Unfollow @%(username)s" -msgstr "" +msgstr "Se désabonner de @%(username)s" #: bookwyrm/templates/snippets/follow_button.html:32 msgid "Unfollow" msgstr "Se désabonner" #: bookwyrm/templates/snippets/follow_request_buttons.html:7 +#: bookwyrm/templates/snippets/join_invitation_buttons.html:8 msgid "Accept" msgstr "Accepter" @@ -3082,8 +3338,8 @@ msgstr "Aucune note" #, python-format msgid "%(half_rating)s star" msgid_plural "%(half_rating)s stars" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%(half_rating)s étoile" +msgstr[1] "%(half_rating)s étoiles" #: bookwyrm/templates/snippets/form_rate_stars.html:64 #: bookwyrm/templates/snippets/stars.html:7 @@ -3104,8 +3360,8 @@ msgstr[1] "souhaite lire %(counter)s livres en %(year)s" #, python-format msgid "rated %(title)s: %(display_rating)s star" msgid_plural "rated %(title)s: %(display_rating)s stars" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "a noté %(title)s : %(display_rating)s étoile" +msgstr[1] "a noté %(title)s : %(display_rating)s étoiles" #: bookwyrm/templates/snippets/generated_status/review_pure_name.html:4 #, python-format @@ -3153,7 +3409,7 @@ msgstr "%(percent)s%% terminé !" #: bookwyrm/templates/snippets/goal_progress.html:12 #, python-format msgid "You've read %(read_count)s of %(goal_count)s books." -msgstr "Vous avez lu %(read_count)s sur %(goal_count)s livres." +msgstr "Vous avez lu %(read_count)s livres sur %(goal_count)s." #: bookwyrm/templates/snippets/goal_progress.html:14 #, python-format @@ -3181,12 +3437,14 @@ msgstr "Suivante" #: bookwyrm/templates/snippets/privacy-icons.html:3 #: bookwyrm/templates/snippets/privacy-icons.html:4 #: bookwyrm/templates/snippets/privacy_select.html:11 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:11 msgid "Public" msgstr "Public" #: bookwyrm/templates/snippets/privacy-icons.html:7 #: bookwyrm/templates/snippets/privacy-icons.html:8 #: bookwyrm/templates/snippets/privacy_select.html:14 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:14 msgid "Unlisted" msgstr "Non listé" @@ -3195,6 +3453,7 @@ msgid "Followers-only" msgstr "Abonnemé(e)s uniquement" #: bookwyrm/templates/snippets/privacy_select.html:6 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:6 msgid "Post privacy" msgstr "Confidentialité du statut" @@ -3230,7 +3489,7 @@ msgstr "Lecture terminée le" #: bookwyrm/templates/snippets/reading_modals/form.html:9 msgid "(Optional)" -msgstr "" +msgstr "(Facultatif)" #: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:5 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:50 @@ -3302,21 +3561,21 @@ msgstr "Terminer la lecture" #: bookwyrm/templates/snippets/status/content_status.html:72 msgid "Content warning" -msgstr "" +msgstr "Avertissement sur le contenu" #: bookwyrm/templates/snippets/status/content_status.html:79 msgid "Show status" -msgstr "" +msgstr "Afficher le statut" #: bookwyrm/templates/snippets/status/content_status.html:101 #, python-format msgid "(Page %(page)s)" -msgstr "" +msgstr "(Page %(page)s)" #: bookwyrm/templates/snippets/status/content_status.html:103 #, python-format msgid "(%(percent)s%%)" -msgstr "" +msgstr "(%(percent)s%%)" #: bookwyrm/templates/snippets/status/content_status.html:125 msgid "Open image in new window" @@ -3324,19 +3583,19 @@ msgstr "Ouvrir l’image dans une nouvelle fenêtre" #: bookwyrm/templates/snippets/status/content_status.html:144 msgid "Hide status" -msgstr "" +msgstr "Masquer le statut" #: bookwyrm/templates/snippets/status/header.html:45 #, python-format msgid "edited %(date)s" -msgstr "" +msgstr "modifié le %(date)s" #: bookwyrm/templates/snippets/status/headers/comment.html:2 #, python-format msgid "commented on %(book)s" msgstr "a commenté %(book)s" -#: bookwyrm/templates/snippets/status/headers/note.html:15 +#: bookwyrm/templates/snippets/status/headers/note.html:8 #, python-format msgid "replied to %(username)s's status" msgstr "a répondu au statut de %(username)s" @@ -3395,25 +3654,6 @@ msgstr "a partagé" msgid "More options" msgstr "Plus d’options" -#: bookwyrm/templates/snippets/suggested_users.html:16 -#, python-format -msgid "%(mutuals)s follower you follow" -msgid_plural "%(mutuals)s followers you follow" -msgstr[0] "%(mutuals)s abonné(e) que vous suivez" -msgstr[1] "%(mutuals)s abonné(e)s que vous suivez" - -#: bookwyrm/templates/snippets/suggested_users.html:23 -#, python-format -msgid "%(shared_books)s book on your shelves" -msgid_plural "%(shared_books)s books on your shelves" -msgstr[0] "%(shared_books)s livre sur vos étagères" -msgstr[1] "%(shared_books)s livres sur vos étagères" - -#: bookwyrm/templates/snippets/suggested_users.html:31 -#: bookwyrm/templates/user/user_preview.html:36 -msgid "Follows you" -msgstr "Vous suit" - #: bookwyrm/templates/snippets/switch_edition_button.html:5 msgid "Switch to this edition" msgstr "Changer vers cette édition" @@ -3434,7 +3674,11 @@ msgstr "Déplier" msgid "Show less" msgstr "Replier" -#: bookwyrm/templates/user/books_header.html:5 +#: bookwyrm/templates/user/books_header.html:10 +msgid "Your books" +msgstr "Vos livres" + +#: bookwyrm/templates/user/books_header.html:15 #, python-format msgid "%(username)s's books" msgstr "Livres de %(username)s" @@ -3463,18 +3707,35 @@ msgstr "Vos livres en %(year)s" msgid "%(username)s's %(year)s Books" msgstr "Livres de %(username)s en %(year)s" -#: bookwyrm/templates/user/layout.html:18 bookwyrm/templates/user/user.html:10 +#: bookwyrm/templates/user/groups.html:9 +msgid "Your Groups" +msgstr "Vos Groupes" + +#: bookwyrm/templates/user/groups.html:11 +#, python-format +msgid "Groups: %(username)s" +msgstr "Groupes : %(username)s" + +#: bookwyrm/templates/user/groups.html:17 +msgid "Create group" +msgstr "Créer un groupe" + +#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:10 msgid "User Profile" msgstr "Profil" -#: bookwyrm/templates/user/layout.html:44 +#: bookwyrm/templates/user/layout.html:45 msgid "Follow Requests" msgstr "Demandes d’abonnement" -#: bookwyrm/templates/user/layout.html:69 +#: bookwyrm/templates/user/layout.html:70 msgid "Reading Goal" msgstr "Défi lecture" +#: bookwyrm/templates/user/layout.html:76 +msgid "Groups" +msgstr "Groupes" + #: bookwyrm/templates/user/lists.html:11 #, python-format msgid "Lists: %(username)s" @@ -3561,19 +3822,19 @@ msgstr "Ce fichier dépasse la taille limite : 10 Mo" msgid "%(title)s: %(subtitle)s" msgstr "%(title)s (%(subtitle)s)" -#: bookwyrm/views/import_data.py:67 +#: bookwyrm/views/imports/import_data.py:64 msgid "Not a valid csv file" msgstr "Fichier CSV non valide" -#: bookwyrm/views/login.py:69 +#: bookwyrm/views/landing/login.py:69 msgid "Username or password are incorrect" msgstr "Identifiant ou mot de passe incorrect" -#: bookwyrm/views/password.py:32 +#: bookwyrm/views/landing/password.py:32 msgid "No user with that email address was found." msgstr "Aucun compte avec cette adresse email n’a été trouvé." -#: bookwyrm/views/password.py:41 +#: bookwyrm/views/landing/password.py:43 #, python-brace-format msgid "A password reset link was sent to {email}" msgstr "Un lien de réinitialisation a été envoyé à {email}." @@ -3581,5 +3842,5 @@ msgstr "Un lien de réinitialisation a été envoyé à {email}." #: bookwyrm/views/rss_feed.py:35 #, python-brace-format msgid "Status updates from {obj.display_name}" -msgstr "" +msgstr "Mises à jour de statut de {obj.display_name}" diff --git a/locale/lt_LT/LC_MESSAGES/django.mo b/locale/lt_LT/LC_MESSAGES/django.mo new file mode 100644 index 00000000..ea2d76b1 Binary files /dev/null and b/locale/lt_LT/LC_MESSAGES/django.mo differ diff --git a/locale/lt_LT/LC_MESSAGES/django.po b/locale/lt_LT/LC_MESSAGES/django.po new file mode 100644 index 00000000..82d7cbbe --- /dev/null +++ b/locale/lt_LT/LC_MESSAGES/django.po @@ -0,0 +1,3884 @@ +msgid "" +msgstr "" +"Project-Id-Version: bookwyrm\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-11-14 15:08+0000\n" +"PO-Revision-Date: 2021-11-15 19:25\n" +"Last-Translator: Mouse Reeve \n" +"Language-Team: Lithuanian\n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && (n%100>19 || n%100<11) ? 0 : (n%10>=2 && n%10<=9) && (n%100>19 || n%100<11) ? 1 : n%1!=0 ? 2: 3);\n" +"X-Crowdin-Project: bookwyrm\n" +"X-Crowdin-Project-ID: 479239\n" +"X-Crowdin-Language: lt\n" +"X-Crowdin-File: /[bookwyrm-social.bookwyrm] main/locale/en_US/LC_MESSAGES/django.po\n" +"X-Crowdin-File-ID: 1553\n" + +#: bookwyrm/forms.py:242 +msgid "A user with this email already exists." +msgstr "Vartotojas su šiuo el. pašto adresu jau yra." + +#: bookwyrm/forms.py:256 +msgid "One Day" +msgstr "Diena" + +#: bookwyrm/forms.py:257 +msgid "One Week" +msgstr "Savaitė" + +#: bookwyrm/forms.py:258 +msgid "One Month" +msgstr "Mėnuo" + +#: bookwyrm/forms.py:259 +msgid "Does Not Expire" +msgstr "Galiojimas nesibaigia" + +#: bookwyrm/forms.py:263 +#, python-brace-format +msgid "{i} uses" +msgstr "{i} naudoja" + +#: bookwyrm/forms.py:264 +msgid "Unlimited" +msgstr "Neribota" + +#: bookwyrm/forms.py:332 +msgid "List Order" +msgstr "Sąrašo užsakymas" + +#: bookwyrm/forms.py:333 +msgid "Book Title" +msgstr "Knygos antraštė" + +#: bookwyrm/forms.py:334 bookwyrm/templates/shelf/shelf.html:149 +#: bookwyrm/templates/shelf/shelf.html:181 +#: bookwyrm/templates/snippets/create_status/review.html:33 +msgid "Rating" +msgstr "Įvertinimas" + +#: bookwyrm/forms.py:336 bookwyrm/templates/lists/list.html:110 +msgid "Sort By" +msgstr "Rūšiuoti pagal" + +#: bookwyrm/forms.py:340 +msgid "Ascending" +msgstr "Didėjančia tvarka" + +#: bookwyrm/forms.py:341 +msgid "Descending" +msgstr "Mažėjančia tvarka" + +#: bookwyrm/importers/importer.py:127 +msgid "Error loading book" +msgstr "Klaida įkeliant knygą" + +#: bookwyrm/importers/importer.py:135 +msgid "Could not find a match for book" +msgstr "Nepavyko rasti tokios knygos" + +#: bookwyrm/models/base_model.py:17 +#: bookwyrm/templates/import/import_status.html:171 +msgid "Pending" +msgstr "Laukiama" + +#: bookwyrm/models/base_model.py:18 +msgid "Self deletion" +msgstr "Išsitrina savaime" + +#: bookwyrm/models/base_model.py:19 +msgid "Moderator suspension" +msgstr "Moderatorius nutraukė" + +#: bookwyrm/models/base_model.py:20 +msgid "Moderator deletion" +msgstr "Moderatorius ištrynė" + +#: bookwyrm/models/base_model.py:21 +msgid "Domain block" +msgstr "Blokuoti pagal domeną" + +#: bookwyrm/models/book.py:233 +msgid "Audiobook" +msgstr "Audioknyga" + +#: bookwyrm/models/book.py:234 +msgid "eBook" +msgstr "Elektroninė knyga" + +#: bookwyrm/models/book.py:235 +msgid "Graphic novel" +msgstr "Grafinė novelė" + +#: bookwyrm/models/book.py:236 +msgid "Hardcover" +msgstr "Knyga kietais viršeliais" + +#: bookwyrm/models/book.py:237 +msgid "Paperback" +msgstr "Knyga minkštais viršeliais" + +#: bookwyrm/models/federated_server.py:11 +#: bookwyrm/templates/settings/federation/edit_instance.html:42 +#: bookwyrm/templates/settings/federation/instance_list.html:19 +msgid "Federated" +msgstr "Susijungę" + +#: bookwyrm/models/federated_server.py:12 +#: bookwyrm/templates/settings/federation/edit_instance.html:43 +#: bookwyrm/templates/settings/federation/instance.html:10 +#: bookwyrm/templates/settings/federation/instance_list.html:23 +msgid "Blocked" +msgstr "Užblokuota" + +#: bookwyrm/models/fields.py:29 +#, python-format +msgid "%(value)s is not a valid remote_id" +msgstr "%(value)s yra negaliojantis remote_id" + +#: bookwyrm/models/fields.py:38 bookwyrm/models/fields.py:47 +#, python-format +msgid "%(value)s is not a valid username" +msgstr "%(value)s yra negaliojantis naudotojo vardas" + +#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:171 +msgid "username" +msgstr "naudotojo vardas" + +#: bookwyrm/models/fields.py:188 +msgid "A user with that username already exists." +msgstr "Toks naudotojo vardas jau egzistuoja." + +#: bookwyrm/settings.py:118 +msgid "Home Timeline" +msgstr "Pagrindinė siena" + +#: bookwyrm/settings.py:118 +msgid "Home" +msgstr "Pagrindinis" + +#: bookwyrm/settings.py:119 +msgid "Books Timeline" +msgstr "Knygų siena" + +#: bookwyrm/settings.py:119 bookwyrm/templates/search/layout.html:21 +#: bookwyrm/templates/search/layout.html:42 +#: bookwyrm/templates/user/layout.html:88 +msgid "Books" +msgstr "Knygos" + +#: bookwyrm/settings.py:165 +msgid "English" +msgstr "English (Anglų)" + +#: bookwyrm/settings.py:166 +msgid "Deutsch (German)" +msgstr "Deutsch (Vokiečių)" + +#: bookwyrm/settings.py:167 +msgid "Español (Spanish)" +msgstr "Español (Ispanų)" + +#: bookwyrm/settings.py:168 +msgid "Français (French)" +msgstr "Français (Prancūzų)" + +#: bookwyrm/settings.py:169 +msgid "Português - Brasil (Brazilian Portuguese)" +msgstr "Português - Brasil (Portugalų–brazilų)" + +#: bookwyrm/settings.py:170 +msgid "简体中文 (Simplified Chinese)" +msgstr "简体中文 (Supaprastinta kinų)" + +#: bookwyrm/settings.py:171 +msgid "繁體中文 (Traditional Chinese)" +msgstr "繁體中文 (Tradicinė kinų)" + +#: bookwyrm/templates/404.html:4 bookwyrm/templates/404.html:8 +msgid "Not Found" +msgstr "Nerasta" + +#: bookwyrm/templates/404.html:9 +msgid "The page you requested doesn't seem to exist!" +msgstr "Jūsų ieškomas puslapis neegzistuoja." + +#: bookwyrm/templates/500.html:4 +msgid "Oops!" +msgstr "Oi!" + +#: bookwyrm/templates/500.html:8 +msgid "Server Error" +msgstr "Serverio klaida" + +#: bookwyrm/templates/500.html:9 +msgid "Something went wrong! Sorry about that." +msgstr "Kažkas nepavyko. Atsiprašome." + +#: bookwyrm/templates/author/author.html:17 +#: bookwyrm/templates/author/author.html:18 +msgid "Edit Author" +msgstr "Keisti autorių" + +#: bookwyrm/templates/author/author.html:34 +#: bookwyrm/templates/author/edit_author.html:43 +msgid "Aliases:" +msgstr "Pseudonimai:" + +#: bookwyrm/templates/author/author.html:45 +msgid "Born:" +msgstr "Gimęs:" + +#: bookwyrm/templates/author/author.html:52 +msgid "Died:" +msgstr "Mirė:" + +#: bookwyrm/templates/author/author.html:61 +msgid "Wikipedia" +msgstr "Wikipedia" + +#: bookwyrm/templates/author/author.html:69 +#: bookwyrm/templates/book/book.html:94 +msgid "View on OpenLibrary" +msgstr "Žiūrėti „OpenLibrary“" + +#: bookwyrm/templates/author/author.html:77 +#: bookwyrm/templates/book/book.html:97 +msgid "View on Inventaire" +msgstr "Žiūrėti „Inventaire“" + +#: bookwyrm/templates/author/author.html:85 +msgid "View on LibraryThing" +msgstr "Žiūrėti „LibraryThing“" + +#: bookwyrm/templates/author/author.html:93 +msgid "View on Goodreads" +msgstr "Žiūrėti „Goodreads“" + +#: bookwyrm/templates/author/author.html:108 +#, python-format +msgid "Books by %(name)s" +msgstr "%(name)s knygos" + +#: bookwyrm/templates/author/edit_author.html:5 +msgid "Edit Author:" +msgstr "Keisti autorių:" + +#: bookwyrm/templates/author/edit_author.html:13 +#: bookwyrm/templates/book/edit/edit_book.html:18 +msgid "Added:" +msgstr "Pridėta:" + +#: bookwyrm/templates/author/edit_author.html:14 +#: bookwyrm/templates/book/edit/edit_book.html:21 +msgid "Updated:" +msgstr "Atnaujinta:" + +#: bookwyrm/templates/author/edit_author.html:16 +#: bookwyrm/templates/book/edit/edit_book.html:25 +msgid "Last edited by:" +msgstr "Pastarąjį kartą redagavo:" + +#: bookwyrm/templates/author/edit_author.html:33 +#: bookwyrm/templates/book/edit/edit_book_form.html:15 +msgid "Metadata" +msgstr "Meta duomenys" + +#: bookwyrm/templates/author/edit_author.html:35 +#: bookwyrm/templates/lists/form.html:9 bookwyrm/templates/shelf/form.html:9 +msgid "Name:" +msgstr "Vardas:" + +#: bookwyrm/templates/author/edit_author.html:45 +#: bookwyrm/templates/book/edit/edit_book_form.html:65 +#: bookwyrm/templates/book/edit/edit_book_form.html:79 +#: bookwyrm/templates/book/edit/edit_book_form.html:124 +msgid "Separate multiple values with commas." +msgstr "Reikšmes atskirkite kableliais." + +#: bookwyrm/templates/author/edit_author.html:52 +msgid "Bio:" +msgstr "Biografija:" + +#: bookwyrm/templates/author/edit_author.html:59 +msgid "Wikipedia link:" +msgstr "Nuoroda į wikipediją:" + +#: bookwyrm/templates/author/edit_author.html:65 +msgid "Birth date:" +msgstr "Gimimo data:" + +#: bookwyrm/templates/author/edit_author.html:73 +msgid "Death date:" +msgstr "Mirties data:" + +#: bookwyrm/templates/author/edit_author.html:81 +msgid "Author Identifiers" +msgstr "Autoriaus identifikatoriai" + +#: bookwyrm/templates/author/edit_author.html:83 +msgid "Openlibrary key:" +msgstr "„Openlibrary“ raktas:" + +#: bookwyrm/templates/author/edit_author.html:91 +#: bookwyrm/templates/book/edit/edit_book_form.html:224 +msgid "Inventaire ID:" +msgstr "„Inventaire“ ID:" + +#: bookwyrm/templates/author/edit_author.html:99 +msgid "Librarything key:" +msgstr "„Librarything“ raktas:" + +#: bookwyrm/templates/author/edit_author.html:107 +msgid "Goodreads key:" +msgstr "„Goodreads“ raktas:" + +#: bookwyrm/templates/author/edit_author.html:118 +#: bookwyrm/templates/book/book.html:140 +#: bookwyrm/templates/book/edit/edit_book.html:110 +#: bookwyrm/templates/book/readthrough.html:76 +#: bookwyrm/templates/groups/form.html:24 +#: bookwyrm/templates/lists/bookmark_button.html:15 +#: bookwyrm/templates/lists/form.html:75 +#: bookwyrm/templates/preferences/edit_user.html:124 +#: bookwyrm/templates/settings/announcements/announcement_form.html:69 +#: bookwyrm/templates/settings/federation/edit_instance.html:74 +#: bookwyrm/templates/settings/federation/instance.html:87 +#: bookwyrm/templates/settings/site.html:134 +#: bookwyrm/templates/settings/users/user_moderation_actions.html:64 +#: bookwyrm/templates/shelf/form.html:25 +#: bookwyrm/templates/snippets/reading_modals/layout.html:18 +msgid "Save" +msgstr "Išsaugoti" + +#: bookwyrm/templates/author/edit_author.html:119 +#: bookwyrm/templates/book/book.html:141 bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/cover_modal.html:32 +#: bookwyrm/templates/book/edit/edit_book.html:112 +#: bookwyrm/templates/book/edit/edit_book.html:115 +#: bookwyrm/templates/book/readthrough.html:77 +#: bookwyrm/templates/groups/delete_group_modal.html:17 +#: bookwyrm/templates/lists/delete_list_modal.html:17 +#: bookwyrm/templates/settings/federation/instance.html:88 +#: bookwyrm/templates/snippets/delete_readthrough_modal.html:17 +#: bookwyrm/templates/snippets/report_modal.html:34 +msgid "Cancel" +msgstr "Atšaukti" + +#: bookwyrm/templates/book/book.html:47 +#: bookwyrm/templates/discover/large-book.html:22 +#: bookwyrm/templates/landing/large-book.html:25 +#: bookwyrm/templates/landing/small-book.html:18 +msgid "by" +msgstr " " + +#: bookwyrm/templates/book/book.html:55 bookwyrm/templates/book/book.html:56 +msgid "Edit Book" +msgstr "Redaguoti knygą" + +#: bookwyrm/templates/book/book.html:73 +#: bookwyrm/templates/book/cover_modal.html:5 +msgid "Add cover" +msgstr "Pridėti viršelį" + +#: bookwyrm/templates/book/book.html:77 +msgid "Failed to load cover" +msgstr "Nepavyko įkelti viršelio" + +#: bookwyrm/templates/book/book.html:117 +#, python-format +msgid "(%(review_count)s review)" +msgid_plural "(%(review_count)s reviews)" +msgstr[0] "(%(review_count)s atsiliepimas)" +msgstr[1] "(%(review_count)s atsiliepimai)" +msgstr[2] "(%(review_count)s atsiliepimų)" +msgstr[3] "(%(review_count)s atsiliepimai)" + +#: bookwyrm/templates/book/book.html:129 +msgid "Add Description" +msgstr "Pridėti aprašymą" + +#: bookwyrm/templates/book/book.html:136 +#: bookwyrm/templates/book/edit/edit_book_form.html:34 +#: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 +msgid "Description:" +msgstr "Aprašymas:" + +#: bookwyrm/templates/book/book.html:150 +#, python-format +msgid "%(count)s editions" +msgstr "%(count)s leidimai (-ų)" + +#: bookwyrm/templates/book/book.html:158 +#, python-format +msgid "This edition is on your %(shelf_name)s shelf." +msgstr "Šis leidimas yra jūsų %(shelf_name)s lentynoje." + +#: bookwyrm/templates/book/book.html:164 +#, python-format +msgid "A different edition of this book is on your %(shelf_name)s shelf." +msgstr "kitas šios knygos leidimas yra jūsų %(shelf_name)s lentynoje." + +#: bookwyrm/templates/book/book.html:175 +msgid "Your reading activity" +msgstr "Jūsų skaitymo veikla" + +#: bookwyrm/templates/book/book.html:178 +msgid "Add read dates" +msgstr "Pridėti skaitymo datas" + +#: bookwyrm/templates/book/book.html:187 +msgid "Create" +msgstr "Kurti" + +#: bookwyrm/templates/book/book.html:197 +msgid "You don't have any reading activity for this book." +msgstr "Šios knygos neskaitote." + +#: bookwyrm/templates/book/book.html:218 +msgid "Reviews" +msgstr "Apžvalgos" + +#: bookwyrm/templates/book/book.html:223 +msgid "Your reviews" +msgstr "Tavo atsiliepimai" + +#: bookwyrm/templates/book/book.html:229 +msgid "Your comments" +msgstr "Tavo komentarai" + +#: bookwyrm/templates/book/book.html:235 +msgid "Your quotes" +msgstr "Jūsų citatos" + +#: bookwyrm/templates/book/book.html:271 +msgid "Subjects" +msgstr "Temos" + +#: bookwyrm/templates/book/book.html:283 +msgid "Places" +msgstr "Vietos" + +#: bookwyrm/templates/book/book.html:294 bookwyrm/templates/layout.html:75 +#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12 +#: bookwyrm/templates/search/layout.html:25 +#: bookwyrm/templates/search/layout.html:50 +#: bookwyrm/templates/user/layout.html:82 +msgid "Lists" +msgstr "Sąrašai" + +#: bookwyrm/templates/book/book.html:305 +msgid "Add to list" +msgstr "Pridėti prie sąrašo" + +#: bookwyrm/templates/book/book.html:315 +#: bookwyrm/templates/book/cover_modal.html:31 +#: bookwyrm/templates/lists/list.html:182 +#: bookwyrm/templates/settings/email_blocklist/domain_form.html:26 +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:32 +msgid "Add" +msgstr "Pridėti" + +#: bookwyrm/templates/book/book_identifiers.html:8 +msgid "ISBN:" +msgstr "ISBN:" + +#: bookwyrm/templates/book/book_identifiers.html:15 +#: bookwyrm/templates/book/edit/edit_book_form.html:232 +msgid "OCLC Number:" +msgstr "OCLC numeris:" + +#: bookwyrm/templates/book/book_identifiers.html:22 +#: bookwyrm/templates/book/edit/edit_book_form.html:240 +msgid "ASIN:" +msgstr "ASIN:" + +#: bookwyrm/templates/book/cover_modal.html:17 +#: bookwyrm/templates/book/edit/edit_book_form.html:143 +msgid "Upload cover:" +msgstr "Įkelti viršelį:" + +#: bookwyrm/templates/book/cover_modal.html:23 +#: bookwyrm/templates/book/edit/edit_book_form.html:148 +msgid "Load cover from url:" +msgstr "Įkelti viršelį iš url:" + +#: bookwyrm/templates/book/edit/edit_book.html:5 +#: bookwyrm/templates/book/edit/edit_book.html:11 +#, python-format +msgid "Edit \"%(book_title)s\"" +msgstr "Redaguoti „%(book_title)s“" + +#: bookwyrm/templates/book/edit/edit_book.html:5 +#: bookwyrm/templates/book/edit/edit_book.html:13 +msgid "Add Book" +msgstr "Pridėti knygą" + +#: bookwyrm/templates/book/edit/edit_book.html:47 +msgid "Confirm Book Info" +msgstr "Patvirtinti knygos informaciją" + +#: bookwyrm/templates/book/edit/edit_book.html:55 +#, python-format +msgid "Is \"%(name)s\" an existing author?" +msgstr "Yra „%(name)s“ egzistuojantis autorius?" + +#: bookwyrm/templates/book/edit/edit_book.html:64 +#, python-format +msgid "Author of %(book_title)s" +msgstr "%(book_title)s autorius" + +#: bookwyrm/templates/book/edit/edit_book.html:68 +msgid "This is a new author" +msgstr "Tai naujas autorius" + +#: bookwyrm/templates/book/edit/edit_book.html:75 +#, python-format +msgid "Creating a new author: %(name)s" +msgstr "Kuriamas naujas autorius: %(name)s" + +#: bookwyrm/templates/book/edit/edit_book.html:82 +msgid "Is this an edition of an existing work?" +msgstr "Ar tai egzistuojančio darbo leidimas?" + +#: bookwyrm/templates/book/edit/edit_book.html:90 +msgid "This is a new work" +msgstr "Tai naujas darbas" + +#: bookwyrm/templates/book/edit/edit_book.html:97 +#: bookwyrm/templates/groups/members.html:16 +#: bookwyrm/templates/landing/password_reset.html:30 +#: bookwyrm/templates/snippets/remove_from_group_button.html:16 +msgid "Confirm" +msgstr "Patvirtinti" + +#: bookwyrm/templates/book/edit/edit_book.html:99 +#: bookwyrm/templates/feed/status.html:9 +msgid "Back" +msgstr "Atgal" + +#: bookwyrm/templates/book/edit/edit_book_form.html:18 +#: bookwyrm/templates/snippets/create_status/review.html:16 +msgid "Title:" +msgstr "Pavadinimas:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:26 +msgid "Subtitle:" +msgstr "Paantraštė:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:44 +msgid "Series:" +msgstr "Serija:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:53 +msgid "Series number:" +msgstr "Serijos numeris:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:63 +msgid "Languages:" +msgstr "Kalbos:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:74 +msgid "Publication" +msgstr "Paskelbimas" + +#: bookwyrm/templates/book/edit/edit_book_form.html:77 +msgid "Publisher:" +msgstr "Leidėjas:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:86 +msgid "First published date:" +msgstr "Pirmoji publikavimo data:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:94 +msgid "Published date:" +msgstr "Publikavimo data:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:104 +msgid "Authors" +msgstr "Autoriai" + +#: bookwyrm/templates/book/edit/edit_book_form.html:112 +#, python-format +msgid "Remove %(name)s" +msgstr "Pašalinti %(name)s" + +#: bookwyrm/templates/book/edit/edit_book_form.html:115 +#, python-format +msgid "Author page for %(name)s" +msgstr "Autoriaus puslapis %(name)s" + +#: bookwyrm/templates/book/edit/edit_book_form.html:122 +msgid "Add Authors:" +msgstr "Pridėti autorius:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:123 +msgid "John Doe, Jane Smith" +msgstr "John Doe, Jane Smith" + +#: bookwyrm/templates/book/edit/edit_book_form.html:132 +#: bookwyrm/templates/shelf/shelf.html:140 +msgid "Cover" +msgstr "Viršelis" + +#: bookwyrm/templates/book/edit/edit_book_form.html:161 +msgid "Physical Properties" +msgstr "Fizinės savybės" + +#: bookwyrm/templates/book/edit/edit_book_form.html:166 +#: bookwyrm/templates/book/editions/format_filter.html:5 +msgid "Format:" +msgstr "Formatas:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:177 +msgid "Format details:" +msgstr "Informacija apie formatą:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:187 +msgid "Pages:" +msgstr "Puslapiai:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:197 +msgid "Book Identifiers" +msgstr "Knygos identifikatoriai" + +#: bookwyrm/templates/book/edit/edit_book_form.html:200 +msgid "ISBN 13:" +msgstr "ISBN 13:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:208 +msgid "ISBN 10:" +msgstr "ISBN 10:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:216 +msgid "Openlibrary ID:" +msgstr "„Openlibrary“ ID:" + +#: bookwyrm/templates/book/editions/editions.html:4 +#, python-format +msgid "Editions of %(book_title)s" +msgstr "Knygos %(book_title)s leidimai" + +#: bookwyrm/templates/book/editions/editions.html:8 +#, python-format +msgid "Editions of \"%(work_title)s\"" +msgstr "\"%(work_title)s\" leidimai" + +#: bookwyrm/templates/book/editions/format_filter.html:8 +#: bookwyrm/templates/book/editions/language_filter.html:8 +msgid "Any" +msgstr "Bet kas" + +#: bookwyrm/templates/book/editions/language_filter.html:5 +#: bookwyrm/templates/preferences/edit_user.html:95 +msgid "Language:" +msgstr "Kalba:" + +#: bookwyrm/templates/book/editions/search_filter.html:5 +msgid "Search editions" +msgstr "Paieškos leidimai" + +#: bookwyrm/templates/book/publisher_info.html:23 +#, python-format +msgid "%(format)s, %(pages)s pages" +msgstr "%(format)s, %(pages)s psl." + +#: bookwyrm/templates/book/publisher_info.html:25 +#, python-format +msgid "%(pages)s pages" +msgstr "%(pages)s psl." + +#: bookwyrm/templates/book/publisher_info.html:38 +#, python-format +msgid "%(languages)s language" +msgstr "%(languages)s kalba" + +#: bookwyrm/templates/book/publisher_info.html:65 +#, python-format +msgid "Published %(date)s by %(publisher)s." +msgstr "Publikuota %(date)s, %(publisher)s." + +#: bookwyrm/templates/book/publisher_info.html:67 +#, python-format +msgid "Published %(date)s" +msgstr "Publikuota %(date)s" + +#: bookwyrm/templates/book/publisher_info.html:69 +#, python-format +msgid "Published by %(publisher)s." +msgstr "Publikavo %(publisher)s." + +#: bookwyrm/templates/book/rating.html:13 +msgid "rated it" +msgstr "įvertino" + +#: bookwyrm/templates/book/readthrough.html:8 +msgid "Progress Updates:" +msgstr "Informacija apie progresą:" + +#: bookwyrm/templates/book/readthrough.html:13 +msgid "finished" +msgstr "baigta" + +#: bookwyrm/templates/book/readthrough.html:24 +msgid "Show all updates" +msgstr "Rodyti visus naujinius" + +#: bookwyrm/templates/book/readthrough.html:40 +msgid "Delete this progress update" +msgstr "Ištrinti progreso naujinį" + +#: bookwyrm/templates/book/readthrough.html:51 +msgid "started" +msgstr "pradėta" + +#: bookwyrm/templates/book/readthrough.html:58 +#: bookwyrm/templates/book/readthrough.html:72 +msgid "Edit read dates" +msgstr "Redaguoti skaitymo datas" + +#: bookwyrm/templates/book/readthrough.html:62 +msgid "Delete these read dates" +msgstr "Ištrinti šias skaitymo datas" + +#: bookwyrm/templates/components/inline_form.html:8 +#: bookwyrm/templates/components/modal.html:11 +#: bookwyrm/templates/components/tooltip.html:7 +#: bookwyrm/templates/feed/layout.html:71 +#: bookwyrm/templates/get_started/layout.html:20 +#: bookwyrm/templates/get_started/layout.html:53 +#: bookwyrm/templates/search/book.html:49 +#: bookwyrm/templates/snippets/announcement.html:18 +msgid "Close" +msgstr "Uždaryti" + +#: bookwyrm/templates/components/tooltip.html:3 +msgid "Help" +msgstr "Pagalba" + +#: bookwyrm/templates/compose.html:5 bookwyrm/templates/compose.html:8 +msgid "Edit status" +msgstr "Redagavimo būsena" + +#: bookwyrm/templates/confirm_email/confirm_email.html:4 +msgid "Confirm email" +msgstr "Patvirtinti el. paštą" + +#: bookwyrm/templates/confirm_email/confirm_email.html:7 +msgid "Confirm your email address" +msgstr "Patvirtinkite el. pašto adresą" + +#: bookwyrm/templates/confirm_email/confirm_email.html:13 +msgid "A confirmation code has been sent to the email address you used to register your account." +msgstr "Į paskyros registracijai naudotą el. paštą buvo išsiųstas patvirtinimo kodas." + +#: bookwyrm/templates/confirm_email/confirm_email.html:15 +msgid "Sorry! We couldn't find that code." +msgstr "Deja, šio kodo neradome." + +#: bookwyrm/templates/confirm_email/confirm_email.html:19 +#: bookwyrm/templates/settings/users/user_info.html:85 +msgid "Confirmation code:" +msgstr "Patvirtinimo kodas:" + +#: bookwyrm/templates/confirm_email/confirm_email.html:25 +#: bookwyrm/templates/landing/layout.html:73 +#: bookwyrm/templates/settings/dashboard/dashboard.html:93 +#: bookwyrm/templates/snippets/report_modal.html:33 +msgid "Submit" +msgstr "Siųsti" + +#: bookwyrm/templates/confirm_email/confirm_email.html:32 +msgid "Can't find your code?" +msgstr "Nerandate savo kodo?" + +#: bookwyrm/templates/confirm_email/resend_form.html:4 +msgid "Resend confirmation link" +msgstr "Dar kartą išsiųsti patvirtinimo nuorodą" + +#: bookwyrm/templates/confirm_email/resend_form.html:11 +#: bookwyrm/templates/landing/layout.html:67 +#: bookwyrm/templates/landing/password_reset_request.html:18 +#: bookwyrm/templates/preferences/edit_user.html:56 +#: bookwyrm/templates/snippets/register_form.html:13 +msgid "Email address:" +msgstr "El. pašto adresas:" + +#: bookwyrm/templates/confirm_email/resend_form.html:17 +msgid "Resend link" +msgstr "Dar kartą išsiųsti nuorodą" + +#: bookwyrm/templates/directory/community_filter.html:5 +msgid "Community" +msgstr "Bendruomenė" + +#: bookwyrm/templates/directory/community_filter.html:8 +msgid "Local users" +msgstr "Vietiniai nariai" + +#: bookwyrm/templates/directory/community_filter.html:12 +msgid "Federated community" +msgstr "Sujungta bendruomenė" + +#: bookwyrm/templates/directory/directory.html:4 +#: bookwyrm/templates/directory/directory.html:9 +#: bookwyrm/templates/layout.html:101 +msgid "Directory" +msgstr "Bendruomenė" + +#: bookwyrm/templates/directory/directory.html:17 +msgid "Make your profile discoverable to other BookWyrm users." +msgstr "Savo paskyrą leiskite atrasti kitiems „BookWyrm“ nariems." + +#: bookwyrm/templates/directory/directory.html:24 +#, python-format +msgid "You can opt-out at any time in your profile settings." +msgstr "Tai galite visada atšaukti paskyros nustatymuose." + +#: bookwyrm/templates/directory/directory.html:29 +#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/snippets/announcement.html:34 +msgid "Dismiss message" +msgstr "Pašalinti pranešimą" + +#: bookwyrm/templates/directory/sort_filter.html:5 +msgid "Order by" +msgstr "Rūšiuoti pagal" + +#: bookwyrm/templates/directory/sort_filter.html:8 +msgid "Recently active" +msgstr "Neseniai aktyvus" + +#: bookwyrm/templates/directory/sort_filter.html:9 +msgid "Suggested" +msgstr "Pasiūlyta" + +#: bookwyrm/templates/directory/user_card.html:17 +#: bookwyrm/templates/directory/user_card.html:18 +#: bookwyrm/templates/user/user_preview.html:16 +#: bookwyrm/templates/user/user_preview.html:17 +msgid "Locked account" +msgstr "Užrakinta paskyra" + +#: bookwyrm/templates/directory/user_card.html:40 +msgid "follower you follow" +msgid_plural "followers you follow" +msgstr[0] "jūs sekate" +msgstr[1] "jūs sekate" +msgstr[2] "jūs sekate" +msgstr[3] "jūs sekate" + +#: bookwyrm/templates/directory/user_card.html:47 +msgid "book on your shelves" +msgid_plural "books on your shelves" +msgstr[0] "jūsų lentynoje esanti knyga" +msgstr[1] "jūsų lentynose esančios knygos" +msgstr[2] "jūsų lentynose esančios knygos" +msgstr[3] "jūsų lentynose esančios knygos" + +#: bookwyrm/templates/directory/user_card.html:55 +msgid "posts" +msgstr "įrašai" + +#: bookwyrm/templates/directory/user_card.html:61 +msgid "last active" +msgstr "pastarąjį kartą aktyvus" + +#: bookwyrm/templates/directory/user_type_filter.html:5 +msgid "User type" +msgstr "Naudotojo tipas" + +#: bookwyrm/templates/directory/user_type_filter.html:8 +msgid "BookWyrm users" +msgstr "„BookWyrm“ nariai" + +#: bookwyrm/templates/directory/user_type_filter.html:12 +msgid "All known users" +msgstr "Visi žinomi nariai" + +#: bookwyrm/templates/discover/card-header.html:8 +#, python-format +msgid "%(username)s wants to read %(book_title)s" +msgstr "" + +#: bookwyrm/templates/discover/card-header.html:13 +#, python-format +msgid "%(username)s finished reading %(book_title)s" +msgstr "" + +#: bookwyrm/templates/discover/card-header.html:18 +#, python-format +msgid "%(username)s started reading %(book_title)s" +msgstr "" + +#: bookwyrm/templates/discover/card-header.html:23 +#, python-format +msgid "%(username)s rated %(book_title)s" +msgstr "%(username)s įvertino %(book_title)s" + +#: bookwyrm/templates/discover/card-header.html:27 +#, python-format +msgid "%(username)s reviewed %(book_title)s" +msgstr "%(username)s peržiūrėjo %(book_title)s" + +#: bookwyrm/templates/discover/card-header.html:31 +#, python-format +msgid "%(username)s commented on %(book_title)s" +msgstr "%(username)s pakomentavo prie knygos %(book_title)s" + +#: bookwyrm/templates/discover/card-header.html:35 +#, python-format +msgid "%(username)s quoted %(book_title)s" +msgstr "%(username)s citavo %(book_title)s" + +#: bookwyrm/templates/discover/discover.html:4 +#: bookwyrm/templates/discover/discover.html:10 +#: bookwyrm/templates/layout.html:78 +msgid "Discover" +msgstr "Atraskite" + +#: bookwyrm/templates/discover/discover.html:12 +#, python-format +msgid "See what's new in the local %(site_name)s community" +msgstr "Kas naujo mūsų %(site_name)s bendruomenėje" + +#: bookwyrm/templates/discover/large-book.html:52 +#: bookwyrm/templates/discover/small-book.html:36 +msgid "View status" +msgstr "Peržiūrėti būseną" + +#: bookwyrm/templates/email/confirm/html_content.html:6 +#: bookwyrm/templates/email/confirm/text_content.html:4 +#, python-format +msgid "One last step before you join %(site_name)s! Please confirm your email address by clicking the link below:" +msgstr "Paskutinis žingsnis prieš prisijungiant prie %(site_name)s! Patvirtinkite el. pašto adresą spausdami nuorodą žemiau:" + +#: bookwyrm/templates/email/confirm/html_content.html:11 +msgid "Confirm Email" +msgstr "Patvirtinti el. paštą" + +#: bookwyrm/templates/email/confirm/html_content.html:15 +#, python-format +msgid "Or enter the code \"%(confirmation_code)s\" at login." +msgstr "Arba suveskite kodą \"%(confirmation_code)s\" prisijungimo metu." + +#: bookwyrm/templates/email/confirm/subject.html:2 +msgid "Please confirm your email" +msgstr "Patvirtinkite savo el. pašto adresą" + +#: bookwyrm/templates/email/confirm/text_content.html:10 +#, python-format +msgid "Or enter the code \"%(confirmation_code)s\" at login." +msgstr "Arba suveskite kodą \"%(confirmation_code)s\" prisijungimo metu." + +#: bookwyrm/templates/email/html_layout.html:15 +#: bookwyrm/templates/email/text_layout.html:2 +msgid "Hi there," +msgstr "Labas!" + +#: bookwyrm/templates/email/html_layout.html:21 +#, python-format +msgid "BookWyrm hosted on %(site_name)s" +msgstr "BookWyrm talpinamas %(site_name)s" + +#: bookwyrm/templates/email/html_layout.html:23 +msgid "Email preference" +msgstr "El. pašto nustatymai" + +#: bookwyrm/templates/email/invite/html_content.html:6 +#: bookwyrm/templates/email/invite/subject.html:2 +#, python-format +msgid "You're invited to join %(site_name)s!" +msgstr "Esate pakviesti prisijungti prie %(site_name)s!" + +#: bookwyrm/templates/email/invite/html_content.html:9 +msgid "Join Now" +msgstr "Prisijungti dabar" + +#: bookwyrm/templates/email/invite/html_content.html:15 +#, python-format +msgid "Learn more about %(site_name)s." +msgstr "Sužinoti daugiau apie %(site_name)s." + +#: bookwyrm/templates/email/invite/text_content.html:4 +#, python-format +msgid "You're invited to join %(site_name)s! Click the link below to create an account." +msgstr "Esate pakviesti prisijungti prie %(site_name)s! Spauskite nuorodą žemiau, kad sukurtumėte paskyrą." + +#: bookwyrm/templates/email/invite/text_content.html:8 +#, python-format +msgid "Learn more about %(site_name)s:" +msgstr "Sužinoti daugiau apie %(site_name)s:" + +#: bookwyrm/templates/email/password_reset/html_content.html:6 +#: bookwyrm/templates/email/password_reset/text_content.html:4 +#, python-format +msgid "You requested to reset your %(site_name)s password. Click the link below to set a new password and log in to your account." +msgstr "Prašėte pakeisti %(site_name)s slaptažodį. Spauskite žemiau, kad pakeisti slaptažodį ir prisijungti prie savo paskyros." + +#: bookwyrm/templates/email/password_reset/html_content.html:9 +#: bookwyrm/templates/landing/password_reset.html:4 +#: bookwyrm/templates/landing/password_reset.html:10 +#: bookwyrm/templates/landing/password_reset_request.html:4 +#: bookwyrm/templates/landing/password_reset_request.html:10 +msgid "Reset Password" +msgstr "Atstatyti slaptažodį" + +#: bookwyrm/templates/email/password_reset/html_content.html:13 +#: bookwyrm/templates/email/password_reset/text_content.html:8 +msgid "If you didn't request to reset your password, you can ignore this email." +msgstr "Jei nenorite pakeisti savo slaptažodžio - ignoruokite šį laišką." + +#: bookwyrm/templates/email/password_reset/subject.html:2 +#, python-format +msgid "Reset your %(site_name)s password" +msgstr "Keisti %(site_name)s slaptažodį" + +#: bookwyrm/templates/feed/direct_messages.html:8 +#, python-format +msgid "Direct Messages with %(username)s" +msgstr "Asmeninis susirašinėjimas su %(username)s" + +#: bookwyrm/templates/feed/direct_messages.html:10 +#: bookwyrm/templates/layout.html:111 +msgid "Direct Messages" +msgstr "Asmeninės žinutės" + +#: bookwyrm/templates/feed/direct_messages.html:13 +msgid "All messages" +msgstr "Visos žinutės" + +#: bookwyrm/templates/feed/direct_messages.html:22 +msgid "You have no messages right now." +msgstr "Neturite žinučių." + +#: bookwyrm/templates/feed/feed.html:22 +#, python-format +msgid "load 0 unread status(es)" +msgstr "įkelti 0 neperskaitytų būsena" + +#: bookwyrm/templates/feed/feed.html:38 +msgid "There aren't any activities right now! Try following a user to get started" +msgstr "Šiuo metu įrašų nėra. Norėdami matyti, sekite narį." + +#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/layout.html:90 +#: bookwyrm/templates/user/goal_form.html:6 +#, python-format +msgid "%(year)s Reading Goal" +msgstr "%(year)s skaitymo tikslas" + +#: bookwyrm/templates/feed/goal_card.html:18 +#, python-format +msgid "You can set or change your reading goal any time from your profile page" +msgstr "Bet kuriuo metu galite pakeisti savo skaitymo tikslą savo paskyros puslapyje" + +#: bookwyrm/templates/feed/layout.html:5 +msgid "Updates" +msgstr "Atnaujinimai" + +#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:106 +msgid "Your Books" +msgstr "Jūsų knygos" + +#: bookwyrm/templates/feed/layout.html:14 +msgid "There are no books here right now! Try searching for a book to get started" +msgstr "Knygų neturite. Raskite knygą ir pradėkite." + +#: bookwyrm/templates/feed/layout.html:25 +#: bookwyrm/templates/shelf/shelf.html:38 +#: bookwyrm/templates/user/books_header.html:4 +msgid "To Read" +msgstr "Perskaityti" + +#: bookwyrm/templates/feed/layout.html:26 +#: bookwyrm/templates/shelf/shelf.html:40 +#: bookwyrm/templates/user/books_header.html:6 +msgid "Currently Reading" +msgstr "Šiuo metu skaitoma" + +#: bookwyrm/templates/feed/layout.html:27 +#: bookwyrm/templates/shelf/shelf.html:42 +#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:23 +#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12 +#: bookwyrm/templates/user/books_header.html:8 +msgid "Read" +msgstr "Perskaičiau" + +#: bookwyrm/templates/feed/suggested_users.html:5 +#: bookwyrm/templates/get_started/users.html:6 +msgid "Who to follow" +msgstr "Ką sekti" + +#: bookwyrm/templates/feed/suggested_users.html:9 +msgid "Don't show suggested users" +msgstr "Nerodyti siūlomų vartotojų" + +#: bookwyrm/templates/feed/suggested_users.html:14 +msgid "View directory" +msgstr "Žiūrėti katalogą" + +#: bookwyrm/templates/get_started/book_preview.html:6 +#, python-format +msgid "Have you read %(book_title)s?" +msgstr "Ar skaitėte „%(book_title)s“?" + +#: bookwyrm/templates/get_started/books.html:6 +msgid "What are you reading?" +msgstr "Ką skaitome?" + +#: bookwyrm/templates/get_started/books.html:9 +#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:138 +msgid "Search for a book" +msgstr "Ieškoti knygos" + +#: bookwyrm/templates/get_started/books.html:11 +#, python-format +msgid "No books found for \"%(query)s\"" +msgstr "Pagal paiešką „%(query)s“ knygos nerasta" + +#: bookwyrm/templates/get_started/books.html:11 +#, python-format +msgid "You can add books when you start using %(site_name)s." +msgstr "Kai pradedate naudotis %(site_name)s, galite pridėti knygų." + +#: bookwyrm/templates/get_started/books.html:16 +#: bookwyrm/templates/get_started/books.html:17 +#: bookwyrm/templates/get_started/users.html:18 +#: bookwyrm/templates/get_started/users.html:19 +#: bookwyrm/templates/groups/group.html:19 +#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:51 +#: bookwyrm/templates/layout.html:52 bookwyrm/templates/lists/list.html:142 +#: bookwyrm/templates/search/layout.html:4 +#: bookwyrm/templates/search/layout.html:9 +msgid "Search" +msgstr "Paieška" + +#: bookwyrm/templates/get_started/books.html:27 +msgid "Suggested Books" +msgstr "Siūlomos knygos" + +#: bookwyrm/templates/get_started/books.html:46 +#, python-format +msgid "Popular on %(site_name)s" +msgstr "%(site_name)s populiaru" + +#: bookwyrm/templates/get_started/books.html:58 +#: bookwyrm/templates/lists/list.html:155 +msgid "No books found" +msgstr "Knygų nerasta" + +#: bookwyrm/templates/get_started/books.html:63 +#: bookwyrm/templates/get_started/profile.html:54 +msgid "Save & continue" +msgstr "Išsaugoti ir tęsti" + +#: bookwyrm/templates/get_started/layout.html:5 +#: bookwyrm/templates/landing/layout.html:5 +msgid "Welcome" +msgstr "Sveiki atvykę" + +#: bookwyrm/templates/get_started/layout.html:15 +#, python-format +msgid "Welcome to %(site_name)s!" +msgstr "Sveiki atvykę į %(site_name)s!" + +#: bookwyrm/templates/get_started/layout.html:17 +msgid "These are some first steps to get you started." +msgstr "Pirmieji žingsniai, norint pradėti." + +#: bookwyrm/templates/get_started/layout.html:31 +#: bookwyrm/templates/get_started/profile.html:6 +msgid "Create your profile" +msgstr "Susikurkite paskyrą" + +#: bookwyrm/templates/get_started/layout.html:35 +msgid "Add books" +msgstr "Pridėti knygas" + +#: bookwyrm/templates/get_started/layout.html:39 +msgid "Find friends" +msgstr "Rasti draugų" + +#: bookwyrm/templates/get_started/layout.html:45 +msgid "Skip this step" +msgstr "Praleisti šį žingsnį" + +#: bookwyrm/templates/get_started/layout.html:49 +msgid "Finish" +msgstr "Baigti" + +#: bookwyrm/templates/get_started/profile.html:15 +#: bookwyrm/templates/preferences/edit_user.html:42 +msgid "Display name:" +msgstr "Rodyti vardą:" + +#: bookwyrm/templates/get_started/profile.html:22 +#: bookwyrm/templates/preferences/edit_user.html:49 +msgid "Summary:" +msgstr "Santrauka:" + +#: bookwyrm/templates/get_started/profile.html:23 +msgid "A little bit about you" +msgstr "Šiek tiek apie jus" + +#: bookwyrm/templates/get_started/profile.html:32 +#: bookwyrm/templates/preferences/edit_user.html:27 +msgid "Avatar:" +msgstr "Avataras:" + +#: bookwyrm/templates/get_started/profile.html:42 +#: bookwyrm/templates/preferences/edit_user.html:110 +msgid "Manually approve followers:" +msgstr "Noriu tvirtinti sekėjus:" + +#: bookwyrm/templates/get_started/profile.html:48 +#: bookwyrm/templates/preferences/edit_user.html:80 +msgid "Show this account in suggested users:" +msgstr "Paskyrą įtraukti į siūlomus narius:" + +#: bookwyrm/templates/get_started/profile.html:52 +msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users." +msgstr "Jūsų paskyra atsiras kataloge ir gali būti rekomenduota kitiems „BookWyrm“ nariams." + +#: bookwyrm/templates/get_started/users.html:11 +msgid "Search for a user" +msgstr "Ieškoti naudotojo" + +#: bookwyrm/templates/get_started/users.html:13 +#, python-format +msgid "No users found for \"%(query)s\"" +msgstr "Pagal paiešką „%(query)s“ nieko nerasta" + +#: bookwyrm/templates/groups/create_form.html:5 +msgid "Create Group" +msgstr "Sukurti grupę" + +#: bookwyrm/templates/groups/created_text.html:4 +#, python-format +msgid "Managed by %(username)s" +msgstr "Tvarko %(username)s" + +#: bookwyrm/templates/groups/delete_group_modal.html:4 +msgid "Delete this group?" +msgstr "Ištrinti šią grupę?" + +#: bookwyrm/templates/groups/delete_group_modal.html:7 +#: bookwyrm/templates/lists/delete_list_modal.html:7 +msgid "This action cannot be un-done" +msgstr "Nebegalite atšaukti šio veiksmo" + +#: bookwyrm/templates/groups/delete_group_modal.html:15 +#: bookwyrm/templates/lists/delete_list_modal.html:15 +#: bookwyrm/templates/settings/announcements/announcement.html:20 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36 +#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 +#: bookwyrm/templates/snippets/follow_request_buttons.html:12 +#: bookwyrm/templates/snippets/join_invitation_buttons.html:13 +msgid "Delete" +msgstr "Ištrinti" + +#: bookwyrm/templates/groups/edit_form.html:5 +msgid "Edit Group" +msgstr "Redaguoti grupę" + +#: bookwyrm/templates/groups/find_users.html:6 +msgid "Add new members!" +msgstr "Pridėkite naujų narių!" + +#: bookwyrm/templates/groups/form.html:8 +msgid "Group Name:" +msgstr "Grupės pavadinimas:" + +#: bookwyrm/templates/groups/form.html:12 +msgid "Group Description:" +msgstr "Grupės aprašymas:" + +#: bookwyrm/templates/groups/form.html:30 +msgid "Delete group" +msgstr "Ištrinti grupę" + +#: bookwyrm/templates/groups/group.html:15 +msgid "Search to add a user" +msgstr "Ieškokite, kad pridėtumėte naudotoją" + +#: bookwyrm/templates/groups/group.html:36 +msgid "This group has no lists" +msgstr "Šioje grupėje nėra sąrašų" + +#: bookwyrm/templates/groups/layout.html:16 +msgid "Edit group" +msgstr "Redaguoti grupę" + +#: bookwyrm/templates/groups/members.html:8 +msgid "Members can add and remove books on a group's book lists" +msgstr "Nariai gali pridėti ir pašalinti knygas grupės knygų sąrašuose" + +#: bookwyrm/templates/groups/members.html:19 +msgid "Leave group" +msgstr "Išeiti iš grupės" + +#: bookwyrm/templates/groups/members.html:41 +#: bookwyrm/templates/groups/suggested_users.html:32 +#: bookwyrm/templates/snippets/suggested_users.html:31 +#: bookwyrm/templates/user/user_preview.html:36 +msgid "Follows you" +msgstr "Jus seka" + +#: bookwyrm/templates/groups/suggested_users.html:17 +#: bookwyrm/templates/snippets/suggested_users.html:16 +#, python-format +msgid "%(mutuals)s follower you follow" +msgid_plural "%(mutuals)s followers you follow" +msgstr[0] "Sekate %(mutuals)s bendrą žmogų" +msgstr[1] "Sekate %(mutuals)s bendrus žmones" +msgstr[2] "Sekate %(mutuals)s bendrų žmonių" +msgstr[3] "Sekate %(mutuals)s bendrų žmonių" + +#: bookwyrm/templates/groups/suggested_users.html:24 +#: bookwyrm/templates/snippets/suggested_users.html:23 +#, python-format +msgid "%(shared_books)s book on your shelves" +msgid_plural "%(shared_books)s books on your shelves" +msgstr[0] "%(shared_books)s knyga jūsų lentynoje" +msgstr[1] "%(shared_books)s knygos jūsų lentynose" +msgstr[2] "%(shared_books)s knygų jūsų lentynose" +msgstr[3] "%(shared_books)s knygų jūsų lentynose" + +#: bookwyrm/templates/groups/suggested_users.html:40 +#, python-format +msgid "No potential members found for \"%(user_query)s\"" +msgstr "Užklausa „%(user_query)s“ nerasta potencialių narių" + +#: bookwyrm/templates/groups/user_groups.html:15 +msgid "Manager" +msgstr "Vadovas" + +#: bookwyrm/templates/import/import.html:5 +#: bookwyrm/templates/import/import.html:9 +#: bookwyrm/templates/shelf/shelf.html:61 +msgid "Import Books" +msgstr "Importuoti knygas" + +#: bookwyrm/templates/import/import.html:18 +msgid "Data source:" +msgstr "Duomenų šaltinis:" + +#: bookwyrm/templates/import/import.html:37 +msgid "Data file:" +msgstr "Duomenų failas:" + +#: bookwyrm/templates/import/import.html:45 +msgid "Include reviews" +msgstr "Įtraukti atsiliepimus" + +#: bookwyrm/templates/import/import.html:50 +msgid "Privacy setting for imported reviews:" +msgstr "Privatumo nustatymai svarbiems atsiliepimams:" + +#: bookwyrm/templates/import/import.html:56 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:64 +msgid "Import" +msgstr "Importuoti" + +#: bookwyrm/templates/import/import.html:61 +msgid "Recent Imports" +msgstr "Pastaruoju metu importuota" + +#: bookwyrm/templates/import/import.html:63 +msgid "No recent imports" +msgstr "Pastaruoju metu neimportuota" + +#: bookwyrm/templates/import/import_status.html:6 +#: bookwyrm/templates/import/import_status.html:15 +#: bookwyrm/templates/import/import_status.html:29 +msgid "Import Status" +msgstr "Importavimo būsena" + +#: bookwyrm/templates/import/import_status.html:13 +#: bookwyrm/templates/import/import_status.html:27 +msgid "Retry Status" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:22 +msgid "Imports" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:39 +msgid "Import started:" +msgstr "Importavimas prasidėjo:" + +#: bookwyrm/templates/import/import_status.html:48 +msgid "In progress" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:50 +msgid "Refresh" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:62 +#, python-format +msgid "%(display_counter)s item needs manual approval." +msgid_plural "%(display_counter)s items need manual approval." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: bookwyrm/templates/import/import_status.html:67 +#: bookwyrm/templates/import/manual_review.html:8 +msgid "Review items" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:73 +#, python-format +msgid "%(display_counter)s item failed to import." +msgid_plural "%(display_counter)s items failed to import." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: bookwyrm/templates/import/import_status.html:79 +msgid "View and troubleshoot failed items" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:91 +msgid "Row" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:94 +#: bookwyrm/templates/shelf/shelf.html:141 +#: bookwyrm/templates/shelf/shelf.html:163 +msgid "Title" +msgstr "Pavadinimas" + +#: bookwyrm/templates/import/import_status.html:97 +msgid "ISBN" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:100 +#: bookwyrm/templates/shelf/shelf.html:142 +#: bookwyrm/templates/shelf/shelf.html:166 +msgid "Author" +msgstr "Autorius" + +#: bookwyrm/templates/import/import_status.html:103 +msgid "Shelf" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:106 +#: bookwyrm/templates/import/manual_review.html:13 +#: bookwyrm/templates/snippets/create_status.html:17 +msgid "Review" +msgstr "Peržiūra" + +#: bookwyrm/templates/import/import_status.html:110 +msgid "Book" +msgstr "Knyga" + +#: bookwyrm/templates/import/import_status.html:113 +#: bookwyrm/templates/settings/announcements/announcements.html:38 +#: bookwyrm/templates/settings/federation/instance_list.html:46 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44 +#: bookwyrm/templates/settings/invites/status_filter.html:5 +#: bookwyrm/templates/settings/users/user_admin.html:34 +#: bookwyrm/templates/settings/users/user_info.html:20 +msgid "Status" +msgstr "Būsena" + +#: bookwyrm/templates/import/import_status.html:144 +msgid "View imported review" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:158 +msgid "Imported" +msgstr "Importuota" + +#: bookwyrm/templates/import/import_status.html:164 +msgid "Needs manual review" +msgstr "" + +#: bookwyrm/templates/import/manual_review.html:5 +#: bookwyrm/templates/import/troubleshoot.html:4 +msgid "Import Troubleshooting" +msgstr "" + +#: bookwyrm/templates/import/manual_review.html:21 +msgid "Approving a suggestion will permanently add the suggested book to your shelves and associate your reading dates, reviews, and ratings with that book." +msgstr "" + +#: bookwyrm/templates/import/manual_review.html:56 +#: bookwyrm/templates/lists/curate.html:57 +msgid "Approve" +msgstr "Patvirtinti" + +#: bookwyrm/templates/import/manual_review.html:64 +msgid "Reject" +msgstr "" + +#: bookwyrm/templates/import/tooltip.html:6 +msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." +msgstr "Galite atsisiųsti savo „Goodreads“ duomenis iš Importavimo ir eksportavimo puslapio, esančio jūsų „Goodreads“ paskyroje." + +#: bookwyrm/templates/import/troubleshoot.html:7 +msgid "Failed items" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:12 +msgid "Troubleshooting" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:20 +msgid "Re-trying an import can fix missing items in cases such as:" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:23 +msgid "The book has been added to the instance since this import" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:24 +msgid "A transient error or timeout caused the external data source to be unavailable." +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:25 +msgid "BookWyrm has been updated since this import with a bug fix" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:28 +msgid "Contact your admin or open an issue if you are seeing unexpected failed items." +msgstr "" + +#: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:230 +#, python-format +msgid "About %(site_name)s" +msgstr "Apie %(site_name)s" + +#: bookwyrm/templates/landing/about.html:10 +#: bookwyrm/templates/landing/about.html:20 +msgid "Code of Conduct" +msgstr "Elgesio kodeksas" + +#: bookwyrm/templates/landing/about.html:13 +#: bookwyrm/templates/landing/about.html:29 +msgid "Privacy Policy" +msgstr "Privatumo politika" + +#: bookwyrm/templates/landing/invite.html:4 +#: bookwyrm/templates/landing/invite.html:8 +#: bookwyrm/templates/landing/login.html:49 +msgid "Create an Account" +msgstr "Kurti paskyrą" + +#: bookwyrm/templates/landing/invite.html:21 +msgid "Permission Denied" +msgstr "Prieiga draudžiama" + +#: bookwyrm/templates/landing/invite.html:22 +msgid "Sorry! This invite code is no longer valid." +msgstr "Deja, šis pakvietimo kodas nebegalioja." + +#: bookwyrm/templates/landing/landing.html:6 +msgid "Recent Books" +msgstr "Naujos knygos" + +#: bookwyrm/templates/landing/layout.html:17 +msgid "Decentralized" +msgstr "Decentralizuota" + +#: bookwyrm/templates/landing/layout.html:23 +msgid "Friendly" +msgstr "Draugiškas" + +#: bookwyrm/templates/landing/layout.html:29 +msgid "Anti-Corporate" +msgstr "Nekorporacinis" + +#: bookwyrm/templates/landing/layout.html:45 +#, python-format +msgid "Join %(name)s" +msgstr "Prisijunkite prie %(name)s" + +#: bookwyrm/templates/landing/layout.html:47 +msgid "Request an Invitation" +msgstr "Prašyti kvietimo" + +#: bookwyrm/templates/landing/layout.html:49 +#, python-format +msgid "%(name)s registration is closed" +msgstr "%(name)s – registracija uždaryta" + +#: bookwyrm/templates/landing/layout.html:60 +msgid "Thank you! Your request has been received." +msgstr "Dėkojame, jūsų prašymas gautas." + +#: bookwyrm/templates/landing/layout.html:82 +msgid "Your Account" +msgstr "Jūsų paskyra" + +#: bookwyrm/templates/landing/login.html:4 +msgid "Login" +msgstr "Prisijungti" + +#: bookwyrm/templates/landing/login.html:7 +#: bookwyrm/templates/landing/login.html:37 bookwyrm/templates/layout.html:179 +msgid "Log in" +msgstr "Prisijunkite" + +#: bookwyrm/templates/landing/login.html:15 +msgid "Success! Email address confirmed." +msgstr "Džiugu, el. pašto adresas patvirtintas." + +#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:170 +#: bookwyrm/templates/snippets/register_form.html:4 +msgid "Username:" +msgstr "Naudotojo vardas:" + +#: bookwyrm/templates/landing/login.html:27 +#: bookwyrm/templates/landing/password_reset.html:17 +#: bookwyrm/templates/layout.html:174 +#: bookwyrm/templates/snippets/register_form.html:22 +msgid "Password:" +msgstr "Slaptažodis:" + +#: bookwyrm/templates/landing/login.html:40 bookwyrm/templates/layout.html:176 +msgid "Forgot your password?" +msgstr "Pamiršote slaptažodį?" + +#: bookwyrm/templates/landing/login.html:62 +msgid "More about this site" +msgstr "Daugiau apie šią svetainę" + +#: bookwyrm/templates/landing/password_reset.html:23 +#: bookwyrm/templates/preferences/change_password.html:18 +#: bookwyrm/templates/preferences/delete_user.html:20 +msgid "Confirm password:" +msgstr "Patvirtinti slaptažodį:" + +#: bookwyrm/templates/landing/password_reset_request.html:14 +msgid "A link to reset your password will be sent to your email address" +msgstr "Jūsų el. pašto adresu bus išsiųsta nuoroda pakeisti slaptažodį" + +#: bookwyrm/templates/landing/password_reset_request.html:28 +msgid "Reset password" +msgstr "Atstatyti slaptažodį" + +#: bookwyrm/templates/layout.html:13 +#, python-format +msgid "%(site_name)s search" +msgstr "%(site_name)s paieška" + +#: bookwyrm/templates/layout.html:43 +msgid "Search for a book, user, or list" +msgstr "Ieškoti knygos, naudotojo arba sąrašo" + +#: bookwyrm/templates/layout.html:61 bookwyrm/templates/layout.html:62 +msgid "Main navigation menu" +msgstr "Pagrindinis navigacijos meniu" + +#: bookwyrm/templates/layout.html:72 +msgid "Feed" +msgstr "Srautas" + +#: bookwyrm/templates/layout.html:116 +msgid "Settings" +msgstr "Nustatymai" + +#: bookwyrm/templates/layout.html:125 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:15 +#: bookwyrm/templates/settings/invites/manage_invites.html:3 +#: bookwyrm/templates/settings/invites/manage_invites.html:15 +#: bookwyrm/templates/settings/layout.html:40 +msgid "Invites" +msgstr "Pakvietimai" + +#: bookwyrm/templates/layout.html:132 +msgid "Admin" +msgstr "Administratorius" + +#: bookwyrm/templates/layout.html:139 +msgid "Log out" +msgstr "Atsijungti" + +#: bookwyrm/templates/layout.html:147 bookwyrm/templates/layout.html:148 +#: bookwyrm/templates/notifications/notifications_page.html:5 +#: bookwyrm/templates/notifications/notifications_page.html:10 +msgid "Notifications" +msgstr "Pranešimai" + +#: bookwyrm/templates/layout.html:175 +msgid "password" +msgstr "slaptažodis" + +#: bookwyrm/templates/layout.html:187 +msgid "Join" +msgstr "Prisijungti" + +#: bookwyrm/templates/layout.html:221 +msgid "Successfully posted status" +msgstr "Būsena publikuota sėkmingai" + +#: bookwyrm/templates/layout.html:222 +msgid "Error posting status" +msgstr "Klaida, publikuojant būseną" + +#: bookwyrm/templates/layout.html:234 +msgid "Contact site admin" +msgstr "Puslapio administratorius" + +#: bookwyrm/templates/layout.html:238 +msgid "Documentation" +msgstr "Dokumentacija" + +#: bookwyrm/templates/layout.html:245 +#, python-format +msgid "Support %(site_name)s on %(support_title)s" +msgstr "Paremkite %(site_name)s per %(support_title)s" + +#: bookwyrm/templates/layout.html:249 +msgid "BookWyrm's source code is freely available. You can contribute or report issues on GitHub." +msgstr "„BookWyrm“ šaltinio kodas yra laisvai prieinamas. Galite prisidėti arba pranešti apie klaidas per GitHub." + +#: bookwyrm/templates/lists/bookmark_button.html:30 +msgid "Un-save" +msgstr "Nebesaugoti" + +#: bookwyrm/templates/lists/create_form.html:5 +#: bookwyrm/templates/lists/lists.html:20 +msgid "Create List" +msgstr "Sukurti sąrašą" + +#: bookwyrm/templates/lists/created_text.html:5 +#, python-format +msgid "Created by %(username)s and managed by %(groupname)s" +msgstr "Sukūrė %(username)s, tvarko %(groupname)s" + +#: bookwyrm/templates/lists/created_text.html:7 +#, python-format +msgid "Created and curated by %(username)s" +msgstr "Sukūrė ir kuruoja %(username)s" + +#: bookwyrm/templates/lists/created_text.html:9 +#, python-format +msgid "Created by %(username)s" +msgstr "Sukūrė %(username)s" + +#: bookwyrm/templates/lists/curate.html:8 +msgid "Pending Books" +msgstr "Patvirtinimo laukiančios knygos" + +#: bookwyrm/templates/lists/curate.html:11 +msgid "Go to list" +msgstr "Eiti į sąrašą" + +#: bookwyrm/templates/lists/curate.html:15 +msgid "You're all set!" +msgstr "Viskas atlikta!" + +#: bookwyrm/templates/lists/curate.html:45 +msgid "Suggested by" +msgstr "Pasiūlė" + +#: bookwyrm/templates/lists/curate.html:63 +msgid "Discard" +msgstr "Atmesti" + +#: bookwyrm/templates/lists/delete_list_modal.html:4 +msgid "Delete this list?" +msgstr "Ištrinti šį sąrašą?" + +#: bookwyrm/templates/lists/edit_form.html:5 +#: bookwyrm/templates/lists/layout.html:16 +msgid "Edit List" +msgstr "Redaguoti sąrašą" + +#: bookwyrm/templates/lists/form.html:19 +msgid "List curation:" +msgstr "Sąrašo kuravimas:" + +#: bookwyrm/templates/lists/form.html:22 +msgid "Closed" +msgstr "Uždaryta" + +#: bookwyrm/templates/lists/form.html:23 +msgid "Only you can add and remove books to this list" +msgstr "Tik jūs galite pridėti ar pašalinti knygas iš šio sąrašo" + +#: bookwyrm/templates/lists/form.html:27 +msgid "Curated" +msgstr "Kuruojama" + +#: bookwyrm/templates/lists/form.html:28 +msgid "Anyone can suggest books, subject to your approval" +msgstr "Knygas gali siūlyti visi, tačiau jūs turėsite patvirtinti" + +#: bookwyrm/templates/lists/form.html:32 +msgctxt "curation type" +msgid "Open" +msgstr "Atidaryti" + +#: bookwyrm/templates/lists/form.html:33 +msgid "Anyone can add books to this list" +msgstr "Visi gali pridėti knygų į sąrašą" + +#: bookwyrm/templates/lists/form.html:37 +msgid "Group" +msgstr "Grupė" + +#: bookwyrm/templates/lists/form.html:38 +msgid "Group members can add to and remove from this list" +msgstr "Grupės nariai gali pridėti ir išimti iš sąrašo" + +#: bookwyrm/templates/lists/form.html:41 +msgid "Select Group" +msgstr "Pasirinkti grupę" + +#: bookwyrm/templates/lists/form.html:45 +msgid "Select a group" +msgstr "Pasirinkite grupę" + +#: bookwyrm/templates/lists/form.html:56 +msgid "You don't have any Groups yet!" +msgstr "Dar neturite grupių!" + +#: bookwyrm/templates/lists/form.html:58 +msgid "Create a Group" +msgstr "Sukurti grupę" + +#: bookwyrm/templates/lists/form.html:81 +msgid "Delete list" +msgstr "Ištrinti sąrašą" + +#: bookwyrm/templates/lists/list.html:21 +msgid "You successfully suggested a book for this list!" +msgstr "Sėkmingai pasiūlėte knygą šiam sąrašui!" + +#: bookwyrm/templates/lists/list.html:23 +msgid "You successfully added a book to this list!" +msgstr "Sėkmingai pridėjote knygą į šį sąrašą!" + +#: bookwyrm/templates/lists/list.html:29 +msgid "This list is currently empty" +msgstr "Šiuo metu sąrašas tuščias" + +#: bookwyrm/templates/lists/list.html:67 +#, python-format +msgid "Added by %(username)s" +msgstr "Pridėjo %(username)s" + +#: bookwyrm/templates/lists/list.html:76 +msgid "List position" +msgstr "Sąrašo pozicija" + +#: bookwyrm/templates/lists/list.html:82 +msgid "Set" +msgstr "Nustatyti" + +#: bookwyrm/templates/lists/list.html:92 +#: bookwyrm/templates/snippets/remove_from_group_button.html:19 +#: bookwyrm/templates/snippets/shelf_selector.html:26 +msgid "Remove" +msgstr "Pašalinti" + +#: bookwyrm/templates/lists/list.html:106 +#: bookwyrm/templates/lists/list.html:123 +msgid "Sort List" +msgstr "Rūšiuoti sąrašą" + +#: bookwyrm/templates/lists/list.html:116 +msgid "Direction" +msgstr "Kryptis" + +#: bookwyrm/templates/lists/list.html:130 +msgid "Add Books" +msgstr "Pridėti knygų" + +#: bookwyrm/templates/lists/list.html:132 +msgid "Suggest Books" +msgstr "Siūlyti knygų" + +#: bookwyrm/templates/lists/list.html:143 +msgid "search" +msgstr "paieška" + +#: bookwyrm/templates/lists/list.html:149 +msgid "Clear search" +msgstr "Išvalyti paiešką" + +#: bookwyrm/templates/lists/list.html:154 +#, python-format +msgid "No books found matching the query \"%(query)s\"" +msgstr "Pagal paiešką „%(query)s“ knygų nerasta" + +#: bookwyrm/templates/lists/list.html:182 +msgid "Suggest" +msgstr "Siūlyti" + +#: bookwyrm/templates/lists/list_items.html:15 +msgid "Saved" +msgstr "Išsaugota" + +#: bookwyrm/templates/lists/lists.html:14 bookwyrm/templates/user/lists.html:9 +msgid "Your Lists" +msgstr "Jūsų sąrašai" + +#: bookwyrm/templates/lists/lists.html:36 +msgid "All Lists" +msgstr "Visi sąrašai" + +#: bookwyrm/templates/lists/lists.html:40 +msgid "Saved Lists" +msgstr "Išsaugoti sąrašai" + +#: bookwyrm/templates/notifications/items/accept.html:16 +#, python-format +msgid "accepted your invitation to join group \"%(group_name)s\"" +msgstr "priėmė jūsų kvietimą prisijungti prie grupės „%(group_name)s“" + +#: bookwyrm/templates/notifications/items/add.html:24 +#, python-format +msgid "added %(book_title)s to your list \"%(list_name)s\"" +msgstr "į jūsų sąrašą „%(list_name)s“ pridėta %(book_title)s" + +#: bookwyrm/templates/notifications/items/add.html:31 +#, python-format +msgid "suggested adding %(book_title)s to your list \"%(list_name)s\"" +msgstr "į sąrašą „%(list_name)s\" patariama pridėti %(book_title)s" + +#: bookwyrm/templates/notifications/items/boost.html:19 +#, python-format +msgid "boosted your review of %(book_title)s" +msgstr "populiarėja jūsų atsiliepimas apie %(book_title)s" + +#: bookwyrm/templates/notifications/items/boost.html:25 +#, python-format +msgid "boosted your comment on%(book_title)s" +msgstr "populiarėja jūsų komentaras apie %(book_title)s" + +#: bookwyrm/templates/notifications/items/boost.html:31 +#, python-format +msgid "boosted your quote from %(book_title)s" +msgstr "populiarėja jūsų citata iš %(book_title)s" + +#: bookwyrm/templates/notifications/items/boost.html:37 +#, python-format +msgid "boosted your status" +msgstr "populiarėja jūsų būsena" + +#: bookwyrm/templates/notifications/items/fav.html:19 +#, python-format +msgid "liked your review of %(book_title)s" +msgstr "patiko jūsų atsiliepimas apie %(book_title)s" + +#: bookwyrm/templates/notifications/items/fav.html:25 +#, python-format +msgid "liked your comment on %(book_title)s" +msgstr "patiko jūsų komentaras apie %(book_title)s" + +#: bookwyrm/templates/notifications/items/fav.html:31 +#, python-format +msgid "liked your quote from %(book_title)s" +msgstr "patiko jūsų citata iš %(book_title)s" + +#: bookwyrm/templates/notifications/items/fav.html:37 +#, python-format +msgid "liked your status" +msgstr "patiko jūsų būsena" + +#: bookwyrm/templates/notifications/items/follow.html:15 +msgid "followed you" +msgstr "pradėjo jus sekti" + +#: bookwyrm/templates/notifications/items/follow_request.html:11 +msgid "sent you a follow request" +msgstr "nori jus sekti" + +#: bookwyrm/templates/notifications/items/import.html:14 +#, python-format +msgid "Your import completed." +msgstr "Jūsų importas baigtas." + +#: bookwyrm/templates/notifications/items/invite.html:15 +#, python-format +msgid "invited you to join the group \"%(group_name)s\"" +msgstr "jus pakvietė prisijungti prie grupės „%(group_name)s“" + +#: bookwyrm/templates/notifications/items/join.html:16 +#, python-format +msgid "has joined your group \"%(group_name)s\"" +msgstr "prisijungė prie jūsų grupės „%(group_name)s“" + +#: bookwyrm/templates/notifications/items/leave.html:16 +#, python-format +msgid "has left your group \"%(group_name)s\"" +msgstr "paliko jūsų grupę „%(group_name)s“" + +#: bookwyrm/templates/notifications/items/mention.html:20 +#, python-format +msgid "mentioned you in a review of %(book_title)s" +msgstr "paminėjo jus atsiliepime apie %(book_title)s" + +#: bookwyrm/templates/notifications/items/mention.html:26 +#, python-format +msgid "mentioned you in a comment on %(book_title)s" +msgstr "paminėjo jus komentare apie %(book_title)s" + +#: bookwyrm/templates/notifications/items/mention.html:32 +#, python-format +msgid "mentioned you in a quote from %(book_title)s" +msgstr "paminėjo jus citatoje iš %(book_title)s" + +#: bookwyrm/templates/notifications/items/mention.html:38 +#, python-format +msgid "mentioned you in a status" +msgstr "paminėjo jus būsenoje" + +#: bookwyrm/templates/notifications/items/remove.html:17 +#, python-format +msgid "has been removed from your group \"%(group_name)s\"" +msgstr "buvo pašalintas iš jūsų grupės „%(group_name)s“" + +#: bookwyrm/templates/notifications/items/remove.html:23 +#, python-format +msgid "You have been removed from the \"%(group_name)s\" group" +msgstr "Buvote pašalintas iš grupės „%(group_name)s“" + +#: bookwyrm/templates/notifications/items/reply.html:21 +#, python-format +msgid "replied to your review of %(book_title)s" +msgstr "atsakė į jūsų atsiliepimą apie %(book_title)s" + +#: bookwyrm/templates/notifications/items/reply.html:27 +#, python-format +msgid "replied to your comment on %(book_title)s" +msgstr "atsakė į jūsų komentarą apie %(book_title)s" + +#: bookwyrm/templates/notifications/items/reply.html:33 +#, python-format +msgid "replied to your quote from %(book_title)s" +msgstr "atsakė į jūsų citatą iš %(book_title)s" + +#: bookwyrm/templates/notifications/items/reply.html:39 +#, python-format +msgid "replied to your status" +msgstr "atsakė į jūsų būseną" + +#: bookwyrm/templates/notifications/items/report.html:15 +#, python-format +msgid "A new report needs moderation." +msgstr "Reikia moderuoti pranešimą." + +#: bookwyrm/templates/notifications/items/update.html:16 +#, python-format +msgid "has changed the privacy level for %(group_name)s" +msgstr "pakeitė privatumo lygį grupei %(group_name)s" + +#: bookwyrm/templates/notifications/items/update.html:20 +#, python-format +msgid "has changed the name of %(group_name)s" +msgstr "pakeitė %(group_name)s pavadinimą" + +#: bookwyrm/templates/notifications/items/update.html:24 +#, python-format +msgid "has changed the description of %(group_name)s" +msgstr "pakeitė %(group_name)s aprašymą" + +#: bookwyrm/templates/notifications/notifications_page.html:18 +msgid "Delete notifications" +msgstr "Ištrinti pranešimus" + +#: bookwyrm/templates/notifications/notifications_page.html:29 +msgid "All" +msgstr "Visi" + +#: bookwyrm/templates/notifications/notifications_page.html:33 +msgid "Mentions" +msgstr "Paminėjimai" + +#: bookwyrm/templates/notifications/notifications_page.html:45 +msgid "You're all caught up!" +msgstr "Viską peržiūrėjote!" + +#: bookwyrm/templates/preferences/blocks.html:4 +#: bookwyrm/templates/preferences/blocks.html:7 +#: bookwyrm/templates/preferences/layout.html:31 +msgid "Blocked Users" +msgstr "Blokuoti nariai" + +#: bookwyrm/templates/preferences/blocks.html:12 +msgid "No users currently blocked." +msgstr "Blokuotų narių nėra." + +#: bookwyrm/templates/preferences/change_password.html:4 +#: bookwyrm/templates/preferences/change_password.html:7 +#: bookwyrm/templates/preferences/change_password.html:21 +#: bookwyrm/templates/preferences/layout.html:20 +msgid "Change Password" +msgstr "Keisti slaptažodį" + +#: bookwyrm/templates/preferences/change_password.html:14 +msgid "New password:" +msgstr "Naujas slaptažodis:" + +#: bookwyrm/templates/preferences/delete_user.html:4 +#: bookwyrm/templates/preferences/delete_user.html:7 +#: bookwyrm/templates/preferences/delete_user.html:26 +#: bookwyrm/templates/preferences/layout.html:24 +#: bookwyrm/templates/settings/users/delete_user_form.html:23 +msgid "Delete Account" +msgstr "Pašalinti paskyrą" + +#: bookwyrm/templates/preferences/delete_user.html:12 +msgid "Permanently delete account" +msgstr "Visam laikui ištrinti paskyrą" + +#: bookwyrm/templates/preferences/delete_user.html:14 +msgid "Deleting your account cannot be undone. The username will not be available to register in the future." +msgstr "Nebegalėsite atstatyti ištrintos paskyros. Ateityje nebegalėsite naudoti šio naudotojo vardo." + +#: bookwyrm/templates/preferences/edit_user.html:4 +#: bookwyrm/templates/preferences/edit_user.html:7 +#: bookwyrm/templates/preferences/layout.html:15 +msgid "Edit Profile" +msgstr "Redaguoti profilį" + +#: bookwyrm/templates/preferences/edit_user.html:12 +#: bookwyrm/templates/preferences/edit_user.html:25 +#: bookwyrm/templates/settings/users/user_info.html:7 +msgid "Profile" +msgstr "Profilis" + +#: bookwyrm/templates/preferences/edit_user.html:13 +#: bookwyrm/templates/preferences/edit_user.html:68 +msgid "Display preferences" +msgstr "Vaizdo nustatymai" + +#: bookwyrm/templates/preferences/edit_user.html:14 +#: bookwyrm/templates/preferences/edit_user.html:106 +msgid "Privacy" +msgstr "Privatumas" + +#: bookwyrm/templates/preferences/edit_user.html:72 +msgid "Show reading goal prompt in feed:" +msgstr "Rodyti skaitymo tikslą sienoje:" + +#: bookwyrm/templates/preferences/edit_user.html:76 +msgid "Show suggested users:" +msgstr "Rodyti siūlomus narius:" + +#: bookwyrm/templates/preferences/edit_user.html:85 +#, python-format +msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users." +msgstr "Jūsų paskyra atsiras kataloge ir gali būti rekomenduota kitiems „BookWyrm“ nariams." + +#: bookwyrm/templates/preferences/edit_user.html:89 +msgid "Preferred Timezone: " +msgstr "Laiko juosta: " + +#: bookwyrm/templates/preferences/edit_user.html:116 +msgid "Default post privacy:" +msgstr "Numatytasis įrašo privatumas:" + +#: bookwyrm/templates/preferences/layout.html:11 +msgid "Account" +msgstr "Paskyra" + +#: bookwyrm/templates/preferences/layout.html:27 +msgid "Relationships" +msgstr "Sąsajos" + +#: bookwyrm/templates/reading_progress/finish.html:5 +#, python-format +msgid "Finish \"%(book_title)s\"" +msgstr "Užbaigti „%(book_title)s“" + +#: bookwyrm/templates/reading_progress/start.html:5 +#, python-format +msgid "Start \"%(book_title)s\"" +msgstr "Pradėti „%(book_title)s“" + +#: bookwyrm/templates/reading_progress/want.html:5 +#, python-format +msgid "Want to Read \"%(book_title)s\"" +msgstr "Noriu perskaityti „%(book_title)s“" + +#: bookwyrm/templates/search/book.html:47 +#: bookwyrm/templates/settings/reports/reports.html:25 +#: bookwyrm/templates/snippets/announcement.html:16 +msgid "Open" +msgstr "Atidaryti" + +#: bookwyrm/templates/search/book.html:85 +msgid "Import book" +msgstr "Importuoti knygą" + +#: bookwyrm/templates/search/book.html:107 +msgid "Load results from other catalogues" +msgstr "Įkelti rezultatus iš kitų katalogų" + +#: bookwyrm/templates/search/book.html:111 +msgid "Manually add book" +msgstr "Pridėti knygą" + +#: bookwyrm/templates/search/book.html:116 +msgid "Log in to import or add books." +msgstr "Prisijunkite, kad importuotumėte arba pridėtumėte knygas." + +#: bookwyrm/templates/search/layout.html:16 +msgid "Search query" +msgstr "Paieškos užklausa" + +#: bookwyrm/templates/search/layout.html:19 +msgid "Search type" +msgstr "Paieškos tipas" + +#: bookwyrm/templates/search/layout.html:23 +#: bookwyrm/templates/search/layout.html:46 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:27 +#: bookwyrm/templates/settings/federation/instance_list.html:44 +#: bookwyrm/templates/settings/layout.html:34 +#: bookwyrm/templates/settings/users/user_admin.html:3 +#: bookwyrm/templates/settings/users/user_admin.html:10 +msgid "Users" +msgstr "Nariai" + +#: bookwyrm/templates/search/layout.html:58 +#, python-format +msgid "No results found for \"%(query)s\"" +msgstr "Pagal paiešką „%(query)s“ nieko nerasta" + +#: bookwyrm/templates/settings/announcements/announcement.html:3 +#: bookwyrm/templates/settings/announcements/announcement.html:6 +msgid "Announcement" +msgstr "Pranešimas" + +#: bookwyrm/templates/settings/announcements/announcement.html:7 +#: bookwyrm/templates/settings/federation/instance.html:13 +msgid "Back to list" +msgstr "Atgal į sąrašą" + +#: bookwyrm/templates/settings/announcements/announcement.html:11 +#: bookwyrm/templates/settings/announcements/announcement_form.html:6 +msgid "Edit Announcement" +msgstr "Redaguoti pranešimą" + +#: bookwyrm/templates/settings/announcements/announcement.html:35 +msgid "Visible:" +msgstr "Matoma:" + +#: bookwyrm/templates/settings/announcements/announcement.html:38 +msgid "True" +msgstr "Tiesa" + +#: bookwyrm/templates/settings/announcements/announcement.html:40 +msgid "False" +msgstr "Netiesa" + +#: bookwyrm/templates/settings/announcements/announcement.html:47 +#: bookwyrm/templates/settings/announcements/announcement_form.html:40 +#: bookwyrm/templates/settings/dashboard/dashboard.html:71 +msgid "Start date:" +msgstr "Pradžios data:" + +#: bookwyrm/templates/settings/announcements/announcement.html:54 +#: bookwyrm/templates/settings/announcements/announcement_form.html:49 +#: bookwyrm/templates/settings/dashboard/dashboard.html:77 +msgid "End date:" +msgstr "Pabaigos data:" + +#: bookwyrm/templates/settings/announcements/announcement.html:60 +#: bookwyrm/templates/settings/announcements/announcement_form.html:58 +msgid "Active:" +msgstr "Aktyvu:" + +#: bookwyrm/templates/settings/announcements/announcement_form.html:8 +#: bookwyrm/templates/settings/announcements/announcements.html:8 +msgid "Create Announcement" +msgstr "Sukurti pranešimą" + +#: bookwyrm/templates/settings/announcements/announcement_form.html:16 +msgid "Preview:" +msgstr "Peržiūra:" + +#: bookwyrm/templates/settings/announcements/announcement_form.html:23 +msgid "Content:" +msgstr "Turinys:" + +#: bookwyrm/templates/settings/announcements/announcement_form.html:30 +msgid "Event date:" +msgstr "Įvykio data:" + +#: bookwyrm/templates/settings/announcements/announcements.html:3 +#: bookwyrm/templates/settings/announcements/announcements.html:5 +#: bookwyrm/templates/settings/layout.html:72 +msgid "Announcements" +msgstr "Pranešimai" + +#: bookwyrm/templates/settings/announcements/announcements.html:22 +#: bookwyrm/templates/settings/federation/instance_list.html:36 +msgid "Date added" +msgstr "Pridėjimo data" + +#: bookwyrm/templates/settings/announcements/announcements.html:26 +msgid "Preview" +msgstr "Peržiūrėti" + +#: bookwyrm/templates/settings/announcements/announcements.html:30 +msgid "Start date" +msgstr "Pradžios data" + +#: bookwyrm/templates/settings/announcements/announcements.html:34 +msgid "End date" +msgstr "Pabaigos data" + +#: bookwyrm/templates/settings/announcements/announcements.html:48 +msgid "active" +msgstr "aktyvus" + +#: bookwyrm/templates/settings/announcements/announcements.html:48 +msgid "inactive" +msgstr "neaktyvus" + +#: bookwyrm/templates/settings/announcements/announcements.html:52 +msgid "No announcements found" +msgstr "Pranešimų nerasta" + +#: bookwyrm/templates/settings/dashboard/dashboard.html:6 +#: bookwyrm/templates/settings/dashboard/dashboard.html:8 +#: bookwyrm/templates/settings/layout.html:26 +msgid "Dashboard" +msgstr "Suvestinė" + +#: bookwyrm/templates/settings/dashboard/dashboard.html:15 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 +msgid "Total users" +msgstr "Iš viso naudotojų" + +#: bookwyrm/templates/settings/dashboard/dashboard.html:21 +#: bookwyrm/templates/settings/dashboard/user_chart.html:16 +msgid "Active this month" +msgstr "Aktyvūs šį mėnesį" + +#: bookwyrm/templates/settings/dashboard/dashboard.html:27 +msgid "Statuses" +msgstr "Būsenos" + +#: bookwyrm/templates/settings/dashboard/dashboard.html:33 +#: bookwyrm/templates/settings/dashboard/works_chart.html:11 +msgid "Works" +msgstr "Darbai" + +#: bookwyrm/templates/settings/dashboard/dashboard.html:43 +#, python-format +msgid "%(display_count)s open report" +msgid_plural "%(display_count)s open reports" +msgstr[0] "%(display_count)s atvira ataskaita" +msgstr[1] "%(display_count)s atviros ataskaitos" +msgstr[2] "%(display_count)s atviros ataskaitos" +msgstr[3] "%(display_count)s atvirų ataskaitų" + +#: bookwyrm/templates/settings/dashboard/dashboard.html:54 +#, python-format +msgid "%(display_count)s invite request" +msgid_plural "%(display_count)s invite requests" +msgstr[0] "%(display_count)s prašymas pakviesti" +msgstr[1] "%(display_count)s prašymai pakviesti" +msgstr[2] "%(display_count)s prašymų pakviesti" +msgstr[3] "%(display_count)s prašymai pakviesti" + +#: bookwyrm/templates/settings/dashboard/dashboard.html:65 +msgid "Instance Activity" +msgstr "Pavyzdinė veikla" + +#: bookwyrm/templates/settings/dashboard/dashboard.html:83 +msgid "Interval:" +msgstr "Intervalas:" + +#: bookwyrm/templates/settings/dashboard/dashboard.html:87 +msgid "Days" +msgstr "Dienos" + +#: bookwyrm/templates/settings/dashboard/dashboard.html:88 +msgid "Weeks" +msgstr "Savaitės" + +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 +msgid "User signup activity" +msgstr "Naudotojo prisijungimo veikla" + +#: bookwyrm/templates/settings/dashboard/dashboard.html:112 +msgid "Status activity" +msgstr "Būsenos veikla" + +#: bookwyrm/templates/settings/dashboard/dashboard.html:118 +msgid "Works created" +msgstr "Darbai sukurti" + +#: bookwyrm/templates/settings/dashboard/registration_chart.html:10 +msgid "Registrations" +msgstr "Registracijos" + +#: bookwyrm/templates/settings/dashboard/status_chart.html:11 +msgid "Statuses posted" +msgstr "Būsenos publikuotos" + +#: bookwyrm/templates/settings/dashboard/user_chart.html:11 +msgid "Total" +msgstr "Iš viso" + +#: bookwyrm/templates/settings/email_blocklist/domain_form.html:5 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:10 +msgid "Add domain" +msgstr "Pridėti domeną" + +#: bookwyrm/templates/settings/email_blocklist/domain_form.html:11 +msgid "Domain:" +msgstr "Domenas:" + +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:5 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:7 +#: bookwyrm/templates/settings/layout.html:59 +msgid "Email Blocklist" +msgstr "El. pašto blokavimo sąrašas" + +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:18 +msgid "When someone tries to register with an email from this domain, no account will be created. The registration process will appear to have worked." +msgstr "Jei kažkas bandys registruotis prie šio domeno šiuo el. pašto adresu, paskyra nebus sukurta. Registracijos pricesas bus suveikęs." + +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:25 +msgid "Domain" +msgstr "Domenas" + +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:29 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:27 +msgid "Options" +msgstr "Parinktys" + +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:38 +#, python-format +msgid "%(display_count)s user" +msgid_plural "%(display_count)s users" +msgstr[0] "%(display_count)s narys" +msgstr[1] "%(display_count)s nariai" +msgstr[2] "%(display_count)s narių" +msgstr[3] "%(display_count)s nariai" + +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:59 +msgid "No email domains currently blocked" +msgstr "Šiuo metu neblokuojamas nė vienas el. pašto domenas" + +#: bookwyrm/templates/settings/federation/edit_instance.html:3 +#: bookwyrm/templates/settings/federation/edit_instance.html:6 +#: bookwyrm/templates/settings/federation/edit_instance.html:20 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:3 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:20 +#: bookwyrm/templates/settings/federation/instance_list.html:9 +#: bookwyrm/templates/settings/federation/instance_list.html:10 +msgid "Add instance" +msgstr "Pridėti serverį" + +#: bookwyrm/templates/settings/federation/edit_instance.html:7 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:7 +msgid "Back to instance list" +msgstr "Grįžti į serverių sąrašą" + +#: bookwyrm/templates/settings/federation/edit_instance.html:16 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:16 +msgid "Import block list" +msgstr "Importuoti blokuojamų sąrašą" + +#: bookwyrm/templates/settings/federation/edit_instance.html:30 +msgid "Instance:" +msgstr "Serveris:" + +#: bookwyrm/templates/settings/federation/edit_instance.html:39 +#: bookwyrm/templates/settings/federation/instance.html:28 +#: bookwyrm/templates/settings/users/user_info.html:106 +msgid "Status:" +msgstr "Būsena:" + +#: bookwyrm/templates/settings/federation/edit_instance.html:52 +#: bookwyrm/templates/settings/federation/instance.html:22 +#: bookwyrm/templates/settings/users/user_info.html:100 +msgid "Software:" +msgstr "Programinė įranga:" + +#: bookwyrm/templates/settings/federation/edit_instance.html:61 +#: bookwyrm/templates/settings/federation/instance.html:25 +#: bookwyrm/templates/settings/users/user_info.html:103 +msgid "Version:" +msgstr "Versija:" + +#: bookwyrm/templates/settings/federation/edit_instance.html:70 +msgid "Notes:" +msgstr "Užrašai:" + +#: bookwyrm/templates/settings/federation/instance.html:19 +msgid "Details" +msgstr "Išsami informacija" + +#: bookwyrm/templates/settings/federation/instance.html:35 +#: bookwyrm/templates/user/layout.html:64 +msgid "Activity" +msgstr "Veikla" + +#: bookwyrm/templates/settings/federation/instance.html:38 +msgid "Users:" +msgstr "Nariai:" + +#: bookwyrm/templates/settings/federation/instance.html:41 +#: bookwyrm/templates/settings/federation/instance.html:47 +msgid "View all" +msgstr "Žiūrėti viską" + +#: bookwyrm/templates/settings/federation/instance.html:44 +#: bookwyrm/templates/settings/users/user_info.html:56 +msgid "Reports:" +msgstr "Pranešimai:" + +#: bookwyrm/templates/settings/federation/instance.html:50 +msgid "Followed by us:" +msgstr "Sekame:" + +#: bookwyrm/templates/settings/federation/instance.html:55 +msgid "Followed by them:" +msgstr "Seka:" + +#: bookwyrm/templates/settings/federation/instance.html:60 +msgid "Blocked by us:" +msgstr "Blokuojame:" + +#: bookwyrm/templates/settings/federation/instance.html:72 +#: bookwyrm/templates/settings/users/user_info.html:110 +msgid "Notes" +msgstr "Užrašai" + +#: bookwyrm/templates/settings/federation/instance.html:75 +#: bookwyrm/templates/snippets/status/status_options.html:24 +msgid "Edit" +msgstr "Redaguoti" + +#: bookwyrm/templates/settings/federation/instance.html:79 +msgid "No notes" +msgstr "Užrašų nėra" + +#: bookwyrm/templates/settings/federation/instance.html:94 +#: bookwyrm/templates/settings/users/user_moderation_actions.html:8 +msgid "Actions" +msgstr "Veiksmai" + +#: bookwyrm/templates/settings/federation/instance.html:98 +#: bookwyrm/templates/snippets/block_button.html:5 +msgid "Block" +msgstr "Blokuoti" + +#: bookwyrm/templates/settings/federation/instance.html:99 +msgid "All users from this instance will be deactivated." +msgstr "Visi šio serverio nariai bus deaktyvuoti." + +#: bookwyrm/templates/settings/federation/instance.html:104 +#: bookwyrm/templates/snippets/block_button.html:10 +msgid "Un-block" +msgstr "Atblokuoti" + +#: bookwyrm/templates/settings/federation/instance.html:105 +msgid "All users from this instance will be re-activated." +msgstr "Visi šio serverio nariai bus vėl aktyvuoti." + +#: bookwyrm/templates/settings/federation/instance_blocklist.html:6 +msgid "Import Blocklist" +msgstr "Importuoti blokuojamų sąrašą" + +#: bookwyrm/templates/settings/federation/instance_blocklist.html:26 +#: bookwyrm/templates/snippets/goal_progress.html:7 +msgid "Success!" +msgstr "Valio!" + +#: bookwyrm/templates/settings/federation/instance_blocklist.html:30 +msgid "Successfully blocked:" +msgstr "Sėkmingai užblokuota:" + +#: bookwyrm/templates/settings/federation/instance_blocklist.html:32 +msgid "Failed:" +msgstr "Nepavyko:" + +#: bookwyrm/templates/settings/federation/instance_list.html:3 +#: bookwyrm/templates/settings/federation/instance_list.html:5 +#: bookwyrm/templates/settings/layout.html:45 +msgid "Federated Instances" +msgstr "Susijungę serveriai" + +#: bookwyrm/templates/settings/federation/instance_list.html:32 +#: bookwyrm/templates/settings/users/server_filter.html:5 +msgid "Instance name" +msgstr "Serverio pavadinimas" + +#: bookwyrm/templates/settings/federation/instance_list.html:40 +msgid "Software" +msgstr "Programinė įranga" + +#: bookwyrm/templates/settings/federation/instance_list.html:63 +msgid "No instances found" +msgstr "Serverių nerasta" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:4 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:11 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:25 +#: bookwyrm/templates/settings/invites/manage_invites.html:11 +msgid "Invite Requests" +msgstr "Kvietimo prašymai" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:23 +msgid "Ignored Invite Requests" +msgstr "Ignoruoti kvietimo prašymai" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:35 +msgid "Date requested" +msgstr "Prašymo data" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:39 +msgid "Date accepted" +msgstr "Priėmimo data" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:42 +msgid "Email" +msgstr "El. paštas" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:47 +msgid "Action" +msgstr "Veiksmas" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:50 +msgid "No requests" +msgstr "Prašymų nėra" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:59 +#: bookwyrm/templates/settings/invites/status_filter.html:16 +msgid "Accepted" +msgstr "Priimta" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:61 +#: bookwyrm/templates/settings/invites/status_filter.html:12 +msgid "Sent" +msgstr "Išsiųsta" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:63 +#: bookwyrm/templates/settings/invites/status_filter.html:8 +msgid "Requested" +msgstr "Užklausta" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:73 +msgid "Send invite" +msgstr "Siųsti pakvietimą" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:75 +msgid "Re-send invite" +msgstr "Pakartotinai siųsti pakvietimą" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:95 +msgid "Ignore" +msgstr "Ignoruoti" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:97 +msgid "Un-ignore" +msgstr "Nebeignoruoti" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:108 +msgid "Back to pending requests" +msgstr "Grįžti į laukiančius prašymus" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:110 +msgid "View ignored requests" +msgstr "Žiūrėti ignoruotus prašymus" + +#: bookwyrm/templates/settings/invites/manage_invites.html:21 +msgid "Generate New Invite" +msgstr "Sugeneruoti naują pakvietimą" + +#: bookwyrm/templates/settings/invites/manage_invites.html:27 +msgid "Expiry:" +msgstr "Galiojimo pabaiga:" + +#: bookwyrm/templates/settings/invites/manage_invites.html:33 +msgid "Use limit:" +msgstr "Naudojimo limitas:" + +#: bookwyrm/templates/settings/invites/manage_invites.html:40 +msgid "Create Invite" +msgstr "Sukurti pakvietimą" + +#: bookwyrm/templates/settings/invites/manage_invites.html:47 +msgid "Link" +msgstr "Nuoroda" + +#: bookwyrm/templates/settings/invites/manage_invites.html:48 +msgid "Expires" +msgstr "Baigia galioti" + +#: bookwyrm/templates/settings/invites/manage_invites.html:49 +msgid "Max uses" +msgstr "Maks. naudojimų" + +#: bookwyrm/templates/settings/invites/manage_invites.html:50 +msgid "Times used" +msgstr "Kartų naudota" + +#: bookwyrm/templates/settings/invites/manage_invites.html:53 +msgid "No active invites" +msgstr "Nėra aktyvių pakvietimų" + +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:5 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:10 +msgid "Add IP address" +msgstr "Pridėti IP adresą" + +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:11 +msgid "Use IP address blocks with caution, and consider using blocks only temporarily, as IP addresses are often shared or change hands. If you block your own IP, you will not be able to access this page." +msgstr "Atsargiai naudokite IP adresų blokus. Rekomenduojame juos naudoti tik laikinai, nes IP adresai dažnu atveju yra bendrinami arba pereina kitiems. Jei užblokuosite savo IP, nebegalėsite pasiekti šio puslapio." + +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:18 +msgid "IP Address:" +msgstr "IP adresas:" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:5 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:7 +#: bookwyrm/templates/settings/layout.html:63 +msgid "IP Address Blocklist" +msgstr "Juodasis IP adresų sąrašas" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:18 +msgid "Any traffic from this IP address will get a 404 response when trying to access any part of the application." +msgstr "Bandant pasiekti bet kurią programėlės dalį, šiam IP adresui visada matysis 404 klaidos kodas." + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:24 +msgid "Address" +msgstr "Adresas" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:46 +msgid "No IP addresses currently blocked" +msgstr "Šiuo metu neblokuojamas joks IP adresas" + +#: bookwyrm/templates/settings/ip_blocklist/ip_tooltip.html:6 +msgid "You can block IP ranges using CIDR syntax." +msgstr "IP rėžius galite blokuoti naudodami CIDR sintaksę." + +#: bookwyrm/templates/settings/layout.html:4 +msgid "Administration" +msgstr "Administravimas" + +#: bookwyrm/templates/settings/layout.html:29 +msgid "Manage Users" +msgstr "Tvarkyti naudotojus" + +#: bookwyrm/templates/settings/layout.html:51 +msgid "Moderation" +msgstr "Moderavimas" + +#: bookwyrm/templates/settings/layout.html:55 +#: bookwyrm/templates/settings/reports/reports.html:8 +#: bookwyrm/templates/settings/reports/reports.html:17 +msgid "Reports" +msgstr "Pranešimai" + +#: bookwyrm/templates/settings/layout.html:68 +msgid "Instance Settings" +msgstr "Serverio nustatymai" + +#: bookwyrm/templates/settings/layout.html:76 +#: bookwyrm/templates/settings/site.html:4 +#: bookwyrm/templates/settings/site.html:6 +msgid "Site Settings" +msgstr "Puslapio nustatymai" + +#: bookwyrm/templates/settings/reports/report.html:5 +#: bookwyrm/templates/settings/reports/report.html:8 +#: bookwyrm/templates/settings/reports/report_preview.html:6 +#, python-format +msgid "Report #%(report_id)s: %(username)s" +msgstr "Pranešti apie #%(report_id)s: %(username)s" + +#: bookwyrm/templates/settings/reports/report.html:9 +msgid "Back to reports" +msgstr "Atgal į pranešimus" + +#: bookwyrm/templates/settings/reports/report.html:23 +msgid "Moderator Comments" +msgstr "Moderatoriaus komentarai" + +#: bookwyrm/templates/settings/reports/report.html:41 +#: bookwyrm/templates/snippets/create_status.html:28 +msgid "Comment" +msgstr "Komentuoti" + +#: bookwyrm/templates/settings/reports/report.html:46 +msgid "Reported statuses" +msgstr "Praneštos būsenos" + +#: bookwyrm/templates/settings/reports/report.html:48 +msgid "No statuses reported" +msgstr "Nepranešta apie būsenas" + +#: bookwyrm/templates/settings/reports/report.html:54 +msgid "Status has been deleted" +msgstr "Būsena ištrinta" + +#: bookwyrm/templates/settings/reports/report_preview.html:13 +msgid "No notes provided" +msgstr "Užrašų nepateikta" + +#: bookwyrm/templates/settings/reports/report_preview.html:20 +#, python-format +msgid "Reported by %(username)s" +msgstr "Pranešė %(username)s" + +#: bookwyrm/templates/settings/reports/report_preview.html:30 +msgid "Re-open" +msgstr "Atidaryti pakartotinai" + +#: bookwyrm/templates/settings/reports/report_preview.html:32 +msgid "Resolve" +msgstr "Išspręsti" + +#: bookwyrm/templates/settings/reports/reports.html:6 +#, python-format +msgid "Reports: %(instance_name)s" +msgstr "Pranešimai: %(instance_name)s" + +#: bookwyrm/templates/settings/reports/reports.html:14 +#, python-format +msgid "Reports: %(instance_name)s" +msgstr "Pranešimai: %(instance_name)s" + +#: bookwyrm/templates/settings/reports/reports.html:28 +msgid "Resolved" +msgstr "Išspręsta" + +#: bookwyrm/templates/settings/reports/reports.html:37 +msgid "No reports found." +msgstr "Pranešimų nerasta." + +#: bookwyrm/templates/settings/site.html:10 +#: bookwyrm/templates/settings/site.html:21 +msgid "Instance Info" +msgstr "Serverio informacija" + +#: bookwyrm/templates/settings/site.html:11 +#: bookwyrm/templates/settings/site.html:54 +msgid "Images" +msgstr "Paveikslėliai" + +#: bookwyrm/templates/settings/site.html:12 +#: bookwyrm/templates/settings/site.html:74 +msgid "Footer Content" +msgstr "Poraštės turinys" + +#: bookwyrm/templates/settings/site.html:13 +#: bookwyrm/templates/settings/site.html:98 +msgid "Registration" +msgstr "Registracija" + +#: bookwyrm/templates/settings/site.html:24 +msgid "Instance Name:" +msgstr "Serverio pavadinimas:" + +#: bookwyrm/templates/settings/site.html:28 +msgid "Tagline:" +msgstr "Žymos linija:" + +#: bookwyrm/templates/settings/site.html:32 +msgid "Instance description:" +msgstr "Serverio aprašymas:" + +#: bookwyrm/templates/settings/site.html:36 +msgid "Short description:" +msgstr "Trumpas aprašymas:" + +#: bookwyrm/templates/settings/site.html:37 +msgid "Used when the instance is previewed on joinbookwyrm.com. Does not support HTML or Markdown." +msgstr "Naudota, kai turinys buvo peržiūrimas per joinbookwyrm.com. Nepalaiko HTML arba „Markdown“." + +#: bookwyrm/templates/settings/site.html:41 +msgid "Code of conduct:" +msgstr "Elgesio kodeksas:" + +#: bookwyrm/templates/settings/site.html:45 +msgid "Privacy Policy:" +msgstr "Privatumo politika:" + +#: bookwyrm/templates/settings/site.html:57 +msgid "Logo:" +msgstr "Logotipas:" + +#: bookwyrm/templates/settings/site.html:61 +msgid "Logo small:" +msgstr "Mažas logotipas:" + +#: bookwyrm/templates/settings/site.html:65 +msgid "Favicon:" +msgstr "Puslapio ikonėlė:" + +#: bookwyrm/templates/settings/site.html:77 +msgid "Support link:" +msgstr "Paramos nuoroda:" + +#: bookwyrm/templates/settings/site.html:81 +msgid "Support title:" +msgstr "Paramos pavadinimas:" + +#: bookwyrm/templates/settings/site.html:85 +msgid "Admin email:" +msgstr "Administratoriaus el. paštas:" + +#: bookwyrm/templates/settings/site.html:89 +msgid "Additional info:" +msgstr "Papildoma informacija:" + +#: bookwyrm/templates/settings/site.html:103 +msgid "Allow registration" +msgstr "Leisti registruotis" + +#: bookwyrm/templates/settings/site.html:109 +msgid "Allow invite requests" +msgstr "Leisti prašyti kvietimų" + +#: bookwyrm/templates/settings/site.html:115 +msgid "Require users to confirm email address" +msgstr "Reikalauti el. pašto patvirtinimo" + +#: bookwyrm/templates/settings/site.html:117 +msgid "(Recommended if registration is open)" +msgstr "(Rekomenduojama, jei leidžiama registruotis)" + +#: bookwyrm/templates/settings/site.html:120 +msgid "Registration closed text:" +msgstr "Užrakintos registracijos tekstas:" + +#: bookwyrm/templates/settings/site.html:124 +msgid "Invite request text:" +msgstr "Kvietimo prašymo tekstas:" + +#: bookwyrm/templates/settings/users/delete_user_form.html:5 +#: bookwyrm/templates/settings/users/user_moderation_actions.html:31 +msgid "Permanently delete user" +msgstr "Visam laikui ištrinti vartotoją" + +#: bookwyrm/templates/settings/users/delete_user_form.html:12 +#, python-format +msgid "Are you sure you want to delete %(username)s's account? This action cannot be undone. To proceed, please enter your password to confirm deletion." +msgstr "Ar tikrai norite ištrinti %(username)s paskyrą? To negalėsite atšaukti. Norėdami tęsti, įveskite savo slaptažodį, kad patvirtintumėte sprendimą trinti." + +#: bookwyrm/templates/settings/users/delete_user_form.html:17 +msgid "Your password:" +msgstr "Jūsų slaptažodis:" + +#: bookwyrm/templates/settings/users/user.html:7 +msgid "Back to users" +msgstr "Atgal į vartotojų sąrašą" + +#: bookwyrm/templates/settings/users/user_admin.html:7 +#, python-format +msgid "Users: %(instance_name)s" +msgstr "Vartotojai: %(instance_name)s" + +#: bookwyrm/templates/settings/users/user_admin.html:22 +#: bookwyrm/templates/settings/users/username_filter.html:5 +msgid "Username" +msgstr "Vartotojo vardas" + +#: bookwyrm/templates/settings/users/user_admin.html:26 +msgid "Date Added" +msgstr "Pridėjimo data" + +#: bookwyrm/templates/settings/users/user_admin.html:30 +msgid "Last Active" +msgstr "Paskutinį kartą aktyvus" + +#: bookwyrm/templates/settings/users/user_admin.html:38 +msgid "Remote instance" +msgstr "Nutolęs serveris" + +#: bookwyrm/templates/settings/users/user_admin.html:47 +#: bookwyrm/templates/settings/users/user_info.html:24 +msgid "Active" +msgstr "Aktyvus" + +#: bookwyrm/templates/settings/users/user_admin.html:47 +#: bookwyrm/templates/settings/users/user_info.html:28 +msgid "Inactive" +msgstr "Neaktyvus" + +#: bookwyrm/templates/settings/users/user_admin.html:52 +#: bookwyrm/templates/settings/users/user_info.html:120 +msgid "Not set" +msgstr "Nenustatytas" + +#: bookwyrm/templates/settings/users/user_info.html:16 +msgid "View user profile" +msgstr "Peržiūrėti vartotojo profilį" + +#: bookwyrm/templates/settings/users/user_info.html:36 +msgid "Local" +msgstr "Vietinis" + +#: bookwyrm/templates/settings/users/user_info.html:38 +msgid "Remote" +msgstr "Nutolęs" + +#: bookwyrm/templates/settings/users/user_info.html:47 +msgid "User details" +msgstr "Vartotojo duomenys" + +#: bookwyrm/templates/settings/users/user_info.html:51 +msgid "Email:" +msgstr "El. paštas:" + +#: bookwyrm/templates/settings/users/user_info.html:61 +msgid "(View reports)" +msgstr "(Peržiūrėti ataskaitas)" + +#: bookwyrm/templates/settings/users/user_info.html:67 +msgid "Blocked by count:" +msgstr "Užblokavę:" + +#: bookwyrm/templates/settings/users/user_info.html:70 +msgid "Last active date:" +msgstr "Paskutinį kartą aktyvus:" + +#: bookwyrm/templates/settings/users/user_info.html:73 +msgid "Manually approved followers:" +msgstr "Patvirtinti sekėjai:" + +#: bookwyrm/templates/settings/users/user_info.html:76 +msgid "Discoverable:" +msgstr "Aptinkama:" + +#: bookwyrm/templates/settings/users/user_info.html:80 +msgid "Deactivation reason:" +msgstr "Išjungimo priežastis:" + +#: bookwyrm/templates/settings/users/user_info.html:95 +msgid "Instance details" +msgstr "Serverio informacija" + +#: bookwyrm/templates/settings/users/user_info.html:117 +msgid "View instance" +msgstr "Peržiūrėti serverį" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:5 +msgid "Permanently deleted" +msgstr "Visam laikui ištrintas" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:13 +#: bookwyrm/templates/snippets/status/status_options.html:32 +#: bookwyrm/templates/snippets/user_options.html:13 +msgid "Send direct message" +msgstr "Siųsti asmeninę žinutę" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:20 +msgid "Suspend user" +msgstr "Laikinai išjungti vartotoją" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:25 +msgid "Un-suspend user" +msgstr "Atblokuoti narį" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:47 +msgid "Access level:" +msgstr "Priėjimo lygis:" + +#: bookwyrm/templates/shelf/create_shelf_form.html:5 +msgid "Create Shelf" +msgstr "Sukurti lentyną" + +#: bookwyrm/templates/shelf/edit_shelf_form.html:5 +msgid "Edit Shelf" +msgstr "Redaguoti lentyną" + +#: bookwyrm/templates/shelf/shelf.html:28 bookwyrm/views/shelf/shelf.py:53 +msgid "All books" +msgstr "Visos knygos" + +#: bookwyrm/templates/shelf/shelf.html:69 +msgid "Create shelf" +msgstr "Sukurti lentyną" + +#: bookwyrm/templates/shelf/shelf.html:90 +#, python-format +msgid "%(formatted_count)s book" +msgid_plural "%(formatted_count)s books" +msgstr[0] "%(formatted_count)s knyga" +msgstr[1] "%(formatted_count)s knygos" +msgstr[2] "%(formatted_count)s knygų" +msgstr[3] "%(formatted_count)s knygos" + +#: bookwyrm/templates/shelf/shelf.html:97 +#, python-format +msgid "(showing %(start)s-%(end)s)" +msgstr "(rodoma %(start)s–%(end)s)" + +#: bookwyrm/templates/shelf/shelf.html:109 +msgid "Edit shelf" +msgstr "Redaguoti lentyną" + +#: bookwyrm/templates/shelf/shelf.html:117 +msgid "Delete shelf" +msgstr "Ištrinti lentyną" + +#: bookwyrm/templates/shelf/shelf.html:145 +#: bookwyrm/templates/shelf/shelf.html:171 +msgid "Shelved" +msgstr "Sudėta į lentynas" + +#: bookwyrm/templates/shelf/shelf.html:146 +#: bookwyrm/templates/shelf/shelf.html:174 +msgid "Started" +msgstr "Pradėta" + +#: bookwyrm/templates/shelf/shelf.html:147 +#: bookwyrm/templates/shelf/shelf.html:177 +msgid "Finished" +msgstr "Baigta" + +#: bookwyrm/templates/shelf/shelf.html:203 +msgid "This shelf is empty." +msgstr "Ši lentyna tuščia." + +#: bookwyrm/templates/snippets/add_to_group_button.html:15 +msgid "Invite" +msgstr "Pakviesti" + +#: bookwyrm/templates/snippets/add_to_group_button.html:24 +msgid "Uninvite" +msgstr "Atšaukti kvietimą" + +#: bookwyrm/templates/snippets/add_to_group_button.html:28 +#, python-format +msgid "Remove @%(username)s" +msgstr "Pašalinti @%(username)s" + +#: bookwyrm/templates/snippets/announcement.html:31 +#, python-format +msgid "Posted by %(username)s" +msgstr "Publikavo %(username)s" + +#: bookwyrm/templates/snippets/authors.html:22 +#, python-format +msgid "and %(remainder_count_display)s other" +msgid_plural "and %(remainder_count_display)s others" +msgstr[0] "ir %(remainder_count_display)s kitas" +msgstr[1] "ir %(remainder_count_display)s kiti" +msgstr[2] "ir %(remainder_count_display)s kitų" +msgstr[3] "ir %(remainder_count_display)s kitų" + +#: bookwyrm/templates/snippets/book_cover.html:61 +msgid "No cover" +msgstr "Nėra viršelio" + +#: bookwyrm/templates/snippets/book_titleby.html:6 +#, python-format +msgid "%(title)s by" +msgstr "%(title)s" + +#: bookwyrm/templates/snippets/boost_button.html:20 +#: bookwyrm/templates/snippets/boost_button.html:21 +msgid "Boost" +msgstr "Populiarinti" + +#: bookwyrm/templates/snippets/boost_button.html:33 +#: bookwyrm/templates/snippets/boost_button.html:34 +msgid "Un-boost" +msgstr "Nepopuliarinti" + +#: bookwyrm/templates/snippets/create_status.html:39 +msgid "Quote" +msgstr "Citata" + +#: bookwyrm/templates/snippets/create_status/comment.html:15 +msgid "Some thoughts on the book" +msgstr "Mintys apie knygą" + +#: bookwyrm/templates/snippets/create_status/comment.html:27 +#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:15 +msgid "Progress:" +msgstr "Progresas:" + +#: bookwyrm/templates/snippets/create_status/comment.html:53 +#: bookwyrm/templates/snippets/progress_field.html:18 +msgid "pages" +msgstr "puslapiai" + +#: bookwyrm/templates/snippets/create_status/comment.html:59 +#: bookwyrm/templates/snippets/progress_field.html:23 +msgid "percent" +msgstr "procentai" + +#: bookwyrm/templates/snippets/create_status/comment.html:66 +#, python-format +msgid "of %(pages)s pages" +msgstr "iš %(pages)s psl." + +#: bookwyrm/templates/snippets/create_status/content_field.html:17 +#: bookwyrm/templates/snippets/status/layout.html:34 +#: bookwyrm/templates/snippets/status/layout.html:52 +#: bookwyrm/templates/snippets/status/layout.html:53 +msgid "Reply" +msgstr "Atsakyti" + +#: bookwyrm/templates/snippets/create_status/content_field.html:17 +msgid "Content" +msgstr "Turinys" + +#: bookwyrm/templates/snippets/create_status/content_warning_field.html:10 +msgid "Content warning:" +msgstr "Įspėjimas dėl turinio:" + +#: bookwyrm/templates/snippets/create_status/content_warning_field.html:18 +msgid "Spoilers ahead!" +msgstr "Galimas turinio atskleidimas!" + +#: bookwyrm/templates/snippets/create_status/content_warning_toggle.html:13 +msgid "Include spoiler alert" +msgstr "Įdėti įspėjimą apie turinio atskleidimą" + +#: bookwyrm/templates/snippets/create_status/layout.html:48 +#: bookwyrm/templates/snippets/reading_modals/form.html:7 +msgid "Comment:" +msgstr "Komentuoti:" + +#: bookwyrm/templates/snippets/create_status/post_options_block.html:8 +#: bookwyrm/templates/snippets/privacy-icons.html:15 +#: bookwyrm/templates/snippets/privacy-icons.html:16 +#: bookwyrm/templates/snippets/privacy_select.html:20 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:17 +msgid "Private" +msgstr "Privatu" + +#: bookwyrm/templates/snippets/create_status/post_options_block.html:21 +msgid "Post" +msgstr "Publikuoti" + +#: bookwyrm/templates/snippets/create_status/quotation.html:17 +msgid "Quote:" +msgstr "Citata:" + +#: bookwyrm/templates/snippets/create_status/quotation.html:25 +#, python-format +msgid "An excerpt from '%(book_title)s'" +msgstr "Ištrauka iš „%(book_title)s“" + +#: bookwyrm/templates/snippets/create_status/quotation.html:32 +msgid "Position:" +msgstr "Pozicija:" + +#: bookwyrm/templates/snippets/create_status/quotation.html:45 +msgid "On page:" +msgstr "Puslapyje:" + +#: bookwyrm/templates/snippets/create_status/quotation.html:51 +msgid "At percent:" +msgstr "Proc.:" + +#: bookwyrm/templates/snippets/create_status/review.html:25 +#, python-format +msgid "Your review of '%(book_title)s'" +msgstr "Jūsų apžvalga apie „%(book_title)s“" + +#: bookwyrm/templates/snippets/create_status/review.html:40 +msgid "Review:" +msgstr "Atsiliepimas:" + +#: bookwyrm/templates/snippets/delete_readthrough_modal.html:4 +msgid "Delete these read dates?" +msgstr "Ištrinti šias skaitymo datas?" + +#: bookwyrm/templates/snippets/delete_readthrough_modal.html:7 +#, python-format +msgid "You are deleting this readthrough and its %(count)s associated progress updates." +msgstr "Trinate tai, kas perskaityta ir %(count)s susietų progreso naujinių." + +#: bookwyrm/templates/snippets/fav_button.html:16 +#: bookwyrm/templates/snippets/fav_button.html:17 +msgid "Like" +msgstr "Mėgti" + +#: bookwyrm/templates/snippets/fav_button.html:30 +#: bookwyrm/templates/snippets/fav_button.html:31 +msgid "Un-like" +msgstr "Nebemėgti" + +#: bookwyrm/templates/snippets/filters_panel/filters_panel.html:7 +msgid "Show filters" +msgstr "Rodyti filtrus" + +#: bookwyrm/templates/snippets/filters_panel/filters_panel.html:9 +msgid "Hide filters" +msgstr "Slėpti filtrus" + +#: bookwyrm/templates/snippets/filters_panel/filters_panel.html:22 +msgid "Apply filters" +msgstr "Taikyti filtrus" + +#: bookwyrm/templates/snippets/filters_panel/filters_panel.html:26 +msgid "Clear filters" +msgstr "Valyti filtrus" + +#: bookwyrm/templates/snippets/follow_button.html:14 +#, python-format +msgid "Follow @%(username)s" +msgstr "Sekti @%(username)s" + +#: bookwyrm/templates/snippets/follow_button.html:16 +msgid "Follow" +msgstr "Sekti" + +#: bookwyrm/templates/snippets/follow_button.html:25 +msgid "Undo follow request" +msgstr "Atšaukti prašymus sekti" + +#: bookwyrm/templates/snippets/follow_button.html:30 +#, python-format +msgid "Unfollow @%(username)s" +msgstr "Nebesekti @%(username)s" + +#: bookwyrm/templates/snippets/follow_button.html:32 +msgid "Unfollow" +msgstr "Nebesekti" + +#: bookwyrm/templates/snippets/follow_request_buttons.html:7 +#: bookwyrm/templates/snippets/join_invitation_buttons.html:8 +msgid "Accept" +msgstr "Sutikti" + +#: bookwyrm/templates/snippets/form_rate_stars.html:20 +#: bookwyrm/templates/snippets/stars.html:13 +msgid "No rating" +msgstr "Įvertinimų nėra" + +#: bookwyrm/templates/snippets/form_rate_stars.html:28 +#, python-format +msgid "%(half_rating)s star" +msgid_plural "%(half_rating)s stars" +msgstr[0] "%(half_rating)s žvaigždutė" +msgstr[1] "%(half_rating)s žvaigždutės" +msgstr[2] "%(half_rating)s žvaigždutės" +msgstr[3] "%(half_rating)s žvaigždučių" + +#: bookwyrm/templates/snippets/form_rate_stars.html:64 +#: bookwyrm/templates/snippets/stars.html:7 +#, python-format +msgid "%(rating)s star" +msgid_plural "%(rating)s stars" +msgstr[0] "%(rating)s žvaigždutė" +msgstr[1] "%(rating)s žvaigždutės" +msgstr[2] "%(rating)s žvaigždutės" +msgstr[3] "%(rating)s žvaigždučių" + +#: bookwyrm/templates/snippets/generated_status/goal.html:2 +#, python-format +msgid "set a goal to read %(counter)s book in %(year)s" +msgid_plural "set a goal to read %(counter)s books in %(year)s" +msgstr[0] "nustatė tikslą perskaityti %(counter)s knygą %(year)s m." +msgstr[1] "nustatė tikslą perskaityti %(counter)s knygas %(year)s m." +msgstr[2] "nustatė tikslą perskaityti %(counter)s knygų %(year)s m." +msgstr[3] "nustatė tikslą perskaityti %(counter)s knygas %(year)s m." + +#: bookwyrm/templates/snippets/generated_status/rating.html:3 +#, python-format +msgid "rated %(title)s: %(display_rating)s star" +msgid_plural "rated %(title)s: %(display_rating)s stars" +msgstr[0] "įvertinta %(title)s: %(display_rating)s žvaigždute" +msgstr[1] "įvertinta %(title)s: %(display_rating)s žvaigždutėmis" +msgstr[2] "įvertinta %(title)s: %(display_rating)s žvaigždutėmis" +msgstr[3] "įvertinta %(title)s: %(display_rating)s žvaigždutėmis" + +#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:4 +#, python-format +msgid "Review of \"%(book_title)s\" (%(display_rating)s star): %(review_title)s" +msgid_plural "Review of \"%(book_title)s\" (%(display_rating)s stars): %(review_title)s" +msgstr[0] "Knygos „%(book_title)s“ (%(display_rating)s žvaigždutė) apžvalga: %(review_title)s" +msgstr[1] "Knygos „%(book_title)s“ (%(display_rating)s žvaigždutės) apžvalga: %(review_title)s" +msgstr[2] "Knygos „%(book_title)s“ (%(display_rating)s žvaigždutės) apžvalga: %(review_title)s" +msgstr[3] "Knygos „%(book_title)s“ (%(display_rating)s žvaigždutės) apžvalga: %(review_title)s" + +#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:8 +#, python-format +msgid "Review of \"%(book_title)s\": %(review_title)s" +msgstr "Knygos „%(book_title)s“ apžvalga: %(review_title)s" + +#: bookwyrm/templates/snippets/goal_form.html:4 +#, python-format +msgid "Set a goal for how many books you'll finish reading in %(year)s, and track your progress throughout the year." +msgstr "Nusistatykite tikslą, kiek knygų perskaitysite %(year)s m. ir metų eigoje sekite savo progresą." + +#: bookwyrm/templates/snippets/goal_form.html:16 +msgid "Reading goal:" +msgstr "Skaitymo tikslai:" + +#: bookwyrm/templates/snippets/goal_form.html:21 +msgid "books" +msgstr "knygos" + +#: bookwyrm/templates/snippets/goal_form.html:26 +msgid "Goal privacy:" +msgstr "Tikslo privatumas:" + +#: bookwyrm/templates/snippets/goal_form.html:33 +#: bookwyrm/templates/snippets/reading_modals/layout.html:13 +msgid "Post to feed" +msgstr "Skelbti" + +#: bookwyrm/templates/snippets/goal_form.html:37 +msgid "Set goal" +msgstr "Nustatyti tikslą" + +#: bookwyrm/templates/snippets/goal_progress.html:9 +#, python-format +msgid "%(percent)s%% complete!" +msgstr "%(percent)s%% baigta!" + +#: bookwyrm/templates/snippets/goal_progress.html:12 +#, python-format +msgid "You've read %(read_count)s of %(goal_count)s books." +msgstr "Perskaitėte %(read_count)s iš %(goal_count)s knygų." + +#: bookwyrm/templates/snippets/goal_progress.html:14 +#, python-format +msgid "%(username)s has read %(read_count)s of %(goal_count)s books." +msgstr "%(username)s perskaitė %(read_count)s iš %(goal_count)s knygų." + +#: bookwyrm/templates/snippets/page_text.html:8 +#, python-format +msgid "page %(page)s of %(total_pages)s" +msgstr "%(page)s psl. iš %(total_pages)s" + +#: bookwyrm/templates/snippets/page_text.html:14 +#, python-format +msgid "page %(page)s" +msgstr "%(page)s psl." + +#: bookwyrm/templates/snippets/pagination.html:12 +msgid "Previous" +msgstr "Ankstesnis" + +#: bookwyrm/templates/snippets/pagination.html:23 +msgid "Next" +msgstr "Kitas" + +#: bookwyrm/templates/snippets/privacy-icons.html:3 +#: bookwyrm/templates/snippets/privacy-icons.html:4 +#: bookwyrm/templates/snippets/privacy_select.html:11 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:11 +msgid "Public" +msgstr "Viešas" + +#: bookwyrm/templates/snippets/privacy-icons.html:7 +#: bookwyrm/templates/snippets/privacy-icons.html:8 +#: bookwyrm/templates/snippets/privacy_select.html:14 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:14 +msgid "Unlisted" +msgstr "Nėra sąraše" + +#: bookwyrm/templates/snippets/privacy-icons.html:12 +msgid "Followers-only" +msgstr "Tik sekėjai" + +#: bookwyrm/templates/snippets/privacy_select.html:6 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:6 +msgid "Post privacy" +msgstr "Įrašo privatumas" + +#: bookwyrm/templates/snippets/privacy_select.html:17 +#: bookwyrm/templates/user/relationships/followers.html:6 +#: bookwyrm/templates/user/relationships/layout.html:11 +msgid "Followers" +msgstr "Sekėjai" + +#: bookwyrm/templates/snippets/rate_action.html:4 +msgid "Leave a rating" +msgstr "Palikti įvertinimą" + +#: bookwyrm/templates/snippets/rate_action.html:19 +msgid "Rate" +msgstr "Įvertinti" + +#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:6 +#, python-format +msgid "Finish \"%(book_title)s\"" +msgstr "Užbaigti „%(book_title)s“" + +#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:23 +#: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:20 +#: bookwyrm/templates/snippets/readthrough_form.html:7 +msgid "Started reading" +msgstr "Pradėta skaityti" + +#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:31 +#: bookwyrm/templates/snippets/readthrough_form.html:20 +msgid "Finished reading" +msgstr "Baigta skaityti" + +#: bookwyrm/templates/snippets/reading_modals/form.html:9 +msgid "(Optional)" +msgstr "(Nebūtina)" + +#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:5 +#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:50 +msgid "Update progress" +msgstr "Atnaujinti progresą" + +#: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:6 +#, python-format +msgid "Start \"%(book_title)s\"" +msgstr "Pradėti „%(book_title)s“" + +#: bookwyrm/templates/snippets/reading_modals/want_to_read_modal.html:6 +#, python-format +msgid "Want to Read \"%(book_title)s\"" +msgstr "Noriu perskaityti „%(book_title)s“" + +#: bookwyrm/templates/snippets/readthrough_form.html:14 +msgid "Progress" +msgstr "Progresas" + +#: bookwyrm/templates/snippets/register_form.html:32 +msgid "Sign Up" +msgstr "Registruotis" + +#: bookwyrm/templates/snippets/report_button.html:6 +msgid "Report" +msgstr "Pranešti" + +#: bookwyrm/templates/snippets/report_modal.html:6 +#, python-format +msgid "Report @%(username)s" +msgstr "Pranešti apie @%(username)s" + +#: bookwyrm/templates/snippets/report_modal.html:23 +#, python-format +msgid "This report will be sent to %(site_name)s's moderators for review." +msgstr "Šis pranešimas bus nusiųstas peržiūrėti %(site_name)s puslapio moderatoriams." + +#: bookwyrm/templates/snippets/report_modal.html:24 +msgid "More info about this report:" +msgstr "Daugiau informacijos apie šį pranešimą:" + +#: bookwyrm/templates/snippets/shelf_selector.html:4 +msgid "Move book" +msgstr "Perkelti knygą" + +#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown.html:5 +msgid "More shelves" +msgstr "Daugiau lentynų" + +#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:17 +#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:24 +msgid "Start reading" +msgstr "Pradėti skaityti" + +#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:29 +#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:36 +msgid "Want to read" +msgstr "Noriu perskaityti" + +#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:62 +#, python-format +msgid "Remove from %(name)s" +msgstr "Pašalinti iš %(name)s" + +#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:30 +msgid "Finish reading" +msgstr "Baigti skaityti" + +#: bookwyrm/templates/snippets/status/content_status.html:72 +msgid "Content warning" +msgstr "Įspėjimas dėl turinio" + +#: bookwyrm/templates/snippets/status/content_status.html:79 +msgid "Show status" +msgstr "Rodyti būseną" + +#: bookwyrm/templates/snippets/status/content_status.html:101 +#, python-format +msgid "(Page %(page)s)" +msgstr "(Psl. %(page)s)" + +#: bookwyrm/templates/snippets/status/content_status.html:103 +#, python-format +msgid "(%(percent)s%%)" +msgstr "(%(percent)s%%)" + +#: bookwyrm/templates/snippets/status/content_status.html:125 +msgid "Open image in new window" +msgstr "Atidaryti paveikslėlį naujame lange" + +#: bookwyrm/templates/snippets/status/content_status.html:144 +msgid "Hide status" +msgstr "Slėpti būseną" + +#: bookwyrm/templates/snippets/status/header.html:45 +#, python-format +msgid "edited %(date)s" +msgstr "redaguota %(date)s" + +#: bookwyrm/templates/snippets/status/headers/comment.html:2 +#, python-format +msgid "commented on %(book)s" +msgstr "komentuota %(book)s" + +#: bookwyrm/templates/snippets/status/headers/note.html:8 +#, python-format +msgid "replied to %(username)s's status" +msgstr "atsakyta į %(username)s būseną" + +#: bookwyrm/templates/snippets/status/headers/quotation.html:2 +#, python-format +msgid "quoted %(book)s" +msgstr "pacitavo %(book)s" + +#: bookwyrm/templates/snippets/status/headers/rating.html:3 +#, python-format +msgid "rated %(book)s:" +msgstr "įvertinta %(book)s:" + +#: bookwyrm/templates/snippets/status/headers/read.html:7 +#, python-format +msgid "finished reading %(book)s" +msgstr "baigė skaityti %(book)s" + +#: bookwyrm/templates/snippets/status/headers/reading.html:7 +#, python-format +msgid "started reading %(book)s" +msgstr "pradėjo skaityti %(book)s" + +#: bookwyrm/templates/snippets/status/headers/review.html:3 +#, python-format +msgid "reviewed %(book)s" +msgstr "apžvelgė %(book)s" + +#: bookwyrm/templates/snippets/status/headers/to_read.html:7 +#, python-format +msgid "%(username)s wants to read %(book)s" +msgstr "%(username)s nori perskaityti %(book)s" + +#: bookwyrm/templates/snippets/status/layout.html:24 +#: bookwyrm/templates/snippets/status/status_options.html:17 +msgid "Delete status" +msgstr "Ištrinti įrašą" + +#: bookwyrm/templates/snippets/status/layout.html:56 +#: bookwyrm/templates/snippets/status/layout.html:57 +msgid "Boost status" +msgstr "Pagreitinti būseną" + +#: bookwyrm/templates/snippets/status/layout.html:60 +#: bookwyrm/templates/snippets/status/layout.html:61 +msgid "Like status" +msgstr "Mėgti būseną" + +#: bookwyrm/templates/snippets/status/status.html:10 +msgid "boosted" +msgstr "iškėlė" + +#: bookwyrm/templates/snippets/status/status_options.html:7 +#: bookwyrm/templates/snippets/user_options.html:7 +msgid "More options" +msgstr "Daugiau parinkčių" + +#: bookwyrm/templates/snippets/switch_edition_button.html:5 +msgid "Switch to this edition" +msgstr "Perjungti į šį leidimą" + +#: bookwyrm/templates/snippets/table-sort-header.html:6 +msgid "Sorted ascending" +msgstr "Surūšiuota didėjimo tvarka" + +#: bookwyrm/templates/snippets/table-sort-header.html:10 +msgid "Sorted descending" +msgstr "Surūšiuota mažėjimo tvarka" + +#: bookwyrm/templates/snippets/trimmed_text.html:17 +msgid "Show more" +msgstr "Rodyti daugiau" + +#: bookwyrm/templates/snippets/trimmed_text.html:35 +msgid "Show less" +msgstr "Rodyti mažiau" + +#: bookwyrm/templates/user/books_header.html:10 +msgid "Your books" +msgstr "Jūsų knygos" + +#: bookwyrm/templates/user/books_header.html:15 +#, python-format +msgid "%(username)s's books" +msgstr "%(username)s – knygos" + +#: bookwyrm/templates/user/goal.html:8 +#, python-format +msgid "%(year)s Reading Progress" +msgstr "%(year)s m. skaitymo progresas" + +#: bookwyrm/templates/user/goal.html:12 +msgid "Edit Goal" +msgstr "Redaguoti tikslą" + +#: bookwyrm/templates/user/goal.html:28 +#, python-format +msgid "%(name)s hasn't set a reading goal for %(year)s." +msgstr "%(name)s nenustatė %(year)s m. skaitymo tikslo." + +#: bookwyrm/templates/user/goal.html:40 +#, python-format +msgid "Your %(year)s Books" +msgstr "Jūsų %(year)s m. knygos" + +#: bookwyrm/templates/user/goal.html:42 +#, python-format +msgid "%(username)s's %(year)s Books" +msgstr "%(username)s – %(year)s m. knygos" + +#: bookwyrm/templates/user/groups.html:9 +msgid "Your Groups" +msgstr "Jūsų grupės" + +#: bookwyrm/templates/user/groups.html:11 +#, python-format +msgid "Groups: %(username)s" +msgstr "Grupės: %(username)s" + +#: bookwyrm/templates/user/groups.html:17 +msgid "Create group" +msgstr "Sukurti grupę" + +#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:10 +msgid "User Profile" +msgstr "Naudotojo paskyra" + +#: bookwyrm/templates/user/layout.html:45 +msgid "Follow Requests" +msgstr "Sekti prašymus" + +#: bookwyrm/templates/user/layout.html:70 +msgid "Reading Goal" +msgstr "Skaitymo tikslas" + +#: bookwyrm/templates/user/layout.html:76 +msgid "Groups" +msgstr "Grupės" + +#: bookwyrm/templates/user/lists.html:11 +#, python-format +msgid "Lists: %(username)s" +msgstr "Sąrašai: %(username)s" + +#: bookwyrm/templates/user/lists.html:17 bookwyrm/templates/user/lists.html:29 +msgid "Create list" +msgstr "Sukurti sąrašą" + +#: bookwyrm/templates/user/relationships/followers.html:12 +#, python-format +msgid "%(username)s has no followers" +msgstr "%(username)s neturi sekėjų" + +#: bookwyrm/templates/user/relationships/following.html:6 +#: bookwyrm/templates/user/relationships/layout.html:15 +msgid "Following" +msgstr "Sekama" + +#: bookwyrm/templates/user/relationships/following.html:12 +#, python-format +msgid "%(username)s isn't following any users" +msgstr "%(username)s nieko neseka" + +#: bookwyrm/templates/user/user.html:16 +msgid "Edit profile" +msgstr "Redaguoti paskyrą" + +#: bookwyrm/templates/user/user.html:33 +#, python-format +msgid "View all %(size)s" +msgstr "Žiūrėti visus %(size)s" + +#: bookwyrm/templates/user/user.html:46 +msgid "View all books" +msgstr "Žiūrėti visas knygas" + +#: bookwyrm/templates/user/user.html:59 +msgid "User Activity" +msgstr "Naudotojo aktyvumas" + +#: bookwyrm/templates/user/user.html:63 +msgid "RSS feed" +msgstr "RSS srautas" + +#: bookwyrm/templates/user/user.html:74 +msgid "No activities yet!" +msgstr "Įrašų dar nėra" + +#: bookwyrm/templates/user/user_preview.html:22 +#, python-format +msgid "Joined %(date)s" +msgstr "Joined %(date)s" + +#: bookwyrm/templates/user/user_preview.html:26 +#, python-format +msgid "%(counter)s follower" +msgid_plural "%(counter)s followers" +msgstr[0] "%(counter)s sekėjas" +msgstr[1] "%(counter)s sekėjai" +msgstr[2] "%(counter)s sekėjų" +msgstr[3] "%(counter)s sekėjai" + +#: bookwyrm/templates/user/user_preview.html:27 +#, python-format +msgid "%(counter)s following" +msgstr "%(counter)s seka" + +#: bookwyrm/templates/user/user_preview.html:34 +#, python-format +msgid "%(mutuals_display)s follower you follow" +msgid_plural "%(mutuals_display)s followers you follow" +msgstr[0] "%(mutuals_display)s sekėjas, kurį sekate jūs" +msgstr[1] "%(mutuals_display)s sekėjai, kuriuos sekate jūs" +msgstr[2] "%(mutuals_display)s sekėjai, kuriuos sekate jūs" +msgstr[3] "%(mutuals_display)s sekėjai, kuriuos sekate jūs" + +#: bookwyrm/templates/user/user_preview.html:38 +msgid "No followers you follow" +msgstr "Jūs nieko nesekate" + +#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:28 +msgid "File exceeds maximum size: 10MB" +msgstr "Failas viršijo maksimalų dydį: 10 MB" + +#: bookwyrm/templatetags/utilities.py:31 +#, python-format +msgid "%(title)s: %(subtitle)s" +msgstr "%(title)s: %(subtitle)s" + +#: bookwyrm/views/imports/import_data.py:64 +msgid "Not a valid csv file" +msgstr "Netinkamas csv failas" + +#: bookwyrm/views/landing/login.py:69 +msgid "Username or password are incorrect" +msgstr "Naudotojo vardas arba slaptažodis neteisingi" + +#: bookwyrm/views/landing/password.py:32 +msgid "No user with that email address was found." +msgstr "Šiuo el. pašto adresu nerastas nei vienas narys." + +#: bookwyrm/views/landing/password.py:43 +#, python-brace-format +msgid "A password reset link was sent to {email}" +msgstr "Slaptažodžio atstatymo nuoroda išsiųsta į {email}" + +#: bookwyrm/views/rss_feed.py:35 +#, python-brace-format +msgid "Status updates from {obj.display_name}" +msgstr "Būsenos atnaujinimai iš {obj.display_name}" + diff --git a/locale/pt_BR/LC_MESSAGES/django.mo b/locale/pt_BR/LC_MESSAGES/django.mo index 1ebe5280..dd430b3a 100644 Binary files a/locale/pt_BR/LC_MESSAGES/django.mo and b/locale/pt_BR/LC_MESSAGES/django.mo differ diff --git a/locale/pt_BR/LC_MESSAGES/django.po b/locale/pt_BR/LC_MESSAGES/django.po index 2e729a2f..a7ea1a86 100644 --- a/locale/pt_BR/LC_MESSAGES/django.po +++ b/locale/pt_BR/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-15 22:03+0000\n" -"PO-Revision-Date: 2021-10-22 13:31\n" +"POT-Creation-Date: 2021-11-14 15:08+0000\n" +"PO-Revision-Date: 2021-11-16 00:36\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Portuguese, Brazilian\n" "Language: pt\n" @@ -46,41 +46,42 @@ msgstr "{i} usos" msgid "Unlimited" msgstr "Ilimitado" -#: bookwyrm/forms.py:326 +#: bookwyrm/forms.py:332 msgid "List Order" msgstr "Ordem de inserção" -#: bookwyrm/forms.py:327 +#: bookwyrm/forms.py:333 msgid "Book Title" msgstr "Título do livro" -#: bookwyrm/forms.py:328 bookwyrm/templates/shelf/shelf.html:136 -#: bookwyrm/templates/shelf/shelf.html:168 +#: bookwyrm/forms.py:334 bookwyrm/templates/shelf/shelf.html:149 +#: bookwyrm/templates/shelf/shelf.html:181 #: bookwyrm/templates/snippets/create_status/review.html:33 msgid "Rating" msgstr "Avaliação" -#: bookwyrm/forms.py:330 bookwyrm/templates/lists/list.html:109 +#: bookwyrm/forms.py:336 bookwyrm/templates/lists/list.html:110 msgid "Sort By" msgstr "Organizar por" -#: bookwyrm/forms.py:334 +#: bookwyrm/forms.py:340 msgid "Ascending" msgstr "Crescente" -#: bookwyrm/forms.py:335 +#: bookwyrm/forms.py:341 msgid "Descending" msgstr "Decrescente" -#: bookwyrm/importers/importer.py:75 +#: bookwyrm/importers/importer.py:127 msgid "Error loading book" msgstr "Erro ao carregar livro" -#: bookwyrm/importers/importer.py:88 +#: bookwyrm/importers/importer.py:135 msgid "Could not find a match for book" msgstr "Não foi possível encontrar o livro" #: bookwyrm/models/base_model.py:17 +#: bookwyrm/templates/import/import_status.html:171 msgid "Pending" msgstr "Pendente" @@ -100,23 +101,23 @@ msgstr "Exclusão de moderador" msgid "Domain block" msgstr "Bloqueio de domínio" -#: bookwyrm/models/book.py:232 +#: bookwyrm/models/book.py:233 msgid "Audiobook" msgstr "Audiolivro" -#: bookwyrm/models/book.py:233 +#: bookwyrm/models/book.py:234 msgid "eBook" msgstr "e-book" -#: bookwyrm/models/book.py:234 +#: bookwyrm/models/book.py:235 msgid "Graphic novel" msgstr "Graphic novel" -#: bookwyrm/models/book.py:235 +#: bookwyrm/models/book.py:236 msgid "Hardcover" msgstr "Capa dura" -#: bookwyrm/models/book.py:236 +#: bookwyrm/models/book.py:237 msgid "Paperback" msgstr "Capa mole" @@ -133,21 +134,21 @@ msgstr "Federado" msgid "Blocked" msgstr "Bloqueado" -#: bookwyrm/models/fields.py:27 +#: bookwyrm/models/fields.py:29 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "%(value)s não é um remote_id válido" -#: bookwyrm/models/fields.py:36 bookwyrm/models/fields.py:45 +#: bookwyrm/models/fields.py:38 bookwyrm/models/fields.py:47 #, python-format msgid "%(value)s is not a valid username" msgstr "%(value)s não é um nome de usuário válido" -#: bookwyrm/models/fields.py:181 bookwyrm/templates/layout.html:171 +#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:171 msgid "username" msgstr "nome de usuário" -#: bookwyrm/models/fields.py:186 +#: bookwyrm/models/fields.py:188 msgid "A user with that username already exists." msgstr "Já existe um usuário com este nome." @@ -165,7 +166,7 @@ msgstr "Linha do tempo dos livros" #: bookwyrm/settings.py:119 bookwyrm/templates/search/layout.html:21 #: bookwyrm/templates/search/layout.html:42 -#: bookwyrm/templates/user/layout.html:81 +#: bookwyrm/templates/user/layout.html:88 msgid "Books" msgstr "Livros" @@ -223,7 +224,7 @@ msgid "Edit Author" msgstr "Editar autor" #: bookwyrm/templates/author/author.html:34 -#: bookwyrm/templates/author/edit_author.html:41 +#: bookwyrm/templates/author/edit_author.html:43 msgid "Aliases:" msgstr "Pseudônimos:" @@ -276,71 +277,72 @@ msgstr "Adicionado:" msgid "Updated:" msgstr "Atualizado:" -#: bookwyrm/templates/author/edit_author.html:15 +#: bookwyrm/templates/author/edit_author.html:16 #: bookwyrm/templates/book/edit/edit_book.html:25 msgid "Last edited by:" msgstr "Editado pela última vez por:" -#: bookwyrm/templates/author/edit_author.html:31 +#: bookwyrm/templates/author/edit_author.html:33 #: bookwyrm/templates/book/edit/edit_book_form.html:15 msgid "Metadata" msgstr "Metadados" -#: bookwyrm/templates/author/edit_author.html:33 -#: bookwyrm/templates/lists/form.html:8 bookwyrm/templates/shelf/form.html:9 +#: bookwyrm/templates/author/edit_author.html:35 +#: bookwyrm/templates/lists/form.html:9 bookwyrm/templates/shelf/form.html:9 msgid "Name:" msgstr "Nome:" -#: bookwyrm/templates/author/edit_author.html:43 +#: bookwyrm/templates/author/edit_author.html:45 #: bookwyrm/templates/book/edit/edit_book_form.html:65 #: bookwyrm/templates/book/edit/edit_book_form.html:79 #: bookwyrm/templates/book/edit/edit_book_form.html:124 msgid "Separate multiple values with commas." msgstr "Separe com vírgulas." -#: bookwyrm/templates/author/edit_author.html:50 +#: bookwyrm/templates/author/edit_author.html:52 msgid "Bio:" msgstr "Sobre mim:" -#: bookwyrm/templates/author/edit_author.html:57 +#: bookwyrm/templates/author/edit_author.html:59 msgid "Wikipedia link:" msgstr "Link da Wikipédia:" -#: bookwyrm/templates/author/edit_author.html:63 +#: bookwyrm/templates/author/edit_author.html:65 msgid "Birth date:" msgstr "Data de nascimento:" -#: bookwyrm/templates/author/edit_author.html:71 +#: bookwyrm/templates/author/edit_author.html:73 msgid "Death date:" msgstr "Data da morte:" -#: bookwyrm/templates/author/edit_author.html:79 +#: bookwyrm/templates/author/edit_author.html:81 msgid "Author Identifiers" msgstr "Identificadores do autor" -#: bookwyrm/templates/author/edit_author.html:81 +#: bookwyrm/templates/author/edit_author.html:83 msgid "Openlibrary key:" msgstr "Chave Openlibrary:" -#: bookwyrm/templates/author/edit_author.html:89 +#: bookwyrm/templates/author/edit_author.html:91 #: bookwyrm/templates/book/edit/edit_book_form.html:224 msgid "Inventaire ID:" msgstr "ID Inventaire:" -#: bookwyrm/templates/author/edit_author.html:97 +#: bookwyrm/templates/author/edit_author.html:99 msgid "Librarything key:" msgstr "Chave Librarything:" -#: bookwyrm/templates/author/edit_author.html:105 +#: bookwyrm/templates/author/edit_author.html:107 msgid "Goodreads key:" msgstr "Chave Goodreads:" -#: bookwyrm/templates/author/edit_author.html:116 +#: bookwyrm/templates/author/edit_author.html:118 #: bookwyrm/templates/book/book.html:140 #: bookwyrm/templates/book/edit/edit_book.html:110 #: bookwyrm/templates/book/readthrough.html:76 +#: bookwyrm/templates/groups/form.html:24 #: bookwyrm/templates/lists/bookmark_button.html:15 -#: bookwyrm/templates/lists/form.html:44 +#: bookwyrm/templates/lists/form.html:75 #: bookwyrm/templates/preferences/edit_user.html:124 #: bookwyrm/templates/settings/announcements/announcement_form.html:69 #: bookwyrm/templates/settings/federation/edit_instance.html:74 @@ -352,11 +354,13 @@ msgstr "Chave Goodreads:" msgid "Save" msgstr "Salvar" -#: bookwyrm/templates/author/edit_author.html:117 +#: bookwyrm/templates/author/edit_author.html:119 #: bookwyrm/templates/book/book.html:141 bookwyrm/templates/book/book.html:190 #: bookwyrm/templates/book/cover_modal.html:32 -#: bookwyrm/templates/book/edit/edit_book.html:111 +#: bookwyrm/templates/book/edit/edit_book.html:112 +#: bookwyrm/templates/book/edit/edit_book.html:115 #: bookwyrm/templates/book/readthrough.html:77 +#: bookwyrm/templates/groups/delete_group_modal.html:17 #: bookwyrm/templates/lists/delete_list_modal.html:17 #: bookwyrm/templates/settings/federation/instance.html:88 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:17 @@ -397,7 +401,7 @@ msgstr "Adicionar descrição" #: bookwyrm/templates/book/book.html:136 #: bookwyrm/templates/book/edit/edit_book_form.html:34 -#: bookwyrm/templates/lists/form.html:12 bookwyrm/templates/shelf/form.html:17 +#: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Descrição:" @@ -430,7 +434,7 @@ msgstr "Criar" #: bookwyrm/templates/book/book.html:197 msgid "You don't have any reading activity for this book." -msgstr "Você não tem nenhuma atividade de leitura para este livro." +msgstr "Você ainda não registrou seu progresso para este livro." #: bookwyrm/templates/book/book.html:218 msgid "Reviews" @@ -460,7 +464,7 @@ msgstr "Lugares" #: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12 #: bookwyrm/templates/search/layout.html:25 #: bookwyrm/templates/search/layout.html:50 -#: bookwyrm/templates/user/layout.html:75 +#: bookwyrm/templates/user/layout.html:82 msgid "Lists" msgstr "Listas" @@ -470,7 +474,7 @@ msgstr "Adicionar à lista" #: bookwyrm/templates/book/book.html:315 #: bookwyrm/templates/book/cover_modal.html:31 -#: bookwyrm/templates/lists/list.html:181 +#: bookwyrm/templates/lists/list.html:182 #: bookwyrm/templates/settings/email_blocklist/domain_form.html:26 #: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:32 msgid "Add" @@ -543,7 +547,9 @@ msgid "This is a new work" msgstr "É uma nova obra" #: bookwyrm/templates/book/edit/edit_book.html:97 -#: bookwyrm/templates/password_reset.html:30 +#: bookwyrm/templates/groups/members.html:16 +#: bookwyrm/templates/landing/password_reset.html:30 +#: bookwyrm/templates/snippets/remove_from_group_button.html:16 msgid "Confirm" msgstr "Confirmar" @@ -612,7 +618,7 @@ msgid "John Doe, Jane Smith" msgstr "Fulano da Silva, Sicrano de Oliveira" #: bookwyrm/templates/book/edit/edit_book_form.html:132 -#: bookwyrm/templates/shelf/shelf.html:127 +#: bookwyrm/templates/shelf/shelf.html:140 msgid "Cover" msgstr "Capa" @@ -686,7 +692,7 @@ msgstr "%(pages)s páginas" #: bookwyrm/templates/book/publisher_info.html:38 #, python-format msgid "%(languages)s language" -msgstr "%(languages)s idioma" +msgstr "Língua: %(languages)s" #: bookwyrm/templates/book/publisher_info.html:65 #, python-format @@ -793,7 +799,7 @@ msgstr "Reenviar link de confirmação" #: bookwyrm/templates/confirm_email/resend_form.html:11 #: bookwyrm/templates/landing/layout.html:67 -#: bookwyrm/templates/password_reset_request.html:18 +#: bookwyrm/templates/landing/password_reset_request.html:18 #: bookwyrm/templates/preferences/edit_user.html:56 #: bookwyrm/templates/snippets/register_form.html:13 msgid "Email address:" @@ -828,7 +834,7 @@ msgstr "Listar seu perfil no diretório para que outros usuários da BookWyrm te #: bookwyrm/templates/directory/directory.html:24 #, python-format msgid "You can opt-out at any time in your profile settings." -msgstr "Você pode cancelar isto a qualquer momento em suas configurações de perfil." +msgstr "Você pode desabilitar esta opção a qualquer momento em suas configurações de perfil." #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/feed/goal_card.html:17 @@ -887,22 +893,37 @@ msgstr "Usuários da BookWyrm" msgid "All known users" msgstr "Todos os usuários conhecidos" -#: bookwyrm/templates/discover/card-header.html:9 +#: bookwyrm/templates/discover/card-header.html:8 +#, python-format +msgid "%(username)s wants to read %(book_title)s" +msgstr "%(username)s quer ler %(book_title)s" + +#: bookwyrm/templates/discover/card-header.html:13 +#, python-format +msgid "%(username)s finished reading %(book_title)s" +msgstr "%(username)s terminou de ler %(book_title)s" + +#: bookwyrm/templates/discover/card-header.html:18 +#, python-format +msgid "%(username)s started reading %(book_title)s" +msgstr "%(username)s começou a ler %(book_title)s" + +#: bookwyrm/templates/discover/card-header.html:23 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)s avaliou %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:13 +#: bookwyrm/templates/discover/card-header.html:27 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s resenhou %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:17 +#: bookwyrm/templates/discover/card-header.html:31 #, python-format msgid "%(username)s commented on %(book_title)s" -msgstr "%(username)s comentou sobre %(book_title)s" +msgstr "%(username)s comentou %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:21 +#: bookwyrm/templates/discover/card-header.html:35 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s citou %(book_title)s" @@ -993,10 +1014,10 @@ msgid "You requested to reset your %(site_name)s password. Click the link below msgstr "Você solicitou a redefinição de sua senha no %(site_name)s. Clique no link abaixo para definir uma nova senha e entrar no site." #: bookwyrm/templates/email/password_reset/html_content.html:9 -#: bookwyrm/templates/password_reset.html:4 -#: bookwyrm/templates/password_reset.html:10 -#: bookwyrm/templates/password_reset_request.html:4 -#: bookwyrm/templates/password_reset_request.html:10 +#: bookwyrm/templates/landing/password_reset.html:4 +#: bookwyrm/templates/landing/password_reset.html:10 +#: bookwyrm/templates/landing/password_reset_request.html:4 +#: bookwyrm/templates/landing/password_reset_request.html:10 msgid "Reset Password" msgstr "Redefinir senha" @@ -1042,7 +1063,7 @@ msgstr "Não há nenhuma atividade! Tente seguir um usuário para começar" #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" -msgstr "Meta de leitura de %(year)s" +msgstr "Meta de leitura para %(year)s" #: bookwyrm/templates/feed/goal_card.html:18 #, python-format @@ -1053,9 +1074,8 @@ msgstr "Você pode definir ou alterar sua meta de leitura a qualquer momento em msgid "Updates" msgstr "Atualizações" -#: bookwyrm/templates/feed/layout.html:12 -#: bookwyrm/templates/user/books_header.html:3 -msgid "Your books" +#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:106 +msgid "Your Books" msgstr "Seus livros" #: bookwyrm/templates/feed/layout.html:14 @@ -1064,11 +1084,13 @@ msgstr "Não há nenhum livro aqui! Tente pesquisar livros para começar" #: bookwyrm/templates/feed/layout.html:25 #: bookwyrm/templates/shelf/shelf.html:38 +#: bookwyrm/templates/user/books_header.html:4 msgid "To Read" msgstr "Quero ler" #: bookwyrm/templates/feed/layout.html:26 #: bookwyrm/templates/shelf/shelf.html:40 +#: bookwyrm/templates/user/books_header.html:6 msgid "Currently Reading" msgstr "Lendo atualmente" @@ -1076,6 +1098,7 @@ msgstr "Lendo atualmente" #: bookwyrm/templates/shelf/shelf.html:42 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:23 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12 +#: bookwyrm/templates/user/books_header.html:8 msgid "Read" msgstr "Lido" @@ -1102,7 +1125,7 @@ msgid "What are you reading?" msgstr "O que você está lendo?" #: bookwyrm/templates/get_started/books.html:9 -#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:137 +#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:138 msgid "Search for a book" msgstr "Pesquisar livro" @@ -1120,8 +1143,9 @@ msgstr "Você pode adicionar livros quando começar a usar o %(site_name)s." #: bookwyrm/templates/get_started/books.html:17 #: bookwyrm/templates/get_started/users.html:18 #: bookwyrm/templates/get_started/users.html:19 -#: bookwyrm/templates/layout.html:51 bookwyrm/templates/layout.html:52 -#: bookwyrm/templates/lists/list.html:141 +#: bookwyrm/templates/groups/group.html:19 +#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:51 +#: bookwyrm/templates/layout.html:52 bookwyrm/templates/lists/list.html:142 #: bookwyrm/templates/search/layout.html:4 #: bookwyrm/templates/search/layout.html:9 msgid "Search" @@ -1137,7 +1161,7 @@ msgid "Popular on %(site_name)s" msgstr "Popular em %(site_name)s" #: bookwyrm/templates/get_started/books.html:58 -#: bookwyrm/templates/lists/list.html:154 +#: bookwyrm/templates/lists/list.html:155 msgid "No books found" msgstr "Nenhum livro encontrado" @@ -1212,7 +1236,7 @@ msgstr "Mostrar conta nas sugestões de usuários:" #: bookwyrm/templates/get_started/profile.html:52 msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users." -msgstr "Sua conta aparecerá no diretório e pode ser recomendada para outros usuários da BookWyrm." +msgstr "Sua conta aparecerá no diretório e poderá ser recomendada para outros usuários da BookWyrm." #: bookwyrm/templates/get_started/users.html:11 msgid "Search for a user" @@ -1223,9 +1247,110 @@ msgstr "Procurar usuário" msgid "No users found for \"%(query)s\"" msgstr "Nenhum usuário encontrado para \"%(query)s\"" +#: bookwyrm/templates/groups/create_form.html:5 +msgid "Create Group" +msgstr "Criar grupo" + +#: bookwyrm/templates/groups/created_text.html:4 +#, python-format +msgid "Managed by %(username)s" +msgstr "Gerenciado por %(username)s" + +#: bookwyrm/templates/groups/delete_group_modal.html:4 +msgid "Delete this group?" +msgstr "Deletar grupo?" + +#: bookwyrm/templates/groups/delete_group_modal.html:7 +#: bookwyrm/templates/lists/delete_list_modal.html:7 +msgid "This action cannot be un-done" +msgstr "Esta ação não pode ser desfeita" + +#: bookwyrm/templates/groups/delete_group_modal.html:15 +#: bookwyrm/templates/lists/delete_list_modal.html:15 +#: bookwyrm/templates/settings/announcements/announcement.html:20 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36 +#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 +#: bookwyrm/templates/snippets/follow_request_buttons.html:12 +#: bookwyrm/templates/snippets/join_invitation_buttons.html:13 +msgid "Delete" +msgstr "Excluir" + +#: bookwyrm/templates/groups/edit_form.html:5 +msgid "Edit Group" +msgstr "Editar grupo" + +#: bookwyrm/templates/groups/find_users.html:6 +msgid "Add new members!" +msgstr "Adicione novos membros!" + +#: bookwyrm/templates/groups/form.html:8 +msgid "Group Name:" +msgstr "Nome do grupo:" + +#: bookwyrm/templates/groups/form.html:12 +msgid "Group Description:" +msgstr "Descrição do grupo:" + +#: bookwyrm/templates/groups/form.html:30 +msgid "Delete group" +msgstr "Excluir grupo" + +#: bookwyrm/templates/groups/group.html:15 +msgid "Search to add a user" +msgstr "Pesquisar usuário para adicionar" + +#: bookwyrm/templates/groups/group.html:36 +msgid "This group has no lists" +msgstr "Este grupo não tem listas" + +#: bookwyrm/templates/groups/layout.html:16 +msgid "Edit group" +msgstr "Editar grupo" + +#: bookwyrm/templates/groups/members.html:8 +msgid "Members can add and remove books on a group's book lists" +msgstr "Membros podem adicionar ou remover livros nas listas de seu grupo" + +#: bookwyrm/templates/groups/members.html:19 +msgid "Leave group" +msgstr "Sair do grupo" + +#: bookwyrm/templates/groups/members.html:41 +#: bookwyrm/templates/groups/suggested_users.html:32 +#: bookwyrm/templates/snippets/suggested_users.html:31 +#: bookwyrm/templates/user/user_preview.html:36 +msgid "Follows you" +msgstr "Segue você" + +#: bookwyrm/templates/groups/suggested_users.html:17 +#: bookwyrm/templates/snippets/suggested_users.html:16 +#, python-format +msgid "%(mutuals)s follower you follow" +msgid_plural "%(mutuals)s followers you follow" +msgstr[0] "%(mutuals)s seguidor que você segue" +msgstr[1] "%(mutuals)s seguidores que você segue" + +#: bookwyrm/templates/groups/suggested_users.html:24 +#: bookwyrm/templates/snippets/suggested_users.html:23 +#, python-format +msgid "%(shared_books)s book on your shelves" +msgid_plural "%(shared_books)s books on your shelves" +msgstr[0] "%(shared_books)s livro em sua estante" +msgstr[1] "%(shared_books)s livros em suas estantes" + +#: bookwyrm/templates/groups/suggested_users.html:40 +#, python-format +msgid "No potential members found for \"%(user_query)s\"" +msgstr "Nenhum membro em potencial encontrado para \"%(user_query)s\"" + +#: bookwyrm/templates/groups/user_groups.html:15 +msgid "Manager" +msgstr "Gerente" + #: bookwyrm/templates/import/import.html:5 #: bookwyrm/templates/import/import.html:9 -#: bookwyrm/templates/shelf/shelf.html:57 +#: bookwyrm/templates/shelf/shelf.html:61 msgid "Import Books" msgstr "Importar livros" @@ -1259,100 +1384,160 @@ msgid "No recent imports" msgstr "Nenhuma importação recente" #: bookwyrm/templates/import/import_status.html:6 -#: bookwyrm/templates/import/import_status.html:10 +#: bookwyrm/templates/import/import_status.html:15 +#: bookwyrm/templates/import/import_status.html:29 msgid "Import Status" msgstr "Status da importação" -#: bookwyrm/templates/import/import_status.html:11 -msgid "Back to imports" -msgstr "Voltar às importações" +#: bookwyrm/templates/import/import_status.html:13 +#: bookwyrm/templates/import/import_status.html:27 +msgid "Retry Status" +msgstr "Status da nova tentativa" -#: bookwyrm/templates/import/import_status.html:15 +#: bookwyrm/templates/import/import_status.html:22 +msgid "Imports" +msgstr "Importações" + +#: bookwyrm/templates/import/import_status.html:39 msgid "Import started:" msgstr "Importação iniciada:" -#: bookwyrm/templates/import/import_status.html:20 -msgid "Import completed:" -msgstr "Importação concluída:" - -#: bookwyrm/templates/import/import_status.html:24 -msgid "TASK FAILED" -msgstr "FALHA NA EXECUÇÃO" - -#: bookwyrm/templates/import/import_status.html:32 -msgid "Import still in progress." -msgstr "Importação em andamento." - -#: bookwyrm/templates/import/import_status.html:34 -msgid "(Hit reload to update!)" -msgstr "(Recarregue para atualizar!)" - -#: bookwyrm/templates/import/import_status.html:41 -msgid "Failed to load" -msgstr "Falha ao carregar" +#: bookwyrm/templates/import/import_status.html:48 +msgid "In progress" +msgstr "Em curso" #: bookwyrm/templates/import/import_status.html:50 -#, python-format -msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import." -msgstr "Vá ao fim da lista para selecionar os %(failed_count)s itens que não foram importados." +msgid "Refresh" +msgstr "Atualizar" #: bookwyrm/templates/import/import_status.html:62 #, python-format -msgid "Line %(index)s: %(title)s by %(author)s" -msgstr "Linha %(index)s: %(title)s de %(author)s" +msgid "%(display_counter)s item needs manual approval." +msgid_plural "%(display_counter)s items need manual approval." +msgstr[0] "%(display_counter)s item precisa de aprovação manual." +msgstr[1] "%(display_counter)s itens precisam de aprovação manual." -#: bookwyrm/templates/import/import_status.html:82 -msgid "Select all" -msgstr "Selecionar todos" +#: bookwyrm/templates/import/import_status.html:67 +#: bookwyrm/templates/import/manual_review.html:8 +msgid "Review items" +msgstr "Revisar itens" -#: bookwyrm/templates/import/import_status.html:85 -msgid "Retry items" -msgstr "Tentar novamente" +#: bookwyrm/templates/import/import_status.html:73 +#, python-format +msgid "%(display_counter)s item failed to import." +msgid_plural "%(display_counter)s items failed to import." +msgstr[0] "Falha ao importar %(display_counter)s item." +msgstr[1] "Falha ao importar %(display_counter)s itens." -#: bookwyrm/templates/import/import_status.html:112 -msgid "Successfully imported" -msgstr "Importado com sucesso" +#: bookwyrm/templates/import/import_status.html:79 +msgid "View and troubleshoot failed items" +msgstr "Ver e solucionar importações fracassadas" -#: bookwyrm/templates/import/import_status.html:114 -msgid "Import Progress" -msgstr "Progresso da importação" +#: bookwyrm/templates/import/import_status.html:91 +msgid "Row" +msgstr "Linha" -#: bookwyrm/templates/import/import_status.html:119 -msgid "Book" -msgstr "Livro" - -#: bookwyrm/templates/import/import_status.html:122 -#: bookwyrm/templates/shelf/shelf.html:128 -#: bookwyrm/templates/shelf/shelf.html:150 +#: bookwyrm/templates/import/import_status.html:94 +#: bookwyrm/templates/shelf/shelf.html:141 +#: bookwyrm/templates/shelf/shelf.html:163 msgid "Title" msgstr "Título" -#: bookwyrm/templates/import/import_status.html:125 -#: bookwyrm/templates/shelf/shelf.html:129 -#: bookwyrm/templates/shelf/shelf.html:153 +#: bookwyrm/templates/import/import_status.html:97 +msgid "ISBN" +msgstr "ISBN" + +#: bookwyrm/templates/import/import_status.html:100 +#: bookwyrm/templates/shelf/shelf.html:142 +#: bookwyrm/templates/shelf/shelf.html:166 msgid "Author" msgstr "Autor" -#: bookwyrm/templates/import/import_status.html:148 +#: bookwyrm/templates/import/import_status.html:103 +msgid "Shelf" +msgstr "Estante" + +#: bookwyrm/templates/import/import_status.html:106 +#: bookwyrm/templates/import/manual_review.html:13 +#: bookwyrm/templates/snippets/create_status.html:17 +msgid "Review" +msgstr "Resenhar" + +#: bookwyrm/templates/import/import_status.html:110 +msgid "Book" +msgstr "Livro" + +#: bookwyrm/templates/import/import_status.html:113 +#: bookwyrm/templates/settings/announcements/announcements.html:38 +#: bookwyrm/templates/settings/federation/instance_list.html:46 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44 +#: bookwyrm/templates/settings/invites/status_filter.html:5 +#: bookwyrm/templates/settings/users/user_admin.html:34 +#: bookwyrm/templates/settings/users/user_info.html:20 +msgid "Status" +msgstr "Publicação" + +#: bookwyrm/templates/import/import_status.html:144 +msgid "View imported review" +msgstr "Visualizar resenha importada" + +#: bookwyrm/templates/import/import_status.html:158 msgid "Imported" msgstr "Importado" +#: bookwyrm/templates/import/import_status.html:164 +msgid "Needs manual review" +msgstr "Precisa de resenha manual" + +#: bookwyrm/templates/import/manual_review.html:5 +#: bookwyrm/templates/import/troubleshoot.html:4 +msgid "Import Troubleshooting" +msgstr "Solução de problemas de importação" + +#: bookwyrm/templates/import/manual_review.html:21 +msgid "Approving a suggestion will permanently add the suggested book to your shelves and associate your reading dates, reviews, and ratings with that book." +msgstr "Aprovar uma sugestão adicionará permanentemente o livro sugerido às suas estantes e associará suas datas de leitura, resenhas e avaliações aos do livro." + +#: bookwyrm/templates/import/manual_review.html:56 +#: bookwyrm/templates/lists/curate.html:57 +msgid "Approve" +msgstr "Aprovar" + +#: bookwyrm/templates/import/manual_review.html:64 +msgid "Reject" +msgstr "Rejeitar" + #: bookwyrm/templates/import/tooltip.html:6 msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." msgstr "Você pode baixar seus dados do Goodreads na página de Importar/Exportar da sua conta." -#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:8 -#: bookwyrm/templates/login.html:49 -msgid "Create an Account" -msgstr "Criar conta" +#: bookwyrm/templates/import/troubleshoot.html:7 +msgid "Failed items" +msgstr "Itens cuja importação falhou" -#: bookwyrm/templates/invite.html:21 -msgid "Permission Denied" -msgstr "Permissão negada" +#: bookwyrm/templates/import/troubleshoot.html:12 +msgid "Troubleshooting" +msgstr "Solução de problemas" -#: bookwyrm/templates/invite.html:22 -msgid "Sorry! This invite code is no longer valid." -msgstr "Desculpe! Este convite não é mais válido." +#: bookwyrm/templates/import/troubleshoot.html:20 +msgid "Re-trying an import can fix missing items in cases such as:" +msgstr "Tentar uma importação novamente pode corrigir itens faltantes como:" + +#: bookwyrm/templates/import/troubleshoot.html:23 +msgid "The book has been added to the instance since this import" +msgstr "O livro foi adicionado à sua instância desde esta importação" + +#: bookwyrm/templates/import/troubleshoot.html:24 +msgid "A transient error or timeout caused the external data source to be unavailable." +msgstr "Um erro temporário ou timeout fez com que a fonte de dados externa ficasse inacessível." + +#: bookwyrm/templates/import/troubleshoot.html:25 +msgid "BookWyrm has been updated since this import with a bug fix" +msgstr "Desde a importação a BookWyrm foi atualizada com uma correção de bugs" + +#: bookwyrm/templates/import/troubleshoot.html:28 +msgid "Contact your admin or open an issue if you are seeing unexpected failed items." +msgstr "Fale com a administração ou crie um problema se você perceber itens com erros inesperados." #: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:230 #, python-format @@ -1369,6 +1554,20 @@ msgstr "Código de conduta" msgid "Privacy Policy" msgstr "Política de privacidade" +#: bookwyrm/templates/landing/invite.html:4 +#: bookwyrm/templates/landing/invite.html:8 +#: bookwyrm/templates/landing/login.html:49 +msgid "Create an Account" +msgstr "Criar conta" + +#: bookwyrm/templates/landing/invite.html:21 +msgid "Permission Denied" +msgstr "Permissão negada" + +#: bookwyrm/templates/landing/invite.html:22 +msgid "Sorry! This invite code is no longer valid." +msgstr "Desculpe! Este convite não é mais válido." + #: bookwyrm/templates/landing/landing.html:6 msgid "Recent Books" msgstr "Livros recentes" @@ -1407,6 +1606,53 @@ msgstr "Obrigado! Sua solicitação foi recebida." msgid "Your Account" msgstr "Sua conta" +#: bookwyrm/templates/landing/login.html:4 +msgid "Login" +msgstr "Entrar" + +#: bookwyrm/templates/landing/login.html:7 +#: bookwyrm/templates/landing/login.html:37 bookwyrm/templates/layout.html:179 +msgid "Log in" +msgstr "Entrar" + +#: bookwyrm/templates/landing/login.html:15 +msgid "Success! Email address confirmed." +msgstr "Endereço de e-mail confirmado com sucesso." + +#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:170 +#: bookwyrm/templates/snippets/register_form.html:4 +msgid "Username:" +msgstr "Usuário:" + +#: bookwyrm/templates/landing/login.html:27 +#: bookwyrm/templates/landing/password_reset.html:17 +#: bookwyrm/templates/layout.html:174 +#: bookwyrm/templates/snippets/register_form.html:22 +msgid "Password:" +msgstr "Senha:" + +#: bookwyrm/templates/landing/login.html:40 bookwyrm/templates/layout.html:176 +msgid "Forgot your password?" +msgstr "Esqueceu sua senha?" + +#: bookwyrm/templates/landing/login.html:62 +msgid "More about this site" +msgstr "Mais sobre este site" + +#: bookwyrm/templates/landing/password_reset.html:23 +#: bookwyrm/templates/preferences/change_password.html:18 +#: bookwyrm/templates/preferences/delete_user.html:20 +msgid "Confirm password:" +msgstr "Confirmar senha:" + +#: bookwyrm/templates/landing/password_reset_request.html:14 +msgid "A link to reset your password will be sent to your email address" +msgstr "Um link para redefinir sua senha será enviada para seu e-mail" + +#: bookwyrm/templates/landing/password_reset_request.html:28 +msgid "Reset password" +msgstr "Redefinir senha" + #: bookwyrm/templates/layout.html:13 #, python-format msgid "%(site_name)s search" @@ -1424,10 +1670,6 @@ msgstr "Menu de navegação principal" msgid "Feed" msgstr "Novidades" -#: bookwyrm/templates/layout.html:106 -msgid "Your Books" -msgstr "Seus livros" - #: bookwyrm/templates/layout.html:116 msgid "Settings" msgstr "Configurações" @@ -1454,25 +1696,10 @@ msgstr "Sair" msgid "Notifications" msgstr "Notificações" -#: bookwyrm/templates/layout.html:170 bookwyrm/templates/layout.html:174 -#: bookwyrm/templates/login.html:21 -#: bookwyrm/templates/snippets/register_form.html:4 -msgid "Username:" -msgstr "Usuário:" - #: bookwyrm/templates/layout.html:175 msgid "password" msgstr "senha" -#: bookwyrm/templates/layout.html:176 bookwyrm/templates/login.html:40 -msgid "Forgot your password?" -msgstr "Esqueceu sua senha?" - -#: bookwyrm/templates/layout.html:179 bookwyrm/templates/login.html:7 -#: bookwyrm/templates/login.html:37 -msgid "Log in" -msgstr "Entrar" - #: bookwyrm/templates/layout.html:187 msgid "Join" msgstr "Registrar" @@ -1487,7 +1714,7 @@ msgstr "Erro ao publicar" #: bookwyrm/templates/layout.html:234 msgid "Contact site admin" -msgstr "Contatar administração" +msgstr "Falar com a administração" #: bookwyrm/templates/layout.html:238 msgid "Documentation" @@ -1513,11 +1740,16 @@ msgstr "Criar lista" #: bookwyrm/templates/lists/created_text.html:5 #, python-format -msgid "Created and curated by %(username)s" -msgstr "Criada e curada por %(username)s" +msgid "Created by %(username)s and managed by %(groupname)s" +msgstr "Criada por %(username)s e gerenciada por %(groupname)s" #: bookwyrm/templates/lists/created_text.html:7 #, python-format +msgid "Created and curated by %(username)s" +msgstr "Criada e organizada por %(username)s" + +#: bookwyrm/templates/lists/created_text.html:9 +#, python-format msgid "Created by %(username)s" msgstr "Criada por %(username)s" @@ -1537,10 +1769,6 @@ msgstr "Tudo pronto!" msgid "Suggested by" msgstr "Sugerido por" -#: bookwyrm/templates/lists/curate.html:57 -msgid "Approve" -msgstr "Aprovar" - #: bookwyrm/templates/lists/curate.html:63 msgid "Discard" msgstr "Descartar" @@ -1549,118 +1777,130 @@ msgstr "Descartar" msgid "Delete this list?" msgstr "Deletar esta lista?" -#: bookwyrm/templates/lists/delete_list_modal.html:7 -msgid "This action cannot be un-done" -msgstr "Esta ação não pode ser desfeita" - -#: bookwyrm/templates/lists/delete_list_modal.html:15 -#: bookwyrm/templates/settings/announcements/announcement.html:20 -#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49 -#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36 -#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 -#: bookwyrm/templates/snippets/follow_request_buttons.html:12 -msgid "Delete" -msgstr "Excluir" - #: bookwyrm/templates/lists/edit_form.html:5 #: bookwyrm/templates/lists/layout.html:16 msgid "Edit List" msgstr "Editar lista" -#: bookwyrm/templates/lists/form.html:18 +#: bookwyrm/templates/lists/form.html:19 msgid "List curation:" -msgstr "Curadoria da lista:" +msgstr "Configuração da lista:" -#: bookwyrm/templates/lists/form.html:21 +#: bookwyrm/templates/lists/form.html:22 msgid "Closed" msgstr "Fechada" -#: bookwyrm/templates/lists/form.html:22 +#: bookwyrm/templates/lists/form.html:23 msgid "Only you can add and remove books to this list" -msgstr "Só você pode adicionar ou remover livros nesta lista" - -#: bookwyrm/templates/lists/form.html:26 -msgid "Curated" -msgstr "Curado" +msgstr "Só você pode adicionar ou remover livros" #: bookwyrm/templates/lists/form.html:27 +msgid "Curated" +msgstr "Moderada" + +#: bookwyrm/templates/lists/form.html:28 msgid "Anyone can suggest books, subject to your approval" msgstr "Qualquer pessoa pode sugerir livros para sua aprovação" -#: bookwyrm/templates/lists/form.html:31 +#: bookwyrm/templates/lists/form.html:32 msgctxt "curation type" msgid "Open" msgstr "Aberta" -#: bookwyrm/templates/lists/form.html:32 +#: bookwyrm/templates/lists/form.html:33 msgid "Anyone can add books to this list" msgstr "Qualquer pessoa pode adicionar livros à lista" -#: bookwyrm/templates/lists/form.html:50 +#: bookwyrm/templates/lists/form.html:37 +msgid "Group" +msgstr "Grupo" + +#: bookwyrm/templates/lists/form.html:38 +msgid "Group members can add to and remove from this list" +msgstr "Membros do grupo podem adicionar e remover itens da lista" + +#: bookwyrm/templates/lists/form.html:41 +msgid "Select Group" +msgstr "Selecionar grupo" + +#: bookwyrm/templates/lists/form.html:45 +msgid "Select a group" +msgstr "Selecione um grupo" + +#: bookwyrm/templates/lists/form.html:56 +msgid "You don't have any Groups yet!" +msgstr "Você ainda não tem nenhum Grupo!" + +#: bookwyrm/templates/lists/form.html:58 +msgid "Create a Group" +msgstr "Criar grupo" + +#: bookwyrm/templates/lists/form.html:81 msgid "Delete list" msgstr "Excluir lista" -#: bookwyrm/templates/lists/list.html:20 +#: bookwyrm/templates/lists/list.html:21 msgid "You successfully suggested a book for this list!" msgstr "Você sugeriu um livro para esta lista com sucesso!" -#: bookwyrm/templates/lists/list.html:22 +#: bookwyrm/templates/lists/list.html:23 msgid "You successfully added a book to this list!" msgstr "Você adicionou um livro a esta lista com sucesso!" -#: bookwyrm/templates/lists/list.html:28 +#: bookwyrm/templates/lists/list.html:29 msgid "This list is currently empty" msgstr "Esta lista está vazia" -#: bookwyrm/templates/lists/list.html:66 +#: bookwyrm/templates/lists/list.html:67 #, python-format msgid "Added by %(username)s" msgstr "Adicionado por %(username)s" -#: bookwyrm/templates/lists/list.html:75 +#: bookwyrm/templates/lists/list.html:76 msgid "List position" msgstr "Posição na lista" -#: bookwyrm/templates/lists/list.html:81 +#: bookwyrm/templates/lists/list.html:82 msgid "Set" msgstr "Definir" -#: bookwyrm/templates/lists/list.html:91 +#: bookwyrm/templates/lists/list.html:92 +#: bookwyrm/templates/snippets/remove_from_group_button.html:19 #: bookwyrm/templates/snippets/shelf_selector.html:26 msgid "Remove" msgstr "Remover" -#: bookwyrm/templates/lists/list.html:105 -#: bookwyrm/templates/lists/list.html:122 +#: bookwyrm/templates/lists/list.html:106 +#: bookwyrm/templates/lists/list.html:123 msgid "Sort List" msgstr "Ordenar lista" -#: bookwyrm/templates/lists/list.html:115 +#: bookwyrm/templates/lists/list.html:116 msgid "Direction" -msgstr "Direção" +msgstr "Sentido" -#: bookwyrm/templates/lists/list.html:129 +#: bookwyrm/templates/lists/list.html:130 msgid "Add Books" msgstr "Adicionar livros" -#: bookwyrm/templates/lists/list.html:131 +#: bookwyrm/templates/lists/list.html:132 msgid "Suggest Books" msgstr "Sugerir livros" -#: bookwyrm/templates/lists/list.html:142 +#: bookwyrm/templates/lists/list.html:143 msgid "search" msgstr "pesquisar" -#: bookwyrm/templates/lists/list.html:148 +#: bookwyrm/templates/lists/list.html:149 msgid "Clear search" msgstr "Limpar pesquisa" -#: bookwyrm/templates/lists/list.html:153 +#: bookwyrm/templates/lists/list.html:154 #, python-format msgid "No books found matching the query \"%(query)s\"" msgstr "Nenhum livro encontrado para \"%(query)s\"" -#: bookwyrm/templates/lists/list.html:181 +#: bookwyrm/templates/lists/list.html:182 msgid "Suggest" msgstr "Sugerir" @@ -1672,30 +1912,18 @@ msgstr "Salvo" msgid "Your Lists" msgstr "Suas listas" -#: bookwyrm/templates/lists/lists.html:35 +#: bookwyrm/templates/lists/lists.html:36 msgid "All Lists" msgstr "Todas as listas" -#: bookwyrm/templates/lists/lists.html:39 +#: bookwyrm/templates/lists/lists.html:40 msgid "Saved Lists" msgstr "Listas salvas" -#: bookwyrm/templates/login.html:4 -msgid "Login" -msgstr "Entrar" - -#: bookwyrm/templates/login.html:15 -msgid "Success! Email address confirmed." -msgstr "Endereço de e-mail confirmado com sucesso." - -#: bookwyrm/templates/login.html:27 bookwyrm/templates/password_reset.html:17 -#: bookwyrm/templates/snippets/register_form.html:22 -msgid "Password:" -msgstr "Senha:" - -#: bookwyrm/templates/login.html:62 -msgid "More about this site" -msgstr "Mais sobre este site" +#: bookwyrm/templates/notifications/items/accept.html:16 +#, python-format +msgid "accepted your invitation to join group \"%(group_name)s\"" +msgstr "aceitou seu convite para participar do grupo \"%(group_name)s\"" #: bookwyrm/templates/notifications/items/add.html:24 #, python-format @@ -1734,7 +1962,7 @@ msgstr "curtiu sua resenha de %(book_title)scomment on%(book_title)s" +msgid "liked your comment on %(book_title)s" msgstr "curtiu seu comentário sobre %(book_title)s" #: bookwyrm/templates/notifications/items/fav.html:31 @@ -1760,6 +1988,21 @@ msgstr "pediu para te seguir" msgid "Your import completed." msgstr "Sua importação foi concluída." +#: bookwyrm/templates/notifications/items/invite.html:15 +#, python-format +msgid "invited you to join the group \"%(group_name)s\"" +msgstr "te convidou para participar do grupo \"%(group_name)s\"" + +#: bookwyrm/templates/notifications/items/join.html:16 +#, python-format +msgid "has joined your group \"%(group_name)s\"" +msgstr "entrou em seu grupo \"%(group_name)s\"" + +#: bookwyrm/templates/notifications/items/leave.html:16 +#, python-format +msgid "has left your group \"%(group_name)s\"" +msgstr "saiu de seu grupo \"%(group_name)s\"" + #: bookwyrm/templates/notifications/items/mention.html:20 #, python-format msgid "mentioned you in a review of %(book_title)s" @@ -1780,6 +2023,16 @@ msgstr "te mencionou em uma citação de %(book msgid "mentioned you in a status" msgstr "te mencionou em uma publicação" +#: bookwyrm/templates/notifications/items/remove.html:17 +#, python-format +msgid "has been removed from your group \"%(group_name)s\"" +msgstr "foi excluído(a) de seu grupo \"%(group_name)s\"" + +#: bookwyrm/templates/notifications/items/remove.html:23 +#, python-format +msgid "You have been removed from the \"%(group_name)s\" group" +msgstr "Você foi excluído(a) do grupo \"%(group_name)s\"" + #: bookwyrm/templates/notifications/items/reply.html:21 #, python-format msgid "replied to your review of %(book_title)s" @@ -1805,9 +2058,24 @@ msgstr "respondeu à sua report needs moderation." msgstr "Uma nova denúncia para moderação." +#: bookwyrm/templates/notifications/items/update.html:16 +#, python-format +msgid "has changed the privacy level for %(group_name)s" +msgstr "mudou o nível de privacidade de %(group_name)s" + +#: bookwyrm/templates/notifications/items/update.html:20 +#, python-format +msgid "has changed the name of %(group_name)s" +msgstr "mudou o nome de %(group_name)s" + +#: bookwyrm/templates/notifications/items/update.html:24 +#, python-format +msgid "has changed the description of %(group_name)s" +msgstr "mudou a descrição de %(group_name)s" + #: bookwyrm/templates/notifications/notifications_page.html:18 msgid "Delete notifications" -msgstr "Excluir notificações" +msgstr "Limpar notificações" #: bookwyrm/templates/notifications/notifications_page.html:29 msgid "All" @@ -1819,21 +2087,7 @@ msgstr "Menções" #: bookwyrm/templates/notifications/notifications_page.html:45 msgid "You're all caught up!" -msgstr "Você se atualizou!" - -#: bookwyrm/templates/password_reset.html:23 -#: bookwyrm/templates/preferences/change_password.html:18 -#: bookwyrm/templates/preferences/delete_user.html:20 -msgid "Confirm password:" -msgstr "Confirmar senha:" - -#: bookwyrm/templates/password_reset_request.html:14 -msgid "A link to reset your password will be sent to your email address" -msgstr "Um link para redefinir sua senha será enviada para seu e-mail" - -#: bookwyrm/templates/password_reset_request.html:28 -msgid "Reset password" -msgstr "Redefinir senha" +msgstr "Nenhuma notificação nova!" #: bookwyrm/templates/preferences/blocks.html:4 #: bookwyrm/templates/preferences/blocks.html:7 @@ -1887,7 +2141,7 @@ msgstr "Perfil" #: bookwyrm/templates/preferences/edit_user.html:13 #: bookwyrm/templates/preferences/edit_user.html:68 msgid "Display preferences" -msgstr "Preferências visuais" +msgstr "Preferências da interface" #: bookwyrm/templates/preferences/edit_user.html:14 #: bookwyrm/templates/preferences/edit_user.html:106 @@ -1905,7 +2159,7 @@ msgstr "Mostrar sugestões de usuários:" #: bookwyrm/templates/preferences/edit_user.html:85 #, python-format msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users." -msgstr "Sua conta aparecerá no diretório e pode ser recomendada para outros usuários da BookWyrm." +msgstr "Sua conta aparecerá no diretório e poderá ser recomendada para outros usuários da BookWyrm." #: bookwyrm/templates/preferences/edit_user.html:89 msgid "Preferred Timezone: " @@ -2067,15 +2321,6 @@ msgstr "Data de início" msgid "End date" msgstr "Data final" -#: bookwyrm/templates/settings/announcements/announcements.html:38 -#: bookwyrm/templates/settings/federation/instance_list.html:46 -#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44 -#: bookwyrm/templates/settings/invites/status_filter.html:5 -#: bookwyrm/templates/settings/users/user_admin.html:34 -#: bookwyrm/templates/settings/users/user_info.html:20 -msgid "Status" -msgstr "Publicação" - #: bookwyrm/templates/settings/announcements/announcements.html:48 msgid "active" msgstr "ativo" @@ -2257,7 +2502,7 @@ msgid "Details" msgstr "Detalhes" #: bookwyrm/templates/settings/federation/instance.html:35 -#: bookwyrm/templates/user/layout.html:63 +#: bookwyrm/templates/user/layout.html:64 msgid "Activity" msgstr "Atividade" @@ -2833,53 +3078,66 @@ msgstr "Criar estante" msgid "Edit Shelf" msgstr "Editar estante" -#: bookwyrm/templates/shelf/shelf.html:28 bookwyrm/views/shelf.py:55 +#: bookwyrm/templates/shelf/shelf.html:28 bookwyrm/views/shelf/shelf.py:53 msgid "All books" msgstr "Todos os livros" -#: bookwyrm/templates/shelf/shelf.html:55 +#: bookwyrm/templates/shelf/shelf.html:69 msgid "Create shelf" msgstr "Criar estante" -#: bookwyrm/templates/shelf/shelf.html:77 +#: bookwyrm/templates/shelf/shelf.html:90 #, python-format msgid "%(formatted_count)s book" msgid_plural "%(formatted_count)s books" msgstr[0] "%(formatted_count)s livro" msgstr[1] "%(formatted_count)s livros" -#: bookwyrm/templates/shelf/shelf.html:84 +#: bookwyrm/templates/shelf/shelf.html:97 #, python-format msgid "(showing %(start)s-%(end)s)" msgstr "(mostrando %(start)s-%(end)s)" -#: bookwyrm/templates/shelf/shelf.html:96 +#: bookwyrm/templates/shelf/shelf.html:109 msgid "Edit shelf" msgstr "Editar estante" -#: bookwyrm/templates/shelf/shelf.html:104 +#: bookwyrm/templates/shelf/shelf.html:117 msgid "Delete shelf" msgstr "Excluir estante" -#: bookwyrm/templates/shelf/shelf.html:132 -#: bookwyrm/templates/shelf/shelf.html:158 +#: bookwyrm/templates/shelf/shelf.html:145 +#: bookwyrm/templates/shelf/shelf.html:171 msgid "Shelved" msgstr "Adicionado" -#: bookwyrm/templates/shelf/shelf.html:133 -#: bookwyrm/templates/shelf/shelf.html:161 +#: bookwyrm/templates/shelf/shelf.html:146 +#: bookwyrm/templates/shelf/shelf.html:174 msgid "Started" msgstr "Iniciado" -#: bookwyrm/templates/shelf/shelf.html:134 -#: bookwyrm/templates/shelf/shelf.html:164 +#: bookwyrm/templates/shelf/shelf.html:147 +#: bookwyrm/templates/shelf/shelf.html:177 msgid "Finished" msgstr "Terminado" -#: bookwyrm/templates/shelf/shelf.html:190 +#: bookwyrm/templates/shelf/shelf.html:203 msgid "This shelf is empty." msgstr "Esta estante está vazia." +#: bookwyrm/templates/snippets/add_to_group_button.html:15 +msgid "Invite" +msgstr "Convidar" + +#: bookwyrm/templates/snippets/add_to_group_button.html:24 +msgid "Uninvite" +msgstr "Desconvidar" + +#: bookwyrm/templates/snippets/add_to_group_button.html:28 +#, python-format +msgid "Remove @%(username)s" +msgstr "Excluir @%(username)s" + #: bookwyrm/templates/snippets/announcement.html:31 #, python-format msgid "Posted by %(username)s" @@ -2911,10 +3169,6 @@ msgstr "Compartilhar" msgid "Un-boost" msgstr "Descompartilhar" -#: bookwyrm/templates/snippets/create_status.html:17 -msgid "Review" -msgstr "Resenhar" - #: bookwyrm/templates/snippets/create_status.html:39 msgid "Quote" msgstr "Citar" @@ -2975,6 +3229,7 @@ msgstr "Comentário:" #: bookwyrm/templates/snippets/privacy-icons.html:15 #: bookwyrm/templates/snippets/privacy-icons.html:16 #: bookwyrm/templates/snippets/privacy_select.html:20 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:17 msgid "Private" msgstr "Particular" @@ -3070,6 +3325,7 @@ msgid "Unfollow" msgstr "Deixar de seguir" #: bookwyrm/templates/snippets/follow_request_buttons.html:7 +#: bookwyrm/templates/snippets/join_invitation_buttons.html:8 msgid "Accept" msgstr "Aceitar" @@ -3181,12 +3437,14 @@ msgstr "Próxima" #: bookwyrm/templates/snippets/privacy-icons.html:3 #: bookwyrm/templates/snippets/privacy-icons.html:4 #: bookwyrm/templates/snippets/privacy_select.html:11 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:11 msgid "Public" msgstr "Público" #: bookwyrm/templates/snippets/privacy-icons.html:7 #: bookwyrm/templates/snippets/privacy-icons.html:8 #: bookwyrm/templates/snippets/privacy_select.html:14 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:14 msgid "Unlisted" msgstr "Não listado" @@ -3195,6 +3453,7 @@ msgid "Followers-only" msgstr "Apenas seguidores" #: bookwyrm/templates/snippets/privacy_select.html:6 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:6 msgid "Post privacy" msgstr "Privacidade da publicação" @@ -3329,14 +3588,14 @@ msgstr "Esconder publicação" #: bookwyrm/templates/snippets/status/header.html:45 #, python-format msgid "edited %(date)s" -msgstr "editado em %(date)s" +msgstr "editado %(date)s" #: bookwyrm/templates/snippets/status/headers/comment.html:2 #, python-format msgid "commented on %(book)s" -msgstr "comentou sobre %(book)s" +msgstr "comentou %(book)s" -#: bookwyrm/templates/snippets/status/headers/note.html:15 +#: bookwyrm/templates/snippets/status/headers/note.html:8 #, python-format msgid "replied to %(username)s's status" msgstr "respondeu à publicação de %(username)s" @@ -3388,32 +3647,13 @@ msgstr "Curtir publicação" #: bookwyrm/templates/snippets/status/status.html:10 msgid "boosted" -msgstr "compartilhado" +msgstr "compartilhou" #: bookwyrm/templates/snippets/status/status_options.html:7 #: bookwyrm/templates/snippets/user_options.html:7 msgid "More options" msgstr "Mais opções" -#: bookwyrm/templates/snippets/suggested_users.html:16 -#, python-format -msgid "%(mutuals)s follower you follow" -msgid_plural "%(mutuals)s followers you follow" -msgstr[0] "%(mutuals)s seguidor você segue" -msgstr[1] "%(mutuals)s seguidores você segue" - -#: bookwyrm/templates/snippets/suggested_users.html:23 -#, python-format -msgid "%(shared_books)s book on your shelves" -msgid_plural "%(shared_books)s books on your shelves" -msgstr[0] "%(shared_books)s livro em sua estante" -msgstr[1] "%(shared_books)s livros em suas estantes" - -#: bookwyrm/templates/snippets/suggested_users.html:31 -#: bookwyrm/templates/user/user_preview.html:36 -msgid "Follows you" -msgstr "Segue você" - #: bookwyrm/templates/snippets/switch_edition_button.html:5 msgid "Switch to this edition" msgstr "Trocar para esta edição" @@ -3434,7 +3674,11 @@ msgstr "Mostrar mais" msgid "Show less" msgstr "Mostrar menos" -#: bookwyrm/templates/user/books_header.html:5 +#: bookwyrm/templates/user/books_header.html:10 +msgid "Your books" +msgstr "Seus livros" + +#: bookwyrm/templates/user/books_header.html:15 #, python-format msgid "%(username)s's books" msgstr "livros de %(username)s" @@ -3463,18 +3707,35 @@ msgstr "Seus livros de %(year)s" msgid "%(username)s's %(year)s Books" msgstr "Livros de %(username)s de %(year)s" -#: bookwyrm/templates/user/layout.html:18 bookwyrm/templates/user/user.html:10 +#: bookwyrm/templates/user/groups.html:9 +msgid "Your Groups" +msgstr "Seus grupos" + +#: bookwyrm/templates/user/groups.html:11 +#, python-format +msgid "Groups: %(username)s" +msgstr "Grupos: %(username)s" + +#: bookwyrm/templates/user/groups.html:17 +msgid "Create group" +msgstr "Criar grupo" + +#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:10 msgid "User Profile" msgstr "Perfil do usuário" -#: bookwyrm/templates/user/layout.html:44 +#: bookwyrm/templates/user/layout.html:45 msgid "Follow Requests" msgstr "Solicitações para seguir" -#: bookwyrm/templates/user/layout.html:69 +#: bookwyrm/templates/user/layout.html:70 msgid "Reading Goal" msgstr "Meta de leitura" +#: bookwyrm/templates/user/layout.html:76 +msgid "Groups" +msgstr "Grupos" + #: bookwyrm/templates/user/lists.html:11 #, python-format msgid "Lists: %(username)s" @@ -3527,7 +3788,7 @@ msgstr "Nenhuma atividade ainda!" #: bookwyrm/templates/user/user_preview.html:22 #, python-format msgid "Joined %(date)s" -msgstr "Membro desde %(date)s" +msgstr "Entrou %(date)s" #: bookwyrm/templates/user/user_preview.html:26 #, python-format @@ -3561,19 +3822,19 @@ msgstr "Arquivo excede o tamanho máximo: 10MB" msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/views/import_data.py:67 +#: bookwyrm/views/imports/import_data.py:64 msgid "Not a valid csv file" msgstr "Não é um arquivo csv válido" -#: bookwyrm/views/login.py:69 +#: bookwyrm/views/landing/login.py:69 msgid "Username or password are incorrect" msgstr "Nome de usuário ou senha incorretos" -#: bookwyrm/views/password.py:32 +#: bookwyrm/views/landing/password.py:32 msgid "No user with that email address was found." msgstr "Não há nenhum usuário com este e-mail." -#: bookwyrm/views/password.py:41 +#: bookwyrm/views/landing/password.py:43 #, python-brace-format msgid "A password reset link was sent to {email}" msgstr "Um link para redefinição da senha foi enviado para {email}" diff --git a/locale/zh_Hans/LC_MESSAGES/django.mo b/locale/zh_Hans/LC_MESSAGES/django.mo index 1d1227f8..5034e6da 100644 Binary files a/locale/zh_Hans/LC_MESSAGES/django.mo and b/locale/zh_Hans/LC_MESSAGES/django.mo differ diff --git a/locale/zh_Hans/LC_MESSAGES/django.po b/locale/zh_Hans/LC_MESSAGES/django.po index 2a070735..bb04744d 100644 --- a/locale/zh_Hans/LC_MESSAGES/django.po +++ b/locale/zh_Hans/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-15 22:03+0000\n" -"PO-Revision-Date: 2021-10-16 14:36\n" +"POT-Creation-Date: 2021-11-14 15:08+0000\n" +"PO-Revision-Date: 2021-11-15 20:22\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Chinese Simplified\n" "Language: zh\n" @@ -46,41 +46,42 @@ msgstr "{i} 次使用" msgid "Unlimited" msgstr "不受限" -#: bookwyrm/forms.py:326 +#: bookwyrm/forms.py:332 msgid "List Order" msgstr "列表顺序" -#: bookwyrm/forms.py:327 +#: bookwyrm/forms.py:333 msgid "Book Title" msgstr "书名" -#: bookwyrm/forms.py:328 bookwyrm/templates/shelf/shelf.html:136 -#: bookwyrm/templates/shelf/shelf.html:168 +#: bookwyrm/forms.py:334 bookwyrm/templates/shelf/shelf.html:149 +#: bookwyrm/templates/shelf/shelf.html:181 #: bookwyrm/templates/snippets/create_status/review.html:33 msgid "Rating" msgstr "评价" -#: bookwyrm/forms.py:330 bookwyrm/templates/lists/list.html:109 +#: bookwyrm/forms.py:336 bookwyrm/templates/lists/list.html:110 msgid "Sort By" msgstr "排序方式" -#: bookwyrm/forms.py:334 +#: bookwyrm/forms.py:340 msgid "Ascending" msgstr "升序" -#: bookwyrm/forms.py:335 +#: bookwyrm/forms.py:341 msgid "Descending" msgstr "降序" -#: bookwyrm/importers/importer.py:75 +#: bookwyrm/importers/importer.py:127 msgid "Error loading book" msgstr "加载书籍时出错" -#: bookwyrm/importers/importer.py:88 +#: bookwyrm/importers/importer.py:135 msgid "Could not find a match for book" msgstr "找不到匹配的书" #: bookwyrm/models/base_model.py:17 +#: bookwyrm/templates/import/import_status.html:171 msgid "Pending" msgstr "待处理" @@ -100,23 +101,23 @@ msgstr "仲裁员删除" msgid "Domain block" msgstr "域名屏蔽" -#: bookwyrm/models/book.py:232 +#: bookwyrm/models/book.py:233 msgid "Audiobook" msgstr "有声书籍" -#: bookwyrm/models/book.py:233 +#: bookwyrm/models/book.py:234 msgid "eBook" msgstr "电子书" -#: bookwyrm/models/book.py:234 +#: bookwyrm/models/book.py:235 msgid "Graphic novel" msgstr "图像小说" -#: bookwyrm/models/book.py:235 -msgid "Hardcover" -msgstr "硬封面" - #: bookwyrm/models/book.py:236 +msgid "Hardcover" +msgstr "精装" + +#: bookwyrm/models/book.py:237 msgid "Paperback" msgstr "平装" @@ -133,21 +134,21 @@ msgstr "跨站" msgid "Blocked" msgstr "已屏蔽" -#: bookwyrm/models/fields.py:27 +#: bookwyrm/models/fields.py:29 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "%(value)s 不是有效的 remote_id" -#: bookwyrm/models/fields.py:36 bookwyrm/models/fields.py:45 +#: bookwyrm/models/fields.py:38 bookwyrm/models/fields.py:47 #, python-format msgid "%(value)s is not a valid username" msgstr "%(value)s 不是有效的用户名" -#: bookwyrm/models/fields.py:181 bookwyrm/templates/layout.html:171 +#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:171 msgid "username" msgstr "用户名" -#: bookwyrm/models/fields.py:186 +#: bookwyrm/models/fields.py:188 msgid "A user with that username already exists." msgstr "已经存在使用该用户名的用户。" @@ -165,7 +166,7 @@ msgstr "书目时间线" #: bookwyrm/settings.py:119 bookwyrm/templates/search/layout.html:21 #: bookwyrm/templates/search/layout.html:42 -#: bookwyrm/templates/user/layout.html:81 +#: bookwyrm/templates/user/layout.html:88 msgid "Books" msgstr "书目" @@ -187,7 +188,7 @@ msgstr "Français(法语)" #: bookwyrm/settings.py:169 msgid "Português - Brasil (Brazilian Portuguese)" -msgstr "" +msgstr "葡萄牙语-巴西(巴西的葡语)" #: bookwyrm/settings.py:170 msgid "简体中文 (Simplified Chinese)" @@ -223,7 +224,7 @@ msgid "Edit Author" msgstr "编辑作者" #: bookwyrm/templates/author/author.html:34 -#: bookwyrm/templates/author/edit_author.html:41 +#: bookwyrm/templates/author/edit_author.html:43 msgid "Aliases:" msgstr "别名:" @@ -276,71 +277,72 @@ msgstr "添加了:" msgid "Updated:" msgstr "更新了:" -#: bookwyrm/templates/author/edit_author.html:15 +#: bookwyrm/templates/author/edit_author.html:16 #: bookwyrm/templates/book/edit/edit_book.html:25 msgid "Last edited by:" msgstr "最后编辑人:" -#: bookwyrm/templates/author/edit_author.html:31 +#: bookwyrm/templates/author/edit_author.html:33 #: bookwyrm/templates/book/edit/edit_book_form.html:15 msgid "Metadata" msgstr "元数据" -#: bookwyrm/templates/author/edit_author.html:33 -#: bookwyrm/templates/lists/form.html:8 bookwyrm/templates/shelf/form.html:9 +#: bookwyrm/templates/author/edit_author.html:35 +#: bookwyrm/templates/lists/form.html:9 bookwyrm/templates/shelf/form.html:9 msgid "Name:" msgstr "名称:" -#: bookwyrm/templates/author/edit_author.html:43 +#: bookwyrm/templates/author/edit_author.html:45 #: bookwyrm/templates/book/edit/edit_book_form.html:65 #: bookwyrm/templates/book/edit/edit_book_form.html:79 #: bookwyrm/templates/book/edit/edit_book_form.html:124 msgid "Separate multiple values with commas." msgstr "请用英文逗号(,)分隔多个值。" -#: bookwyrm/templates/author/edit_author.html:50 +#: bookwyrm/templates/author/edit_author.html:52 msgid "Bio:" msgstr "简介:" -#: bookwyrm/templates/author/edit_author.html:57 +#: bookwyrm/templates/author/edit_author.html:59 msgid "Wikipedia link:" msgstr "维基百科链接:" -#: bookwyrm/templates/author/edit_author.html:63 +#: bookwyrm/templates/author/edit_author.html:65 msgid "Birth date:" msgstr "出生日期:" -#: bookwyrm/templates/author/edit_author.html:71 +#: bookwyrm/templates/author/edit_author.html:73 msgid "Death date:" msgstr "死亡日期:" -#: bookwyrm/templates/author/edit_author.html:79 +#: bookwyrm/templates/author/edit_author.html:81 msgid "Author Identifiers" msgstr "作者标识号:" -#: bookwyrm/templates/author/edit_author.html:81 +#: bookwyrm/templates/author/edit_author.html:83 msgid "Openlibrary key:" msgstr "Openlibrary key:" -#: bookwyrm/templates/author/edit_author.html:89 +#: bookwyrm/templates/author/edit_author.html:91 #: bookwyrm/templates/book/edit/edit_book_form.html:224 msgid "Inventaire ID:" msgstr "Inventaire ID:" -#: bookwyrm/templates/author/edit_author.html:97 +#: bookwyrm/templates/author/edit_author.html:99 msgid "Librarything key:" msgstr "Librarything key:" -#: bookwyrm/templates/author/edit_author.html:105 +#: bookwyrm/templates/author/edit_author.html:107 msgid "Goodreads key:" msgstr "Goodreads key:" -#: bookwyrm/templates/author/edit_author.html:116 +#: bookwyrm/templates/author/edit_author.html:118 #: bookwyrm/templates/book/book.html:140 #: bookwyrm/templates/book/edit/edit_book.html:110 #: bookwyrm/templates/book/readthrough.html:76 +#: bookwyrm/templates/groups/form.html:24 #: bookwyrm/templates/lists/bookmark_button.html:15 -#: bookwyrm/templates/lists/form.html:44 +#: bookwyrm/templates/lists/form.html:75 #: bookwyrm/templates/preferences/edit_user.html:124 #: bookwyrm/templates/settings/announcements/announcement_form.html:69 #: bookwyrm/templates/settings/federation/edit_instance.html:74 @@ -352,11 +354,13 @@ msgstr "Goodreads key:" msgid "Save" msgstr "保存" -#: bookwyrm/templates/author/edit_author.html:117 +#: bookwyrm/templates/author/edit_author.html:119 #: bookwyrm/templates/book/book.html:141 bookwyrm/templates/book/book.html:190 #: bookwyrm/templates/book/cover_modal.html:32 -#: bookwyrm/templates/book/edit/edit_book.html:111 +#: bookwyrm/templates/book/edit/edit_book.html:112 +#: bookwyrm/templates/book/edit/edit_book.html:115 #: bookwyrm/templates/book/readthrough.html:77 +#: bookwyrm/templates/groups/delete_group_modal.html:17 #: bookwyrm/templates/lists/delete_list_modal.html:17 #: bookwyrm/templates/settings/federation/instance.html:88 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:17 @@ -396,7 +400,7 @@ msgstr "添加描述" #: bookwyrm/templates/book/book.html:136 #: bookwyrm/templates/book/edit/edit_book_form.html:34 -#: bookwyrm/templates/lists/form.html:12 bookwyrm/templates/shelf/form.html:17 +#: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "描述:" @@ -459,7 +463,7 @@ msgstr "地点" #: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12 #: bookwyrm/templates/search/layout.html:25 #: bookwyrm/templates/search/layout.html:50 -#: bookwyrm/templates/user/layout.html:75 +#: bookwyrm/templates/user/layout.html:82 msgid "Lists" msgstr "列表" @@ -469,7 +473,7 @@ msgstr "添加到列表" #: bookwyrm/templates/book/book.html:315 #: bookwyrm/templates/book/cover_modal.html:31 -#: bookwyrm/templates/lists/list.html:181 +#: bookwyrm/templates/lists/list.html:182 #: bookwyrm/templates/settings/email_blocklist/domain_form.html:26 #: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:32 msgid "Add" @@ -542,7 +546,9 @@ msgid "This is a new work" msgstr "这是一个新的作品。" #: bookwyrm/templates/book/edit/edit_book.html:97 -#: bookwyrm/templates/password_reset.html:30 +#: bookwyrm/templates/groups/members.html:16 +#: bookwyrm/templates/landing/password_reset.html:30 +#: bookwyrm/templates/snippets/remove_from_group_button.html:16 msgid "Confirm" msgstr "确认" @@ -611,7 +617,7 @@ msgid "John Doe, Jane Smith" msgstr "张三, 李四" #: bookwyrm/templates/book/edit/edit_book_form.html:132 -#: bookwyrm/templates/shelf/shelf.html:127 +#: bookwyrm/templates/shelf/shelf.html:140 msgid "Cover" msgstr "封面" @@ -752,7 +758,7 @@ msgstr "帮助" #: bookwyrm/templates/compose.html:5 bookwyrm/templates/compose.html:8 msgid "Edit status" -msgstr "" +msgstr "编辑状态" #: bookwyrm/templates/confirm_email/confirm_email.html:4 msgid "Confirm email" @@ -792,7 +798,7 @@ msgstr "重新发送确认链接" #: bookwyrm/templates/confirm_email/resend_form.html:11 #: bookwyrm/templates/landing/layout.html:67 -#: bookwyrm/templates/password_reset_request.html:18 +#: bookwyrm/templates/landing/password_reset_request.html:18 #: bookwyrm/templates/preferences/edit_user.html:56 #: bookwyrm/templates/snippets/register_form.html:13 msgid "Email address:" @@ -884,25 +890,40 @@ msgstr "BookWyrm 用户" msgid "All known users" msgstr "所有已知用户" -#: bookwyrm/templates/discover/card-header.html:9 +#: bookwyrm/templates/discover/card-header.html:8 #, python-format -msgid "%(username)s rated %(book_title)s" -msgstr "" +msgid "%(username)s wants to read %(book_title)s" +msgstr "%(username)s 想要阅读 %(book_title)s" #: bookwyrm/templates/discover/card-header.html:13 #, python-format -msgid "%(username)s reviewed %(book_title)s" +msgid "%(username)s finished reading %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:17 +#: bookwyrm/templates/discover/card-header.html:18 +#, python-format +msgid "%(username)s started reading %(book_title)s" +msgstr "" + +#: bookwyrm/templates/discover/card-header.html:23 +#, python-format +msgid "%(username)s rated %(book_title)s" +msgstr "%(username)s%(book_title)s 留下了评分" + +#: bookwyrm/templates/discover/card-header.html:27 +#, python-format +msgid "%(username)s reviewed %(book_title)s" +msgstr "%(username)s 已评价 %(book_title)s" + +#: bookwyrm/templates/discover/card-header.html:31 #, python-format msgid "%(username)s commented on %(book_title)s" -msgstr "" +msgstr "%(username)s 评论了 %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:21 +#: bookwyrm/templates/discover/card-header.html:35 #, python-format msgid "%(username)s quoted %(book_title)s" -msgstr "" +msgstr "%(username)s 引用了 %(book_title)s" #: bookwyrm/templates/discover/discover.html:4 #: bookwyrm/templates/discover/discover.html:10 @@ -971,7 +992,7 @@ msgstr "立即加入" #: bookwyrm/templates/email/invite/html_content.html:15 #, python-format msgid "Learn more about %(site_name)s." -msgstr "" +msgstr "了解更多 关于 %(site_name)s" #: bookwyrm/templates/email/invite/text_content.html:4 #, python-format @@ -981,7 +1002,7 @@ msgstr "你受邀请加入 %(site_name)s!点击下面的连接来创建帐号 #: bookwyrm/templates/email/invite/text_content.html:8 #, python-format msgid "Learn more about %(site_name)s:" -msgstr "" +msgstr "进一步了解 %(site_name)s" #: bookwyrm/templates/email/password_reset/html_content.html:6 #: bookwyrm/templates/email/password_reset/text_content.html:4 @@ -990,10 +1011,10 @@ msgid "You requested to reset your %(site_name)s password. Click the link below msgstr "你请求重置你在 %(site_name)s 的密码。点击下面的链接来设置新密码并登录你的帐号。" #: bookwyrm/templates/email/password_reset/html_content.html:9 -#: bookwyrm/templates/password_reset.html:4 -#: bookwyrm/templates/password_reset.html:10 -#: bookwyrm/templates/password_reset_request.html:4 -#: bookwyrm/templates/password_reset_request.html:10 +#: bookwyrm/templates/landing/password_reset.html:4 +#: bookwyrm/templates/landing/password_reset.html:10 +#: bookwyrm/templates/landing/password_reset_request.html:4 +#: bookwyrm/templates/landing/password_reset_request.html:10 msgid "Reset Password" msgstr "重设密码" @@ -1050,9 +1071,8 @@ msgstr "你可以在任何时候从你的个人资料页面 msgid "Updates" msgstr "更新" -#: bookwyrm/templates/feed/layout.html:12 -#: bookwyrm/templates/user/books_header.html:3 -msgid "Your books" +#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:106 +msgid "Your Books" msgstr "你的书目" #: bookwyrm/templates/feed/layout.html:14 @@ -1061,11 +1081,13 @@ msgstr "现在这里还没有任何书目!尝试着从搜索某本书开始吧 #: bookwyrm/templates/feed/layout.html:25 #: bookwyrm/templates/shelf/shelf.html:38 +#: bookwyrm/templates/user/books_header.html:4 msgid "To Read" msgstr "想读" #: bookwyrm/templates/feed/layout.html:26 #: bookwyrm/templates/shelf/shelf.html:40 +#: bookwyrm/templates/user/books_header.html:6 msgid "Currently Reading" msgstr "在读" @@ -1073,6 +1095,7 @@ msgstr "在读" #: bookwyrm/templates/shelf/shelf.html:42 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:23 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12 +#: bookwyrm/templates/user/books_header.html:8 msgid "Read" msgstr "读过" @@ -1099,7 +1122,7 @@ msgid "What are you reading?" msgstr "你在阅读什么?" #: bookwyrm/templates/get_started/books.html:9 -#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:137 +#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:138 msgid "Search for a book" msgstr "搜索书目" @@ -1117,8 +1140,9 @@ msgstr "你可以在开始使用 %(site_name)s 后添加书目。" #: bookwyrm/templates/get_started/books.html:17 #: bookwyrm/templates/get_started/users.html:18 #: bookwyrm/templates/get_started/users.html:19 -#: bookwyrm/templates/layout.html:51 bookwyrm/templates/layout.html:52 -#: bookwyrm/templates/lists/list.html:141 +#: bookwyrm/templates/groups/group.html:19 +#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:51 +#: bookwyrm/templates/layout.html:52 bookwyrm/templates/lists/list.html:142 #: bookwyrm/templates/search/layout.html:4 #: bookwyrm/templates/search/layout.html:9 msgid "Search" @@ -1134,7 +1158,7 @@ msgid "Popular on %(site_name)s" msgstr "%(site_name)s 上的热门" #: bookwyrm/templates/get_started/books.html:58 -#: bookwyrm/templates/lists/list.html:154 +#: bookwyrm/templates/lists/list.html:155 msgid "No books found" msgstr "没有找到书目" @@ -1220,9 +1244,108 @@ msgstr "搜索用户" msgid "No users found for \"%(query)s\"" msgstr "没有找到 \"%(query)s\" 的用户" +#: bookwyrm/templates/groups/create_form.html:5 +msgid "Create Group" +msgstr "创建群组" + +#: bookwyrm/templates/groups/created_text.html:4 +#, python-format +msgid "Managed by %(username)s" +msgstr "由 %(username)s 管理" + +#: bookwyrm/templates/groups/delete_group_modal.html:4 +msgid "Delete this group?" +msgstr "删除该群组?" + +#: bookwyrm/templates/groups/delete_group_modal.html:7 +#: bookwyrm/templates/lists/delete_list_modal.html:7 +msgid "This action cannot be un-done" +msgstr "此操作无法被撤销" + +#: bookwyrm/templates/groups/delete_group_modal.html:15 +#: bookwyrm/templates/lists/delete_list_modal.html:15 +#: bookwyrm/templates/settings/announcements/announcement.html:20 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36 +#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 +#: bookwyrm/templates/snippets/follow_request_buttons.html:12 +#: bookwyrm/templates/snippets/join_invitation_buttons.html:13 +msgid "Delete" +msgstr "删除" + +#: bookwyrm/templates/groups/edit_form.html:5 +msgid "Edit Group" +msgstr "编辑群组" + +#: bookwyrm/templates/groups/find_users.html:6 +msgid "Add new members!" +msgstr "添加新成员!" + +#: bookwyrm/templates/groups/form.html:8 +msgid "Group Name:" +msgstr "群组名称:" + +#: bookwyrm/templates/groups/form.html:12 +msgid "Group Description:" +msgstr "群组描述" + +#: bookwyrm/templates/groups/form.html:30 +msgid "Delete group" +msgstr "删除群组" + +#: bookwyrm/templates/groups/group.html:15 +msgid "Search to add a user" +msgstr "搜索或添加用户" + +#: bookwyrm/templates/groups/group.html:36 +msgid "This group has no lists" +msgstr "这个群组没有任何列表" + +#: bookwyrm/templates/groups/layout.html:16 +msgid "Edit group" +msgstr "编辑群组" + +#: bookwyrm/templates/groups/members.html:8 +msgid "Members can add and remove books on a group's book lists" +msgstr "成员可以在群组的书籍列表中添加和删除书籍" + +#: bookwyrm/templates/groups/members.html:19 +msgid "Leave group" +msgstr "退出群组" + +#: bookwyrm/templates/groups/members.html:41 +#: bookwyrm/templates/groups/suggested_users.html:32 +#: bookwyrm/templates/snippets/suggested_users.html:31 +#: bookwyrm/templates/user/user_preview.html:36 +msgid "Follows you" +msgstr "正在关注着你" + +#: bookwyrm/templates/groups/suggested_users.html:17 +#: bookwyrm/templates/snippets/suggested_users.html:16 +#, python-format +msgid "%(mutuals)s follower you follow" +msgid_plural "%(mutuals)s followers you follow" +msgstr[0] "%(mutuals)s 个你也关注的关注者" + +#: bookwyrm/templates/groups/suggested_users.html:24 +#: bookwyrm/templates/snippets/suggested_users.html:23 +#, python-format +msgid "%(shared_books)s book on your shelves" +msgid_plural "%(shared_books)s books on your shelves" +msgstr[0] "%(shared_books)s 本在你书架上也有的书" + +#: bookwyrm/templates/groups/suggested_users.html:40 +#, python-format +msgid "No potential members found for \"%(user_query)s\"" +msgstr "未找到可能的成员 \"%(user_query)s\"" + +#: bookwyrm/templates/groups/user_groups.html:15 +msgid "Manager" +msgstr "管理员" + #: bookwyrm/templates/import/import.html:5 #: bookwyrm/templates/import/import.html:9 -#: bookwyrm/templates/shelf/shelf.html:57 +#: bookwyrm/templates/shelf/shelf.html:61 msgid "Import Books" msgstr "导入书目" @@ -1256,100 +1379,158 @@ msgid "No recent imports" msgstr "无最近的导入" #: bookwyrm/templates/import/import_status.html:6 -#: bookwyrm/templates/import/import_status.html:10 +#: bookwyrm/templates/import/import_status.html:15 +#: bookwyrm/templates/import/import_status.html:29 msgid "Import Status" msgstr "导入状态" -#: bookwyrm/templates/import/import_status.html:11 -msgid "Back to imports" -msgstr "回到导入" +#: bookwyrm/templates/import/import_status.html:13 +#: bookwyrm/templates/import/import_status.html:27 +msgid "Retry Status" +msgstr "" -#: bookwyrm/templates/import/import_status.html:15 +#: bookwyrm/templates/import/import_status.html:22 +msgid "Imports" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:39 msgid "Import started:" msgstr "导入开始:" -#: bookwyrm/templates/import/import_status.html:20 -msgid "Import completed:" -msgstr "导入完成:" - -#: bookwyrm/templates/import/import_status.html:24 -msgid "TASK FAILED" -msgstr "任务失败" - -#: bookwyrm/templates/import/import_status.html:32 -msgid "Import still in progress." -msgstr "还在导入中。" - -#: bookwyrm/templates/import/import_status.html:34 -msgid "(Hit reload to update!)" -msgstr "(按下重新加载来更新!)" - -#: bookwyrm/templates/import/import_status.html:41 -msgid "Failed to load" -msgstr "加载失败" +#: bookwyrm/templates/import/import_status.html:48 +msgid "In progress" +msgstr "" #: bookwyrm/templates/import/import_status.html:50 -#, python-format -msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import." -msgstr "跳转至列表底部来选取 %(failed_count)s 个导入失败的项目。" +msgid "Refresh" +msgstr "" #: bookwyrm/templates/import/import_status.html:62 #, python-format -msgid "Line %(index)s: %(title)s by %(author)s" -msgstr "第 %(index)s 行: %(author)s 所著的 %(title)s" +msgid "%(display_counter)s item needs manual approval." +msgid_plural "%(display_counter)s items need manual approval." +msgstr[0] "" -#: bookwyrm/templates/import/import_status.html:82 -msgid "Select all" -msgstr "全选" +#: bookwyrm/templates/import/import_status.html:67 +#: bookwyrm/templates/import/manual_review.html:8 +msgid "Review items" +msgstr "" -#: bookwyrm/templates/import/import_status.html:85 -msgid "Retry items" -msgstr "重试项目" +#: bookwyrm/templates/import/import_status.html:73 +#, python-format +msgid "%(display_counter)s item failed to import." +msgid_plural "%(display_counter)s items failed to import." +msgstr[0] "" -#: bookwyrm/templates/import/import_status.html:112 -msgid "Successfully imported" -msgstr "成功导入了" +#: bookwyrm/templates/import/import_status.html:79 +msgid "View and troubleshoot failed items" +msgstr "" -#: bookwyrm/templates/import/import_status.html:114 -msgid "Import Progress" -msgstr "导入进度" +#: bookwyrm/templates/import/import_status.html:91 +msgid "Row" +msgstr "" -#: bookwyrm/templates/import/import_status.html:119 -msgid "Book" -msgstr "书目" - -#: bookwyrm/templates/import/import_status.html:122 -#: bookwyrm/templates/shelf/shelf.html:128 -#: bookwyrm/templates/shelf/shelf.html:150 +#: bookwyrm/templates/import/import_status.html:94 +#: bookwyrm/templates/shelf/shelf.html:141 +#: bookwyrm/templates/shelf/shelf.html:163 msgid "Title" msgstr "标题" -#: bookwyrm/templates/import/import_status.html:125 -#: bookwyrm/templates/shelf/shelf.html:129 -#: bookwyrm/templates/shelf/shelf.html:153 +#: bookwyrm/templates/import/import_status.html:97 +msgid "ISBN" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:100 +#: bookwyrm/templates/shelf/shelf.html:142 +#: bookwyrm/templates/shelf/shelf.html:166 msgid "Author" msgstr "作者" -#: bookwyrm/templates/import/import_status.html:148 +#: bookwyrm/templates/import/import_status.html:103 +msgid "Shelf" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:106 +#: bookwyrm/templates/import/manual_review.html:13 +#: bookwyrm/templates/snippets/create_status.html:17 +msgid "Review" +msgstr "书评" + +#: bookwyrm/templates/import/import_status.html:110 +msgid "Book" +msgstr "书目" + +#: bookwyrm/templates/import/import_status.html:113 +#: bookwyrm/templates/settings/announcements/announcements.html:38 +#: bookwyrm/templates/settings/federation/instance_list.html:46 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44 +#: bookwyrm/templates/settings/invites/status_filter.html:5 +#: bookwyrm/templates/settings/users/user_admin.html:34 +#: bookwyrm/templates/settings/users/user_info.html:20 +msgid "Status" +msgstr "状态" + +#: bookwyrm/templates/import/import_status.html:144 +msgid "View imported review" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:158 msgid "Imported" msgstr "已导入" -#: bookwyrm/templates/import/tooltip.html:6 -msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." +#: bookwyrm/templates/import/import_status.html:164 +msgid "Needs manual review" msgstr "" -#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:8 -#: bookwyrm/templates/login.html:49 -msgid "Create an Account" -msgstr "创建帐号" +#: bookwyrm/templates/import/manual_review.html:5 +#: bookwyrm/templates/import/troubleshoot.html:4 +msgid "Import Troubleshooting" +msgstr "" -#: bookwyrm/templates/invite.html:21 -msgid "Permission Denied" -msgstr "没有权限" +#: bookwyrm/templates/import/manual_review.html:21 +msgid "Approving a suggestion will permanently add the suggested book to your shelves and associate your reading dates, reviews, and ratings with that book." +msgstr "" -#: bookwyrm/templates/invite.html:22 -msgid "Sorry! This invite code is no longer valid." -msgstr "抱歉!此邀请码已不再有效。" +#: bookwyrm/templates/import/manual_review.html:56 +#: bookwyrm/templates/lists/curate.html:57 +msgid "Approve" +msgstr "批准" + +#: bookwyrm/templates/import/manual_review.html:64 +msgid "Reject" +msgstr "" + +#: bookwyrm/templates/import/tooltip.html:6 +msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." +msgstr "您可以从 导入/导出页面 下载或导出您的 Goodread 数据。" + +#: bookwyrm/templates/import/troubleshoot.html:7 +msgid "Failed items" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:12 +msgid "Troubleshooting" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:20 +msgid "Re-trying an import can fix missing items in cases such as:" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:23 +msgid "The book has been added to the instance since this import" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:24 +msgid "A transient error or timeout caused the external data source to be unavailable." +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:25 +msgid "BookWyrm has been updated since this import with a bug fix" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:28 +msgid "Contact your admin or open an issue if you are seeing unexpected failed items." +msgstr "" #: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:230 #, python-format @@ -1366,6 +1547,20 @@ msgstr "行为准则" msgid "Privacy Policy" msgstr "隐私政策" +#: bookwyrm/templates/landing/invite.html:4 +#: bookwyrm/templates/landing/invite.html:8 +#: bookwyrm/templates/landing/login.html:49 +msgid "Create an Account" +msgstr "创建帐号" + +#: bookwyrm/templates/landing/invite.html:21 +msgid "Permission Denied" +msgstr "没有权限" + +#: bookwyrm/templates/landing/invite.html:22 +msgid "Sorry! This invite code is no longer valid." +msgstr "抱歉!此邀请码已不再有效。" + #: bookwyrm/templates/landing/landing.html:6 msgid "Recent Books" msgstr "最近书目" @@ -1404,6 +1599,53 @@ msgstr "谢谢你!我们已经收到了你的请求。" msgid "Your Account" msgstr "你的帐号" +#: bookwyrm/templates/landing/login.html:4 +msgid "Login" +msgstr "登录" + +#: bookwyrm/templates/landing/login.html:7 +#: bookwyrm/templates/landing/login.html:37 bookwyrm/templates/layout.html:179 +msgid "Log in" +msgstr "登录" + +#: bookwyrm/templates/landing/login.html:15 +msgid "Success! Email address confirmed." +msgstr "成功!邮箱地址已确认。" + +#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:170 +#: bookwyrm/templates/snippets/register_form.html:4 +msgid "Username:" +msgstr "用户名:" + +#: bookwyrm/templates/landing/login.html:27 +#: bookwyrm/templates/landing/password_reset.html:17 +#: bookwyrm/templates/layout.html:174 +#: bookwyrm/templates/snippets/register_form.html:22 +msgid "Password:" +msgstr "密码:" + +#: bookwyrm/templates/landing/login.html:40 bookwyrm/templates/layout.html:176 +msgid "Forgot your password?" +msgstr "忘记了密码?" + +#: bookwyrm/templates/landing/login.html:62 +msgid "More about this site" +msgstr "更多关于本站点的信息" + +#: bookwyrm/templates/landing/password_reset.html:23 +#: bookwyrm/templates/preferences/change_password.html:18 +#: bookwyrm/templates/preferences/delete_user.html:20 +msgid "Confirm password:" +msgstr "确认密码:" + +#: bookwyrm/templates/landing/password_reset_request.html:14 +msgid "A link to reset your password will be sent to your email address" +msgstr "重设你的密码的链接将会被发送到你的邮箱地址" + +#: bookwyrm/templates/landing/password_reset_request.html:28 +msgid "Reset password" +msgstr "重设密码" + #: bookwyrm/templates/layout.html:13 #, python-format msgid "%(site_name)s search" @@ -1421,10 +1663,6 @@ msgstr "主导航菜单" msgid "Feed" msgstr "动态" -#: bookwyrm/templates/layout.html:106 -msgid "Your Books" -msgstr "你的书目" - #: bookwyrm/templates/layout.html:116 msgid "Settings" msgstr "设置" @@ -1451,25 +1689,10 @@ msgstr "登出" msgid "Notifications" msgstr "通知" -#: bookwyrm/templates/layout.html:170 bookwyrm/templates/layout.html:174 -#: bookwyrm/templates/login.html:21 -#: bookwyrm/templates/snippets/register_form.html:4 -msgid "Username:" -msgstr "用户名:" - #: bookwyrm/templates/layout.html:175 msgid "password" msgstr "密码" -#: bookwyrm/templates/layout.html:176 bookwyrm/templates/login.html:40 -msgid "Forgot your password?" -msgstr "忘记了密码?" - -#: bookwyrm/templates/layout.html:179 bookwyrm/templates/login.html:7 -#: bookwyrm/templates/login.html:37 -msgid "Log in" -msgstr "登录" - #: bookwyrm/templates/layout.html:187 msgid "Join" msgstr "加入" @@ -1510,10 +1733,15 @@ msgstr "创建列表" #: bookwyrm/templates/lists/created_text.html:5 #, python-format +msgid "Created by %(username)s and managed by %(groupname)s" +msgstr "由 %(username)s 创建,由 %(groupname)s 管理" + +#: bookwyrm/templates/lists/created_text.html:7 +#, python-format msgid "Created and curated by %(username)s" msgstr "由 %(username)s 创建并策展" -#: bookwyrm/templates/lists/created_text.html:7 +#: bookwyrm/templates/lists/created_text.html:9 #, python-format msgid "Created by %(username)s" msgstr "由 %(username)s 创建" @@ -1534,10 +1762,6 @@ msgstr "都弄好了!" msgid "Suggested by" msgstr "推荐来自" -#: bookwyrm/templates/lists/curate.html:57 -msgid "Approve" -msgstr "批准" - #: bookwyrm/templates/lists/curate.html:63 msgid "Discard" msgstr "削除" @@ -1546,118 +1770,130 @@ msgstr "削除" msgid "Delete this list?" msgstr "删除此列表?" -#: bookwyrm/templates/lists/delete_list_modal.html:7 -msgid "This action cannot be un-done" -msgstr "此操作无法被撤销" - -#: bookwyrm/templates/lists/delete_list_modal.html:15 -#: bookwyrm/templates/settings/announcements/announcement.html:20 -#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49 -#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36 -#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 -#: bookwyrm/templates/snippets/follow_request_buttons.html:12 -msgid "Delete" -msgstr "删除" - #: bookwyrm/templates/lists/edit_form.html:5 #: bookwyrm/templates/lists/layout.html:16 msgid "Edit List" msgstr "编辑列表" -#: bookwyrm/templates/lists/form.html:18 +#: bookwyrm/templates/lists/form.html:19 msgid "List curation:" msgstr "列表策展:" -#: bookwyrm/templates/lists/form.html:21 +#: bookwyrm/templates/lists/form.html:22 msgid "Closed" msgstr "已关闭" -#: bookwyrm/templates/lists/form.html:22 +#: bookwyrm/templates/lists/form.html:23 msgid "Only you can add and remove books to this list" msgstr "只有你可以在此列表中添加或移除书目" -#: bookwyrm/templates/lists/form.html:26 +#: bookwyrm/templates/lists/form.html:27 msgid "Curated" msgstr "策展" -#: bookwyrm/templates/lists/form.html:27 +#: bookwyrm/templates/lists/form.html:28 msgid "Anyone can suggest books, subject to your approval" msgstr "任何人都可以推荐书目、主题让你批准" -#: bookwyrm/templates/lists/form.html:31 +#: bookwyrm/templates/lists/form.html:32 msgctxt "curation type" msgid "Open" msgstr "开放" -#: bookwyrm/templates/lists/form.html:32 +#: bookwyrm/templates/lists/form.html:33 msgid "Anyone can add books to this list" msgstr "任何人都可以向此列表中添加书目" -#: bookwyrm/templates/lists/form.html:50 +#: bookwyrm/templates/lists/form.html:37 +msgid "Group" +msgstr "组(Group)" + +#: bookwyrm/templates/lists/form.html:38 +msgid "Group members can add to and remove from this list" +msgstr "群组成员可以添加并从列表中移除" + +#: bookwyrm/templates/lists/form.html:41 +msgid "Select Group" +msgstr "选择群组" + +#: bookwyrm/templates/lists/form.html:45 +msgid "Select a group" +msgstr "选择一个群组" + +#: bookwyrm/templates/lists/form.html:56 +msgid "You don't have any Groups yet!" +msgstr "您目前尚未拥有任何群组!" + +#: bookwyrm/templates/lists/form.html:58 +msgid "Create a Group" +msgstr "创建一个群组" + +#: bookwyrm/templates/lists/form.html:81 msgid "Delete list" msgstr "删除列表" -#: bookwyrm/templates/lists/list.html:20 +#: bookwyrm/templates/lists/list.html:21 msgid "You successfully suggested a book for this list!" msgstr "你成功向该列表推荐了一本书!" -#: bookwyrm/templates/lists/list.html:22 +#: bookwyrm/templates/lists/list.html:23 msgid "You successfully added a book to this list!" msgstr "你成功向此列表添加了一本书!" -#: bookwyrm/templates/lists/list.html:28 +#: bookwyrm/templates/lists/list.html:29 msgid "This list is currently empty" msgstr "此列表当前是空的" -#: bookwyrm/templates/lists/list.html:66 +#: bookwyrm/templates/lists/list.html:67 #, python-format msgid "Added by %(username)s" msgstr "由 %(username)s 添加" -#: bookwyrm/templates/lists/list.html:75 +#: bookwyrm/templates/lists/list.html:76 msgid "List position" msgstr "列表位置:" -#: bookwyrm/templates/lists/list.html:81 +#: bookwyrm/templates/lists/list.html:82 msgid "Set" msgstr "设定" -#: bookwyrm/templates/lists/list.html:91 +#: bookwyrm/templates/lists/list.html:92 +#: bookwyrm/templates/snippets/remove_from_group_button.html:19 #: bookwyrm/templates/snippets/shelf_selector.html:26 msgid "Remove" msgstr "移除" -#: bookwyrm/templates/lists/list.html:105 -#: bookwyrm/templates/lists/list.html:122 +#: bookwyrm/templates/lists/list.html:106 +#: bookwyrm/templates/lists/list.html:123 msgid "Sort List" msgstr "排序列表" -#: bookwyrm/templates/lists/list.html:115 +#: bookwyrm/templates/lists/list.html:116 msgid "Direction" msgstr "方向" -#: bookwyrm/templates/lists/list.html:129 +#: bookwyrm/templates/lists/list.html:130 msgid "Add Books" msgstr "添加书目" -#: bookwyrm/templates/lists/list.html:131 +#: bookwyrm/templates/lists/list.html:132 msgid "Suggest Books" msgstr "推荐书目" -#: bookwyrm/templates/lists/list.html:142 +#: bookwyrm/templates/lists/list.html:143 msgid "search" msgstr "搜索" -#: bookwyrm/templates/lists/list.html:148 +#: bookwyrm/templates/lists/list.html:149 msgid "Clear search" msgstr "清除搜索" -#: bookwyrm/templates/lists/list.html:153 +#: bookwyrm/templates/lists/list.html:154 #, python-format msgid "No books found matching the query \"%(query)s\"" msgstr "没有符合 “%(query)s” 请求的书目" -#: bookwyrm/templates/lists/list.html:181 +#: bookwyrm/templates/lists/list.html:182 msgid "Suggest" msgstr "推荐" @@ -1669,30 +1905,18 @@ msgstr "已保存" msgid "Your Lists" msgstr "你的列表" -#: bookwyrm/templates/lists/lists.html:35 +#: bookwyrm/templates/lists/lists.html:36 msgid "All Lists" msgstr "所有列表" -#: bookwyrm/templates/lists/lists.html:39 +#: bookwyrm/templates/lists/lists.html:40 msgid "Saved Lists" msgstr "保存的列表" -#: bookwyrm/templates/login.html:4 -msgid "Login" -msgstr "登录" - -#: bookwyrm/templates/login.html:15 -msgid "Success! Email address confirmed." -msgstr "成功!邮箱地址已确认。" - -#: bookwyrm/templates/login.html:27 bookwyrm/templates/password_reset.html:17 -#: bookwyrm/templates/snippets/register_form.html:22 -msgid "Password:" -msgstr "密码:" - -#: bookwyrm/templates/login.html:62 -msgid "More about this site" -msgstr "更多关于本站点的信息" +#: bookwyrm/templates/notifications/items/accept.html:16 +#, python-format +msgid "accepted your invitation to join group \"%(group_name)s\"" +msgstr "接受了您的邀请,加入了 \"%(group_name)s\" 群组" #: bookwyrm/templates/notifications/items/add.html:24 #, python-format @@ -1727,22 +1951,22 @@ msgstr "转发了你的 状态" #: bookwyrm/templates/notifications/items/fav.html:19 #, python-format msgid "liked your review of %(book_title)s" -msgstr "" +msgstr "喜欢了你 %(book_title)s 的书评" #: bookwyrm/templates/notifications/items/fav.html:25 #, python-format -msgid "liked your comment on%(book_title)s" -msgstr "" +msgid "liked your comment on %(book_title)s" +msgstr "喜欢了你的 %(book_title)s 的评论" #: bookwyrm/templates/notifications/items/fav.html:31 #, python-format msgid "liked your quote from %(book_title)s" -msgstr "" +msgstr "喜欢了你的 %(book_title)s 的引用" #: bookwyrm/templates/notifications/items/fav.html:37 #, python-format msgid "liked your status" -msgstr "" +msgstr "喜欢了你的 状态" #: bookwyrm/templates/notifications/items/follow.html:15 msgid "followed you" @@ -1757,6 +1981,21 @@ msgstr "向你发送了关注请求" msgid "Your import completed." msgstr "你的 导入 已完成。" +#: bookwyrm/templates/notifications/items/invite.html:15 +#, python-format +msgid "invited you to join the group \"%(group_name)s\"" +msgstr "邀请您加入群组 \"%(group_name)s\"" + +#: bookwyrm/templates/notifications/items/join.html:16 +#, python-format +msgid "has joined your group \"%(group_name)s\"" +msgstr "已加入您的群组 \"%(group_name)s\"" + +#: bookwyrm/templates/notifications/items/leave.html:16 +#, python-format +msgid "has left your group \"%(group_name)s\"" +msgstr "退出了您的群组 \"%(group_name)s\"" + #: bookwyrm/templates/notifications/items/mention.html:20 #, python-format msgid "mentioned you in a review of %(book_title)s" @@ -1777,6 +2016,16 @@ msgstr "在 %(book_title)s 的引用status" msgstr "在 状态 中提到了你" +#: bookwyrm/templates/notifications/items/remove.html:17 +#, python-format +msgid "has been removed from your group \"%(group_name)s\"" +msgstr "已被从您的 \"%(group_name)s\" 群组中移出" + +#: bookwyrm/templates/notifications/items/remove.html:23 +#, python-format +msgid "You have been removed from the \"%(group_name)s\" group" +msgstr "您已经被从 \"%(group_name)s\" 组中移除" + #: bookwyrm/templates/notifications/items/reply.html:21 #, python-format msgid "replied to your review of %(book_title)s" @@ -1802,6 +2051,21 @@ msgstr "回复 了你的 report needs moderation." msgstr "有新的 报告 需要仲裁。" +#: bookwyrm/templates/notifications/items/update.html:16 +#, python-format +msgid "has changed the privacy level for %(group_name)s" +msgstr "更改了 %(group_name)s 的隐私级别" + +#: bookwyrm/templates/notifications/items/update.html:20 +#, python-format +msgid "has changed the name of %(group_name)s" +msgstr "更改了 %(group_name)s 的名称" + +#: bookwyrm/templates/notifications/items/update.html:24 +#, python-format +msgid "has changed the description of %(group_name)s" +msgstr "更改了 %(group_name)s 的描述" + #: bookwyrm/templates/notifications/notifications_page.html:18 msgid "Delete notifications" msgstr "删除通知" @@ -1818,20 +2082,6 @@ msgstr "提及" msgid "You're all caught up!" msgstr "你什么也没错过!" -#: bookwyrm/templates/password_reset.html:23 -#: bookwyrm/templates/preferences/change_password.html:18 -#: bookwyrm/templates/preferences/delete_user.html:20 -msgid "Confirm password:" -msgstr "确认密码:" - -#: bookwyrm/templates/password_reset_request.html:14 -msgid "A link to reset your password will be sent to your email address" -msgstr "重设你的密码的链接将会被发送到你的邮箱地址" - -#: bookwyrm/templates/password_reset_request.html:28 -msgid "Reset password" -msgstr "重设密码" - #: bookwyrm/templates/preferences/blocks.html:4 #: bookwyrm/templates/preferences/blocks.html:7 #: bookwyrm/templates/preferences/layout.html:31 @@ -2064,15 +2314,6 @@ msgstr "开始日期" msgid "End date" msgstr "结束日期" -#: bookwyrm/templates/settings/announcements/announcements.html:38 -#: bookwyrm/templates/settings/federation/instance_list.html:46 -#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44 -#: bookwyrm/templates/settings/invites/status_filter.html:5 -#: bookwyrm/templates/settings/users/user_admin.html:34 -#: bookwyrm/templates/settings/users/user_info.html:20 -msgid "Status" -msgstr "状态" - #: bookwyrm/templates/settings/announcements/announcements.html:48 msgid "active" msgstr "活跃" @@ -2251,7 +2492,7 @@ msgid "Details" msgstr "详细" #: bookwyrm/templates/settings/federation/instance.html:35 -#: bookwyrm/templates/user/layout.html:63 +#: bookwyrm/templates/user/layout.html:64 msgid "Activity" msgstr "活动" @@ -2628,7 +2869,7 @@ msgstr "简要描述:" #: bookwyrm/templates/settings/site.html:37 msgid "Used when the instance is previewed on joinbookwyrm.com. Does not support HTML or Markdown." -msgstr "" +msgstr "在 joinbookwyrm.com 上预览实例时使用。不支持 HTML 或 Markdown。" #: bookwyrm/templates/settings/site.html:41 msgid "Code of conduct:" @@ -2827,52 +3068,65 @@ msgstr "创建书架" msgid "Edit Shelf" msgstr "编辑书架" -#: bookwyrm/templates/shelf/shelf.html:28 bookwyrm/views/shelf.py:55 +#: bookwyrm/templates/shelf/shelf.html:28 bookwyrm/views/shelf/shelf.py:53 msgid "All books" msgstr "所有书目" -#: bookwyrm/templates/shelf/shelf.html:55 +#: bookwyrm/templates/shelf/shelf.html:69 msgid "Create shelf" msgstr "创建书架" -#: bookwyrm/templates/shelf/shelf.html:77 +#: bookwyrm/templates/shelf/shelf.html:90 #, python-format msgid "%(formatted_count)s book" msgid_plural "%(formatted_count)s books" msgstr[0] "%(formatted_count)s 本书籍" -#: bookwyrm/templates/shelf/shelf.html:84 +#: bookwyrm/templates/shelf/shelf.html:97 #, python-format msgid "(showing %(start)s-%(end)s)" msgstr "(正在显示 %(start)s 到 %(end)s)" -#: bookwyrm/templates/shelf/shelf.html:96 +#: bookwyrm/templates/shelf/shelf.html:109 msgid "Edit shelf" msgstr "编辑书架" -#: bookwyrm/templates/shelf/shelf.html:104 +#: bookwyrm/templates/shelf/shelf.html:117 msgid "Delete shelf" msgstr "删除书架" -#: bookwyrm/templates/shelf/shelf.html:132 -#: bookwyrm/templates/shelf/shelf.html:158 +#: bookwyrm/templates/shelf/shelf.html:145 +#: bookwyrm/templates/shelf/shelf.html:171 msgid "Shelved" msgstr "上架时间" -#: bookwyrm/templates/shelf/shelf.html:133 -#: bookwyrm/templates/shelf/shelf.html:161 +#: bookwyrm/templates/shelf/shelf.html:146 +#: bookwyrm/templates/shelf/shelf.html:174 msgid "Started" msgstr "开始时间" -#: bookwyrm/templates/shelf/shelf.html:134 -#: bookwyrm/templates/shelf/shelf.html:164 +#: bookwyrm/templates/shelf/shelf.html:147 +#: bookwyrm/templates/shelf/shelf.html:177 msgid "Finished" msgstr "完成时间" -#: bookwyrm/templates/shelf/shelf.html:190 +#: bookwyrm/templates/shelf/shelf.html:203 msgid "This shelf is empty." msgstr "此书架是空的。" +#: bookwyrm/templates/snippets/add_to_group_button.html:15 +msgid "Invite" +msgstr "邀请" + +#: bookwyrm/templates/snippets/add_to_group_button.html:24 +msgid "Uninvite" +msgstr "移除邀请" + +#: bookwyrm/templates/snippets/add_to_group_button.html:28 +#, python-format +msgid "Remove @%(username)s" +msgstr "移除 @%(username)s" + #: bookwyrm/templates/snippets/announcement.html:31 #, python-format msgid "Posted by %(username)s" @@ -2903,10 +3157,6 @@ msgstr "转发" msgid "Un-boost" msgstr "取消转发" -#: bookwyrm/templates/snippets/create_status.html:17 -msgid "Review" -msgstr "书评" - #: bookwyrm/templates/snippets/create_status.html:39 msgid "Quote" msgstr "引用" @@ -2967,6 +3217,7 @@ msgstr "评论:" #: bookwyrm/templates/snippets/privacy-icons.html:15 #: bookwyrm/templates/snippets/privacy-icons.html:16 #: bookwyrm/templates/snippets/privacy_select.html:20 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:17 msgid "Private" msgstr "私密" @@ -3062,6 +3313,7 @@ msgid "Unfollow" msgstr "取消关注" #: bookwyrm/templates/snippets/follow_request_buttons.html:7 +#: bookwyrm/templates/snippets/join_invitation_buttons.html:8 msgid "Accept" msgstr "接受" @@ -3168,12 +3420,14 @@ msgstr "往后" #: bookwyrm/templates/snippets/privacy-icons.html:3 #: bookwyrm/templates/snippets/privacy-icons.html:4 #: bookwyrm/templates/snippets/privacy_select.html:11 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:11 msgid "Public" msgstr "公开" #: bookwyrm/templates/snippets/privacy-icons.html:7 #: bookwyrm/templates/snippets/privacy-icons.html:8 #: bookwyrm/templates/snippets/privacy_select.html:14 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:14 msgid "Unlisted" msgstr "不公开" @@ -3182,6 +3436,7 @@ msgid "Followers-only" msgstr "仅关注者" #: bookwyrm/templates/snippets/privacy_select.html:6 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:6 msgid "Post privacy" msgstr "发文隐私" @@ -3316,14 +3571,14 @@ msgstr "隐藏状态" #: bookwyrm/templates/snippets/status/header.html:45 #, python-format msgid "edited %(date)s" -msgstr "" +msgstr "在 %(date)s 已编辑" #: bookwyrm/templates/snippets/status/headers/comment.html:2 #, python-format msgid "commented on %(book)s" msgstr "评论了 %(book)s" -#: bookwyrm/templates/snippets/status/headers/note.html:15 +#: bookwyrm/templates/snippets/status/headers/note.html:8 #, python-format msgid "replied to %(username)s's status" msgstr "回复了 %(username)s状态" @@ -3382,23 +3637,6 @@ msgstr "转发了" msgid "More options" msgstr "更多选项" -#: bookwyrm/templates/snippets/suggested_users.html:16 -#, python-format -msgid "%(mutuals)s follower you follow" -msgid_plural "%(mutuals)s followers you follow" -msgstr[0] "%(mutuals)s 个你也关注的关注者" - -#: bookwyrm/templates/snippets/suggested_users.html:23 -#, python-format -msgid "%(shared_books)s book on your shelves" -msgid_plural "%(shared_books)s books on your shelves" -msgstr[0] "%(shared_books)s 本在你书架上也有的书" - -#: bookwyrm/templates/snippets/suggested_users.html:31 -#: bookwyrm/templates/user/user_preview.html:36 -msgid "Follows you" -msgstr "正在关注着你" - #: bookwyrm/templates/snippets/switch_edition_button.html:5 msgid "Switch to this edition" msgstr "切换到此版本" @@ -3419,7 +3657,11 @@ msgstr "显示更多" msgid "Show less" msgstr "显示更少" -#: bookwyrm/templates/user/books_header.html:5 +#: bookwyrm/templates/user/books_header.html:10 +msgid "Your books" +msgstr "你的书目" + +#: bookwyrm/templates/user/books_header.html:15 #, python-format msgid "%(username)s's books" msgstr "%(username)s 的书目" @@ -3448,18 +3690,35 @@ msgstr "你 %(year)s 的书目" msgid "%(username)s's %(year)s Books" msgstr "%(username)s 在 %(year)s 的书目" -#: bookwyrm/templates/user/layout.html:18 bookwyrm/templates/user/user.html:10 +#: bookwyrm/templates/user/groups.html:9 +msgid "Your Groups" +msgstr "您的群组" + +#: bookwyrm/templates/user/groups.html:11 +#, python-format +msgid "Groups: %(username)s" +msgstr "群组: %(username)s" + +#: bookwyrm/templates/user/groups.html:17 +msgid "Create group" +msgstr "创建群组" + +#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:10 msgid "User Profile" msgstr "用户个人资料" -#: bookwyrm/templates/user/layout.html:44 +#: bookwyrm/templates/user/layout.html:45 msgid "Follow Requests" msgstr "关注请求" -#: bookwyrm/templates/user/layout.html:69 +#: bookwyrm/templates/user/layout.html:70 msgid "Reading Goal" msgstr "阅读目标" +#: bookwyrm/templates/user/layout.html:76 +msgid "Groups" +msgstr "群组" + #: bookwyrm/templates/user/lists.html:11 #, python-format msgid "Lists: %(username)s" @@ -3544,19 +3803,19 @@ msgstr "文件超过了最大大小: 10MB" msgid "%(title)s: %(subtitle)s" msgstr "%(title)s:%(subtitle)s" -#: bookwyrm/views/import_data.py:67 +#: bookwyrm/views/imports/import_data.py:64 msgid "Not a valid csv file" msgstr "不是有效的 csv 文件" -#: bookwyrm/views/login.py:69 +#: bookwyrm/views/landing/login.py:69 msgid "Username or password are incorrect" msgstr "用户名或密码不正确" -#: bookwyrm/views/password.py:32 +#: bookwyrm/views/landing/password.py:32 msgid "No user with that email address was found." msgstr "没有找到使用该邮箱的用户。" -#: bookwyrm/views/password.py:41 +#: bookwyrm/views/landing/password.py:43 #, python-brace-format msgid "A password reset link was sent to {email}" msgstr "密码重置连接已发送给 {email}" diff --git a/locale/zh_Hant/LC_MESSAGES/django.mo b/locale/zh_Hant/LC_MESSAGES/django.mo index 0bd0ad46..baefb103 100644 Binary files a/locale/zh_Hant/LC_MESSAGES/django.mo and b/locale/zh_Hant/LC_MESSAGES/django.mo differ diff --git a/locale/zh_Hant/LC_MESSAGES/django.po b/locale/zh_Hant/LC_MESSAGES/django.po index 7b9d3b77..9b6e27b8 100644 --- a/locale/zh_Hant/LC_MESSAGES/django.po +++ b/locale/zh_Hant/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-15 22:03+0000\n" -"PO-Revision-Date: 2021-10-16 14:36\n" +"POT-Creation-Date: 2021-11-14 15:08+0000\n" +"PO-Revision-Date: 2021-11-15 18:02\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Chinese Traditional\n" "Language: zh\n" @@ -46,41 +46,42 @@ msgstr "" msgid "Unlimited" msgstr "不受限" -#: bookwyrm/forms.py:326 +#: bookwyrm/forms.py:332 msgid "List Order" msgstr "列表順序" -#: bookwyrm/forms.py:327 +#: bookwyrm/forms.py:333 msgid "Book Title" msgstr "書名" -#: bookwyrm/forms.py:328 bookwyrm/templates/shelf/shelf.html:136 -#: bookwyrm/templates/shelf/shelf.html:168 +#: bookwyrm/forms.py:334 bookwyrm/templates/shelf/shelf.html:149 +#: bookwyrm/templates/shelf/shelf.html:181 #: bookwyrm/templates/snippets/create_status/review.html:33 msgid "Rating" msgstr "評價" -#: bookwyrm/forms.py:330 bookwyrm/templates/lists/list.html:109 +#: bookwyrm/forms.py:336 bookwyrm/templates/lists/list.html:110 msgid "Sort By" msgstr "排序方式" -#: bookwyrm/forms.py:334 +#: bookwyrm/forms.py:340 msgid "Ascending" msgstr "升序" -#: bookwyrm/forms.py:335 +#: bookwyrm/forms.py:341 msgid "Descending" msgstr "降序" -#: bookwyrm/importers/importer.py:75 +#: bookwyrm/importers/importer.py:127 msgid "Error loading book" msgstr "" -#: bookwyrm/importers/importer.py:88 +#: bookwyrm/importers/importer.py:135 msgid "Could not find a match for book" msgstr "" #: bookwyrm/models/base_model.py:17 +#: bookwyrm/templates/import/import_status.html:171 msgid "Pending" msgstr "" @@ -100,23 +101,23 @@ msgstr "" msgid "Domain block" msgstr "" -#: bookwyrm/models/book.py:232 +#: bookwyrm/models/book.py:233 msgid "Audiobook" msgstr "" -#: bookwyrm/models/book.py:233 +#: bookwyrm/models/book.py:234 msgid "eBook" msgstr "" -#: bookwyrm/models/book.py:234 +#: bookwyrm/models/book.py:235 msgid "Graphic novel" msgstr "" -#: bookwyrm/models/book.py:235 +#: bookwyrm/models/book.py:236 msgid "Hardcover" msgstr "" -#: bookwyrm/models/book.py:236 +#: bookwyrm/models/book.py:237 msgid "Paperback" msgstr "" @@ -133,21 +134,21 @@ msgstr "跨站" msgid "Blocked" msgstr "已封鎖" -#: bookwyrm/models/fields.py:27 +#: bookwyrm/models/fields.py:29 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "%(value)s 不是有效的 remote_id" -#: bookwyrm/models/fields.py:36 bookwyrm/models/fields.py:45 +#: bookwyrm/models/fields.py:38 bookwyrm/models/fields.py:47 #, python-format msgid "%(value)s is not a valid username" msgstr "%(value)s 不是有效的使用者名稱" -#: bookwyrm/models/fields.py:181 bookwyrm/templates/layout.html:171 +#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:171 msgid "username" msgstr "使用者名稱" -#: bookwyrm/models/fields.py:186 +#: bookwyrm/models/fields.py:188 msgid "A user with that username already exists." msgstr "已經存在使用該名稱的使用者。" @@ -165,7 +166,7 @@ msgstr "" #: bookwyrm/settings.py:119 bookwyrm/templates/search/layout.html:21 #: bookwyrm/templates/search/layout.html:42 -#: bookwyrm/templates/user/layout.html:81 +#: bookwyrm/templates/user/layout.html:88 msgid "Books" msgstr "書目" @@ -223,7 +224,7 @@ msgid "Edit Author" msgstr "編輯作者" #: bookwyrm/templates/author/author.html:34 -#: bookwyrm/templates/author/edit_author.html:41 +#: bookwyrm/templates/author/edit_author.html:43 msgid "Aliases:" msgstr "別名:" @@ -276,71 +277,72 @@ msgstr "新增了:" msgid "Updated:" msgstr "更新了:" -#: bookwyrm/templates/author/edit_author.html:15 +#: bookwyrm/templates/author/edit_author.html:16 #: bookwyrm/templates/book/edit/edit_book.html:25 msgid "Last edited by:" msgstr "最後編輯者:" -#: bookwyrm/templates/author/edit_author.html:31 +#: bookwyrm/templates/author/edit_author.html:33 #: bookwyrm/templates/book/edit/edit_book_form.html:15 msgid "Metadata" msgstr "元資料" -#: bookwyrm/templates/author/edit_author.html:33 -#: bookwyrm/templates/lists/form.html:8 bookwyrm/templates/shelf/form.html:9 +#: bookwyrm/templates/author/edit_author.html:35 +#: bookwyrm/templates/lists/form.html:9 bookwyrm/templates/shelf/form.html:9 msgid "Name:" msgstr "名稱:" -#: bookwyrm/templates/author/edit_author.html:43 +#: bookwyrm/templates/author/edit_author.html:45 #: bookwyrm/templates/book/edit/edit_book_form.html:65 #: bookwyrm/templates/book/edit/edit_book_form.html:79 #: bookwyrm/templates/book/edit/edit_book_form.html:124 msgid "Separate multiple values with commas." msgstr "請用逗號(,)分隔多個值。" -#: bookwyrm/templates/author/edit_author.html:50 +#: bookwyrm/templates/author/edit_author.html:52 msgid "Bio:" msgstr "簡介:" -#: bookwyrm/templates/author/edit_author.html:57 +#: bookwyrm/templates/author/edit_author.html:59 msgid "Wikipedia link:" msgstr "維基百科連結:" -#: bookwyrm/templates/author/edit_author.html:63 +#: bookwyrm/templates/author/edit_author.html:65 msgid "Birth date:" msgstr "出生日期:" -#: bookwyrm/templates/author/edit_author.html:71 +#: bookwyrm/templates/author/edit_author.html:73 msgid "Death date:" msgstr "死亡日期:" -#: bookwyrm/templates/author/edit_author.html:79 +#: bookwyrm/templates/author/edit_author.html:81 msgid "Author Identifiers" msgstr "作者標識號:" -#: bookwyrm/templates/author/edit_author.html:81 +#: bookwyrm/templates/author/edit_author.html:83 msgid "Openlibrary key:" msgstr "Openlibrary key:" -#: bookwyrm/templates/author/edit_author.html:89 +#: bookwyrm/templates/author/edit_author.html:91 #: bookwyrm/templates/book/edit/edit_book_form.html:224 msgid "Inventaire ID:" msgstr "Inventaire ID:" -#: bookwyrm/templates/author/edit_author.html:97 +#: bookwyrm/templates/author/edit_author.html:99 msgid "Librarything key:" msgstr "Librarything key:" -#: bookwyrm/templates/author/edit_author.html:105 +#: bookwyrm/templates/author/edit_author.html:107 msgid "Goodreads key:" msgstr "Goodreads key:" -#: bookwyrm/templates/author/edit_author.html:116 +#: bookwyrm/templates/author/edit_author.html:118 #: bookwyrm/templates/book/book.html:140 #: bookwyrm/templates/book/edit/edit_book.html:110 #: bookwyrm/templates/book/readthrough.html:76 +#: bookwyrm/templates/groups/form.html:24 #: bookwyrm/templates/lists/bookmark_button.html:15 -#: bookwyrm/templates/lists/form.html:44 +#: bookwyrm/templates/lists/form.html:75 #: bookwyrm/templates/preferences/edit_user.html:124 #: bookwyrm/templates/settings/announcements/announcement_form.html:69 #: bookwyrm/templates/settings/federation/edit_instance.html:74 @@ -352,11 +354,13 @@ msgstr "Goodreads key:" msgid "Save" msgstr "儲存" -#: bookwyrm/templates/author/edit_author.html:117 +#: bookwyrm/templates/author/edit_author.html:119 #: bookwyrm/templates/book/book.html:141 bookwyrm/templates/book/book.html:190 #: bookwyrm/templates/book/cover_modal.html:32 -#: bookwyrm/templates/book/edit/edit_book.html:111 +#: bookwyrm/templates/book/edit/edit_book.html:112 +#: bookwyrm/templates/book/edit/edit_book.html:115 #: bookwyrm/templates/book/readthrough.html:77 +#: bookwyrm/templates/groups/delete_group_modal.html:17 #: bookwyrm/templates/lists/delete_list_modal.html:17 #: bookwyrm/templates/settings/federation/instance.html:88 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:17 @@ -396,7 +400,7 @@ msgstr "新增描述" #: bookwyrm/templates/book/book.html:136 #: bookwyrm/templates/book/edit/edit_book_form.html:34 -#: bookwyrm/templates/lists/form.html:12 bookwyrm/templates/shelf/form.html:17 +#: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "描述:" @@ -459,7 +463,7 @@ msgstr "地點" #: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12 #: bookwyrm/templates/search/layout.html:25 #: bookwyrm/templates/search/layout.html:50 -#: bookwyrm/templates/user/layout.html:75 +#: bookwyrm/templates/user/layout.html:82 msgid "Lists" msgstr "列表" @@ -469,7 +473,7 @@ msgstr "新增到列表" #: bookwyrm/templates/book/book.html:315 #: bookwyrm/templates/book/cover_modal.html:31 -#: bookwyrm/templates/lists/list.html:181 +#: bookwyrm/templates/lists/list.html:182 #: bookwyrm/templates/settings/email_blocklist/domain_form.html:26 #: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:32 msgid "Add" @@ -542,7 +546,9 @@ msgid "This is a new work" msgstr "這是一個新的作品。" #: bookwyrm/templates/book/edit/edit_book.html:97 -#: bookwyrm/templates/password_reset.html:30 +#: bookwyrm/templates/groups/members.html:16 +#: bookwyrm/templates/landing/password_reset.html:30 +#: bookwyrm/templates/snippets/remove_from_group_button.html:16 msgid "Confirm" msgstr "確認" @@ -611,7 +617,7 @@ msgid "John Doe, Jane Smith" msgstr "John Doe, Jane Smith" #: bookwyrm/templates/book/edit/edit_book_form.html:132 -#: bookwyrm/templates/shelf/shelf.html:127 +#: bookwyrm/templates/shelf/shelf.html:140 msgid "Cover" msgstr "封面" @@ -792,7 +798,7 @@ msgstr "" #: bookwyrm/templates/confirm_email/resend_form.html:11 #: bookwyrm/templates/landing/layout.html:67 -#: bookwyrm/templates/password_reset_request.html:18 +#: bookwyrm/templates/landing/password_reset_request.html:18 #: bookwyrm/templates/preferences/edit_user.html:56 #: bookwyrm/templates/snippets/register_form.html:13 msgid "Email address:" @@ -884,22 +890,37 @@ msgstr "BookWyrm 使用者" msgid "All known users" msgstr "所有已知使用者" -#: bookwyrm/templates/discover/card-header.html:9 +#: bookwyrm/templates/discover/card-header.html:8 #, python-format -msgid "%(username)s rated %(book_title)s" +msgid "%(username)s wants to read %(book_title)s" msgstr "" #: bookwyrm/templates/discover/card-header.html:13 #, python-format +msgid "%(username)s finished reading %(book_title)s" +msgstr "" + +#: bookwyrm/templates/discover/card-header.html:18 +#, python-format +msgid "%(username)s started reading %(book_title)s" +msgstr "" + +#: bookwyrm/templates/discover/card-header.html:23 +#, python-format +msgid "%(username)s rated %(book_title)s" +msgstr "" + +#: bookwyrm/templates/discover/card-header.html:27 +#, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:17 +#: bookwyrm/templates/discover/card-header.html:31 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:21 +#: bookwyrm/templates/discover/card-header.html:35 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "" @@ -990,10 +1011,10 @@ msgid "You requested to reset your %(site_name)s password. Click the link below msgstr "你請求重置你在 %(site_name)s 的密碼。點選下面的連結來設定新密碼並登入你的帳號。" #: bookwyrm/templates/email/password_reset/html_content.html:9 -#: bookwyrm/templates/password_reset.html:4 -#: bookwyrm/templates/password_reset.html:10 -#: bookwyrm/templates/password_reset_request.html:4 -#: bookwyrm/templates/password_reset_request.html:10 +#: bookwyrm/templates/landing/password_reset.html:4 +#: bookwyrm/templates/landing/password_reset.html:10 +#: bookwyrm/templates/landing/password_reset_request.html:4 +#: bookwyrm/templates/landing/password_reset_request.html:10 msgid "Reset Password" msgstr "重設密碼" @@ -1050,9 +1071,8 @@ msgstr "你可以在任何時候從你的使用者資料頁 msgid "Updates" msgstr "更新" -#: bookwyrm/templates/feed/layout.html:12 -#: bookwyrm/templates/user/books_header.html:3 -msgid "Your books" +#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:106 +msgid "Your Books" msgstr "你的書目" #: bookwyrm/templates/feed/layout.html:14 @@ -1061,11 +1081,13 @@ msgstr "現在這裡還沒有任何書目!嘗試著從搜尋某本書開始吧 #: bookwyrm/templates/feed/layout.html:25 #: bookwyrm/templates/shelf/shelf.html:38 +#: bookwyrm/templates/user/books_header.html:4 msgid "To Read" msgstr "想讀" #: bookwyrm/templates/feed/layout.html:26 #: bookwyrm/templates/shelf/shelf.html:40 +#: bookwyrm/templates/user/books_header.html:6 msgid "Currently Reading" msgstr "在讀" @@ -1073,6 +1095,7 @@ msgstr "在讀" #: bookwyrm/templates/shelf/shelf.html:42 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:23 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12 +#: bookwyrm/templates/user/books_header.html:8 msgid "Read" msgstr "讀過" @@ -1099,7 +1122,7 @@ msgid "What are you reading?" msgstr "你在閱讀什麼?" #: bookwyrm/templates/get_started/books.html:9 -#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:137 +#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:138 msgid "Search for a book" msgstr "搜尋書目" @@ -1117,8 +1140,9 @@ msgstr "你可以在開始使用 %(site_name)s 後新增書目。" #: bookwyrm/templates/get_started/books.html:17 #: bookwyrm/templates/get_started/users.html:18 #: bookwyrm/templates/get_started/users.html:19 -#: bookwyrm/templates/layout.html:51 bookwyrm/templates/layout.html:52 -#: bookwyrm/templates/lists/list.html:141 +#: bookwyrm/templates/groups/group.html:19 +#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:51 +#: bookwyrm/templates/layout.html:52 bookwyrm/templates/lists/list.html:142 #: bookwyrm/templates/search/layout.html:4 #: bookwyrm/templates/search/layout.html:9 msgid "Search" @@ -1134,7 +1158,7 @@ msgid "Popular on %(site_name)s" msgstr "%(site_name)s 上的熱門" #: bookwyrm/templates/get_started/books.html:58 -#: bookwyrm/templates/lists/list.html:154 +#: bookwyrm/templates/lists/list.html:155 msgid "No books found" msgstr "沒有找到書目" @@ -1220,9 +1244,108 @@ msgstr "搜尋使用者" msgid "No users found for \"%(query)s\"" msgstr "沒有找到 \"%(query)s\" 的使用者" +#: bookwyrm/templates/groups/create_form.html:5 +msgid "Create Group" +msgstr "" + +#: bookwyrm/templates/groups/created_text.html:4 +#, python-format +msgid "Managed by %(username)s" +msgstr "" + +#: bookwyrm/templates/groups/delete_group_modal.html:4 +msgid "Delete this group?" +msgstr "" + +#: bookwyrm/templates/groups/delete_group_modal.html:7 +#: bookwyrm/templates/lists/delete_list_modal.html:7 +msgid "This action cannot be un-done" +msgstr "" + +#: bookwyrm/templates/groups/delete_group_modal.html:15 +#: bookwyrm/templates/lists/delete_list_modal.html:15 +#: bookwyrm/templates/settings/announcements/announcement.html:20 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36 +#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 +#: bookwyrm/templates/snippets/follow_request_buttons.html:12 +#: bookwyrm/templates/snippets/join_invitation_buttons.html:13 +msgid "Delete" +msgstr "刪除" + +#: bookwyrm/templates/groups/edit_form.html:5 +msgid "Edit Group" +msgstr "" + +#: bookwyrm/templates/groups/find_users.html:6 +msgid "Add new members!" +msgstr "" + +#: bookwyrm/templates/groups/form.html:8 +msgid "Group Name:" +msgstr "" + +#: bookwyrm/templates/groups/form.html:12 +msgid "Group Description:" +msgstr "" + +#: bookwyrm/templates/groups/form.html:30 +msgid "Delete group" +msgstr "" + +#: bookwyrm/templates/groups/group.html:15 +msgid "Search to add a user" +msgstr "" + +#: bookwyrm/templates/groups/group.html:36 +msgid "This group has no lists" +msgstr "" + +#: bookwyrm/templates/groups/layout.html:16 +msgid "Edit group" +msgstr "" + +#: bookwyrm/templates/groups/members.html:8 +msgid "Members can add and remove books on a group's book lists" +msgstr "" + +#: bookwyrm/templates/groups/members.html:19 +msgid "Leave group" +msgstr "" + +#: bookwyrm/templates/groups/members.html:41 +#: bookwyrm/templates/groups/suggested_users.html:32 +#: bookwyrm/templates/snippets/suggested_users.html:31 +#: bookwyrm/templates/user/user_preview.html:36 +msgid "Follows you" +msgstr "" + +#: bookwyrm/templates/groups/suggested_users.html:17 +#: bookwyrm/templates/snippets/suggested_users.html:16 +#, python-format +msgid "%(mutuals)s follower you follow" +msgid_plural "%(mutuals)s followers you follow" +msgstr[0] "%(mutuals)s 個你也關注的關注者" + +#: bookwyrm/templates/groups/suggested_users.html:24 +#: bookwyrm/templates/snippets/suggested_users.html:23 +#, python-format +msgid "%(shared_books)s book on your shelves" +msgid_plural "%(shared_books)s books on your shelves" +msgstr[0] "%(shared_books)s 本在你書架上也有的書" + +#: bookwyrm/templates/groups/suggested_users.html:40 +#, python-format +msgid "No potential members found for \"%(user_query)s\"" +msgstr "" + +#: bookwyrm/templates/groups/user_groups.html:15 +msgid "Manager" +msgstr "" + #: bookwyrm/templates/import/import.html:5 #: bookwyrm/templates/import/import.html:9 -#: bookwyrm/templates/shelf/shelf.html:57 +#: bookwyrm/templates/shelf/shelf.html:61 msgid "Import Books" msgstr "匯入書目" @@ -1256,100 +1379,158 @@ msgid "No recent imports" msgstr "無最近的匯入" #: bookwyrm/templates/import/import_status.html:6 -#: bookwyrm/templates/import/import_status.html:10 +#: bookwyrm/templates/import/import_status.html:15 +#: bookwyrm/templates/import/import_status.html:29 msgid "Import Status" msgstr "匯入狀態" -#: bookwyrm/templates/import/import_status.html:11 -msgid "Back to imports" +#: bookwyrm/templates/import/import_status.html:13 +#: bookwyrm/templates/import/import_status.html:27 +msgid "Retry Status" msgstr "" -#: bookwyrm/templates/import/import_status.html:15 +#: bookwyrm/templates/import/import_status.html:22 +msgid "Imports" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:39 msgid "Import started:" msgstr "匯入開始:" -#: bookwyrm/templates/import/import_status.html:20 -msgid "Import completed:" -msgstr "匯入完成:" - -#: bookwyrm/templates/import/import_status.html:24 -msgid "TASK FAILED" -msgstr "任務失敗" - -#: bookwyrm/templates/import/import_status.html:32 -msgid "Import still in progress." -msgstr "還在匯入中。" - -#: bookwyrm/templates/import/import_status.html:34 -msgid "(Hit reload to update!)" -msgstr "(按下重新載入來更新!)" - -#: bookwyrm/templates/import/import_status.html:41 -msgid "Failed to load" -msgstr "載入失敗" +#: bookwyrm/templates/import/import_status.html:48 +msgid "In progress" +msgstr "" #: bookwyrm/templates/import/import_status.html:50 -#, python-format -msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import." -msgstr "跳轉至列表底部來選取 %(failed_count)s 個匯入失敗的項目。" +msgid "Refresh" +msgstr "" #: bookwyrm/templates/import/import_status.html:62 #, python-format -msgid "Line %(index)s: %(title)s by %(author)s" +msgid "%(display_counter)s item needs manual approval." +msgid_plural "%(display_counter)s items need manual approval." +msgstr[0] "" + +#: bookwyrm/templates/import/import_status.html:67 +#: bookwyrm/templates/import/manual_review.html:8 +msgid "Review items" msgstr "" -#: bookwyrm/templates/import/import_status.html:82 -msgid "Select all" -msgstr "全選" +#: bookwyrm/templates/import/import_status.html:73 +#, python-format +msgid "%(display_counter)s item failed to import." +msgid_plural "%(display_counter)s items failed to import." +msgstr[0] "" -#: bookwyrm/templates/import/import_status.html:85 -msgid "Retry items" -msgstr "重試項目" - -#: bookwyrm/templates/import/import_status.html:112 -msgid "Successfully imported" -msgstr "成功匯入了" - -#: bookwyrm/templates/import/import_status.html:114 -msgid "Import Progress" +#: bookwyrm/templates/import/import_status.html:79 +msgid "View and troubleshoot failed items" msgstr "" -#: bookwyrm/templates/import/import_status.html:119 -msgid "Book" -msgstr "書目" +#: bookwyrm/templates/import/import_status.html:91 +msgid "Row" +msgstr "" -#: bookwyrm/templates/import/import_status.html:122 -#: bookwyrm/templates/shelf/shelf.html:128 -#: bookwyrm/templates/shelf/shelf.html:150 +#: bookwyrm/templates/import/import_status.html:94 +#: bookwyrm/templates/shelf/shelf.html:141 +#: bookwyrm/templates/shelf/shelf.html:163 msgid "Title" msgstr "標題" -#: bookwyrm/templates/import/import_status.html:125 -#: bookwyrm/templates/shelf/shelf.html:129 -#: bookwyrm/templates/shelf/shelf.html:153 +#: bookwyrm/templates/import/import_status.html:97 +msgid "ISBN" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:100 +#: bookwyrm/templates/shelf/shelf.html:142 +#: bookwyrm/templates/shelf/shelf.html:166 msgid "Author" msgstr "作者" -#: bookwyrm/templates/import/import_status.html:148 +#: bookwyrm/templates/import/import_status.html:103 +msgid "Shelf" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:106 +#: bookwyrm/templates/import/manual_review.html:13 +#: bookwyrm/templates/snippets/create_status.html:17 +msgid "Review" +msgstr "書評" + +#: bookwyrm/templates/import/import_status.html:110 +msgid "Book" +msgstr "書目" + +#: bookwyrm/templates/import/import_status.html:113 +#: bookwyrm/templates/settings/announcements/announcements.html:38 +#: bookwyrm/templates/settings/federation/instance_list.html:46 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44 +#: bookwyrm/templates/settings/invites/status_filter.html:5 +#: bookwyrm/templates/settings/users/user_admin.html:34 +#: bookwyrm/templates/settings/users/user_info.html:20 +msgid "Status" +msgstr "狀態" + +#: bookwyrm/templates/import/import_status.html:144 +msgid "View imported review" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:158 msgid "Imported" msgstr "已匯入" +#: bookwyrm/templates/import/import_status.html:164 +msgid "Needs manual review" +msgstr "" + +#: bookwyrm/templates/import/manual_review.html:5 +#: bookwyrm/templates/import/troubleshoot.html:4 +msgid "Import Troubleshooting" +msgstr "" + +#: bookwyrm/templates/import/manual_review.html:21 +msgid "Approving a suggestion will permanently add the suggested book to your shelves and associate your reading dates, reviews, and ratings with that book." +msgstr "" + +#: bookwyrm/templates/import/manual_review.html:56 +#: bookwyrm/templates/lists/curate.html:57 +msgid "Approve" +msgstr "批准" + +#: bookwyrm/templates/import/manual_review.html:64 +msgid "Reject" +msgstr "" + #: bookwyrm/templates/import/tooltip.html:6 msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." msgstr "" -#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:8 -#: bookwyrm/templates/login.html:49 -msgid "Create an Account" -msgstr "建立帳號" +#: bookwyrm/templates/import/troubleshoot.html:7 +msgid "Failed items" +msgstr "" -#: bookwyrm/templates/invite.html:21 -msgid "Permission Denied" -msgstr "沒有權限" +#: bookwyrm/templates/import/troubleshoot.html:12 +msgid "Troubleshooting" +msgstr "" -#: bookwyrm/templates/invite.html:22 -msgid "Sorry! This invite code is no longer valid." -msgstr "抱歉!此邀請碼已不再有效。" +#: bookwyrm/templates/import/troubleshoot.html:20 +msgid "Re-trying an import can fix missing items in cases such as:" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:23 +msgid "The book has been added to the instance since this import" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:24 +msgid "A transient error or timeout caused the external data source to be unavailable." +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:25 +msgid "BookWyrm has been updated since this import with a bug fix" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:28 +msgid "Contact your admin or open an issue if you are seeing unexpected failed items." +msgstr "" #: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:230 #, python-format @@ -1366,6 +1547,20 @@ msgstr "行為準則" msgid "Privacy Policy" msgstr "隱私政策" +#: bookwyrm/templates/landing/invite.html:4 +#: bookwyrm/templates/landing/invite.html:8 +#: bookwyrm/templates/landing/login.html:49 +msgid "Create an Account" +msgstr "建立帳號" + +#: bookwyrm/templates/landing/invite.html:21 +msgid "Permission Denied" +msgstr "沒有權限" + +#: bookwyrm/templates/landing/invite.html:22 +msgid "Sorry! This invite code is no longer valid." +msgstr "抱歉!此邀請碼已不再有效。" + #: bookwyrm/templates/landing/landing.html:6 msgid "Recent Books" msgstr "最近書目" @@ -1404,6 +1599,53 @@ msgstr "謝謝你!我們已經受到了你的請求。" msgid "Your Account" msgstr "你的帳號" +#: bookwyrm/templates/landing/login.html:4 +msgid "Login" +msgstr "登入" + +#: bookwyrm/templates/landing/login.html:7 +#: bookwyrm/templates/landing/login.html:37 bookwyrm/templates/layout.html:179 +msgid "Log in" +msgstr "登入" + +#: bookwyrm/templates/landing/login.html:15 +msgid "Success! Email address confirmed." +msgstr "" + +#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:170 +#: bookwyrm/templates/snippets/register_form.html:4 +msgid "Username:" +msgstr "使用者名稱:" + +#: bookwyrm/templates/landing/login.html:27 +#: bookwyrm/templates/landing/password_reset.html:17 +#: bookwyrm/templates/layout.html:174 +#: bookwyrm/templates/snippets/register_form.html:22 +msgid "Password:" +msgstr "密碼:" + +#: bookwyrm/templates/landing/login.html:40 bookwyrm/templates/layout.html:176 +msgid "Forgot your password?" +msgstr "忘記了密碼?" + +#: bookwyrm/templates/landing/login.html:62 +msgid "More about this site" +msgstr "關於本網站的更多" + +#: bookwyrm/templates/landing/password_reset.html:23 +#: bookwyrm/templates/preferences/change_password.html:18 +#: bookwyrm/templates/preferences/delete_user.html:20 +msgid "Confirm password:" +msgstr "確認密碼:" + +#: bookwyrm/templates/landing/password_reset_request.html:14 +msgid "A link to reset your password will be sent to your email address" +msgstr "重設你的密碼的連結將會被發送到你的郵箱地址" + +#: bookwyrm/templates/landing/password_reset_request.html:28 +msgid "Reset password" +msgstr "重設密碼" + #: bookwyrm/templates/layout.html:13 #, python-format msgid "%(site_name)s search" @@ -1421,10 +1663,6 @@ msgstr "主導航選單" msgid "Feed" msgstr "動態" -#: bookwyrm/templates/layout.html:106 -msgid "Your Books" -msgstr "你的書目" - #: bookwyrm/templates/layout.html:116 msgid "Settings" msgstr "設定" @@ -1451,25 +1689,10 @@ msgstr "登出" msgid "Notifications" msgstr "通知" -#: bookwyrm/templates/layout.html:170 bookwyrm/templates/layout.html:174 -#: bookwyrm/templates/login.html:21 -#: bookwyrm/templates/snippets/register_form.html:4 -msgid "Username:" -msgstr "使用者名稱:" - #: bookwyrm/templates/layout.html:175 msgid "password" msgstr "密碼" -#: bookwyrm/templates/layout.html:176 bookwyrm/templates/login.html:40 -msgid "Forgot your password?" -msgstr "忘記了密碼?" - -#: bookwyrm/templates/layout.html:179 bookwyrm/templates/login.html:7 -#: bookwyrm/templates/login.html:37 -msgid "Log in" -msgstr "登入" - #: bookwyrm/templates/layout.html:187 msgid "Join" msgstr "加入" @@ -1510,10 +1733,15 @@ msgstr "建立列表" #: bookwyrm/templates/lists/created_text.html:5 #, python-format +msgid "Created by %(username)s and managed by %(groupname)s" +msgstr "" + +#: bookwyrm/templates/lists/created_text.html:7 +#, python-format msgid "Created and curated by %(username)s" msgstr "由 %(username)s 建立並管理" -#: bookwyrm/templates/lists/created_text.html:7 +#: bookwyrm/templates/lists/created_text.html:9 #, python-format msgid "Created by %(username)s" msgstr "由 %(username)s 建立" @@ -1534,10 +1762,6 @@ msgstr "都弄好了!" msgid "Suggested by" msgstr "推薦來自" -#: bookwyrm/templates/lists/curate.html:57 -msgid "Approve" -msgstr "批准" - #: bookwyrm/templates/lists/curate.html:63 msgid "Discard" msgstr "放棄" @@ -1546,118 +1770,130 @@ msgstr "放棄" msgid "Delete this list?" msgstr "" -#: bookwyrm/templates/lists/delete_list_modal.html:7 -msgid "This action cannot be un-done" -msgstr "" - -#: bookwyrm/templates/lists/delete_list_modal.html:15 -#: bookwyrm/templates/settings/announcements/announcement.html:20 -#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49 -#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36 -#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 -#: bookwyrm/templates/snippets/follow_request_buttons.html:12 -msgid "Delete" -msgstr "刪除" - #: bookwyrm/templates/lists/edit_form.html:5 #: bookwyrm/templates/lists/layout.html:16 msgid "Edit List" msgstr "編輯列表" -#: bookwyrm/templates/lists/form.html:18 +#: bookwyrm/templates/lists/form.html:19 msgid "List curation:" msgstr "列表管理:" -#: bookwyrm/templates/lists/form.html:21 +#: bookwyrm/templates/lists/form.html:22 msgid "Closed" msgstr "已關閉" -#: bookwyrm/templates/lists/form.html:22 +#: bookwyrm/templates/lists/form.html:23 msgid "Only you can add and remove books to this list" msgstr "只有你可以在此列表中新增或移除書目" -#: bookwyrm/templates/lists/form.html:26 +#: bookwyrm/templates/lists/form.html:27 msgid "Curated" msgstr "管理" -#: bookwyrm/templates/lists/form.html:27 +#: bookwyrm/templates/lists/form.html:28 msgid "Anyone can suggest books, subject to your approval" msgstr "任何人都可以推薦書目、主題,但須經你的批准。" -#: bookwyrm/templates/lists/form.html:31 +#: bookwyrm/templates/lists/form.html:32 msgctxt "curation type" msgid "Open" msgstr "" -#: bookwyrm/templates/lists/form.html:32 +#: bookwyrm/templates/lists/form.html:33 msgid "Anyone can add books to this list" msgstr "任何人都可以向此列表新增書目" -#: bookwyrm/templates/lists/form.html:50 +#: bookwyrm/templates/lists/form.html:37 +msgid "Group" +msgstr "" + +#: bookwyrm/templates/lists/form.html:38 +msgid "Group members can add to and remove from this list" +msgstr "" + +#: bookwyrm/templates/lists/form.html:41 +msgid "Select Group" +msgstr "" + +#: bookwyrm/templates/lists/form.html:45 +msgid "Select a group" +msgstr "" + +#: bookwyrm/templates/lists/form.html:56 +msgid "You don't have any Groups yet!" +msgstr "" + +#: bookwyrm/templates/lists/form.html:58 +msgid "Create a Group" +msgstr "" + +#: bookwyrm/templates/lists/form.html:81 msgid "Delete list" msgstr "" -#: bookwyrm/templates/lists/list.html:20 +#: bookwyrm/templates/lists/list.html:21 msgid "You successfully suggested a book for this list!" msgstr "你成功!向該列表推薦了一本書" -#: bookwyrm/templates/lists/list.html:22 +#: bookwyrm/templates/lists/list.html:23 msgid "You successfully added a book to this list!" msgstr "你成功在此列表新增了一本書!" -#: bookwyrm/templates/lists/list.html:28 +#: bookwyrm/templates/lists/list.html:29 msgid "This list is currently empty" msgstr "此列表當前是空的" -#: bookwyrm/templates/lists/list.html:66 +#: bookwyrm/templates/lists/list.html:67 #, python-format msgid "Added by %(username)s" msgstr "由 %(username)s 新增" -#: bookwyrm/templates/lists/list.html:75 +#: bookwyrm/templates/lists/list.html:76 msgid "List position" msgstr "列表位置:" -#: bookwyrm/templates/lists/list.html:81 +#: bookwyrm/templates/lists/list.html:82 msgid "Set" msgstr "設定" -#: bookwyrm/templates/lists/list.html:91 +#: bookwyrm/templates/lists/list.html:92 +#: bookwyrm/templates/snippets/remove_from_group_button.html:19 #: bookwyrm/templates/snippets/shelf_selector.html:26 msgid "Remove" msgstr "移除" -#: bookwyrm/templates/lists/list.html:105 -#: bookwyrm/templates/lists/list.html:122 +#: bookwyrm/templates/lists/list.html:106 +#: bookwyrm/templates/lists/list.html:123 msgid "Sort List" msgstr "排序列表" -#: bookwyrm/templates/lists/list.html:115 +#: bookwyrm/templates/lists/list.html:116 msgid "Direction" msgstr "方向" -#: bookwyrm/templates/lists/list.html:129 +#: bookwyrm/templates/lists/list.html:130 msgid "Add Books" msgstr "新增書目" -#: bookwyrm/templates/lists/list.html:131 +#: bookwyrm/templates/lists/list.html:132 msgid "Suggest Books" msgstr "推薦書目" -#: bookwyrm/templates/lists/list.html:142 +#: bookwyrm/templates/lists/list.html:143 msgid "search" msgstr "搜尋" -#: bookwyrm/templates/lists/list.html:148 +#: bookwyrm/templates/lists/list.html:149 msgid "Clear search" msgstr "清除搜尋" -#: bookwyrm/templates/lists/list.html:153 +#: bookwyrm/templates/lists/list.html:154 #, python-format msgid "No books found matching the query \"%(query)s\"" msgstr "沒有符合 \"%(query)s\" 請求的書目" -#: bookwyrm/templates/lists/list.html:181 +#: bookwyrm/templates/lists/list.html:182 msgid "Suggest" msgstr "推薦" @@ -1669,31 +1905,19 @@ msgstr "" msgid "Your Lists" msgstr "你的列表" -#: bookwyrm/templates/lists/lists.html:35 +#: bookwyrm/templates/lists/lists.html:36 msgid "All Lists" msgstr "" -#: bookwyrm/templates/lists/lists.html:39 +#: bookwyrm/templates/lists/lists.html:40 msgid "Saved Lists" msgstr "" -#: bookwyrm/templates/login.html:4 -msgid "Login" -msgstr "登入" - -#: bookwyrm/templates/login.html:15 -msgid "Success! Email address confirmed." +#: bookwyrm/templates/notifications/items/accept.html:16 +#, python-format +msgid "accepted your invitation to join group \"%(group_name)s\"" msgstr "" -#: bookwyrm/templates/login.html:27 bookwyrm/templates/password_reset.html:17 -#: bookwyrm/templates/snippets/register_form.html:22 -msgid "Password:" -msgstr "密碼:" - -#: bookwyrm/templates/login.html:62 -msgid "More about this site" -msgstr "關於本網站的更多" - #: bookwyrm/templates/notifications/items/add.html:24 #, python-format msgid "added %(book_title)s to your list \"%(list_name)s\"" @@ -1731,7 +1955,7 @@ msgstr "" #: bookwyrm/templates/notifications/items/fav.html:25 #, python-format -msgid "liked your comment on%(book_title)s" +msgid "liked your comment on %(book_title)s" msgstr "" #: bookwyrm/templates/notifications/items/fav.html:31 @@ -1757,6 +1981,21 @@ msgstr "向你傳送了關注請求" msgid "Your import completed." msgstr "你的 匯入 已完成。" +#: bookwyrm/templates/notifications/items/invite.html:15 +#, python-format +msgid "invited you to join the group \"%(group_name)s\"" +msgstr "" + +#: bookwyrm/templates/notifications/items/join.html:16 +#, python-format +msgid "has joined your group \"%(group_name)s\"" +msgstr "" + +#: bookwyrm/templates/notifications/items/leave.html:16 +#, python-format +msgid "has left your group \"%(group_name)s\"" +msgstr "" + #: bookwyrm/templates/notifications/items/mention.html:20 #, python-format msgid "mentioned you in a review of %(book_title)s" @@ -1777,6 +2016,16 @@ msgstr "在 %(book_title)s 的引用status" msgstr "在 狀態 中提到了你" +#: bookwyrm/templates/notifications/items/remove.html:17 +#, python-format +msgid "has been removed from your group \"%(group_name)s\"" +msgstr "" + +#: bookwyrm/templates/notifications/items/remove.html:23 +#, python-format +msgid "You have been removed from the \"%(group_name)s\" group" +msgstr "" + #: bookwyrm/templates/notifications/items/reply.html:21 #, python-format msgid "replied to your review of %(book_title)s" @@ -1802,6 +2051,21 @@ msgstr "回覆 了你的 report needs moderation." msgstr "有新的 舉報 需要仲裁。" +#: bookwyrm/templates/notifications/items/update.html:16 +#, python-format +msgid "has changed the privacy level for %(group_name)s" +msgstr "" + +#: bookwyrm/templates/notifications/items/update.html:20 +#, python-format +msgid "has changed the name of %(group_name)s" +msgstr "" + +#: bookwyrm/templates/notifications/items/update.html:24 +#, python-format +msgid "has changed the description of %(group_name)s" +msgstr "" + #: bookwyrm/templates/notifications/notifications_page.html:18 msgid "Delete notifications" msgstr "刪除通知" @@ -1818,20 +2082,6 @@ msgstr "提及" msgid "You're all caught up!" msgstr "你什麼也沒錯過!" -#: bookwyrm/templates/password_reset.html:23 -#: bookwyrm/templates/preferences/change_password.html:18 -#: bookwyrm/templates/preferences/delete_user.html:20 -msgid "Confirm password:" -msgstr "確認密碼:" - -#: bookwyrm/templates/password_reset_request.html:14 -msgid "A link to reset your password will be sent to your email address" -msgstr "重設你的密碼的連結將會被發送到你的郵箱地址" - -#: bookwyrm/templates/password_reset_request.html:28 -msgid "Reset password" -msgstr "重設密碼" - #: bookwyrm/templates/preferences/blocks.html:4 #: bookwyrm/templates/preferences/blocks.html:7 #: bookwyrm/templates/preferences/layout.html:31 @@ -2064,15 +2314,6 @@ msgstr "開始日期" msgid "End date" msgstr "結束日期" -#: bookwyrm/templates/settings/announcements/announcements.html:38 -#: bookwyrm/templates/settings/federation/instance_list.html:46 -#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44 -#: bookwyrm/templates/settings/invites/status_filter.html:5 -#: bookwyrm/templates/settings/users/user_admin.html:34 -#: bookwyrm/templates/settings/users/user_info.html:20 -msgid "Status" -msgstr "狀態" - #: bookwyrm/templates/settings/announcements/announcements.html:48 msgid "active" msgstr "啟用" @@ -2251,7 +2492,7 @@ msgid "Details" msgstr "詳細" #: bookwyrm/templates/settings/federation/instance.html:35 -#: bookwyrm/templates/user/layout.html:63 +#: bookwyrm/templates/user/layout.html:64 msgid "Activity" msgstr "活動" @@ -2827,52 +3068,65 @@ msgstr "建立書架" msgid "Edit Shelf" msgstr "編輯書架" -#: bookwyrm/templates/shelf/shelf.html:28 bookwyrm/views/shelf.py:55 +#: bookwyrm/templates/shelf/shelf.html:28 bookwyrm/views/shelf/shelf.py:53 msgid "All books" msgstr "所有書目" -#: bookwyrm/templates/shelf/shelf.html:55 +#: bookwyrm/templates/shelf/shelf.html:69 msgid "Create shelf" msgstr "建立書架" -#: bookwyrm/templates/shelf/shelf.html:77 +#: bookwyrm/templates/shelf/shelf.html:90 #, python-format msgid "%(formatted_count)s book" msgid_plural "%(formatted_count)s books" msgstr[0] "" -#: bookwyrm/templates/shelf/shelf.html:84 +#: bookwyrm/templates/shelf/shelf.html:97 #, python-format msgid "(showing %(start)s-%(end)s)" msgstr "" -#: bookwyrm/templates/shelf/shelf.html:96 +#: bookwyrm/templates/shelf/shelf.html:109 msgid "Edit shelf" msgstr "編輯書架" -#: bookwyrm/templates/shelf/shelf.html:104 +#: bookwyrm/templates/shelf/shelf.html:117 msgid "Delete shelf" msgstr "刪除書架" -#: bookwyrm/templates/shelf/shelf.html:132 -#: bookwyrm/templates/shelf/shelf.html:158 +#: bookwyrm/templates/shelf/shelf.html:145 +#: bookwyrm/templates/shelf/shelf.html:171 msgid "Shelved" msgstr "上架時間" -#: bookwyrm/templates/shelf/shelf.html:133 -#: bookwyrm/templates/shelf/shelf.html:161 +#: bookwyrm/templates/shelf/shelf.html:146 +#: bookwyrm/templates/shelf/shelf.html:174 msgid "Started" msgstr "開始時間" -#: bookwyrm/templates/shelf/shelf.html:134 -#: bookwyrm/templates/shelf/shelf.html:164 +#: bookwyrm/templates/shelf/shelf.html:147 +#: bookwyrm/templates/shelf/shelf.html:177 msgid "Finished" msgstr "完成時間" -#: bookwyrm/templates/shelf/shelf.html:190 +#: bookwyrm/templates/shelf/shelf.html:203 msgid "This shelf is empty." msgstr "此書架是空的。" +#: bookwyrm/templates/snippets/add_to_group_button.html:15 +msgid "Invite" +msgstr "" + +#: bookwyrm/templates/snippets/add_to_group_button.html:24 +msgid "Uninvite" +msgstr "" + +#: bookwyrm/templates/snippets/add_to_group_button.html:28 +#, python-format +msgid "Remove @%(username)s" +msgstr "" + #: bookwyrm/templates/snippets/announcement.html:31 #, python-format msgid "Posted by %(username)s" @@ -2903,10 +3157,6 @@ msgstr "轉發" msgid "Un-boost" msgstr "取消轉發" -#: bookwyrm/templates/snippets/create_status.html:17 -msgid "Review" -msgstr "書評" - #: bookwyrm/templates/snippets/create_status.html:39 msgid "Quote" msgstr "引用" @@ -2967,6 +3217,7 @@ msgstr "評論:" #: bookwyrm/templates/snippets/privacy-icons.html:15 #: bookwyrm/templates/snippets/privacy-icons.html:16 #: bookwyrm/templates/snippets/privacy_select.html:20 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:17 msgid "Private" msgstr "私密" @@ -3062,6 +3313,7 @@ msgid "Unfollow" msgstr "取消關注" #: bookwyrm/templates/snippets/follow_request_buttons.html:7 +#: bookwyrm/templates/snippets/join_invitation_buttons.html:8 msgid "Accept" msgstr "接受" @@ -3168,12 +3420,14 @@ msgstr "往後" #: bookwyrm/templates/snippets/privacy-icons.html:3 #: bookwyrm/templates/snippets/privacy-icons.html:4 #: bookwyrm/templates/snippets/privacy_select.html:11 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:11 msgid "Public" msgstr "公開" #: bookwyrm/templates/snippets/privacy-icons.html:7 #: bookwyrm/templates/snippets/privacy-icons.html:8 #: bookwyrm/templates/snippets/privacy_select.html:14 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:14 msgid "Unlisted" msgstr "不公開" @@ -3182,6 +3436,7 @@ msgid "Followers-only" msgstr "僅關注者" #: bookwyrm/templates/snippets/privacy_select.html:6 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:6 msgid "Post privacy" msgstr "發文隱私" @@ -3323,7 +3578,7 @@ msgstr "" msgid "commented on %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/note.html:15 +#: bookwyrm/templates/snippets/status/headers/note.html:8 #, python-format msgid "replied to %(username)s's status" msgstr "回覆了 %(username)s狀態" @@ -3382,23 +3637,6 @@ msgstr "轉發了" msgid "More options" msgstr "更多選項" -#: bookwyrm/templates/snippets/suggested_users.html:16 -#, python-format -msgid "%(mutuals)s follower you follow" -msgid_plural "%(mutuals)s followers you follow" -msgstr[0] "%(mutuals)s 個你也關注的關注者" - -#: bookwyrm/templates/snippets/suggested_users.html:23 -#, python-format -msgid "%(shared_books)s book on your shelves" -msgid_plural "%(shared_books)s books on your shelves" -msgstr[0] "%(shared_books)s 本在你書架上也有的書" - -#: bookwyrm/templates/snippets/suggested_users.html:31 -#: bookwyrm/templates/user/user_preview.html:36 -msgid "Follows you" -msgstr "" - #: bookwyrm/templates/snippets/switch_edition_button.html:5 msgid "Switch to this edition" msgstr "切換到此版本" @@ -3419,7 +3657,11 @@ msgstr "顯示更多" msgid "Show less" msgstr "顯示更少" -#: bookwyrm/templates/user/books_header.html:5 +#: bookwyrm/templates/user/books_header.html:10 +msgid "Your books" +msgstr "你的書目" + +#: bookwyrm/templates/user/books_header.html:15 #, python-format msgid "%(username)s's books" msgstr "%(username)s 的書目" @@ -3448,18 +3690,35 @@ msgstr "你 %(year)s 的書目" msgid "%(username)s's %(year)s Books" msgstr "%(username)s 在 %(year)s 的書目" -#: bookwyrm/templates/user/layout.html:18 bookwyrm/templates/user/user.html:10 +#: bookwyrm/templates/user/groups.html:9 +msgid "Your Groups" +msgstr "" + +#: bookwyrm/templates/user/groups.html:11 +#, python-format +msgid "Groups: %(username)s" +msgstr "" + +#: bookwyrm/templates/user/groups.html:17 +msgid "Create group" +msgstr "" + +#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:10 msgid "User Profile" msgstr "使用者使用者資料" -#: bookwyrm/templates/user/layout.html:44 +#: bookwyrm/templates/user/layout.html:45 msgid "Follow Requests" msgstr "關注請求" -#: bookwyrm/templates/user/layout.html:69 +#: bookwyrm/templates/user/layout.html:70 msgid "Reading Goal" msgstr "閱讀目標" +#: bookwyrm/templates/user/layout.html:76 +msgid "Groups" +msgstr "" + #: bookwyrm/templates/user/lists.html:11 #, python-format msgid "Lists: %(username)s" @@ -3544,19 +3803,19 @@ msgstr "檔案超過了最大大小: 10MB" msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/views/import_data.py:67 +#: bookwyrm/views/imports/import_data.py:64 msgid "Not a valid csv file" msgstr "不是有效的 csv 檔案" -#: bookwyrm/views/login.py:69 +#: bookwyrm/views/landing/login.py:69 msgid "Username or password are incorrect" msgstr "" -#: bookwyrm/views/password.py:32 +#: bookwyrm/views/landing/password.py:32 msgid "No user with that email address was found." msgstr "沒有找到使用該郵箱的使用者。" -#: bookwyrm/views/password.py:41 +#: bookwyrm/views/landing/password.py:43 #, python-brace-format msgid "A password reset link was sent to {email}" msgstr "密碼重置連結已傳送給 {email}" diff --git a/nginx/production b/nginx/production index 3c8b2ea7..8a13413a 100644 --- a/nginx/production +++ b/nginx/production @@ -27,7 +27,7 @@ server { # # client_max_body_size 3M; # -# if ($host != "you-domain.com") { +# if ($host != "your-domain.com") { # return 301 $scheme://your-domain.com$request_uri; # } # diff --git a/requirements.txt b/requirements.txt index 7cf1c68a..2cb1eec9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -20,7 +20,6 @@ django-storages==1.11.1 # Dev black==21.4b0 -coverage==5.1 pytest-django==4.1.0 pytest==6.1.2 pytest-cov==2.10.1