diff --git a/.env.example b/.env.example index fb0f7308d..20ce8240b 100644 --- a/.env.example +++ b/.env.example @@ -137,3 +137,6 @@ TWO_FACTOR_LOGIN_MAX_SECONDS=60 # and AWS_S3_CUSTOM_DOMAIN (if used) are added by default. # Value should be a comma-separated list of host names. CSP_ADDITIONAL_HOSTS= +# The last number here means "megabytes" +# Increase if users are having trouble uploading BookWyrm export files. +DATA_UPLOAD_MAX_MEMORY_SIZE = (1024**2 * 100) \ No newline at end of file diff --git a/.github/workflows/django-tests.yml b/.github/workflows/django-tests.yml index da11fe09e..78b6e142e 100644 --- a/.github/workflows/django-tests.yml +++ b/.github/workflows/django-tests.yml @@ -32,6 +32,15 @@ jobs: run: | python -m pip install --upgrade pip pip install -r requirements.txt + - name: Check migrations up-to-date + run: | + python ./manage.py makemigrations --check + env: + SECRET_KEY: beepbeep + DOMAIN: your.domain.here + EMAIL_HOST: "" + EMAIL_HOST_USER: "" + EMAIL_HOST_PASSWORD: "" - name: Run Tests env: SECRET_KEY: beepbeep diff --git a/FEDERATION.md b/FEDERATION.md index dd0c917e2..d80e98bd3 100644 --- a/FEDERATION.md +++ b/FEDERATION.md @@ -13,14 +13,15 @@ User relationship interactions follow the standard ActivityPub spec. - `Block`: prevent users from seeing one another's statuses, and prevents the blocked user from viewing the actor's profile - `Update`: updates a user's profile and settings - `Delete`: deactivates a user -- `Undo`: reverses a `Follow` or `Block` +- `Undo`: reverses a `Block` or `Follow` ### Activities - `Create/Status`: saves a new status in the database. - `Delete/Status`: Removes a status - `Like/Status`: Creates a favorite on the status - `Announce/Status`: Boosts the status into the actor's timeline -- `Undo/*`,: Reverses a `Like` or `Announce` +- `Undo/*`,: Reverses an `Announce`, `Like`, or `Move` +- `Move/User`: Moves a user from one ActivityPub id to another. ### Collections User's books and lists are represented by [`OrderedCollection`](https://www.w3.org/TR/activitystreams-vocabulary/#dfn-orderedcollection) diff --git a/VERSION b/VERSION index faef31a43..39e898a4f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.7.0 +0.7.1 diff --git a/bookwyrm/activitypub/__init__.py b/bookwyrm/activitypub/__init__.py index 2697620f0..41decd68a 100644 --- a/bookwyrm/activitypub/__init__.py +++ b/bookwyrm/activitypub/__init__.py @@ -23,6 +23,7 @@ from .verbs import Create, Delete, Undo, Update from .verbs import Follow, Accept, Reject, Block from .verbs import Add, Remove from .verbs import Announce, Like +from .verbs import Move # this creates a list of all the Activity types that we can serialize, # so when an Activity comes in from outside, we can check if it's known diff --git a/bookwyrm/activitypub/base_activity.py b/bookwyrm/activitypub/base_activity.py index 05e7d8a05..fbbc18f73 100644 --- a/bookwyrm/activitypub/base_activity.py +++ b/bookwyrm/activitypub/base_activity.py @@ -236,7 +236,7 @@ class ActivityObject: omit = kwargs.get("omit", ()) data = self.__dict__.copy() # recursively serialize - for (k, v) in data.items(): + for k, v in data.items(): try: if issubclass(type(v), ActivityObject): data[k] = v.serialize() @@ -396,19 +396,15 @@ def resolve_remote_id( def get_representative(): """Get or create an actor representing the instance - to sign requests to 'secure mastodon' servers""" - username = f"{INSTANCE_ACTOR_USERNAME}@{DOMAIN}" - email = "bookwyrm@localhost" - try: - user = models.User.objects.get(username=username) - except models.User.DoesNotExist: - user = models.User.objects.create_user( - username=username, - email=email, + to sign outgoing HTTP GET requests""" + return models.User.objects.get_or_create( + username=f"{INSTANCE_ACTOR_USERNAME}@{DOMAIN}", + defaults=dict( + email="bookwyrm@localhost", local=True, localname=INSTANCE_ACTOR_USERNAME, - ) - return user + ), + )[0] def get_activitypub_data(url): diff --git a/bookwyrm/activitypub/book.py b/bookwyrm/activitypub/book.py index 5db0dc3ac..a53222053 100644 --- a/bookwyrm/activitypub/book.py +++ b/bookwyrm/activitypub/book.py @@ -22,8 +22,6 @@ class BookData(ActivityObject): aasin: Optional[str] = None isfdb: Optional[str] = None lastEditedBy: Optional[str] = None - links: list[str] = field(default_factory=list) - fileLinks: list[str] = field(default_factory=list) # pylint: disable=invalid-name @@ -45,6 +43,8 @@ class Book(BookData): firstPublishedDate: str = "" publishedDate: str = "" + fileLinks: list[str] = field(default_factory=list) + cover: Optional[Document] = None type: str = "Book" diff --git a/bookwyrm/activitypub/person.py b/bookwyrm/activitypub/person.py index 61c15a579..85cf44409 100644 --- a/bookwyrm/activitypub/person.py +++ b/bookwyrm/activitypub/person.py @@ -40,4 +40,6 @@ class Person(ActivityObject): manuallyApprovesFollowers: str = False discoverable: str = False hideFollows: str = False + movedTo: str = None + alsoKnownAs: dict[str] = None type: str = "Person" diff --git a/bookwyrm/activitypub/verbs.py b/bookwyrm/activitypub/verbs.py index 4b7514b5a..a365f4cc0 100644 --- a/bookwyrm/activitypub/verbs.py +++ b/bookwyrm/activitypub/verbs.py @@ -171,9 +171,19 @@ class Reject(Verb): type: str = "Reject" def action(self, allow_external_connections=True): - """reject a follow request""" - obj = self.object.to_model(save=False, allow_create=False) - obj.reject() + """reject a follow or follow request""" + + for model_name in ["UserFollowRequest", "UserFollows", None]: + model = apps.get_model(f"bookwyrm.{model_name}") if model_name else None + if obj := self.object.to_model( + model=model, + save=False, + allow_create=False, + allow_external_connections=allow_external_connections, + ): + # Reject the first model that can be built. + obj.reject() + break @dataclass(init=False) @@ -231,3 +241,30 @@ class Announce(Verb): def action(self, allow_external_connections=True): """boost""" self.to_model(allow_external_connections=allow_external_connections) + + +@dataclass(init=False) +class Move(Verb): + """a user moving an object""" + + object: str + type: str = "Move" + origin: str = None + target: str = None + + def action(self, allow_external_connections=True): + """move""" + + object_is_user = resolve_remote_id(remote_id=self.object, model="User") + + if object_is_user: + model = apps.get_model("bookwyrm.MoveUser") + + self.to_model( + model=model, + save=True, + allow_external_connections=allow_external_connections, + ) + else: + # we might do something with this to move other objects at some point + pass diff --git a/bookwyrm/book_search.py b/bookwyrm/book_search.py index ceb228f40..cf48f4832 100644 --- a/bookwyrm/book_search.py +++ b/bookwyrm/book_search.py @@ -43,6 +43,7 @@ def search( min_confidence: float = 0, filters: Optional[list[Any]] = None, return_first: bool = False, + books: Optional[QuerySet[models.Edition]] = None, ) -> Union[Optional[models.Edition], QuerySet[models.Edition]]: """search your local database""" filters = filters or [] @@ -54,13 +55,15 @@ def search( # first, try searching unique identifiers # unique identifiers never have spaces, title/author usually do if not " " in query: - results = search_identifiers(query, *filters, return_first=return_first) + results = search_identifiers( + query, *filters, return_first=return_first, books=books + ) # if there were no identifier results... if not results: # then try searching title/author results = search_title_author( - query, min_confidence, *filters, return_first=return_first + query, min_confidence, *filters, return_first=return_first, books=books ) return results @@ -98,9 +101,17 @@ def format_search_result(search_result): def search_identifiers( - query, *filters, return_first=False + query, + *filters, + return_first=False, + books=None, ) -> Union[Optional[models.Edition], QuerySet[models.Edition]]: - """tries remote_id, isbn; defined as dedupe fields on the model""" + """search Editions by deduplication fields + + Best for cases when we can assume someone is searching for an exact match on + commonly unique data identifiers like isbn or specific library ids. + """ + books = books or models.Edition.objects if connectors.maybe_isbn(query): # Oh did you think the 'S' in ISBN stood for 'standard'? normalized_isbn = query.strip().upper().rjust(10, "0") @@ -111,7 +122,7 @@ def search_identifiers( for f in models.Edition._meta.get_fields() if hasattr(f, "deduplication_field") and f.deduplication_field ] - results = models.Edition.objects.filter( + results = books.filter( *filters, reduce(operator.or_, (Q(**f) for f in or_filters)) ).distinct() @@ -121,12 +132,17 @@ def search_identifiers( def search_title_author( - query, min_confidence, *filters, return_first=False + query, + min_confidence, + *filters, + return_first=False, + books=None, ) -> QuerySet[models.Edition]: """searches for title and author""" + books = books or models.Edition.objects query = SearchQuery(query, config="simple") | SearchQuery(query, config="english") results = ( - models.Edition.objects.filter(*filters, search_vector=query) + books.filter(*filters, search_vector=query) .annotate(rank=SearchRank(F("search_vector"), query)) .filter(rank__gt=min_confidence) .order_by("-rank") @@ -137,7 +153,7 @@ def search_title_author( # filter out multiple editions of the same work list_results = [] - for work_id in set(editions_of_work[:30]): + for work_id in editions_of_work[:30]: result = ( results.filter(parent_work=work_id) .order_by("-rank", "-edition_rank") diff --git a/bookwyrm/forms/books.py b/bookwyrm/forms/books.py index 4885dc063..f73ce3f5a 100644 --- a/bookwyrm/forms/books.py +++ b/bookwyrm/forms/books.py @@ -1,8 +1,9 @@ """ using django model forms """ from django import forms +from file_resubmit.widgets import ResubmitImageWidget + from bookwyrm import models -from bookwyrm.models.fields import ClearableFileInputWithWarning from .custom_form import CustomForm from .widgets import ArrayWidget, SelectDateWidget, Select @@ -70,9 +71,7 @@ class EditionForm(CustomForm): "published_date": SelectDateWidget( attrs={"aria-describedby": "desc_published_date"} ), - "cover": ClearableFileInputWithWarning( - attrs={"aria-describedby": "desc_cover"} - ), + "cover": ResubmitImageWidget(attrs={"aria-describedby": "desc_cover"}), "physical_format": Select( attrs={"aria-describedby": "desc_physical_format"} ), diff --git a/bookwyrm/forms/edit_user.py b/bookwyrm/forms/edit_user.py index ce7bb6d07..9024972c3 100644 --- a/bookwyrm/forms/edit_user.py +++ b/bookwyrm/forms/edit_user.py @@ -70,6 +70,22 @@ class DeleteUserForm(CustomForm): fields = ["password"] +class MoveUserForm(CustomForm): + target = forms.CharField(widget=forms.TextInput) + + class Meta: + model = models.User + fields = ["password"] + + +class AliasUserForm(CustomForm): + username = forms.CharField(widget=forms.TextInput) + + class Meta: + model = models.User + fields = ["password"] + + class ChangePasswordForm(CustomForm): current_password = forms.CharField(widget=forms.PasswordInput) confirm_password = forms.CharField(widget=forms.PasswordInput) diff --git a/bookwyrm/forms/forms.py b/bookwyrm/forms/forms.py index ea6093750..3d555f308 100644 --- a/bookwyrm/forms/forms.py +++ b/bookwyrm/forms/forms.py @@ -25,6 +25,10 @@ class ImportForm(forms.Form): csv_file = forms.FileField() +class ImportUserForm(forms.Form): + archive_file = forms.FileField() + + class ShelfForm(CustomForm): class Meta: model = models.Shelf diff --git a/bookwyrm/importers/__init__.py b/bookwyrm/importers/__init__.py index 6ce50f160..8e92872f2 100644 --- a/bookwyrm/importers/__init__.py +++ b/bookwyrm/importers/__init__.py @@ -1,6 +1,7 @@ """ import classes """ from .importer import Importer +from .bookwyrm_import import BookwyrmImporter from .calibre_import import CalibreImporter from .goodreads_import import GoodreadsImporter from .librarything_import import LibrarythingImporter diff --git a/bookwyrm/importers/bookwyrm_import.py b/bookwyrm/importers/bookwyrm_import.py new file mode 100644 index 000000000..206cd6219 --- /dev/null +++ b/bookwyrm/importers/bookwyrm_import.py @@ -0,0 +1,24 @@ +"""Import data from Bookwyrm export files""" +from django.http import QueryDict + +from bookwyrm.models import User +from bookwyrm.models.bookwyrm_import_job import BookwyrmImportJob + + +class BookwyrmImporter: + """Import a Bookwyrm User export file. + This is kind of a combination of an importer and a connector. + """ + + # pylint: disable=no-self-use + def process_import( + self, user: User, archive_file: bytes, settings: QueryDict + ) -> BookwyrmImportJob: + """import user data from a Bookwyrm export file""" + + required = [k for k in settings if settings.get(k) == "on"] + + job = BookwyrmImportJob.objects.create( + user=user, archive_file=archive_file, required=required + ) + return job diff --git a/bookwyrm/isbn/isbn.py b/bookwyrm/isbn/isbn.py index 4cc7f47dd..56062ff7b 100644 --- a/bookwyrm/isbn/isbn.py +++ b/bookwyrm/isbn/isbn.py @@ -40,7 +40,12 @@ class IsbnHyphenator: self.__element_tree = ElementTree.parse(self.__range_file_path) gs1_prefix = isbn_13[:3] - reg_group = self.__find_reg_group(isbn_13, gs1_prefix) + try: + reg_group = self.__find_reg_group(isbn_13, gs1_prefix) + except ValueError: + # if the reg groups are invalid, just return the original isbn + return isbn_13 + if reg_group is None: return isbn_13 # failed to hyphenate diff --git a/bookwyrm/management/commands/erase_deleted_user_data.py b/bookwyrm/management/commands/erase_deleted_user_data.py new file mode 100644 index 000000000..40c3f042b --- /dev/null +++ b/bookwyrm/management/commands/erase_deleted_user_data.py @@ -0,0 +1,43 @@ +""" Erase any data stored about deleted users """ +import sys +from django.core.management.base import BaseCommand, CommandError +from bookwyrm import models +from bookwyrm.models.user import erase_user_data + +# pylint: disable=missing-function-docstring +class Command(BaseCommand): + """command-line options""" + + help = "Remove Two Factor Authorisation from user" + + def add_arguments(self, parser): # pylint: disable=no-self-use + parser.add_argument( + "--dryrun", + action="store_true", + help="Preview users to be cleared without altering the database", + ) + + def handle(self, *args, **options): # pylint: disable=unused-argument + + # Check for anything fishy + bad_state = models.User.objects.filter(is_deleted=True, is_active=True) + if bad_state.exists(): + raise CommandError( + f"{bad_state.count()} user(s) marked as both active and deleted" + ) + + deleted_users = models.User.objects.filter(is_deleted=True) + self.stdout.write(f"Found {deleted_users.count()} deleted users") + if options["dryrun"]: + self.stdout.write("\n".join(u.username for u in deleted_users[:5])) + if deleted_users.count() > 5: + self.stdout.write("... and more") + sys.exit() + + self.stdout.write("Erasing user data:") + for user_id in deleted_users.values_list("id", flat=True): + erase_user_data.delay(user_id) + self.stdout.write(".", ending="") + + self.stdout.write("") + self.stdout.write("Tasks created successfully") diff --git a/bookwyrm/middleware/__init__.py b/bookwyrm/middleware/__init__.py index 03843c5a3..85c3a56fe 100644 --- a/bookwyrm/middleware/__init__.py +++ b/bookwyrm/middleware/__init__.py @@ -1,3 +1,4 @@ """ look at all this nice middleware! """ from .timezone_middleware import TimezoneMiddleware from .ip_middleware import IPBlocklistMiddleware +from .file_too_big import FileTooBig diff --git a/bookwyrm/middleware/file_too_big.py b/bookwyrm/middleware/file_too_big.py new file mode 100644 index 000000000..de1349d96 --- /dev/null +++ b/bookwyrm/middleware/file_too_big.py @@ -0,0 +1,30 @@ +"""Middleware to display a custom 413 error page""" + +from django.http import HttpResponse +from django.shortcuts import render +from django.core.exceptions import RequestDataTooBig + + +class FileTooBig: + """Middleware to display a custom page when a + RequestDataTooBig exception is thrown""" + + def __init__(self, get_response): + """boilerplate __init__ from Django docs""" + + self.get_response = get_response + + def __call__(self, request): + """If RequestDataTooBig is thrown, render the 413 error page""" + + try: + body = request.body # pylint: disable=unused-variable + + except RequestDataTooBig: + + rendered = render(request, "413.html") + response = HttpResponse(rendered) + return response + + response = self.get_response(request) + return response diff --git a/bookwyrm/migrations/0179_populate_sort_title.py b/bookwyrm/migrations/0179_populate_sort_title.py index e238bca1d..a149a68a7 100644 --- a/bookwyrm/migrations/0179_populate_sort_title.py +++ b/bookwyrm/migrations/0179_populate_sort_title.py @@ -45,5 +45,7 @@ class Migration(migrations.Migration): ] operations = [ - migrations.RunPython(populate_sort_title), + migrations.RunPython( + populate_sort_title, reverse_code=migrations.RunPython.noop + ), ] diff --git a/bookwyrm/migrations/0182_auto_20231027_1122.py b/bookwyrm/migrations/0182_auto_20231027_1122.py new file mode 100644 index 000000000..ab57907a9 --- /dev/null +++ b/bookwyrm/migrations/0182_auto_20231027_1122.py @@ -0,0 +1,130 @@ +# Generated by Django 3.2.20 on 2023-10-27 11:22 + +import bookwyrm.models.activitypub_mixin +import bookwyrm.models.fields +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0181_merge_20230806_2302"), + ] + + operations = [ + migrations.AddField( + model_name="user", + name="also_known_as", + field=bookwyrm.models.fields.ManyToManyField(to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name="user", + name="moved_to", + field=bookwyrm.models.fields.RemoteIdField( + max_length=255, + null=True, + validators=[bookwyrm.models.fields.validate_remote_id], + ), + ), + migrations.AlterField( + model_name="notification", + name="notification_type", + field=models.CharField( + choices=[ + ("FAVORITE", "Favorite"), + ("REPLY", "Reply"), + ("MENTION", "Mention"), + ("TAG", "Tag"), + ("FOLLOW", "Follow"), + ("FOLLOW_REQUEST", "Follow Request"), + ("BOOST", "Boost"), + ("IMPORT", "Import"), + ("ADD", "Add"), + ("REPORT", "Report"), + ("LINK_DOMAIN", "Link Domain"), + ("INVITE", "Invite"), + ("ACCEPT", "Accept"), + ("JOIN", "Join"), + ("LEAVE", "Leave"), + ("REMOVE", "Remove"), + ("GROUP_PRIVACY", "Group Privacy"), + ("GROUP_NAME", "Group Name"), + ("GROUP_DESCRIPTION", "Group Description"), + ("MOVE", "Move"), + ], + max_length=255, + ), + ), + migrations.CreateModel( + name="Move", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("created_date", models.DateTimeField(auto_now_add=True)), + ("updated_date", models.DateTimeField(auto_now=True)), + ( + "remote_id", + bookwyrm.models.fields.RemoteIdField( + max_length=255, + null=True, + validators=[bookwyrm.models.fields.validate_remote_id], + ), + ), + ("object", bookwyrm.models.fields.CharField(max_length=255)), + ( + "origin", + bookwyrm.models.fields.CharField( + blank=True, default="", max_length=255, null=True + ), + ), + ( + "user", + bookwyrm.models.fields.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + "abstract": False, + }, + bases=(bookwyrm.models.activitypub_mixin.ActivityMixin, models.Model), + ), + migrations.CreateModel( + name="MoveUser", + fields=[ + ( + "move_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="bookwyrm.move", + ), + ), + ( + "target", + bookwyrm.models.fields.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="move_target", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + "abstract": False, + }, + bases=("bookwyrm.move",), + ), + ] diff --git a/bookwyrm/migrations/0183_auto_20231105_1607.py b/bookwyrm/migrations/0183_auto_20231105_1607.py new file mode 100644 index 000000000..0c8376adc --- /dev/null +++ b/bookwyrm/migrations/0183_auto_20231105_1607.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.20 on 2023-11-05 16:07 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0182_auto_20231027_1122"), + ] + + operations = [ + migrations.AddField( + model_name="user", + name="is_deleted", + field=models.BooleanField(default=False), + ), + ] diff --git a/bookwyrm/migrations/0184_auto_20231106_0421.py b/bookwyrm/migrations/0184_auto_20231106_0421.py new file mode 100644 index 000000000..23bacc502 --- /dev/null +++ b/bookwyrm/migrations/0184_auto_20231106_0421.py @@ -0,0 +1,35 @@ +# Generated by Django 3.2.20 on 2023-11-06 04:21 + +from django.db import migrations +from bookwyrm.models import User + + +def update_deleted_users(apps, schema_editor): + """Find all the users who are deleted, not just inactive, and set deleted""" + users = apps.get_model("bookwyrm", "User") + db_alias = schema_editor.connection.alias + users.objects.using(db_alias).filter( + is_active=False, + deactivation_reason__in=[ + "self_deletion", + "moderator_deletion", + ], + ).update(is_deleted=True) + + # differente rules for remote users + users.objects.using(db_alias).filter(is_active=False, local=False,).exclude( + deactivation_reason="moderator_deactivation", + ).update(is_deleted=True) + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0183_auto_20231105_1607"), + ] + + operations = [ + migrations.RunPython( + update_deleted_users, reverse_code=migrations.RunPython.noop + ), + ] diff --git a/bookwyrm/migrations/0185_alter_notification_notification_type.py b/bookwyrm/migrations/0185_alter_notification_notification_type.py new file mode 100644 index 000000000..dd070c634 --- /dev/null +++ b/bookwyrm/migrations/0185_alter_notification_notification_type.py @@ -0,0 +1,42 @@ +# Generated by Django 3.2.20 on 2023-11-13 22:39 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0184_auto_20231106_0421"), + ] + + operations = [ + migrations.AlterField( + model_name="notification", + name="notification_type", + field=models.CharField( + choices=[ + ("FAVORITE", "Favorite"), + ("BOOST", "Boost"), + ("REPLY", "Reply"), + ("MENTION", "Mention"), + ("TAG", "Tag"), + ("FOLLOW", "Follow"), + ("FOLLOW_REQUEST", "Follow Request"), + ("IMPORT", "Import"), + ("ADD", "Add"), + ("REPORT", "Report"), + ("LINK_DOMAIN", "Link Domain"), + ("INVITE", "Invite"), + ("ACCEPT", "Accept"), + ("JOIN", "Join"), + ("LEAVE", "Leave"), + ("REMOVE", "Remove"), + ("GROUP_PRIVACY", "Group Privacy"), + ("GROUP_NAME", "Group Name"), + ("GROUP_DESCRIPTION", "Group Description"), + ("MOVE", "Move"), + ], + max_length=255, + ), + ), + ] diff --git a/bookwyrm/migrations/0186_auto_20231116_0048.py b/bookwyrm/migrations/0186_auto_20231116_0048.py new file mode 100644 index 000000000..e3b9da4fe --- /dev/null +++ b/bookwyrm/migrations/0186_auto_20231116_0048.py @@ -0,0 +1,212 @@ +# Generated by Django 3.2.20 on 2023-11-16 00:48 + +from django.conf import settings +import django.contrib.postgres.fields +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0185_alter_notification_notification_type"), + ] + + operations = [ + migrations.CreateModel( + name="ParentJob", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("task_id", models.UUIDField(blank=True, null=True, unique=True)), + ( + "created_date", + models.DateTimeField(default=django.utils.timezone.now), + ), + ( + "updated_date", + models.DateTimeField(default=django.utils.timezone.now), + ), + ("complete", models.BooleanField(default=False)), + ( + "status", + models.CharField( + choices=[ + ("pending", "Pending"), + ("active", "Active"), + ("complete", "Complete"), + ("stopped", "Stopped"), + ("failed", "Failed"), + ], + default="pending", + max_length=50, + null=True, + ), + ), + ( + "user", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.AddField( + model_name="sitesettings", + name="user_import_time_limit", + field=models.IntegerField(default=48), + ), + migrations.AlterField( + model_name="notification", + name="notification_type", + field=models.CharField( + choices=[ + ("FAVORITE", "Favorite"), + ("BOOST", "Boost"), + ("REPLY", "Reply"), + ("MENTION", "Mention"), + ("TAG", "Tag"), + ("FOLLOW", "Follow"), + ("FOLLOW_REQUEST", "Follow Request"), + ("IMPORT", "Import"), + ("USER_IMPORT", "User Import"), + ("USER_EXPORT", "User Export"), + ("ADD", "Add"), + ("REPORT", "Report"), + ("LINK_DOMAIN", "Link Domain"), + ("INVITE", "Invite"), + ("ACCEPT", "Accept"), + ("JOIN", "Join"), + ("LEAVE", "Leave"), + ("REMOVE", "Remove"), + ("GROUP_PRIVACY", "Group Privacy"), + ("GROUP_NAME", "Group Name"), + ("GROUP_DESCRIPTION", "Group Description"), + ("MOVE", "Move"), + ], + max_length=255, + ), + ), + migrations.CreateModel( + name="BookwyrmExportJob", + fields=[ + ( + "parentjob_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="bookwyrm.parentjob", + ), + ), + ("export_data", models.FileField(null=True, upload_to="")), + ], + options={ + "abstract": False, + }, + bases=("bookwyrm.parentjob",), + ), + migrations.CreateModel( + name="BookwyrmImportJob", + fields=[ + ( + "parentjob_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="bookwyrm.parentjob", + ), + ), + ("archive_file", models.FileField(blank=True, null=True, upload_to="")), + ("import_data", models.JSONField(null=True)), + ( + "required", + django.contrib.postgres.fields.ArrayField( + base_field=models.CharField(blank=True, max_length=50), + blank=True, + size=None, + ), + ), + ], + options={ + "abstract": False, + }, + bases=("bookwyrm.parentjob",), + ), + migrations.CreateModel( + name="ChildJob", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("task_id", models.UUIDField(blank=True, null=True, unique=True)), + ( + "created_date", + models.DateTimeField(default=django.utils.timezone.now), + ), + ( + "updated_date", + models.DateTimeField(default=django.utils.timezone.now), + ), + ("complete", models.BooleanField(default=False)), + ( + "status", + models.CharField( + choices=[ + ("pending", "Pending"), + ("active", "Active"), + ("complete", "Complete"), + ("stopped", "Stopped"), + ("failed", "Failed"), + ], + default="pending", + max_length=50, + null=True, + ), + ), + ( + "parent_job", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="child_jobs", + to="bookwyrm.parentjob", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.AddField( + model_name="notification", + name="related_user_export", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="bookwyrm.bookwyrmexportjob", + ), + ), + ] diff --git a/bookwyrm/migrations/0186_invite_request_notification.py b/bookwyrm/migrations/0186_invite_request_notification.py new file mode 100644 index 000000000..3680b1de7 --- /dev/null +++ b/bookwyrm/migrations/0186_invite_request_notification.py @@ -0,0 +1,48 @@ +# Generated by Django 3.2.20 on 2023-11-14 10:02 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0185_alter_notification_notification_type"), + ] + + operations = [ + migrations.AddField( + model_name="notification", + name="related_invite_requests", + field=models.ManyToManyField(to="bookwyrm.InviteRequest"), + ), + migrations.AlterField( + model_name="notification", + name="notification_type", + field=models.CharField( + choices=[ + ("FAVORITE", "Favorite"), + ("BOOST", "Boost"), + ("REPLY", "Reply"), + ("MENTION", "Mention"), + ("TAG", "Tag"), + ("FOLLOW", "Follow"), + ("FOLLOW_REQUEST", "Follow Request"), + ("IMPORT", "Import"), + ("ADD", "Add"), + ("REPORT", "Report"), + ("LINK_DOMAIN", "Link Domain"), + ("INVITE_REQUEST", "Invite Request"), + ("INVITE", "Invite"), + ("ACCEPT", "Accept"), + ("JOIN", "Join"), + ("LEAVE", "Leave"), + ("REMOVE", "Remove"), + ("GROUP_PRIVACY", "Group Privacy"), + ("GROUP_NAME", "Group Name"), + ("GROUP_DESCRIPTION", "Group Description"), + ("MOVE", "Move"), + ], + max_length=255, + ), + ), + ] diff --git a/bookwyrm/migrations/0187_partial_publication_dates.py b/bookwyrm/migrations/0187_partial_publication_dates.py new file mode 100644 index 000000000..10ef599a7 --- /dev/null +++ b/bookwyrm/migrations/0187_partial_publication_dates.py @@ -0,0 +1,54 @@ +# Generated by Django 3.2.20 on 2023-11-09 16:57 + +import bookwyrm.models.fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0186_invite_request_notification"), + ] + + operations = [ + migrations.AddField( + model_name="book", + name="first_published_date_precision", + field=models.CharField( + blank=True, + choices=[ + ("DAY", "Day prec."), + ("MONTH", "Month prec."), + ("YEAR", "Year prec."), + ], + editable=False, + max_length=10, + null=True, + ), + ), + migrations.AddField( + model_name="book", + name="published_date_precision", + field=models.CharField( + blank=True, + choices=[ + ("DAY", "Day prec."), + ("MONTH", "Month prec."), + ("YEAR", "Year prec."), + ], + editable=False, + max_length=10, + null=True, + ), + ), + migrations.AlterField( + model_name="book", + name="first_published_date", + field=bookwyrm.models.fields.PartialDateField(blank=True, null=True), + ), + migrations.AlterField( + model_name="book", + name="published_date", + field=bookwyrm.models.fields.PartialDateField(blank=True, null=True), + ), + ] diff --git a/bookwyrm/migrations/0188_theme_loads.py b/bookwyrm/migrations/0188_theme_loads.py new file mode 100644 index 000000000..846aaf549 --- /dev/null +++ b/bookwyrm/migrations/0188_theme_loads.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.23 on 2023-11-20 18:02 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0187_partial_publication_dates"), + ] + + operations = [ + migrations.AddField( + model_name="theme", + name="loads", + field=models.BooleanField(blank=True, null=True), + ), + ] diff --git a/bookwyrm/migrations/0189_alter_user_preferred_language.py b/bookwyrm/migrations/0189_alter_user_preferred_language.py new file mode 100644 index 000000000..d9d9777c7 --- /dev/null +++ b/bookwyrm/migrations/0189_alter_user_preferred_language.py @@ -0,0 +1,45 @@ +# Generated by Django 3.2.23 on 2023-12-12 23:42 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0188_theme_loads"), + ] + + operations = [ + migrations.AlterField( + model_name="user", + name="preferred_language", + field=models.CharField( + blank=True, + choices=[ + ("en-us", "English"), + ("ca-es", "Català (Catalan)"), + ("de-de", "Deutsch (German)"), + ("eo-uy", "Esperanto (Esperanto)"), + ("es-es", "Español (Spanish)"), + ("eu-es", "Euskara (Basque)"), + ("gl-es", "Galego (Galician)"), + ("it-it", "Italiano (Italian)"), + ("fi-fi", "Suomi (Finnish)"), + ("fr-fr", "Français (French)"), + ("lt-lt", "Lietuvių (Lithuanian)"), + ("nl-nl", "Nederlands (Dutch)"), + ("no-no", "Norsk (Norwegian)"), + ("pl-pl", "Polski (Polish)"), + ("pt-br", "Português do Brasil (Brazilian Portuguese)"), + ("pt-pt", "Português Europeu (European Portuguese)"), + ("ro-ro", "Română (Romanian)"), + ("sv-se", "Svenska (Swedish)"), + ("uk-ua", "Українська (Ukrainian)"), + ("zh-hans", "简体中文 (Simplified Chinese)"), + ("zh-hant", "繁體中文 (Traditional Chinese)"), + ], + max_length=255, + null=True, + ), + ), + ] diff --git a/bookwyrm/migrations/0189_merge_0186_auto_20231116_0048_0188_theme_loads.py b/bookwyrm/migrations/0189_merge_0186_auto_20231116_0048_0188_theme_loads.py new file mode 100644 index 000000000..eb6238f6e --- /dev/null +++ b/bookwyrm/migrations/0189_merge_0186_auto_20231116_0048_0188_theme_loads.py @@ -0,0 +1,13 @@ +# Generated by Django 3.2.23 on 2023-11-22 10:16 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0186_auto_20231116_0048"), + ("bookwyrm", "0188_theme_loads"), + ] + + operations = [] diff --git a/bookwyrm/migrations/0190_alter_notification_notification_type.py b/bookwyrm/migrations/0190_alter_notification_notification_type.py new file mode 100644 index 000000000..aff54c77b --- /dev/null +++ b/bookwyrm/migrations/0190_alter_notification_notification_type.py @@ -0,0 +1,45 @@ +# Generated by Django 3.2.23 on 2023-11-23 19:49 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0189_merge_0186_auto_20231116_0048_0188_theme_loads"), + ] + + operations = [ + migrations.AlterField( + model_name="notification", + name="notification_type", + field=models.CharField( + choices=[ + ("FAVORITE", "Favorite"), + ("BOOST", "Boost"), + ("REPLY", "Reply"), + ("MENTION", "Mention"), + ("TAG", "Tag"), + ("FOLLOW", "Follow"), + ("FOLLOW_REQUEST", "Follow Request"), + ("IMPORT", "Import"), + ("USER_IMPORT", "User Import"), + ("USER_EXPORT", "User Export"), + ("ADD", "Add"), + ("REPORT", "Report"), + ("LINK_DOMAIN", "Link Domain"), + ("INVITE_REQUEST", "Invite Request"), + ("INVITE", "Invite"), + ("ACCEPT", "Accept"), + ("JOIN", "Join"), + ("LEAVE", "Leave"), + ("REMOVE", "Remove"), + ("GROUP_PRIVACY", "Group Privacy"), + ("GROUP_NAME", "Group Name"), + ("GROUP_DESCRIPTION", "Group Description"), + ("MOVE", "Move"), + ], + max_length=255, + ), + ), + ] diff --git a/bookwyrm/migrations/0191_merge_20240102_0326.py b/bookwyrm/migrations/0191_merge_20240102_0326.py new file mode 100644 index 000000000..485c14af8 --- /dev/null +++ b/bookwyrm/migrations/0191_merge_20240102_0326.py @@ -0,0 +1,13 @@ +# Generated by Django 3.2.23 on 2024-01-02 03:26 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0189_alter_user_preferred_language"), + ("bookwyrm", "0190_alter_notification_notification_type"), + ] + + operations = [] diff --git a/bookwyrm/migrations/0192_sitesettings_user_exports_enabled.py b/bookwyrm/migrations/0192_sitesettings_user_exports_enabled.py new file mode 100644 index 000000000..ec5b411e2 --- /dev/null +++ b/bookwyrm/migrations/0192_sitesettings_user_exports_enabled.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.23 on 2024-01-16 10:28 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0191_merge_20240102_0326"), + ] + + operations = [ + migrations.AddField( + model_name="sitesettings", + name="user_exports_enabled", + field=models.BooleanField(default=False), + ), + ] diff --git a/bookwyrm/models/__init__.py b/bookwyrm/models/__init__.py index 7b779190b..6bb99c7f2 100644 --- a/bookwyrm/models/__init__.py +++ b/bookwyrm/models/__init__.py @@ -26,13 +26,17 @@ from .federated_server import FederatedServer from .group import Group, GroupMember, GroupMemberInvitation from .import_job import ImportJob, ImportItem +from .bookwyrm_import_job import BookwyrmImportJob +from .bookwyrm_export_job import BookwyrmExportJob + +from .move import MoveUser from .site import SiteSettings, Theme, SiteInvite from .site import PasswordReset, InviteRequest from .announcement import Announcement from .antispam import EmailBlocklist, IPBlocklist, AutoMod, automod_task -from .notification import Notification +from .notification import Notification, NotificationType from .hashtag import Hashtag diff --git a/bookwyrm/models/activitypub_mixin.py b/bookwyrm/models/activitypub_mixin.py index 36317ad4e..d0a941f43 100644 --- a/bookwyrm/models/activitypub_mixin.py +++ b/bookwyrm/models/activitypub_mixin.py @@ -602,7 +602,7 @@ def to_ordered_collection_page( if activity_page.has_next(): next_page = f"{remote_id}?page={activity_page.next_page_number()}" if activity_page.has_previous(): - prev_page = f"{remote_id}?page=%d{activity_page.previous_page_number()}" + prev_page = f"{remote_id}?page={activity_page.previous_page_number()}" return activitypub.OrderedCollectionPage( id=f"{remote_id}?page={page}", partOf=remote_id, diff --git a/bookwyrm/models/antispam.py b/bookwyrm/models/antispam.py index 94d978ec4..1067cbf1d 100644 --- a/bookwyrm/models/antispam.py +++ b/bookwyrm/models/antispam.py @@ -10,6 +10,7 @@ from django.utils.translation import gettext_lazy as _ from bookwyrm.tasks import app, MISC from .base_model import BookWyrmModel +from .notification import NotificationType from .user import User @@ -80,7 +81,7 @@ def automod_task(): with transaction.atomic(): for admin in admins: notification, _ = notification_model.objects.get_or_create( - user=admin, notification_type=notification_model.REPORT, read=False + user=admin, notification_type=NotificationType.REPORT, read=False ) notification.related_reports.set(reports) diff --git a/bookwyrm/models/book.py b/bookwyrm/models/book.py index 9e05c03af..6893b9da1 100644 --- a/bookwyrm/models/book.py +++ b/bookwyrm/models/book.py @@ -135,8 +135,8 @@ class Book(BookDataModel): preview_image = models.ImageField( upload_to="previews/covers/", blank=True, null=True ) - first_published_date = fields.DateTimeField(blank=True, null=True) - published_date = fields.DateTimeField(blank=True, null=True) + first_published_date = fields.PartialDateField(blank=True, null=True) + published_date = fields.PartialDateField(blank=True, null=True) objects = InheritanceManager() field_tracker = FieldTracker(fields=["authors", "title", "subtitle", "cover"]) @@ -366,9 +366,9 @@ class Edition(Book): # normalize isbn format if self.isbn_10: - self.isbn_10 = re.sub(r"[^0-9X]", "", self.isbn_10) + self.isbn_10 = normalize_isbn(self.isbn_10) if self.isbn_13: - self.isbn_13 = re.sub(r"[^0-9X]", "", self.isbn_13) + self.isbn_13 = normalize_isbn(self.isbn_13) # set rank self.edition_rank = self.get_rank() @@ -463,6 +463,11 @@ def isbn_13_to_10(isbn_13): return converted + str(checkdigit) +def normalize_isbn(isbn): + """Remove unexpected characters from ISBN 10 or 13""" + return re.sub(r"[^0-9X]", "", isbn) + + # pylint: disable=unused-argument @receiver(models.signals.post_save, sender=Edition) def preview_image(instance, *args, **kwargs): diff --git a/bookwyrm/models/bookwyrm_export_job.py b/bookwyrm/models/bookwyrm_export_job.py new file mode 100644 index 000000000..1f6085e0c --- /dev/null +++ b/bookwyrm/models/bookwyrm_export_job.py @@ -0,0 +1,232 @@ +"""Export user account to tar.gz file for import into another Bookwyrm instance""" + +import dataclasses +import logging +from uuid import uuid4 + +from django.db.models import FileField +from django.db.models import Q +from django.core.serializers.json import DjangoJSONEncoder +from django.core.files.base import ContentFile + +from bookwyrm.models import AnnualGoal, ReadThrough, ShelfBook, List, ListItem +from bookwyrm.models import Review, Comment, Quotation +from bookwyrm.models import Edition +from bookwyrm.models import UserFollows, User, UserBlocks +from bookwyrm.models.job import ParentJob, ParentTask +from bookwyrm.tasks import app, IMPORTS +from bookwyrm.utils.tar import BookwyrmTarFile + +logger = logging.getLogger(__name__) + + +class BookwyrmExportJob(ParentJob): + """entry for a specific request to export a bookwyrm user""" + + export_data = FileField(null=True) + + def start_job(self): + """Start the job""" + start_export_task.delay(job_id=self.id, no_children=True) + + return self + + +@app.task(queue=IMPORTS, base=ParentTask) +def start_export_task(**kwargs): + """trigger the child tasks for each row""" + job = BookwyrmExportJob.objects.get(id=kwargs["job_id"]) + + # don't start the job if it was stopped from the UI + if job.complete: + return + try: + # This is where ChildJobs get made + job.export_data = ContentFile(b"", str(uuid4())) + json_data = json_export(job.user) + tar_export(json_data, job.user, job.export_data) + job.save(update_fields=["export_data"]) + except Exception as err: # pylint: disable=broad-except + logger.exception("User Export Job %s Failed with error: %s", job.id, err) + job.set_status("failed") + + job.set_status("complete") + + +def tar_export(json_data: str, user, file): + """wrap the export information in a tar file""" + file.open("wb") + with BookwyrmTarFile.open(mode="w:gz", fileobj=file) as tar: + tar.write_bytes(json_data.encode("utf-8")) + + # Add avatar image if present + if getattr(user, "avatar", False): + tar.add_image(user.avatar, filename="avatar") + + editions = get_books_for_user(user) + for book in editions: + if getattr(book, "cover", False): + tar.add_image(book.cover) + + file.close() + + +def json_export( + user, +): # pylint: disable=too-many-locals, too-many-statements, too-many-branches + """Generate an export for a user""" + + # User as AP object + exported_user = user.to_activity() + # I don't love this but it prevents a JSON encoding error + # when there is no user image + if isinstance( + exported_user["icon"], + dataclasses._MISSING_TYPE, # pylint: disable=protected-access + ): + exported_user["icon"] = {} + else: + # change the URL to be relative to the JSON file + file_type = exported_user["icon"]["url"].rsplit(".", maxsplit=1)[-1] + filename = f"avatar.{file_type}" + exported_user["icon"]["url"] = filename + + # Additional settings - can't be serialized as AP + vals = [ + "show_goal", + "preferred_timezone", + "default_post_privacy", + "show_suggested_users", + ] + exported_user["settings"] = {} + for k in vals: + exported_user["settings"][k] = getattr(user, k) + + # Reading goals - can't be serialized as AP + reading_goals = AnnualGoal.objects.filter(user=user).distinct() + exported_user["goals"] = [] + for goal in reading_goals: + exported_user["goals"].append( + {"goal": goal.goal, "year": goal.year, "privacy": goal.privacy} + ) + + # Reading history - can't be serialized as AP + readthroughs = ReadThrough.objects.filter(user=user).distinct().values() + readthroughs = list(readthroughs) + + # Books + editions = get_books_for_user(user) + exported_user["books"] = [] + + for edition in editions: + book = {} + book["work"] = edition.parent_work.to_activity() + book["edition"] = edition.to_activity() + + if book["edition"].get("cover"): + # change the URL to be relative to the JSON file + filename = book["edition"]["cover"]["url"].rsplit("/", maxsplit=1)[-1] + book["edition"]["cover"]["url"] = f"covers/{filename}" + + # authors + book["authors"] = [] + for author in edition.authors.all(): + book["authors"].append(author.to_activity()) + + # Shelves this book is on + # Every ShelfItem is this book so we don't other serializing + book["shelves"] = [] + shelf_books = ( + ShelfBook.objects.select_related("shelf") + .filter(user=user, book=edition) + .distinct() + ) + + for shelfbook in shelf_books: + book["shelves"].append(shelfbook.shelf.to_activity()) + + # Lists and ListItems + # ListItems include "notes" and "approved" so we need them + # even though we know it's this book + book["lists"] = [] + list_items = ListItem.objects.filter(book=edition, user=user).distinct() + + for item in list_items: + list_info = item.book_list.to_activity() + list_info[ + "privacy" + ] = item.book_list.privacy # this isn't serialized so we add it + list_info["list_item"] = item.to_activity() + book["lists"].append(list_info) + + # Statuses + # Can't use select_subclasses here because + # we need to filter on the "book" value, + # which is not available on an ordinary Status + for status in ["comments", "quotations", "reviews"]: + book[status] = [] + + comments = Comment.objects.filter(user=user, book=edition).all() + for status in comments: + obj = status.to_activity() + obj["progress"] = status.progress + obj["progress_mode"] = status.progress_mode + book["comments"].append(obj) + + quotes = Quotation.objects.filter(user=user, book=edition).all() + for status in quotes: + obj = status.to_activity() + obj["position"] = status.position + obj["endposition"] = status.endposition + obj["position_mode"] = status.position_mode + book["quotations"].append(obj) + + reviews = Review.objects.filter(user=user, book=edition).all() + for status in reviews: + obj = status.to_activity() + book["reviews"].append(obj) + + # readthroughs can't be serialized to activity + book_readthroughs = ( + ReadThrough.objects.filter(user=user, book=edition).distinct().values() + ) + book["readthroughs"] = list(book_readthroughs) + + # append everything + exported_user["books"].append(book) + + # saved book lists - just the remote id + saved_lists = List.objects.filter(id__in=user.saved_lists.all()).distinct() + exported_user["saved_lists"] = [l.remote_id for l in saved_lists] + + # follows - just the remote id + follows = UserFollows.objects.filter(user_subject=user).distinct() + following = User.objects.filter(userfollows_user_object__in=follows).distinct() + exported_user["follows"] = [f.remote_id for f in following] + + # blocks - just the remote id + blocks = UserBlocks.objects.filter(user_subject=user).distinct() + blocking = User.objects.filter(userblocks_user_object__in=blocks).distinct() + + exported_user["blocks"] = [b.remote_id for b in blocking] + + return DjangoJSONEncoder().encode(exported_user) + + +def get_books_for_user(user): + """Get all the books and editions related to a user""" + + editions = ( + Edition.objects.select_related("parent_work") + .filter( + Q(shelves__user=user) + | Q(readthrough__user=user) + | Q(review__user=user) + | Q(list__user=user) + | Q(comment__user=user) + | Q(quotation__user=user) + ) + .distinct() + ) + + return editions diff --git a/bookwyrm/models/bookwyrm_import_job.py b/bookwyrm/models/bookwyrm_import_job.py new file mode 100644 index 000000000..9a11fd932 --- /dev/null +++ b/bookwyrm/models/bookwyrm_import_job.py @@ -0,0 +1,459 @@ +"""Import a user from another Bookwyrm instance""" + +import json +import logging + +from django.db.models import FileField, JSONField, CharField +from django.utils import timezone +from django.utils.html import strip_tags +from django.contrib.postgres.fields import ArrayField as DjangoArrayField + +from bookwyrm import activitypub +from bookwyrm import models +from bookwyrm.tasks import app, IMPORTS +from bookwyrm.models.job import ParentJob, ParentTask, SubTask +from bookwyrm.utils.tar import BookwyrmTarFile + +logger = logging.getLogger(__name__) + + +class BookwyrmImportJob(ParentJob): + """entry for a specific request for importing a bookwyrm user backup""" + + archive_file = FileField(null=True, blank=True) + import_data = JSONField(null=True) + required = DjangoArrayField(CharField(max_length=50, blank=True), blank=True) + + def start_job(self): + """Start the job""" + start_import_task.delay(job_id=self.id, no_children=True) + + +@app.task(queue=IMPORTS, base=ParentTask) +def start_import_task(**kwargs): + """trigger the child import tasks for each user data""" + job = BookwyrmImportJob.objects.get(id=kwargs["job_id"]) + archive_file = job.archive_file + + # don't start the job if it was stopped from the UI + if job.complete: + return + + try: + archive_file.open("rb") + with BookwyrmTarFile.open(mode="r:gz", fileobj=archive_file) as tar: + job.import_data = json.loads(tar.read("archive.json").decode("utf-8")) + + if "include_user_profile" in job.required: + update_user_profile(job.user, tar, job.import_data) + if "include_user_settings" in job.required: + update_user_settings(job.user, job.import_data) + if "include_goals" in job.required: + update_goals(job.user, job.import_data.get("goals")) + if "include_saved_lists" in job.required: + upsert_saved_lists(job.user, job.import_data.get("saved_lists")) + if "include_follows" in job.required: + upsert_follows(job.user, job.import_data.get("follows")) + if "include_blocks" in job.required: + upsert_user_blocks(job.user, job.import_data.get("blocks")) + + process_books(job, tar) + + job.set_status("complete") + archive_file.close() + + except Exception as err: # pylint: disable=broad-except + logger.exception("User Import Job %s Failed with error: %s", job.id, err) + job.set_status("failed") + + +def process_books(job, tar): + """ + Process user import data related to books + We always import the books even if not assigning + them to shelves, lists etc + """ + + books = job.import_data.get("books") + + for data in books: + book = get_or_create_edition(data, tar) + + if "include_shelves" in job.required: + upsert_shelves(book, job.user, data) + + if "include_readthroughs" in job.required: + upsert_readthroughs(data.get("readthroughs"), job.user, book.id) + + if "include_comments" in job.required: + upsert_statuses( + job.user, models.Comment, data.get("comments"), book.remote_id + ) + if "include_quotations" in job.required: + upsert_statuses( + job.user, models.Quotation, data.get("quotations"), book.remote_id + ) + + if "include_reviews" in job.required: + upsert_statuses( + job.user, models.Review, data.get("reviews"), book.remote_id + ) + + if "include_lists" in job.required: + upsert_lists(job.user, data.get("lists"), book.id) + + +def get_or_create_edition(book_data, tar): + """Take a JSON string of work and edition data, + find or create the edition and work in the database and + return an edition instance""" + + edition = book_data.get("edition") + existing = models.Edition.find_existing(edition) + if existing: + return existing + + # make sure we have the authors in the local DB + # replace the old author ids in the edition JSON + edition["authors"] = [] + for author in book_data.get("authors"): + parsed_author = activitypub.parse(author) + instance = parsed_author.to_model( + model=models.Author, save=True, overwrite=True + ) + + edition["authors"].append(instance.remote_id) + + # we will add the cover later from the tar + # don't try to load it from the old server + cover = edition.get("cover", {}) + cover_path = cover.get("url", None) + edition["cover"] = {} + + # first we need the parent work to exist + work = book_data.get("work") + work["editions"] = [] + parsed_work = activitypub.parse(work) + work_instance = parsed_work.to_model(model=models.Work, save=True, overwrite=True) + + # now we have a work we can add it to the edition + # and create the edition model instance + edition["work"] = work_instance.remote_id + parsed_edition = activitypub.parse(edition) + book = parsed_edition.to_model(model=models.Edition, save=True, overwrite=True) + + # set the cover image from the tar + if cover_path: + tar.write_image_to_file(cover_path, book.cover) + + return book + + +def upsert_readthroughs(data, user, book_id): + """Take a JSON string of readthroughs and + find or create the instances in the database""" + + for read_through in data: + + obj = {} + keys = [ + "progress_mode", + "start_date", + "finish_date", + "stopped_date", + "is_active", + ] + for key in keys: + obj[key] = read_through[key] + obj["user_id"] = user.id + obj["book_id"] = book_id + + existing = models.ReadThrough.objects.filter(**obj).first() + if not existing: + models.ReadThrough.objects.create(**obj) + + +def upsert_statuses(user, cls, data, book_remote_id): + """Take a JSON string of a status and + find or create the instances in the database""" + + for status in data: + if is_alias( + user, status["attributedTo"] + ): # don't let l33t hax0rs steal other people's posts + # update ids and remove replies + status["attributedTo"] = user.remote_id + status["to"] = update_followers_address(user, status["to"]) + status["cc"] = update_followers_address(user, status["cc"]) + status[ + "replies" + ] = ( + {} + ) # this parses incorrectly but we can't set it without knowing the new id + status["inReplyToBook"] = book_remote_id + parsed = activitypub.parse(status) + if not status_already_exists( + user, parsed + ): # don't duplicate posts on multiple import + + instance = parsed.to_model(model=cls, save=True, overwrite=True) + + for val in [ + "progress", + "progress_mode", + "position", + "endposition", + "position_mode", + ]: + if status.get(val): + instance.val = status[val] + + instance.remote_id = instance.get_remote_id() # update the remote_id + instance.save() # save and broadcast + + else: + logger.info("User does not have permission to import statuses") + + +def upsert_lists(user, lists, book_id): + """Take a list of objects each containing + a list and list item as AP objects + + Because we are creating new IDs we can't assume the id + will exist or be accurate, so we only use to_model for + adding new items after checking whether they exist . + + """ + + book = models.Edition.objects.get(id=book_id) + + for blist in lists: + booklist = models.List.objects.filter(name=blist["name"], user=user).first() + if not booklist: + + blist["owner"] = user.remote_id + parsed = activitypub.parse(blist) + booklist = parsed.to_model(model=models.List, save=True, overwrite=True) + + booklist.privacy = blist["privacy"] + booklist.save() + + item = models.ListItem.objects.filter(book=book, book_list=booklist).exists() + if not item: + count = booklist.books.count() + models.ListItem.objects.create( + book=book, + book_list=booklist, + user=user, + notes=blist["list_item"]["notes"], + approved=blist["list_item"]["approved"], + order=count + 1, + ) + + +def upsert_shelves(book, user, book_data): + """Take shelf JSON objects and create + DB entries if they don't already exist""" + + shelves = book_data["shelves"] + for shelf in shelves: + + book_shelf = models.Shelf.objects.filter(name=shelf["name"], user=user).first() + + if not book_shelf: + book_shelf = models.Shelf.objects.create(name=shelf["name"], user=user) + + # add the book as a ShelfBook if needed + if not models.ShelfBook.objects.filter( + book=book, shelf=book_shelf, user=user + ).exists(): + models.ShelfBook.objects.create( + book=book, shelf=book_shelf, user=user, shelved_date=timezone.now() + ) + + +def update_user_profile(user, tar, data): + """update the user's profile from import data""" + name = data.get("name", None) + username = data.get("preferredUsername") + user.name = name if name else username + user.summary = strip_tags(data.get("summary", None)) + user.save(update_fields=["name", "summary"]) + if data["icon"].get("url"): + avatar_filename = next(filter(lambda n: n.startswith("avatar"), tar.getnames())) + tar.write_image_to_file(avatar_filename, user.avatar) + + +def update_user_settings(user, data): + """update the user's settings from import data""" + + update_fields = ["manually_approves_followers", "hide_follows", "discoverable"] + + ap_fields = [ + ("manuallyApprovesFollowers", "manually_approves_followers"), + ("hideFollows", "hide_follows"), + ("discoverable", "discoverable"), + ] + + for (ap_field, bw_field) in ap_fields: + setattr(user, bw_field, data[ap_field]) + + bw_fields = [ + "show_goal", + "show_suggested_users", + "default_post_privacy", + "preferred_timezone", + ] + + for field in bw_fields: + update_fields.append(field) + setattr(user, field, data["settings"][field]) + + user.save(update_fields=update_fields) + + +@app.task(queue=IMPORTS, base=SubTask) +def update_user_settings_task(job_id): + """wrapper task for user's settings import""" + parent_job = BookwyrmImportJob.objects.get(id=job_id) + + return update_user_settings(parent_job.user, parent_job.import_data.get("user")) + + +def update_goals(user, data): + """update the user's goals from import data""" + + for goal in data: + # edit the existing goal if there is one + existing = models.AnnualGoal.objects.filter( + year=goal["year"], user=user + ).first() + if existing: + for k in goal.keys(): + setattr(existing, k, goal[k]) + existing.save() + else: + goal["user"] = user + models.AnnualGoal.objects.create(**goal) + + +@app.task(queue=IMPORTS, base=SubTask) +def update_goals_task(job_id): + """wrapper task for user's goals import""" + parent_job = BookwyrmImportJob.objects.get(id=job_id) + + return update_goals(parent_job.user, parent_job.import_data.get("goals")) + + +def upsert_saved_lists(user, values): + """Take a list of remote ids and add as saved lists""" + + for remote_id in values: + book_list = activitypub.resolve_remote_id(remote_id, models.List) + if book_list: + user.saved_lists.add(book_list) + + +@app.task(queue=IMPORTS, base=SubTask) +def upsert_saved_lists_task(job_id): + """wrapper task for user's saved lists import""" + parent_job = BookwyrmImportJob.objects.get(id=job_id) + + return upsert_saved_lists( + parent_job.user, parent_job.import_data.get("saved_lists") + ) + + +def upsert_follows(user, values): + """Take a list of remote ids and add as follows""" + + for remote_id in values: + followee = activitypub.resolve_remote_id(remote_id, models.User) + if followee: + (follow_request, created,) = models.UserFollowRequest.objects.get_or_create( + user_subject=user, + user_object=followee, + ) + + if not created: + # this request probably failed to connect with the remote + # and should save to trigger a re-broadcast + follow_request.save() + + +@app.task(queue=IMPORTS, base=SubTask) +def upsert_follows_task(job_id): + """wrapper task for user's follows import""" + parent_job = BookwyrmImportJob.objects.get(id=job_id) + + return upsert_follows(parent_job.user, parent_job.import_data.get("follows")) + + +def upsert_user_blocks(user, user_ids): + """block users""" + + for user_id in user_ids: + user_object = activitypub.resolve_remote_id(user_id, models.User) + if user_object: + exists = models.UserBlocks.objects.filter( + user_subject=user, user_object=user_object + ).exists() + if not exists: + models.UserBlocks.objects.create( + user_subject=user, user_object=user_object + ) + # remove the blocked users's lists from the groups + models.List.remove_from_group(user, user_object) + # remove the blocked user from all blocker's owned groups + models.GroupMember.remove(user, user_object) + + +@app.task(queue=IMPORTS, base=SubTask) +def upsert_user_blocks_task(job_id): + """wrapper task for user's blocks import""" + parent_job = BookwyrmImportJob.objects.get(id=job_id) + + return upsert_user_blocks( + parent_job.user, parent_job.import_data.get("blocked_users") + ) + + +def update_followers_address(user, field): + """statuses to or cc followers need to have the followers + address updated to the new local user""" + + for i, audience in enumerate(field): + if audience.rsplit("/")[-1] == "followers": + field[i] = user.followers_url + + return field + + +def is_alias(user, remote_id): + """check that the user is listed as movedTo or also_known_as + in the remote user's profile""" + + remote_user = activitypub.resolve_remote_id( + remote_id=remote_id, model=models.User, save=False + ) + + if remote_user: + + if remote_user.moved_to: + return user.remote_id == remote_user.moved_to + + if remote_user.also_known_as: + return user in remote_user.also_known_as.all() + + return False + + +def status_already_exists(user, status): + """check whether this status has already been published + by this user. We can't rely on to_model() because it + only matches on remote_id, which we have to change + *after* saving because it needs the primary key (id)""" + + return models.Status.objects.filter( + user=user, content=status.content, published_date=status.published + ).exists() diff --git a/bookwyrm/models/fields.py b/bookwyrm/models/fields.py index 28effaf9b..4bd580705 100644 --- a/bookwyrm/models/fields.py +++ b/bookwyrm/models/fields.py @@ -20,6 +20,11 @@ from markdown import markdown from bookwyrm import activitypub from bookwyrm.connectors import get_image from bookwyrm.utils.sanitizer import clean +from bookwyrm.utils.partial_date import ( + PartialDate, + PartialDateModel, + from_partial_isoformat, +) from bookwyrm.settings import MEDIA_FULL_URL @@ -483,10 +488,12 @@ class ImageField(ActivitypubFieldMixin, models.ImageField): image_slug = value # when it's an inline image (User avatar/icon, Book cover), it's a json # blob, but when it's an attached image, it's just a url - if hasattr(image_slug, "url"): - url = image_slug.url - elif isinstance(image_slug, str): + if isinstance(image_slug, str): url = image_slug + elif isinstance(image_slug, dict): + url = image_slug.get("url") + elif hasattr(image_slug, "url"): # Serialized to Image/Document object? + url = image_slug.url else: return None @@ -537,7 +544,6 @@ class DateTimeField(ActivitypubFieldMixin, models.DateTimeField): def field_from_activity(self, value, allow_external_connections=True): missing_fields = datetime(1970, 1, 1) # "2022-10" => "2022-10-01" try: - # TODO(dato): investigate `ignoretz=True` wrt bookwyrm#3028. date_value = dateutil.parser.parse(value, default=missing_fields) try: return timezone.make_aware(date_value) @@ -547,6 +553,37 @@ class DateTimeField(ActivitypubFieldMixin, models.DateTimeField): return None +class PartialDateField(ActivitypubFieldMixin, PartialDateModel): + """activitypub-aware partial date field""" + + def field_to_activity(self, value) -> str: + return value.partial_isoformat() if value else None + + def field_from_activity(self, value, allow_external_connections=True): + # pylint: disable=no-else-return + try: + return from_partial_isoformat(value) + except ValueError: + pass + + # fallback to full ISO-8601 parsing + try: + parsed = dateutil.parser.isoparse(value) + except (ValueError, ParserError): + return None + + if timezone.is_aware(parsed): + return PartialDate.from_datetime(parsed) + else: + # Should not happen on the wire, but truncate down to date parts. + return PartialDate.from_date_parts(parsed.year, parsed.month, parsed.day) + + # FIXME: decide whether to fix timestamps like "2023-09-30T21:00:00-03": + # clearly Oct 1st, not Sep 30th (an unwanted side-effect of USE_TZ). It's + # basically the remnants of #3028; there is a data migration pending (see …) + # but over the wire we might get these for an indeterminate amount of time. + + class HtmlField(ActivitypubFieldMixin, models.TextField): """a text field for storing html""" diff --git a/bookwyrm/models/group.py b/bookwyrm/models/group.py index 003b23d02..d02b56ab1 100644 --- a/bookwyrm/models/group.py +++ b/bookwyrm/models/group.py @@ -1,5 +1,4 @@ """ do book related things with other users """ -from django.apps import apps from django.db import models, IntegrityError, transaction from django.db.models import Q from bookwyrm.settings import DOMAIN @@ -143,26 +142,28 @@ class GroupMemberInvitation(models.Model): @transaction.atomic def accept(self): """turn this request into the real deal""" + # pylint: disable-next=import-outside-toplevel + from .notification import Notification, NotificationType # circular dependency + GroupMember.from_request(self) - model = apps.get_model("bookwyrm.Notification", require_ready=True) # tell the group owner - model.notify( + Notification.notify( self.group.user, self.user, related_group=self.group, - notification_type=model.ACCEPT, + notification_type=NotificationType.ACCEPT, ) # let the other members know about it for membership in self.group.memberships.all(): member = membership.user if member not in (self.user, self.group.user): - model.notify( + Notification.notify( member, self.user, related_group=self.group, - notification_type=model.JOIN, + notification_type=NotificationType.JOIN, ) def reject(self): diff --git a/bookwyrm/models/job.py b/bookwyrm/models/job.py new file mode 100644 index 000000000..4f5cb2093 --- /dev/null +++ b/bookwyrm/models/job.py @@ -0,0 +1,308 @@ +"""Everything needed for Celery to multi-thread complex tasks.""" + +from django.db import models +from django.db import transaction +from django.utils.translation import gettext_lazy as _ +from django.utils import timezone +from bookwyrm.models.user import User + +from bookwyrm.tasks import app + + +class Job(models.Model): + """Abstract model to store the state of a Task.""" + + class Status(models.TextChoices): + """Possible job states.""" + + PENDING = "pending", _("Pending") + ACTIVE = "active", _("Active") + COMPLETE = "complete", _("Complete") + STOPPED = "stopped", _("Stopped") + FAILED = "failed", _("Failed") + + task_id = models.UUIDField(unique=True, null=True, blank=True) + + created_date = models.DateTimeField(default=timezone.now) + updated_date = models.DateTimeField(default=timezone.now) + complete = models.BooleanField(default=False) + status = models.CharField( + max_length=50, choices=Status.choices, default=Status.PENDING, null=True + ) + + class Meta: + """Make it abstract""" + + abstract = True + + def complete_job(self): + """Report that the job has completed""" + if self.complete: + return + + self.status = self.Status.COMPLETE + self.complete = True + self.updated_date = timezone.now() + + self.save(update_fields=["status", "complete", "updated_date"]) + + def stop_job(self, reason=None): + """Stop the job""" + if self.complete: + return + + self.__terminate_job() + + if reason and reason == "failed": + self.status = self.Status.FAILED + else: + self.status = self.Status.STOPPED + self.complete = True + self.updated_date = timezone.now() + + self.save(update_fields=["status", "complete", "updated_date"]) + + def set_status(self, status): + """Set job status""" + if self.complete: + return + + if self.status == status: + return + + if status == self.Status.COMPLETE: + self.complete_job() + return + + if status == self.Status.STOPPED: + self.stop_job() + return + + if status == self.Status.FAILED: + self.stop_job(reason="failed") + return + + self.updated_date = timezone.now() + self.status = status + + self.save(update_fields=["status", "updated_date"]) + + def __terminate_job(self): + """Tell workers to ignore and not execute this task.""" + app.control.revoke(self.task_id, terminate=True) + + +class ParentJob(Job): + """Store the state of a Task which can spawn many :model:`ChildJob`s to spread + resource load. + + Intended to be sub-classed if necessary via proxy or + multi-table inheritance. + Extends :model:`Job`. + """ + + user = models.ForeignKey(User, on_delete=models.CASCADE) + + def complete_job(self): + """Report that the job has completed and stop pending + children. Extend. + """ + super().complete_job() + self.__terminate_pending_child_jobs() + + def notify_child_job_complete(self): + """let the job know when the items get work done""" + if self.complete: + return + + self.updated_date = timezone.now() + self.save(update_fields=["updated_date"]) + + if not self.complete and self.has_completed: + self.complete_job() + + def __terminate_job(self): # pylint: disable=unused-private-member + """Tell workers to ignore and not execute this task + & pending child tasks. Extend. + """ + super().__terminate_job() + self.__terminate_pending_child_jobs() + + def __terminate_pending_child_jobs(self): + """Tell workers to ignore and not execute any pending child tasks.""" + tasks = self.pending_child_jobs.filter(task_id__isnull=False).values_list( + "task_id", flat=True + ) + app.control.revoke(list(tasks)) + + for task in self.pending_child_jobs: + task.update(status=self.Status.STOPPED) + + @property + def has_completed(self): + """has this job finished""" + return not self.pending_child_jobs.exists() + + @property + def pending_child_jobs(self): + """items that haven't been processed yet""" + return self.child_jobs.filter(complete=False) + + +class ChildJob(Job): + """Stores the state of a Task for the related :model:`ParentJob`. + + Intended to be sub-classed if necessary via proxy or + multi-table inheritance. + Extends :model:`Job`. + """ + + parent_job = models.ForeignKey( + ParentJob, on_delete=models.CASCADE, related_name="child_jobs" + ) + + def set_status(self, status): + """Set job and parent_job status. Extend.""" + super().set_status(status) + + if ( + status == self.Status.ACTIVE + and self.parent_job.status == self.Status.PENDING + ): + self.parent_job.set_status(self.Status.ACTIVE) + + def complete_job(self): + """Report to parent_job that the job has completed. Extend.""" + super().complete_job() + self.parent_job.notify_child_job_complete() + + +class ParentTask(app.Task): + """Used with ParentJob, Abstract Tasks execute code at specific points in + a Task's lifecycle, applying to all Tasks with the same 'base'. + + All status & ParentJob.task_id assignment is managed here for you. + Usage e.g. @app.task(base=ParentTask) + """ + + def before_start( + self, task_id, args, kwargs + ): # pylint: disable=no-self-use, unused-argument + """Handler called before the task starts. Override. + + Prepare ParentJob before the task starts. + + Arguments: + task_id (str): Unique id of the task to execute. + args (Tuple): Original arguments for the task to execute. + kwargs (Dict): Original keyword arguments for the task to execute. + + Keyword Arguments: + job_id (int): Unique 'id' of the ParentJob. + no_children (bool): If 'True' this is the only Task expected to run + for the given ParentJob. + + Returns: + None: The return value of this handler is ignored. + """ + job = ParentJob.objects.get(id=kwargs["job_id"]) + job.task_id = task_id + job.save(update_fields=["task_id"]) + + if kwargs["no_children"]: + job.set_status(ChildJob.Status.ACTIVE) + + def on_success( + self, retval, task_id, args, kwargs + ): # pylint: disable=no-self-use, unused-argument + """Run by the worker if the task executes successfully. Override. + + Update ParentJob on Task complete. + + Arguments: + retval (Any): The return value of the task. + task_id (str): Unique id of the executed task. + args (Tuple): Original arguments for the executed task. + kwargs (Dict): Original keyword arguments for the executed task. + + Keyword Arguments: + job_id (int): Unique 'id' of the ParentJob. + no_children (bool): If 'True' this is the only Task expected to run + for the given ParentJob. + + Returns: + None: The return value of this handler is ignored. + """ + + if kwargs["no_children"]: + job = ParentJob.objects.get(id=kwargs["job_id"]) + job.complete_job() + + +class SubTask(app.Task): + """Used with ChildJob, Abstract Tasks execute code at specific points in + a Task's lifecycle, applying to all Tasks with the same 'base'. + + All status & ChildJob.task_id assignment is managed here for you. + Usage e.g. @app.task(base=SubTask) + """ + + def before_start( + self, task_id, args, kwargs + ): # pylint: disable=no-self-use, unused-argument + """Handler called before the task starts. Override. + + Prepare ChildJob before the task starts. + + Arguments: + task_id (str): Unique id of the task to execute. + args (Tuple): Original arguments for the task to execute. + kwargs (Dict): Original keyword arguments for the task to execute. + + Keyword Arguments: + job_id (int): Unique 'id' of the ParentJob. + child_id (int): Unique 'id' of the ChildJob. + + Returns: + None: The return value of this handler is ignored. + """ + child_job = ChildJob.objects.get(id=kwargs["child_id"]) + child_job.task_id = task_id + child_job.save(update_fields=["task_id"]) + child_job.set_status(ChildJob.Status.ACTIVE) + + def on_success( + self, retval, task_id, args, kwargs + ): # pylint: disable=no-self-use, unused-argument + """Run by the worker if the task executes successfully. Override. + + Notify ChildJob of task completion. + + Arguments: + retval (Any): The return value of the task. + task_id (str): Unique id of the executed task. + args (Tuple): Original arguments for the executed task. + kwargs (Dict): Original keyword arguments for the executed task. + + Keyword Arguments: + job_id (int): Unique 'id' of the ParentJob. + child_id (int): Unique 'id' of the ChildJob. + + Returns: + None: The return value of this handler is ignored. + """ + subtask = ChildJob.objects.get(id=kwargs["child_id"]) + subtask.complete_job() + + +@transaction.atomic +def create_child_job(parent_job, task_callback): + """Utility method for creating a ChildJob + and running a task to avoid DB race conditions + """ + child_job = ChildJob.objects.create(parent_job=parent_job) + transaction.on_commit( + lambda: task_callback.delay(job_id=parent_job.id, child_id=child_job.id) + ) + + return child_job diff --git a/bookwyrm/models/move.py b/bookwyrm/models/move.py new file mode 100644 index 000000000..d6d8ef78f --- /dev/null +++ b/bookwyrm/models/move.py @@ -0,0 +1,71 @@ +""" move an object including migrating a user account """ +from django.core.exceptions import PermissionDenied +from django.db import models + +from bookwyrm import activitypub +from .activitypub_mixin import ActivityMixin +from .base_model import BookWyrmModel +from . import fields +from .notification import Notification, NotificationType + + +class Move(ActivityMixin, BookWyrmModel): + """migrating an activitypub user account""" + + user = fields.ForeignKey( + "User", on_delete=models.PROTECT, activitypub_field="actor" + ) + + object = fields.CharField( + max_length=255, + blank=False, + null=False, + activitypub_field="object", + ) + + origin = fields.CharField( + max_length=255, + blank=True, + null=True, + default="", + activitypub_field="origin", + ) + + activity_serializer = activitypub.Move + + +class MoveUser(Move): + """migrating an activitypub user account""" + + target = fields.ForeignKey( + "User", + on_delete=models.PROTECT, + related_name="move_target", + activitypub_field="target", + ) + + def save(self, *args, **kwargs): + """update user info and broadcast it""" + + # only allow if the source is listed in the target's alsoKnownAs + if self.user in self.target.also_known_as.all(): + self.user.also_known_as.add(self.target.id) + self.user.update_active_date() + self.user.moved_to = self.target.remote_id + self.user.save(update_fields=["moved_to"]) + + if self.user.local: + kwargs[ + "broadcast" + ] = True # Only broadcast if we are initiating the Move + + super().save(*args, **kwargs) + + for follower in self.user.followers.all(): + if follower.local: + Notification.notify( + follower, self.user, notification_type=NotificationType.MOVE + ) + + else: + raise PermissionDenied() diff --git a/bookwyrm/models/notification.py b/bookwyrm/models/notification.py index 522038f9a..ca1e2aeb0 100644 --- a/bookwyrm/models/notification.py +++ b/bookwyrm/models/notification.py @@ -1,12 +1,21 @@ """ alert a user to activity """ from django.db import models, transaction from django.dispatch import receiver +from bookwyrm.models.bookwyrm_export_job import BookwyrmExportJob from .base_model import BookWyrmModel -from . import Boost, Favorite, GroupMemberInvitation, ImportJob, LinkDomain +from . import ( + Boost, + Favorite, + GroupMemberInvitation, + ImportJob, + BookwyrmImportJob, + LinkDomain, +) from . import ListItem, Report, Status, User, UserFollowRequest +from .site import InviteRequest -class Notification(BookWyrmModel): +class NotificationType(models.TextChoices): """you've been tagged, liked, followed, etc""" # Status interactions @@ -22,6 +31,8 @@ class Notification(BookWyrmModel): # Imports IMPORT = "IMPORT" + USER_IMPORT = "USER_IMPORT" + USER_EXPORT = "USER_EXPORT" # List activity ADD = "ADD" @@ -29,6 +40,7 @@ class Notification(BookWyrmModel): # Admin REPORT = "REPORT" LINK_DOMAIN = "LINK_DOMAIN" + INVITE_REQUEST = "INVITE_REQUEST" # Groups INVITE = "INVITE" @@ -40,12 +52,12 @@ class Notification(BookWyrmModel): GROUP_NAME = "GROUP_NAME" GROUP_DESCRIPTION = "GROUP_DESCRIPTION" - # pylint: disable=line-too-long - NotificationType = models.TextChoices( - # there has got be a better way to do this - "NotificationType", - f"{FAVORITE} {REPLY} {MENTION} {TAG} {FOLLOW} {FOLLOW_REQUEST} {BOOST} {IMPORT} {ADD} {REPORT} {LINK_DOMAIN} {INVITE} {ACCEPT} {JOIN} {LEAVE} {REMOVE} {GROUP_PRIVACY} {GROUP_NAME} {GROUP_DESCRIPTION}", - ) + # Migrations + MOVE = "MOVE" + + +class Notification(BookWyrmModel): + """a notification object""" user = models.ForeignKey("User", on_delete=models.CASCADE) read = models.BooleanField(default=False) @@ -61,11 +73,15 @@ class Notification(BookWyrmModel): ) related_status = models.ForeignKey("Status", on_delete=models.CASCADE, null=True) related_import = models.ForeignKey("ImportJob", on_delete=models.CASCADE, null=True) + related_user_export = models.ForeignKey( + "BookwyrmExportJob", on_delete=models.CASCADE, null=True + ) related_list_items = models.ManyToManyField( "ListItem", symmetrical=False, related_name="notifications" ) - related_reports = models.ManyToManyField("Report", symmetrical=False) - related_link_domains = models.ManyToManyField("LinkDomain", symmetrical=False) + related_reports = models.ManyToManyField("Report") + related_link_domains = models.ManyToManyField("LinkDomain") + related_invite_requests = models.ManyToManyField("InviteRequest") @classmethod @transaction.atomic @@ -90,11 +106,11 @@ class Notification(BookWyrmModel): user=user, related_users=related_user, related_list_items__book_list=list_item.book_list, - notification_type=Notification.ADD, + notification_type=NotificationType.ADD, ).first() if not notification: notification = cls.objects.create( - user=user, notification_type=Notification.ADD + user=user, notification_type=NotificationType.ADD ) notification.related_users.add(related_user) notification.related_list_items.add(list_item) @@ -121,7 +137,7 @@ def notify_on_fav(sender, instance, *args, **kwargs): instance.status.user, instance.user, related_status=instance.status, - notification_type=Notification.FAVORITE, + notification_type=NotificationType.FAVORITE, ) @@ -135,7 +151,7 @@ def notify_on_unfav(sender, instance, *args, **kwargs): instance.status.user, instance.user, related_status=instance.status, - notification_type=Notification.FAVORITE, + notification_type=NotificationType.FAVORITE, ) @@ -160,7 +176,7 @@ def notify_user_on_mention(sender, instance, *args, **kwargs): instance.reply_parent.user, instance.user, related_status=instance, - notification_type=Notification.REPLY, + notification_type=NotificationType.REPLY, ) for mention_user in instance.mention_users.all(): @@ -172,7 +188,7 @@ def notify_user_on_mention(sender, instance, *args, **kwargs): Notification.notify( mention_user, instance.user, - notification_type=Notification.MENTION, + notification_type=NotificationType.MENTION, related_status=instance, ) @@ -191,7 +207,7 @@ def notify_user_on_boost(sender, instance, *args, **kwargs): instance.boosted_status.user, instance.user, related_status=instance.boosted_status, - notification_type=Notification.BOOST, + notification_type=NotificationType.BOOST, ) @@ -203,7 +219,7 @@ def notify_user_on_unboost(sender, instance, *args, **kwargs): instance.boosted_status.user, instance.user, related_status=instance.boosted_status, - notification_type=Notification.BOOST, + notification_type=NotificationType.BOOST, ) @@ -218,11 +234,41 @@ def notify_user_on_import_complete( return Notification.objects.get_or_create( user=instance.user, - notification_type=Notification.IMPORT, + notification_type=NotificationType.IMPORT, related_import=instance, ) +@receiver(models.signals.post_save, sender=BookwyrmImportJob) +# pylint: disable=unused-argument +def notify_user_on_user_import_complete( + sender, instance, *args, update_fields=None, **kwargs +): + """we imported your user details! aren't you proud of us""" + update_fields = update_fields or [] + if not instance.complete or "complete" not in update_fields: + return + Notification.objects.create( + user=instance.user, notification_type=NotificationType.USER_IMPORT + ) + + +@receiver(models.signals.post_save, sender=BookwyrmExportJob) +# pylint: disable=unused-argument +def notify_user_on_user_export_complete( + sender, instance, *args, update_fields=None, **kwargs +): + """we exported your user details! aren't you proud of us""" + update_fields = update_fields or [] + if not instance.complete or "complete" not in update_fields: + return + Notification.objects.create( + user=instance.user, + notification_type=NotificationType.USER_EXPORT, + related_user_export=instance, + ) + + @receiver(models.signals.post_save, sender=Report) @transaction.atomic # pylint: disable=unused-argument @@ -233,11 +279,10 @@ def notify_admins_on_report(sender, instance, created, *args, **kwargs): return # moderators and superusers should be notified - admins = User.admins() - for admin in admins: + for admin in User.admins(): notification, _ = Notification.objects.get_or_create( user=admin, - notification_type=Notification.REPORT, + notification_type=NotificationType.REPORT, read=False, ) notification.related_reports.add(instance) @@ -253,16 +298,33 @@ def notify_admins_on_link_domain(sender, instance, created, *args, **kwargs): return # moderators and superusers should be notified - admins = User.admins() - for admin in admins: + for admin in User.admins(): notification, _ = Notification.objects.get_or_create( user=admin, - notification_type=Notification.LINK_DOMAIN, + notification_type=NotificationType.LINK_DOMAIN, read=False, ) notification.related_link_domains.add(instance) +@receiver(models.signals.post_save, sender=InviteRequest) +@transaction.atomic +# pylint: disable=unused-argument +def notify_admins_on_invite_request(sender, instance, created, *args, **kwargs): + """need to handle a new invite request""" + if not created: + return + + # moderators and superusers should be notified + for admin in User.admins(): + notification, _ = Notification.objects.get_or_create( + user=admin, + notification_type=NotificationType.INVITE_REQUEST, + read=False, + ) + notification.related_invite_requests.add(instance) + + @receiver(models.signals.post_save, sender=GroupMemberInvitation) # pylint: disable=unused-argument def notify_user_on_group_invite(sender, instance, *args, **kwargs): @@ -271,7 +333,7 @@ def notify_user_on_group_invite(sender, instance, *args, **kwargs): instance.user, instance.group.user, related_group=instance.group, - notification_type=Notification.INVITE, + notification_type=NotificationType.INVITE, ) @@ -309,11 +371,12 @@ def notify_user_on_follow(sender, instance, created, *args, **kwargs): notification = Notification.objects.filter( user=instance.user_object, related_users=instance.user_subject, - notification_type=Notification.FOLLOW_REQUEST, + notification_type=NotificationType.FOLLOW_REQUEST, ).first() if not notification: notification = Notification.objects.create( - user=instance.user_object, notification_type=Notification.FOLLOW_REQUEST + user=instance.user_object, + notification_type=NotificationType.FOLLOW_REQUEST, ) notification.related_users.set([instance.user_subject]) notification.read = False @@ -323,6 +386,6 @@ def notify_user_on_follow(sender, instance, created, *args, **kwargs): Notification.notify( instance.user_object, instance.user_subject, - notification_type=Notification.FOLLOW, + notification_type=NotificationType.FOLLOW, read=False, ) diff --git a/bookwyrm/models/relationship.py b/bookwyrm/models/relationship.py index 7af6ad5ab..3386a02dc 100644 --- a/bookwyrm/models/relationship.py +++ b/bookwyrm/models/relationship.py @@ -65,6 +65,13 @@ class UserRelationship(BookWyrmModel): base_path = self.user_subject.remote_id return f"{base_path}#follows/{self.id}" + def get_accept_reject_id(self, status): + """get id for sending an accept or reject of a local user""" + + base_path = self.user_object.remote_id + status_id = self.id or 0 + return f"{base_path}#{status}/{status_id}" + class UserFollows(ActivityMixin, UserRelationship): """Following a user""" @@ -105,6 +112,20 @@ class UserFollows(ActivityMixin, UserRelationship): ) return obj + def reject(self): + """generate a Reject for this follow. This would normally happen + when a user deletes a follow they previously accepted""" + + if self.user_object.local: + activity = activitypub.Reject( + id=self.get_accept_reject_id(status="rejects"), + actor=self.user_object.remote_id, + object=self.to_activity(), + ).serialize() + self.broadcast(activity, self.user_object) + + self.delete() + class UserFollowRequest(ActivitypubMixin, UserRelationship): """following a user requires manual or automatic confirmation""" @@ -148,13 +169,6 @@ class UserFollowRequest(ActivitypubMixin, UserRelationship): if not manually_approves: self.accept() - def get_accept_reject_id(self, status): - """get id for sending an accept or reject of a local user""" - - base_path = self.user_object.remote_id - status_id = self.id or 0 - return f"{base_path}#{status}/{status_id}" - def accept(self, broadcast_only=False): """turn this request into the real deal""" user = self.user_object diff --git a/bookwyrm/models/site.py b/bookwyrm/models/site.py index a27c4b70d..8075b6434 100644 --- a/bookwyrm/models/site.py +++ b/bookwyrm/models/site.py @@ -96,6 +96,8 @@ class SiteSettings(SiteModel): imports_enabled = models.BooleanField(default=True) import_size_limit = models.IntegerField(default=0) import_limit_reset = models.IntegerField(default=0) + user_exports_enabled = models.BooleanField(default=False) + user_import_time_limit = models.IntegerField(default=48) field_tracker = FieldTracker(fields=["name", "instance_tagline", "logo"]) @@ -149,6 +151,7 @@ class Theme(SiteModel): created_date = models.DateTimeField(auto_now_add=True) name = models.CharField(max_length=50, unique=True) path = models.CharField(max_length=50, unique=True) + loads = models.BooleanField(null=True, blank=True) def __str__(self): # pylint: disable=invalid-str-returned diff --git a/bookwyrm/models/status.py b/bookwyrm/models/status.py index 11646431b..cc44fe2bf 100644 --- a/bookwyrm/models/status.py +++ b/bookwyrm/models/status.py @@ -102,7 +102,7 @@ class Status(OrderedCollectionPageMixin, BookWyrmModel): if hasattr(self, "quotation"): self.quotation = None # pylint: disable=attribute-defined-outside-init self.deleted_date = timezone.now() - self.save() + self.save(*args, **kwargs) @property def recipients(self): diff --git a/bookwyrm/models/user.py b/bookwyrm/models/user.py index 6e0912aec..89fd39b73 100644 --- a/bookwyrm/models/user.py +++ b/bookwyrm/models/user.py @@ -1,13 +1,14 @@ """ database schema for user data """ import re from urllib.parse import urlparse +from uuid import uuid4 from django.apps import apps from django.contrib.auth.models import AbstractUser from django.contrib.postgres.fields import ArrayField, CICharField from django.core.exceptions import PermissionDenied, ObjectDoesNotExist from django.dispatch import receiver -from django.db import models, transaction +from django.db import models, transaction, IntegrityError from django.utils import timezone from django.utils.translation import gettext_lazy as _ from model_utils import FieldTracker @@ -53,6 +54,7 @@ class User(OrderedCollectionPageMixin, AbstractUser): username = fields.UsernameField() email = models.EmailField(unique=True, null=True) + is_deleted = models.BooleanField(default=False) key_pair = fields.OneToOneField( "KeyPair", @@ -140,6 +142,19 @@ class User(OrderedCollectionPageMixin, AbstractUser): theme = models.ForeignKey("Theme", null=True, blank=True, on_delete=models.SET_NULL) hide_follows = fields.BooleanField(default=False) + # migration fields + + moved_to = fields.RemoteIdField( + null=True, unique=False, activitypub_field="movedTo", deduplication_field=False + ) + also_known_as = fields.ManyToManyField( + "self", + symmetrical=False, + unique=False, + activitypub_field="alsoKnownAs", + deduplication_field=False, + ) + # options to turn features on and off show_goal = models.BooleanField(default=True) show_suggested_users = models.BooleanField(default=True) @@ -314,6 +329,8 @@ class User(OrderedCollectionPageMixin, AbstractUser): "schema": "http://schema.org#", "PropertyValue": "schema:PropertyValue", "value": "schema:value", + "alsoKnownAs": {"@id": "as:alsoKnownAs", "@type": "@id"}, + "movedTo": {"@id": "as:movedTo", "@type": "@id"}, }, ] return activity_object @@ -379,9 +396,44 @@ class User(OrderedCollectionPageMixin, AbstractUser): """We don't actually delete the database entry""" # pylint: disable=attribute-defined-outside-init self.is_active = False - self.avatar = "" + self.allow_reactivation = False + self.is_deleted = True + + self.erase_user_data() + self.erase_user_statuses() + # skip the logic in this class's save() - super().save(*args, **kwargs) + super().save( + *args, + **kwargs, + ) + + def erase_user_data(self): + """Wipe a user's custom data""" + if not self.is_deleted: + raise IntegrityError( + "Trying to erase user data on user that is not deleted" + ) + + # mangle email address + self.email = f"{uuid4()}@deleted.user" + + # erase data fields + self.avatar = "" + self.preview_image = "" + self.summary = None + self.name = None + self.favorites.set([]) + + def erase_user_statuses(self, broadcast=True): + """Wipe the data on all the user's statuses""" + if not self.is_deleted: + raise IntegrityError( + "Trying to erase user data on user that is not deleted" + ) + + for status in self.status_set.all(): + status.delete(broadcast=broadcast) def deactivate(self): """Disable the user but allow them to reactivate""" @@ -471,6 +523,20 @@ class KeyPair(ActivitypubMixin, BookWyrmModel): return super().save(*args, **kwargs) +@app.task(queue=MISC) +def erase_user_data(user_id): + """Erase any custom data about this user asynchronously + This is for deleted historical user data that pre-dates data + being cleared automatically""" + user = User.objects.get(id=user_id) + user.erase_user_data() + user.save( + broadcast=False, + update_fields=["email", "avatar", "preview_image", "summary", "name"], + ) + user.erase_user_statuses(broadcast=False) + + @app.task(queue=MISC) def set_remote_server(user_id, allow_external_connections=False): """figure out the user's remote server in the background""" diff --git a/bookwyrm/settings.py b/bookwyrm/settings.py index 4af7afb14..df73f92a5 100644 --- a/bookwyrm/settings.py +++ b/bookwyrm/settings.py @@ -34,7 +34,7 @@ DEFAULT_LANGUAGE = env("DEFAULT_LANGUAGE", "English") # is implemented (see bookwyrm-social#2278, bookwyrm-social#3082). SESSION_COOKIE_AGE = env.int("SESSION_COOKIE_AGE", 3600 * 24 * 30) # 1 month -JS_CACHE = "ac315a3b" +JS_CACHE = "8a89cad7" # email EMAIL_BACKEND = env("EMAIL_BACKEND", "django.core.mail.backends.smtp.EmailBackend") @@ -102,6 +102,7 @@ INSTALLED_APPS = [ "django.contrib.messages", "django.contrib.staticfiles", "django.contrib.humanize", + "file_resubmit", "sass_processor", "bookwyrm", "celery", @@ -122,6 +123,7 @@ MIDDLEWARE = [ "bookwyrm.middleware.IPBlocklistMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", + "bookwyrm.middleware.FileTooBig", ] ROOT_URLCONF = "bookwyrm.urls" @@ -245,7 +247,11 @@ if env.bool("USE_DUMMY_CACHE", False): CACHES = { "default": { "BACKEND": "django.core.cache.backends.dummy.DummyCache", - } + }, + "file_resubmit": { + "BACKEND": "django.core.cache.backends.dummy.DummyCache", + "LOCATION": "/tmp/file_resubmit_tests/", + }, } else: CACHES = { @@ -255,7 +261,11 @@ else: "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", }, - } + }, + "file_resubmit": { + "BACKEND": "django.core.cache.backends.filebased.FileBasedCache", + "LOCATION": "/tmp/file_resubmit/", + }, } SESSION_ENGINE = "django.contrib.sessions.backends.cache" @@ -321,6 +331,7 @@ LANGUAGES = [ ("pt-pt", _("Português Europeu (European Portuguese)")), ("ro-ro", _("Română (Romanian)")), ("sv-se", _("Svenska (Swedish)")), + ("uk-ua", _("Українська (Ukrainian)")), ("zh-hans", _("简体中文 (Simplified Chinese)")), ("zh-hant", _("繁體中文 (Traditional Chinese)")), ] @@ -369,9 +380,9 @@ if USE_S3: AWS_ACCESS_KEY_ID = env("AWS_ACCESS_KEY_ID") AWS_SECRET_ACCESS_KEY = env("AWS_SECRET_ACCESS_KEY") AWS_STORAGE_BUCKET_NAME = env("AWS_STORAGE_BUCKET_NAME") - AWS_S3_CUSTOM_DOMAIN = env("AWS_S3_CUSTOM_DOMAIN") + AWS_S3_CUSTOM_DOMAIN = env("AWS_S3_CUSTOM_DOMAIN", None) AWS_S3_REGION_NAME = env("AWS_S3_REGION_NAME", "") - AWS_S3_ENDPOINT_URL = env("AWS_S3_ENDPOINT_URL") + AWS_S3_ENDPOINT_URL = env("AWS_S3_ENDPOINT_URL", None) AWS_DEFAULT_ACL = "public-read" AWS_S3_OBJECT_PARAMETERS = {"CacheControl": "max-age=86400"} # S3 Static settings @@ -434,3 +445,5 @@ if HTTP_X_FORWARDED_PROTO: # Do not change this setting unless you already have an existing # user with the same username - in which case you should change it! INSTANCE_ACTOR_USERNAME = "bookwyrm.instance.actor" + +DATA_UPLOAD_MAX_MEMORY_SIZE = env.int("DATA_UPLOAD_MAX_MEMORY_SIZE", (1024**2 * 100)) diff --git a/bookwyrm/suggested_users.py b/bookwyrm/suggested_users.py index 3e9bef9c4..a13ee97fd 100644 --- a/bookwyrm/suggested_users.py +++ b/bookwyrm/suggested_users.py @@ -8,6 +8,7 @@ from opentelemetry import trace from bookwyrm import models from bookwyrm.redis_store import RedisStore, r +from bookwyrm.settings import INSTANCE_ACTOR_USERNAME from bookwyrm.tasks import app, SUGGESTED_USERS from bookwyrm.telemetry import open_telemetry @@ -98,9 +99,15 @@ class SuggestedUsers(RedisStore): for (pk, score) in values ] # annotate users with mutuals and shared book counts - users = models.User.objects.filter( - is_active=True, bookwyrm_user=True, id__in=[pk for (pk, _) in values] - ).annotate(mutuals=Case(*annotations, output_field=IntegerField(), default=0)) + users = ( + models.User.objects.filter( + is_active=True, bookwyrm_user=True, id__in=[pk for (pk, _) in values] + ) + .annotate( + mutuals=Case(*annotations, output_field=IntegerField(), default=0) + ) + .exclude(localname=INSTANCE_ACTOR_USERNAME) + ) if local: users = users.filter(local=True) return users.order_by("-mutuals")[:5] diff --git a/bookwyrm/templates/403.html b/bookwyrm/templates/403.html new file mode 100644 index 000000000..0b78bc6b8 --- /dev/null +++ b/bookwyrm/templates/403.html @@ -0,0 +1,20 @@ +{% extends 'layout.html' %} +{% load i18n %} +{% load utilities %} + +{% block title %}{% trans "Oh no!" %}{% endblock %} + +{% block content %} +
+ {% blocktrans trimmed with level=request.user|get_user_permission %}
+ You do not have permission to view this page or perform this action. Your user permission level is {{ level }}
.
+ {% endblocktrans %}
+
{% trans "If you think you should have access, please speak to your BookWyrm server administrator." %} +
+ +{% trans "The file you are uploading is too large." %}
+
+ {% blocktrans %}
+ You you can try using a smaller file, or ask your BookWyrm server administrator to increase the DATA_UPLOAD_MAX_MEMORY_SIZE
setting.
+ {% endblocktrans %}
+
{% trans "Try selecting Profile from the drop down menu to continue the tour." %}
`, + text: `{% trans "Your profile, user directory, direct messages, and settings can be accessed by clicking on your name in the menu here." %}{% trans "Try selecting Profile from the drop down menu to continue the tour." %}
`, title: "{% trans 'Profile and settings menu' %}", attachTo: { element: checkResponsiveState('#navbar-dropdown'), diff --git a/bookwyrm/templates/import/import.html b/bookwyrm/templates/import/import.html index ad857fb2e..01014fa94 100644 --- a/bookwyrm/templates/import/import.html +++ b/bookwyrm/templates/import/import.html @@ -1,13 +1,12 @@ -{% extends 'layout.html' %} +{% extends 'preferences/layout.html' %} {% load i18n %} {% load humanize %} -{% block title %}{% trans "Import Books" %}{% endblock %} +{% block title %}{% trans "Import Book List" %}{% endblock %} +{% block header %}{% trans "Import Book List" %}{% endblock %} -{% block content %} +{% block panel %}{% blocktrans with display_left=allowed_imports|intcomma %}You have {{ display_left }} left.{% endblocktrans %}
diff --git a/bookwyrm/templates/import/import_user.html b/bookwyrm/templates/import/import_user.html new file mode 100644 index 000000000..70b21673c --- /dev/null +++ b/bookwyrm/templates/import/import_user.html @@ -0,0 +1,222 @@ +{% extends 'preferences/layout.html' %} +{% load i18n %} +{% load humanize %} + +{% block title %}{% trans "Import BookWyrm Account" %}{% endblock %} +{% block header %}{% trans "Import BookWyrm Account" %}{% endblock %} + +{% block panel %} ++ {% spaceless %} + {% trans "If you wish to migrate any statuses (comments, reviews, or quotes) you must either set this account as an alias of the one you are migrating from, or move that account to this one, before you import your user data." %} + {% endspaceless %} +
+ {% if not site.imports_enabled %} ++ +
++ {% trans "Imports are temporarily disabled; thank you for your patience." %} +
+{% blocktrans %}Currently you are allowed to import one user every {{ user_import_hours }} hours.{% endblocktrans %}
+{% blocktrans %}You will next be able to import a user file at {{ next_available }}{% endblocktrans %}
++ {% trans "Date Created" %} + | ++ {% trans "Last Updated" %} + | ++ {% trans "Status" %} + | +|
---|---|---|---|
+ {% trans "No recent imports" %} + | +|||
+ {{ job.created_date }} + |
+ {{ job.updated_date }} | ++ + {% if job.status %} + {{ job.status }} + {{ job.status_display }} + {% elif job.complete %} + {% trans "Complete" %} + {% else %} + {% trans "Active" %} + {% endif %} + + | +
+ {% trans "ID" %} + | ++ {% trans "User" as text %} + {% include 'snippets/table-sort-header.html' with field="user" sort=sort text=text %} + | ++ {% trans "Date Created" as text %} + {% include 'snippets/table-sort-header.html' with field="created_date" sort=sort text=text %} + | + {% if status != "active" %} ++ {% trans "Date Updated" %} + | + {% endif %} ++ {% trans "Items" %} + | ++ {% trans "Pending items" %} + | ++ {% trans "Successful items" %} + | ++ {% trans "Failed items" %} + | + {% if status == "active" %} +{% trans "Actions" %} | + {% endif %} +
---|---|---|---|---|---|---|---|---|
{{ import.id }} | ++ {{ import.user|username }} + | +{{ import.created_date }} | + {% if status != "active" %} +{{ import.updated_date }} | + {% endif %} +{{ import.item_count|intcomma }} | +{{ import.pending_item_count|intcomma }} | +{{ import.successful_item_count|intcomma }} | +{{ import.failed_item_count|intcomma }} | + {% if status == "active" %} ++ {% join "complete" import.id as modal_id %} + + {% include "settings/imports/complete_import_modal.html" with id=modal_id %} + | + {% endif %} +
+ {% trans "No matching imports found." %} + | +
- {% trans "ID" %} - | -- {% trans "User" as text %} - {% include 'snippets/table-sort-header.html' with field="user" sort=sort text=text %} - | -- {% trans "Date Created" as text %} - {% include 'snippets/table-sort-header.html' with field="created_date" sort=sort text=text %} - | - {% if status != "active" %} -- {% trans "Date Updated" %} - | - {% endif %} -- {% trans "Items" %} - | -- {% trans "Pending items" %} - | -- {% trans "Successful items" %} - | -- {% trans "Failed items" %} - | - {% if status == "active" %} -{% trans "Actions" %} | - {% endif %} -
---|---|---|---|---|---|---|---|---|
{{ import.id }} | -- {{ import.user|username }} - | -{{ import.created_date }} | - {% if status != "active" %} -{{ import.updated_date }} | - {% endif %} -{{ import.item_count|intcomma }} | -{{ import.pending_item_count|intcomma }} | -{{ import.successful_item_count|intcomma }} | -{{ import.failed_item_count|intcomma }} | - {% if status == "active" %} -- {% join "complete" import.id as modal_id %} - - {% include "settings/imports/complete_import_modal.html" with id=modal_id %} - | - {% endif %} -
- {% trans "No matching imports found." %} - | -
+ {% trans "ID" %} + | ++ {% trans "User" as text %} + {% include 'snippets/table-sort-header.html' with field="user" sort=sort text=text %} + | ++ {% trans "Date Created" as text %} + {% include 'snippets/table-sort-header.html' with field="created_date" sort=sort text=text %} + | + {% if status != "active" %} ++ {% trans "Date Updated" %} + | + {% endif %} + + {% if status == "active" %} +{% trans "Actions" %} | + {% else %} +{% trans "Status" %} | + {% endif %} +
---|---|---|---|---|---|
{{ import.id }} | ++ {{ import.user|username }} + | +{{ import.created_date }} | + {% if status != "active" %} +{{ import.updated_date }} | + {% endif %} + {% if status == "active" %} ++ {% join "complete" import.id as modal_id %} + + {% include "settings/imports/complete_user_import_modal.html" with id=modal_id %} + | + {% else %} ++ {{ import.status }} + + | + {% endif %} +
+ {% trans "No matching imports found." %} + | +
{% trans "View user profile" %}
+ {% endif %} + + {% url 'settings-user' user.id as url %} {% if not request.path == url %}{% trans "Go to user admin" %}
@@ -23,18 +34,7 @@- {% trans "Active" %} -
- {% else %} -- {% trans "Inactive" %} - {% if user.deactivation_reason %} - ({% trans user.get_deactivation_reason_display %}) - {% endif %} -
- {% endif %} + {% include "snippets/user_active_tag.html" with large=True %}{% if user.local %} {% trans "Local" %} diff --git a/bookwyrm/templates/settings/users/user_moderation_actions.html b/bookwyrm/templates/settings/users/user_moderation_actions.html index 4a624a5e4..fd3e66aa8 100644 --- a/bookwyrm/templates/settings/users/user_moderation_actions.html +++ b/bookwyrm/templates/settings/users/user_moderation_actions.html @@ -1,4 +1,5 @@ {% load i18n %} +{% load utilities %}
- {% trans "Send direct message" %} -
- {% endif %} + {% if user.localname|is_instance_admin %} ++ {% trans "Send direct message" %} +
+ {% endif %} - {% if not user.is_active and user.deactivation_reason == "pending" %} -{% trans "This shelf is empty." %}
++ + {% if shelves_filter_query %} + {% blocktrans trimmed %} + We couldn't find any books that matched {{ shelves_filter_query }} + {% endblocktrans %} + {% else %} + {% trans "This shelf is empty." %} + {% endif %} + +
{% endif %}+ {% id_to_username user.moved_to as moved_to_name %} + {% blocktrans trimmed with user=user|username moved_to_link=user.moved_to %} + {{ user }} has moved to {{ moved_to_name }} + {% endblocktrans %} +
++ + {{ text }} + {% if deactivation_reason %} + ({{ deactivation_reason }}) + {% endif %} +
+ +{% else %} + + +{{ text }} + +{% endif %} + diff --git a/bookwyrm/templates/snippets/user_options.html b/bookwyrm/templates/snippets/user_options.html index 35abc98c2..0e15e413a 100644 --- a/bookwyrm/templates/snippets/user_options.html +++ b/bookwyrm/templates/snippets/user_options.html @@ -20,4 +20,9 @@- {{ requester.display_name }} ({{ requester.username }}) -
- {% include 'snippets/follow_request_buttons.html' with user=requester %} -+ {{ requester.display_name }} ({{ requester.username }}) +
+ {% include 'snippets/follow_request_buttons.html' with user=requester %} ++ {% if user.name %}{{ user.name }}{% else %}{{ user.localname }}{% endif %} + {% if user.manually_approves_followers %} + + {% trans "Locked account" %} + + {% endif %} +
+{{ user.username }}
+{% blocktrans with date=user.created_date|naturaltime %}Joined {{ date }}{% endblocktrans %}
+I love to make soup in Paris and eat pizza in New York
", + "icon": { + "type": "Document", + "url": "avatar.png", + "name": "avatar for rat", + "@context": "https://www.w3.org/ns/activitystreams" + }, + "bookwyrmUser": true, + "manuallyApprovesFollowers": true, + "discoverable": false, + "hideFollows": true, + "alsoKnownAs": [], + "@context": [ + "https://www.w3.org/ns/activitystreams", + "https://w3id.org/security/v1", + { + "manuallyApprovesFollowers": "as:manuallyApprovesFollowers", + "schema": "http://schema.org#", + "PropertyValue": "schema:PropertyValue", + "value": "schema:value", + "alsoKnownAs": { + "@id": "as:alsoKnownAs", + "@type": "@id" + }, + "movedTo": { + "@id": "as:movedTo", + "@type": "@id" + } + } + ], + "settings": { + "show_goal": false, + "preferred_timezone": "Australia/Adelaide", + "default_post_privacy": "followers", + "show_suggested_users": false + }, + "goals": [ + { + "goal": 12, + "year": 2023, + "privacy": "followers" + } + ], + "books": [ + { + "work": { + "id": "https://www.example.com/book/1", + "type": "Work", + "title": "Seeing Like a State", + "description": "Examines how (sometimes quasi-) authoritarian high-modernist planning fails to deliver the goods, be they increased resources for the state or a better life for the people.
", + "languages": [ "English" ], + "series": "", + "seriesNumber": "", + "subjects": [], + "subjectPlaces": [], + "authors": [ + "https://www.example.com/author/1" + ], + "firstPublishedDate": "", + "publishedDate": "1998-03-30T00:00:00Z", + "fileLinks": [], + "lccn": "", + "editions": [ + "https://www.example.com/book/2" + ], + "@context": "https://www.w3.org/ns/activitystreams" + }, + "edition": { + "id": "https://www.example.com/book/2", + "type": "Edition", + "openlibraryKey": "OL680025M", + "title": "Seeking Like A State", + "sortTitle": "seeing like a state", + "subtitle": "", + "description": "Examines how (sometimes quasi-) authoritarian high-modernist planning fails to deliver the goods, be they increased resources for the state or a better life for the people.
", + "languages": ["English"], + "series": "", + "seriesNumber": "", + "subjects": [], + "subjectPlaces": [], + "authors": [ + "https://www.example.com/author/1" + ], + "firstPublishedDate": "", + "publishedDate": "", + "fileLinks": [], + "cover": { + "type": "Document", + "url": "covers/d273d638-191d-4ebf-b213-3c60dbf010fe.jpeg", + "name": "James C. Scott: Seeing like a state", + "@context": "https://www.w3.org/ns/activitystreams" + }, + "work": "https://www.example.com/book/1", + "isbn10": "", + "isbn13": "9780300070163", + "oclcNumber": "", + "physicalFormat": "", + "physicalFormatDetail": "", + "publishers": [], + "editionRank": 4, + "@context": "https://www.w3.org/ns/activitystreams" + }, + "authors": [ + { + "id": "https://www.example.com/author/1", + "type": "Author", + "name": "James C. Scott", + "aliases": [ + "James Campbell Scott", + "\u30b8\u30a7\u30fc\u30e0\u30ba\u30fbC. \u30b9\u30b3\u30c3\u30c8", + "\u30b8\u30a7\u30fc\u30e0\u30ba\u30fbC\u30fb\u30b9\u30b3\u30c3\u30c8", + "\u062c\u06cc\u0645\u0632 \u0633\u06cc. \u0627\u0633\u06a9\u0627\u062a", + "Jim Scott", + "\u062c\u064a\u0645\u0633 \u0633\u0643\u0648\u062a", + "James C. Scott", + "\u0414\u0436\u0435\u0439\u043c\u0441 \u0421\u043a\u043e\u0442\u0442", + "\u30b8\u30a7\u30fc\u30e0\u30b9\u30fbC \u30b9\u30b3\u30c3\u30c8", + "James Cameron Scott" + ], + "bio": "American political scientist and anthropologist
", + "wikipediaLink": "https://en.wikipedia.org/wiki/James_C._Scott", + "website": "", + "@context": "https://www.w3.org/ns/activitystreams" + } + ], + "shelves": [ + { + "id": "https://www.example.com/user/rat/books/read", + "type": "Shelf", + "totalItems": 1, + "first": "https://www.example.com/user/rat/books/read?page=1", + "last": "https://www.example.com/user/rat/books/read?page=1", + "name": "Read", + "owner": "https://www.example.com/user/rat", + "to": [ + "https://www.w3.org/ns/activitystreams#Public" + ], + "cc": [ + "https://www.example.com/user/rat/followers" + ], + "@context": "https://www.w3.org/ns/activitystreams" + }, + { + "id": "https://www.example.com/user/rat/books/to-read", + "type": "Shelf", + "totalItems": 1, + "first": "https://www.example.com/user/rat/books/to-read?page=1", + "last": "https://www.example.com/user/rat/books/to-read?page=1", + "name": "To Read", + "owner": "https://www.example.com/user/rat", + "to": [ + "https://www.w3.org/ns/activitystreams#Public" + ], + "cc": [ + "https://www.example.com/user/rat/followers" + ], + "@context": "https://www.w3.org/ns/activitystreams" + } + ], + "lists": [ + { + "id": "https://www.example.com/list/2", + "type": "BookList", + "totalItems": 1, + "first": "https://www.example.com/list/2?page=1", + "last": "https://www.example.com/list/2?page=1", + "name": "my list of books", + "owner": "https://www.example.com/user/rat", + "to": [ + "https://www.example.com/user/rat/followers" + ], + "cc": [], + "summary": "Here is a description of my list", + "curation": "closed", + "@context": "https://www.w3.org/ns/activitystreams", + "privacy": "followers", + "list_item": { + "id": "https://www.example.com/user/rat/listitem/3", + "type": "ListItem", + "actor": "https://www.example.com/user/rat", + "book": "https://www.example.com/book/2", + "notes": "It's fun.
", + "approved": true, + "order": 1, + "@context": "https://www.w3.org/ns/activitystreams" + } + } + ], + "comments": [], + "quotations": [], + "reviews": [ + { + "id": "https://www.example.com/user/rat/review/7", + "type": "Review", + "published": "2023-08-14T04:09:18.343+00:00", + "attributedTo": "https://www.example.com//user/rat", + "content": "I like it
", + "to": [ + "https://your.domain.here/user/rat/followers" + ], + "cc": [], + "replies": { + "id": "https://www.example.com/user/rat/review/7/replies", + "type": "OrderedCollection", + "totalItems": 0, + "first": "https://www.example.com/user/rat/review/7/replies?page=1", + "last": "https://www.example.com/user/rat/review/7/replies?page=1", + "@context": "https://www.w3.org/ns/activitystreams" + }, + "summary": "Here's a spoiler alert", + "tag": [], + "attachment": [], + "sensitive": true, + "inReplyToBook": "https://www.example.com/book/6", + "name": "great book", + "rating": 5.0, + "@context": "https://www.w3.org/ns/activitystreams", + "progress": 23, + "progress_mode": "PG" + } + ], + "readthroughs": [ + { + "id": 1, + "created_date": "2023-08-14T04:00:27.544Z", + "updated_date": "2023-08-14T04:00:27.546Z", + "remote_id": "https://www.example.com/user/rat/readthrough/1", + "user_id": 1, + "book_id": 4880, + "progress": null, + "progress_mode": "PG", + "start_date": "2018-01-01T00:00:00Z", + "finish_date": "2023-08-13T00:00:00Z", + "stopped_date": null, + "is_active": false + } + ] + }, + { + "work": { + "id": "https://www.example.com/book/3", + "type": "Work", + "title": "Sand Talk: How Indigenous Thinking Can Save the World", + "description": "", + "languages": [], + "series": "", + "seriesNumber": "", + "subjects": [], + "subjectPlaces": [], + "authors": [ + "https://www.example.com/author/2" + ], + "firstPublishedDate": "", + "publishedDate": "", + "fileLinks": [], + "lccn": "", + "openlibraryKey": "OL28216445M", + "editions": [ + "https://www.example.com/book/4" + ], + "@context": "https://www.w3.org/ns/activitystreams" + }, + "edition": { + "id": "https://www.example.com/book/4", + "type": "Edition", + "title": "Sand Talk", + "sortTitle": "sand talk", + "subtitle": "How Indigenous Thinking Can Save the World", + "description": "", + "languages": [], + "series": "", + "seriesNumber": "", + "subjects": [], + "subjectPlaces": [], + "authors": [ + "https://www.example.com/author/2" + ], + "firstPublishedDate": "", + "publishedDate": "", + "fileLinks": [], + "cover": { + "type": "Document", + "url": "covers/6a553a08-2641-42a1-baa4-960df9edbbfc.jpeg", + "name": "Tyson Yunkaporta - Sand Talk", + "@context": "https://www.w3.org/ns/activitystreams" + }, + "work": "https://www.example.com/book/3", + "isbn10": "", + "isbn13": "9780062975645", + "oclcNumber": "", + "inventaireId": "isbn:9780062975645", + "physicalFormat": "paperback", + "physicalFormatDetail": "", + "publishers": [], + "editionRank": 5, + "@context": "https://www.w3.org/ns/activitystreams" + }, + "authors": [ + { + "id": "https://www.example.com/author/2", + "type": "Author", + "name": "Tyson Yunkaporta", + "aliases": [], + "bio": "", + "wikipediaLink": "", + "website": "", + "@context": "https://www.w3.org/ns/activitystreams" + } + ], + "shelves": [], + "lists": [], + "comments": [ + { + "id": "https://www.example.com/user/rat/comment/4", + "type": "Comment", + "published": "2023-08-14T04:48:18.746+00:00", + "attributedTo": "https://www.example.com/user/rat", + "content": "this is a comment about an amazing book
", + "to": [ + "https://www.w3.org/ns/activitystreams#Public" + ], + "cc": [ + "https://www.example.com/user/rat/followers" + ], + "replies": { + "id": "https://www.example.com/user/rat/comment/4/replies", + "type": "OrderedCollection", + "totalItems": 0, + "first": "https://www.example.com/user/rat/comment/4/replies?page=1", + "last": "https://www.example.com/user/rat/comment/4/replies?page=1", + "@context": "https://www.w3.org/ns/activitystreams" + }, + "tag": [], + "attachment": [], + "sensitive": false, + "inReplyToBook": "https://www.example.com/book/4", + "readingStatus": null, + "@context": "https://www.w3.org/ns/activitystreams" + } + ], + "quotations": [ + { + "id": "https://www.example.com/user/rat/quotation/2", + "type": "Quotation", + "published": "2023-11-12T04:29:38.370305+00:00", + "attributedTo": "https://www.example.com/user/rat", + "content": "not actually from this book lol
", + "to": [ + "https://www.w3.org/ns/activitystreams#Public" + ], + "cc": [ + "https://www.example.com/user/rat/followers" + ], + "replies": { + "id": "https://www.example.com/user/rat/quotation/2/replies", + "type": "OrderedCollection", + "totalItems": 0, + "first": "https://www.example.com/user/rat/quotation/2/replies?page=1", + "last": "https://www.example.com/user/rat/quotation/2/replies?page=1", + "@context": "https://www.w3.org/ns/activitystreams" + }, + "tag": [], + "attachment": [], + "sensitive": false, + "summary": "spoiler ahead!", + "inReplyToBook": "https://www.example.com/book/2", + "quote": "To be or not to be
", + "@context": "https://www.w3.org/ns/activitystreams" + } + ], + "reviews": [], + "readthroughs": [] + } + ], + "saved_lists": [ + "https://local.lists/9999" + ], + "follows": [ + "https://your.domain.here/user/rat" + ], + "blocks": ["https://your.domain.here/user/badger"] +} \ No newline at end of file diff --git a/bookwyrm/tests/importers/test_calibre_import.py b/bookwyrm/tests/importers/test_calibre_import.py index 37b206458..d549a75ed 100644 --- a/bookwyrm/tests/importers/test_calibre_import.py +++ b/bookwyrm/tests/importers/test_calibre_import.py @@ -16,12 +16,15 @@ from bookwyrm.models.import_job import handle_imported_book class CalibreImport(TestCase): """importing from Calibre csv""" - # pylint: disable=invalid-name def setUp(self): """use a test csv""" self.importer = CalibreImporter() datafile = pathlib.Path(__file__).parent.joinpath("../data/calibre.csv") self.csv = open(datafile, "r", encoding=self.importer.encoding) + + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument + """populate database""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): diff --git a/bookwyrm/tests/importers/test_goodreads_import.py b/bookwyrm/tests/importers/test_goodreads_import.py index 88f8eb3f4..0b5fd5e2d 100644 --- a/bookwyrm/tests/importers/test_goodreads_import.py +++ b/bookwyrm/tests/importers/test_goodreads_import.py @@ -23,12 +23,15 @@ def make_date(*args): class GoodreadsImport(TestCase): """importing from goodreads csv""" - # pylint: disable=invalid-name def setUp(self): """use a test csv""" self.importer = GoodreadsImporter() datafile = pathlib.Path(__file__).parent.joinpath("../data/goodreads.csv") self.csv = open(datafile, "r", encoding=self.importer.encoding) + + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument + """populate database""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): diff --git a/bookwyrm/tests/importers/test_importer.py b/bookwyrm/tests/importers/test_importer.py index f48b97993..eb3041dc6 100644 --- a/bookwyrm/tests/importers/test_importer.py +++ b/bookwyrm/tests/importers/test_importer.py @@ -26,13 +26,15 @@ def make_date(*args): class GenericImporter(TestCase): """importing from csv""" - # pylint: disable=invalid-name 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) + + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument + """populate database""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): diff --git a/bookwyrm/tests/importers/test_librarything_import.py b/bookwyrm/tests/importers/test_librarything_import.py index 71a1c9796..c2fe7a9a8 100644 --- a/bookwyrm/tests/importers/test_librarything_import.py +++ b/bookwyrm/tests/importers/test_librarything_import.py @@ -23,7 +23,6 @@ def make_date(*args): class LibrarythingImport(TestCase): """importing from librarything tsv""" - # pylint: disable=invalid-name def setUp(self): """use a test tsv""" self.importer = LibrarythingImporter() @@ -31,6 +30,10 @@ class LibrarythingImport(TestCase): # Librarything generates latin encoded exports... self.csv = open(datafile, "r", encoding=self.importer.encoding) + + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument + """populate database""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): diff --git a/bookwyrm/tests/importers/test_openlibrary_import.py b/bookwyrm/tests/importers/test_openlibrary_import.py index 82b5ec3ea..2712930d9 100644 --- a/bookwyrm/tests/importers/test_openlibrary_import.py +++ b/bookwyrm/tests/importers/test_openlibrary_import.py @@ -23,12 +23,15 @@ def make_date(*args): class OpenLibraryImport(TestCase): """importing from openlibrary csv""" - # pylint: disable=invalid-name def setUp(self): """use a test csv""" self.importer = OpenLibraryImporter() datafile = pathlib.Path(__file__).parent.joinpath("../data/openlibrary.csv") self.csv = open(datafile, "r", encoding=self.importer.encoding) + + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument + """populate database""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): diff --git a/bookwyrm/tests/importers/test_storygraph_import.py b/bookwyrm/tests/importers/test_storygraph_import.py index 0befbeb3f..edc484629 100644 --- a/bookwyrm/tests/importers/test_storygraph_import.py +++ b/bookwyrm/tests/importers/test_storygraph_import.py @@ -23,12 +23,15 @@ def make_date(*args): class StorygraphImport(TestCase): """importing from storygraph csv""" - # pylint: disable=invalid-name 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) + + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument + """populate database""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): diff --git a/bookwyrm/tests/lists_stream/test_signals.py b/bookwyrm/tests/lists_stream/test_signals.py index 96f1ae231..51f0709b0 100644 --- a/bookwyrm/tests/lists_stream/test_signals.py +++ b/bookwyrm/tests/lists_stream/test_signals.py @@ -8,8 +8,9 @@ from bookwyrm import lists_stream, models class ListsStreamSignals(TestCase): """using redis to build activity streams""" - def setUp(self): - """use a test csv""" + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument + """database setup""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): diff --git a/bookwyrm/tests/lists_stream/test_stream.py b/bookwyrm/tests/lists_stream/test_stream.py index 0e87c7436..6dd6a1c8e 100644 --- a/bookwyrm/tests/lists_stream/test_stream.py +++ b/bookwyrm/tests/lists_stream/test_stream.py @@ -15,8 +15,9 @@ from bookwyrm import lists_stream, models class ListsStream(TestCase): """using redis to build activity streams""" - def setUp(self): - """use a test csv""" + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument + """database setup""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): diff --git a/bookwyrm/tests/lists_stream/test_tasks.py b/bookwyrm/tests/lists_stream/test_tasks.py index 2e01cecad..18ddecf18 100644 --- a/bookwyrm/tests/lists_stream/test_tasks.py +++ b/bookwyrm/tests/lists_stream/test_tasks.py @@ -10,8 +10,9 @@ from bookwyrm import lists_stream, models class Activitystreams(TestCase): """using redis to build activity streams""" - def setUp(self): - """use a test csv""" + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument + """database setup""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): diff --git a/bookwyrm/tests/management/test_populate_lists_streams.py b/bookwyrm/tests/management/test_populate_lists_streams.py index 2cce7b7a3..5990da4e3 100644 --- a/bookwyrm/tests/management/test_populate_lists_streams.py +++ b/bookwyrm/tests/management/test_populate_lists_streams.py @@ -12,7 +12,8 @@ from bookwyrm.management.commands.populate_lists_streams import populate_lists_s class Activitystreams(TestCase): """using redis to build activity streams""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """we need some stuff""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" diff --git a/bookwyrm/tests/management/test_populate_streams.py b/bookwyrm/tests/management/test_populate_streams.py index c20a21ac5..4d6bf688f 100644 --- a/bookwyrm/tests/management/test_populate_streams.py +++ b/bookwyrm/tests/management/test_populate_streams.py @@ -10,7 +10,8 @@ from bookwyrm.management.commands.populate_streams import populate_streams class Activitystreams(TestCase): """using redis to build activity streams""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """we need some stuff""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" diff --git a/bookwyrm/tests/models/test_activitypub_mixin.py b/bookwyrm/tests/models/test_activitypub_mixin.py index a465c2c12..cad970412 100644 --- a/bookwyrm/tests/models/test_activitypub_mixin.py +++ b/bookwyrm/tests/models/test_activitypub_mixin.py @@ -26,7 +26,8 @@ from bookwyrm.settings import PAGE_LENGTH class ActivitypubMixins(TestCase): """functionality shared across models""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """shared data""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" @@ -47,6 +48,8 @@ class ActivitypubMixins(TestCase): outbox="https://example.com/users/rat/outbox", ) + def setUp(self): + """test data""" self.object_mock = { "to": "to field", "cc": "cc field", @@ -119,6 +122,25 @@ class ActivitypubMixins(TestCase): result = models.Edition.find_existing({"openlibraryKey": "OL1234"}) self.assertEqual(result, book) + def test_find_existing_with_id(self, *_): + """make sure that an "id" field won't produce a match""" + book = models.Edition.objects.create(title="Test edition") + + result = models.Edition.find_existing({"id": book.id}) + self.assertIsNone(result) + + def test_find_existing_with_id_and_match(self, *_): + """make sure that an "id" field won't produce a match""" + book = models.Edition.objects.create(title="Test edition") + matching_book = models.Edition.objects.create( + title="Another test edition", openlibrary_key="OL1234" + ) + + result = models.Edition.find_existing( + {"id": book.id, "openlibraryKey": "OL1234"} + ) + self.assertEqual(result, matching_book) + def test_get_recipients_public_object(self, *_): """determines the recipients for an object's broadcast""" MockSelf = namedtuple("Self", ("privacy")) @@ -372,11 +394,13 @@ class ActivitypubMixins(TestCase): def test_to_ordered_collection_page(self, *_): """make sure the paged results of an ordered collection work""" self.assertEqual(PAGE_LENGTH, 15) - for number in range(0, 2 * PAGE_LENGTH): - models.Status.objects.create( + models.Status.objects.bulk_create( + models.Status( user=self.local_user, content=f"test status {number}", ) + for number in range(2 * PAGE_LENGTH) + ) page_1 = to_ordered_collection_page( models.Status.objects.all(), "http://fish.com/", page=1 ) @@ -397,13 +421,13 @@ class ActivitypubMixins(TestCase): def test_to_ordered_collection(self, *_): """convert a queryset into an ordered collection object""" self.assertEqual(PAGE_LENGTH, 15) - - for number in range(0, 2 * PAGE_LENGTH): - models.Status.objects.create( + models.Status.objects.bulk_create( + models.Status( user=self.local_user, content=f"test status {number}", ) - + for number in range(2 * PAGE_LENGTH) + ) MockSelf = namedtuple("Self", ("remote_id")) mock_self = MockSelf("") diff --git a/bookwyrm/tests/models/test_automod.py b/bookwyrm/tests/models/test_automod.py index 9de7e6488..1ad139886 100644 --- a/bookwyrm/tests/models/test_automod.py +++ b/bookwyrm/tests/models/test_automod.py @@ -14,10 +14,9 @@ from bookwyrm.models.antispam import automod_task class AutomodModel(TestCase): """every response to a get request, html or json""" - # pylint: disable=invalid-name - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """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" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): @@ -30,6 +29,9 @@ class AutomodModel(TestCase): is_superuser=True, ) + def setUp(self): + self.factory = RequestFactory() + def test_automod_task_no_rules(self, *_): """nothing to see here""" self.assertFalse(models.Report.objects.exists()) diff --git a/bookwyrm/tests/models/test_base_model.py b/bookwyrm/tests/models/test_base_model.py index b94592571..f1f465b73 100644 --- a/bookwyrm/tests/models/test_base_model.py +++ b/bookwyrm/tests/models/test_base_model.py @@ -12,7 +12,8 @@ from bookwyrm.settings import DOMAIN class BaseModel(TestCase): """functionality shared across models""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """shared data""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" @@ -31,6 +32,7 @@ class BaseModel(TestCase): outbox="https://example.com/users/rat/outbox", ) + def setUp(self): class BookWyrmTestModel(base_model.BookWyrmModel): """just making it not abstract""" diff --git a/bookwyrm/tests/models/test_book_model.py b/bookwyrm/tests/models/test_book_model.py index 8122e9505..c6b854180 100644 --- a/bookwyrm/tests/models/test_book_model.py +++ b/bookwyrm/tests/models/test_book_model.py @@ -11,14 +11,15 @@ from django.test import TestCase from django.utils import timezone from bookwyrm import models, settings -from bookwyrm.models.book import isbn_10_to_13, isbn_13_to_10 +from bookwyrm.models.book import isbn_10_to_13, isbn_13_to_10, normalize_isbn from bookwyrm.settings import ENABLE_THUMBNAIL_GENERATION class Book(TestCase): """not too much going on in the books model but here we are""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """we'll need some books""" self.work = models.Work.objects.create( title="Example Work", remote_id="https://example.com/book/1" @@ -72,6 +73,10 @@ class Book(TestCase): isbn_10 = isbn_13_to_10(isbn_13) self.assertEqual(isbn_10, "178816167X") + def test_normalize_isbn(self): + """Remove misc characters from ISBNs""" + self.assertEqual(normalize_isbn("978-0-4633461-1-2"), "9780463346112") + def test_get_edition_info(self): """text slug about an edition""" book = models.Edition.objects.create(title="Test Edition") diff --git a/bookwyrm/tests/models/test_bookwyrm_export_job.py b/bookwyrm/tests/models/test_bookwyrm_export_job.py new file mode 100644 index 000000000..b5f2520a9 --- /dev/null +++ b/bookwyrm/tests/models/test_bookwyrm_export_job.py @@ -0,0 +1,231 @@ +"""test bookwyrm user export functions""" +import datetime +import json +from unittest.mock import patch + +from django.core.serializers.json import DjangoJSONEncoder +from django.test import TestCase +from django.utils import timezone + +from bookwyrm import models +import bookwyrm.models.bookwyrm_export_job as export_job + + +class BookwyrmExport(TestCase): + """testing user export functions""" + + def setUp(self): + """lots of stuff to set up for a user export""" + with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( + "bookwyrm.activitystreams.populate_stream_task.delay" + ), patch("bookwyrm.lists_stream.populate_lists_task.delay"), patch( + "bookwyrm.suggested_users.rerank_user_task.delay" + ), patch( + "bookwyrm.lists_stream.remove_list_task.delay" + ), patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ), patch( + "bookwyrm.activitystreams.add_book_statuses_task" + ): + + self.local_user = models.User.objects.create_user( + "mouse", + "mouse@mouse.mouse", + "password", + local=True, + localname="mouse", + name="Mouse", + summary="I'm a real bookmouse", + manually_approves_followers=False, + hide_follows=False, + show_goal=False, + show_suggested_users=False, + discoverable=True, + preferred_timezone="America/Los Angeles", + default_post_privacy="followers", + ) + + self.rat_user = models.User.objects.create_user( + "rat", "rat@rat.rat", "ratword", local=True, localname="rat" + ) + + self.badger_user = models.User.objects.create_user( + "badger", + "badger@badger.badger", + "badgerword", + local=True, + localname="badger", + ) + + models.AnnualGoal.objects.create( + user=self.local_user, + year=timezone.now().year, + goal=128937123, + privacy="followers", + ) + + self.list = models.List.objects.create( + name="My excellent list", + user=self.local_user, + remote_id="https://local.lists/1111", + ) + + self.saved_list = models.List.objects.create( + name="My cool list", + user=self.rat_user, + remote_id="https://local.lists/9999", + ) + + self.local_user.saved_lists.add(self.saved_list) + self.local_user.blocks.add(self.badger_user) + self.rat_user.followers.add(self.local_user) + + # book, edition, author + self.author = models.Author.objects.create(name="Sam Zhu") + self.work = models.Work.objects.create( + title="Example Work", remote_id="https://example.com/book/1" + ) + self.edition = models.Edition.objects.create( + title="Example Edition", parent_work=self.work + ) + + self.edition.authors.add(self.author) + + # readthrough + self.readthrough_start = timezone.now() + finish = self.readthrough_start + datetime.timedelta(days=1) + models.ReadThrough.objects.create( + user=self.local_user, + book=self.edition, + start_date=self.readthrough_start, + finish_date=finish, + ) + + # shelve + read_shelf = models.Shelf.objects.get( + user=self.local_user, identifier="read" + ) + models.ShelfBook.objects.create( + book=self.edition, shelf=read_shelf, user=self.local_user + ) + + # add to list + models.ListItem.objects.create( + book_list=self.list, + user=self.local_user, + book=self.edition, + approved=True, + order=1, + ) + + # review + models.Review.objects.create( + content="awesome", + name="my review", + rating=5, + user=self.local_user, + book=self.edition, + ) + # comment + models.Comment.objects.create( + content="ok so far", + user=self.local_user, + book=self.edition, + progress=15, + ) + # quote + models.Quotation.objects.create( + content="check this out", + quote="A rose by any other name", + user=self.local_user, + book=self.edition, + ) + + def test_json_export_user_settings(self): + """Test the json export function for basic user info""" + data = export_job.json_export(self.local_user) + user_data = json.loads(data) + self.assertEqual(user_data["preferredUsername"], "mouse") + self.assertEqual(user_data["name"], "Mouse") + self.assertEqual(user_data["summary"], "I'm a real bookmouse
") + self.assertEqual(user_data["manuallyApprovesFollowers"], False) + self.assertEqual(user_data["hideFollows"], False) + self.assertEqual(user_data["discoverable"], True) + self.assertEqual(user_data["settings"]["show_goal"], False) + self.assertEqual(user_data["settings"]["show_suggested_users"], False) + self.assertEqual( + user_data["settings"]["preferred_timezone"], "America/Los Angeles" + ) + self.assertEqual(user_data["settings"]["default_post_privacy"], "followers") + + def test_json_export_extended_user_data(self): + """Test the json export function for other non-book user info""" + data = export_job.json_export(self.local_user) + json_data = json.loads(data) + + # goal + self.assertEqual(len(json_data["goals"]), 1) + self.assertEqual(json_data["goals"][0]["goal"], 128937123) + self.assertEqual(json_data["goals"][0]["year"], timezone.now().year) + self.assertEqual(json_data["goals"][0]["privacy"], "followers") + + # saved lists + self.assertEqual(len(json_data["saved_lists"]), 1) + self.assertEqual(json_data["saved_lists"][0], "https://local.lists/9999") + + # follows + self.assertEqual(len(json_data["follows"]), 1) + self.assertEqual(json_data["follows"][0], "https://your.domain.here/user/rat") + # blocked users + self.assertEqual(len(json_data["blocks"]), 1) + self.assertEqual(json_data["blocks"][0], "https://your.domain.here/user/badger") + + def test_json_export_books(self): + """Test the json export function for extended user info""" + + data = export_job.json_export(self.local_user) + json_data = json.loads(data) + start_date = json_data["books"][0]["readthroughs"][0]["start_date"] + + self.assertEqual(len(json_data["books"]), 1) + self.assertEqual(json_data["books"][0]["edition"]["title"], "Example Edition") + self.assertEqual(len(json_data["books"][0]["authors"]), 1) + self.assertEqual(json_data["books"][0]["authors"][0]["name"], "Sam Zhu") + + self.assertEqual( + f'"{start_date}"', DjangoJSONEncoder().encode(self.readthrough_start) + ) + + self.assertEqual(json_data["books"][0]["shelves"][0]["name"], "Read") + + self.assertEqual(len(json_data["books"][0]["lists"]), 1) + self.assertEqual(json_data["books"][0]["lists"][0]["name"], "My excellent list") + self.assertEqual( + json_data["books"][0]["lists"][0]["list_item"]["book"], + self.edition.remote_id, + self.edition.id, + ) + + self.assertEqual(len(json_data["books"][0]["reviews"]), 1) + self.assertEqual(len(json_data["books"][0]["comments"]), 1) + self.assertEqual(len(json_data["books"][0]["quotations"]), 1) + + self.assertEqual(json_data["books"][0]["reviews"][0]["name"], "my review") + self.assertEqual( + json_data["books"][0]["reviews"][0]["content"], "awesome
" + ) + self.assertEqual(json_data["books"][0]["reviews"][0]["rating"], 5.0) + + self.assertEqual( + json_data["books"][0]["comments"][0]["content"], "ok so far
" + ) + self.assertEqual(json_data["books"][0]["comments"][0]["progress"], 15) + self.assertEqual(json_data["books"][0]["comments"][0]["progress_mode"], "PG") + + self.assertEqual( + json_data["books"][0]["quotations"][0]["content"], "check this out
" + ) + self.assertEqual( + json_data["books"][0]["quotations"][0]["quote"], + "A rose by any other name
", + ) diff --git a/bookwyrm/tests/models/test_bookwyrm_import_job.py b/bookwyrm/tests/models/test_bookwyrm_import_job.py new file mode 100644 index 000000000..adc04706c --- /dev/null +++ b/bookwyrm/tests/models/test_bookwyrm_import_job.py @@ -0,0 +1,545 @@ +""" testing models """ + +import json +import pathlib +from unittest.mock import patch + +from django.db.models import Q +from django.utils.dateparse import parse_datetime +from django.test import TestCase + +from bookwyrm import models +from bookwyrm.utils.tar import BookwyrmTarFile +from bookwyrm.models import bookwyrm_import_job + + +class BookwyrmImport(TestCase): # pylint: disable=too-many-public-methods + """testing user import functions""" + + def setUp(self): + """setting stuff up""" + with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( + "bookwyrm.activitystreams.populate_stream_task.delay" + ), patch("bookwyrm.lists_stream.populate_lists_task.delay"), patch( + "bookwyrm.suggested_users.rerank_user_task.delay" + ): + + self.local_user = models.User.objects.create_user( + "mouse", + "mouse@mouse.mouse", + "password", + local=True, + localname="mouse", + name="Mouse", + summary="I'm a real bookmouse", + manually_approves_followers=False, + hide_follows=False, + show_goal=True, + show_suggested_users=True, + discoverable=True, + preferred_timezone="America/Los Angeles", + default_post_privacy="public", + ) + + self.rat_user = models.User.objects.create_user( + "rat", "rat@rat.rat", "password", local=True, localname="rat" + ) + + self.badger_user = models.User.objects.create_user( + "badger", + "badger@badger.badger", + "password", + local=True, + localname="badger", + ) + + self.work = models.Work.objects.create(title="Sand Talk") + + self.book = models.Edition.objects.create( + title="Sand Talk", + remote_id="https://example.com/book/1234", + openlibrary_key="OL28216445M", + inventaire_id="isbn:9780062975645", + isbn_13="9780062975645", + parent_work=self.work, + ) + + self.json_file = pathlib.Path(__file__).parent.joinpath( + "../data/user_import.json" + ) + + with open(self.json_file, "r", encoding="utf-8") as jsonfile: + self.json_data = json.loads(jsonfile.read()) + + self.archive_file = pathlib.Path(__file__).parent.joinpath( + "../data/bookwyrm_account_export.tar.gz" + ) + + def test_update_user_profile(self): + """Test update the user's profile from import data""" + + with patch("bookwyrm.suggested_users.remove_user_task.delay"), patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ), patch("bookwyrm.suggested_users.rerank_user_task.delay"): + + with open(self.archive_file, "rb") as fileobj: + with BookwyrmTarFile.open(mode="r:gz", fileobj=fileobj) as tarfile: + + models.bookwyrm_import_job.update_user_profile( + self.local_user, tarfile, self.json_data + ) + + self.local_user.refresh_from_db() + + self.assertEqual( + self.local_user.username, "mouse" + ) # username should not change + self.assertEqual(self.local_user.name, "Rat") + self.assertEqual( + self.local_user.summary, + "I love to make soup in Paris and eat pizza in New York", + ) + + def test_update_user_settings(self): + """Test updating the user's settings from import data""" + + with patch("bookwyrm.suggested_users.remove_user_task.delay"), patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ), patch("bookwyrm.suggested_users.rerank_user_task.delay"): + + models.bookwyrm_import_job.update_user_settings( + self.local_user, self.json_data + ) + self.local_user.refresh_from_db() + + self.assertEqual(self.local_user.manually_approves_followers, True) + self.assertEqual(self.local_user.hide_follows, True) + self.assertEqual(self.local_user.show_goal, False) + self.assertEqual(self.local_user.show_suggested_users, False) + self.assertEqual(self.local_user.discoverable, False) + self.assertEqual(self.local_user.preferred_timezone, "Australia/Adelaide") + self.assertEqual(self.local_user.default_post_privacy, "followers") + + def test_update_goals(self): + """Test update the user's goals from import data""" + + models.AnnualGoal.objects.create( + user=self.local_user, + year=2023, + goal=999, + privacy="public", + ) + + goals = [{"goal": 12, "year": 2023, "privacy": "followers"}] + + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): + + models.bookwyrm_import_job.update_goals(self.local_user, goals) + + self.local_user.refresh_from_db() + goal = models.AnnualGoal.objects.get() + self.assertEqual(goal.year, 2023) + self.assertEqual(goal.goal, 12) + self.assertEqual(goal.privacy, "followers") + + def test_upsert_saved_lists_existing(self): + """Test upserting an existing saved list""" + + with patch("bookwyrm.lists_stream.remove_list_task.delay"), patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ): + book_list = models.List.objects.create( + name="My cool list", + user=self.rat_user, + remote_id="https://local.lists/9999", + ) + + self.assertFalse(self.local_user.saved_lists.filter(id=book_list.id).exists()) + + self.local_user.saved_lists.add(book_list) + + self.assertTrue(self.local_user.saved_lists.filter(id=book_list.id).exists()) + + with patch("bookwyrm.activitypub.base_activity.resolve_remote_id"): + models.bookwyrm_import_job.upsert_saved_lists( + self.local_user, ["https://local.lists/9999"] + ) + saved_lists = self.local_user.saved_lists.filter( + remote_id="https://local.lists/9999" + ).all() + self.assertEqual(len(saved_lists), 1) + + def test_upsert_saved_lists_not_existing(self): + """Test upserting a new saved list""" + + with patch("bookwyrm.lists_stream.remove_list_task.delay"), patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ): + book_list = models.List.objects.create( + name="My cool list", + user=self.rat_user, + remote_id="https://local.lists/9999", + ) + + self.assertFalse(self.local_user.saved_lists.filter(id=book_list.id).exists()) + + with patch("bookwyrm.activitypub.base_activity.resolve_remote_id"): + models.bookwyrm_import_job.upsert_saved_lists( + self.local_user, ["https://local.lists/9999"] + ) + + self.assertTrue(self.local_user.saved_lists.filter(id=book_list.id).exists()) + + def test_upsert_follows(self): + """Test take a list of remote ids and add as follows""" + + before_follow = models.UserFollows.objects.filter( + user_subject=self.local_user, user_object=self.rat_user + ).exists() + + self.assertFalse(before_follow) + + with patch("bookwyrm.activitystreams.add_user_statuses_task.delay"), patch( + "bookwyrm.lists_stream.add_user_lists_task.delay" + ), patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): + models.bookwyrm_import_job.upsert_follows( + self.local_user, self.json_data.get("follows") + ) + + after_follow = models.UserFollows.objects.filter( + user_subject=self.local_user, user_object=self.rat_user + ).exists() + self.assertTrue(after_follow) + + def test_upsert_user_blocks(self): + """test adding blocked users""" + + blocked_before = models.UserBlocks.objects.filter( + Q( + user_subject=self.local_user, + user_object=self.badger_user, + ) + ).exists() + self.assertFalse(blocked_before) + + with patch("bookwyrm.suggested_users.remove_suggestion_task.delay"), patch( + "bookwyrm.activitystreams.remove_user_statuses_task.delay" + ), patch("bookwyrm.lists_stream.remove_user_lists_task.delay"), patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ): + models.bookwyrm_import_job.upsert_user_blocks( + self.local_user, self.json_data.get("blocks") + ) + + blocked_after = models.UserBlocks.objects.filter( + Q( + user_subject=self.local_user, + user_object=self.badger_user, + ) + ).exists() + self.assertTrue(blocked_after) + + def test_get_or_create_edition_existing(self): + """Test take a JSON string of books and editions, + find or create the editions in the database and + return a list of edition instances""" + + self.assertEqual(models.Edition.objects.count(), 1) + + with open(self.archive_file, "rb") as fileobj: + with BookwyrmTarFile.open(mode="r:gz", fileobj=fileobj) as tarfile: + + bookwyrm_import_job.get_or_create_edition( + self.json_data["books"][1], tarfile + ) # Sand Talk + + self.assertEqual(models.Edition.objects.count(), 1) + + def test_get_or_create_edition_not_existing(self): + """Test take a JSON string of books and editions, + find or create the editions in the database and + return a list of edition instances""" + + self.assertEqual(models.Edition.objects.count(), 1) + + with open(self.archive_file, "rb") as fileobj: + with BookwyrmTarFile.open(mode="r:gz", fileobj=fileobj) as tarfile: + + bookwyrm_import_job.get_or_create_edition( + self.json_data["books"][0], tarfile + ) # Seeing like a state + + self.assertTrue(models.Edition.objects.filter(isbn_13="9780300070163").exists()) + self.assertEqual(models.Edition.objects.count(), 2) + + def test_upsert_readthroughs(self): + """Test take a JSON string of readthroughs, find or create the + instances in the database and return a list of saved instances""" + + readthroughs = [ + { + "id": 1, + "created_date": "2023-08-24T10:18:45.923Z", + "updated_date": "2023-08-24T10:18:45.928Z", + "remote_id": "https://example.com/mouse/readthrough/1", + "user_id": 1, + "book_id": 1234, + "progress": 23, + "progress_mode": "PG", + "start_date": "2022-12-31T13:30:00Z", + "finish_date": "2023-08-23T14:30:00Z", + "stopped_date": None, + "is_active": False, + } + ] + + self.assertEqual(models.ReadThrough.objects.count(), 0) + bookwyrm_import_job.upsert_readthroughs( + readthroughs, self.local_user, self.book.id + ) + + self.assertEqual(models.ReadThrough.objects.count(), 1) + self.assertEqual(models.ReadThrough.objects.first().progress_mode, "PG") + self.assertEqual( + models.ReadThrough.objects.first().start_date, + parse_datetime("2022-12-31T13:30:00Z"), + ) + self.assertEqual(models.ReadThrough.objects.first().book_id, self.book.id) + self.assertEqual(models.ReadThrough.objects.first().user, self.local_user) + + def test_get_or_create_review(self): + """Test get_or_create_review_status with a review""" + + self.assertEqual(models.Review.objects.filter(user=self.local_user).count(), 0) + reviews = self.json_data["books"][0]["reviews"] + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ), patch("bookwyrm.models.bookwyrm_import_job.is_alias", return_value=True): + + bookwyrm_import_job.upsert_statuses( + self.local_user, models.Review, reviews, self.book.remote_id + ) + + self.assertEqual(models.Review.objects.filter(user=self.local_user).count(), 1) + self.assertEqual( + models.Review.objects.filter(book=self.book).first().content, + "I like it
", + ) + self.assertEqual( + models.Review.objects.filter(book=self.book).first().content_warning, + "Here's a spoiler alert", + ) + self.assertEqual( + models.Review.objects.filter(book=self.book).first().sensitive, True + ) + self.assertEqual( + models.Review.objects.filter(book=self.book).first().name, "great book" + ) + self.assertAlmostEqual( + models.Review.objects.filter(book=self.book).first().rating, 5.00 + ) + + self.assertEqual( + models.Review.objects.filter(book=self.book).first().privacy, "followers" + ) + + def test_get_or_create_comment(self): + """Test get_or_create_review_status with a comment""" + + self.assertEqual(models.Comment.objects.filter(user=self.local_user).count(), 0) + comments = self.json_data["books"][1]["comments"] + + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ), patch("bookwyrm.models.bookwyrm_import_job.is_alias", return_value=True): + + bookwyrm_import_job.upsert_statuses( + self.local_user, models.Comment, comments, self.book.remote_id + ) + self.assertEqual(models.Comment.objects.filter(user=self.local_user).count(), 1) + self.assertEqual( + models.Comment.objects.filter(book=self.book).first().content, + "this is a comment about an amazing book
", + ) + self.assertEqual( + models.Comment.objects.filter(book=self.book).first().content_warning, None + ) + self.assertEqual( + models.Comment.objects.filter(book=self.book).first().sensitive, False + ) + self.assertEqual( + models.Comment.objects.filter(book=self.book).first().progress_mode, "PG" + ) + + def test_get_or_create_quote(self): + """Test get_or_create_review_status with a quote""" + + self.assertEqual( + models.Quotation.objects.filter(user=self.local_user).count(), 0 + ) + quotes = self.json_data["books"][1]["quotations"] + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ), patch("bookwyrm.models.bookwyrm_import_job.is_alias", return_value=True): + + bookwyrm_import_job.upsert_statuses( + self.local_user, models.Quotation, quotes, self.book.remote_id + ) + self.assertEqual( + models.Quotation.objects.filter(user=self.local_user).count(), 1 + ) + self.assertEqual( + models.Quotation.objects.filter(book=self.book).first().content, + "not actually from this book lol
", + ) + self.assertEqual( + models.Quotation.objects.filter(book=self.book).first().content_warning, + "spoiler ahead!", + ) + self.assertEqual( + models.Quotation.objects.filter(book=self.book).first().quote, + "To be or not to be
", + ) + self.assertEqual( + models.Quotation.objects.filter(book=self.book).first().position_mode, "PG" + ) + + def test_get_or_create_quote_unauthorized(self): + """Test get_or_create_review_status with a quote but not authorized""" + + self.assertEqual( + models.Quotation.objects.filter(user=self.local_user).count(), 0 + ) + quotes = self.json_data["books"][1]["quotations"] + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ), patch("bookwyrm.models.bookwyrm_import_job.is_alias", return_value=False): + + bookwyrm_import_job.upsert_statuses( + self.local_user, models.Quotation, quotes, self.book.remote_id + ) + self.assertEqual( + models.Quotation.objects.filter(user=self.local_user).count(), 0 + ) + + def test_upsert_list_existing(self): + """Take a list and ListItems as JSON and create DB entries + if they don't already exist""" + + book_data = self.json_data["books"][0] + + other_book = models.Edition.objects.create( + title="Another Book", remote_id="https://example.com/book/9876" + ) + + with patch("bookwyrm.lists_stream.remove_list_task.delay"), patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ): + book_list = models.List.objects.create( + name="my list of books", user=self.local_user + ) + + models.ListItem.objects.create( + book=self.book, book_list=book_list, user=self.local_user, order=1 + ) + + self.assertTrue(models.List.objects.filter(id=book_list.id).exists()) + self.assertEqual(models.List.objects.filter(user=self.local_user).count(), 1) + self.assertEqual( + models.ListItem.objects.filter( + user=self.local_user, book_list=book_list + ).count(), + 1, + ) + + with patch("bookwyrm.lists_stream.remove_list_task.delay"), patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ): + bookwyrm_import_job.upsert_lists( + self.local_user, + book_data["lists"], + other_book.id, + ) + + self.assertEqual(models.List.objects.filter(user=self.local_user).count(), 1) + self.assertEqual(models.List.objects.filter(user=self.local_user).count(), 1) + self.assertEqual( + models.ListItem.objects.filter( + user=self.local_user, book_list=book_list + ).count(), + 2, + ) + + def test_upsert_list_not_existing(self): + """Take a list and ListItems as JSON and create DB entries + if they don't already exist""" + + book_data = self.json_data["books"][0] + + self.assertEqual(models.List.objects.filter(user=self.local_user).count(), 0) + self.assertFalse(models.ListItem.objects.filter(book=self.book.id).exists()) + + with patch("bookwyrm.lists_stream.remove_list_task.delay"), patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ): + bookwyrm_import_job.upsert_lists( + self.local_user, + book_data["lists"], + self.book.id, + ) + + self.assertEqual(models.List.objects.filter(user=self.local_user).count(), 1) + self.assertEqual( + models.ListItem.objects.filter(user=self.local_user).count(), 1 + ) + + def test_upsert_shelves_existing(self): + """Take shelf and ShelfBooks JSON objects and create + DB entries if they don't already exist""" + + self.assertEqual( + models.ShelfBook.objects.filter(user=self.local_user.id).count(), 0 + ) + + shelf = models.Shelf.objects.get(name="Read", user=self.local_user) + + with patch("bookwyrm.activitystreams.add_book_statuses_task.delay"), patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ): + models.ShelfBook.objects.create( + book=self.book, shelf=shelf, user=self.local_user + ) + + book_data = self.json_data["books"][0] + with patch("bookwyrm.activitystreams.add_book_statuses_task.delay"), patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ): + bookwyrm_import_job.upsert_shelves(self.book, self.local_user, book_data) + + self.assertEqual( + models.ShelfBook.objects.filter(user=self.local_user.id).count(), 2 + ) + + def test_upsert_shelves_not_existing(self): + """Take shelf and ShelfBooks JSON objects and create + DB entries if they don't already exist""" + + self.assertEqual( + models.ShelfBook.objects.filter(user=self.local_user.id).count(), 0 + ) + + book_data = self.json_data["books"][0] + + with patch("bookwyrm.activitystreams.add_book_statuses_task.delay"), patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ): + bookwyrm_import_job.upsert_shelves(self.book, self.local_user, book_data) + + self.assertEqual( + models.ShelfBook.objects.filter(user=self.local_user.id).count(), 2 + ) + + # check we didn't create an extra shelf + self.assertEqual( + models.Shelf.objects.filter(user=self.local_user.id).count(), 4 + ) diff --git a/bookwyrm/tests/models/test_fields.py b/bookwyrm/tests/models/test_fields.py index 553a533d5..d04178d4a 100644 --- a/bookwyrm/tests/models/test_fields.py +++ b/bookwyrm/tests/models/test_fields.py @@ -2,10 +2,12 @@ from io import BytesIO from collections import namedtuple from dataclasses import dataclass +import datetime import json import pathlib import re from typing import List +from unittest import expectedFailure from unittest.mock import patch from PIL import Image @@ -594,6 +596,36 @@ class ModelFields(TestCase): self.assertEqual(instance.field_from_activity(now.isoformat()), now) self.assertEqual(instance.field_from_activity("bip"), None) + def test_partial_date_legacy_formats(self, *_): + """test support for full isoformat in partial dates""" + instance = fields.PartialDateField() + expected = datetime.date(2023, 10, 20) + test_cases = [ + ("no_tz", "2023-10-20T00:00:00"), + ("no_tz_eod", "2023-10-20T23:59:59.999999"), + ("utc_offset_midday", "2023-10-20T12:00:00+0000"), + ("utc_offset_midnight", "2023-10-20T00:00:00+00"), + ("eastern_tz_parsed", "2023-10-20T15:20:30+04:30"), + ("western_tz_midnight", "2023-10-20:00:00-03"), + ] + for desc, value in test_cases: + with self.subTest(desc): + parsed = instance.field_from_activity(value) + self.assertIsNotNone(parsed) + self.assertEqual(expected, parsed.date()) + self.assertTrue(parsed.has_day) + self.assertTrue(parsed.has_month) + + @expectedFailure + def test_partial_date_timezone_fix(self, *_): + """deserialization compensates for unwanted effects of USE_TZ""" + instance = fields.PartialDateField() + expected = datetime.date(2023, 10, 1) + parsed = instance.field_from_activity("2023-09-30T21:00:00-03") + self.assertEqual(expected, parsed.date()) + self.assertTrue(parsed.has_day) + self.assertTrue(parsed.has_month) + def test_array_field(self, *_): """idk why it makes them strings but probably for a good reason""" instance = fields.ArrayField(fields.IntegerField) diff --git a/bookwyrm/tests/models/test_group.py b/bookwyrm/tests/models/test_group.py index 86cafaa39..6f5388b19 100644 --- a/bookwyrm/tests/models/test_group.py +++ b/bookwyrm/tests/models/test_group.py @@ -9,7 +9,8 @@ from bookwyrm import models class Group(TestCase): """some activitypub oddness ahead""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """Set up for tests""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( diff --git a/bookwyrm/tests/models/test_import_model.py b/bookwyrm/tests/models/test_import_model.py index d1ff209f4..7ca36d223 100644 --- a/bookwyrm/tests/models/test_import_model.py +++ b/bookwyrm/tests/models/test_import_model.py @@ -16,7 +16,8 @@ from bookwyrm.connectors import connector_manager class ImportJob(TestCase): """this is a fancy one!!!""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """data is from a goodreads export of The Raven Tower""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" @@ -24,6 +25,8 @@ class ImportJob(TestCase): self.local_user = models.User.objects.create_user( "mouse", "mouse@mouse.mouse", "password", local=True ) + + def setUp(self): self.job = models.ImportJob.objects.create(user=self.local_user, mappings={}) def test_isbn(self): diff --git a/bookwyrm/tests/models/test_link.py b/bookwyrm/tests/models/test_link.py index 8afecd6ce..f72bdc239 100644 --- a/bookwyrm/tests/models/test_link.py +++ b/bookwyrm/tests/models/test_link.py @@ -9,17 +9,6 @@ from bookwyrm import models class Link(TestCase): """some activitypub oddness ahead""" - def setUp(self): - """look, a list""" - with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( - "bookwyrm.activitystreams.populate_stream_task.delay" - ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): - self.local_user = models.User.objects.create_user( - "mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse" - ) - work = models.Work.objects.create(title="hello") - self.book = models.Edition.objects.create(title="hi", parent_work=work) - def test_create_domain(self, _): """generated default name""" domain = models.LinkDomain.objects.create(domain="beep.com") diff --git a/bookwyrm/tests/models/test_list.py b/bookwyrm/tests/models/test_list.py index f7e64c6f2..83d7ed6a5 100644 --- a/bookwyrm/tests/models/test_list.py +++ b/bookwyrm/tests/models/test_list.py @@ -11,7 +11,8 @@ from bookwyrm import models, settings class List(TestCase): """some activitypub oddness ahead""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """look, a list""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" diff --git a/bookwyrm/tests/models/test_notification.py b/bookwyrm/tests/models/test_notification.py index 0e4fe91c7..93422640b 100644 --- a/bookwyrm/tests/models/test_notification.py +++ b/bookwyrm/tests/models/test_notification.py @@ -7,7 +7,8 @@ from bookwyrm import models class Notification(TestCase): """let people know things""" - def setUp(self): # pylint: disable=invalid-name + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """useful things for creating a notification""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" @@ -43,7 +44,7 @@ class Notification(TestCase): def test_notification(self): """New notifications are unread""" notification = models.Notification.objects.create( - user=self.local_user, notification_type=models.Notification.FAVORITE + user=self.local_user, notification_type=models.NotificationType.FAVORITE ) self.assertFalse(notification.read) @@ -52,7 +53,7 @@ class Notification(TestCase): models.Notification.notify( self.local_user, self.remote_user, - notification_type=models.Notification.FAVORITE, + notification_type=models.NotificationType.FAVORITE, ) self.assertTrue(models.Notification.objects.exists()) @@ -61,7 +62,7 @@ class Notification(TestCase): models.Notification.notify( self.local_user, self.remote_user, - notification_type=models.Notification.FAVORITE, + notification_type=models.NotificationType.FAVORITE, ) self.assertEqual(models.Notification.objects.count(), 1) notification = models.Notification.objects.get() @@ -70,7 +71,7 @@ class Notification(TestCase): models.Notification.notify( self.local_user, self.another_user, - notification_type=models.Notification.FAVORITE, + notification_type=models.NotificationType.FAVORITE, ) self.assertEqual(models.Notification.objects.count(), 1) notification.refresh_from_db() @@ -92,7 +93,7 @@ class Notification(TestCase): models.Notification.notify( self.remote_user, self.local_user, - notification_type=models.Notification.FAVORITE, + notification_type=models.NotificationType.FAVORITE, ) self.assertFalse(models.Notification.objects.exists()) @@ -101,7 +102,7 @@ class Notification(TestCase): models.Notification.notify( self.local_user, self.local_user, - notification_type=models.Notification.FAVORITE, + notification_type=models.NotificationType.FAVORITE, ) self.assertFalse(models.Notification.objects.exists()) @@ -154,14 +155,14 @@ class Notification(TestCase): models.Notification.notify( self.local_user, self.remote_user, - notification_type=models.Notification.FAVORITE, + notification_type=models.NotificationType.FAVORITE, ) self.assertTrue(models.Notification.objects.exists()) models.Notification.unnotify( self.local_user, self.remote_user, - notification_type=models.Notification.FAVORITE, + notification_type=models.NotificationType.FAVORITE, ) self.assertFalse(models.Notification.objects.exists()) @@ -170,25 +171,113 @@ class Notification(TestCase): models.Notification.notify( self.local_user, self.remote_user, - notification_type=models.Notification.FAVORITE, + notification_type=models.NotificationType.FAVORITE, ) models.Notification.notify( self.local_user, self.another_user, - notification_type=models.Notification.FAVORITE, + notification_type=models.NotificationType.FAVORITE, ) self.assertTrue(models.Notification.objects.exists()) models.Notification.unnotify( self.local_user, self.remote_user, - notification_type=models.Notification.FAVORITE, + notification_type=models.NotificationType.FAVORITE, ) self.assertTrue(models.Notification.objects.exists()) models.Notification.unnotify( self.local_user, self.another_user, - notification_type=models.Notification.FAVORITE, + notification_type=models.NotificationType.FAVORITE, ) self.assertFalse(models.Notification.objects.exists()) + + +class NotifyInviteRequest(TestCase): + """let admins know of invite requests""" + + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument + """ensure there is one admin""" + with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( + "bookwyrm.activitystreams.populate_stream_task.delay" + ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): + self.local_user = models.User.objects.create_user( + "mouse@local.com", + "mouse@mouse.mouse", + "password", + local=True, + localname="mouse", + is_superuser=True, + ) + + def test_invite_request_triggers_notification(self): + """requesting an invite notifies the admin""" + admin = models.User.objects.filter(is_superuser=True).first() + request = models.InviteRequest.objects.create(email="user@example.com") + + self.assertEqual(models.Notification.objects.count(), 1) + + notification = models.Notification.objects.first() + self.assertEqual(notification.user, admin) + self.assertEqual( + notification.notification_type, models.NotificationType.INVITE_REQUEST + ) + self.assertEqual(notification.related_invite_requests.count(), 1) + self.assertEqual(notification.related_invite_requests.first(), request) + + def test_notify_only_created(self): + """updating an invite request does not trigger a notification""" + request = models.InviteRequest.objects.create(email="user@example.com") + notification = models.Notification.objects.first() + + notification.delete() + self.assertEqual(models.Notification.objects.count(), 0) + + request.ignored = True + request.save() + self.assertEqual(models.Notification.objects.count(), 0) + + def test_notify_grouping(self): + """invites group into the same notification, until read""" + requests = [ + models.InviteRequest.objects.create(email="user1@example.com"), + models.InviteRequest.objects.create(email="user2@example.com"), + ] + self.assertEqual(models.Notification.objects.count(), 1) + + notification = models.Notification.objects.first() + self.assertEqual(notification.related_invite_requests.count(), 2) + self.assertCountEqual(notification.related_invite_requests.all(), requests) + + notification.read = True + notification.save() + + request = models.InviteRequest.objects.create(email="user3@example.com") + _, notification = models.Notification.objects.all() + + self.assertEqual(models.Notification.objects.count(), 2) + self.assertEqual(notification.related_invite_requests.count(), 1) + self.assertEqual(notification.related_invite_requests.first(), request) + + def test_notify_multiple_admins(self): + """all admins are notified""" + with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( + "bookwyrm.activitystreams.populate_stream_task.delay" + ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): + self.local_user = models.User.objects.create_user( + "admin@local.com", + "admin@example.com", + "password", + local=True, + localname="root", + is_superuser=True, + ) + models.InviteRequest.objects.create(email="user@example.com") + admins = models.User.objects.filter(is_superuser=True).all() + notifications = models.Notification.objects.all() + + self.assertEqual(len(notifications), 2) + self.assertCountEqual([notif.user for notif in notifications], admins) diff --git a/bookwyrm/tests/models/test_readthrough_model.py b/bookwyrm/tests/models/test_readthrough_model.py index 7e3963cff..d34a06aaf 100644 --- a/bookwyrm/tests/models/test_readthrough_model.py +++ b/bookwyrm/tests/models/test_readthrough_model.py @@ -11,7 +11,8 @@ from bookwyrm import models class ReadThrough(TestCase): """some activitypub oddness ahead""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """look, a shelf""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" diff --git a/bookwyrm/tests/models/test_relationship_models.py b/bookwyrm/tests/models/test_relationship_models.py index a5b4dbffd..8f849bc3b 100644 --- a/bookwyrm/tests/models/test_relationship_models.py +++ b/bookwyrm/tests/models/test_relationship_models.py @@ -14,7 +14,8 @@ from bookwyrm import models class Relationship(TestCase): """following, blocking, stuff like that""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """we need some users for this""" with patch("bookwyrm.models.user.set_remote_server.delay"): self.remote_user = models.User.objects.create_user( diff --git a/bookwyrm/tests/models/test_shelf_model.py b/bookwyrm/tests/models/test_shelf_model.py index 4f7f35890..88b1fad06 100644 --- a/bookwyrm/tests/models/test_shelf_model.py +++ b/bookwyrm/tests/models/test_shelf_model.py @@ -15,7 +15,8 @@ from bookwyrm import models, settings class Shelf(TestCase): """some activitypub oddness ahead""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """look, a shelf""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" diff --git a/bookwyrm/tests/models/test_site.py b/bookwyrm/tests/models/test_site.py index 05882268e..f4accc04b 100644 --- a/bookwyrm/tests/models/test_site.py +++ b/bookwyrm/tests/models/test_site.py @@ -12,7 +12,8 @@ from bookwyrm import models, settings class SiteModels(TestCase): """tests for site models""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """we need basic test data and mocks""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" diff --git a/bookwyrm/tests/models/test_status_model.py b/bookwyrm/tests/models/test_status_model.py index d1f07b44e..9899f6bf3 100644 --- a/bookwyrm/tests/models/test_status_model.py +++ b/bookwyrm/tests/models/test_status_model.py @@ -24,8 +24,8 @@ from bookwyrm import activitypub, models, settings class Status(TestCase): """lotta types of statuses""" - # pylint: disable=invalid-name - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """useful things for creating a status""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" @@ -45,6 +45,10 @@ class Status(TestCase): ) self.book = models.Edition.objects.create(title="Test Edition") + def setUp(self): + """individual test setup""" + self.anonymous_user = AnonymousUser + self.anonymous_user.is_authenticated = False image_file = pathlib.Path(__file__).parent.joinpath( "../../static/images/default_avi.jpg" ) @@ -54,9 +58,6 @@ class Status(TestCase): image.save(output, format=image.format) self.book.cover.save("test.jpg", ContentFile(output.getvalue())) - self.anonymous_user = AnonymousUser - self.anonymous_user.is_authenticated = False - def test_status_generated_fields(self, *_): """setting remote id""" status = models.Status.objects.create(content="bleh", user=self.local_user) diff --git a/bookwyrm/tests/models/test_user_model.py b/bookwyrm/tests/models/test_user_model.py index 9d6294768..47a662e49 100644 --- a/bookwyrm/tests/models/test_user_model.py +++ b/bookwyrm/tests/models/test_user_model.py @@ -1,7 +1,9 @@ """ testing models """ import json + from unittest.mock import patch from django.contrib.auth.models import Group +from django.db import IntegrityError from django.test import TestCase import responses @@ -9,13 +11,15 @@ from bookwyrm import models from bookwyrm.management.commands import initdb from bookwyrm.settings import USE_HTTPS, DOMAIN + # pylint: disable=missing-class-docstring # pylint: disable=missing-function-docstring class User(TestCase): + protocol = "https://" if USE_HTTPS else "http://" - # pylint: disable=invalid-name - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): @@ -26,6 +30,7 @@ class User(TestCase): local=True, localname="mouse", name="hi", + summary="a summary", bookwyrm_user=False, ) self.another_user = models.User.objects.create_user( @@ -88,9 +93,11 @@ class User(TestCase): "https://www.w3.org/ns/activitystreams", "https://w3id.org/security/v1", { - "manuallyApprovesFollowers": "as:manuallyApprovesFollowers", - "schema": "http://schema.org#", "PropertyValue": "schema:PropertyValue", + "alsoKnownAs": {"@id": "as:alsoKnownAs", "@type": "@id"}, + "manuallyApprovesFollowers": "as:manuallyApprovesFollowers", + "movedTo": {"@id": "as:movedTo", "@type": "@id"}, + "schema": "http://schema.org#", "value": "schema:value", }, ], @@ -216,19 +223,71 @@ class User(TestCase): @patch("bookwyrm.suggested_users.remove_user_task.delay") def test_delete_user(self, _): - """deactivate a user""" + """permanently delete a user""" self.assertTrue(self.user.is_active) + self.assertEqual(self.user.name, "hi") + self.assertEqual(self.user.summary, "a summary") + self.assertEqual(self.user.email, "mouse@mouse.mouse") with patch( "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" - ) as broadcast_mock: + ) as broadcast_mock, patch( + "bookwyrm.models.user.User.erase_user_statuses" + ) as erase_statuses_mock: self.user.delete() + self.assertEqual(erase_statuses_mock.call_count, 1) + + # make sure the deletion is broadcast self.assertEqual(broadcast_mock.call_count, 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.user.refresh_from_db() + + # the user's account data should be deleted + self.assertIsNone(self.user.name) + self.assertIsNone(self.user.summary) + self.assertNotEqual(self.user.email, "mouse@mouse.mouse") self.assertFalse(self.user.is_active) + @patch("bookwyrm.suggested_users.remove_user_task.delay") + @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") + @patch("bookwyrm.activitystreams.add_status_task.delay") + @patch("bookwyrm.activitystreams.remove_status_task.delay") + def test_delete_user_erase_statuses(self, *_): + """erase user statuses when user is deleted""" + status = models.Status.objects.create(user=self.user, content="hello") + self.assertFalse(status.deleted) + self.assertIsNotNone(status.content) + self.assertIsNone(status.deleted_date) + + self.user.delete() + status.refresh_from_db() + + self.assertTrue(status.deleted) + self.assertIsNone(status.content) + self.assertIsNotNone(status.deleted_date) + + @patch("bookwyrm.suggested_users.remove_user_task.delay") + @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") + @patch("bookwyrm.activitystreams.add_status_task.delay") + def test_delete_user_erase_statuses_invalid(self, *_): + """erase user statuses when user is deleted""" + status = models.Status.objects.create(user=self.user, content="hello") + self.assertFalse(status.deleted) + self.assertIsNotNone(status.content) + self.assertIsNone(status.deleted_date) + + self.user.deactivate() + with self.assertRaises(IntegrityError): + self.user.erase_user_statuses() + + status.refresh_from_db() + self.assertFalse(status.deleted) + self.assertIsNotNone(status.content) + self.assertIsNone(status.deleted_date) + def test_admins_no_admins(self): """list of admins""" result = models.User.admins() diff --git a/bookwyrm/tests/templatetags/test_book_display_tags.py b/bookwyrm/tests/templatetags/test_book_display_tags.py index 54ae8806b..dcff01a80 100644 --- a/bookwyrm/tests/templatetags/test_book_display_tags.py +++ b/bookwyrm/tests/templatetags/test_book_display_tags.py @@ -13,7 +13,8 @@ from bookwyrm.templatetags import book_display_tags class BookDisplayTags(TestCase): """lotta different things here""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """create some filler objects""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" diff --git a/bookwyrm/tests/templatetags/test_date_ext.py b/bookwyrm/tests/templatetags/test_date_ext.py new file mode 100644 index 000000000..bd31a95c9 --- /dev/null +++ b/bookwyrm/tests/templatetags/test_date_ext.py @@ -0,0 +1,85 @@ +"""Test date extensions in templates""" +from dateutil.parser import isoparse + +from django.test import TestCase, override_settings +from django.utils import timezone + +from bookwyrm.templatetags import date_ext +from bookwyrm.utils.partial_date import ( + MonthParts, + PartialDate, + YearParts, + from_partial_isoformat, +) + + +@override_settings(LANGUAGE_CODE="en-AU") +class PartialDateTags(TestCase): + """PartialDate tags""" + + def setUp(self): + """create dates and set language""" + self._dt = isoparse("2023-12-31T23:59:59Z") + self._date = self._dt.date() + self._partial_day = from_partial_isoformat("2023-06-30") + self._partial_month = MonthParts.from_date_parts(2023, 6, 30) + self._partial_year = YearParts.from_datetime(self._dt) + + def test_standard_date_objects(self): + """should work with standard date/datetime objects""" + self.assertEqual("31 Dec 2023", date_ext.naturalday_partial(self._dt)) + self.assertEqual("31 Dec 2023", date_ext.naturalday_partial(self._date)) + + def test_partial_date_objects(self): + """should work with PartialDate and subclasses""" + self.assertEqual("2023", date_ext.naturalday_partial(self._partial_year)) + self.assertEqual("June 2023", date_ext.naturalday_partial(self._partial_month)) + self.assertEqual("30 Jun 2023", date_ext.naturalday_partial(self._partial_day)) + + def test_format_arg_is_used(self): + """the provided format should be used by default""" + self.assertEqual("Dec.31", date_ext.naturalday_partial(self._dt, "M.j")) + self.assertEqual("Dec.31", date_ext.naturalday_partial(self._date, "M.j")) + self.assertEqual("June", date_ext.naturalday_partial(self._partial_day, "F")) + + def test_month_precision_downcast(self): + """precision is adjusted for well-known date formats""" + self.assertEqual( + "June 2023", date_ext.naturalday_partial(self._partial_month, "DATE_FORMAT") + ) + + def test_year_precision_downcast(self): + """precision is adjusted for well-known date formats""" + for fmt in "DATE_FORMAT", "SHORT_DATE_FORMAT", "YEAR_MONTH_FORMAT": + with self.subTest(desc=fmt): + self.assertEqual( + "2023", date_ext.naturalday_partial(self._partial_year, fmt) + ) + + def test_nonstandard_formats_passthru(self): + """garbage-in, garbage-out: we don't mess with unknown date formats""" + # Expected because there is no SHORT_YEAR_MONTH_FORMAT in Django that we can use + self.assertEqual( + "30/06/2023", + date_ext.naturalday_partial(self._partial_month, "SHORT_DATE_FORMAT"), + ) + self.assertEqual( + "December.31", date_ext.naturalday_partial(self._partial_year, "F.j") + ) + + def test_natural_format(self): + """today and yesterday are handled correctly""" + today = timezone.now() + today_date = today.date() + today_exact = PartialDate.from_datetime(today) + + # exact dates can be naturalized + self.assertEqual("today", date_ext.naturalday_partial(today)) + self.assertEqual("today", date_ext.naturalday_partial(today_date)) + self.assertEqual("today", date_ext.naturalday_partial(today_exact)) + + # dates with missing parts can't + today_year = YearParts.from_datetime(today) + today_month = MonthParts.from_datetime(today) + self.assertEqual(str(today.year), date_ext.naturalday_partial(today_year)) + self.assertEqual(str(today.year), date_ext.naturalday_partial(today_month, "Y")) diff --git a/bookwyrm/tests/templatetags/test_feed_page_tags.py b/bookwyrm/tests/templatetags/test_feed_page_tags.py index 5e5dc2357..d0a895f36 100644 --- a/bookwyrm/tests/templatetags/test_feed_page_tags.py +++ b/bookwyrm/tests/templatetags/test_feed_page_tags.py @@ -12,7 +12,8 @@ from bookwyrm.templatetags import feed_page_tags class FeedPageTags(TestCase): """lotta different things here""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """create some filler objects""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" diff --git a/bookwyrm/tests/templatetags/test_interaction.py b/bookwyrm/tests/templatetags/test_interaction.py index a48b3364d..a9d1267c0 100644 --- a/bookwyrm/tests/templatetags/test_interaction.py +++ b/bookwyrm/tests/templatetags/test_interaction.py @@ -12,7 +12,8 @@ from bookwyrm.templatetags import interaction class InteractionTags(TestCase): """lotta different things here""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """create some filler objects""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" diff --git a/bookwyrm/tests/templatetags/test_notification_page_tags.py b/bookwyrm/tests/templatetags/test_notification_page_tags.py index 3c92181b2..94f839ec5 100644 --- a/bookwyrm/tests/templatetags/test_notification_page_tags.py +++ b/bookwyrm/tests/templatetags/test_notification_page_tags.py @@ -12,7 +12,8 @@ from bookwyrm.templatetags import notification_page_tags class NotificationPageTags(TestCase): """lotta different things here""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """create some filler objects""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" diff --git a/bookwyrm/tests/templatetags/test_rating_tags.py b/bookwyrm/tests/templatetags/test_rating_tags.py index 8c07eeb8f..5225d57a6 100644 --- a/bookwyrm/tests/templatetags/test_rating_tags.py +++ b/bookwyrm/tests/templatetags/test_rating_tags.py @@ -12,7 +12,8 @@ from bookwyrm.templatetags import rating_tags class RatingTags(TestCase): """lotta different things here""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """create some filler objects""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" diff --git a/bookwyrm/tests/templatetags/test_shelf_tags.py b/bookwyrm/tests/templatetags/test_shelf_tags.py index 5a88604dd..7c456c815 100644 --- a/bookwyrm/tests/templatetags/test_shelf_tags.py +++ b/bookwyrm/tests/templatetags/test_shelf_tags.py @@ -15,9 +15,9 @@ from bookwyrm.templatetags import shelf_tags class ShelfTags(TestCase): """lotta different things here""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """create some filler objects""" - self.factory = RequestFactory() with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): @@ -41,6 +41,10 @@ class ShelfTags(TestCase): parent_work=models.Work.objects.create(title="Test work"), ) + def setUp(self): + """test data""" + self.factory = RequestFactory() + def test_get_is_book_on_shelf(self, *_): """check if a book is on a shelf""" shelf = self.local_user.shelf_set.first() diff --git a/bookwyrm/tests/templatetags/test_status_display.py b/bookwyrm/tests/templatetags/test_status_display.py index af2fc9420..a9bab0b68 100644 --- a/bookwyrm/tests/templatetags/test_status_display.py +++ b/bookwyrm/tests/templatetags/test_status_display.py @@ -14,7 +14,8 @@ from bookwyrm.templatetags import status_display class StatusDisplayTags(TestCase): """lotta different things here""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """create some filler objects""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" diff --git a/bookwyrm/tests/templatetags/test_utilities.py b/bookwyrm/tests/templatetags/test_utilities.py index c9e1c744f..1bf98fda8 100644 --- a/bookwyrm/tests/templatetags/test_utilities.py +++ b/bookwyrm/tests/templatetags/test_utilities.py @@ -14,8 +14,8 @@ from bookwyrm.templatetags import utilities class UtilitiesTags(TestCase): """lotta different things here""" - # pylint: disable=invalid-name - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """create some filler objects""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" diff --git a/bookwyrm/tests/test_book_search.py b/bookwyrm/tests/test_book_search.py index db6ba8353..d2056bfeb 100644 --- a/bookwyrm/tests/test_book_search.py +++ b/bookwyrm/tests/test_book_search.py @@ -10,7 +10,8 @@ from bookwyrm.connectors.abstract_connector import AbstractMinimalConnector class BookSearch(TestCase): """look for some books""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """we need basic test data and mocks""" self.work = models.Work.objects.create(title="Example Work") @@ -26,10 +27,10 @@ class BookSearch(TestCase): parent_work=self.work, isbn_10="1111111111", openlibrary_key="hello", + pages=150, ) - self.third_edition = models.Edition.objects.create( - title="Edition with annoying ISBN", + title="Another Edition with annoying ISBN", parent_work=self.work, isbn_10="022222222X", ) @@ -76,16 +77,21 @@ class BookSearch(TestCase): def test_search_title_author(self): """search by unique identifiers""" - results = book_search.search_title_author("Another", min_confidence=0) + results = book_search.search_title_author("annoying", min_confidence=0) self.assertEqual(len(results), 1) - self.assertEqual(results[0], self.second_edition) + self.assertEqual(results[0], self.third_edition) def test_search_title_author_return_first(self): - """search by unique identifiers""" - results = book_search.search_title_author( + """sorts by edition rank""" + result = book_search.search_title_author( "Another", min_confidence=0, return_first=True ) - self.assertEqual(results, self.second_edition) + self.assertEqual(result, self.second_edition) # highest edition rank + + def test_search_title_author_one_edition_per_work(self): + """at most one edition per work""" + results = book_search.search_title_author("Edition", 0) + self.assertEqual(results, [self.first_edition]) # highest edition rank def test_format_search_result(self): """format a search result""" diff --git a/bookwyrm/tests/test_context_processors.py b/bookwyrm/tests/test_context_processors.py index 3d634aaf2..614db681c 100644 --- a/bookwyrm/tests/test_context_processors.py +++ b/bookwyrm/tests/test_context_processors.py @@ -11,9 +11,9 @@ from bookwyrm.context_processors import site_settings class ContextProcessor(TestCase): """pages you land on without really trying""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """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" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): @@ -28,6 +28,10 @@ class ContextProcessor(TestCase): self.anonymous_user.is_authenticated = False self.site = models.SiteSettings.objects.create() + def setUp(self): + """other test data""" + self.factory = RequestFactory() + def test_theme_unset(self): """logged in user, no selected theme""" request = self.factory.get("") diff --git a/bookwyrm/tests/test_emailing.py b/bookwyrm/tests/test_emailing.py index b2af59f4f..119941e85 100644 --- a/bookwyrm/tests/test_emailing.py +++ b/bookwyrm/tests/test_emailing.py @@ -11,10 +11,9 @@ from bookwyrm import emailing, models class Emailing(TestCase): """every response to a get request, html or json""" - # pylint: disable=invalid-name - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """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" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): @@ -27,6 +26,10 @@ class Emailing(TestCase): ) models.SiteSettings.objects.create() + def setUp(self): + """other test data""" + self.factory = RequestFactory() + def test_invite_email(self, email_mock): """load the invite email""" invite_request = models.InviteRequest.objects.create( diff --git a/bookwyrm/tests/test_isbn.py b/bookwyrm/tests/test_isbn.py index b528e9210..5486c7151 100644 --- a/bookwyrm/tests/test_isbn.py +++ b/bookwyrm/tests/test_isbn.py @@ -29,3 +29,10 @@ class TestISBN(TestCase): self.assertEqual(hyphenator.hyphenate("9786769533251"), "9786769533251") # 979-8 (United States) 2300000-3499999 (unassigned) self.assertEqual(hyphenator.hyphenate("9798311111111"), "9798311111111") + + def test_isbn_hyphenation_invalid_data(self): + """Make sure not to throw an error when a bad ISBN is found""" + # no action taken + self.assertEqual(hyphenator.hyphenate("978-0-4633461-1-2"), "978-0-4633461-1-2") + self.assertEqual(hyphenator.hyphenate("9-0-4633461-1-2"), "9-0-4633461-1-2") + self.assertEqual(hyphenator.hyphenate("90463346112"), "90463346112") diff --git a/bookwyrm/tests/test_partial_date.py b/bookwyrm/tests/test_partial_date.py new file mode 100644 index 000000000..364d00933 --- /dev/null +++ b/bookwyrm/tests/test_partial_date.py @@ -0,0 +1,150 @@ +""" test partial_date module """ + +import datetime +import unittest + +from django.core.exceptions import ValidationError +from django.utils import timezone +from django.utils import translation + +from bookwyrm.utils import partial_date + + +class PartialDateTest(unittest.TestCase): + """test PartialDate class in isolation""" + + # pylint: disable=missing-function-docstring + + def setUp(self): + self._dt = datetime.datetime(2023, 10, 20, 17, 33, 10, tzinfo=timezone.utc) + + def test_day_seal(self): + sealed = partial_date.PartialDate.from_datetime(self._dt) + self.assertEqual(self._dt, sealed) + self.assertEqual("2023-10-20", sealed.partial_isoformat()) + self.assertTrue(sealed.has_day) + self.assertTrue(sealed.has_month) + + def test_month_seal(self): + sealed = partial_date.MonthParts.from_datetime(self._dt) + self.assertEqual(self._dt, sealed) + self.assertEqual("2023-10", sealed.partial_isoformat()) + self.assertFalse(sealed.has_day) + self.assertTrue(sealed.has_month) + + def test_year_seal(self): + sealed = partial_date.YearParts.from_datetime(self._dt) + self.assertEqual(self._dt, sealed) + self.assertEqual("2023", sealed.partial_isoformat()) + self.assertFalse(sealed.has_day) + self.assertFalse(sealed.has_month) + + def test_no_naive_datetime(self): + with self.assertRaises(ValueError): + partial_date.PartialDate.from_datetime(datetime.datetime(2000, 1, 1)) + + def test_parse_year_seal(self): + parsed = partial_date.from_partial_isoformat("1995") + expected = datetime.date(1995, 1, 1) + self.assertEqual(expected, parsed.date()) + self.assertFalse(parsed.has_day) + self.assertFalse(parsed.has_month) + + def test_parse_year_errors(self): + self.assertRaises(ValueError, partial_date.from_partial_isoformat, "995") + self.assertRaises(ValueError, partial_date.from_partial_isoformat, "1995x") + self.assertRaises(ValueError, partial_date.from_partial_isoformat, "1995-") + + def test_parse_month_seal(self): + expected = datetime.date(1995, 5, 1) + test_cases = [ + ("parse_month", "1995-05"), + ("parse_month_lenient", "1995-5"), + ] + for desc, value in test_cases: + with self.subTest(desc): + parsed = partial_date.from_partial_isoformat(value) + self.assertEqual(expected, parsed.date()) + self.assertFalse(parsed.has_day) + self.assertTrue(parsed.has_month) + + def test_parse_month_dash_required(self): + self.assertRaises(ValueError, partial_date.from_partial_isoformat, "20056") + self.assertRaises(ValueError, partial_date.from_partial_isoformat, "200506") + self.assertRaises(ValueError, partial_date.from_partial_isoformat, "1995-7-") + + def test_parse_day_seal(self): + expected = datetime.date(1995, 5, 6) + test_cases = [ + ("parse_day", "1995-05-06"), + ("parse_day_lenient1", "1995-5-6"), + ("parse_day_lenient2", "1995-05-6"), + ] + for desc, value in test_cases: + with self.subTest(desc): + parsed = partial_date.from_partial_isoformat(value) + self.assertEqual(expected, parsed.date()) + self.assertTrue(parsed.has_day) + self.assertTrue(parsed.has_month) + + def test_partial_isoformat_no_time_allowed(self): + self.assertRaises( + ValueError, partial_date.from_partial_isoformat, "2005-06-07 " + ) + self.assertRaises( + ValueError, partial_date.from_partial_isoformat, "2005-06-07T" + ) + self.assertRaises( + ValueError, partial_date.from_partial_isoformat, "2005-06-07T00:00:00" + ) + self.assertRaises( + ValueError, partial_date.from_partial_isoformat, "2005-06-07T00:00:00-03" + ) + + +class PartialDateFormFieldTest(unittest.TestCase): + """test form support for PartialDate objects""" + + # pylint: disable=missing-function-docstring + + def setUp(self): + self._dt = datetime.datetime(2022, 11, 21, 17, 1, 0, tzinfo=timezone.utc) + self.field = partial_date.PartialDateFormField() + + def test_prepare_value(self): + sealed = partial_date.PartialDate.from_datetime(self._dt) + self.assertEqual("2022-11-21", self.field.prepare_value(sealed)) + + def test_prepare_value_month(self): + sealed = partial_date.MonthParts.from_datetime(self._dt) + self.assertEqual("2022-11-0", self.field.prepare_value(sealed)) + + def test_prepare_value_year(self): + sealed = partial_date.YearParts.from_datetime(self._dt) + self.assertEqual("2022-0-0", self.field.prepare_value(sealed)) + + def test_to_python(self): + date = self.field.to_python("2022-11-21") + self.assertIsInstance(date, partial_date.PartialDate) + self.assertEqual("2022-11-21", date.partial_isoformat()) + + def test_to_python_month(self): + date = self.field.to_python("2022-11-0") + self.assertIsInstance(date, partial_date.PartialDate) + self.assertEqual("2022-11", date.partial_isoformat()) + with self.assertRaises(ValidationError): + self.field.to_python("2022-0-25") + + def test_to_python_year(self): + date = self.field.to_python("2022-0-0") + self.assertIsInstance(date, partial_date.PartialDate) + self.assertEqual("2022", date.partial_isoformat()) + with self.assertRaises(ValidationError): + self.field.to_python("0-05-25") + + def test_to_python_other(self): + with translation.override("es"): + # check super() is called + date = self.field.to_python("5/6/97") + self.assertIsInstance(date, partial_date.PartialDate) + self.assertEqual("1997-06-05", date.partial_isoformat()) diff --git a/bookwyrm/tests/test_signing.py b/bookwyrm/tests/test_signing.py index d61c32df5..b539f089b 100644 --- a/bookwyrm/tests/test_signing.py +++ b/bookwyrm/tests/test_signing.py @@ -35,8 +35,8 @@ Sender = namedtuple("Sender", ("remote_id", "key_pair")) class Signature(TestCase): """signature test""" - # pylint: disable=invalid-name - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """create users and test data""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" @@ -54,15 +54,15 @@ class Signature(TestCase): self.cat = models.User.objects.create_user( f"cat@{DOMAIN}", "cat@example.com", "", local=True, localname="cat" ) + models.SiteSettings.objects.create() + def setUp(self): + """test data""" private_key, public_key = create_key_pair() - self.fake_remote = Sender( "http://localhost/user/remote", KeyPair(private_key, public_key) ) - models.SiteSettings.objects.create() - def send(self, signature, now, data, digest): """test request""" client = Client() diff --git a/bookwyrm/tests/utils/test_tar.py b/bookwyrm/tests/utils/test_tar.py new file mode 100644 index 000000000..be5257542 --- /dev/null +++ b/bookwyrm/tests/utils/test_tar.py @@ -0,0 +1,25 @@ +import os +import pytest +from bookwyrm.utils.tar import BookwyrmTarFile + + +@pytest.fixture +def read_tar(): + archive_path = "../data/bookwyrm_account_export.tar.gz" + with open(archive_path, "rb") as archive_file: + with BookwyrmTarFile.open(mode="r:gz", fileobj=archive_file) as tar: + yield tar + + +@pytest.fixture +def write_tar(): + archive_path = "/tmp/test.tar.gz" + with open(archive_path, "wb") as archive_file: + with BookwyrmTarFile.open(mode="w:gz", fileobj=archive_file) as tar: + yield tar + + os.remove(archive_path) + + +def test_write_bytes(write_tar): + write_tar.write_bytes(b"ABCDEF") diff --git a/bookwyrm/tests/validate_html.py b/bookwyrm/tests/validate_html.py index 423a86586..85e5c6277 100644 --- a/bookwyrm/tests/validate_html.py +++ b/bookwyrm/tests/validate_html.py @@ -8,6 +8,7 @@ def validate_html(html): _, errors = tidy_document( html.content, options={ + "doctype": "html5", "drop-empty-elements": False, "warn-proprietary-attributes": False, }, diff --git a/bookwyrm/tests/views/admin/test_announcements.py b/bookwyrm/tests/views/admin/test_announcements.py index 94f748482..30bc94a1f 100644 --- a/bookwyrm/tests/views/admin/test_announcements.py +++ b/bookwyrm/tests/views/admin/test_announcements.py @@ -11,9 +11,9 @@ from bookwyrm.tests.validate_html import validate_html class AnnouncementViews(TestCase): """every response to a get request, html or json""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """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" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): @@ -27,6 +27,10 @@ class AnnouncementViews(TestCase): models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_announcements_page(self): """there are so many views, this just makes sure it LOADS""" models.Announcement.objects.create(preview="hi", user=self.local_user) diff --git a/bookwyrm/tests/views/admin/test_automod.py b/bookwyrm/tests/views/admin/test_automod.py index a1c03d436..1835a24ee 100644 --- a/bookwyrm/tests/views/admin/test_automod.py +++ b/bookwyrm/tests/views/admin/test_automod.py @@ -15,10 +15,9 @@ from bookwyrm.tests.validate_html import validate_html class AutomodViews(TestCase): """every response to a get request, html or json""" - # pylint: disable=invalid-name - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """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" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): @@ -35,6 +34,10 @@ class AutomodViews(TestCase): self.local_user.groups.set([group]) models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_automod_rules_get(self): """there are so many views, this just makes sure it LOADS""" schedule = IntervalSchedule.objects.create(every=1, period="days") diff --git a/bookwyrm/tests/views/admin/test_celery.py b/bookwyrm/tests/views/admin/test_celery.py index f9429c4c0..d215a9657 100644 --- a/bookwyrm/tests/views/admin/test_celery.py +++ b/bookwyrm/tests/views/admin/test_celery.py @@ -14,10 +14,9 @@ from bookwyrm.tests.validate_html import validate_html class CeleryStatusViews(TestCase): """every response to a get request, html or json""" - # pylint: disable=invalid-name - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """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" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): @@ -34,6 +33,10 @@ class CeleryStatusViews(TestCase): self.local_user.groups.set([group]) models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_celery_status_get(self): """there are so many views, this just makes sure it LOADS""" view = views.CeleryStatus.as_view() diff --git a/bookwyrm/tests/views/admin/test_dashboard.py b/bookwyrm/tests/views/admin/test_dashboard.py index c36e2918f..8eeb754a8 100644 --- a/bookwyrm/tests/views/admin/test_dashboard.py +++ b/bookwyrm/tests/views/admin/test_dashboard.py @@ -14,9 +14,9 @@ from bookwyrm.tests.validate_html import validate_html class DashboardViews(TestCase): """every response to a get request, html or json""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """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" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): @@ -34,6 +34,10 @@ class DashboardViews(TestCase): models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_dashboard(self): """there are so many views, this just makes sure it LOADS""" view = views.Dashboard.as_view() diff --git a/bookwyrm/tests/views/admin/test_email_blocks.py b/bookwyrm/tests/views/admin/test_email_blocks.py index 3c0f548e6..75c0be929 100644 --- a/bookwyrm/tests/views/admin/test_email_blocks.py +++ b/bookwyrm/tests/views/admin/test_email_blocks.py @@ -14,9 +14,9 @@ from bookwyrm.tests.validate_html import validate_html class EmailBlocklistViews(TestCase): """every response to a get request, html or json""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """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" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): @@ -34,6 +34,10 @@ class EmailBlocklistViews(TestCase): models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_blocklist_page_get(self): """there are so many views, this just makes sure it LOADS""" view = views.EmailBlocklist.as_view() diff --git a/bookwyrm/tests/views/admin/test_email_config.py b/bookwyrm/tests/views/admin/test_email_config.py index 3aa16cb1d..63d85cbef 100644 --- a/bookwyrm/tests/views/admin/test_email_config.py +++ b/bookwyrm/tests/views/admin/test_email_config.py @@ -14,10 +14,9 @@ from bookwyrm.tests.validate_html import validate_html class EmailConfigViews(TestCase): """every response to a get request, html or json""" - # pylint: disable=invalid-name - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """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" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): @@ -34,6 +33,10 @@ class EmailConfigViews(TestCase): self.local_user.groups.set([group]) models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_email_config_get(self): """there are so many views, this just makes sure it LOADS""" view = views.EmailConfig.as_view() diff --git a/bookwyrm/tests/views/admin/test_federation.py b/bookwyrm/tests/views/admin/test_federation.py index 95b3225d5..1a5067299 100644 --- a/bookwyrm/tests/views/admin/test_federation.py +++ b/bookwyrm/tests/views/admin/test_federation.py @@ -17,10 +17,9 @@ from bookwyrm.tests.validate_html import validate_html class FederationViews(TestCase): """every response to a get request, html or json""" - # pylint: disable=invalid-name - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """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" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): @@ -48,6 +47,10 @@ class FederationViews(TestCase): models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_federation_page(self): """there are so many views, this just makes sure it LOADS""" view = views.Federation.as_view() diff --git a/bookwyrm/tests/views/admin/test_imports.py b/bookwyrm/tests/views/admin/test_imports.py index eaa9fd84a..5a5599519 100644 --- a/bookwyrm/tests/views/admin/test_imports.py +++ b/bookwyrm/tests/views/admin/test_imports.py @@ -14,10 +14,9 @@ from bookwyrm.tests.validate_html import validate_html class ImportsAdminViews(TestCase): """every response to a get request, html or json""" - # pylint: disable=invalid-name - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """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" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): @@ -34,6 +33,10 @@ class ImportsAdminViews(TestCase): self.local_user.groups.set([group]) models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_celery_status_get(self): """there are so many views, this just makes sure it LOADS""" view = views.ImportList.as_view() diff --git a/bookwyrm/tests/views/admin/test_ip_blocklist.py b/bookwyrm/tests/views/admin/test_ip_blocklist.py index a15a4d368..06c110a06 100644 --- a/bookwyrm/tests/views/admin/test_ip_blocklist.py +++ b/bookwyrm/tests/views/admin/test_ip_blocklist.py @@ -14,9 +14,9 @@ from bookwyrm.tests.validate_html import validate_html class IPBlocklistViews(TestCase): """every response to a get request, html or json""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """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" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): @@ -34,6 +34,10 @@ class IPBlocklistViews(TestCase): models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_blocklist_page_get(self): """there are so many views, this just makes sure it LOADS""" view = views.IPBlocklist.as_view() diff --git a/bookwyrm/tests/views/admin/test_link_domains.py b/bookwyrm/tests/views/admin/test_link_domains.py index 5b2b8e025..14eed419b 100644 --- a/bookwyrm/tests/views/admin/test_link_domains.py +++ b/bookwyrm/tests/views/admin/test_link_domains.py @@ -14,9 +14,9 @@ from bookwyrm.tests.validate_html import validate_html class LinkDomainViews(TestCase): """every response to a get request, html or json""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """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" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): @@ -41,6 +41,10 @@ class LinkDomainViews(TestCase): models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_domain_page_get(self): """there are so many views, this just makes sure it LOADS""" view = views.LinkDomain.as_view() diff --git a/bookwyrm/tests/views/admin/test_reports.py b/bookwyrm/tests/views/admin/test_reports.py index a74e8b0e1..4334eeed9 100644 --- a/bookwyrm/tests/views/admin/test_reports.py +++ b/bookwyrm/tests/views/admin/test_reports.py @@ -15,10 +15,9 @@ from bookwyrm.tests.validate_html import validate_html class ReportViews(TestCase): """every response to a get request, html or json""" - # pylint: disable=invalid-name - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """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" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): @@ -42,6 +41,10 @@ class ReportViews(TestCase): self.local_user.groups.set([group]) models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_reports_page(self): """there are so many views, this just makes sure it LOADS""" view = views.ReportsAdmin.as_view() diff --git a/bookwyrm/tests/views/admin/test_site.py b/bookwyrm/tests/views/admin/test_site.py index 8eda6a2fb..b7c687e09 100644 --- a/bookwyrm/tests/views/admin/test_site.py +++ b/bookwyrm/tests/views/admin/test_site.py @@ -14,10 +14,9 @@ from bookwyrm.tests.validate_html import validate_html class SiteSettingsViews(TestCase): """Edit site settings""" - # pylint: disable=invalid-name - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """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" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): @@ -35,6 +34,10 @@ class SiteSettingsViews(TestCase): self.site = models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_site_get(self): """there are so many views, this just makes sure it LOADS""" view = views.Site.as_view() diff --git a/bookwyrm/tests/views/admin/test_themes.py b/bookwyrm/tests/views/admin/test_themes.py index bc6377681..66384f5fc 100644 --- a/bookwyrm/tests/views/admin/test_themes.py +++ b/bookwyrm/tests/views/admin/test_themes.py @@ -15,10 +15,9 @@ from bookwyrm.tests.validate_html import validate_html class AdminThemesViews(TestCase): """Edit site settings""" - # pylint: disable=invalid-name - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """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" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): @@ -43,6 +42,10 @@ class AdminThemesViews(TestCase): self.site = models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_themes_get(self): """there are so many views, this just makes sure it LOADS""" view = views.Themes.as_view() @@ -86,3 +89,25 @@ class AdminThemesViews(TestCase): with self.assertRaises(PermissionDenied): view(request) + + def test_test_theme(self): + """Testing testing testing test""" + theme = models.Theme.objects.first() + self.assertIsNone(theme.loads) + request = self.factory.post("") + request.user = self.local_user + + views.test_theme(request, theme.id) + theme.refresh_from_db() + self.assertTrue(theme.loads) + + def test_test_theme_broken(self): + """Testing test for testing when it's a bad theme""" + theme = models.Theme.objects.create(name="bad theme", path="dsf/sdf/sdf.sdf") + self.assertIsNone(theme.loads) + request = self.factory.post("") + request.user = self.local_user + + views.test_theme(request, theme.id) + theme.refresh_from_db() + self.assertIs(False, theme.loads) diff --git a/bookwyrm/tests/views/admin/test_user_admin.py b/bookwyrm/tests/views/admin/test_user_admin.py index 1d11c7338..99c630526 100644 --- a/bookwyrm/tests/views/admin/test_user_admin.py +++ b/bookwyrm/tests/views/admin/test_user_admin.py @@ -15,9 +15,9 @@ from bookwyrm.tests.validate_html import validate_html class UserAdminViews(TestCase): """every response to a get request, html or json""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """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" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): @@ -34,6 +34,10 @@ class UserAdminViews(TestCase): self.local_user.groups.set([group]) models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_user_admin_list_page(self): """there are so many views, this just makes sure it LOADS""" view = views.UserAdminList.as_view() diff --git a/bookwyrm/tests/views/books/test_book.py b/bookwyrm/tests/views/books/test_book.py index a829c4a4b..d1d118ec0 100644 --- a/bookwyrm/tests/views/books/test_book.py +++ b/bookwyrm/tests/views/books/test_book.py @@ -23,9 +23,9 @@ from bookwyrm.tests.validate_html import validate_html class BookViews(TestCase): """books books books""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """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" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): @@ -54,6 +54,10 @@ class BookViews(TestCase): models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_book_page(self): """there are so many views, this just makes sure it LOADS""" view = views.Book.as_view() diff --git a/bookwyrm/tests/views/books/test_edit_book.py b/bookwyrm/tests/views/books/test_edit_book.py index 2dc25095f..169112bab 100644 --- a/bookwyrm/tests/views/books/test_edit_book.py +++ b/bookwyrm/tests/views/books/test_edit_book.py @@ -8,6 +8,7 @@ from django.contrib.contenttypes.models import ContentType from django.template.response import TemplateResponse from django.test import TestCase from django.test.client import RequestFactory +from django.utils import timezone from bookwyrm import forms, models, views from bookwyrm.views.books.edit_book import add_authors @@ -18,9 +19,9 @@ from bookwyrm.tests.views.books.test_book import _setup_cover_url class EditBookViews(TestCase): """books books books""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """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" ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): @@ -46,10 +47,13 @@ class EditBookViews(TestCase): remote_id="https://example.com/book/1", parent_work=self.work, ) + models.SiteSettings.objects.create() + + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() # pylint: disable=line-too-long self.authors_body = "%(level)s
."
+msgstr ""
+
+#: bookwyrm/templates/403.html:15
+msgid "If you think you should have access, please speak to your BookWyrm server administrator."
+msgstr ""
+
#: bookwyrm/templates/404.html:4 bookwyrm/templates/404.html:8
msgid "Not Found"
msgstr "No trobat"
@@ -476,6 +496,20 @@ msgstr "No trobat"
msgid "The page you requested doesn't seem to exist!"
msgstr "La pàgina que heu sol·licitat no existeix"
+#: bookwyrm/templates/413.html:4 bookwyrm/templates/413.html:8
+msgid "File too large"
+msgstr ""
+
+#: bookwyrm/templates/413.html:9
+msgid "The file you are uploading is too large."
+msgstr ""
+
+#: bookwyrm/templates/413.html:11
+msgid "\n"
+" You you can try using a smaller file, or ask your BookWyrm server administrator to increase the DATA_UPLOAD_MAX_MEMORY_SIZE
setting.\n"
+" "
+msgstr ""
+
#: bookwyrm/templates/500.html:4
msgid "Oops!"
msgstr "Vaja!"
@@ -536,12 +570,12 @@ msgstr "Les persones moderadores i administradores de %(site_name)s mantenen en
msgid "Moderator"
msgstr "Moderació"
-#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:67
+#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:62
msgid "Admin"
msgstr "Administració"
#: bookwyrm/templates/about/about.html:140
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:28
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
msgid "Send direct message"
@@ -575,7 +609,7 @@ msgid "Software version:"
msgstr "Versió de programari:"
#: bookwyrm/templates/about/layout.html:30
-#: bookwyrm/templates/embed-layout.html:33
+#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/snippets/footer.html:8
#, python-format
msgid "About %(site_name)s"
@@ -680,7 +714,7 @@ msgstr "La seva lectura més breu d'aquest any…"
#: bookwyrm/templates/annual_summary/layout.html:157
#: bookwyrm/templates/annual_summary/layout.html:178
#: bookwyrm/templates/annual_summary/layout.html:247
-#: bookwyrm/templates/book/book.html:63
+#: bookwyrm/templates/book/book.html:65
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
@@ -701,8 +735,8 @@ msgstr "… i la més llarga"
#, python-format
msgid "%(display_name)s set a goal of reading %(goal)s book in %(year)s,bookwyrm/static/css/themes
directory on your server from the command line."
msgstr "Copia el fitxer del tema a la carpeta bookwyrm/static/css/themes
del teu servidor des de la línia d'ordres."
-#: bookwyrm/templates/settings/themes.html:32
+#: bookwyrm/templates/settings/themes.html:41
msgid "Run ./bw-dev compile_themes
and ./bw-dev collectstatic
."
msgstr "Executa ./bw-dev compile_themes
i ./bw-dev collectstatic
."
-#: bookwyrm/templates/settings/themes.html:35
+#: bookwyrm/templates/settings/themes.html:44
msgid "Add the file name using the form below to make it available in the application interface."
msgstr "Afegeix el nom del fitxer a partir del formulari de sota per fer-lo disponible a la interfície de l'aplicació."
-#: bookwyrm/templates/settings/themes.html:42
-#: bookwyrm/templates/settings/themes.html:82
+#: bookwyrm/templates/settings/themes.html:51
+#: bookwyrm/templates/settings/themes.html:91
msgid "Add theme"
msgstr "Afegeix tema"
-#: bookwyrm/templates/settings/themes.html:48
+#: bookwyrm/templates/settings/themes.html:57
msgid "Unable to save theme"
msgstr "No s'ha pogut desar el tema"
-#: bookwyrm/templates/settings/themes.html:63
-#: bookwyrm/templates/settings/themes.html:93
+#: bookwyrm/templates/settings/themes.html:72
+#: bookwyrm/templates/settings/themes.html:102
msgid "Theme name"
msgstr "Nom del tema"
-#: bookwyrm/templates/settings/themes.html:73
+#: bookwyrm/templates/settings/themes.html:82
msgid "Theme filename"
msgstr "Nom del fitxer del tema"
-#: bookwyrm/templates/settings/themes.html:88
+#: bookwyrm/templates/settings/themes.html:97
msgid "Available Themes"
msgstr "Temes disponibles"
-#: bookwyrm/templates/settings/themes.html:96
+#: bookwyrm/templates/settings/themes.html:105
msgid "File"
msgstr "Fitxer"
-#: bookwyrm/templates/settings/themes.html:111
+#: bookwyrm/templates/settings/themes.html:123
msgid "Remove theme"
msgstr "Elimina el tema"
+#: bookwyrm/templates/settings/themes.html:134
+msgid "Test theme"
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:143
+msgid "Broken theme"
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:152
+msgid "Loaded successfully"
+msgstr ""
+
#: bookwyrm/templates/settings/users/delete_user_form.html:5
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:38
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:52
msgid "Permanently delete user"
msgstr "Suprimeix l'usuari de manera permanent"
@@ -5681,25 +5826,20 @@ msgstr "Actiu per última vegada"
msgid "Remote instance"
msgstr "Instància remota"
-#: bookwyrm/templates/settings/users/user_admin.html:86
-msgid "Deleted"
-msgstr "Eliminat"
-
-#: bookwyrm/templates/settings/users/user_admin.html:92
-#: bookwyrm/templates/settings/users/user_info.html:32
-msgid "Inactive"
-msgstr "Inactiu"
-
-#: bookwyrm/templates/settings/users/user_admin.html:101
+#: bookwyrm/templates/settings/users/user_admin.html:84
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr "No s'ha configurat"
-#: bookwyrm/templates/settings/users/user_info.html:16
+#: bookwyrm/templates/settings/users/user_info.html:20
+msgid "This account is the instance actor for signing HTTP requests."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_info.html:24
msgid "View user profile"
msgstr "Veure perfil d'Usuari"
-#: bookwyrm/templates/settings/users/user_info.html:19
+#: bookwyrm/templates/settings/users/user_info.html:30
msgid "Go to user admin"
msgstr "Ves a administració d'usuàries"
@@ -5755,27 +5895,39 @@ msgstr "Detalls de la instància"
msgid "View instance"
msgstr "Mostra la instància"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:5
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:6
msgid "Permanently deleted"
msgstr "Eliminat permanentment"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:8
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:9
msgid "User Actions"
msgstr "Accions d'usuari"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:21
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:15
+msgid "This is the instance admin actor"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:18
+msgid "You must not delete or disable this account as it is critical to the functioning of your server. This actor signs outgoing GET requests to smooth interaction with secure ActivityPub servers."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:19
+msgid "This account is not discoverable by ordinary users and does not have a profile page."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:35
msgid "Activate user"
msgstr "Activa l'usuari/a"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:27
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:41
msgid "Suspend user"
msgstr "Suspèn usuari"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:32
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:46
msgid "Un-suspend user"
msgstr "Deixa de suspendre l'usuari"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:54
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:68
msgid "Access level:"
msgstr "Nivell d'accés:"
@@ -5831,7 +5983,7 @@ msgstr "El vostre domini sembla que no està ben configurat. No hauria d'inclour
msgid "You are running BookWyrm in production mode without https. USE_HTTPS should be enabled in production."
msgstr "Esteu executant BookWyrm en mode producció sense https. USE_HTTPS hauria d'estar activat a producció."
-#: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:49
+#: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:44
msgid "Settings"
msgstr "Configuració"
@@ -5888,7 +6040,7 @@ msgid "Need help?"
msgstr "Necessiteu ajuda?"
#: bookwyrm/templates/shelf/create_shelf_form.html:5
-#: bookwyrm/templates/shelf/shelf.html:72
+#: bookwyrm/templates/shelf/shelf.html:74
msgid "Create shelf"
msgstr "Crea un prestatge"
@@ -5896,58 +6048,58 @@ msgstr "Crea un prestatge"
msgid "Edit Shelf"
msgstr "Edita el prestatge"
-#: bookwyrm/templates/shelf/shelf.html:24
+#: bookwyrm/templates/shelf/shelf.html:26
#: bookwyrm/templates/user/relationships/followers.html:18
#: bookwyrm/templates/user/relationships/following.html:18
msgid "User profile"
msgstr "Perfil d'usuari"
-#: bookwyrm/templates/shelf/shelf.html:39
+#: bookwyrm/templates/shelf/shelf.html:41
#: bookwyrm/templatetags/shelf_tags.py:13 bookwyrm/views/shelf/shelf.py:53
msgid "All books"
msgstr "Tots els llibres"
-#: bookwyrm/templates/shelf/shelf.html:97
+#: bookwyrm/templates/shelf/shelf.html:99
#, python-format
msgid "%(formatted_count)s book"
msgid_plural "%(formatted_count)s books"
msgstr[0] "%(formatted_count)s llibre"
msgstr[1] "%(formatted_count)s llibres"
-#: bookwyrm/templates/shelf/shelf.html:104
+#: bookwyrm/templates/shelf/shelf.html:106
#, python-format
msgid "(showing %(start)s-%(end)s)"
msgstr "(mostrant %(start)s-%(end)s)"
-#: bookwyrm/templates/shelf/shelf.html:116
+#: bookwyrm/templates/shelf/shelf.html:118
msgid "Edit shelf"
msgstr "Edita el prestatge"
-#: bookwyrm/templates/shelf/shelf.html:124
+#: bookwyrm/templates/shelf/shelf.html:126
msgid "Delete shelf"
msgstr "Elimina el prestatge"
-#: bookwyrm/templates/shelf/shelf.html:152
-#: bookwyrm/templates/shelf/shelf.html:178
+#: bookwyrm/templates/shelf/shelf.html:154
+#: bookwyrm/templates/shelf/shelf.html:180
msgid "Shelved"
msgstr "Arxivat"
-#: bookwyrm/templates/shelf/shelf.html:153
-#: bookwyrm/templates/shelf/shelf.html:181
+#: bookwyrm/templates/shelf/shelf.html:155
+#: bookwyrm/templates/shelf/shelf.html:183
msgid "Started"
msgstr "Començat"
-#: bookwyrm/templates/shelf/shelf.html:154
-#: bookwyrm/templates/shelf/shelf.html:184
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
msgid "Finished"
msgstr "Finalitzat"
-#: bookwyrm/templates/shelf/shelf.html:154
-#: bookwyrm/templates/shelf/shelf.html:184
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
msgid "Until"
msgstr "Fins"
-#: bookwyrm/templates/shelf/shelf.html:210
+#: bookwyrm/templates/shelf/shelf.html:212
msgid "This shelf is empty."
msgstr "Aquest prestatge és buit."
@@ -6253,6 +6405,15 @@ msgstr "Heu llegit %(read_count)s de %(goal_count)s llibres
msgid "%(username)s has read %(read_count)s of %(goal_count)s books."
msgstr "%(username)s ha llegit %(read_count)s de %(goal_count)s llibres."
+#: bookwyrm/templates/snippets/move_user_buttons.html:10
+msgid "Follow at new account"
+msgstr "Seguiu al compte nou"
+
+#: bookwyrm/templates/snippets/moved_user_notice.html:7
+#, python-format
+msgid "%(user)s has moved to %(moved_to_name)s"
+msgstr ""
+
#: bookwyrm/templates/snippets/page_text.html:8
#, python-format
msgid "page %(page)s of %(total_pages)s"
@@ -6394,35 +6555,35 @@ msgstr "Deixa de llegir"
msgid "Finish reading"
msgstr "Acaba de llegir"
-#: bookwyrm/templates/snippets/status/content_status.html:80
+#: bookwyrm/templates/snippets/status/content_status.html:69
msgid "Show status"
msgstr "Mostra l'estat"
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "(Page %(page)s"
msgstr "(Pàgina %(page)s"
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "%(endpage)s"
msgstr "%(endpage)s"
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid "(%(percent)s%%"
msgstr "(%(percent)s%%"
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid " - %(endpercent)s%%"
msgstr " - %(endpercent)s%%"
-#: bookwyrm/templates/snippets/status/content_status.html:127
+#: bookwyrm/templates/snippets/status/content_status.html:116
msgid "Open image in new window"
msgstr "Obre imatge en una finestra nova"
-#: bookwyrm/templates/snippets/status/content_status.html:148
+#: bookwyrm/templates/snippets/status/content_status.html:137
msgid "Hide status"
msgstr "Amaga l'estat"
@@ -6555,6 +6716,18 @@ msgstr "Mostra'n més"
msgid "Show less"
msgstr "Mostra'n menys"
+#: bookwyrm/templates/snippets/user_active_tag.html:5
+msgid "Moved"
+msgstr "Mogut"
+
+#: bookwyrm/templates/snippets/user_active_tag.html:12
+msgid "Deleted"
+msgstr "Eliminat"
+
+#: bookwyrm/templates/snippets/user_active_tag.html:15
+msgid "Inactive"
+msgstr "Inactiu"
+
#: bookwyrm/templates/two_factor_auth/two_factor_login.html:29
msgid "2FA check"
msgstr "Comprovació 2FA"
@@ -6613,11 +6786,11 @@ msgstr "Els teus grups"
msgid "Groups: %(username)s"
msgstr "Grups: %(username)s"
-#: bookwyrm/templates/user/layout.html:50
+#: bookwyrm/templates/user/layout.html:59
msgid "Follow Requests"
msgstr "Peticions de seguiment"
-#: bookwyrm/templates/user/layout.html:73
+#: bookwyrm/templates/user/layout.html:83
#: bookwyrm/templates/user/reviews_comments.html:6
#: bookwyrm/templates/user/reviews_comments.html:12
msgid "Reviews and Comments"
@@ -6632,7 +6805,13 @@ msgstr "Llistes: %(username)s"
msgid "Create list"
msgstr "Crea una llista"
-#: bookwyrm/templates/user/relationships/followers.html:31
+#: bookwyrm/templates/user/moved.html:25
+#: bookwyrm/templates/user/user_preview.html:22
+#, python-format
+msgid "Joined %(date)s"
+msgstr "Unit el %(date)s"
+
+#: bookwyrm/templates/user/relationships/followers.html:36
#, python-format
msgid "%(username)s has no followers"
msgstr "%(username)s no té seguidors"
@@ -6703,17 +6882,12 @@ msgstr "Només comentaris"
msgid "No activities yet!"
msgstr "Encara no hi ha activitats."
-#: bookwyrm/templates/user/user_preview.html:22
-#, python-format
-msgid "Joined %(date)s"
-msgstr "Unit el %(date)s"
-
#: bookwyrm/templates/user/user_preview.html:26
#, python-format
msgid "%(display_count)s follower"
msgid_plural "%(display_count)s followers"
msgstr[0] "%(display_count)s seguidor"
-msgstr[1] ""
+msgstr[1] "%(display_count)s seguidors"
#: bookwyrm/templates/user/user_preview.html:31
#, python-format
@@ -6735,10 +6909,6 @@ msgstr "No hi ha seguidors que segueixis"
msgid "View profile and more"
msgstr "Mostra el perfil i més"
-#: bookwyrm/templates/user_menu.html:82
-msgid "Log out"
-msgstr "Desconnecta"
-
#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:28
msgid "File exceeds maximum size: 10MB"
msgstr "El fitxer sobrepassa la mida màxima: 10MB"
@@ -6755,7 +6925,7 @@ msgid_plural "%(num)d books - by %(user)s"
msgstr[0] "%(num)d llibre - per %(user)s"
msgstr[1] "%(num)d llibres - per %(user)s"
-#: bookwyrm/templatetags/utilities.py:39
+#: bookwyrm/templatetags/utilities.py:49
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"
diff --git a/locale/de_DE/LC_MESSAGES/django.mo b/locale/de_DE/LC_MESSAGES/django.mo
index 4ce83f72b..57ec9f361 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 baf448c10..c88645d94 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: 2023-09-27 01:11+0000\n"
-"PO-Revision-Date: 2023-09-28 16:03\n"
+"POT-Creation-Date: 2023-12-30 23:52+0000\n"
+"PO-Revision-Date: 2024-01-02 03:12\n"
"Last-Translator: Mouse Reeve %(level)s
."
+msgstr ""
+
+#: bookwyrm/templates/403.html:15
+msgid "If you think you should have access, please speak to your BookWyrm server administrator."
+msgstr ""
+
#: bookwyrm/templates/404.html:4 bookwyrm/templates/404.html:8
msgid "Not Found"
msgstr "Nicht gefunden"
@@ -476,6 +496,20 @@ msgstr "Nicht gefunden"
msgid "The page you requested doesn't seem to exist!"
msgstr "Die Seite, die du angefordert hast, scheint nicht zu existieren!"
+#: bookwyrm/templates/413.html:4 bookwyrm/templates/413.html:8
+msgid "File too large"
+msgstr ""
+
+#: bookwyrm/templates/413.html:9
+msgid "The file you are uploading is too large."
+msgstr ""
+
+#: bookwyrm/templates/413.html:11
+msgid "\n"
+" You you can try using a smaller file, or ask your BookWyrm server administrator to increase the DATA_UPLOAD_MAX_MEMORY_SIZE
setting.\n"
+" "
+msgstr ""
+
#: bookwyrm/templates/500.html:4
msgid "Oops!"
msgstr "Ups!"
@@ -536,12 +570,12 @@ msgstr "Die Moderator*innen und Administrator*innen von %(site_name)s halten die
msgid "Moderator"
msgstr "Moderator*in"
-#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:67
+#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:62
msgid "Admin"
msgstr "Administration"
#: bookwyrm/templates/about/about.html:140
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:28
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
msgid "Send direct message"
@@ -575,7 +609,7 @@ msgid "Software version:"
msgstr "Softwareversion:"
#: bookwyrm/templates/about/layout.html:30
-#: bookwyrm/templates/embed-layout.html:33
+#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/snippets/footer.html:8
#, python-format
msgid "About %(site_name)s"
@@ -680,7 +714,7 @@ msgstr "Das am schnellsten gelesene Buch dieses Jahr…"
#: bookwyrm/templates/annual_summary/layout.html:157
#: bookwyrm/templates/annual_summary/layout.html:178
#: bookwyrm/templates/annual_summary/layout.html:247
-#: bookwyrm/templates/book/book.html:63
+#: bookwyrm/templates/book/book.html:65
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
@@ -768,24 +802,24 @@ msgid "View ISNI record"
msgstr "ISNI-Datensatz anzeigen"
#: bookwyrm/templates/author/author.html:95
-#: bookwyrm/templates/book/book.html:173
+#: bookwyrm/templates/book/book.html:175
msgid "View on ISFDB"
msgstr "Auf ISFDB ansehen"
#: bookwyrm/templates/author/author.html:100
#: bookwyrm/templates/author/sync_modal.html:5
-#: bookwyrm/templates/book/book.html:140
+#: bookwyrm/templates/book/book.html:142
#: bookwyrm/templates/book/sync_modal.html:5
msgid "Load data"
msgstr "Lade Daten"
#: bookwyrm/templates/author/author.html:104
-#: bookwyrm/templates/book/book.html:144
+#: bookwyrm/templates/book/book.html:146
msgid "View on OpenLibrary"
msgstr "Auf OpenLibrary ansehen"
#: bookwyrm/templates/author/author.html:119
-#: bookwyrm/templates/book/book.html:158
+#: bookwyrm/templates/book/book.html:160
msgid "View on Inventaire"
msgstr "Auf Inventaire anzeigen"
@@ -797,11 +831,7 @@ msgstr "Auf LibraryThing anzeigen"
msgid "View on Goodreads"
msgstr "Auf Goodreads ansehen"
-#: bookwyrm/templates/author/author.html:151
-msgid "View ISFDB entry"
-msgstr "ISFDB Eintrag ansehen"
-
-#: bookwyrm/templates/author/author.html:166
+#: bookwyrm/templates/author/author.html:158
#, python-format
msgid "Books by %(name)s"
msgstr "Bücher von %(name)s"
@@ -910,7 +940,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:89
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save"
@@ -959,19 +989,19 @@ msgstr "Bestätigen"
msgid "Unable to connect to remote source."
msgstr "Verbindung zum Server konnte nicht hergestellt werden."
-#: bookwyrm/templates/book/book.html:71 bookwyrm/templates/book/book.html:72
+#: bookwyrm/templates/book/book.html:73 bookwyrm/templates/book/book.html:74
msgid "Edit Book"
msgstr "Buch bearbeiten"
-#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:100
+#: bookwyrm/templates/book/book.html:99 bookwyrm/templates/book/book.html:102
msgid "Click to add cover"
msgstr "Cover durch Klicken hinzufügen"
-#: bookwyrm/templates/book/book.html:106
+#: bookwyrm/templates/book/book.html:108
msgid "Failed to load cover"
msgstr "Fehler beim Laden des Titelbilds"
-#: bookwyrm/templates/book/book.html:117
+#: bookwyrm/templates/book/book.html:119
msgid "Click to enlarge"
msgstr "Zum Vergrößern anklicken"
@@ -1046,13 +1076,13 @@ msgstr "Orte"
#: bookwyrm/templates/guided_tour/lists.html:14
#: bookwyrm/templates/guided_tour/user_books.html:102
#: bookwyrm/templates/guided_tour/user_profile.html:78
-#: bookwyrm/templates/layout.html:90 bookwyrm/templates/lists/curate.html:8
+#: bookwyrm/templates/layout.html:88 bookwyrm/templates/lists/curate.html:8
#: bookwyrm/templates/lists/list.html:12 bookwyrm/templates/lists/lists.html:5
#: bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:26
#: bookwyrm/templates/search/layout.html:51
#: bookwyrm/templates/settings/celery.html:77
-#: bookwyrm/templates/user/layout.html:91 bookwyrm/templates/user/lists.html:6
+#: bookwyrm/templates/user/layout.html:101 bookwyrm/templates/user/lists.html:6
msgid "Lists"
msgstr "Listen"
@@ -1117,8 +1147,8 @@ msgstr "Titelbild hochladen:"
#: bookwyrm/templates/book/cover_add_modal.html:23
#: bookwyrm/templates/book/edit/edit_book_form.html:250
-msgid "Load cover from url:"
-msgstr "Titelbild von URL laden:"
+msgid "Load cover from URL:"
+msgstr "Titelbild via URL herunterladen:"
#: bookwyrm/templates/book/cover_show_modal.html:6
msgid "Book cover preview"
@@ -1245,7 +1275,7 @@ msgstr "Titel:"
#: bookwyrm/templates/book/edit/edit_book_form.html:35
msgid "Sort Title:"
-msgstr ""
+msgstr "Sortieren nach Titel:"
#: bookwyrm/templates/book/edit/edit_book_form.html:44
msgid "Subtitle:"
@@ -1328,7 +1358,7 @@ msgid "Add Another Author"
msgstr "Weitere*n Autor*in hinzufügen"
#: bookwyrm/templates/book/edit/edit_book_form.html:231
-#: bookwyrm/templates/shelf/shelf.html:147
+#: bookwyrm/templates/shelf/shelf.html:149
msgid "Cover"
msgstr "Cover"
@@ -1372,8 +1402,8 @@ msgstr "Ausgaben von %(book_title)s"
#: bookwyrm/templates/book/editions/editions.html:8
#, python-format
-msgid "Editions of \"%(work_title)s\""
-msgstr "Ausgaben von \"%(work_title)s\""
+msgid "Editions of %(work_title)s"
+msgstr "Ausgaben von %(work_title)s"
#: bookwyrm/templates/book/editions/editions.html:55
msgid "Can't find the edition you're looking for?"
@@ -1455,8 +1485,9 @@ msgstr "Domain"
#: bookwyrm/templates/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
#: bookwyrm/templates/settings/invites/status_filter.html:5
+#: bookwyrm/templates/settings/themes.html:111
#: bookwyrm/templates/settings/users/user_admin.html:56
-#: bookwyrm/templates/settings/users/user_info.html:24
+#: bookwyrm/templates/settings/users/user_info.html:35
msgid "Status"
msgstr "Status"
@@ -1465,7 +1496,7 @@ msgstr "Status"
#: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/imports/imports.html:141
#: bookwyrm/templates/settings/reports/report_links_table.html:6
-#: bookwyrm/templates/settings/themes.html:99
+#: bookwyrm/templates/settings/themes.html:108
msgid "Actions"
msgstr "Aktionen"
@@ -1529,22 +1560,22 @@ msgstr "%(pages)s Seiten"
msgid "%(languages)s language"
msgstr "Sprache: %(languages)s"
-#: bookwyrm/templates/book/publisher_info.html:65
+#: bookwyrm/templates/book/publisher_info.html:63
#, python-format
msgid "Published %(date)s by %(publisher)s."
msgstr "Am %(date)s von %(publisher)s veröffentlicht."
+#: bookwyrm/templates/book/publisher_info.html:65
+#, python-format
+msgid "Published by %(publisher)s."
+msgstr "Veröffentlicht von %(publisher)s."
+
#: bookwyrm/templates/book/publisher_info.html:67
#, python-format
msgid "Published %(date)s"
msgstr "Erschienen am %(date)s"
-#: bookwyrm/templates/book/publisher_info.html:69
-#, python-format
-msgid "Published by %(publisher)s."
-msgstr "Veröffentlicht von %(publisher)s."
-
-#: bookwyrm/templates/book/rating.html:13
+#: bookwyrm/templates/book/rating.html:19
msgid "rated it"
msgstr "bewertet es mit"
@@ -1552,12 +1583,12 @@ msgstr "bewertet es mit"
msgid "Series by"
msgstr "Serie von"
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
#, python-format
msgid "Book %(series_number)s"
msgstr "Buch %(series_number)s"
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
msgid "Unsorted Book"
msgstr "Nicht einsortiertes Buch"
@@ -1681,6 +1712,7 @@ msgstr "Empfohlen"
#: bookwyrm/templates/ostatus/subscribe.html:42
#: bookwyrm/templates/ostatus/success.html:17
#: bookwyrm/templates/ostatus/success.html:18
+#: bookwyrm/templates/user/moved.html:19 bookwyrm/templates/user/moved.html:20
#: bookwyrm/templates/user/user_preview.html:16
#: bookwyrm/templates/user/user_preview.html:17
msgid "Locked account"
@@ -1755,7 +1787,7 @@ msgstr "%(username)s hat %(username)s"
msgstr "Direktnachrichten mit %(username)s"
#: bookwyrm/templates/feed/direct_messages.html:10
-#: bookwyrm/templates/user_menu.html:44
+#: bookwyrm/templates/user_menu.html:39
msgid "Direct Messages"
msgstr "Direktnachrichten"
@@ -1948,7 +1980,7 @@ msgstr "Updates"
#: bookwyrm/templates/feed/suggested_books.html:6
#: bookwyrm/templates/guided_tour/home.html:127
-#: bookwyrm/templates/user_menu.html:39
+#: bookwyrm/templates/layout.html:94
msgid "Your Books"
msgstr "Deine Bücher"
@@ -1996,19 +2028,19 @@ msgid "Add to your books"
msgstr "Zu deinen Büchern hinzufügen"
#: bookwyrm/templates/get_started/book_preview.html:10
-#: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37
+#: bookwyrm/templates/shelf/shelf.html:88 bookwyrm/templates/user/user.html:37
#: bookwyrm/templatetags/shelf_tags.py:14
msgid "To Read"
msgstr "Leseliste"
#: bookwyrm/templates/get_started/book_preview.html:11
-#: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38
+#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:38
#: bookwyrm/templatetags/shelf_tags.py:15
msgid "Currently Reading"
msgstr "Liest gerade"
#: bookwyrm/templates/get_started/book_preview.html:12
-#: bookwyrm/templates/shelf/shelf.html:88
+#: bookwyrm/templates/shelf/shelf.html:90
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
@@ -2017,7 +2049,7 @@ msgid "Read"
msgstr "Gelesen"
#: bookwyrm/templates/get_started/book_preview.html:13
-#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40
+#: bookwyrm/templates/shelf/shelf.html:91 bookwyrm/templates/user/user.html:40
#: bookwyrm/templatetags/shelf_tags.py:17
msgid "Stopped Reading"
msgstr "Aufgehört zu lesen"
@@ -2027,7 +2059,7 @@ msgid "What are you reading?"
msgstr "Was liest du gerade?"
#: bookwyrm/templates/get_started/books.html:9
-#: bookwyrm/templates/layout.html:39 bookwyrm/templates/lists/list.html:213
+#: bookwyrm/templates/layout.html:41 bookwyrm/templates/lists/list.html:213
msgid "Search for a book"
msgstr "Nach einem Buch suchen"
@@ -2046,8 +2078,8 @@ msgstr "Du kannst Bücher hinzufügen, wenn du %(site_name)s benutzt."
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:15
-#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:45
-#: bookwyrm/templates/layout.html:46 bookwyrm/templates/lists/list.html:217
+#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:47
+#: bookwyrm/templates/layout.html:48 bookwyrm/templates/lists/list.html:217
#: bookwyrm/templates/search/layout.html:5
#: bookwyrm/templates/search/layout.html:10
#: bookwyrm/templates/search/layout.html:32
@@ -2368,7 +2400,7 @@ msgstr "Hier kannst du eine Rezension, einen Kommentar oder ein Zitat veröffent
#: bookwyrm/templates/guided_tour/book.html:103
msgid "Share your thoughts"
-msgstr "Teile deine Gedanken"
+msgstr "Teile deine Gedanken mit anderen"
#: bookwyrm/templates/guided_tour/book.html:127
msgid "If you have read this book you can post a review including an optional star rating"
@@ -2388,7 +2420,7 @@ msgstr "Kommentieren"
#: bookwyrm/templates/guided_tour/book.html:175
msgid "Just read some perfect prose? Let the world know by sharing a quote!"
-msgstr "Du hast gerade einige perfekte Zeilen gelesen? Lass es die Welt wissen, indem Du ein Zitat teilst!"
+msgstr "Du hast gerade ein perfektes Stück Prosa gelesen? Lass es die Welt wissen, indem Du ein Zitat teilst!"
#: bookwyrm/templates/guided_tour/book.html:176
msgid "Share a quote"
@@ -2396,7 +2428,7 @@ msgstr "Ein Zitat teilen"
#: bookwyrm/templates/guided_tour/book.html:199
msgid "If your review or comment might ruin the book for someone who hasn't read it yet, you can hide your post behind a spoiler alert"
-msgstr "Falls deine Rezension oder dein Kommentar das Buch für andere verderben würden, die es noch nicht gelesen haben, kannst du sie hinter einer Spoiler-Warnung verstecken"
+msgstr "Falls deine Rezension oder dein Kommentar das Buch für Leute, die es noch nicht gelesen haben, verderben würde, kannst du sie hinter einer Spoiler-Warnung verstecken."
#: bookwyrm/templates/guided_tour/book.html:200
msgid "Spoiler alerts"
@@ -2414,7 +2446,7 @@ msgstr "Beitragssichtbarkeit"
#: bookwyrm/templates/guided_tour/book.html:248
msgid "Some ebooks can be downloaded for free from external sources. They will be shown here."
-msgstr "Einige E-Books können kostenlos von externen Quellen heruntergeladen werden. Sie werden hier angezeigt."
+msgstr "Einige E-Books können kostenlos aus externen Quellen heruntergeladen werden. Sie werden hier angezeigt."
#: bookwyrm/templates/guided_tour/book.html:249
msgid "Download links"
@@ -2436,7 +2468,7 @@ msgstr "Ok"
#: bookwyrm/templates/guided_tour/group.html:10
msgid "Welcome to the page for your group! This is where you can add and remove users, create user-curated lists, and edit the group details."
-msgstr "Willkommen auf der Seite Deiner Gruppe! Hier kannst Du Benutzer*innen hinzufügen und entfernen, eigene Listen erstellen und die Gruppendetails bearbeiten."
+msgstr "Willkommen auf der Seite deiner Gruppe! Hier kannst du Benutzer*innen hinzufügen und entfernen, benutzerdefinierte Listen erstellen und die Gruppendetails bearbeiten."
#: bookwyrm/templates/guided_tour/group.html:11
msgid "Your group"
@@ -2448,7 +2480,7 @@ msgstr "Benutze dieses Suchfeld, um neue Mitglieder für deine Gruppe zu finden.
#: bookwyrm/templates/guided_tour/group.html:32
msgid "Find users"
-msgstr "Finde Benutzer*innen"
+msgstr "Benutzer*innen finden"
#: bookwyrm/templates/guided_tour/group.html:54
msgid "Your group members will appear here. The group owner is marked with a star symbol."
@@ -2464,7 +2496,7 @@ msgstr "Neben der Erstellung von Listen auf der Listenseite kannst du hier auch
#: bookwyrm/templates/guided_tour/group.html:78
msgid "Group lists"
-msgstr "Gruppenliste"
+msgstr "Gruppenlisten"
#: bookwyrm/templates/guided_tour/group.html:100
msgid "Congratulations, you've finished the tour! Now you know the basics, but there is lots more to explore on your own. Happy reading!"
@@ -2476,7 +2508,7 @@ msgstr "Tour beenden"
#: bookwyrm/templates/guided_tour/home.html:16
msgid "Welcome to Bookwyrm!bookwyrm/static/css/themes
directory on your server from the command line."
msgstr "Kopiere die Design-Datei in das bookwyrm/static/css/themes
-Verzeichnis auf deinem Server mittels der Kommandozeile."
-#: bookwyrm/templates/settings/themes.html:32
+#: bookwyrm/templates/settings/themes.html:41
msgid "Run ./bw-dev compile_themes
and ./bw-dev collectstatic
."
msgstr "Führe ./bw-dev compile_themes
und ./bw-dev collectstatic
aus."
-#: bookwyrm/templates/settings/themes.html:35
+#: bookwyrm/templates/settings/themes.html:44
msgid "Add the file name using the form below to make it available in the application interface."
msgstr "Füge den Dateinamen mit dem untenstehenden Formular hinzu, um ihn in der Anwendung verfügbar zu machen."
-#: bookwyrm/templates/settings/themes.html:42
-#: bookwyrm/templates/settings/themes.html:82
+#: bookwyrm/templates/settings/themes.html:51
+#: bookwyrm/templates/settings/themes.html:91
msgid "Add theme"
msgstr "Design hinzufügen"
-#: bookwyrm/templates/settings/themes.html:48
+#: bookwyrm/templates/settings/themes.html:57
msgid "Unable to save theme"
msgstr "Design konnte nicht gespeichert werden"
-#: bookwyrm/templates/settings/themes.html:63
-#: bookwyrm/templates/settings/themes.html:93
+#: bookwyrm/templates/settings/themes.html:72
+#: bookwyrm/templates/settings/themes.html:102
msgid "Theme name"
msgstr "Name des Designs"
-#: bookwyrm/templates/settings/themes.html:73
+#: bookwyrm/templates/settings/themes.html:82
msgid "Theme filename"
msgstr "Design-Dateiname"
-#: bookwyrm/templates/settings/themes.html:88
+#: bookwyrm/templates/settings/themes.html:97
msgid "Available Themes"
msgstr "Verfügbare Designs"
-#: bookwyrm/templates/settings/themes.html:96
+#: bookwyrm/templates/settings/themes.html:105
msgid "File"
msgstr "Datei"
-#: bookwyrm/templates/settings/themes.html:111
+#: bookwyrm/templates/settings/themes.html:123
msgid "Remove theme"
msgstr "Design löschen"
+#: bookwyrm/templates/settings/themes.html:134
+msgid "Test theme"
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:143
+msgid "Broken theme"
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:152
+msgid "Loaded successfully"
+msgstr ""
+
#: bookwyrm/templates/settings/users/delete_user_form.html:5
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:38
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:52
msgid "Permanently delete user"
msgstr "Benutzer*in dauerhaft löschen"
@@ -5681,25 +5826,20 @@ msgstr "Zuletzt aktiv"
msgid "Remote instance"
msgstr "Entfernte Instanz"
-#: bookwyrm/templates/settings/users/user_admin.html:86
-msgid "Deleted"
-msgstr "Gelöscht"
-
-#: bookwyrm/templates/settings/users/user_admin.html:92
-#: bookwyrm/templates/settings/users/user_info.html:32
-msgid "Inactive"
-msgstr "Inaktiv"
-
-#: bookwyrm/templates/settings/users/user_admin.html:101
+#: bookwyrm/templates/settings/users/user_admin.html:84
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr "Nicht festgelegt"
-#: bookwyrm/templates/settings/users/user_info.html:16
+#: bookwyrm/templates/settings/users/user_info.html:20
+msgid "This account is the instance actor for signing HTTP requests."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_info.html:24
msgid "View user profile"
msgstr "Profil anzeigen"
-#: bookwyrm/templates/settings/users/user_info.html:19
+#: bookwyrm/templates/settings/users/user_info.html:30
msgid "Go to user admin"
msgstr "Gehe zur Benutzerverwaltung"
@@ -5755,27 +5895,39 @@ msgstr "Instanzdetails"
msgid "View instance"
msgstr "Instanz anzeigen"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:5
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:6
msgid "Permanently deleted"
msgstr "Dauerhaft gelöscht"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:8
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:9
msgid "User Actions"
msgstr "Benutzeraktionen"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:21
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:15
+msgid "This is the instance admin actor"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:18
+msgid "You must not delete or disable this account as it is critical to the functioning of your server. This actor signs outgoing GET requests to smooth interaction with secure ActivityPub servers."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:19
+msgid "This account is not discoverable by ordinary users and does not have a profile page."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:35
msgid "Activate user"
msgstr "Benutzer aktivieren"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:27
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:41
msgid "Suspend user"
msgstr "Benutzer*in vorläufig sperren"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:32
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:46
msgid "Un-suspend user"
msgstr "Vorläufige Sperre für Benutzer*in aufheben"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:54
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:68
msgid "Access level:"
msgstr "Zugriffsstufe:"
@@ -5831,7 +5983,7 @@ msgstr "Deine Domain scheint falsch konfiguriert zu sein. Es sollte kein Protoko
msgid "You are running BookWyrm in production mode without https. USE_HTTPS should be enabled in production."
msgstr "Du verwendest BookWyrm im Produktionsmodus ohne https. USE_HTTPS sollte in der Produktion aktiviert werden."
-#: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:49
+#: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:44
msgid "Settings"
msgstr "Einstellungen"
@@ -5888,7 +6040,7 @@ msgid "Need help?"
msgstr "Brauchst du Hilfe?"
#: bookwyrm/templates/shelf/create_shelf_form.html:5
-#: bookwyrm/templates/shelf/shelf.html:72
+#: bookwyrm/templates/shelf/shelf.html:74
msgid "Create shelf"
msgstr "Regal erstellen"
@@ -5896,58 +6048,58 @@ msgstr "Regal erstellen"
msgid "Edit Shelf"
msgstr "Regal bearbeiten"
-#: bookwyrm/templates/shelf/shelf.html:24
+#: bookwyrm/templates/shelf/shelf.html:26
#: bookwyrm/templates/user/relationships/followers.html:18
#: bookwyrm/templates/user/relationships/following.html:18
msgid "User profile"
msgstr "Profil"
-#: bookwyrm/templates/shelf/shelf.html:39
+#: bookwyrm/templates/shelf/shelf.html:41
#: bookwyrm/templatetags/shelf_tags.py:13 bookwyrm/views/shelf/shelf.py:53
msgid "All books"
msgstr "Alle Bücher"
-#: bookwyrm/templates/shelf/shelf.html:97
+#: bookwyrm/templates/shelf/shelf.html:99
#, 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:104
+#: bookwyrm/templates/shelf/shelf.html:106
#, python-format
msgid "(showing %(start)s-%(end)s)"
msgstr "(Anzeige: %(start)s&endash;%(end)s)"
-#: bookwyrm/templates/shelf/shelf.html:116
+#: bookwyrm/templates/shelf/shelf.html:118
msgid "Edit shelf"
msgstr "Regal bearbeiten"
-#: bookwyrm/templates/shelf/shelf.html:124
+#: bookwyrm/templates/shelf/shelf.html:126
msgid "Delete shelf"
msgstr "Regal löschen"
-#: bookwyrm/templates/shelf/shelf.html:152
-#: bookwyrm/templates/shelf/shelf.html:178
+#: bookwyrm/templates/shelf/shelf.html:154
+#: bookwyrm/templates/shelf/shelf.html:180
msgid "Shelved"
msgstr "Ins Regal gestellt"
-#: bookwyrm/templates/shelf/shelf.html:153
-#: bookwyrm/templates/shelf/shelf.html:181
+#: bookwyrm/templates/shelf/shelf.html:155
+#: bookwyrm/templates/shelf/shelf.html:183
msgid "Started"
msgstr "Gestartet"
-#: bookwyrm/templates/shelf/shelf.html:154
-#: bookwyrm/templates/shelf/shelf.html:184
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
msgid "Finished"
msgstr "Abgeschlossen"
-#: bookwyrm/templates/shelf/shelf.html:154
-#: bookwyrm/templates/shelf/shelf.html:184
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
msgid "Until"
msgstr "Bis"
-#: bookwyrm/templates/shelf/shelf.html:210
+#: bookwyrm/templates/shelf/shelf.html:212
msgid "This shelf is empty."
msgstr "Dieses Regal ist leer."
@@ -6253,6 +6405,15 @@ msgstr "Du hast %(read_count)s von %(goal_count)s Büchern<
msgid "%(username)s has read %(read_count)s of %(goal_count)s books."
msgstr "%(username)s hat %(read_count)s von %(goal_count)s Büchern gelesen."
+#: bookwyrm/templates/snippets/move_user_buttons.html:10
+msgid "Follow at new account"
+msgstr "Folgen Sie beim neuen Konto"
+
+#: bookwyrm/templates/snippets/moved_user_notice.html:7
+#, python-format
+msgid "%(user)s has moved to %(moved_to_name)s"
+msgstr ""
+
#: bookwyrm/templates/snippets/page_text.html:8
#, python-format
msgid "page %(page)s of %(total_pages)s"
@@ -6394,35 +6555,35 @@ msgstr "Aufhören zu lesen"
msgid "Finish reading"
msgstr "Lesen abschließen"
-#: bookwyrm/templates/snippets/status/content_status.html:80
+#: bookwyrm/templates/snippets/status/content_status.html:69
msgid "Show status"
msgstr "Status anzeigen"
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "(Page %(page)s"
msgstr "(Seite %(page)s"
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "%(endpage)s"
msgstr "%(endpage)s"
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid "(%(percent)s%%"
msgstr "(%(percent)s%%"
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid " - %(endpercent)s%%"
msgstr " - %(endpercent)s%%"
-#: bookwyrm/templates/snippets/status/content_status.html:127
+#: bookwyrm/templates/snippets/status/content_status.html:116
msgid "Open image in new window"
msgstr "Bild in neuem Fenster öffnen"
-#: bookwyrm/templates/snippets/status/content_status.html:148
+#: bookwyrm/templates/snippets/status/content_status.html:137
msgid "Hide status"
msgstr "Status ausblenden"
@@ -6555,6 +6716,18 @@ msgstr "Mehr anzeigen"
msgid "Show less"
msgstr "Weniger anzeigen"
+#: bookwyrm/templates/snippets/user_active_tag.html:5
+msgid "Moved"
+msgstr "Umgezogen"
+
+#: bookwyrm/templates/snippets/user_active_tag.html:12
+msgid "Deleted"
+msgstr "Gelöscht"
+
+#: bookwyrm/templates/snippets/user_active_tag.html:15
+msgid "Inactive"
+msgstr "Inaktiv"
+
#: bookwyrm/templates/two_factor_auth/two_factor_login.html:29
msgid "2FA check"
msgstr "2FA-Prüfung"
@@ -6613,11 +6786,11 @@ msgstr "Deine Gruppen"
msgid "Groups: %(username)s"
msgstr "Gruppen: %(username)s"
-#: bookwyrm/templates/user/layout.html:50
+#: bookwyrm/templates/user/layout.html:59
msgid "Follow Requests"
msgstr "Folgeanfragen"
-#: bookwyrm/templates/user/layout.html:73
+#: bookwyrm/templates/user/layout.html:83
#: bookwyrm/templates/user/reviews_comments.html:6
#: bookwyrm/templates/user/reviews_comments.html:12
msgid "Reviews and Comments"
@@ -6632,7 +6805,13 @@ msgstr "Listen: %(username)s"
msgid "Create list"
msgstr "Liste erstellen"
-#: bookwyrm/templates/user/relationships/followers.html:31
+#: bookwyrm/templates/user/moved.html:25
+#: bookwyrm/templates/user/user_preview.html:22
+#, python-format
+msgid "Joined %(date)s"
+msgstr "Beitritt %(date)s"
+
+#: bookwyrm/templates/user/relationships/followers.html:36
#, python-format
msgid "%(username)s has no followers"
msgstr "niemand folgt %(username)s "
@@ -6703,17 +6882,12 @@ msgstr "Nur Kommentare"
msgid "No activities yet!"
msgstr "Noch keine Aktivitäten!"
-#: bookwyrm/templates/user/user_preview.html:22
-#, python-format
-msgid "Joined %(date)s"
-msgstr "Beitritt %(date)s"
-
#: bookwyrm/templates/user/user_preview.html:26
#, python-format
msgid "%(display_count)s follower"
msgid_plural "%(display_count)s followers"
-msgstr[0] ""
-msgstr[1] "%(display_count)s Follower"
+msgstr[0] "%(display_count)s Follower*in"
+msgstr[1] "%(display_count)s Follower*innen"
#: bookwyrm/templates/user/user_preview.html:31
#, python-format
@@ -6735,10 +6909,6 @@ msgstr "Keine Follower*innen, denen du folgst"
msgid "View profile and more"
msgstr "Profil und mehr ansehen"
-#: bookwyrm/templates/user_menu.html:82
-msgid "Log out"
-msgstr "Abmelden"
-
#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:28
msgid "File exceeds maximum size: 10MB"
msgstr "Datei überschreitet die maximale Größe von 10MB"
@@ -6755,7 +6925,7 @@ msgid_plural "%(num)d books - by %(user)s"
msgstr[0] "%(num)d Bücher - von %(user)s"
msgstr[1] "%(num)d Bücher - von %(user)s"
-#: bookwyrm/templatetags/utilities.py:39
+#: bookwyrm/templatetags/utilities.py:49
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"
diff --git a/locale/en_US/LC_MESSAGES/django.po b/locale/en_US/LC_MESSAGES/django.po
index 60fd2463e..9c51fbbd5 100644
--- a/locale/en_US/LC_MESSAGES/django.po
+++ b/locale/en_US/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-10-02 16:40+0000\n"
+"POT-Creation-Date: 2024-01-02 03:27+0000\n"
"PO-Revision-Date: 2021-02-28 17:19-0800\n"
"Last-Translator: Mouse Reeve %(level)s
."
+msgstr ""
+
+#: bookwyrm/templates/403.html:15
+msgid "If you think you should have access, please speak to your BookWyrm server administrator."
+msgstr ""
+
#: bookwyrm/templates/404.html:4 bookwyrm/templates/404.html:8
msgid "Not Found"
msgstr ""
@@ -477,6 +509,21 @@ msgstr ""
msgid "The page you requested doesn't seem to exist!"
msgstr ""
+#: bookwyrm/templates/413.html:4 bookwyrm/templates/413.html:8
+msgid "File too large"
+msgstr ""
+
+#: bookwyrm/templates/413.html:9
+msgid "The file you are uploading is too large."
+msgstr ""
+
+#: bookwyrm/templates/413.html:11
+msgid ""
+"\n"
+" You you can try using a smaller file, or ask your BookWyrm server administrator to increase the DATA_UPLOAD_MAX_MEMORY_SIZE
setting.\n"
+" "
+msgstr ""
+
#: bookwyrm/templates/500.html:4
msgid "Oops!"
msgstr ""
@@ -537,12 +584,12 @@ msgstr ""
msgid "Moderator"
msgstr ""
-#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:67
+#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:62
msgid "Admin"
msgstr ""
#: bookwyrm/templates/about/about.html:140
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:28
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
msgid "Send direct message"
@@ -576,7 +623,7 @@ msgid "Software version:"
msgstr ""
#: bookwyrm/templates/about/layout.html:30
-#: bookwyrm/templates/embed-layout.html:33
+#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/snippets/footer.html:8
#, python-format
msgid "About %(site_name)s"
@@ -681,7 +728,7 @@ msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:157
#: bookwyrm/templates/annual_summary/layout.html:178
#: bookwyrm/templates/annual_summary/layout.html:247
-#: bookwyrm/templates/book/book.html:63
+#: bookwyrm/templates/book/book.html:65
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
@@ -769,24 +816,24 @@ msgid "View ISNI record"
msgstr ""
#: bookwyrm/templates/author/author.html:95
-#: bookwyrm/templates/book/book.html:173
+#: bookwyrm/templates/book/book.html:175
msgid "View on ISFDB"
msgstr ""
#: bookwyrm/templates/author/author.html:100
#: bookwyrm/templates/author/sync_modal.html:5
-#: bookwyrm/templates/book/book.html:140
+#: bookwyrm/templates/book/book.html:142
#: bookwyrm/templates/book/sync_modal.html:5
msgid "Load data"
msgstr ""
#: bookwyrm/templates/author/author.html:104
-#: bookwyrm/templates/book/book.html:144
+#: bookwyrm/templates/book/book.html:146
msgid "View on OpenLibrary"
msgstr ""
#: bookwyrm/templates/author/author.html:119
-#: bookwyrm/templates/book/book.html:158
+#: bookwyrm/templates/book/book.html:160
msgid "View on Inventaire"
msgstr ""
@@ -798,11 +845,7 @@ msgstr ""
msgid "View on Goodreads"
msgstr ""
-#: bookwyrm/templates/author/author.html:151
-msgid "View ISFDB entry"
-msgstr ""
-
-#: bookwyrm/templates/author/author.html:166
+#: bookwyrm/templates/author/author.html:158
#, python-format
msgid "Books by %(name)s"
msgstr ""
@@ -911,7 +954,7 @@ msgstr ""
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:89
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save"
@@ -935,6 +978,7 @@ msgstr ""
#: bookwyrm/templates/search/barcode_modal.html:43
#: bookwyrm/templates/settings/federation/instance.html:106
#: bookwyrm/templates/settings/imports/complete_import_modal.html:16
+#: bookwyrm/templates/settings/imports/complete_user_import_modal.html:16
#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:22
#: bookwyrm/templates/snippets/report_modal.html:52
msgid "Cancel"
@@ -952,6 +996,7 @@ msgstr ""
#: bookwyrm/templates/landing/password_reset.html:52
#: bookwyrm/templates/preferences/2fa.html:77
#: bookwyrm/templates/settings/imports/complete_import_modal.html:19
+#: bookwyrm/templates/settings/imports/complete_user_import_modal.html:19
#: bookwyrm/templates/snippets/remove_from_group_button.html:17
msgid "Confirm"
msgstr ""
@@ -960,19 +1005,19 @@ msgstr ""
msgid "Unable to connect to remote source."
msgstr ""
-#: bookwyrm/templates/book/book.html:71 bookwyrm/templates/book/book.html:72
+#: bookwyrm/templates/book/book.html:73 bookwyrm/templates/book/book.html:74
msgid "Edit Book"
msgstr ""
-#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:100
+#: bookwyrm/templates/book/book.html:99 bookwyrm/templates/book/book.html:102
msgid "Click to add cover"
msgstr ""
-#: bookwyrm/templates/book/book.html:106
+#: bookwyrm/templates/book/book.html:108
msgid "Failed to load cover"
msgstr ""
-#: bookwyrm/templates/book/book.html:117
+#: bookwyrm/templates/book/book.html:119
msgid "Click to enlarge"
msgstr ""
@@ -1047,13 +1092,13 @@ msgstr ""
#: bookwyrm/templates/guided_tour/lists.html:14
#: bookwyrm/templates/guided_tour/user_books.html:102
#: bookwyrm/templates/guided_tour/user_profile.html:78
-#: bookwyrm/templates/layout.html:90 bookwyrm/templates/lists/curate.html:8
+#: bookwyrm/templates/layout.html:88 bookwyrm/templates/lists/curate.html:8
#: bookwyrm/templates/lists/list.html:12 bookwyrm/templates/lists/lists.html:5
#: bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:26
#: bookwyrm/templates/search/layout.html:51
#: bookwyrm/templates/settings/celery.html:77
-#: bookwyrm/templates/user/layout.html:91 bookwyrm/templates/user/lists.html:6
+#: bookwyrm/templates/user/layout.html:101 bookwyrm/templates/user/lists.html:6
msgid "Lists"
msgstr ""
@@ -1118,7 +1163,7 @@ msgstr ""
#: bookwyrm/templates/book/cover_add_modal.html:23
#: bookwyrm/templates/book/edit/edit_book_form.html:250
-msgid "Load cover from url:"
+msgid "Load cover from URL:"
msgstr ""
#: bookwyrm/templates/book/cover_show_modal.html:6
@@ -1329,7 +1374,7 @@ msgid "Add Another Author"
msgstr ""
#: bookwyrm/templates/book/edit/edit_book_form.html:231
-#: bookwyrm/templates/shelf/shelf.html:147
+#: bookwyrm/templates/shelf/shelf.html:149
msgid "Cover"
msgstr ""
@@ -1451,22 +1496,27 @@ msgid "Domain"
msgstr ""
#: bookwyrm/templates/book/file_links/edit_links.html:36
-#: bookwyrm/templates/import/import.html:139
+#: bookwyrm/templates/import/import.html:138
#: bookwyrm/templates/import/import_status.html:134
+#: bookwyrm/templates/import/import_user.html:177
+#: bookwyrm/templates/preferences/export-user.html:78
#: bookwyrm/templates/settings/announcements/announcements.html:37
+#: bookwyrm/templates/settings/imports/imports.html:255
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
#: bookwyrm/templates/settings/invites/status_filter.html:5
+#: bookwyrm/templates/settings/themes.html:111
#: bookwyrm/templates/settings/users/user_admin.html:56
-#: bookwyrm/templates/settings/users/user_info.html:24
+#: bookwyrm/templates/settings/users/user_info.html:35
msgid "Status"
msgstr ""
#: bookwyrm/templates/book/file_links/edit_links.html:37
#: bookwyrm/templates/settings/announcements/announcements.html:41
#: bookwyrm/templates/settings/federation/instance.html:112
-#: bookwyrm/templates/settings/imports/imports.html:141
+#: bookwyrm/templates/settings/imports/imports.html:174
+#: bookwyrm/templates/settings/imports/imports.html:253
#: bookwyrm/templates/settings/reports/report_links_table.html:6
-#: bookwyrm/templates/settings/themes.html:99
+#: bookwyrm/templates/settings/themes.html:108
msgid "Actions"
msgstr ""
@@ -1530,22 +1580,22 @@ msgstr ""
msgid "%(languages)s language"
msgstr ""
-#: bookwyrm/templates/book/publisher_info.html:65
+#: bookwyrm/templates/book/publisher_info.html:63
#, python-format
msgid "Published %(date)s by %(publisher)s."
msgstr ""
+#: bookwyrm/templates/book/publisher_info.html:65
+#, python-format
+msgid "Published by %(publisher)s."
+msgstr ""
+
#: bookwyrm/templates/book/publisher_info.html:67
#, python-format
msgid "Published %(date)s"
msgstr ""
-#: bookwyrm/templates/book/publisher_info.html:69
-#, python-format
-msgid "Published by %(publisher)s."
-msgstr ""
-
-#: bookwyrm/templates/book/rating.html:13
+#: bookwyrm/templates/book/rating.html:19
msgid "rated it"
msgstr ""
@@ -1553,12 +1603,12 @@ msgstr ""
msgid "Series by"
msgstr ""
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
#, python-format
msgid "Book %(series_number)s"
msgstr ""
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
msgid "Unsorted Book"
msgstr ""
@@ -1682,6 +1732,7 @@ msgstr ""
#: bookwyrm/templates/ostatus/subscribe.html:42
#: bookwyrm/templates/ostatus/success.html:17
#: bookwyrm/templates/ostatus/success.html:18
+#: bookwyrm/templates/user/moved.html:19 bookwyrm/templates/user/moved.html:20
#: bookwyrm/templates/user/user_preview.html:16
#: bookwyrm/templates/user/user_preview.html:17
msgid "Locked account"
@@ -1756,7 +1807,7 @@ msgstr ""
#: bookwyrm/templates/discover/discover.html:4
#: bookwyrm/templates/discover/discover.html:10
-#: bookwyrm/templates/layout.html:93
+#: bookwyrm/templates/layout.html:91
msgid "Discover"
msgstr ""
@@ -1888,20 +1939,20 @@ msgstr ""
msgid "Test email"
msgstr ""
-#: bookwyrm/templates/embed-layout.html:20 bookwyrm/templates/layout.html:31
-#: bookwyrm/templates/setup/layout.html:15
+#: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:33
+#: bookwyrm/templates/layout.html:163 bookwyrm/templates/setup/layout.html:15
#: bookwyrm/templates/two_factor_auth/two_factor_login.html:18
#: bookwyrm/templates/two_factor_auth/two_factor_prompt.html:18
#, python-format
msgid "%(site_name)s home page"
msgstr ""
-#: bookwyrm/templates/embed-layout.html:39
+#: bookwyrm/templates/embed-layout.html:40
#: bookwyrm/templates/snippets/footer.html:12
msgid "Contact site admin"
msgstr ""
-#: bookwyrm/templates/embed-layout.html:45
+#: bookwyrm/templates/embed-layout.html:46
msgid "Join BookWyrm"
msgstr ""
@@ -1911,7 +1962,7 @@ msgid "Direct Messages with %(username)s"
msgstr ""
#: bookwyrm/templates/feed/direct_messages.html:10
-#: bookwyrm/templates/user_menu.html:44
+#: bookwyrm/templates/user_menu.html:39
msgid "Direct Messages"
msgstr ""
@@ -1949,7 +2000,7 @@ msgstr ""
#: bookwyrm/templates/feed/suggested_books.html:6
#: bookwyrm/templates/guided_tour/home.html:127
-#: bookwyrm/templates/user_menu.html:39
+#: bookwyrm/templates/layout.html:94
msgid "Your Books"
msgstr ""
@@ -1997,19 +2048,19 @@ msgid "Add to your books"
msgstr ""
#: bookwyrm/templates/get_started/book_preview.html:10
-#: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37
+#: bookwyrm/templates/shelf/shelf.html:88 bookwyrm/templates/user/user.html:37
#: bookwyrm/templatetags/shelf_tags.py:14
msgid "To Read"
msgstr ""
#: bookwyrm/templates/get_started/book_preview.html:11
-#: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38
+#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:38
#: bookwyrm/templatetags/shelf_tags.py:15
msgid "Currently Reading"
msgstr ""
#: bookwyrm/templates/get_started/book_preview.html:12
-#: bookwyrm/templates/shelf/shelf.html:88
+#: bookwyrm/templates/shelf/shelf.html:90
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
@@ -2018,7 +2069,7 @@ msgid "Read"
msgstr ""
#: bookwyrm/templates/get_started/book_preview.html:13
-#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40
+#: bookwyrm/templates/shelf/shelf.html:91 bookwyrm/templates/user/user.html:40
#: bookwyrm/templatetags/shelf_tags.py:17
msgid "Stopped Reading"
msgstr ""
@@ -2028,7 +2079,7 @@ msgid "What are you reading?"
msgstr ""
#: bookwyrm/templates/get_started/books.html:9
-#: bookwyrm/templates/layout.html:39 bookwyrm/templates/lists/list.html:213
+#: bookwyrm/templates/layout.html:41 bookwyrm/templates/lists/list.html:213
msgid "Search for a book"
msgstr ""
@@ -2047,8 +2098,8 @@ msgstr ""
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:15
-#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:45
-#: bookwyrm/templates/layout.html:46 bookwyrm/templates/lists/list.html:217
+#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:47
+#: bookwyrm/templates/layout.html:48 bookwyrm/templates/lists/list.html:217
#: bookwyrm/templates/search/layout.html:5
#: bookwyrm/templates/search/layout.html:10
#: bookwyrm/templates/search/layout.html:32
@@ -2515,7 +2566,7 @@ msgid "Barcode reader"
msgstr ""
#: bookwyrm/templates/guided_tour/home.html:102
-msgid "Use the Feed, Lists and Discover links to discover the latest news from your feed, lists of books by topic, and the latest happenings on this Bookwyrm server!"
+msgid "Use the Lists, Discover, and Your Books links to discover reading suggestions and the latest happenings on this server, or to see your catalogued books!"
msgstr ""
#: bookwyrm/templates/guided_tour/home.html:103
@@ -2539,15 +2590,15 @@ msgid "The bell will light up when you have a new notification. When it does, cl
msgstr ""
#: bookwyrm/templates/guided_tour/home.html:177
-#: bookwyrm/templates/layout.html:75 bookwyrm/templates/layout.html:106
-#: bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:77 bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:108
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr ""
#: bookwyrm/templates/guided_tour/home.html:200
-msgid "Your profile, books, direct messages, and settings can be accessed by clicking on your name in the menu here."
+msgid "Your profile, user directory, direct messages, and settings can be accessed by clicking on your name in the menu here."
msgstr ""
#: bookwyrm/templates/guided_tour/home.html:200
@@ -2703,7 +2754,7 @@ msgstr ""
#: bookwyrm/templates/guided_tour/user_groups.html:11
#: bookwyrm/templates/guided_tour/user_profile.html:55
-#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:85
+#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:95
msgid "Groups"
msgstr ""
@@ -2748,7 +2799,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr ""
#: bookwyrm/templates/guided_tour/user_profile.html:11
-#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:14
+#: bookwyrm/templates/user/layout.html:20 bookwyrm/templates/user/user.html:14
msgid "User Profile"
msgstr ""
@@ -2757,7 +2808,7 @@ msgid "This tab shows everything you have read towards your annual reading goal,
msgstr ""
#: bookwyrm/templates/guided_tour/user_profile.html:32
-#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:79
+#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:89
msgid "Reading Goal"
msgstr ""
@@ -2795,111 +2846,121 @@ msgid "No activities for this hashtag yet!"
msgstr ""
#: bookwyrm/templates/import/import.html:5
-#: bookwyrm/templates/import/import.html:9
-#: bookwyrm/templates/shelf/shelf.html:64
-msgid "Import Books"
+#: bookwyrm/templates/import/import.html:6
+#: bookwyrm/templates/preferences/layout.html:43
+msgid "Import Book List"
msgstr ""
-#: bookwyrm/templates/import/import.html:13
+#: bookwyrm/templates/import/import.html:12
msgid "Not a valid CSV file"
msgstr ""
-#: bookwyrm/templates/import/import.html:21
+#: bookwyrm/templates/import/import.html:20
#, python-format
msgid "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day."
-msgid_plural "Currently, you are allowed to import %(import_size_limit)s books every %(import_limit_reset)s days."
+msgid_plural "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s days."
msgstr[0] ""
msgstr[1] ""
-#: bookwyrm/templates/import/import.html:27
+#: bookwyrm/templates/import/import.html:26
#, python-format
msgid "You have %(display_left)s left."
msgstr ""
-#: bookwyrm/templates/import/import.html:34
+#: bookwyrm/templates/import/import.html:33
#, python-format
msgid "On average, recent imports have taken %(hours)s hours."
msgstr ""
-#: bookwyrm/templates/import/import.html:38
+#: bookwyrm/templates/import/import.html:37
#, python-format
msgid "On average, recent imports have taken %(minutes)s minutes."
msgstr ""
-#: bookwyrm/templates/import/import.html:53
+#: bookwyrm/templates/import/import.html:52
msgid "Data source:"
msgstr ""
-#: bookwyrm/templates/import/import.html:59
+#: bookwyrm/templates/import/import.html:58
msgid "Goodreads (CSV)"
msgstr ""
-#: bookwyrm/templates/import/import.html:62
+#: bookwyrm/templates/import/import.html:61
msgid "Storygraph (CSV)"
msgstr ""
-#: bookwyrm/templates/import/import.html:65
+#: bookwyrm/templates/import/import.html:64
msgid "LibraryThing (TSV)"
msgstr ""
-#: bookwyrm/templates/import/import.html:68
+#: bookwyrm/templates/import/import.html:67
msgid "OpenLibrary (CSV)"
msgstr ""
-#: bookwyrm/templates/import/import.html:71
+#: bookwyrm/templates/import/import.html:70
msgid "Calibre (CSV)"
msgstr ""
-#: bookwyrm/templates/import/import.html:77
+#: bookwyrm/templates/import/import.html:76
msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account."
msgstr ""
-#: bookwyrm/templates/import/import.html:86
+#: bookwyrm/templates/import/import.html:85
+#: bookwyrm/templates/import/import_user.html:49
msgid "Data file:"
msgstr ""
-#: bookwyrm/templates/import/import.html:94
+#: bookwyrm/templates/import/import.html:93
msgid "Include reviews"
msgstr ""
-#: bookwyrm/templates/import/import.html:99
+#: bookwyrm/templates/import/import.html:98
msgid "Privacy setting for imported reviews:"
msgstr ""
-#: bookwyrm/templates/import/import.html:106
-#: bookwyrm/templates/import/import.html:108
-#: bookwyrm/templates/preferences/layout.html:35
+#: bookwyrm/templates/import/import.html:105
+#: bookwyrm/templates/import/import.html:107
+#: bookwyrm/templates/import/import_user.html:155
+#: bookwyrm/templates/import/import_user.html:157
#: bookwyrm/templates/settings/federation/instance_blocklist.html:78
msgid "Import"
msgstr ""
-#: bookwyrm/templates/import/import.html:109
+#: bookwyrm/templates/import/import.html:108
+#: bookwyrm/templates/import/import_user.html:158
msgid "You've reached the import limit."
msgstr ""
-#: bookwyrm/templates/import/import.html:118
+#: bookwyrm/templates/import/import.html:117
+#: bookwyrm/templates/import/import_user.html:27
msgid "Imports are temporarily disabled; thank you for your patience."
msgstr ""
-#: bookwyrm/templates/import/import.html:125
+#: bookwyrm/templates/import/import.html:124
+#: bookwyrm/templates/import/import_user.html:166
msgid "Recent Imports"
msgstr ""
-#: bookwyrm/templates/import/import.html:130
-#: bookwyrm/templates/settings/imports/imports.html:120
+#: bookwyrm/templates/import/import.html:129
+#: bookwyrm/templates/import/import_user.html:171
+#: bookwyrm/templates/settings/imports/imports.html:153
+#: bookwyrm/templates/settings/imports/imports.html:243
msgid "Date Created"
msgstr ""
-#: bookwyrm/templates/import/import.html:133
+#: bookwyrm/templates/import/import.html:132
+#: bookwyrm/templates/import/import_user.html:174
msgid "Last Updated"
msgstr ""
-#: bookwyrm/templates/import/import.html:136
-#: bookwyrm/templates/settings/imports/imports.html:129
+#: bookwyrm/templates/import/import.html:135
+#: bookwyrm/templates/settings/imports/imports.html:162
msgid "Items"
msgstr ""
-#: bookwyrm/templates/import/import.html:145
+#: bookwyrm/templates/import/import.html:144
+#: bookwyrm/templates/import/import_user.html:183
+#: bookwyrm/templates/preferences/export-user.html:87
msgid "No recent imports"
msgstr ""
@@ -2935,7 +2996,8 @@ msgid "Refresh"
msgstr ""
#: bookwyrm/templates/import/import_status.html:72
-#: bookwyrm/templates/settings/imports/imports.html:161
+#: bookwyrm/templates/settings/imports/imports.html:194
+#: bookwyrm/templates/settings/imports/imports.html:271
msgid "Stop import"
msgstr ""
@@ -2967,8 +3029,8 @@ msgid "Row"
msgstr ""
#: bookwyrm/templates/import/import_status.html:110
-#: bookwyrm/templates/shelf/shelf.html:148
-#: bookwyrm/templates/shelf/shelf.html:170
+#: bookwyrm/templates/shelf/shelf.html:150
+#: bookwyrm/templates/shelf/shelf.html:172
msgid "Title"
msgstr ""
@@ -2981,8 +3043,8 @@ msgid "Openlibrary key"
msgstr ""
#: bookwyrm/templates/import/import_status.html:121
-#: bookwyrm/templates/shelf/shelf.html:149
-#: bookwyrm/templates/shelf/shelf.html:173
+#: bookwyrm/templates/shelf/shelf.html:151
+#: bookwyrm/templates/shelf/shelf.html:175
msgid "Author"
msgstr ""
@@ -3033,6 +3095,133 @@ msgstr ""
msgid "Update import"
msgstr ""
+#: bookwyrm/templates/import/import_user.html:5
+#: bookwyrm/templates/import/import_user.html:6
+#: bookwyrm/templates/preferences/layout.html:51
+msgid "Import BookWyrm Account"
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:13
+msgid "Not a valid import file"
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:18
+msgid "If you wish to migrate any statuses (comments, reviews, or quotes) you must either set this account as an alias of the one you are migrating from, or move that account to this one, before you import your user data."
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:32
+#, python-format
+msgid "Currently you are allowed to import one user every %(user_import_hours)s hours."
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:33
+#, python-format
+msgid "You will next be able to import a user file at %(next_available)s"
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:41
+msgid "Step 1:"
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:43
+msgid "Select an export file generated from another BookWyrm account. The file format should be .tar.gz
."
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:58
+msgid "Step 2:"
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:60
+msgid "Deselect any checkboxes for data you do not wish to include in your import."
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:71
+#: bookwyrm/templates/shelf/shelf.html:26
+#: bookwyrm/templates/user/relationships/followers.html:18
+#: bookwyrm/templates/user/relationships/following.html:18
+msgid "User profile"
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:74
+msgid "Overwrites display name, summary, and avatar"
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:80
+msgid "User settings"
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:83
+msgid "Overwrites:"
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:86
+msgid "Whether manual approval is required for other users to follow your account"
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:89
+msgid "Whether following/followers are shown on your profile"
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:92
+msgid "Whether your reading goal is shown on your profile"
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:95
+msgid "Whether you see user follow suggestions"
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:98
+msgid "Whether your account is suggested to others"
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:101
+msgid "Your timezone"
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:104
+msgid "Your default post privacy setting"
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:112
+msgid "Followers and following"
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:116
+msgid "User blocks"
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:123
+msgid "Reading goals"
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:126
+msgid "Overwrites reading goals for all years listed in the import file"
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:130
+msgid "Shelves"
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:133
+msgid "Reading history"
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:136
+msgid "Book reviews"
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:142
+msgid "Comments about books"
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:145
+msgid "Book lists"
+msgstr ""
+
+#: bookwyrm/templates/import/import_user.html:148
+msgid "Saved lists"
+msgstr ""
+
#: bookwyrm/templates/import/manual_review.html:5
#: bookwyrm/templates/import/troubleshoot.html:4
msgid "Import Troubleshooting"
@@ -3053,7 +3242,7 @@ msgid "Reject"
msgstr ""
#: bookwyrm/templates/import/troubleshoot.html:7
-#: bookwyrm/templates/settings/imports/imports.html:138
+#: bookwyrm/templates/settings/imports/imports.html:171
msgid "Failed items"
msgstr ""
@@ -3088,10 +3277,6 @@ msgstr ""
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 ""
@@ -3139,7 +3324,7 @@ msgid "Login"
msgstr ""
#: bookwyrm/templates/landing/login.html:7
-#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:136
+#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:142
#: bookwyrm/templates/ostatus/error.html:37
msgid "Log in"
msgstr ""
@@ -3150,7 +3335,7 @@ msgstr ""
#: bookwyrm/templates/landing/login.html:21
#: bookwyrm/templates/landing/reactivate.html:17
-#: bookwyrm/templates/layout.html:127 bookwyrm/templates/ostatus/error.html:28
+#: bookwyrm/templates/layout.html:128 bookwyrm/templates/ostatus/error.html:28
#: bookwyrm/templates/snippets/register_form.html:4
msgid "Username:"
msgstr ""
@@ -3158,13 +3343,13 @@ msgstr ""
#: bookwyrm/templates/landing/login.html:27
#: bookwyrm/templates/landing/password_reset.html:26
#: bookwyrm/templates/landing/reactivate.html:23
-#: bookwyrm/templates/layout.html:131 bookwyrm/templates/ostatus/error.html:32
+#: bookwyrm/templates/layout.html:132 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/preferences/2fa.html:91
#: bookwyrm/templates/snippets/register_form.html:45
msgid "Password:"
msgstr ""
-#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:133
+#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:139
#: bookwyrm/templates/ostatus/error.html:34
msgid "Forgot your password?"
msgstr ""
@@ -3207,35 +3392,35 @@ msgstr ""
msgid "%(site_name)s search"
msgstr ""
-#: bookwyrm/templates/layout.html:37
+#: bookwyrm/templates/layout.html:39
msgid "Search for a book, user, or list"
msgstr ""
-#: bookwyrm/templates/layout.html:52 bookwyrm/templates/layout.html:53
+#: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55
msgid "Scan Barcode"
msgstr ""
-#: bookwyrm/templates/layout.html:67
+#: bookwyrm/templates/layout.html:69
msgid "Main navigation menu"
msgstr ""
-#: bookwyrm/templates/layout.html:87
-msgid "Feed"
-msgstr ""
-
-#: bookwyrm/templates/layout.html:132 bookwyrm/templates/ostatus/error.html:33
+#: bookwyrm/templates/layout.html:134 bookwyrm/templates/ostatus/error.html:33
msgid "password"
msgstr ""
-#: bookwyrm/templates/layout.html:144
+#: bookwyrm/templates/layout.html:136
+msgid "Show/Hide password"
+msgstr ""
+
+#: bookwyrm/templates/layout.html:150
msgid "Join"
msgstr ""
-#: bookwyrm/templates/layout.html:179
+#: bookwyrm/templates/layout.html:196
msgid "Successfully posted status"
msgstr ""
-#: bookwyrm/templates/layout.html:180
+#: bookwyrm/templates/layout.html:197
msgid "Error posting status"
msgstr ""
@@ -3427,6 +3612,7 @@ msgid "Set"
msgstr ""
#: bookwyrm/templates/lists/list.html:167
+#: bookwyrm/templates/snippets/remove_follower_button.html:4
#: bookwyrm/templates/snippets/remove_from_group_button.html:20
msgid "Remove"
msgstr ""
@@ -3494,6 +3680,23 @@ msgstr ""
msgid "Saved Lists"
msgstr ""
+#: bookwyrm/templates/moved.html:27
+#, python-format
+msgid "You have moved your account to %(username)s"
+msgstr ""
+
+#: bookwyrm/templates/moved.html:32
+msgid "You can undo the move to restore full functionality, but some followers may have already unfollowed this account."
+msgstr ""
+
+#: bookwyrm/templates/moved.html:42
+msgid "Undo move"
+msgstr ""
+
+#: bookwyrm/templates/moved.html:46 bookwyrm/templates/user_menu.html:77
+msgid "Log out"
+msgstr ""
+
#: bookwyrm/templates/notifications/items/accept.html:18
#, python-format
msgid "%(related_user)s accepted your invitation to join group \"%(group_name)s\""
@@ -3698,6 +3901,13 @@ msgstr ""
msgid "%(related_user)s invited you to join the group \"%(group_name)s\""
msgstr ""
+#: bookwyrm/templates/notifications/items/invite_request.html:15
+#, python-format
+msgid "New invite request awaiting response"
+msgid_plural "%(display_count)s new invite requests awaiting response"
+msgstr[0] ""
+msgstr[1] ""
+
#: bookwyrm/templates/notifications/items/join.html:16
#, python-format
msgid "has joined your group \"%(group_name)s\""
@@ -3745,6 +3955,16 @@ msgstr ""
msgid "%(related_user)s mentioned you in a status"
msgstr ""
+#: bookwyrm/templates/notifications/items/move_user.html:18
+#, python-format
+msgid "%(related_user)s has moved to %(username)s"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/move_user.html:25
+#, python-format
+msgid "%(related_user)s has undone their move"
+msgstr ""
+
#: bookwyrm/templates/notifications/items/remove.html:17
#, python-format
msgid "has been removed from your group \"%(group_name)s\""
@@ -3783,7 +4003,7 @@ msgstr[0] ""
msgstr[1] ""
#: bookwyrm/templates/notifications/items/status_preview.html:4
-#: bookwyrm/templates/snippets/status/content_status.html:73
+#: bookwyrm/templates/snippets/status/content_status.html:62
msgid "Content warning"
msgstr ""
@@ -3802,6 +4022,16 @@ msgstr ""
msgid "has changed the description of %(group_name)s"
msgstr ""
+#: bookwyrm/templates/notifications/items/user_export.html:14
+#, python-format
+msgid "Your user export is ready."
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/user_import.html:14
+#, python-format
+msgid "Your user import is complete."
+msgstr ""
+
#: bookwyrm/templates/notifications/notifications_page.html:19
msgid "Delete notifications"
msgstr ""
@@ -4001,9 +4231,51 @@ msgstr ""
msgid "Set up 2FA"
msgstr ""
+#: bookwyrm/templates/preferences/alias_user.html:4
+#: bookwyrm/templates/preferences/move_user.html:4
+#: bookwyrm/templates/preferences/move_user.html:7
+#: bookwyrm/templates/preferences/move_user.html:39
+msgid "Move Account"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:7
+#: bookwyrm/templates/preferences/alias_user.html:34
+msgid "Create Alias"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:12
+msgid "Add another account as an alias"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:16
+msgid "Marking another account as an alias is required if you want to move that account to this one."
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:19
+msgid "This is a reversable action and will not change the functionality of this account."
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:25
+msgid "Enter the username for the account you want to add as an alias e.g. user@example.com :"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:30
+#: bookwyrm/templates/preferences/move_user.html:35
+msgid "Confirm your password:"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:39
+#: bookwyrm/templates/preferences/layout.html:28
+msgid "Aliases"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:49
+msgid "Remove alias"
+msgstr ""
+
#: bookwyrm/templates/preferences/blocks.html:4
#: bookwyrm/templates/preferences/blocks.html:7
-#: bookwyrm/templates/preferences/layout.html:46
+#: bookwyrm/templates/preferences/layout.html:62
msgid "Blocked Users"
msgstr ""
@@ -4033,7 +4305,7 @@ msgstr ""
#: bookwyrm/templates/preferences/delete_user.html:4
#: bookwyrm/templates/preferences/delete_user.html:7
#: bookwyrm/templates/preferences/delete_user.html:40
-#: bookwyrm/templates/preferences/layout.html:28
+#: bookwyrm/templates/preferences/layout.html:36
#: bookwyrm/templates/settings/users/delete_user_form.html:22
msgid "Delete Account"
msgstr ""
@@ -4078,7 +4350,7 @@ msgstr ""
#: bookwyrm/templates/preferences/edit_user.html:12
#: bookwyrm/templates/preferences/edit_user.html:25
-#: bookwyrm/templates/settings/users/user_info.html:7
+#: bookwyrm/templates/settings/users/user_info.html:8
#: bookwyrm/templates/user_menu.html:29
msgid "Profile"
msgstr ""
@@ -4138,13 +4410,65 @@ msgstr ""
msgid "Looking for shelf privacy? You can set a separate visibility level for each of your shelves. Go to Your Books, pick a shelf from the tab bar, and click \"Edit shelf.\""
msgstr ""
+#: bookwyrm/templates/preferences/export-user.html:5
+#: bookwyrm/templates/preferences/export-user.html:8
+#: bookwyrm/templates/preferences/layout.html:55
+msgid "Export BookWyrm Account"
+msgstr ""
+
+#: bookwyrm/templates/preferences/export-user.html:14
+msgid "You can create an export file here. This will allow you to migrate your data to another BookWyrm account."
+msgstr ""
+
+#: bookwyrm/templates/preferences/export-user.html:17
+msgid "bookwyrm/static/css/themes
directory on your server from the command line."
msgstr ""
-#: bookwyrm/templates/settings/themes.html:32
+#: bookwyrm/templates/settings/themes.html:41
msgid "Run ./bw-dev compile_themes
and ./bw-dev collectstatic
."
msgstr ""
-#: bookwyrm/templates/settings/themes.html:35
+#: bookwyrm/templates/settings/themes.html:44
msgid "Add the file name using the form below to make it available in the application interface."
msgstr ""
-#: bookwyrm/templates/settings/themes.html:42
-#: bookwyrm/templates/settings/themes.html:82
+#: bookwyrm/templates/settings/themes.html:51
+#: bookwyrm/templates/settings/themes.html:91
msgid "Add theme"
msgstr ""
-#: bookwyrm/templates/settings/themes.html:48
+#: bookwyrm/templates/settings/themes.html:57
msgid "Unable to save theme"
msgstr ""
-#: bookwyrm/templates/settings/themes.html:63
-#: bookwyrm/templates/settings/themes.html:93
+#: bookwyrm/templates/settings/themes.html:72
+#: bookwyrm/templates/settings/themes.html:102
msgid "Theme name"
msgstr ""
-#: bookwyrm/templates/settings/themes.html:73
+#: bookwyrm/templates/settings/themes.html:82
msgid "Theme filename"
msgstr ""
-#: bookwyrm/templates/settings/themes.html:88
+#: bookwyrm/templates/settings/themes.html:97
msgid "Available Themes"
msgstr ""
-#: bookwyrm/templates/settings/themes.html:96
+#: bookwyrm/templates/settings/themes.html:105
msgid "File"
msgstr ""
-#: bookwyrm/templates/settings/themes.html:111
+#: bookwyrm/templates/settings/themes.html:123
msgid "Remove theme"
msgstr ""
+#: bookwyrm/templates/settings/themes.html:134
+msgid "Test theme"
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:143
+msgid "Broken theme"
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:152
+msgid "Loaded successfully"
+msgstr ""
+
#: bookwyrm/templates/settings/users/delete_user_form.html:5
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:38
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:52
msgid "Permanently delete user"
msgstr ""
@@ -5676,25 +6083,20 @@ msgstr ""
msgid "Remote instance"
msgstr ""
-#: bookwyrm/templates/settings/users/user_admin.html:86
-msgid "Deleted"
-msgstr ""
-
-#: bookwyrm/templates/settings/users/user_admin.html:92
-#: bookwyrm/templates/settings/users/user_info.html:32
-msgid "Inactive"
-msgstr ""
-
-#: bookwyrm/templates/settings/users/user_admin.html:101
+#: bookwyrm/templates/settings/users/user_admin.html:84
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr ""
-#: bookwyrm/templates/settings/users/user_info.html:16
+#: bookwyrm/templates/settings/users/user_info.html:20
+msgid "This account is the instance actor for signing HTTP requests."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_info.html:24
msgid "View user profile"
msgstr ""
-#: bookwyrm/templates/settings/users/user_info.html:19
+#: bookwyrm/templates/settings/users/user_info.html:30
msgid "Go to user admin"
msgstr ""
@@ -5750,27 +6152,39 @@ msgstr ""
msgid "View instance"
msgstr ""
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:5
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:6
msgid "Permanently deleted"
msgstr ""
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:8
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:9
msgid "User Actions"
msgstr ""
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:21
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:15
+msgid "This is the instance admin actor"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:18
+msgid "You must not delete or disable this account as it is critical to the functioning of your server. This actor signs outgoing GET requests to smooth interaction with secure ActivityPub servers."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:19
+msgid "This account is not discoverable by ordinary users and does not have a profile page."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:35
msgid "Activate user"
msgstr ""
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:27
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:41
msgid "Suspend user"
msgstr ""
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:32
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:46
msgid "Un-suspend user"
msgstr ""
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:54
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:68
msgid "Access level:"
msgstr ""
@@ -5826,7 +6240,7 @@ msgstr ""
msgid "You are running BookWyrm in production mode without https. USE_HTTPS should be enabled in production."
msgstr ""
-#: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:49
+#: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:44
msgid "Settings"
msgstr ""
@@ -5883,7 +6297,7 @@ msgid "Need help?"
msgstr ""
#: bookwyrm/templates/shelf/create_shelf_form.html:5
-#: bookwyrm/templates/shelf/shelf.html:72
+#: bookwyrm/templates/shelf/shelf.html:74
msgid "Create shelf"
msgstr ""
@@ -5891,58 +6305,56 @@ msgstr ""
msgid "Edit Shelf"
msgstr ""
-#: bookwyrm/templates/shelf/shelf.html:24
-#: bookwyrm/templates/user/relationships/followers.html:18
-#: bookwyrm/templates/user/relationships/following.html:18
-msgid "User profile"
-msgstr ""
-
-#: bookwyrm/templates/shelf/shelf.html:39
+#: bookwyrm/templates/shelf/shelf.html:41
#: bookwyrm/templatetags/shelf_tags.py:13 bookwyrm/views/shelf/shelf.py:53
msgid "All books"
msgstr ""
-#: bookwyrm/templates/shelf/shelf.html:97
+#: bookwyrm/templates/shelf/shelf.html:66
+msgid "Import Books"
+msgstr ""
+
+#: bookwyrm/templates/shelf/shelf.html:99
#, python-format
msgid "%(formatted_count)s book"
msgid_plural "%(formatted_count)s books"
msgstr[0] ""
msgstr[1] ""
-#: bookwyrm/templates/shelf/shelf.html:104
+#: bookwyrm/templates/shelf/shelf.html:106
#, python-format
msgid "(showing %(start)s-%(end)s)"
msgstr ""
-#: bookwyrm/templates/shelf/shelf.html:116
+#: bookwyrm/templates/shelf/shelf.html:118
msgid "Edit shelf"
msgstr ""
-#: bookwyrm/templates/shelf/shelf.html:124
+#: bookwyrm/templates/shelf/shelf.html:126
msgid "Delete shelf"
msgstr ""
-#: bookwyrm/templates/shelf/shelf.html:152
-#: bookwyrm/templates/shelf/shelf.html:178
+#: bookwyrm/templates/shelf/shelf.html:154
+#: bookwyrm/templates/shelf/shelf.html:180
msgid "Shelved"
msgstr ""
-#: bookwyrm/templates/shelf/shelf.html:153
-#: bookwyrm/templates/shelf/shelf.html:181
+#: bookwyrm/templates/shelf/shelf.html:155
+#: bookwyrm/templates/shelf/shelf.html:183
msgid "Started"
msgstr ""
-#: bookwyrm/templates/shelf/shelf.html:154
-#: bookwyrm/templates/shelf/shelf.html:184
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
msgid "Finished"
msgstr ""
-#: bookwyrm/templates/shelf/shelf.html:154
-#: bookwyrm/templates/shelf/shelf.html:184
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
msgid "Until"
msgstr ""
-#: bookwyrm/templates/shelf/shelf.html:210
+#: bookwyrm/templates/shelf/shelf.html:212
msgid "This shelf is empty."
msgstr ""
@@ -6248,6 +6660,15 @@ msgstr ""
msgid "%(username)s has read %(read_count)s of %(goal_count)s books."
msgstr ""
+#: bookwyrm/templates/snippets/move_user_buttons.html:10
+msgid "Follow at new account"
+msgstr ""
+
+#: bookwyrm/templates/snippets/moved_user_notice.html:7
+#, python-format
+msgid "%(user)s has moved to %(moved_to_name)s"
+msgstr ""
+
#: bookwyrm/templates/snippets/page_text.html:8
#, python-format
msgid "page %(page)s of %(total_pages)s"
@@ -6389,35 +6810,35 @@ msgstr ""
msgid "Finish reading"
msgstr ""
-#: bookwyrm/templates/snippets/status/content_status.html:80
+#: bookwyrm/templates/snippets/status/content_status.html:69
msgid "Show status"
msgstr ""
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "(Page %(page)s"
msgstr ""
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "%(endpage)s"
msgstr ""
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid "(%(percent)s%%"
msgstr ""
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid " - %(endpercent)s%%"
msgstr ""
-#: bookwyrm/templates/snippets/status/content_status.html:127
+#: bookwyrm/templates/snippets/status/content_status.html:116
msgid "Open image in new window"
msgstr ""
-#: bookwyrm/templates/snippets/status/content_status.html:148
+#: bookwyrm/templates/snippets/status/content_status.html:137
msgid "Hide status"
msgstr ""
@@ -6550,6 +6971,18 @@ msgstr ""
msgid "Show less"
msgstr ""
+#: bookwyrm/templates/snippets/user_active_tag.html:5
+msgid "Moved"
+msgstr ""
+
+#: bookwyrm/templates/snippets/user_active_tag.html:12
+msgid "Deleted"
+msgstr ""
+
+#: bookwyrm/templates/snippets/user_active_tag.html:15
+msgid "Inactive"
+msgstr ""
+
#: bookwyrm/templates/two_factor_auth/two_factor_login.html:29
msgid "2FA check"
msgstr ""
@@ -6608,11 +7041,11 @@ msgstr ""
msgid "Groups: %(username)s"
msgstr ""
-#: bookwyrm/templates/user/layout.html:50
+#: bookwyrm/templates/user/layout.html:59
msgid "Follow Requests"
msgstr ""
-#: bookwyrm/templates/user/layout.html:73
+#: bookwyrm/templates/user/layout.html:83
#: bookwyrm/templates/user/reviews_comments.html:6
#: bookwyrm/templates/user/reviews_comments.html:12
msgid "Reviews and Comments"
@@ -6627,7 +7060,13 @@ msgstr ""
msgid "Create list"
msgstr ""
-#: bookwyrm/templates/user/relationships/followers.html:31
+#: bookwyrm/templates/user/moved.html:25
+#: bookwyrm/templates/user/user_preview.html:22
+#, python-format
+msgid "Joined %(date)s"
+msgstr ""
+
+#: bookwyrm/templates/user/relationships/followers.html:36
#, python-format
msgid "%(username)s has no followers"
msgstr ""
@@ -6698,11 +7137,6 @@ msgstr ""
msgid "No activities yet!"
msgstr ""
-#: bookwyrm/templates/user/user_preview.html:22
-#, python-format
-msgid "Joined %(date)s"
-msgstr ""
-
#: bookwyrm/templates/user/user_preview.html:26
#, python-format
msgid "%(display_count)s follower"
@@ -6730,10 +7164,6 @@ msgstr ""
msgid "View profile and more"
msgstr ""
-#: bookwyrm/templates/user_menu.html:82
-msgid "Log out"
-msgstr ""
-
#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:28
msgid "File exceeds maximum size: 10MB"
msgstr ""
@@ -6750,7 +7180,7 @@ msgid_plural "%(num)d books - by %(user)s"
msgstr[0] ""
msgstr[1] ""
-#: bookwyrm/templatetags/utilities.py:39
+#: bookwyrm/templatetags/utilities.py:49
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr ""
diff --git a/locale/eo_UY/LC_MESSAGES/django.mo b/locale/eo_UY/LC_MESSAGES/django.mo
index 1f66de56e..5f0b83ecb 100644
Binary files a/locale/eo_UY/LC_MESSAGES/django.mo and b/locale/eo_UY/LC_MESSAGES/django.mo differ
diff --git a/locale/eo_UY/LC_MESSAGES/django.po b/locale/eo_UY/LC_MESSAGES/django.po
index 47bd205ef..2b04f98b6 100644
--- a/locale/eo_UY/LC_MESSAGES/django.po
+++ b/locale/eo_UY/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-27 01:11+0000\n"
-"PO-Revision-Date: 2023-09-28 00:08\n"
+"POT-Creation-Date: 2023-12-30 23:52+0000\n"
+"PO-Revision-Date: 2024-01-02 03:12\n"
"Last-Translator: Mouse Reeve %(level)s
."
+msgstr ""
+
+#: bookwyrm/templates/403.html:15
+msgid "If you think you should have access, please speak to your BookWyrm server administrator."
+msgstr ""
+
#: bookwyrm/templates/404.html:4 bookwyrm/templates/404.html:8
msgid "Not Found"
msgstr "Ne trovita"
@@ -476,6 +496,20 @@ msgstr "Ne trovita"
msgid "The page you requested doesn't seem to exist!"
msgstr "La paĝo kiun vi petis ŝajne ne ekzistas!"
+#: bookwyrm/templates/413.html:4 bookwyrm/templates/413.html:8
+msgid "File too large"
+msgstr ""
+
+#: bookwyrm/templates/413.html:9
+msgid "The file you are uploading is too large."
+msgstr ""
+
+#: bookwyrm/templates/413.html:11
+msgid "\n"
+" You you can try using a smaller file, or ask your BookWyrm server administrator to increase the DATA_UPLOAD_MAX_MEMORY_SIZE
setting.\n"
+" "
+msgstr ""
+
#: bookwyrm/templates/500.html:4
msgid "Oops!"
msgstr "Ups!"
@@ -536,12 +570,12 @@ msgstr "La kontrolantoj de %(site_name)s kaj la administrantoj certigas la daŭr
msgid "Moderator"
msgstr "Kontrolanto"
-#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:67
+#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:62
msgid "Admin"
msgstr "Administranto"
#: bookwyrm/templates/about/about.html:140
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:28
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
msgid "Send direct message"
@@ -575,7 +609,7 @@ msgid "Software version:"
msgstr "Versio de la programo:"
#: bookwyrm/templates/about/layout.html:30
-#: bookwyrm/templates/embed-layout.html:33
+#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/snippets/footer.html:8
#, python-format
msgid "About %(site_name)s"
@@ -680,7 +714,7 @@ msgstr "Ria plej mallonga legaĵo ĉi-jare…"
#: bookwyrm/templates/annual_summary/layout.html:157
#: bookwyrm/templates/annual_summary/layout.html:178
#: bookwyrm/templates/annual_summary/layout.html:247
-#: bookwyrm/templates/book/book.html:63
+#: bookwyrm/templates/book/book.html:65
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
@@ -768,24 +802,24 @@ msgid "View ISNI record"
msgstr "Vidi la ISNI-registraĵon"
#: bookwyrm/templates/author/author.html:95
-#: bookwyrm/templates/book/book.html:173
+#: bookwyrm/templates/book/book.html:175
msgid "View on ISFDB"
msgstr "Vidi ĉe ISFDB"
#: bookwyrm/templates/author/author.html:100
#: bookwyrm/templates/author/sync_modal.html:5
-#: bookwyrm/templates/book/book.html:140
+#: bookwyrm/templates/book/book.html:142
#: bookwyrm/templates/book/sync_modal.html:5
msgid "Load data"
msgstr "Ŝarĝi per la datumaro"
#: bookwyrm/templates/author/author.html:104
-#: bookwyrm/templates/book/book.html:144
+#: bookwyrm/templates/book/book.html:146
msgid "View on OpenLibrary"
msgstr "Vidi ĉe OpenLibrary"
#: bookwyrm/templates/author/author.html:119
-#: bookwyrm/templates/book/book.html:158
+#: bookwyrm/templates/book/book.html:160
msgid "View on Inventaire"
msgstr "Vidi ĉe Inventaire"
@@ -797,11 +831,7 @@ msgstr "Vidi ĉe LibraryThing"
msgid "View on Goodreads"
msgstr "Vidi ĉe Goodreads"
-#: bookwyrm/templates/author/author.html:151
-msgid "View ISFDB entry"
-msgstr "Vidi la ISFDB-registraĵon"
-
-#: bookwyrm/templates/author/author.html:166
+#: bookwyrm/templates/author/author.html:158
#, python-format
msgid "Books by %(name)s"
msgstr "Libroj de %(name)s"
@@ -910,7 +940,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:89
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save"
@@ -959,19 +989,19 @@ msgstr "Konfirmi"
msgid "Unable to connect to remote source."
msgstr "La konekto al la fora fonto malsukcesis."
-#: bookwyrm/templates/book/book.html:71 bookwyrm/templates/book/book.html:72
+#: bookwyrm/templates/book/book.html:73 bookwyrm/templates/book/book.html:74
msgid "Edit Book"
msgstr "Modifi libron"
-#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:100
+#: bookwyrm/templates/book/book.html:99 bookwyrm/templates/book/book.html:102
msgid "Click to add cover"
msgstr "Alklaku por aldoni kovrilon"
-#: bookwyrm/templates/book/book.html:106
+#: bookwyrm/templates/book/book.html:108
msgid "Failed to load cover"
msgstr "Elŝuto de la kovrilo malsukcesis"
-#: bookwyrm/templates/book/book.html:117
+#: bookwyrm/templates/book/book.html:119
msgid "Click to enlarge"
msgstr "Alklaku por grandigi"
@@ -1046,13 +1076,13 @@ msgstr "Lokoj"
#: bookwyrm/templates/guided_tour/lists.html:14
#: bookwyrm/templates/guided_tour/user_books.html:102
#: bookwyrm/templates/guided_tour/user_profile.html:78
-#: bookwyrm/templates/layout.html:90 bookwyrm/templates/lists/curate.html:8
+#: bookwyrm/templates/layout.html:88 bookwyrm/templates/lists/curate.html:8
#: bookwyrm/templates/lists/list.html:12 bookwyrm/templates/lists/lists.html:5
#: bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:26
#: bookwyrm/templates/search/layout.html:51
#: bookwyrm/templates/settings/celery.html:77
-#: bookwyrm/templates/user/layout.html:91 bookwyrm/templates/user/lists.html:6
+#: bookwyrm/templates/user/layout.html:101 bookwyrm/templates/user/lists.html:6
msgid "Lists"
msgstr "Listoj"
@@ -1076,11 +1106,11 @@ msgstr "ISBN:"
#: bookwyrm/templates/book/book_identifiers.html:12
#: bookwyrm/templates/book/book_identifiers.html:13
msgid "Copy ISBN"
-msgstr ""
+msgstr "Kopii la ISBN"
#: bookwyrm/templates/book/book_identifiers.html:16
msgid "Copied ISBN!"
-msgstr ""
+msgstr "Kopiis la ISBN!"
#: bookwyrm/templates/book/book_identifiers.html:23
#: bookwyrm/templates/book/edit/edit_book_form.html:352
@@ -1117,8 +1147,8 @@ msgstr "Alŝuti kovrilon:"
#: bookwyrm/templates/book/cover_add_modal.html:23
#: bookwyrm/templates/book/edit/edit_book_form.html:250
-msgid "Load cover from url:"
-msgstr "Elŝuti kovrilon de URL:"
+msgid "Load cover from URL:"
+msgstr "Ŝarĝi la kovrilon el URL:"
#: bookwyrm/templates/book/cover_show_modal.html:6
msgid "Book cover preview"
@@ -1245,7 +1275,7 @@ msgstr "Titolo:"
#: bookwyrm/templates/book/edit/edit_book_form.html:35
msgid "Sort Title:"
-msgstr ""
+msgstr "Ordiga titolo:"
#: bookwyrm/templates/book/edit/edit_book_form.html:44
msgid "Subtitle:"
@@ -1328,7 +1358,7 @@ msgid "Add Another Author"
msgstr "Aldoni alian aŭtoron"
#: bookwyrm/templates/book/edit/edit_book_form.html:231
-#: bookwyrm/templates/shelf/shelf.html:147
+#: bookwyrm/templates/shelf/shelf.html:149
msgid "Cover"
msgstr "Kovrilo"
@@ -1372,8 +1402,8 @@ msgstr "Eldonoj de %(book_title)s"
#: bookwyrm/templates/book/editions/editions.html:8
#, python-format
-msgid "Editions of \"%(work_title)s\""
-msgstr "Eldonoj de «%(work_title)s»"
+msgid "Editions of %(work_title)s"
+msgstr "Eldonoj de %(work_title)s"
#: bookwyrm/templates/book/editions/editions.html:55
msgid "Can't find the edition you're looking for?"
@@ -1455,8 +1485,9 @@ msgstr "Domajno"
#: bookwyrm/templates/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
#: bookwyrm/templates/settings/invites/status_filter.html:5
+#: bookwyrm/templates/settings/themes.html:111
#: bookwyrm/templates/settings/users/user_admin.html:56
-#: bookwyrm/templates/settings/users/user_info.html:24
+#: bookwyrm/templates/settings/users/user_info.html:35
msgid "Status"
msgstr "Stato"
@@ -1465,7 +1496,7 @@ msgstr "Stato"
#: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/imports/imports.html:141
#: bookwyrm/templates/settings/reports/report_links_table.html:6
-#: bookwyrm/templates/settings/themes.html:99
+#: bookwyrm/templates/settings/themes.html:108
msgid "Actions"
msgstr "Agoj"
@@ -1529,22 +1560,22 @@ msgstr "%(pages)s paĝoj"
msgid "%(languages)s language"
msgstr "Lingvo: %(languages)s"
-#: bookwyrm/templates/book/publisher_info.html:65
+#: bookwyrm/templates/book/publisher_info.html:63
#, python-format
msgid "Published %(date)s by %(publisher)s."
msgstr "Eldonita je %(date)s de %(publisher)s."
+#: bookwyrm/templates/book/publisher_info.html:65
+#, python-format
+msgid "Published by %(publisher)s."
+msgstr "Eldonita de %(publisher)s."
+
#: bookwyrm/templates/book/publisher_info.html:67
#, python-format
msgid "Published %(date)s"
msgstr "Eldonita je %(date)s"
-#: bookwyrm/templates/book/publisher_info.html:69
-#, python-format
-msgid "Published by %(publisher)s."
-msgstr "Eldonita de %(publisher)s."
-
-#: bookwyrm/templates/book/rating.html:13
+#: bookwyrm/templates/book/rating.html:19
msgid "rated it"
msgstr "taksis ĝin"
@@ -1552,12 +1583,12 @@ msgstr "taksis ĝin"
msgid "Series by"
msgstr "Serio de"
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
#, python-format
msgid "Book %(series_number)s"
msgstr "Libro %(series_number)s"
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
msgid "Unsorted Book"
msgstr "Sennumera libro"
@@ -1681,6 +1712,7 @@ msgstr "Sugestita"
#: bookwyrm/templates/ostatus/subscribe.html:42
#: bookwyrm/templates/ostatus/success.html:17
#: bookwyrm/templates/ostatus/success.html:18
+#: bookwyrm/templates/user/moved.html:19 bookwyrm/templates/user/moved.html:20
#: bookwyrm/templates/user/user_preview.html:16
#: bookwyrm/templates/user/user_preview.html:17
msgid "Locked account"
@@ -1755,7 +1787,7 @@ msgstr "%(username)s citis %(username)s"
msgstr "Rektaj mesaĝoj kun %(username)s"
#: bookwyrm/templates/feed/direct_messages.html:10
-#: bookwyrm/templates/user_menu.html:44
+#: bookwyrm/templates/user_menu.html:39
msgid "Direct Messages"
msgstr "Rektaj mesaĝoj"
@@ -1948,7 +1980,7 @@ msgstr "Ĝisdatigoj"
#: bookwyrm/templates/feed/suggested_books.html:6
#: bookwyrm/templates/guided_tour/home.html:127
-#: bookwyrm/templates/user_menu.html:39
+#: bookwyrm/templates/layout.html:94
msgid "Your Books"
msgstr "Viaj libroj"
@@ -1996,19 +2028,19 @@ msgid "Add to your books"
msgstr "Aldoni al viaj libroj"
#: bookwyrm/templates/get_started/book_preview.html:10
-#: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37
+#: bookwyrm/templates/shelf/shelf.html:88 bookwyrm/templates/user/user.html:37
#: bookwyrm/templatetags/shelf_tags.py:14
msgid "To Read"
msgstr "Legota"
#: bookwyrm/templates/get_started/book_preview.html:11
-#: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38
+#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:38
#: bookwyrm/templatetags/shelf_tags.py:15
msgid "Currently Reading"
msgstr "Legata"
#: bookwyrm/templates/get_started/book_preview.html:12
-#: bookwyrm/templates/shelf/shelf.html:88
+#: bookwyrm/templates/shelf/shelf.html:90
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
@@ -2017,7 +2049,7 @@ msgid "Read"
msgstr "Legita"
#: bookwyrm/templates/get_started/book_preview.html:13
-#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40
+#: bookwyrm/templates/shelf/shelf.html:91 bookwyrm/templates/user/user.html:40
#: bookwyrm/templatetags/shelf_tags.py:17
msgid "Stopped Reading"
msgstr "Haltigita legado"
@@ -2027,7 +2059,7 @@ msgid "What are you reading?"
msgstr "Kion vi legas?"
#: bookwyrm/templates/get_started/books.html:9
-#: bookwyrm/templates/layout.html:39 bookwyrm/templates/lists/list.html:213
+#: bookwyrm/templates/layout.html:41 bookwyrm/templates/lists/list.html:213
msgid "Search for a book"
msgstr "Serĉi libron"
@@ -2046,8 +2078,8 @@ msgstr "Vi povos aldoni librojn kiam vi komencos uzi %(site_name)s."
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:15
-#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:45
-#: bookwyrm/templates/layout.html:46 bookwyrm/templates/lists/list.html:217
+#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:47
+#: bookwyrm/templates/layout.html:48 bookwyrm/templates/lists/list.html:217
#: bookwyrm/templates/search/layout.html:5
#: bookwyrm/templates/search/layout.html:10
#: bookwyrm/templates/search/layout.html:32
@@ -2268,7 +2300,7 @@ msgstr "Estro"
#: bookwyrm/templates/groups/user_groups.html:35
msgid "No groups found."
-msgstr ""
+msgstr "Neniu grupo troviĝis."
#: bookwyrm/templates/guided_tour/book.html:10
msgid "This is home page of a book. Let's see what you can do while you're here!"
@@ -2514,8 +2546,8 @@ msgid "Barcode reader"
msgstr "Strikodolegilo"
#: bookwyrm/templates/guided_tour/home.html:102
-msgid "Use the Feed, Lists and Discover links to discover the latest news from your feed, lists of books by topic, and the latest happenings on this Bookwyrm server!"
-msgstr "Uzu la ligilojn Fluo, Listoj kaj Malkovri por malkovri la plej lastajn novaĵojn de via fluo, listojn de libroj laŭ temo, kaj la lastajn okazaĵojn ĉe ĉi tiu servilo de Bookwyrm!"
+msgid "Use the Lists, Discover, and Your Books links to discover reading suggestions and the latest happenings on this server, or to see your catalogued books!"
+msgstr ""
#: bookwyrm/templates/guided_tour/home.html:103
msgid "Navigation Bar"
@@ -2538,16 +2570,16 @@ msgid "The bell will light up when you have a new notification. When it does, cl
msgstr "La sonorilo briliĝos kiam vi havos novan atentigon. Kiam ĝi estos brila, alklaku ĝin por scii kia interesa afero okazis!"
#: bookwyrm/templates/guided_tour/home.html:177
-#: bookwyrm/templates/layout.html:75 bookwyrm/templates/layout.html:106
-#: bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:77 bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:108
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr "Atentigoj"
#: bookwyrm/templates/guided_tour/home.html:200
-msgid "Your profile, books, direct messages, and settings can be accessed by clicking on your name in the menu here."
-msgstr "Viaj profilo, libroj, rektaj mesaĝoj kaj agordoj estas alireblaj per alklako de via nomo en ĉi tiu menuo."
+msgid "Your profile, user directory, direct messages, and settings can be accessed by clicking on your name in the menu here."
+msgstr ""
#: bookwyrm/templates/guided_tour/home.html:200
msgid "Try selecting Profile from the drop down menu to continue the tour."
@@ -2702,7 +2734,7 @@ msgstr "Vi povas krei grupon aŭ aliĝi al grupo kun aliaj uzantoj. Grupoj povas
#: bookwyrm/templates/guided_tour/user_groups.html:11
#: bookwyrm/templates/guided_tour/user_profile.html:55
-#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:85
+#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:95
msgid "Groups"
msgstr "Grupoj"
@@ -2747,7 +2779,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr "Jen via profilpaĝo. Ĉiuj viaj lastaj agoj listiĝos ĉi tie. Ankaŭ aliaj uzantoj de Bookwyrm povas vidi partojn de ĉi tiu paĝo – tio kion ili vidis dependas de viaj agordoj de privateco."
#: bookwyrm/templates/guided_tour/user_profile.html:11
-#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:14
+#: bookwyrm/templates/user/layout.html:20 bookwyrm/templates/user/user.html:14
msgid "User Profile"
msgstr "Profilo"
@@ -2756,7 +2788,7 @@ msgid "This tab shows everything you have read towards your annual reading goal,
msgstr "Ĉi tiu langeto montras ĉion kion vi legis por atingi vian jaran legocelon, aŭ ĝi permesas al vi agordi celon. Agordi legocelon ne estas devige se tio ne interesas vin!"
#: bookwyrm/templates/guided_tour/user_profile.html:32
-#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:79
+#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:89
msgid "Reading Goal"
msgstr "Legocelo"
@@ -2795,7 +2827,7 @@ msgstr "Ankoraŭ neniu agado por ĉi tiu kradvorto!"
#: bookwyrm/templates/import/import.html:5
#: bookwyrm/templates/import/import.html:9
-#: bookwyrm/templates/shelf/shelf.html:64
+#: bookwyrm/templates/shelf/shelf.html:66
msgid "Import Books"
msgstr "Importi librojn"
@@ -2805,19 +2837,15 @@ msgstr "La CSV-a dosiero ne validas"
#: bookwyrm/templates/import/import.html:21
#, python-format
-msgid "\n"
-" Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day.\n"
-" "
-msgid_plural "\n"
-" Currently, you are allowed to import %(import_size_limit)s books every %(import_limit_reset)s days.\n"
-" "
-msgstr[0] ""
-msgstr[1] ""
+msgid "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day."
+msgid_plural "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s days."
+msgstr[0] "Aktuale vi rajtas importi %(display_size)s librojn ĉiun %(import_limit_reset)s tagon."
+msgstr[1] "Aktuale vi rajtas importi %(display_size)s librojn ĉiujn %(import_limit_reset)s tagojn."
#: bookwyrm/templates/import/import.html:27
#, python-format
msgid "You have %(display_left)s left."
-msgstr ""
+msgstr "Restas al vi %(display_left)s."
#: bookwyrm/templates/import/import.html:34
#, python-format
@@ -2871,7 +2899,7 @@ msgstr "Agordo de privateco por importitaj recenzoj:"
#: bookwyrm/templates/import/import.html:106
#: bookwyrm/templates/import/import.html:108
-#: bookwyrm/templates/preferences/layout.html:35
+#: bookwyrm/templates/preferences/layout.html:43
#: bookwyrm/templates/settings/federation/instance_blocklist.html:78
msgid "Import"
msgstr "Importi"
@@ -2970,8 +2998,8 @@ msgid "Row"
msgstr "Linio"
#: bookwyrm/templates/import/import_status.html:110
-#: bookwyrm/templates/shelf/shelf.html:148
-#: bookwyrm/templates/shelf/shelf.html:170
+#: bookwyrm/templates/shelf/shelf.html:150
+#: bookwyrm/templates/shelf/shelf.html:172
msgid "Title"
msgstr "Titolo"
@@ -2984,8 +3012,8 @@ msgid "Openlibrary key"
msgstr "Ŝlosilo de Openlibrary"
#: bookwyrm/templates/import/import_status.html:121
-#: bookwyrm/templates/shelf/shelf.html:149
-#: bookwyrm/templates/shelf/shelf.html:173
+#: bookwyrm/templates/shelf/shelf.html:151
+#: bookwyrm/templates/shelf/shelf.html:175
msgid "Author"
msgstr "Aŭtoro"
@@ -3091,10 +3119,6 @@ msgstr "Kontaktu vian administranton aŭ DATA_UPLOAD_MAX_MEMORY_SIZE setting.\n"
+" "
+msgstr ""
+
#: bookwyrm/templates/500.html:4
msgid "Oops!"
msgstr "¡Ups!"
@@ -536,12 +570,12 @@ msgstr "Los moderadores y administradores de %(site_name)s mantienen el sitio en
msgid "Moderator"
msgstr "Moderador"
-#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:67
+#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:62
msgid "Admin"
msgstr "Admin"
#: bookwyrm/templates/about/about.html:140
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:28
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
msgid "Send direct message"
@@ -575,7 +609,7 @@ msgid "Software version:"
msgstr "Versión del software:"
#: bookwyrm/templates/about/layout.html:30
-#: bookwyrm/templates/embed-layout.html:33
+#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/snippets/footer.html:8
#, python-format
msgid "About %(site_name)s"
@@ -680,7 +714,7 @@ msgstr "El libro más corto que ha leído este año…"
#: bookwyrm/templates/annual_summary/layout.html:157
#: bookwyrm/templates/annual_summary/layout.html:178
#: bookwyrm/templates/annual_summary/layout.html:247
-#: bookwyrm/templates/book/book.html:63
+#: bookwyrm/templates/book/book.html:65
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
@@ -768,24 +802,24 @@ msgid "View ISNI record"
msgstr "Ver registro ISNI"
#: bookwyrm/templates/author/author.html:95
-#: bookwyrm/templates/book/book.html:173
+#: bookwyrm/templates/book/book.html:175
msgid "View on ISFDB"
msgstr "Ver en ISFDB"
#: bookwyrm/templates/author/author.html:100
#: bookwyrm/templates/author/sync_modal.html:5
-#: bookwyrm/templates/book/book.html:140
+#: bookwyrm/templates/book/book.html:142
#: bookwyrm/templates/book/sync_modal.html:5
msgid "Load data"
msgstr "Cargar datos"
#: bookwyrm/templates/author/author.html:104
-#: bookwyrm/templates/book/book.html:144
+#: bookwyrm/templates/book/book.html:146
msgid "View on OpenLibrary"
msgstr "Ver en OpenLibrary"
#: bookwyrm/templates/author/author.html:119
-#: bookwyrm/templates/book/book.html:158
+#: bookwyrm/templates/book/book.html:160
msgid "View on Inventaire"
msgstr "Ver en Inventaire"
@@ -797,11 +831,7 @@ msgstr "Ver en LibraryThing"
msgid "View on Goodreads"
msgstr "Ver en Goodreads"
-#: bookwyrm/templates/author/author.html:151
-msgid "View ISFDB entry"
-msgstr "Ver entrada en ISFDB"
-
-#: bookwyrm/templates/author/author.html:166
+#: bookwyrm/templates/author/author.html:158
#, python-format
msgid "Books by %(name)s"
msgstr "Libros de %(name)s"
@@ -910,7 +940,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:89
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save"
@@ -959,19 +989,19 @@ msgstr "Confirmar"
msgid "Unable to connect to remote source."
msgstr "No se ha podido conectar con la fuente remota."
-#: bookwyrm/templates/book/book.html:71 bookwyrm/templates/book/book.html:72
+#: bookwyrm/templates/book/book.html:73 bookwyrm/templates/book/book.html:74
msgid "Edit Book"
msgstr "Editar Libro"
-#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:100
+#: bookwyrm/templates/book/book.html:99 bookwyrm/templates/book/book.html:102
msgid "Click to add cover"
msgstr "Haz clic para añadir portada"
-#: bookwyrm/templates/book/book.html:106
+#: bookwyrm/templates/book/book.html:108
msgid "Failed to load cover"
msgstr "No se pudo cargar la portada"
-#: bookwyrm/templates/book/book.html:117
+#: bookwyrm/templates/book/book.html:119
msgid "Click to enlarge"
msgstr "Haz clic para ampliar"
@@ -1035,7 +1065,7 @@ msgstr "Tus citas"
#: bookwyrm/templates/book/book.html:360
msgid "Subjects"
-msgstr "Sujetos"
+msgstr "Temas"
#: bookwyrm/templates/book/book.html:372
msgid "Places"
@@ -1046,13 +1076,13 @@ msgstr "Lugares"
#: bookwyrm/templates/guided_tour/lists.html:14
#: bookwyrm/templates/guided_tour/user_books.html:102
#: bookwyrm/templates/guided_tour/user_profile.html:78
-#: bookwyrm/templates/layout.html:90 bookwyrm/templates/lists/curate.html:8
+#: bookwyrm/templates/layout.html:88 bookwyrm/templates/lists/curate.html:8
#: bookwyrm/templates/lists/list.html:12 bookwyrm/templates/lists/lists.html:5
#: bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:26
#: bookwyrm/templates/search/layout.html:51
#: bookwyrm/templates/settings/celery.html:77
-#: bookwyrm/templates/user/layout.html:91 bookwyrm/templates/user/lists.html:6
+#: bookwyrm/templates/user/layout.html:101 bookwyrm/templates/user/lists.html:6
msgid "Lists"
msgstr "Listas"
@@ -1117,8 +1147,8 @@ msgstr "Subir portada:"
#: bookwyrm/templates/book/cover_add_modal.html:23
#: bookwyrm/templates/book/edit/edit_book_form.html:250
-msgid "Load cover from url:"
-msgstr "Agregar portada de url:"
+msgid "Load cover from URL:"
+msgstr "Cargar portada desde URL:"
#: bookwyrm/templates/book/cover_show_modal.html:6
msgid "Book cover preview"
@@ -1328,7 +1358,7 @@ msgid "Add Another Author"
msgstr "Añadir Otro Autor"
#: bookwyrm/templates/book/edit/edit_book_form.html:231
-#: bookwyrm/templates/shelf/shelf.html:147
+#: bookwyrm/templates/shelf/shelf.html:149
msgid "Cover"
msgstr "Portada"
@@ -1372,8 +1402,8 @@ msgstr "Ediciones de %(book_title)s"
#: bookwyrm/templates/book/editions/editions.html:8
#, python-format
-msgid "Editions of \"%(work_title)s\""
-msgstr "Ediciones de \"%(work_title)s\""
+msgid "Editions of %(work_title)s"
+msgstr "Ediciones de %(work_title)s"
#: bookwyrm/templates/book/editions/editions.html:55
msgid "Can't find the edition you're looking for?"
@@ -1455,8 +1485,9 @@ msgstr "Dominio"
#: bookwyrm/templates/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
#: bookwyrm/templates/settings/invites/status_filter.html:5
+#: bookwyrm/templates/settings/themes.html:111
#: bookwyrm/templates/settings/users/user_admin.html:56
-#: bookwyrm/templates/settings/users/user_info.html:24
+#: bookwyrm/templates/settings/users/user_info.html:35
msgid "Status"
msgstr "Estado"
@@ -1465,7 +1496,7 @@ msgstr "Estado"
#: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/imports/imports.html:141
#: bookwyrm/templates/settings/reports/report_links_table.html:6
-#: bookwyrm/templates/settings/themes.html:99
+#: bookwyrm/templates/settings/themes.html:108
msgid "Actions"
msgstr "Acciones"
@@ -1529,22 +1560,22 @@ msgstr "%(pages)s páginas"
msgid "%(languages)s language"
msgstr "Idioma %(languages)s"
-#: bookwyrm/templates/book/publisher_info.html:65
+#: bookwyrm/templates/book/publisher_info.html:63
#, python-format
msgid "Published %(date)s by %(publisher)s."
msgstr "Publicado el %(date)s por %(publisher)s."
+#: bookwyrm/templates/book/publisher_info.html:65
+#, python-format
+msgid "Published by %(publisher)s."
+msgstr "Publicado por %(publisher)s."
+
#: bookwyrm/templates/book/publisher_info.html:67
#, python-format
msgid "Published %(date)s"
msgstr "Publicado el %(date)s"
-#: bookwyrm/templates/book/publisher_info.html:69
-#, python-format
-msgid "Published by %(publisher)s."
-msgstr "Publicado por %(publisher)s."
-
-#: bookwyrm/templates/book/rating.html:13
+#: bookwyrm/templates/book/rating.html:19
msgid "rated it"
msgstr "lo valoró con"
@@ -1552,12 +1583,12 @@ msgstr "lo valoró con"
msgid "Series by"
msgstr "Series de"
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
#, python-format
msgid "Book %(series_number)s"
msgstr "Libro %(series_number)s"
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
msgid "Unsorted Book"
msgstr "Libro sin clasificar"
@@ -1681,6 +1712,7 @@ msgstr "Sugerido"
#: bookwyrm/templates/ostatus/subscribe.html:42
#: bookwyrm/templates/ostatus/success.html:17
#: bookwyrm/templates/ostatus/success.html:18
+#: bookwyrm/templates/user/moved.html:19 bookwyrm/templates/user/moved.html:20
#: bookwyrm/templates/user/user_preview.html:16
#: bookwyrm/templates/user/user_preview.html:17
msgid "Locked account"
@@ -1755,7 +1787,7 @@ msgstr "%(username)s ha citado %(username)s"
msgstr "Mensajes directos con %(username)s"
#: bookwyrm/templates/feed/direct_messages.html:10
-#: bookwyrm/templates/user_menu.html:44
+#: bookwyrm/templates/user_menu.html:39
msgid "Direct Messages"
msgstr "Mensajes directos"
@@ -1948,7 +1980,7 @@ msgstr "Actualizaciones"
#: bookwyrm/templates/feed/suggested_books.html:6
#: bookwyrm/templates/guided_tour/home.html:127
-#: bookwyrm/templates/user_menu.html:39
+#: bookwyrm/templates/layout.html:94
msgid "Your Books"
msgstr "Tus libros"
@@ -1996,19 +2028,19 @@ msgid "Add to your books"
msgstr "Añadir a tus libros"
#: bookwyrm/templates/get_started/book_preview.html:10
-#: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37
+#: bookwyrm/templates/shelf/shelf.html:88 bookwyrm/templates/user/user.html:37
#: bookwyrm/templatetags/shelf_tags.py:14
msgid "To Read"
msgstr "Para leer"
#: bookwyrm/templates/get_started/book_preview.html:11
-#: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38
+#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:38
#: bookwyrm/templatetags/shelf_tags.py:15
msgid "Currently Reading"
msgstr "Leyendo actualmente"
#: bookwyrm/templates/get_started/book_preview.html:12
-#: bookwyrm/templates/shelf/shelf.html:88
+#: bookwyrm/templates/shelf/shelf.html:90
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
@@ -2017,7 +2049,7 @@ msgid "Read"
msgstr "Leído"
#: bookwyrm/templates/get_started/book_preview.html:13
-#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40
+#: bookwyrm/templates/shelf/shelf.html:91 bookwyrm/templates/user/user.html:40
#: bookwyrm/templatetags/shelf_tags.py:17
msgid "Stopped Reading"
msgstr "Lectura interrumpida"
@@ -2027,7 +2059,7 @@ msgid "What are you reading?"
msgstr "¿Qué estás leyendo?"
#: bookwyrm/templates/get_started/books.html:9
-#: bookwyrm/templates/layout.html:39 bookwyrm/templates/lists/list.html:213
+#: bookwyrm/templates/layout.html:41 bookwyrm/templates/lists/list.html:213
msgid "Search for a book"
msgstr "Buscar libros"
@@ -2046,8 +2078,8 @@ msgstr "Puedes agregar libros cuando comiences a usar %(site_name)s."
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:15
-#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:45
-#: bookwyrm/templates/layout.html:46 bookwyrm/templates/lists/list.html:217
+#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:47
+#: bookwyrm/templates/layout.html:48 bookwyrm/templates/lists/list.html:217
#: bookwyrm/templates/search/layout.html:5
#: bookwyrm/templates/search/layout.html:10
#: bookwyrm/templates/search/layout.html:32
@@ -2514,8 +2546,8 @@ msgid "Barcode reader"
msgstr "Escáner de código de barras"
#: bookwyrm/templates/guided_tour/home.html:102
-msgid "Use the Feed, Lists and Discover links to discover the latest news from your feed, lists of books by topic, and the latest happenings on this Bookwyrm server!"
-msgstr "¡Usa los enlaces Feed, Listas y Descubre para descubrir las últimas noticias de tu feed, listas de libros por temática, y los últimos acontecimientos en este servidor de Bookwyrm!"
+msgid "Use the Lists, Discover, and Your Books links to discover reading suggestions and the latest happenings on this server, or to see your catalogued books!"
+msgstr ""
#: bookwyrm/templates/guided_tour/home.html:103
msgid "Navigation Bar"
@@ -2538,16 +2570,16 @@ msgid "The bell will light up when you have a new notification. When it does, cl
msgstr "La campana se encenderá cuando tengas una nueva notificación. ¡Cuando lo haga, haz clic en ella para saber qué cosa emocionante ha sucedido!"
#: bookwyrm/templates/guided_tour/home.html:177
-#: bookwyrm/templates/layout.html:75 bookwyrm/templates/layout.html:106
-#: bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:77 bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:108
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr "Notificaciones"
#: bookwyrm/templates/guided_tour/home.html:200
-msgid "Your profile, books, direct messages, and settings can be accessed by clicking on your name in the menu here."
-msgstr "Puedes acceder a tu perfil, tus libros, tus mensajes directos y tu configuración haciendo clic en tu nombre en este menú."
+msgid "Your profile, user directory, direct messages, and settings can be accessed by clicking on your name in the menu here."
+msgstr ""
#: bookwyrm/templates/guided_tour/home.html:200
msgid "Try selecting Profile from the drop down menu to continue the tour."
@@ -2702,7 +2734,7 @@ msgstr "Puedes crear o unirte a un grupo con otros usuarios. Los grupos pueden c
#: bookwyrm/templates/guided_tour/user_groups.html:11
#: bookwyrm/templates/guided_tour/user_profile.html:55
-#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:85
+#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:95
msgid "Groups"
msgstr "Grupos"
@@ -2747,7 +2779,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr "Este es tu perfil de usuario. Todas tus últimas actividades aparecerán aquí. Otros usuarios de Bookwyrm también pueden ver partes de esta página (lo que ellos pueden ver depende de tu configuración de privacidad)."
#: bookwyrm/templates/guided_tour/user_profile.html:11
-#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:14
+#: bookwyrm/templates/user/layout.html:20 bookwyrm/templates/user/user.html:14
msgid "User Profile"
msgstr "Perfil de usuario"
@@ -2756,7 +2788,7 @@ msgid "This tab shows everything you have read towards your annual reading goal,
msgstr "Esta pestaña muestra todo lo que has leído hacia tu objetivo anual de lectura, o te permite establecer uno. ¡No tienes por qué establecer un objetivo de lectura si eso no es lo tuyo!"
#: bookwyrm/templates/guided_tour/user_profile.html:32
-#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:79
+#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:89
msgid "Reading Goal"
msgstr "Objetivo de lectura"
@@ -2795,7 +2827,7 @@ msgstr "¡Esta etiqueta no tiene aún ninguna actividad!"
#: bookwyrm/templates/import/import.html:5
#: bookwyrm/templates/import/import.html:9
-#: bookwyrm/templates/shelf/shelf.html:64
+#: bookwyrm/templates/shelf/shelf.html:66
msgid "Import Books"
msgstr "Importar libros"
@@ -2805,18 +2837,10 @@ msgstr "No es un archivo CSV válido"
#: bookwyrm/templates/import/import.html:21
#, python-format
-msgid "\n"
-" Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day.\n"
-" "
-msgid_plural "\n"
-" Currently, you are allowed to import %(import_size_limit)s books every %(import_limit_reset)s days.\n"
-" "
-msgstr[0] "\n"
-" Actualmente, puedes importar %(display_size)s libros cada %(import_limit_reset)s días.\n"
-" "
-msgstr[1] "\n"
-" Actualmente, puedes importar %(import_size_limit)s libros cada %(import_limit_reset)s días.\n"
-" "
+msgid "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day."
+msgid_plural "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s days."
+msgstr[0] "Actualmente, puedes importar %(display_size)s libros cada %(import_limit_reset)s días."
+msgstr[1] "Actualmente, puedes importar %(display_size)s libros cada %(import_limit_reset)s días."
#: bookwyrm/templates/import/import.html:27
#, python-format
@@ -2875,7 +2899,7 @@ msgstr "Configuración de privacidad para las reseñas importadas:"
#: bookwyrm/templates/import/import.html:106
#: bookwyrm/templates/import/import.html:108
-#: bookwyrm/templates/preferences/layout.html:35
+#: bookwyrm/templates/preferences/layout.html:43
#: bookwyrm/templates/settings/federation/instance_blocklist.html:78
msgid "Import"
msgstr "Importar"
@@ -2974,8 +2998,8 @@ msgid "Row"
msgstr "Fila"
#: bookwyrm/templates/import/import_status.html:110
-#: bookwyrm/templates/shelf/shelf.html:148
-#: bookwyrm/templates/shelf/shelf.html:170
+#: bookwyrm/templates/shelf/shelf.html:150
+#: bookwyrm/templates/shelf/shelf.html:172
msgid "Title"
msgstr "Título"
@@ -2988,8 +3012,8 @@ msgid "Openlibrary key"
msgstr "Clave de OpenLibrary"
#: bookwyrm/templates/import/import_status.html:121
-#: bookwyrm/templates/shelf/shelf.html:149
-#: bookwyrm/templates/shelf/shelf.html:173
+#: bookwyrm/templates/shelf/shelf.html:151
+#: bookwyrm/templates/shelf/shelf.html:175
msgid "Author"
msgstr "Autor/Autora"
@@ -3095,10 +3119,6 @@ msgstr "Póngase en contacto con su administrador o GitHub."
-msgstr "BookWyrm es software libre y de código abierto. Puedes contribuir o reportar problemas en GitHub."
+msgstr "BookWyrm es software de código abierto. Puedes contribuir o reportar problemas en GitHub."
#: bookwyrm/templates/snippets/form_rate_stars.html:20
#: bookwyrm/templates/snippets/stars.html:23
@@ -6256,6 +6405,15 @@ msgstr "Has leído %(read_count)s de %(goal_count)s libros<
msgid "%(username)s has read %(read_count)s of %(goal_count)s books."
msgstr "%(username)s ha leído %(read_count)s de %(goal_count)s libros."
+#: bookwyrm/templates/snippets/move_user_buttons.html:10
+msgid "Follow at new account"
+msgstr "Seguir en nueva cuenta"
+
+#: bookwyrm/templates/snippets/moved_user_notice.html:7
+#, python-format
+msgid "%(user)s has moved to %(moved_to_name)s"
+msgstr ""
+
#: bookwyrm/templates/snippets/page_text.html:8
#, python-format
msgid "page %(page)s of %(total_pages)s"
@@ -6397,35 +6555,35 @@ msgstr "Dejar de leer"
msgid "Finish reading"
msgstr "Terminar de leer"
-#: bookwyrm/templates/snippets/status/content_status.html:80
+#: bookwyrm/templates/snippets/status/content_status.html:69
msgid "Show status"
msgstr "Mostrar estado"
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "(Page %(page)s"
msgstr "(Página %(page)s"
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "%(endpage)s"
msgstr "%(endpage)s"
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid "(%(percent)s%%"
msgstr "(%(percent)s%%"
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid " - %(endpercent)s%%"
msgstr " - %(endpercent)s%%"
-#: bookwyrm/templates/snippets/status/content_status.html:127
+#: bookwyrm/templates/snippets/status/content_status.html:116
msgid "Open image in new window"
msgstr "Abrir imagen en una nueva ventana"
-#: bookwyrm/templates/snippets/status/content_status.html:148
+#: bookwyrm/templates/snippets/status/content_status.html:137
msgid "Hide status"
msgstr "Ocultar estado"
@@ -6558,6 +6716,18 @@ msgstr "Mostrar más"
msgid "Show less"
msgstr "Mostrar menos"
+#: bookwyrm/templates/snippets/user_active_tag.html:5
+msgid "Moved"
+msgstr "Movido"
+
+#: bookwyrm/templates/snippets/user_active_tag.html:12
+msgid "Deleted"
+msgstr "Eliminado"
+
+#: bookwyrm/templates/snippets/user_active_tag.html:15
+msgid "Inactive"
+msgstr "Inactivo"
+
#: bookwyrm/templates/two_factor_auth/two_factor_login.html:29
msgid "2FA check"
msgstr "Comprobación de 2FA"
@@ -6616,11 +6786,11 @@ msgstr "Tus grupos"
msgid "Groups: %(username)s"
msgstr "Grupos: %(username)s"
-#: bookwyrm/templates/user/layout.html:50
+#: bookwyrm/templates/user/layout.html:59
msgid "Follow Requests"
msgstr "Solicitudes de seguimiento"
-#: bookwyrm/templates/user/layout.html:73
+#: bookwyrm/templates/user/layout.html:83
#: bookwyrm/templates/user/reviews_comments.html:6
#: bookwyrm/templates/user/reviews_comments.html:12
msgid "Reviews and Comments"
@@ -6635,7 +6805,13 @@ msgstr "Listas: %(username)s"
msgid "Create list"
msgstr "Crear lista"
-#: bookwyrm/templates/user/relationships/followers.html:31
+#: bookwyrm/templates/user/moved.html:25
+#: bookwyrm/templates/user/user_preview.html:22
+#, python-format
+msgid "Joined %(date)s"
+msgstr "Unido %(date)s"
+
+#: bookwyrm/templates/user/relationships/followers.html:36
#, python-format
msgid "%(username)s has no followers"
msgstr "%(username)s no tiene seguidores"
@@ -6706,11 +6882,6 @@ msgstr "Solo comentarios"
msgid "No activities yet!"
msgstr "¡Aún no actividades!"
-#: bookwyrm/templates/user/user_preview.html:22
-#, python-format
-msgid "Joined %(date)s"
-msgstr "Unido %(date)s"
-
#: bookwyrm/templates/user/user_preview.html:26
#, python-format
msgid "%(display_count)s follower"
@@ -6738,10 +6909,6 @@ msgstr "No le sigue nadie que tu sigas"
msgid "View profile and more"
msgstr "Ver perfil y más"
-#: bookwyrm/templates/user_menu.html:82
-msgid "Log out"
-msgstr "Cerrar sesión"
-
#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:28
msgid "File exceeds maximum size: 10MB"
msgstr "Archivo excede el tamaño máximo: 10MB"
@@ -6758,7 +6925,7 @@ msgid_plural "%(num)d books - by %(user)s"
msgstr[0] "%(num)d libro - de %(user)s"
msgstr[1] "%(num)d libros - de %(user)s"
-#: bookwyrm/templatetags/utilities.py:39
+#: bookwyrm/templatetags/utilities.py:49
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"
diff --git a/locale/eu_ES/LC_MESSAGES/django.mo b/locale/eu_ES/LC_MESSAGES/django.mo
index 572a0f9b2..de9ebaba4 100644
Binary files a/locale/eu_ES/LC_MESSAGES/django.mo and b/locale/eu_ES/LC_MESSAGES/django.mo differ
diff --git a/locale/eu_ES/LC_MESSAGES/django.po b/locale/eu_ES/LC_MESSAGES/django.po
index 24ede78e9..647483af8 100644
--- a/locale/eu_ES/LC_MESSAGES/django.po
+++ b/locale/eu_ES/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-27 01:11+0000\n"
-"PO-Revision-Date: 2023-09-28 00:08\n"
+"POT-Creation-Date: 2023-12-30 23:52+0000\n"
+"PO-Revision-Date: 2024-01-02 03:12\n"
"Last-Translator: Mouse Reeve %(level)s
."
+msgstr ""
+
+#: bookwyrm/templates/403.html:15
+msgid "If you think you should have access, please speak to your BookWyrm server administrator."
+msgstr ""
+
#: bookwyrm/templates/404.html:4 bookwyrm/templates/404.html:8
msgid "Not Found"
msgstr "Ez da aurkitu"
@@ -476,6 +496,20 @@ msgstr "Ez da aurkitu"
msgid "The page you requested doesn't seem to exist!"
msgstr "Badirudi eskatu duzun orrialdea ez dela existitzen!"
+#: bookwyrm/templates/413.html:4 bookwyrm/templates/413.html:8
+msgid "File too large"
+msgstr ""
+
+#: bookwyrm/templates/413.html:9
+msgid "The file you are uploading is too large."
+msgstr ""
+
+#: bookwyrm/templates/413.html:11
+msgid "\n"
+" You you can try using a smaller file, or ask your BookWyrm server administrator to increase the DATA_UPLOAD_MAX_MEMORY_SIZE
setting.\n"
+" "
+msgstr ""
+
#: bookwyrm/templates/500.html:4
msgid "Oops!"
msgstr "Hara!"
@@ -536,12 +570,12 @@ msgstr "%(site_name)s(e)ko moderatzaileek eta administratzaileek webgunea martxa
msgid "Moderator"
msgstr "Moderatzailea"
-#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:67
+#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:62
msgid "Admin"
msgstr "Administratzailea"
#: bookwyrm/templates/about/about.html:140
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:28
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
msgid "Send direct message"
@@ -575,7 +609,7 @@ msgid "Software version:"
msgstr "Softwarearen bertsioa:"
#: bookwyrm/templates/about/layout.html:30
-#: bookwyrm/templates/embed-layout.html:33
+#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/snippets/footer.html:8
#, python-format
msgid "About %(site_name)s"
@@ -602,7 +636,7 @@ msgstr "%(year)s liburuetan"
#: bookwyrm/templates/annual_summary/layout.html:47
#, python-format
msgid "%(display_name)s’s year of reading"
-msgstr "%(display_name)s(r)en irakurketa-urtea"
+msgstr "%(display_name)s erabiltzailearen irakurketa-urtea"
#: bookwyrm/templates/annual_summary/layout.html:53
msgid "Share this page"
@@ -619,7 +653,7 @@ msgstr "Kopiatuta!"
#: bookwyrm/templates/annual_summary/layout.html:77
msgid "Sharing status: public with key"
-msgstr "Egoeraren partekatzea: publikoa klabearekin"
+msgstr "Egoeraren partekatzea: publikoa gakoarekin"
#: bookwyrm/templates/annual_summary/layout.html:78
msgid "The page can be seen by anyone with the complete address."
@@ -680,7 +714,7 @@ msgstr "Aurtengo irakurketarik laburrena…"
#: bookwyrm/templates/annual_summary/layout.html:157
#: bookwyrm/templates/annual_summary/layout.html:178
#: bookwyrm/templates/annual_summary/layout.html:247
-#: bookwyrm/templates/book/book.html:63
+#: bookwyrm/templates/book/book.html:65
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
@@ -768,24 +802,24 @@ msgid "View ISNI record"
msgstr "Ikusi ISNI erregistroa"
#: bookwyrm/templates/author/author.html:95
-#: bookwyrm/templates/book/book.html:173
+#: bookwyrm/templates/book/book.html:175
msgid "View on ISFDB"
msgstr "Ikus ISFDB webgunean"
#: bookwyrm/templates/author/author.html:100
#: bookwyrm/templates/author/sync_modal.html:5
-#: bookwyrm/templates/book/book.html:140
+#: bookwyrm/templates/book/book.html:142
#: bookwyrm/templates/book/sync_modal.html:5
msgid "Load data"
msgstr "Kargatu datuak"
#: bookwyrm/templates/author/author.html:104
-#: bookwyrm/templates/book/book.html:144
+#: bookwyrm/templates/book/book.html:146
msgid "View on OpenLibrary"
msgstr "OpenLibraryn ikusi"
#: bookwyrm/templates/author/author.html:119
-#: bookwyrm/templates/book/book.html:158
+#: bookwyrm/templates/book/book.html:160
msgid "View on Inventaire"
msgstr "Inventairen ikusi"
@@ -797,11 +831,7 @@ msgstr "LibraryThing-en ikusi"
msgid "View on Goodreads"
msgstr "Goodreads-en ikusi"
-#: bookwyrm/templates/author/author.html:151
-msgid "View ISFDB entry"
-msgstr "Ikus ISFDB atala"
-
-#: bookwyrm/templates/author/author.html:166
+#: bookwyrm/templates/author/author.html:158
#, python-format
msgid "Books by %(name)s"
msgstr "%(name)s(e)k idatzitako liburuak"
@@ -910,7 +940,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:89
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save"
@@ -959,19 +989,19 @@ msgstr "Berretsi"
msgid "Unable to connect to remote source."
msgstr "Ezin izan da urruneko edukira konektatu."
-#: bookwyrm/templates/book/book.html:71 bookwyrm/templates/book/book.html:72
+#: bookwyrm/templates/book/book.html:73 bookwyrm/templates/book/book.html:74
msgid "Edit Book"
msgstr "Editatu liburua"
-#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:100
+#: bookwyrm/templates/book/book.html:99 bookwyrm/templates/book/book.html:102
msgid "Click to add cover"
msgstr "Egin klik azala gehitzeko"
-#: bookwyrm/templates/book/book.html:106
+#: bookwyrm/templates/book/book.html:108
msgid "Failed to load cover"
msgstr "Ezin izan da azala kargatu"
-#: bookwyrm/templates/book/book.html:117
+#: bookwyrm/templates/book/book.html:119
msgid "Click to enlarge"
msgstr "Egin click handitzeko"
@@ -1046,13 +1076,13 @@ msgstr "Lekuak"
#: bookwyrm/templates/guided_tour/lists.html:14
#: bookwyrm/templates/guided_tour/user_books.html:102
#: bookwyrm/templates/guided_tour/user_profile.html:78
-#: bookwyrm/templates/layout.html:90 bookwyrm/templates/lists/curate.html:8
+#: bookwyrm/templates/layout.html:88 bookwyrm/templates/lists/curate.html:8
#: bookwyrm/templates/lists/list.html:12 bookwyrm/templates/lists/lists.html:5
#: bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:26
#: bookwyrm/templates/search/layout.html:51
#: bookwyrm/templates/settings/celery.html:77
-#: bookwyrm/templates/user/layout.html:91 bookwyrm/templates/user/lists.html:6
+#: bookwyrm/templates/user/layout.html:101 bookwyrm/templates/user/lists.html:6
msgid "Lists"
msgstr "Zerrendak"
@@ -1076,11 +1106,11 @@ msgstr "ISBN:"
#: bookwyrm/templates/book/book_identifiers.html:12
#: bookwyrm/templates/book/book_identifiers.html:13
msgid "Copy ISBN"
-msgstr ""
+msgstr "ISBN-a kopiatu"
#: bookwyrm/templates/book/book_identifiers.html:16
msgid "Copied ISBN!"
-msgstr ""
+msgstr "ISBN-a kopiatu!"
#: bookwyrm/templates/book/book_identifiers.html:23
#: bookwyrm/templates/book/edit/edit_book_form.html:352
@@ -1117,7 +1147,7 @@ msgstr "Kargatu azala:"
#: bookwyrm/templates/book/cover_add_modal.html:23
#: bookwyrm/templates/book/edit/edit_book_form.html:250
-msgid "Load cover from url:"
+msgid "Load cover from URL:"
msgstr "Kargatu azala URLtik:"
#: bookwyrm/templates/book/cover_show_modal.html:6
@@ -1245,7 +1275,7 @@ msgstr "Izenburua:"
#: bookwyrm/templates/book/edit/edit_book_form.html:35
msgid "Sort Title:"
-msgstr ""
+msgstr "Izenburuaren arabera ordenatu:"
#: bookwyrm/templates/book/edit/edit_book_form.html:44
msgid "Subtitle:"
@@ -1328,7 +1358,7 @@ msgid "Add Another Author"
msgstr "Gehitu beste egile bat"
#: bookwyrm/templates/book/edit/edit_book_form.html:231
-#: bookwyrm/templates/shelf/shelf.html:147
+#: bookwyrm/templates/shelf/shelf.html:149
msgid "Cover"
msgstr "Azala"
@@ -1372,8 +1402,8 @@ msgstr "%(book_title)s(r)en edizioak"
#: bookwyrm/templates/book/editions/editions.html:8
#, python-format
-msgid "Editions of \"%(work_title)s\""
-msgstr "\"%(work_title)s\"-ren edizioak"
+msgid "Editions of %(work_title)s"
+msgstr "%(work_title)s lanaren edizioak"
#: bookwyrm/templates/book/editions/editions.html:55
msgid "Can't find the edition you're looking for?"
@@ -1455,8 +1485,9 @@ msgstr "Domeinua"
#: bookwyrm/templates/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
#: bookwyrm/templates/settings/invites/status_filter.html:5
+#: bookwyrm/templates/settings/themes.html:111
#: bookwyrm/templates/settings/users/user_admin.html:56
-#: bookwyrm/templates/settings/users/user_info.html:24
+#: bookwyrm/templates/settings/users/user_info.html:35
msgid "Status"
msgstr "Egoera"
@@ -1465,7 +1496,7 @@ msgstr "Egoera"
#: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/imports/imports.html:141
#: bookwyrm/templates/settings/reports/report_links_table.html:6
-#: bookwyrm/templates/settings/themes.html:99
+#: bookwyrm/templates/settings/themes.html:108
msgid "Actions"
msgstr "Ekintzak"
@@ -1529,22 +1560,22 @@ msgstr "%(pages)s orrialde"
msgid "%(languages)s language"
msgstr "%(languages)s hizkuntza"
-#: bookwyrm/templates/book/publisher_info.html:65
+#: bookwyrm/templates/book/publisher_info.html:63
#, python-format
msgid "Published %(date)s by %(publisher)s."
msgstr "%(date)s(e)an %(publisher)s(e)n argitaratua."
+#: bookwyrm/templates/book/publisher_info.html:65
+#, python-format
+msgid "Published by %(publisher)s."
+msgstr "%(publisher)s(e)k argitaratua."
+
#: bookwyrm/templates/book/publisher_info.html:67
#, python-format
msgid "Published %(date)s"
msgstr "%(date)s(e)an argitaratua"
-#: bookwyrm/templates/book/publisher_info.html:69
-#, python-format
-msgid "Published by %(publisher)s."
-msgstr "%(publisher)s(e)k argitaratua."
-
-#: bookwyrm/templates/book/rating.html:13
+#: bookwyrm/templates/book/rating.html:19
msgid "rated it"
msgstr "baloratu du"
@@ -1552,12 +1583,12 @@ msgstr "baloratu du"
msgid "Series by"
msgstr "Seriearen sortzailea: "
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
#, python-format
msgid "Book %(series_number)s"
msgstr "%(series_number)s. liburua"
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
msgid "Unsorted Book"
msgstr "Sailkatu gabeko liburua"
@@ -1681,6 +1712,7 @@ msgstr "Iradokizunak"
#: bookwyrm/templates/ostatus/subscribe.html:42
#: bookwyrm/templates/ostatus/success.html:17
#: bookwyrm/templates/ostatus/success.html:18
+#: bookwyrm/templates/user/moved.html:19 bookwyrm/templates/user/moved.html:20
#: bookwyrm/templates/user/user_preview.html:16
#: bookwyrm/templates/user/user_preview.html:17
msgid "Locked account"
@@ -1726,7 +1758,7 @@ msgstr "%(username)s(e)k %(username)s finished reading %(book_title)s"
-msgstr "%(username)s(e)k %(book_title)s irakurtzen bukatu du"
+msgstr "%(username)s erabiltzaileak %(book_title)s irakurtzen bukatu du"
#: bookwyrm/templates/discover/card-header.html:18
#, python-format
@@ -1755,7 +1787,7 @@ msgstr "%(username)s(e)k %(username)s"
msgstr "%(username)s-rekin mezu zuzenak"
#: bookwyrm/templates/feed/direct_messages.html:10
-#: bookwyrm/templates/user_menu.html:44
+#: bookwyrm/templates/user_menu.html:39
msgid "Direct Messages"
msgstr "Mezu zuzenak"
@@ -1948,7 +1980,7 @@ msgstr "Eguneratzeak"
#: bookwyrm/templates/feed/suggested_books.html:6
#: bookwyrm/templates/guided_tour/home.html:127
-#: bookwyrm/templates/user_menu.html:39
+#: bookwyrm/templates/layout.html:94
msgid "Your Books"
msgstr "Zure liburuak"
@@ -1996,19 +2028,19 @@ msgid "Add to your books"
msgstr "Gehitu zure liburuetara"
#: bookwyrm/templates/get_started/book_preview.html:10
-#: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37
+#: bookwyrm/templates/shelf/shelf.html:88 bookwyrm/templates/user/user.html:37
#: bookwyrm/templatetags/shelf_tags.py:14
msgid "To Read"
msgstr "Irakurtzeko"
#: bookwyrm/templates/get_started/book_preview.html:11
-#: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38
+#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:38
#: bookwyrm/templatetags/shelf_tags.py:15
msgid "Currently Reading"
msgstr "Orain irakurtzen"
#: bookwyrm/templates/get_started/book_preview.html:12
-#: bookwyrm/templates/shelf/shelf.html:88
+#: bookwyrm/templates/shelf/shelf.html:90
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
@@ -2017,7 +2049,7 @@ msgid "Read"
msgstr "Irakurrita"
#: bookwyrm/templates/get_started/book_preview.html:13
-#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40
+#: bookwyrm/templates/shelf/shelf.html:91 bookwyrm/templates/user/user.html:40
#: bookwyrm/templatetags/shelf_tags.py:17
msgid "Stopped Reading"
msgstr "Irakurtzeari utzita"
@@ -2027,7 +2059,7 @@ msgid "What are you reading?"
msgstr "Zer ari zara irakurtzen?"
#: bookwyrm/templates/get_started/books.html:9
-#: bookwyrm/templates/layout.html:39 bookwyrm/templates/lists/list.html:213
+#: bookwyrm/templates/layout.html:41 bookwyrm/templates/lists/list.html:213
msgid "Search for a book"
msgstr "Bilatu liburu bat"
@@ -2046,8 +2078,8 @@ msgstr "Liburuak gehitu ditzakezu %(site_name)s erabiltzen hasten zarenean."
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:15
-#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:45
-#: bookwyrm/templates/layout.html:46 bookwyrm/templates/lists/list.html:217
+#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:47
+#: bookwyrm/templates/layout.html:48 bookwyrm/templates/lists/list.html:217
#: bookwyrm/templates/search/layout.html:5
#: bookwyrm/templates/search/layout.html:10
#: bookwyrm/templates/search/layout.html:32
@@ -2060,7 +2092,7 @@ msgstr "Gomendatutako liburuak"
#: bookwyrm/templates/get_started/books.html:33
msgid "Search results"
-msgstr ""
+msgstr "Bilaketa-emaitzak"
#: bookwyrm/templates/get_started/books.html:46
#, python-format
@@ -2142,7 +2174,7 @@ msgstr "Zure kontua direktorioan agertuko da eta BookWyrmeko beste erabiltzaile
#: bookwyrm/templates/get_started/users.html:8
msgid "You can follow users on other BookWyrm instances and federated services like Mastodon."
-msgstr ""
+msgstr "Beste BookWyrm-en instantzietako eta Mastodon bezalako federatutako zerbitzuetako erabiltzaileak jarrai ditzakezu."
#: bookwyrm/templates/get_started/users.html:11
msgid "Search for a user"
@@ -2268,7 +2300,7 @@ msgstr "Kudeatzailea"
#: bookwyrm/templates/groups/user_groups.html:35
msgid "No groups found."
-msgstr ""
+msgstr "Ez da talderik aurkitu."
#: bookwyrm/templates/guided_tour/book.html:10
msgid "This is home page of a book. Let's see what you can do while you're here!"
@@ -2514,8 +2546,8 @@ msgid "Barcode reader"
msgstr "Bara-kode irakurgailua"
#: bookwyrm/templates/guided_tour/home.html:102
-msgid "Use the Feed, Lists and Discover links to discover the latest news from your feed, lists of books by topic, and the latest happenings on this Bookwyrm server!"
-msgstr "Erabili Jarioa, Zerrendak eta Deskubritu atalak zure jarioko azken berriak, gaikako liburu zerrendak eta Bookwyrm zerbitzari honetako azken jarduerak ezagutzeko!"
+msgid "Use the Lists, Discover, and Your Books links to discover reading suggestions and the latest happenings on this server, or to see your catalogued books!"
+msgstr ""
#: bookwyrm/templates/guided_tour/home.html:103
msgid "Navigation Bar"
@@ -2538,16 +2570,16 @@ msgid "The bell will light up when you have a new notification. When it does, cl
msgstr "Kanpaia piztu egingo da jakinarazpen berriren bat duzunean. Hala egiten duenean, klikatu ezazu zer gauza zirraragarri gertatu den jakiteko!"
#: bookwyrm/templates/guided_tour/home.html:177
-#: bookwyrm/templates/layout.html:75 bookwyrm/templates/layout.html:106
-#: bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:77 bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:108
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr "Jakinarazpenak"
#: bookwyrm/templates/guided_tour/home.html:200
-msgid "Your profile, books, direct messages, and settings can be accessed by clicking on your name in the menu here."
-msgstr "Zure profila, liburuak, mezu zuzenak eta ezarpenak hemengo menuan zure izenean klik eginda dituzu eskuragarri."
+msgid "Your profile, user directory, direct messages, and settings can be accessed by clicking on your name in the menu here."
+msgstr ""
#: bookwyrm/templates/guided_tour/home.html:200
msgid "Try selecting Profile from the drop down menu to continue the tour."
@@ -2666,7 +2698,7 @@ msgstr "Zure liburuak"
#: bookwyrm/templates/guided_tour/user_books.html:31
msgid "To Read, Currently Reading, Read, and Stopped Reading are default shelves. When you change the reading status of a book it will automatically be moved to the matching shelf. A book can only be on one default shelf at a time."
-msgstr "Irakurtzeko, Irakurtzen, Irakurrita eta Irakurtzeari utzita lehenetsitako apalak dira. Liburu baten irakurketa-egoera aldatzen duzunean automatikoki aldatuko da dagokion apalera. Liburu bat lehentsitako apal bakarrean egon daiteke aldiko."
+msgstr "Irakurtzekoak, Orain irakurtzen, Irakurritakoak eta Irakurtzeari utzita lehenetsitako apalak dira. Liburu baten irakurketa-egoera aldatzen duzunean automatikoki aldatuko da dagokion apalera. Liburu bat lehentsitako apal bakarrean egon daiteke aldiko."
#: bookwyrm/templates/guided_tour/user_books.html:32
msgid "Reading status shelves"
@@ -2702,7 +2734,7 @@ msgstr "Talde berri bat sor dezakezu edo existitzen den batean sar zaitezke. Tal
#: bookwyrm/templates/guided_tour/user_groups.html:11
#: bookwyrm/templates/guided_tour/user_profile.html:55
-#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:85
+#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:95
msgid "Groups"
msgstr "Taldeak"
@@ -2747,7 +2779,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr "Hau zure erabiltzaile profila da. Zure azken jarduerak hemen zerrendatuko dira. Bookwyrm-en beste erabiltzaile batzuek ere ikus ditzakete orrialde honen zatiak - ikus dezaketena pribatutasun ezarpenen araberakoa da."
#: bookwyrm/templates/guided_tour/user_profile.html:11
-#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:14
+#: bookwyrm/templates/user/layout.html:20 bookwyrm/templates/user/user.html:14
msgid "User Profile"
msgstr "Erabiltzailearen profila"
@@ -2756,7 +2788,7 @@ msgid "This tab shows everything you have read towards your annual reading goal,
msgstr "Fitxa honetan erakusten da irakurri duzun guztia urteko irakurketa-helburuari begira, edo irakurketa-helburu bat ezartzeko aukera ematen dizu. Ez duzu irakurketa-helbururik ezarri behar hori ez bada zure asmoetan!"
#: bookwyrm/templates/guided_tour/user_profile.html:32
-#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:79
+#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:89
msgid "Reading Goal"
msgstr "Irakurketa-helburua"
@@ -2795,7 +2827,7 @@ msgstr "Ez dago aktibitaterik oraindik traola honentzat!"
#: bookwyrm/templates/import/import.html:5
#: bookwyrm/templates/import/import.html:9
-#: bookwyrm/templates/shelf/shelf.html:64
+#: bookwyrm/templates/shelf/shelf.html:66
msgid "Import Books"
msgstr "Inportatu liburuak"
@@ -2805,19 +2837,15 @@ msgstr "CSV fitxategia ez da baliozkoa"
#: bookwyrm/templates/import/import.html:21
#, python-format
-msgid "\n"
-" Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day.\n"
-" "
-msgid_plural "\n"
-" Currently, you are allowed to import %(import_size_limit)s books every %(import_limit_reset)s days.\n"
-" "
-msgstr[0] ""
-msgstr[1] ""
+msgid "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day."
+msgid_plural "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s days."
+msgstr[0] "Une honetan, %(display_size)s liburu inporta ditzakezu %(import_limit_reset)s egun bakoitzeko."
+msgstr[1] "Une honetan, %(display_size)s liburu inporta ditzakezu %(import_limit_reset)s egunero."
#: bookwyrm/templates/import/import.html:27
#, python-format
msgid "You have %(display_left)s left."
-msgstr ""
+msgstr "%(display_left)s geratzen zaizkizu."
#: bookwyrm/templates/import/import.html:34
#, python-format
@@ -2871,7 +2899,7 @@ msgstr "Inportatutako berrikuspenen pribatutasun ezarpena:"
#: bookwyrm/templates/import/import.html:106
#: bookwyrm/templates/import/import.html:108
-#: bookwyrm/templates/preferences/layout.html:35
+#: bookwyrm/templates/preferences/layout.html:43
#: bookwyrm/templates/settings/federation/instance_blocklist.html:78
msgid "Import"
msgstr "Inportatu"
@@ -2970,8 +2998,8 @@ msgid "Row"
msgstr "Errenkada"
#: bookwyrm/templates/import/import_status.html:110
-#: bookwyrm/templates/shelf/shelf.html:148
-#: bookwyrm/templates/shelf/shelf.html:170
+#: bookwyrm/templates/shelf/shelf.html:150
+#: bookwyrm/templates/shelf/shelf.html:172
msgid "Title"
msgstr "Izenburua"
@@ -2984,8 +3012,8 @@ msgid "Openlibrary key"
msgstr "Openlibrary-ren giltza"
#: bookwyrm/templates/import/import_status.html:121
-#: bookwyrm/templates/shelf/shelf.html:149
-#: bookwyrm/templates/shelf/shelf.html:173
+#: bookwyrm/templates/shelf/shelf.html:151
+#: bookwyrm/templates/shelf/shelf.html:175
msgid "Author"
msgstr "Egilea"
@@ -3091,10 +3119,6 @@ msgstr "Jar zaitez harremanetan zure administratzailearekin edo %(user)s opened this report"
-msgstr ""
+msgstr "%(user)s erabiltzaileak txosten hau ireki du"
#: bookwyrm/templates/settings/reports/report.html:86
#, python-format
msgid "%(user)s commented on this report:"
-msgstr ""
+msgstr "%(user)s erabiltzaileak txosten honetan iruzkindu du:"
#: bookwyrm/templates/settings/reports/report.html:90
#, python-format
msgid "%(user)s took an action on this report:"
-msgstr ""
+msgstr "%(user)s erabiltzaileak neurriak hartu ditu txosten honetan:"
#: bookwyrm/templates/settings/reports/report_header.html:6
#, python-format
@@ -5462,7 +5592,7 @@ msgstr "#%(report_id)s salaketa: @%(username)s erabiltzailea"
#: bookwyrm/templates/settings/reports/report_links_table.html:19
msgid "Approve domain"
-msgstr ""
+msgstr "Onartu domeinua"
#: bookwyrm/templates/settings/reports/report_links_table.html:26
msgid "Block domain"
@@ -5590,57 +5720,73 @@ msgid "Set instance default theme"
msgstr "Ezarri instantziaren lehenetsitako azala"
#: bookwyrm/templates/settings/themes.html:19
+msgid "One of your themes appears to be broken. Selecting this theme will make the application unusable."
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:28
msgid "Successfully added theme"
msgstr "Azala behar bezala gehitu da"
-#: bookwyrm/templates/settings/themes.html:26
+#: bookwyrm/templates/settings/themes.html:35
msgid "How to add a theme"
msgstr "Azal bat nola gehitu"
-#: bookwyrm/templates/settings/themes.html:29
+#: bookwyrm/templates/settings/themes.html:38
msgid "Copy the theme file into the bookwyrm/static/css/themes
directory on your server from the command line."
msgstr "Kopiatu azalaren fitxategia zure zerbitzarik bookwyrm/static/css/themes
direktoriora komando-lerrotik."
-#: bookwyrm/templates/settings/themes.html:32
+#: bookwyrm/templates/settings/themes.html:41
msgid "Run ./bw-dev compile_themes
and ./bw-dev collectstatic
."
msgstr "Exekutatu ./bw-dev compile_themes
eta ./bw-dev collectstatic
."
-#: bookwyrm/templates/settings/themes.html:35
+#: bookwyrm/templates/settings/themes.html:44
msgid "Add the file name using the form below to make it available in the application interface."
msgstr "Gehitu fitxategiaren izena honako inprimakiaren bitartez aplikazioaren interfazean erabilgarri egon dadin."
-#: bookwyrm/templates/settings/themes.html:42
-#: bookwyrm/templates/settings/themes.html:82
+#: bookwyrm/templates/settings/themes.html:51
+#: bookwyrm/templates/settings/themes.html:91
msgid "Add theme"
msgstr "Gehitu azala"
-#: bookwyrm/templates/settings/themes.html:48
+#: bookwyrm/templates/settings/themes.html:57
msgid "Unable to save theme"
msgstr "Ezin izan da azala gorde"
-#: bookwyrm/templates/settings/themes.html:63
-#: bookwyrm/templates/settings/themes.html:93
+#: bookwyrm/templates/settings/themes.html:72
+#: bookwyrm/templates/settings/themes.html:102
msgid "Theme name"
msgstr "Azalaren izena"
-#: bookwyrm/templates/settings/themes.html:73
+#: bookwyrm/templates/settings/themes.html:82
msgid "Theme filename"
msgstr "Azalaren fitxategi-izena"
-#: bookwyrm/templates/settings/themes.html:88
+#: bookwyrm/templates/settings/themes.html:97
msgid "Available Themes"
msgstr "Azal erabilgarriak"
-#: bookwyrm/templates/settings/themes.html:96
+#: bookwyrm/templates/settings/themes.html:105
msgid "File"
msgstr "Fitxategia"
-#: bookwyrm/templates/settings/themes.html:111
+#: bookwyrm/templates/settings/themes.html:123
msgid "Remove theme"
msgstr "Ezabatu azala"
+#: bookwyrm/templates/settings/themes.html:134
+msgid "Test theme"
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:143
+msgid "Broken theme"
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:152
+msgid "Loaded successfully"
+msgstr ""
+
#: bookwyrm/templates/settings/users/delete_user_form.html:5
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:38
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:52
msgid "Permanently delete user"
msgstr "Behin-betirako ezabatu erabiltzailea"
@@ -5679,25 +5825,20 @@ msgstr "Azken jarduera"
msgid "Remote instance"
msgstr "Urruneko instantzia"
-#: bookwyrm/templates/settings/users/user_admin.html:86
-msgid "Deleted"
-msgstr "Ezabatuta"
-
-#: bookwyrm/templates/settings/users/user_admin.html:92
-#: bookwyrm/templates/settings/users/user_info.html:32
-msgid "Inactive"
-msgstr "Inaktiboa"
-
-#: bookwyrm/templates/settings/users/user_admin.html:101
+#: bookwyrm/templates/settings/users/user_admin.html:84
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr "Ezarri gabe"
-#: bookwyrm/templates/settings/users/user_info.html:16
+#: bookwyrm/templates/settings/users/user_info.html:20
+msgid "This account is the instance actor for signing HTTP requests."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_info.html:24
msgid "View user profile"
msgstr "Ikusi erablitzailearen profila"
-#: bookwyrm/templates/settings/users/user_info.html:19
+#: bookwyrm/templates/settings/users/user_info.html:30
msgid "Go to user admin"
msgstr "Joan erabiltzaileen administraziora"
@@ -5753,27 +5894,39 @@ msgstr "Instantziaren xehetasunak"
msgid "View instance"
msgstr "Ikusi instantzia"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:5
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:6
msgid "Permanently deleted"
msgstr "Behin-betirako ezabatuta"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:8
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:9
msgid "User Actions"
msgstr "Erabiltzailearen ekintzak"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:21
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:15
+msgid "This is the instance admin actor"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:18
+msgid "You must not delete or disable this account as it is critical to the functioning of your server. This actor signs outgoing GET requests to smooth interaction with secure ActivityPub servers."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:19
+msgid "This account is not discoverable by ordinary users and does not have a profile page."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:35
msgid "Activate user"
msgstr "Aktibatu erabiltzailea"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:27
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:41
msgid "Suspend user"
msgstr "Bertan behera utzi erabiltzailea"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:32
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:46
msgid "Un-suspend user"
msgstr "Desegin erabiltzailea bertan behera uztea"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:54
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:68
msgid "Access level:"
msgstr "Sarbide-maila:"
@@ -5829,7 +5982,7 @@ msgstr "Zure domeinua gaizki ezarria dagoela dirudi. Ez luke protokoloa edo barr
msgid "You are running BookWyrm in production mode without https. USE_HTTPS should be enabled in production."
msgstr "https gabe exekutatzen ari zara BookWyrm produkzio moduan. USE_HTTPS gaituta egon beharko litzateke produkzio testuinguruetan."
-#: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:49
+#: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:44
msgid "Settings"
msgstr "Ezarpenak"
@@ -5886,7 +6039,7 @@ msgid "Need help?"
msgstr "Laguntzarik behar?"
#: bookwyrm/templates/shelf/create_shelf_form.html:5
-#: bookwyrm/templates/shelf/shelf.html:72
+#: bookwyrm/templates/shelf/shelf.html:74
msgid "Create shelf"
msgstr "Sortu apala"
@@ -5894,58 +6047,58 @@ msgstr "Sortu apala"
msgid "Edit Shelf"
msgstr "Editatu apala"
-#: bookwyrm/templates/shelf/shelf.html:24
+#: bookwyrm/templates/shelf/shelf.html:26
#: bookwyrm/templates/user/relationships/followers.html:18
#: bookwyrm/templates/user/relationships/following.html:18
msgid "User profile"
msgstr "Erabiltzailearen profila"
-#: bookwyrm/templates/shelf/shelf.html:39
+#: bookwyrm/templates/shelf/shelf.html:41
#: bookwyrm/templatetags/shelf_tags.py:13 bookwyrm/views/shelf/shelf.py:53
msgid "All books"
msgstr "Liburu guztiak"
-#: bookwyrm/templates/shelf/shelf.html:97
+#: bookwyrm/templates/shelf/shelf.html:99
#, python-format
msgid "%(formatted_count)s book"
msgid_plural "%(formatted_count)s books"
msgstr[0] "liburu %(formatted_count)s"
msgstr[1] "%(formatted_count)s liburu"
-#: bookwyrm/templates/shelf/shelf.html:104
+#: bookwyrm/templates/shelf/shelf.html:106
#, python-format
msgid "(showing %(start)s-%(end)s)"
msgstr "(%(start)s-%(end)s tartea bistaratzen)"
-#: bookwyrm/templates/shelf/shelf.html:116
+#: bookwyrm/templates/shelf/shelf.html:118
msgid "Edit shelf"
msgstr "Editatu apala"
-#: bookwyrm/templates/shelf/shelf.html:124
+#: bookwyrm/templates/shelf/shelf.html:126
msgid "Delete shelf"
msgstr "Ezabatu apala"
-#: bookwyrm/templates/shelf/shelf.html:152
-#: bookwyrm/templates/shelf/shelf.html:178
+#: bookwyrm/templates/shelf/shelf.html:154
+#: bookwyrm/templates/shelf/shelf.html:180
msgid "Shelved"
msgstr "Apalean jarrita"
-#: bookwyrm/templates/shelf/shelf.html:153
-#: bookwyrm/templates/shelf/shelf.html:181
+#: bookwyrm/templates/shelf/shelf.html:155
+#: bookwyrm/templates/shelf/shelf.html:183
msgid "Started"
msgstr "Noiz hasia"
-#: bookwyrm/templates/shelf/shelf.html:154
-#: bookwyrm/templates/shelf/shelf.html:184
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
msgid "Finished"
msgstr "Amaituta"
-#: bookwyrm/templates/shelf/shelf.html:154
-#: bookwyrm/templates/shelf/shelf.html:184
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
msgid "Until"
msgstr "Noiz arte"
-#: bookwyrm/templates/shelf/shelf.html:210
+#: bookwyrm/templates/shelf/shelf.html:212
msgid "This shelf is empty."
msgstr "Apal hau hutsik dago."
@@ -6052,7 +6205,7 @@ msgstr "Iruzkina:"
#: bookwyrm/templates/snippets/create_status/post_options_block.html:19
msgid "Update"
-msgstr ""
+msgstr "Eguneratu"
#: bookwyrm/templates/snippets/create_status/post_options_block.html:21
msgid "Post"
@@ -6081,7 +6234,7 @@ msgstr "Ehunekotan:"
#: bookwyrm/templates/snippets/create_status/quotation.html:69
msgid "to"
-msgstr ""
+msgstr "hona:"
#: bookwyrm/templates/snippets/create_status/review.html:24
#, python-format
@@ -6251,6 +6404,15 @@ msgstr "%(goal_count)s liburutik %(read_count)s irakurr
msgid "%(username)s has read %(read_count)s of %(goal_count)s books."
msgstr "%(username)s(e)k %(goal_count)s liburutik %(read_count)s irakurri ditu."
+#: bookwyrm/templates/snippets/move_user_buttons.html:10
+msgid "Follow at new account"
+msgstr "Jarraitu kontu berrian"
+
+#: bookwyrm/templates/snippets/moved_user_notice.html:7
+#, python-format
+msgid "%(user)s has moved to %(moved_to_name)s"
+msgstr ""
+
#: bookwyrm/templates/snippets/page_text.html:8
#, python-format
msgid "page %(page)s of %(total_pages)s"
@@ -6331,7 +6493,7 @@ msgstr "Izena eman"
#: bookwyrm/templates/snippets/report_modal.html:8
#, python-format
msgid "Report @%(username)s's status"
-msgstr "Salatu @%(username)s(r)en egoera"
+msgstr "Salatu @%(username)s erabiltzailearen egoera"
#: bookwyrm/templates/snippets/report_modal.html:10
#, python-format
@@ -6392,35 +6554,35 @@ msgstr "Utzi irakurtzeari"
msgid "Finish reading"
msgstr "Bukatu irakurtzen"
-#: bookwyrm/templates/snippets/status/content_status.html:80
+#: bookwyrm/templates/snippets/status/content_status.html:69
msgid "Show status"
msgstr "Erakutsi egoera"
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "(Page %(page)s"
-msgstr ""
+msgstr "(%(page)s. orria"
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "%(endpage)s"
msgstr "%(endpage)s"
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid "(%(percent)s%%"
msgstr "(%%%(percent)s"
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid " - %(endpercent)s%%"
msgstr " - %%%(endpercent)s"
-#: bookwyrm/templates/snippets/status/content_status.html:127
+#: bookwyrm/templates/snippets/status/content_status.html:116
msgid "Open image in new window"
msgstr "Ireki irudia leiho berrian"
-#: bookwyrm/templates/snippets/status/content_status.html:148
+#: bookwyrm/templates/snippets/status/content_status.html:137
msgid "Hide status"
msgstr "Ezkutatu egoera"
@@ -6442,7 +6604,7 @@ msgstr "(e)k %(book)s(r)i buruzko iruzkina egin du
#: bookwyrm/templates/snippets/status/headers/note.html:8
#, python-format
msgid "replied to %(username)s's status"
-msgstr "%(username)s(r)en egoerari erantzun dio"
+msgstr "%(username)s erabiltzailearen egoerari erantzun diot"
#: bookwyrm/templates/snippets/status/headers/quotation.html:8
#, python-format
@@ -6457,17 +6619,17 @@ msgstr "%(book)s aipatu du"
#: bookwyrm/templates/snippets/status/headers/rating.html:3
#, python-format
msgid "rated %(book)s:"
-msgstr "%(book)s puntuatu du:"
+msgstr "(e)k %(book)s puntuatu du:"
#: bookwyrm/templates/snippets/status/headers/read.html:10
#, python-format
msgid "finished reading %(book)s by %(author_name)s"
-msgstr "(e)k %(author_name)s(r)en %(book)s irakurtzen bukatu du"
+msgstr "%(author_name)s egilearen %(book)s irakurtzen amaitu dut"
#: bookwyrm/templates/snippets/status/headers/read.html:17
#, python-format
msgid "finished reading %(book)s"
-msgstr "(e)k %(book)s irakurtzen bukatu du"
+msgstr "%(book)s irakurtzen amaitu dut"
#: bookwyrm/templates/snippets/status/headers/reading.html:10
#, python-format
@@ -6482,7 +6644,7 @@ msgstr ", %(book)s irakurtzen hasi da"
#: bookwyrm/templates/snippets/status/headers/review.html:8
#, python-format
msgid "reviewed %(book)s by %(author_name)s"
-msgstr "(e)k %(author_name)s(r)en %(book)s kritika egin du"
+msgstr "(e)k %(author_name)s(r)en %(book)s liburuaren kritika egin du"
#: bookwyrm/templates/snippets/status/headers/review.html:15
#, python-format
@@ -6492,12 +6654,12 @@ msgstr "(e)k %(book)s(r)en kritika egin du"
#: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10
#, python-format
msgid "stopped reading %(book)s by %(author_name)s"
-msgstr "%(author_name)s(r)en %(book)s irakurtzeari utzi dio"
+msgstr "%(author_name)s egilearen %(book)s irakurtzeari utzi diot"
#: bookwyrm/templates/snippets/status/headers/stopped_reading.html:17
#, python-format
msgid "stopped reading %(book)s"
-msgstr "%(book)s irakurtzeari utzi dio"
+msgstr "%(book)s irakurtzeari utzi diot"
#: bookwyrm/templates/snippets/status/headers/to_read.html:10
#, python-format
@@ -6553,6 +6715,18 @@ msgstr "Erakutsi gehiago"
msgid "Show less"
msgstr "Erakutsi gutxiago"
+#: bookwyrm/templates/snippets/user_active_tag.html:5
+msgid "Moved"
+msgstr "Mugituta"
+
+#: bookwyrm/templates/snippets/user_active_tag.html:12
+msgid "Deleted"
+msgstr "Ezabatuta"
+
+#: bookwyrm/templates/snippets/user_active_tag.html:15
+msgid "Inactive"
+msgstr "Inaktiboa"
+
#: bookwyrm/templates/two_factor_auth/two_factor_login.html:29
msgid "2FA check"
msgstr "2FA egiaztatzea"
@@ -6581,7 +6755,7 @@ msgstr "%(username)s(r)en liburuak"
#: bookwyrm/templates/user/goal.html:12
#, python-format
msgid "%(year)s Reading Progress"
-msgstr "%(year)s(e)ko irakurketa-aurerapena"
+msgstr "%(year)s urteko irakurketa-aurrerapena"
#: bookwyrm/templates/user/goal.html:16
msgid "Edit Goal"
@@ -6590,7 +6764,7 @@ msgstr "Editatu helburua"
#: bookwyrm/templates/user/goal.html:32
#, python-format
msgid "%(name)s hasn't set a reading goal for %(year)s."
-msgstr "%(name)s(e)k ez du irakurketa-helburu bat ezarri %(year)s(e)rako."
+msgstr "%(name)s erabiltzaileak ez du irakurketa-helburu bat ezarri %(year)s urtera begira."
#: bookwyrm/templates/user/goal.html:44
#, python-format
@@ -6611,11 +6785,11 @@ msgstr "Zure taldeak"
msgid "Groups: %(username)s"
msgstr "Taldeak: %(username)s"
-#: bookwyrm/templates/user/layout.html:50
+#: bookwyrm/templates/user/layout.html:59
msgid "Follow Requests"
msgstr "Jarraitzeko eskaerak"
-#: bookwyrm/templates/user/layout.html:73
+#: bookwyrm/templates/user/layout.html:83
#: bookwyrm/templates/user/reviews_comments.html:6
#: bookwyrm/templates/user/reviews_comments.html:12
msgid "Reviews and Comments"
@@ -6630,7 +6804,13 @@ msgstr "Zerrendak: %(username)s"
msgid "Create list"
msgstr "Sortu zerrenda"
-#: bookwyrm/templates/user/relationships/followers.html:31
+#: bookwyrm/templates/user/moved.html:25
+#: bookwyrm/templates/user/user_preview.html:22
+#, python-format
+msgid "Joined %(date)s"
+msgstr "%(date)s(e)an batu zen"
+
+#: bookwyrm/templates/user/relationships/followers.html:36
#, python-format
msgid "%(username)s has no followers"
msgstr "%(username)s erabiltzaileak ez du jarraitzailerik"
@@ -6667,7 +6847,7 @@ msgstr "Ikusi liburu guztiak"
#: bookwyrm/templates/user/user.html:69
#, python-format
msgid "%(current_year)s Reading Goal"
-msgstr "%(current_year)s Irakurketa xedea"
+msgstr "%(current_year)s urteko irakurketa-helburua"
#: bookwyrm/templates/user/user.html:76
msgid "User Activity"
@@ -6701,17 +6881,12 @@ msgstr "Iruzkinak bakarrik"
msgid "No activities yet!"
msgstr "Ez dago aktibitaterik oraindik!"
-#: bookwyrm/templates/user/user_preview.html:22
-#, python-format
-msgid "Joined %(date)s"
-msgstr "%(date)s(e)an batu zen"
-
#: bookwyrm/templates/user/user_preview.html:26
#, python-format
msgid "%(display_count)s follower"
msgid_plural "%(display_count)s followers"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "jarraitzaile %(display_count)s"
+msgstr[1] "%(display_count)s jarraitzaile"
#: bookwyrm/templates/user/user_preview.html:31
#, python-format
@@ -6733,10 +6908,6 @@ msgstr "Ez dago jarraitzen duzun jarraitzailerik"
msgid "View profile and more"
msgstr "Ikusi profila eta gehiago"
-#: bookwyrm/templates/user_menu.html:82
-msgid "Log out"
-msgstr "Amaitu saioa"
-
#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:28
msgid "File exceeds maximum size: 10MB"
msgstr "Fitxategiak gehienezko tamaina gainditzen du: 10 Mb"
@@ -6753,7 +6924,7 @@ msgid_plural "%(num)d books - by %(user)s"
msgstr[0] "liburu %(num)d - %(user)s"
msgstr[1] "%(num)d liburu - %(user)s"
-#: bookwyrm/templatetags/utilities.py:39
+#: bookwyrm/templatetags/utilities.py:49
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"
@@ -6761,7 +6932,7 @@ msgstr "%(title)s: %(subtitle)s"
#: bookwyrm/views/rss_feed.py:35
#, python-brace-format
msgid "Status updates from {obj.display_name}"
-msgstr "{obj.display_name}-ren egoera eguneratzeak"
+msgstr "{obj.display_name} erabiltzailearen egoera-eguneratzeak"
#: bookwyrm/views/rss_feed.py:80
#, python-brace-format
diff --git a/locale/fi_FI/LC_MESSAGES/django.mo b/locale/fi_FI/LC_MESSAGES/django.mo
index beacc8844..f0c7a156c 100644
Binary files a/locale/fi_FI/LC_MESSAGES/django.mo and b/locale/fi_FI/LC_MESSAGES/django.mo differ
diff --git a/locale/fi_FI/LC_MESSAGES/django.po b/locale/fi_FI/LC_MESSAGES/django.po
index b25e5c8e0..df42e2b4c 100644
--- a/locale/fi_FI/LC_MESSAGES/django.po
+++ b/locale/fi_FI/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-27 01:11+0000\n"
-"PO-Revision-Date: 2023-09-29 23:37\n"
+"POT-Creation-Date: 2023-12-30 23:52+0000\n"
+"PO-Revision-Date: 2024-01-02 03:12\n"
"Last-Translator: Mouse Reeve %(level)s
."
+msgstr ""
+
+#: bookwyrm/templates/403.html:15
+msgid "If you think you should have access, please speak to your BookWyrm server administrator."
+msgstr ""
+
#: bookwyrm/templates/404.html:4 bookwyrm/templates/404.html:8
msgid "Not Found"
msgstr "Ei löydy"
@@ -476,6 +496,20 @@ msgstr "Ei löydy"
msgid "The page you requested doesn't seem to exist!"
msgstr "Pyytämääsi sivua ei ole olemassa."
+#: bookwyrm/templates/413.html:4 bookwyrm/templates/413.html:8
+msgid "File too large"
+msgstr ""
+
+#: bookwyrm/templates/413.html:9
+msgid "The file you are uploading is too large."
+msgstr ""
+
+#: bookwyrm/templates/413.html:11
+msgid "\n"
+" You you can try using a smaller file, or ask your BookWyrm server administrator to increase the DATA_UPLOAD_MAX_MEMORY_SIZE
setting.\n"
+" "
+msgstr ""
+
#: bookwyrm/templates/500.html:4
msgid "Oops!"
msgstr "Hupsista!"
@@ -536,12 +570,12 @@ msgstr "%(site_name)s pyörii moderaattorien ja ylläpitäjien työllä. He myö
msgid "Moderator"
msgstr "Moderaattori"
-#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:67
+#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:62
msgid "Admin"
msgstr "Ylläpitäjä"
#: bookwyrm/templates/about/about.html:140
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:28
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
msgid "Send direct message"
@@ -575,7 +609,7 @@ msgid "Software version:"
msgstr "Ohjelmistoversio:"
#: bookwyrm/templates/about/layout.html:30
-#: bookwyrm/templates/embed-layout.html:33
+#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/snippets/footer.html:8
#, python-format
msgid "About %(site_name)s"
@@ -680,7 +714,7 @@ msgstr "Vuoden lyhyin kirja…"
#: bookwyrm/templates/annual_summary/layout.html:157
#: bookwyrm/templates/annual_summary/layout.html:178
#: bookwyrm/templates/annual_summary/layout.html:247
-#: bookwyrm/templates/book/book.html:63
+#: bookwyrm/templates/book/book.html:65
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
@@ -768,24 +802,24 @@ msgid "View ISNI record"
msgstr "Näytä ISNI-tietue"
#: bookwyrm/templates/author/author.html:95
-#: bookwyrm/templates/book/book.html:173
+#: bookwyrm/templates/book/book.html:175
msgid "View on ISFDB"
msgstr "Näytä ISFDB:ssä"
#: bookwyrm/templates/author/author.html:100
#: bookwyrm/templates/author/sync_modal.html:5
-#: bookwyrm/templates/book/book.html:140
+#: bookwyrm/templates/book/book.html:142
#: bookwyrm/templates/book/sync_modal.html:5
msgid "Load data"
msgstr "Lataa tiedot"
#: bookwyrm/templates/author/author.html:104
-#: bookwyrm/templates/book/book.html:144
+#: bookwyrm/templates/book/book.html:146
msgid "View on OpenLibrary"
msgstr "Näytä OpenLibraryssa"
#: bookwyrm/templates/author/author.html:119
-#: bookwyrm/templates/book/book.html:158
+#: bookwyrm/templates/book/book.html:160
msgid "View on Inventaire"
msgstr "Näytä Inventairessa"
@@ -797,11 +831,7 @@ msgstr "Näytä LibraryThingissä"
msgid "View on Goodreads"
msgstr "Näytä Goodreadsissa"
-#: bookwyrm/templates/author/author.html:151
-msgid "View ISFDB entry"
-msgstr "Näytä ISFDB-tietue"
-
-#: bookwyrm/templates/author/author.html:166
+#: bookwyrm/templates/author/author.html:158
#, python-format
msgid "Books by %(name)s"
msgstr "Tekijän %(name)s kirjat"
@@ -910,7 +940,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:89
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save"
@@ -959,19 +989,19 @@ msgstr "Vahvista"
msgid "Unable to connect to remote source."
msgstr "Lähteeseen ei saada yhteyttä."
-#: bookwyrm/templates/book/book.html:71 bookwyrm/templates/book/book.html:72
+#: bookwyrm/templates/book/book.html:73 bookwyrm/templates/book/book.html:74
msgid "Edit Book"
msgstr "Muokkaa kirjaa"
-#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:100
+#: bookwyrm/templates/book/book.html:99 bookwyrm/templates/book/book.html:102
msgid "Click to add cover"
msgstr "Lisää kansikuva"
-#: bookwyrm/templates/book/book.html:106
+#: bookwyrm/templates/book/book.html:108
msgid "Failed to load cover"
msgstr "Kansikuvan lataus epäonnistui"
-#: bookwyrm/templates/book/book.html:117
+#: bookwyrm/templates/book/book.html:119
msgid "Click to enlarge"
msgstr "Suurenna"
@@ -1046,13 +1076,13 @@ msgstr "Paikat"
#: bookwyrm/templates/guided_tour/lists.html:14
#: bookwyrm/templates/guided_tour/user_books.html:102
#: bookwyrm/templates/guided_tour/user_profile.html:78
-#: bookwyrm/templates/layout.html:90 bookwyrm/templates/lists/curate.html:8
+#: bookwyrm/templates/layout.html:88 bookwyrm/templates/lists/curate.html:8
#: bookwyrm/templates/lists/list.html:12 bookwyrm/templates/lists/lists.html:5
#: bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:26
#: bookwyrm/templates/search/layout.html:51
#: bookwyrm/templates/settings/celery.html:77
-#: bookwyrm/templates/user/layout.html:91 bookwyrm/templates/user/lists.html:6
+#: bookwyrm/templates/user/layout.html:101 bookwyrm/templates/user/lists.html:6
msgid "Lists"
msgstr "Listat"
@@ -1117,8 +1147,8 @@ msgstr "Lataa kansikuva:"
#: bookwyrm/templates/book/cover_add_modal.html:23
#: bookwyrm/templates/book/edit/edit_book_form.html:250
-msgid "Load cover from url:"
-msgstr "Lataa kansikuva osoitteesta:"
+msgid "Load cover from URL:"
+msgstr "Ladattavan kansikuvan URL:"
#: bookwyrm/templates/book/cover_show_modal.html:6
msgid "Book cover preview"
@@ -1328,7 +1358,7 @@ msgid "Add Another Author"
msgstr "Yksi tekijä lisää"
#: bookwyrm/templates/book/edit/edit_book_form.html:231
-#: bookwyrm/templates/shelf/shelf.html:147
+#: bookwyrm/templates/shelf/shelf.html:149
msgid "Cover"
msgstr "Kansikuva"
@@ -1372,8 +1402,8 @@ msgstr "Kirjan %(book_title)s laitokset"
#: bookwyrm/templates/book/editions/editions.html:8
#, python-format
-msgid "Editions of \"%(work_title)s\""
-msgstr "Kirjan \"%(work_title)s\" laitokset"
+msgid "Editions of %(work_title)s"
+msgstr ""
#: bookwyrm/templates/book/editions/editions.html:55
msgid "Can't find the edition you're looking for?"
@@ -1455,8 +1485,9 @@ msgstr "Verkkotunnus"
#: bookwyrm/templates/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
#: bookwyrm/templates/settings/invites/status_filter.html:5
+#: bookwyrm/templates/settings/themes.html:111
#: bookwyrm/templates/settings/users/user_admin.html:56
-#: bookwyrm/templates/settings/users/user_info.html:24
+#: bookwyrm/templates/settings/users/user_info.html:35
msgid "Status"
msgstr "Tila"
@@ -1465,7 +1496,7 @@ msgstr "Tila"
#: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/imports/imports.html:141
#: bookwyrm/templates/settings/reports/report_links_table.html:6
-#: bookwyrm/templates/settings/themes.html:99
+#: bookwyrm/templates/settings/themes.html:108
msgid "Actions"
msgstr "Toiminnot"
@@ -1529,22 +1560,22 @@ msgstr "%(pages)s sivua"
msgid "%(languages)s language"
msgstr "Kieli: %(languages)s"
-#: bookwyrm/templates/book/publisher_info.html:65
+#: bookwyrm/templates/book/publisher_info.html:63
#, python-format
msgid "Published %(date)s by %(publisher)s."
msgstr "Julkaisu: %(publisher)s, %(date)s."
+#: bookwyrm/templates/book/publisher_info.html:65
+#, python-format
+msgid "Published by %(publisher)s."
+msgstr "Kustantaja: %(publisher)s."
+
#: bookwyrm/templates/book/publisher_info.html:67
#, python-format
msgid "Published %(date)s"
msgstr "Julkaistu: %(date)s"
-#: bookwyrm/templates/book/publisher_info.html:69
-#, python-format
-msgid "Published by %(publisher)s."
-msgstr "Kustantaja: %(publisher)s."
-
-#: bookwyrm/templates/book/rating.html:13
+#: bookwyrm/templates/book/rating.html:19
msgid "rated it"
msgstr "antoi arvosanan"
@@ -1552,12 +1583,12 @@ msgstr "antoi arvosanan"
msgid "Series by"
msgstr "Sarja."
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
#, python-format
msgid "Book %(series_number)s"
msgstr "Osa %(series_number)s"
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
msgid "Unsorted Book"
msgstr "Lajittelematon kirja"
@@ -1681,6 +1712,7 @@ msgstr "Ehdotetut ensin"
#: bookwyrm/templates/ostatus/subscribe.html:42
#: bookwyrm/templates/ostatus/success.html:17
#: bookwyrm/templates/ostatus/success.html:18
+#: bookwyrm/templates/user/moved.html:19 bookwyrm/templates/user/moved.html:20
#: bookwyrm/templates/user/user_preview.html:16
#: bookwyrm/templates/user/user_preview.html:17
msgid "Locked account"
@@ -1755,7 +1787,7 @@ msgstr "%(username)s lainasi teosta %(username)s"
msgstr "Yksityisviestit käyttäjän %(username)s kanssa"
#: bookwyrm/templates/feed/direct_messages.html:10
-#: bookwyrm/templates/user_menu.html:44
+#: bookwyrm/templates/user_menu.html:39
msgid "Direct Messages"
msgstr "Yksityisviestit"
@@ -1948,7 +1980,7 @@ msgstr "Päivitykset"
#: bookwyrm/templates/feed/suggested_books.html:6
#: bookwyrm/templates/guided_tour/home.html:127
-#: bookwyrm/templates/user_menu.html:39
+#: bookwyrm/templates/layout.html:94
msgid "Your Books"
msgstr "Omat kirjat"
@@ -1996,19 +2028,19 @@ msgid "Add to your books"
msgstr "Lisää omiin kirjoihin"
#: bookwyrm/templates/get_started/book_preview.html:10
-#: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37
+#: bookwyrm/templates/shelf/shelf.html:88 bookwyrm/templates/user/user.html:37
#: bookwyrm/templatetags/shelf_tags.py:14
msgid "To Read"
msgstr "Lukujono"
#: bookwyrm/templates/get_started/book_preview.html:11
-#: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38
+#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:38
#: bookwyrm/templatetags/shelf_tags.py:15
msgid "Currently Reading"
msgstr "Luettavana"
#: bookwyrm/templates/get_started/book_preview.html:12
-#: bookwyrm/templates/shelf/shelf.html:88
+#: bookwyrm/templates/shelf/shelf.html:90
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
@@ -2017,7 +2049,7 @@ msgid "Read"
msgstr "Luettu"
#: bookwyrm/templates/get_started/book_preview.html:13
-#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40
+#: bookwyrm/templates/shelf/shelf.html:91 bookwyrm/templates/user/user.html:40
#: bookwyrm/templatetags/shelf_tags.py:17
msgid "Stopped Reading"
msgstr "Jäi kesken"
@@ -2027,7 +2059,7 @@ msgid "What are you reading?"
msgstr "Mitä luet?"
#: bookwyrm/templates/get_started/books.html:9
-#: bookwyrm/templates/layout.html:39 bookwyrm/templates/lists/list.html:213
+#: bookwyrm/templates/layout.html:41 bookwyrm/templates/lists/list.html:213
msgid "Search for a book"
msgstr "Hae kirjaa"
@@ -2046,8 +2078,8 @@ msgstr "Voit lisätä kirjoja, kun olet liittynyt %(site_name)s-yhteisöön."
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:15
-#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:45
-#: bookwyrm/templates/layout.html:46 bookwyrm/templates/lists/list.html:217
+#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:47
+#: bookwyrm/templates/layout.html:48 bookwyrm/templates/lists/list.html:217
#: bookwyrm/templates/search/layout.html:5
#: bookwyrm/templates/search/layout.html:10
#: bookwyrm/templates/search/layout.html:32
@@ -2514,8 +2546,8 @@ msgid "Barcode reader"
msgstr "Viivakoodinlukija"
#: bookwyrm/templates/guided_tour/home.html:102
-msgid "Use the Feed, Lists and Discover links to discover the latest news from your feed, lists of books by topic, and the latest happenings on this Bookwyrm server!"
-msgstr "Syöte, Listat ja Tutustu auttavat löytämään uusimmat kirjapäivitykset, aiheenmukaisia kirjalistoja sekä tämän BookWyrm-palvelimen uusimpia tapahtumia."
+msgid "Use the Lists, Discover, and Your Books links to discover reading suggestions and the latest happenings on this server, or to see your catalogued books!"
+msgstr ""
#: bookwyrm/templates/guided_tour/home.html:103
msgid "Navigation Bar"
@@ -2538,16 +2570,16 @@ msgid "The bell will light up when you have a new notification. When it does, cl
msgstr "Kellokuvake ilmoittaa uusista ilmoituksista. Ilmoituksia pääsee lukemaan kellokuvaketta painamalla."
#: bookwyrm/templates/guided_tour/home.html:177
-#: bookwyrm/templates/layout.html:75 bookwyrm/templates/layout.html:106
-#: bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:77 bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:108
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr "Ilmoitukset"
#: bookwyrm/templates/guided_tour/home.html:200
-msgid "Your profile, books, direct messages, and settings can be accessed by clicking on your name in the menu here."
-msgstr "Omaa profiilia, kirjoja, yksityisviestejä ja asetuksia voi tarkastella tämän valikon kautta. Valikko avautuu nimeä painamalla."
+msgid "Your profile, user directory, direct messages, and settings can be accessed by clicking on your name in the menu here."
+msgstr ""
#: bookwyrm/templates/guided_tour/home.html:200
msgid "Try selecting Profile from the drop down menu to continue the tour."
@@ -2702,7 +2734,7 @@ msgstr "Voit luoda ryhmän tai liittyä muiden käyttäjien ryhmiin. Ryhmissä v
#: bookwyrm/templates/guided_tour/user_groups.html:11
#: bookwyrm/templates/guided_tour/user_profile.html:55
-#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:85
+#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:95
msgid "Groups"
msgstr "Ryhmät"
@@ -2747,7 +2779,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr "Tämä on käyttäjäprofiilisi. Tässä näytetään viimeaikainen toimintasi. Muut BookWyrm-käyttäjät voivat myös katsella tätä sivua, mutta näkyvyysasetuksistasi riippuu, mitä heille näytetään."
#: bookwyrm/templates/guided_tour/user_profile.html:11
-#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:14
+#: bookwyrm/templates/user/layout.html:20 bookwyrm/templates/user/user.html:14
msgid "User Profile"
msgstr "Käyttäjäprofiili"
@@ -2756,7 +2788,7 @@ msgid "This tab shows everything you have read towards your annual reading goal,
msgstr "Tällä välilehdellä asetetaan vuoden lukutavoite ja näytetään sen eteneminen. Lukutavoitetta ei tietenkään ole mikään pakko asettaa."
#: bookwyrm/templates/guided_tour/user_profile.html:32
-#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:79
+#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:89
msgid "Reading Goal"
msgstr "Lukutavoite"
@@ -2795,7 +2827,7 @@ msgstr "Tätä aihetunnistetta ei ole vielä käytetty!"
#: bookwyrm/templates/import/import.html:5
#: bookwyrm/templates/import/import.html:9
-#: bookwyrm/templates/shelf/shelf.html:64
+#: bookwyrm/templates/shelf/shelf.html:66
msgid "Import Books"
msgstr "Tuo kirjoja"
@@ -2805,12 +2837,8 @@ msgstr "Epäkelpo CSV-tiedosto"
#: bookwyrm/templates/import/import.html:21
#, python-format
-msgid "\n"
-" Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day.\n"
-" "
-msgid_plural "\n"
-" Currently, you are allowed to import %(import_size_limit)s books every %(import_limit_reset)s days.\n"
-" "
+msgid "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day."
+msgid_plural "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s days."
msgstr[0] ""
msgstr[1] ""
@@ -2871,7 +2899,7 @@ msgstr "Tuotavien arvioiden yksityisyysvalinta:"
#: bookwyrm/templates/import/import.html:106
#: bookwyrm/templates/import/import.html:108
-#: bookwyrm/templates/preferences/layout.html:35
+#: bookwyrm/templates/preferences/layout.html:43
#: bookwyrm/templates/settings/federation/instance_blocklist.html:78
msgid "Import"
msgstr "Tuo"
@@ -2970,8 +2998,8 @@ msgid "Row"
msgstr "Rivi"
#: bookwyrm/templates/import/import_status.html:110
-#: bookwyrm/templates/shelf/shelf.html:148
-#: bookwyrm/templates/shelf/shelf.html:170
+#: bookwyrm/templates/shelf/shelf.html:150
+#: bookwyrm/templates/shelf/shelf.html:172
msgid "Title"
msgstr "Nimi"
@@ -2984,8 +3012,8 @@ msgid "Openlibrary key"
msgstr "Openlibrary-avain"
#: bookwyrm/templates/import/import_status.html:121
-#: bookwyrm/templates/shelf/shelf.html:149
-#: bookwyrm/templates/shelf/shelf.html:173
+#: bookwyrm/templates/shelf/shelf.html:151
+#: bookwyrm/templates/shelf/shelf.html:175
msgid "Author"
msgstr "Tekijä"
@@ -3091,10 +3119,6 @@ msgstr "Jos nimikkeiden tuonti epäonnistuu odottamattomalla tavalla, ota yhteyt
msgid "Create an Account"
msgstr "Avaa käyttäjätili"
-#: bookwyrm/templates/landing/invite.html:21
-msgid "Permission Denied"
-msgstr "Pääsy kielletty"
-
#: bookwyrm/templates/landing/invite.html:22
msgid "Sorry! This invite code is no longer valid."
msgstr "Kutsukoodi ei ole enää voimassa."
@@ -3142,7 +3166,7 @@ msgid "Login"
msgstr "Kirjaudu sisään"
#: bookwyrm/templates/landing/login.html:7
-#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:136
+#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:142
#: bookwyrm/templates/ostatus/error.html:37
msgid "Log in"
msgstr "Kirjaudu sisään"
@@ -3153,7 +3177,7 @@ msgstr "Sähköpostiosoite vahvistettu."
#: bookwyrm/templates/landing/login.html:21
#: bookwyrm/templates/landing/reactivate.html:17
-#: bookwyrm/templates/layout.html:127 bookwyrm/templates/ostatus/error.html:28
+#: bookwyrm/templates/layout.html:128 bookwyrm/templates/ostatus/error.html:28
#: bookwyrm/templates/snippets/register_form.html:4
msgid "Username:"
msgstr "Käyttäjänimi:"
@@ -3161,13 +3185,13 @@ msgstr "Käyttäjänimi:"
#: bookwyrm/templates/landing/login.html:27
#: bookwyrm/templates/landing/password_reset.html:26
#: bookwyrm/templates/landing/reactivate.html:23
-#: bookwyrm/templates/layout.html:131 bookwyrm/templates/ostatus/error.html:32
+#: bookwyrm/templates/layout.html:132 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/preferences/2fa.html:91
#: bookwyrm/templates/snippets/register_form.html:45
msgid "Password:"
msgstr "Salasana:"
-#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:133
+#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:139
#: bookwyrm/templates/ostatus/error.html:34
msgid "Forgot your password?"
msgstr "Unohtuiko salasana?"
@@ -3210,35 +3234,35 @@ msgstr "Aktivoi tili uudelleen"
msgid "%(site_name)s search"
msgstr "%(site_name)s — haku"
-#: bookwyrm/templates/layout.html:37
+#: bookwyrm/templates/layout.html:39
msgid "Search for a book, user, or list"
msgstr "Hae kirjaa, käyttäjää tai listaa"
-#: bookwyrm/templates/layout.html:52 bookwyrm/templates/layout.html:53
+#: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55
msgid "Scan Barcode"
msgstr "Skannaa viivakoodi"
-#: bookwyrm/templates/layout.html:67
+#: bookwyrm/templates/layout.html:69
msgid "Main navigation menu"
msgstr "Päävalikko"
-#: bookwyrm/templates/layout.html:87
-msgid "Feed"
-msgstr "Syöte"
-
-#: bookwyrm/templates/layout.html:132 bookwyrm/templates/ostatus/error.html:33
+#: bookwyrm/templates/layout.html:134 bookwyrm/templates/ostatus/error.html:33
msgid "password"
msgstr "salasana"
-#: bookwyrm/templates/layout.html:144
+#: bookwyrm/templates/layout.html:136
+msgid "Show/Hide password"
+msgstr "Näytä/piilota salasana"
+
+#: bookwyrm/templates/layout.html:150
msgid "Join"
msgstr "Liity"
-#: bookwyrm/templates/layout.html:179
+#: bookwyrm/templates/layout.html:196
msgid "Successfully posted status"
msgstr "Tilapäivitys onnistui"
-#: bookwyrm/templates/layout.html:180
+#: bookwyrm/templates/layout.html:197
msgid "Error posting status"
msgstr "Virhe tilapäivityksessä"
@@ -3430,6 +3454,7 @@ msgid "Set"
msgstr "Aseta"
#: bookwyrm/templates/lists/list.html:167
+#: bookwyrm/templates/snippets/remove_follower_button.html:4
#: bookwyrm/templates/snippets/remove_from_group_button.html:20
msgid "Remove"
msgstr "Poista"
@@ -3497,6 +3522,23 @@ msgstr "Kaikki listat"
msgid "Saved Lists"
msgstr "Tallennetut listat"
+#: bookwyrm/templates/moved.html:27
+#, python-format
+msgid "You have moved your account to %(username)s"
+msgstr ""
+
+#: bookwyrm/templates/moved.html:32
+msgid "You can undo the move to restore full functionality, but some followers may have already unfollowed this account."
+msgstr ""
+
+#: bookwyrm/templates/moved.html:42
+msgid "Undo move"
+msgstr ""
+
+#: bookwyrm/templates/moved.html:46 bookwyrm/templates/user_menu.html:77
+msgid "Log out"
+msgstr "Kirjaudu ulos"
+
#: bookwyrm/templates/notifications/items/accept.html:18
#, python-format
msgid "%(related_user)s accepted your invitation to join group \"%(group_name)s\""
@@ -3701,6 +3743,13 @@ msgstr "Tuonti valmis."
msgid "%(related_user)s invited you to join the group \"%(group_name)s\""
msgstr "%(related_user)s kutsui sinut liittymään ryhmään ”%(group_name)s”"
+#: bookwyrm/templates/notifications/items/invite_request.html:15
+#, python-format
+msgid "New invite request awaiting response"
+msgid_plural "%(display_count)s new invite requests awaiting response"
+msgstr[0] ""
+msgstr[1] ""
+
#: bookwyrm/templates/notifications/items/join.html:16
#, python-format
msgid "has joined your group \"%(group_name)s\""
@@ -3748,6 +3797,16 @@ msgstr "%(related_user)s mainitsi sinut %(related_user)s mentioned you in a status"
msgstr "%(related_user)s mainitsi sinut tilapäivityksessään"
+#: bookwyrm/templates/notifications/items/move_user.html:18
+#, python-format
+msgid "%(related_user)s has moved to %(username)s"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/move_user.html:25
+#, python-format
+msgid "%(related_user)s has undone their move"
+msgstr ""
+
#: bookwyrm/templates/notifications/items/remove.html:17
#, python-format
msgid "has been removed from your group \"%(group_name)s\""
@@ -3786,7 +3845,7 @@ msgstr[0] "Uusi raportti odottaa tarkastusta"
msgstr[1] "%(display_count)s uutta raporttia odottaa tarkastusta"
#: bookwyrm/templates/notifications/items/status_preview.html:4
-#: bookwyrm/templates/snippets/status/content_status.html:73
+#: bookwyrm/templates/snippets/status/content_status.html:62
msgid "Content warning"
msgstr "Sisältövaroitus"
@@ -4004,9 +4063,51 @@ msgstr "Aloita kaksivaiheisen tunnistautumisen käyttöönotto syöttämällä s
msgid "Set up 2FA"
msgstr "Ota kaksivaiheinen tunnistautuminen käyttöön"
+#: bookwyrm/templates/preferences/alias_user.html:4
+#: bookwyrm/templates/preferences/move_user.html:4
+#: bookwyrm/templates/preferences/move_user.html:7
+#: bookwyrm/templates/preferences/move_user.html:39
+msgid "Move Account"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:7
+#: bookwyrm/templates/preferences/alias_user.html:34
+msgid "Create Alias"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:12
+msgid "Add another account as an alias"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:16
+msgid "Marking another account as an alias is required if you want to move that account to this one."
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:19
+msgid "This is a reversable action and will not change the functionality of this account."
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:25
+msgid "Enter the username for the account you want to add as an alias e.g. user@example.com :"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:30
+#: bookwyrm/templates/preferences/move_user.html:35
+msgid "Confirm your password:"
+msgstr "Varmista salasanasi:"
+
+#: bookwyrm/templates/preferences/alias_user.html:39
+#: bookwyrm/templates/preferences/layout.html:28
+msgid "Aliases"
+msgstr "Muut nimet"
+
+#: bookwyrm/templates/preferences/alias_user.html:49
+msgid "Remove alias"
+msgstr ""
+
#: bookwyrm/templates/preferences/blocks.html:4
#: bookwyrm/templates/preferences/blocks.html:7
-#: bookwyrm/templates/preferences/layout.html:46
+#: bookwyrm/templates/preferences/layout.html:54
msgid "Blocked Users"
msgstr "Estetyt käyttäjät"
@@ -4036,7 +4137,7 @@ msgstr "Uusi salasana:"
#: bookwyrm/templates/preferences/delete_user.html:4
#: bookwyrm/templates/preferences/delete_user.html:7
#: bookwyrm/templates/preferences/delete_user.html:40
-#: bookwyrm/templates/preferences/layout.html:28
+#: bookwyrm/templates/preferences/layout.html:36
#: bookwyrm/templates/settings/users/delete_user_form.html:22
msgid "Delete Account"
msgstr "Poista käyttäjätili"
@@ -4081,7 +4182,7 @@ msgstr "Muokkaa profiilia"
#: bookwyrm/templates/preferences/edit_user.html:12
#: bookwyrm/templates/preferences/edit_user.html:25
-#: bookwyrm/templates/settings/users/user_info.html:7
+#: bookwyrm/templates/settings/users/user_info.html:8
#: bookwyrm/templates/user_menu.html:29
msgid "Profile"
msgstr "Profiili"
@@ -4158,18 +4259,45 @@ msgstr "Lataa tiedosto"
msgid "Account"
msgstr "Käyttäjätili"
-#: bookwyrm/templates/preferences/layout.html:31
+#: bookwyrm/templates/preferences/layout.html:32
+msgid "Move Account"
+msgstr ""
+
+#: bookwyrm/templates/preferences/layout.html:39
msgid "Data"
msgstr "Tiedot"
-#: bookwyrm/templates/preferences/layout.html:39
+#: bookwyrm/templates/preferences/layout.html:47
msgid "CSV export"
msgstr "CSV-vienti"
-#: bookwyrm/templates/preferences/layout.html:42
+#: bookwyrm/templates/preferences/layout.html:50
msgid "Relationships"
msgstr "Suhteet"
+#: bookwyrm/templates/preferences/move_user.html:12
+msgid "Migrate account to another server"
+msgstr ""
+
+#: bookwyrm/templates/preferences/move_user.html:16
+msgid "Moving your account will notify all your followers and direct them to follow the new account."
+msgstr ""
+
+#: bookwyrm/templates/preferences/move_user.html:19
+#, python-format
+msgid "\n"
+" %(user)s will be marked as moved and will not be discoverable or usable unless you undo the move.\n"
+" "
+msgstr ""
+
+#: bookwyrm/templates/preferences/move_user.html:25
+msgid "Remember to add this user as an alias of the target account before you try to move."
+msgstr ""
+
+#: bookwyrm/templates/preferences/move_user.html:30
+msgid "Enter the username for the account you want to move to e.g. user@example.com :"
+msgstr ""
+
#: bookwyrm/templates/reading_progress/finish.html:5
#, python-format
msgid "Finish \"%(book_title)s\""
@@ -4578,8 +4706,8 @@ msgid "Streams"
msgstr "Virrat"
#: bookwyrm/templates/settings/celery.html:32
-msgid "Broadcasts"
-msgstr "Lähetykset"
+msgid "Broadcast"
+msgstr ""
#: bookwyrm/templates/settings/celery.html:38
msgid "Inbox"
@@ -4929,7 +5057,7 @@ msgid "Details"
msgstr "Lisätiedot"
#: bookwyrm/templates/settings/federation/instance.html:53
-#: bookwyrm/templates/user/layout.html:69
+#: bookwyrm/templates/user/layout.html:79
msgid "Activity"
msgstr "Aktiivisuus"
@@ -5117,7 +5245,7 @@ msgstr "Kutsupyynnöt"
#: bookwyrm/templates/settings/invites/manage_invites.html:3
#: bookwyrm/templates/settings/invites/manage_invites.html:15
#: bookwyrm/templates/settings/layout.html:42
-#: bookwyrm/templates/user_menu.html:60
+#: bookwyrm/templates/user_menu.html:55
msgid "Invites"
msgstr "Kutsut"
@@ -5591,57 +5719,73 @@ msgid "Set instance default theme"
msgstr "Aseta palvelimen oletusteema"
#: bookwyrm/templates/settings/themes.html:19
+msgid "One of your themes appears to be broken. Selecting this theme will make the application unusable."
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:28
msgid "Successfully added theme"
msgstr "Teeman lisääminen onnistui"
-#: bookwyrm/templates/settings/themes.html:26
+#: bookwyrm/templates/settings/themes.html:35
msgid "How to add a theme"
msgstr "Teeman lisääminen — ohje"
-#: bookwyrm/templates/settings/themes.html:29
+#: bookwyrm/templates/settings/themes.html:38
msgid "Copy the theme file into the bookwyrm/static/css/themes
directory on your server from the command line."
msgstr "Kopioi teematiedosto komentorivillä palvelimen hakemistoon bookwyrm/static/css/themes
."
-#: bookwyrm/templates/settings/themes.html:32
+#: bookwyrm/templates/settings/themes.html:41
msgid "Run ./bw-dev compile_themes
and ./bw-dev collectstatic
."
msgstr "Suorita ./bw-dev compile_themes
ja ./bw-dev collectstatic
."
-#: bookwyrm/templates/settings/themes.html:35
+#: bookwyrm/templates/settings/themes.html:44
msgid "Add the file name using the form below to make it available in the application interface."
msgstr "Lisää tiedostonimi alla olevalla lomakkeella, niin se on käytettävissä sovelluksen käyttöliittymän kautta."
-#: bookwyrm/templates/settings/themes.html:42
-#: bookwyrm/templates/settings/themes.html:82
+#: bookwyrm/templates/settings/themes.html:51
+#: bookwyrm/templates/settings/themes.html:91
msgid "Add theme"
msgstr "Lisää teema"
-#: bookwyrm/templates/settings/themes.html:48
+#: bookwyrm/templates/settings/themes.html:57
msgid "Unable to save theme"
msgstr "Teemaa ei voi tallentaa"
-#: bookwyrm/templates/settings/themes.html:63
-#: bookwyrm/templates/settings/themes.html:93
+#: bookwyrm/templates/settings/themes.html:72
+#: bookwyrm/templates/settings/themes.html:102
msgid "Theme name"
msgstr "Teeman nimi"
-#: bookwyrm/templates/settings/themes.html:73
+#: bookwyrm/templates/settings/themes.html:82
msgid "Theme filename"
msgstr "Teeman tiedostonimi"
-#: bookwyrm/templates/settings/themes.html:88
+#: bookwyrm/templates/settings/themes.html:97
msgid "Available Themes"
msgstr "Saatavilla olevat teemat"
-#: bookwyrm/templates/settings/themes.html:96
+#: bookwyrm/templates/settings/themes.html:105
msgid "File"
msgstr "Tiedosto"
-#: bookwyrm/templates/settings/themes.html:111
+#: bookwyrm/templates/settings/themes.html:123
msgid "Remove theme"
msgstr "Poista teema"
+#: bookwyrm/templates/settings/themes.html:134
+msgid "Test theme"
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:143
+msgid "Broken theme"
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:152
+msgid "Loaded successfully"
+msgstr ""
+
#: bookwyrm/templates/settings/users/delete_user_form.html:5
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:38
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:52
msgid "Permanently delete user"
msgstr "Poista käyttäjä pysyvästi"
@@ -5680,25 +5824,20 @@ msgstr "Viimeksi paikalla"
msgid "Remote instance"
msgstr "Etäpalvelin"
-#: bookwyrm/templates/settings/users/user_admin.html:86
-msgid "Deleted"
-msgstr "Poistettu"
-
-#: bookwyrm/templates/settings/users/user_admin.html:92
-#: bookwyrm/templates/settings/users/user_info.html:32
-msgid "Inactive"
-msgstr "Ei aktiivinen"
-
-#: bookwyrm/templates/settings/users/user_admin.html:101
+#: bookwyrm/templates/settings/users/user_admin.html:84
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr "Ei asetettu"
-#: bookwyrm/templates/settings/users/user_info.html:16
+#: bookwyrm/templates/settings/users/user_info.html:20
+msgid "This account is the instance actor for signing HTTP requests."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_info.html:24
msgid "View user profile"
msgstr "Näytä käyttäjäprofiili"
-#: bookwyrm/templates/settings/users/user_info.html:19
+#: bookwyrm/templates/settings/users/user_info.html:30
msgid "Go to user admin"
msgstr "Siirry käyttäjien hallintaan"
@@ -5754,27 +5893,39 @@ msgstr "Palvelimen tiedot"
msgid "View instance"
msgstr "Näytä palvelin"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:5
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:6
msgid "Permanently deleted"
msgstr "Poistettu pysyvästi"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:8
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:9
msgid "User Actions"
msgstr "Toiminnot"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:21
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:15
+msgid "This is the instance admin actor"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:18
+msgid "You must not delete or disable this account as it is critical to the functioning of your server. This actor signs outgoing GET requests to smooth interaction with secure ActivityPub servers."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:19
+msgid "This account is not discoverable by ordinary users and does not have a profile page."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:35
msgid "Activate user"
msgstr "Aktivoi käyttäjä"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:27
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:41
msgid "Suspend user"
msgstr "Hyllytä käyttäjä"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:32
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:46
msgid "Un-suspend user"
msgstr "Peru hyllytys"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:54
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:68
msgid "Access level:"
msgstr "Käyttöoikeustaso:"
@@ -5830,7 +5981,7 @@ msgstr "Verkkotunnus näyttää väärin muotoillulta. Siinä ei saa olla protok
msgid "You are running BookWyrm in production mode without https. USE_HTTPS should be enabled in production."
msgstr "BookWyrm on tuotantokäytössä ilman https-protokollaa. Tuotantokäytössä tulee ottaa käyttöön USE_HTTPS-valinta."
-#: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:49
+#: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:44
msgid "Settings"
msgstr "Asetukset"
@@ -5887,7 +6038,7 @@ msgid "Need help?"
msgstr "Tarvitsetko apua?"
#: bookwyrm/templates/shelf/create_shelf_form.html:5
-#: bookwyrm/templates/shelf/shelf.html:72
+#: bookwyrm/templates/shelf/shelf.html:74
msgid "Create shelf"
msgstr "Luo hylly"
@@ -5895,58 +6046,58 @@ msgstr "Luo hylly"
msgid "Edit Shelf"
msgstr "Muokkaa hyllyä"
-#: bookwyrm/templates/shelf/shelf.html:24
+#: bookwyrm/templates/shelf/shelf.html:26
#: bookwyrm/templates/user/relationships/followers.html:18
#: bookwyrm/templates/user/relationships/following.html:18
msgid "User profile"
msgstr "Käyttäjäprofiili"
-#: bookwyrm/templates/shelf/shelf.html:39
+#: bookwyrm/templates/shelf/shelf.html:41
#: bookwyrm/templatetags/shelf_tags.py:13 bookwyrm/views/shelf/shelf.py:53
msgid "All books"
msgstr "Kaikki kirjat"
-#: bookwyrm/templates/shelf/shelf.html:97
+#: bookwyrm/templates/shelf/shelf.html:99
#, python-format
msgid "%(formatted_count)s book"
msgid_plural "%(formatted_count)s books"
msgstr[0] "%(formatted_count)s kirja"
msgstr[1] "%(formatted_count)s kirjaa"
-#: bookwyrm/templates/shelf/shelf.html:104
+#: bookwyrm/templates/shelf/shelf.html:106
#, python-format
msgid "(showing %(start)s-%(end)s)"
msgstr "(näytetään %(start)s–%(end)s)"
-#: bookwyrm/templates/shelf/shelf.html:116
+#: bookwyrm/templates/shelf/shelf.html:118
msgid "Edit shelf"
msgstr "Muokkaa hyllyä"
-#: bookwyrm/templates/shelf/shelf.html:124
+#: bookwyrm/templates/shelf/shelf.html:126
msgid "Delete shelf"
msgstr "Poista hylly"
-#: bookwyrm/templates/shelf/shelf.html:152
-#: bookwyrm/templates/shelf/shelf.html:178
+#: bookwyrm/templates/shelf/shelf.html:154
+#: bookwyrm/templates/shelf/shelf.html:180
msgid "Shelved"
msgstr "Hyllytetty"
-#: bookwyrm/templates/shelf/shelf.html:153
-#: bookwyrm/templates/shelf/shelf.html:181
+#: bookwyrm/templates/shelf/shelf.html:155
+#: bookwyrm/templates/shelf/shelf.html:183
msgid "Started"
msgstr "Aloitettu"
-#: bookwyrm/templates/shelf/shelf.html:154
-#: bookwyrm/templates/shelf/shelf.html:184
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
msgid "Finished"
msgstr "Luettu"
-#: bookwyrm/templates/shelf/shelf.html:154
-#: bookwyrm/templates/shelf/shelf.html:184
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
msgid "Until"
-msgstr "Saakka"
+msgstr "Lopetettu"
-#: bookwyrm/templates/shelf/shelf.html:210
+#: bookwyrm/templates/shelf/shelf.html:212
msgid "This shelf is empty."
msgstr "Hylly on tyhjä."
@@ -6252,6 +6403,15 @@ msgstr "Olet lukenut %(read_count)s/%(goal_count)s kirjaa
msgid "%(username)s has read %(read_count)s of %(goal_count)s books."
msgstr "%(username)s on lukenut %(read_count)s/%(goal_count)s kirjaa."
+#: bookwyrm/templates/snippets/move_user_buttons.html:10
+msgid "Follow at new account"
+msgstr ""
+
+#: bookwyrm/templates/snippets/moved_user_notice.html:7
+#, python-format
+msgid "%(user)s has moved to %(moved_to_name)s"
+msgstr ""
+
#: bookwyrm/templates/snippets/page_text.html:8
#, python-format
msgid "page %(page)s of %(total_pages)s"
@@ -6393,35 +6553,35 @@ msgstr "Keskeytä lukeminen"
msgid "Finish reading"
msgstr "Luettu kokonaan"
-#: bookwyrm/templates/snippets/status/content_status.html:80
+#: bookwyrm/templates/snippets/status/content_status.html:69
msgid "Show status"
msgstr "Näytä tilapäivitys"
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "(Page %(page)s"
msgstr "(Sivu %(page)s"
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "%(endpage)s"
msgstr "%(endpage)s"
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid "(%(percent)s%%"
msgstr "(%(percent)s %%"
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid " - %(endpercent)s%%"
msgstr "–%(endpercent)s %%"
-#: bookwyrm/templates/snippets/status/content_status.html:127
+#: bookwyrm/templates/snippets/status/content_status.html:116
msgid "Open image in new window"
msgstr "Avaa kuva uudessa ikkunassa"
-#: bookwyrm/templates/snippets/status/content_status.html:148
+#: bookwyrm/templates/snippets/status/content_status.html:137
msgid "Hide status"
msgstr "Piilota tilapäivitys"
@@ -6554,6 +6714,18 @@ msgstr "Näytä lisää"
msgid "Show less"
msgstr "Näytä vähemmän"
+#: bookwyrm/templates/snippets/user_active_tag.html:5
+msgid "Moved"
+msgstr ""
+
+#: bookwyrm/templates/snippets/user_active_tag.html:12
+msgid "Deleted"
+msgstr "Poistettu"
+
+#: bookwyrm/templates/snippets/user_active_tag.html:15
+msgid "Inactive"
+msgstr "Ei aktiivinen"
+
#: bookwyrm/templates/two_factor_auth/two_factor_login.html:29
msgid "2FA check"
msgstr "Kaksivaiheisen tunnistautumisen tarkistus"
@@ -6612,11 +6784,11 @@ msgstr "Omat ryhmät"
msgid "Groups: %(username)s"
msgstr "Ryhmät: %(username)s"
-#: bookwyrm/templates/user/layout.html:50
+#: bookwyrm/templates/user/layout.html:59
msgid "Follow Requests"
msgstr "Seuraamispyynnöt"
-#: bookwyrm/templates/user/layout.html:73
+#: bookwyrm/templates/user/layout.html:83
#: bookwyrm/templates/user/reviews_comments.html:6
#: bookwyrm/templates/user/reviews_comments.html:12
msgid "Reviews and Comments"
@@ -6631,7 +6803,13 @@ msgstr "Listat: %(username)s"
msgid "Create list"
msgstr "Luo lista"
-#: bookwyrm/templates/user/relationships/followers.html:31
+#: bookwyrm/templates/user/moved.html:25
+#: bookwyrm/templates/user/user_preview.html:22
+#, python-format
+msgid "Joined %(date)s"
+msgstr "Liittynyt %(date)s"
+
+#: bookwyrm/templates/user/relationships/followers.html:36
#, python-format
msgid "%(username)s has no followers"
msgstr "Käyttäjällä %(username)s ei ole seuraajia"
@@ -6702,11 +6880,6 @@ msgstr "Vain kommentit"
msgid "No activities yet!"
msgstr "Ei toimintaa!"
-#: bookwyrm/templates/user/user_preview.html:22
-#, python-format
-msgid "Joined %(date)s"
-msgstr "Liittynyt %(date)s"
-
#: bookwyrm/templates/user/user_preview.html:26
#, python-format
msgid "%(display_count)s follower"
@@ -6734,10 +6907,6 @@ msgstr "Ei seuraajia, joita seuraat itse"
msgid "View profile and more"
msgstr "Näytä profiili ja muita tietoja"
-#: bookwyrm/templates/user_menu.html:82
-msgid "Log out"
-msgstr "Kirjaudu ulos"
-
#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:28
msgid "File exceeds maximum size: 10MB"
msgstr "Tiedosto on enimmäiskokoa 10 Mt suurempi"
@@ -6754,7 +6923,7 @@ msgid_plural "%(num)d books - by %(user)s"
msgstr[0] "%(num)d kirja — %(user)s"
msgstr[1] "%(num)d kirjaa — %(user)s"
-#: bookwyrm/templatetags/utilities.py:39
+#: bookwyrm/templatetags/utilities.py:49
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"
diff --git a/locale/fr_FR/LC_MESSAGES/django.mo b/locale/fr_FR/LC_MESSAGES/django.mo
index fd48c948c..1b3148f92 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 452c08205..8fa5f634e 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: 2023-09-27 01:11+0000\n"
-"PO-Revision-Date: 2023-09-28 00:08\n"
+"POT-Creation-Date: 2023-12-30 23:52+0000\n"
+"PO-Revision-Date: 2024-01-02 03:11\n"
"Last-Translator: Mouse Reeve %(level)s
."
+msgstr ""
+
+#: bookwyrm/templates/403.html:15
+msgid "If you think you should have access, please speak to your BookWyrm server administrator."
+msgstr ""
+
#: bookwyrm/templates/404.html:4 bookwyrm/templates/404.html:8
msgid "Not Found"
msgstr "Introuvable"
@@ -476,6 +496,20 @@ msgstr "Introuvable"
msgid "The page you requested doesn't seem to exist!"
msgstr "Il semblerait que la page que vous avez demandée n’existe pas !"
+#: bookwyrm/templates/413.html:4 bookwyrm/templates/413.html:8
+msgid "File too large"
+msgstr ""
+
+#: bookwyrm/templates/413.html:9
+msgid "The file you are uploading is too large."
+msgstr ""
+
+#: bookwyrm/templates/413.html:11
+msgid "\n"
+" You you can try using a smaller file, or ask your BookWyrm server administrator to increase the DATA_UPLOAD_MAX_MEMORY_SIZE
setting.\n"
+" "
+msgstr ""
+
#: bookwyrm/templates/500.html:4
msgid "Oops!"
msgstr "Oups !"
@@ -536,12 +570,12 @@ msgstr "L’administration et la modération de %(site_name)s maintiennent le si
msgid "Moderator"
msgstr "Modérateur/modératrice"
-#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:67
+#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:62
msgid "Admin"
msgstr "Admin"
#: bookwyrm/templates/about/about.html:140
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:28
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
msgid "Send direct message"
@@ -575,7 +609,7 @@ msgid "Software version:"
msgstr "Version logicielle :"
#: bookwyrm/templates/about/layout.html:30
-#: bookwyrm/templates/embed-layout.html:33
+#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/snippets/footer.html:8
#, python-format
msgid "About %(site_name)s"
@@ -680,7 +714,7 @@ msgstr "Sa lecture la plus courte l’année…"
#: bookwyrm/templates/annual_summary/layout.html:157
#: bookwyrm/templates/annual_summary/layout.html:178
#: bookwyrm/templates/annual_summary/layout.html:247
-#: bookwyrm/templates/book/book.html:63
+#: bookwyrm/templates/book/book.html:65
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
@@ -768,24 +802,24 @@ msgid "View ISNI record"
msgstr "Voir l’enregistrement ISNI"
#: bookwyrm/templates/author/author.html:95
-#: bookwyrm/templates/book/book.html:173
+#: bookwyrm/templates/book/book.html:175
msgid "View on ISFDB"
msgstr "Voir sur ISFDB"
#: bookwyrm/templates/author/author.html:100
#: bookwyrm/templates/author/sync_modal.html:5
-#: bookwyrm/templates/book/book.html:140
+#: bookwyrm/templates/book/book.html:142
#: bookwyrm/templates/book/sync_modal.html:5
msgid "Load data"
msgstr "Charger les données"
#: bookwyrm/templates/author/author.html:104
-#: bookwyrm/templates/book/book.html:144
+#: bookwyrm/templates/book/book.html:146
msgid "View on OpenLibrary"
msgstr "Voir sur OpenLibrary"
#: bookwyrm/templates/author/author.html:119
-#: bookwyrm/templates/book/book.html:158
+#: bookwyrm/templates/book/book.html:160
msgid "View on Inventaire"
msgstr "Voir sur Inventaire"
@@ -797,11 +831,7 @@ msgstr "Voir sur LibraryThing"
msgid "View on Goodreads"
msgstr "Voir sur Goodreads"
-#: bookwyrm/templates/author/author.html:151
-msgid "View ISFDB entry"
-msgstr "Voir l’entrée ISFDB"
-
-#: bookwyrm/templates/author/author.html:166
+#: bookwyrm/templates/author/author.html:158
#, python-format
msgid "Books by %(name)s"
msgstr "Livres de %(name)s"
@@ -910,7 +940,7 @@ msgstr "ISNI :"
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:89
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save"
@@ -959,19 +989,19 @@ msgstr "Confirmer"
msgid "Unable to connect to remote source."
msgstr "Impossible de se connecter au serveur distant."
-#: bookwyrm/templates/book/book.html:71 bookwyrm/templates/book/book.html:72
+#: bookwyrm/templates/book/book.html:73 bookwyrm/templates/book/book.html:74
msgid "Edit Book"
msgstr "Modifier le livre"
-#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:100
+#: bookwyrm/templates/book/book.html:99 bookwyrm/templates/book/book.html:102
msgid "Click to add cover"
msgstr "Cliquez pour ajouter une couverture"
-#: bookwyrm/templates/book/book.html:106
+#: bookwyrm/templates/book/book.html:108
msgid "Failed to load cover"
msgstr "La couverture n’a pu être chargée"
-#: bookwyrm/templates/book/book.html:117
+#: bookwyrm/templates/book/book.html:119
msgid "Click to enlarge"
msgstr "Cliquez pour élargir"
@@ -1046,13 +1076,13 @@ msgstr "Lieux"
#: bookwyrm/templates/guided_tour/lists.html:14
#: bookwyrm/templates/guided_tour/user_books.html:102
#: bookwyrm/templates/guided_tour/user_profile.html:78
-#: bookwyrm/templates/layout.html:90 bookwyrm/templates/lists/curate.html:8
+#: bookwyrm/templates/layout.html:88 bookwyrm/templates/lists/curate.html:8
#: bookwyrm/templates/lists/list.html:12 bookwyrm/templates/lists/lists.html:5
#: bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:26
#: bookwyrm/templates/search/layout.html:51
#: bookwyrm/templates/settings/celery.html:77
-#: bookwyrm/templates/user/layout.html:91 bookwyrm/templates/user/lists.html:6
+#: bookwyrm/templates/user/layout.html:101 bookwyrm/templates/user/lists.html:6
msgid "Lists"
msgstr "Listes"
@@ -1076,11 +1106,11 @@ msgstr "ISBN :"
#: bookwyrm/templates/book/book_identifiers.html:12
#: bookwyrm/templates/book/book_identifiers.html:13
msgid "Copy ISBN"
-msgstr ""
+msgstr "Copier l’ISBN"
#: bookwyrm/templates/book/book_identifiers.html:16
msgid "Copied ISBN!"
-msgstr ""
+msgstr "ISBN copié !"
#: bookwyrm/templates/book/book_identifiers.html:23
#: bookwyrm/templates/book/edit/edit_book_form.html:352
@@ -1117,7 +1147,7 @@ msgstr "Charger une couverture :"
#: bookwyrm/templates/book/cover_add_modal.html:23
#: bookwyrm/templates/book/edit/edit_book_form.html:250
-msgid "Load cover from url:"
+msgid "Load cover from URL:"
msgstr "Charger la couverture depuis une URL :"
#: bookwyrm/templates/book/cover_show_modal.html:6
@@ -1245,7 +1275,7 @@ msgstr "Titre :"
#: bookwyrm/templates/book/edit/edit_book_form.html:35
msgid "Sort Title:"
-msgstr ""
+msgstr "Titre de tri :"
#: bookwyrm/templates/book/edit/edit_book_form.html:44
msgid "Subtitle:"
@@ -1328,7 +1358,7 @@ msgid "Add Another Author"
msgstr "Ajouter un autre auteur ou autrice"
#: bookwyrm/templates/book/edit/edit_book_form.html:231
-#: bookwyrm/templates/shelf/shelf.html:147
+#: bookwyrm/templates/shelf/shelf.html:149
msgid "Cover"
msgstr "Couverture"
@@ -1372,8 +1402,8 @@ msgstr "Éditions de %(book_title)s"
#: bookwyrm/templates/book/editions/editions.html:8
#, python-format
-msgid "Editions of \"%(work_title)s\""
-msgstr "Éditions de « %(work_title)s »"
+msgid "Editions of %(work_title)s"
+msgstr "Éditions de %(work_title)s"
#: bookwyrm/templates/book/editions/editions.html:55
msgid "Can't find the edition you're looking for?"
@@ -1455,8 +1485,9 @@ msgstr "Domaine"
#: bookwyrm/templates/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
#: bookwyrm/templates/settings/invites/status_filter.html:5
+#: bookwyrm/templates/settings/themes.html:111
#: bookwyrm/templates/settings/users/user_admin.html:56
-#: bookwyrm/templates/settings/users/user_info.html:24
+#: bookwyrm/templates/settings/users/user_info.html:35
msgid "Status"
msgstr "Statut"
@@ -1465,7 +1496,7 @@ msgstr "Statut"
#: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/imports/imports.html:141
#: bookwyrm/templates/settings/reports/report_links_table.html:6
-#: bookwyrm/templates/settings/themes.html:99
+#: bookwyrm/templates/settings/themes.html:108
msgid "Actions"
msgstr "Actions"
@@ -1529,22 +1560,22 @@ msgstr "%(pages)s pages"
msgid "%(languages)s language"
msgstr "Langue : %(languages)s"
-#: bookwyrm/templates/book/publisher_info.html:65
+#: bookwyrm/templates/book/publisher_info.html:63
#, python-format
msgid "Published %(date)s by %(publisher)s."
msgstr "Publié %(date)s par %(publisher)s."
+#: bookwyrm/templates/book/publisher_info.html:65
+#, python-format
+msgid "Published by %(publisher)s."
+msgstr "Publié par %(publisher)s."
+
#: bookwyrm/templates/book/publisher_info.html:67
#, python-format
msgid "Published %(date)s"
msgstr "Publié %(date)s"
-#: bookwyrm/templates/book/publisher_info.html:69
-#, python-format
-msgid "Published by %(publisher)s."
-msgstr "Publié par %(publisher)s."
-
-#: bookwyrm/templates/book/rating.html:13
+#: bookwyrm/templates/book/rating.html:19
msgid "rated it"
msgstr "l’a noté"
@@ -1552,12 +1583,12 @@ msgstr "l’a noté"
msgid "Series by"
msgstr "Séries par"
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
#, python-format
msgid "Book %(series_number)s"
msgstr "Livre %(series_number)s"
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
msgid "Unsorted Book"
msgstr "Livre hors classement"
@@ -1681,6 +1712,7 @@ msgstr "Suggéré"
#: bookwyrm/templates/ostatus/subscribe.html:42
#: bookwyrm/templates/ostatus/success.html:17
#: bookwyrm/templates/ostatus/success.html:18
+#: bookwyrm/templates/user/moved.html:19 bookwyrm/templates/user/moved.html:20
#: bookwyrm/templates/user/user_preview.html:16
#: bookwyrm/templates/user/user_preview.html:17
msgid "Locked account"
@@ -1755,7 +1787,7 @@ msgstr "%(username)s a cité un passage de %(username)s"
msgstr "Messages directs avec %(username)s"
#: bookwyrm/templates/feed/direct_messages.html:10
-#: bookwyrm/templates/user_menu.html:44
+#: bookwyrm/templates/user_menu.html:39
msgid "Direct Messages"
msgstr "Messages directs"
@@ -1948,7 +1980,7 @@ msgstr "Mises à jour"
#: bookwyrm/templates/feed/suggested_books.html:6
#: bookwyrm/templates/guided_tour/home.html:127
-#: bookwyrm/templates/user_menu.html:39
+#: bookwyrm/templates/layout.html:94
msgid "Your Books"
msgstr "Vos Livres"
@@ -1996,19 +2028,19 @@ msgid "Add to your books"
msgstr "Ajouter à vos livres"
#: bookwyrm/templates/get_started/book_preview.html:10
-#: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37
+#: bookwyrm/templates/shelf/shelf.html:88 bookwyrm/templates/user/user.html:37
#: bookwyrm/templatetags/shelf_tags.py:14
msgid "To Read"
msgstr "À lire"
#: bookwyrm/templates/get_started/book_preview.html:11
-#: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38
+#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:38
#: bookwyrm/templatetags/shelf_tags.py:15
msgid "Currently Reading"
msgstr "Lectures en cours"
#: bookwyrm/templates/get_started/book_preview.html:12
-#: bookwyrm/templates/shelf/shelf.html:88
+#: bookwyrm/templates/shelf/shelf.html:90
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
@@ -2017,7 +2049,7 @@ msgid "Read"
msgstr "Lu"
#: bookwyrm/templates/get_started/book_preview.html:13
-#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40
+#: bookwyrm/templates/shelf/shelf.html:91 bookwyrm/templates/user/user.html:40
#: bookwyrm/templatetags/shelf_tags.py:17
msgid "Stopped Reading"
msgstr "Lecture interrompue"
@@ -2027,7 +2059,7 @@ msgid "What are you reading?"
msgstr "Que lisez‑vous ?"
#: bookwyrm/templates/get_started/books.html:9
-#: bookwyrm/templates/layout.html:39 bookwyrm/templates/lists/list.html:213
+#: bookwyrm/templates/layout.html:41 bookwyrm/templates/lists/list.html:213
msgid "Search for a book"
msgstr "Chercher un livre"
@@ -2046,8 +2078,8 @@ msgstr "Vous pourrez ajouter des livres lorsque vous commencerez à utiliser %(s
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:15
-#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:45
-#: bookwyrm/templates/layout.html:46 bookwyrm/templates/lists/list.html:217
+#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:47
+#: bookwyrm/templates/layout.html:48 bookwyrm/templates/lists/list.html:217
#: bookwyrm/templates/search/layout.html:5
#: bookwyrm/templates/search/layout.html:10
#: bookwyrm/templates/search/layout.html:32
@@ -2268,7 +2300,7 @@ msgstr "Responsable"
#: bookwyrm/templates/groups/user_groups.html:35
msgid "No groups found."
-msgstr ""
+msgstr "Aucun groupe trouvé."
#: bookwyrm/templates/guided_tour/book.html:10
msgid "This is home page of a book. Let's see what you can do while you're here!"
@@ -2514,8 +2546,8 @@ msgid "Barcode reader"
msgstr "Lecteur de code-barres"
#: bookwyrm/templates/guided_tour/home.html:102
-msgid "Use the Feed, Lists and Discover links to discover the latest news from your feed, lists of books by topic, and the latest happenings on this Bookwyrm server!"
-msgstr "Utilisez les liens Flux, Listes et Découverte pour découvrir les dernières mises à jour de votre flux, de vos listes de livres, et les derniers événements sur ce serveur Bookwyrm !"
+msgid "Use the Lists, Discover, and Your Books links to discover reading suggestions and the latest happenings on this server, or to see your catalogued books!"
+msgstr ""
#: bookwyrm/templates/guided_tour/home.html:103
msgid "Navigation Bar"
@@ -2538,16 +2570,16 @@ msgid "The bell will light up when you have a new notification. When it does, cl
msgstr "La cloche s'allumera quand vous aurez une nouvelle notification. Quand elle sera activée, cliquez dessus pour savoir ce qui s'est passé !"
#: bookwyrm/templates/guided_tour/home.html:177
-#: bookwyrm/templates/layout.html:75 bookwyrm/templates/layout.html:106
-#: bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:77 bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:108
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr "Notifications"
#: bookwyrm/templates/guided_tour/home.html:200
-msgid "Your profile, books, direct messages, and settings can be accessed by clicking on your name in the menu here."
-msgstr "Vous pouvez accéder à votre profil, vos livres, vos messages directs et vos paramètres en cliquant sur votre nom dans ce menu-ci."
+msgid "Your profile, user directory, direct messages, and settings can be accessed by clicking on your name in the menu here."
+msgstr ""
#: bookwyrm/templates/guided_tour/home.html:200
msgid "Try selecting Profile from the drop down menu to continue the tour."
@@ -2702,7 +2734,7 @@ msgstr "Vous pouvez créer ou rejoindre un groupe avec d'autres utilisateurs. Le
#: bookwyrm/templates/guided_tour/user_groups.html:11
#: bookwyrm/templates/guided_tour/user_profile.html:55
-#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:85
+#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:95
msgid "Groups"
msgstr "Groupes"
@@ -2747,7 +2779,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr "Voici votre page de profil. Toutes vos dernières activités seront listées ici. D'autres membres de Bookwyrm peuvent également voir des parties de cette page—ce qu’il leur est possible de voir dépend de vos paramètres de confidentialité."
#: bookwyrm/templates/guided_tour/user_profile.html:11
-#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:14
+#: bookwyrm/templates/user/layout.html:20 bookwyrm/templates/user/user.html:14
msgid "User Profile"
msgstr "Profil"
@@ -2756,7 +2788,7 @@ msgid "This tab shows everything you have read towards your annual reading goal,
msgstr "Cet onglet montre tout ce que vous avez lu pour atteindre votre objectif de lecture annuel, ou vous permet d’en définir un. Vous n’avez pas à définir un objectif de lecture si ce n’est pas votre truc !"
#: bookwyrm/templates/guided_tour/user_profile.html:32
-#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:79
+#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:89
msgid "Reading Goal"
msgstr "Défi lecture"
@@ -2795,7 +2827,7 @@ msgstr "Pas encore d’activité pour ce hashtag !"
#: bookwyrm/templates/import/import.html:5
#: bookwyrm/templates/import/import.html:9
-#: bookwyrm/templates/shelf/shelf.html:64
+#: bookwyrm/templates/shelf/shelf.html:66
msgid "Import Books"
msgstr "Importer des livres"
@@ -2805,19 +2837,15 @@ msgstr "Fichier CSV non valide"
#: bookwyrm/templates/import/import.html:21
#, python-format
-msgid "\n"
-" Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day.\n"
-" "
-msgid_plural "\n"
-" Currently, you are allowed to import %(import_size_limit)s books every %(import_limit_reset)s days.\n"
-" "
-msgstr[0] ""
-msgstr[1] ""
+msgid "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day."
+msgid_plural "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s days."
+msgstr[0] "Vous êtes actuellement autorisé à importer %(display_size)s livres tous les %(import_limit_reset)s jours."
+msgstr[1] "Vous avez le droit d’importer %(display_size)s livres chaque %(import_limit_reset)s jours actuellement."
#: bookwyrm/templates/import/import.html:27
#, python-format
msgid "You have %(display_left)s left."
-msgstr ""
+msgstr "Encore %(display_left)s."
#: bookwyrm/templates/import/import.html:34
#, python-format
@@ -2871,7 +2899,7 @@ msgstr "Confidentialité des critiques importées :"
#: bookwyrm/templates/import/import.html:106
#: bookwyrm/templates/import/import.html:108
-#: bookwyrm/templates/preferences/layout.html:35
+#: bookwyrm/templates/preferences/layout.html:43
#: bookwyrm/templates/settings/federation/instance_blocklist.html:78
msgid "Import"
msgstr "Importer"
@@ -2970,8 +2998,8 @@ msgid "Row"
msgstr "Ligne"
#: bookwyrm/templates/import/import_status.html:110
-#: bookwyrm/templates/shelf/shelf.html:148
-#: bookwyrm/templates/shelf/shelf.html:170
+#: bookwyrm/templates/shelf/shelf.html:150
+#: bookwyrm/templates/shelf/shelf.html:172
msgid "Title"
msgstr "Titre"
@@ -2984,8 +3012,8 @@ msgid "Openlibrary key"
msgstr "Clé Openlibrary"
#: bookwyrm/templates/import/import_status.html:121
-#: bookwyrm/templates/shelf/shelf.html:149
-#: bookwyrm/templates/shelf/shelf.html:173
+#: bookwyrm/templates/shelf/shelf.html:151
+#: bookwyrm/templates/shelf/shelf.html:175
msgid "Author"
msgstr "Auteur/autrice"
@@ -3091,10 +3119,6 @@ msgstr "Contactez votre administrateur·ice ou user@example.com) :"
+
+#: bookwyrm/templates/preferences/alias_user.html:30
+#: bookwyrm/templates/preferences/move_user.html:35
+msgid "Confirm your password:"
+msgstr "Confirmez votre mot de passe :"
+
+#: bookwyrm/templates/preferences/alias_user.html:39
+#: bookwyrm/templates/preferences/layout.html:28
+msgid "Aliases"
+msgstr "Alias de redirection"
+
+#: bookwyrm/templates/preferences/alias_user.html:49
+msgid "Remove alias"
+msgstr "Supprimer l'alias de redirection"
+
#: bookwyrm/templates/preferences/blocks.html:4
#: bookwyrm/templates/preferences/blocks.html:7
-#: bookwyrm/templates/preferences/layout.html:46
+#: bookwyrm/templates/preferences/layout.html:54
msgid "Blocked Users"
msgstr "Comptes bloqués"
@@ -4036,7 +4137,7 @@ msgstr "Nouveau mot de passe :"
#: bookwyrm/templates/preferences/delete_user.html:4
#: bookwyrm/templates/preferences/delete_user.html:7
#: bookwyrm/templates/preferences/delete_user.html:40
-#: bookwyrm/templates/preferences/layout.html:28
+#: bookwyrm/templates/preferences/layout.html:36
#: bookwyrm/templates/settings/users/delete_user_form.html:22
msgid "Delete Account"
msgstr "Supprimer le compte"
@@ -4081,7 +4182,7 @@ msgstr "Modifier le profil"
#: bookwyrm/templates/preferences/edit_user.html:12
#: bookwyrm/templates/preferences/edit_user.html:25
-#: bookwyrm/templates/settings/users/user_info.html:7
+#: bookwyrm/templates/settings/users/user_info.html:8
#: bookwyrm/templates/user_menu.html:29
msgid "Profile"
msgstr "Profil"
@@ -4158,18 +4259,46 @@ msgstr "Télécharger le fichier"
msgid "Account"
msgstr "Compte"
-#: bookwyrm/templates/preferences/layout.html:31
+#: bookwyrm/templates/preferences/layout.html:32
+msgid "Move Account"
+msgstr "Migrer le compte"
+
+#: bookwyrm/templates/preferences/layout.html:39
msgid "Data"
msgstr "Données"
-#: bookwyrm/templates/preferences/layout.html:39
+#: bookwyrm/templates/preferences/layout.html:47
msgid "CSV export"
msgstr "Export CSV"
-#: bookwyrm/templates/preferences/layout.html:42
+#: bookwyrm/templates/preferences/layout.html:50
msgid "Relationships"
msgstr "Relations"
+#: bookwyrm/templates/preferences/move_user.html:12
+msgid "Migrate account to another server"
+msgstr "Migrer ce compte vers une autre instance"
+
+#: bookwyrm/templates/preferences/move_user.html:16
+msgid "Moving your account will notify all your followers and direct them to follow the new account."
+msgstr "Migrer ce compte notifiera tou·te·s vos abonné·e·s et les redirigera vers votre nouveau compte."
+
+#: bookwyrm/templates/preferences/move_user.html:19
+#, python-format
+msgid "\n"
+" %(user)s will be marked as moved and will not be discoverable or usable unless you undo the move.\n"
+" "
+msgstr "\n"
+"L'utilisateur %(user)s sera marqué comme migré et ne sera plus découvrable ou utilisable, à moins que vous n'annuliez la migration. "
+
+#: bookwyrm/templates/preferences/move_user.html:25
+msgid "Remember to add this user as an alias of the target account before you try to move."
+msgstr "Pensez à déclarer cet utilisateur comme alias du compte cible avant d'initier la migration."
+
+#: bookwyrm/templates/preferences/move_user.html:30
+msgid "Enter the username for the account you want to move to e.g. user@example.com :"
+msgstr "Entrez le nom d'utilisateur du compte que vous souhaitez faire migrer (ex. : user@example.com) :"
+
#: bookwyrm/templates/reading_progress/finish.html:5
#, python-format
msgid "Finish \"%(book_title)s\""
@@ -4575,23 +4704,23 @@ msgstr "Queues"
#: bookwyrm/templates/settings/celery.html:26
msgid "Streams"
-msgstr ""
+msgstr "Flux"
#: bookwyrm/templates/settings/celery.html:32
-msgid "Broadcasts"
+msgid "Broadcast"
msgstr "Diffusion"
#: bookwyrm/templates/settings/celery.html:38
msgid "Inbox"
-msgstr ""
+msgstr "Boîte de réception"
#: bookwyrm/templates/settings/celery.html:51
msgid "Import triggered"
-msgstr ""
+msgstr "Import déclenché"
#: bookwyrm/templates/settings/celery.html:57
msgid "Connectors"
-msgstr ""
+msgstr "Connecteurs"
#: bookwyrm/templates/settings/celery.html:64
#: bookwyrm/templates/settings/site.html:91
@@ -4600,7 +4729,7 @@ msgstr "Images"
#: bookwyrm/templates/settings/celery.html:70
msgid "Suggested Users"
-msgstr ""
+msgstr "Comptes suggérés"
#: bookwyrm/templates/settings/celery.html:83
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:43
@@ -4610,7 +4739,7 @@ msgstr "Email"
#: bookwyrm/templates/settings/celery.html:89
msgid "Misc"
-msgstr ""
+msgstr "Divers"
#: bookwyrm/templates/settings/celery.html:96
msgid "Low priority"
@@ -4929,7 +5058,7 @@ msgid "Details"
msgstr "Détails"
#: bookwyrm/templates/settings/federation/instance.html:53
-#: bookwyrm/templates/user/layout.html:69
+#: bookwyrm/templates/user/layout.html:79
msgid "Activity"
msgstr "Activité"
@@ -5117,7 +5246,7 @@ msgstr "Demandes d’invitation"
#: bookwyrm/templates/settings/invites/manage_invites.html:3
#: bookwyrm/templates/settings/invites/manage_invites.html:15
#: bookwyrm/templates/settings/layout.html:42
-#: bookwyrm/templates/user_menu.html:60
+#: bookwyrm/templates/user_menu.html:55
msgid "Invites"
msgstr "Invitations"
@@ -5424,22 +5553,22 @@ msgstr "Liens signalés"
#: bookwyrm/templates/settings/reports/report.html:66
msgid "Moderation Activity"
-msgstr ""
+msgstr "Activité de la modération"
#: bookwyrm/templates/settings/reports/report.html:73
#, python-format
msgid "%(user)s opened this report"
-msgstr ""
+msgstr "%(user)s a ouvert ce signalement"
#: bookwyrm/templates/settings/reports/report.html:86
#, python-format
msgid "%(user)s commented on this report:"
-msgstr ""
+msgstr "%(user)s a commenté ce signalement :"
#: bookwyrm/templates/settings/reports/report.html:90
#, python-format
msgid "%(user)s took an action on this report:"
-msgstr ""
+msgstr "%(user)s a traité ce signalement :"
#: bookwyrm/templates/settings/reports/report_header.html:6
#, python-format
@@ -5463,7 +5592,7 @@ msgstr "Signalement #%(report_id)s : compte @%(username)s"
#: bookwyrm/templates/settings/reports/report_links_table.html:19
msgid "Approve domain"
-msgstr ""
+msgstr "Approuver le domaine"
#: bookwyrm/templates/settings/reports/report_links_table.html:26
msgid "Block domain"
@@ -5591,57 +5720,73 @@ msgid "Set instance default theme"
msgstr "Définir le thème par défaut de l'instance"
#: bookwyrm/templates/settings/themes.html:19
+msgid "One of your themes appears to be broken. Selecting this theme will make the application unusable."
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:28
msgid "Successfully added theme"
msgstr "Thème ajouté avec succès"
-#: bookwyrm/templates/settings/themes.html:26
+#: bookwyrm/templates/settings/themes.html:35
msgid "How to add a theme"
msgstr "Comment ajouter un thème"
-#: bookwyrm/templates/settings/themes.html:29
+#: bookwyrm/templates/settings/themes.html:38
msgid "Copy the theme file into the bookwyrm/static/css/themes
directory on your server from the command line."
msgstr "Copiez le fichier de thème dans le répertoire bookwyrm/static/css/themes
de votre serveur depuis la ligne de commande."
-#: bookwyrm/templates/settings/themes.html:32
+#: bookwyrm/templates/settings/themes.html:41
msgid "Run ./bw-dev compile_themes
and ./bw-dev collectstatic
."
msgstr "Exécutez ./bw-dev compile_themes
et ./bw-dev collectstatic
."
-#: bookwyrm/templates/settings/themes.html:35
+#: bookwyrm/templates/settings/themes.html:44
msgid "Add the file name using the form below to make it available in the application interface."
msgstr "Ajoutez le nom du fichier à l'aide du formulaire ci-dessous pour le rendre disponible dans l'interface de l'application."
-#: bookwyrm/templates/settings/themes.html:42
-#: bookwyrm/templates/settings/themes.html:82
+#: bookwyrm/templates/settings/themes.html:51
+#: bookwyrm/templates/settings/themes.html:91
msgid "Add theme"
msgstr "Ajouter un thème"
-#: bookwyrm/templates/settings/themes.html:48
+#: bookwyrm/templates/settings/themes.html:57
msgid "Unable to save theme"
msgstr "Impossible d’enregistrer le thème"
-#: bookwyrm/templates/settings/themes.html:63
-#: bookwyrm/templates/settings/themes.html:93
+#: bookwyrm/templates/settings/themes.html:72
+#: bookwyrm/templates/settings/themes.html:102
msgid "Theme name"
msgstr "Nom du thème"
-#: bookwyrm/templates/settings/themes.html:73
+#: bookwyrm/templates/settings/themes.html:82
msgid "Theme filename"
msgstr "Nom de fichier du thème"
-#: bookwyrm/templates/settings/themes.html:88
+#: bookwyrm/templates/settings/themes.html:97
msgid "Available Themes"
msgstr "Thèmes disponibles"
-#: bookwyrm/templates/settings/themes.html:96
+#: bookwyrm/templates/settings/themes.html:105
msgid "File"
msgstr "Fichier"
-#: bookwyrm/templates/settings/themes.html:111
+#: bookwyrm/templates/settings/themes.html:123
msgid "Remove theme"
msgstr "Supprimer le thème"
+#: bookwyrm/templates/settings/themes.html:134
+msgid "Test theme"
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:143
+msgid "Broken theme"
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:152
+msgid "Loaded successfully"
+msgstr ""
+
#: bookwyrm/templates/settings/users/delete_user_form.html:5
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:38
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:52
msgid "Permanently delete user"
msgstr "Supprimer définitivement l'utilisateur"
@@ -5680,25 +5825,20 @@ msgstr "Dernière activité"
msgid "Remote instance"
msgstr "Instance distante"
-#: bookwyrm/templates/settings/users/user_admin.html:86
-msgid "Deleted"
-msgstr "Supprimé"
-
-#: bookwyrm/templates/settings/users/user_admin.html:92
-#: bookwyrm/templates/settings/users/user_info.html:32
-msgid "Inactive"
-msgstr "Inactif"
-
-#: bookwyrm/templates/settings/users/user_admin.html:101
+#: bookwyrm/templates/settings/users/user_admin.html:84
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr "Non défini"
-#: bookwyrm/templates/settings/users/user_info.html:16
+#: bookwyrm/templates/settings/users/user_info.html:20
+msgid "This account is the instance actor for signing HTTP requests."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_info.html:24
msgid "View user profile"
msgstr "Voir le profil"
-#: bookwyrm/templates/settings/users/user_info.html:19
+#: bookwyrm/templates/settings/users/user_info.html:30
msgid "Go to user admin"
msgstr "Accéder à l’admininstration des comptes"
@@ -5754,27 +5894,39 @@ msgstr "Détails de l’instance"
msgid "View instance"
msgstr "Voir l’instance"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:5
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:6
msgid "Permanently deleted"
msgstr "Supprimé définitivement"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:8
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:9
msgid "User Actions"
msgstr "Actions de l'utilisateur"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:21
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:15
+msgid "This is the instance admin actor"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:18
+msgid "You must not delete or disable this account as it is critical to the functioning of your server. This actor signs outgoing GET requests to smooth interaction with secure ActivityPub servers."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:19
+msgid "This account is not discoverable by ordinary users and does not have a profile page."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:35
msgid "Activate user"
msgstr "Activer le compte"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:27
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:41
msgid "Suspend user"
msgstr "Suspendre le compte"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:32
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:46
msgid "Un-suspend user"
msgstr "Rétablir le compte"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:54
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:68
msgid "Access level:"
msgstr "Niveau d’accès :"
@@ -5830,7 +5982,7 @@ msgstr "Votre domaine semble être mal configuré. Il ne doit pas inclure de pro
msgid "You are running BookWyrm in production mode without https. USE_HTTPS should be enabled in production."
msgstr "Vous utilisez BookWyrm en mode production sans https. USE_HTTPS doit être activé en production."
-#: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:49
+#: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:44
msgid "Settings"
msgstr "Paramètres"
@@ -5887,7 +6039,7 @@ msgid "Need help?"
msgstr "Besoin d’aide ?"
#: bookwyrm/templates/shelf/create_shelf_form.html:5
-#: bookwyrm/templates/shelf/shelf.html:72
+#: bookwyrm/templates/shelf/shelf.html:74
msgid "Create shelf"
msgstr "Créer une étagère"
@@ -5895,58 +6047,58 @@ msgstr "Créer une étagère"
msgid "Edit Shelf"
msgstr "Modifier l’étagère"
-#: bookwyrm/templates/shelf/shelf.html:24
+#: bookwyrm/templates/shelf/shelf.html:26
#: bookwyrm/templates/user/relationships/followers.html:18
#: bookwyrm/templates/user/relationships/following.html:18
msgid "User profile"
msgstr "Profil utilisateur·rice"
-#: bookwyrm/templates/shelf/shelf.html:39
+#: bookwyrm/templates/shelf/shelf.html:41
#: bookwyrm/templatetags/shelf_tags.py:13 bookwyrm/views/shelf/shelf.py:53
msgid "All books"
msgstr "Tous les livres"
-#: bookwyrm/templates/shelf/shelf.html:97
+#: bookwyrm/templates/shelf/shelf.html:99
#, 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:104
+#: bookwyrm/templates/shelf/shelf.html:106
#, python-format
msgid "(showing %(start)s-%(end)s)"
msgstr "(affichage de %(start)s-%(end)s)"
-#: bookwyrm/templates/shelf/shelf.html:116
+#: bookwyrm/templates/shelf/shelf.html:118
msgid "Edit shelf"
msgstr "Modifier l’étagère"
-#: bookwyrm/templates/shelf/shelf.html:124
+#: bookwyrm/templates/shelf/shelf.html:126
msgid "Delete shelf"
msgstr "Supprimer l’étagère"
-#: bookwyrm/templates/shelf/shelf.html:152
-#: bookwyrm/templates/shelf/shelf.html:178
+#: bookwyrm/templates/shelf/shelf.html:154
+#: bookwyrm/templates/shelf/shelf.html:180
msgid "Shelved"
msgstr "Date d’ajout"
-#: bookwyrm/templates/shelf/shelf.html:153
-#: bookwyrm/templates/shelf/shelf.html:181
+#: bookwyrm/templates/shelf/shelf.html:155
+#: bookwyrm/templates/shelf/shelf.html:183
msgid "Started"
msgstr "Commencé"
-#: bookwyrm/templates/shelf/shelf.html:154
-#: bookwyrm/templates/shelf/shelf.html:184
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
msgid "Finished"
msgstr "Terminé"
-#: bookwyrm/templates/shelf/shelf.html:154
-#: bookwyrm/templates/shelf/shelf.html:184
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
msgid "Until"
msgstr "Jusqu’à"
-#: bookwyrm/templates/shelf/shelf.html:210
+#: bookwyrm/templates/shelf/shelf.html:212
msgid "This shelf is empty."
msgstr "Cette étagère est vide"
@@ -6053,7 +6205,7 @@ msgstr "Commentaire :"
#: bookwyrm/templates/snippets/create_status/post_options_block.html:19
msgid "Update"
-msgstr ""
+msgstr "Mettre à jour"
#: bookwyrm/templates/snippets/create_status/post_options_block.html:21
msgid "Post"
@@ -6252,6 +6404,15 @@ msgstr "Vous avez lu %(read_count)s livres sur %(goal_count
msgid "%(username)s has read %(read_count)s of %(goal_count)s books."
msgstr "%(username)s a lu %(read_count)s sur %(goal_count)s livres."
+#: bookwyrm/templates/snippets/move_user_buttons.html:10
+msgid "Follow at new account"
+msgstr "Suivre le nouveau compte"
+
+#: bookwyrm/templates/snippets/moved_user_notice.html:7
+#, python-format
+msgid "%(user)s has moved to %(moved_to_name)s"
+msgstr ""
+
#: bookwyrm/templates/snippets/page_text.html:8
#, python-format
msgid "page %(page)s of %(total_pages)s"
@@ -6393,35 +6554,35 @@ msgstr "Interrompre la lecture"
msgid "Finish reading"
msgstr "Terminer la lecture"
-#: bookwyrm/templates/snippets/status/content_status.html:80
+#: bookwyrm/templates/snippets/status/content_status.html:69
msgid "Show status"
msgstr "Afficher le statut"
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "(Page %(page)s"
msgstr "(Page %(page)s"
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "%(endpage)s"
msgstr "%(endpage)s"
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid "(%(percent)s%%"
msgstr "(%(percent)s%%"
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid " - %(endpercent)s%%"
msgstr " - %(endpercent)s%%"
-#: bookwyrm/templates/snippets/status/content_status.html:127
+#: bookwyrm/templates/snippets/status/content_status.html:116
msgid "Open image in new window"
msgstr "Ouvrir l’image dans une nouvelle fenêtre"
-#: bookwyrm/templates/snippets/status/content_status.html:148
+#: bookwyrm/templates/snippets/status/content_status.html:137
msgid "Hide status"
msgstr "Masquer le statut"
@@ -6554,6 +6715,18 @@ msgstr "Déplier"
msgid "Show less"
msgstr "Replier"
+#: bookwyrm/templates/snippets/user_active_tag.html:5
+msgid "Moved"
+msgstr "Déménagé"
+
+#: bookwyrm/templates/snippets/user_active_tag.html:12
+msgid "Deleted"
+msgstr "Supprimé"
+
+#: bookwyrm/templates/snippets/user_active_tag.html:15
+msgid "Inactive"
+msgstr "Inactif"
+
#: bookwyrm/templates/two_factor_auth/two_factor_login.html:29
msgid "2FA check"
msgstr "Vérification 2FA"
@@ -6612,11 +6785,11 @@ msgstr "Vos Groupes"
msgid "Groups: %(username)s"
msgstr "Groupes : %(username)s"
-#: bookwyrm/templates/user/layout.html:50
+#: bookwyrm/templates/user/layout.html:59
msgid "Follow Requests"
msgstr "Demandes d’abonnement"
-#: bookwyrm/templates/user/layout.html:73
+#: bookwyrm/templates/user/layout.html:83
#: bookwyrm/templates/user/reviews_comments.html:6
#: bookwyrm/templates/user/reviews_comments.html:12
msgid "Reviews and Comments"
@@ -6631,7 +6804,13 @@ msgstr "Listes : %(username)s"
msgid "Create list"
msgstr "Créer une liste"
-#: bookwyrm/templates/user/relationships/followers.html:31
+#: bookwyrm/templates/user/moved.html:25
+#: bookwyrm/templates/user/user_preview.html:22
+#, python-format
+msgid "Joined %(date)s"
+msgstr "A rejoint ce serveur %(date)s"
+
+#: bookwyrm/templates/user/relationships/followers.html:36
#, python-format
msgid "%(username)s has no followers"
msgstr "%(username)s n’a pas d’abonné(e)"
@@ -6702,17 +6881,12 @@ msgstr "Seulement les commentaires"
msgid "No activities yet!"
msgstr "Aucune activité pour l’instant !"
-#: bookwyrm/templates/user/user_preview.html:22
-#, python-format
-msgid "Joined %(date)s"
-msgstr "A rejoint ce serveur %(date)s"
-
#: bookwyrm/templates/user/user_preview.html:26
#, python-format
msgid "%(display_count)s follower"
msgid_plural "%(display_count)s followers"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%(display_count)s abonné⋅e"
+msgstr[1] "%(display_count)s abonné⋅es"
#: bookwyrm/templates/user/user_preview.html:31
#, python-format
@@ -6734,10 +6908,6 @@ msgstr "Aucun·e abonné·e que vous suivez"
msgid "View profile and more"
msgstr "Voir le profil et plus"
-#: bookwyrm/templates/user_menu.html:82
-msgid "Log out"
-msgstr "Se déconnecter"
-
#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:28
msgid "File exceeds maximum size: 10MB"
msgstr "Ce fichier dépasse la taille limite : 10 Mo"
@@ -6754,7 +6924,7 @@ msgid_plural "%(num)d books - by %(user)s"
msgstr[0] "%(num)d livre - par %(user)s"
msgstr[1] "%(num)d livres - par %(user)s"
-#: bookwyrm/templatetags/utilities.py:39
+#: bookwyrm/templatetags/utilities.py:49
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s (%(subtitle)s)"
diff --git a/locale/gl_ES/LC_MESSAGES/django.mo b/locale/gl_ES/LC_MESSAGES/django.mo
index 30542ace1..132cd9584 100644
Binary files a/locale/gl_ES/LC_MESSAGES/django.mo and b/locale/gl_ES/LC_MESSAGES/django.mo differ
diff --git a/locale/gl_ES/LC_MESSAGES/django.po b/locale/gl_ES/LC_MESSAGES/django.po
index 37edcfee9..0212c0acd 100644
--- a/locale/gl_ES/LC_MESSAGES/django.po
+++ b/locale/gl_ES/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-27 01:11+0000\n"
-"PO-Revision-Date: 2023-09-28 04:25\n"
+"POT-Creation-Date: 2023-12-30 23:52+0000\n"
+"PO-Revision-Date: 2024-01-02 03:11\n"
"Last-Translator: Mouse Reeve %(level)s
."
+msgstr ""
+
+#: bookwyrm/templates/403.html:15
+msgid "If you think you should have access, please speak to your BookWyrm server administrator."
+msgstr ""
+
#: bookwyrm/templates/404.html:4 bookwyrm/templates/404.html:8
msgid "Not Found"
msgstr "Non se atopa"
@@ -476,6 +496,20 @@ msgstr "Non se atopa"
msgid "The page you requested doesn't seem to exist!"
msgstr "Parece que non existe a páxina solicitada!"
+#: bookwyrm/templates/413.html:4 bookwyrm/templates/413.html:8
+msgid "File too large"
+msgstr ""
+
+#: bookwyrm/templates/413.html:9
+msgid "The file you are uploading is too large."
+msgstr ""
+
+#: bookwyrm/templates/413.html:11
+msgid "\n"
+" You you can try using a smaller file, or ask your BookWyrm server administrator to increase the DATA_UPLOAD_MAX_MEMORY_SIZE
setting.\n"
+" "
+msgstr ""
+
#: bookwyrm/templates/500.html:4
msgid "Oops!"
msgstr "Vaite!"
@@ -497,7 +531,7 @@ msgstr "Acerca de"
#: bookwyrm/templates/get_started/layout.html:22
#, python-format
msgid "Welcome to %(site_name)s!"
-msgstr "Sexas ben vida a %(site_name)s!"
+msgstr "Recibe a benvida a %(site_name)s!"
#: bookwyrm/templates/about/about.html:25
#, python-format
@@ -536,12 +570,12 @@ msgstr "A moderación e administración de %(site_name)s coidan e xestionan o si
msgid "Moderator"
msgstr "Moderación"
-#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:67
+#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:62
msgid "Admin"
msgstr "Admin"
#: bookwyrm/templates/about/about.html:140
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:28
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
msgid "Send direct message"
@@ -575,7 +609,7 @@ msgid "Software version:"
msgstr "Versión do software:"
#: bookwyrm/templates/about/layout.html:30
-#: bookwyrm/templates/embed-layout.html:33
+#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/snippets/footer.html:8
#, python-format
msgid "About %(site_name)s"
@@ -680,7 +714,7 @@ msgstr "A lectura máis curta deste ano…"
#: bookwyrm/templates/annual_summary/layout.html:157
#: bookwyrm/templates/annual_summary/layout.html:178
#: bookwyrm/templates/annual_summary/layout.html:247
-#: bookwyrm/templates/book/book.html:63
+#: bookwyrm/templates/book/book.html:65
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
@@ -701,8 +735,8 @@ msgstr "…e a máis longa"
#, python-format
msgid "%(display_name)s set a goal of reading %(goal)s book in %(year)s,bookwyrm/static/css/themes
directory on your server from the command line."
msgstr "Copia il file del tema nella directory bookwyrm/static/css/themes
sul tuo server dalla riga di comando."
-#: bookwyrm/templates/settings/themes.html:32
+#: bookwyrm/templates/settings/themes.html:41
msgid "Run ./bw-dev compile_themes
and ./bw-dev collectstatic
."
msgstr "Esegui ./bw-dev compile_themes
e ./bw-dev collectstatic
."
-#: bookwyrm/templates/settings/themes.html:35
+#: bookwyrm/templates/settings/themes.html:44
msgid "Add the file name using the form below to make it available in the application interface."
msgstr "Aggiungere il nome del file utilizzando il modulo sottostante per renderlo disponibile nell'interfaccia dell'applicazione."
-#: bookwyrm/templates/settings/themes.html:42
-#: bookwyrm/templates/settings/themes.html:82
+#: bookwyrm/templates/settings/themes.html:51
+#: bookwyrm/templates/settings/themes.html:91
msgid "Add theme"
msgstr "Aggiungi tema"
-#: bookwyrm/templates/settings/themes.html:48
+#: bookwyrm/templates/settings/themes.html:57
msgid "Unable to save theme"
msgstr "Impossibile salvare il tema"
-#: bookwyrm/templates/settings/themes.html:63
-#: bookwyrm/templates/settings/themes.html:93
+#: bookwyrm/templates/settings/themes.html:72
+#: bookwyrm/templates/settings/themes.html:102
msgid "Theme name"
msgstr "Nome tema"
-#: bookwyrm/templates/settings/themes.html:73
+#: bookwyrm/templates/settings/themes.html:82
msgid "Theme filename"
msgstr "Nome file del tema"
-#: bookwyrm/templates/settings/themes.html:88
+#: bookwyrm/templates/settings/themes.html:97
msgid "Available Themes"
msgstr "Temi disponibili"
-#: bookwyrm/templates/settings/themes.html:96
+#: bookwyrm/templates/settings/themes.html:105
msgid "File"
msgstr "File"
-#: bookwyrm/templates/settings/themes.html:111
+#: bookwyrm/templates/settings/themes.html:123
msgid "Remove theme"
msgstr "Rimuovi tema"
+#: bookwyrm/templates/settings/themes.html:134
+msgid "Test theme"
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:143
+msgid "Broken theme"
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:152
+msgid "Loaded successfully"
+msgstr ""
+
#: bookwyrm/templates/settings/users/delete_user_form.html:5
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:38
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:52
msgid "Permanently delete user"
msgstr "Elimina definitivamente utente"
@@ -5680,25 +5826,20 @@ msgstr "Attivo l'ultima volta"
msgid "Remote instance"
msgstr "Istanza remota"
-#: bookwyrm/templates/settings/users/user_admin.html:86
-msgid "Deleted"
-msgstr "Elimina"
-
-#: bookwyrm/templates/settings/users/user_admin.html:92
-#: bookwyrm/templates/settings/users/user_info.html:32
-msgid "Inactive"
-msgstr "Inattivo"
-
-#: bookwyrm/templates/settings/users/user_admin.html:101
+#: bookwyrm/templates/settings/users/user_admin.html:84
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr "Non impostato"
-#: bookwyrm/templates/settings/users/user_info.html:16
+#: bookwyrm/templates/settings/users/user_info.html:20
+msgid "This account is the instance actor for signing HTTP requests."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_info.html:24
msgid "View user profile"
msgstr "Visualizza il profilo dell'utente"
-#: bookwyrm/templates/settings/users/user_info.html:19
+#: bookwyrm/templates/settings/users/user_info.html:30
msgid "Go to user admin"
msgstr "Vai ad amministratore utente"
@@ -5754,27 +5895,39 @@ msgstr "Dettagli dell'istanza"
msgid "View instance"
msgstr "Visualizza istanza"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:5
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:6
msgid "Permanently deleted"
msgstr "Elimina definitivamente"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:8
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:9
msgid "User Actions"
msgstr "Azioni dell'utente"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:21
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:15
+msgid "This is the instance admin actor"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:18
+msgid "You must not delete or disable this account as it is critical to the functioning of your server. This actor signs outgoing GET requests to smooth interaction with secure ActivityPub servers."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:19
+msgid "This account is not discoverable by ordinary users and does not have a profile page."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:35
msgid "Activate user"
msgstr "Attiva utente"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:27
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:41
msgid "Suspend user"
msgstr "Sospendere utente"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:32
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:46
msgid "Un-suspend user"
msgstr "Annulla sospensione utente"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:54
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:68
msgid "Access level:"
msgstr "Livello di accesso:"
@@ -5830,7 +5983,7 @@ msgstr "Il tuo dominio sembra essere mal configurato. Non dovrebbe includere pro
msgid "You are running BookWyrm in production mode without https. USE_HTTPS should be enabled in production."
msgstr "Stai eseguendo BookWyrm in modalità di produzione senza https. USE_HTTPS dovrebbe essere abilitato in produzione."
-#: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:49
+#: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:44
msgid "Settings"
msgstr "Impostazioni"
@@ -5887,7 +6040,7 @@ msgid "Need help?"
msgstr "Hai bisogno di aiuto?"
#: bookwyrm/templates/shelf/create_shelf_form.html:5
-#: bookwyrm/templates/shelf/shelf.html:72
+#: bookwyrm/templates/shelf/shelf.html:74
msgid "Create shelf"
msgstr "Crea scaffale"
@@ -5895,58 +6048,58 @@ msgstr "Crea scaffale"
msgid "Edit Shelf"
msgstr "Modifica Scaffale"
-#: bookwyrm/templates/shelf/shelf.html:24
+#: bookwyrm/templates/shelf/shelf.html:26
#: bookwyrm/templates/user/relationships/followers.html:18
#: bookwyrm/templates/user/relationships/following.html:18
msgid "User profile"
msgstr "Profilo utente"
-#: bookwyrm/templates/shelf/shelf.html:39
+#: bookwyrm/templates/shelf/shelf.html:41
#: bookwyrm/templatetags/shelf_tags.py:13 bookwyrm/views/shelf/shelf.py:53
msgid "All books"
msgstr "Tutti i libri"
-#: bookwyrm/templates/shelf/shelf.html:97
+#: bookwyrm/templates/shelf/shelf.html:99
#, python-format
msgid "%(formatted_count)s book"
msgid_plural "%(formatted_count)s books"
msgstr[0] "%(formatted_count)s libro"
msgstr[1] "%(formatted_count)s libri"
-#: bookwyrm/templates/shelf/shelf.html:104
+#: bookwyrm/templates/shelf/shelf.html:106
#, python-format
msgid "(showing %(start)s-%(end)s)"
msgstr "(mostra %(start)s-%(end)s)"
-#: bookwyrm/templates/shelf/shelf.html:116
+#: bookwyrm/templates/shelf/shelf.html:118
msgid "Edit shelf"
msgstr "Modifica scaffale"
-#: bookwyrm/templates/shelf/shelf.html:124
+#: bookwyrm/templates/shelf/shelf.html:126
msgid "Delete shelf"
msgstr "Elimina scaffale"
-#: bookwyrm/templates/shelf/shelf.html:152
-#: bookwyrm/templates/shelf/shelf.html:178
+#: bookwyrm/templates/shelf/shelf.html:154
+#: bookwyrm/templates/shelf/shelf.html:180
msgid "Shelved"
msgstr "Scaffali"
-#: bookwyrm/templates/shelf/shelf.html:153
-#: bookwyrm/templates/shelf/shelf.html:181
+#: bookwyrm/templates/shelf/shelf.html:155
+#: bookwyrm/templates/shelf/shelf.html:183
msgid "Started"
msgstr "Iniziato"
-#: bookwyrm/templates/shelf/shelf.html:154
-#: bookwyrm/templates/shelf/shelf.html:184
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
msgid "Finished"
msgstr "Completato"
-#: bookwyrm/templates/shelf/shelf.html:154
-#: bookwyrm/templates/shelf/shelf.html:184
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
msgid "Until"
msgstr "Finito"
-#: bookwyrm/templates/shelf/shelf.html:210
+#: bookwyrm/templates/shelf/shelf.html:212
msgid "This shelf is empty."
msgstr "Questo scaffale è vuoto."
@@ -6252,6 +6405,15 @@ msgstr "Hai letto %(read_count)s di %(goal_count)s libri%(read_count)s of %(goal_count)s books."
msgstr "%(username)s ha letto %(read_count)s di %(goal_count)s libri."
+#: bookwyrm/templates/snippets/move_user_buttons.html:10
+msgid "Follow at new account"
+msgstr "Segui sul nuovo account"
+
+#: bookwyrm/templates/snippets/moved_user_notice.html:7
+#, python-format
+msgid "%(user)s has moved to %(moved_to_name)s"
+msgstr ""
+
#: bookwyrm/templates/snippets/page_text.html:8
#, python-format
msgid "page %(page)s of %(total_pages)s"
@@ -6393,35 +6555,35 @@ msgstr "Interrompi la lettura"
msgid "Finish reading"
msgstr "Finito di leggere"
-#: bookwyrm/templates/snippets/status/content_status.html:80
+#: bookwyrm/templates/snippets/status/content_status.html:69
msgid "Show status"
msgstr "Mostra stato"
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "(Page %(page)s"
msgstr "(Pagina %(page)s"
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "%(endpage)s"
msgstr "%(endpage)s"
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid "(%(percent)s%%"
msgstr "(%(percent)s%%"
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid " - %(endpercent)s%%"
msgstr " - %(endpercent)s%%"
-#: bookwyrm/templates/snippets/status/content_status.html:127
+#: bookwyrm/templates/snippets/status/content_status.html:116
msgid "Open image in new window"
msgstr "Apri immagine in una nuova finestra"
-#: bookwyrm/templates/snippets/status/content_status.html:148
+#: bookwyrm/templates/snippets/status/content_status.html:137
msgid "Hide status"
msgstr "Nascondi lo stato"
@@ -6554,6 +6716,18 @@ msgstr "Mostra di più"
msgid "Show less"
msgstr "Mostra meno"
+#: bookwyrm/templates/snippets/user_active_tag.html:5
+msgid "Moved"
+msgstr "Trasferito"
+
+#: bookwyrm/templates/snippets/user_active_tag.html:12
+msgid "Deleted"
+msgstr "Elimina"
+
+#: bookwyrm/templates/snippets/user_active_tag.html:15
+msgid "Inactive"
+msgstr "Inattivo"
+
#: bookwyrm/templates/two_factor_auth/two_factor_login.html:29
msgid "2FA check"
msgstr "Verifica 2FA"
@@ -6612,11 +6786,11 @@ msgstr "I tuoi gruppi"
msgid "Groups: %(username)s"
msgstr "Gruppi: %(username)s"
-#: bookwyrm/templates/user/layout.html:50
+#: bookwyrm/templates/user/layout.html:59
msgid "Follow Requests"
msgstr "Richieste di seguirti"
-#: bookwyrm/templates/user/layout.html:73
+#: bookwyrm/templates/user/layout.html:83
#: bookwyrm/templates/user/reviews_comments.html:6
#: bookwyrm/templates/user/reviews_comments.html:12
msgid "Reviews and Comments"
@@ -6631,7 +6805,13 @@ msgstr "Liste: %(username)s"
msgid "Create list"
msgstr "Crea lista"
-#: bookwyrm/templates/user/relationships/followers.html:31
+#: bookwyrm/templates/user/moved.html:25
+#: bookwyrm/templates/user/user_preview.html:22
+#, python-format
+msgid "Joined %(date)s"
+msgstr "Registrato %(date)s"
+
+#: bookwyrm/templates/user/relationships/followers.html:36
#, python-format
msgid "%(username)s has no followers"
msgstr "%(username)s non ha followers"
@@ -6702,11 +6882,6 @@ msgstr "Solo commenti"
msgid "No activities yet!"
msgstr "Ancora nessuna attività!"
-#: bookwyrm/templates/user/user_preview.html:22
-#, python-format
-msgid "Joined %(date)s"
-msgstr "Registrato %(date)s"
-
#: bookwyrm/templates/user/user_preview.html:26
#, python-format
msgid "%(display_count)s follower"
@@ -6734,10 +6909,6 @@ msgstr "Nessun follower che segui"
msgid "View profile and more"
msgstr "Visualizza profilo e altro"
-#: bookwyrm/templates/user_menu.html:82
-msgid "Log out"
-msgstr "Esci"
-
#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:28
msgid "File exceeds maximum size: 10MB"
msgstr "Il file supera la dimensione massima: 10MB"
@@ -6754,7 +6925,7 @@ msgid_plural "%(num)d books - by %(user)s"
msgstr[0] ""
msgstr[1] "%(num)d libri - di %(user)s"
-#: bookwyrm/templatetags/utilities.py:39
+#: bookwyrm/templatetags/utilities.py:49
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"
diff --git a/locale/lt_LT/LC_MESSAGES/django.mo b/locale/lt_LT/LC_MESSAGES/django.mo
index 9f002fe1b..1a92d92fe 100644
Binary files a/locale/lt_LT/LC_MESSAGES/django.mo 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
index c86bd8fc8..2b37a592e 100644
--- a/locale/lt_LT/LC_MESSAGES/django.po
+++ b/locale/lt_LT/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-27 01:11+0000\n"
-"PO-Revision-Date: 2023-09-28 00:08\n"
+"POT-Creation-Date: 2023-12-30 23:52+0000\n"
+"PO-Revision-Date: 2024-01-02 03:12\n"
"Last-Translator: Mouse Reeve %(level)s
."
+msgstr ""
+
+#: bookwyrm/templates/403.html:15
+msgid "If you think you should have access, please speak to your BookWyrm server administrator."
+msgstr ""
+
#: bookwyrm/templates/404.html:4 bookwyrm/templates/404.html:8
msgid "Not Found"
msgstr "Nerasta"
@@ -476,6 +496,20 @@ msgstr "Nerasta"
msgid "The page you requested doesn't seem to exist!"
msgstr "Jūsų ieškomas puslapis neegzistuoja."
+#: bookwyrm/templates/413.html:4 bookwyrm/templates/413.html:8
+msgid "File too large"
+msgstr ""
+
+#: bookwyrm/templates/413.html:9
+msgid "The file you are uploading is too large."
+msgstr ""
+
+#: bookwyrm/templates/413.html:11
+msgid "\n"
+" You you can try using a smaller file, or ask your BookWyrm server administrator to increase the DATA_UPLOAD_MAX_MEMORY_SIZE
setting.\n"
+" "
+msgstr ""
+
#: bookwyrm/templates/500.html:4
msgid "Oops!"
msgstr "Oi!"
@@ -536,12 +570,12 @@ msgstr "Svetainės %(site_name)s moderatoriai ir administratoriai nuolat atnauji
msgid "Moderator"
msgstr "Moderatorius"
-#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:67
+#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:62
msgid "Admin"
msgstr "Administravimas"
#: bookwyrm/templates/about/about.html:140
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:28
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
msgid "Send direct message"
@@ -575,7 +609,7 @@ msgid "Software version:"
msgstr "Serverio programinės įrangos versija:"
#: bookwyrm/templates/about/layout.html:30
-#: bookwyrm/templates/embed-layout.html:33
+#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/snippets/footer.html:8
#, python-format
msgid "About %(site_name)s"
@@ -684,7 +718,7 @@ msgstr "Trumpiausias skaitinys tais metais…"
#: bookwyrm/templates/annual_summary/layout.html:157
#: bookwyrm/templates/annual_summary/layout.html:178
#: bookwyrm/templates/annual_summary/layout.html:247
-#: bookwyrm/templates/book/book.html:63
+#: bookwyrm/templates/book/book.html:65
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
@@ -776,24 +810,24 @@ msgid "View ISNI record"
msgstr "Peržiūrėti ISNI įrašą"
#: bookwyrm/templates/author/author.html:95
-#: bookwyrm/templates/book/book.html:173
+#: bookwyrm/templates/book/book.html:175
msgid "View on ISFDB"
msgstr "Žiūrėti per ISFDB"
#: bookwyrm/templates/author/author.html:100
#: bookwyrm/templates/author/sync_modal.html:5
-#: bookwyrm/templates/book/book.html:140
+#: bookwyrm/templates/book/book.html:142
#: bookwyrm/templates/book/sync_modal.html:5
msgid "Load data"
msgstr "Įkelti duomenis"
#: bookwyrm/templates/author/author.html:104
-#: bookwyrm/templates/book/book.html:144
+#: bookwyrm/templates/book/book.html:146
msgid "View on OpenLibrary"
msgstr "Žiūrėti „OpenLibrary“"
#: bookwyrm/templates/author/author.html:119
-#: bookwyrm/templates/book/book.html:158
+#: bookwyrm/templates/book/book.html:160
msgid "View on Inventaire"
msgstr "Žiūrėti „Inventaire“"
@@ -805,11 +839,7 @@ msgstr "Žiūrėti „LibraryThing“"
msgid "View on Goodreads"
msgstr "Žiūrėti „Goodreads“"
-#: bookwyrm/templates/author/author.html:151
-msgid "View ISFDB entry"
-msgstr "Peržiūrėti ISFDB įrašą"
-
-#: bookwyrm/templates/author/author.html:166
+#: bookwyrm/templates/author/author.html:158
#, python-format
msgid "Books by %(name)s"
msgstr "%(name)s knygos"
@@ -918,7 +948,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:89
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save"
@@ -967,19 +997,19 @@ msgstr "Patvirtinti"
msgid "Unable to connect to remote source."
msgstr "Nepavyksta prisijungti prie nuotolinio šaltinio."
-#: bookwyrm/templates/book/book.html:71 bookwyrm/templates/book/book.html:72
+#: bookwyrm/templates/book/book.html:73 bookwyrm/templates/book/book.html:74
msgid "Edit Book"
msgstr "Redaguoti knygą"
-#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:100
+#: bookwyrm/templates/book/book.html:99 bookwyrm/templates/book/book.html:102
msgid "Click to add cover"
msgstr "Spausti, kad pridėti viršelį"
-#: bookwyrm/templates/book/book.html:106
+#: bookwyrm/templates/book/book.html:108
msgid "Failed to load cover"
msgstr "Nepavyko įkelti viršelio"
-#: bookwyrm/templates/book/book.html:117
+#: bookwyrm/templates/book/book.html:119
msgid "Click to enlarge"
msgstr "Spustelėkite padidinti"
@@ -1058,13 +1088,13 @@ msgstr "Vietos"
#: bookwyrm/templates/guided_tour/lists.html:14
#: bookwyrm/templates/guided_tour/user_books.html:102
#: bookwyrm/templates/guided_tour/user_profile.html:78
-#: bookwyrm/templates/layout.html:90 bookwyrm/templates/lists/curate.html:8
+#: bookwyrm/templates/layout.html:88 bookwyrm/templates/lists/curate.html:8
#: bookwyrm/templates/lists/list.html:12 bookwyrm/templates/lists/lists.html:5
#: bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:26
#: bookwyrm/templates/search/layout.html:51
#: bookwyrm/templates/settings/celery.html:77
-#: bookwyrm/templates/user/layout.html:91 bookwyrm/templates/user/lists.html:6
+#: bookwyrm/templates/user/layout.html:101 bookwyrm/templates/user/lists.html:6
msgid "Lists"
msgstr "Sąrašai"
@@ -1129,8 +1159,8 @@ msgstr "Įkelti viršelį:"
#: bookwyrm/templates/book/cover_add_modal.html:23
#: bookwyrm/templates/book/edit/edit_book_form.html:250
-msgid "Load cover from url:"
-msgstr "Įkelti viršelį iš url:"
+msgid "Load cover from URL:"
+msgstr ""
#: bookwyrm/templates/book/cover_show_modal.html:6
msgid "Book cover preview"
@@ -1340,7 +1370,7 @@ msgid "Add Another Author"
msgstr "Pridėti dar vieną autorių"
#: bookwyrm/templates/book/edit/edit_book_form.html:231
-#: bookwyrm/templates/shelf/shelf.html:147
+#: bookwyrm/templates/shelf/shelf.html:149
msgid "Cover"
msgstr "Viršelis"
@@ -1384,8 +1414,8 @@ 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"
+msgid "Editions of %(work_title)s"
+msgstr ""
#: bookwyrm/templates/book/editions/editions.html:55
msgid "Can't find the edition you're looking for?"
@@ -1467,8 +1497,9 @@ msgstr "Domenas"
#: bookwyrm/templates/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
#: bookwyrm/templates/settings/invites/status_filter.html:5
+#: bookwyrm/templates/settings/themes.html:111
#: bookwyrm/templates/settings/users/user_admin.html:56
-#: bookwyrm/templates/settings/users/user_info.html:24
+#: bookwyrm/templates/settings/users/user_info.html:35
msgid "Status"
msgstr "Būsena"
@@ -1477,7 +1508,7 @@ msgstr "Būsena"
#: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/imports/imports.html:141
#: bookwyrm/templates/settings/reports/report_links_table.html:6
-#: bookwyrm/templates/settings/themes.html:99
+#: bookwyrm/templates/settings/themes.html:108
msgid "Actions"
msgstr "Veiksmai"
@@ -1541,22 +1572,22 @@ msgstr "%(pages)s psl."
msgid "%(languages)s language"
msgstr "%(languages)s kalba"
-#: bookwyrm/templates/book/publisher_info.html:65
+#: bookwyrm/templates/book/publisher_info.html:63
#, python-format
msgid "Published %(date)s by %(publisher)s."
msgstr "Publikuota %(date)s, %(publisher)s."
+#: bookwyrm/templates/book/publisher_info.html:65
+#, python-format
+msgid "Published by %(publisher)s."
+msgstr "Publikavo %(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
+#: bookwyrm/templates/book/rating.html:19
msgid "rated it"
msgstr "įvertino"
@@ -1564,12 +1595,12 @@ msgstr "įvertino"
msgid "Series by"
msgstr "Serijos autorius"
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
#, python-format
msgid "Book %(series_number)s"
msgstr "%(series_number)s knyga"
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
msgid "Unsorted Book"
msgstr "Nesurūšiuota knyga"
@@ -1693,6 +1724,7 @@ msgstr "Pasiūlyta"
#: bookwyrm/templates/ostatus/subscribe.html:42
#: bookwyrm/templates/ostatus/success.html:17
#: bookwyrm/templates/ostatus/success.html:18
+#: bookwyrm/templates/user/moved.html:19 bookwyrm/templates/user/moved.html:20
#: bookwyrm/templates/user/user_preview.html:16
#: bookwyrm/templates/user/user_preview.html:17
msgid "Locked account"
@@ -1771,7 +1803,7 @@ msgstr "%(username)s citavo %(username)s"
msgstr "Asmeninis susirašinėjimas su %(username)s"
#: bookwyrm/templates/feed/direct_messages.html:10
-#: bookwyrm/templates/user_menu.html:44
+#: bookwyrm/templates/user_menu.html:39
msgid "Direct Messages"
msgstr "Asmeninės žinutės"
@@ -1964,7 +1996,7 @@ msgstr "Atnaujinimai"
#: bookwyrm/templates/feed/suggested_books.html:6
#: bookwyrm/templates/guided_tour/home.html:127
-#: bookwyrm/templates/user_menu.html:39
+#: bookwyrm/templates/layout.html:94
msgid "Your Books"
msgstr "Mano knygos"
@@ -2012,19 +2044,19 @@ msgid "Add to your books"
msgstr "Pridėti prie savo knygų"
#: bookwyrm/templates/get_started/book_preview.html:10
-#: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37
+#: bookwyrm/templates/shelf/shelf.html:88 bookwyrm/templates/user/user.html:37
#: bookwyrm/templatetags/shelf_tags.py:14
msgid "To Read"
msgstr "Norimos perskaityti"
#: bookwyrm/templates/get_started/book_preview.html:11
-#: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38
+#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:38
#: bookwyrm/templatetags/shelf_tags.py:15
msgid "Currently Reading"
msgstr "Šiuo metu skaitomos"
#: bookwyrm/templates/get_started/book_preview.html:12
-#: bookwyrm/templates/shelf/shelf.html:88
+#: bookwyrm/templates/shelf/shelf.html:90
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
@@ -2033,7 +2065,7 @@ msgid "Read"
msgstr "Perskaitytos"
#: bookwyrm/templates/get_started/book_preview.html:13
-#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40
+#: bookwyrm/templates/shelf/shelf.html:91 bookwyrm/templates/user/user.html:40
#: bookwyrm/templatetags/shelf_tags.py:17
msgid "Stopped Reading"
msgstr "Nustota skaityti"
@@ -2043,7 +2075,7 @@ msgid "What are you reading?"
msgstr "Ką skaitome?"
#: bookwyrm/templates/get_started/books.html:9
-#: bookwyrm/templates/layout.html:39 bookwyrm/templates/lists/list.html:213
+#: bookwyrm/templates/layout.html:41 bookwyrm/templates/lists/list.html:213
msgid "Search for a book"
msgstr "Ieškoti knygos"
@@ -2062,8 +2094,8 @@ msgstr "Kai pradedate naudotis %(site_name)s, galite pridėti knygų."
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:15
-#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:45
-#: bookwyrm/templates/layout.html:46 bookwyrm/templates/lists/list.html:217
+#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:47
+#: bookwyrm/templates/layout.html:48 bookwyrm/templates/lists/list.html:217
#: bookwyrm/templates/search/layout.html:5
#: bookwyrm/templates/search/layout.html:10
#: bookwyrm/templates/search/layout.html:32
@@ -2534,8 +2566,8 @@ msgid "Barcode reader"
msgstr "Brūkšninio kodo skaitytuvas"
#: bookwyrm/templates/guided_tour/home.html:102
-msgid "Use the Feed, Lists and Discover links to discover the latest news from your feed, lists of books by topic, and the latest happenings on this Bookwyrm server!"
-msgstr "Naudokite Srautą, Sąrašus ir Atraskite nuorodas bei skaitykite naujienas iš savo srauto, knygų sąrašų pagal temą bei kitą informaciją!"
+msgid "Use the Lists, Discover, and Your Books links to discover reading suggestions and the latest happenings on this server, or to see your catalogued books!"
+msgstr ""
#: bookwyrm/templates/guided_tour/home.html:103
msgid "Navigation Bar"
@@ -2558,16 +2590,16 @@ msgid "The bell will light up when you have a new notification. When it does, cl
msgstr "Kai gausite naują pranešimą, apsišvies varpelis. Galite ant jo paspausti ir sužinoti, kas įdomaus nutiko!"
#: bookwyrm/templates/guided_tour/home.html:177
-#: bookwyrm/templates/layout.html:75 bookwyrm/templates/layout.html:106
-#: bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:77 bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:108
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr "Pranešimai"
#: bookwyrm/templates/guided_tour/home.html:200
-msgid "Your profile, books, direct messages, and settings can be accessed by clicking on your name in the menu here."
-msgstr "Savo paskyrą, knygas, tiesiogines žinutes ir nustatymus galite pasiekti, meniu spustelėdami savo vardą."
+msgid "Your profile, user directory, direct messages, and settings can be accessed by clicking on your name in the menu here."
+msgstr ""
#: bookwyrm/templates/guided_tour/home.html:200
msgid "Try selecting Profile from the drop down menu to continue the tour."
@@ -2722,7 +2754,7 @@ msgstr "Galite sukurti arba prisijungti prie grupės. Grupės prižiūri savo kn
#: bookwyrm/templates/guided_tour/user_groups.html:11
#: bookwyrm/templates/guided_tour/user_profile.html:55
-#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:85
+#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:95
msgid "Groups"
msgstr "Grupės"
@@ -2767,7 +2799,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr "Tai jūsų profilis. Čia bus matomos jūsų naujausios veiklos. Kiti „Bookwyrm“ naudotojai taip pat gali matyti šio puslapio dalis, tačiau tai, ką jie gali matyti, priklauso nuo privatumo nustatymų."
#: bookwyrm/templates/guided_tour/user_profile.html:11
-#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:14
+#: bookwyrm/templates/user/layout.html:20 bookwyrm/templates/user/user.html:14
msgid "User Profile"
msgstr "Nario paskyra"
@@ -2776,7 +2808,7 @@ msgid "This tab shows everything you have read towards your annual reading goal,
msgstr "Šiame skirtuke rodoma viskas, ką perskaitėte, siekdami savo nusistatyto metinio tikslo. Taip pat galite jį čia nustatyti. To daryti nebūtina, jei manote, kad tai ne jums."
#: bookwyrm/templates/guided_tour/user_profile.html:32
-#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:79
+#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:89
msgid "Reading Goal"
msgstr "Skaitymo tikslas"
@@ -2815,7 +2847,7 @@ msgstr "Šioje grotžymėje nėra aktyvumo!"
#: bookwyrm/templates/import/import.html:5
#: bookwyrm/templates/import/import.html:9
-#: bookwyrm/templates/shelf/shelf.html:64
+#: bookwyrm/templates/shelf/shelf.html:66
msgid "Import Books"
msgstr "Importuoti knygas"
@@ -2825,12 +2857,8 @@ msgstr "Netinkamas CSV failas"
#: bookwyrm/templates/import/import.html:21
#, python-format
-msgid "\n"
-" Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day.\n"
-" "
-msgid_plural "\n"
-" Currently, you are allowed to import %(import_size_limit)s books every %(import_limit_reset)s days.\n"
-" "
+msgid "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day."
+msgid_plural "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s days."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -2893,7 +2921,7 @@ msgstr "Privatumo nustatymai svarbiems atsiliepimams:"
#: bookwyrm/templates/import/import.html:106
#: bookwyrm/templates/import/import.html:108
-#: bookwyrm/templates/preferences/layout.html:35
+#: bookwyrm/templates/preferences/layout.html:43
#: bookwyrm/templates/settings/federation/instance_blocklist.html:78
msgid "Import"
msgstr "Importuoti"
@@ -2996,8 +3024,8 @@ msgid "Row"
msgstr "Eilutė"
#: bookwyrm/templates/import/import_status.html:110
-#: bookwyrm/templates/shelf/shelf.html:148
-#: bookwyrm/templates/shelf/shelf.html:170
+#: bookwyrm/templates/shelf/shelf.html:150
+#: bookwyrm/templates/shelf/shelf.html:172
msgid "Title"
msgstr "Pavadinimas"
@@ -3010,8 +3038,8 @@ msgid "Openlibrary key"
msgstr "„Openlibrary“ raktas"
#: bookwyrm/templates/import/import_status.html:121
-#: bookwyrm/templates/shelf/shelf.html:149
-#: bookwyrm/templates/shelf/shelf.html:173
+#: bookwyrm/templates/shelf/shelf.html:151
+#: bookwyrm/templates/shelf/shelf.html:175
msgid "Author"
msgstr "Autorius"
@@ -3117,10 +3145,6 @@ msgstr "Jei matote netikėtų nesklandumų, susisiekite su administratoriumi arb
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."
@@ -3168,7 +3192,7 @@ msgid "Login"
msgstr "Prisijungti"
#: bookwyrm/templates/landing/login.html:7
-#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:136
+#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:142
#: bookwyrm/templates/ostatus/error.html:37
msgid "Log in"
msgstr "Prisijunkite"
@@ -3179,7 +3203,7 @@ msgstr "Džiugu, el. pašto adresas patvirtintas."
#: bookwyrm/templates/landing/login.html:21
#: bookwyrm/templates/landing/reactivate.html:17
-#: bookwyrm/templates/layout.html:127 bookwyrm/templates/ostatus/error.html:28
+#: bookwyrm/templates/layout.html:128 bookwyrm/templates/ostatus/error.html:28
#: bookwyrm/templates/snippets/register_form.html:4
msgid "Username:"
msgstr "Naudotojo vardas:"
@@ -3187,13 +3211,13 @@ msgstr "Naudotojo vardas:"
#: bookwyrm/templates/landing/login.html:27
#: bookwyrm/templates/landing/password_reset.html:26
#: bookwyrm/templates/landing/reactivate.html:23
-#: bookwyrm/templates/layout.html:131 bookwyrm/templates/ostatus/error.html:32
+#: bookwyrm/templates/layout.html:132 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/preferences/2fa.html:91
#: bookwyrm/templates/snippets/register_form.html:45
msgid "Password:"
msgstr "Slaptažodis:"
-#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:133
+#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:139
#: bookwyrm/templates/ostatus/error.html:34
msgid "Forgot your password?"
msgstr "Pamiršote slaptažodį?"
@@ -3236,35 +3260,35 @@ msgstr "Atstatyti paskyrą"
msgid "%(site_name)s search"
msgstr "%(site_name)s paieška"
-#: bookwyrm/templates/layout.html:37
+#: bookwyrm/templates/layout.html:39
msgid "Search for a book, user, or list"
msgstr "Ieškoti knygos, naudotojo arba sąrašo"
-#: bookwyrm/templates/layout.html:52 bookwyrm/templates/layout.html:53
+#: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55
msgid "Scan Barcode"
msgstr "Skenuoti brūkšninį kodą"
-#: bookwyrm/templates/layout.html:67
+#: bookwyrm/templates/layout.html:69
msgid "Main navigation menu"
msgstr "Pagrindinis navigacijos meniu"
-#: bookwyrm/templates/layout.html:87
-msgid "Feed"
-msgstr "Srautas"
-
-#: bookwyrm/templates/layout.html:132 bookwyrm/templates/ostatus/error.html:33
+#: bookwyrm/templates/layout.html:134 bookwyrm/templates/ostatus/error.html:33
msgid "password"
msgstr "slaptažodis"
-#: bookwyrm/templates/layout.html:144
+#: bookwyrm/templates/layout.html:136
+msgid "Show/Hide password"
+msgstr ""
+
+#: bookwyrm/templates/layout.html:150
msgid "Join"
msgstr "Prisijungti"
-#: bookwyrm/templates/layout.html:179
+#: bookwyrm/templates/layout.html:196
msgid "Successfully posted status"
msgstr "Būsena publikuota sėkmingai"
-#: bookwyrm/templates/layout.html:180
+#: bookwyrm/templates/layout.html:197
msgid "Error posting status"
msgstr "Klaida, publikuojant būseną"
@@ -3456,6 +3480,7 @@ msgid "Set"
msgstr "Nustatyti"
#: bookwyrm/templates/lists/list.html:167
+#: bookwyrm/templates/snippets/remove_follower_button.html:4
#: bookwyrm/templates/snippets/remove_from_group_button.html:20
msgid "Remove"
msgstr "Pašalinti"
@@ -3523,6 +3548,23 @@ msgstr "Visi sąrašai"
msgid "Saved Lists"
msgstr "Išsaugoti sąrašai"
+#: bookwyrm/templates/moved.html:27
+#, python-format
+msgid "You have moved your account to %(username)s"
+msgstr ""
+
+#: bookwyrm/templates/moved.html:32
+msgid "You can undo the move to restore full functionality, but some followers may have already unfollowed this account."
+msgstr ""
+
+#: bookwyrm/templates/moved.html:42
+msgid "Undo move"
+msgstr ""
+
+#: bookwyrm/templates/moved.html:46 bookwyrm/templates/user_menu.html:77
+msgid "Log out"
+msgstr "Atsijungti"
+
#: bookwyrm/templates/notifications/items/accept.html:18
#, python-format
msgid "%(related_user)s accepted your invitation to join group \"%(group_name)s\""
@@ -3731,6 +3773,15 @@ msgstr "Jūsų importas baigtas."
msgid "%(related_user)s invited you to join the group \"%(group_name)s\""
msgstr "%(related_user)s pakvietė jus prisijungti prie grupės „%(group_name)s“"
+#: bookwyrm/templates/notifications/items/invite_request.html:15
+#, python-format
+msgid "New invite request awaiting response"
+msgid_plural "%(display_count)s new invite requests awaiting response"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
#: bookwyrm/templates/notifications/items/join.html:16
#, python-format
msgid "has joined your group \"%(group_name)s\""
@@ -3780,6 +3831,16 @@ msgstr "%(related_user)s paminėjo jus %(related_user)s mentioned you in a status"
msgstr "%(related_user)s paminėjo jus būsenoje"
+#: bookwyrm/templates/notifications/items/move_user.html:18
+#, python-format
+msgid "%(related_user)s has moved to %(username)s"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/move_user.html:25
+#, python-format
+msgid "%(related_user)s has undone their move"
+msgstr ""
+
#: bookwyrm/templates/notifications/items/remove.html:17
#, python-format
msgid "has been removed from your group \"%(group_name)s\""
@@ -3820,7 +3881,7 @@ msgstr[2] "Reikia moderuoti %(display_count)s naujų ataska
msgstr[3] "Reikia moderuoti %(display_count)s naujas ataskaitas"
#: bookwyrm/templates/notifications/items/status_preview.html:4
-#: bookwyrm/templates/snippets/status/content_status.html:73
+#: bookwyrm/templates/snippets/status/content_status.html:62
msgid "Content warning"
msgstr "Įspėjimas dėl turinio"
@@ -4038,9 +4099,51 @@ msgstr "Prieš tvarkant 2FA reikia patvirinti slaptažodį."
msgid "Set up 2FA"
msgstr "Sutvarkyti 2FA"
+#: bookwyrm/templates/preferences/alias_user.html:4
+#: bookwyrm/templates/preferences/move_user.html:4
+#: bookwyrm/templates/preferences/move_user.html:7
+#: bookwyrm/templates/preferences/move_user.html:39
+msgid "Move Account"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:7
+#: bookwyrm/templates/preferences/alias_user.html:34
+msgid "Create Alias"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:12
+msgid "Add another account as an alias"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:16
+msgid "Marking another account as an alias is required if you want to move that account to this one."
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:19
+msgid "This is a reversable action and will not change the functionality of this account."
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:25
+msgid "Enter the username for the account you want to add as an alias e.g. user@example.com :"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:30
+#: bookwyrm/templates/preferences/move_user.html:35
+msgid "Confirm your password:"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:39
+#: bookwyrm/templates/preferences/layout.html:28
+msgid "Aliases"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:49
+msgid "Remove alias"
+msgstr ""
+
#: bookwyrm/templates/preferences/blocks.html:4
#: bookwyrm/templates/preferences/blocks.html:7
-#: bookwyrm/templates/preferences/layout.html:46
+#: bookwyrm/templates/preferences/layout.html:54
msgid "Blocked Users"
msgstr "Blokuoti nariai"
@@ -4070,7 +4173,7 @@ msgstr "Naujas slaptažodis:"
#: bookwyrm/templates/preferences/delete_user.html:4
#: bookwyrm/templates/preferences/delete_user.html:7
#: bookwyrm/templates/preferences/delete_user.html:40
-#: bookwyrm/templates/preferences/layout.html:28
+#: bookwyrm/templates/preferences/layout.html:36
#: bookwyrm/templates/settings/users/delete_user_form.html:22
msgid "Delete Account"
msgstr "Pašalinti paskyrą"
@@ -4115,7 +4218,7 @@ msgstr "Redaguoti paskyrą"
#: bookwyrm/templates/preferences/edit_user.html:12
#: bookwyrm/templates/preferences/edit_user.html:25
-#: bookwyrm/templates/settings/users/user_info.html:7
+#: bookwyrm/templates/settings/users/user_info.html:8
#: bookwyrm/templates/user_menu.html:29
msgid "Profile"
msgstr "Paskyra"
@@ -4192,18 +4295,45 @@ msgstr "Parsisiųsti failą"
msgid "Account"
msgstr "Paskyra"
-#: bookwyrm/templates/preferences/layout.html:31
+#: bookwyrm/templates/preferences/layout.html:32
+msgid "Move Account"
+msgstr ""
+
+#: bookwyrm/templates/preferences/layout.html:39
msgid "Data"
msgstr "Duomenys"
-#: bookwyrm/templates/preferences/layout.html:39
+#: bookwyrm/templates/preferences/layout.html:47
msgid "CSV export"
msgstr "CSV eksportas"
-#: bookwyrm/templates/preferences/layout.html:42
+#: bookwyrm/templates/preferences/layout.html:50
msgid "Relationships"
msgstr "Sąsajos"
+#: bookwyrm/templates/preferences/move_user.html:12
+msgid "Migrate account to another server"
+msgstr ""
+
+#: bookwyrm/templates/preferences/move_user.html:16
+msgid "Moving your account will notify all your followers and direct them to follow the new account."
+msgstr ""
+
+#: bookwyrm/templates/preferences/move_user.html:19
+#, python-format
+msgid "\n"
+" %(user)s will be marked as moved and will not be discoverable or usable unless you undo the move.\n"
+" "
+msgstr ""
+
+#: bookwyrm/templates/preferences/move_user.html:25
+msgid "Remember to add this user as an alias of the target account before you try to move."
+msgstr ""
+
+#: bookwyrm/templates/preferences/move_user.html:30
+msgid "Enter the username for the account you want to move to e.g. user@example.com :"
+msgstr ""
+
#: bookwyrm/templates/reading_progress/finish.html:5
#, python-format
msgid "Finish \"%(book_title)s\""
@@ -4616,8 +4746,8 @@ msgid "Streams"
msgstr ""
#: bookwyrm/templates/settings/celery.html:32
-msgid "Broadcasts"
-msgstr "Transliacijos"
+msgid "Broadcast"
+msgstr ""
#: bookwyrm/templates/settings/celery.html:38
msgid "Inbox"
@@ -4975,7 +5105,7 @@ msgid "Details"
msgstr "Išsami informacija"
#: bookwyrm/templates/settings/federation/instance.html:53
-#: bookwyrm/templates/user/layout.html:69
+#: bookwyrm/templates/user/layout.html:79
msgid "Activity"
msgstr "Veikla"
@@ -5163,7 +5293,7 @@ msgstr "Kvietimo prašymai"
#: bookwyrm/templates/settings/invites/manage_invites.html:3
#: bookwyrm/templates/settings/invites/manage_invites.html:15
#: bookwyrm/templates/settings/layout.html:42
-#: bookwyrm/templates/user_menu.html:60
+#: bookwyrm/templates/user_menu.html:55
msgid "Invites"
msgstr "Pakvietimai"
@@ -5637,57 +5767,73 @@ msgid "Set instance default theme"
msgstr "Nustatyti numatytąją serverio temą"
#: bookwyrm/templates/settings/themes.html:19
+msgid "One of your themes appears to be broken. Selecting this theme will make the application unusable."
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:28
msgid "Successfully added theme"
msgstr "Tema pridėta sėkmingai"
-#: bookwyrm/templates/settings/themes.html:26
+#: bookwyrm/templates/settings/themes.html:35
msgid "How to add a theme"
msgstr "Kaip pridėti temą"
-#: bookwyrm/templates/settings/themes.html:29
+#: bookwyrm/templates/settings/themes.html:38
msgid "Copy the theme file into the bookwyrm/static/css/themes
directory on your server from the command line."
msgstr "Nukopijuokite fialus į serverio katalogą bookwyrm/static/css/themes
iš komandinės eilutės."
-#: bookwyrm/templates/settings/themes.html:32
+#: bookwyrm/templates/settings/themes.html:41
msgid "Run ./bw-dev compile_themes
and ./bw-dev collectstatic
."
msgstr "Paleisti ./bw-dev compile_themes
ir ./bw-dev collectstatic
."
-#: bookwyrm/templates/settings/themes.html:35
+#: bookwyrm/templates/settings/themes.html:44
msgid "Add the file name using the form below to make it available in the application interface."
msgstr "Pridėkite failo pavadinimą, naudodamiesi žemiau esančia forma, kad jis atsirastų programėlėje."
-#: bookwyrm/templates/settings/themes.html:42
-#: bookwyrm/templates/settings/themes.html:82
+#: bookwyrm/templates/settings/themes.html:51
+#: bookwyrm/templates/settings/themes.html:91
msgid "Add theme"
msgstr "Pridėti temą"
-#: bookwyrm/templates/settings/themes.html:48
+#: bookwyrm/templates/settings/themes.html:57
msgid "Unable to save theme"
msgstr "Nepavyko išsaugoti temos"
-#: bookwyrm/templates/settings/themes.html:63
-#: bookwyrm/templates/settings/themes.html:93
+#: bookwyrm/templates/settings/themes.html:72
+#: bookwyrm/templates/settings/themes.html:102
msgid "Theme name"
msgstr "Temos pavadinimas"
-#: bookwyrm/templates/settings/themes.html:73
+#: bookwyrm/templates/settings/themes.html:82
msgid "Theme filename"
msgstr "Temos failo vardas"
-#: bookwyrm/templates/settings/themes.html:88
+#: bookwyrm/templates/settings/themes.html:97
msgid "Available Themes"
msgstr "Galimos temos"
-#: bookwyrm/templates/settings/themes.html:96
+#: bookwyrm/templates/settings/themes.html:105
msgid "File"
msgstr "Failas"
-#: bookwyrm/templates/settings/themes.html:111
+#: bookwyrm/templates/settings/themes.html:123
msgid "Remove theme"
msgstr "Pašalinti temą"
+#: bookwyrm/templates/settings/themes.html:134
+msgid "Test theme"
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:143
+msgid "Broken theme"
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:152
+msgid "Loaded successfully"
+msgstr ""
+
#: bookwyrm/templates/settings/users/delete_user_form.html:5
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:38
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:52
msgid "Permanently delete user"
msgstr "Visam laikui ištrinti vartotoją"
@@ -5726,25 +5872,20 @@ msgstr "Paskutinį kartą aktyvus"
msgid "Remote instance"
msgstr "Nutolęs serveris"
-#: bookwyrm/templates/settings/users/user_admin.html:86
-msgid "Deleted"
-msgstr "Ištrinta"
-
-#: bookwyrm/templates/settings/users/user_admin.html:92
-#: bookwyrm/templates/settings/users/user_info.html:32
-msgid "Inactive"
-msgstr "Neaktyvus"
-
-#: bookwyrm/templates/settings/users/user_admin.html:101
+#: bookwyrm/templates/settings/users/user_admin.html:84
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr "Nenustatytas"
-#: bookwyrm/templates/settings/users/user_info.html:16
+#: bookwyrm/templates/settings/users/user_info.html:20
+msgid "This account is the instance actor for signing HTTP requests."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_info.html:24
msgid "View user profile"
msgstr "Peržiūrėti nario paskyrą"
-#: bookwyrm/templates/settings/users/user_info.html:19
+#: bookwyrm/templates/settings/users/user_info.html:30
msgid "Go to user admin"
msgstr "Eiti į administratoriaus naudotoją"
@@ -5800,27 +5941,39 @@ msgstr "Serverio informacija"
msgid "View instance"
msgstr "Peržiūrėti serverį"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:5
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:6
msgid "Permanently deleted"
msgstr "Visam laikui ištrintas"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:8
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:9
msgid "User Actions"
msgstr "Nario veiksmai"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:21
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:15
+msgid "This is the instance admin actor"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:18
+msgid "You must not delete or disable this account as it is critical to the functioning of your server. This actor signs outgoing GET requests to smooth interaction with secure ActivityPub servers."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:19
+msgid "This account is not discoverable by ordinary users and does not have a profile page."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:35
msgid "Activate user"
msgstr "Įjungti vartotoją"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:27
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:41
msgid "Suspend user"
msgstr "Laikinai išjungti vartotoją"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:32
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:46
msgid "Un-suspend user"
msgstr "Atblokuoti narį"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:54
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:68
msgid "Access level:"
msgstr "Priėjimo lygis:"
@@ -5876,7 +6029,7 @@ msgstr "Atrodo, kad jūsų domenas nesukonfigūruotas. Į jį neturėtų įeiti
msgid "You are running BookWyrm in production mode without https. USE_HTTPS should be enabled in production."
msgstr "„BookWyrm“ leidžiate produkcinėje būsenoje be https. Produkcinėje aplinkoje turi būti įjungtasUSE_HTTPS."
-#: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:49
+#: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:44
msgid "Settings"
msgstr "Nustatymai"
@@ -5933,7 +6086,7 @@ msgid "Need help?"
msgstr "Reikia pagalbos?"
#: bookwyrm/templates/shelf/create_shelf_form.html:5
-#: bookwyrm/templates/shelf/shelf.html:72
+#: bookwyrm/templates/shelf/shelf.html:74
msgid "Create shelf"
msgstr "Sukurti lentyną"
@@ -5941,18 +6094,18 @@ msgstr "Sukurti lentyną"
msgid "Edit Shelf"
msgstr "Redaguoti lentyną"
-#: bookwyrm/templates/shelf/shelf.html:24
+#: bookwyrm/templates/shelf/shelf.html:26
#: bookwyrm/templates/user/relationships/followers.html:18
#: bookwyrm/templates/user/relationships/following.html:18
msgid "User profile"
msgstr "Nario paskyra"
-#: bookwyrm/templates/shelf/shelf.html:39
+#: bookwyrm/templates/shelf/shelf.html:41
#: bookwyrm/templatetags/shelf_tags.py:13 bookwyrm/views/shelf/shelf.py:53
msgid "All books"
msgstr "Visos knygos"
-#: bookwyrm/templates/shelf/shelf.html:97
+#: bookwyrm/templates/shelf/shelf.html:99
#, python-format
msgid "%(formatted_count)s book"
msgid_plural "%(formatted_count)s books"
@@ -5961,40 +6114,40 @@ msgstr[1] "%(formatted_count)s knygos"
msgstr[2] "%(formatted_count)s knygų"
msgstr[3] "%(formatted_count)s knygos"
-#: bookwyrm/templates/shelf/shelf.html:104
+#: bookwyrm/templates/shelf/shelf.html:106
#, python-format
msgid "(showing %(start)s-%(end)s)"
msgstr "(rodoma %(start)s–%(end)s)"
-#: bookwyrm/templates/shelf/shelf.html:116
+#: bookwyrm/templates/shelf/shelf.html:118
msgid "Edit shelf"
msgstr "Redaguoti lentyną"
-#: bookwyrm/templates/shelf/shelf.html:124
+#: bookwyrm/templates/shelf/shelf.html:126
msgid "Delete shelf"
msgstr "Ištrinti lentyną"
-#: bookwyrm/templates/shelf/shelf.html:152
-#: bookwyrm/templates/shelf/shelf.html:178
+#: bookwyrm/templates/shelf/shelf.html:154
+#: bookwyrm/templates/shelf/shelf.html:180
msgid "Shelved"
msgstr "Sudėta į lentynas"
-#: bookwyrm/templates/shelf/shelf.html:153
-#: bookwyrm/templates/shelf/shelf.html:181
+#: bookwyrm/templates/shelf/shelf.html:155
+#: bookwyrm/templates/shelf/shelf.html:183
msgid "Started"
msgstr "Pradėta"
-#: bookwyrm/templates/shelf/shelf.html:154
-#: bookwyrm/templates/shelf/shelf.html:184
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
msgid "Finished"
msgstr "Baigta"
-#: bookwyrm/templates/shelf/shelf.html:154
-#: bookwyrm/templates/shelf/shelf.html:184
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
msgid "Until"
msgstr "Iki"
-#: bookwyrm/templates/shelf/shelf.html:210
+#: bookwyrm/templates/shelf/shelf.html:212
msgid "This shelf is empty."
msgstr "Ši lentyna tuščia."
@@ -6312,6 +6465,15 @@ msgstr "Perskaityta %(read_count)s iš %(goal_count)s knyg
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/move_user_buttons.html:10
+msgid "Follow at new account"
+msgstr ""
+
+#: bookwyrm/templates/snippets/moved_user_notice.html:7
+#, python-format
+msgid "%(user)s has moved to %(moved_to_name)s"
+msgstr ""
+
#: bookwyrm/templates/snippets/page_text.html:8
#, python-format
msgid "page %(page)s of %(total_pages)s"
@@ -6453,35 +6615,35 @@ msgstr "Nustoti skaityti"
msgid "Finish reading"
msgstr "Baigti skaityti"
-#: bookwyrm/templates/snippets/status/content_status.html:80
+#: bookwyrm/templates/snippets/status/content_status.html:69
msgid "Show status"
msgstr "Rodyti būseną"
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "(Page %(page)s"
msgstr "(Psl. %(page)s"
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "%(endpage)s"
msgstr "%(endpage)s"
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid "(%(percent)s%%"
msgstr "(%(percent)s%%"
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid " - %(endpercent)s%%"
msgstr " - %(endpercent)s%%"
-#: bookwyrm/templates/snippets/status/content_status.html:127
+#: bookwyrm/templates/snippets/status/content_status.html:116
msgid "Open image in new window"
msgstr "Atidaryti paveikslėlį naujame lange"
-#: bookwyrm/templates/snippets/status/content_status.html:148
+#: bookwyrm/templates/snippets/status/content_status.html:137
msgid "Hide status"
msgstr "Slėpti būseną"
@@ -6614,6 +6776,18 @@ msgstr "Rodyti daugiau"
msgid "Show less"
msgstr "Rodyti mažiau"
+#: bookwyrm/templates/snippets/user_active_tag.html:5
+msgid "Moved"
+msgstr ""
+
+#: bookwyrm/templates/snippets/user_active_tag.html:12
+msgid "Deleted"
+msgstr "Ištrinta"
+
+#: bookwyrm/templates/snippets/user_active_tag.html:15
+msgid "Inactive"
+msgstr "Neaktyvus"
+
#: bookwyrm/templates/two_factor_auth/two_factor_login.html:29
msgid "2FA check"
msgstr "2FA patikra"
@@ -6672,11 +6846,11 @@ msgstr "Jūsų grupės"
msgid "Groups: %(username)s"
msgstr "Grupės: %(username)s"
-#: bookwyrm/templates/user/layout.html:50
+#: bookwyrm/templates/user/layout.html:59
msgid "Follow Requests"
msgstr "Sekti prašymus"
-#: bookwyrm/templates/user/layout.html:73
+#: bookwyrm/templates/user/layout.html:83
#: bookwyrm/templates/user/reviews_comments.html:6
#: bookwyrm/templates/user/reviews_comments.html:12
msgid "Reviews and Comments"
@@ -6691,7 +6865,13 @@ msgstr "Sąrašai: %(username)s"
msgid "Create list"
msgstr "Sukurti sąrašą"
-#: bookwyrm/templates/user/relationships/followers.html:31
+#: bookwyrm/templates/user/moved.html:25
+#: bookwyrm/templates/user/user_preview.html:22
+#, python-format
+msgid "Joined %(date)s"
+msgstr "Prisijungė %(date)s"
+
+#: bookwyrm/templates/user/relationships/followers.html:36
#, python-format
msgid "%(username)s has no followers"
msgstr "%(username)s neturi sekėjų"
@@ -6762,11 +6942,6 @@ msgstr "Tik komentarai"
msgid "No activities yet!"
msgstr "Įrašų dar nėra"
-#: bookwyrm/templates/user/user_preview.html:22
-#, python-format
-msgid "Joined %(date)s"
-msgstr "Prisijungė %(date)s"
-
#: bookwyrm/templates/user/user_preview.html:26
#, python-format
msgid "%(display_count)s follower"
@@ -6798,10 +6973,6 @@ msgstr "Jūs kartu nieko nesekate"
msgid "View profile and more"
msgstr "Žiūrėti paskyrą ir dar daugiau"
-#: bookwyrm/templates/user_menu.html:82
-msgid "Log out"
-msgstr "Atsijungti"
-
#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:28
msgid "File exceeds maximum size: 10MB"
msgstr "Failas viršijo maksimalų dydį: 10 MB"
@@ -6820,7 +6991,7 @@ msgstr[1] "%(num)d knygos %(user)s"
msgstr[2] "%(num)d knygos %(user)s"
msgstr[3] "%(num)d knygos %(user)s"
-#: bookwyrm/templatetags/utilities.py:39
+#: bookwyrm/templatetags/utilities.py:49
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"
diff --git a/locale/nl_NL/LC_MESSAGES/django.mo b/locale/nl_NL/LC_MESSAGES/django.mo
index 4f0130fd2..2c66d828b 100644
Binary files a/locale/nl_NL/LC_MESSAGES/django.mo and b/locale/nl_NL/LC_MESSAGES/django.mo differ
diff --git a/locale/nl_NL/LC_MESSAGES/django.po b/locale/nl_NL/LC_MESSAGES/django.po
index 5945b5257..06ff309e1 100644
--- a/locale/nl_NL/LC_MESSAGES/django.po
+++ b/locale/nl_NL/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-27 01:11+0000\n"
-"PO-Revision-Date: 2023-09-28 08:16\n"
+"POT-Creation-Date: 2023-12-30 23:52+0000\n"
+"PO-Revision-Date: 2024-01-02 03:12\n"
"Last-Translator: Mouse Reeve %(level)s
."
+msgstr ""
+
+#: bookwyrm/templates/403.html:15
+msgid "If you think you should have access, please speak to your BookWyrm server administrator."
+msgstr ""
+
#: bookwyrm/templates/404.html:4 bookwyrm/templates/404.html:8
msgid "Not Found"
msgstr "Niet gevonden"
@@ -476,6 +496,20 @@ msgstr "Niet gevonden"
msgid "The page you requested doesn't seem to exist!"
msgstr "De pagina die u probeert te bezoeken lijkt niet te bestaan!"
+#: bookwyrm/templates/413.html:4 bookwyrm/templates/413.html:8
+msgid "File too large"
+msgstr ""
+
+#: bookwyrm/templates/413.html:9
+msgid "The file you are uploading is too large."
+msgstr ""
+
+#: bookwyrm/templates/413.html:11
+msgid "\n"
+" You you can try using a smaller file, or ask your BookWyrm server administrator to increase the DATA_UPLOAD_MAX_MEMORY_SIZE
setting.\n"
+" "
+msgstr ""
+
#: bookwyrm/templates/500.html:4
msgid "Oops!"
msgstr "Oeps!"
@@ -536,12 +570,12 @@ msgstr "De moderators en beheerders van %(site_name)s houden de site online, bew
msgid "Moderator"
msgstr "Moderator"
-#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:67
+#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:62
msgid "Admin"
msgstr "Beheerder"
#: bookwyrm/templates/about/about.html:140
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:28
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
msgid "Send direct message"
@@ -575,7 +609,7 @@ msgid "Software version:"
msgstr "Software-versie:"
#: bookwyrm/templates/about/layout.html:30
-#: bookwyrm/templates/embed-layout.html:33
+#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/snippets/footer.html:8
#, python-format
msgid "About %(site_name)s"
@@ -680,7 +714,7 @@ msgstr "Diens kortste lees dit jaar…"
#: bookwyrm/templates/annual_summary/layout.html:157
#: bookwyrm/templates/annual_summary/layout.html:178
#: bookwyrm/templates/annual_summary/layout.html:247
-#: bookwyrm/templates/book/book.html:63
+#: bookwyrm/templates/book/book.html:65
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
@@ -768,24 +802,24 @@ msgid "View ISNI record"
msgstr "ISNI vermelding bekijken"
#: bookwyrm/templates/author/author.html:95
-#: bookwyrm/templates/book/book.html:173
+#: bookwyrm/templates/book/book.html:175
msgid "View on ISFDB"
msgstr "Bekijk op ISFDB"
#: bookwyrm/templates/author/author.html:100
#: bookwyrm/templates/author/sync_modal.html:5
-#: bookwyrm/templates/book/book.html:140
+#: bookwyrm/templates/book/book.html:142
#: bookwyrm/templates/book/sync_modal.html:5
msgid "Load data"
msgstr "Gegevens laden"
#: bookwyrm/templates/author/author.html:104
-#: bookwyrm/templates/book/book.html:144
+#: bookwyrm/templates/book/book.html:146
msgid "View on OpenLibrary"
msgstr "Bekijk op OpenLibrary"
#: bookwyrm/templates/author/author.html:119
-#: bookwyrm/templates/book/book.html:158
+#: bookwyrm/templates/book/book.html:160
msgid "View on Inventaire"
msgstr "Bekijk op Inventaire"
@@ -797,11 +831,7 @@ msgstr "Bekijk op LibraryThing"
msgid "View on Goodreads"
msgstr "Bekijk op Goodreads"
-#: bookwyrm/templates/author/author.html:151
-msgid "View ISFDB entry"
-msgstr "ISFDB melding bekijken"
-
-#: bookwyrm/templates/author/author.html:166
+#: bookwyrm/templates/author/author.html:158
#, python-format
msgid "Books by %(name)s"
msgstr "Boeken door %(name)s"
@@ -910,7 +940,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:89
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save"
@@ -959,19 +989,19 @@ msgstr "Bevestigen"
msgid "Unable to connect to remote source."
msgstr "Verbinden met externe bron niet mogelijk."
-#: bookwyrm/templates/book/book.html:71 bookwyrm/templates/book/book.html:72
+#: bookwyrm/templates/book/book.html:73 bookwyrm/templates/book/book.html:74
msgid "Edit Book"
msgstr "Boek bewerken"
-#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:100
+#: bookwyrm/templates/book/book.html:99 bookwyrm/templates/book/book.html:102
msgid "Click to add cover"
msgstr "Klik om omslag toe te voegen"
-#: bookwyrm/templates/book/book.html:106
+#: bookwyrm/templates/book/book.html:108
msgid "Failed to load cover"
msgstr "Omslag laden mislukt"
-#: bookwyrm/templates/book/book.html:117
+#: bookwyrm/templates/book/book.html:119
msgid "Click to enlarge"
msgstr "Klik om te vergroten"
@@ -1046,13 +1076,13 @@ msgstr "Plaatsen"
#: bookwyrm/templates/guided_tour/lists.html:14
#: bookwyrm/templates/guided_tour/user_books.html:102
#: bookwyrm/templates/guided_tour/user_profile.html:78
-#: bookwyrm/templates/layout.html:90 bookwyrm/templates/lists/curate.html:8
+#: bookwyrm/templates/layout.html:88 bookwyrm/templates/lists/curate.html:8
#: bookwyrm/templates/lists/list.html:12 bookwyrm/templates/lists/lists.html:5
#: bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:26
#: bookwyrm/templates/search/layout.html:51
#: bookwyrm/templates/settings/celery.html:77
-#: bookwyrm/templates/user/layout.html:91 bookwyrm/templates/user/lists.html:6
+#: bookwyrm/templates/user/layout.html:101 bookwyrm/templates/user/lists.html:6
msgid "Lists"
msgstr "Lijsten"
@@ -1117,8 +1147,8 @@ msgstr "Upload Omslag:"
#: bookwyrm/templates/book/cover_add_modal.html:23
#: bookwyrm/templates/book/edit/edit_book_form.html:250
-msgid "Load cover from url:"
-msgstr "Omslag laden vanuit url:"
+msgid "Load cover from URL:"
+msgstr "Omslag laden vanuit URL:"
#: bookwyrm/templates/book/cover_show_modal.html:6
msgid "Book cover preview"
@@ -1328,7 +1358,7 @@ msgid "Add Another Author"
msgstr "Nog een auteur toevoegen"
#: bookwyrm/templates/book/edit/edit_book_form.html:231
-#: bookwyrm/templates/shelf/shelf.html:147
+#: bookwyrm/templates/shelf/shelf.html:149
msgid "Cover"
msgstr "Omslag"
@@ -1372,8 +1402,8 @@ msgstr "Edities van %(book_title)s"
#: bookwyrm/templates/book/editions/editions.html:8
#, python-format
-msgid "Editions of \"%(work_title)s\""
-msgstr "Edities van \"%(work_title)s\""
+msgid "Editions of %(work_title)s"
+msgstr "Edities van %(work_title)s"
#: bookwyrm/templates/book/editions/editions.html:55
msgid "Can't find the edition you're looking for?"
@@ -1455,8 +1485,9 @@ msgstr "Domein"
#: bookwyrm/templates/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
#: bookwyrm/templates/settings/invites/status_filter.html:5
+#: bookwyrm/templates/settings/themes.html:111
#: bookwyrm/templates/settings/users/user_admin.html:56
-#: bookwyrm/templates/settings/users/user_info.html:24
+#: bookwyrm/templates/settings/users/user_info.html:35
msgid "Status"
msgstr "Status"
@@ -1465,7 +1496,7 @@ msgstr "Status"
#: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/imports/imports.html:141
#: bookwyrm/templates/settings/reports/report_links_table.html:6
-#: bookwyrm/templates/settings/themes.html:99
+#: bookwyrm/templates/settings/themes.html:108
msgid "Actions"
msgstr "Handelingen"
@@ -1529,22 +1560,22 @@ msgstr "%(pages)s bladzijdes"
msgid "%(languages)s language"
msgstr "%(languages)s taal"
-#: bookwyrm/templates/book/publisher_info.html:65
+#: bookwyrm/templates/book/publisher_info.html:63
#, python-format
msgid "Published %(date)s by %(publisher)s."
msgstr "Gepubliceerd %(date)s door %(publisher)s."
+#: bookwyrm/templates/book/publisher_info.html:65
+#, python-format
+msgid "Published by %(publisher)s."
+msgstr "Gepubliceerd door %(publisher)s."
+
#: bookwyrm/templates/book/publisher_info.html:67
#, python-format
msgid "Published %(date)s"
msgstr "Gepubliceerd %(date)s"
-#: bookwyrm/templates/book/publisher_info.html:69
-#, python-format
-msgid "Published by %(publisher)s."
-msgstr "Gepubliceerd door %(publisher)s."
-
-#: bookwyrm/templates/book/rating.html:13
+#: bookwyrm/templates/book/rating.html:19
msgid "rated it"
msgstr "beoordeelde het"
@@ -1552,12 +1583,12 @@ msgstr "beoordeelde het"
msgid "Series by"
msgstr "Reeksen van"
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
#, python-format
msgid "Book %(series_number)s"
msgstr "Boek %(series_number)s"
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
msgid "Unsorted Book"
msgstr "Ongecategoriseerd boek"
@@ -1681,6 +1712,7 @@ msgstr "Aanbevolen"
#: bookwyrm/templates/ostatus/subscribe.html:42
#: bookwyrm/templates/ostatus/success.html:17
#: bookwyrm/templates/ostatus/success.html:18
+#: bookwyrm/templates/user/moved.html:19 bookwyrm/templates/user/moved.html:20
#: bookwyrm/templates/user/user_preview.html:16
#: bookwyrm/templates/user/user_preview.html:17
msgid "Locked account"
@@ -1755,7 +1787,7 @@ msgstr "%(username)s heeft %(username)s"
msgstr "Privéberichten met %(username)s"
#: bookwyrm/templates/feed/direct_messages.html:10
-#: bookwyrm/templates/user_menu.html:44
+#: bookwyrm/templates/user_menu.html:39
msgid "Direct Messages"
msgstr "Privéberichten"
@@ -1948,7 +1980,7 @@ msgstr "Updates"
#: bookwyrm/templates/feed/suggested_books.html:6
#: bookwyrm/templates/guided_tour/home.html:127
-#: bookwyrm/templates/user_menu.html:39
+#: bookwyrm/templates/layout.html:94
msgid "Your Books"
msgstr "Jouw boeken"
@@ -1996,19 +2028,19 @@ msgid "Add to your books"
msgstr "Voeg toe aan je boeken"
#: bookwyrm/templates/get_started/book_preview.html:10
-#: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37
+#: bookwyrm/templates/shelf/shelf.html:88 bookwyrm/templates/user/user.html:37
#: bookwyrm/templatetags/shelf_tags.py:14
msgid "To Read"
msgstr "Te lezen"
#: bookwyrm/templates/get_started/book_preview.html:11
-#: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38
+#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:38
#: bookwyrm/templatetags/shelf_tags.py:15
msgid "Currently Reading"
msgstr "Aan het lezen"
#: bookwyrm/templates/get_started/book_preview.html:12
-#: bookwyrm/templates/shelf/shelf.html:88
+#: bookwyrm/templates/shelf/shelf.html:90
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
@@ -2017,7 +2049,7 @@ msgid "Read"
msgstr "Gelezen"
#: bookwyrm/templates/get_started/book_preview.html:13
-#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40
+#: bookwyrm/templates/shelf/shelf.html:91 bookwyrm/templates/user/user.html:40
#: bookwyrm/templatetags/shelf_tags.py:17
msgid "Stopped Reading"
msgstr "Gestopt met lezen"
@@ -2027,7 +2059,7 @@ msgid "What are you reading?"
msgstr "Wat ben je aan het lezen?"
#: bookwyrm/templates/get_started/books.html:9
-#: bookwyrm/templates/layout.html:39 bookwyrm/templates/lists/list.html:213
+#: bookwyrm/templates/layout.html:41 bookwyrm/templates/lists/list.html:213
msgid "Search for a book"
msgstr "Zoek naar een boek"
@@ -2046,8 +2078,8 @@ msgstr "Je kan boeken toevoegen zodra je begint met het gebruiken van %(site_nam
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:15
-#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:45
-#: bookwyrm/templates/layout.html:46 bookwyrm/templates/lists/list.html:217
+#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:47
+#: bookwyrm/templates/layout.html:48 bookwyrm/templates/lists/list.html:217
#: bookwyrm/templates/search/layout.html:5
#: bookwyrm/templates/search/layout.html:10
#: bookwyrm/templates/search/layout.html:32
@@ -2514,8 +2546,8 @@ msgid "Barcode reader"
msgstr "Streepjescodelezer"
#: bookwyrm/templates/guided_tour/home.html:102
-msgid "Use the Feed, Lists and Discover links to discover the latest news from your feed, lists of books by topic, and the latest happenings on this Bookwyrm server!"
-msgstr "Gebruik de Feed, Lijsten en Ontdek links om het laatste nieuws van je feed, lijsten van boeken per onderwerp, en de laatste gebeurtenissen op deze BookWyrm server te ontdekken!"
+msgid "Use the Lists, Discover, and Your Books links to discover reading suggestions and the latest happenings on this server, or to see your catalogued books!"
+msgstr ""
#: bookwyrm/templates/guided_tour/home.html:103
msgid "Navigation Bar"
@@ -2538,16 +2570,16 @@ msgid "The bell will light up when you have a new notification. When it does, cl
msgstr "De bel zal oplichten wanneer je een nieuwe melding hebt. Wanneer dit het geval is, klik erop om erachter te komen wat voor spannends er is gebeurd!"
#: bookwyrm/templates/guided_tour/home.html:177
-#: bookwyrm/templates/layout.html:75 bookwyrm/templates/layout.html:106
-#: bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:77 bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:108
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr "Meldingen"
#: bookwyrm/templates/guided_tour/home.html:200
-msgid "Your profile, books, direct messages, and settings can be accessed by clicking on your name in the menu here."
-msgstr "Je profiel, boeken, privéberichten en instellingen kunnen worden geopend door op je naam te klikken in het menu hier."
+msgid "Your profile, user directory, direct messages, and settings can be accessed by clicking on your name in the menu here."
+msgstr ""
#: bookwyrm/templates/guided_tour/home.html:200
msgid "Try selecting Profile from the drop down menu to continue the tour."
@@ -2702,7 +2734,7 @@ msgstr "Je kunt een groep aanmaken of lid worden van een groep met andere gebrui
#: bookwyrm/templates/guided_tour/user_groups.html:11
#: bookwyrm/templates/guided_tour/user_profile.html:55
-#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:85
+#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:95
msgid "Groups"
msgstr "Groepen"
@@ -2747,7 +2779,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr "Dit is je gebruikersprofiel. Al je laatste activiteiten worden hier getoond. Andere Bookwyrm-gebruikers kunnen ook delen van deze pagina zien - wat ze kunnen zien hangt af van je privacy-instellingen."
#: bookwyrm/templates/guided_tour/user_profile.html:11
-#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:14
+#: bookwyrm/templates/user/layout.html:20 bookwyrm/templates/user/user.html:14
msgid "User Profile"
msgstr "Gebruikersprofiel"
@@ -2756,7 +2788,7 @@ msgid "This tab shows everything you have read towards your annual reading goal,
msgstr "Dit tabblad toont alles wat je hebt gelezen voor je jaarlijkse leesdoel, of stelt je in staat om er een in te stellen. Je hoeft geen leesdoel in te stellen als dat niet je ding is!"
#: bookwyrm/templates/guided_tour/user_profile.html:32
-#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:79
+#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:89
msgid "Reading Goal"
msgstr "Leesdoel"
@@ -2795,7 +2827,7 @@ msgstr "Er zijn nog geen activiteiten voor deze hashtag!"
#: bookwyrm/templates/import/import.html:5
#: bookwyrm/templates/import/import.html:9
-#: bookwyrm/templates/shelf/shelf.html:64
+#: bookwyrm/templates/shelf/shelf.html:66
msgid "Import Books"
msgstr "Importeer boeken"
@@ -2805,16 +2837,10 @@ msgstr "Geen geldig CSV-bestand"
#: bookwyrm/templates/import/import.html:21
#, python-format
-msgid "\n"
-" Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day.\n"
-" "
-msgid_plural "\n"
-" Currently, you are allowed to import %(import_size_limit)s books every %(import_limit_reset)s days.\n"
-" "
-msgstr[0] "\n"
-"Momenteel mag je elke %(import_limit_reset)s dag %(display_size)s boeken importeren. "
-msgstr[1] "\n"
-"Momenteel mag je elke %(import_limit_reset)s dagen %(import_size_limit)s boeken importeren. "
+msgid "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day."
+msgid_plural "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s days."
+msgstr[0] "Momenteel mag je %(display_size)s boek importeren elke %(import_limit_reset)s dagen."
+msgstr[1] "Momenteel mag je %(display_size)s boeken importeren elke %(import_limit_reset)s dagen."
#: bookwyrm/templates/import/import.html:27
#, python-format
@@ -2873,7 +2899,7 @@ msgstr "Privacyinstelling voor geïmporteerde recensies:"
#: bookwyrm/templates/import/import.html:106
#: bookwyrm/templates/import/import.html:108
-#: bookwyrm/templates/preferences/layout.html:35
+#: bookwyrm/templates/preferences/layout.html:43
#: bookwyrm/templates/settings/federation/instance_blocklist.html:78
msgid "Import"
msgstr "Importeren"
@@ -2972,8 +2998,8 @@ msgid "Row"
msgstr "Rij"
#: bookwyrm/templates/import/import_status.html:110
-#: bookwyrm/templates/shelf/shelf.html:148
-#: bookwyrm/templates/shelf/shelf.html:170
+#: bookwyrm/templates/shelf/shelf.html:150
+#: bookwyrm/templates/shelf/shelf.html:172
msgid "Title"
msgstr "Titel"
@@ -2986,8 +3012,8 @@ msgid "Openlibrary key"
msgstr "Openlibrary sleutel"
#: bookwyrm/templates/import/import_status.html:121
-#: bookwyrm/templates/shelf/shelf.html:149
-#: bookwyrm/templates/shelf/shelf.html:173
+#: bookwyrm/templates/shelf/shelf.html:151
+#: bookwyrm/templates/shelf/shelf.html:175
msgid "Author"
msgstr "Auteur"
@@ -3093,10 +3119,6 @@ msgstr "Neem contact op met je beheerder of USE_HTTPS should be enabled in production."
msgstr "Je draait BookWyrm in productie modus zonder https. USE_HTTPS zou moeten zijn ingeschakeld bij gebruik in productie."
-#: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:49
+#: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:44
msgid "Settings"
msgstr "Instellingen"
@@ -5889,7 +6040,7 @@ msgid "Need help?"
msgstr "Hulp nodig?"
#: bookwyrm/templates/shelf/create_shelf_form.html:5
-#: bookwyrm/templates/shelf/shelf.html:72
+#: bookwyrm/templates/shelf/shelf.html:74
msgid "Create shelf"
msgstr "Nieuwe boekenplank maken"
@@ -5897,58 +6048,58 @@ msgstr "Nieuwe boekenplank maken"
msgid "Edit Shelf"
msgstr "Bewerk boekenplank"
-#: bookwyrm/templates/shelf/shelf.html:24
+#: bookwyrm/templates/shelf/shelf.html:26
#: bookwyrm/templates/user/relationships/followers.html:18
#: bookwyrm/templates/user/relationships/following.html:18
msgid "User profile"
msgstr "Gebruikersprofiel"
-#: bookwyrm/templates/shelf/shelf.html:39
+#: bookwyrm/templates/shelf/shelf.html:41
#: bookwyrm/templatetags/shelf_tags.py:13 bookwyrm/views/shelf/shelf.py:53
msgid "All books"
msgstr "Alle boeken"
-#: bookwyrm/templates/shelf/shelf.html:97
+#: bookwyrm/templates/shelf/shelf.html:99
#, python-format
msgid "%(formatted_count)s book"
msgid_plural "%(formatted_count)s books"
msgstr[0] "%(formatted_count)s boek"
msgstr[1] "%(formatted_count)s boeken"
-#: bookwyrm/templates/shelf/shelf.html:104
+#: bookwyrm/templates/shelf/shelf.html:106
#, python-format
msgid "(showing %(start)s-%(end)s)"
msgstr "(%(start)s-%(end)s getoond)"
-#: bookwyrm/templates/shelf/shelf.html:116
+#: bookwyrm/templates/shelf/shelf.html:118
msgid "Edit shelf"
msgstr "Bewerk boekenplank"
-#: bookwyrm/templates/shelf/shelf.html:124
+#: bookwyrm/templates/shelf/shelf.html:126
msgid "Delete shelf"
msgstr "Verwijder boekenplank"
-#: bookwyrm/templates/shelf/shelf.html:152
-#: bookwyrm/templates/shelf/shelf.html:178
+#: bookwyrm/templates/shelf/shelf.html:154
+#: bookwyrm/templates/shelf/shelf.html:180
msgid "Shelved"
msgstr "Op boekenplank gezet"
-#: bookwyrm/templates/shelf/shelf.html:153
-#: bookwyrm/templates/shelf/shelf.html:181
+#: bookwyrm/templates/shelf/shelf.html:155
+#: bookwyrm/templates/shelf/shelf.html:183
msgid "Started"
msgstr "Begonnen"
-#: bookwyrm/templates/shelf/shelf.html:154
-#: bookwyrm/templates/shelf/shelf.html:184
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
msgid "Finished"
msgstr "Uitgelezen"
-#: bookwyrm/templates/shelf/shelf.html:154
-#: bookwyrm/templates/shelf/shelf.html:184
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
msgid "Until"
msgstr "Tot"
-#: bookwyrm/templates/shelf/shelf.html:210
+#: bookwyrm/templates/shelf/shelf.html:212
msgid "This shelf is empty."
msgstr "Deze boekenplank is leeg."
@@ -6254,6 +6405,15 @@ msgstr "Je hebt %(read_count)s van %(goal_count)s boeken%(read_count)s of %(goal_count)s books."
msgstr "%(username)s heeft %(read_count)s van %(goal_count)s boeken gelezen."
+#: bookwyrm/templates/snippets/move_user_buttons.html:10
+msgid "Follow at new account"
+msgstr "Volg op nieuwe account"
+
+#: bookwyrm/templates/snippets/moved_user_notice.html:7
+#, python-format
+msgid "%(user)s has moved to %(moved_to_name)s"
+msgstr ""
+
#: bookwyrm/templates/snippets/page_text.html:8
#, python-format
msgid "page %(page)s of %(total_pages)s"
@@ -6395,35 +6555,35 @@ msgstr "Stop met lezen"
msgid "Finish reading"
msgstr "Uitgelezen"
-#: bookwyrm/templates/snippets/status/content_status.html:80
+#: bookwyrm/templates/snippets/status/content_status.html:69
msgid "Show status"
msgstr "Toon status"
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "(Page %(page)s"
msgstr "(Pagina %(page)s"
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "%(endpage)s"
msgstr "%(endpage)s"
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid "(%(percent)s%%"
msgstr "(%(percent)s%%"
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid " - %(endpercent)s%%"
msgstr " - %(endpercent)s%%"
-#: bookwyrm/templates/snippets/status/content_status.html:127
+#: bookwyrm/templates/snippets/status/content_status.html:116
msgid "Open image in new window"
msgstr "Afbeelding in nieuw venster openen"
-#: bookwyrm/templates/snippets/status/content_status.html:148
+#: bookwyrm/templates/snippets/status/content_status.html:137
msgid "Hide status"
msgstr "Status verbergen"
@@ -6556,6 +6716,18 @@ msgstr "Meer weergeven"
msgid "Show less"
msgstr "Minder weergeven"
+#: bookwyrm/templates/snippets/user_active_tag.html:5
+msgid "Moved"
+msgstr "Verhuisd"
+
+#: bookwyrm/templates/snippets/user_active_tag.html:12
+msgid "Deleted"
+msgstr "Verwijderd"
+
+#: bookwyrm/templates/snippets/user_active_tag.html:15
+msgid "Inactive"
+msgstr "Inactief"
+
#: bookwyrm/templates/two_factor_auth/two_factor_login.html:29
msgid "2FA check"
msgstr "2FA controle"
@@ -6614,11 +6786,11 @@ msgstr "Jouw groepen"
msgid "Groups: %(username)s"
msgstr "Groepen: %(username)s"
-#: bookwyrm/templates/user/layout.html:50
+#: bookwyrm/templates/user/layout.html:59
msgid "Follow Requests"
msgstr "Volgverzoeken"
-#: bookwyrm/templates/user/layout.html:73
+#: bookwyrm/templates/user/layout.html:83
#: bookwyrm/templates/user/reviews_comments.html:6
#: bookwyrm/templates/user/reviews_comments.html:12
msgid "Reviews and Comments"
@@ -6633,7 +6805,13 @@ msgstr "Lijsten: %(username)s"
msgid "Create list"
msgstr "Lijst aanmaken"
-#: bookwyrm/templates/user/relationships/followers.html:31
+#: bookwyrm/templates/user/moved.html:25
+#: bookwyrm/templates/user/user_preview.html:22
+#, python-format
+msgid "Joined %(date)s"
+msgstr "Lid geworden %(date)s"
+
+#: bookwyrm/templates/user/relationships/followers.html:36
#, python-format
msgid "%(username)s has no followers"
msgstr "%(username)s heeft geen volgers"
@@ -6704,11 +6882,6 @@ msgstr "Alleen reacties"
msgid "No activities yet!"
msgstr "Nog geen activiteiten!"
-#: bookwyrm/templates/user/user_preview.html:22
-#, python-format
-msgid "Joined %(date)s"
-msgstr "Lid geworden %(date)s"
-
#: bookwyrm/templates/user/user_preview.html:26
#, python-format
msgid "%(display_count)s follower"
@@ -6736,10 +6909,6 @@ msgstr "Geen volgers die jij volgt"
msgid "View profile and more"
msgstr "Bekijk profiel en meer"
-#: bookwyrm/templates/user_menu.html:82
-msgid "Log out"
-msgstr "Uitloggen"
-
#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:28
msgid "File exceeds maximum size: 10MB"
msgstr "Het bestand overschrijdt de maximale grootte: 10MB"
@@ -6756,7 +6925,7 @@ msgid_plural "%(num)d books - by %(user)s"
msgstr[0] "%(num)d boek - van %(user)s"
msgstr[1] "%(num)d boeken - van %(user)s"
-#: bookwyrm/templatetags/utilities.py:39
+#: bookwyrm/templatetags/utilities.py:49
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"
diff --git a/locale/no_NO/LC_MESSAGES/django.mo b/locale/no_NO/LC_MESSAGES/django.mo
index 66dfbb931..9fad84bd2 100644
Binary files a/locale/no_NO/LC_MESSAGES/django.mo and b/locale/no_NO/LC_MESSAGES/django.mo differ
diff --git a/locale/no_NO/LC_MESSAGES/django.po b/locale/no_NO/LC_MESSAGES/django.po
index 851887e7c..3c3cc66c5 100644
--- a/locale/no_NO/LC_MESSAGES/django.po
+++ b/locale/no_NO/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-27 01:11+0000\n"
-"PO-Revision-Date: 2023-09-28 00:08\n"
+"POT-Creation-Date: 2023-12-30 23:52+0000\n"
+"PO-Revision-Date: 2024-01-02 03:12\n"
"Last-Translator: Mouse Reeve %(level)s
."
+msgstr ""
+
+#: bookwyrm/templates/403.html:15
+msgid "If you think you should have access, please speak to your BookWyrm server administrator."
+msgstr ""
+
#: bookwyrm/templates/404.html:4 bookwyrm/templates/404.html:8
msgid "Not Found"
msgstr "Fant ikke"
@@ -476,6 +496,20 @@ msgstr "Fant ikke"
msgid "The page you requested doesn't seem to exist!"
msgstr "Den siden synes ikke å eksistere!"
+#: bookwyrm/templates/413.html:4 bookwyrm/templates/413.html:8
+msgid "File too large"
+msgstr ""
+
+#: bookwyrm/templates/413.html:9
+msgid "The file you are uploading is too large."
+msgstr ""
+
+#: bookwyrm/templates/413.html:11
+msgid "\n"
+" You you can try using a smaller file, or ask your BookWyrm server administrator to increase the DATA_UPLOAD_MAX_MEMORY_SIZE
setting.\n"
+" "
+msgstr ""
+
#: bookwyrm/templates/500.html:4
msgid "Oops!"
msgstr "Oops!"
@@ -536,12 +570,12 @@ msgstr "%(site_name)s sine moderatorer og administratorer holder nettsida oppe o
msgid "Moderator"
msgstr "Moderator"
-#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:67
+#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:62
msgid "Admin"
msgstr "Admin"
#: bookwyrm/templates/about/about.html:140
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:28
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
msgid "Send direct message"
@@ -575,7 +609,7 @@ msgid "Software version:"
msgstr "Programvareversjon:"
#: bookwyrm/templates/about/layout.html:30
-#: bookwyrm/templates/embed-layout.html:33
+#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/snippets/footer.html:8
#, python-format
msgid "About %(site_name)s"
@@ -680,7 +714,7 @@ msgstr "Den korteste teksten lest i år…"
#: bookwyrm/templates/annual_summary/layout.html:157
#: bookwyrm/templates/annual_summary/layout.html:178
#: bookwyrm/templates/annual_summary/layout.html:247
-#: bookwyrm/templates/book/book.html:63
+#: bookwyrm/templates/book/book.html:65
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
@@ -768,24 +802,24 @@ msgid "View ISNI record"
msgstr "Vis ISNI -oppføring"
#: bookwyrm/templates/author/author.html:95
-#: bookwyrm/templates/book/book.html:173
+#: bookwyrm/templates/book/book.html:175
msgid "View on ISFDB"
msgstr "Vis på ISFDB"
#: bookwyrm/templates/author/author.html:100
#: bookwyrm/templates/author/sync_modal.html:5
-#: bookwyrm/templates/book/book.html:140
+#: bookwyrm/templates/book/book.html:142
#: bookwyrm/templates/book/sync_modal.html:5
msgid "Load data"
msgstr "Last inn data"
#: bookwyrm/templates/author/author.html:104
-#: bookwyrm/templates/book/book.html:144
+#: bookwyrm/templates/book/book.html:146
msgid "View on OpenLibrary"
msgstr "Vis på OpenLibrary"
#: bookwyrm/templates/author/author.html:119
-#: bookwyrm/templates/book/book.html:158
+#: bookwyrm/templates/book/book.html:160
msgid "View on Inventaire"
msgstr "Vis på Inventaire"
@@ -797,11 +831,7 @@ msgstr "Vis på LibraryThing"
msgid "View on Goodreads"
msgstr "Vis på Goodreads"
-#: bookwyrm/templates/author/author.html:151
-msgid "View ISFDB entry"
-msgstr "Vis ISFDB-oppføring"
-
-#: bookwyrm/templates/author/author.html:166
+#: bookwyrm/templates/author/author.html:158
#, python-format
msgid "Books by %(name)s"
msgstr "Bøker av %(name)s"
@@ -910,7 +940,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:89
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save"
@@ -959,19 +989,19 @@ msgstr "Bekreft"
msgid "Unable to connect to remote source."
msgstr "Kunne ikke koble til ekstern kilde."
-#: bookwyrm/templates/book/book.html:71 bookwyrm/templates/book/book.html:72
+#: bookwyrm/templates/book/book.html:73 bookwyrm/templates/book/book.html:74
msgid "Edit Book"
msgstr "Rediger bok"
-#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:100
+#: bookwyrm/templates/book/book.html:99 bookwyrm/templates/book/book.html:102
msgid "Click to add cover"
msgstr "Klikk for å legge til omslag"
-#: bookwyrm/templates/book/book.html:106
+#: bookwyrm/templates/book/book.html:108
msgid "Failed to load cover"
msgstr "Klarte ikke å laste inn omslag"
-#: bookwyrm/templates/book/book.html:117
+#: bookwyrm/templates/book/book.html:119
msgid "Click to enlarge"
msgstr "Klikk for å forstørre"
@@ -1046,13 +1076,13 @@ msgstr "Steder"
#: bookwyrm/templates/guided_tour/lists.html:14
#: bookwyrm/templates/guided_tour/user_books.html:102
#: bookwyrm/templates/guided_tour/user_profile.html:78
-#: bookwyrm/templates/layout.html:90 bookwyrm/templates/lists/curate.html:8
+#: bookwyrm/templates/layout.html:88 bookwyrm/templates/lists/curate.html:8
#: bookwyrm/templates/lists/list.html:12 bookwyrm/templates/lists/lists.html:5
#: bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:26
#: bookwyrm/templates/search/layout.html:51
#: bookwyrm/templates/settings/celery.html:77
-#: bookwyrm/templates/user/layout.html:91 bookwyrm/templates/user/lists.html:6
+#: bookwyrm/templates/user/layout.html:101 bookwyrm/templates/user/lists.html:6
msgid "Lists"
msgstr "Lister"
@@ -1117,8 +1147,8 @@ msgstr "Last opp omslag:"
#: bookwyrm/templates/book/cover_add_modal.html:23
#: bookwyrm/templates/book/edit/edit_book_form.html:250
-msgid "Load cover from url:"
-msgstr "Last bilde av omslag fra nettadresse:"
+msgid "Load cover from URL:"
+msgstr "Last inn omslag fra hyperlenke:"
#: bookwyrm/templates/book/cover_show_modal.html:6
msgid "Book cover preview"
@@ -1328,7 +1358,7 @@ msgid "Add Another Author"
msgstr "Legg til enda en forfatter"
#: bookwyrm/templates/book/edit/edit_book_form.html:231
-#: bookwyrm/templates/shelf/shelf.html:147
+#: bookwyrm/templates/shelf/shelf.html:149
msgid "Cover"
msgstr "Omslag"
@@ -1372,8 +1402,8 @@ msgstr "Utgaver av %(book_title)s"
#: bookwyrm/templates/book/editions/editions.html:8
#, python-format
-msgid "Editions of \"%(work_title)s\""
-msgstr "Utgaver av \"%(work_title)s\""
+msgid "Editions of %(work_title)s"
+msgstr ""
#: bookwyrm/templates/book/editions/editions.html:55
msgid "Can't find the edition you're looking for?"
@@ -1455,8 +1485,9 @@ msgstr "Domene"
#: bookwyrm/templates/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
#: bookwyrm/templates/settings/invites/status_filter.html:5
+#: bookwyrm/templates/settings/themes.html:111
#: bookwyrm/templates/settings/users/user_admin.html:56
-#: bookwyrm/templates/settings/users/user_info.html:24
+#: bookwyrm/templates/settings/users/user_info.html:35
msgid "Status"
msgstr "Status"
@@ -1465,7 +1496,7 @@ msgstr "Status"
#: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/imports/imports.html:141
#: bookwyrm/templates/settings/reports/report_links_table.html:6
-#: bookwyrm/templates/settings/themes.html:99
+#: bookwyrm/templates/settings/themes.html:108
msgid "Actions"
msgstr "Handlinger"
@@ -1529,22 +1560,22 @@ msgstr "%(pages)s sider"
msgid "%(languages)s language"
msgstr "%(languages)s språk"
-#: bookwyrm/templates/book/publisher_info.html:65
+#: bookwyrm/templates/book/publisher_info.html:63
#, python-format
msgid "Published %(date)s by %(publisher)s."
msgstr "Utgitt %(date)s av %(publisher)s."
+#: bookwyrm/templates/book/publisher_info.html:65
+#, python-format
+msgid "Published by %(publisher)s."
+msgstr "Utgitt av %(publisher)s."
+
#: bookwyrm/templates/book/publisher_info.html:67
#, python-format
msgid "Published %(date)s"
msgstr "Utgitt %(date)s"
-#: bookwyrm/templates/book/publisher_info.html:69
-#, python-format
-msgid "Published by %(publisher)s."
-msgstr "Utgitt av %(publisher)s."
-
-#: bookwyrm/templates/book/rating.html:13
+#: bookwyrm/templates/book/rating.html:19
msgid "rated it"
msgstr "vurderte den"
@@ -1552,12 +1583,12 @@ msgstr "vurderte den"
msgid "Series by"
msgstr "En serie av"
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
#, python-format
msgid "Book %(series_number)s"
msgstr "Bok %(series_number)s"
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
msgid "Unsorted Book"
msgstr "Usortert bok"
@@ -1681,6 +1712,7 @@ msgstr "Foreslått"
#: bookwyrm/templates/ostatus/subscribe.html:42
#: bookwyrm/templates/ostatus/success.html:17
#: bookwyrm/templates/ostatus/success.html:18
+#: bookwyrm/templates/user/moved.html:19 bookwyrm/templates/user/moved.html:20
#: bookwyrm/templates/user/user_preview.html:16
#: bookwyrm/templates/user/user_preview.html:17
msgid "Locked account"
@@ -1755,7 +1787,7 @@ msgstr "%(username)s siterte %(username)s"
msgstr "Direktemeldinger med %(username)s"
#: bookwyrm/templates/feed/direct_messages.html:10
-#: bookwyrm/templates/user_menu.html:44
+#: bookwyrm/templates/user_menu.html:39
msgid "Direct Messages"
msgstr "Direktemeldinger"
@@ -1948,7 +1980,7 @@ msgstr "Oppdateringer"
#: bookwyrm/templates/feed/suggested_books.html:6
#: bookwyrm/templates/guided_tour/home.html:127
-#: bookwyrm/templates/user_menu.html:39
+#: bookwyrm/templates/layout.html:94
msgid "Your Books"
msgstr "Bøkene dine"
@@ -1996,19 +2028,19 @@ msgid "Add to your books"
msgstr "Legg til i bøkene dine"
#: bookwyrm/templates/get_started/book_preview.html:10
-#: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37
+#: bookwyrm/templates/shelf/shelf.html:88 bookwyrm/templates/user/user.html:37
#: bookwyrm/templatetags/shelf_tags.py:14
msgid "To Read"
msgstr "Å lese"
#: bookwyrm/templates/get_started/book_preview.html:11
-#: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38
+#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:38
#: bookwyrm/templatetags/shelf_tags.py:15
msgid "Currently Reading"
msgstr "Leser nå"
#: bookwyrm/templates/get_started/book_preview.html:12
-#: bookwyrm/templates/shelf/shelf.html:88
+#: bookwyrm/templates/shelf/shelf.html:90
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
@@ -2017,7 +2049,7 @@ msgid "Read"
msgstr "Lest"
#: bookwyrm/templates/get_started/book_preview.html:13
-#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40
+#: bookwyrm/templates/shelf/shelf.html:91 bookwyrm/templates/user/user.html:40
#: bookwyrm/templatetags/shelf_tags.py:17
msgid "Stopped Reading"
msgstr "Stoppet lesing"
@@ -2027,7 +2059,7 @@ msgid "What are you reading?"
msgstr "Hva er det du leser nå?"
#: bookwyrm/templates/get_started/books.html:9
-#: bookwyrm/templates/layout.html:39 bookwyrm/templates/lists/list.html:213
+#: bookwyrm/templates/layout.html:41 bookwyrm/templates/lists/list.html:213
msgid "Search for a book"
msgstr "Søk etter en bok"
@@ -2046,8 +2078,8 @@ msgstr "Du kan legge til bøker når du begynner å bruke %(site_name)s."
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:15
-#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:45
-#: bookwyrm/templates/layout.html:46 bookwyrm/templates/lists/list.html:217
+#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:47
+#: bookwyrm/templates/layout.html:48 bookwyrm/templates/lists/list.html:217
#: bookwyrm/templates/search/layout.html:5
#: bookwyrm/templates/search/layout.html:10
#: bookwyrm/templates/search/layout.html:32
@@ -2514,8 +2546,8 @@ msgid "Barcode reader"
msgstr "Strekkodeleser"
#: bookwyrm/templates/guided_tour/home.html:102
-msgid "Use the Feed, Lists and Discover links to discover the latest news from your feed, lists of books by topic, and the latest happenings on this Bookwyrm server!"
-msgstr "Bruk lenkene Strøm, Lister og Oppdag for å få de seneste nyhetene fra strømmen din, lister over bøker etter emne, og siste nytt på denne BookWyrm-serveren!"
+msgid "Use the Lists, Discover, and Your Books links to discover reading suggestions and the latest happenings on this server, or to see your catalogued books!"
+msgstr ""
#: bookwyrm/templates/guided_tour/home.html:103
msgid "Navigation Bar"
@@ -2538,16 +2570,16 @@ msgid "The bell will light up when you have a new notification. When it does, cl
msgstr "Klokka lyser opp når du får ny varsel. Når det skjer, klikk på den for å finne ut hva spennende som har skjedd!"
#: bookwyrm/templates/guided_tour/home.html:177
-#: bookwyrm/templates/layout.html:75 bookwyrm/templates/layout.html:106
-#: bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:77 bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:108
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr "Varsler"
#: bookwyrm/templates/guided_tour/home.html:200
-msgid "Your profile, books, direct messages, and settings can be accessed by clicking on your name in the menu here."
-msgstr "Din profil, bøker, direktemeldinger og innstillinger kan nås ved å klikke på navnet ditt i denne menyen."
+msgid "Your profile, user directory, direct messages, and settings can be accessed by clicking on your name in the menu here."
+msgstr ""
#: bookwyrm/templates/guided_tour/home.html:200
msgid "Try selecting Profile from the drop down menu to continue the tour."
@@ -2702,7 +2734,7 @@ msgstr "Du kan opprette eller bli med i en gruppe med andre brukere. Grupper kan
#: bookwyrm/templates/guided_tour/user_groups.html:11
#: bookwyrm/templates/guided_tour/user_profile.html:55
-#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:85
+#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:95
msgid "Groups"
msgstr "Grupper"
@@ -2747,7 +2779,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr ""
#: bookwyrm/templates/guided_tour/user_profile.html:11
-#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:14
+#: bookwyrm/templates/user/layout.html:20 bookwyrm/templates/user/user.html:14
msgid "User Profile"
msgstr "Brukerprofil"
@@ -2756,7 +2788,7 @@ msgid "This tab shows everything you have read towards your annual reading goal,
msgstr ""
#: bookwyrm/templates/guided_tour/user_profile.html:32
-#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:79
+#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:89
msgid "Reading Goal"
msgstr "Lesemål"
@@ -2795,7 +2827,7 @@ msgstr "Ingen aktiviteter for denne emneknaggen ennå!"
#: bookwyrm/templates/import/import.html:5
#: bookwyrm/templates/import/import.html:9
-#: bookwyrm/templates/shelf/shelf.html:64
+#: bookwyrm/templates/shelf/shelf.html:66
msgid "Import Books"
msgstr "Importer bøker"
@@ -2805,12 +2837,8 @@ msgstr "Ikke en gyldig CSV-fil"
#: bookwyrm/templates/import/import.html:21
#, python-format
-msgid "\n"
-" Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day.\n"
-" "
-msgid_plural "\n"
-" Currently, you are allowed to import %(import_size_limit)s books every %(import_limit_reset)s days.\n"
-" "
+msgid "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day."
+msgid_plural "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s days."
msgstr[0] ""
msgstr[1] ""
@@ -2871,7 +2899,7 @@ msgstr "Personverninnstilling for importerte anmeldelser:"
#: bookwyrm/templates/import/import.html:106
#: bookwyrm/templates/import/import.html:108
-#: bookwyrm/templates/preferences/layout.html:35
+#: bookwyrm/templates/preferences/layout.html:43
#: bookwyrm/templates/settings/federation/instance_blocklist.html:78
msgid "Import"
msgstr "Importér"
@@ -2970,8 +2998,8 @@ msgid "Row"
msgstr "Rad"
#: bookwyrm/templates/import/import_status.html:110
-#: bookwyrm/templates/shelf/shelf.html:148
-#: bookwyrm/templates/shelf/shelf.html:170
+#: bookwyrm/templates/shelf/shelf.html:150
+#: bookwyrm/templates/shelf/shelf.html:172
msgid "Title"
msgstr "Tittel"
@@ -2984,8 +3012,8 @@ msgid "Openlibrary key"
msgstr "Openlibrary nøkkel"
#: bookwyrm/templates/import/import_status.html:121
-#: bookwyrm/templates/shelf/shelf.html:149
-#: bookwyrm/templates/shelf/shelf.html:173
+#: bookwyrm/templates/shelf/shelf.html:151
+#: bookwyrm/templates/shelf/shelf.html:175
msgid "Author"
msgstr "Forfatter"
@@ -3091,10 +3119,6 @@ msgstr "Kontakt systemansvarlig eller DATA_UPLOAD_MAX_MEMORY_SIZE setting.\n"
+" "
+msgstr ""
+
#: bookwyrm/templates/500.html:4
msgid "Oops!"
msgstr "Ups!"
@@ -502,7 +536,7 @@ msgstr "Witaj na %(site_name)s!"
#: bookwyrm/templates/about/about.html:25
#, python-format
msgid "%(site_name)s is part of BookWyrm, a network of independent, self-directed communities for readers. While you can interact seamlessly with users anywhere in the BookWyrm network, this community is unique."
-msgstr ""
+msgstr "%(site_name)s jest częścią BookWyrm, sieci niezależnych, samostanowiących społeczności czytelników. Możesz beproblemowo wchodzić w interakcje z użytkownikami gdziekolwiek w sieci BookWyrm, ta społeczność jest wyjątkowa."
#: bookwyrm/templates/about/about.html:45
#, python-format
@@ -521,7 +555,7 @@ msgstr "%(title)s ma najbardziej podzielo
#: bookwyrm/templates/about/about.html:94
msgid "Track your reading, talk about books, write reviews, and discover what to read next. Always ad-free, anti-corporate, and community-oriented, BookWyrm is human-scale software, designed to stay small and personal. If you have feature requests, bug reports, or grand dreams, reach out and make yourself heard."
-msgstr ""
+msgstr "Śledź swój postęp czytelniczy, rozmawiaj o książkach, pisz opinie i odkrywaj co czytać następne. Na zawsze bez reklam, antykorporacyjne i skierowane w stronę społeczności, BookWyrm jest programem dla ludzi, stworzonym, by pozostać małym i personalnym. Jeśli masz pomysł, zauważył_ś błąd, albo masz wielkie marzenie, złoś się i pozwól się wysłuchać."
#: bookwyrm/templates/about/about.html:105
msgid "Meet your admins"
@@ -536,12 +570,12 @@ msgstr "Moderatorzy oraz administratorzy %(site_name)s odpowiadają za prawidło
msgid "Moderator"
msgstr "Moderator"
-#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:67
+#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:62
msgid "Admin"
msgstr "Administrator"
#: bookwyrm/templates/about/about.html:140
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:28
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
msgid "Send direct message"
@@ -575,7 +609,7 @@ msgid "Software version:"
msgstr "Wersja oprogramowania:"
#: bookwyrm/templates/about/layout.html:30
-#: bookwyrm/templates/embed-layout.html:33
+#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/snippets/footer.html:8
#, python-format
msgid "About %(site_name)s"
@@ -672,7 +706,7 @@ msgstr "Przekłada się to na średnio %(pages)s stron na książkę."
#, python-format
msgid "(No page data was available for %(no_page_number)s book)"
msgid_plural "(No page data was available for %(no_page_number)s books)"
-msgstr[0] ""
+msgstr[0] "(Nie mamy informacji o liczbie stron dla książki %(no_page_number)s)"
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
@@ -684,7 +718,7 @@ msgstr "Najkrócej wczytano się w…"
#: bookwyrm/templates/annual_summary/layout.html:157
#: bookwyrm/templates/annual_summary/layout.html:178
#: bookwyrm/templates/annual_summary/layout.html:247
-#: bookwyrm/templates/book/book.html:63
+#: bookwyrm/templates/book/book.html:65
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
@@ -776,24 +810,24 @@ msgid "View ISNI record"
msgstr "Zobacz wpis ISNI"
#: bookwyrm/templates/author/author.html:95
-#: bookwyrm/templates/book/book.html:173
+#: bookwyrm/templates/book/book.html:175
msgid "View on ISFDB"
-msgstr ""
+msgstr "Zobacz na ISFDB"
#: bookwyrm/templates/author/author.html:100
#: bookwyrm/templates/author/sync_modal.html:5
-#: bookwyrm/templates/book/book.html:140
+#: bookwyrm/templates/book/book.html:142
#: bookwyrm/templates/book/sync_modal.html:5
msgid "Load data"
msgstr "Wczytaj dane"
#: bookwyrm/templates/author/author.html:104
-#: bookwyrm/templates/book/book.html:144
+#: bookwyrm/templates/book/book.html:146
msgid "View on OpenLibrary"
msgstr "Pokaż na OpenLibrary"
#: bookwyrm/templates/author/author.html:119
-#: bookwyrm/templates/book/book.html:158
+#: bookwyrm/templates/book/book.html:160
msgid "View on Inventaire"
msgstr "Pokaż na Inventaire"
@@ -805,11 +839,7 @@ msgstr "Pokaż na LibraryThing"
msgid "View on Goodreads"
msgstr "Pokaż na Goodreads"
-#: bookwyrm/templates/author/author.html:151
-msgid "View ISFDB entry"
-msgstr ""
-
-#: bookwyrm/templates/author/author.html:166
+#: bookwyrm/templates/author/author.html:158
#, python-format
msgid "Books by %(name)s"
msgstr "Książki autorstwa %(name)s"
@@ -918,7 +948,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:89
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save"
@@ -967,19 +997,19 @@ msgstr "Zatwierdź"
msgid "Unable to connect to remote source."
msgstr "Błąd połączenia ze zdalnym źródłem."
-#: bookwyrm/templates/book/book.html:71 bookwyrm/templates/book/book.html:72
+#: bookwyrm/templates/book/book.html:73 bookwyrm/templates/book/book.html:74
msgid "Edit Book"
msgstr "Edytuj książkę"
-#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:100
+#: bookwyrm/templates/book/book.html:99 bookwyrm/templates/book/book.html:102
msgid "Click to add cover"
msgstr "Naciśnij, aby dodać okładkę"
-#: bookwyrm/templates/book/book.html:106
+#: bookwyrm/templates/book/book.html:108
msgid "Failed to load cover"
msgstr "Błąd wczytywania okładki"
-#: bookwyrm/templates/book/book.html:117
+#: bookwyrm/templates/book/book.html:119
msgid "Click to enlarge"
msgstr "Naciśnij, aby powiększyć"
@@ -1058,13 +1088,13 @@ msgstr "Miejsca"
#: bookwyrm/templates/guided_tour/lists.html:14
#: bookwyrm/templates/guided_tour/user_books.html:102
#: bookwyrm/templates/guided_tour/user_profile.html:78
-#: bookwyrm/templates/layout.html:90 bookwyrm/templates/lists/curate.html:8
+#: bookwyrm/templates/layout.html:88 bookwyrm/templates/lists/curate.html:8
#: bookwyrm/templates/lists/list.html:12 bookwyrm/templates/lists/lists.html:5
#: bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:26
#: bookwyrm/templates/search/layout.html:51
#: bookwyrm/templates/settings/celery.html:77
-#: bookwyrm/templates/user/layout.html:91 bookwyrm/templates/user/lists.html:6
+#: bookwyrm/templates/user/layout.html:101 bookwyrm/templates/user/lists.html:6
msgid "Lists"
msgstr "Listy"
@@ -1116,7 +1146,7 @@ msgstr ""
#: bookwyrm/templates/book/book_identifiers.html:51
msgid "Goodreads:"
-msgstr ""
+msgstr "Goodreads:"
#: bookwyrm/templates/book/cover_add_modal.html:5
msgid "Add cover"
@@ -1129,8 +1159,8 @@ msgstr "Prześlij okładkę:"
#: bookwyrm/templates/book/cover_add_modal.html:23
#: bookwyrm/templates/book/edit/edit_book_form.html:250
-msgid "Load cover from url:"
-msgstr "Wczytaj okładkę z adresu URL:"
+msgid "Load cover from URL:"
+msgstr ""
#: bookwyrm/templates/book/cover_show_modal.html:6
msgid "Book cover preview"
@@ -1257,7 +1287,7 @@ msgstr "Tytuł:"
#: bookwyrm/templates/book/edit/edit_book_form.html:35
msgid "Sort Title:"
-msgstr ""
+msgstr "Sortuj Według Tytułu:"
#: bookwyrm/templates/book/edit/edit_book_form.html:44
msgid "Subtitle:"
@@ -1340,7 +1370,7 @@ msgid "Add Another Author"
msgstr "Dodaj kolejnego autora"
#: bookwyrm/templates/book/edit/edit_book_form.html:231
-#: bookwyrm/templates/shelf/shelf.html:147
+#: bookwyrm/templates/shelf/shelf.html:149
msgid "Cover"
msgstr "Okładka"
@@ -1384,8 +1414,8 @@ msgstr "Edycje %(book_title)s"
#: bookwyrm/templates/book/editions/editions.html:8
#, python-format
-msgid "Editions of \"%(work_title)s\""
-msgstr "Edycje \"%(work_title)s\""
+msgid "Editions of %(work_title)s"
+msgstr "Edycje %(work_title)s"
#: bookwyrm/templates/book/editions/editions.html:55
msgid "Can't find the edition you're looking for?"
@@ -1467,8 +1497,9 @@ msgstr "Domena"
#: bookwyrm/templates/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
#: bookwyrm/templates/settings/invites/status_filter.html:5
+#: bookwyrm/templates/settings/themes.html:111
#: bookwyrm/templates/settings/users/user_admin.html:56
-#: bookwyrm/templates/settings/users/user_info.html:24
+#: bookwyrm/templates/settings/users/user_info.html:35
msgid "Status"
msgstr "Status"
@@ -1477,7 +1508,7 @@ msgstr "Status"
#: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/imports/imports.html:141
#: bookwyrm/templates/settings/reports/report_links_table.html:6
-#: bookwyrm/templates/settings/themes.html:99
+#: bookwyrm/templates/settings/themes.html:108
msgid "Actions"
msgstr "Czynności"
@@ -1541,22 +1572,22 @@ msgstr "%(pages)s stron"
msgid "%(languages)s language"
msgstr "Język %(languages)s"
-#: bookwyrm/templates/book/publisher_info.html:65
+#: bookwyrm/templates/book/publisher_info.html:63
#, python-format
msgid "Published %(date)s by %(publisher)s."
msgstr "Opublikowane %(date)s przez %(publisher)s."
+#: bookwyrm/templates/book/publisher_info.html:65
+#, python-format
+msgid "Published by %(publisher)s."
+msgstr "Opublikowane przez %(publisher)s."
+
#: bookwyrm/templates/book/publisher_info.html:67
#, python-format
msgid "Published %(date)s"
msgstr "Opublikowane %(date)s"
-#: bookwyrm/templates/book/publisher_info.html:69
-#, python-format
-msgid "Published by %(publisher)s."
-msgstr "Opublikowane przez %(publisher)s."
-
-#: bookwyrm/templates/book/rating.html:13
+#: bookwyrm/templates/book/rating.html:19
msgid "rated it"
msgstr "ocenia to"
@@ -1564,12 +1595,12 @@ msgstr "ocenia to"
msgid "Series by"
msgstr ""
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
#, python-format
msgid "Book %(series_number)s"
-msgstr ""
+msgstr "Książka%(series_number)s"
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
msgid "Unsorted Book"
msgstr ""
@@ -1693,6 +1724,7 @@ msgstr "Polecane"
#: bookwyrm/templates/ostatus/subscribe.html:42
#: bookwyrm/templates/ostatus/success.html:17
#: bookwyrm/templates/ostatus/success.html:18
+#: bookwyrm/templates/user/moved.html:19 bookwyrm/templates/user/moved.html:20
#: bookwyrm/templates/user/user_preview.html:16
#: bookwyrm/templates/user/user_preview.html:17
msgid "Locked account"
@@ -1771,7 +1803,7 @@ msgstr "%(username)s cytuje %(username)s"
msgstr "Wiadomości bezpośrednie z %(username)s"
#: bookwyrm/templates/feed/direct_messages.html:10
-#: bookwyrm/templates/user_menu.html:44
+#: bookwyrm/templates/user_menu.html:39
msgid "Direct Messages"
msgstr "Wiadomości bezpośrednie"
@@ -1964,7 +1996,7 @@ msgstr "Aktualizacje"
#: bookwyrm/templates/feed/suggested_books.html:6
#: bookwyrm/templates/guided_tour/home.html:127
-#: bookwyrm/templates/user_menu.html:39
+#: bookwyrm/templates/layout.html:94
msgid "Your Books"
msgstr "Twoje książki"
@@ -2012,19 +2044,19 @@ msgid "Add to your books"
msgstr "Dodaj do swoich książek"
#: bookwyrm/templates/get_started/book_preview.html:10
-#: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37
+#: bookwyrm/templates/shelf/shelf.html:88 bookwyrm/templates/user/user.html:37
#: bookwyrm/templatetags/shelf_tags.py:14
msgid "To Read"
msgstr "Do przeczytania"
#: bookwyrm/templates/get_started/book_preview.html:11
-#: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38
+#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:38
#: bookwyrm/templatetags/shelf_tags.py:15
msgid "Currently Reading"
msgstr "Obecnie czytane"
#: bookwyrm/templates/get_started/book_preview.html:12
-#: bookwyrm/templates/shelf/shelf.html:88
+#: bookwyrm/templates/shelf/shelf.html:90
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
@@ -2033,7 +2065,7 @@ msgid "Read"
msgstr "Przeczytane"
#: bookwyrm/templates/get_started/book_preview.html:13
-#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40
+#: bookwyrm/templates/shelf/shelf.html:91 bookwyrm/templates/user/user.html:40
#: bookwyrm/templatetags/shelf_tags.py:17
msgid "Stopped Reading"
msgstr "Zaprzestano czytania"
@@ -2043,7 +2075,7 @@ msgid "What are you reading?"
msgstr "Co teraz czytasz?"
#: bookwyrm/templates/get_started/books.html:9
-#: bookwyrm/templates/layout.html:39 bookwyrm/templates/lists/list.html:213
+#: bookwyrm/templates/layout.html:41 bookwyrm/templates/lists/list.html:213
msgid "Search for a book"
msgstr "Szukaj książkę"
@@ -2062,8 +2094,8 @@ msgstr "Możesz dodawać książki, gdy zaczniesz używać %(site_name)s."
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:15
-#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:45
-#: bookwyrm/templates/layout.html:46 bookwyrm/templates/lists/list.html:217
+#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:47
+#: bookwyrm/templates/layout.html:48 bookwyrm/templates/lists/list.html:217
#: bookwyrm/templates/search/layout.html:5
#: bookwyrm/templates/search/layout.html:10
#: bookwyrm/templates/search/layout.html:32
@@ -2534,7 +2566,7 @@ msgid "Barcode reader"
msgstr "Czytnik kodów kreskowych"
#: bookwyrm/templates/guided_tour/home.html:102
-msgid "Use the Feed, Lists and Discover links to discover the latest news from your feed, lists of books by topic, and the latest happenings on this Bookwyrm server!"
+msgid "Use the Lists, Discover, and Your Books links to discover reading suggestions and the latest happenings on this server, or to see your catalogued books!"
msgstr ""
#: bookwyrm/templates/guided_tour/home.html:103
@@ -2558,16 +2590,16 @@ msgid "The bell will light up when you have a new notification. When it does, cl
msgstr "Dzwonek podświetli się, gdy dostaniesz nowe powiadomienie. Gdy tak się stanie, naciśnij na niego, aby zobaczyć co ciekawego się wydarzyło!"
#: bookwyrm/templates/guided_tour/home.html:177
-#: bookwyrm/templates/layout.html:75 bookwyrm/templates/layout.html:106
-#: bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:77 bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:108
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr "Powiadomienia"
#: bookwyrm/templates/guided_tour/home.html:200
-msgid "Your profile, books, direct messages, and settings can be accessed by clicking on your name in the menu here."
-msgstr "Dostęp do swojego profilu, książek, wiadomości oraz ustawień możesz uzyskać po naciśnięciu na swoją nazwę w menu."
+msgid "Your profile, user directory, direct messages, and settings can be accessed by clicking on your name in the menu here."
+msgstr ""
#: bookwyrm/templates/guided_tour/home.html:200
msgid "Try selecting Profile from the drop down menu to continue the tour."
@@ -2722,7 +2754,7 @@ msgstr "Możesz utworzyć lub dołączyć do grupy z pozostałymi użytkownikami
#: bookwyrm/templates/guided_tour/user_groups.html:11
#: bookwyrm/templates/guided_tour/user_profile.html:55
-#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:85
+#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:95
msgid "Groups"
msgstr "Grupy"
@@ -2767,7 +2799,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr "To jest Twój profil użytkownika. Wszystkie Twoje najnowsze aktywności będą tutaj widoczne. Pozostali użytkownicy BookWyrm mogą również widzieć części tej strony - to, co mogą zobaczyć zależy od Twoich ustawień prywatności."
#: bookwyrm/templates/guided_tour/user_profile.html:11
-#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:14
+#: bookwyrm/templates/user/layout.html:20 bookwyrm/templates/user/user.html:14
msgid "User Profile"
msgstr "Profil użytkownika"
@@ -2776,7 +2808,7 @@ msgid "This tab shows everything you have read towards your annual reading goal,
msgstr "Ta karta zawiera wszystko, co zostało przez Ciebie przeczytane w dążeniu do rocznego celu oraz umożliwia jego ustawienie. Nie musisz tego robić, jeśli to nie w Twoim stylu!"
#: bookwyrm/templates/guided_tour/user_profile.html:32
-#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:79
+#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:89
msgid "Reading Goal"
msgstr "Cel czytania"
@@ -2815,7 +2847,7 @@ msgstr "Brak aktywności dla tej etykiety!"
#: bookwyrm/templates/import/import.html:5
#: bookwyrm/templates/import/import.html:9
-#: bookwyrm/templates/shelf/shelf.html:64
+#: bookwyrm/templates/shelf/shelf.html:66
msgid "Import Books"
msgstr "Importuj książki"
@@ -2825,12 +2857,8 @@ msgstr "To nie jest prawidłowy plik CSV"
#: bookwyrm/templates/import/import.html:21
#, python-format
-msgid "\n"
-" Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day.\n"
-" "
-msgid_plural "\n"
-" Currently, you are allowed to import %(import_size_limit)s books every %(import_limit_reset)s days.\n"
-" "
+msgid "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day."
+msgid_plural "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s days."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -2893,7 +2921,7 @@ msgstr "Ustawienia prywatności dla importowanych recenzji:"
#: bookwyrm/templates/import/import.html:106
#: bookwyrm/templates/import/import.html:108
-#: bookwyrm/templates/preferences/layout.html:35
+#: bookwyrm/templates/preferences/layout.html:43
#: bookwyrm/templates/settings/federation/instance_blocklist.html:78
msgid "Import"
msgstr "Importuj"
@@ -2996,8 +3024,8 @@ msgid "Row"
msgstr "Wiersz"
#: bookwyrm/templates/import/import_status.html:110
-#: bookwyrm/templates/shelf/shelf.html:148
-#: bookwyrm/templates/shelf/shelf.html:170
+#: bookwyrm/templates/shelf/shelf.html:150
+#: bookwyrm/templates/shelf/shelf.html:172
msgid "Title"
msgstr "Tytuł"
@@ -3010,8 +3038,8 @@ msgid "Openlibrary key"
msgstr "Klucz Openlibrary"
#: bookwyrm/templates/import/import_status.html:121
-#: bookwyrm/templates/shelf/shelf.html:149
-#: bookwyrm/templates/shelf/shelf.html:173
+#: bookwyrm/templates/shelf/shelf.html:151
+#: bookwyrm/templates/shelf/shelf.html:175
msgid "Author"
msgstr "Autor"
@@ -3117,10 +3145,6 @@ msgstr ""
msgid "Create an Account"
msgstr "Utwórz konto"
-#: bookwyrm/templates/landing/invite.html:21
-msgid "Permission Denied"
-msgstr "Odmowa dostępu"
-
#: bookwyrm/templates/landing/invite.html:22
msgid "Sorry! This invite code is no longer valid."
msgstr "Niestety, ale ten kod zaproszenia jest już nieważny."
@@ -3168,7 +3192,7 @@ msgid "Login"
msgstr "Login"
#: bookwyrm/templates/landing/login.html:7
-#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:136
+#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:142
#: bookwyrm/templates/ostatus/error.html:37
msgid "Log in"
msgstr "Zaloguj się"
@@ -3179,7 +3203,7 @@ msgstr "Udało się! Adres e-mail został potwierdzony."
#: bookwyrm/templates/landing/login.html:21
#: bookwyrm/templates/landing/reactivate.html:17
-#: bookwyrm/templates/layout.html:127 bookwyrm/templates/ostatus/error.html:28
+#: bookwyrm/templates/layout.html:128 bookwyrm/templates/ostatus/error.html:28
#: bookwyrm/templates/snippets/register_form.html:4
msgid "Username:"
msgstr "Nazwa użytkownika:"
@@ -3187,13 +3211,13 @@ msgstr "Nazwa użytkownika:"
#: bookwyrm/templates/landing/login.html:27
#: bookwyrm/templates/landing/password_reset.html:26
#: bookwyrm/templates/landing/reactivate.html:23
-#: bookwyrm/templates/layout.html:131 bookwyrm/templates/ostatus/error.html:32
+#: bookwyrm/templates/layout.html:132 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/preferences/2fa.html:91
#: bookwyrm/templates/snippets/register_form.html:45
msgid "Password:"
msgstr "Hasło:"
-#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:133
+#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:139
#: bookwyrm/templates/ostatus/error.html:34
msgid "Forgot your password?"
msgstr "Zapomniano hasła?"
@@ -3236,35 +3260,35 @@ msgstr "Ponownie aktywuj konto"
msgid "%(site_name)s search"
msgstr "Przeszukaj %(site_name)s"
-#: bookwyrm/templates/layout.html:37
+#: bookwyrm/templates/layout.html:39
msgid "Search for a book, user, or list"
msgstr "Szukaj książki, użytkownika lub listy"
-#: bookwyrm/templates/layout.html:52 bookwyrm/templates/layout.html:53
+#: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55
msgid "Scan Barcode"
msgstr "Skanuj kod kreskowy"
-#: bookwyrm/templates/layout.html:67
+#: bookwyrm/templates/layout.html:69
msgid "Main navigation menu"
msgstr "Główne menu nawigacji"
-#: bookwyrm/templates/layout.html:87
-msgid "Feed"
-msgstr "Kanał"
-
-#: bookwyrm/templates/layout.html:132 bookwyrm/templates/ostatus/error.html:33
+#: bookwyrm/templates/layout.html:134 bookwyrm/templates/ostatus/error.html:33
msgid "password"
msgstr "hasło"
-#: bookwyrm/templates/layout.html:144
+#: bookwyrm/templates/layout.html:136
+msgid "Show/Hide password"
+msgstr ""
+
+#: bookwyrm/templates/layout.html:150
msgid "Join"
msgstr "Dołącz"
-#: bookwyrm/templates/layout.html:179
+#: bookwyrm/templates/layout.html:196
msgid "Successfully posted status"
msgstr "Status został zamieszczony"
-#: bookwyrm/templates/layout.html:180
+#: bookwyrm/templates/layout.html:197
msgid "Error posting status"
msgstr "Błąd zamieszczania statusu"
@@ -3456,6 +3480,7 @@ msgid "Set"
msgstr ""
#: bookwyrm/templates/lists/list.html:167
+#: bookwyrm/templates/snippets/remove_follower_button.html:4
#: bookwyrm/templates/snippets/remove_from_group_button.html:20
msgid "Remove"
msgstr "Usuń"
@@ -3523,6 +3548,23 @@ msgstr "Wszystkie listy"
msgid "Saved Lists"
msgstr "Zapisane listy"
+#: bookwyrm/templates/moved.html:27
+#, python-format
+msgid "You have moved your account to %(username)s"
+msgstr ""
+
+#: bookwyrm/templates/moved.html:32
+msgid "You can undo the move to restore full functionality, but some followers may have already unfollowed this account."
+msgstr ""
+
+#: bookwyrm/templates/moved.html:42
+msgid "Undo move"
+msgstr ""
+
+#: bookwyrm/templates/moved.html:46 bookwyrm/templates/user_menu.html:77
+msgid "Log out"
+msgstr "Wyloguj się"
+
#: bookwyrm/templates/notifications/items/accept.html:18
#, python-format
msgid "%(related_user)s accepted your invitation to join group \"%(group_name)s\""
@@ -3731,6 +3773,15 @@ msgstr "Twój import został zakończony."
msgid "%(related_user)s invited you to join the group \"%(group_name)s\""
msgstr "%(related_user)s zaprasza Cię do grupy \"%(group_name)s\""
+#: bookwyrm/templates/notifications/items/invite_request.html:15
+#, python-format
+msgid "New invite request awaiting response"
+msgid_plural "%(display_count)s new invite requests awaiting response"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
#: bookwyrm/templates/notifications/items/join.html:16
#, python-format
msgid "has joined your group \"%(group_name)s\""
@@ -3780,6 +3831,16 @@ msgstr "%(related_user)s wspomina Cię w <
msgid "%(related_user)s mentioned you in a status"
msgstr "%(related_user)s wspomina Cię w statusie"
+#: bookwyrm/templates/notifications/items/move_user.html:18
+#, python-format
+msgid "%(related_user)s has moved to %(username)s"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/move_user.html:25
+#, python-format
+msgid "%(related_user)s has undone their move"
+msgstr ""
+
#: bookwyrm/templates/notifications/items/remove.html:17
#, python-format
msgid "has been removed from your group \"%(group_name)s\""
@@ -3820,7 +3881,7 @@ msgstr[2] "%(display_count)s nowych zgłoszeń wymaga u
msgstr[3] "%(display_count)s nowych zgłoszeń wymaga uwagi"
#: bookwyrm/templates/notifications/items/status_preview.html:4
-#: bookwyrm/templates/snippets/status/content_status.html:73
+#: bookwyrm/templates/snippets/status/content_status.html:62
msgid "Content warning"
msgstr ""
@@ -4038,9 +4099,51 @@ msgstr "Potwierdź hasło, aby skonfigurować 2FA."
msgid "Set up 2FA"
msgstr "Skonfiguruj 2FA"
+#: bookwyrm/templates/preferences/alias_user.html:4
+#: bookwyrm/templates/preferences/move_user.html:4
+#: bookwyrm/templates/preferences/move_user.html:7
+#: bookwyrm/templates/preferences/move_user.html:39
+msgid "Move Account"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:7
+#: bookwyrm/templates/preferences/alias_user.html:34
+msgid "Create Alias"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:12
+msgid "Add another account as an alias"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:16
+msgid "Marking another account as an alias is required if you want to move that account to this one."
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:19
+msgid "This is a reversable action and will not change the functionality of this account."
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:25
+msgid "Enter the username for the account you want to add as an alias e.g. user@example.com :"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:30
+#: bookwyrm/templates/preferences/move_user.html:35
+msgid "Confirm your password:"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:39
+#: bookwyrm/templates/preferences/layout.html:28
+msgid "Aliases"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:49
+msgid "Remove alias"
+msgstr ""
+
#: bookwyrm/templates/preferences/blocks.html:4
#: bookwyrm/templates/preferences/blocks.html:7
-#: bookwyrm/templates/preferences/layout.html:46
+#: bookwyrm/templates/preferences/layout.html:54
msgid "Blocked Users"
msgstr "Zablokowani użytkownicy"
@@ -4070,7 +4173,7 @@ msgstr "Nowe hasło:"
#: bookwyrm/templates/preferences/delete_user.html:4
#: bookwyrm/templates/preferences/delete_user.html:7
#: bookwyrm/templates/preferences/delete_user.html:40
-#: bookwyrm/templates/preferences/layout.html:28
+#: bookwyrm/templates/preferences/layout.html:36
#: bookwyrm/templates/settings/users/delete_user_form.html:22
msgid "Delete Account"
msgstr "Usuń konto"
@@ -4115,7 +4218,7 @@ msgstr "Edytuj profil"
#: bookwyrm/templates/preferences/edit_user.html:12
#: bookwyrm/templates/preferences/edit_user.html:25
-#: bookwyrm/templates/settings/users/user_info.html:7
+#: bookwyrm/templates/settings/users/user_info.html:8
#: bookwyrm/templates/user_menu.html:29
msgid "Profile"
msgstr "Profil"
@@ -4192,18 +4295,45 @@ msgstr "Pobierz plik"
msgid "Account"
msgstr "Konto"
-#: bookwyrm/templates/preferences/layout.html:31
+#: bookwyrm/templates/preferences/layout.html:32
+msgid "Move Account"
+msgstr ""
+
+#: bookwyrm/templates/preferences/layout.html:39
msgid "Data"
msgstr "Dane"
-#: bookwyrm/templates/preferences/layout.html:39
+#: bookwyrm/templates/preferences/layout.html:47
msgid "CSV export"
msgstr "Eksport CSV"
-#: bookwyrm/templates/preferences/layout.html:42
+#: bookwyrm/templates/preferences/layout.html:50
msgid "Relationships"
msgstr "Relacje"
+#: bookwyrm/templates/preferences/move_user.html:12
+msgid "Migrate account to another server"
+msgstr ""
+
+#: bookwyrm/templates/preferences/move_user.html:16
+msgid "Moving your account will notify all your followers and direct them to follow the new account."
+msgstr ""
+
+#: bookwyrm/templates/preferences/move_user.html:19
+#, python-format
+msgid "\n"
+" %(user)s will be marked as moved and will not be discoverable or usable unless you undo the move.\n"
+" "
+msgstr ""
+
+#: bookwyrm/templates/preferences/move_user.html:25
+msgid "Remember to add this user as an alias of the target account before you try to move."
+msgstr ""
+
+#: bookwyrm/templates/preferences/move_user.html:30
+msgid "Enter the username for the account you want to move to e.g. user@example.com :"
+msgstr ""
+
#: bookwyrm/templates/reading_progress/finish.html:5
#, python-format
msgid "Finish \"%(book_title)s\""
@@ -4616,7 +4746,7 @@ msgid "Streams"
msgstr ""
#: bookwyrm/templates/settings/celery.html:32
-msgid "Broadcasts"
+msgid "Broadcast"
msgstr ""
#: bookwyrm/templates/settings/celery.html:38
@@ -4975,7 +5105,7 @@ msgid "Details"
msgstr "Szczegóły"
#: bookwyrm/templates/settings/federation/instance.html:53
-#: bookwyrm/templates/user/layout.html:69
+#: bookwyrm/templates/user/layout.html:79
msgid "Activity"
msgstr "Aktywność"
@@ -5163,7 +5293,7 @@ msgstr ""
#: bookwyrm/templates/settings/invites/manage_invites.html:3
#: bookwyrm/templates/settings/invites/manage_invites.html:15
#: bookwyrm/templates/settings/layout.html:42
-#: bookwyrm/templates/user_menu.html:60
+#: bookwyrm/templates/user_menu.html:55
msgid "Invites"
msgstr "Zaproszenia"
@@ -5637,57 +5767,73 @@ msgid "Set instance default theme"
msgstr "Ustaw domyślny motyw instancji"
#: bookwyrm/templates/settings/themes.html:19
+msgid "One of your themes appears to be broken. Selecting this theme will make the application unusable."
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:28
msgid "Successfully added theme"
msgstr "Motyw został dodany"
-#: bookwyrm/templates/settings/themes.html:26
+#: bookwyrm/templates/settings/themes.html:35
msgid "How to add a theme"
msgstr "Jak dodać motyw"
-#: bookwyrm/templates/settings/themes.html:29
+#: bookwyrm/templates/settings/themes.html:38
msgid "Copy the theme file into the bookwyrm/static/css/themes
directory on your server from the command line."
msgstr "Skopiuj przez wiersz polecenia plik motywu do katalogu bookwyrm/static/css/themes
na swoim serwerze."
-#: bookwyrm/templates/settings/themes.html:32
+#: bookwyrm/templates/settings/themes.html:41
msgid "Run ./bw-dev compile_themes
and ./bw-dev collectstatic
."
msgstr ""
-#: bookwyrm/templates/settings/themes.html:35
+#: bookwyrm/templates/settings/themes.html:44
msgid "Add the file name using the form below to make it available in the application interface."
msgstr "Dodaj nazwę plik używając formularza poniżej, aby udostępnić plik w interfejsie aplikacji."
-#: bookwyrm/templates/settings/themes.html:42
-#: bookwyrm/templates/settings/themes.html:82
+#: bookwyrm/templates/settings/themes.html:51
+#: bookwyrm/templates/settings/themes.html:91
msgid "Add theme"
msgstr "Dodaj motyw"
-#: bookwyrm/templates/settings/themes.html:48
+#: bookwyrm/templates/settings/themes.html:57
msgid "Unable to save theme"
msgstr "Nie można zapisać motywu"
-#: bookwyrm/templates/settings/themes.html:63
-#: bookwyrm/templates/settings/themes.html:93
+#: bookwyrm/templates/settings/themes.html:72
+#: bookwyrm/templates/settings/themes.html:102
msgid "Theme name"
msgstr "Nazwa motywu"
-#: bookwyrm/templates/settings/themes.html:73
+#: bookwyrm/templates/settings/themes.html:82
msgid "Theme filename"
msgstr "Nazwa pliku motywu"
-#: bookwyrm/templates/settings/themes.html:88
+#: bookwyrm/templates/settings/themes.html:97
msgid "Available Themes"
msgstr "Dostępne motywy"
-#: bookwyrm/templates/settings/themes.html:96
+#: bookwyrm/templates/settings/themes.html:105
msgid "File"
msgstr "Plik"
-#: bookwyrm/templates/settings/themes.html:111
+#: bookwyrm/templates/settings/themes.html:123
msgid "Remove theme"
msgstr "Usuń motyw"
+#: bookwyrm/templates/settings/themes.html:134
+msgid "Test theme"
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:143
+msgid "Broken theme"
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:152
+msgid "Loaded successfully"
+msgstr ""
+
#: bookwyrm/templates/settings/users/delete_user_form.html:5
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:38
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:52
msgid "Permanently delete user"
msgstr "Trwale usuń użytkownika"
@@ -5726,25 +5872,20 @@ msgstr "Ostatnia aktywność"
msgid "Remote instance"
msgstr "Zdalna instancja"
-#: bookwyrm/templates/settings/users/user_admin.html:86
-msgid "Deleted"
-msgstr "Usunięte"
-
-#: bookwyrm/templates/settings/users/user_admin.html:92
-#: bookwyrm/templates/settings/users/user_info.html:32
-msgid "Inactive"
-msgstr "Nieaktywne"
-
-#: bookwyrm/templates/settings/users/user_admin.html:101
+#: bookwyrm/templates/settings/users/user_admin.html:84
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr ""
-#: bookwyrm/templates/settings/users/user_info.html:16
+#: bookwyrm/templates/settings/users/user_info.html:20
+msgid "This account is the instance actor for signing HTTP requests."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_info.html:24
msgid "View user profile"
msgstr "Wyświetl profil użytkownika"
-#: bookwyrm/templates/settings/users/user_info.html:19
+#: bookwyrm/templates/settings/users/user_info.html:30
msgid "Go to user admin"
msgstr ""
@@ -5800,27 +5941,39 @@ msgstr "Szczegóły instancji"
msgid "View instance"
msgstr "Zobacz instancję"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:5
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:6
msgid "Permanently deleted"
msgstr "Usunięte na zawsze"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:8
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:9
msgid "User Actions"
msgstr ""
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:21
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:15
+msgid "This is the instance admin actor"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:18
+msgid "You must not delete or disable this account as it is critical to the functioning of your server. This actor signs outgoing GET requests to smooth interaction with secure ActivityPub servers."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:19
+msgid "This account is not discoverable by ordinary users and does not have a profile page."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:35
msgid "Activate user"
msgstr ""
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:27
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:41
msgid "Suspend user"
msgstr "Zawieś użytkownika"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:32
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:46
msgid "Un-suspend user"
msgstr "Przywróć użytkownika"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:54
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:68
msgid "Access level:"
msgstr "Poziom dostępu:"
@@ -5876,7 +6029,7 @@ msgstr "Wygląda na to, że Twoja domena jest niepoprawnie skonfigurowana. Nie p
msgid "You are running BookWyrm in production mode without https. USE_HTTPS should be enabled in production."
msgstr ""
-#: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:49
+#: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:44
msgid "Settings"
msgstr "Ustawienia"
@@ -5933,7 +6086,7 @@ msgid "Need help?"
msgstr "Potrzebujesz pomocy?"
#: bookwyrm/templates/shelf/create_shelf_form.html:5
-#: bookwyrm/templates/shelf/shelf.html:72
+#: bookwyrm/templates/shelf/shelf.html:74
msgid "Create shelf"
msgstr "Utwórz półkę"
@@ -5941,18 +6094,18 @@ msgstr "Utwórz półkę"
msgid "Edit Shelf"
msgstr "Edytuj półkę"
-#: bookwyrm/templates/shelf/shelf.html:24
+#: bookwyrm/templates/shelf/shelf.html:26
#: bookwyrm/templates/user/relationships/followers.html:18
#: bookwyrm/templates/user/relationships/following.html:18
msgid "User profile"
msgstr "Profil użytkownika"
-#: bookwyrm/templates/shelf/shelf.html:39
+#: bookwyrm/templates/shelf/shelf.html:41
#: bookwyrm/templatetags/shelf_tags.py:13 bookwyrm/views/shelf/shelf.py:53
msgid "All books"
msgstr "Wszystkie książki"
-#: bookwyrm/templates/shelf/shelf.html:97
+#: bookwyrm/templates/shelf/shelf.html:99
#, python-format
msgid "%(formatted_count)s book"
msgid_plural "%(formatted_count)s books"
@@ -5961,40 +6114,40 @@ msgstr[1] "%(formatted_count)s książki"
msgstr[2] "%(formatted_count)s książek"
msgstr[3] "%(formatted_count)s książek"
-#: bookwyrm/templates/shelf/shelf.html:104
+#: bookwyrm/templates/shelf/shelf.html:106
#, python-format
msgid "(showing %(start)s-%(end)s)"
msgstr "(wyświetlanie %(start)s-%(end)s)"
-#: bookwyrm/templates/shelf/shelf.html:116
+#: bookwyrm/templates/shelf/shelf.html:118
msgid "Edit shelf"
msgstr "Edytuj półkę"
-#: bookwyrm/templates/shelf/shelf.html:124
+#: bookwyrm/templates/shelf/shelf.html:126
msgid "Delete shelf"
msgstr "Usuń półkę"
-#: bookwyrm/templates/shelf/shelf.html:152
-#: bookwyrm/templates/shelf/shelf.html:178
+#: bookwyrm/templates/shelf/shelf.html:154
+#: bookwyrm/templates/shelf/shelf.html:180
msgid "Shelved"
msgstr "Na półce"
-#: bookwyrm/templates/shelf/shelf.html:153
-#: bookwyrm/templates/shelf/shelf.html:181
+#: bookwyrm/templates/shelf/shelf.html:155
+#: bookwyrm/templates/shelf/shelf.html:183
msgid "Started"
msgstr "Rozpoczęte"
-#: bookwyrm/templates/shelf/shelf.html:154
-#: bookwyrm/templates/shelf/shelf.html:184
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
msgid "Finished"
msgstr "Ukończone"
-#: bookwyrm/templates/shelf/shelf.html:154
-#: bookwyrm/templates/shelf/shelf.html:184
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
msgid "Until"
msgstr "Do"
-#: bookwyrm/templates/shelf/shelf.html:210
+#: bookwyrm/templates/shelf/shelf.html:212
msgid "This shelf is empty."
msgstr "Półka jest pusta."
@@ -6312,6 +6465,15 @@ msgstr "Przeczytano %(read_count)s z %(goal_count)s książ
msgid "%(username)s has read %(read_count)s of %(goal_count)s books."
msgstr "%(username)s ma przeczytane %(read_count)s z %(goal_count)s książek."
+#: bookwyrm/templates/snippets/move_user_buttons.html:10
+msgid "Follow at new account"
+msgstr ""
+
+#: bookwyrm/templates/snippets/moved_user_notice.html:7
+#, python-format
+msgid "%(user)s has moved to %(moved_to_name)s"
+msgstr ""
+
#: bookwyrm/templates/snippets/page_text.html:8
#, python-format
msgid "page %(page)s of %(total_pages)s"
@@ -6453,35 +6615,35 @@ msgstr "Przerwij czytanie"
msgid "Finish reading"
msgstr "Ukończ czytanie"
-#: bookwyrm/templates/snippets/status/content_status.html:80
+#: bookwyrm/templates/snippets/status/content_status.html:69
msgid "Show status"
msgstr "Pokaż status"
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "(Page %(page)s"
msgstr "(Strona %(page)s"
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "%(endpage)s"
msgstr "%(endpage)s"
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid "(%(percent)s%%"
msgstr "(%(percent)s %%"
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid " - %(endpercent)s%%"
msgstr " - %(endpercent)s %%"
-#: bookwyrm/templates/snippets/status/content_status.html:127
+#: bookwyrm/templates/snippets/status/content_status.html:116
msgid "Open image in new window"
msgstr "Otwórz obraz w nowym oknie"
-#: bookwyrm/templates/snippets/status/content_status.html:148
+#: bookwyrm/templates/snippets/status/content_status.html:137
msgid "Hide status"
msgstr "Ukryj status"
@@ -6614,6 +6776,18 @@ msgstr "Pokaż więcej"
msgid "Show less"
msgstr "Pokaż mniej"
+#: bookwyrm/templates/snippets/user_active_tag.html:5
+msgid "Moved"
+msgstr ""
+
+#: bookwyrm/templates/snippets/user_active_tag.html:12
+msgid "Deleted"
+msgstr "Usunięte"
+
+#: bookwyrm/templates/snippets/user_active_tag.html:15
+msgid "Inactive"
+msgstr "Nieaktywne"
+
#: bookwyrm/templates/two_factor_auth/two_factor_login.html:29
msgid "2FA check"
msgstr "Sprawdzanie 2FA"
@@ -6672,11 +6846,11 @@ msgstr "Twoje grupy"
msgid "Groups: %(username)s"
msgstr "Grupy: %(username)s"
-#: bookwyrm/templates/user/layout.html:50
+#: bookwyrm/templates/user/layout.html:59
msgid "Follow Requests"
msgstr "Prośby o obserwowanie"
-#: bookwyrm/templates/user/layout.html:73
+#: bookwyrm/templates/user/layout.html:83
#: bookwyrm/templates/user/reviews_comments.html:6
#: bookwyrm/templates/user/reviews_comments.html:12
msgid "Reviews and Comments"
@@ -6691,7 +6865,13 @@ msgstr "Listy: %(username)s"
msgid "Create list"
msgstr "Utwórz listę"
-#: bookwyrm/templates/user/relationships/followers.html:31
+#: bookwyrm/templates/user/moved.html:25
+#: bookwyrm/templates/user/user_preview.html:22
+#, python-format
+msgid "Joined %(date)s"
+msgstr "Dołączono %(date)s"
+
+#: bookwyrm/templates/user/relationships/followers.html:36
#, python-format
msgid "%(username)s has no followers"
msgstr "%(username)s nie ma obserwujących"
@@ -6762,11 +6942,6 @@ msgstr "Tylko komentarze"
msgid "No activities yet!"
msgstr "Jeszcze brak aktywności!"
-#: bookwyrm/templates/user/user_preview.html:22
-#, python-format
-msgid "Joined %(date)s"
-msgstr "Dołączono %(date)s"
-
#: bookwyrm/templates/user/user_preview.html:26
#, python-format
msgid "%(display_count)s follower"
@@ -6798,10 +6973,6 @@ msgstr "Brak obserwujących, których obserwujesz"
msgid "View profile and more"
msgstr "Zobacz profil i więcej"
-#: bookwyrm/templates/user_menu.html:82
-msgid "Log out"
-msgstr "Wyloguj się"
-
#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:28
msgid "File exceeds maximum size: 10MB"
msgstr "Rozmiar pliku przekracza maksymalny rozmiar: 10MB"
@@ -6820,7 +6991,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: bookwyrm/templatetags/utilities.py:39
+#: bookwyrm/templatetags/utilities.py:49
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"
diff --git a/locale/pt_BR/LC_MESSAGES/django.mo b/locale/pt_BR/LC_MESSAGES/django.mo
index 05c4cbd8c..565cb0e0d 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 c11dd5830..a8965b165 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: 2023-09-27 01:11+0000\n"
-"PO-Revision-Date: 2023-09-28 18:50\n"
+"POT-Creation-Date: 2023-12-30 23:52+0000\n"
+"PO-Revision-Date: 2024-01-02 03:12\n"
"Last-Translator: Mouse Reeve %(level)s
."
+msgstr ""
+
+#: bookwyrm/templates/403.html:15
+msgid "If you think you should have access, please speak to your BookWyrm server administrator."
+msgstr ""
+
#: bookwyrm/templates/404.html:4 bookwyrm/templates/404.html:8
msgid "Not Found"
msgstr "Não encontrado"
@@ -476,6 +496,20 @@ msgstr "Não encontrado"
msgid "The page you requested doesn't seem to exist!"
msgstr "A página que você procura não existe!"
+#: bookwyrm/templates/413.html:4 bookwyrm/templates/413.html:8
+msgid "File too large"
+msgstr ""
+
+#: bookwyrm/templates/413.html:9
+msgid "The file you are uploading is too large."
+msgstr ""
+
+#: bookwyrm/templates/413.html:11
+msgid "\n"
+" You you can try using a smaller file, or ask your BookWyrm server administrator to increase the DATA_UPLOAD_MAX_MEMORY_SIZE
setting.\n"
+" "
+msgstr ""
+
#: bookwyrm/templates/500.html:4
msgid "Oops!"
msgstr "Opa!"
@@ -536,12 +570,12 @@ msgstr "Moderadores e administradores de %(site_name)s's mantêm o site funciona
msgid "Moderator"
msgstr "Moderador/a"
-#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:67
+#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:62
msgid "Admin"
msgstr "Admin"
#: bookwyrm/templates/about/about.html:140
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:28
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
msgid "Send direct message"
@@ -575,7 +609,7 @@ msgid "Software version:"
msgstr "Versão do software:"
#: bookwyrm/templates/about/layout.html:30
-#: bookwyrm/templates/embed-layout.html:33
+#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/snippets/footer.html:8
#, python-format
msgid "About %(site_name)s"
@@ -680,7 +714,7 @@ msgstr "A leitura mais curta do ano…"
#: bookwyrm/templates/annual_summary/layout.html:157
#: bookwyrm/templates/annual_summary/layout.html:178
#: bookwyrm/templates/annual_summary/layout.html:247
-#: bookwyrm/templates/book/book.html:63
+#: bookwyrm/templates/book/book.html:65
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
@@ -768,24 +802,24 @@ msgid "View ISNI record"
msgstr "Ver registro ISNI"
#: bookwyrm/templates/author/author.html:95
-#: bookwyrm/templates/book/book.html:173
+#: bookwyrm/templates/book/book.html:175
msgid "View on ISFDB"
msgstr "Veja no ISFDB"
#: bookwyrm/templates/author/author.html:100
#: bookwyrm/templates/author/sync_modal.html:5
-#: bookwyrm/templates/book/book.html:140
+#: bookwyrm/templates/book/book.html:142
#: bookwyrm/templates/book/sync_modal.html:5
msgid "Load data"
msgstr "Carregar informações"
#: bookwyrm/templates/author/author.html:104
-#: bookwyrm/templates/book/book.html:144
+#: bookwyrm/templates/book/book.html:146
msgid "View on OpenLibrary"
msgstr "Ver na OpenLibrary"
#: bookwyrm/templates/author/author.html:119
-#: bookwyrm/templates/book/book.html:158
+#: bookwyrm/templates/book/book.html:160
msgid "View on Inventaire"
msgstr "Ver no Inventaire"
@@ -797,11 +831,7 @@ msgstr "Ver no LibraryThing"
msgid "View on Goodreads"
msgstr "Ver no Goodreads"
-#: bookwyrm/templates/author/author.html:151
-msgid "View ISFDB entry"
-msgstr "Veja no ISFDB"
-
-#: bookwyrm/templates/author/author.html:166
+#: bookwyrm/templates/author/author.html:158
#, python-format
msgid "Books by %(name)s"
msgstr "Livros de %(name)s"
@@ -910,7 +940,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:89
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save"
@@ -959,19 +989,19 @@ msgstr "Confirmar"
msgid "Unable to connect to remote source."
msgstr "Não conseguimos nos conectar à fonte remota."
-#: bookwyrm/templates/book/book.html:71 bookwyrm/templates/book/book.html:72
+#: bookwyrm/templates/book/book.html:73 bookwyrm/templates/book/book.html:74
msgid "Edit Book"
msgstr "Editar livro"
-#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:100
+#: bookwyrm/templates/book/book.html:99 bookwyrm/templates/book/book.html:102
msgid "Click to add cover"
msgstr "Clique para adicionar uma capa"
-#: bookwyrm/templates/book/book.html:106
+#: bookwyrm/templates/book/book.html:108
msgid "Failed to load cover"
msgstr "Erro ao carregar capa"
-#: bookwyrm/templates/book/book.html:117
+#: bookwyrm/templates/book/book.html:119
msgid "Click to enlarge"
msgstr "Clique para aumentar"
@@ -1046,13 +1076,13 @@ msgstr "Lugares"
#: bookwyrm/templates/guided_tour/lists.html:14
#: bookwyrm/templates/guided_tour/user_books.html:102
#: bookwyrm/templates/guided_tour/user_profile.html:78
-#: bookwyrm/templates/layout.html:90 bookwyrm/templates/lists/curate.html:8
+#: bookwyrm/templates/layout.html:88 bookwyrm/templates/lists/curate.html:8
#: bookwyrm/templates/lists/list.html:12 bookwyrm/templates/lists/lists.html:5
#: bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:26
#: bookwyrm/templates/search/layout.html:51
#: bookwyrm/templates/settings/celery.html:77
-#: bookwyrm/templates/user/layout.html:91 bookwyrm/templates/user/lists.html:6
+#: bookwyrm/templates/user/layout.html:101 bookwyrm/templates/user/lists.html:6
msgid "Lists"
msgstr "Listas"
@@ -1117,8 +1147,8 @@ msgstr "Enviar capa:"
#: bookwyrm/templates/book/cover_add_modal.html:23
#: bookwyrm/templates/book/edit/edit_book_form.html:250
-msgid "Load cover from url:"
-msgstr "Carregar capa do endereço:"
+msgid "Load cover from URL:"
+msgstr ""
#: bookwyrm/templates/book/cover_show_modal.html:6
msgid "Book cover preview"
@@ -1328,7 +1358,7 @@ msgid "Add Another Author"
msgstr "Adicionar outro/a autor/a"
#: bookwyrm/templates/book/edit/edit_book_form.html:231
-#: bookwyrm/templates/shelf/shelf.html:147
+#: bookwyrm/templates/shelf/shelf.html:149
msgid "Cover"
msgstr "Capa"
@@ -1372,8 +1402,8 @@ msgstr "Edições de %(book_title)s"
#: bookwyrm/templates/book/editions/editions.html:8
#, python-format
-msgid "Editions of \"%(work_title)s\""
-msgstr "Edições de \"%(work_title)s\""
+msgid "Editions of %(work_title)s"
+msgstr ""
#: bookwyrm/templates/book/editions/editions.html:55
msgid "Can't find the edition you're looking for?"
@@ -1455,8 +1485,9 @@ msgstr "Domínio"
#: bookwyrm/templates/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
#: bookwyrm/templates/settings/invites/status_filter.html:5
+#: bookwyrm/templates/settings/themes.html:111
#: bookwyrm/templates/settings/users/user_admin.html:56
-#: bookwyrm/templates/settings/users/user_info.html:24
+#: bookwyrm/templates/settings/users/user_info.html:35
msgid "Status"
msgstr "Publicação"
@@ -1465,7 +1496,7 @@ msgstr "Publicação"
#: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/imports/imports.html:141
#: bookwyrm/templates/settings/reports/report_links_table.html:6
-#: bookwyrm/templates/settings/themes.html:99
+#: bookwyrm/templates/settings/themes.html:108
msgid "Actions"
msgstr "Ações"
@@ -1529,22 +1560,22 @@ msgstr "%(pages)s páginas"
msgid "%(languages)s language"
msgstr "Língua: %(languages)s"
-#: bookwyrm/templates/book/publisher_info.html:65
+#: bookwyrm/templates/book/publisher_info.html:63
#, python-format
msgid "Published %(date)s by %(publisher)s."
msgstr "Publicado em %(date)s por %(publisher)s."
+#: bookwyrm/templates/book/publisher_info.html:65
+#, python-format
+msgid "Published by %(publisher)s."
+msgstr "Publicado por %(publisher)s."
+
#: bookwyrm/templates/book/publisher_info.html:67
#, python-format
msgid "Published %(date)s"
msgstr "Publicado em %(date)s"
-#: bookwyrm/templates/book/publisher_info.html:69
-#, python-format
-msgid "Published by %(publisher)s."
-msgstr "Publicado por %(publisher)s."
-
-#: bookwyrm/templates/book/rating.html:13
+#: bookwyrm/templates/book/rating.html:19
msgid "rated it"
msgstr "avaliou este livro"
@@ -1552,12 +1583,12 @@ msgstr "avaliou este livro"
msgid "Series by"
msgstr "Séries de"
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
#, python-format
msgid "Book %(series_number)s"
msgstr "Livro %(series_number)s"
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
msgid "Unsorted Book"
msgstr "Livro não ordenado"
@@ -1681,6 +1712,7 @@ msgstr "Sugerido"
#: bookwyrm/templates/ostatus/subscribe.html:42
#: bookwyrm/templates/ostatus/success.html:17
#: bookwyrm/templates/ostatus/success.html:18
+#: bookwyrm/templates/user/moved.html:19 bookwyrm/templates/user/moved.html:20
#: bookwyrm/templates/user/user_preview.html:16
#: bookwyrm/templates/user/user_preview.html:17
msgid "Locked account"
@@ -1755,7 +1787,7 @@ msgstr "%(username)s citou %(username)s"
msgstr "Mensagens diretas com %(username)s"
#: bookwyrm/templates/feed/direct_messages.html:10
-#: bookwyrm/templates/user_menu.html:44
+#: bookwyrm/templates/user_menu.html:39
msgid "Direct Messages"
msgstr "Mensagens diretas"
@@ -1948,7 +1980,7 @@ msgstr "Atualizações"
#: bookwyrm/templates/feed/suggested_books.html:6
#: bookwyrm/templates/guided_tour/home.html:127
-#: bookwyrm/templates/user_menu.html:39
+#: bookwyrm/templates/layout.html:94
msgid "Your Books"
msgstr "Seus livros"
@@ -1996,19 +2028,19 @@ msgid "Add to your books"
msgstr "Adicionar aos seus livros"
#: bookwyrm/templates/get_started/book_preview.html:10
-#: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37
+#: bookwyrm/templates/shelf/shelf.html:88 bookwyrm/templates/user/user.html:37
#: bookwyrm/templatetags/shelf_tags.py:14
msgid "To Read"
msgstr "Quero ler"
#: bookwyrm/templates/get_started/book_preview.html:11
-#: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38
+#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:38
#: bookwyrm/templatetags/shelf_tags.py:15
msgid "Currently Reading"
msgstr "Lendo atualmente"
#: bookwyrm/templates/get_started/book_preview.html:12
-#: bookwyrm/templates/shelf/shelf.html:88
+#: bookwyrm/templates/shelf/shelf.html:90
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
@@ -2017,7 +2049,7 @@ msgid "Read"
msgstr "Lido"
#: bookwyrm/templates/get_started/book_preview.html:13
-#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40
+#: bookwyrm/templates/shelf/shelf.html:91 bookwyrm/templates/user/user.html:40
#: bookwyrm/templatetags/shelf_tags.py:17
msgid "Stopped Reading"
msgstr "Finalizar leitura"
@@ -2027,7 +2059,7 @@ msgid "What are you reading?"
msgstr "O que você está lendo?"
#: bookwyrm/templates/get_started/books.html:9
-#: bookwyrm/templates/layout.html:39 bookwyrm/templates/lists/list.html:213
+#: bookwyrm/templates/layout.html:41 bookwyrm/templates/lists/list.html:213
msgid "Search for a book"
msgstr "Pesquisar livro"
@@ -2046,8 +2078,8 @@ msgstr "Você pode adicionar livros quando começar a usar o %(site_name)s."
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:15
-#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:45
-#: bookwyrm/templates/layout.html:46 bookwyrm/templates/lists/list.html:217
+#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:47
+#: bookwyrm/templates/layout.html:48 bookwyrm/templates/lists/list.html:217
#: bookwyrm/templates/search/layout.html:5
#: bookwyrm/templates/search/layout.html:10
#: bookwyrm/templates/search/layout.html:32
@@ -2514,7 +2546,7 @@ msgid "Barcode reader"
msgstr "Leitor de código de barras"
#: bookwyrm/templates/guided_tour/home.html:102
-msgid "Use the Feed, Lists and Discover links to discover the latest news from your feed, lists of books by topic, and the latest happenings on this Bookwyrm server!"
+msgid "Use the Lists, Discover, and Your Books links to discover reading suggestions and the latest happenings on this server, or to see your catalogued books!"
msgstr ""
#: bookwyrm/templates/guided_tour/home.html:103
@@ -2538,15 +2570,15 @@ msgid "The bell will light up when you have a new notification. When it does, cl
msgstr ""
#: bookwyrm/templates/guided_tour/home.html:177
-#: bookwyrm/templates/layout.html:75 bookwyrm/templates/layout.html:106
-#: bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:77 bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:108
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr "Notificações"
#: bookwyrm/templates/guided_tour/home.html:200
-msgid "Your profile, books, direct messages, and settings can be accessed by clicking on your name in the menu here."
+msgid "Your profile, user directory, direct messages, and settings can be accessed by clicking on your name in the menu here."
msgstr ""
#: bookwyrm/templates/guided_tour/home.html:200
@@ -2702,7 +2734,7 @@ msgstr ""
#: bookwyrm/templates/guided_tour/user_groups.html:11
#: bookwyrm/templates/guided_tour/user_profile.html:55
-#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:85
+#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:95
msgid "Groups"
msgstr "Grupos"
@@ -2747,7 +2779,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr ""
#: bookwyrm/templates/guided_tour/user_profile.html:11
-#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:14
+#: bookwyrm/templates/user/layout.html:20 bookwyrm/templates/user/user.html:14
msgid "User Profile"
msgstr "Perfil do usuário"
@@ -2756,7 +2788,7 @@ msgid "This tab shows everything you have read towards your annual reading goal,
msgstr ""
#: bookwyrm/templates/guided_tour/user_profile.html:32
-#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:79
+#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:89
msgid "Reading Goal"
msgstr "Meta de leitura"
@@ -2795,7 +2827,7 @@ msgstr ""
#: bookwyrm/templates/import/import.html:5
#: bookwyrm/templates/import/import.html:9
-#: bookwyrm/templates/shelf/shelf.html:64
+#: bookwyrm/templates/shelf/shelf.html:66
msgid "Import Books"
msgstr "Importar livros"
@@ -2805,12 +2837,8 @@ msgstr ""
#: bookwyrm/templates/import/import.html:21
#, python-format
-msgid "\n"
-" Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day.\n"
-" "
-msgid_plural "\n"
-" Currently, you are allowed to import %(import_size_limit)s books every %(import_limit_reset)s days.\n"
-" "
+msgid "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day."
+msgid_plural "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s days."
msgstr[0] ""
msgstr[1] ""
@@ -2871,7 +2899,7 @@ msgstr "Configurações de privacidade para resenhas importadas:"
#: bookwyrm/templates/import/import.html:106
#: bookwyrm/templates/import/import.html:108
-#: bookwyrm/templates/preferences/layout.html:35
+#: bookwyrm/templates/preferences/layout.html:43
#: bookwyrm/templates/settings/federation/instance_blocklist.html:78
msgid "Import"
msgstr "Importar"
@@ -2970,8 +2998,8 @@ msgid "Row"
msgstr "Linha"
#: bookwyrm/templates/import/import_status.html:110
-#: bookwyrm/templates/shelf/shelf.html:148
-#: bookwyrm/templates/shelf/shelf.html:170
+#: bookwyrm/templates/shelf/shelf.html:150
+#: bookwyrm/templates/shelf/shelf.html:172
msgid "Title"
msgstr "Título"
@@ -2984,8 +3012,8 @@ msgid "Openlibrary key"
msgstr "Chave Openlibrary"
#: bookwyrm/templates/import/import_status.html:121
-#: bookwyrm/templates/shelf/shelf.html:149
-#: bookwyrm/templates/shelf/shelf.html:173
+#: bookwyrm/templates/shelf/shelf.html:151
+#: bookwyrm/templates/shelf/shelf.html:175
msgid "Author"
msgstr "Autor/a"
@@ -3091,10 +3119,6 @@ msgstr "Fale com a administração ou DATA_UPLOAD_MAX_MEMORY_SIZE setting.\n"
+" "
+msgstr ""
+
#: bookwyrm/templates/500.html:4
msgid "Oops!"
msgstr "Ups!"
@@ -536,12 +570,12 @@ msgstr "Os moderadores e administradores do %(site_name)s mantêm o site atualiz
msgid "Moderator"
msgstr "Moderador"
-#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:67
+#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:62
msgid "Admin"
msgstr "Admin"
#: bookwyrm/templates/about/about.html:140
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:28
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
msgid "Send direct message"
@@ -575,7 +609,7 @@ msgid "Software version:"
msgstr "Versão do software:"
#: bookwyrm/templates/about/layout.html:30
-#: bookwyrm/templates/embed-layout.html:33
+#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/snippets/footer.html:8
#, python-format
msgid "About %(site_name)s"
@@ -680,7 +714,7 @@ msgstr "A sua menor leitura este ano…"
#: bookwyrm/templates/annual_summary/layout.html:157
#: bookwyrm/templates/annual_summary/layout.html:178
#: bookwyrm/templates/annual_summary/layout.html:247
-#: bookwyrm/templates/book/book.html:63
+#: bookwyrm/templates/book/book.html:65
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
@@ -768,24 +802,24 @@ msgid "View ISNI record"
msgstr "Ver registro do ISNI"
#: bookwyrm/templates/author/author.html:95
-#: bookwyrm/templates/book/book.html:173
+#: bookwyrm/templates/book/book.html:175
msgid "View on ISFDB"
msgstr "Ver no ISFDB"
#: bookwyrm/templates/author/author.html:100
#: bookwyrm/templates/author/sync_modal.html:5
-#: bookwyrm/templates/book/book.html:140
+#: bookwyrm/templates/book/book.html:142
#: bookwyrm/templates/book/sync_modal.html:5
msgid "Load data"
msgstr "Carregar dados"
#: bookwyrm/templates/author/author.html:104
-#: bookwyrm/templates/book/book.html:144
+#: bookwyrm/templates/book/book.html:146
msgid "View on OpenLibrary"
msgstr "Ver na OpenLibrary"
#: bookwyrm/templates/author/author.html:119
-#: bookwyrm/templates/book/book.html:158
+#: bookwyrm/templates/book/book.html:160
msgid "View on Inventaire"
msgstr "Ver no Inventaire"
@@ -797,11 +831,7 @@ msgstr "Ver na LibraryThing"
msgid "View on Goodreads"
msgstr "Ver na Goodreads"
-#: bookwyrm/templates/author/author.html:151
-msgid "View ISFDB entry"
-msgstr "Ver entrada ISFDB"
-
-#: bookwyrm/templates/author/author.html:166
+#: bookwyrm/templates/author/author.html:158
#, python-format
msgid "Books by %(name)s"
msgstr "Livros por %(name)s"
@@ -910,7 +940,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:89
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save"
@@ -959,19 +989,19 @@ msgstr "Confirmar"
msgid "Unable to connect to remote source."
msgstr "Não foi possível conectar à fonte remota."
-#: bookwyrm/templates/book/book.html:71 bookwyrm/templates/book/book.html:72
+#: bookwyrm/templates/book/book.html:73 bookwyrm/templates/book/book.html:74
msgid "Edit Book"
msgstr "Editar Livro"
-#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:100
+#: bookwyrm/templates/book/book.html:99 bookwyrm/templates/book/book.html:102
msgid "Click to add cover"
msgstr "Clica para adicionar capa"
-#: bookwyrm/templates/book/book.html:106
+#: bookwyrm/templates/book/book.html:108
msgid "Failed to load cover"
msgstr "Não foi possível carregar a capa"
-#: bookwyrm/templates/book/book.html:117
+#: bookwyrm/templates/book/book.html:119
msgid "Click to enlarge"
msgstr "Clica para ampliar"
@@ -1046,13 +1076,13 @@ msgstr "Lugares"
#: bookwyrm/templates/guided_tour/lists.html:14
#: bookwyrm/templates/guided_tour/user_books.html:102
#: bookwyrm/templates/guided_tour/user_profile.html:78
-#: bookwyrm/templates/layout.html:90 bookwyrm/templates/lists/curate.html:8
+#: bookwyrm/templates/layout.html:88 bookwyrm/templates/lists/curate.html:8
#: bookwyrm/templates/lists/list.html:12 bookwyrm/templates/lists/lists.html:5
#: bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:26
#: bookwyrm/templates/search/layout.html:51
#: bookwyrm/templates/settings/celery.html:77
-#: bookwyrm/templates/user/layout.html:91 bookwyrm/templates/user/lists.html:6
+#: bookwyrm/templates/user/layout.html:101 bookwyrm/templates/user/lists.html:6
msgid "Lists"
msgstr "Listas"
@@ -1117,8 +1147,8 @@ msgstr "Carregar uma capa:"
#: bookwyrm/templates/book/cover_add_modal.html:23
#: bookwyrm/templates/book/edit/edit_book_form.html:250
-msgid "Load cover from url:"
-msgstr "Carregar capa através de um Url:"
+msgid "Load cover from URL:"
+msgstr ""
#: bookwyrm/templates/book/cover_show_modal.html:6
msgid "Book cover preview"
@@ -1328,7 +1358,7 @@ msgid "Add Another Author"
msgstr "Adicionar outro autor(a)"
#: bookwyrm/templates/book/edit/edit_book_form.html:231
-#: bookwyrm/templates/shelf/shelf.html:147
+#: bookwyrm/templates/shelf/shelf.html:149
msgid "Cover"
msgstr "Capa"
@@ -1372,8 +1402,8 @@ msgstr "Edições de %(book_title)s"
#: bookwyrm/templates/book/editions/editions.html:8
#, python-format
-msgid "Editions of \"%(work_title)s\""
-msgstr "Edições de \"%(work_title)s\""
+msgid "Editions of %(work_title)s"
+msgstr ""
#: bookwyrm/templates/book/editions/editions.html:55
msgid "Can't find the edition you're looking for?"
@@ -1455,8 +1485,9 @@ msgstr "Domínio"
#: bookwyrm/templates/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
#: bookwyrm/templates/settings/invites/status_filter.html:5
+#: bookwyrm/templates/settings/themes.html:111
#: bookwyrm/templates/settings/users/user_admin.html:56
-#: bookwyrm/templates/settings/users/user_info.html:24
+#: bookwyrm/templates/settings/users/user_info.html:35
msgid "Status"
msgstr "Estado"
@@ -1465,7 +1496,7 @@ msgstr "Estado"
#: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/imports/imports.html:141
#: bookwyrm/templates/settings/reports/report_links_table.html:6
-#: bookwyrm/templates/settings/themes.html:99
+#: bookwyrm/templates/settings/themes.html:108
msgid "Actions"
msgstr "Acções"
@@ -1529,22 +1560,22 @@ msgstr "%(pages)s páginas"
msgid "%(languages)s language"
msgstr "%(languages)s idioma"
-#: bookwyrm/templates/book/publisher_info.html:65
+#: bookwyrm/templates/book/publisher_info.html:63
#, python-format
msgid "Published %(date)s by %(publisher)s."
msgstr "Publicado em %(date)s por %(publisher)s."
+#: bookwyrm/templates/book/publisher_info.html:65
+#, python-format
+msgid "Published by %(publisher)s."
+msgstr "Publicado por %(publisher)s."
+
#: bookwyrm/templates/book/publisher_info.html:67
#, python-format
msgid "Published %(date)s"
msgstr "Publicado em %(date)s"
-#: bookwyrm/templates/book/publisher_info.html:69
-#, python-format
-msgid "Published by %(publisher)s."
-msgstr "Publicado por %(publisher)s."
-
-#: bookwyrm/templates/book/rating.html:13
+#: bookwyrm/templates/book/rating.html:19
msgid "rated it"
msgstr "avalia-o"
@@ -1552,12 +1583,12 @@ msgstr "avalia-o"
msgid "Series by"
msgstr "Série por"
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
#, python-format
msgid "Book %(series_number)s"
msgstr "Livro %(series_number)s"
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
msgid "Unsorted Book"
msgstr "Livro não organizado"
@@ -1681,6 +1712,7 @@ msgstr "Sugerido"
#: bookwyrm/templates/ostatus/subscribe.html:42
#: bookwyrm/templates/ostatus/success.html:17
#: bookwyrm/templates/ostatus/success.html:18
+#: bookwyrm/templates/user/moved.html:19 bookwyrm/templates/user/moved.html:20
#: bookwyrm/templates/user/user_preview.html:16
#: bookwyrm/templates/user/user_preview.html:17
msgid "Locked account"
@@ -1755,7 +1787,7 @@ msgstr "%(username)s citou %(username)s"
msgstr "Mensagens Diretas com %(username)s"
#: bookwyrm/templates/feed/direct_messages.html:10
-#: bookwyrm/templates/user_menu.html:44
+#: bookwyrm/templates/user_menu.html:39
msgid "Direct Messages"
msgstr "Mensagens Diretas"
@@ -1948,7 +1980,7 @@ msgstr "Atualizações"
#: bookwyrm/templates/feed/suggested_books.html:6
#: bookwyrm/templates/guided_tour/home.html:127
-#: bookwyrm/templates/user_menu.html:39
+#: bookwyrm/templates/layout.html:94
msgid "Your Books"
msgstr "Os teus Livros"
@@ -1996,19 +2028,19 @@ msgid "Add to your books"
msgstr "Adicionar aos teus livros"
#: bookwyrm/templates/get_started/book_preview.html:10
-#: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37
+#: bookwyrm/templates/shelf/shelf.html:88 bookwyrm/templates/user/user.html:37
#: bookwyrm/templatetags/shelf_tags.py:14
msgid "To Read"
msgstr "Para Ler"
#: bookwyrm/templates/get_started/book_preview.html:11
-#: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38
+#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:38
#: bookwyrm/templatetags/shelf_tags.py:15
msgid "Currently Reading"
msgstr "Leituras atuais"
#: bookwyrm/templates/get_started/book_preview.html:12
-#: bookwyrm/templates/shelf/shelf.html:88
+#: bookwyrm/templates/shelf/shelf.html:90
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
@@ -2017,7 +2049,7 @@ msgid "Read"
msgstr "Lido"
#: bookwyrm/templates/get_started/book_preview.html:13
-#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40
+#: bookwyrm/templates/shelf/shelf.html:91 bookwyrm/templates/user/user.html:40
#: bookwyrm/templatetags/shelf_tags.py:17
msgid "Stopped Reading"
msgstr "Leitura Parada"
@@ -2027,7 +2059,7 @@ msgid "What are you reading?"
msgstr "O que andas a ler?"
#: bookwyrm/templates/get_started/books.html:9
-#: bookwyrm/templates/layout.html:39 bookwyrm/templates/lists/list.html:213
+#: bookwyrm/templates/layout.html:41 bookwyrm/templates/lists/list.html:213
msgid "Search for a book"
msgstr "Pesquisar por um livro"
@@ -2046,8 +2078,8 @@ msgstr "Podes adicionar livros quando começas a usar %(site_name)s."
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:15
-#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:45
-#: bookwyrm/templates/layout.html:46 bookwyrm/templates/lists/list.html:217
+#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:47
+#: bookwyrm/templates/layout.html:48 bookwyrm/templates/lists/list.html:217
#: bookwyrm/templates/search/layout.html:5
#: bookwyrm/templates/search/layout.html:10
#: bookwyrm/templates/search/layout.html:32
@@ -2514,8 +2546,8 @@ msgid "Barcode reader"
msgstr "Leitor de códigos de barras"
#: bookwyrm/templates/guided_tour/home.html:102
-msgid "Use the Feed, Lists and Discover links to discover the latest news from your feed, lists of books by topic, and the latest happenings on this Bookwyrm server!"
-msgstr "Usar o Feed, Listas e Descubra links para descobrir as últimas notícias do teu feed, listas de livros por tópico, e os últimos acontecimentos nesta instância de Bookwyrm!"
+msgid "Use the Lists, Discover, and Your Books links to discover reading suggestions and the latest happenings on this server, or to see your catalogued books!"
+msgstr ""
#: bookwyrm/templates/guided_tour/home.html:103
msgid "Navigation Bar"
@@ -2538,16 +2570,16 @@ msgid "The bell will light up when you have a new notification. When it does, cl
msgstr "A campainha ficará iluminada quando tiveres uma nova notificação. Quando isso acontecer, carrega nela para descobrires o que de emocionante aconteceu!"
#: bookwyrm/templates/guided_tour/home.html:177
-#: bookwyrm/templates/layout.html:75 bookwyrm/templates/layout.html:106
-#: bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:77 bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:108
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr "Notificações"
#: bookwyrm/templates/guided_tour/home.html:200
-msgid "Your profile, books, direct messages, and settings can be accessed by clicking on your name in the menu here."
-msgstr "O teu perfil, livros, mensagens diretas e configurações podem ser acedidos carregando no teu nome no menu aqui."
+msgid "Your profile, user directory, direct messages, and settings can be accessed by clicking on your name in the menu here."
+msgstr ""
#: bookwyrm/templates/guided_tour/home.html:200
msgid "Try selecting Profile from the drop down menu to continue the tour."
@@ -2702,7 +2734,7 @@ msgstr "Podes criar ou entrar num grupo com outros utilizadores. Grupos podem pa
#: bookwyrm/templates/guided_tour/user_groups.html:11
#: bookwyrm/templates/guided_tour/user_profile.html:55
-#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:85
+#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:95
msgid "Groups"
msgstr "Grupos"
@@ -2747,7 +2779,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr "Este é o teu perfil de utilizador. Todas as tuas atividades mais recentes serão listadas aqui. Os outros utilizadores do Bookwyrm também poderão ver partes desta página - o que podem ver depende das tuas configurações de privacidade."
#: bookwyrm/templates/guided_tour/user_profile.html:11
-#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:14
+#: bookwyrm/templates/user/layout.html:20 bookwyrm/templates/user/user.html:14
msgid "User Profile"
msgstr "Perfil de Utilizador"
@@ -2756,7 +2788,7 @@ msgid "This tab shows everything you have read towards your annual reading goal,
msgstr "Este divisor mostra tudo o que leste e que conta para a tua meta de leitura anual, ou permite que definas uma meta. Não é preciso definir uma meta de leitura se não é a tua coisa!"
#: bookwyrm/templates/guided_tour/user_profile.html:32
-#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:79
+#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:89
msgid "Reading Goal"
msgstr "Meta de leitura"
@@ -2795,7 +2827,7 @@ msgstr "Ainda não há atividades para esta hashtag!"
#: bookwyrm/templates/import/import.html:5
#: bookwyrm/templates/import/import.html:9
-#: bookwyrm/templates/shelf/shelf.html:64
+#: bookwyrm/templates/shelf/shelf.html:66
msgid "Import Books"
msgstr "Importar livros"
@@ -2805,12 +2837,8 @@ msgstr "Não é um ficheiro CSV válido"
#: bookwyrm/templates/import/import.html:21
#, python-format
-msgid "\n"
-" Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day.\n"
-" "
-msgid_plural "\n"
-" Currently, you are allowed to import %(import_size_limit)s books every %(import_limit_reset)s days.\n"
-" "
+msgid "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day."
+msgid_plural "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s days."
msgstr[0] ""
msgstr[1] ""
@@ -2871,7 +2899,7 @@ msgstr "Configuração de privacidade para criticas importadas:"
#: bookwyrm/templates/import/import.html:106
#: bookwyrm/templates/import/import.html:108
-#: bookwyrm/templates/preferences/layout.html:35
+#: bookwyrm/templates/preferences/layout.html:43
#: bookwyrm/templates/settings/federation/instance_blocklist.html:78
msgid "Import"
msgstr "Importar"
@@ -2970,8 +2998,8 @@ msgid "Row"
msgstr "Linha"
#: bookwyrm/templates/import/import_status.html:110
-#: bookwyrm/templates/shelf/shelf.html:148
-#: bookwyrm/templates/shelf/shelf.html:170
+#: bookwyrm/templates/shelf/shelf.html:150
+#: bookwyrm/templates/shelf/shelf.html:172
msgid "Title"
msgstr "Título"
@@ -2984,8 +3012,8 @@ msgid "Openlibrary key"
msgstr "Id da Openlibrary"
#: bookwyrm/templates/import/import_status.html:121
-#: bookwyrm/templates/shelf/shelf.html:149
-#: bookwyrm/templates/shelf/shelf.html:173
+#: bookwyrm/templates/shelf/shelf.html:151
+#: bookwyrm/templates/shelf/shelf.html:175
msgid "Author"
msgstr "Autor(a)"
@@ -3091,10 +3119,6 @@ msgstr "Entra em contato com o administrador do domínio ou DATA_UPLOAD_MAX_MEMORY_SIZE setting.\n"
+" "
+msgstr ""
+
#: bookwyrm/templates/500.html:4
msgid "Oops!"
msgstr "Ups!"
@@ -536,12 +570,12 @@ msgstr "Moderatorii și administratorii %(site_name)s mențin site-ul în picioa
msgid "Moderator"
msgstr "Moderator"
-#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:67
+#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:62
msgid "Admin"
msgstr "Admin"
#: bookwyrm/templates/about/about.html:140
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:28
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
msgid "Send direct message"
@@ -575,7 +609,7 @@ msgid "Software version:"
msgstr "Versiunea programului:"
#: bookwyrm/templates/about/layout.html:30
-#: bookwyrm/templates/embed-layout.html:33
+#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/snippets/footer.html:8
#, python-format
msgid "About %(site_name)s"
@@ -682,7 +716,7 @@ msgstr "Cea mai scurtă lectură a sa…"
#: bookwyrm/templates/annual_summary/layout.html:157
#: bookwyrm/templates/annual_summary/layout.html:178
#: bookwyrm/templates/annual_summary/layout.html:247
-#: bookwyrm/templates/book/book.html:63
+#: bookwyrm/templates/book/book.html:65
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
@@ -772,24 +806,24 @@ msgid "View ISNI record"
msgstr "Vizualizați intrarea ISNI"
#: bookwyrm/templates/author/author.html:95
-#: bookwyrm/templates/book/book.html:173
+#: bookwyrm/templates/book/book.html:175
msgid "View on ISFDB"
msgstr ""
#: bookwyrm/templates/author/author.html:100
#: bookwyrm/templates/author/sync_modal.html:5
-#: bookwyrm/templates/book/book.html:140
+#: bookwyrm/templates/book/book.html:142
#: bookwyrm/templates/book/sync_modal.html:5
msgid "Load data"
msgstr "Încărcați date"
#: bookwyrm/templates/author/author.html:104
-#: bookwyrm/templates/book/book.html:144
+#: bookwyrm/templates/book/book.html:146
msgid "View on OpenLibrary"
msgstr "Vizualizați în OpenLibrary"
#: bookwyrm/templates/author/author.html:119
-#: bookwyrm/templates/book/book.html:158
+#: bookwyrm/templates/book/book.html:160
msgid "View on Inventaire"
msgstr "Vizualizați în Inventaire"
@@ -801,11 +835,7 @@ msgstr "Vizualizați în LibraryThing"
msgid "View on Goodreads"
msgstr "Vizualizați în Goodreads"
-#: bookwyrm/templates/author/author.html:151
-msgid "View ISFDB entry"
-msgstr ""
-
-#: bookwyrm/templates/author/author.html:166
+#: bookwyrm/templates/author/author.html:158
#, python-format
msgid "Books by %(name)s"
msgstr "Cărți de %(name)s"
@@ -914,7 +944,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:89
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save"
@@ -963,19 +993,19 @@ msgstr "Confirmați"
msgid "Unable to connect to remote source."
msgstr "Nu s-a putut stabili conexiunea la distanță."
-#: bookwyrm/templates/book/book.html:71 bookwyrm/templates/book/book.html:72
+#: bookwyrm/templates/book/book.html:73 bookwyrm/templates/book/book.html:74
msgid "Edit Book"
msgstr "Editați carte"
-#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:100
+#: bookwyrm/templates/book/book.html:99 bookwyrm/templates/book/book.html:102
msgid "Click to add cover"
msgstr "Adăugați o copertă"
-#: bookwyrm/templates/book/book.html:106
+#: bookwyrm/templates/book/book.html:108
msgid "Failed to load cover"
msgstr "Eșec la încărcarea coperții"
-#: bookwyrm/templates/book/book.html:117
+#: bookwyrm/templates/book/book.html:119
msgid "Click to enlarge"
msgstr "Clic pentru a mări"
@@ -1052,13 +1082,13 @@ msgstr "Locuri"
#: bookwyrm/templates/guided_tour/lists.html:14
#: bookwyrm/templates/guided_tour/user_books.html:102
#: bookwyrm/templates/guided_tour/user_profile.html:78
-#: bookwyrm/templates/layout.html:90 bookwyrm/templates/lists/curate.html:8
+#: bookwyrm/templates/layout.html:88 bookwyrm/templates/lists/curate.html:8
#: bookwyrm/templates/lists/list.html:12 bookwyrm/templates/lists/lists.html:5
#: bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:26
#: bookwyrm/templates/search/layout.html:51
#: bookwyrm/templates/settings/celery.html:77
-#: bookwyrm/templates/user/layout.html:91 bookwyrm/templates/user/lists.html:6
+#: bookwyrm/templates/user/layout.html:101 bookwyrm/templates/user/lists.html:6
msgid "Lists"
msgstr "Liste"
@@ -1123,8 +1153,8 @@ msgstr "Încărcați copertă:"
#: bookwyrm/templates/book/cover_add_modal.html:23
#: bookwyrm/templates/book/edit/edit_book_form.html:250
-msgid "Load cover from url:"
-msgstr "Încărcați copertă de la URL-ul:"
+msgid "Load cover from URL:"
+msgstr ""
#: bookwyrm/templates/book/cover_show_modal.html:6
msgid "Book cover preview"
@@ -1334,7 +1364,7 @@ msgid "Add Another Author"
msgstr "Adăugați un alt autor"
#: bookwyrm/templates/book/edit/edit_book_form.html:231
-#: bookwyrm/templates/shelf/shelf.html:147
+#: bookwyrm/templates/shelf/shelf.html:149
msgid "Cover"
msgstr "Copertă"
@@ -1378,8 +1408,8 @@ msgstr "Ediții ale %(book_title)s"
#: bookwyrm/templates/book/editions/editions.html:8
#, python-format
-msgid "Editions of \"%(work_title)s\""
-msgstr "Ediții ale %(work_title)s"
+msgid "Editions of %(work_title)s"
+msgstr ""
#: bookwyrm/templates/book/editions/editions.html:55
msgid "Can't find the edition you're looking for?"
@@ -1461,8 +1491,9 @@ msgstr "Domeniu"
#: bookwyrm/templates/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
#: bookwyrm/templates/settings/invites/status_filter.html:5
+#: bookwyrm/templates/settings/themes.html:111
#: bookwyrm/templates/settings/users/user_admin.html:56
-#: bookwyrm/templates/settings/users/user_info.html:24
+#: bookwyrm/templates/settings/users/user_info.html:35
msgid "Status"
msgstr "Status"
@@ -1471,7 +1502,7 @@ msgstr "Status"
#: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/imports/imports.html:141
#: bookwyrm/templates/settings/reports/report_links_table.html:6
-#: bookwyrm/templates/settings/themes.html:99
+#: bookwyrm/templates/settings/themes.html:108
msgid "Actions"
msgstr "Acțiuni"
@@ -1535,22 +1566,22 @@ msgstr "%(pages)s pagini"
msgid "%(languages)s language"
msgstr "%(languages)s Limbă"
-#: bookwyrm/templates/book/publisher_info.html:65
+#: bookwyrm/templates/book/publisher_info.html:63
#, python-format
msgid "Published %(date)s by %(publisher)s."
msgstr "Publicat în %(date)s de %(publisher)s."
+#: bookwyrm/templates/book/publisher_info.html:65
+#, python-format
+msgid "Published by %(publisher)s."
+msgstr "Publicat de %(publisher)s."
+
#: bookwyrm/templates/book/publisher_info.html:67
#, python-format
msgid "Published %(date)s"
msgstr "Publicat în %(date)s"
-#: bookwyrm/templates/book/publisher_info.html:69
-#, python-format
-msgid "Published by %(publisher)s."
-msgstr "Publicat de %(publisher)s."
-
-#: bookwyrm/templates/book/rating.html:13
+#: bookwyrm/templates/book/rating.html:19
msgid "rated it"
msgstr "a evaluat-o"
@@ -1558,12 +1589,12 @@ msgstr "a evaluat-o"
msgid "Series by"
msgstr ""
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
#, python-format
msgid "Book %(series_number)s"
msgstr ""
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
msgid "Unsorted Book"
msgstr ""
@@ -1687,6 +1718,7 @@ msgstr "Sugerate"
#: bookwyrm/templates/ostatus/subscribe.html:42
#: bookwyrm/templates/ostatus/success.html:17
#: bookwyrm/templates/ostatus/success.html:18
+#: bookwyrm/templates/user/moved.html:19 bookwyrm/templates/user/moved.html:20
#: bookwyrm/templates/user/user_preview.html:16
#: bookwyrm/templates/user/user_preview.html:17
msgid "Locked account"
@@ -1763,7 +1795,7 @@ msgstr "%(username)s a citat %(username)s"
msgstr "Mesajele directe cu %(username)s"
#: bookwyrm/templates/feed/direct_messages.html:10
-#: bookwyrm/templates/user_menu.html:44
+#: bookwyrm/templates/user_menu.html:39
msgid "Direct Messages"
msgstr "Mesaje directe"
@@ -1956,7 +1988,7 @@ msgstr "Actualizări"
#: bookwyrm/templates/feed/suggested_books.html:6
#: bookwyrm/templates/guided_tour/home.html:127
-#: bookwyrm/templates/user_menu.html:39
+#: bookwyrm/templates/layout.html:94
msgid "Your Books"
msgstr "Cărțile dvs."
@@ -2004,19 +2036,19 @@ msgid "Add to your books"
msgstr "Adăugați la cărțile dvs."
#: bookwyrm/templates/get_started/book_preview.html:10
-#: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37
+#: bookwyrm/templates/shelf/shelf.html:88 bookwyrm/templates/user/user.html:37
#: bookwyrm/templatetags/shelf_tags.py:14
msgid "To Read"
msgstr "De citit"
#: bookwyrm/templates/get_started/book_preview.html:11
-#: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38
+#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:38
#: bookwyrm/templatetags/shelf_tags.py:15
msgid "Currently Reading"
msgstr "Lectură în curs"
#: bookwyrm/templates/get_started/book_preview.html:12
-#: bookwyrm/templates/shelf/shelf.html:88
+#: bookwyrm/templates/shelf/shelf.html:90
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
@@ -2025,7 +2057,7 @@ msgid "Read"
msgstr "Citite"
#: bookwyrm/templates/get_started/book_preview.html:13
-#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40
+#: bookwyrm/templates/shelf/shelf.html:91 bookwyrm/templates/user/user.html:40
#: bookwyrm/templatetags/shelf_tags.py:17
msgid "Stopped Reading"
msgstr "Lectură oprită"
@@ -2035,7 +2067,7 @@ msgid "What are you reading?"
msgstr "Ce citiți?"
#: bookwyrm/templates/get_started/books.html:9
-#: bookwyrm/templates/layout.html:39 bookwyrm/templates/lists/list.html:213
+#: bookwyrm/templates/layout.html:41 bookwyrm/templates/lists/list.html:213
msgid "Search for a book"
msgstr "Căutați o carte"
@@ -2054,8 +2086,8 @@ msgstr "Puteți adăuga cărți când începeți să folosiți %(site_name)s."
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:15
-#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:45
-#: bookwyrm/templates/layout.html:46 bookwyrm/templates/lists/list.html:217
+#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:47
+#: bookwyrm/templates/layout.html:48 bookwyrm/templates/lists/list.html:217
#: bookwyrm/templates/search/layout.html:5
#: bookwyrm/templates/search/layout.html:10
#: bookwyrm/templates/search/layout.html:32
@@ -2524,8 +2556,8 @@ msgid "Barcode reader"
msgstr "Cititor de cod de bare"
#: bookwyrm/templates/guided_tour/home.html:102
-msgid "Use the Feed, Lists and Discover links to discover the latest news from your feed, lists of books by topic, and the latest happenings on this Bookwyrm server!"
-msgstr "Folosiți legăturile Flux, Liste și Descoperiți pentru a descoperi ultimele știri de pe fluxul dvs., listele de cărți după subiect și ultimele întâmplări de pe acest server de Bookwyrm!"
+msgid "Use the Lists, Discover, and Your Books links to discover reading suggestions and the latest happenings on this server, or to see your catalogued books!"
+msgstr ""
#: bookwyrm/templates/guided_tour/home.html:103
msgid "Navigation Bar"
@@ -2548,16 +2580,16 @@ msgid "The bell will light up when you have a new notification. When it does, cl
msgstr "Clopoțelul se va aprinde când aveți o notificare nouă. Când o face, apăsați-l pentru a descoperi ce lucru interesant s-a întâmplat!"
#: bookwyrm/templates/guided_tour/home.html:177
-#: bookwyrm/templates/layout.html:75 bookwyrm/templates/layout.html:106
-#: bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:77 bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:108
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr "Notificări"
#: bookwyrm/templates/guided_tour/home.html:200
-msgid "Your profile, books, direct messages, and settings can be accessed by clicking on your name in the menu here."
-msgstr "Profilul dvs., cărțile, mesajele directe și setările pot fi accesate făcând clic pe numele dvs. în meniul de aici."
+msgid "Your profile, user directory, direct messages, and settings can be accessed by clicking on your name in the menu here."
+msgstr ""
#: bookwyrm/templates/guided_tour/home.html:200
msgid "Try selecting Profile from the drop down menu to continue the tour."
@@ -2712,7 +2744,7 @@ msgstr "Puteți crea sau vă alătura unui grup cu alți utilizatori. Grupurile
#: bookwyrm/templates/guided_tour/user_groups.html:11
#: bookwyrm/templates/guided_tour/user_profile.html:55
-#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:85
+#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:95
msgid "Groups"
msgstr "Grupuri"
@@ -2757,7 +2789,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr "Acesta este profilul dvs. de utilizator. Cele mai recente activități ale dvs. vor fi listate aici. Alți utilizatori BookWyrm pot vedea părți din această pagină de asemenea - ceea ce văd depinde de setările dvs. de confidențialitate."
#: bookwyrm/templates/guided_tour/user_profile.html:11
-#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:14
+#: bookwyrm/templates/user/layout.html:20 bookwyrm/templates/user/user.html:14
msgid "User Profile"
msgstr "Profilul utilizatorului"
@@ -2766,7 +2798,7 @@ msgid "This tab shows everything you have read towards your annual reading goal,
msgstr "Această fereastră arată tot ce ați citit pentru a vă atinge obiectivul dvs. anual de lectură sau vă permite să stabiliți unul. Nu trebuie să vă fixați un obiectiv de lectură dacă nu este genul vostru!"
#: bookwyrm/templates/guided_tour/user_profile.html:32
-#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:79
+#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:89
msgid "Reading Goal"
msgstr "Obiectiv de lectură"
@@ -2805,7 +2837,7 @@ msgstr ""
#: bookwyrm/templates/import/import.html:5
#: bookwyrm/templates/import/import.html:9
-#: bookwyrm/templates/shelf/shelf.html:64
+#: bookwyrm/templates/shelf/shelf.html:66
msgid "Import Books"
msgstr "Importați cărți"
@@ -2815,12 +2847,8 @@ msgstr ""
#: bookwyrm/templates/import/import.html:21
#, python-format
-msgid "\n"
-" Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day.\n"
-" "
-msgid_plural "\n"
-" Currently, you are allowed to import %(import_size_limit)s books every %(import_limit_reset)s days.\n"
-" "
+msgid "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day."
+msgid_plural "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s days."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -2882,7 +2910,7 @@ msgstr "Setare de confidențialitate pentru recenziile importate:"
#: bookwyrm/templates/import/import.html:106
#: bookwyrm/templates/import/import.html:108
-#: bookwyrm/templates/preferences/layout.html:35
+#: bookwyrm/templates/preferences/layout.html:43
#: bookwyrm/templates/settings/federation/instance_blocklist.html:78
msgid "Import"
msgstr "Importați"
@@ -2983,8 +3011,8 @@ msgid "Row"
msgstr "Linie"
#: bookwyrm/templates/import/import_status.html:110
-#: bookwyrm/templates/shelf/shelf.html:148
-#: bookwyrm/templates/shelf/shelf.html:170
+#: bookwyrm/templates/shelf/shelf.html:150
+#: bookwyrm/templates/shelf/shelf.html:172
msgid "Title"
msgstr "Titlu"
@@ -2997,8 +3025,8 @@ msgid "Openlibrary key"
msgstr "Cheie OpenLibrary"
#: bookwyrm/templates/import/import_status.html:121
-#: bookwyrm/templates/shelf/shelf.html:149
-#: bookwyrm/templates/shelf/shelf.html:173
+#: bookwyrm/templates/shelf/shelf.html:151
+#: bookwyrm/templates/shelf/shelf.html:175
msgid "Author"
msgstr "Autor"
@@ -3104,10 +3132,6 @@ msgstr "Contactați-vă adminul sau DATA_UPLOAD_MAX_MEMORY_SIZE setting.\n"
+" "
+msgstr ""
+
#: bookwyrm/templates/500.html:4
msgid "Oops!"
msgstr "Hoppsan!"
@@ -536,12 +570,12 @@ msgstr "%(site_name)s's moderatorer och administratörer håller hemsidan uppe o
msgid "Moderator"
msgstr "Moderator"
-#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:67
+#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:62
msgid "Admin"
msgstr "Administratör"
#: bookwyrm/templates/about/about.html:140
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:28
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
msgid "Send direct message"
@@ -575,7 +609,7 @@ msgid "Software version:"
msgstr "Programvaruversion:"
#: bookwyrm/templates/about/layout.html:30
-#: bookwyrm/templates/embed-layout.html:33
+#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/snippets/footer.html:8
#, python-format
msgid "About %(site_name)s"
@@ -680,7 +714,7 @@ msgstr "Det kortast lästa det här året…"
#: bookwyrm/templates/annual_summary/layout.html:157
#: bookwyrm/templates/annual_summary/layout.html:178
#: bookwyrm/templates/annual_summary/layout.html:247
-#: bookwyrm/templates/book/book.html:63
+#: bookwyrm/templates/book/book.html:65
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
@@ -768,24 +802,24 @@ msgid "View ISNI record"
msgstr "Visa ISNI-samling"
#: bookwyrm/templates/author/author.html:95
-#: bookwyrm/templates/book/book.html:173
+#: bookwyrm/templates/book/book.html:175
msgid "View on ISFDB"
msgstr "Visa på ISFDB"
#: bookwyrm/templates/author/author.html:100
#: bookwyrm/templates/author/sync_modal.html:5
-#: bookwyrm/templates/book/book.html:140
+#: bookwyrm/templates/book/book.html:142
#: bookwyrm/templates/book/sync_modal.html:5
msgid "Load data"
msgstr "Ladda data"
#: bookwyrm/templates/author/author.html:104
-#: bookwyrm/templates/book/book.html:144
+#: bookwyrm/templates/book/book.html:146
msgid "View on OpenLibrary"
msgstr "Visa i OpenLibrary"
#: bookwyrm/templates/author/author.html:119
-#: bookwyrm/templates/book/book.html:158
+#: bookwyrm/templates/book/book.html:160
msgid "View on Inventaire"
msgstr "Visa i Inventaire"
@@ -797,11 +831,7 @@ msgstr "Visa i LibraryThing"
msgid "View on Goodreads"
msgstr "Visa i Goodreads"
-#: bookwyrm/templates/author/author.html:151
-msgid "View ISFDB entry"
-msgstr "Visa ISFDB-post"
-
-#: bookwyrm/templates/author/author.html:166
+#: bookwyrm/templates/author/author.html:158
#, python-format
msgid "Books by %(name)s"
msgstr "Böcker av %(name)s"
@@ -910,7 +940,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:89
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save"
@@ -959,19 +989,19 @@ msgstr "Bekräfta"
msgid "Unable to connect to remote source."
msgstr "Kunde inte ansluta till fjärrkälla."
-#: bookwyrm/templates/book/book.html:71 bookwyrm/templates/book/book.html:72
+#: bookwyrm/templates/book/book.html:73 bookwyrm/templates/book/book.html:74
msgid "Edit Book"
msgstr "Redigera bok"
-#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:100
+#: bookwyrm/templates/book/book.html:99 bookwyrm/templates/book/book.html:102
msgid "Click to add cover"
msgstr "Klicka för att lägga till omslag"
-#: bookwyrm/templates/book/book.html:106
+#: bookwyrm/templates/book/book.html:108
msgid "Failed to load cover"
msgstr "Misslyckades med att ladda omslaget"
-#: bookwyrm/templates/book/book.html:117
+#: bookwyrm/templates/book/book.html:119
msgid "Click to enlarge"
msgstr "Klicka för att förstora"
@@ -1046,13 +1076,13 @@ msgstr "Platser"
#: bookwyrm/templates/guided_tour/lists.html:14
#: bookwyrm/templates/guided_tour/user_books.html:102
#: bookwyrm/templates/guided_tour/user_profile.html:78
-#: bookwyrm/templates/layout.html:90 bookwyrm/templates/lists/curate.html:8
+#: bookwyrm/templates/layout.html:88 bookwyrm/templates/lists/curate.html:8
#: bookwyrm/templates/lists/list.html:12 bookwyrm/templates/lists/lists.html:5
#: bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:26
#: bookwyrm/templates/search/layout.html:51
#: bookwyrm/templates/settings/celery.html:77
-#: bookwyrm/templates/user/layout.html:91 bookwyrm/templates/user/lists.html:6
+#: bookwyrm/templates/user/layout.html:101 bookwyrm/templates/user/lists.html:6
msgid "Lists"
msgstr "Listor"
@@ -1117,8 +1147,8 @@ msgstr "Ladda upp omslag:"
#: bookwyrm/templates/book/cover_add_modal.html:23
#: bookwyrm/templates/book/edit/edit_book_form.html:250
-msgid "Load cover from url:"
-msgstr "Ladda omslag från url:"
+msgid "Load cover from URL:"
+msgstr ""
#: bookwyrm/templates/book/cover_show_modal.html:6
msgid "Book cover preview"
@@ -1328,7 +1358,7 @@ msgid "Add Another Author"
msgstr "Lägg till en annan författare"
#: bookwyrm/templates/book/edit/edit_book_form.html:231
-#: bookwyrm/templates/shelf/shelf.html:147
+#: bookwyrm/templates/shelf/shelf.html:149
msgid "Cover"
msgstr "Omslag"
@@ -1372,8 +1402,8 @@ msgstr "Utgåvor av %(book_title)s"
#: bookwyrm/templates/book/editions/editions.html:8
#, python-format
-msgid "Editions of \"%(work_title)s\""
-msgstr "Utgåvor av \"%(work_title)s\""
+msgid "Editions of %(work_title)s"
+msgstr ""
#: bookwyrm/templates/book/editions/editions.html:55
msgid "Can't find the edition you're looking for?"
@@ -1455,8 +1485,9 @@ msgstr "Domän"
#: bookwyrm/templates/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
#: bookwyrm/templates/settings/invites/status_filter.html:5
+#: bookwyrm/templates/settings/themes.html:111
#: bookwyrm/templates/settings/users/user_admin.html:56
-#: bookwyrm/templates/settings/users/user_info.html:24
+#: bookwyrm/templates/settings/users/user_info.html:35
msgid "Status"
msgstr "Status"
@@ -1465,7 +1496,7 @@ msgstr "Status"
#: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/imports/imports.html:141
#: bookwyrm/templates/settings/reports/report_links_table.html:6
-#: bookwyrm/templates/settings/themes.html:99
+#: bookwyrm/templates/settings/themes.html:108
msgid "Actions"
msgstr "Åtgärder"
@@ -1529,22 +1560,22 @@ msgstr "%(pages)s sidor"
msgid "%(languages)s language"
msgstr "På %(languages)s"
-#: bookwyrm/templates/book/publisher_info.html:65
+#: bookwyrm/templates/book/publisher_info.html:63
#, python-format
msgid "Published %(date)s by %(publisher)s."
msgstr "Publicerades %(date)s av %(publisher)s."
+#: bookwyrm/templates/book/publisher_info.html:65
+#, python-format
+msgid "Published by %(publisher)s."
+msgstr "Publicerades av %(publisher)s."
+
#: bookwyrm/templates/book/publisher_info.html:67
#, python-format
msgid "Published %(date)s"
msgstr "Publicerades %(date)s"
-#: bookwyrm/templates/book/publisher_info.html:69
-#, python-format
-msgid "Published by %(publisher)s."
-msgstr "Publicerades av %(publisher)s."
-
-#: bookwyrm/templates/book/rating.html:13
+#: bookwyrm/templates/book/rating.html:19
msgid "rated it"
msgstr "betygsatte den"
@@ -1552,12 +1583,12 @@ msgstr "betygsatte den"
msgid "Series by"
msgstr "Serier av"
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
#, python-format
msgid "Book %(series_number)s"
msgstr "Bok %(series_number)s"
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
msgid "Unsorted Book"
msgstr "Osorterad bok"
@@ -1681,6 +1712,7 @@ msgstr "Föreslagna"
#: bookwyrm/templates/ostatus/subscribe.html:42
#: bookwyrm/templates/ostatus/success.html:17
#: bookwyrm/templates/ostatus/success.html:18
+#: bookwyrm/templates/user/moved.html:19 bookwyrm/templates/user/moved.html:20
#: bookwyrm/templates/user/user_preview.html:16
#: bookwyrm/templates/user/user_preview.html:17
msgid "Locked account"
@@ -1755,7 +1787,7 @@ msgstr "%(username)s citerade %(username)s"
msgstr "Direktmeddelanden med %(username)s"
#: bookwyrm/templates/feed/direct_messages.html:10
-#: bookwyrm/templates/user_menu.html:44
+#: bookwyrm/templates/user_menu.html:39
msgid "Direct Messages"
msgstr "Direktmeddelanden"
@@ -1948,7 +1980,7 @@ msgstr "Uppdateringar"
#: bookwyrm/templates/feed/suggested_books.html:6
#: bookwyrm/templates/guided_tour/home.html:127
-#: bookwyrm/templates/user_menu.html:39
+#: bookwyrm/templates/layout.html:94
msgid "Your Books"
msgstr "Dina böcker"
@@ -1996,19 +2028,19 @@ msgid "Add to your books"
msgstr "Lägg till i dina böcker"
#: bookwyrm/templates/get_started/book_preview.html:10
-#: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37
+#: bookwyrm/templates/shelf/shelf.html:88 bookwyrm/templates/user/user.html:37
#: bookwyrm/templatetags/shelf_tags.py:14
msgid "To Read"
msgstr "Att läsa"
#: bookwyrm/templates/get_started/book_preview.html:11
-#: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38
+#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:38
#: bookwyrm/templatetags/shelf_tags.py:15
msgid "Currently Reading"
msgstr "Läser just nu"
#: bookwyrm/templates/get_started/book_preview.html:12
-#: bookwyrm/templates/shelf/shelf.html:88
+#: bookwyrm/templates/shelf/shelf.html:90
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
@@ -2017,7 +2049,7 @@ msgid "Read"
msgstr "Lästa"
#: bookwyrm/templates/get_started/book_preview.html:13
-#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40
+#: bookwyrm/templates/shelf/shelf.html:91 bookwyrm/templates/user/user.html:40
#: bookwyrm/templatetags/shelf_tags.py:17
msgid "Stopped Reading"
msgstr "Slutade läsa"
@@ -2027,7 +2059,7 @@ msgid "What are you reading?"
msgstr "Vad läser du?"
#: bookwyrm/templates/get_started/books.html:9
-#: bookwyrm/templates/layout.html:39 bookwyrm/templates/lists/list.html:213
+#: bookwyrm/templates/layout.html:41 bookwyrm/templates/lists/list.html:213
msgid "Search for a book"
msgstr "Sök efter en bok"
@@ -2046,8 +2078,8 @@ msgstr "Du kan lägga till böcker när du börjar använda %(site_name)s."
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:15
-#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:45
-#: bookwyrm/templates/layout.html:46 bookwyrm/templates/lists/list.html:217
+#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:47
+#: bookwyrm/templates/layout.html:48 bookwyrm/templates/lists/list.html:217
#: bookwyrm/templates/search/layout.html:5
#: bookwyrm/templates/search/layout.html:10
#: bookwyrm/templates/search/layout.html:32
@@ -2514,8 +2546,8 @@ msgid "Barcode reader"
msgstr "Streckkodsläsare"
#: bookwyrm/templates/guided_tour/home.html:102
-msgid "Use the Feed, Lists and Discover links to discover the latest news from your feed, lists of books by topic, and the latest happenings on this Bookwyrm server!"
-msgstr "Använd länkarna Flöde, Listor och Upptäck för att upptäcka de senaste nyheterna från ditt flöde, listor över böcker efter ämne, och de senaste händelserna på denna BookWyrm-server!"
+msgid "Use the Lists, Discover, and Your Books links to discover reading suggestions and the latest happenings on this server, or to see your catalogued books!"
+msgstr ""
#: bookwyrm/templates/guided_tour/home.html:103
msgid "Navigation Bar"
@@ -2538,16 +2570,16 @@ msgid "The bell will light up when you have a new notification. When it does, cl
msgstr "Klockan lyser upp när du har nya notiser. När den gör det kan du klicka på den för att ta reda på vad för spännande som har hänt!"
#: bookwyrm/templates/guided_tour/home.html:177
-#: bookwyrm/templates/layout.html:75 bookwyrm/templates/layout.html:106
-#: bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:77 bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:108
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr "Aviseringar"
#: bookwyrm/templates/guided_tour/home.html:200
-msgid "Your profile, books, direct messages, and settings can be accessed by clicking on your name in the menu here."
-msgstr "Din profil, dina böcker, direktmeddelanden och inställningar kan nås genom att klicka på ditt namn i menyn här."
+msgid "Your profile, user directory, direct messages, and settings can be accessed by clicking on your name in the menu here."
+msgstr ""
#: bookwyrm/templates/guided_tour/home.html:200
msgid "Try selecting Profile from the drop down menu to continue the tour."
@@ -2702,7 +2734,7 @@ msgstr "Du kan skapa eller gå med i en grupp med andra användare. Grupper kan
#: bookwyrm/templates/guided_tour/user_groups.html:11
#: bookwyrm/templates/guided_tour/user_profile.html:55
-#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:85
+#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:95
msgid "Groups"
msgstr "Grupper"
@@ -2747,7 +2779,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr "Det här är din användarprofil. Alla dina senaste aktiviteter kommer visas här. Andra BookWyrm-användare kan också se delar av den här sidan, vad de kan se beror på dina sekretessinställningar."
#: bookwyrm/templates/guided_tour/user_profile.html:11
-#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:14
+#: bookwyrm/templates/user/layout.html:20 bookwyrm/templates/user/user.html:14
msgid "User Profile"
msgstr "Användarprofil"
@@ -2756,7 +2788,7 @@ msgid "This tab shows everything you have read towards your annual reading goal,
msgstr "Denna flik visar allt du har läst gentemot ditt årliga läsmål eller låter dig ställa in ett. Du behöver inte sätta upp ett läsmål om det inte är din grej!"
#: bookwyrm/templates/guided_tour/user_profile.html:32
-#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:79
+#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:89
msgid "Reading Goal"
msgstr "Läs-mål"
@@ -2795,7 +2827,7 @@ msgstr "Inga aktiviteter för den här hash-taggen än!"
#: bookwyrm/templates/import/import.html:5
#: bookwyrm/templates/import/import.html:9
-#: bookwyrm/templates/shelf/shelf.html:64
+#: bookwyrm/templates/shelf/shelf.html:66
msgid "Import Books"
msgstr "Importera böcker"
@@ -2805,12 +2837,8 @@ msgstr "Inte en giltig CSV-fil"
#: bookwyrm/templates/import/import.html:21
#, python-format
-msgid "\n"
-" Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day.\n"
-" "
-msgid_plural "\n"
-" Currently, you are allowed to import %(import_size_limit)s books every %(import_limit_reset)s days.\n"
-" "
+msgid "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day."
+msgid_plural "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s days."
msgstr[0] ""
msgstr[1] ""
@@ -2871,7 +2899,7 @@ msgstr "Integritetsinställning för importerade recensioner:"
#: bookwyrm/templates/import/import.html:106
#: bookwyrm/templates/import/import.html:108
-#: bookwyrm/templates/preferences/layout.html:35
+#: bookwyrm/templates/preferences/layout.html:43
#: bookwyrm/templates/settings/federation/instance_blocklist.html:78
msgid "Import"
msgstr "Importera"
@@ -2970,8 +2998,8 @@ msgid "Row"
msgstr "Rad"
#: bookwyrm/templates/import/import_status.html:110
-#: bookwyrm/templates/shelf/shelf.html:148
-#: bookwyrm/templates/shelf/shelf.html:170
+#: bookwyrm/templates/shelf/shelf.html:150
+#: bookwyrm/templates/shelf/shelf.html:172
msgid "Title"
msgstr "Titel"
@@ -2984,8 +3012,8 @@ msgid "Openlibrary key"
msgstr "Openlibrary-nyckel"
#: bookwyrm/templates/import/import_status.html:121
-#: bookwyrm/templates/shelf/shelf.html:149
-#: bookwyrm/templates/shelf/shelf.html:173
+#: bookwyrm/templates/shelf/shelf.html:151
+#: bookwyrm/templates/shelf/shelf.html:175
msgid "Author"
msgstr "Författare"
@@ -3091,10 +3119,6 @@ msgstr "Kontakta din administratör eller %(level)s."
+msgstr ""
+
+#: bookwyrm/templates/403.html:15
+msgid "If you think you should have access, please speak to your BookWyrm server administrator."
+msgstr ""
+
+#: bookwyrm/templates/404.html:4 bookwyrm/templates/404.html:8
+msgid "Not Found"
+msgstr "Не Знайдено"
+
+#: bookwyrm/templates/404.html:9
+msgid "The page you requested doesn't seem to exist!"
+msgstr "Вказана сторінка не існує!"
+
+#: bookwyrm/templates/413.html:4 bookwyrm/templates/413.html:8
+msgid "File too large"
+msgstr ""
+
+#: bookwyrm/templates/413.html:9
+msgid "The file you are uploading is too large."
+msgstr ""
+
+#: bookwyrm/templates/413.html:11
+msgid "\n"
+" You you can try using a smaller file, or ask your BookWyrm server administrator to increase the DATA_UPLOAD_MAX_MEMORY_SIZE
setting.\n"
+" "
+msgstr ""
+
+#: bookwyrm/templates/500.html:4
+msgid "Oops!"
+msgstr "От халепа!"
+
+#: bookwyrm/templates/500.html:8
+msgid "Server Error"
+msgstr "Помилка Сервера"
+
+#: bookwyrm/templates/500.html:9
+msgid "Something went wrong! Sorry about that."
+msgstr "Щось пішло не так! Вибачте."
+
+#: bookwyrm/templates/about/about.html:9
+#: bookwyrm/templates/about/layout.html:35
+msgid "About"
+msgstr "Про ресурс"
+
+#: bookwyrm/templates/about/about.html:21
+#: bookwyrm/templates/get_started/layout.html:22
+#, python-format
+msgid "Welcome to %(site_name)s!"
+msgstr "Вітаємо вас на %(site_name)s!"
+
+#: bookwyrm/templates/about/about.html:25
+#, python-format
+msgid "%(site_name)s is part of BookWyrm, a network of independent, self-directed communities for readers. While you can interact seamlessly with users anywhere in the BookWyrm network, this community is unique."
+msgstr "%(site_name)s є частиною BookWyrm, мережі незалежних, самокерованих спільнот для читачів. Ви можете безперешкодно взаємодіяти з користувачами з будь-якого інстансу мережі BookWyrm, але саме ця спільнота унікальна."
+
+#: bookwyrm/templates/about/about.html:45
+#, python-format
+msgid "%(title)s is %(site_name)s's most beloved book, with an average rating of %(rating)s out of 5."
+msgstr "%(title)s є найулюбленішою книгою на %(site_name)s. Її середній рейтинг дорівнює %(rating)s з 5."
+
+#: bookwyrm/templates/about/about.html:64
+#, python-format
+msgid "More %(site_name)s users want to read %(title)s than any other book."
+msgstr "Користувачі %(site_name)s хочуть прочитати %(title)s більше ніж будь-яку іншу книгу."
+
+#: bookwyrm/templates/about/about.html:83
+#, python-format
+msgid "%(title)s has the most divisive ratings of any book on %(site_name)s."
+msgstr "%(title)s має найсуперечливіші оцінки серед усіх книг на %(site_name)s."
+
+#: bookwyrm/templates/about/about.html:94
+msgid "Track your reading, talk about books, write reviews, and discover what to read next. Always ad-free, anti-corporate, and community-oriented, BookWyrm is human-scale software, designed to stay small and personal. If you have feature requests, bug reports, or grand dreams, reach out and make yourself heard."
+msgstr "Відстежуйте що читаєте, обговорюйте книги, пишіть рецензії та знаходьте що читати далі. BookWyrm - це програмне забезпечення для людей, а не прибутку. Завжди без реклами, анти-корпоративне та орієнтоване на спільноту. Воно спроектовано так, щоб залишатися невеличким та особистим. Якщо у вас є побажання, баг-репорти або великі задуми, зв'яжитесь з нами та розкажіть про них."
+
+#: bookwyrm/templates/about/about.html:105
+msgid "Meet your admins"
+msgstr "Адміністратори"
+
+#: bookwyrm/templates/about/about.html:108
+#, python-format
+msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the code of conduct, and respond when users report spam and bad behavior."
+msgstr "Модератори та адміністратори %(site_name)s підтримують працездатність сайту, слідкують за дотриманням правил поведінки та реагують на скарги користувачів про спам і погану поведінку."
+
+#: bookwyrm/templates/about/about.html:122
+msgid "Moderator"
+msgstr "Модератор"
+
+#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:62
+msgid "Admin"
+msgstr "Адміністратор"
+
+#: bookwyrm/templates/about/about.html:140
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:28
+#: bookwyrm/templates/snippets/status/status_options.html:35
+#: bookwyrm/templates/snippets/user_options.html:14
+msgid "Send direct message"
+msgstr "Надішліть особисте повідомлення"
+
+#: bookwyrm/templates/about/conduct.html:4
+#: bookwyrm/templates/about/conduct.html:9
+#: bookwyrm/templates/about/layout.html:41
+#: bookwyrm/templates/snippets/footer.html:27
+msgid "Code of Conduct"
+msgstr "Правила поведінки"
+
+#: bookwyrm/templates/about/impressum.html:4
+#: bookwyrm/templates/about/impressum.html:9
+#: bookwyrm/templates/about/layout.html:54
+#: bookwyrm/templates/snippets/footer.html:34
+msgid "Impressum"
+msgstr "Імпресум"
+
+#: bookwyrm/templates/about/layout.html:11
+msgid "Active users:"
+msgstr "Активні користувачі:"
+
+#: bookwyrm/templates/about/layout.html:15
+msgid "Statuses posted:"
+msgstr "Опубліковані статуси:"
+
+#: bookwyrm/templates/about/layout.html:19
+#: bookwyrm/templates/setup/config.html:74
+msgid "Software version:"
+msgstr "Версія програмного забезпечення:"
+
+#: bookwyrm/templates/about/layout.html:30
+#: bookwyrm/templates/embed-layout.html:34
+#: bookwyrm/templates/snippets/footer.html:8
+#, python-format
+msgid "About %(site_name)s"
+msgstr "Про %(site_name)s"
+
+#: bookwyrm/templates/about/layout.html:47
+#: bookwyrm/templates/about/privacy.html:4
+#: bookwyrm/templates/about/privacy.html:9
+#: bookwyrm/templates/snippets/footer.html:30
+msgid "Privacy Policy"
+msgstr "Політика Конфіденційності"
+
+#: bookwyrm/templates/annual_summary/layout.html:7
+#: bookwyrm/templates/feed/summary_card.html:8
+#, python-format
+msgid "%(year)s in the books"
+msgstr "%(year)s в книгах"
+
+#: bookwyrm/templates/annual_summary/layout.html:43
+#, python-format
+msgid "%(year)s in the books"
+msgstr "%(year)s в книгах"
+
+#: bookwyrm/templates/annual_summary/layout.html:47
+#, python-format
+msgid "%(display_name)s’s year of reading"
+msgstr "Рік читання для %(display_name)s"
+
+#: bookwyrm/templates/annual_summary/layout.html:53
+msgid "Share this page"
+msgstr "Поділитися цією сторінкою"
+
+#: bookwyrm/templates/annual_summary/layout.html:67
+msgid "Copy address"
+msgstr "Скопіювати адресу"
+
+#: bookwyrm/templates/annual_summary/layout.html:68
+#: bookwyrm/templates/lists/list.html:277
+msgid "Copied!"
+msgstr "Скопійовано!"
+
+#: bookwyrm/templates/annual_summary/layout.html:77
+msgid "Sharing status: public with key"
+msgstr "Статус шерінгу: публічний, за ключем"
+
+#: bookwyrm/templates/annual_summary/layout.html:78
+msgid "The page can be seen by anyone with the complete address."
+msgstr "Цю сторінку може переглянути будь-хто за повною адресою."
+
+#: bookwyrm/templates/annual_summary/layout.html:83
+msgid "Make page private"
+msgstr "Зробити сторінку приватною"
+
+#: bookwyrm/templates/annual_summary/layout.html:89
+msgid "Sharing status: private"
+msgstr "Статус шерінгу: приватний"
+
+#: bookwyrm/templates/annual_summary/layout.html:90
+msgid "The page is private, only you can see it."
+msgstr "Сторінка приватна, тільки ви можете її бачити."
+
+#: bookwyrm/templates/annual_summary/layout.html:95
+msgid "Make page public"
+msgstr "Зробити сторінку публічною"
+
+#: bookwyrm/templates/annual_summary/layout.html:99
+msgid "When you make your page private, the old key won’t give access to the page anymore. A new key will be created if the page is once again made public."
+msgstr "Якщо ви зробите свою сторінку приватною, старий ключ більше не надаватиме доступу до сторінки. Якщо сторінка знову стане публічною, буде створено новий ключ."
+
+#: bookwyrm/templates/annual_summary/layout.html:112
+#, python-format
+msgid "Sadly %(display_name)s didn’t finish any books in %(year)s"
+msgstr "На жаль, %(display_name)s не прочитав жодної книги в %(year)s"
+
+#: bookwyrm/templates/annual_summary/layout.html:118
+#, python-format
+msgid "In %(year)s, %(display_name)s read %(books_total)s book%(link_url)s
.%(link_url)s
. %(confirmation_code)s
\" at login."
+msgstr "Або введіть код \"%(confirmation_code)s
\" при вході в систему."
+
+#: bookwyrm/templates/email/confirm/subject.html:2
+msgid "Please confirm your email"
+msgstr "Будь ласка, підтвердьте свою email-адресу"
+
+#: bookwyrm/templates/email/confirm/text_content.html:10
+#, python-format
+msgid "Or enter the code \"%(confirmation_code)s\" at login."
+msgstr "Або введіть код \"%(confirmation_code)s\" при вході в систему."
+
+#: bookwyrm/templates/email/html_layout.html:15
+#: bookwyrm/templates/email/text_layout.html:2
+msgid "Hi there,"
+msgstr "Привіт,"
+
+#: bookwyrm/templates/email/html_layout.html:21
+#, python-format
+msgid "BookWyrm hosted on %(site_name)s"
+msgstr "BookWyrm розміщений на %(site_name)s"
+
+#: bookwyrm/templates/email/html_layout.html:23
+msgid "Email preference"
+msgstr "Налаштування Email"
+
+#: 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 "Вас запрошують приєднатися до %(site_name)s!"
+
+#: bookwyrm/templates/email/invite/html_content.html:9
+msgid "Join Now"
+msgstr "Приєднатися зараз"
+
+#: bookwyrm/templates/email/invite/html_content.html:15
+#, python-format
+msgid "Learn more about %(site_name)s."
+msgstr "Дізнайтеся більше про %(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 "Вас запросили приєднатися до %(site_name)s! Перейдіть за посиланням нижче, щоб акаунт."
+
+#: bookwyrm/templates/email/invite/text_content.html:8
+#, python-format
+msgid "Learn more about %(site_name)s:"
+msgstr "Дізнайтеся більше про %(site_name)s:"
+
+#: bookwyrm/templates/email/moderation_report/html_content.html:8
+#: bookwyrm/templates/email/moderation_report/text_content.html:6
+#, python-format
+msgid "@%(reporter)s has flagged a link domain for moderation."
+msgstr "@%(reporter)s позначив домен посилання на модерацію."
+
+#: bookwyrm/templates/email/moderation_report/html_content.html:14
+#: bookwyrm/templates/email/moderation_report/text_content.html:10
+#, python-format
+msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation."
+msgstr "@%(reporter)s позначає поведінку @%(reportee)s на модерацію."
+
+#: bookwyrm/templates/email/moderation_report/html_content.html:21
+#: bookwyrm/templates/email/moderation_report/text_content.html:15
+msgid "View report"
+msgstr "Переглянути скаргу"
+
+#: bookwyrm/templates/email/moderation_report/subject.html:2
+#, python-format
+msgid "New report for %(site_name)s"
+msgstr "Нова скарга для %(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 "Ви надіслали запит на зміну пароля на сайті %(site_name)s. Перейдіть за посиланням нижче, щоб встановити новий пароль і увійти до свого облікового запису."
+
+#: 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 "Скинути пароль"
+
+#: 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 "Якщо ви не запитували зміну пароля, ви можете ігнорувати цей лист."
+
+#: bookwyrm/templates/email/password_reset/subject.html:2
+#, python-format
+msgid "Reset your %(site_name)s password"
+msgstr "Скинути пароль до %(site_name)s"
+
+#: bookwyrm/templates/email/test/html_content.html:6
+#: bookwyrm/templates/email/test/text_content.html:4
+msgid "This is a test email."
+msgstr "Це тест е-пошти."
+
+#: bookwyrm/templates/email/test/subject.html:2
+msgid "Test email"
+msgstr "Перевірка е-пошти"
+
+#: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:33
+#: bookwyrm/templates/layout.html:163 bookwyrm/templates/setup/layout.html:15
+#: bookwyrm/templates/two_factor_auth/two_factor_login.html:18
+#: bookwyrm/templates/two_factor_auth/two_factor_prompt.html:18
+#, python-format
+msgid "%(site_name)s home page"
+msgstr "Головна сторінка %(site_name)s"
+
+#: bookwyrm/templates/embed-layout.html:40
+#: bookwyrm/templates/snippets/footer.html:12
+msgid "Contact site admin"
+msgstr "Зв'язатися з адміністратором сайту"
+
+#: bookwyrm/templates/embed-layout.html:46
+msgid "Join BookWyrm"
+msgstr "Приєднатися до BookWyrm"
+
+#: bookwyrm/templates/feed/direct_messages.html:8
+#, python-format
+msgid "Direct Messages with %(username)s"
+msgstr "Особисті Повідомлення з %(username)s"
+
+#: bookwyrm/templates/feed/direct_messages.html:10
+#: bookwyrm/templates/user_menu.html:39
+msgid "Direct Messages"
+msgstr "Особисті Повідомлення"
+
+#: bookwyrm/templates/feed/direct_messages.html:13
+msgid "All messages"
+msgstr "Усі повідомлення"
+
+#: bookwyrm/templates/feed/direct_messages.html:22
+msgid "You have no messages right now."
+msgstr "Наразі у вас немає повідомлень."
+
+#: bookwyrm/templates/feed/feed.html:55
+msgid "There aren't any activities right now! Try following a user to get started"
+msgstr "Немає жодних активностей! Для початку, спробуйте підписатися на якогось користувача"
+
+#: bookwyrm/templates/feed/feed.html:56
+msgid "Alternatively, you can try enabling more status types"
+msgstr "Або, ви можете спробувати увімкнути більше типів постів"
+
+#: bookwyrm/templates/feed/goal_card.html:6
+#: bookwyrm/templates/feed/layout.html:14
+#: bookwyrm/templates/user/goal_form.html:6
+#, python-format
+msgid "%(year)s Reading Goal"
+msgstr "Мета читання на %(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 "Ви можете задати або змінити ціль читання у будь-який час на сторінці профілю "
+
+#: bookwyrm/templates/feed/layout.html:4
+msgid "Updates"
+msgstr "Оновлення"
+
+#: bookwyrm/templates/feed/suggested_books.html:6
+#: bookwyrm/templates/guided_tour/home.html:127
+#: bookwyrm/templates/layout.html:94
+msgid "Your Books"
+msgstr "Ваші книги"
+
+#: bookwyrm/templates/feed/suggested_books.html:10
+msgid "There are no books here right now! Try searching for a book to get started"
+msgstr "Тут немає жодної книги! Спробуйте пошукати книгу, щоб почати"
+
+#: bookwyrm/templates/feed/suggested_books.html:13
+msgid "Do you have book data from another service like GoodReads?"
+msgstr "Чи є у вас дані книги з іншого сервісу, наприклад, GoodReads?"
+
+#: bookwyrm/templates/feed/suggested_books.html:16
+msgid "Import your reading history"
+msgstr "Імпортувати історію читання"
+
+#: bookwyrm/templates/feed/suggested_users.html:5
+#: bookwyrm/templates/get_started/users.html:6
+msgid "Who to follow"
+msgstr "На кого підписатися"
+
+#: bookwyrm/templates/feed/suggested_users.html:9
+msgid "Don't show suggested users"
+msgstr "Не показувати запропонованих користувачів"
+
+#: bookwyrm/templates/feed/suggested_users.html:14
+msgid "View directory"
+msgstr "Переглянути каталог"
+
+#: bookwyrm/templates/feed/summary_card.html:21
+msgid "The end of the year is the best moment to take stock of all the books read during the last 12 months. How many pages have you read? Which book is your best-rated of the year? We compiled these stats, and more!"
+msgstr "Кінець року - найкращий момент, щоб підбити підсумки всіх книг, прочитаних за останні 12 місяців. Скільки сторінок ви прочитали? Яка книга вам найбільше сподобалась? Ми зібрали цю статистику і не тільки!"
+
+#: bookwyrm/templates/feed/summary_card.html:26
+#, python-format
+msgid "Discover your stats for %(year)s!"
+msgstr "Дослідіть вашу статистику за %(year)s рік!"
+
+#: bookwyrm/templates/get_started/book_preview.html:6
+#, python-format
+msgid "Have you read %(book_title)s?"
+msgstr "Ви прочитали %(book_title)s?"
+
+#: bookwyrm/templates/get_started/book_preview.html:7
+msgid "Add to your books"
+msgstr "Додати до ваших книг"
+
+#: bookwyrm/templates/get_started/book_preview.html:10
+#: bookwyrm/templates/shelf/shelf.html:88 bookwyrm/templates/user/user.html:37
+#: bookwyrm/templatetags/shelf_tags.py:14
+msgid "To Read"
+msgstr "В \"Прочитати\""
+
+#: bookwyrm/templates/get_started/book_preview.html:11
+#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:38
+#: bookwyrm/templatetags/shelf_tags.py:15
+msgid "Currently Reading"
+msgstr "Зараз Читаю"
+
+#: bookwyrm/templates/get_started/book_preview.html:12
+#: bookwyrm/templates/shelf/shelf.html:90
+#: bookwyrm/templates/snippets/shelf_selector.html:46
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
+#: bookwyrm/templates/user/user.html:39 bookwyrm/templatetags/shelf_tags.py:16
+msgid "Read"
+msgstr "Прочитано"
+
+#: bookwyrm/templates/get_started/book_preview.html:13
+#: bookwyrm/templates/shelf/shelf.html:91 bookwyrm/templates/user/user.html:40
+#: bookwyrm/templatetags/shelf_tags.py:17
+msgid "Stopped Reading"
+msgstr "Читання Зупинено"
+
+#: bookwyrm/templates/get_started/books.html:6
+msgid "What are you reading?"
+msgstr "Що ви читаєте?"
+
+#: bookwyrm/templates/get_started/books.html:9
+#: bookwyrm/templates/layout.html:41 bookwyrm/templates/lists/list.html:213
+msgid "Search for a book"
+msgstr "Шукати книгу"
+
+#: bookwyrm/templates/get_started/books.html:11
+#, python-format
+msgid "No books found for \"%(query)s\""
+msgstr "Не знайдено книг по запиту \"%(query)s\""
+
+#: bookwyrm/templates/get_started/books.html:11
+#, python-format
+msgid "You can add books when you start using %(site_name)s."
+msgstr "Ви зможете додавати книги, коли почнете користуватися %(site_name)s."
+
+#: 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/members.html:15
+#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:47
+#: bookwyrm/templates/layout.html:48 bookwyrm/templates/lists/list.html:217
+#: bookwyrm/templates/search/layout.html:5
+#: bookwyrm/templates/search/layout.html:10
+#: bookwyrm/templates/search/layout.html:32
+msgid "Search"
+msgstr "Пошук"
+
+#: bookwyrm/templates/get_started/books.html:27
+msgid "Suggested Books"
+msgstr "Запропоновані Книги"
+
+#: bookwyrm/templates/get_started/books.html:33
+msgid "Search results"
+msgstr "Результати пошуку"
+
+#: bookwyrm/templates/get_started/books.html:46
+#, python-format
+msgid "Popular on %(site_name)s"
+msgstr "Популярне на %(site_name)s"
+
+#: bookwyrm/templates/get_started/books.html:58
+#: bookwyrm/templates/lists/list.html:230
+msgid "No books found"
+msgstr "Книжок не знайдено"
+
+#: bookwyrm/templates/get_started/books.html:63
+#: bookwyrm/templates/get_started/profile.html:64
+msgid "Save & continue"
+msgstr "Зберегти & продовжити"
+
+#: bookwyrm/templates/get_started/layout.html:5
+#: bookwyrm/templates/landing/layout.html:5
+msgid "Welcome"
+msgstr "Вітаємо"
+
+#: bookwyrm/templates/get_started/layout.html:24
+msgid "These are some first steps to get you started."
+msgstr "Це кілька перших кроків, які допоможуть вам розпочати роботу."
+
+#: bookwyrm/templates/get_started/layout.html:38
+#: bookwyrm/templates/get_started/profile.html:6
+msgid "Create your profile"
+msgstr "Створити свій профіль"
+
+#: bookwyrm/templates/get_started/layout.html:42
+msgid "Add books"
+msgstr "Додати книги"
+
+#: bookwyrm/templates/get_started/layout.html:46
+msgid "Find friends"
+msgstr "Знайти друзів"
+
+#: bookwyrm/templates/get_started/layout.html:52
+msgid "Skip this step"
+msgstr "Пропустити цей крок"
+
+#: bookwyrm/templates/get_started/layout.html:56
+#: bookwyrm/templates/guided_tour/group.html:101
+msgid "Finish"
+msgstr "Завершити"
+
+#: bookwyrm/templates/get_started/profile.html:15
+#: bookwyrm/templates/preferences/edit_user.html:41
+msgid "Display name:"
+msgstr "Відображуване ім'я:"
+
+#: bookwyrm/templates/get_started/profile.html:29
+#: bookwyrm/templates/preferences/edit_user.html:47
+#: bookwyrm/templates/settings/announcements/edit_announcement.html:49
+msgid "Summary:"
+msgstr "Підсумок:"
+
+#: bookwyrm/templates/get_started/profile.html:34
+msgid "A little bit about you"
+msgstr "Трохи про вас"
+
+#: bookwyrm/templates/get_started/profile.html:43
+#: bookwyrm/templates/preferences/edit_user.html:27
+msgid "Avatar:"
+msgstr "Аватар:"
+
+#: bookwyrm/templates/get_started/profile.html:52
+msgid "Manually approve followers:"
+msgstr "Підтверджувати підписників вручну:"
+
+#: bookwyrm/templates/get_started/profile.html:58
+msgid "Show this account in suggested users:"
+msgstr "Показувати цей акаунт в запропонованих користувачах:"
+
+#: bookwyrm/templates/get_started/profile.html:62
+msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users."
+msgstr "Ваш акаунт буде показуватися в каталозі, та може бути рекомендований іншим користувачам BookWyrm."
+
+#: bookwyrm/templates/get_started/users.html:8
+msgid "You can follow users on other BookWyrm instances and federated services like Mastodon."
+msgstr "Ви можете слідкувати за користувачами з інших інстансів BookWyrm або федеративних сервісів на кшталт Mastodon."
+
+#: bookwyrm/templates/get_started/users.html:11
+msgid "Search for a user"
+msgstr "Пошук користувача"
+
+#: bookwyrm/templates/get_started/users.html:13
+#, python-format
+msgid "No users found for \"%(query)s\""
+msgstr "По запиту \"%(query)s\" користувачів не знайдено"
+
+#: bookwyrm/templates/groups/create_form.html:5
+#: bookwyrm/templates/guided_tour/user_groups.html:32
+#: bookwyrm/templates/user/groups.html:22
+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
+#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:12
+#: bookwyrm/templates/settings/imports/complete_import_modal.html:7
+msgid "This action cannot be un-done"
+msgstr "Цю дію не можна скасувати"
+
+#: bookwyrm/templates/groups/delete_group_modal.html:17
+#: bookwyrm/templates/lists/delete_list_modal.html:19
+#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:29
+#: bookwyrm/templates/settings/announcements/announcement.html:23
+#: bookwyrm/templates/settings/announcements/announcements.html:56
+#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49
+#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36
+#: bookwyrm/templates/snippets/follow_request_buttons.html:12
+#: bookwyrm/templates/snippets/join_invitation_buttons.html:14
+msgid "Delete"
+msgstr "Видалити"
+
+#: bookwyrm/templates/groups/edit_form.html:5
+msgid "Edit Group"
+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:21
+msgid "Delete group"
+msgstr "Видалити групу"
+
+#: bookwyrm/templates/groups/group.html:21
+msgid "Members of this group can create group-curated lists."
+msgstr "Учасники цієї групи можуть створювати списки, які куруються групою."
+
+#: bookwyrm/templates/groups/group.html:26
+#: bookwyrm/templates/lists/create_form.html:5
+#: bookwyrm/templates/lists/lists.html:20
+msgid "Create List"
+msgstr "Створити список"
+
+#: bookwyrm/templates/groups/group.html:39
+msgid "This group has no lists"
+msgstr "Ця група не має списків"
+
+#: bookwyrm/templates/groups/layout.html:17
+msgid "Edit group"
+msgstr "Редагувати групу"
+
+#: bookwyrm/templates/groups/members.html:11
+msgid "Search to add a user"
+msgstr "Пошук, щоб додати користувача"
+
+#: bookwyrm/templates/groups/members.html:32
+msgid "Leave group"
+msgstr "Покинути групу"
+
+#: bookwyrm/templates/groups/members.html:54
+#: bookwyrm/templates/groups/suggested_users.html:35
+#: bookwyrm/templates/snippets/suggested_users.html:31
+#: bookwyrm/templates/user/user_preview.html:39
+#: bookwyrm/templates/user/user_preview.html:47
+msgid "Follows you"
+msgstr "Слідкує за вами"
+
+#: bookwyrm/templates/groups/suggested_users.html:7
+msgid "Add new members!"
+msgstr "Додавайте нових учасників!"
+
+#: bookwyrm/templates/groups/suggested_users.html:20
+#: 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 підписник, за яким ви стежите"
+msgstr[1] "%(mutuals)s підписників, за якими ви стежите"
+msgstr[2] "%(mutuals)s підписників, за якими ви стежите"
+msgstr[3] "%(mutuals)s підписників, за якими ви стежите"
+
+#: bookwyrm/templates/groups/suggested_users.html:27
+#: 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 книга на ваших полицях"
+msgstr[1] "%(shared_books)s книги на ваших полицях"
+msgstr[2] "%(shared_books)s книг на ваших полицях"
+msgstr[3] "%(shared_books)s книг на ваших полицях"
+
+#: bookwyrm/templates/groups/suggested_users.html:43
+#, 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/groups/user_groups.html:35
+msgid "No groups found."
+msgstr "Жодної групи не знайдено."
+
+#: bookwyrm/templates/guided_tour/book.html:10
+msgid "This is home page of a book. Let's see what you can do while you're here!"
+msgstr "Це домашня сторінка книги. Подивімось, що ви можете зробити, поки ви тут!"
+
+#: bookwyrm/templates/guided_tour/book.html:11
+msgid "Book page"
+msgstr "Сторінка книги"
+
+#: bookwyrm/templates/guided_tour/book.html:19
+#: bookwyrm/templates/guided_tour/group.html:19
+#: bookwyrm/templates/guided_tour/lists.html:22
+#: bookwyrm/templates/guided_tour/search.html:29
+#: bookwyrm/templates/guided_tour/search.html:56
+#: bookwyrm/templates/guided_tour/user_books.html:19
+#: bookwyrm/templates/guided_tour/user_groups.html:19
+#: bookwyrm/templates/guided_tour/user_profile.html:19
+msgid "End Tour"
+msgstr "Завершити тур"
+
+#: bookwyrm/templates/guided_tour/book.html:26
+#: bookwyrm/templates/guided_tour/book.html:50
+#: bookwyrm/templates/guided_tour/book.html:74
+#: bookwyrm/templates/guided_tour/book.html:97
+#: bookwyrm/templates/guided_tour/book.html:122
+#: bookwyrm/templates/guided_tour/book.html:146
+#: bookwyrm/templates/guided_tour/book.html:170
+#: bookwyrm/templates/guided_tour/book.html:194
+#: bookwyrm/templates/guided_tour/book.html:219
+#: bookwyrm/templates/guided_tour/book.html:243
+#: bookwyrm/templates/guided_tour/book.html:268
+#: bookwyrm/templates/guided_tour/book.html:274
+#: bookwyrm/templates/guided_tour/group.html:26
+#: bookwyrm/templates/guided_tour/group.html:49
+#: bookwyrm/templates/guided_tour/group.html:72
+#: bookwyrm/templates/guided_tour/group.html:95
+#: bookwyrm/templates/guided_tour/home.html:74
+#: bookwyrm/templates/guided_tour/home.html:97
+#: bookwyrm/templates/guided_tour/home.html:121
+#: bookwyrm/templates/guided_tour/home.html:146
+#: bookwyrm/templates/guided_tour/home.html:171
+#: bookwyrm/templates/guided_tour/home.html:195
+#: bookwyrm/templates/guided_tour/lists.html:29
+#: bookwyrm/templates/guided_tour/lists.html:53
+#: bookwyrm/templates/guided_tour/lists.html:76
+#: bookwyrm/templates/guided_tour/lists.html:100
+#: bookwyrm/templates/guided_tour/lists.html:123
+#: bookwyrm/templates/guided_tour/search.html:36
+#: bookwyrm/templates/guided_tour/search.html:63
+#: bookwyrm/templates/guided_tour/search.html:89
+#: bookwyrm/templates/guided_tour/search.html:116
+#: bookwyrm/templates/guided_tour/search.html:140
+#: bookwyrm/templates/guided_tour/user_books.html:26
+#: bookwyrm/templates/guided_tour/user_books.html:50
+#: bookwyrm/templates/guided_tour/user_books.html:73
+#: bookwyrm/templates/guided_tour/user_books.html:96
+#: bookwyrm/templates/guided_tour/user_groups.html:26
+#: bookwyrm/templates/guided_tour/user_groups.html:50
+#: bookwyrm/templates/guided_tour/user_groups.html:73
+#: bookwyrm/templates/guided_tour/user_groups.html:97
+#: bookwyrm/templates/guided_tour/user_profile.html:26
+#: bookwyrm/templates/guided_tour/user_profile.html:49
+#: bookwyrm/templates/guided_tour/user_profile.html:72
+#: bookwyrm/templates/guided_tour/user_profile.html:95
+#: bookwyrm/templates/guided_tour/user_profile.html:118
+#: bookwyrm/templates/snippets/pagination.html:30
+msgid "Next"
+msgstr "Далі"
+
+#: bookwyrm/templates/guided_tour/book.html:31
+msgid "This is where you can set a reading status for this book. You can press the button to move to the next stage, or use the drop down button to select the reading status you want to set."
+msgstr "Тут ви можете встановити статус читання для цієї книги. Ви можете натиснути кнопку, щоб перейти до наступного етапу, або скористатися випадаючим списком, щоб вибрати статус читання, який ви хочете встановити."
+
+#: bookwyrm/templates/guided_tour/book.html:32
+msgid "Reading status"
+msgstr "Статус читання"
+
+#: bookwyrm/templates/guided_tour/book.html:55
+msgid "You can also manually add reading dates here. Unlike changing the reading status using the previous method, adding dates manually will not automatically add them to your Read or Reading shelves."
+msgstr "Ви також можете додати дати читання вручну. На відміну від зміни статусу читання за допомогою попереднього методу, додавання дат вручну не додасть їх до полиць Прочитано або Читаю."
+
+#: bookwyrm/templates/guided_tour/book.html:55
+msgid "Got a favourite you re-read every year? We've got you covered - you can add multiple read dates for the same book 😀"
+msgstr "Є улюблена книга, яку ви перечитуєте щороку? Ми про це подбали - ви можете додати кілька дат читання однієї і тієї ж книги 😀"
+
+#: bookwyrm/templates/guided_tour/book.html:79
+msgid "There can be multiple editions of a book, in various formats or languages. You can choose which edition you want to use."
+msgstr "Може існувати кілька видань книги, у різних форматах або на різних мовах. Ви можете вибрати, яке видання ви хочете використовувати."
+
+#: bookwyrm/templates/guided_tour/book.html:80
+msgid "Other editions"
+msgstr "Інші видання"
+
+#: bookwyrm/templates/guided_tour/book.html:102
+msgid "You can post a review, comment, or quote here."
+msgstr "Тут ви можете залишити рецензію, коментар або цитату."
+
+#: bookwyrm/templates/guided_tour/book.html:103
+msgid "Share your thoughts"
+msgstr "Поділіться своїми думками"
+
+#: bookwyrm/templates/guided_tour/book.html:127
+msgid "If you have read this book you can post a review including an optional star rating"
+msgstr "Якщо ви прочитали цю книгу, ви можете написати рецензію та оцінити її в зірках"
+
+#: bookwyrm/templates/guided_tour/book.html:128
+msgid "Post a review"
+msgstr "Написати рецензію"
+
+#: bookwyrm/templates/guided_tour/book.html:151
+msgid "You can share your thoughts on this book generally with a simple comment"
+msgstr "Ви можете поділитися загальними думками про цю книжку за допомогою простого коментаря"
+
+#: bookwyrm/templates/guided_tour/book.html:152
+msgid "Post a comment"
+msgstr "Написати коментар"
+
+#: bookwyrm/templates/guided_tour/book.html:175
+msgid "Just read some perfect prose? Let the world know by sharing a quote!"
+msgstr "Щойно прочитали чудову книгу? Розкажіть про це всьому світу, поділившись цитатою!"
+
+#: bookwyrm/templates/guided_tour/book.html:176
+msgid "Share a quote"
+msgstr "Поділитися цитатою"
+
+#: bookwyrm/templates/guided_tour/book.html:199
+msgid "If your review or comment might ruin the book for someone who hasn't read it yet, you can hide your post behind a spoiler alert"
+msgstr "Якщо ваша рецензія або коментар може враження від книги для тих, хто її ще не читав, ви можете приховати свій пост під спойлером"
+
+#: bookwyrm/templates/guided_tour/book.html:200
+msgid "Spoiler alerts"
+msgstr "Попередження про спойлери"
+
+#: bookwyrm/templates/guided_tour/book.html:224
+msgid "Choose who can see your post here. Post privacy can be Public (everyone can see), Unlisted (everyone can see, but it doesn't appear in public feeds or discovery pages), Followers (only your followers can see), or Private (only you can see)"
+msgstr "Виберіть, хто може бачити ваш пост тут. Конфіденційність постів може бути Публічною (бачити може кожен), Не в стрічці (кожен може бачити, але пост не відображається в публічних стрічках або на сторінці \"Відкриття\"), Підписники (побачити можуть тільки ваші підписники), або Приватною (бачите тільки ви)"
+
+#: bookwyrm/templates/guided_tour/book.html:225
+#: bookwyrm/templates/snippets/privacy_select.html:6
+#: bookwyrm/templates/snippets/privacy_select_no_followers.html:6
+msgid "Post privacy"
+msgstr "Видимість постів"
+
+#: bookwyrm/templates/guided_tour/book.html:248
+msgid "Some ebooks can be downloaded for free from external sources. They will be shown here."
+msgstr "Деякі електронні книги можна завантажити безкоштовно з зовнішніх джерел. Вони будуть відображені тут."
+
+#: bookwyrm/templates/guided_tour/book.html:249
+msgid "Download links"
+msgstr "Посилання для завантаження"
+
+#: bookwyrm/templates/guided_tour/book.html:273
+msgid "Continue the tour by selecting Your books from the drop down menu."
+msgstr "Щоб продовжити тур, оберіть Ваші книги у випадаючому меню."
+
+#: bookwyrm/templates/guided_tour/book.html:296
+#: bookwyrm/templates/guided_tour/home.html:50
+#: bookwyrm/templates/guided_tour/home.html:218
+#: bookwyrm/templates/guided_tour/search.html:161
+#: bookwyrm/templates/guided_tour/user_books.html:124
+#: bookwyrm/templates/guided_tour/user_groups.html:116
+#: bookwyrm/templates/guided_tour/user_profile.html:141
+msgid "Ok"
+msgstr "Ок"
+
+#: bookwyrm/templates/guided_tour/group.html:10
+msgid "Welcome to the page for your group! This is where you can add and remove users, create user-curated lists, and edit the group details."
+msgstr "Ласкаво просимо на сторінку вашої групи! Тут ви можете додавати та видаляти користувачів, створювати користувацькі списки та редагувати інформацію про групу."
+
+#: bookwyrm/templates/guided_tour/group.html:11
+msgid "Your group"
+msgstr "Ваша група"
+
+#: bookwyrm/templates/guided_tour/group.html:31
+msgid "Use this search box to find users to join your group. Currently users must be members of the same Bookwyrm instance and be invited by the group owner."
+msgstr "Використовуйте це поле пошуку, щоб шукати користувачів, які можуть приєднатися до вашої групи. Наразі користувачі повинні бути учасниками одного інстансу Bookwyrm і бути запрошеними власником групи."
+
+#: bookwyrm/templates/guided_tour/group.html:32
+msgid "Find users"
+msgstr "Пошук користувачів"
+
+#: bookwyrm/templates/guided_tour/group.html:54
+msgid "Your group members will appear here. The group owner is marked with a star symbol."
+msgstr "Тут з'являться учасники вашої групи. Власник групи позначений символом зірочки."
+
+#: bookwyrm/templates/guided_tour/group.html:55
+msgid "Group members"
+msgstr "Учасники групи"
+
+#: bookwyrm/templates/guided_tour/group.html:77
+msgid "As well as creating lists from the Lists page, you can create a group-curated list here on the group's homepage. Any member of the group can create a list curated by group members."
+msgstr "Окрім створення списків зі сторінки \"Списки\", ви можете створити список, що буде куруватися групою, на головній сторінці групи. Кожен учасник групи може створити список, який буде куруватися іншими учасниками групи."
+
+#: bookwyrm/templates/guided_tour/group.html:78
+msgid "Group lists"
+msgstr "Списки груп"
+
+#: bookwyrm/templates/guided_tour/group.html:100
+msgid "Congratulations, you've finished the tour! Now you know the basics, but there is lots more to explore on your own. Happy reading!"
+msgstr "Вітаємо, ви закінчили тур! Тепер ви знаєте основи, але самостійне дослідження Bookwyrm набагато цікавіше. Приємного читання!"
+
+#: bookwyrm/templates/guided_tour/group.html:115
+msgid "End tour"
+msgstr "Завершити тур"
+
+#: bookwyrm/templates/guided_tour/home.html:16
+msgid "Welcome to Bookwyrm!%(remote_domain)s
does not support identity discovery"
+msgstr ""
+
+#: bookwyrm/templates/ostatus/error.html:17
+#, python-format
+msgid "%(account)s was found but %(remote_domain)s
does not support 'remote follow'"
+msgstr ""
+
+#: bookwyrm/templates/ostatus/error.html:18
+#, python-format
+msgid "Try searching for %(user)s on %(remote_domain)s
instead"
+msgstr ""
+
+#: bookwyrm/templates/ostatus/error.html:46
+#, python-format
+msgid "Something went wrong trying to follow %(account)s"
+msgstr ""
+
+#: bookwyrm/templates/ostatus/error.html:47
+msgid "Check you have the correct username before trying again."
+msgstr ""
+
+#: bookwyrm/templates/ostatus/error.html:51
+#, python-format
+msgid "You have blocked %(account)s"
+msgstr ""
+
+#: bookwyrm/templates/ostatus/error.html:55
+#, python-format
+msgid "%(account)s has blocked you"
+msgstr ""
+
+#: bookwyrm/templates/ostatus/error.html:59
+#, python-format
+msgid "You are already following %(account)s"
+msgstr ""
+
+#: bookwyrm/templates/ostatus/error.html:63
+#, python-format
+msgid "You have already requested to follow %(account)s"
+msgstr ""
+
+#: bookwyrm/templates/ostatus/remote_follow.html:6
+#, python-format
+msgid "Follow %(username)s on the fediverse"
+msgstr ""
+
+#: bookwyrm/templates/ostatus/remote_follow.html:33
+#, python-format
+msgid "Follow %(username)s from another Fediverse account like BookWyrm, Mastodon, or Pleroma."
+msgstr ""
+
+#: bookwyrm/templates/ostatus/remote_follow.html:40
+msgid "User handle to follow from:"
+msgstr ""
+
+#: bookwyrm/templates/ostatus/remote_follow.html:42
+msgid "Follow!"
+msgstr ""
+
+#: bookwyrm/templates/ostatus/remote_follow_button.html:15
+msgid "Follow on Fediverse"
+msgstr ""
+
+#: bookwyrm/templates/ostatus/remote_follow_button.html:19
+msgid "This link opens in a pop-up window"
+msgstr ""
+
+#: bookwyrm/templates/ostatus/subscribe.html:8
+#, python-format
+msgid "Log in to %(sitename)s"
+msgstr ""
+
+#: bookwyrm/templates/ostatus/subscribe.html:10
+#, python-format
+msgid "Error following from %(sitename)s"
+msgstr ""
+
+#: bookwyrm/templates/ostatus/subscribe.html:12
+#: bookwyrm/templates/ostatus/subscribe.html:22
+#, python-format
+msgid "Follow from %(sitename)s"
+msgstr ""
+
+#: bookwyrm/templates/ostatus/subscribe.html:18
+msgid "Uh oh..."
+msgstr "От халепа..."
+
+#: bookwyrm/templates/ostatus/subscribe.html:20
+msgid "Let's log in first..."
+msgstr ""
+
+#: bookwyrm/templates/ostatus/subscribe.html:51
+#, python-format
+msgid "Follow %(username)s"
+msgstr ""
+
+#: bookwyrm/templates/ostatus/success.html:28
+#, python-format
+msgid "You are now following %(display_name)s!"
+msgstr ""
+
+#: bookwyrm/templates/preferences/2fa.html:4
+#: bookwyrm/templates/preferences/2fa.html:7
+#: bookwyrm/templates/preferences/layout.html:24
+msgid "Two Factor Authentication"
+msgstr ""
+
+#: bookwyrm/templates/preferences/2fa.html:16
+msgid "Successfully updated 2FA settings"
+msgstr ""
+
+#: bookwyrm/templates/preferences/2fa.html:24
+msgid "Write down or copy and paste these codes somewhere safe."
+msgstr ""
+
+#: bookwyrm/templates/preferences/2fa.html:25
+msgid "You must use them in order, and they will not be displayed again."
+msgstr ""
+
+#: bookwyrm/templates/preferences/2fa.html:35
+msgid "Two Factor Authentication is active on your account."
+msgstr ""
+
+#: bookwyrm/templates/preferences/2fa.html:36
+#: bookwyrm/templates/preferences/disable-2fa.html:4
+#: bookwyrm/templates/preferences/disable-2fa.html:7
+msgid "Disable 2FA"
+msgstr ""
+
+#: bookwyrm/templates/preferences/2fa.html:39
+msgid "You can generate backup codes to use in case you do not have access to your authentication app. If you generate new codes, any backup codes previously generated will no longer work."
+msgstr ""
+
+#: bookwyrm/templates/preferences/2fa.html:40
+msgid "Generate backup codes"
+msgstr ""
+
+#: bookwyrm/templates/preferences/2fa.html:45
+msgid "Scan the QR code with your authentication app and then enter the code from your app below to confirm your app is set up."
+msgstr ""
+
+#: bookwyrm/templates/preferences/2fa.html:52
+msgid "Use setup key"
+msgstr ""
+
+#: bookwyrm/templates/preferences/2fa.html:58
+msgid "Account name:"
+msgstr ""
+
+#: bookwyrm/templates/preferences/2fa.html:65
+msgid "Code:"
+msgstr ""
+
+#: bookwyrm/templates/preferences/2fa.html:73
+msgid "Enter the code from your app:"
+msgstr ""
+
+#: bookwyrm/templates/preferences/2fa.html:83
+msgid "You can make your account more secure by using Two Factor Authentication (2FA). This will require you to enter a one-time code using a phone app like Authy, Google Authenticator or Microsoft Authenticator each time you log in."
+msgstr ""
+
+#: bookwyrm/templates/preferences/2fa.html:85
+msgid "Confirm your password to begin setting up 2FA."
+msgstr ""
+
+#: bookwyrm/templates/preferences/2fa.html:95
+#: bookwyrm/templates/two_factor_auth/two_factor_prompt.html:37
+msgid "Set up 2FA"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:4
+#: bookwyrm/templates/preferences/move_user.html:4
+#: bookwyrm/templates/preferences/move_user.html:7
+#: bookwyrm/templates/preferences/move_user.html:39
+msgid "Move Account"
+msgstr "Перемістити обліковий запис"
+
+#: bookwyrm/templates/preferences/alias_user.html:7
+#: bookwyrm/templates/preferences/alias_user.html:34
+msgid "Create Alias"
+msgstr "Створити псевдонім"
+
+#: bookwyrm/templates/preferences/alias_user.html:12
+msgid "Add another account as an alias"
+msgstr "Додайте інший обліковий запис як псевдонім"
+
+#: bookwyrm/templates/preferences/alias_user.html:16
+msgid "Marking another account as an alias is required if you want to move that account to this one."
+msgstr "Позначення іншого облікового запису як псевдоніма потрібно, якщо ви хочете перемістити той обліковий запис до цього."
+
+#: bookwyrm/templates/preferences/alias_user.html:19
+msgid "This is a reversable action and will not change the functionality of this account."
+msgstr "Це дія, яку можна повернути, тому вона не змінить функціональність цього облікового запису."
+
+#: bookwyrm/templates/preferences/alias_user.html:25
+msgid "Enter the username for the account you want to add as an alias e.g. user@example.com :"
+msgstr "Введіть ім’я користувача для облікового запису, який ви хочете додати як псевдонім, наприклад user@example.com :"
+
+#: bookwyrm/templates/preferences/alias_user.html:30
+#: bookwyrm/templates/preferences/move_user.html:35
+msgid "Confirm your password:"
+msgstr "Підтвердити ваш пароль:"
+
+#: bookwyrm/templates/preferences/alias_user.html:39
+#: bookwyrm/templates/preferences/layout.html:28
+msgid "Aliases"
+msgstr "Псевдоніми"
+
+#: bookwyrm/templates/preferences/alias_user.html:49
+msgid "Remove alias"
+msgstr "Видалити псевдонім"
+
+#: bookwyrm/templates/preferences/blocks.html:4
+#: bookwyrm/templates/preferences/blocks.html:7
+#: bookwyrm/templates/preferences/layout.html:54
+msgid "Blocked Users"
+msgstr ""
+
+#: bookwyrm/templates/preferences/blocks.html:12
+msgid "No users currently blocked."
+msgstr ""
+
+#: bookwyrm/templates/preferences/change_password.html:4
+#: bookwyrm/templates/preferences/change_password.html:7
+#: bookwyrm/templates/preferences/change_password.html:37
+#: bookwyrm/templates/preferences/layout.html:20
+msgid "Change Password"
+msgstr ""
+
+#: bookwyrm/templates/preferences/change_password.html:15
+msgid "Successfully changed password"
+msgstr ""
+
+#: bookwyrm/templates/preferences/change_password.html:22
+msgid "Current password:"
+msgstr ""
+
+#: bookwyrm/templates/preferences/change_password.html:28
+msgid "New password:"
+msgstr ""
+
+#: bookwyrm/templates/preferences/delete_user.html:4
+#: bookwyrm/templates/preferences/delete_user.html:7
+#: bookwyrm/templates/preferences/delete_user.html:40
+#: bookwyrm/templates/preferences/layout.html:36
+#: bookwyrm/templates/settings/users/delete_user_form.html:22
+msgid "Delete Account"
+msgstr ""
+
+#: bookwyrm/templates/preferences/delete_user.html:12
+msgid "Deactivate account"
+msgstr ""
+
+#: bookwyrm/templates/preferences/delete_user.html:15
+msgid "Your account will be hidden. You can log back in at any time to re-activate your account."
+msgstr ""
+
+#: bookwyrm/templates/preferences/delete_user.html:20
+msgid "Deactivate Account"
+msgstr ""
+
+#: bookwyrm/templates/preferences/delete_user.html:26
+msgid "Permanently delete account"
+msgstr ""
+
+#: bookwyrm/templates/preferences/delete_user.html:29
+msgid "Deleting your account cannot be undone. The username will not be available to register in the future."
+msgstr ""
+
+#: bookwyrm/templates/preferences/disable-2fa.html:12
+msgid "Disable Two Factor Authentication"
+msgstr ""
+
+#: bookwyrm/templates/preferences/disable-2fa.html:14
+msgid "Disabling 2FA will allow anyone with your username and password to log in to your account."
+msgstr ""
+
+#: bookwyrm/templates/preferences/disable-2fa.html:20
+msgid "Turn off 2FA"
+msgstr ""
+
+#: bookwyrm/templates/preferences/edit_user.html:4
+#: bookwyrm/templates/preferences/edit_user.html:7
+#: bookwyrm/templates/preferences/layout.html:15
+msgid "Edit Profile"
+msgstr "Редагувати Профіль"
+
+#: bookwyrm/templates/preferences/edit_user.html:12
+#: bookwyrm/templates/preferences/edit_user.html:25
+#: bookwyrm/templates/settings/users/user_info.html:8
+#: bookwyrm/templates/user_menu.html:29
+msgid "Profile"
+msgstr "Профіль"
+
+#: bookwyrm/templates/preferences/edit_user.html:13
+#: bookwyrm/templates/preferences/edit_user.html:64
+#: bookwyrm/templates/settings/site.html:11
+#: bookwyrm/templates/settings/site.html:89
+#: bookwyrm/templates/setup/config.html:91
+msgid "Display"
+msgstr ""
+
+#: bookwyrm/templates/preferences/edit_user.html:14
+#: bookwyrm/templates/preferences/edit_user.html:112
+msgid "Privacy"
+msgstr ""
+
+#: bookwyrm/templates/preferences/edit_user.html:69
+msgid "Show reading goal prompt in feed"
+msgstr ""
+
+#: bookwyrm/templates/preferences/edit_user.html:75
+msgid "Show suggested users"
+msgstr ""
+
+#: bookwyrm/templates/preferences/edit_user.html:81
+msgid "Show this account in suggested users"
+msgstr ""
+
+#: 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 ""
+
+#: bookwyrm/templates/preferences/edit_user.html:89
+msgid "Preferred Timezone: "
+msgstr ""
+
+#: bookwyrm/templates/preferences/edit_user.html:101
+msgid "Theme:"
+msgstr ""
+
+#: bookwyrm/templates/preferences/edit_user.html:117
+msgid "Manually approve followers"
+msgstr ""
+
+#: bookwyrm/templates/preferences/edit_user.html:123
+msgid "Hide followers and following on profile"
+msgstr "Приховати підписників і підписки в профілі"
+
+#: bookwyrm/templates/preferences/edit_user.html:128
+msgid "Default post privacy:"
+msgstr ""
+
+#: bookwyrm/templates/preferences/edit_user.html:136
+#, python-format
+msgid "Looking for shelf privacy? You can set a separate visibility level for each of your shelves. Go to Your Books, pick a shelf from the tab bar, and click \"Edit shelf.\""
+msgstr ""
+
+#: bookwyrm/templates/preferences/export.html:4
+#: bookwyrm/templates/preferences/export.html:7
+msgid "CSV Export"
+msgstr "Експорт CSV"
+
+#: bookwyrm/templates/preferences/export.html:13
+msgid "Your export will include all the books on your shelves, books you have reviewed, and books with reading activity."
+msgstr ""
+
+#: bookwyrm/templates/preferences/export.html:20
+msgid "Download file"
+msgstr ""
+
+#: bookwyrm/templates/preferences/layout.html:11
+msgid "Account"
+msgstr ""
+
+#: bookwyrm/templates/preferences/layout.html:32
+msgid "Move Account"
+msgstr ""
+
+#: bookwyrm/templates/preferences/layout.html:39
+msgid "Data"
+msgstr ""
+
+#: bookwyrm/templates/preferences/layout.html:47
+msgid "CSV export"
+msgstr ""
+
+#: bookwyrm/templates/preferences/layout.html:50
+msgid "Relationships"
+msgstr ""
+
+#: bookwyrm/templates/preferences/move_user.html:12
+msgid "Migrate account to another server"
+msgstr ""
+
+#: bookwyrm/templates/preferences/move_user.html:16
+msgid "Moving your account will notify all your followers and direct them to follow the new account."
+msgstr ""
+
+#: bookwyrm/templates/preferences/move_user.html:19
+#, python-format
+msgid "\n"
+" %(user)s will be marked as moved and will not be discoverable or usable unless you undo the move.\n"
+" "
+msgstr ""
+
+#: bookwyrm/templates/preferences/move_user.html:25
+msgid "Remember to add this user as an alias of the target account before you try to move."
+msgstr ""
+
+#: bookwyrm/templates/preferences/move_user.html:30
+msgid "Enter the username for the account you want to move to e.g. user@example.com :"
+msgstr ""
+
+#: bookwyrm/templates/reading_progress/finish.html:5
+#, python-format
+msgid "Finish \"%(book_title)s\""
+msgstr "Завершити Читати \"%(book_title)s\""
+
+#: bookwyrm/templates/reading_progress/start.html:5
+#, python-format
+msgid "Start \"%(book_title)s\""
+msgstr "Почати Читати \"%(book_title)s\""
+
+#: bookwyrm/templates/reading_progress/stop.html:5
+#, python-format
+msgid "Stop Reading \"%(book_title)s\""
+msgstr "Припинити Читати \"%(book_title)s\""
+
+#: bookwyrm/templates/reading_progress/want.html:5
+#, python-format
+msgid "Want to Read \"%(book_title)s\""
+msgstr "Хочу Прочитати \"%(book_title)s\""
+
+#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:4
+msgid "Delete these read dates?"
+msgstr "Видалити ці дати читання?"
+
+#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:8
+#, python-format
+msgid "You are deleting this readthrough and its %(count)s associated progress updates."
+msgstr ""
+
+#: bookwyrm/templates/readthrough/readthrough.html:6
+#: bookwyrm/templates/readthrough/readthrough_modal.html:8
+#, python-format
+msgid "Update read dates for \"%(title)s\""
+msgstr ""
+
+#: bookwyrm/templates/readthrough/readthrough_form.html:10
+#: bookwyrm/templates/readthrough/readthrough_modal.html:38
+#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:24
+#: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:21
+#: bookwyrm/templates/snippets/reading_modals/stop_reading_modal.html:24
+msgid "Started reading"
+msgstr ""
+
+#: bookwyrm/templates/readthrough/readthrough_form.html:18
+#: bookwyrm/templates/readthrough/readthrough_modal.html:56
+msgid "Progress"
+msgstr ""
+
+#: bookwyrm/templates/readthrough/readthrough_form.html:25
+#: bookwyrm/templates/readthrough/readthrough_modal.html:63
+#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:32
+msgid "Finished reading"
+msgstr ""
+
+#: bookwyrm/templates/readthrough/readthrough_list.html:9
+msgid "Progress Updates:"
+msgstr ""
+
+#: bookwyrm/templates/readthrough/readthrough_list.html:14
+msgid "finished"
+msgstr ""
+
+#: bookwyrm/templates/readthrough/readthrough_list.html:16
+msgid "stopped"
+msgstr ""
+
+#: bookwyrm/templates/readthrough/readthrough_list.html:27
+msgid "Show all updates"
+msgstr ""
+
+#: bookwyrm/templates/readthrough/readthrough_list.html:43
+msgid "Delete this progress update"
+msgstr ""
+
+#: bookwyrm/templates/readthrough/readthrough_list.html:55
+msgid "started"
+msgstr ""
+
+#: bookwyrm/templates/readthrough/readthrough_list.html:62
+msgid "Edit read dates"
+msgstr ""
+
+#: bookwyrm/templates/readthrough/readthrough_list.html:70
+msgid "Delete these read dates"
+msgstr ""
+
+#: bookwyrm/templates/readthrough/readthrough_modal.html:12
+#, python-format
+msgid "Add read dates for \"%(title)s\""
+msgstr ""
+
+#: bookwyrm/templates/report.html:5
+#: bookwyrm/templates/snippets/report_button.html:13
+msgid "Report"
+msgstr ""
+
+#: bookwyrm/templates/search/barcode_modal.html:5
+msgid "\n"
+" Scan Barcode\n"
+" "
+msgstr "\n"
+" Сканувати Штрих-код\n"
+" "
+
+#: bookwyrm/templates/search/barcode_modal.html:21
+msgid "Requesting camera..."
+msgstr "Запитуємо камеру..."
+
+#: bookwyrm/templates/search/barcode_modal.html:22
+msgid "Grant access to the camera to scan a book's barcode."
+msgstr ""
+
+#: bookwyrm/templates/search/barcode_modal.html:27
+msgid "Could not access camera"
+msgstr ""
+
+#: bookwyrm/templates/search/barcode_modal.html:31
+msgctxt "barcode scanner"
+msgid "Scanning..."
+msgstr "Сканування..."
+
+#: bookwyrm/templates/search/barcode_modal.html:32
+msgid "Align your book's barcode with the camera."
+msgstr ""
+
+#: bookwyrm/templates/search/barcode_modal.html:36
+msgctxt "barcode scanner"
+msgid "ISBN scanned"
+msgstr "ISBN відскановано"
+
+#: bookwyrm/templates/search/barcode_modal.html:37
+msgctxt "followed by ISBN"
+msgid "Searching for book:"
+msgstr ""
+
+#: bookwyrm/templates/search/book.html:25
+#, python-format
+msgid "%(formatted_review_count)s review"
+msgid_plural "%(formatted_review_count)s reviews"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+#: bookwyrm/templates/search/book.html:34
+#, python-format
+msgid "(published %(pub_year)s)"
+msgstr ""
+
+#: bookwyrm/templates/search/book.html:50
+msgid "Results from"
+msgstr ""
+
+#: bookwyrm/templates/search/book.html:89
+msgid "Import book"
+msgstr ""
+
+#: bookwyrm/templates/search/book.html:113
+msgid "Load results from other catalogues"
+msgstr ""
+
+#: bookwyrm/templates/search/book.html:117
+msgid "Manually add book"
+msgstr "Додати книгу вручну"
+
+#: bookwyrm/templates/search/book.html:122
+msgid "Log in to import or add books."
+msgstr ""
+
+#: bookwyrm/templates/search/layout.html:17
+msgid "Search query"
+msgstr ""
+
+#: bookwyrm/templates/search/layout.html:20
+msgid "Search type"
+msgstr ""
+
+#: bookwyrm/templates/search/layout.html:24
+#: bookwyrm/templates/search/layout.html:47
+#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:27
+#: bookwyrm/templates/settings/federation/instance_list.html:52
+#: bookwyrm/templates/settings/layout.html:36
+#: bookwyrm/templates/settings/users/user.html:13
+#: bookwyrm/templates/settings/users/user_admin.html:5
+#: bookwyrm/templates/settings/users/user_admin.html:12
+msgid "Users"
+msgstr ""
+
+#: bookwyrm/templates/search/layout.html:59
+#, python-format
+msgid "No results found for \"%(query)s\""
+msgstr ""
+
+#: bookwyrm/templates/search/layout.html:61
+#, python-format
+msgid "%(result_count)s result found"
+msgid_plural "%(result_count)s results found"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+#: bookwyrm/templates/settings/announcements/announcement.html:5
+#: bookwyrm/templates/settings/announcements/announcement.html:8
+msgid "Announcement"
+msgstr ""
+
+#: bookwyrm/templates/settings/announcements/announcement.html:16
+#: bookwyrm/templates/settings/federation/instance.html:93
+#: bookwyrm/templates/snippets/status/status_options.html:25
+msgid "Edit"
+msgstr "Редагувати"
+
+#: bookwyrm/templates/settings/announcements/announcement.html:32
+#: bookwyrm/templates/settings/announcements/announcements.html:3
+#: bookwyrm/templates/settings/announcements/announcements.html:5
+#: bookwyrm/templates/settings/announcements/edit_announcement.html:15
+#: bookwyrm/templates/settings/layout.html:99
+msgid "Announcements"
+msgstr ""
+
+#: bookwyrm/templates/settings/announcements/announcement.html:45
+msgid "Visible:"
+msgstr ""
+
+#: bookwyrm/templates/settings/announcements/announcement.html:49
+msgid "True"
+msgstr ""
+
+#: bookwyrm/templates/settings/announcements/announcement.html:51
+msgid "False"
+msgstr ""
+
+#: bookwyrm/templates/settings/announcements/announcement.html:57
+#: bookwyrm/templates/settings/announcements/edit_announcement.html:79
+#: bookwyrm/templates/settings/dashboard/dashboard.html:80
+msgid "Start date:"
+msgstr ""
+
+#: bookwyrm/templates/settings/announcements/announcement.html:62
+#: bookwyrm/templates/settings/announcements/edit_announcement.html:89
+#: bookwyrm/templates/settings/dashboard/dashboard.html:86
+msgid "End date:"
+msgstr ""
+
+#: bookwyrm/templates/settings/announcements/announcement.html:66
+#: bookwyrm/templates/settings/announcements/edit_announcement.html:109
+msgid "Active:"
+msgstr ""
+
+#: bookwyrm/templates/settings/announcements/announcements.html:9
+#: bookwyrm/templates/settings/announcements/edit_announcement.html:8
+msgid "Create Announcement"
+msgstr ""
+
+#: bookwyrm/templates/settings/announcements/announcements.html:21
+#: bookwyrm/templates/settings/federation/instance_list.html:40
+msgid "Date added"
+msgstr ""
+
+#: bookwyrm/templates/settings/announcements/announcements.html:25
+msgid "Preview"
+msgstr ""
+
+#: bookwyrm/templates/settings/announcements/announcements.html:29
+msgid "Start date"
+msgstr ""
+
+#: bookwyrm/templates/settings/announcements/announcements.html:33
+msgid "End date"
+msgstr ""
+
+#: bookwyrm/templates/settings/announcements/announcements.html:50
+msgid "active"
+msgstr ""
+
+#: bookwyrm/templates/settings/announcements/announcements.html:50
+msgid "inactive"
+msgstr ""
+
+#: bookwyrm/templates/settings/announcements/announcements.html:63
+msgid "No announcements found"
+msgstr ""
+
+#: bookwyrm/templates/settings/announcements/edit_announcement.html:6
+msgid "Edit Announcement"
+msgstr ""
+
+#: bookwyrm/templates/settings/announcements/edit_announcement.html:45
+msgid "Announcement content"
+msgstr ""
+
+#: bookwyrm/templates/settings/announcements/edit_announcement.html:57
+msgid "Details:"
+msgstr ""
+
+#: bookwyrm/templates/settings/announcements/edit_announcement.html:65
+msgid "Event date:"
+msgstr ""
+
+#: bookwyrm/templates/settings/announcements/edit_announcement.html:73
+msgid "Display settings"
+msgstr ""
+
+#: bookwyrm/templates/settings/announcements/edit_announcement.html:98
+msgid "Color:"
+msgstr "Колір:"
+
+#: bookwyrm/templates/settings/automod/rules.html:7
+#: bookwyrm/templates/settings/automod/rules.html:11
+#: bookwyrm/templates/settings/layout.html:61
+msgid "Auto-moderation rules"
+msgstr ""
+
+#: bookwyrm/templates/settings/automod/rules.html:18
+msgid "Auto-moderation rules will create reports for any local user or status with fields matching the provided string."
+msgstr ""
+
+#: bookwyrm/templates/settings/automod/rules.html:19
+msgid "Users or statuses that have already been reported (regardless of whether the report was resolved) will not be flagged."
+msgstr ""
+
+#: bookwyrm/templates/settings/automod/rules.html:26
+msgid "Schedule:"
+msgstr ""
+
+#: bookwyrm/templates/settings/automod/rules.html:33
+msgid "Last run:"
+msgstr ""
+
+#: bookwyrm/templates/settings/automod/rules.html:40
+msgid "Total run count:"
+msgstr ""
+
+#: bookwyrm/templates/settings/automod/rules.html:47
+msgid "Enabled:"
+msgstr "Увімкнено:"
+
+#: bookwyrm/templates/settings/automod/rules.html:59
+msgid "Delete schedule"
+msgstr ""
+
+#: bookwyrm/templates/settings/automod/rules.html:63
+msgid "Run now"
+msgstr ""
+
+#: bookwyrm/templates/settings/automod/rules.html:64
+msgid "Last run date will not be updated"
+msgstr ""
+
+#: bookwyrm/templates/settings/automod/rules.html:69
+#: bookwyrm/templates/settings/automod/rules.html:92
+msgid "Schedule scan"
+msgstr ""
+
+#: bookwyrm/templates/settings/automod/rules.html:101
+msgid "Successfully added rule"
+msgstr ""
+
+#: bookwyrm/templates/settings/automod/rules.html:107
+msgid "Add Rule"
+msgstr ""
+
+#: bookwyrm/templates/settings/automod/rules.html:116
+#: bookwyrm/templates/settings/automod/rules.html:160
+msgid "String match"
+msgstr ""
+
+#: bookwyrm/templates/settings/automod/rules.html:126
+#: bookwyrm/templates/settings/automod/rules.html:163
+msgid "Flag users"
+msgstr ""
+
+#: bookwyrm/templates/settings/automod/rules.html:133
+#: bookwyrm/templates/settings/automod/rules.html:166
+msgid "Flag statuses"
+msgstr ""
+
+#: bookwyrm/templates/settings/automod/rules.html:140
+msgid "Add rule"
+msgstr "Додати правило"
+
+#: bookwyrm/templates/settings/automod/rules.html:147
+msgid "Current Rules"
+msgstr "Поточні Правила"
+
+#: bookwyrm/templates/settings/automod/rules.html:151
+msgid "Show rules"
+msgstr "Показати правила"
+
+#: bookwyrm/templates/settings/automod/rules.html:188
+msgid "Remove rule"
+msgstr "Видалити правило"
+
+#: bookwyrm/templates/settings/celery.html:6
+#: bookwyrm/templates/settings/celery.html:8
+msgid "Celery Status"
+msgstr "Стан Celery"
+
+#: bookwyrm/templates/settings/celery.html:14
+msgid "You can set up monitoring to check if Celery is running by querying:"
+msgstr "Ви можете налаштувати моніторинг стану Celery використав цей URL:"
+
+#: bookwyrm/templates/settings/celery.html:22
+msgid "Queues"
+msgstr "Черги"
+
+#: bookwyrm/templates/settings/celery.html:26
+msgid "Streams"
+msgstr "Стріми"
+
+#: bookwyrm/templates/settings/celery.html:32
+msgid "Broadcast"
+msgstr "Широкомовлення"
+
+#: bookwyrm/templates/settings/celery.html:38
+msgid "Inbox"
+msgstr "Вхідні"
+
+#: bookwyrm/templates/settings/celery.html:51
+msgid "Import triggered"
+msgstr "Розпочаті імпорти"
+
+#: bookwyrm/templates/settings/celery.html:57
+msgid "Connectors"
+msgstr "Конектори"
+
+#: bookwyrm/templates/settings/celery.html:64
+#: bookwyrm/templates/settings/site.html:91
+msgid "Images"
+msgstr "Зображення"
+
+#: bookwyrm/templates/settings/celery.html:70
+msgid "Suggested Users"
+msgstr "Рекомендовані Користувачі"
+
+#: bookwyrm/templates/settings/celery.html:83
+#: bookwyrm/templates/settings/invites/manage_invite_requests.html:43
+#: bookwyrm/templates/settings/users/email_filter.html:5
+msgid "Email"
+msgstr "Пошта"
+
+#: bookwyrm/templates/settings/celery.html:89
+msgid "Misc"
+msgstr "Різне"
+
+#: bookwyrm/templates/settings/celery.html:96
+msgid "Low priority"
+msgstr "Низький пріоритет"
+
+#: bookwyrm/templates/settings/celery.html:102
+msgid "Medium priority"
+msgstr "Середній пріоритет"
+
+#: bookwyrm/templates/settings/celery.html:108
+msgid "High priority"
+msgstr "Високий пріоритет"
+
+#: bookwyrm/templates/settings/celery.html:118
+msgid "Could not connect to Redis broker"
+msgstr "Не вдалося підключитися до Redis"
+
+#: bookwyrm/templates/settings/celery.html:126
+msgid "Active Tasks"
+msgstr "Активні завдання"
+
+#: bookwyrm/templates/settings/celery.html:131
+#: bookwyrm/templates/settings/imports/imports.html:113
+msgid "ID"
+msgstr "ID"
+
+#: bookwyrm/templates/settings/celery.html:132
+msgid "Task name"
+msgstr "Назва завдання"
+
+#: bookwyrm/templates/settings/celery.html:133
+msgid "Run time"
+msgstr "Час виконання"
+
+#: bookwyrm/templates/settings/celery.html:134
+msgid "Priority"
+msgstr "Пріоритет"
+
+#: bookwyrm/templates/settings/celery.html:139
+msgid "No active tasks"
+msgstr "Немає активних завдань"
+
+#: bookwyrm/templates/settings/celery.html:157
+msgid "Workers"
+msgstr "Воркери"
+
+#: bookwyrm/templates/settings/celery.html:162
+msgid "Uptime:"
+msgstr "Працює безперебійно:"
+
+#: bookwyrm/templates/settings/celery.html:172
+msgid "Could not connect to Celery"
+msgstr "Не вдалося підключитися до Сelery"
+
+#: bookwyrm/templates/settings/celery.html:178
+#: bookwyrm/templates/settings/celery.html:201
+msgid "Clear Queues"
+msgstr "Очистити Черги"
+
+#: bookwyrm/templates/settings/celery.html:182
+msgid "Clearing queues can cause serious problems including data loss! Only play with this if you really know what you're doing. You must shut down the Celery worker before you do this."
+msgstr "Очищення черг може спричинити серйозні проблеми, включаючи втрату даних! Ця опція для тих, хто дійсно знає що робить. Перш ніж очистити черги, ви мусите зупинити Celery."
+
+#: bookwyrm/templates/settings/celery.html:208
+msgid "Errors"
+msgstr "Помилки"
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:6
+#: bookwyrm/templates/settings/dashboard/dashboard.html:8
+#: bookwyrm/templates/settings/layout.html:28
+msgid "Dashboard"
+msgstr "Панель керування"
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:15
+#: bookwyrm/templates/settings/dashboard/dashboard.html:109
+msgid "Total users"
+msgstr "Всього користувачів"
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:21
+#: bookwyrm/templates/settings/dashboard/user_chart.html:16
+msgid "Active this month"
+msgstr "Активних у цьому місяці"
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:27
+msgid "Statuses"
+msgstr "Статусів"
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:33
+#: bookwyrm/templates/settings/dashboard/works_chart.html:11
+msgid "Works"
+msgstr "Творів"
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:74
+msgid "Instance Activity"
+msgstr "Активність Інстансу"
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:92
+msgid "Interval:"
+msgstr "Інтервал:"
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:96
+msgid "Days"
+msgstr "Дні"
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:97
+msgid "Weeks"
+msgstr "Тижні"
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:115
+msgid "User signup activity"
+msgstr "Активність по реєстраціях"
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:121
+msgid "Status activity"
+msgstr "Активність по статусах"
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:127
+msgid "Works created"
+msgstr "Творів створено"
+
+#: bookwyrm/templates/settings/dashboard/registration_chart.html:10
+msgid "Registrations"
+msgstr "Реєстрації"
+
+#: bookwyrm/templates/settings/dashboard/status_chart.html:11
+msgid "Statuses posted"
+msgstr "Опубліковані статуси"
+
+#: bookwyrm/templates/settings/dashboard/user_chart.html:11
+msgid "Total"
+msgstr "Загалом"
+
+#: bookwyrm/templates/settings/dashboard/warnings/domain_review.html:9
+#, python-format
+msgid "%(display_count)s domain needs review"
+msgid_plural "%(display_count)s domains need review"
+msgstr[0] "%(display_count)s домен потребує перевірки"
+msgstr[1] "%(display_count)s домена потребують перевірки"
+msgstr[2] "%(display_count)s доменів потребують перевірки"
+msgstr[3] "%(display_count)s доменів потребують перевірки"
+
+#: bookwyrm/templates/settings/dashboard/warnings/email_config.html:8
+#, python-format
+msgid "Your outgoing email address, %(email_sender)s
, may be misconfigured."
+msgstr "Ваша вихідна електронна адреса, %(email_sender)s
, може бути невірною."
+
+#: bookwyrm/templates/settings/dashboard/warnings/email_config.html:11
+msgid "Check the EMAIL_SENDER_NAME
and EMAIL_SENDER_DOMAIN
in your .env
file."
+msgstr "Перевірте EMAIL_SENDER_NAME
та EMAIL_SENDER_DOMAIN
у вашому .env
файлі."
+
+#: bookwyrm/templates/settings/dashboard/warnings/invites.html:9
+#, python-format
+msgid "%(display_count)s invite request"
+msgid_plural "%(display_count)s invite requests"
+msgstr[0] "%(display_count)s запит на запрошення"
+msgstr[1] "%(display_count)s запита на запрошення"
+msgstr[2] "%(display_count)s запитів на запрошення"
+msgstr[3] "%(display_count)s запитів на запрошення"
+
+#: bookwyrm/templates/settings/dashboard/warnings/missing_conduct.html:8
+msgid "Your instance is missing a code of conduct."
+msgstr "Вашому інстансу бракує кодексу поведінки."
+
+#: bookwyrm/templates/settings/dashboard/warnings/missing_privacy.html:8
+msgid "Your instance is missing a privacy policy."
+msgstr "Вашому інстансу бракує політики конфіденційності."
+
+#: bookwyrm/templates/settings/dashboard/warnings/reports.html:9
+#, python-format
+msgid "%(display_count)s open report"
+msgid_plural "%(display_count)s open reports"
+msgstr[0] "%(display_count)s відкрита скарга"
+msgstr[1] "%(display_count)s відкриті скарги"
+msgstr[2] "%(display_count)s відкритих скарг"
+msgstr[3] "%(display_count)s відкритих скарг"
+
+#: bookwyrm/templates/settings/dashboard/warnings/update_version.html:8
+#, python-format
+msgid "An update is available! You're running v%(current)s and the latest release is %(available)s."
+msgstr "Доступне оновлення! Ви оперуєте v%(current)s, а останній реліз - v%(available)s."
+
+#: bookwyrm/templates/settings/email_blocklist/domain_form.html:5
+#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:10
+msgid "Add domain"
+msgstr "Додати домен"
+
+#: bookwyrm/templates/settings/email_blocklist/domain_form.html:11
+msgid "Domain:"
+msgstr "Домен:"
+
+#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:5
+#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:7
+#: bookwyrm/templates/settings/layout.html:65
+msgid "Email Blocklist"
+msgstr "Заблоковані Email"
+
+#: 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 "Коли хтось спробує зареєструвати адресу електронної пошти з цього домену, обліковий запис не буде створено, хоча сама реєстрація буде виглядати робочою."
+
+#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:29
+#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:27
+msgid "Options"
+msgstr "Опції"
+
+#: 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 користувач"
+msgstr[1] "%(display_count)s користувача"
+msgstr[2] "%(display_count)s користувачів"
+msgstr[3] "%(display_count)s користувачів"
+
+#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:59
+msgid "No email domains currently blocked"
+msgstr "Наразі немає заблокованих доменів"
+
+#: bookwyrm/templates/settings/email_config.html:6
+#: bookwyrm/templates/settings/email_config.html:8
+#: bookwyrm/templates/settings/layout.html:90
+msgid "Email Configuration"
+msgstr "Налаштування електронної пошти"
+
+#: bookwyrm/templates/settings/email_config.html:16
+msgid "Error sending test email:"
+msgstr "При спробі надіслати email, сталася помилка:"
+
+#: bookwyrm/templates/settings/email_config.html:24
+msgid "Successfully sent test email."
+msgstr "Тестовий email успішно надісланий."
+
+#: bookwyrm/templates/settings/email_config.html:32
+#: bookwyrm/templates/setup/config.html:102
+msgid "Email sender:"
+msgstr "Відправник:"
+
+#: bookwyrm/templates/settings/email_config.html:39
+msgid "Email backend:"
+msgstr "Email-бекенд:"
+
+#: bookwyrm/templates/settings/email_config.html:46
+msgid "Host:"
+msgstr "Хост:"
+
+#: bookwyrm/templates/settings/email_config.html:53
+msgid "Host user:"
+msgstr "Користувач хоста:"
+
+#: bookwyrm/templates/settings/email_config.html:60
+msgid "Port:"
+msgstr "Порт:"
+
+#: bookwyrm/templates/settings/email_config.html:67
+msgid "Use TLS:"
+msgstr "Використовувати TLS:"
+
+#: bookwyrm/templates/settings/email_config.html:74
+msgid "Use SSL:"
+msgstr "Використовувати SSL:"
+
+#: bookwyrm/templates/settings/email_config.html:83
+#, python-format
+msgid "Send test email to %(email)s"
+msgstr "Відправити тестовий email на %(email)s"
+
+#: bookwyrm/templates/settings/email_config.html:90
+msgid "Send test email"
+msgstr "Відправити тестовий email"
+
+#: bookwyrm/templates/settings/federation/edit_instance.html:3
+#: bookwyrm/templates/settings/federation/edit_instance.html:6
+#: bookwyrm/templates/settings/federation/edit_instance.html:15
+#: bookwyrm/templates/settings/federation/edit_instance.html:32
+#: bookwyrm/templates/settings/federation/instance_blocklist.html:3
+#: bookwyrm/templates/settings/federation/instance_blocklist.html:32
+#: bookwyrm/templates/settings/federation/instance_list.html:9
+#: bookwyrm/templates/settings/federation/instance_list.html:10
+msgid "Add instance"
+msgstr "Додати інстанс"
+
+#: bookwyrm/templates/settings/federation/edit_instance.html:12
+#: bookwyrm/templates/settings/federation/instance.html:24
+#: bookwyrm/templates/settings/federation/instance_blocklist.html:12
+#: bookwyrm/templates/settings/federation/instance_list.html:3
+#: bookwyrm/templates/settings/federation/instance_list.html:5
+#: bookwyrm/templates/settings/layout.html:47
+msgid "Federated Instances"
+msgstr "Інстанси У Федерації"
+
+#: bookwyrm/templates/settings/federation/edit_instance.html:28
+#: bookwyrm/templates/settings/federation/instance_blocklist.html:28
+msgid "Import block list"
+msgstr "Імпортувати список заблокованих"
+
+#: bookwyrm/templates/settings/federation/edit_instance.html:43
+msgid "Instance:"
+msgstr "Інстанс:"
+
+#: bookwyrm/templates/settings/federation/edit_instance.html:52
+#: bookwyrm/templates/settings/federation/instance.html:46
+#: bookwyrm/templates/settings/users/user_info.html:113
+msgid "Status:"
+msgstr "Статус:"
+
+#: bookwyrm/templates/settings/federation/edit_instance.html:66
+#: bookwyrm/templates/settings/federation/instance.html:40
+#: bookwyrm/templates/settings/users/user_info.html:107
+msgid "Software:"
+msgstr "ПО:"
+
+#: bookwyrm/templates/settings/federation/edit_instance.html:76
+#: bookwyrm/templates/settings/federation/instance.html:43
+#: bookwyrm/templates/settings/users/user_info.html:110
+msgid "Version:"
+msgstr "Версія:"
+
+#: bookwyrm/templates/settings/federation/instance.html:17
+msgid "Refresh data"
+msgstr "Оновити дані"
+
+#: bookwyrm/templates/settings/federation/instance.html:37
+msgid "Details"
+msgstr "Подробиці"
+
+#: bookwyrm/templates/settings/federation/instance.html:53
+#: bookwyrm/templates/user/layout.html:79
+msgid "Activity"
+msgstr "Активність"
+
+#: bookwyrm/templates/settings/federation/instance.html:56
+msgid "Users:"
+msgstr "Користувачів:"
+
+#: bookwyrm/templates/settings/federation/instance.html:59
+#: bookwyrm/templates/settings/federation/instance.html:65
+msgid "View all"
+msgstr "Переглянути всіх"
+
+#: bookwyrm/templates/settings/federation/instance.html:62
+#: bookwyrm/templates/settings/users/user_info.html:60
+msgid "Reports:"
+msgstr "Скарг:"
+
+#: bookwyrm/templates/settings/federation/instance.html:68
+msgid "Followed by us:"
+msgstr "Ми підписані на:"
+
+#: bookwyrm/templates/settings/federation/instance.html:73
+msgid "Followed by them:"
+msgstr "Вони підписані на:"
+
+#: bookwyrm/templates/settings/federation/instance.html:78
+msgid "Blocked by us:"
+msgstr "Заблокованих нами:"
+
+#: bookwyrm/templates/settings/federation/instance.html:90
+#: bookwyrm/templates/settings/users/user_info.html:117
+msgid "Notes"
+msgstr "Нотатки"
+
+#: bookwyrm/templates/settings/federation/instance.html:97
+msgid "No notes"
+msgstr "Нема нотаток"
+
+#: bookwyrm/templates/settings/federation/instance.html:116
+#: bookwyrm/templates/settings/link_domains/link_domains.html:87
+#: bookwyrm/templates/snippets/block_button.html:5
+msgid "Block"
+msgstr "Заблокувати"
+
+#: bookwyrm/templates/settings/federation/instance.html:117
+msgid "All users from this instance will be deactivated."
+msgstr "Усіх користувачів з цього інстансу буде деактивовано."
+
+#: bookwyrm/templates/settings/federation/instance.html:122
+#: bookwyrm/templates/snippets/block_button.html:10
+msgid "Un-block"
+msgstr "Розблокувати"
+
+#: bookwyrm/templates/settings/federation/instance.html:123
+msgid "All users from this instance will be re-activated."
+msgstr "Усіх користувачів з цього інстансу буде реактивовано."
+
+#: bookwyrm/templates/settings/federation/instance_blocklist.html:6
+#: bookwyrm/templates/settings/federation/instance_blocklist.html:15
+msgid "Import Blocklist"
+msgstr "Імпортувати Список Заблокованих"
+
+#: bookwyrm/templates/settings/federation/instance_blocklist.html:38
+msgid "Success!"
+msgstr "Успішно!"
+
+#: bookwyrm/templates/settings/federation/instance_blocklist.html:42
+msgid "Successfully blocked:"
+msgstr "Успішно заблоковано:"
+
+#: bookwyrm/templates/settings/federation/instance_blocklist.html:44
+msgid "Failed:"
+msgstr "Помилка:"
+
+#: bookwyrm/templates/settings/federation/instance_blocklist.html:62
+msgid "Expects a json file in the format provided by FediBlock, with a list of entries that have instance
and url
fields. For example:"
+msgstr "Це має бути json-файл у форматі FediBlock, зі списком елементів, які мають поля instance
та url
. Наприклад:"
+
+#: bookwyrm/templates/settings/federation/instance_list.html:36
+#: bookwyrm/templates/settings/users/server_filter.html:5
+msgid "Instance name"
+msgstr "Назва інстансу"
+
+#: bookwyrm/templates/settings/federation/instance_list.html:44
+msgid "Last updated"
+msgstr "Останнє оновлення"
+
+#: bookwyrm/templates/settings/federation/instance_list.html:48
+#: bookwyrm/templates/settings/federation/software_filter.html:5
+msgid "Software"
+msgstr "ПО"
+
+#: bookwyrm/templates/settings/federation/instance_list.html:70
+msgid "No instances found"
+msgstr "Інстансів не знайдено"
+
+#: bookwyrm/templates/settings/imports/complete_import_modal.html:4
+msgid "Stop import?"
+msgstr "Зупинити імпорт?"
+
+#: bookwyrm/templates/settings/imports/imports.html:19
+msgid "Disable starting new imports"
+msgstr "Вимкнути створення нових імпортів"
+
+#: bookwyrm/templates/settings/imports/imports.html:30
+msgid "This is only intended to be used when things have gone very wrong with imports and you need to pause the feature while addressing issues."
+msgstr "Це потрібно лише у тих ситуаціях, коли з імпортами виникли великі проблеми та вам треба тимчасово вимкнути їх щоб розібратися у чому справа."
+
+#: bookwyrm/templates/settings/imports/imports.html:31
+msgid "While imports are disabled, users will not be allowed to start new imports, but existing imports will not be affected."
+msgstr "Поки імпорти вимкнені, користувачі не зможуть додавати нові, але на наявний імпорт це не вплине."
+
+#: bookwyrm/templates/settings/imports/imports.html:36
+msgid "Disable imports"
+msgstr "Вимкнути імпорти"
+
+#: bookwyrm/templates/settings/imports/imports.html:50
+msgid "Users are currently unable to start new imports"
+msgstr "Наразі користувачі не можуть додати новий імпорт"
+
+#: bookwyrm/templates/settings/imports/imports.html:55
+msgid "Enable imports"
+msgstr "Увімкнути імпорти"
+
+#: bookwyrm/templates/settings/imports/imports.html:63
+msgid "Limit the amount of imports"
+msgstr "Обмежити кількість імпортувань"
+
+#: bookwyrm/templates/settings/imports/imports.html:74
+msgid "Some users might try to import a large number of books, which you want to limit."
+msgstr "Деякі користувачі можуть спробувати імпортувати велику кількість книг, що не завадить обмежити."
+
+#: bookwyrm/templates/settings/imports/imports.html:75
+msgid "Set the value to 0 to not enforce any limit."
+msgstr "Встановіть значення 0, аби не встановлювати жодних обмежень."
+
+#: bookwyrm/templates/settings/imports/imports.html:78
+msgid "Set import limit to"
+msgstr "Встановити обмеження імпорту у"
+
+#: bookwyrm/templates/settings/imports/imports.html:80
+msgid "books every"
+msgstr "книг кожні"
+
+#: bookwyrm/templates/settings/imports/imports.html:82
+msgid "days."
+msgstr "днів."
+
+#: bookwyrm/templates/settings/imports/imports.html:86
+msgid "Set limit"
+msgstr "Встановити ліміт"
+
+#: bookwyrm/templates/settings/imports/imports.html:102
+msgid "Completed"
+msgstr "Завершені"
+
+#: bookwyrm/templates/settings/imports/imports.html:116
+msgid "User"
+msgstr "Користувач"
+
+#: bookwyrm/templates/settings/imports/imports.html:125
+msgid "Date Updated"
+msgstr "Останнє Оновлення"
+
+#: bookwyrm/templates/settings/imports/imports.html:132
+msgid "Pending items"
+msgstr "В очікуванні"
+
+#: bookwyrm/templates/settings/imports/imports.html:135
+msgid "Successful items"
+msgstr "Успішно імпортовано"
+
+#: bookwyrm/templates/settings/imports/imports.html:170
+msgid "No matching imports found."
+msgstr "Відповідних імпортів не знайдено."
+
+#: 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 "Запити На Запрошення"
+
+#: 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:42
+#: bookwyrm/templates/user_menu.html:55
+msgid "Invites"
+msgstr "Запрошення"
+
+#: bookwyrm/templates/settings/invites/manage_invite_requests.html:23
+msgid "Ignored Invite Requests"
+msgstr "Проігноровані Запити На Запрошення"
+
+#: bookwyrm/templates/settings/invites/manage_invite_requests.html:36
+msgid "Date requested"
+msgstr "Дата звернення"
+
+#: bookwyrm/templates/settings/invites/manage_invite_requests.html:40
+msgid "Date accepted"
+msgstr "Дата прийняття"
+
+#: bookwyrm/templates/settings/invites/manage_invite_requests.html:45
+msgid "Answer"
+msgstr "Відповідь"
+
+#: bookwyrm/templates/settings/invites/manage_invite_requests.html:51
+msgid "Action"
+msgstr "Дія"
+
+#: bookwyrm/templates/settings/invites/manage_invite_requests.html:54
+msgid "No requests"
+msgstr "Немає запитів"
+
+#: bookwyrm/templates/settings/invites/manage_invite_requests.html:66
+#: bookwyrm/templates/settings/invites/status_filter.html:16
+msgid "Accepted"
+msgstr "Прийнято"
+
+#: bookwyrm/templates/settings/invites/manage_invite_requests.html:68
+#: bookwyrm/templates/settings/invites/status_filter.html:12
+msgid "Sent"
+msgstr "Відправлено"
+
+#: bookwyrm/templates/settings/invites/manage_invite_requests.html:70
+#: bookwyrm/templates/settings/invites/status_filter.html:8
+msgid "Requested"
+msgstr "Запрошено користувачем"
+
+#: bookwyrm/templates/settings/invites/manage_invite_requests.html:80
+msgid "Send invite"
+msgstr "Надіслати запрошення"
+
+#: bookwyrm/templates/settings/invites/manage_invite_requests.html:82
+msgid "Re-send invite"
+msgstr "Надіслати запрошення ще раз"
+
+#: bookwyrm/templates/settings/invites/manage_invite_requests.html:102
+msgid "Ignore"
+msgstr "Ігнорувати"
+
+#: bookwyrm/templates/settings/invites/manage_invite_requests.html:104
+msgid "Un-ignore"
+msgstr "Скасувати ігнорування"
+
+#: bookwyrm/templates/settings/invites/manage_invite_requests.html:116
+msgid "Back to pending requests"
+msgstr "Повернутися до запитів в процесі"
+
+#: bookwyrm/templates/settings/invites/manage_invite_requests.html:118
+msgid "View ignored requests"
+msgstr "Переглянути проігноровані запити"
+
+#: bookwyrm/templates/settings/invites/manage_invites.html:21
+msgid "Generate New Invite"
+msgstr "Згенерувати Нове Запрошення"
+
+#: bookwyrm/templates/settings/invites/manage_invites.html:27
+msgid "Expiry:"
+msgstr "Термін дії: "
+
+#: bookwyrm/templates/settings/invites/manage_invites.html:33
+msgid "Use limit:"
+msgstr "Ліміт використань:"
+
+#: bookwyrm/templates/settings/invites/manage_invites.html:40
+msgid "Create Invite"
+msgstr "Створити Запрошення"
+
+#: bookwyrm/templates/settings/invites/manage_invites.html:48
+msgid "Expires"
+msgstr "Закінчення терміну дії"
+
+#: bookwyrm/templates/settings/invites/manage_invites.html:49
+msgid "Max uses"
+msgstr "Макс. кількість використань"
+
+#: bookwyrm/templates/settings/invites/manage_invites.html:50
+msgid "Times used"
+msgstr "Використань"
+
+#: bookwyrm/templates/settings/invites/manage_invites.html:53
+msgid "No active invites"
+msgstr "Немає активних запрошень"
+
+#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:5
+#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:10
+msgid "Add IP address"
+msgstr "Додати IP-адресу"
+
+#: 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 "Використовуйте блокування IP-адрес обережно. Розгляньте тимчасове блокування, оскільки IP-адреси часто бувають спільними для кількох людей або змінюють власників. Якщо ви заблокуєте власну IP адресу, ви не зможете зайти на цю сторінку."
+
+#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:18
+msgid "IP Address:"
+msgstr "IP-адреса:"
+
+#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:24
+msgid "You can block IP ranges using CIDR syntax."
+msgstr "Ви можете заблокувати діапазон IP за допомогою синтаксису CIDR."
+
+#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:5
+#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:7
+#: bookwyrm/templates/settings/layout.html:69
+msgid "IP Address Blocklist"
+msgstr "Список Заблокованих IP"
+
+#: 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 "Будь-який трафік з цієї IP-адреси отримає відповідь 404 при взаємодії з будь-якою частиною сервісу."
+
+#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:24
+msgid "Address"
+msgstr "Адреса"
+
+#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:46
+msgid "No IP addresses currently blocked"
+msgstr "Наразі нема заблокованих IP адрес"
+
+#: bookwyrm/templates/settings/layout.html:4
+msgid "Administration"
+msgstr "Адміністрування"
+
+#: bookwyrm/templates/settings/layout.html:31
+msgid "Manage Users"
+msgstr "Керування Користувачами"
+
+#: bookwyrm/templates/settings/layout.html:53
+msgid "Moderation"
+msgstr "Модерація"
+
+#: bookwyrm/templates/settings/layout.html:57
+#: bookwyrm/templates/settings/reports/reports.html:8
+#: bookwyrm/templates/settings/reports/reports.html:17
+msgid "Reports"
+msgstr "Скарги"
+
+#: bookwyrm/templates/settings/layout.html:73
+#: bookwyrm/templates/settings/link_domains/link_domains.html:5
+#: bookwyrm/templates/settings/link_domains/link_domains.html:7
+msgid "Link Domains"
+msgstr "Домени Посилань"
+
+#: bookwyrm/templates/settings/layout.html:78
+msgid "System"
+msgstr "Система"
+
+#: bookwyrm/templates/settings/layout.html:86
+msgid "Celery status"
+msgstr "Стан Celery"
+
+#: bookwyrm/templates/settings/layout.html:95
+msgid "Instance Settings"
+msgstr "Налаштування Інстансу"
+
+#: bookwyrm/templates/settings/layout.html:103
+#: bookwyrm/templates/settings/site.html:4
+#: bookwyrm/templates/settings/site.html:6
+msgid "Site Settings"
+msgstr "Налаштування Сайту"
+
+#: bookwyrm/templates/settings/layout.html:109
+#: bookwyrm/templates/settings/layout.html:112
+#: bookwyrm/templates/settings/registration.html:4
+#: bookwyrm/templates/settings/registration.html:6
+#: bookwyrm/templates/settings/registration_limited.html:4
+#: bookwyrm/templates/settings/registration_limited.html:6
+msgid "Registration"
+msgstr "Реєстрація"
+
+#: bookwyrm/templates/settings/layout.html:118
+#: bookwyrm/templates/settings/site.html:107
+#: bookwyrm/templates/settings/themes.html:4
+#: bookwyrm/templates/settings/themes.html:6
+msgid "Themes"
+msgstr "Теми"
+
+#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:5
+#, python-format
+msgid "Set display name for %(url)s"
+msgstr "Встановити ім'я для %(url)s"
+
+#: bookwyrm/templates/settings/link_domains/link_domains.html:11
+msgid "Link domains must be approved before they are shown on book pages. Please make sure that the domains are not hosting spam, malicious code, or deceptive links before approving."
+msgstr "Домени посилань треба підтвердити перед тим, як вони з'являться на сторінках книжок. Будь ласка, переконайтеся, що сайти, на які вказують домени, не розміщують спам, віруси або оманливі посилання перед підтвердженням."
+
+#: bookwyrm/templates/settings/link_domains/link_domains.html:45
+msgid "Set display name"
+msgstr "Встановити ім'я для"
+
+#: bookwyrm/templates/settings/link_domains/link_domains.html:53
+msgid "View links"
+msgstr "Переглянути посилання"
+
+#: bookwyrm/templates/settings/link_domains/link_domains.html:96
+msgid "No domains currently approved"
+msgstr "Наразі немає підтверджених доменів"
+
+#: bookwyrm/templates/settings/link_domains/link_domains.html:98
+msgid "No domains currently pending"
+msgstr "Наразі немає доменів, які очікують підтвердження"
+
+#: bookwyrm/templates/settings/link_domains/link_domains.html:100
+msgid "No domains currently blocked"
+msgstr "Наразі немає заблокованих доменів"
+
+#: bookwyrm/templates/settings/link_domains/link_table.html:43
+msgid "No links available for this domain."
+msgstr "Немає посилань для цього домену."
+
+#: bookwyrm/templates/settings/registration.html:13
+#: bookwyrm/templates/settings/registration_limited.html:13
+#: bookwyrm/templates/settings/site.html:21
+msgid "Settings saved"
+msgstr "Налаштування збережено"
+
+#: bookwyrm/templates/settings/registration.html:22
+#: bookwyrm/templates/settings/registration_limited.html:22
+#: bookwyrm/templates/settings/site.html:30
+msgid "Unable to save settings"
+msgstr "Не вдалося зберегти налаштування"
+
+#: bookwyrm/templates/settings/registration.html:38
+msgid "Allow registration"
+msgstr "Дозволити реєстрацію"
+
+#: bookwyrm/templates/settings/registration.html:43
+msgid "Default access level:"
+msgstr "Рівень доступу за замовчуванням:"
+
+#: bookwyrm/templates/settings/registration.html:61
+msgid "Require users to confirm email address"
+msgstr "Вимагати від користувачів підтвердження email адреси"
+
+#: bookwyrm/templates/settings/registration.html:63
+msgid "(Recommended if registration is open)"
+msgstr "(Рекомендується при відкритій реєстрації)"
+
+#: bookwyrm/templates/settings/registration.html:68
+msgid "Allow invite requests"
+msgstr "Дозволити запити на запрошення"
+
+#: bookwyrm/templates/settings/registration.html:72
+#: bookwyrm/templates/settings/registration_limited.html:42
+msgid "Invite request text:"
+msgstr "Текст запиту запрошення:"
+
+#: bookwyrm/templates/settings/registration.html:80
+#: bookwyrm/templates/settings/registration_limited.html:50
+msgid "Set a question for invite requests"
+msgstr "Встановити питання для запиту запрошення"
+
+#: bookwyrm/templates/settings/registration.html:85
+#: bookwyrm/templates/settings/registration_limited.html:55
+msgid "Question:"
+msgstr "Питання:"
+
+#: bookwyrm/templates/settings/registration.html:90
+#: bookwyrm/templates/settings/registration_limited.html:67
+msgid "Registration closed text:"
+msgstr "Текст, якщо реєстрація закрита:"
+
+#: bookwyrm/templates/settings/registration_limited.html:29
+msgid "Registration is enabled on this instance"
+msgstr "На цьому інстансі увімкнена реєстрація"
+
+#: bookwyrm/templates/settings/reports/report.html:13
+msgid "Back to reports"
+msgstr "Назад до скарг"
+
+#: bookwyrm/templates/settings/reports/report.html:25
+msgid "Message reporter"
+msgstr "Написати повідомлення автору скарги"
+
+#: bookwyrm/templates/settings/reports/report.html:29
+msgid "Update on your report:"
+msgstr "Оновлення по вашій скарзі:"
+
+#: bookwyrm/templates/settings/reports/report.html:37
+msgid "Reported status"
+msgstr "Оскаржений статус"
+
+#: bookwyrm/templates/settings/reports/report.html:39
+msgid "Status has been deleted"
+msgstr "Статус було видалено"
+
+#: bookwyrm/templates/settings/reports/report.html:48
+msgid "Reported links"
+msgstr "Оскаржені посилання"
+
+#: bookwyrm/templates/settings/reports/report.html:66
+msgid "Moderation Activity"
+msgstr "Активність модераторів"
+
+#: bookwyrm/templates/settings/reports/report.html:73
+#, python-format
+msgid "%(user)s opened this report"
+msgstr "%(user)s відкрив(-ла) цю скаргу"
+
+#: bookwyrm/templates/settings/reports/report.html:86
+#, python-format
+msgid "%(user)s commented on this report:"
+msgstr "%(user)s прокоментував(-ла) цю скаргу:"
+
+#: bookwyrm/templates/settings/reports/report.html:90
+#, python-format
+msgid "%(user)s took an action on this report:"
+msgstr "%(user)s вжив(-ла) заходів по цій скарзі:"
+
+#: bookwyrm/templates/settings/reports/report_header.html:6
+#, python-format
+msgid "Report #%(report_id)s: Status posted by @%(username)s"
+msgstr "Скарга #%(report_id)s: Статус від @%(username)s"
+
+#: bookwyrm/templates/settings/reports/report_header.html:13
+#, python-format
+msgid "Report #%(report_id)s: Link added by @%(username)s"
+msgstr "Скарга #%(report_id)s: Посилання додане @%(username)s"
+
+#: bookwyrm/templates/settings/reports/report_header.html:17
+#, python-format
+msgid "Report #%(report_id)s: Link domain"
+msgstr "Скарга #%(report_id)s: Домен посилання"
+
+#: bookwyrm/templates/settings/reports/report_header.html:24
+#, python-format
+msgid "Report #%(report_id)s: User @%(username)s"
+msgstr "Скарга #%(report_id)s: Користувач @%(username)s"
+
+#: bookwyrm/templates/settings/reports/report_links_table.html:19
+msgid "Approve domain"
+msgstr "Підтвердити домен"
+
+#: bookwyrm/templates/settings/reports/report_links_table.html:26
+msgid "Block domain"
+msgstr "Заблокувати домен"
+
+#: bookwyrm/templates/settings/reports/report_preview.html:17
+msgid "No notes provided"
+msgstr "Нотатки відсутні"
+
+#: bookwyrm/templates/settings/reports/report_preview.html:24
+#, python-format
+msgid "Reported by @%(username)s"
+msgstr "Скарга від @%(username)s"
+
+#: bookwyrm/templates/settings/reports/report_preview.html:34
+msgid "Re-open"
+msgstr "Відкрийте знову"
+
+#: bookwyrm/templates/settings/reports/report_preview.html:36
+msgid "Resolve"
+msgstr "Розглянуто"
+
+#: bookwyrm/templates/settings/reports/reports.html:6
+#, python-format
+msgid "Reports: %(instance_name)s"
+msgstr "Скарги: %(instance_name)s"
+
+#: bookwyrm/templates/settings/reports/reports.html:14
+#, python-format
+msgid "Reports: %(instance_name)s"
+msgstr "Скарги: %(instance_name)s"
+
+#: bookwyrm/templates/settings/reports/reports.html:25
+msgid "Open"
+msgstr "Очікує розгляду"
+
+#: bookwyrm/templates/settings/reports/reports.html:28
+msgid "Resolved"
+msgstr "Розглянута"
+
+#: bookwyrm/templates/settings/reports/reports.html:37
+msgid "No reports found."
+msgstr "Скарг не знайдено."
+
+#: bookwyrm/templates/settings/site.html:10
+#: bookwyrm/templates/settings/site.html:43
+msgid "Instance Info"
+msgstr "Інформація про інстанс"
+
+#: bookwyrm/templates/settings/site.html:12
+#: bookwyrm/templates/settings/site.html:122
+msgid "Footer Content"
+msgstr "Вміст футера"
+
+#: bookwyrm/templates/settings/site.html:46
+msgid "Instance Name:"
+msgstr "Назва Інстансу:"
+
+#: bookwyrm/templates/settings/site.html:50
+msgid "Tagline:"
+msgstr "Підзаголовок:"
+
+#: bookwyrm/templates/settings/site.html:54
+msgid "Instance description:"
+msgstr "Опис інстансу:"
+
+#: bookwyrm/templates/settings/site.html:58
+msgid "Short description:"
+msgstr "Короткий опис:"
+
+#: bookwyrm/templates/settings/site.html:59
+msgid "Used when the instance is previewed on joinbookwyrm.com. Does not support HTML or Markdown."
+msgstr "Використовується при розміщенні на joinbookwyrm.com. Не підтримує HTML або Markdown."
+
+#: bookwyrm/templates/settings/site.html:63
+msgid "Code of conduct:"
+msgstr "Правила поведінки:"
+
+#: bookwyrm/templates/settings/site.html:67
+msgid "Privacy Policy:"
+msgstr "Політика Конфіденційності:"
+
+#: bookwyrm/templates/settings/site.html:72
+msgid "Impressum:"
+msgstr "Імпресум:"
+
+#: bookwyrm/templates/settings/site.html:77
+msgid "Include impressum:"
+msgstr "Включає імпресум:"
+
+#: bookwyrm/templates/settings/site.html:94
+msgid "Logo:"
+msgstr "Логотип:"
+
+#: bookwyrm/templates/settings/site.html:98
+msgid "Logo small:"
+msgstr "Маленький логотип:"
+
+#: bookwyrm/templates/settings/site.html:102
+msgid "Favicon:"
+msgstr "Favicon:"
+
+#: bookwyrm/templates/settings/site.html:110
+msgid "Default theme:"
+msgstr "Стандартна тема:"
+
+#: bookwyrm/templates/settings/site.html:125
+msgid "Support link:"
+msgstr "Посилання для підтримки:"
+
+#: bookwyrm/templates/settings/site.html:129
+msgid "Support title:"
+msgstr "Назва сервісу підтримки:"
+
+#: bookwyrm/templates/settings/site.html:133
+msgid "Admin email:"
+msgstr "Email адміністратора:"
+
+#: bookwyrm/templates/settings/site.html:137
+msgid "Additional info:"
+msgstr "Додаткова інформація:"
+
+#: bookwyrm/templates/settings/themes.html:10
+msgid "Set instance default theme"
+msgstr "Встановити стандартну тему інстансу"
+
+#: bookwyrm/templates/settings/themes.html:19
+msgid "One of your themes appears to be broken. Selecting this theme will make the application unusable."
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:28
+msgid "Successfully added theme"
+msgstr "Тему успішно додано"
+
+#: bookwyrm/templates/settings/themes.html:35
+msgid "How to add a theme"
+msgstr "Як додати тему"
+
+#: bookwyrm/templates/settings/themes.html:38
+msgid "Copy the theme file into the bookwyrm/static/css/themes
directory on your server from the command line."
+msgstr "Скопіюйте файл теми в директорію bookwyrm/static/css/themes
на вашому сервері з командного рядка."
+
+#: bookwyrm/templates/settings/themes.html:41
+msgid "Run ./bw-dev compile_themes
and ./bw-dev collectstatic
."
+msgstr "Запустіть ./bw-dev compile_themes
та ./bw-dev collectstatic
."
+
+#: bookwyrm/templates/settings/themes.html:44
+msgid "Add the file name using the form below to make it available in the application interface."
+msgstr "Додайте назву файлу використовуючи форму нижче, щоб зробити її доступною в інтерфейсі BookWyrm."
+
+#: bookwyrm/templates/settings/themes.html:51
+#: bookwyrm/templates/settings/themes.html:91
+msgid "Add theme"
+msgstr "Додати тему"
+
+#: bookwyrm/templates/settings/themes.html:57
+msgid "Unable to save theme"
+msgstr "Не вдалося зберегти тему"
+
+#: bookwyrm/templates/settings/themes.html:72
+#: bookwyrm/templates/settings/themes.html:102
+msgid "Theme name"
+msgstr "Назва теми"
+
+#: bookwyrm/templates/settings/themes.html:82
+msgid "Theme filename"
+msgstr "Ім'я файлу теми"
+
+#: bookwyrm/templates/settings/themes.html:97
+msgid "Available Themes"
+msgstr "Доступні теми"
+
+#: bookwyrm/templates/settings/themes.html:105
+msgid "File"
+msgstr "Файл"
+
+#: bookwyrm/templates/settings/themes.html:123
+msgid "Remove theme"
+msgstr "Видалити тему"
+
+#: bookwyrm/templates/settings/themes.html:134
+msgid "Test theme"
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:143
+msgid "Broken theme"
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:152
+msgid "Loaded successfully"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/delete_user_form.html:5
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:52
+msgid "Permanently delete user"
+msgstr "Видалити користувача назавжди"
+
+#: 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 "Ви впевнені, що хочете видалити обліковий запис %(username)s? Цю дію неможливо скасувати. Щоб продовжити, будь ласка, введіть свій пароль для підтвердження видалення."
+
+#: bookwyrm/templates/settings/users/delete_user_form.html:17
+msgid "Your password:"
+msgstr "Ваш пароль:"
+
+#: bookwyrm/templates/settings/users/user_admin.html:9
+#, python-format
+msgid "Users: %(instance_name)s"
+msgstr "Користувачі: %(instance_name)s"
+
+#: bookwyrm/templates/settings/users/user_admin.html:29
+msgid "Deleted users"
+msgstr "Видалені користувачі"
+
+#: bookwyrm/templates/settings/users/user_admin.html:44
+#: bookwyrm/templates/settings/users/username_filter.html:5
+msgid "Username"
+msgstr "Ім'я користувача"
+
+#: bookwyrm/templates/settings/users/user_admin.html:48
+msgid "Date Added"
+msgstr "Дата реєстрації / додавання"
+
+#: bookwyrm/templates/settings/users/user_admin.html:52
+msgid "Last Active"
+msgstr "Остання активність"
+
+#: bookwyrm/templates/settings/users/user_admin.html:61
+msgid "Remote instance"
+msgstr "Інший інстанс"
+
+#: bookwyrm/templates/settings/users/user_admin.html:84
+#: bookwyrm/templates/settings/users/user_info.html:127
+msgid "Not set"
+msgstr "Не встановлено"
+
+#: bookwyrm/templates/settings/users/user_info.html:20
+msgid "This account is the instance actor for signing HTTP requests."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_info.html:24
+msgid "View user profile"
+msgstr "Переглянути профіль користувача"
+
+#: bookwyrm/templates/settings/users/user_info.html:30
+msgid "Go to user admin"
+msgstr "Перейти до адміністрування користувача"
+
+#: bookwyrm/templates/settings/users/user_info.html:40
+msgid "Local"
+msgstr "Місцевий"
+
+#: bookwyrm/templates/settings/users/user_info.html:42
+msgid "Remote"
+msgstr "З іншого сервера"
+
+#: bookwyrm/templates/settings/users/user_info.html:51
+msgid "User details"
+msgstr "Подробиці користувача"
+
+#: bookwyrm/templates/settings/users/user_info.html:55
+msgid "Email:"
+msgstr "Електронна пошта:"
+
+#: bookwyrm/templates/settings/users/user_info.html:65
+msgid "(View reports)"
+msgstr "(Переглянути скарги)"
+
+#: bookwyrm/templates/settings/users/user_info.html:71
+msgid "Blocked by count:"
+msgstr "Заблокували цього користувача:"
+
+#: bookwyrm/templates/settings/users/user_info.html:74
+msgid "Date added:"
+msgstr "Зареєструвався або було додано:"
+
+#: bookwyrm/templates/settings/users/user_info.html:77
+msgid "Last active date:"
+msgstr "Остання активність:"
+
+#: bookwyrm/templates/settings/users/user_info.html:80
+msgid "Manually approved followers:"
+msgstr "Підтверджує підписників вручну:"
+
+#: bookwyrm/templates/settings/users/user_info.html:83
+msgid "Discoverable:"
+msgstr "Видимий:"
+
+#: bookwyrm/templates/settings/users/user_info.html:87
+msgid "Deactivation reason:"
+msgstr "Причина деактивації:"
+
+#: bookwyrm/templates/settings/users/user_info.html:102
+msgid "Instance details"
+msgstr "Подробиці інстансу"
+
+#: bookwyrm/templates/settings/users/user_info.html:124
+msgid "View instance"
+msgstr "Переглянути інстанс"
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:6
+msgid "Permanently deleted"
+msgstr "Видалено остаточно"
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:9
+msgid "User Actions"
+msgstr "Керування користувачем"
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:15
+msgid "This is the instance admin actor"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:18
+msgid "You must not delete or disable this account as it is critical to the functioning of your server. This actor signs outgoing GET requests to smooth interaction with secure ActivityPub servers."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:19
+msgid "This account is not discoverable by ordinary users and does not have a profile page."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:35
+msgid "Activate user"
+msgstr "Активувати користувача"
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:41
+msgid "Suspend user"
+msgstr "Заблокувати користувача"
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:46
+msgid "Un-suspend user"
+msgstr "Розблокувати користувача"
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:68
+msgid "Access level:"
+msgstr "Рівень доступу:"
+
+#: bookwyrm/templates/setup/admin.html:5
+msgid "Set up BookWyrm"
+msgstr "Налаштування BookWyrm"
+
+#: bookwyrm/templates/setup/admin.html:7
+msgid "Your account as a user and an admin"
+msgstr "Ваш обліковий запис як користувача та адміністратора"
+
+#: bookwyrm/templates/setup/admin.html:13
+msgid "Create your account"
+msgstr "Створення свого облікового запису"
+
+#: bookwyrm/templates/setup/admin.html:20
+msgid "Admin key:"
+msgstr "Ключ адміністратора:"
+
+#: bookwyrm/templates/setup/admin.html:32
+msgid "An admin key was created when you installed BookWyrm. You can get your admin key by running ./bw-dev admin_code
from the command line on your server."
+msgstr "Ключ адміністратора було створено при встановленні BookWyrm. Ви можете отримати його запустивши ./bw-dev admin_code
в командному рядку на вашому сервері."
+
+#: bookwyrm/templates/setup/admin.html:45
+msgid "As an admin, you'll be able to configure the instance name and information, and moderate your instance. This means you will have access to private information about your users, and are responsible for responding to reports of bad behavior or spam."
+msgstr "Як адміністратор, ви зможете налаштувати назву інстансу та інформацію про нього, а також модерувати його. Це значить, що у вас буде доступ до приватної інформації про ваших користувачів та ви будете відповідати за реагування на скарги на погану поведінку та спам."
+
+#: bookwyrm/templates/setup/admin.html:51
+msgid "Once the instance is set up, you can promote other users to moderator or admin roles from the admin panel."
+msgstr "Після налаштування інстансу ви зможете підвищити інших користувачів до ролі модератора або адміністратора з панелі адміністратора."
+
+#: bookwyrm/templates/setup/admin.html:55
+msgid "Learn more about moderation"
+msgstr "Дізнатися більше про модерацію"
+
+#: bookwyrm/templates/setup/config.html:5
+msgid "Instance Configuration"
+msgstr "Параметри інстансу"
+
+#: bookwyrm/templates/setup/config.html:7
+msgid "Make sure everything looks right before proceeding"
+msgstr "Перед продовженням переконайтеся, що все виглядає правильно"
+
+#: bookwyrm/templates/setup/config.html:18
+msgid "You are running BookWyrm in debug mode. This should never be used in a production environment."
+msgstr "BookWyrm працює в режимі налагодження. Ніколи не використовуйте цей режим в продакшені."
+
+#: bookwyrm/templates/setup/config.html:30
+msgid "Your domain appears to be misconfigured. It should not include protocol or slashes."
+msgstr "Ваш домен, здається, налаштований неправильно. Він не повинен містити протокол або слеш."
+
+#: bookwyrm/templates/setup/config.html:42
+msgid "You are running BookWyrm in production mode without https. USE_HTTPS should be enabled in production."
+msgstr "Ваш інстанс BookWyrm працює в режимі продакшену без https. Вам слід увімкнути USE_HTTPS."
+
+#: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:44
+msgid "Settings"
+msgstr "Налаштування"
+
+#: bookwyrm/templates/setup/config.html:56
+msgid "Instance domain:"
+msgstr "Домен інстансу:"
+
+#: bookwyrm/templates/setup/config.html:63
+msgid "Protocol:"
+msgstr "Протокол:"
+
+#: bookwyrm/templates/setup/config.html:81
+msgid "Using S3:"
+msgstr "Використовує S3:"
+
+#: bookwyrm/templates/setup/config.html:95
+msgid "Default interface language:"
+msgstr "Стандартна мова інтерфейсу:"
+
+#: bookwyrm/templates/setup/config.html:109
+msgid "Enable preview images:"
+msgstr "Попередній перегляд зображень увімкнено:"
+
+#: bookwyrm/templates/setup/config.html:116
+msgid "Enable image thumbnails:"
+msgstr "Мініатюри зображень увімкнено:"
+
+#: bookwyrm/templates/setup/config.html:128
+msgid "Does everything look right?"
+msgstr "Все виглядає правильно?"
+
+#: bookwyrm/templates/setup/config.html:130
+msgid "This is your last chance to set your domain and protocol."
+msgstr "Це ваш останній шанс встановити домен та протокол."
+
+#: bookwyrm/templates/setup/config.html:144
+msgid "You can change your instance settings in the .env
file on your server."
+msgstr "Ви можете змінити налаштування вашого інстансу в файлі .env
на вашому сервері."
+
+#: bookwyrm/templates/setup/config.html:148
+msgid "View installation instructions"
+msgstr "Переглянути інструкції з встановлення"
+
+#: bookwyrm/templates/setup/layout.html:5
+msgid "Instance Setup"
+msgstr "Налаштування інстансу"
+
+#: bookwyrm/templates/setup/layout.html:21
+msgid "Installing BookWyrm"
+msgstr "Встановлення BookWyrm"
+
+#: bookwyrm/templates/setup/layout.html:24
+msgid "Need help?"
+msgstr "Потрібна допомога?"
+
+#: bookwyrm/templates/shelf/create_shelf_form.html:5
+#: bookwyrm/templates/shelf/shelf.html:74
+msgid "Create shelf"
+msgstr "Створити полицю"
+
+#: bookwyrm/templates/shelf/edit_shelf_form.html:5
+msgid "Edit Shelf"
+msgstr "Редагувати полицю"
+
+#: bookwyrm/templates/shelf/shelf.html:26
+#: bookwyrm/templates/user/relationships/followers.html:18
+#: bookwyrm/templates/user/relationships/following.html:18
+msgid "User profile"
+msgstr "Профіль користувача"
+
+#: bookwyrm/templates/shelf/shelf.html:41
+#: bookwyrm/templatetags/shelf_tags.py:13 bookwyrm/views/shelf/shelf.py:53
+msgid "All books"
+msgstr "Усі книги"
+
+#: bookwyrm/templates/shelf/shelf.html:99
+#, python-format
+msgid "%(formatted_count)s book"
+msgid_plural "%(formatted_count)s books"
+msgstr[0] "%(formatted_count)s книга"
+msgstr[1] "%(formatted_count)s книги"
+msgstr[2] "%(formatted_count)s книг"
+msgstr[3] "%(formatted_count)s книг"
+
+#: bookwyrm/templates/shelf/shelf.html:106
+#, python-format
+msgid "(showing %(start)s-%(end)s)"
+msgstr "(показуються %(start)s-%(end)s)"
+
+#: bookwyrm/templates/shelf/shelf.html:118
+msgid "Edit shelf"
+msgstr "Редагувати полицю"
+
+#: bookwyrm/templates/shelf/shelf.html:126
+msgid "Delete shelf"
+msgstr "Видалити полицю"
+
+#: bookwyrm/templates/shelf/shelf.html:154
+#: bookwyrm/templates/shelf/shelf.html:180
+msgid "Shelved"
+msgstr "Додано до полиці"
+
+#: bookwyrm/templates/shelf/shelf.html:155
+#: bookwyrm/templates/shelf/shelf.html:183
+msgid "Started"
+msgstr "Почато"
+
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
+msgid "Finished"
+msgstr "Прочитано"
+
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
+msgid "Until"
+msgstr "До"
+
+#: bookwyrm/templates/shelf/shelf.html:212
+msgid "This shelf is empty."
+msgstr "Ця полиця порожня."
+
+#: bookwyrm/templates/snippets/add_to_group_button.html:16
+msgid "Invite"
+msgstr "Запросити"
+
+#: bookwyrm/templates/snippets/add_to_group_button.html:25
+msgid "Uninvite"
+msgstr "Скасувати запрошення"
+
+#: bookwyrm/templates/snippets/add_to_group_button.html:29
+#, python-format
+msgid "Remove @%(username)s"
+msgstr "Виключити @%(username)s"
+
+#: bookwyrm/templates/snippets/announcement.html:28
+#, python-format
+msgid "Posted by %(username)s"
+msgstr "Опубліковано %(username)s"
+
+#: bookwyrm/templates/snippets/authors.html:22
+#: bookwyrm/templates/snippets/trimmed_list.html:14
+#, python-format
+msgid "and %(remainder_count_display)s other"
+msgid_plural "and %(remainder_count_display)s others"
+msgstr[0] "та %(remainder_count_display)s інший"
+msgstr[1] "та %(remainder_count_display)s інших"
+msgstr[2] "та %(remainder_count_display)s інших"
+msgstr[3] "та %(remainder_count_display)s інших"
+
+#: bookwyrm/templates/snippets/book_cover.html:63
+msgid "No cover"
+msgstr "Немає обкладинки"
+
+#: bookwyrm/templates/snippets/book_titleby.html:11
+#, 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 "Поширити"
+
+#: bookwyrm/templates/snippets/boost_button.html:33
+#: bookwyrm/templates/snippets/boost_button.html:34
+msgid "Un-boost"
+msgstr "Скасувати поширення"
+
+#: bookwyrm/templates/snippets/create_status.html:36
+msgid "Quote"
+msgstr "Процитувати"
+
+#: bookwyrm/templates/snippets/create_status/comment.html:15
+msgid "Some thoughts on the book"
+msgstr "Деякі думки про книгу"
+
+#: bookwyrm/templates/snippets/create_status/comment.html:27
+#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:18
+msgid "Progress:"
+msgstr "Прогрес:"
+
+#: bookwyrm/templates/snippets/create_status/comment.html:53
+#: bookwyrm/templates/snippets/progress_field.html:18
+msgid "pages"
+msgstr "сторінок"
+
+#: bookwyrm/templates/snippets/create_status/comment.html:59
+#: bookwyrm/templates/snippets/progress_field.html:23
+msgid "percent"
+msgstr "процентів"
+
+#: bookwyrm/templates/snippets/create_status/comment.html:66
+#, python-format
+msgid "of %(pages)s pages"
+msgstr "з %(pages)s сторінок"
+
+#: bookwyrm/templates/snippets/create_status/content_field.html:18
+#: bookwyrm/templates/snippets/status/layout.html:34
+#: bookwyrm/templates/snippets/status/layout.html:53
+#: bookwyrm/templates/snippets/status/layout.html:54
+msgid "Reply"
+msgstr "Відповісти"
+
+#: bookwyrm/templates/snippets/create_status/content_field.html:18
+msgid "Content"
+msgstr "Зміст"
+
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:9
+msgid "Include spoiler alert"
+msgstr "Містить спойлер!"
+
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:18
+msgid "Spoilers/content warnings:"
+msgstr "Попередження про спойлери або зміст:"
+
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:27
+msgid "Spoilers ahead!"
+msgstr "Увага, спойлери!"
+
+#: bookwyrm/templates/snippets/create_status/layout.html:45
+#: bookwyrm/templates/snippets/reading_modals/form.html:7
+msgid "Comment:"
+msgstr "Коментар:"
+
+#: bookwyrm/templates/snippets/create_status/post_options_block.html:19
+msgid "Update"
+msgstr "Оновити"
+
+#: bookwyrm/templates/snippets/create_status/post_options_block.html:21
+msgid "Post"
+msgstr "Опублікувати"
+
+#: bookwyrm/templates/snippets/create_status/quotation.html:16
+msgid "Quote:"
+msgstr "Цитата:"
+
+#: bookwyrm/templates/snippets/create_status/quotation.html:24
+#, python-format
+msgid "An excerpt from '%(book_title)s'"
+msgstr "Уривок з '%(book_title)s'"
+
+#: bookwyrm/templates/snippets/create_status/quotation.html:31
+msgid "Position:"
+msgstr "Місце у книзі:"
+
+#: bookwyrm/templates/snippets/create_status/quotation.html:44
+msgid "On page:"
+msgstr "Сторінка:"
+
+#: bookwyrm/templates/snippets/create_status/quotation.html:50
+msgid "At percent:"
+msgstr "Відсоток:"
+
+#: bookwyrm/templates/snippets/create_status/quotation.html:69
+msgid "to"
+msgstr "по"
+
+#: bookwyrm/templates/snippets/create_status/review.html:24
+#, python-format
+msgid "Your review of '%(book_title)s'"
+msgstr "Ваша рецензія на '%(book_title)s'"
+
+#: bookwyrm/templates/snippets/create_status/review.html:39
+msgid "Review:"
+msgstr "Рецензія:"
+
+#: bookwyrm/templates/snippets/fav_button.html:16
+#: bookwyrm/templates/snippets/fav_button.html:17
+msgid "Like"
+msgstr "Подобається"
+
+#: bookwyrm/templates/snippets/fav_button.html:30
+#: bookwyrm/templates/snippets/fav_button.html:31
+msgid "Un-like"
+msgstr "Прибрати лайк"
+
+#: bookwyrm/templates/snippets/filters_panel/filters_panel.html:5
+msgid "Filters"
+msgstr "Фільтри"
+
+#: bookwyrm/templates/snippets/filters_panel/filters_panel.html:10
+#: bookwyrm/templates/snippets/filters_panel/filters_panel.html:17
+msgid "Filters are applied"
+msgstr "Застосовано фільтри"
+
+#: bookwyrm/templates/snippets/filters_panel/filters_panel.html:20
+msgid "Clear filters"
+msgstr "Скинути фільтри"
+
+#: bookwyrm/templates/snippets/filters_panel/filters_panel.html:43
+msgid "Apply filters"
+msgstr "Застосувати фільтри"
+
+#: bookwyrm/templates/snippets/follow_button.html:20
+#, python-format
+msgid "Follow @%(username)s"
+msgstr "Підписатися на @%(username)s"
+
+#: bookwyrm/templates/snippets/follow_button.html:22
+msgid "Follow"
+msgstr "Підписатися"
+
+#: bookwyrm/templates/snippets/follow_button.html:31
+msgid "Undo follow request"
+msgstr "Скасувати запит на підписку"
+
+#: bookwyrm/templates/snippets/follow_button.html:36
+#, python-format
+msgid "Unfollow @%(username)s"
+msgstr "Відписатися від @%(username)s"
+
+#: bookwyrm/templates/snippets/follow_button.html:38
+msgid "Unfollow"
+msgstr "Відписатися"
+
+#: bookwyrm/templates/snippets/follow_request_buttons.html:7
+#: bookwyrm/templates/snippets/join_invitation_buttons.html:9
+msgid "Accept"
+msgstr "Прийняти"
+
+#: bookwyrm/templates/snippets/footer.html:16
+msgid "Documentation"
+msgstr "Документація"
+
+#: bookwyrm/templates/snippets/footer.html:42
+#, python-format
+msgid "Support %(site_name)s on %(support_title)s"
+msgstr "Підтримати %(site_name)s на %(support_title)s"
+
+#: bookwyrm/templates/snippets/footer.html:49
+msgid "BookWyrm's source code is freely available. You can contribute or report issues on GitHub."
+msgstr "Код BookWyrm знаходиться у вільному доступі. Ви можете долучитися до розробки або повідомити про проблеми на GitHub."
+
+#: bookwyrm/templates/snippets/form_rate_stars.html:20
+#: bookwyrm/templates/snippets/stars.html:23
+msgid "No rating"
+msgstr "Без оцінки"
+
+#: 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 зірка"
+msgstr[1] "%(half_rating)s зірок"
+msgstr[2] "%(half_rating)s зірок"
+msgstr[3] "%(half_rating)s зірок"
+
+#: 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 зірка"
+msgstr[1] "%(rating)s зірок"
+msgstr[2] "%(rating)s зірок"
+msgstr[3] "%(rating)s зірок"
+
+#: 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] "поставив(-ла) ціль прочитати %(counter)s книгу в %(year)s"
+msgstr[1] "поставив(-ла) ціль прочитати %(counter)s книг в %(year)s"
+msgstr[2] "поставив(-ла) ціль прочитати %(counter)s книг в %(year)s"
+msgstr[3] "поставив(-ла) ціль прочитати %(counter)s книг в %(year)s"
+
+#: 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] "оцінив(-ла) %(title)s: %(display_rating)s зірка"
+msgstr[1] "оцінив(-ла) %(title)s: %(display_rating)s зірки"
+msgstr[2] "оцінив(-ла) %(title)s: %(display_rating)s зірок"
+msgstr[3] "оцінив(-ла) %(title)s: %(display_rating)s зірок"
+
+#: 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] "Рецензія на \"%(book_title)s\" (%(display_rating)s зірка): %(review_title)s"
+msgstr[1] "Рецензія на \"%(book_title)s\" (%(display_rating)s зірки): %(review_title)s"
+msgstr[2] "Рецензія на \"%(book_title)s\" (%(display_rating)s зірок): %(review_title)s"
+msgstr[3] "Рецензія на \"%(book_title)s\" (%(display_rating)s зірок): %(review_title)s"
+
+#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:12
+#, python-format
+msgid "Review of \"%(book_title)s\": %(review_title)s"
+msgstr "Рецензія на \"%(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 "Встановіть мету, скільки книг ви хочете прочитати в %(year)s та відстежуйте прогрес протягом року."
+
+#: bookwyrm/templates/snippets/goal_form.html:16
+msgid "Reading goal:"
+msgstr "Мета читання:"
+
+#: bookwyrm/templates/snippets/goal_form.html:21
+msgid "books"
+msgstr "книг"
+
+#: bookwyrm/templates/snippets/goal_form.html:26
+msgid "Goal privacy:"
+msgstr "Приватність мети:"
+
+#: bookwyrm/templates/snippets/goal_form.html:33
+#: bookwyrm/templates/snippets/reading_modals/layout.html:13
+msgid "Post to feed"
+msgstr "Опублікувати у стрічці"
+
+#: bookwyrm/templates/snippets/goal_form.html:37
+msgid "Set goal"
+msgstr "Встановити мету"
+
+#: bookwyrm/templates/snippets/goal_progress.html:7
+msgctxt "Goal successfully completed"
+msgid "Success!"
+msgstr "Успіх!"
+
+#: bookwyrm/templates/snippets/goal_progress.html:9
+#, python-format
+msgid "%(percent)s%% complete!"
+msgstr "%(percent)s%% завершено!"
+
+#: bookwyrm/templates/snippets/goal_progress.html:12
+#, python-format
+msgid "You've read %(read_count)s of %(goal_count)s books."
+msgstr "Ви прочитали %(read_count)s з %(goal_count)s книг."
+
+#: 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 прочитав(-ла) %(read_count)s з %(goal_count)s книг."
+
+#: bookwyrm/templates/snippets/move_user_buttons.html:10
+msgid "Follow at new account"
+msgstr "Підписатися на новий акаунт"
+
+#: bookwyrm/templates/snippets/moved_user_notice.html:7
+#, python-format
+msgid "%(user)s has moved to %(moved_to_name)s"
+msgstr ""
+
+#: bookwyrm/templates/snippets/page_text.html:8
+#, python-format
+msgid "page %(page)s of %(total_pages)s"
+msgstr "сторінка %(page)s з %(total_pages)s"
+
+#: bookwyrm/templates/snippets/page_text.html:14
+#, python-format
+msgid "page %(page)s"
+msgstr "сторінка %(page)s"
+
+#: bookwyrm/templates/snippets/pagination.html:13
+msgid "Newer"
+msgstr "Новіші"
+
+#: bookwyrm/templates/snippets/pagination.html:15
+msgid "Previous"
+msgstr "Попередня"
+
+#: bookwyrm/templates/snippets/pagination.html:28
+msgid "Older"
+msgstr "Давніші"
+
+#: bookwyrm/templates/snippets/privacy-icons.html:12
+msgid "Followers-only"
+msgstr "Лише для підписників"
+
+#: bookwyrm/templates/snippets/rate_action.html:5
+msgid "Leave a rating"
+msgstr "Поставити рейтинг"
+
+#: bookwyrm/templates/snippets/rate_action.html:20
+msgid "Rate"
+msgstr "Оцінити"
+
+#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:6
+#, python-format
+msgid "Finish \"%(book_title)s\""
+msgstr "Відмітити \"%(book_title)s\" як прочитане"
+
+#: bookwyrm/templates/snippets/reading_modals/form.html:9
+msgid "(Optional)"
+msgstr "(Необов'язково)"
+
+#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:6
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:61
+msgid "Update progress"
+msgstr "Оновити прогрес"
+
+#: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:6
+#, python-format
+msgid "Start \"%(book_title)s\""
+msgstr "Почати читати \"%(book_title)s\""
+
+#: bookwyrm/templates/snippets/reading_modals/stop_reading_modal.html:6
+#, python-format
+msgid "Stop Reading \"%(book_title)s\""
+msgstr "Припинити Читати \"%(book_title)s\""
+
+#: bookwyrm/templates/snippets/reading_modals/stop_reading_modal.html:32
+#: bookwyrm/templates/snippets/shelf_selector.html:53
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:21
+msgid "Stopped reading"
+msgstr "Читання зупинено"
+
+#: bookwyrm/templates/snippets/reading_modals/want_to_read_modal.html:6
+#, python-format
+msgid "Want to Read \"%(book_title)s\""
+msgstr "Хочу Прочитати \"%(book_title)s\""
+
+#: bookwyrm/templates/snippets/register_form.html:18
+msgid "Choose wisely! Your username cannot be changed."
+msgstr "Обирайте уважно! Ім'я користувача не може бути змінено потім."
+
+#: bookwyrm/templates/snippets/register_form.html:66
+msgid "Sign Up"
+msgstr "Реєстрація"
+
+#: bookwyrm/templates/snippets/report_modal.html:8
+#, python-format
+msgid "Report @%(username)s's status"
+msgstr "Поскаржитись на статус @%(username)s"
+
+#: bookwyrm/templates/snippets/report_modal.html:10
+#, python-format
+msgid "Report %(domain)s link"
+msgstr "Поскаржитись на %(domain)s"
+
+#: bookwyrm/templates/snippets/report_modal.html:12
+#, python-format
+msgid "Report @%(username)s"
+msgstr "Поскаржитись на @%(username)s"
+
+#: bookwyrm/templates/snippets/report_modal.html:34
+#, python-format
+msgid "This report will be sent to %(site_name)s's moderators for review."
+msgstr "Ця скарга буде надіслана модераторам %(site_name)s на перевірку."
+
+#: bookwyrm/templates/snippets/report_modal.html:36
+msgid "Links from this domain will be removed until your report has been reviewed."
+msgstr "Посилання на цей домен будуть видалені, поки ваша скарга не буде розглянута."
+
+#: bookwyrm/templates/snippets/report_modal.html:41
+msgid "More info about this report:"
+msgstr "Опишіть детальніше вашу скаргу:"
+
+#: bookwyrm/templates/snippets/shelf_selector.html:7
+msgid "Move book"
+msgstr "Перемістити книгу"
+
+#: bookwyrm/templates/snippets/shelf_selector.html:38
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:17
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:33
+msgid "Start reading"
+msgstr "Почати читати"
+
+#: bookwyrm/templates/snippets/shelf_selector.html:60
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:38
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:55
+msgid "Want to read"
+msgstr "Хочу прочитати"
+
+#: bookwyrm/templates/snippets/shelf_selector.html:81
+#: bookwyrm/templates/snippets/shelf_selector.html:95
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:73
+#, python-format
+msgid "Remove from %(name)s"
+msgstr "Видалити з %(name)s"
+
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown.html:5
+msgid "More shelves"
+msgstr "Більше полиць"
+
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:31
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:48
+msgid "Stop reading"
+msgstr "Припинити читання"
+
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:40
+msgid "Finish reading"
+msgstr "Відмітити прочитаним"
+
+#: bookwyrm/templates/snippets/status/content_status.html:69
+msgid "Show status"
+msgstr "Переглянути статус"
+
+#: bookwyrm/templates/snippets/status/content_status.html:91
+#, python-format
+msgid "(Page %(page)s"
+msgstr "(Сторінка %(page)s"
+
+#: bookwyrm/templates/snippets/status/content_status.html:91
+#, python-format
+msgid "%(endpage)s"
+msgstr "%(endpage)s"
+
+#: bookwyrm/templates/snippets/status/content_status.html:93
+#, python-format
+msgid "(%(percent)s%%"
+msgstr "(%(percent)s%%"
+
+#: bookwyrm/templates/snippets/status/content_status.html:93
+#, python-format
+msgid " - %(endpercent)s%%"
+msgstr " - %(endpercent)s%%"
+
+#: bookwyrm/templates/snippets/status/content_status.html:116
+msgid "Open image in new window"
+msgstr "Відкрити зображення в новому вікні"
+
+#: bookwyrm/templates/snippets/status/content_status.html:137
+msgid "Hide status"
+msgstr "Приховати статус"
+
+#: bookwyrm/templates/snippets/status/header.html:45
+#, python-format
+msgid "edited %(date)s"
+msgstr "відредаговано %(date)s"
+
+#: bookwyrm/templates/snippets/status/headers/comment.html:8
+#, python-format
+msgid "commented on %(book)s by %(author_name)s"
+msgstr "прокоментував(-ла) %(book)s від %(author_name)s"
+
+#: bookwyrm/templates/snippets/status/headers/comment.html:15
+#, python-format
+msgid "commented on %(book)s"
+msgstr "прокоментував(-ла) %(book)s"
+
+#: bookwyrm/templates/snippets/status/headers/note.html:8
+#, python-format
+msgid "replied to %(username)s's status"
+msgstr "відповів(-ла) на статус від %(username)s"
+
+#: bookwyrm/templates/snippets/status/headers/quotation.html:8
+#, python-format
+msgid "quoted %(book)s by %(author_name)s"
+msgstr "процитував(-ла) %(book)s від %(author_name)s"
+
+#: bookwyrm/templates/snippets/status/headers/quotation.html:15
+#, python-format
+msgid "quoted %(book)s"
+msgstr "процитував(-ла) %(book)s"
+
+#: bookwyrm/templates/snippets/status/headers/rating.html:3
+#, python-format
+msgid "rated %(book)s:"
+msgstr "оцінив(-ла) %(book)s:"
+
+#: bookwyrm/templates/snippets/status/headers/read.html:10
+#, python-format
+msgid "finished reading %(book)s by %(author_name)s"
+msgstr "прочитав(-ла) %(book)s від %(author_name)s"
+
+#: bookwyrm/templates/snippets/status/headers/read.html:17
+#, python-format
+msgid "finished reading %(book)s"
+msgstr "прочитав(-ла) %(book)s"
+
+#: bookwyrm/templates/snippets/status/headers/reading.html:10
+#, python-format
+msgid "started reading %(book)s by %(author_name)s"
+msgstr "почав(-ла) читати %(book)s від %(author_name)s"
+
+#: bookwyrm/templates/snippets/status/headers/reading.html:17
+#, python-format
+msgid "started reading %(book)s"
+msgstr "почав(-ла) читати %(book)s"
+
+#: bookwyrm/templates/snippets/status/headers/review.html:8
+#, python-format
+msgid "reviewed %(book)s by %(author_name)s"
+msgstr "залишив(-ла) рецензію на %(book)s від %(author_name)s"
+
+#: bookwyrm/templates/snippets/status/headers/review.html:15
+#, python-format
+msgid "reviewed %(book)s"
+msgstr "залишив(-ла) рецензію на %(book)s"
+
+#: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10
+#, python-format
+msgid "stopped reading %(book)s by %(author_name)s"
+msgstr "припинив(-ла) читати %(book)s від %(author_name)s"
+
+#: bookwyrm/templates/snippets/status/headers/stopped_reading.html:17
+#, python-format
+msgid "stopped reading %(book)s"
+msgstr "припинив(-ла) читати %(book)s"
+
+#: bookwyrm/templates/snippets/status/headers/to_read.html:10
+#, python-format
+msgid "wants to read %(book)s by %(author_name)s"
+msgstr "хоче прочитати %(book)s від %(author_name)s"
+
+#: bookwyrm/templates/snippets/status/headers/to_read.html:17
+#, python-format
+msgid "wants to read %(book)s"
+msgstr "хоче прочитати %(book)s"
+
+#: bookwyrm/templates/snippets/status/layout.html:24
+#: bookwyrm/templates/snippets/status/status_options.html:17
+msgid "Delete status"
+msgstr "Видалити статус"
+
+#: bookwyrm/templates/snippets/status/layout.html:57
+#: bookwyrm/templates/snippets/status/layout.html:58
+msgid "Boost status"
+msgstr "Поширити статус"
+
+#: bookwyrm/templates/snippets/status/layout.html:61
+#: bookwyrm/templates/snippets/status/layout.html:62
+msgid "Like status"
+msgstr "Лайкнути статус"
+
+#: bookwyrm/templates/snippets/status/status.html:10
+msgid "boosted"
+msgstr "поширив(-ла)"
+
+#: bookwyrm/templates/snippets/status/status_options.html:7
+#: bookwyrm/templates/snippets/user_options.html:7
+msgid "More options"
+msgstr "Інші опції"
+
+#: bookwyrm/templates/snippets/switch_edition_button.html:5
+msgid "Switch to this edition"
+msgstr "Переключити на це видання"
+
+#: bookwyrm/templates/snippets/table-sort-header.html:6
+msgid "Sorted ascending"
+msgstr "Відсортовано за зростанням"
+
+#: bookwyrm/templates/snippets/table-sort-header.html:10
+msgid "Sorted descending"
+msgstr "Відсортовано за спаданням"
+
+#: bookwyrm/templates/snippets/trimmed_text.html:17
+msgid "Show more"
+msgstr "Розгорнути"
+
+#: bookwyrm/templates/snippets/trimmed_text.html:35
+msgid "Show less"
+msgstr "Згорнути"
+
+#: bookwyrm/templates/snippets/user_active_tag.html:5
+msgid "Moved"
+msgstr "Переміщено"
+
+#: bookwyrm/templates/snippets/user_active_tag.html:12
+msgid "Deleted"
+msgstr "Видалено"
+
+#: bookwyrm/templates/snippets/user_active_tag.html:15
+msgid "Inactive"
+msgstr "Неактивний"
+
+#: bookwyrm/templates/two_factor_auth/two_factor_login.html:29
+msgid "2FA check"
+msgstr "Двофакторна аутентифікація"
+
+#: bookwyrm/templates/two_factor_auth/two_factor_login.html:37
+msgid "Enter the code from your authenticator app:"
+msgstr "Введіть код з вашого додатку для аутентифікації:"
+
+#: bookwyrm/templates/two_factor_auth/two_factor_login.html:41
+msgid "Confirm and Log In"
+msgstr "Підтвердити та увійти"
+
+#: bookwyrm/templates/two_factor_auth/two_factor_prompt.html:29
+msgid "2FA is available"
+msgstr "Двофакторна аутентифікація доступна"
+
+#: bookwyrm/templates/two_factor_auth/two_factor_prompt.html:34
+msgid "You can secure your account by setting up two factor authentication in your user preferences. This will require a one-time code from your phone in addition to your password each time you log in."
+msgstr "Ви можете захистити свій обліковий запис, увімкнувши двофакторну аутентифікацію в налаштуваннях. Після цього, при кожному вході в систему, треба буде вводити одноразовий код з вашого телефону разом з паролем."
+
+#: bookwyrm/templates/user/books_header.html:9
+#, python-format
+msgid "%(username)s's books"
+msgstr "книги %(username)s"
+
+#: bookwyrm/templates/user/goal.html:12
+#, python-format
+msgid "%(year)s Reading Progress"
+msgstr "Прогрес читання за %(year)s"
+
+#: bookwyrm/templates/user/goal.html:16
+msgid "Edit Goal"
+msgstr "Змінити Мету"
+
+#: bookwyrm/templates/user/goal.html:32
+#, python-format
+msgid "%(name)s hasn't set a reading goal for %(year)s."
+msgstr "%(name)s не встановив(-ла) ціль для читання на %(year)s."
+
+#: bookwyrm/templates/user/goal.html:44
+#, python-format
+msgid "Your %(year)s Books"
+msgstr "Ваші книги за %(year)s"
+
+#: bookwyrm/templates/user/goal.html:46
+#, python-format
+msgid "%(username)s's %(year)s Books"
+msgstr "Книги користувача %(username)s за %(year)s"
+
+#: bookwyrm/templates/user/groups.html:14
+msgid "Your Groups"
+msgstr "Ваші Групи"
+
+#: bookwyrm/templates/user/groups.html:16
+#, python-format
+msgid "Groups: %(username)s"
+msgstr "Групи: %(username)s"
+
+#: bookwyrm/templates/user/layout.html:59
+msgid "Follow Requests"
+msgstr "Запити на підписку"
+
+#: bookwyrm/templates/user/layout.html:83
+#: bookwyrm/templates/user/reviews_comments.html:6
+#: bookwyrm/templates/user/reviews_comments.html:12
+msgid "Reviews and Comments"
+msgstr "Відгуки та Коментарі"
+
+#: bookwyrm/templates/user/lists.html:16
+#, python-format
+msgid "Lists: %(username)s"
+msgstr "Списки: %(username)s"
+
+#: bookwyrm/templates/user/lists.html:22 bookwyrm/templates/user/lists.html:34
+msgid "Create list"
+msgstr "Створити список"
+
+#: bookwyrm/templates/user/moved.html:25
+#: bookwyrm/templates/user/user_preview.html:22
+#, python-format
+msgid "Joined %(date)s"
+msgstr "Приєднався %(date)s"
+
+#: bookwyrm/templates/user/relationships/followers.html:36
+#, python-format
+msgid "%(username)s has no followers"
+msgstr "%(username)s не має підписників"
+
+#: bookwyrm/templates/user/relationships/following.html:6
+#: bookwyrm/templates/user/relationships/following.html:11
+#: bookwyrm/templates/user/relationships/following.html:21
+#: bookwyrm/templates/user/relationships/layout.html:15
+msgid "Following"
+msgstr "Слідкує"
+
+#: bookwyrm/templates/user/relationships/following.html:30
+#, python-format
+msgid "%(username)s isn't following any users"
+msgstr "%(username)s не стежить за жодним користувачем"
+
+#: bookwyrm/templates/user/reviews_comments.html:26
+msgid "No reviews or comments yet!"
+msgstr "Жодних відгуків або коментарів!"
+
+#: bookwyrm/templates/user/user.html:20
+msgid "Edit profile"
+msgstr "Редагувати профіль"
+
+#: bookwyrm/templates/user/user.html:42
+#, python-format
+msgid "View all %(size)s"
+msgstr "Переглянути всі %(size)s"
+
+#: bookwyrm/templates/user/user.html:61
+msgid "View all books"
+msgstr "Переглянути всі книги"
+
+#: bookwyrm/templates/user/user.html:69
+#, python-format
+msgid "%(current_year)s Reading Goal"
+msgstr "Мета читання на %(current_year)s"
+
+#: bookwyrm/templates/user/user.html:76
+msgid "User Activity"
+msgstr "Діяльність користувача"
+
+#: bookwyrm/templates/user/user.html:82
+msgid "Show RSS Options"
+msgstr "Показати опції RSS"
+
+#: bookwyrm/templates/user/user.html:88
+msgid "RSS feed"
+msgstr "RSS-стрічка"
+
+#: bookwyrm/templates/user/user.html:104
+msgid "Complete feed"
+msgstr "Повна стрічка"
+
+#: bookwyrm/templates/user/user.html:109
+msgid "Reviews only"
+msgstr "Тільки рецензії"
+
+#: bookwyrm/templates/user/user.html:114
+msgid "Quotes only"
+msgstr "Тільки цитати"
+
+#: bookwyrm/templates/user/user.html:119
+msgid "Comments only"
+msgstr "Тільки коментарі"
+
+#: bookwyrm/templates/user/user.html:135
+msgid "No activities yet!"
+msgstr "Жодної активності наразі!"
+
+#: bookwyrm/templates/user/user_preview.html:26
+#, python-format
+msgid "%(display_count)s follower"
+msgid_plural "%(display_count)s followers"
+msgstr[0] "%(display_count)s підписник"
+msgstr[1] "%(display_count)s підписників"
+msgstr[2] "%(display_count)s підписників"
+msgstr[3] "%(display_count)s підписників"
+
+#: bookwyrm/templates/user/user_preview.html:31
+#, python-format
+msgid "%(counter)s following"
+msgstr "слідкує за %(counter)s "
+
+#: bookwyrm/templates/user/user_preview.html:45
+#, python-format
+msgid "%(mutuals_display)s follower you follow"
+msgid_plural "%(mutuals_display)s followers you follow"
+msgstr[0] "%(mutuals_display)s підписник, за яким ви слідкуєте"
+msgstr[1] "%(mutuals_display)s підписників, за якими ви слідкуєте"
+msgstr[2] "%(mutuals_display)s підписників, за якими ви слідкуєте"
+msgstr[3] "%(mutuals_display)s підписників, за якими ви слідкуєте"
+
+#: bookwyrm/templates/user/user_preview.html:49
+msgid "No followers you follow"
+msgstr "Немає підписників, за якими ви слідкуєте"
+
+#: bookwyrm/templates/user_menu.html:7
+msgid "View profile and more"
+msgstr "Перегляд профілю та багато іншого"
+
+#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:28
+msgid "File exceeds maximum size: 10MB"
+msgstr "Файл перевищує максимальний розмір: 10 Мб"
+
+#: bookwyrm/templatetags/list_page_tags.py:14
+#, python-format
+msgid "Book List: %(name)s"
+msgstr "Список Книг: %(name)s"
+
+#: bookwyrm/templatetags/list_page_tags.py:22
+#, python-format
+msgid "%(num)d book - by %(user)s"
+msgid_plural "%(num)d books - by %(user)s"
+msgstr[0] "%(num)d книга – від %(user)s"
+msgstr[1] "%(num)d книги – від %(user)s"
+msgstr[2] "%(num)d книг – від %(user)s"
+msgstr[3] "%(num)d книг – від %(user)s"
+
+#: bookwyrm/templatetags/utilities.py:49
+#, python-format
+msgid "%(title)s: %(subtitle)s"
+msgstr "%(title)s: %(subtitle)s"
+
+#: bookwyrm/views/rss_feed.py:35
+#, python-brace-format
+msgid "Status updates from {obj.display_name}"
+msgstr "Оновлення статусу від {obj.display_name}"
+
+#: bookwyrm/views/rss_feed.py:80
+#, python-brace-format
+msgid "Reviews from {obj.display_name}"
+msgstr "Рецензії від {obj.display_name}"
+
+#: bookwyrm/views/rss_feed.py:122
+#, python-brace-format
+msgid "Quotes from {obj.display_name}"
+msgstr "Цитати додані {obj.display_name}"
+
+#: bookwyrm/views/rss_feed.py:164
+#, python-brace-format
+msgid "Comments from {obj.display_name}"
+msgstr "Коментарі від {obj.display_name}"
+
+#: bookwyrm/views/updates.py:45
+#, python-format
+msgid "Load %(count)d unread status"
+msgid_plural "Load %(count)d unread statuses"
+msgstr[0] "Завантажено %(count)d непрочитаний статус"
+msgstr[1] "Завантажено %(count)d непрочитаних статусів"
+msgstr[2] "Завантажено %(count)d непрочитаних статусів"
+msgstr[3] "Завантажено %(count)d непрочитаних статусів"
+
diff --git a/locale/zh_Hans/LC_MESSAGES/django.mo b/locale/zh_Hans/LC_MESSAGES/django.mo
index 1d1227f80..b36564688 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 a3c31e913..3f8bd34d5 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: 2023-09-27 01:11+0000\n"
-"PO-Revision-Date: 2023-09-28 00:08\n"
+"POT-Creation-Date: 2023-12-30 23:52+0000\n"
+"PO-Revision-Date: 2024-01-02 03:12\n"
"Last-Translator: Mouse Reeve %(level)s
."
+msgstr ""
+
+#: bookwyrm/templates/403.html:15
+msgid "If you think you should have access, please speak to your BookWyrm server administrator."
+msgstr ""
+
#: bookwyrm/templates/404.html:4 bookwyrm/templates/404.html:8
msgid "Not Found"
msgstr "未找到"
@@ -476,6 +496,20 @@ msgstr "未找到"
msgid "The page you requested doesn't seem to exist!"
msgstr "你请求的页面似乎并不存在!"
+#: bookwyrm/templates/413.html:4 bookwyrm/templates/413.html:8
+msgid "File too large"
+msgstr ""
+
+#: bookwyrm/templates/413.html:9
+msgid "The file you are uploading is too large."
+msgstr ""
+
+#: bookwyrm/templates/413.html:11
+msgid "\n"
+" You you can try using a smaller file, or ask your BookWyrm server administrator to increase the DATA_UPLOAD_MAX_MEMORY_SIZE
setting.\n"
+" "
+msgstr ""
+
#: bookwyrm/templates/500.html:4
msgid "Oops!"
msgstr "哎呀!"
@@ -536,12 +570,12 @@ msgstr "%(site_name)s 的仲裁员和管理员负责维持站点运行, 执行
msgid "Moderator"
msgstr "仲裁员"
-#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:67
+#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:62
msgid "Admin"
msgstr "管理员"
#: bookwyrm/templates/about/about.html:140
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:28
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
msgid "Send direct message"
@@ -575,7 +609,7 @@ msgid "Software version:"
msgstr "软件版本:"
#: bookwyrm/templates/about/layout.html:30
-#: bookwyrm/templates/embed-layout.html:33
+#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/snippets/footer.html:8
#, python-format
msgid "About %(site_name)s"
@@ -678,7 +712,7 @@ msgstr "TA 今年阅读最短的…"
#: bookwyrm/templates/annual_summary/layout.html:157
#: bookwyrm/templates/annual_summary/layout.html:178
#: bookwyrm/templates/annual_summary/layout.html:247
-#: bookwyrm/templates/book/book.html:63
+#: bookwyrm/templates/book/book.html:65
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
@@ -764,24 +798,24 @@ msgid "View ISNI record"
msgstr "查看 ISNI 记录"
#: bookwyrm/templates/author/author.html:95
-#: bookwyrm/templates/book/book.html:173
+#: bookwyrm/templates/book/book.html:175
msgid "View on ISFDB"
msgstr "在 ISFDB 查看"
#: bookwyrm/templates/author/author.html:100
#: bookwyrm/templates/author/sync_modal.html:5
-#: bookwyrm/templates/book/book.html:140
+#: bookwyrm/templates/book/book.html:142
#: bookwyrm/templates/book/sync_modal.html:5
msgid "Load data"
msgstr "加载数据"
#: bookwyrm/templates/author/author.html:104
-#: bookwyrm/templates/book/book.html:144
+#: bookwyrm/templates/book/book.html:146
msgid "View on OpenLibrary"
msgstr "在 OpenLibrary 查看"
#: bookwyrm/templates/author/author.html:119
-#: bookwyrm/templates/book/book.html:158
+#: bookwyrm/templates/book/book.html:160
msgid "View on Inventaire"
msgstr "在 Inventaire 查看"
@@ -793,11 +827,7 @@ msgstr "在 LibraryThing 查看"
msgid "View on Goodreads"
msgstr "在 Goodreads 查看"
-#: bookwyrm/templates/author/author.html:151
-msgid "View ISFDB entry"
-msgstr "查看 ISFDB 条目"
-
-#: bookwyrm/templates/author/author.html:166
+#: bookwyrm/templates/author/author.html:158
#, python-format
msgid "Books by %(name)s"
msgstr "%(name)s 所著的书"
@@ -906,7 +936,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:89
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save"
@@ -955,19 +985,19 @@ msgstr "确认"
msgid "Unable to connect to remote source."
msgstr "无法联系远程资源。"
-#: bookwyrm/templates/book/book.html:71 bookwyrm/templates/book/book.html:72
+#: bookwyrm/templates/book/book.html:73 bookwyrm/templates/book/book.html:74
msgid "Edit Book"
msgstr "编辑书目"
-#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:100
+#: bookwyrm/templates/book/book.html:99 bookwyrm/templates/book/book.html:102
msgid "Click to add cover"
msgstr "点击添加封面"
-#: bookwyrm/templates/book/book.html:106
+#: bookwyrm/templates/book/book.html:108
msgid "Failed to load cover"
msgstr "加载封面失败"
-#: bookwyrm/templates/book/book.html:117
+#: bookwyrm/templates/book/book.html:119
msgid "Click to enlarge"
msgstr "点击放大"
@@ -1040,13 +1070,13 @@ msgstr "地点"
#: bookwyrm/templates/guided_tour/lists.html:14
#: bookwyrm/templates/guided_tour/user_books.html:102
#: bookwyrm/templates/guided_tour/user_profile.html:78
-#: bookwyrm/templates/layout.html:90 bookwyrm/templates/lists/curate.html:8
+#: bookwyrm/templates/layout.html:88 bookwyrm/templates/lists/curate.html:8
#: bookwyrm/templates/lists/list.html:12 bookwyrm/templates/lists/lists.html:5
#: bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:26
#: bookwyrm/templates/search/layout.html:51
#: bookwyrm/templates/settings/celery.html:77
-#: bookwyrm/templates/user/layout.html:91 bookwyrm/templates/user/lists.html:6
+#: bookwyrm/templates/user/layout.html:101 bookwyrm/templates/user/lists.html:6
msgid "Lists"
msgstr "列表"
@@ -1111,8 +1141,8 @@ msgstr "上传封面:"
#: bookwyrm/templates/book/cover_add_modal.html:23
#: bookwyrm/templates/book/edit/edit_book_form.html:250
-msgid "Load cover from url:"
-msgstr "从网址加载封面:"
+msgid "Load cover from URL:"
+msgstr ""
#: bookwyrm/templates/book/cover_show_modal.html:6
msgid "Book cover preview"
@@ -1322,7 +1352,7 @@ msgid "Add Another Author"
msgstr "添加其他作者"
#: bookwyrm/templates/book/edit/edit_book_form.html:231
-#: bookwyrm/templates/shelf/shelf.html:147
+#: bookwyrm/templates/shelf/shelf.html:149
msgid "Cover"
msgstr "封面"
@@ -1366,8 +1396,8 @@ msgstr "%(book_title)s 的各版本"
#: bookwyrm/templates/book/editions/editions.html:8
#, python-format
-msgid "Editions of \"%(work_title)s\""
-msgstr "《%(work_title)s》 的各版本"
+msgid "Editions of %(work_title)s"
+msgstr ""
#: bookwyrm/templates/book/editions/editions.html:55
msgid "Can't find the edition you're looking for?"
@@ -1449,8 +1479,9 @@ msgstr "域名"
#: bookwyrm/templates/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
#: bookwyrm/templates/settings/invites/status_filter.html:5
+#: bookwyrm/templates/settings/themes.html:111
#: bookwyrm/templates/settings/users/user_admin.html:56
-#: bookwyrm/templates/settings/users/user_info.html:24
+#: bookwyrm/templates/settings/users/user_info.html:35
msgid "Status"
msgstr "状态"
@@ -1459,7 +1490,7 @@ msgstr "状态"
#: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/imports/imports.html:141
#: bookwyrm/templates/settings/reports/report_links_table.html:6
-#: bookwyrm/templates/settings/themes.html:99
+#: bookwyrm/templates/settings/themes.html:108
msgid "Actions"
msgstr "动作"
@@ -1523,22 +1554,22 @@ msgstr "%(pages)s 页"
msgid "%(languages)s language"
msgstr "%(languages)s 语言"
-#: bookwyrm/templates/book/publisher_info.html:65
+#: bookwyrm/templates/book/publisher_info.html:63
#, python-format
msgid "Published %(date)s by %(publisher)s."
msgstr "%(publisher)s 于 %(date)s 出版。"
+#: bookwyrm/templates/book/publisher_info.html:65
+#, python-format
+msgid "Published by %(publisher)s."
+msgstr "%(publisher)s 出版。"
+
#: bookwyrm/templates/book/publisher_info.html:67
#, python-format
msgid "Published %(date)s"
msgstr "于 %(date)s 出版"
-#: bookwyrm/templates/book/publisher_info.html:69
-#, python-format
-msgid "Published by %(publisher)s."
-msgstr "%(publisher)s 出版。"
-
-#: bookwyrm/templates/book/rating.html:13
+#: bookwyrm/templates/book/rating.html:19
msgid "rated it"
msgstr "评价了"
@@ -1546,12 +1577,12 @@ msgstr "评价了"
msgid "Series by"
msgstr ""
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
#, python-format
msgid "Book %(series_number)s"
msgstr ""
-#: bookwyrm/templates/book/series.html:27
+#: bookwyrm/templates/book/series.html:28
msgid "Unsorted Book"
msgstr ""
@@ -1675,6 +1706,7 @@ msgstr "受推荐"
#: bookwyrm/templates/ostatus/subscribe.html:42
#: bookwyrm/templates/ostatus/success.html:17
#: bookwyrm/templates/ostatus/success.html:18
+#: bookwyrm/templates/user/moved.html:19 bookwyrm/templates/user/moved.html:20
#: bookwyrm/templates/user/user_preview.html:16
#: bookwyrm/templates/user/user_preview.html:17
msgid "Locked account"
@@ -1747,7 +1779,7 @@ msgstr "%(username)s 引用了 %(username)s"
msgstr "与 %(username)s 私信"
#: bookwyrm/templates/feed/direct_messages.html:10
-#: bookwyrm/templates/user_menu.html:44
+#: bookwyrm/templates/user_menu.html:39
msgid "Direct Messages"
msgstr "私信"
@@ -1940,7 +1972,7 @@ msgstr "更新"
#: bookwyrm/templates/feed/suggested_books.html:6
#: bookwyrm/templates/guided_tour/home.html:127
-#: bookwyrm/templates/user_menu.html:39
+#: bookwyrm/templates/layout.html:94
msgid "Your Books"
msgstr "你的书目"
@@ -1988,19 +2020,19 @@ msgid "Add to your books"
msgstr "添加到您的书籍中"
#: bookwyrm/templates/get_started/book_preview.html:10
-#: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37
+#: bookwyrm/templates/shelf/shelf.html:88 bookwyrm/templates/user/user.html:37
#: bookwyrm/templatetags/shelf_tags.py:14
msgid "To Read"
msgstr "想读"
#: bookwyrm/templates/get_started/book_preview.html:11
-#: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38
+#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:38
#: bookwyrm/templatetags/shelf_tags.py:15
msgid "Currently Reading"
msgstr "在读"
#: bookwyrm/templates/get_started/book_preview.html:12
-#: bookwyrm/templates/shelf/shelf.html:88
+#: bookwyrm/templates/shelf/shelf.html:90
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
@@ -2009,7 +2041,7 @@ msgid "Read"
msgstr "读过"
#: bookwyrm/templates/get_started/book_preview.html:13
-#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40
+#: bookwyrm/templates/shelf/shelf.html:91 bookwyrm/templates/user/user.html:40
#: bookwyrm/templatetags/shelf_tags.py:17
msgid "Stopped Reading"
msgstr "已停止阅读"
@@ -2019,7 +2051,7 @@ msgid "What are you reading?"
msgstr "你在阅读什么?"
#: bookwyrm/templates/get_started/books.html:9
-#: bookwyrm/templates/layout.html:39 bookwyrm/templates/lists/list.html:213
+#: bookwyrm/templates/layout.html:41 bookwyrm/templates/lists/list.html:213
msgid "Search for a book"
msgstr "搜索书目"
@@ -2038,8 +2070,8 @@ msgstr "你可以在开始使用 %(site_name)s 后添加书目。"
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:15
-#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:45
-#: bookwyrm/templates/layout.html:46 bookwyrm/templates/lists/list.html:217
+#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:47
+#: bookwyrm/templates/layout.html:48 bookwyrm/templates/lists/list.html:217
#: bookwyrm/templates/search/layout.html:5
#: bookwyrm/templates/search/layout.html:10
#: bookwyrm/templates/search/layout.html:32
@@ -2504,7 +2536,7 @@ msgid "Barcode reader"
msgstr "条形码读取器"
#: bookwyrm/templates/guided_tour/home.html:102
-msgid "Use the Feed, Lists and Discover links to discover the latest news from your feed, lists of books by topic, and the latest happenings on this Bookwyrm server!"
+msgid "Use the Lists, Discover, and Your Books links to discover reading suggestions and the latest happenings on this server, or to see your catalogued books!"
msgstr ""
#: bookwyrm/templates/guided_tour/home.html:103
@@ -2528,15 +2560,15 @@ msgid "The bell will light up when you have a new notification. When it does, cl
msgstr ""
#: bookwyrm/templates/guided_tour/home.html:177
-#: bookwyrm/templates/layout.html:75 bookwyrm/templates/layout.html:106
-#: bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:77 bookwyrm/templates/layout.html:107
+#: bookwyrm/templates/layout.html:108
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr "通知"
#: bookwyrm/templates/guided_tour/home.html:200
-msgid "Your profile, books, direct messages, and settings can be accessed by clicking on your name in the menu here."
+msgid "Your profile, user directory, direct messages, and settings can be accessed by clicking on your name in the menu here."
msgstr ""
#: bookwyrm/templates/guided_tour/home.html:200
@@ -2692,7 +2724,7 @@ msgstr "您可以与其他用户创建或加入一个群组。 群组可以共
#: bookwyrm/templates/guided_tour/user_groups.html:11
#: bookwyrm/templates/guided_tour/user_profile.html:55
-#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:85
+#: bookwyrm/templates/user/groups.html:6 bookwyrm/templates/user/layout.html:95
msgid "Groups"
msgstr "群组"
@@ -2737,7 +2769,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr ""
#: bookwyrm/templates/guided_tour/user_profile.html:11
-#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:14
+#: bookwyrm/templates/user/layout.html:20 bookwyrm/templates/user/user.html:14
msgid "User Profile"
msgstr "用户个人资料"
@@ -2746,7 +2778,7 @@ msgid "This tab shows everything you have read towards your annual reading goal,
msgstr ""
#: bookwyrm/templates/guided_tour/user_profile.html:32
-#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:79
+#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:89
msgid "Reading Goal"
msgstr "阅读目标"
@@ -2785,7 +2817,7 @@ msgstr ""
#: bookwyrm/templates/import/import.html:5
#: bookwyrm/templates/import/import.html:9
-#: bookwyrm/templates/shelf/shelf.html:64
+#: bookwyrm/templates/shelf/shelf.html:66
msgid "Import Books"
msgstr "导入书目"
@@ -2795,12 +2827,8 @@ msgstr ""
#: bookwyrm/templates/import/import.html:21
#, python-format
-msgid "\n"
-" Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day.\n"
-" "
-msgid_plural "\n"
-" Currently, you are allowed to import %(import_size_limit)s books every %(import_limit_reset)s days.\n"
-" "
+msgid "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s day."
+msgid_plural "Currently, you are allowed to import %(display_size)s books every %(import_limit_reset)s days."
msgstr[0] ""
#: bookwyrm/templates/import/import.html:27
@@ -2860,7 +2888,7 @@ msgstr "导入书评的隐私设定"
#: bookwyrm/templates/import/import.html:106
#: bookwyrm/templates/import/import.html:108
-#: bookwyrm/templates/preferences/layout.html:35
+#: bookwyrm/templates/preferences/layout.html:43
#: bookwyrm/templates/settings/federation/instance_blocklist.html:78
msgid "Import"
msgstr "导入"
@@ -2957,8 +2985,8 @@ msgid "Row"
msgstr "行"
#: bookwyrm/templates/import/import_status.html:110
-#: bookwyrm/templates/shelf/shelf.html:148
-#: bookwyrm/templates/shelf/shelf.html:170
+#: bookwyrm/templates/shelf/shelf.html:150
+#: bookwyrm/templates/shelf/shelf.html:172
msgid "Title"
msgstr "标题"
@@ -2971,8 +2999,8 @@ msgid "Openlibrary key"
msgstr "Openlibrary key"
#: bookwyrm/templates/import/import_status.html:121
-#: bookwyrm/templates/shelf/shelf.html:149
-#: bookwyrm/templates/shelf/shelf.html:173
+#: bookwyrm/templates/shelf/shelf.html:151
+#: bookwyrm/templates/shelf/shelf.html:175
msgid "Author"
msgstr "作者"
@@ -3078,10 +3106,6 @@ msgstr "如果您看到意外失败的项目,请联系您的管理员或 You have moved your account to %(username)s"
+msgstr ""
+
+#: bookwyrm/templates/moved.html:32
+msgid "You can undo the move to restore full functionality, but some followers may have already unfollowed this account."
+msgstr ""
+
+#: bookwyrm/templates/moved.html:42
+msgid "Undo move"
+msgstr ""
+
+#: bookwyrm/templates/moved.html:46 bookwyrm/templates/user_menu.html:77
+msgid "Log out"
+msgstr "登出"
+
#: bookwyrm/templates/notifications/items/accept.html:18
#, python-format
msgid "%(related_user)s accepted your invitation to join group \"%(group_name)s\""
@@ -3686,6 +3728,12 @@ msgstr "你的 导入 已完成。"
msgid "%(related_user)s invited you to join the group \"%(group_name)s\""
msgstr ""
+#: bookwyrm/templates/notifications/items/invite_request.html:15
+#, python-format
+msgid "New invite request awaiting response"
+msgid_plural "%(display_count)s new invite requests awaiting response"
+msgstr[0] ""
+
#: bookwyrm/templates/notifications/items/join.html:16
#, python-format
msgid "has joined your group \"%(group_name)s\""
@@ -3732,6 +3780,16 @@ msgstr ""
msgid "%(related_user)s mentioned you in a status"
msgstr ""
+#: bookwyrm/templates/notifications/items/move_user.html:18
+#, python-format
+msgid "%(related_user)s has moved to %(username)s"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/move_user.html:25
+#, python-format
+msgid "%(related_user)s has undone their move"
+msgstr ""
+
#: bookwyrm/templates/notifications/items/remove.html:17
#, python-format
msgid "has been removed from your group \"%(group_name)s\""
@@ -3769,7 +3827,7 @@ msgid_plural "%(display_count)s new reports need modera
msgstr[0] ""
#: bookwyrm/templates/notifications/items/status_preview.html:4
-#: bookwyrm/templates/snippets/status/content_status.html:73
+#: bookwyrm/templates/snippets/status/content_status.html:62
msgid "Content warning"
msgstr "内容警告"
@@ -3987,9 +4045,51 @@ msgstr "确认密码以开始设置双重身份验证。"
msgid "Set up 2FA"
msgstr "设置双重身份验证"
+#: bookwyrm/templates/preferences/alias_user.html:4
+#: bookwyrm/templates/preferences/move_user.html:4
+#: bookwyrm/templates/preferences/move_user.html:7
+#: bookwyrm/templates/preferences/move_user.html:39
+msgid "Move Account"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:7
+#: bookwyrm/templates/preferences/alias_user.html:34
+msgid "Create Alias"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:12
+msgid "Add another account as an alias"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:16
+msgid "Marking another account as an alias is required if you want to move that account to this one."
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:19
+msgid "This is a reversable action and will not change the functionality of this account."
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:25
+msgid "Enter the username for the account you want to add as an alias e.g. user@example.com :"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:30
+#: bookwyrm/templates/preferences/move_user.html:35
+msgid "Confirm your password:"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:39
+#: bookwyrm/templates/preferences/layout.html:28
+msgid "Aliases"
+msgstr ""
+
+#: bookwyrm/templates/preferences/alias_user.html:49
+msgid "Remove alias"
+msgstr ""
+
#: bookwyrm/templates/preferences/blocks.html:4
#: bookwyrm/templates/preferences/blocks.html:7
-#: bookwyrm/templates/preferences/layout.html:46
+#: bookwyrm/templates/preferences/layout.html:54
msgid "Blocked Users"
msgstr "屏蔽的用户"
@@ -4019,7 +4119,7 @@ msgstr "新密码:"
#: bookwyrm/templates/preferences/delete_user.html:4
#: bookwyrm/templates/preferences/delete_user.html:7
#: bookwyrm/templates/preferences/delete_user.html:40
-#: bookwyrm/templates/preferences/layout.html:28
+#: bookwyrm/templates/preferences/layout.html:36
#: bookwyrm/templates/settings/users/delete_user_form.html:22
msgid "Delete Account"
msgstr "删除帐号"
@@ -4064,7 +4164,7 @@ msgstr "编辑个人资料"
#: bookwyrm/templates/preferences/edit_user.html:12
#: bookwyrm/templates/preferences/edit_user.html:25
-#: bookwyrm/templates/settings/users/user_info.html:7
+#: bookwyrm/templates/settings/users/user_info.html:8
#: bookwyrm/templates/user_menu.html:29
msgid "Profile"
msgstr "个人资料"
@@ -4141,18 +4241,45 @@ msgstr "下载文件"
msgid "Account"
msgstr "帐号"
-#: bookwyrm/templates/preferences/layout.html:31
+#: bookwyrm/templates/preferences/layout.html:32
+msgid "Move Account"
+msgstr ""
+
+#: bookwyrm/templates/preferences/layout.html:39
msgid "Data"
msgstr "数据"
-#: bookwyrm/templates/preferences/layout.html:39
+#: bookwyrm/templates/preferences/layout.html:47
msgid "CSV export"
msgstr "CSV 导出"
-#: bookwyrm/templates/preferences/layout.html:42
+#: bookwyrm/templates/preferences/layout.html:50
msgid "Relationships"
msgstr "关系"
+#: bookwyrm/templates/preferences/move_user.html:12
+msgid "Migrate account to another server"
+msgstr ""
+
+#: bookwyrm/templates/preferences/move_user.html:16
+msgid "Moving your account will notify all your followers and direct them to follow the new account."
+msgstr ""
+
+#: bookwyrm/templates/preferences/move_user.html:19
+#, python-format
+msgid "\n"
+" %(user)s will be marked as moved and will not be discoverable or usable unless you undo the move.\n"
+" "
+msgstr ""
+
+#: bookwyrm/templates/preferences/move_user.html:25
+msgid "Remember to add this user as an alias of the target account before you try to move."
+msgstr ""
+
+#: bookwyrm/templates/preferences/move_user.html:30
+msgid "Enter the username for the account you want to move to e.g. user@example.com :"
+msgstr ""
+
#: bookwyrm/templates/reading_progress/finish.html:5
#, python-format
msgid "Finish \"%(book_title)s\""
@@ -4559,7 +4686,7 @@ msgid "Streams"
msgstr ""
#: bookwyrm/templates/settings/celery.html:32
-msgid "Broadcasts"
+msgid "Broadcast"
msgstr ""
#: bookwyrm/templates/settings/celery.html:38
@@ -4906,7 +5033,7 @@ msgid "Details"
msgstr "详细"
#: bookwyrm/templates/settings/federation/instance.html:53
-#: bookwyrm/templates/user/layout.html:69
+#: bookwyrm/templates/user/layout.html:79
msgid "Activity"
msgstr "活动"
@@ -5094,7 +5221,7 @@ msgstr "邀请请求"
#: bookwyrm/templates/settings/invites/manage_invites.html:3
#: bookwyrm/templates/settings/invites/manage_invites.html:15
#: bookwyrm/templates/settings/layout.html:42
-#: bookwyrm/templates/user_menu.html:60
+#: bookwyrm/templates/user_menu.html:55
msgid "Invites"
msgstr "邀请"
@@ -5568,57 +5695,73 @@ msgid "Set instance default theme"
msgstr "设置实例默认主题"
#: bookwyrm/templates/settings/themes.html:19
+msgid "One of your themes appears to be broken. Selecting this theme will make the application unusable."
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:28
msgid "Successfully added theme"
msgstr "主题添加成功"
-#: bookwyrm/templates/settings/themes.html:26
+#: bookwyrm/templates/settings/themes.html:35
msgid "How to add a theme"
msgstr "如何添加一个主题"
-#: bookwyrm/templates/settings/themes.html:29
+#: bookwyrm/templates/settings/themes.html:38
msgid "Copy the theme file into the bookwyrm/static/css/themes
directory on your server from the command line."
msgstr "从命令行将主题文件复制到您服务器上的 bookwym/static/css/themes
目录。"
-#: bookwyrm/templates/settings/themes.html:32
+#: bookwyrm/templates/settings/themes.html:41
msgid "Run ./bw-dev compile_themes
and ./bw-dev collectstatic
."
msgstr ""
-#: bookwyrm/templates/settings/themes.html:35
+#: bookwyrm/templates/settings/themes.html:44
msgid "Add the file name using the form below to make it available in the application interface."
msgstr "使用下面的表格添加文件名以便在应用程序接口中可用。"
-#: bookwyrm/templates/settings/themes.html:42
-#: bookwyrm/templates/settings/themes.html:82
+#: bookwyrm/templates/settings/themes.html:51
+#: bookwyrm/templates/settings/themes.html:91
msgid "Add theme"
msgstr "添加主题"
-#: bookwyrm/templates/settings/themes.html:48
+#: bookwyrm/templates/settings/themes.html:57
msgid "Unable to save theme"
msgstr "无法保存主题"
-#: bookwyrm/templates/settings/themes.html:63
-#: bookwyrm/templates/settings/themes.html:93
+#: bookwyrm/templates/settings/themes.html:72
+#: bookwyrm/templates/settings/themes.html:102
msgid "Theme name"
msgstr "主题名称"
-#: bookwyrm/templates/settings/themes.html:73
+#: bookwyrm/templates/settings/themes.html:82
msgid "Theme filename"
msgstr "主题文件名"
-#: bookwyrm/templates/settings/themes.html:88
+#: bookwyrm/templates/settings/themes.html:97
msgid "Available Themes"
msgstr "可用的主题"
-#: bookwyrm/templates/settings/themes.html:96
+#: bookwyrm/templates/settings/themes.html:105
msgid "File"
msgstr "文件"
-#: bookwyrm/templates/settings/themes.html:111
+#: bookwyrm/templates/settings/themes.html:123
msgid "Remove theme"
msgstr "删除主题"
+#: bookwyrm/templates/settings/themes.html:134
+msgid "Test theme"
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:143
+msgid "Broken theme"
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:152
+msgid "Loaded successfully"
+msgstr ""
+
#: bookwyrm/templates/settings/users/delete_user_form.html:5
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:38
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:52
msgid "Permanently delete user"
msgstr "永久删除用户"
@@ -5657,25 +5800,20 @@ msgstr "最后或缺"
msgid "Remote instance"
msgstr "移除服务器"
-#: bookwyrm/templates/settings/users/user_admin.html:86
-msgid "Deleted"
-msgstr "已删除"
-
-#: bookwyrm/templates/settings/users/user_admin.html:92
-#: bookwyrm/templates/settings/users/user_info.html:32
-msgid "Inactive"
-msgstr "停用"
-
-#: bookwyrm/templates/settings/users/user_admin.html:101
+#: bookwyrm/templates/settings/users/user_admin.html:84
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr "未设置"
-#: bookwyrm/templates/settings/users/user_info.html:16
+#: bookwyrm/templates/settings/users/user_info.html:20
+msgid "This account is the instance actor for signing HTTP requests."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_info.html:24
msgid "View user profile"
msgstr "查看用户个人资料"
-#: bookwyrm/templates/settings/users/user_info.html:19
+#: bookwyrm/templates/settings/users/user_info.html:30
msgid "Go to user admin"
msgstr "转到用户管理员"
@@ -5731,27 +5869,39 @@ msgstr "实例详情"
msgid "View instance"
msgstr "查看实例"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:5
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:6
msgid "Permanently deleted"
msgstr "已永久删除"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:8
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:9
msgid "User Actions"
msgstr "用户操作"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:21
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:15
+msgid "This is the instance admin actor"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:18
+msgid "You must not delete or disable this account as it is critical to the functioning of your server. This actor signs outgoing GET requests to smooth interaction with secure ActivityPub servers."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:19
+msgid "This account is not discoverable by ordinary users and does not have a profile page."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:35
msgid "Activate user"
msgstr ""
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:27
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:41
msgid "Suspend user"
msgstr "停用用户"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:32
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:46
msgid "Un-suspend user"
msgstr "取消停用用户"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:54
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:68
msgid "Access level:"
msgstr "访问级别:"
@@ -5807,7 +5957,7 @@ msgstr "你的域名似乎配置出错了。它不应该包括协议或斜杠。
msgid "You are running BookWyrm in production mode without https. USE_HTTPS should be enabled in production."
msgstr "您正在没有https的实际使用模式下运行BookWyrm,USE_HTTPS应该在实际使用中启用。"
-#: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:49
+#: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:44
msgid "Settings"
msgstr "设置"
@@ -5864,7 +6014,7 @@ msgid "Need help?"
msgstr "需要帮助?"
#: bookwyrm/templates/shelf/create_shelf_form.html:5
-#: bookwyrm/templates/shelf/shelf.html:72
+#: bookwyrm/templates/shelf/shelf.html:74
msgid "Create shelf"
msgstr "创建书架"
@@ -5872,57 +6022,57 @@ msgstr "创建书架"
msgid "Edit Shelf"
msgstr "编辑书架"
-#: bookwyrm/templates/shelf/shelf.html:24
+#: bookwyrm/templates/shelf/shelf.html:26
#: bookwyrm/templates/user/relationships/followers.html:18
#: bookwyrm/templates/user/relationships/following.html:18
msgid "User profile"
msgstr "用户个人资料"
-#: bookwyrm/templates/shelf/shelf.html:39
+#: bookwyrm/templates/shelf/shelf.html:41
#: bookwyrm/templatetags/shelf_tags.py:13 bookwyrm/views/shelf/shelf.py:53
msgid "All books"
msgstr "所有书目"
-#: bookwyrm/templates/shelf/shelf.html:97
+#: bookwyrm/templates/shelf/shelf.html:99
#, python-format
msgid "%(formatted_count)s book"
msgid_plural "%(formatted_count)s books"
msgstr[0] "%(formatted_count)s 本书籍"
-#: bookwyrm/templates/shelf/shelf.html:104
+#: bookwyrm/templates/shelf/shelf.html:106
#, python-format
msgid "(showing %(start)s-%(end)s)"
msgstr "(正在显示 %(start)s 到 %(end)s)"
-#: bookwyrm/templates/shelf/shelf.html:116
+#: bookwyrm/templates/shelf/shelf.html:118
msgid "Edit shelf"
msgstr "编辑书架"
-#: bookwyrm/templates/shelf/shelf.html:124
+#: bookwyrm/templates/shelf/shelf.html:126
msgid "Delete shelf"
msgstr "删除书架"
-#: bookwyrm/templates/shelf/shelf.html:152
-#: bookwyrm/templates/shelf/shelf.html:178
+#: bookwyrm/templates/shelf/shelf.html:154
+#: bookwyrm/templates/shelf/shelf.html:180
msgid "Shelved"
msgstr "上架时间"
-#: bookwyrm/templates/shelf/shelf.html:153
-#: bookwyrm/templates/shelf/shelf.html:181
+#: bookwyrm/templates/shelf/shelf.html:155
+#: bookwyrm/templates/shelf/shelf.html:183
msgid "Started"
msgstr "开始时间"
-#: bookwyrm/templates/shelf/shelf.html:154
-#: bookwyrm/templates/shelf/shelf.html:184
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
msgid "Finished"
msgstr "完成时间"
-#: bookwyrm/templates/shelf/shelf.html:154
-#: bookwyrm/templates/shelf/shelf.html:184
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
msgid "Until"
msgstr "直到"
-#: bookwyrm/templates/shelf/shelf.html:210
+#: bookwyrm/templates/shelf/shelf.html:212
msgid "This shelf is empty."
msgstr "此书架是空的。"
@@ -6222,6 +6372,15 @@ msgstr "你已经阅读了 %(goal_count)s 本书中的 %(re
msgid "%(username)s has read %(read_count)s of %(goal_count)s books."
msgstr "%(username)s 已经阅读了 %(goal_count)s 本书中的 %(read_count)s 本。"
+#: bookwyrm/templates/snippets/move_user_buttons.html:10
+msgid "Follow at new account"
+msgstr ""
+
+#: bookwyrm/templates/snippets/moved_user_notice.html:7
+#, python-format
+msgid "%(user)s has moved to %(moved_to_name)s"
+msgstr ""
+
#: bookwyrm/templates/snippets/page_text.html:8
#, python-format
msgid "page %(page)s of %(total_pages)s"
@@ -6363,35 +6522,35 @@ msgstr ""
msgid "Finish reading"
msgstr "完成阅读"
-#: bookwyrm/templates/snippets/status/content_status.html:80
+#: bookwyrm/templates/snippets/status/content_status.html:69
msgid "Show status"
msgstr "显示状态"
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "(Page %(page)s"
msgstr ""
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "%(endpage)s"
msgstr ""
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid "(%(percent)s%%"
msgstr ""
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid " - %(endpercent)s%%"
msgstr ""
-#: bookwyrm/templates/snippets/status/content_status.html:127
+#: bookwyrm/templates/snippets/status/content_status.html:116
msgid "Open image in new window"
msgstr "在新窗口中打开图像"
-#: bookwyrm/templates/snippets/status/content_status.html:148
+#: bookwyrm/templates/snippets/status/content_status.html:137
msgid "Hide status"
msgstr "隐藏状态"
@@ -6524,6 +6683,18 @@ msgstr "显示更多"
msgid "Show less"
msgstr "显示更少"
+#: bookwyrm/templates/snippets/user_active_tag.html:5
+msgid "Moved"
+msgstr ""
+
+#: bookwyrm/templates/snippets/user_active_tag.html:12
+msgid "Deleted"
+msgstr "已删除"
+
+#: bookwyrm/templates/snippets/user_active_tag.html:15
+msgid "Inactive"
+msgstr "停用"
+
#: bookwyrm/templates/two_factor_auth/two_factor_login.html:29
msgid "2FA check"
msgstr "双重身份验证检查"
@@ -6582,11 +6753,11 @@ msgstr "您的群组"
msgid "Groups: %(username)s"
msgstr "群组: %(username)s"
-#: bookwyrm/templates/user/layout.html:50
+#: bookwyrm/templates/user/layout.html:59
msgid "Follow Requests"
msgstr "关注请求"
-#: bookwyrm/templates/user/layout.html:73
+#: bookwyrm/templates/user/layout.html:83
#: bookwyrm/templates/user/reviews_comments.html:6
#: bookwyrm/templates/user/reviews_comments.html:12
msgid "Reviews and Comments"
@@ -6601,7 +6772,13 @@ msgstr "列表: %(username)s"
msgid "Create list"
msgstr "创建列表"
-#: bookwyrm/templates/user/relationships/followers.html:31
+#: bookwyrm/templates/user/moved.html:25
+#: bookwyrm/templates/user/user_preview.html:22
+#, python-format
+msgid "Joined %(date)s"
+msgstr "在 %(date)s 加入"
+
+#: bookwyrm/templates/user/relationships/followers.html:36
#, python-format
msgid "%(username)s has no followers"
msgstr "%(username)s 没有关注者"
@@ -6672,11 +6849,6 @@ msgstr "仅评论"
msgid "No activities yet!"
msgstr "还没有活动!"
-#: bookwyrm/templates/user/user_preview.html:22
-#, python-format
-msgid "Joined %(date)s"
-msgstr "在 %(date)s 加入"
-
#: bookwyrm/templates/user/user_preview.html:26
#, python-format
msgid "%(display_count)s follower"
@@ -6702,10 +6874,6 @@ msgstr "没有你关注的关注者"
msgid "View profile and more"
msgstr "查看档案和其他"
-#: bookwyrm/templates/user_menu.html:82
-msgid "Log out"
-msgstr "登出"
-
#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:28
msgid "File exceeds maximum size: 10MB"
msgstr "文件超过了最大大小: 10MB"
@@ -6721,7 +6889,7 @@ msgid "%(num)d book - by %(user)s"
msgid_plural "%(num)d books - by %(user)s"
msgstr[0] "%(num)d 本书 - 来自 %(user)s"
-#: bookwyrm/templatetags/utilities.py:39
+#: bookwyrm/templatetags/utilities.py:49
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s:%(subtitle)s"
diff --git a/locale/zh_Hant/LC_MESSAGES/django.mo b/locale/zh_Hant/LC_MESSAGES/django.mo
index f9ca27be9..e9e223f74 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 a95eebec1..6b9e9a19b 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: 2023-09-27 01:11+0000\n"
-"PO-Revision-Date: 2023-09-28 00:08\n"
+"POT-Creation-Date: 2023-12-30 23:52+0000\n"
+"PO-Revision-Date: 2024-01-02 03:12\n"
"Last-Translator: Mouse Reeve %(level)s
."
+msgstr ""
+
+#: bookwyrm/templates/403.html:15
+msgid "If you think you should have access, please speak to your BookWyrm server administrator."
+msgstr ""
+
#: bookwyrm/templates/404.html:4 bookwyrm/templates/404.html:8
msgid "Not Found"
msgstr "未找到"
@@ -476,6 +496,20 @@ msgstr "未找到"
msgid "The page you requested doesn't seem to exist!"
msgstr "你請求的頁面似乎並不存在!"
+#: bookwyrm/templates/413.html:4 bookwyrm/templates/413.html:8
+msgid "File too large"
+msgstr ""
+
+#: bookwyrm/templates/413.html:9
+msgid "The file you are uploading is too large."
+msgstr ""
+
+#: bookwyrm/templates/413.html:11
+msgid "\n"
+" You you can try using a smaller file, or ask your BookWyrm server administrator to increase the DATA_UPLOAD_MAX_MEMORY_SIZE
setting.\n"
+" "
+msgstr ""
+
#: bookwyrm/templates/500.html:4
msgid "Oops!"
msgstr "哎呀!"
@@ -491,7 +525,7 @@ msgstr "某些東西出錯了!抱歉。"
#: bookwyrm/templates/about/about.html:9
#: bookwyrm/templates/about/layout.html:35
msgid "About"
-msgstr ""
+msgstr "關於"
#: bookwyrm/templates/about/about.html:21
#: bookwyrm/templates/get_started/layout.html:22
@@ -502,12 +536,12 @@ msgstr "歡迎來到 %(site_name)s!"
#: bookwyrm/templates/about/about.html:25
#, python-format
msgid "%(site_name)s is part of BookWyrm, a network of independent, self-directed communities for readers. While you can interact seamlessly with users anywhere in the BookWyrm network, this community is unique."
-msgstr ""
+msgstr "%(site_name)s 是 BookWyrm 的一部分,這是一個為讀者建立的獨立、自我導向的社區網絡。雖然您可以在 BookWyrm 網絡中任何地方的用戶無縫互動,但這個社區是獨一無二的。"
#: bookwyrm/templates/about/about.html:45
#, python-format
msgid "%(title)s is %(site_name)s's most beloved book, with an average rating of %(rating)s out of 5."
-msgstr ""
+msgstr "%(title)s 是 %(site_name)s 最受歡迎的書,平均得分為 %(rating)s(滿分五分)。"
#: bookwyrm/templates/about/about.html:64
#, python-format
@@ -536,12 +570,12 @@ msgstr ""
msgid "Moderator"
msgstr ""
-#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:67
+#: bookwyrm/templates/about/about.html:124 bookwyrm/templates/user_menu.html:62
msgid "Admin"
msgstr "管理員"
#: bookwyrm/templates/about/about.html:140
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:28
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:14
msgid "Send direct message"
@@ -575,7 +609,7 @@ msgid "Software version:"
msgstr ""
#: bookwyrm/templates/about/layout.html:30
-#: bookwyrm/templates/embed-layout.html:33
+#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/snippets/footer.html:8
#, python-format
msgid "About %(site_name)s"
@@ -678,7 +712,7 @@ msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:157
#: bookwyrm/templates/annual_summary/layout.html:178
#: bookwyrm/templates/annual_summary/layout.html:247
-#: bookwyrm/templates/book/book.html:63
+#: bookwyrm/templates/book/book.html:65
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
@@ -703,13 +737,13 @@ msgstr[0] ""
#: bookwyrm/templates/annual_summary/layout.html:211
msgid "Way to go!"
-msgstr ""
+msgstr "還不錯!"
#: bookwyrm/templates/annual_summary/layout.html:226
#, python-format
msgid "%(display_name)s left %(ratings_total)s rating, bookwyrm/static/css/themes
directory on your server from the command line."
msgstr ""
-#: bookwyrm/templates/settings/themes.html:32
+#: bookwyrm/templates/settings/themes.html:41
msgid "Run ./bw-dev compile_themes
and ./bw-dev collectstatic
."
msgstr ""
-#: bookwyrm/templates/settings/themes.html:35
+#: bookwyrm/templates/settings/themes.html:44
msgid "Add the file name using the form below to make it available in the application interface."
msgstr ""
-#: bookwyrm/templates/settings/themes.html:42
-#: bookwyrm/templates/settings/themes.html:82
+#: bookwyrm/templates/settings/themes.html:51
+#: bookwyrm/templates/settings/themes.html:91
msgid "Add theme"
msgstr ""
-#: bookwyrm/templates/settings/themes.html:48
+#: bookwyrm/templates/settings/themes.html:57
msgid "Unable to save theme"
msgstr ""
-#: bookwyrm/templates/settings/themes.html:63
-#: bookwyrm/templates/settings/themes.html:93
+#: bookwyrm/templates/settings/themes.html:72
+#: bookwyrm/templates/settings/themes.html:102
msgid "Theme name"
msgstr ""
-#: bookwyrm/templates/settings/themes.html:73
+#: bookwyrm/templates/settings/themes.html:82
msgid "Theme filename"
msgstr ""
-#: bookwyrm/templates/settings/themes.html:88
+#: bookwyrm/templates/settings/themes.html:97
msgid "Available Themes"
msgstr ""
-#: bookwyrm/templates/settings/themes.html:96
+#: bookwyrm/templates/settings/themes.html:105
msgid "File"
msgstr ""
-#: bookwyrm/templates/settings/themes.html:111
+#: bookwyrm/templates/settings/themes.html:123
msgid "Remove theme"
msgstr ""
+#: bookwyrm/templates/settings/themes.html:134
+msgid "Test theme"
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:143
+msgid "Broken theme"
+msgstr ""
+
+#: bookwyrm/templates/settings/themes.html:152
+msgid "Loaded successfully"
+msgstr ""
+
#: bookwyrm/templates/settings/users/delete_user_form.html:5
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:38
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:52
msgid "Permanently delete user"
msgstr ""
@@ -5655,25 +5798,20 @@ msgstr "最後活躍"
msgid "Remote instance"
msgstr "移除伺服器"
-#: bookwyrm/templates/settings/users/user_admin.html:86
-msgid "Deleted"
-msgstr ""
-
-#: bookwyrm/templates/settings/users/user_admin.html:92
-#: bookwyrm/templates/settings/users/user_info.html:32
-msgid "Inactive"
-msgstr "停用"
-
-#: bookwyrm/templates/settings/users/user_admin.html:101
+#: bookwyrm/templates/settings/users/user_admin.html:84
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr "未設定"
-#: bookwyrm/templates/settings/users/user_info.html:16
+#: bookwyrm/templates/settings/users/user_info.html:20
+msgid "This account is the instance actor for signing HTTP requests."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_info.html:24
msgid "View user profile"
msgstr "檢視使用者資料"
-#: bookwyrm/templates/settings/users/user_info.html:19
+#: bookwyrm/templates/settings/users/user_info.html:30
msgid "Go to user admin"
msgstr ""
@@ -5729,27 +5867,39 @@ msgstr "實例詳情"
msgid "View instance"
msgstr "檢視實例"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:5
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:6
msgid "Permanently deleted"
msgstr ""
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:8
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:9
msgid "User Actions"
msgstr ""
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:21
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:15
+msgid "This is the instance admin actor"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:18
+msgid "You must not delete or disable this account as it is critical to the functioning of your server. This actor signs outgoing GET requests to smooth interaction with secure ActivityPub servers."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:19
+msgid "This account is not discoverable by ordinary users and does not have a profile page."
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:35
msgid "Activate user"
msgstr ""
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:27
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:41
msgid "Suspend user"
msgstr "停用使用者"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:32
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:46
msgid "Un-suspend user"
msgstr "取消停用使用者"
-#: bookwyrm/templates/settings/users/user_moderation_actions.html:54
+#: bookwyrm/templates/settings/users/user_moderation_actions.html:68
msgid "Access level:"
msgstr "訪問權限:"
@@ -5805,7 +5955,7 @@ msgstr ""
msgid "You are running BookWyrm in production mode without https. USE_HTTPS should be enabled in production."
msgstr ""
-#: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:49
+#: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:44
msgid "Settings"
msgstr "設定"
@@ -5862,7 +6012,7 @@ msgid "Need help?"
msgstr ""
#: bookwyrm/templates/shelf/create_shelf_form.html:5
-#: bookwyrm/templates/shelf/shelf.html:72
+#: bookwyrm/templates/shelf/shelf.html:74
msgid "Create shelf"
msgstr "建立書架"
@@ -5870,57 +6020,57 @@ msgstr "建立書架"
msgid "Edit Shelf"
msgstr "編輯書架"
-#: bookwyrm/templates/shelf/shelf.html:24
+#: bookwyrm/templates/shelf/shelf.html:26
#: bookwyrm/templates/user/relationships/followers.html:18
#: bookwyrm/templates/user/relationships/following.html:18
msgid "User profile"
msgstr ""
-#: bookwyrm/templates/shelf/shelf.html:39
+#: bookwyrm/templates/shelf/shelf.html:41
#: bookwyrm/templatetags/shelf_tags.py:13 bookwyrm/views/shelf/shelf.py:53
msgid "All books"
msgstr "所有書目"
-#: bookwyrm/templates/shelf/shelf.html:97
+#: bookwyrm/templates/shelf/shelf.html:99
#, python-format
msgid "%(formatted_count)s book"
msgid_plural "%(formatted_count)s books"
msgstr[0] ""
-#: bookwyrm/templates/shelf/shelf.html:104
+#: bookwyrm/templates/shelf/shelf.html:106
#, python-format
msgid "(showing %(start)s-%(end)s)"
msgstr ""
-#: bookwyrm/templates/shelf/shelf.html:116
+#: bookwyrm/templates/shelf/shelf.html:118
msgid "Edit shelf"
msgstr "編輯書架"
-#: bookwyrm/templates/shelf/shelf.html:124
+#: bookwyrm/templates/shelf/shelf.html:126
msgid "Delete shelf"
msgstr "刪除書架"
-#: bookwyrm/templates/shelf/shelf.html:152
-#: bookwyrm/templates/shelf/shelf.html:178
+#: bookwyrm/templates/shelf/shelf.html:154
+#: bookwyrm/templates/shelf/shelf.html:180
msgid "Shelved"
msgstr "上架時間"
-#: bookwyrm/templates/shelf/shelf.html:153
-#: bookwyrm/templates/shelf/shelf.html:181
+#: bookwyrm/templates/shelf/shelf.html:155
+#: bookwyrm/templates/shelf/shelf.html:183
msgid "Started"
msgstr "開始時間"
-#: bookwyrm/templates/shelf/shelf.html:154
-#: bookwyrm/templates/shelf/shelf.html:184
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
msgid "Finished"
msgstr "完成時間"
-#: bookwyrm/templates/shelf/shelf.html:154
-#: bookwyrm/templates/shelf/shelf.html:184
+#: bookwyrm/templates/shelf/shelf.html:156
+#: bookwyrm/templates/shelf/shelf.html:186
msgid "Until"
msgstr ""
-#: bookwyrm/templates/shelf/shelf.html:210
+#: bookwyrm/templates/shelf/shelf.html:212
msgid "This shelf is empty."
msgstr "此書架是空的。"
@@ -6220,6 +6370,15 @@ msgstr "你已經閱讀了 %(goal_count)s 本書中的 %(re
msgid "%(username)s has read %(read_count)s of %(goal_count)s books."
msgstr "%(username)s 已經閱讀了 %(goal_count)s 本書中的 %(read_count)s 本。"
+#: bookwyrm/templates/snippets/move_user_buttons.html:10
+msgid "Follow at new account"
+msgstr ""
+
+#: bookwyrm/templates/snippets/moved_user_notice.html:7
+#, python-format
+msgid "%(user)s has moved to %(moved_to_name)s"
+msgstr ""
+
#: bookwyrm/templates/snippets/page_text.html:8
#, python-format
msgid "page %(page)s of %(total_pages)s"
@@ -6361,35 +6520,35 @@ msgstr ""
msgid "Finish reading"
msgstr "完成閱讀"
-#: bookwyrm/templates/snippets/status/content_status.html:80
+#: bookwyrm/templates/snippets/status/content_status.html:69
msgid "Show status"
msgstr ""
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "(Page %(page)s"
msgstr ""
-#: bookwyrm/templates/snippets/status/content_status.html:102
+#: bookwyrm/templates/snippets/status/content_status.html:91
#, python-format
msgid "%(endpage)s"
msgstr ""
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid "(%(percent)s%%"
msgstr ""
-#: bookwyrm/templates/snippets/status/content_status.html:104
+#: bookwyrm/templates/snippets/status/content_status.html:93
#, python-format
msgid " - %(endpercent)s%%"
msgstr ""
-#: bookwyrm/templates/snippets/status/content_status.html:127
+#: bookwyrm/templates/snippets/status/content_status.html:116
msgid "Open image in new window"
msgstr "在新視窗中開啟圖片"
-#: bookwyrm/templates/snippets/status/content_status.html:148
+#: bookwyrm/templates/snippets/status/content_status.html:137
msgid "Hide status"
msgstr ""
@@ -6522,6 +6681,18 @@ msgstr "顯示更多"
msgid "Show less"
msgstr "顯示更少"
+#: bookwyrm/templates/snippets/user_active_tag.html:5
+msgid "Moved"
+msgstr ""
+
+#: bookwyrm/templates/snippets/user_active_tag.html:12
+msgid "Deleted"
+msgstr ""
+
+#: bookwyrm/templates/snippets/user_active_tag.html:15
+msgid "Inactive"
+msgstr "停用"
+
#: bookwyrm/templates/two_factor_auth/two_factor_login.html:29
msgid "2FA check"
msgstr ""
@@ -6580,11 +6751,11 @@ msgstr ""
msgid "Groups: %(username)s"
msgstr ""
-#: bookwyrm/templates/user/layout.html:50
+#: bookwyrm/templates/user/layout.html:59
msgid "Follow Requests"
msgstr "關注請求"
-#: bookwyrm/templates/user/layout.html:73
+#: bookwyrm/templates/user/layout.html:83
#: bookwyrm/templates/user/reviews_comments.html:6
#: bookwyrm/templates/user/reviews_comments.html:12
msgid "Reviews and Comments"
@@ -6599,7 +6770,13 @@ msgstr "列表: %(username)s"
msgid "Create list"
msgstr "建立列表"
-#: bookwyrm/templates/user/relationships/followers.html:31
+#: bookwyrm/templates/user/moved.html:25
+#: bookwyrm/templates/user/user_preview.html:22
+#, python-format
+msgid "Joined %(date)s"
+msgstr "在 %(date)s 加入"
+
+#: bookwyrm/templates/user/relationships/followers.html:36
#, python-format
msgid "%(username)s has no followers"
msgstr "%(username)s 沒有關注者"
@@ -6670,11 +6847,6 @@ msgstr ""
msgid "No activities yet!"
msgstr "還沒有活動!"
-#: bookwyrm/templates/user/user_preview.html:22
-#, python-format
-msgid "Joined %(date)s"
-msgstr "在 %(date)s 加入"
-
#: bookwyrm/templates/user/user_preview.html:26
#, python-format
msgid "%(display_count)s follower"
@@ -6700,10 +6872,6 @@ msgstr ""
msgid "View profile and more"
msgstr ""
-#: bookwyrm/templates/user_menu.html:82
-msgid "Log out"
-msgstr "登出"
-
#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:28
msgid "File exceeds maximum size: 10MB"
msgstr "檔案超過了最大大小: 10MB"
@@ -6719,7 +6887,7 @@ msgid "%(num)d book - by %(user)s"
msgid_plural "%(num)d books - by %(user)s"
msgstr[0] ""
-#: bookwyrm/templatetags/utilities.py:39
+#: bookwyrm/templatetags/utilities.py:49
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr ""
diff --git a/nginx/development b/nginx/development
index 841db0124..fdfd14e1d 100644
--- a/nginx/development
+++ b/nginx/development
@@ -64,13 +64,18 @@ server {
# directly serve images and static files from the
# bookwyrm filesystem using sendfile.
# make the logs quieter by not reporting these requests
- location ~ ^/(images|static)/ {
+ location ~ \.(bmp|ico|jpg|jpeg|png|svg|tif|tiff|ttf|webp|css|js)$ {
root /app;
try_files $uri =404;
add_header X-Cache-Status STATIC;
access_log off;
}
+ # block access to any non-image files from images or static
+ location ~ ^/images/ {
+ return 403;
+ }
+
# monitor the celery queues with flower, no caching enabled
location /flower/ {
proxy_pass http://flower:8888;
diff --git a/nginx/production b/nginx/production
index 9018ab9de..296ede70c 100644
--- a/nginx/production
+++ b/nginx/production
@@ -96,12 +96,17 @@ server {
# # directly serve images and static files from the
# # bookwyrm filesystem using sendfile.
# # make the logs quieter by not reporting these requests
-# location ~ ^/(images|static)/ {
+# location ~ \.(bmp|ico|jpg|jpeg|png|svg|tif|tiff|ttf|webp|css|js)$ {
# root /app;
# try_files $uri =404;
# add_header X-Cache-Status STATIC;
# access_log off;
# }
+
+# # block access to any non-image files from images or static
+# location ~ ^/images/ {
+# return 403;
+# }
#
# # monitor the celery queues with flower, no caching enabled
# location /flower/ {
diff --git a/pytest.ini b/pytest.ini
index c5cdc35d1..b50efd602 100644
--- a/pytest.ini
+++ b/pytest.ini
@@ -6,6 +6,7 @@ markers =
integration: marks tests as requiring external resources (deselect with '-m "not integration"')
env =
+ LANGUAGE_CODE = en-US
SECRET_KEY = beepbeep
DEBUG = false
USE_HTTPS = true
diff --git a/redis.conf b/redis.conf
index 2a417579f..79d6804f5 100644
--- a/redis.conf
+++ b/redis.conf
@@ -2,6 +2,9 @@ bind 127.0.0.1 ::1
protected-mode yes
port 6379
+auto-aof-rewrite-percentage 50
+auto-aof-rewrite-min-size 128mb
+
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
diff --git a/requirements.txt b/requirements.txt
index 0602f8da4..6509effc7 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,9 +1,10 @@
-aiohttp==3.8.5
+aiohttp==3.9.0
bleach==5.0.1
celery==5.2.7
colorthief==0.2.1
-Django==3.2.20
+Django==3.2.23
django-celery-beat==2.4.0
+bw-file-resubmit==0.6.0rc2
django-compressor==4.3.1
django-imagekit==4.1.0
django-model-utils==4.3.1
@@ -15,7 +16,7 @@ libsass==0.22.0
Markdown==3.4.1
Pillow==10.0.1
psycopg2==2.9.5
-pycryptodome==3.16.0
+pycryptodome==3.19.1
python-dateutil==2.8.2
redis==4.5.4
requests==2.31.0