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 %} +
+

{% trans "Permission Denied" %}

+

+ {% 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." %} +

+ +
+{% endblock %} + diff --git a/bookwyrm/templates/413.html b/bookwyrm/templates/413.html new file mode 100644 index 000000000..337436aae --- /dev/null +++ b/bookwyrm/templates/413.html @@ -0,0 +1,16 @@ +{% extends 'layout.html' %} +{% load i18n %} + +{% block title %}{% trans "File too large" %}{% endblock %} + +{% block content %} +
+

{% trans "File too large" %}

+

{% 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 %} +

+
+{% endblock %} diff --git a/bookwyrm/templates/about/about.html b/bookwyrm/templates/about/about.html index 6705793d5..ef3f34037 100644 --- a/bookwyrm/templates/about/about.html +++ b/bookwyrm/templates/about/about.html @@ -31,10 +31,10 @@

-
+
{% if superlatives.top_rated %} {% with book=superlatives.top_rated.default_edition rating=superlatives.top_rated.rating %} -
+
@@ -53,7 +53,7 @@ {% if superlatives.wanted %} {% with book=superlatives.wanted.default_edition %} -
+
@@ -72,7 +72,7 @@ {% if superlatives.controversial %} {% with book=superlatives.controversial.default_edition %} -
+
diff --git a/bookwyrm/templates/book/publisher_info.html b/bookwyrm/templates/book/publisher_info.html index e3ffedca8..a69b7d86f 100644 --- a/bookwyrm/templates/book/publisher_info.html +++ b/bookwyrm/templates/book/publisher_info.html @@ -1,7 +1,7 @@ {% spaceless %} {% load i18n %} -{% load humanize %} +{% load date_ext %} {% firstof book.physical_format_detail book.get_physical_format_display as format %} {% firstof book.physical_format book.physical_format_detail as format_property %} @@ -57,7 +57,7 @@ {% endfor %} {% endif %} - {% with date=book.published_date|default:book.first_published_date|naturalday publisher=book.publishers|join:', ' %} + {% with date=book.published_date|default:book.first_published_date|naturalday_partial publisher=book.publishers|join:', ' %} {% if book.published_date and publisher %} {% blocktrans %}Published {{ date }} by {{ publisher }}.{% endblocktrans %} {% elif publisher %} diff --git a/bookwyrm/templates/guided_tour/home.html b/bookwyrm/templates/guided_tour/home.html index be8d095af..a464206ef 100644 --- a/bookwyrm/templates/guided_tour/home.html +++ b/bookwyrm/templates/guided_tour/home.html @@ -99,7 +99,7 @@ homeTour.addSteps([ ], }, { - text: "{% trans '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!' %}", + text: "{% trans '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!' %}", title: "{% trans 'Navigation Bar' %}", attachTo: { element: checkResponsiveState('#tour-navbar-start'), @@ -197,7 +197,7 @@ homeTour.addSteps([ ], }, { - text: `{% trans "Your profile, books, 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." %}

`, + 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 %}
-

{% trans "Import Books" %}

- {% if invalid %}
{% trans "Not a valid CSV file" %} @@ -21,7 +20,7 @@ {% blocktrans trimmed count days=import_limit_reset with display_size=import_size_limit|intcomma %} Currently, you are allowed to import {{ display_size }} books every {{ import_limit_reset }} day. {% plural %} - Currently, you are allowed to import {{ import_size_limit }} books every {{ import_limit_reset }} days. + Currently, you are allowed to import {{ display_size }} books every {{ import_limit_reset }} days. {% endblocktrans %}

{% 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 %} +
+ + {% if invalid %} +
+ {% trans "Not a valid import file" %} +
+ {% endif %} +

+ {% 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." %} +

+
+ {% elif next_available %} +
+

{% 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 %}

+
+ {% else %} +
+ {% csrf_token %} + +
+
+

{% trans "Step 1:" %}

+

+ {% blocktrans trimmed %} + Select an export file generated from another BookWyrm account. The file format should be .tar.gz. + {% endblocktrans %} +

+
+
+ + {{ import_form.archive_file }} +
+
+ + + +
+
+

{% trans "Step 2:" %}

+

+ {% blocktrans trimmed %} + Deselect any checkboxes for data you do not wish to include in your import. + {% endblocktrans %} +

+

Unless specified below, importing will not delete any data. Imported data will be added if it does not already exist. For example, if you have an existing list with the same name as an imported list, the existing list settings will not change, any new list items will be added, and no existing list items will be deleted.

+
+
+
+
+ +

+ {% trans "Overwrites display name, summary, and avatar" %} +

+
+
+ +
+ {% trans "Overwrites:" %} +
    +
  • + {% trans "Whether manual approval is required for other users to follow your account" %} +
  • +
  • + {% trans "Whether following/followers are shown on your profile" %} +
  • +
  • + {% trans "Whether your reading goal is shown on your profile" %} +
  • +
  • + {% trans "Whether you see user follow suggestions" %} +
  • +
  • + {% trans "Whether your account is suggested to others" %} +
  • +
  • + {% trans "Your timezone" %} +
  • +
  • + {% trans "Your default post privacy setting" %} +
  • +
+
+
+
+ +
+ +
+
+
+ +

+ {% trans "Overwrites reading goals for all years listed in the import file" %} +

+
+ + + + + + + +
+
+
+ + {% if not import_limit_reset and not import_size_limit or allowed_imports > 0 %} + + {% else %} + +

{% trans "You've reached the import limit." %}

+ {% endif%} +
+ {% endif %} + +
+ +
+

{% trans "Recent Imports" %}

+
+ + + + + + + {% if not jobs %} + + + + {% endif %} + {% for job in jobs %} + + + + + + {% endfor %} +
+ {% 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 %} + +
+
+ + {% include 'snippets/pagination.html' with page=jobs path=request.path %} +
+{% endblock %} diff --git a/bookwyrm/templates/layout.html b/bookwyrm/templates/layout.html index b8459856c..6283e61c4 100644 --- a/bookwyrm/templates/layout.html +++ b/bookwyrm/templates/layout.html @@ -27,6 +27,7 @@
@@ -173,11 +180,15 @@
- {# almost every view needs to know the user shelves #} - {% with request.user.shelf_set.all as user_shelves %} - {% block content %} - {% endblock %} - {% endwith %} + {% if request.user.moved_to %} + {% include "moved.html" %} + {% else %} + {# almost every view needs to know the user shelves #} + {% with request.user.shelf_set.all as user_shelves %} + {% block content %} + {% endblock %} + {% endwith %} + {% endif %}
diff --git a/bookwyrm/templates/moved.html b/bookwyrm/templates/moved.html new file mode 100644 index 000000000..382b752be --- /dev/null +++ b/bookwyrm/templates/moved.html @@ -0,0 +1,52 @@ +{% load i18n %} +{% load static %} +{% load utilities %} + +
+
+
+
+
+
+ {{ request.user.alt_text }} +
+
+
+

{{ request.user.display_name }}

+

{{request.user.username}}

+
+
+ +
+

+ {% id_to_username request.user.moved_to as username %} + {% blocktrans trimmed with moved_to=user.moved_to %} + You have moved your account to {{ username }} + {% endblocktrans %} +

+

+ {% trans "You can undo the move to restore full functionality, but some followers may have already unfollowed this account." %} +

+
+
+
+
+
+ + {% csrf_token %} + + + +
+ {% csrf_token %} + +
+
+
+
+
+
diff --git a/bookwyrm/templates/notifications/item.html b/bookwyrm/templates/notifications/item.html index b53abe3d1..ac60ad46f 100644 --- a/bookwyrm/templates/notifications/item.html +++ b/bookwyrm/templates/notifications/item.html @@ -13,12 +13,18 @@ {% include 'notifications/items/follow_request.html' %} {% elif notification.notification_type == 'IMPORT' %} {% include 'notifications/items/import.html' %} +{% elif notification.notification_type == 'USER_IMPORT' %} + {% include 'notifications/items/user_import.html' %} +{% elif notification.notification_type == 'USER_EXPORT' %} + {% include 'notifications/items/user_export.html' %} {% elif notification.notification_type == 'ADD' %} {% include 'notifications/items/add.html' %} {% elif notification.notification_type == 'REPORT' %} {% include 'notifications/items/report.html' %} {% elif notification.notification_type == 'LINK_DOMAIN' %} {% include 'notifications/items/link_domain.html' %} +{% elif notification.notification_type == 'INVITE_REQUEST' %} + {% include 'notifications/items/invite_request.html' %} {% elif notification.notification_type == 'INVITE' %} {% include 'notifications/items/invite.html' %} {% elif notification.notification_type == 'ACCEPT' %} @@ -35,4 +41,6 @@ {% include 'notifications/items/update.html' %} {% elif notification.notification_type == 'GROUP_DESCRIPTION' %} {% include 'notifications/items/update.html' %} +{% elif notification.notification_type == 'MOVE' %} + {% include 'notifications/items/move_user.html' %} {% endif %} diff --git a/bookwyrm/templates/notifications/items/invite_request.html b/bookwyrm/templates/notifications/items/invite_request.html new file mode 100644 index 000000000..acc08d5d0 --- /dev/null +++ b/bookwyrm/templates/notifications/items/invite_request.html @@ -0,0 +1,20 @@ +{% extends 'notifications/items/layout.html' %} +{% load humanize %} +{% load i18n %} + +{% block primary_link %}{% spaceless %} +{% url 'settings-invite-requests' %} +{% endspaceless %}{% endblock %} + +{% block icon %} + +{% endblock %} + +{% block description %} + {% url 'settings-invite-requests' as path %} + {% blocktrans trimmed count counter=notification.related_invite_requests.count with display_count=notification.related_invite_requests.count|intcomma %} + New invite request awaiting response + {% plural %} + {{ display_count }} new invite requests awaiting response + {% endblocktrans %} +{% endblock %} diff --git a/bookwyrm/templates/notifications/items/layout.html b/bookwyrm/templates/notifications/items/layout.html index 8acbb9fec..41353abcf 100644 --- a/bookwyrm/templates/notifications/items/layout.html +++ b/bookwyrm/templates/notifications/items/layout.html @@ -39,6 +39,8 @@ {% with related_user=related_users.0.display_name %} {% with related_user_link=related_users.0.local_path %} + {% with related_user_moved_to=related_users.0.moved_to %} + {% with related_user_username=related_users.0.username %} {% with second_user=related_users.1.display_name %} {% with second_user_link=related_users.1.local_path %} {% with other_user_count=related_user_count|add:"-1" %} @@ -50,6 +52,8 @@ {% endwith %} {% endwith %} {% endwith %} + {% endwith %} + {% endwith %}
{% if related_status %} diff --git a/bookwyrm/templates/notifications/items/move_user.html b/bookwyrm/templates/notifications/items/move_user.html new file mode 100644 index 000000000..3121d3f45 --- /dev/null +++ b/bookwyrm/templates/notifications/items/move_user.html @@ -0,0 +1,29 @@ +{% extends 'notifications/items/layout.html' %} + +{% load i18n %} +{% load utilities %} +{% load user_page_tags %} + +{% block primary_link %}{% spaceless %} + {{ notification.related_object.local_path }} +{% endspaceless %}{% endblock %} + +{% block icon %} + +{% endblock %} + +{% block description %} + {% if related_user_moved_to %} + {% id_to_username related_user_moved_to as username %} + {% blocktrans trimmed %} + {{ related_user }} has moved to {{ username }} + {% endblocktrans %} +
+ {% include 'snippets/move_user_buttons.html' with group=notification.related_group %} +
+ {% else %} + {% blocktrans trimmed %} + {{ related_user }} has undone their move + {% endblocktrans %} + {% endif %} +{% endblock %} diff --git a/bookwyrm/templates/notifications/items/user_export.html b/bookwyrm/templates/notifications/items/user_export.html new file mode 100644 index 000000000..1df40dbac --- /dev/null +++ b/bookwyrm/templates/notifications/items/user_export.html @@ -0,0 +1,15 @@ +{% extends 'notifications/items/layout.html' %} +{% load i18n %} + +{% block primary_link %}{% spaceless %} +{% url 'prefs-user-export' %} +{% endspaceless %}{% endblock %} + +{% block icon %} + +{% endblock %} + +{% block description %} + {% url 'prefs-user-export' as url %} + {% blocktrans %}Your user export is ready.{% endblocktrans %} +{% endblock %} diff --git a/bookwyrm/templates/notifications/items/user_import.html b/bookwyrm/templates/notifications/items/user_import.html new file mode 100644 index 000000000..27e3e975d --- /dev/null +++ b/bookwyrm/templates/notifications/items/user_import.html @@ -0,0 +1,16 @@ +{% extends 'notifications/items/layout.html' %} +{% load i18n %} + +{% block primary_link %}{% spaceless %} +{% url 'user-import' %} +{% endspaceless %}{% endblock %} + +{% block icon %} + +{% endblock %} + +{% block description %} +{% url 'user-import' as import_url %} +{% blocktrans %}Your user import is complete.{% endblocktrans %} + +{% endblock %} diff --git a/bookwyrm/templates/preferences/alias_user.html b/bookwyrm/templates/preferences/alias_user.html new file mode 100644 index 000000000..e1e468208 --- /dev/null +++ b/bookwyrm/templates/preferences/alias_user.html @@ -0,0 +1,59 @@ +{% extends 'preferences/layout.html' %} +{% load i18n %} + +{% block title %}{% trans "Move Account" %}{% endblock %} + +{% block header %} +{% trans "Create Alias" %} +{% endblock %} + +{% block panel %} +
+

{% trans "Add another account as an alias" %}

+
+
+

+ {% trans "Marking another account as an alias is required if you want to move that account to this one." %} +

+

+ {% trans "This is a reversable action and will not change the functionality of this account." %} +

+
+
+ {% csrf_token %} +
+ + + {% include 'snippets/form_errors.html' with errors_list=form.username.errors id="desc_username" %} +
+
+ + + {% include 'snippets/form_errors.html' with errors_list=form.password.errors id="desc_password" %} +
+ +
+
+ {% if user.also_known_as.all.0 %} +
+

{% trans "Aliases" %}

+
+ + {% for alias in user.also_known_as.all %} + + + + + {% endfor %} +
{{ alias.username }} +
+ {% csrf_token %} + + +
+
+
+
+ {% endif %} +
+{% endblock %} diff --git a/bookwyrm/templates/preferences/export-user.html b/bookwyrm/templates/preferences/export-user.html new file mode 100644 index 000000000..cd3119e3e --- /dev/null +++ b/bookwyrm/templates/preferences/export-user.html @@ -0,0 +1,142 @@ +{% extends 'preferences/layout.html' %} +{% load i18n %} +{% load utilities %} + +{% block title %}{% trans "Export BookWyrm Account" %}{% endblock %} + +{% block header %} +{% trans "Export BookWyrm Account" %} +{% endblock %} + +{% block panel %} +
+
+

{% trans "You can create an export file here. This will allow you to migrate your data to another BookWyrm account." %}

+
+
+ {% blocktrans trimmed %} +
+

Your file will include:

+
    +
  • User profile
  • +
  • Most user settings
  • +
  • Reading goals
  • +
  • Shelves
  • +
  • Reading history
  • +
  • Book reviews
  • +
  • Statuses
  • +
  • Your own lists and saved lists
  • +
  • Which users you follow and block
  • +
+
+
+

Your file will not include:

+
    +
  • Direct messages
  • +
  • Replies to your statuses
  • +
  • Groups
  • +
  • Favorites
  • +
+
+ {% endblocktrans %} +
+

{% trans "In your new BookWyrm account can choose what to import: you will not have to import everything that is exported." %}

+

+ {% spaceless %} + {% trans "If you wish to migrate any statuses (comments, reviews, or quotes) you must either set the account you are moving to as an alias of this one, or move this account to the new account, before you import your user data." %} + {% endspaceless %} +

+ {% if not site.user_exports_enabled %} +

+ {% trans "New user exports are currently disabled." %} +

+ {% elif next_available %} +

+ {% blocktrans trimmed %} + You will be able to create a new export file at {{ next_available }} + {% endblocktrans %} +

+ {% else %} +
+ {% csrf_token %} + +
+ {% endif %} + +
+
+

{% trans "Recent Exports" %}

+

+ {% trans "User export files will show 'complete' once ready. This may take a little while. Click the link to download your file." %} +

+
+ + + + + + + {% if not jobs %} + + + + {% endif %} + {% for job in jobs %} + + + + + + + {% endfor %} +
+ {% trans "Date" %} + + {% trans "Status" %} + + {% trans "Size" %} +
+ {% trans "No recent imports" %} +
{{ job.updated_date }} + + {% if job.status %} + {{ job.status }} + {{ job.status_display }} + {% elif job.complete %} + {% trans "Complete" %} + {% else %} + {% trans "Active" %} + {% endif %} + + + {{ job.export_data|get_file_size }} + + {% if job.complete and not job.status == "stopped" and not job.status == "failed" %} +

+ + + + {% trans "Download your export" %} + + +

+ {% endif %} +
+
+ + {% include 'snippets/pagination.html' with page=jobs path=request.path %} +
+{% endblock %} diff --git a/bookwyrm/templates/preferences/export.html b/bookwyrm/templates/preferences/export.html index 61933be3e..e301eb5cc 100644 --- a/bookwyrm/templates/preferences/export.html +++ b/bookwyrm/templates/preferences/export.html @@ -1,16 +1,16 @@ {% extends 'preferences/layout.html' %} {% load i18n %} -{% block title %}{% trans "CSV Export" %}{% endblock %} +{% block title %}{% trans "Export Book List" %}{% endblock %} {% block header %} -{% trans "CSV Export" %} +{% trans "Export Book List" %} {% endblock %} {% block panel %}

- {% trans "Your export will include all the books on your shelves, books you have reviewed, and books with reading activity." %} + {% trans "Your CSV export file will include all the books on your shelves, books you have reviewed, and books with reading activity.
Use this to import into a service like Goodreads." %}

diff --git a/bookwyrm/templates/preferences/layout.html b/bookwyrm/templates/preferences/layout.html index ca63ec93d..56151233f 100644 --- a/bookwyrm/templates/preferences/layout.html +++ b/bookwyrm/templates/preferences/layout.html @@ -23,6 +23,14 @@ {% url 'prefs-2fa' as url %} {% trans "Two Factor Authentication" %} +
  • + {% url 'prefs-alias' as url %} + {% trans "Aliases" %} +
  • +
  • + {% url 'prefs-move' as url %} + {% trans "Move Account" %} +
  • {% url 'prefs-delete' as url %} {% trans "Delete Account" %} @@ -32,11 +40,19 @@ diff --git a/bookwyrm/templates/preferences/move_user.html b/bookwyrm/templates/preferences/move_user.html new file mode 100644 index 000000000..47b370e82 --- /dev/null +++ b/bookwyrm/templates/preferences/move_user.html @@ -0,0 +1,43 @@ +{% extends 'preferences/layout.html' %} +{% load i18n %} + +{% block title %}{% trans "Move Account" %}{% endblock %} + +{% block header %} +{% trans "Move Account" %} +{% endblock %} + +{% block panel %} +
    +

    {% trans "Migrate account to another server" %}

    +
    +
    +

    + {% trans "Moving your account will notify all your followers and direct them to follow the new account." %} +

    +

    + {% blocktrans %} + {{ user }} will be marked as moved and will not be discoverable or usable unless you undo the move. + {% endblocktrans %} +

    +
    +
    +

    {% trans "Remember to add this user as an alias of the target account before you try to move." %}

    +
    + + {% csrf_token %} +
    + + + {% include 'snippets/form_errors.html' with errors_list=form.target.errors id="desc_target" %} +
    +
    + + + {% include 'snippets/form_errors.html' with errors_list=form.password.errors id="desc_password" %} +
    + + +
    +
    +{% endblock %} diff --git a/bookwyrm/templates/settings/celery.html b/bookwyrm/templates/settings/celery.html index 2f4a36ce9..b224e20cc 100644 --- a/bookwyrm/templates/settings/celery.html +++ b/bookwyrm/templates/settings/celery.html @@ -29,7 +29,7 @@
  • -

    {% trans "Broadcasts" %}

    +

    {% trans "Broadcast" %}

    {{ queues.broadcast|intcomma }}

    diff --git a/bookwyrm/templates/settings/imports/complete_user_import_modal.html b/bookwyrm/templates/settings/imports/complete_user_import_modal.html new file mode 100644 index 000000000..74004b7a2 --- /dev/null +++ b/bookwyrm/templates/settings/imports/complete_user_import_modal.html @@ -0,0 +1,23 @@ +{% extends 'components/modal.html' %} +{% load i18n %} + +{% block modal-title %}{% trans "Stop import?" %}{% endblock %} + +{% block modal-body %} +{% trans "This action will stop the user import before it is complete and cannot be un-done" %} +{% endblock %} + +{% block modal-footer %} +
    + {% csrf_token %} + +
    + + +
    +
    +{% endblock %} diff --git a/bookwyrm/templates/settings/imports/imports.html b/bookwyrm/templates/settings/imports/imports.html index 8819220fb..11b3c7e03 100644 --- a/bookwyrm/templates/settings/imports/imports.html +++ b/bookwyrm/templates/settings/imports/imports.html @@ -29,6 +29,7 @@
    {% trans "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." %} {% trans "While imports are disabled, users will not be allowed to start new imports, but existing imports will not be affected." %} + {% trans "This setting prevents both book imports and user imports." %}
    {% csrf_token %}
    @@ -89,91 +90,264 @@
    + + {% if site.user_exports_enabled %} +
    + + + {% trans "Disable starting new user exports" %} + + + +
    +
    + {% trans "This is only intended to be used when things have gone very wrong with exports and you need to pause the feature while addressing issues." %} + {% trans "While exports are disabled, users will not be allowed to start new user exports, but existing exports will not be affected." %} +
    + {% csrf_token %} +
    + +
    +
    +
    +
    + + + {% trans "Limit how often users can import and export" %} + + + +
    +
    + {% trans "Some users might try to run user imports or exports very frequently, which you want to limit." %} + {% trans "Set the value to 0 to not enforce any limit." %} +
    +
    + + + + {% csrf_token %} +
    + +
    +
    +
    +
    + {% else %} +
    +
    +

    {% trans "Users are currently unable to start new user exports. This is the default setting." %}

    + {% if use_s3 %} +

    {% trans "It is not currently possible to provide user exports when using s3 storage. The BookWyrm development team are working on a fix for this." %}

    + {% endif %} +
    + {% csrf_token %} +
    + +
    +
    + {% endif %}
    -
    - +

    {% trans "Book Imports" %}

    +
    +
    + +
    + +
    + + + {% url 'settings-imports' status as url %} + + + + {% if status != "active" %} + + {% endif %} + + + + + {% if status == "active" %} + + {% endif %} + + {% for import in imports %} + + + + + {% if status != "active" %} + + {% endif %} + + + + + {% if status == "active" %} + + {% endif %} + + {% endfor %} + {% if not imports %} + + + + {% 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 %} + + {% trans "Date Updated" %} + + {% trans "Items" %} + + {% trans "Pending items" %} + + {% trans "Successful items" %} + + {% trans "Failed items" %} + {% trans "Actions" %}
    {{ import.id }} + {{ import.user|username }} + {{ import.created_date }}{{ import.updated_date }}{{ import.item_count|intcomma }}{{ import.pending_item_count|intcomma }}{{ import.successful_item_count|intcomma }}{{ import.failed_item_count|intcomma }} + {% join "complete" import.id as modal_id %} + + {% include "settings/imports/complete_import_modal.html" with id=modal_id %} +
    + {% trans "No matching imports found." %} +
    +
    + + {% include 'snippets/pagination.html' with page=imports path=request.path %} +
    -
    - - - {% url 'settings-imports' status as url %} - - - - {% if status != "active" %} - - {% endif %} - - - - - {% if status == "active" %} - - {% endif %} - - {% for import in imports %} - - - - - {% if status != "active" %} - - {% endif %} - - - - - {% if status == "active" %} - - {% endif %} - - {% endfor %} - {% if not imports %} - - - - {% 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 %} - - {% trans "Date Updated" %} - - {% trans "Items" %} - - {% trans "Pending items" %} - - {% trans "Successful items" %} - - {% trans "Failed items" %} - {% trans "Actions" %}
    {{ import.id }} - {{ import.user|username }} - {{ import.created_date }}{{ import.updated_date }}{{ import.item_count|intcomma }}{{ import.pending_item_count|intcomma }}{{ import.successful_item_count|intcomma }}{{ import.failed_item_count|intcomma }} - {% join "complete" import.id as modal_id %} - - {% include "settings/imports/complete_import_modal.html" with id=modal_id %} -
    - {% trans "No matching imports found." %} -
    -
    +
    +

    {% trans "User Imports" %}

    +
    +
    + +
    +
    -{% include 'snippets/pagination.html' with page=imports path=request.path %} +
    + + + {% url 'settings-imports' status as url %} + + + + {% if status != "active" %} + + {% endif %} + + {% if status == "active" %} + + {% else %} + + {% endif %} + + {% for import in user_imports %} + + + + + {% if status != "active" %} + + {% endif %} + {% if status == "active" %} + + {% else %} + + {% endif %} + + {% endfor %} + {% if not user_imports %} + + + + {% 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 %} + + {% trans "Date Updated" %} + {% trans "Actions" %}{% trans "Status" %}
    {{ import.id }} + {{ import.user|username }} + {{ import.created_date }}{{ import.updated_date }} + {% join "complete" import.id as modal_id %} + + {% include "settings/imports/complete_user_import_modal.html" with id=modal_id %} + + {{ import.status }} + +
    + {% trans "No matching imports found." %} +
    +
    + + {% include 'snippets/pagination.html' with page=user_imports path=request.path %} +
    {% endblock %} - diff --git a/bookwyrm/templates/settings/themes.html b/bookwyrm/templates/settings/themes.html index d27aeb0ce..c077fa5e3 100644 --- a/bookwyrm/templates/settings/themes.html +++ b/bookwyrm/templates/settings/themes.html @@ -12,6 +12,15 @@ {% endblock %} {% block panel %} +{% if broken_theme %} +
    + + + {% trans "One of your themes appears to be broken. Selecting this theme will make the application unusable." %} + +
    +{% endif %} + {% if success %}
    @@ -98,6 +107,9 @@ {% trans "Actions" %} + + {% trans "Status" %} + {% for theme in themes %} @@ -112,6 +124,37 @@ + + {% if theme.loads is None %} + +
    + {% csrf_token %} + +
    + + {% elif not theme.loads %} + + + + + {% trans "Broken theme" %} + + + + {% else %} + + + + + {% trans "Loaded successfully" %} + + + + {% endif %} + {% endfor %} diff --git a/bookwyrm/templates/settings/users/user_admin.html b/bookwyrm/templates/settings/users/user_admin.html index 9bc5805b1..cc5c51ba7 100644 --- a/bookwyrm/templates/settings/users/user_admin.html +++ b/bookwyrm/templates/settings/users/user_admin.html @@ -74,24 +74,7 @@ {{ user.created_date }} {{ user.last_active_date }} - {% if user.is_active %} - - {% trans "Active" %} - {% elif user.deactivation_reason == "moderator_deletion" or user.deactivation_reason == "self_deletion" %} - - {% trans "Deleted" %} - ({{ user.get_deactivation_reason_display }}) - {% else %} - - {% trans "Inactive" %} - ({{ user.get_deactivation_reason_display }}) - {% endif %} + {% include "snippets/user_active_tag.html" with user=user %} {% if status == "federated" %} diff --git a/bookwyrm/templates/settings/users/user_info.html b/bookwyrm/templates/settings/users/user_info.html index a1725ae36..e07a7e439 100644 --- a/bookwyrm/templates/settings/users/user_info.html +++ b/bookwyrm/templates/settings/users/user_info.html @@ -1,6 +1,7 @@ {% load i18n %} {% load markdown %} {% load humanize %} +{% load utilities %}
    @@ -13,7 +14,17 @@
    {% endif %} + {% if user.localname|is_instance_admin %} +
    +
    + {% trans "This account is the instance actor for signing HTTP requests." %} +
    +
    + {% else %}

    {% 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 "Status" %}

    - {% if user.is_active %} -

    - {% 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 %}

    {% if not user.is_active and user.deactivation_reason == "self_deletion" or user.deactivation_reason == "moderator_deletion" %}
    @@ -7,77 +8,90 @@ {% else %}

    {% trans "User Actions" %}

    -
    -
    - {% if user.is_active %} -

    - {% trans "Send direct message" %} -

    - {% endif %} + {% if user.localname|is_instance_admin %} +
    +
    +
    +

    {% trans "This is the instance admin actor" %}

    +
    +
    +

    {% trans "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." %}

    +

    {% trans "This account is not discoverable by ordinary users and does not have a profile page." %}

    +
    +
    +
    + {% else %} +
    +
    + {% if user.is_active %} +

    + {% trans "Send direct message" %} +

    + {% endif %} - {% if not user.is_active and user.deactivation_reason == "pending" %} -
    - {% csrf_token %} - -
    - {% endif %} - {% if user.is_active or user.deactivation_reason == "pending" %} -
    - {% csrf_token %} - -
    - {% else %} -
    - {% csrf_token %} - -
    + {% if not user.is_active and user.deactivation_reason == "pending" %} +
    + {% csrf_token %} + +
    + {% endif %} + {% if user.is_active or user.deactivation_reason == "pending" %} +
    + {% csrf_token %} + +
    + {% else %} +
    + {% csrf_token %} + +
    + {% endif %} + + {% if user.local %} +
    + {% trans "Permanently delete user" as button_text %} + {% include "snippets/toggle/open_button.html" with controls_text="delete_user" text=button_text class="is-danger is-light" %} +
    + {% endif %} +
    + + {% if user.local %} +
    + {% include "settings/users/delete_user_form.html" with controls_text="delete_user" class="mt-2 mb-2" %} +
    {% endif %} {% if user.local %}
    - {% trans "Permanently delete user" as button_text %} - {% include "snippets/toggle/open_button.html" with controls_text="delete_user" text=button_text class="is-danger is-light" %} +
    + {% csrf_token %} + + {% if group_form.non_field_errors %} + {{ group_form.non_field_errors }} + {% endif %} + {% with group=user.groups.first %} +
    + +
    + + {% include 'snippets/form_errors.html' with errors_list=group_form.groups.errors id="desc_user_group" %} + {% endwith %} + +
    {% endif %}
    - - {% if user.local %} -
    - {% include "settings/users/delete_user_form.html" with controls_text="delete_user" class="mt-2 mb-2" %} -
    {% endif %} - - {% if user.local %} -
    -
    - {% csrf_token %} - - {% if group_form.non_field_errors %} - {{ group_form.non_field_errors }} - {% endif %} - {% with group=user.groups.first %} -
    - -
    - - {% include 'snippets/form_errors.html' with errors_list=group_form.groups.errors id="desc_user_group" %} - {% endwith %} - -
    -
    - {% endif %} -
    - {% endif %}
    diff --git a/bookwyrm/templates/shelf/shelf.html b/bookwyrm/templates/shelf/shelf.html index 7d0035ed3..71f4bc088 100644 --- a/bookwyrm/templates/shelf/shelf.html +++ b/bookwyrm/templates/shelf/shelf.html @@ -18,7 +18,9 @@ {% include 'user/books_header.html' %} - +{% if user.moved_to %} + {% include "snippets/moved_user_notice.html" with user=user %} +{% else %}
    {% if is_self and shelf.id %}
    @@ -207,7 +210,17 @@ {% else %} -

    {% 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 %}
    @@ -215,6 +228,7 @@
    {% include 'snippets/pagination.html' with page=books path=request.path %}
    +{% endif %} {% endblock %} {% block scripts %} diff --git a/bookwyrm/templates/shelf/shelves_filter_field.html b/bookwyrm/templates/shelf/shelves_filter_field.html new file mode 100644 index 000000000..707f033ea --- /dev/null +++ b/bookwyrm/templates/shelf/shelves_filter_field.html @@ -0,0 +1,9 @@ +{% extends 'snippets/filters_panel/filter_field.html' %} +{% load i18n %} + +{% block filter %} +
    + + +
    +{% endblock %} diff --git a/bookwyrm/templates/shelf/shelves_filters.html b/bookwyrm/templates/shelf/shelves_filters.html new file mode 100644 index 000000000..ad7fc3dbc --- /dev/null +++ b/bookwyrm/templates/shelf/shelves_filters.html @@ -0,0 +1,5 @@ +{% extends 'snippets/filters_panel/filters_panel.html' %} + +{% block filter_fields %} + {% include 'shelf/shelves_filter_field.html' %} +{% endblock %} diff --git a/bookwyrm/templates/snippets/follow_button.html b/bookwyrm/templates/snippets/follow_button.html index 2bde47f58..28b979987 100644 --- a/bookwyrm/templates/snippets/follow_button.html +++ b/bookwyrm/templates/snippets/follow_button.html @@ -43,7 +43,7 @@
    {% if not minimal %}
    - {% include 'snippets/user_options.html' with user=user class="is-small" %} + {% include 'snippets/user_options.html' with user=user followers_page=followers_page class="is-small" %}
    {% endif %}
    diff --git a/bookwyrm/templates/snippets/move_user_buttons.html b/bookwyrm/templates/snippets/move_user_buttons.html new file mode 100644 index 000000000..fc8f792e9 --- /dev/null +++ b/bookwyrm/templates/snippets/move_user_buttons.html @@ -0,0 +1,13 @@ +{% load i18n %} +{% load utilities %} + + +{% if related_user_moved_to|user_from_remote_id not in request.user.following.all %} +
    + +
    +{% endif %} \ No newline at end of file diff --git a/bookwyrm/templates/snippets/moved_user_notice.html b/bookwyrm/templates/snippets/moved_user_notice.html new file mode 100644 index 000000000..7bb1e24e6 --- /dev/null +++ b/bookwyrm/templates/snippets/moved_user_notice.html @@ -0,0 +1,12 @@ +{% load i18n %} +{% load utilities %} +
    +
    +

    + {% 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 %} +

    +
    +
    diff --git a/bookwyrm/templates/snippets/remove_follower_button.html b/bookwyrm/templates/snippets/remove_follower_button.html new file mode 100644 index 000000000..28bef6842 --- /dev/null +++ b/bookwyrm/templates/snippets/remove_follower_button.html @@ -0,0 +1,5 @@ +{% load i18n %} +
    + {% csrf_token %} + +
    diff --git a/bookwyrm/templates/snippets/user_active_tag.html b/bookwyrm/templates/snippets/user_active_tag.html new file mode 100644 index 000000000..1d85ae68b --- /dev/null +++ b/bookwyrm/templates/snippets/user_active_tag.html @@ -0,0 +1,17 @@ +{% load i18n %} + +{% if user.is_active %} + {% if user.moved_to %} + {% trans "Moved" as text %} + {% include "snippets/user_active_tag_item.html" with icon="x" text=text level="info" %} + {% else %} + {% trans "Active" as text %} + {% include "snippets/user_active_tag_item.html" with icon="check" text=text level="success" %} + {% endif %} +{% elif user.is_deleted %} + {% trans "Deleted" as text %} + {% include "snippets/user_active_tag_item.html" with icon="x" text=text level="danger" deactivation_reason=user.get_deactivation_reason_display %} +{% else %} + {% trans "Inactive" as text %} + {% include "snippets/user_active_tag_item.html" with icon="x" text=text level="warning" deactivation_reason=user.get_deactivation_reason_display %} +{% endif %} diff --git a/bookwyrm/templates/snippets/user_active_tag_item.html b/bookwyrm/templates/snippets/user_active_tag_item.html new file mode 100644 index 000000000..e722150f2 --- /dev/null +++ b/bookwyrm/templates/snippets/user_active_tag_item.html @@ -0,0 +1,19 @@ +{% if large %} + +

    + + {{ 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 @@
  • {% include 'snippets/block_button.html' with user=user class="is-fullwidth" blocks=False %}
  • +{% if followers_page %} +
  • + {% include 'snippets/remove_follower_button.html' with user=user class="is-fullwidth" %} +
  • +{% endif %} {% endblock %} diff --git a/bookwyrm/templates/user/layout.html b/bookwyrm/templates/user/layout.html index 4c7031ba5..7a5d4063c 100755 --- a/bookwyrm/templates/user/layout.html +++ b/bookwyrm/templates/user/layout.html @@ -5,6 +5,7 @@ {% load markdown %} {% load layout %} {% load group_tags %} +{% load user_page_tags %} {% block title %}{{ user.display_name }}{% endblock %} @@ -27,7 +28,11 @@
    - {% include 'user/user_preview.html' with user=user %} + {% if user.moved_to %} + {% include 'user/moved.html' with user=user %} + {% else %} + {% include 'user/user_preview.html' with user=user %} + {% endif %}
    {% if user.summary %} @@ -38,70 +43,78 @@ {% endspaceless %} {% endif %}
    - {% if not is_self and request.user.is_authenticated %} - {% include 'snippets/follow_button.html' with user=user %} - {% endif %} - {% if not is_self %} - {% include 'ostatus/remote_follow_button.html' with user=user %} - {% endif %} +
    + {% if user.moved_to %} + {% include "snippets/moved_user_notice.html" with user=user %} + {% else %} + {% if not is_self and request.user.is_authenticated %} + {% include 'snippets/follow_button.html' with user=user %} + {% endif %} + {% if not is_self %} + {% include 'ostatus/remote_follow_button.html' with user=user %} + {% endif %} - {% if is_self and user.active_follower_requests.all %} - + {% if is_self and user.active_follower_requests.all %} + + {% endif %} {% endif %} +
    + {% block tabs %} + {% if not user.moved_to %} + {% with user|username as username %} + + {% endwith %} + {% endif %} + {% endblock %}
    -{% block tabs %} -{% with user|username as username %} - -{% endwith %} -{% endblock %} - -{% block panel %}{% endblock %} - + {% if not user.moved_to %} + {% block panel %}{% endblock %} + {% endif %} {% endblock %} diff --git a/bookwyrm/templates/user/moved.html b/bookwyrm/templates/user/moved.html new file mode 100644 index 000000000..45a4bb2e5 --- /dev/null +++ b/bookwyrm/templates/user/moved.html @@ -0,0 +1,27 @@ +{% load i18n %} +{% load humanize %} +{% load utilities %} +{% load markdown %} +{% load layout %} +{% load group_tags %} + + +
    + +
    +

    + {% 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 %}

    +
    +
    diff --git a/bookwyrm/templates/user/relationships/followers.html b/bookwyrm/templates/user/relationships/followers.html index 267f55706..99446c40f 100644 --- a/bookwyrm/templates/user/relationships/followers.html +++ b/bookwyrm/templates/user/relationships/followers.html @@ -25,6 +25,11 @@ {% endblock %} +{% block panel %} + {% with followers_page=True %} + {{ block.super }} + {% endwith %} +{% endblock %} {% block nullstate %}
    diff --git a/bookwyrm/templates/user/relationships/layout.html b/bookwyrm/templates/user/relationships/layout.html index 44732bfa1..b3b85db66 100644 --- a/bookwyrm/templates/user/relationships/layout.html +++ b/bookwyrm/templates/user/relationships/layout.html @@ -31,7 +31,7 @@ ({{ follow.username }})
    - {% include 'snippets/follow_button.html' with user=follow %} + {% include 'snippets/follow_button.html' with user=follow followers_page=followers_page %}
    {% endfor %} diff --git a/bookwyrm/templates/user_menu.html b/bookwyrm/templates/user_menu.html index 5473b9da2..ad6f4fab2 100644 --- a/bookwyrm/templates/user_menu.html +++ b/bookwyrm/templates/user_menu.html @@ -34,11 +34,6 @@ {% trans "Directory" %} -
  • - - {% trans 'Your Books' %} - -
  • {% trans "Direct Messages" %} diff --git a/bookwyrm/templatetags/date_ext.py b/bookwyrm/templatetags/date_ext.py new file mode 100644 index 000000000..efe55f2d9 --- /dev/null +++ b/bookwyrm/templatetags/date_ext.py @@ -0,0 +1,24 @@ +""" additional formatting of dates """ +from django import template +from django.template import defaultfilters +from django.contrib.humanize.templatetags.humanize import naturalday + +from bookwyrm.utils.partial_date import PartialDate + +register = template.Library() + + +@register.filter(expects_localtime=True) +def naturalday_partial(date, arg=None): + """chooses appropriate precision if date is a PartialDate object + + If arg is a Django-defined format such as "DATE_FORMAT", it will be adjusted + so that the precision of the PartialDate object is honored. + """ + if not isinstance(date, PartialDate) or date.has_day: + return naturalday(date, arg) + if not arg or arg == "DATE_FORMAT": + arg = "YEAR_MONTH_FORMAT" if date.has_month else "Y" + elif not date.has_month and arg in ("SHORT_DATE_FORMAT", "YEAR_MONTH_FORMAT"): + arg = "Y" + return defaultfilters.date(date, arg) diff --git a/bookwyrm/templatetags/utilities.py b/bookwyrm/templatetags/utilities.py index 4aaf6b8a7..230db366e 100644 --- a/bookwyrm/templatetags/utilities.py +++ b/bookwyrm/templatetags/utilities.py @@ -2,11 +2,14 @@ import os import re from uuid import uuid4 +from urllib.parse import urlparse from django import template from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ from django.templatetags.static import static +from bookwyrm.models import User +from bookwyrm.settings import INSTANCE_ACTOR_USERNAME register = template.Library() @@ -29,6 +32,13 @@ def get_user_identifier(user): return user.localname if user.localname else user.username +@register.filter(name="user_from_remote_id") +def get_user_identifier_from_remote_id(remote_id): + """get the local user id from their remote id""" + user = User.objects.get(remote_id=remote_id) + return user if user else None + + @register.filter(name="book_title") def get_title(book, too_short=5): """display the subtitle if the title is short""" @@ -103,3 +113,47 @@ def get_isni(existing, author, autoescape=True): f'' ) return "" + + +@register.simple_tag(takes_context=False) +def id_to_username(user_id): + """given an arbitrary remote id, return the username""" + if user_id: + url = urlparse(user_id) + domain = url.netloc + parts = url.path.split("/") + name = parts[-1] + value = f"{name}@{domain}" + + return value + return "a new user account" + + +@register.filter(name="get_file_size") +def get_file_size(file): + """display the size of a file in human readable terms""" + + try: + raw_size = os.stat(file.path).st_size + if raw_size < 1024: + return f"{raw_size} bytes" + if raw_size < 1024**2: + return f"{raw_size/1024:.2f} KB" + if raw_size < 1024**3: + return f"{raw_size/1024**2:.2f} MB" + return f"{raw_size/1024**3:.2f} GB" + except Exception: # pylint: disable=broad-except + return "" + + +@register.filter(name="get_user_permission") +def get_user_permission(user): + """given a user, return their permission level""" + + return user.groups.first() or "User" + + +@register.filter(name="is_instance_admin") +def is_instance_admin(localname): + """Returns a boolean indicating whether the user is the instance admin account""" + return localname == INSTANCE_ACTOR_USERNAME diff --git a/bookwyrm/tests/activitypub/test_author.py b/bookwyrm/tests/activitypub/test_author.py index 51beac49a..7579909a8 100644 --- a/bookwyrm/tests/activitypub/test_author.py +++ b/bookwyrm/tests/activitypub/test_author.py @@ -6,7 +6,8 @@ from bookwyrm import models class Author(TestCase): """serialize author tests""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """initial data""" self.book = models.Edition.objects.create( title="Example Edition", diff --git a/bookwyrm/tests/activitypub/test_base_activity.py b/bookwyrm/tests/activitypub/test_base_activity.py index c9022d35c..a0d10019f 100644 --- a/bookwyrm/tests/activitypub/test_base_activity.py +++ b/bookwyrm/tests/activitypub/test_base_activity.py @@ -28,8 +28,8 @@ from bookwyrm import models class BaseActivity(TestCase): """the super class for model-linked activitypub dataclasses""" - # pylint: disable=invalid-name - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """we're probably going to re-use this so why copy/paste""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" @@ -40,6 +40,7 @@ class BaseActivity(TestCase): self.user.remote_id = "http://example.com/a/b" self.user.save(broadcast=False, update_fields=["remote_id"]) + def setUp(self): datafile = pathlib.Path(__file__).parent.joinpath("../data/ap_user.json") self.userdata = json.loads(datafile.read_bytes()) # don't try to load the user icon diff --git a/bookwyrm/tests/activitypub/test_note.py b/bookwyrm/tests/activitypub/test_note.py index c4db2d9b1..fd5467f01 100644 --- a/bookwyrm/tests/activitypub/test_note.py +++ b/bookwyrm/tests/activitypub/test_note.py @@ -10,8 +10,8 @@ from bookwyrm import models class Note(TestCase): """the model-linked ActivityPub dataclass for Note-based types""" - # pylint: disable=invalid-name - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """create a shared user""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" diff --git a/bookwyrm/tests/activitypub/test_quotation.py b/bookwyrm/tests/activitypub/test_quotation.py index 678ee7aa3..9a0867c52 100644 --- a/bookwyrm/tests/activitypub/test_quotation.py +++ b/bookwyrm/tests/activitypub/test_quotation.py @@ -10,7 +10,8 @@ from bookwyrm import activitypub, models class Quotation(TestCase): """we have hecka ways to create statuses""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """model objects we'll need""" with patch("bookwyrm.models.user.set_remote_server.delay"): self.user = models.User.objects.create_user( @@ -26,6 +27,9 @@ class Quotation(TestCase): title="Example Edition", remote_id="https://example.com/book/1", ) + + def setUp(self): + """other test data""" datafile = pathlib.Path(__file__).parent.joinpath("../data/ap_quotation.json") self.status_data = json.loads(datafile.read_bytes()) diff --git a/bookwyrm/tests/activitystreams/test_abstractstream.py b/bookwyrm/tests/activitystreams/test_abstractstream.py index a9f2cfdd3..83985efdc 100644 --- a/bookwyrm/tests/activitystreams/test_abstractstream.py +++ b/bookwyrm/tests/activitystreams/test_abstractstream.py @@ -15,7 +15,8 @@ from bookwyrm import activitystreams, models class Activitystreams(TestCase): """using redis to build activity streams""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """use a test csv""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" @@ -43,6 +44,9 @@ class Activitystreams(TestCase): work = models.Work.objects.create(title="test work") self.book = models.Edition.objects.create(title="test book", parent_work=work) + def setUp(self): + """per-test setUp""" + class TestStream(activitystreams.ActivityStream): """test stream, don't have to do anything here""" diff --git a/bookwyrm/tests/activitystreams/test_booksstream.py b/bookwyrm/tests/activitystreams/test_booksstream.py index 1cd335b30..71d7ce531 100644 --- a/bookwyrm/tests/activitystreams/test_booksstream.py +++ b/bookwyrm/tests/activitystreams/test_booksstream.py @@ -14,7 +14,8 @@ from bookwyrm import activitystreams, models class Activitystreams(TestCase): """using redis to build activity streams""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """use a test csv""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" diff --git a/bookwyrm/tests/activitystreams/test_homestream.py b/bookwyrm/tests/activitystreams/test_homestream.py index 2dc975523..3312f20ee 100644 --- a/bookwyrm/tests/activitystreams/test_homestream.py +++ b/bookwyrm/tests/activitystreams/test_homestream.py @@ -12,7 +12,8 @@ from bookwyrm import activitystreams, models class Activitystreams(TestCase): """using redis to build activity streams""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """use a test csv""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" diff --git a/bookwyrm/tests/activitystreams/test_localstream.py b/bookwyrm/tests/activitystreams/test_localstream.py index 14c5798dc..f4ca13395 100644 --- a/bookwyrm/tests/activitystreams/test_localstream.py +++ b/bookwyrm/tests/activitystreams/test_localstream.py @@ -12,7 +12,8 @@ from bookwyrm import activitystreams, models class Activitystreams(TestCase): """using redis to build activity streams""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """use a test csv""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" diff --git a/bookwyrm/tests/activitystreams/test_signals.py b/bookwyrm/tests/activitystreams/test_signals.py index 210d4d5df..db16a0081 100644 --- a/bookwyrm/tests/activitystreams/test_signals.py +++ b/bookwyrm/tests/activitystreams/test_signals.py @@ -14,7 +14,8 @@ from bookwyrm import activitystreams, models class ActivitystreamsSignals(TestCase): """using redis to build activity streams""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """use a test csv""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" @@ -22,9 +23,6 @@ class ActivitystreamsSignals(TestCase): self.local_user = models.User.objects.create_user( "mouse", "mouse@mouse.mouse", "password", local=True, localname="mouse" ) - self.another_user = models.User.objects.create_user( - "fish", "fish@fish.fish", "password", local=True, localname="fish" - ) with patch("bookwyrm.models.user.set_remote_server.delay"): self.remote_user = models.User.objects.create_user( "rat", @@ -35,8 +33,6 @@ class ActivitystreamsSignals(TestCase): inbox="https://example.com/users/rat/inbox", outbox="https://example.com/users/rat/outbox", ) - work = models.Work.objects.create(title="test work") - self.book = models.Edition.objects.create(title="test book", parent_work=work) def test_add_status_on_create_ignore(self, *_): """a new statuses has entered""" diff --git a/bookwyrm/tests/activitystreams/test_tasks.py b/bookwyrm/tests/activitystreams/test_tasks.py index 82b8c2e5a..39a240e92 100644 --- a/bookwyrm/tests/activitystreams/test_tasks.py +++ b/bookwyrm/tests/activitystreams/test_tasks.py @@ -7,8 +7,8 @@ from bookwyrm import activitystreams, models class Activitystreams(TestCase): """using redis to build activity streams""" - # pylint: disable=invalid-name - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """use a test csv""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" diff --git a/bookwyrm/tests/connectors/test_abstract_connector.py b/bookwyrm/tests/connectors/test_abstract_connector.py index 02ac5c66a..b43966d6a 100644 --- a/bookwyrm/tests/connectors/test_abstract_connector.py +++ b/bookwyrm/tests/connectors/test_abstract_connector.py @@ -12,9 +12,10 @@ from bookwyrm.settings import DOMAIN class AbstractConnector(TestCase): """generic code for connecting to outside data sources""" - def setUp(self): - """we need an example connector""" - self.connector_info = models.Connector.objects.create( + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument + """we need an example connector in the database""" + models.Connector.objects.create( identifier="example.com", connector_file="openlibrary", base_url="https://example.com", @@ -22,19 +23,27 @@ class AbstractConnector(TestCase): covers_url="https://example.com/covers", search_url="https://example.com/search?q=", ) + self.book = models.Edition.objects.create( + title="Test Book", + remote_id="https://example.com/book/1234", + openlibrary_key="OL1234M", + ) + + def setUp(self): + """test data""" work_data = { "id": "abc1", "title": "Test work", "type": "work", "openlibraryKey": "OL1234W", } - self.work_data = work_data edition_data = { "id": "abc2", "title": "Test edition", "type": "edition", "openlibraryKey": "OL1234M", } + self.work_data = work_data self.edition_data = edition_data class TestConnector(abstract_connector.AbstractConnector): @@ -70,12 +79,6 @@ class AbstractConnector(TestCase): Mapping("openlibraryKey"), ] - self.book = models.Edition.objects.create( - title="Test Book", - remote_id="https://example.com/book/1234", - openlibrary_key="OL1234M", - ) - def test_abstract_connector_init(self): """barebones connector for search with defaults""" self.assertIsInstance(self.connector.book_mappings, list) diff --git a/bookwyrm/tests/connectors/test_abstract_minimal_connector.py b/bookwyrm/tests/connectors/test_abstract_minimal_connector.py index 119ca3581..73399649e 100644 --- a/bookwyrm/tests/connectors/test_abstract_minimal_connector.py +++ b/bookwyrm/tests/connectors/test_abstract_minimal_connector.py @@ -9,8 +9,9 @@ from bookwyrm.connectors.abstract_connector import Mapping class AbstractConnector(TestCase): """generic code for connecting to outside data sources""" - def setUp(self): - """we need an example connector""" + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument + """we need an example connector in the database""" self.connector_info = models.Connector.objects.create( identifier="example.com", connector_file="openlibrary", @@ -21,6 +22,9 @@ class AbstractConnector(TestCase): isbn_search_url="https://example.com/isbn?q=", ) + def setUp(self): + """instantiate example connector""" + class TestConnector(abstract_connector.AbstractMinimalConnector): """nothing added here""" diff --git a/bookwyrm/tests/connectors/test_bookwyrm_connector.py b/bookwyrm/tests/connectors/test_bookwyrm_connector.py index 1e369ca01..553901655 100644 --- a/bookwyrm/tests/connectors/test_bookwyrm_connector.py +++ b/bookwyrm/tests/connectors/test_bookwyrm_connector.py @@ -11,8 +11,9 @@ from bookwyrm.connectors.bookwyrm_connector import Connector class BookWyrmConnector(TestCase): """this connector doesn't do much, just search""" - def setUp(self): - """create the connector""" + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument + """create bookwrym_connector in the database""" models.Connector.objects.create( identifier="example.com", connector_file="bookwyrm_connector", @@ -21,6 +22,9 @@ class BookWyrmConnector(TestCase): covers_url="https://example.com/images/covers", search_url="https://example.com/search?q=", ) + + def setUp(self): + """test data""" self.connector = Connector("example.com") def test_get_or_create_book_existing(self): diff --git a/bookwyrm/tests/connectors/test_connector_manager.py b/bookwyrm/tests/connectors/test_connector_manager.py index c0c09147e..cc01f1116 100644 --- a/bookwyrm/tests/connectors/test_connector_manager.py +++ b/bookwyrm/tests/connectors/test_connector_manager.py @@ -10,7 +10,8 @@ from bookwyrm.connectors.bookwyrm_connector import Connector as BookWyrmConnecto class ConnectorManager(TestCase): """interface between the app and various connectors""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """we'll need some books and a connector info entry""" self.work = models.Work.objects.create(title="Example Work") diff --git a/bookwyrm/tests/connectors/test_inventaire_connector.py b/bookwyrm/tests/connectors/test_inventaire_connector.py index 3bba9ece3..c4ea1a595 100644 --- a/bookwyrm/tests/connectors/test_inventaire_connector.py +++ b/bookwyrm/tests/connectors/test_inventaire_connector.py @@ -14,8 +14,9 @@ from bookwyrm.connectors.connector_manager import ConnectorException class Inventaire(TestCase): """test loading data from inventaire.io""" - def setUp(self): - """creates the connector we'll use""" + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument + """creates the connector in the database""" models.Connector.objects.create( identifier="inventaire.io", name="Inventaire", @@ -26,6 +27,9 @@ class Inventaire(TestCase): search_url="https://inventaire.io/search?q=", isbn_search_url="https://inventaire.io/isbn", ) + + def setUp(self): + """connector instance""" self.connector = Connector("inventaire.io") @responses.activate diff --git a/bookwyrm/tests/connectors/test_openlibrary_connector.py b/bookwyrm/tests/connectors/test_openlibrary_connector.py index 70db03483..487356400 100644 --- a/bookwyrm/tests/connectors/test_openlibrary_connector.py +++ b/bookwyrm/tests/connectors/test_openlibrary_connector.py @@ -18,8 +18,9 @@ from bookwyrm.connectors.connector_manager import ConnectorException class Openlibrary(TestCase): """test loading data from openlibrary.org""" - def setUp(self): - """creates the connector we'll use""" + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument + """creates the connector in the database""" models.Connector.objects.create( identifier="openlibrary.org", name="OpenLibrary", @@ -30,6 +31,9 @@ class Openlibrary(TestCase): search_url="https://openlibrary.org/search?q=", isbn_search_url="https://openlibrary.org/isbn", ) + + def setUp(self): + """connector instance and other test data""" self.connector = Connector("openlibrary.org") work_file = pathlib.Path(__file__).parent.joinpath("../data/ol_work.json") diff --git a/bookwyrm/tests/data/bookwyrm_account_export.tar.gz b/bookwyrm/tests/data/bookwyrm_account_export.tar.gz new file mode 100644 index 000000000..34cee6bc0 Binary files /dev/null and b/bookwyrm/tests/data/bookwyrm_account_export.tar.gz differ diff --git a/bookwyrm/tests/data/user_import.json b/bookwyrm/tests/data/user_import.json new file mode 100644 index 000000000..0318ddfeb --- /dev/null +++ b/bookwyrm/tests/data/user_import.json @@ -0,0 +1,399 @@ +{ + "id": "https://www.example.com/user/rat", + "type": "Person", + "preferredUsername": "rat", + "inbox": "https://www.example.com/user/rat/inbox", + "publicKey": { + "id": "https://www.example.com/user/rat/#main-key", + "owner": "https://www.example.com/user/rat", + "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nzzzz\n-----END PUBLIC KEY-----" + }, + "followers": "https://www.example.com/user/rat/followers", + "following": "https://www.example.com/user/rat/following", + "outbox": "https://www.example.com/user/rat/outbox", + "endpoints": { + "sharedInbox": "https://www.example.com/inbox" + }, + "name": "Rat", + "summary": "

    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 = "1.10000000084510024" - - # pylint: disable=line-too-long self.author_body = "0000000084510024https://isni.org/isni/000000008451002460Catherine Amy Dawson Scottpoet and novelistpublicVIAFWKPQ544961C. A.Dawson Scott1865-1934publicVIAFNLPa28927850VIAF45886165ALLCREhttp://viaf.org/viaf/45886165Wikipediahttps://en.wikipedia.org/wiki/Catherine_Amy_Dawson_Scott" responses.get( @@ -85,8 +89,6 @@ class EditBookViews(TestCase): body=self.author_body, ) - models.SiteSettings.objects.create() - def test_edit_book_get(self): """there are so many views, this just makes sure it LOADS""" view = views.EditBook.as_view() @@ -209,6 +211,97 @@ class EditBookViews(TestCase): book = models.Edition.objects.get(title="New Title") self.assertEqual(book.parent_work.title, "New Title") + def test_published_date_timezone(self): + """user timezone does not affect publication year""" + # https://github.com/bookwyrm-social/bookwyrm/issues/3028 + self.local_user.groups.add(self.group) + create_book = views.CreateBook.as_view() + book_data = { + "title": "January 1st test", + "parent_work": self.work.id, + "last_edited_by": self.local_user.id, + "published_date_day": "1", + "published_date_month": "1", + "published_date_year": "2020", + } + request = self.factory.post("", book_data) + request.user = self.local_user + + with timezone.override("Europe/Madrid"): # Ahead of UTC. + create_book(request) + + book = models.Edition.objects.get(title="January 1st test") + self.assertEqual(book.edition_info, "2020") + + def test_partial_published_dates(self): + """create a book with partial publication dates, then update them""" + self.local_user.groups.add(self.group) + book_data = { + "title": "An Edition With Dates", + "parent_work": self.work.id, + "last_edited_by": self.local_user.id, + } + initial_pub_dates = { + # published_date: 2023-01-01 + "published_date_day": "1", + "published_date_month": "01", + "published_date_year": "2023", + # first_published_date: 1995 + "first_published_date_day": "", + "first_published_date_month": "", + "first_published_date_year": "1995", + } + updated_pub_dates = { + # published_date: full -> year-only + "published_date_day": "", + "published_date_month": "", + "published_date_year": "2023", + # first_published_date: add month + "first_published_date_day": "", + "first_published_date_month": "03", + "first_published_date_year": "1995", + } + + # create book + create_book = views.CreateBook.as_view() + request = self.factory.post("", book_data | initial_pub_dates) + request.user = self.local_user + + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): + create_book(request) + + book = models.Edition.objects.get(title="An Edition With Dates") + + self.assertEqual("2023-01-01", book.published_date.partial_isoformat()) + self.assertEqual("1995", book.first_published_date.partial_isoformat()) + + self.assertTrue(book.published_date.has_day) + self.assertTrue(book.published_date.has_month) + + self.assertFalse(book.first_published_date.has_day) + self.assertFalse(book.first_published_date.has_month) + + # now edit publication dates + edit_book = views.ConfirmEditBook.as_view() + request = self.factory.post("", book_data | updated_pub_dates) + request.user = self.local_user + + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): + result = edit_book(request, book.id) + + self.assertEqual(result.status_code, 302) + + book.refresh_from_db() + + self.assertEqual("2023", book.published_date.partial_isoformat()) + self.assertEqual("1995-03", book.first_published_date.partial_isoformat()) + + self.assertFalse(book.published_date.has_day) + self.assertFalse(book.published_date.has_month) + + self.assertFalse(book.first_published_date.has_day) + self.assertTrue(book.first_published_date.has_month) + def test_create_book_existing_work(self): """create an entirely new book and work""" view = views.ConfirmEditBook.as_view() diff --git a/bookwyrm/tests/views/books/test_editions.py b/bookwyrm/tests/views/books/test_editions.py index 70a95051a..64de34067 100644 --- a/bookwyrm/tests/views/books/test_editions.py +++ b/bookwyrm/tests/views/books/test_editions.py @@ -13,9 +13,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"): @@ -37,6 +37,10 @@ class BookViews(TestCase): models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_editions_page(self): """there are so many views, this just makes sure it LOADS""" view = views.Editions.as_view() diff --git a/bookwyrm/tests/views/books/test_links.py b/bookwyrm/tests/views/books/test_links.py index bace38b7e..817463656 100644 --- a/bookwyrm/tests/views/books/test_links.py +++ b/bookwyrm/tests/views/books/test_links.py @@ -15,10 +15,9 @@ from bookwyrm.tests.validate_html import validate_html class LinkViews(TestCase): """books books books""" - # 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" ): @@ -49,6 +48,10 @@ class LinkViews(TestCase): models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_add_link_page(self): """there are so many views, this just makes sure it LOADS""" view = views.AddFileLink.as_view() diff --git a/bookwyrm/tests/views/imports/test_import.py b/bookwyrm/tests/views/imports/test_import.py index 7dd87d4c2..d0612ee68 100644 --- a/bookwyrm/tests/views/imports/test_import.py +++ b/bookwyrm/tests/views/imports/test_import.py @@ -16,10 +16,9 @@ from bookwyrm.tests.validate_html import validate_html class ImportViews(TestCase): """goodreads import views""" - # 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"): @@ -32,6 +31,10 @@ class ImportViews(TestCase): ) models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_import_page(self): """there are so many views, this just makes sure it LOADS""" view = views.Import.as_view() diff --git a/bookwyrm/tests/views/imports/test_import_review.py b/bookwyrm/tests/views/imports/test_import_review.py index 92839be6d..27bb3f9d1 100644 --- a/bookwyrm/tests/views/imports/test_import_review.py +++ b/bookwyrm/tests/views/imports/test_import_review.py @@ -11,10 +11,9 @@ from bookwyrm import models, views class ImportManualReviewViews(TestCase): """goodreads import views""" - # 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 ImportManualReviewViews(TestCase): parent_work=work, ) + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_import_troubleshoot_get(self): """there are so many views, this just makes sure it LOADS""" view = views.ImportManualReview.as_view() diff --git a/bookwyrm/tests/views/imports/test_import_troubleshoot.py b/bookwyrm/tests/views/imports/test_import_troubleshoot.py index a40e96118..0e12c406a 100644 --- a/bookwyrm/tests/views/imports/test_import_troubleshoot.py +++ b/bookwyrm/tests/views/imports/test_import_troubleshoot.py @@ -12,10 +12,9 @@ from bookwyrm import models, views class ImportTroubleshootViews(TestCase): """goodreads import views""" - # 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"): @@ -28,6 +27,10 @@ class ImportTroubleshootViews(TestCase): ) models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_import_troubleshoot_get(self): """there are so many views, this just makes sure it LOADS""" view = views.ImportTroubleshoot.as_view() diff --git a/bookwyrm/tests/views/imports/test_user_import.py b/bookwyrm/tests/views/imports/test_user_import.py new file mode 100644 index 000000000..db5837101 --- /dev/null +++ b/bookwyrm/tests/views/imports/test_user_import.py @@ -0,0 +1,68 @@ +""" test for app action functionality """ +import pathlib +from unittest.mock import patch + +from django.core.files.uploadedfile import SimpleUploadedFile +from django.template.response import TemplateResponse +from django.test import TestCase +from django.test.client import RequestFactory + +from bookwyrm import forms, models, views +from bookwyrm.tests.validate_html import validate_html + + +class ImportUserViews(TestCase): + """user import views""" + + # pylint: disable=invalid-name + def setUp(self): + """we need basic test data and mocks""" + self.factory = RequestFactory() + with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( + "bookwyrm.activitystreams.populate_stream_task.delay" + ), 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", + ) + models.SiteSettings.objects.create() + + def test_get_user_import_page(self): + """there are so many views, this just makes sure it LOADS""" + view = views.UserImport.as_view() + request = self.factory.get("") + request.user = self.local_user + result = view(request) + self.assertIsInstance(result, TemplateResponse) + validate_html(result.render()) + self.assertEqual(result.status_code, 200) + + def test_user_import_post(self): + """does the import job start?""" + + view = views.UserImport.as_view() + form = forms.ImportUserForm() + archive_file = pathlib.Path(__file__).parent.joinpath( + "../../data/bookwyrm_account_export.tar.gz" + ) + + form.data["archive_file"] = SimpleUploadedFile( + # pylint: disable=consider-using-with + archive_file, + open(archive_file, "rb").read(), + content_type="application/gzip", + ) + + form.data["include_user_settings"] = "" + form.data["include_goals"] = "on" + + request = self.factory.post("", form.data) + request.user = self.local_user + + with patch("bookwyrm.models.bookwyrm_import_job.BookwyrmImportJob.start_job"): + view(request) + job = models.BookwyrmImportJob.objects.get() + self.assertEqual(job.required, ["include_goals"]) diff --git a/bookwyrm/tests/views/inbox/test_inbox.py b/bookwyrm/tests/views/inbox/test_inbox.py index 61acde5d3..1c05806a5 100644 --- a/bookwyrm/tests/views/inbox/test_inbox.py +++ b/bookwyrm/tests/views/inbox/test_inbox.py @@ -15,12 +15,22 @@ from bookwyrm import models, views class Inbox(TestCase): """readthrough tests""" - # pylint: disable=invalid-name def setUp(self): - """basic user and book data""" + """individual test setup""" self.client = Client() self.factory = RequestFactory() + self.create_json = { + "id": "hi", + "type": "Create", + "actor": "hi", + "to": ["https://www.w3.org/ns/activitystreams#public"], + "cc": ["https://example.com/user/mouse/followers"], + "object": {}, + } + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument + """basic user and book data""" 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,14 +53,6 @@ class Inbox(TestCase): inbox="https://example.com/users/rat/inbox", outbox="https://example.com/users/rat/outbox", ) - self.create_json = { - "id": "hi", - "type": "Create", - "actor": "hi", - "to": ["https://www.w3.org/ns/activitystreams#public"], - "cc": ["https://example.com/user/mouse/followers"], - "object": {}, - } models.SiteSettings.objects.create() def test_inbox_invalid_get(self): diff --git a/bookwyrm/tests/views/inbox/test_inbox_add.py b/bookwyrm/tests/views/inbox/test_inbox_add.py index fccd1a50f..5fbeaa33a 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_add.py +++ b/bookwyrm/tests/views/inbox/test_inbox_add.py @@ -11,7 +11,8 @@ from bookwyrm import models, views class InboxAdd(TestCase): """inbox tests""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """basic user and book data""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" diff --git a/bookwyrm/tests/views/inbox/test_inbox_announce.py b/bookwyrm/tests/views/inbox/test_inbox_announce.py index c77c18bc5..e6fdf9375 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_announce.py +++ b/bookwyrm/tests/views/inbox/test_inbox_announce.py @@ -11,7 +11,8 @@ from bookwyrm import models, views class InboxActivities(TestCase): """inbox tests""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """basic user and book data""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" @@ -44,6 +45,10 @@ class InboxActivities(TestCase): remote_id="https://example.com/status/1", ) + models.SiteSettings.objects.create() + + def setUp(self): + """individual test setup""" self.create_json = { "id": "hi", "type": "Create", @@ -53,8 +58,6 @@ class InboxActivities(TestCase): "object": {}, } - models.SiteSettings.objects.create() - @patch("bookwyrm.activitystreams.handle_boost_task.delay") def test_boost(self, _): """boost a status""" diff --git a/bookwyrm/tests/views/inbox/test_inbox_block.py b/bookwyrm/tests/views/inbox/test_inbox_block.py index eb73af094..9fef621ea 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_block.py +++ b/bookwyrm/tests/views/inbox/test_inbox_block.py @@ -10,7 +10,8 @@ from bookwyrm import models, views class InboxBlock(TestCase): """inbox tests""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """basic user and book data""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" diff --git a/bookwyrm/tests/views/inbox/test_inbox_create.py b/bookwyrm/tests/views/inbox/test_inbox_create.py index f0fb84edf..c2045b092 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_create.py +++ b/bookwyrm/tests/views/inbox/test_inbox_create.py @@ -9,7 +9,7 @@ from bookwyrm import models, views from bookwyrm.activitypub import ActivitySerializerError -# pylint: disable=too-many-public-methods, invalid-name +# pylint: disable=too-many-public-methods class TransactionInboxCreate(TransactionTestCase): """readthrough tests""" @@ -71,7 +71,8 @@ class TransactionInboxCreate(TransactionTestCase): class InboxCreate(TestCase): """readthrough tests""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """basic user and book data""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" @@ -96,6 +97,10 @@ class InboxCreate(TestCase): outbox="https://example.com/users/rat/outbox", ) + models.SiteSettings.objects.create() + + def setUp(self): + """individual test setup""" self.create_json = { "id": "hi", "type": "Create", @@ -104,7 +109,6 @@ class InboxCreate(TestCase): "cc": ["https://example.com/user/mouse/followers"], "object": {}, } - models.SiteSettings.objects.create() def test_create_status(self, *_): """the "it justs works" mode""" diff --git a/bookwyrm/tests/views/inbox/test_inbox_delete.py b/bookwyrm/tests/views/inbox/test_inbox_delete.py index 0fb108e22..8023308be 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_delete.py +++ b/bookwyrm/tests/views/inbox/test_inbox_delete.py @@ -11,7 +11,8 @@ from bookwyrm import models, views class InboxActivities(TestCase): """inbox tests""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """basic user and book data""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" @@ -97,7 +98,8 @@ class InboxActivities(TestCase): self.assertEqual(models.Notification.objects.get(), notif) @patch("bookwyrm.suggested_users.remove_user_task.delay") - def test_delete_user(self, _): + @patch("bookwyrm.activitystreams.remove_status_task.delay") + def test_delete_user(self, *_): """delete a user""" self.assertTrue(models.User.objects.get(username="rat@example.com").is_active) activity = { diff --git a/bookwyrm/tests/views/inbox/test_inbox_follow.py b/bookwyrm/tests/views/inbox/test_inbox_follow.py index 13e46ff8d..180a57176 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_follow.py +++ b/bookwyrm/tests/views/inbox/test_inbox_follow.py @@ -11,7 +11,8 @@ from bookwyrm import models, views class InboxRelationships(TestCase): """inbox tests""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """basic user and book data""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" diff --git a/bookwyrm/tests/views/inbox/test_inbox_like.py b/bookwyrm/tests/views/inbox/test_inbox_like.py index ea4d4a65a..34c8c830b 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_like.py +++ b/bookwyrm/tests/views/inbox/test_inbox_like.py @@ -10,7 +10,8 @@ from bookwyrm import models, views class InboxActivities(TestCase): """inbox tests""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """basic user and book data""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" @@ -43,6 +44,10 @@ class InboxActivities(TestCase): remote_id="https://example.com/status/1", ) + models.SiteSettings.objects.create() + + def setUp(self): + """individual test setup""" self.create_json = { "id": "hi", "type": "Create", @@ -52,8 +57,6 @@ class InboxActivities(TestCase): "object": {}, } - models.SiteSettings.objects.create() - def test_handle_favorite(self): """fav a status""" activity = { diff --git a/bookwyrm/tests/views/inbox/test_inbox_remove.py b/bookwyrm/tests/views/inbox/test_inbox_remove.py index d7b3f6778..d80a4fdd7 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_remove.py +++ b/bookwyrm/tests/views/inbox/test_inbox_remove.py @@ -10,7 +10,8 @@ from bookwyrm import models, views class InboxRemove(TestCase): """inbox tests""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """basic user and book data""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" diff --git a/bookwyrm/tests/views/inbox/test_inbox_update.py b/bookwyrm/tests/views/inbox/test_inbox_update.py index e8593c2be..b9f924bad 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_update.py +++ b/bookwyrm/tests/views/inbox/test_inbox_update.py @@ -12,7 +12,8 @@ from bookwyrm import models, views class InboxUpdate(TestCase): """inbox tests""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """basic user and book data""" with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( "bookwyrm.activitystreams.populate_stream_task.delay" @@ -37,6 +38,10 @@ class InboxUpdate(TestCase): outbox="https://example.com/users/rat/outbox", ) + models.SiteSettings.objects.create() + + def setUp(self): + """individual test setup""" self.update_json = { "id": "hi", "type": "Update", @@ -46,8 +51,6 @@ class InboxUpdate(TestCase): "object": {}, } - models.SiteSettings.objects.create() - def test_update_list(self): """a new list""" with patch( diff --git a/bookwyrm/tests/views/landing/test_invite.py b/bookwyrm/tests/views/landing/test_invite.py index a96ecb9f2..f7ec73cf4 100644 --- a/bookwyrm/tests/views/landing/test_invite.py +++ b/bookwyrm/tests/views/landing/test_invite.py @@ -14,10 +14,9 @@ from bookwyrm.tests.validate_html import validate_html class InviteViews(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,10 @@ class InviteViews(TestCase): ) models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_invite_page(self): """there are so many views, this just makes sure it LOADS""" view = views.Invite.as_view() diff --git a/bookwyrm/tests/views/landing/test_landing.py b/bookwyrm/tests/views/landing/test_landing.py index f56eaf7a9..b67857da8 100644 --- a/bookwyrm/tests/views/landing/test_landing.py +++ b/bookwyrm/tests/views/landing/test_landing.py @@ -14,9 +14,9 @@ from bookwyrm.tests.validate_html import validate_html class LandingViews(TestCase): """pages you land on without really trying""" - def setUp(self): # pylint: disable=invalid-name + @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,9 +27,13 @@ class LandingViews(TestCase): local=True, localname="mouse", ) + models.SiteSettings.objects.create() + + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() self.anonymous_user = AnonymousUser self.anonymous_user.is_authenticated = False - models.SiteSettings.objects.create() @patch("bookwyrm.suggested_users.SuggestedUsers.get_suggestions") def test_home_page(self, _): diff --git a/bookwyrm/tests/views/landing/test_login.py b/bookwyrm/tests/views/landing/test_login.py index eab082609..19ad1d2a0 100644 --- a/bookwyrm/tests/views/landing/test_login.py +++ b/bookwyrm/tests/views/landing/test_login.py @@ -17,10 +17,9 @@ from bookwyrm.tests.validate_html import validate_html class LoginViews(TestCase): """login and password management""" - # 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"): @@ -47,9 +46,13 @@ class LoginViews(TestCase): localname="badger", two_factor_auth=True, ) + models.SiteSettings.objects.create(id=1, require_confirm_email=False) + + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() self.anonymous_user = AnonymousUser self.anonymous_user.is_authenticated = False - models.SiteSettings.objects.create(id=1, require_confirm_email=False) def test_login_get(self, *_): """there are so many views, this just makes sure it LOADS""" diff --git a/bookwyrm/tests/views/landing/test_password.py b/bookwyrm/tests/views/landing/test_password.py index c1adf61e9..ceceeb3e4 100644 --- a/bookwyrm/tests/views/landing/test_password.py +++ b/bookwyrm/tests/views/landing/test_password.py @@ -16,9 +16,9 @@ from bookwyrm.tests.validate_html import validate_html class PasswordViews(TestCase): """view user and edit profile""" - 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"): @@ -29,9 +29,13 @@ class PasswordViews(TestCase): local=True, localname="mouse", ) + models.SiteSettings.objects.create(id=1) + + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() self.anonymous_user = AnonymousUser self.anonymous_user.is_authenticated = False - models.SiteSettings.objects.create(id=1) def test_password_reset_request(self): """there are so many views, this just makes sure it LOADS""" diff --git a/bookwyrm/tests/views/landing/test_register.py b/bookwyrm/tests/views/landing/test_register.py index 04f3a25ec..381a35a32 100644 --- a/bookwyrm/tests/views/landing/test_register.py +++ b/bookwyrm/tests/views/landing/test_register.py @@ -20,10 +20,9 @@ from bookwyrm.tests.validate_html import validate_html class RegisterViews(TestCase): """login and password management""" - # 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,13 +33,16 @@ class RegisterViews(TestCase): local=True, localname="mouse", ) - self.anonymous_user = AnonymousUser - self.anonymous_user.is_authenticated = False - self.settings = models.SiteSettings.objects.create( id=1, require_confirm_email=False, allow_registration=True ) + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + self.anonymous_user = AnonymousUser + self.anonymous_user.is_authenticated = False + def test_get_redirect(self, *_): """there's no dedicated registration page""" view = views.Register.as_view() diff --git a/bookwyrm/tests/views/lists/test_curate.py b/bookwyrm/tests/views/lists/test_curate.py index 9f3427b2c..7fa48f915 100644 --- a/bookwyrm/tests/views/lists/test_curate.py +++ b/bookwyrm/tests/views/lists/test_curate.py @@ -15,9 +15,9 @@ from bookwyrm.tests.validate_html import validate_html class ListViews(TestCase): """list view""" - 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,11 +42,15 @@ class ListViews(TestCase): self.list = models.List.objects.create( name="Test List", user=self.local_user ) - self.anonymous_user = AnonymousUser - self.anonymous_user.is_authenticated = False models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + self.anonymous_user = AnonymousUser + self.anonymous_user.is_authenticated = False + def test_curate_page(self): """there are so many views, this just makes sure it LOADS""" view = views.Curate.as_view() diff --git a/bookwyrm/tests/views/lists/test_embed.py b/bookwyrm/tests/views/lists/test_embed.py index 4191ffe0d..40c51f5df 100644 --- a/bookwyrm/tests/views/lists/test_embed.py +++ b/bookwyrm/tests/views/lists/test_embed.py @@ -15,9 +15,9 @@ from bookwyrm.tests.validate_html import validate_html class ListViews(TestCase): """list view""" - 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,11 +42,15 @@ class ListViews(TestCase): self.list = models.List.objects.create( name="Test List", user=self.local_user ) - self.anonymous_user = AnonymousUser - self.anonymous_user.is_authenticated = False models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + self.anonymous_user = AnonymousUser + self.anonymous_user.is_authenticated = False + def test_embed_call_without_key(self): """there are so many views, this just makes sure it DOESN’T load""" view = views.unsafe_embed_list diff --git a/bookwyrm/tests/views/lists/test_list.py b/bookwyrm/tests/views/lists/test_list.py index 98b0a461a..b1e7e2acc 100644 --- a/bookwyrm/tests/views/lists/test_list.py +++ b/bookwyrm/tests/views/lists/test_list.py @@ -18,9 +18,9 @@ from bookwyrm.tests.validate_html import validate_html class ListViews(TestCase): """list view""" - 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"): @@ -71,11 +71,15 @@ class ListViews(TestCase): self.list = models.List.objects.create( name="Test List", user=self.local_user ) - self.anonymous_user = AnonymousUser - self.anonymous_user.is_authenticated = False models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + self.anonymous_user = AnonymousUser + self.anonymous_user.is_authenticated = False + def test_list_page(self): """there are so many views, this just makes sure it LOADS""" view = views.List.as_view() diff --git a/bookwyrm/tests/views/lists/test_list_item.py b/bookwyrm/tests/views/lists/test_list_item.py index b95282bef..ebdbdbc2e 100644 --- a/bookwyrm/tests/views/lists/test_list_item.py +++ b/bookwyrm/tests/views/lists/test_list_item.py @@ -12,9 +12,9 @@ from bookwyrm import models, views class ListItemViews(TestCase): """list view""" - 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 ListItemViews(TestCase): models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_add_list_item_notes(self): """there are so many views, this just makes sure it LOADS""" view = views.ListItem.as_view() diff --git a/bookwyrm/tests/views/lists/test_lists.py b/bookwyrm/tests/views/lists/test_lists.py index 38a97c412..0d2213ee7 100644 --- a/bookwyrm/tests/views/lists/test_lists.py +++ b/bookwyrm/tests/views/lists/test_lists.py @@ -15,10 +15,9 @@ from bookwyrm.tests.validate_html import validate_html class ListViews(TestCase): """lists of lists""" - # 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"): @@ -33,11 +32,15 @@ class ListViews(TestCase): self.another_user = models.User.objects.create_user( "rat@local.com", "rat@rat.com", "ratword", local=True, localname="rat" ) - self.anonymous_user = AnonymousUser - self.anonymous_user.is_authenticated = False models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + self.anonymous_user = AnonymousUser + self.anonymous_user.is_authenticated = False + @patch("bookwyrm.lists_stream.ListsStream.get_list_stream") def test_lists_page(self, _): """there are so many views, this just makes sure it LOADS""" diff --git a/bookwyrm/tests/views/preferences/test_block.py b/bookwyrm/tests/views/preferences/test_block.py index 46de8f48e..86ef95e7e 100644 --- a/bookwyrm/tests/views/preferences/test_block.py +++ b/bookwyrm/tests/views/preferences/test_block.py @@ -13,9 +13,9 @@ from bookwyrm.tests.validate_html import validate_html class BlockViews(TestCase): """view user and edit profile""" - 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"): @@ -39,6 +39,10 @@ class BlockViews(TestCase): models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_block_get(self, _): """there are so many views, this just makes sure it LOADS""" view = views.Block.as_view() diff --git a/bookwyrm/tests/views/preferences/test_change_password.py b/bookwyrm/tests/views/preferences/test_change_password.py index 879ffd03d..49eac998c 100644 --- a/bookwyrm/tests/views/preferences/test_change_password.py +++ b/bookwyrm/tests/views/preferences/test_change_password.py @@ -12,9 +12,9 @@ from bookwyrm.tests.validate_html import validate_html class ChangePasswordViews(TestCase): """view user and edit profile""" - 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 ChangePasswordViews(TestCase): ) models.SiteSettings.objects.create(id=1) + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_password_change_get(self): """there are so many views, this just makes sure it LOADS""" view = views.ChangePassword.as_view() diff --git a/bookwyrm/tests/views/preferences/test_delete_user.py b/bookwyrm/tests/views/preferences/test_delete_user.py index 1994a5a4d..d97ef0d38 100644 --- a/bookwyrm/tests/views/preferences/test_delete_user.py +++ b/bookwyrm/tests/views/preferences/test_delete_user.py @@ -16,10 +16,9 @@ from bookwyrm.tests.validate_html import validate_html class DeleteUserViews(TestCase): """view user and edit profile""" - # 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"): @@ -50,9 +49,13 @@ class DeleteUserViews(TestCase): shelf=self.local_user.shelf_set.first(), ) + models.SiteSettings.objects.create() + + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() self.anonymous_user = AnonymousUser self.anonymous_user.is_authenticated = False - models.SiteSettings.objects.create() def test_delete_user_page(self, _): """there are so many views, this just makes sure it LOADS""" diff --git a/bookwyrm/tests/views/preferences/test_edit_user.py b/bookwyrm/tests/views/preferences/test_edit_user.py index 11d333406..1ed4e3240 100644 --- a/bookwyrm/tests/views/preferences/test_edit_user.py +++ b/bookwyrm/tests/views/preferences/test_edit_user.py @@ -18,9 +18,9 @@ from bookwyrm.tests.validate_html import validate_html class EditUserViews(TestCase): """view user and edit profile""" - 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 +48,10 @@ class EditUserViews(TestCase): ) models.SiteSettings.objects.create() + + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() self.anonymous_user = AnonymousUser self.anonymous_user.is_authenticated = False diff --git a/bookwyrm/tests/views/preferences/test_export.py b/bookwyrm/tests/views/preferences/test_export.py index fbc55a9e3..3f758b2f7 100644 --- a/bookwyrm/tests/views/preferences/test_export.py +++ b/bookwyrm/tests/views/preferences/test_export.py @@ -17,9 +17,11 @@ from bookwyrm.tests.validate_html import validate_html class ExportViews(TestCase): """viewing and creating statuses""" - def setUp(self): + @classmethod + def setUpTestData( + self, + ): # pylint: disable=bad-classmethod-argument, disable=invalid-name """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" ): @@ -40,6 +42,11 @@ class ExportViews(TestCase): bnf_id="beep", ) + # pylint: disable=invalid-name + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def tst_export_get(self, *_): """request export""" request = self.factory.get("") @@ -49,11 +56,12 @@ class ExportViews(TestCase): def test_export_file(self, *_): """simple export""" - models.ShelfBook.objects.create( + shelfbook = models.ShelfBook.objects.create( shelf=self.local_user.shelf_set.first(), user=self.local_user, book=self.book, ) + book_date = str.encode(f"{shelfbook.shelved_date.date()}") request = self.factory.post("") request.user = self.local_user export = views.Export.as_view()(request) @@ -62,7 +70,7 @@ class ExportViews(TestCase): # pylint: disable=line-too-long self.assertEqual( export.content, - b"title,author_text,remote_id,openlibrary_key,inventaire_id,librarything_key,goodreads_key,bnf_id,viaf,wikidata,asin,aasin,isfdb,isbn_10,isbn_13,oclc_number,rating,review_name,review_cw,review_content\r\nTest Book,," - + self.book.remote_id.encode("utf-8") - + b",,,,,beep,,,,,,123456789X,9781234567890,,,,,\r\n", + b"title,author_text,remote_id,openlibrary_key,inventaire_id,librarything_key,goodreads_key,bnf_id,viaf,wikidata,asin,aasin,isfdb,isbn_10,isbn_13,oclc_number,start_date,finish_date,stopped_date,rating,review_name,review_cw,review_content,review_published,shelf,shelf_name,shelf_date\r\n" + + b"Test Book,,%b,,,,,beep,,,,,,123456789X,9781234567890,,,,,,,,,,to-read,To Read,%b\r\n" + % (self.book.remote_id.encode("utf-8"), book_date), ) diff --git a/bookwyrm/tests/views/preferences/test_export_user.py b/bookwyrm/tests/views/preferences/test_export_user.py new file mode 100644 index 000000000..654ed2a05 --- /dev/null +++ b/bookwyrm/tests/views/preferences/test_export_user.py @@ -0,0 +1,50 @@ +""" test for user export app functionality """ +from unittest.mock import patch + +from django.http import HttpResponse +from django.test import TestCase +from django.test.client import RequestFactory + +from bookwyrm import models, views +from bookwyrm.tests.validate_html import validate_html + + +class ExportUserViews(TestCase): + """exporting user data""" + + def setUp(self): + self.factory = RequestFactory() + models.SiteSettings.objects.create() + with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( + "bookwyrm.activitystreams.populate_stream_task.delay" + ): + self.local_user = models.User.objects.create_user( + "hugh@example.com", + "hugh@example.com", + "password", + local=True, + localname="Hugh", + summary="just a test account", + remote_id="https://example.com/users/hugh", + preferred_timezone="Australia/Broken_Hill", + ) + + def test_export_user_get(self, *_): + """request export""" + request = self.factory.get("") + request.user = self.local_user + result = views.ExportUser.as_view()(request) + validate_html(result.render()) + + def test_trigger_export_user_file(self, *_): + """simple user export""" + + request = self.factory.post("") + request.user = self.local_user + with patch("bookwyrm.models.bookwyrm_export_job.start_export_task.delay"): + export = views.ExportUser.as_view()(request) + self.assertIsInstance(export, HttpResponse) + self.assertEqual(export.status_code, 302) + + jobs = models.bookwyrm_export_job.BookwyrmExportJob.objects.count() + self.assertEqual(jobs, 1) diff --git a/bookwyrm/tests/views/preferences/test_two_factor_auth.py b/bookwyrm/tests/views/preferences/test_two_factor_auth.py index ac6bd654c..dbd9c1f5b 100644 --- a/bookwyrm/tests/views/preferences/test_two_factor_auth.py +++ b/bookwyrm/tests/views/preferences/test_two_factor_auth.py @@ -17,9 +17,9 @@ from bookwyrm import forms, models, views class TwoFactorViews(TestCase): """Two Factor Authentication management""" - 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 TwoFactorViews(TestCase): hotp_secret="DRMNMOU7ZRKH5YPW7PADOEYUF7MRIH46", hotp_count=0, ) + + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() self.anonymous_user = AnonymousUser self.anonymous_user.is_authenticated = False diff --git a/bookwyrm/tests/views/shelf/test_shelf.py b/bookwyrm/tests/views/shelf/test_shelf.py index 9aec632f7..492f214e3 100644 --- a/bookwyrm/tests/views/shelf/test_shelf.py +++ b/bookwyrm/tests/views/shelf/test_shelf.py @@ -20,9 +20,9 @@ from bookwyrm.tests.validate_html import validate_html class ShelfViews(TestCase): """tag views""" - 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,6 +46,9 @@ class ShelfViews(TestCase): ) models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() self.anonymous_user = AnonymousUser self.anonymous_user.is_authenticated = False diff --git a/bookwyrm/tests/views/shelf/test_shelf_actions.py b/bookwyrm/tests/views/shelf/test_shelf_actions.py index 290232580..eea17b62d 100644 --- a/bookwyrm/tests/views/shelf/test_shelf_actions.py +++ b/bookwyrm/tests/views/shelf/test_shelf_actions.py @@ -18,9 +18,9 @@ from bookwyrm import forms, models, views class ShelfActionViews(TestCase): """tag views""" - 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"): @@ -52,6 +52,10 @@ class ShelfActionViews(TestCase): ) models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_shelve(self, *_): """shelve a book""" request = self.factory.post( diff --git a/bookwyrm/tests/views/test_annual_summary.py b/bookwyrm/tests/views/test_annual_summary.py index aaba0aac6..d51060a72 100644 --- a/bookwyrm/tests/views/test_annual_summary.py +++ b/bookwyrm/tests/views/test_annual_summary.py @@ -21,10 +21,9 @@ def make_date(*args): class AnnualSummary(TestCase): """views""" - # 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"): @@ -44,13 +43,15 @@ class AnnualSummary(TestCase): parent_work=self.work, pages=300, ) + models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.year = "2020" + self.factory = RequestFactory() self.anonymous_user = AnonymousUser self.anonymous_user.is_authenticated = False - self.year = "2020" - models.SiteSettings.objects.create() - def test_annual_summary_not_authenticated(self, *_): """there are so many views, this just makes sure it DOESN’T LOAD""" view = views.AnnualSummary.as_view() diff --git a/bookwyrm/tests/views/test_author.py b/bookwyrm/tests/views/test_author.py index 1f8fc51c5..669149af2 100644 --- a/bookwyrm/tests/views/test_author.py +++ b/bookwyrm/tests/views/test_author.py @@ -16,9 +16,9 @@ from bookwyrm.tests.validate_html import validate_html class AuthorViews(TestCase): """author views""" - 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"): @@ -44,10 +44,13 @@ class AuthorViews(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() self.anonymous_user = AnonymousUser self.anonymous_user.is_authenticated = False - models.SiteSettings.objects.create() def test_author_page(self): """there are so many views, this just makes sure it LOADS""" diff --git a/bookwyrm/tests/views/test_directory.py b/bookwyrm/tests/views/test_directory.py index bceb0e7aa..7e9e97522 100644 --- a/bookwyrm/tests/views/test_directory.py +++ b/bookwyrm/tests/views/test_directory.py @@ -13,9 +13,9 @@ from bookwyrm.tests.validate_html import validate_html class DirectoryViews(TestCase): """tag views""" - 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,8 +27,11 @@ class DirectoryViews(TestCase): localname="mouse", remote_id="https://example.com/users/mouse", ) - models.SiteSettings.objects.create() + + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() self.anonymous_user = AnonymousUser self.anonymous_user.is_authenticated = False diff --git a/bookwyrm/tests/views/test_discover.py b/bookwyrm/tests/views/test_discover.py index ffe8c51c9..9aa139074 100644 --- a/bookwyrm/tests/views/test_discover.py +++ b/bookwyrm/tests/views/test_discover.py @@ -11,10 +11,9 @@ from bookwyrm.tests.validate_html import validate_html class DiscoverViews(TestCase): """pages you land on without really trying""" - # 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"): @@ -25,9 +24,13 @@ class DiscoverViews(TestCase): local=True, localname="mouse", ) + models.SiteSettings.objects.create() + + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() self.anonymous_user = AnonymousUser self.anonymous_user.is_authenticated = False - models.SiteSettings.objects.create() def test_discover_page_empty(self): """there are so many views, this just makes sure it LOADS""" diff --git a/bookwyrm/tests/views/test_feed.py b/bookwyrm/tests/views/test_feed.py index 99b2a396b..33dbd4ea5 100644 --- a/bookwyrm/tests/views/test_feed.py +++ b/bookwyrm/tests/views/test_feed.py @@ -24,9 +24,9 @@ from bookwyrm.tests.validate_html import validate_html class FeedViews(TestCase): """activity feed, statuses, dms""" - 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"): @@ -51,6 +51,10 @@ class FeedViews(TestCase): ) models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + @patch("bookwyrm.suggested_users.SuggestedUsers.get_suggestions") def test_feed(self, *_): """there are so many views, this just makes sure it LOADS""" diff --git a/bookwyrm/tests/views/test_follow.py b/bookwyrm/tests/views/test_follow.py index d18e24f89..e70ace769 100644 --- a/bookwyrm/tests/views/test_follow.py +++ b/bookwyrm/tests/views/test_follow.py @@ -17,10 +17,10 @@ from bookwyrm.tests.validate_html import validate_html class FollowViews(TestCase): """follows""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """we need basic test data and mocks""" models.SiteSettings.objects.create() - 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"): @@ -57,6 +57,10 @@ class FollowViews(TestCase): parent_work=self.work, ) + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_handle_follow_remote(self, *_): """send a follow request""" request = self.factory.post("", {"user": self.remote_user.username}) @@ -173,13 +177,39 @@ class FollowViews(TestCase): user_subject=self.remote_user, user_object=self.local_user ) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ) as broadcast_mock: views.delete_follow_request(request) + # did we send the reject activity? + activity = json.loads(broadcast_mock.call_args[1]["args"][1]) + self.assertEqual(activity["actor"], self.local_user.remote_id) + self.assertEqual(activity["object"]["object"], rel.user_object.remote_id) + self.assertEqual(activity["type"], "Reject") # request should be deleted self.assertEqual(models.UserFollowRequest.objects.filter(id=rel.id).count(), 0) # follow relationship should not exist self.assertEqual(models.UserFollows.objects.filter(id=rel.id).count(), 0) + def test_handle_reject_existing(self, *_): + """reject a follow previously approved""" + request = self.factory.post("", {"user": self.remote_user.username}) + request.user = self.local_user + rel = models.UserFollows.objects.create( + user_subject=self.remote_user, user_object=self.local_user + ) + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + ) as broadcast_mock: + views.remove_follow(request, self.remote_user.id) + # did we send the reject activity? + activity = json.loads(broadcast_mock.call_args[1]["args"][1]) + self.assertEqual(activity["actor"], self.local_user.remote_id) + self.assertEqual(activity["object"]["object"], rel.user_object.remote_id) + self.assertEqual(activity["type"], "Reject") + # follow relationship should not exist + self.assertEqual(models.UserFollows.objects.filter(id=rel.id).count(), 0) + def test_ostatus_follow_request(self, *_): """check ostatus subscribe template loads""" request = self.factory.get( diff --git a/bookwyrm/tests/views/test_get_started.py b/bookwyrm/tests/views/test_get_started.py index 28b6a4d36..84a49cafc 100644 --- a/bookwyrm/tests/views/test_get_started.py +++ b/bookwyrm/tests/views/test_get_started.py @@ -12,9 +12,9 @@ from bookwyrm.tests.validate_html import validate_html class GetStartedViews(TestCase): """helping new users get oriented""" - 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"): @@ -39,6 +39,10 @@ class GetStartedViews(TestCase): ) models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_profile_view(self, *_): """there are so many views, this just makes sure it LOADS""" view = views.GetStartedProfile.as_view() diff --git a/bookwyrm/tests/views/test_goal.py b/bookwyrm/tests/views/test_goal.py index 0faeef117..3d87d8538 100644 --- a/bookwyrm/tests/views/test_goal.py +++ b/bookwyrm/tests/views/test_goal.py @@ -15,9 +15,9 @@ from bookwyrm.tests.validate_html import validate_html class GoalViews(TestCase): """viewing and creating statuses""" - 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,10 +41,14 @@ class GoalViews(TestCase): title="Example Edition", remote_id="https://example.com/book/1", ) + models.SiteSettings.objects.create() + + def setUp(self): + """individual test setup""" + self.year = timezone.now().year + self.factory = RequestFactory() self.anonymous_user = AnonymousUser self.anonymous_user.is_authenticated = False - self.year = timezone.now().year - models.SiteSettings.objects.create() def test_goal_page_no_goal(self): """view a reading goal page for another's unset goal""" diff --git a/bookwyrm/tests/views/test_group.py b/bookwyrm/tests/views/test_group.py index 60fca6cb7..4d678c31a 100644 --- a/bookwyrm/tests/views/test_group.py +++ b/bookwyrm/tests/views/test_group.py @@ -16,9 +16,9 @@ from bookwyrm.tests.validate_html import validate_html class GroupViews(TestCase): """view group and edit details""" - def setUp(self): # pylint: disable=invalid-name + @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,11 +46,14 @@ class GroupViews(TestCase): self.membership = models.GroupMember.objects.create( group=self.testgroup, user=self.local_user ) + models.SiteSettings.objects.create() + + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() self.anonymous_user = AnonymousUser self.anonymous_user.is_authenticated = False - models.SiteSettings.objects.create() - def test_group_get(self, _): """there are so many views, this just makes sure it LOADS""" view = views.Group.as_view() diff --git a/bookwyrm/tests/views/test_hashtag.py b/bookwyrm/tests/views/test_hashtag.py index d3115dbce..1c8b31dce 100644 --- a/bookwyrm/tests/views/test_hashtag.py +++ b/bookwyrm/tests/views/test_hashtag.py @@ -14,8 +14,8 @@ from bookwyrm.tests.validate_html import validate_html class HashtagView(TestCase): """hashtag view""" - def setUp(self): - self.factory = RequestFactory() + @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"): @@ -64,9 +64,13 @@ class HashtagView(TestCase): for status in self.statuses_bookclub: status.mention_hashtags.add(self.hashtag_bookclub) + models.SiteSettings.objects.create() + + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() self.anonymous_user = AnonymousUser self.anonymous_user.is_authenticated = False - models.SiteSettings.objects.create() def test_hashtag_page(self): """just make sure it loads""" diff --git a/bookwyrm/tests/views/test_helpers.py b/bookwyrm/tests/views/test_helpers.py index dd30526ec..9472cf762 100644 --- a/bookwyrm/tests/views/test_helpers.py +++ b/bookwyrm/tests/views/test_helpers.py @@ -15,13 +15,12 @@ from bookwyrm.settings import USER_AGENT, DOMAIN @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay") @patch("bookwyrm.activitystreams.populate_stream_task.delay") @patch("bookwyrm.suggested_users.rerank_user_task.delay") -class ViewsHelpers(TestCase): +class ViewsHelpers(TestCase): # pylint: disable=too-many-public-methods """viewing and creating statuses""" - # 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"): @@ -53,14 +52,18 @@ class ViewsHelpers(TestCase): remote_id="https://example.com/book/1", parent_work=self.work, ) - datafile = pathlib.Path(__file__).parent.joinpath("../data/ap_user.json") - self.userdata = json.loads(datafile.read_bytes()) - del self.userdata["icon"] with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): self.shelf = models.Shelf.objects.create( name="Test Shelf", identifier="test-shelf", user=self.local_user ) + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + datafile = pathlib.Path(__file__).parent.joinpath("../data/ap_user.json") + self.userdata = json.loads(datafile.read_bytes()) + del self.userdata["icon"] + def test_get_edition(self, *_): """given an edition or a work, returns an edition""" self.assertEqual(views.helpers.get_edition(self.book.id), self.book) diff --git a/bookwyrm/tests/views/test_interaction.py b/bookwyrm/tests/views/test_interaction.py index 74878df7d..1565b96a8 100644 --- a/bookwyrm/tests/views/test_interaction.py +++ b/bookwyrm/tests/views/test_interaction.py @@ -12,9 +12,9 @@ from bookwyrm import models, views class InteractionViews(TestCase): """viewing and creating statuses""" - 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"): @@ -36,7 +36,6 @@ class InteractionViews(TestCase): inbox="https://example.com/users/rat/inbox", outbox="https://example.com/users/rat/outbox", ) - work = models.Work.objects.create(title="Test Work") self.book = models.Edition.objects.create( title="Example Edition", @@ -44,6 +43,10 @@ class InteractionViews(TestCase): parent_work=work, ) + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_favorite(self, *_): """create and broadcast faving a status""" view = views.Favorite.as_view() diff --git a/bookwyrm/tests/views/test_isbn.py b/bookwyrm/tests/views/test_isbn.py index e09379418..ca451bef8 100644 --- a/bookwyrm/tests/views/test_isbn.py +++ b/bookwyrm/tests/views/test_isbn.py @@ -14,9 +14,9 @@ from bookwyrm.settings import DOMAIN class IsbnViews(TestCase): """tag views""" - def setUp(self): # pylint: disable=invalid-name + @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"): @@ -37,6 +37,10 @@ class IsbnViews(TestCase): ) models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_isbn_json_response(self): """searches local data only and returns book data in json format""" view = views.Isbn.as_view() diff --git a/bookwyrm/tests/views/test_notifications.py b/bookwyrm/tests/views/test_notifications.py index 8e5dfa2b5..8d239d77a 100644 --- a/bookwyrm/tests/views/test_notifications.py +++ b/bookwyrm/tests/views/test_notifications.py @@ -12,9 +12,9 @@ from bookwyrm.tests.validate_html import validate_html class NotificationViews(TestCase): """notifications""" - 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 NotificationViews(TestCase): ) models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_notifications_page_empty(self): """there are so many views, this just makes sure it LOADS""" view = views.Notifications.as_view() diff --git a/bookwyrm/tests/views/test_outbox.py b/bookwyrm/tests/views/test_outbox.py index 598cce514..78c4d0edc 100644 --- a/bookwyrm/tests/views/test_outbox.py +++ b/bookwyrm/tests/views/test_outbox.py @@ -15,9 +15,9 @@ from bookwyrm.settings import USER_AGENT class OutboxView(TestCase): """sends out activities""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """we'll need some data""" - 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"): @@ -36,6 +36,10 @@ class OutboxView(TestCase): parent_work=work, ) + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_outbox(self, _): """returns user's statuses""" request = self.factory.get("") diff --git a/bookwyrm/tests/views/test_reading.py b/bookwyrm/tests/views/test_reading.py index 759866947..fab1c1fc9 100644 --- a/bookwyrm/tests/views/test_reading.py +++ b/bookwyrm/tests/views/test_reading.py @@ -15,9 +15,9 @@ from bookwyrm import models, views class ReadingViews(TestCase): """viewing and creating statuses""" - 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,6 +46,10 @@ class ReadingViews(TestCase): parent_work=self.work, ) + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_start_reading(self, *_): """begin a book""" shelf = self.local_user.shelf_set.get(identifier=models.Shelf.READING) diff --git a/bookwyrm/tests/views/test_readthrough.py b/bookwyrm/tests/views/test_readthrough.py index f4ca3af61..4f5b1e478 100644 --- a/bookwyrm/tests/views/test_readthrough.py +++ b/bookwyrm/tests/views/test_readthrough.py @@ -15,10 +15,9 @@ from bookwyrm import models class ReadThrough(TestCase): """readthrough tests""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """basic user and book data""" - self.client = Client() - self.work = models.Work.objects.create(title="Example Work") self.edition = models.Edition.objects.create( @@ -32,6 +31,9 @@ class ReadThrough(TestCase): "cinco", "cinco@example.com", "seissiete", local=True, localname="cinco" ) + def setUp(self): + """individual test setup""" + self.client = Client() with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): self.client.force_login(self.user) diff --git a/bookwyrm/tests/views/test_report.py b/bookwyrm/tests/views/test_report.py index 487b02929..3e4c64f68 100644 --- a/bookwyrm/tests/views/test_report.py +++ b/bookwyrm/tests/views/test_report.py @@ -11,10 +11,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"): @@ -41,6 +40,10 @@ class ReportViews(TestCase): ) models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_report_modal_view(self): """a user reports another user""" request = self.factory.get("") diff --git a/bookwyrm/tests/views/test_rss_feed.py b/bookwyrm/tests/views/test_rss_feed.py index cfbec3360..a63bdea94 100644 --- a/bookwyrm/tests/views/test_rss_feed.py +++ b/bookwyrm/tests/views/test_rss_feed.py @@ -12,7 +12,8 @@ from bookwyrm.views import rss_feed class RssFeedView(TestCase): """rss feed behaves as expected""" - 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"): @@ -25,10 +26,12 @@ class RssFeedView(TestCase): remote_id="https://example.com/book/1", parent_work=work, ) - self.factory = RequestFactory() - models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_rss_empty(self, *_): """load an rss feed""" view = rss_feed.RssFeed() diff --git a/bookwyrm/tests/views/test_search.py b/bookwyrm/tests/views/test_search.py index 28f8268e3..425b96cd3 100644 --- a/bookwyrm/tests/views/test_search.py +++ b/bookwyrm/tests/views/test_search.py @@ -17,9 +17,9 @@ from bookwyrm.tests.validate_html import validate_html class Views(TestCase): """tag views""" - def setUp(self): # pylint: disable=invalid-name + @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"): @@ -39,6 +39,10 @@ class Views(TestCase): ) models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_search_json_response(self): """searches local data only and returns book data in json format""" view = views.Search.as_view() diff --git a/bookwyrm/tests/views/test_setup.py b/bookwyrm/tests/views/test_setup.py index 7b8da3c33..d2bdba340 100644 --- a/bookwyrm/tests/views/test_setup.py +++ b/bookwyrm/tests/views/test_setup.py @@ -13,11 +13,15 @@ from bookwyrm.tests.validate_html import validate_html class SetupViews(TestCase): """activity feed, statuses, dms""" - def setUp(self): + @classmethod + def setUpTestData(self): # pylint: disable=bad-classmethod-argument """we need basic test data and mocks""" - self.factory = RequestFactory() self.site = models.SiteSettings.objects.create(install_mode=True) + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_instance_config_permission_denied(self): """there are so many views, this just makes sure it LOADS""" self.site.install_mode = False diff --git a/bookwyrm/tests/views/test_status.py b/bookwyrm/tests/views/test_status.py index 33bd8b53a..7b0c39338 100644 --- a/bookwyrm/tests/views/test_status.py +++ b/bookwyrm/tests/views/test_status.py @@ -11,7 +11,7 @@ from bookwyrm.settings import DOMAIN from bookwyrm.tests.validate_html import validate_html -# pylint: disable=invalid-name + @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") class StatusTransactions(TransactionTestCase): """Test full database transactions""" @@ -74,9 +74,9 @@ class StatusTransactions(TransactionTestCase): class StatusViews(TestCase): """viewing and creating statuses""" - 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"): @@ -106,7 +106,6 @@ class StatusViews(TestCase): inbox="https://example.com/users/rat/inbox", outbox="https://example.com/users/rat/outbox", ) - work = models.Work.objects.create(title="Test Work") self.book = models.Edition.objects.create( title="Example Edition", @@ -115,6 +114,10 @@ class StatusViews(TestCase): ) models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_create_status_comment(self, *_): """create a status""" view = views.CreateStatus.as_view() @@ -323,14 +326,14 @@ class StatusViews(TestCase): def test_find_mentions_unknown_remote(self, *_): """mention a user that isn't in the database""" - with patch("bookwyrm.views.status.handle_remote_webfinger") as rw: - rw.return_value = self.another_user + with patch("bookwyrm.views.status.handle_remote_webfinger") as rwf: + rwf.return_value = self.another_user result = find_mentions(self.local_user, "@beep@beep.com") self.assertEqual(result["@nutria"], self.another_user) self.assertEqual(result[f"@nutria@{DOMAIN}"], self.another_user) - with patch("bookwyrm.views.status.handle_remote_webfinger") as rw: - rw.return_value = None + with patch("bookwyrm.views.status.handle_remote_webfinger") as rwf: + rwf.return_value = None result = find_mentions(self.local_user, "@beep@beep.com") self.assertEqual(result, {}) @@ -420,21 +423,25 @@ http://www.fish.com/""" 'okay\n\n
    www.fish.com/', ) - def test_format_links_parens(self, *_): - """find and format urls into a tags""" - url = "http://www.fish.com/" - self.assertEqual( - views.status.format_links(f"({url})"), - f'(www.fish.com/)', - ) - def test_format_links_punctuation(self, *_): - """don’t take trailing punctuation into account pls""" - url = "http://www.fish.com/" - self.assertEqual( - views.status.format_links(f"{url}."), - f'www.fish.com/.', - ) + """test many combinations of brackets, URLs, and punctuation""" + url = "https://bookwyrm.social" + html = f'bookwyrm.social' + test_table = [ + ("punct", f"text and {url}.", f"text and {html}."), + ("multi_punct", f"text, then {url}?...", f"text, then {html}?..."), + ("bracket_punct", f"here ({url}).", f"here ({html})."), + ("punct_bracket", f"there [{url}?]", f"there [{html}?]"), + ("punct_bracket_punct", f"not here? ({url}!).", f"not here? ({html}!)."), + ( + "multi_punct_bracket", + f"not there ({url}...);", + f"not there ({html}...);", + ), + ] + for desc, text, output in test_table: + with self.subTest(desc=desc): + self.assertEqual(views.status.format_links(text), output) def test_format_links_special_chars(self, *_): """find and format urls into a tags""" @@ -464,6 +471,13 @@ http://www.fish.com/""" views.status.format_links(url), f'{url[8:]}' ) + def test_format_links_ignore_non_urls(self, *_): + """formating links should leave plain text untouced""" + text_elision = "> “The distinction is significant.” [...]" # bookwyrm#2993 + text_quoteparens = "some kind of gene-editing technology (?)" # bookwyrm#3049 + self.assertEqual(views.status.format_links(text_elision), text_elision) + self.assertEqual(views.status.format_links(text_quoteparens), text_quoteparens) + def test_format_mentions_with_at_symbol_links(self, *_): """A link with an @username shouldn't treat the username as a mention""" content = "a link to https://example.com/user/@mouse" diff --git a/bookwyrm/tests/views/test_updates.py b/bookwyrm/tests/views/test_updates.py index 03cf58668..37cb2e6c6 100644 --- a/bookwyrm/tests/views/test_updates.py +++ b/bookwyrm/tests/views/test_updates.py @@ -12,9 +12,9 @@ from bookwyrm import models, views class UpdateViews(TestCase): """lets the ui check for unread notification""" - 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 UpdateViews(TestCase): ) models.SiteSettings.objects.create() + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + def test_get_notification_count(self): """there are so many views, this just makes sure it LOADS""" request = self.factory.get("") diff --git a/bookwyrm/tests/views/test_user.py b/bookwyrm/tests/views/test_user.py index 2b6bc247c..d4e11ff2e 100644 --- a/bookwyrm/tests/views/test_user.py +++ b/bookwyrm/tests/views/test_user.py @@ -15,9 +15,9 @@ from bookwyrm.tests.validate_html import validate_html class UserViews(TestCase): """view user and edit profile""" - 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"): @@ -44,8 +44,11 @@ class UserViews(TestCase): user=self.local_user, shelf=self.local_user.shelf_set.first(), ) - models.SiteSettings.objects.create() + + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() self.anonymous_user = AnonymousUser self.anonymous_user.is_authenticated = False diff --git a/bookwyrm/tests/views/test_wellknown.py b/bookwyrm/tests/views/test_wellknown.py index 80f5a56ae..4617942fa 100644 --- a/bookwyrm/tests/views/test_wellknown.py +++ b/bookwyrm/tests/views/test_wellknown.py @@ -13,9 +13,9 @@ from bookwyrm import models, views class WellknownViews(TestCase): """view user and edit profile""" - 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"): @@ -40,6 +40,10 @@ class WellknownViews(TestCase): outbox="https://example.com/users/rat/outbox", ) models.SiteSettings.objects.create() + + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() self.anonymous_user = AnonymousUser self.anonymous_user.is_authenticated = False diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index 0759012fe..1a577c84b 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -109,6 +109,11 @@ urlpatterns = [ views.delete_theme, name="settings-themes-delete", ), + re_path( + r"^settings/themes/(?P\d+)/test/?$", + views.test_theme, + name="settings-themes-test", + ), re_path( r"^settings/announcements/?$", views.Announcements.as_view(), @@ -323,11 +328,26 @@ urlpatterns = [ views.ImportList.as_view(), name="settings-imports-complete", ), + re_path( + r"^settings/user-imports/(?P\d+)/complete/?$", + views.set_user_import_completed, + name="settings-user-import-complete", + ), re_path( r"^settings/imports/disable/?$", views.disable_imports, name="settings-imports-disable", ), + re_path( + r"^settings/user-exports/enable/?$", + views.enable_user_exports, + name="settings-user-exports-enable", + ), + re_path( + r"^settings/user-exports/disable/?$", + views.disable_user_exports, + name="settings-user-exports-disable", + ), re_path( r"^settings/imports/enable/?$", views.enable_imports, @@ -338,6 +358,11 @@ urlpatterns = [ views.set_import_size_limit, name="settings-imports-set-limit", ), + re_path( + r"^settings/user-imports/set-limit/?$", + views.set_user_import_limit, + name="settings-user-imports-set-limit", + ), re_path( r"^settings/celery/?$", views.CeleryStatus.as_view(), name="settings-celery" ), @@ -403,6 +428,7 @@ urlpatterns = [ re_path(r"^search/?$", views.Search.as_view(), name="search"), # imports re_path(r"^import/?$", views.Import.as_view(), name="import"), + re_path(r"^user-import/?$", views.UserImport.as_view(), name="user-import"), re_path( r"^import/(?P\d+)/?$", views.ImportStatus.as_view(), @@ -600,6 +626,22 @@ urlpatterns = [ name="prompt-2fa", ), re_path(r"^preferences/export/?$", views.Export.as_view(), name="prefs-export"), + re_path( + r"^preferences/user-export/?$", + views.ExportUser.as_view(), + name="prefs-user-export", + ), + path( + "preferences/user-export/", + views.ExportArchive.as_view(), + name="prefs-export-file", + ), + re_path(r"^preferences/move/?$", views.MoveUser.as_view(), name="prefs-move"), + re_path(r"^preferences/alias/?$", views.AliasUser.as_view(), name="prefs-alias"), + re_path( + r"^preferences/remove-alias/?$", views.remove_alias, name="prefs-remove-alias" + ), + re_path(r"^preferences/unmove/?$", views.unmove, name="prefs-unmove"), re_path(r"^preferences/delete/?$", views.DeleteUser.as_view(), name="prefs-delete"), re_path( r"^preferences/deactivate/?$", @@ -757,6 +799,9 @@ urlpatterns = [ # following re_path(r"^follow/?$", views.follow, name="follow"), re_path(r"^unfollow/?$", views.unfollow, name="unfollow"), + re_path( + r"^remove-follow/(?P\d+)/?$", views.remove_follow, name="remove-follow" + ), re_path(r"^accept-follow-request/?$", views.accept_follow_request), re_path(r"^delete-follow-request/?$", views.delete_follow_request), re_path(r"^ostatus_follow/?$", views.remote_follow, name="remote-follow"), @@ -786,3 +831,6 @@ urlpatterns.extend(staticfiles_urlpatterns()) # pylint: disable=invalid-name handler500 = "bookwyrm.views.server_error" + +# pylint: disable=invalid-name +handler403 = "bookwyrm.views.permission_denied" diff --git a/bookwyrm/utils/partial_date.py b/bookwyrm/utils/partial_date.py new file mode 100644 index 000000000..40b89c838 --- /dev/null +++ b/bookwyrm/utils/partial_date.py @@ -0,0 +1,240 @@ +"""Implementation of the PartialDate class.""" + +from __future__ import annotations + +from datetime import datetime, timedelta +import re +from typing import Any, Optional, Type, cast +from typing_extensions import Self + +from django.core.exceptions import ValidationError +from django.db import models +from django.forms import DateField +from django.forms.widgets import SelectDateWidget +from django.utils import timezone + +# pylint: disable=no-else-return + +__all__ = [ + "PartialDate", + "PartialDateModel", + "from_partial_isoformat", +] + +_partial_re = re.compile(r"(\d{4})(?:-(\d\d?))?(?:-(\d\d?))?$") +_westmost_tz = timezone.get_fixed_timezone(timedelta(hours=-12)) + +# TODO: migrate PartialDate: `datetime` => `date` +# TODO: migrate PartialDateModel: `DateTimeField` => `DateField` + + +class PartialDate(datetime): + """a date object bound into a certain precision (day, month or year)""" + + @property + def has_day(self) -> bool: + """whether this is a full date""" + return self.has_month + + @property + def has_month(self) -> bool: + """whether this date includes month""" + return True + + def partial_isoformat(self) -> str: + """partial ISO-8601 format""" + return self.strftime("%Y-%m-%d") + + @classmethod + def from_datetime(cls, dt: datetime) -> Self: + """construct a PartialDate object from a timezone-aware datetime + + Use subclasses to specify precision. If `dt` is naive, `ValueError` + is raised. + """ + # pylint: disable=invalid-name + if timezone.is_naive(dt): + raise ValueError("naive datetime not accepted") + return cls.combine(dt.date(), dt.time(), tzinfo=dt.tzinfo) + + @classmethod + def from_date_parts(cls, year: int, month: int, day: int) -> Self: + """construct a PartialDate from year, month, day. + + Use sublcasses to specify precision.""" + # because PartialDate is actually a datetime object, we must create it with a + # timezone such that its date remains stable no matter the values of USE_TZ, + # current_timezone and default_timezone. + return cls.from_datetime(datetime(year, month, day, tzinfo=_westmost_tz)) + + +class MonthParts(PartialDate): + """a date bound into month precision""" + + @property + def has_day(self) -> bool: + return False + + def partial_isoformat(self) -> str: + return self.strftime("%Y-%m") + + +class YearParts(PartialDate): + """a date bound into year precision""" + + @property + def has_month(self) -> bool: + return False + + def partial_isoformat(self) -> str: + return self.strftime("%Y") + + +def from_partial_isoformat(value: str) -> PartialDate: + """construct PartialDate from a partial string. + + Accepted formats: YYYY, YYYY-MM, YYYY-MM-DD; otherwise `ValueError` + is raised. + """ + match = _partial_re.match(value) + + if not match: + raise ValueError + + year, month, day = [int(val) if val else -1 for val in match.groups()] + + if month < 0: + return YearParts.from_date_parts(year, 1, 1) + elif day < 0: + return MonthParts.from_date_parts(year, month, 1) + else: + return PartialDate.from_date_parts(year, month, day) + + +class PartialDateFormField(DateField): + """date form field with support for PartialDate""" + + def prepare_value(self, value: Any) -> str: + # As a convention, Django's `SelectDateWidget` uses "0" for missing + # parts. We piggy-back into that, to make it work with PartialDate. + if not isinstance(value, PartialDate): + return cast(str, super().prepare_value(value)) + elif value.has_day: + return value.strftime("%Y-%m-%d") + elif value.has_month: + return value.strftime("%Y-%m-0") + else: + return value.strftime("%Y-0-0") + + def to_python(self, value: Any) -> Optional[PartialDate]: + try: + date = super().to_python(value) + except ValidationError as ex: + if match := SelectDateWidget.date_re.match(value): + year, month, day = map(int, match.groups()) + if not match or (day and not month) or not year: + raise ex from None + if not month: + return YearParts.from_date_parts(year, 1, 1) + elif not day: + return MonthParts.from_date_parts(year, month, 1) + else: + if date is None: + return None + else: + year, month, day = date.year, date.month, date.day + + return PartialDate.from_date_parts(year, month, day) + + +# For typing field and descriptor, below. +_SetType = datetime +_GetType = Optional[PartialDate] + + +class PartialDateDescriptor: + """descriptor for PartialDateModel. + + Encapsulates the "two columns, one field" for PartialDateModel. + """ + + _PRECISION_NAMES: dict[Type[_SetType], str] = { + YearParts: "YEAR", + MonthParts: "MONTH", + PartialDate: "DAY", + } + + _PARTIAL_CLASSES: dict[Any, Type[PartialDate]] = { + "YEAR": YearParts, + "MONTH": MonthParts, + } + + def __init__(self, field: models.Field[_SetType, _GetType]): + self.field = field + + def __get__(self, instance: models.Model, cls: Any = None) -> _GetType: + if instance is None: + return self + + value = instance.__dict__.get(self.field.attname) + + if not value or isinstance(value, PartialDate): + return value + + # use precision field to construct PartialDate. + precision = getattr(instance, self.precision_field, None) + date_class = self._PARTIAL_CLASSES.get(precision, PartialDate) + + return date_class.from_datetime(value) # FIXME: drop datetimes. + + def __set__(self, instance: models.Model, value: _SetType) -> None: + """assign value, with precision where available""" + try: + precision = self._PRECISION_NAMES[value.__class__] + except KeyError: + value = self.field.to_python(value) + else: + setattr(instance, self.precision_field, precision) + + instance.__dict__[self.field.attname] = value + + @classmethod + def make_precision_name(cls, date_attr_name: str) -> str: + """derive the precision field name from main attr name""" + return f"{date_attr_name}_precision" + + @property + def precision_field(self) -> str: + """the name of the accompanying precision field""" + return self.make_precision_name(self.field.attname) + + @property + def precision_choices(self) -> list[tuple[str, str]]: + """valid options for precision database field""" + return [("DAY", "Day prec."), ("MONTH", "Month prec."), ("YEAR", "Year prec.")] + + +class PartialDateModel(models.DateTimeField): # type: ignore + """a date field for Django models, using PartialDate as values""" + + descriptor_class = PartialDateDescriptor + + def formfield(self, **kwargs): # type: ignore + kwargs.setdefault("form_class", PartialDateFormField) + return super().formfield(**kwargs) + + # pylint: disable-next=arguments-renamed + def contribute_to_class(self, model, our_name_in_model, **kwargs): # type: ignore + # Define precision field. + descriptor = self.descriptor_class(self) + precision: models.Field[Optional[str], Optional[str]] = models.CharField( + null=True, + blank=True, + editable=False, + max_length=10, + choices=descriptor.precision_choices, + ) + precision_name = descriptor.make_precision_name(our_name_in_model) + + model.add_to_class(precision_name, precision) + return super().contribute_to_class(model, our_name_in_model, **kwargs) diff --git a/bookwyrm/utils/tar.py b/bookwyrm/utils/tar.py new file mode 100644 index 000000000..bae3f7628 --- /dev/null +++ b/bookwyrm/utils/tar.py @@ -0,0 +1,49 @@ +"""manage tar files for user exports""" +import io +import tarfile +from typing import Any, Optional +from uuid import uuid4 +from django.core.files import File + + +class BookwyrmTarFile(tarfile.TarFile): + """Create tar files for user exports""" + + def write_bytes(self, data: bytes) -> None: + """Add a file containing bytes to the archive""" + buffer = io.BytesIO(data) + info = tarfile.TarInfo("archive.json") + info.size = len(data) + self.addfile(info, fileobj=buffer) + + def add_image( + self, image: Any, filename: Optional[str] = None, directory: Any = "" + ) -> None: + """ + Add an image to the tar archive + :param str filename: overrides the file name set by image + :param str directory: the directory in the archive to put the image + """ + if filename is not None: + file_type = image.name.rsplit(".", maxsplit=1)[-1] + filename = f"{directory}{filename}.{file_type}" + else: + filename = f"{directory}{image.name}" + + info = tarfile.TarInfo(name=filename) + info.size = image.size + + self.addfile(info, fileobj=image) + + def read(self, filename: str) -> Any: + """read data from the tar""" + if reader := self.extractfile(filename): + return reader.read() + return None + + def write_image_to_file(self, filename: str, file_field: Any) -> None: + """add an image to the tar""" + extension = filename.rsplit(".")[-1] + if buf := self.extractfile(filename): + filename = f"{str(uuid4())}.{extension}" + file_field.save(filename, File(buf)) diff --git a/bookwyrm/views/__init__.py b/bookwyrm/views/__init__.py index 84060acb7..f11c11dd6 100644 --- a/bookwyrm/views/__init__.py +++ b/bookwyrm/views/__init__.py @@ -16,6 +16,10 @@ from .admin.imports import ( disable_imports, enable_imports, set_import_size_limit, + set_user_import_completed, + set_user_import_limit, + enable_user_exports, + disable_user_exports, ) from .admin.ip_blocklist import IPBlocklist from .admin.invite import ManageInvites, Invite, InviteRequest @@ -30,13 +34,14 @@ from .admin.reports import ( moderator_delete_user, ) from .admin.site import Site, Registration, RegistrationLimited -from .admin.themes import Themes, delete_theme +from .admin.themes import Themes, delete_theme, test_theme from .admin.user_admin import UserAdmin, UserAdminList, ActivateUserAdmin # user preferences from .preferences.change_password import ChangePassword from .preferences.edit_user import EditUser -from .preferences.export import Export +from .preferences.export import Export, ExportUser, ExportArchive +from .preferences.move_user import MoveUser, AliasUser, remove_alias, unmove from .preferences.delete_user import DeleteUser, DeactivateUser, ReactivateUser from .preferences.block import Block, unblock from .preferences.two_factor_auth import ( @@ -80,7 +85,7 @@ from .shelf.shelf_actions import create_shelf, delete_shelf from .shelf.shelf_actions import shelve, unshelve # csv import -from .imports.import_data import Import +from .imports.import_data import Import, UserImport from .imports.import_status import ImportStatus, retry_item, stop_import from .imports.troubleshoot import ImportTroubleshoot from .imports.manually_review import ( @@ -112,6 +117,7 @@ from .feed import DirectMessage, Feed, Replies, Status from .follow import ( follow, unfollow, + remove_follow, ostatus_follow_request, ostatus_follow_success, remote_follow, @@ -166,3 +172,4 @@ from .annual_summary import ( summary_revoke_key, ) from .server_error import server_error +from .permission_denied import permission_denied diff --git a/bookwyrm/views/admin/celery_status.py b/bookwyrm/views/admin/celery_status.py index cd8b85b6d..dbf18dac8 100644 --- a/bookwyrm/views/admin/celery_status.py +++ b/bookwyrm/views/admin/celery_status.py @@ -110,20 +110,20 @@ class ClearCeleryForm(forms.Form): queues = forms.MultipleChoiceField( label="Queues", choices=[ - (LOW, "Low prioirty"), + (LOW, "Low priority"), (MEDIUM, "Medium priority"), (HIGH, "High priority"), - (STREAMS, "Streams"), - (IMAGES, "Images"), - (SUGGESTED_USERS, "Suggested users"), - (EMAIL, "Email"), + (BROADCAST, "Broadcast"), (CONNECTORS, "Connectors"), - (LISTS, "Lists"), - (INBOX, "Inbox"), + (EMAIL, "Email"), + (IMAGES, "Images"), (IMPORTS, "Imports"), (IMPORT_TRIGGERED, "Import triggered"), - (BROADCAST, "Broadcasts"), + (INBOX, "Inbox"), + (LISTS, "Lists"), (MISC, "Misc"), + (STREAMS, "Streams"), + (SUGGESTED_USERS, "Suggested users"), ], widget=forms.CheckboxSelectMultiple, ) diff --git a/bookwyrm/views/admin/imports.py b/bookwyrm/views/admin/imports.py index 7ae190ce8..0924536bf 100644 --- a/bookwyrm/views/admin/imports.py +++ b/bookwyrm/views/admin/imports.py @@ -9,7 +9,7 @@ from django.views.decorators.http import require_POST from bookwyrm import models from bookwyrm.views.helpers import redirect_to_referer -from bookwyrm.settings import PAGE_LENGTH +from bookwyrm.settings import PAGE_LENGTH, USE_S3 # pylint: disable=no-self-use @@ -40,9 +40,17 @@ class ImportList(View): paginated = Paginator(imports, PAGE_LENGTH) page = paginated.get_page(request.GET.get("page")) + user_imports = models.BookwyrmImportJob.objects.filter( + complete=complete + ).order_by("created_date") + + user_paginated = Paginator(user_imports, PAGE_LENGTH) + user_page = user_paginated.get_page(request.GET.get("page")) + site_settings = models.SiteSettings.objects.get() data = { "imports": page, + "user_imports": user_page, "page_range": paginated.get_elided_page_range( page.number, on_each_side=2, on_ends=1 ), @@ -50,6 +58,8 @@ class ImportList(View): "sort": sort, "import_size_limit": site_settings.import_size_limit, "import_limit_reset": site_settings.import_limit_reset, + "user_import_time_limit": site_settings.user_import_time_limit, + "use_s3": USE_S3, } return TemplateResponse(request, "settings/imports/imports.html", data) @@ -95,3 +105,47 @@ def set_import_size_limit(request): site.import_limit_reset = import_limit_reset site.save(update_fields=["import_size_limit", "import_limit_reset"]) return redirect("settings-imports") + + +@require_POST +@login_required +@permission_required("bookwyrm.moderate_user", raise_exception=True) +# pylint: disable=unused-argument +def set_user_import_completed(request, import_id): + """Mark a user import as complete""" + import_job = get_object_or_404(models.BookwyrmImportJob, id=import_id) + import_job.stop_job() + return redirect("settings-imports") + + +@require_POST +@permission_required("bookwyrm.edit_instance_settings", raise_exception=True) +# pylint: disable=unused-argument +def set_user_import_limit(request): + """Limit how ofter users can import and export their account""" + site = models.SiteSettings.objects.get() + site.user_import_time_limit = int(request.POST.get("limit")) + site.save(update_fields=["user_import_time_limit"]) + return redirect("settings-imports") + + +@require_POST +@permission_required("bookwyrm.edit_instance_settings", raise_exception=True) +# pylint: disable=unused-argument +def enable_user_exports(request): + """Allow users to export account data""" + site = models.SiteSettings.objects.get() + site.user_exports_enabled = True + site.save(update_fields=["user_exports_enabled"]) + return redirect("settings-imports") + + +@require_POST +@permission_required("bookwyrm.edit_instance_settings", raise_exception=True) +# pylint: disable=unused-argument +def disable_user_exports(request): + """Don't allow users to export account data""" + site = models.SiteSettings.objects.get() + site.user_exports_enabled = False + site.save(update_fields=["user_exports_enabled"]) + return redirect("settings-imports") diff --git a/bookwyrm/views/admin/themes.py b/bookwyrm/views/admin/themes.py index 5658d243a..284a90833 100644 --- a/bookwyrm/views/admin/themes.py +++ b/bookwyrm/views/admin/themes.py @@ -6,6 +6,8 @@ from django.utils.decorators import method_decorator from django.views import View from django.views.decorators.http import require_POST +from sass_processor.processor import sass_processor + from bookwyrm import forms, models @@ -40,6 +42,7 @@ class Themes(View): def get_view_data(): """data for view""" return { + "broken_theme": models.Theme.objects.filter(loads=False).exists(), "themes": models.Theme.objects.all(), "theme_form": forms.ThemeForm(), } @@ -52,3 +55,20 @@ def delete_theme(request, theme_id): """Remove a theme""" get_object_or_404(models.Theme, id=theme_id).delete() return redirect("settings-themes") + + +@require_POST +@permission_required("bookwyrm.system_administration", raise_exception=True) +# pylint: disable=unused-argument +def test_theme(request, theme_id): + """Remove a theme""" + theme = get_object_or_404(models.Theme, id=theme_id) + + try: + sass_processor(theme.path) + theme.loads = True + except Exception: # pylint: disable=broad-except + theme.loads = False + + theme.save() + return redirect("settings-themes") diff --git a/bookwyrm/views/follow.py b/bookwyrm/views/follow.py index 0090cbe32..dcb1c695c 100644 --- a/bookwyrm/views/follow.py +++ b/bookwyrm/views/follow.py @@ -69,6 +69,33 @@ def unfollow(request): return redirect("/") +@login_required +@require_POST +def remove_follow(request, user_id): + """remove a previously approved follower without blocking them""" + + to_remove = get_object_or_404(models.User, id=user_id) + + try: + models.UserFollows.objects.get( + user_subject=to_remove, user_object=request.user + ).reject() + except models.UserFollows.DoesNotExist: + clear_cache(to_remove, request.user) + + try: + models.UserFollowRequest.objects.get( + user_subject=to_remove, user_object=request.user + ).reject() + except models.UserFollowRequest.DoesNotExist: + clear_cache(to_remove, request.user) + + if is_api_request(request): + return HttpResponse() + + return redirect(f"{request.user.local_path}/followers") + + @login_required @require_POST def accept_follow_request(request): @@ -100,7 +127,7 @@ def delete_follow_request(request): ) follow_request.raise_not_deletable(request.user) - follow_request.delete() + follow_request.reject() return redirect(f"/user/{request.user.localname}") diff --git a/bookwyrm/views/get_started.py b/bookwyrm/views/get_started.py index fdb8824fa..511a886ca 100644 --- a/bookwyrm/views/get_started.py +++ b/bookwyrm/views/get_started.py @@ -11,6 +11,7 @@ from django.utils.decorators import method_decorator from django.views import View from bookwyrm import book_search, forms, models +from bookwyrm.settings import INSTANCE_ACTOR_USERNAME from bookwyrm.suggested_users import suggested_users from .preferences.edit_user import save_user_form @@ -108,6 +109,7 @@ class GetStartedUsers(View): .exclude( id=request.user.id, ) + .exclude(localname=INSTANCE_ACTOR_USERNAME) .order_by("-similarity")[:5] ) data = {"no_results": not user_results} diff --git a/bookwyrm/views/group.py b/bookwyrm/views/group.py index 1ccfd6849..5ac4954e8 100644 --- a/bookwyrm/views/group.py +++ b/bookwyrm/views/group.py @@ -13,9 +13,11 @@ from django.contrib.postgres.search import TrigramSimilarity from django.db.models.functions import Greatest from bookwyrm import forms, models +from bookwyrm.models import NotificationType from bookwyrm.suggested_users import suggested_users from .helpers import get_user_from_username, maybe_redirect_local_path + # pylint: disable=no-self-use class Group(View): """group page""" @@ -59,11 +61,11 @@ class Group(View): model = apps.get_model("bookwyrm.Notification", require_ready=True) for field in form.changed_data: notification_type = ( - model.GROUP_PRIVACY + NotificationType.GROUP_PRIVACY if field == "privacy" - else model.GROUP_NAME + else NotificationType.GROUP_NAME if field == "name" - else model.GROUP_DESCRIPTION + else NotificationType.GROUP_DESCRIPTION if field == "description" else None ) @@ -251,7 +253,9 @@ def remove_member(request): memberships = models.GroupMember.objects.filter(group=group) model = apps.get_model("bookwyrm.Notification", require_ready=True) - notification_type = model.LEAVE if user == request.user else model.REMOVE + notification_type = ( + NotificationType.LEAVE if user == request.user else NotificationType.REMOVE + ) # let the other members know about it for membership in memberships: member = membership.user @@ -264,7 +268,7 @@ def remove_member(request): ) # let the user (now ex-member) know as well, if they were removed - if notification_type == model.REMOVE: + if notification_type == NotificationType.REMOVE: model.notify( user, None, related_group=group, notification_type=notification_type ) diff --git a/bookwyrm/views/imports/import_data.py b/bookwyrm/views/imports/import_data.py index 01812e1d5..1a9085ce1 100644 --- a/bookwyrm/views/imports/import_data.py +++ b/bookwyrm/views/imports/import_data.py @@ -15,12 +15,14 @@ from django.views import View from bookwyrm import forms, models from bookwyrm.importers import ( + BookwyrmImporter, CalibreImporter, LibrarythingImporter, GoodreadsImporter, StorygraphImporter, OpenLibraryImporter, ) +from bookwyrm.models.bookwyrm_import_job import BookwyrmImportJob from bookwyrm.settings import PAGE_LENGTH from bookwyrm.utils.cache import get_or_set @@ -127,3 +129,61 @@ def get_average_import_time() -> float: if recent_avg: return recent_avg.total_seconds() return None + + +# pylint: disable= no-self-use +@method_decorator(login_required, name="dispatch") +class UserImport(View): + """import user view""" + + def get(self, request, invalid=False): + """load user import page""" + + jobs = BookwyrmImportJob.objects.filter(user=request.user).order_by( + "-created_date" + ) + site = models.SiteSettings.objects.get() + hours = site.user_import_time_limit + allowed = ( + jobs.first().created_date < timezone.now() - datetime.timedelta(hours=hours) + if jobs.first() + else True + ) + next_available = ( + jobs.first().created_date + datetime.timedelta(hours=hours) + if not allowed + else False + ) + paginated = Paginator(jobs, PAGE_LENGTH) + page = paginated.get_page(request.GET.get("page")) + data = { + "import_form": forms.ImportUserForm(), + "jobs": page, + "user_import_hours": hours, + "next_available": next_available, + "page_range": paginated.get_elided_page_range( + page.number, on_each_side=2, on_ends=1 + ), + "invalid": invalid, + } + + return TemplateResponse(request, "import/import_user.html", data) + + def post(self, request): + """ingest a Bookwyrm json file""" + + importer = BookwyrmImporter() + + form = forms.ImportUserForm(request.POST, request.FILES) + if not form.is_valid(): + return HttpResponseBadRequest() + + job = importer.process_import( + user=request.user, + archive_file=request.FILES["archive_file"], + settings=request.POST, + ) + + job.start_job() + + return redirect("user-import") diff --git a/bookwyrm/views/list/lists.py b/bookwyrm/views/list/lists.py index 2514fad58..52b65357a 100644 --- a/bookwyrm/views/list/lists.py +++ b/bookwyrm/views/list/lists.py @@ -59,7 +59,7 @@ class SavedLists(View): data = { "lists": paginated.get_page(request.GET.get("page")), "list_form": forms.ListForm(), - "path": "/list", + "path": "/list/saved", } return TemplateResponse(request, "lists/lists.html", data) diff --git a/bookwyrm/views/permission_denied.py b/bookwyrm/views/permission_denied.py new file mode 100644 index 000000000..9e62b0933 --- /dev/null +++ b/bookwyrm/views/permission_denied.py @@ -0,0 +1,15 @@ +"""custom 403 handler to enable context processors""" + +from django.http import HttpResponse +from django.template.response import TemplateResponse + +from .helpers import is_api_request + + +def permission_denied(request, exception): # pylint: disable=unused-argument + """permission denied page""" + + if request.method == "POST" or is_api_request(request): + return HttpResponse(status=403) + + return TemplateResponse(request, "403.html") diff --git a/bookwyrm/views/preferences/export.py b/bookwyrm/views/preferences/export.py index 6880318bc..d16f3aaa3 100644 --- a/bookwyrm/views/preferences/export.py +++ b/bookwyrm/views/preferences/export.py @@ -1,17 +1,24 @@ """ Let users export their book data """ +from datetime import timedelta import csv import io from django.contrib.auth.decorators import login_required +from django.core.paginator import Paginator from django.db.models import Q from django.http import HttpResponse from django.template.response import TemplateResponse +from django.utils import timezone from django.views import View from django.utils.decorators import method_decorator +from django.shortcuts import redirect from bookwyrm import models +from bookwyrm.models.bookwyrm_export_job import BookwyrmExportJob +from bookwyrm.settings import PAGE_LENGTH -# pylint: disable=no-self-use + +# pylint: disable=no-self-use,too-many-locals @method_decorator(login_required, name="dispatch") class Export(View): """Let users export data""" @@ -48,7 +55,19 @@ class Export(View): fields = ( ["title", "author_text"] + deduplication_fields - + ["rating", "review_name", "review_cw", "review_content"] + + [ + "start_date", + "finish_date", + "stopped_date", + "rating", + "review_name", + "review_cw", + "review_content", + "review_published", + "shelf", + "shelf_name", + "shelf_date", + ] ) writer.writerow(fields) @@ -64,6 +83,24 @@ class Export(View): book.rating = review_rating.rating if review_rating else None + readthrough = ( + models.ReadThrough.objects.filter(user=request.user, book=book) + .order_by("-start_date", "-finish_date") + .first() + ) + if readthrough: + book.start_date = ( + readthrough.start_date.date() if readthrough.start_date else None + ) + book.finish_date = ( + readthrough.finish_date.date() if readthrough.finish_date else None + ) + book.stopped_date = ( + readthrough.stopped_date.date() + if readthrough.stopped_date + else None + ) + review = ( models.Review.objects.filter( user=request.user, book=book, content__isnull=False @@ -72,9 +109,27 @@ class Export(View): .first() ) if review: + book.review_published = ( + review.published_date.date() if review.published_date else None + ) book.review_name = review.name book.review_cw = review.content_warning - book.review_content = review.raw_content + book.review_content = ( + review.raw_content if review.raw_content else review.content + ) # GoodReads imported reviews do not have raw_content, but content. + + shelfbook = ( + models.ShelfBook.objects.filter(user=request.user, book=book) + .order_by("-shelved_date", "-created_date", "-updated_date") + .last() + ) + if shelfbook: + book.shelf = shelfbook.shelf.identifier + book.shelf_name = shelfbook.shelf.name + book.shelf_date = ( + shelfbook.shelved_date.date() if shelfbook.shelved_date else None + ) + writer.writerow([getattr(book, field, "") or "" for field in fields]) return HttpResponse( @@ -84,3 +139,61 @@ class Export(View): "Content-Disposition": 'attachment; filename="bookwyrm-export.csv"' }, ) + + +# pylint: disable=no-self-use +@method_decorator(login_required, name="dispatch") +class ExportUser(View): + """Let users export user data to import into another Bookwyrm instance""" + + def get(self, request): + """Request tar file""" + + jobs = BookwyrmExportJob.objects.filter(user=request.user).order_by( + "-created_date" + ) + site = models.SiteSettings.objects.get() + hours = site.user_import_time_limit + allowed = ( + jobs.first().created_date < timezone.now() - timedelta(hours=hours) + if jobs.first() + else True + ) + next_available = ( + jobs.first().created_date + timedelta(hours=hours) if not allowed else False + ) + paginated = Paginator(jobs, PAGE_LENGTH) + page = paginated.get_page(request.GET.get("page")) + data = { + "jobs": page, + "next_available": next_available, + "page_range": paginated.get_elided_page_range( + page.number, on_each_side=2, on_ends=1 + ), + } + + return TemplateResponse(request, "preferences/export-user.html", data) + + def post(self, request): + """Download the json file of a user's data""" + + job = BookwyrmExportJob.objects.create(user=request.user) + job.start_job() + + return redirect("prefs-user-export") + + +@method_decorator(login_required, name="dispatch") +class ExportArchive(View): + """Serve the archive file""" + + def get(self, request, archive_id): + """download user export file""" + export = BookwyrmExportJob.objects.get(task_id=archive_id, user=request.user) + return HttpResponse( + export.export_data, + content_type="application/gzip", + headers={ + "Content-Disposition": 'attachment; filename="bookwyrm-account-export.tar.gz"' # pylint: disable=line-too-long + }, + ) diff --git a/bookwyrm/views/preferences/move_user.py b/bookwyrm/views/preferences/move_user.py new file mode 100644 index 000000000..93abf2f18 --- /dev/null +++ b/bookwyrm/views/preferences/move_user.py @@ -0,0 +1,111 @@ +""" move your account somewhere else """ + +from django.core.exceptions import PermissionDenied +from django.contrib.auth.decorators import login_required +from django.shortcuts import get_object_or_404, redirect +from django.template.response import TemplateResponse +from django.utils.decorators import method_decorator +from django.views import View +from django.views.decorators.http import require_POST + +from bookwyrm import forms, models +from bookwyrm.views.helpers import handle_remote_webfinger + + +# pylint: disable=no-self-use +@method_decorator(login_required, name="dispatch") +class MoveUser(View): + """move user view""" + + def get(self, request): + """move page for a user""" + data = { + "form": forms.MoveUserForm(), + "user": request.user, + } + return TemplateResponse(request, "preferences/move_user.html", data) + + def post(self, request): + """Packing your stuff and moving house""" + form = forms.MoveUserForm(request.POST, instance=request.user) + user = models.User.objects.get(id=request.user.id) + + if form.is_valid() and user.check_password(form.cleaned_data["password"]): + username = form.cleaned_data["target"] + target = handle_remote_webfinger(username) + + try: + models.MoveUser.objects.create( + user=request.user, object=request.user.remote_id, target=target + ) + + return redirect("user-feed", username=request.user.username) + + except PermissionDenied: + form.errors["target"] = [ + "Set this user as an alias on the user you are moving to first" + ] + data = {"form": form, "user": request.user} + return TemplateResponse(request, "preferences/move_user.html", data) + + form.errors["password"] = ["Invalid password"] + data = {"form": form, "user": request.user} + return TemplateResponse(request, "preferences/move_user.html", data) + + +# pylint: disable=no-self-use +@method_decorator(login_required, name="dispatch") +class AliasUser(View): + """alias user view""" + + def get(self, request): + """move page for a user""" + data = { + "form": forms.AliasUserForm(), + "user": request.user, + } + return TemplateResponse(request, "preferences/alias_user.html", data) + + def post(self, request): + """Creating a nom de plume""" + form = forms.AliasUserForm(request.POST, instance=request.user) + user = models.User.objects.get(id=request.user.id) + + if form.is_valid() and user.check_password(form.cleaned_data["password"]): + username = form.cleaned_data["username"] + remote_user = handle_remote_webfinger(username) + + if remote_user is None: + form.errors["username"] = ["Username does not exist"] + data = {"form": form, "user": request.user} + return TemplateResponse(request, "preferences/alias_user.html", data) + + user.also_known_as.add(remote_user.id) + + return redirect("prefs-alias") + + form.errors["password"] = ["Invalid password"] + data = {"form": form, "user": request.user} + return TemplateResponse(request, "preferences/alias_user.html", data) + + +@login_required +@require_POST +def remove_alias(request): + """remove an alias from the user profile""" + + request.user.also_known_as.remove(request.POST["alias"]) + return redirect("prefs-alias") + + +@require_POST +@login_required +def unmove(request): + """undo a user move""" + target = get_object_or_404(models.User, remote_id=request.POST["remote_id"]) + move = get_object_or_404(models.MoveUser, target=target, user=request.user) + move.delete() + + request.user.moved_to = None + request.user.save(update_fields=["moved_to"], broadcast=True) + return redirect("prefs-alias") diff --git a/bookwyrm/views/search.py b/bookwyrm/views/search.py index 2b7303fd7..f8eddd1a6 100644 --- a/bookwyrm/views/search.py +++ b/bookwyrm/views/search.py @@ -13,7 +13,7 @@ from csp.decorators import csp_update from bookwyrm import models from bookwyrm.connectors import connector_manager from bookwyrm.book_search import search, format_search_result -from bookwyrm.settings import PAGE_LENGTH +from bookwyrm.settings import PAGE_LENGTH, INSTANCE_ACTOR_USERNAME from bookwyrm.utils import regex from .helpers import is_api_request from .helpers import handle_remote_webfinger @@ -51,7 +51,7 @@ class Search(View): def api_book_search(request): """Return books via API response""" query = request.GET.get("q") - query = isbn_check(query) + query = isbn_check_and_format(query) min_confidence = request.GET.get("min_confidence", 0) # only return local book results via json so we don't cascade book_results = search(query, min_confidence=min_confidence) @@ -64,7 +64,7 @@ def book_search(request): """the real business is elsewhere""" query = request.GET.get("q") # check if query is isbn - query = isbn_check(query) + query = isbn_check_and_format(query) min_confidence = request.GET.get("min_confidence", 0) search_remote = request.GET.get("remote", False) and request.user.is_authenticated @@ -113,6 +113,7 @@ def user_search(request): .filter( similarity__gt=0.5, ) + .exclude(localname=INSTANCE_ACTOR_USERNAME) .order_by("-similarity") ) @@ -158,7 +159,7 @@ def list_search(request): return TemplateResponse(request, "search/list.html", data) -def isbn_check(query): +def isbn_check_and_format(query): """isbn10 or isbn13 check, if so remove separators""" if query: su_num = re.sub(r"(?<=\d)\D(?=\d|[xX])", "", query) diff --git a/bookwyrm/views/shelf/shelf.py b/bookwyrm/views/shelf/shelf.py index dbbcc2d3a..a39512fe6 100644 --- a/bookwyrm/views/shelf/shelf.py +++ b/bookwyrm/views/shelf/shelf.py @@ -15,12 +15,14 @@ from bookwyrm import forms, models from bookwyrm.activitypub import ActivitypubResponse from bookwyrm.settings import PAGE_LENGTH from bookwyrm.views.helpers import is_api_request, get_user_from_username +from bookwyrm.book_search import search # pylint: disable=no-self-use class Shelf(View): """shelf page""" + # pylint: disable=R0914 def get(self, request, username, shelf_identifier=None): """display a shelf""" user = get_user_from_username(request.user, username) @@ -32,6 +34,8 @@ class Shelf(View): else: shelves = models.Shelf.privacy_filter(request.user).filter(user=user).all() + shelves_filter_query = request.GET.get("filter") + # get the shelf and make sure the logged in user should be able to see it if shelf_identifier: shelf = get_object_or_404(user.shelf_set, identifier=shelf_identifier) @@ -42,6 +46,7 @@ class Shelf(View): FakeShelf = namedtuple( "Shelf", ("identifier", "name", "user", "books", "privacy") ) + books = ( models.Edition.viewer_aware_objects(request.user) .filter( @@ -50,6 +55,7 @@ class Shelf(View): ) .distinct() ) + shelf = FakeShelf("all", _("All books"), user, books, "public") if is_api_request(request) and shelf_identifier: @@ -86,6 +92,9 @@ class Shelf(View): books = sort_books(books, request.GET.get("sort")) + if shelves_filter_query: + books = search(shelves_filter_query, books=books) + paginated = Paginator( books, PAGE_LENGTH, @@ -103,6 +112,8 @@ class Shelf(View): "page_range": paginated.get_elided_page_range( page.number, on_each_side=2, on_ends=1 ), + "shelves_filter_query": shelves_filter_query, + "size": "small", } return TemplateResponse(request, "shelf/shelf.html", data) diff --git a/bookwyrm/views/status.py b/bookwyrm/views/status.py index 7a0517b01..34b62d0b4 100644 --- a/bookwyrm/views/status.py +++ b/bookwyrm/views/status.py @@ -1,7 +1,6 @@ """ what are we here for if not for posting """ import re import logging -from urllib.parse import urlparse from django.contrib.auth.decorators import login_required from django.core.validators import URLValidator @@ -297,65 +296,51 @@ def find_or_create_hashtags(content): def format_links(content): """detect and format links""" - validator = URLValidator() - formatted_content = "" + validator = URLValidator(["http", "https"]) + schema_re = re.compile(r"\bhttps?://") split_content = re.split(r"(\s+)", content) - for potential_link in split_content: - if not potential_link: + for i, potential_link in enumerate(split_content): + if not schema_re.search(potential_link): continue - wrapped = _wrapped(potential_link) - if wrapped: - wrapper_close = potential_link[-1] - formatted_content += potential_link[0] - potential_link = potential_link[1:-1] - - ends_with_punctuation = _ends_with_punctuation(potential_link) - if ends_with_punctuation: - punctuation_glyph = potential_link[-1] - potential_link = potential_link[0:-1] + # Strip surrounding brackets and trailing punctuation. + prefix, potential_link, suffix = _unwrap(potential_link) try: # raises an error on anything that's not a valid link validator(potential_link) # use everything but the scheme in the presentation of the link - url = urlparse(potential_link) - link = url.netloc + url.path + url.params - if url.query != "": - link += "?" + url.query - if url.fragment != "": - link += "#" + url.fragment - - formatted_content += f'{link}' + link = schema_re.sub("", potential_link) + split_content[i] = f'{prefix}{link}{suffix}' except (ValidationError, UnicodeError): - formatted_content += potential_link + pass - if wrapped: - formatted_content += wrapper_close - - if ends_with_punctuation: - formatted_content += punctuation_glyph - - return formatted_content + return "".join(split_content) -def _wrapped(text): - """check if a line of text is wrapped""" - wrappers = [("(", ")"), ("[", "]"), ("{", "}")] - for wrapper in wrappers: +def _unwrap(text): + """split surrounding brackets and trailing punctuation from a string of text""" + punct = re.compile(r'([.,;:!?"’”»]+)$') + prefix = suffix = "" + + if punct.search(text): + # Move punctuation to suffix segment. + text, suffix, _ = punct.split(text) + + for wrapper in ("()", "[]", "{}"): if text[0] == wrapper[0] and text[-1] == wrapper[-1]: - return True - return False + # Split out wrapping chars. + suffix = text[-1] + suffix + prefix, text = text[:1], text[1:-1] + break # Nested wrappers not supported atm. + if punct.search(text): + # Move inner punctuation to suffix segment. + text, inner_punct, _ = punct.split(text) + suffix = inner_punct + suffix -def _ends_with_punctuation(text): - """check if a line of text ends with a punctuation glyph""" - glyphs = [".", ",", ";", ":", "!", "?", "”", "’", '"', "»"] - for glyph in glyphs: - if text[-1] == glyph: - return True - return False + return prefix, text, suffix def to_markdown(content): diff --git a/bookwyrm/views/user.py b/bookwyrm/views/user.py index e547925a5..ba224d671 100644 --- a/bookwyrm/views/user.py +++ b/bookwyrm/views/user.py @@ -11,7 +11,7 @@ from django.views.decorators.http import require_POST from bookwyrm import models from bookwyrm.activitypub import ActivitypubResponse -from bookwyrm.settings import PAGE_LENGTH +from bookwyrm.settings import PAGE_LENGTH, INSTANCE_ACTOR_USERNAME from .helpers import get_user_from_username, is_api_request @@ -31,6 +31,10 @@ class User(View): return ActivitypubResponse(user.to_activity()) # otherwise we're at a UI view + # if it's not an API request, never show the instance actor profile page + if user.localname == INSTANCE_ACTOR_USERNAME: + raise Http404() + shelf_preview = [] # only show shelves that should be visible diff --git a/bookwyrm/views/wellknown.py b/bookwyrm/views/wellknown.py index ec5acf98f..0f2805ff2 100644 --- a/bookwyrm/views/wellknown.py +++ b/bookwyrm/views/wellknown.py @@ -21,6 +21,7 @@ def webfinger(request): username = resource.replace("acct:", "") user = get_object_or_404(models.User, username__iexact=username) + href = user.moved_to if user.moved_to else user.remote_id return JsonResponse( { @@ -29,7 +30,7 @@ def webfinger(request): { "rel": "self", "type": "application/activity+json", - "href": user.remote_id, + "href": href, }, { "rel": "http://ostatus.org/schema/1.0/subscribe", diff --git a/bw-dev b/bw-dev index 57441f013..5a36f78e0 100755 --- a/bw-dev +++ b/bw-dev @@ -91,7 +91,7 @@ case "$CMD" in $DOCKER_COMPOSE run --rm --service-ports web ;; initdb) - initdb "@" + initdb "$@" ;; resetdb) prod_error @@ -165,6 +165,7 @@ case "$CMD" in git checkout l10n_main locale/pt_BR git checkout l10n_main locale/ro_RO git checkout l10n_main locale/sv_SE + git checkout l10n_main locale/uk_UA git checkout l10n_main locale/zh_Hans git checkout l10n_main locale/zh_Hant runweb django-admin makemessages --no-wrap --ignore=venv -l en_US $@ @@ -245,6 +246,9 @@ case "$CMD" in remove_remote_user_preview_images) runweb python manage.py remove_remote_user_preview_images ;; + erase_deleted_user_data) + runweb python manage.py erase_deleted_user_data "$@" + ;; copy_media_to_s3) awscommand "bookwyrm_media_volume:/images"\ "s3 cp /images s3://${AWS_STORAGE_BUCKET_NAME}/images\ @@ -296,7 +300,7 @@ case "$CMD" in echo "Unrecognised command. Try:" echo " setup" echo " up [container]" - echo " down" + echo " down" echo " service_ports_web" echo " initdb" echo " resetdb" diff --git a/dev-tools/Dockerfile b/dev-tools/Dockerfile index f6a7bb793..6c132944f 100644 --- a/dev-tools/Dockerfile +++ b/dev-tools/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.9 +FROM python:3.9-bookworm WORKDIR /app/dev-tools ENV PATH="/app/dev-tools/node_modules/.bin:$PATH" @@ -6,6 +6,7 @@ ENV PYTHONUNBUFFERED=1 ENV NPM_CONFIG_UPDATE_NOTIFIER=false ENV PIP_ROOT_USER_ACTION=ignore PIP_DISABLE_PIP_VERSION_CHECK=1 +COPY nodejs.pref /etc/apt/preferences.d/ COPY nodejs.sources /etc/apt/sources.list.d/ COPY package.json requirements.txt .stylelintrc.js .stylelintignore /app/dev-tools/ diff --git a/dev-tools/nodejs.pref b/dev-tools/nodejs.pref new file mode 100644 index 000000000..69e01c2c5 --- /dev/null +++ b/dev-tools/nodejs.pref @@ -0,0 +1,4 @@ +Package: nodejs +Pin: origin deb.nodesource.com +Pin-Priority: 995 +Explanation: prefer upstream packaging over Debian's diff --git a/locale/ca_ES/LC_MESSAGES/django.mo b/locale/ca_ES/LC_MESSAGES/django.mo index f62f704e5..ff27fe433 100644 Binary files a/locale/ca_ES/LC_MESSAGES/django.mo and b/locale/ca_ES/LC_MESSAGES/django.mo differ diff --git a/locale/ca_ES/LC_MESSAGES/django.po b/locale/ca_ES/LC_MESSAGES/django.po index 6a58b0720..f73aa49bf 100644 --- a/locale/ca_ES/LC_MESSAGES/django.po +++ b/locale/ca_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 06:50\n" +"POT-Creation-Date: 2023-12-30 23:52+0000\n" +"PO-Revision-Date: 2024-01-02 03:11\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Catalan\n" "Language: ca\n" @@ -42,15 +42,15 @@ msgstr "{i} usos" msgid "Unlimited" msgstr "Il·limitat" -#: bookwyrm/forms/edit_user.py:88 +#: bookwyrm/forms/edit_user.py:104 msgid "Incorrect password" msgstr "La contrasenya no és correcta" -#: bookwyrm/forms/edit_user.py:95 bookwyrm/forms/landing.py:90 +#: bookwyrm/forms/edit_user.py:111 bookwyrm/forms/landing.py:90 msgid "Password does not match" msgstr "La contrasenya no coincideix" -#: bookwyrm/forms/edit_user.py:118 +#: bookwyrm/forms/edit_user.py:134 msgid "Incorrect Password" msgstr "La contrasenya no és correcta" @@ -72,7 +72,7 @@ msgstr "La data de finalització de la lectura no pot ser en el futur." #: bookwyrm/forms/landing.py:38 msgid "Username or password are incorrect" -msgstr "Nom d'usuari o contrasenya incorrectes" +msgstr "El nom d'usuari o la contrasenya són incorrectes" #: bookwyrm/forms/landing.py:57 msgid "User with this username already exists" @@ -84,7 +84,7 @@ msgstr "Ja existeix un usuari amb aquesta adreça electrònica." #: bookwyrm/forms/landing.py:124 bookwyrm/forms/landing.py:132 msgid "Incorrect code" -msgstr "Codi incorrecte" +msgstr "El codi no és correcte" #: bookwyrm/forms/links.py:36 msgid "This domain is blocked. Please contact your administrator if you think this is an error." @@ -102,8 +102,8 @@ msgstr "Ordre del llistat" msgid "Book Title" msgstr "Títol del llibre" -#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:156 -#: bookwyrm/templates/shelf/shelf.html:188 +#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:158 +#: bookwyrm/templates/shelf/shelf.html:190 #: bookwyrm/templates/snippets/create_status/review.html:32 msgid "Rating" msgstr "Valoració" @@ -141,11 +141,11 @@ msgstr "Advertència" msgid "Danger" msgstr "Alerta" -#: bookwyrm/models/antispam.py:112 bookwyrm/models/antispam.py:146 +#: bookwyrm/models/antispam.py:113 bookwyrm/models/antispam.py:147 msgid "Automatically generated report" msgstr "Informe generat automàticament" -#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:47 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:48 #: bookwyrm/models/link.py:72 bookwyrm/templates/import/import_status.html:214 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" @@ -171,23 +171,23 @@ msgstr "Eliminació pel moderador" msgid "Domain block" msgstr "Bloqueig de domini" -#: bookwyrm/models/book.py:283 +#: bookwyrm/models/book.py:282 msgid "Audiobook" msgstr "Audiollibre" -#: bookwyrm/models/book.py:284 +#: bookwyrm/models/book.py:283 msgid "eBook" msgstr "Llibre electrònic" -#: bookwyrm/models/book.py:285 +#: bookwyrm/models/book.py:284 msgid "Graphic novel" msgstr "Novel·la gràfica" -#: bookwyrm/models/book.py:286 +#: bookwyrm/models/book.py:285 msgid "Hardcover" msgstr "Tapa dura" -#: bookwyrm/models/book.py:287 +#: bookwyrm/models/book.py:286 msgid "Paperback" msgstr "Edició de butxaca" @@ -205,26 +205,26 @@ msgstr "Federat" msgid "Blocked" msgstr "Blocat" -#: bookwyrm/models/fields.py:29 +#: bookwyrm/models/fields.py:35 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "%(value)s no és una remote_id vàlida" -#: bookwyrm/models/fields.py:38 bookwyrm/models/fields.py:47 +#: bookwyrm/models/fields.py:44 bookwyrm/models/fields.py:53 #, python-format msgid "%(value)s is not a valid username" msgstr "%(value)s no és un nom d'usuari vàlid" -#: bookwyrm/models/fields.py:192 bookwyrm/templates/layout.html:128 +#: bookwyrm/models/fields.py:198 bookwyrm/templates/layout.html:129 #: bookwyrm/templates/ostatus/error.html:29 msgid "username" msgstr "nom d'usuari" -#: bookwyrm/models/fields.py:197 +#: bookwyrm/models/fields.py:203 msgid "A user with that username already exists." msgstr "Ja existeix un usuari amb aquest nom." -#: bookwyrm/models/fields.py:216 +#: bookwyrm/models/fields.py:222 #: bookwyrm/templates/snippets/privacy-icons.html:3 #: bookwyrm/templates/snippets/privacy-icons.html:4 #: bookwyrm/templates/snippets/privacy_select.html:11 @@ -232,7 +232,7 @@ msgstr "Ja existeix un usuari amb aquest nom." msgid "Public" msgstr "Públic" -#: bookwyrm/models/fields.py:217 +#: bookwyrm/models/fields.py:223 #: bookwyrm/templates/snippets/privacy-icons.html:7 #: bookwyrm/templates/snippets/privacy-icons.html:8 #: bookwyrm/templates/snippets/privacy_select.html:14 @@ -240,7 +240,7 @@ msgstr "Públic" msgid "Unlisted" msgstr "No llistat" -#: bookwyrm/models/fields.py:218 +#: bookwyrm/models/fields.py:224 #: bookwyrm/templates/snippets/privacy_select.html:17 #: bookwyrm/templates/user/relationships/followers.html:6 #: bookwyrm/templates/user/relationships/followers.html:11 @@ -249,7 +249,7 @@ msgstr "No llistat" msgid "Followers" msgstr "Seguidors" -#: bookwyrm/models/fields.py:219 +#: bookwyrm/models/fields.py:225 #: bookwyrm/templates/snippets/create_status/post_options_block.html:6 #: bookwyrm/templates/snippets/privacy-icons.html:15 #: bookwyrm/templates/snippets/privacy-icons.html:16 @@ -258,30 +258,29 @@ msgstr "Seguidors" msgid "Private" msgstr "Privat" -#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:174 +#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:174 #: bookwyrm/templates/settings/imports/imports.html:98 -#: bookwyrm/templates/settings/users/user_admin.html:81 -#: bookwyrm/templates/settings/users/user_info.html:28 +#: bookwyrm/templates/snippets/user_active_tag.html:8 msgid "Active" msgstr "Actiu" -#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:172 +#: bookwyrm/models/import_job.py:50 bookwyrm/templates/import/import.html:172 msgid "Complete" msgstr "Complet" -#: bookwyrm/models/import_job.py:50 +#: bookwyrm/models/import_job.py:51 msgid "Stopped" msgstr "Aturat" -#: bookwyrm/models/import_job.py:83 bookwyrm/models/import_job.py:91 +#: bookwyrm/models/import_job.py:84 bookwyrm/models/import_job.py:92 msgid "Import stopped" msgstr "S'ha aturat la importació" -#: bookwyrm/models/import_job.py:363 bookwyrm/models/import_job.py:388 +#: bookwyrm/models/import_job.py:356 bookwyrm/models/import_job.py:381 msgid "Error loading book" msgstr "Error en carregar el llibre" -#: bookwyrm/models/import_job.py:372 +#: bookwyrm/models/import_job.py:365 msgid "Could not find a match for book" msgstr "No s'ha trobat el llibre" @@ -352,122 +351,143 @@ msgstr "Domini aprovat" msgid "Deleted item" msgstr "Element suprimit" -#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:307 +#: bookwyrm/models/user.py:33 bookwyrm/templates/book/book.html:307 msgid "Reviews" msgstr "Ressenya" -#: bookwyrm/models/user.py:33 +#: bookwyrm/models/user.py:34 msgid "Comments" msgstr "Comentaris" -#: bookwyrm/models/user.py:34 +#: bookwyrm/models/user.py:35 msgid "Quotations" msgstr "Citacions" -#: bookwyrm/models/user.py:35 +#: bookwyrm/models/user.py:36 msgid "Everything else" msgstr "Tota la resta" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home Timeline" msgstr "Línia de temps Inici" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home" msgstr "Inici" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 msgid "Books Timeline" msgstr "Cronologia dels llibres" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 -#: bookwyrm/templates/user/layout.html:97 +#: bookwyrm/templates/user/layout.html:107 msgid "Books" msgstr "Llibres" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:313 msgid "English" msgstr "English (Anglès)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:314 msgid "Català (Catalan)" msgstr "Català" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:315 msgid "Deutsch (German)" msgstr "Deutsch (Alemany)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:316 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Esperanto)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:317 msgid "Español (Spanish)" msgstr "Español (espanyol)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:318 msgid "Euskara (Basque)" msgstr "Euskera (Basc)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:319 msgid "Galego (Galician)" msgstr "Galego (gallec)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:320 msgid "Italiano (Italian)" msgstr "Italiano (italià)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:321 msgid "Suomi (Finnish)" msgstr "Suomi (finès)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:322 msgid "Français (French)" msgstr "Français (francès)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:323 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Lituà)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:324 msgid "Nederlands (Dutch)" msgstr "Països Baixos (Holandès)" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:325 msgid "Norsk (Norwegian)" msgstr "Norsk (noruec)" -#: bookwyrm/settings.py:309 +#: bookwyrm/settings.py:326 msgid "Polski (Polish)" msgstr "Polski (polonès)" -#: bookwyrm/settings.py:310 +#: bookwyrm/settings.py:327 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (portuguès del Brasil)" -#: bookwyrm/settings.py:311 +#: bookwyrm/settings.py:328 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Portuguès europeu)" -#: bookwyrm/settings.py:312 +#: bookwyrm/settings.py:329 msgid "Română (Romanian)" msgstr "Română (romanès)" -#: bookwyrm/settings.py:313 +#: bookwyrm/settings.py:330 msgid "Svenska (Swedish)" msgstr "Svenska (suec)" -#: bookwyrm/settings.py:314 +#: bookwyrm/settings.py:331 +msgid "Українська (Ukrainian)" +msgstr "" + +#: bookwyrm/settings.py:332 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (xinès simplificat)" -#: bookwyrm/settings.py:315 +#: bookwyrm/settings.py:333 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (xinès tradicional)" +#: bookwyrm/templates/403.html:5 +msgid "Oh no!" +msgstr "" + +#: bookwyrm/templates/403.html:9 bookwyrm/templates/landing/invite.html:21 +msgid "Permission Denied" +msgstr "Permís denegat" + +#: bookwyrm/templates/403.html:11 +#, python-format +msgid "You do not have permission to view this page or perform this action. Your user permission level is %(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,
    and achieved %(goal_percent)s%% of that goal" msgid_plural "%(display_name)s set a goal of reading %(goal)s books in %(year)s,
    and achieved %(goal_percent)s%% of that goal" -msgstr[0] "%(display_name)s havia fixat com a objectiu llegir %(goal)s llibre l'any %(year)s,
    i ha assolit llegir %(goal_percent)s%% d'aquell objectiu" -msgstr[1] "%(display_name)s havia fixat com a objectiu llegir %(goal)s llibres l'any %(year)s,
    i ha assolit llegir %(goal_percent)s d'aquell objectiu" +msgstr[0] "%(display_name)s havia fixat com a objectiu llegir %(goal)s llibres l'any %(year)s,
    i ha assolit llegir %(goal_percent)s%% d'aquell objectiu" +msgstr[1] "%(display_name)s s'havia fixat com a objectiu llegir %(goal)s llibres l'any %(year)s,
    i ha assolit llegir un %(goal_percent)s%% d'aquell objectiu" #: bookwyrm/templates/annual_summary/layout.html:211 msgid "Way to go!" @@ -768,24 +802,24 @@ msgid "View ISNI record" msgstr "Veure el registre ISNI" #: bookwyrm/templates/author/author.html:95 -#: bookwyrm/templates/book/book.html:173 +#: bookwyrm/templates/book/book.html:175 msgid "View on ISFDB" msgstr "Veure a 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 "Carregueu dades" #: bookwyrm/templates/author/author.html:104 -#: bookwyrm/templates/book/book.html:144 +#: bookwyrm/templates/book/book.html:146 msgid "View on OpenLibrary" msgstr "Veure a OpenLibrary" #: bookwyrm/templates/author/author.html:119 -#: bookwyrm/templates/book/book.html:158 +#: bookwyrm/templates/book/book.html:160 msgid "View on Inventaire" msgstr "Veure a Inventaire" @@ -797,11 +831,7 @@ msgstr "Veure a LibraryThing" msgid "View on Goodreads" msgstr "Veure a Goodreads" -#: bookwyrm/templates/author/author.html:151 -msgid "View ISFDB entry" -msgstr "Veure entrada a ISFDB" - -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:158 #, python-format msgid "Books by %(name)s" msgstr "Llibres 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 "Confirmeu" msgid "Unable to connect to remote source." msgstr "No ha estat possible connectar a la font externa." -#: 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 el llibre" -#: 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 "Fes clic per afegir una coberta" -#: bookwyrm/templates/book/book.html:106 +#: bookwyrm/templates/book/book.html:108 msgid "Failed to load cover" msgstr "No sh'a pogut carregar la coberta" -#: bookwyrm/templates/book/book.html:117 +#: bookwyrm/templates/book/book.html:119 msgid "Click to enlarge" msgstr "Feu clic per ampliar" @@ -1046,13 +1076,13 @@ msgstr "Llocs" #: 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 "Llistes" @@ -1117,7 +1147,7 @@ msgstr "Carregueu una portada:" #: 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 "Carregueu portada desde una url:" #: bookwyrm/templates/book/cover_show_modal.html:6 @@ -1328,7 +1358,7 @@ msgid "Add Another Author" msgstr "Afegiu un altre 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 "Coberta" @@ -1372,8 +1402,8 @@ msgstr "Edicions de %(book_title)s" #: bookwyrm/templates/book/editions/editions.html:8 #, python-format -msgid "Editions of \"%(work_title)s\"" -msgstr "Edicions de \"%(work_title)s\"" +msgid "Editions of %(work_title)s" +msgstr "Edicions 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 "Domini" #: 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 "Estat" @@ -1465,7 +1496,7 @@ msgstr "Estat" #: 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 "Accions" @@ -1494,7 +1525,7 @@ msgstr "Enllaços a fitxers" #: bookwyrm/templates/book/file_links/links.html:9 msgid "Get a copy" -msgstr "Obtingeu una còpia" +msgstr "Obtingueu-ne una còpia" #: bookwyrm/templates/book/file_links/links.html:47 msgid "No links available" @@ -1529,22 +1560,22 @@ msgstr "%(pages)s pàgines" 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 "Publicat el %(date)s per %(publisher)s." +#: bookwyrm/templates/book/publisher_info.html:65 +#, python-format +msgid "Published by %(publisher)s." +msgstr "Publicat per %(publisher)s." + #: bookwyrm/templates/book/publisher_info.html:67 #, python-format msgid "Published %(date)s" msgstr "Publicat el %(date)s" -#: bookwyrm/templates/book/publisher_info.html:69 -#, python-format -msgid "Published by %(publisher)s." -msgstr "Publicat per %(publisher)s." - -#: bookwyrm/templates/book/rating.html:13 +#: bookwyrm/templates/book/rating.html:19 msgid "rated it" msgstr "el va valorar amb" @@ -1552,12 +1583,12 @@ msgstr "el va valorar amb" msgid "Series by" msgstr "Sèries per" -#: bookwyrm/templates/book/series.html:27 +#: bookwyrm/templates/book/series.html:28 #, python-format msgid "Book %(series_number)s" msgstr "Llibre %(series_number)s" -#: bookwyrm/templates/book/series.html:27 +#: bookwyrm/templates/book/series.html:28 msgid "Unsorted Book" msgstr "Llibre sense classificar" @@ -1681,6 +1712,7 @@ msgstr "Suggerit" #: 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 citat %(username)s" msgstr "Missatges Directes amb %(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 "Missatges directes" @@ -1948,7 +1980,7 @@ msgstr "Actualitzacions" #: 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 "Els teus llibres" @@ -1996,19 +2028,19 @@ msgid "Add to your books" msgstr "Afegir als vostres llibres" #: 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 "Pendent de llegir" #: 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 actuals" #: 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 "Llegits" #: 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 "Deixat de llegir" @@ -2027,7 +2059,7 @@ msgid "What are you reading?" msgstr "Què estas llegint?" #: 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 "Cerqueu un llibre" @@ -2046,8 +2078,8 @@ msgstr "Podràs afegir llibres quan comencis 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 "Lector de codi de 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 "Utilitzeu els enllaços Activitat, Llistes i Descobriu per descobrir les últimes novetats de les vostres activitats, llistes de llibres per temes, i els últims esdeveniments d'aquest servidor 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 s'il·luminarà quan tinguis una nova notificació. Clica-la per descobrir què hi ha de nou!" #: 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 "Notificacions" #: 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 "Es pot accedir all vostre perfil, llibres, missatges directes i configuració clicant a sobre del vostre nom en aquest 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 "Podeu crear o unir-vos a un grup amb altres usuàries. Els grups poden 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 "Grups" @@ -2747,7 +2779,7 @@ msgid "This is your user profile. All your latest activities will be listed here msgstr "Aquesta és la vostra pàgina d'usuari. Totes les vostres activitats es mostraran aquí. Altres membres de Bookwyrm poden veure parts d'aquesta pàgina, depèn de com tingueu la configuració de privacitat." #: 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 l'usuari" @@ -2756,7 +2788,7 @@ msgid "This tab shows everything you have read towards your annual reading goal, msgstr "Aquesta pestanya mostra tot el que heu llegit de cara al vostre objectiu de lectura anual, o us permet establir-ne un si no en teniu." #: 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 "Objectiu de lectura" @@ -2795,7 +2827,7 @@ msgstr "Cap activitat per a aquesta etiqueta!" #: 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 Llibres" @@ -2805,15 +2837,10 @@ msgstr "Fitxer CSV no vàlid" #: 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" -"Actualment, es permet la importació de %(display_size)s llibres cada %(import_limit_reset)s dies. " -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] "Actualment se us permet la importació de %(display_size)s llibres cada %(import_limit_reset)s dia." +msgstr[1] "Actualment se us permet la importació de %(display_size)s llibres cada %(import_limit_reset)s dies." #: bookwyrm/templates/import/import.html:27 #, python-format @@ -2872,7 +2899,7 @@ msgstr "Configuració de privacitat per les ressenyes importades:" #: 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" @@ -2971,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ítol" @@ -2985,8 +3012,8 @@ msgid "Openlibrary key" msgstr "Clau d'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" @@ -3092,10 +3119,6 @@ msgstr "Contacteu amb l'administrador o You have moved your account to %(username)s" +msgstr "Has mogut el teu compte a %(username)s" + +#: 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 "Pots desfer el trasllat per restaurar totes les funcionalitats, però alguns seguidors potser ja han deixat de seguir aquest compte." + +#: bookwyrm/templates/moved.html:42 +msgid "Undo move" +msgstr "Desfés el trasllat" + +#: bookwyrm/templates/moved.html:46 bookwyrm/templates/user_menu.html:77 +msgid "Log out" +msgstr "Desconnecta" + #: bookwyrm/templates/notifications/items/accept.html:18 #, python-format msgid "%(related_user)s accepted your invitation to join group \"%(group_name)s\"" @@ -3702,6 +3743,13 @@ msgstr "S'ha completat el vostre import." msgid "%(related_user)s invited you to join the group \"%(group_name)s\"" msgstr "%(related_user)s us ha convidat a unir-vos al grup \"%(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\"" @@ -3749,6 +3797,16 @@ msgstr "%(related_user)s us ha mencionat e msgid "%(related_user)s mentioned you in a status" msgstr "%(related_user)s us ha mencionat en un estat" +#: bookwyrm/templates/notifications/items/move_user.html:18 +#, python-format +msgid "%(related_user)s has moved to %(username)s" +msgstr "%(related_user)s s'ha mogut a %(username)s" + +#: bookwyrm/templates/notifications/items/move_user.html:25 +#, python-format +msgid "%(related_user)s has undone their move" +msgstr "%(related_user)s ha desfet el seu canvi" + #: bookwyrm/templates/notifications/items/remove.html:17 #, python-format msgid "has been removed from your group \"%(group_name)s\"" @@ -3787,7 +3845,7 @@ msgstr[0] "Una nova denúncia necessita moderació" msgstr[1] "%(display_count)s noves denúncies necessiten moderació" #: 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 "Avís de contingut" @@ -4005,9 +4063,51 @@ msgstr "Confirmeu la vostra contrasenya per començar a configurar 2FA." msgid "Set up 2FA" msgstr "Configura 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 "Moure al compte" + +#: bookwyrm/templates/preferences/alias_user.html:7 +#: bookwyrm/templates/preferences/alias_user.html:34 +msgid "Create Alias" +msgstr "Crea un àlies" + +#: bookwyrm/templates/preferences/alias_user.html:12 +msgid "Add another account as an alias" +msgstr "Afegeix un altre compte com a àlies" + +#: 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 "Per a moure un altre compte sobre aquest, heu de marcar abans el primer com a àlies." + +#: bookwyrm/templates/preferences/alias_user.html:19 +msgid "This is a reversable action and will not change the functionality of this account." +msgstr "Aquesta acció és reversible i no alterarà la funcionalitat d'aquest compte." + +#: 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 "Entreu el nom d'usuari del compte que voleu afegir com a àlies. Per exemple, usuari@exemple.com:" + +#: bookwyrm/templates/preferences/alias_user.html:30 +#: bookwyrm/templates/preferences/move_user.html:35 +msgid "Confirm your password:" +msgstr "Confirmeu contrasenya:" + +#: bookwyrm/templates/preferences/alias_user.html:39 +#: bookwyrm/templates/preferences/layout.html:28 +msgid "Aliases" +msgstr "Àlies" + +#: bookwyrm/templates/preferences/alias_user.html:49 +msgid "Remove alias" +msgstr "Esborra l'àlies" + #: 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 "Usuaris bloquejats" @@ -4037,7 +4137,7 @@ msgstr "Nova Contrasenya:" #: 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 "Suprimeix el compte" @@ -4082,7 +4182,7 @@ msgstr "Edita el perfil" #: 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 "Perfil" @@ -4159,18 +4259,47 @@ msgstr "Baixa el fitxer" msgid "Account" msgstr "Compte" -#: bookwyrm/templates/preferences/layout.html:31 +#: bookwyrm/templates/preferences/layout.html:32 +msgid "Move Account" +msgstr "Moure al compte" + +#: bookwyrm/templates/preferences/layout.html:39 msgid "Data" msgstr "Dades" -#: bookwyrm/templates/preferences/layout.html:39 +#: bookwyrm/templates/preferences/layout.html:47 msgid "CSV export" msgstr "Exportació CSV" -#: bookwyrm/templates/preferences/layout.html:42 +#: bookwyrm/templates/preferences/layout.html:50 msgid "Relationships" msgstr "Relacions" +#: bookwyrm/templates/preferences/move_user.html:12 +msgid "Migrate account to another server" +msgstr "Trasllada el compte a un altre servidor" + +#: 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 "El trasllat del compte es notificarà a tots els vostres seguidors i els convidarà a seguir-vos al compte nou." + +#: 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" +" %(user)s es marcarà com a traslladat i no es podrà localitzar o utilitzar si no en desfeu el trasllat.\n" +" " + +#: 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 "Recordeu afegir aquest usuari com a àlies del compte destí abans de fer el trasllat." + +#: 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 "Entreu el nom d'usuari del compte que voleu afegir com a àlies. Per exemple, usuari@exemple.com:" + #: bookwyrm/templates/reading_progress/finish.html:5 #, python-format msgid "Finish \"%(book_title)s\"" @@ -4568,7 +4697,7 @@ msgstr "Estat del Celery" #: bookwyrm/templates/settings/celery.html:14 msgid "You can set up monitoring to check if Celery is running by querying:" -msgstr "" +msgstr "Podeu configurar la supervisió per revisar si el Celery s'està executant:" #: bookwyrm/templates/settings/celery.html:22 msgid "Queues" @@ -4579,8 +4708,8 @@ msgid "Streams" msgstr "Reproduccions" #: bookwyrm/templates/settings/celery.html:32 -msgid "Broadcasts" -msgstr "Emet" +msgid "Broadcast" +msgstr "Difondre" #: bookwyrm/templates/settings/celery.html:38 msgid "Inbox" @@ -4930,7 +5059,7 @@ msgid "Details" msgstr "Detalls" #: bookwyrm/templates/settings/federation/instance.html:53 -#: bookwyrm/templates/user/layout.html:69 +#: bookwyrm/templates/user/layout.html:79 msgid "Activity" msgstr "Activitat" @@ -5118,7 +5247,7 @@ msgstr "Peticions d'invitació" #: 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 "Invitacions" @@ -5592,57 +5721,73 @@ msgid "Set instance default theme" msgstr "Estableix el tema per defecte de la instància" #: 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 afegit correctament" -#: bookwyrm/templates/settings/themes.html:26 +#: bookwyrm/templates/settings/themes.html:35 msgid "How to add a theme" msgstr "Com afegir un tema" -#: 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 "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 \n" "Language-Team: German\n" "Language: de\n" @@ -42,15 +42,15 @@ msgstr "{i}-mal verwendbar" msgid "Unlimited" msgstr "Unbegrenzt" -#: bookwyrm/forms/edit_user.py:88 +#: bookwyrm/forms/edit_user.py:104 msgid "Incorrect password" msgstr "Falsches Passwort" -#: bookwyrm/forms/edit_user.py:95 bookwyrm/forms/landing.py:90 +#: bookwyrm/forms/edit_user.py:111 bookwyrm/forms/landing.py:90 msgid "Password does not match" msgstr "Passwort stimmt nicht überein" -#: bookwyrm/forms/edit_user.py:118 +#: bookwyrm/forms/edit_user.py:134 msgid "Incorrect Password" msgstr "Falsches Passwort" @@ -102,8 +102,8 @@ msgstr "Reihenfolge der Liste" msgid "Book Title" msgstr "Buchtitel" -#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:156 -#: bookwyrm/templates/shelf/shelf.html:188 +#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:158 +#: bookwyrm/templates/shelf/shelf.html:190 #: bookwyrm/templates/snippets/create_status/review.html:32 msgid "Rating" msgstr "Bewertung" @@ -141,11 +141,11 @@ msgstr "Warnung" msgid "Danger" msgstr "Gefahr" -#: bookwyrm/models/antispam.py:112 bookwyrm/models/antispam.py:146 +#: bookwyrm/models/antispam.py:113 bookwyrm/models/antispam.py:147 msgid "Automatically generated report" msgstr "Automatisch generierter Bericht" -#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:47 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:48 #: bookwyrm/models/link.py:72 bookwyrm/templates/import/import_status.html:214 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" @@ -171,23 +171,23 @@ msgstr "Moderator*in löschen" msgid "Domain block" msgstr "Domainsperrung" -#: bookwyrm/models/book.py:283 +#: bookwyrm/models/book.py:282 msgid "Audiobook" msgstr "Hörbuch" -#: bookwyrm/models/book.py:284 +#: bookwyrm/models/book.py:283 msgid "eBook" msgstr "E-Book" -#: bookwyrm/models/book.py:285 +#: bookwyrm/models/book.py:284 msgid "Graphic novel" msgstr "Graphic Novel" -#: bookwyrm/models/book.py:286 +#: bookwyrm/models/book.py:285 msgid "Hardcover" msgstr "Hardcover" -#: bookwyrm/models/book.py:287 +#: bookwyrm/models/book.py:286 msgid "Paperback" msgstr "Taschenbuch" @@ -205,26 +205,26 @@ msgstr "Föderiert" msgid "Blocked" msgstr "Blockiert" -#: bookwyrm/models/fields.py:29 +#: bookwyrm/models/fields.py:35 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "%(value)s ist keine gültige remote_id" -#: bookwyrm/models/fields.py:38 bookwyrm/models/fields.py:47 +#: bookwyrm/models/fields.py:44 bookwyrm/models/fields.py:53 #, python-format msgid "%(value)s is not a valid username" msgstr "%(value)s ist kein gültiger Benutzer*inname" -#: bookwyrm/models/fields.py:192 bookwyrm/templates/layout.html:128 +#: bookwyrm/models/fields.py:198 bookwyrm/templates/layout.html:129 #: bookwyrm/templates/ostatus/error.html:29 msgid "username" msgstr "Benutzer*inname" -#: bookwyrm/models/fields.py:197 +#: bookwyrm/models/fields.py:203 msgid "A user with that username already exists." msgstr "Dieser Benutzer*inname ist bereits vergeben." -#: bookwyrm/models/fields.py:216 +#: bookwyrm/models/fields.py:222 #: bookwyrm/templates/snippets/privacy-icons.html:3 #: bookwyrm/templates/snippets/privacy-icons.html:4 #: bookwyrm/templates/snippets/privacy_select.html:11 @@ -232,7 +232,7 @@ msgstr "Dieser Benutzer*inname ist bereits vergeben." msgid "Public" msgstr "Öffentlich" -#: bookwyrm/models/fields.py:217 +#: bookwyrm/models/fields.py:223 #: bookwyrm/templates/snippets/privacy-icons.html:7 #: bookwyrm/templates/snippets/privacy-icons.html:8 #: bookwyrm/templates/snippets/privacy_select.html:14 @@ -240,7 +240,7 @@ msgstr "Öffentlich" msgid "Unlisted" msgstr "Ungelistet" -#: bookwyrm/models/fields.py:218 +#: bookwyrm/models/fields.py:224 #: bookwyrm/templates/snippets/privacy_select.html:17 #: bookwyrm/templates/user/relationships/followers.html:6 #: bookwyrm/templates/user/relationships/followers.html:11 @@ -249,7 +249,7 @@ msgstr "Ungelistet" msgid "Followers" msgstr "Follower*innen" -#: bookwyrm/models/fields.py:219 +#: bookwyrm/models/fields.py:225 #: bookwyrm/templates/snippets/create_status/post_options_block.html:6 #: bookwyrm/templates/snippets/privacy-icons.html:15 #: bookwyrm/templates/snippets/privacy-icons.html:16 @@ -258,30 +258,29 @@ msgstr "Follower*innen" msgid "Private" msgstr "Privat" -#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:174 +#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:174 #: bookwyrm/templates/settings/imports/imports.html:98 -#: bookwyrm/templates/settings/users/user_admin.html:81 -#: bookwyrm/templates/settings/users/user_info.html:28 +#: bookwyrm/templates/snippets/user_active_tag.html:8 msgid "Active" msgstr "Aktiv" -#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:172 +#: bookwyrm/models/import_job.py:50 bookwyrm/templates/import/import.html:172 msgid "Complete" msgstr "Abgeschlossen" -#: bookwyrm/models/import_job.py:50 +#: bookwyrm/models/import_job.py:51 msgid "Stopped" msgstr "Gestoppt" -#: bookwyrm/models/import_job.py:83 bookwyrm/models/import_job.py:91 +#: bookwyrm/models/import_job.py:84 bookwyrm/models/import_job.py:92 msgid "Import stopped" msgstr "Import gestoppt" -#: bookwyrm/models/import_job.py:363 bookwyrm/models/import_job.py:388 +#: bookwyrm/models/import_job.py:356 bookwyrm/models/import_job.py:381 msgid "Error loading book" msgstr "Fehler beim Laden des Buches" -#: bookwyrm/models/import_job.py:372 +#: bookwyrm/models/import_job.py:365 msgid "Could not find a match for book" msgstr "Keine Übereinstimmung für das Buch gefunden" @@ -338,7 +337,7 @@ msgstr "Benutzerberechtigungsstufe geändert" #: bookwyrm/models/report.py:92 msgid "Deleted user account" -msgstr "Benutzerkonto gelöscht" +msgstr "Gelöschtes Benutzerkonto" #: bookwyrm/models/report.py:93 msgid "Blocked domain" @@ -346,128 +345,149 @@ msgstr "Gesperrte Domain" #: bookwyrm/models/report.py:94 msgid "Approved domain" -msgstr "Genehmigte Domain" +msgstr "Zugelassene Domain" #: bookwyrm/models/report.py:95 msgid "Deleted item" msgstr "Gelöschter Eintrag" -#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:307 +#: bookwyrm/models/user.py:33 bookwyrm/templates/book/book.html:307 msgid "Reviews" msgstr "Rezensionen" -#: bookwyrm/models/user.py:33 +#: bookwyrm/models/user.py:34 msgid "Comments" msgstr "Kommentare" -#: bookwyrm/models/user.py:34 +#: bookwyrm/models/user.py:35 msgid "Quotations" msgstr "Zitate" -#: bookwyrm/models/user.py:35 +#: bookwyrm/models/user.py:36 msgid "Everything else" msgstr "Alles andere" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home Timeline" msgstr "Start-Zeitleiste" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home" msgstr "Startseite" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 msgid "Books Timeline" msgstr "Bücher-Timeline" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 -#: bookwyrm/templates/user/layout.html:97 +#: bookwyrm/templates/user/layout.html:107 msgid "Books" msgstr "Bücher" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:313 msgid "English" msgstr "English (Englisch)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:314 msgid "Català (Catalan)" msgstr "Català (Katalanisch)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:315 msgid "Deutsch (German)" msgstr "Deutsch" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:316 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Esperanto)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:317 msgid "Español (Spanish)" msgstr "Español (Spanisch)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:318 msgid "Euskara (Basque)" msgstr "Euskara (Baskisch)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:319 msgid "Galego (Galician)" msgstr "Galego (Galizisch)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:320 msgid "Italiano (Italian)" msgstr "Italiano (Italienisch)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:321 msgid "Suomi (Finnish)" msgstr "Suomi (Finnisch)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:322 msgid "Français (French)" msgstr "Français (Französisch)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:323 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Litauisch)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:324 msgid "Nederlands (Dutch)" msgstr "Nederlands (Niederländisch)" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:325 msgid "Norsk (Norwegian)" msgstr "Norsk (Norwegisch)" -#: bookwyrm/settings.py:309 +#: bookwyrm/settings.py:326 msgid "Polski (Polish)" msgstr "Polski (Polnisch)" -#: bookwyrm/settings.py:310 +#: bookwyrm/settings.py:327 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (brasilianisches Portugiesisch)" -#: bookwyrm/settings.py:311 +#: bookwyrm/settings.py:328 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Portugiesisch)" -#: bookwyrm/settings.py:312 +#: bookwyrm/settings.py:329 msgid "Română (Romanian)" msgstr "Română (Rumänisch)" -#: bookwyrm/settings.py:313 +#: bookwyrm/settings.py:330 msgid "Svenska (Swedish)" msgstr "Svenska (Schwedisch)" -#: bookwyrm/settings.py:314 +#: bookwyrm/settings.py:331 +msgid "Українська (Ukrainian)" +msgstr "" + +#: bookwyrm/settings.py:332 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (vereinfachtes Chinesisch)" -#: bookwyrm/settings.py:315 +#: bookwyrm/settings.py:333 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Chinesisch, traditionell)" +#: bookwyrm/templates/403.html:5 +msgid "Oh no!" +msgstr "" + +#: bookwyrm/templates/403.html:9 bookwyrm/templates/landing/invite.html:21 +msgid "Permission Denied" +msgstr "Zugiff verweigert" + +#: bookwyrm/templates/403.html:11 +#, python-format +msgid "You do not have permission to view this page or perform this action. Your user permission level is %(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!

    Would you like to take the guided tour to help you get started?" -msgstr "Willkommen bei Bookwyrm!

    Möchtest du eine Tour für einen einfachen Einstieg machen?" +msgstr "Willkommen bei Bookwyrm!

    Möchtest Du die geführte Tour machen, um Dir den Einstieg zu erleichtern?" #: bookwyrm/templates/guided_tour/home.html:17 #: bookwyrm/templates/guided_tour/home.html:39 @@ -2514,8 +2546,8 @@ msgid "Barcode reader" msgstr "Barcode-Leser" #: 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 "Verwende die Feed-, Listen- und Entdecken-Links, um die neuesten Nachrichten aus deinem Feed zu finden, themenbezogene Bücherlisten und die neuesten Ereignisse auf diesem 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 "Die Glocke wird aufleuchten, wenn Du eine neue Benachrichtigung hast. Klicke auf sie, um herauszufinden, was Aufregendes passiert ist!" #: 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 "Benachrichtigungen" #: 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 "Dein Profil, deine Bücher, Direktnachrichten und Einstellungen können durch Klicken auf deinen Namen in diesem Menü abgerufen werden." +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 kannst eine Gruppe mit anderen Personen erstellen oder beitreten. Gru #: 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 "Gruppen" @@ -2747,7 +2779,7 @@ msgid "This is your user profile. All your latest activities will be listed here msgstr "Dies ist dein Benutzerprofil. Alle deine neuesten Aktivitäten werden hier aufgelistet. Andere Bookwyrm-Benutzer können auch Teile dieser Seite sehen – was sie sehen können, hängt von deinen Privatsphäreeinstellungen ab." #: 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 "Diese Registerkarte zeigt alles, was du gelesen hast, um dein jährliches Leseziel zu erreichen oder lässt dich eines setzen. Du musst kein Leseziel setzen, wenn du das nicht möchtest!" #: 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 "Leseziel" @@ -2795,7 +2827,7 @@ msgstr "Keine Aktivitäten für diesen Hashtag bisher!" #: 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 "Bücher importieren" @@ -2805,15 +2837,10 @@ msgstr "Keine gültige CSV-Datei" #: 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] "\n" -"Momentan darfst du alle %(import_limit_reset)s Tage %(import_size_limit)s Bücher importieren. " +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] "Aktuell dürfen Sie %(display_size)s Bücher, alle %(import_limit_reset)s Tage importieren." +msgstr[1] "Zurzeit dürfen Sie alle %(import_limit_reset)s Tage bis zu %(display_size)s Bücher importieren." #: bookwyrm/templates/import/import.html:27 #, python-format @@ -2872,7 +2899,7 @@ msgstr "Datenschutzeinstellung für importierte Besprechungen:" #: 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 "Importieren" @@ -2947,7 +2974,7 @@ msgstr "Import stoppen" #, python-format msgid "%(display_counter)s item needs manual approval." msgid_plural "%(display_counter)s items need manual approval." -msgstr[0] "%(display_counter)s Element muss manuell geprüft werden." +msgstr[0] "%(display_counter)s Eintrag muss manuell geprüft werden." msgstr[1] "%(display_counter)s Elemente müssen manuell geprüft werden." #: bookwyrm/templates/import/import_status.html:83 @@ -2971,8 +2998,8 @@ msgid "Row" msgstr "Zeile" #: 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" @@ -2985,8 +3012,8 @@ msgid "Openlibrary key" msgstr "Openlibrary-Schlüssel" #: 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*in" @@ -3092,10 +3119,6 @@ msgstr "Kontaktiere deine*n Administrator*in oder You have moved your account to %(username)s" +msgstr "Sie haben Ihr Konto auf %(username)s verschoben" + +#: 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 "Sie können den Umzug rückgängig machen, aber einige Follower haben dem Konto möglicherweise bereits entfolgt." + +#: bookwyrm/templates/moved.html:42 +msgid "Undo move" +msgstr "Umzug rückgängig machen" + +#: bookwyrm/templates/moved.html:46 bookwyrm/templates/user_menu.html:77 +msgid "Log out" +msgstr "Abmelden" + #: bookwyrm/templates/notifications/items/accept.html:18 #, python-format msgid "%(related_user)s accepted your invitation to join group \"%(group_name)s\"" @@ -3702,6 +3743,13 @@ msgstr "Dein Import ist fertig." msgid "%(related_user)s invited you to join the group \"%(group_name)s\"" msgstr "%(related_user)s hat dich eingeladen, der Gruppe \"%(group_name)s\" beizutreten" +#: 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\"" @@ -3749,6 +3797,16 @@ msgstr "%(related_user)s hat dich in einem msgid "%(related_user)s mentioned you in a status" msgstr "%(related_user)s hat dich in einem Status erwähnt" +#: bookwyrm/templates/notifications/items/move_user.html:18 +#, python-format +msgid "%(related_user)s has moved to %(username)s" +msgstr "%(related_user)s ist zu %(username)s umgezogen" + +#: bookwyrm/templates/notifications/items/move_user.html:25 +#, python-format +msgid "%(related_user)s has undone their move" +msgstr "%(related_user)s hat seinen Umzug rückgängig gemacht" + #: bookwyrm/templates/notifications/items/remove.html:17 #, python-format msgid "has been removed from your group \"%(group_name)s\"" @@ -3787,7 +3845,7 @@ msgstr[0] "Ein neuer -Bericht muss moderiert werden" msgstr[1] "%(display_count)s neue Berichte müssen moderiert werden" #: 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 "Inhaltswarnung" @@ -4005,9 +4063,51 @@ msgstr "Bestätige dein Passwort, um mit der Einrichtung von 2FA zu beginnen." msgid "Set up 2FA" msgstr "2FA einrichten" +#: 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 "Account umziehen" + +#: bookwyrm/templates/preferences/alias_user.html:7 +#: bookwyrm/templates/preferences/alias_user.html:34 +msgid "Create Alias" +msgstr "Alias erstellen" + +#: bookwyrm/templates/preferences/alias_user.html:12 +msgid "Add another account as an alias" +msgstr "Ein anderes Konto als Alias hinzufügen" + +#: 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 "Ein anderes Konto als Alias zu markieren, ist notwendig, wenn Sie das andere Konto auf diese verschieben möchten." + +#: bookwyrm/templates/preferences/alias_user.html:19 +msgid "This is a reversable action and will not change the functionality of this account." +msgstr "Dies ist eine umkehrbare Funktion und wird die Nutzbarkeit dieses Kontos nicht einschränken." + +#: 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 "Geben Sie den Benutzernamen für das Konto ein, das Sie als Alias hinzufügen möchten, z.B. user@example.com :" + +#: bookwyrm/templates/preferences/alias_user.html:30 +#: bookwyrm/templates/preferences/move_user.html:35 +msgid "Confirm your password:" +msgstr "Bestätigen Sie Ihr Passwort:" + +#: bookwyrm/templates/preferences/alias_user.html:39 +#: bookwyrm/templates/preferences/layout.html:28 +msgid "Aliases" +msgstr "Aliase" + +#: bookwyrm/templates/preferences/alias_user.html:49 +msgid "Remove alias" +msgstr "Alias entfernen" + #: 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 "Gesperrte Benutzer*innen" @@ -4037,7 +4137,7 @@ msgstr "Neues Passwort:" #: 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 "Account löschen" @@ -4082,7 +4182,7 @@ msgstr "Profil bearbeiten:" #: 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" @@ -4159,18 +4259,47 @@ msgstr "Datei herunterladen" msgid "Account" msgstr "Account" -#: bookwyrm/templates/preferences/layout.html:31 +#: bookwyrm/templates/preferences/layout.html:32 +msgid "Move Account" +msgstr "Account umziehen" + +#: bookwyrm/templates/preferences/layout.html:39 msgid "Data" msgstr "Daten" -#: bookwyrm/templates/preferences/layout.html:39 +#: bookwyrm/templates/preferences/layout.html:47 msgid "CSV export" msgstr "CSV-Export" -#: bookwyrm/templates/preferences/layout.html:42 +#: bookwyrm/templates/preferences/layout.html:50 msgid "Relationships" msgstr "Beziehungen" +#: bookwyrm/templates/preferences/move_user.html:12 +msgid "Migrate account to another server" +msgstr "Konto auf einen anderen Server umziehen" + +#: 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 "Das Verschieben deines Kontos wird alle deine Follower*innen benachrichtigen und sie anweisen, dem neuen Konto zu folgen." + +#: 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" +" %(user)s wird als umgezogen markiert und wird nicht gefunden oder verwendbar sein, wenn Sie den Umzug nicht rückgängig machen.\n" +" " + +#: 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 "Denken Sie daran, diesen Benutzernamen als Alias des Zielkontos hinzuzufügen, bevor Sie versuchen das Konto umzuziehen." + +#: 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 "Geben Sie den Benutzernamen für das Konto ein, zu dem Sie wechseln möchten, z.B. user@example.com :" + #: bookwyrm/templates/reading_progress/finish.html:5 #, python-format msgid "Finish \"%(book_title)s\"" @@ -4579,8 +4708,8 @@ msgid "Streams" msgstr "Streams" #: bookwyrm/templates/settings/celery.html:32 -msgid "Broadcasts" -msgstr "Übertragungen" +msgid "Broadcast" +msgstr "Senden" #: bookwyrm/templates/settings/celery.html:38 msgid "Inbox" @@ -4930,7 +5059,7 @@ msgid "Details" msgstr "Details" #: bookwyrm/templates/settings/federation/instance.html:53 -#: bookwyrm/templates/user/layout.html:69 +#: bookwyrm/templates/user/layout.html:79 msgid "Activity" msgstr "Aktivität" @@ -5118,7 +5247,7 @@ msgstr "Einladungsanfragen" #: 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 "Einladungen" @@ -5592,57 +5721,73 @@ msgid "Set instance default theme" msgstr "Instanz-Standard-Design festlegen" #: 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 "Design erfolgreich hinzugefügt" -#: bookwyrm/templates/settings/themes.html:26 +#: bookwyrm/templates/settings/themes.html:35 msgid "How to add a theme" msgstr "Wie man ein Design hinzufügt" -#: 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 "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 \n" "Language-Team: English \n" @@ -43,31 +43,31 @@ msgstr "" msgid "Unlimited" msgstr "" -#: bookwyrm/forms/edit_user.py:88 +#: bookwyrm/forms/edit_user.py:104 msgid "Incorrect password" msgstr "" -#: bookwyrm/forms/edit_user.py:95 bookwyrm/forms/landing.py:90 +#: bookwyrm/forms/edit_user.py:111 bookwyrm/forms/landing.py:90 msgid "Password does not match" msgstr "" -#: bookwyrm/forms/edit_user.py:118 +#: bookwyrm/forms/edit_user.py:134 msgid "Incorrect Password" msgstr "" -#: bookwyrm/forms/forms.py:54 +#: bookwyrm/forms/forms.py:58 msgid "Reading finish date cannot be before start date." msgstr "" -#: bookwyrm/forms/forms.py:59 +#: bookwyrm/forms/forms.py:63 msgid "Reading stopped date cannot be before start date." msgstr "" -#: bookwyrm/forms/forms.py:67 +#: bookwyrm/forms/forms.py:71 msgid "Reading stopped date cannot be in the future." msgstr "" -#: bookwyrm/forms/forms.py:74 +#: bookwyrm/forms/forms.py:78 msgid "Reading finished date cannot be in the future." msgstr "" @@ -103,8 +103,8 @@ msgstr "" msgid "Book Title" msgstr "" -#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:156 -#: bookwyrm/templates/shelf/shelf.html:188 +#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:158 +#: bookwyrm/templates/shelf/shelf.html:190 #: bookwyrm/templates/snippets/create_status/review.html:32 msgid "Rating" msgstr "" @@ -142,12 +142,13 @@ msgstr "" msgid "Danger" msgstr "" -#: bookwyrm/models/antispam.py:112 bookwyrm/models/antispam.py:146 +#: bookwyrm/models/antispam.py:113 bookwyrm/models/antispam.py:147 msgid "Automatically generated report" msgstr "" -#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:47 -#: bookwyrm/models/link.py:72 bookwyrm/templates/import/import_status.html:214 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:48 +#: bookwyrm/models/job.py:18 bookwyrm/models/link.py:72 +#: bookwyrm/templates/import/import_status.html:214 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" msgstr "" @@ -172,23 +173,23 @@ msgstr "" msgid "Domain block" msgstr "" -#: bookwyrm/models/book.py:283 +#: bookwyrm/models/book.py:282 msgid "Audiobook" msgstr "" -#: bookwyrm/models/book.py:284 +#: bookwyrm/models/book.py:283 msgid "eBook" msgstr "" -#: bookwyrm/models/book.py:285 +#: bookwyrm/models/book.py:284 msgid "Graphic novel" msgstr "" -#: bookwyrm/models/book.py:286 +#: bookwyrm/models/book.py:285 msgid "Hardcover" msgstr "" -#: bookwyrm/models/book.py:287 +#: bookwyrm/models/book.py:286 msgid "Paperback" msgstr "" @@ -206,26 +207,26 @@ msgstr "" msgid "Blocked" msgstr "" -#: bookwyrm/models/fields.py:29 +#: bookwyrm/models/fields.py:35 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "" -#: bookwyrm/models/fields.py:38 bookwyrm/models/fields.py:47 +#: bookwyrm/models/fields.py:44 bookwyrm/models/fields.py:53 #, python-format msgid "%(value)s is not a valid username" msgstr "" -#: bookwyrm/models/fields.py:192 bookwyrm/templates/layout.html:128 +#: bookwyrm/models/fields.py:198 bookwyrm/templates/layout.html:129 #: bookwyrm/templates/ostatus/error.html:29 msgid "username" msgstr "" -#: bookwyrm/models/fields.py:197 +#: bookwyrm/models/fields.py:203 msgid "A user with that username already exists." msgstr "" -#: bookwyrm/models/fields.py:216 +#: bookwyrm/models/fields.py:222 #: bookwyrm/templates/snippets/privacy-icons.html:3 #: bookwyrm/templates/snippets/privacy-icons.html:4 #: bookwyrm/templates/snippets/privacy_select.html:11 @@ -233,7 +234,7 @@ msgstr "" msgid "Public" msgstr "" -#: bookwyrm/models/fields.py:217 +#: bookwyrm/models/fields.py:223 #: bookwyrm/templates/snippets/privacy-icons.html:7 #: bookwyrm/templates/snippets/privacy-icons.html:8 #: bookwyrm/templates/snippets/privacy_select.html:14 @@ -241,7 +242,7 @@ msgstr "" msgid "Unlisted" msgstr "" -#: bookwyrm/models/fields.py:218 +#: bookwyrm/models/fields.py:224 #: bookwyrm/templates/snippets/privacy_select.html:17 #: bookwyrm/templates/user/relationships/followers.html:6 #: bookwyrm/templates/user/relationships/followers.html:11 @@ -250,7 +251,7 @@ msgstr "" msgid "Followers" msgstr "" -#: bookwyrm/models/fields.py:219 +#: bookwyrm/models/fields.py:225 #: bookwyrm/templates/snippets/create_status/post_options_block.html:6 #: bookwyrm/templates/snippets/privacy-icons.html:15 #: bookwyrm/templates/snippets/privacy-icons.html:16 @@ -259,33 +260,43 @@ msgstr "" msgid "Private" msgstr "" -#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:174 -#: bookwyrm/templates/settings/imports/imports.html:98 -#: bookwyrm/templates/settings/users/user_admin.html:81 -#: bookwyrm/templates/settings/users/user_info.html:28 +#: bookwyrm/models/import_job.py:49 bookwyrm/models/job.py:19 +#: bookwyrm/templates/import/import.html:173 +#: bookwyrm/templates/import/import_user.html:211 +#: bookwyrm/templates/preferences/export-user.html:112 +#: bookwyrm/templates/settings/imports/imports.html:131 +#: bookwyrm/templates/settings/imports/imports.html:221 +#: bookwyrm/templates/snippets/user_active_tag.html:8 msgid "Active" msgstr "" -#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:172 +#: bookwyrm/models/import_job.py:50 bookwyrm/models/job.py:20 +#: bookwyrm/templates/import/import.html:171 +#: bookwyrm/templates/import/import_user.html:209 +#: bookwyrm/templates/preferences/export-user.html:110 msgid "Complete" msgstr "" -#: bookwyrm/models/import_job.py:50 +#: bookwyrm/models/import_job.py:51 bookwyrm/models/job.py:21 msgid "Stopped" msgstr "" -#: bookwyrm/models/import_job.py:83 bookwyrm/models/import_job.py:91 +#: bookwyrm/models/import_job.py:84 bookwyrm/models/import_job.py:92 msgid "Import stopped" msgstr "" -#: bookwyrm/models/import_job.py:363 bookwyrm/models/import_job.py:388 +#: bookwyrm/models/import_job.py:356 bookwyrm/models/import_job.py:381 msgid "Error loading book" msgstr "" -#: bookwyrm/models/import_job.py:372 +#: bookwyrm/models/import_job.py:365 msgid "Could not find a match for book" msgstr "" +#: bookwyrm/models/job.py:22 +msgid "Failed" +msgstr "" + #: bookwyrm/models/link.py:51 msgid "Free" msgstr "" @@ -353,122 +364,143 @@ msgstr "" msgid "Deleted item" msgstr "" -#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:307 +#: bookwyrm/models/user.py:33 bookwyrm/templates/book/book.html:307 msgid "Reviews" msgstr "" -#: bookwyrm/models/user.py:33 +#: bookwyrm/models/user.py:34 msgid "Comments" msgstr "" -#: bookwyrm/models/user.py:34 +#: bookwyrm/models/user.py:35 bookwyrm/templates/import/import_user.html:139 msgid "Quotations" msgstr "" -#: bookwyrm/models/user.py:35 +#: bookwyrm/models/user.py:36 msgid "Everything else" msgstr "" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home Timeline" msgstr "" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home" msgstr "" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 msgid "Books Timeline" msgstr "" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 -#: bookwyrm/templates/user/layout.html:97 +#: bookwyrm/templates/user/layout.html:107 msgid "Books" msgstr "" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:313 msgid "English" msgstr "" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:314 msgid "Català (Catalan)" msgstr "" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:315 msgid "Deutsch (German)" msgstr "" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:316 msgid "Esperanto (Esperanto)" msgstr "" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:317 msgid "Español (Spanish)" msgstr "" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:318 msgid "Euskara (Basque)" msgstr "" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:319 msgid "Galego (Galician)" msgstr "" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:320 msgid "Italiano (Italian)" msgstr "" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:321 msgid "Suomi (Finnish)" msgstr "" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:322 msgid "Français (French)" msgstr "" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:323 msgid "Lietuvių (Lithuanian)" msgstr "" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:324 msgid "Nederlands (Dutch)" msgstr "" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:325 msgid "Norsk (Norwegian)" msgstr "" -#: bookwyrm/settings.py:309 +#: bookwyrm/settings.py:326 msgid "Polski (Polish)" msgstr "" -#: bookwyrm/settings.py:310 +#: bookwyrm/settings.py:327 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "" -#: bookwyrm/settings.py:311 +#: bookwyrm/settings.py:328 msgid "Português Europeu (European Portuguese)" msgstr "" -#: bookwyrm/settings.py:312 +#: bookwyrm/settings.py:329 msgid "Română (Romanian)" msgstr "" -#: bookwyrm/settings.py:313 +#: bookwyrm/settings.py:330 msgid "Svenska (Swedish)" msgstr "" -#: bookwyrm/settings.py:314 +#: bookwyrm/settings.py:331 +msgid "Українська (Ukrainian)" +msgstr "" + +#: bookwyrm/settings.py:332 msgid "简体中文 (Simplified Chinese)" msgstr "" -#: bookwyrm/settings.py:315 +#: bookwyrm/settings.py:333 msgid "繁體中文 (Traditional Chinese)" msgstr "" +#: bookwyrm/templates/403.html:5 +msgid "Oh no!" +msgstr "" + +#: bookwyrm/templates/403.html:9 bookwyrm/templates/landing/invite.html:21 +msgid "Permission Denied" +msgstr "" + +#: bookwyrm/templates/403.html:11 +#, python-format +msgid "You do not have permission to view this page or perform this action. Your user permission level is %(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 "

    Your file will include:

    • User profile
    • Most user settings
    • Reading goals
    • Shelves
    • Reading history
    • Book reviews
    • Statuses
    • Your own lists and saved lists
    • Which users you follow and block

    Your file will not include:

    • Direct messages
    • Replies to your statuses
    • Groups
    • Favorites
    " +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:43 +msgid "In your new BookWyrm account can choose what to import: you will not have to import everything that is exported." +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:46 +msgid "If you wish to migrate any statuses (comments, reviews, or quotes) you must either set the account you are moving to as an alias of this one, or move this account to the new account, before you import your user data." +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:51 +#, python-format +msgid "You will be able to create a new export file at %(next_available)s" +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:60 +msgid "Create user export file" +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:67 +msgid "Recent Exports" +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:69 +msgid "User export files will show 'complete' once ready. This may take a little while. Click the link to download your file." +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:75 +msgid "Date" +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:81 +msgid "Size" +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:125 +msgid "Download your export" +msgstr "" + #: bookwyrm/templates/preferences/export.html:4 #: bookwyrm/templates/preferences/export.html:7 -msgid "CSV Export" +#: bookwyrm/templates/preferences/layout.html:47 +msgid "Export Book List" msgstr "" #: 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." +msgid "Your CSV export file will include all the books on your shelves, books you have reviewed, and books with reading activity.
    Use this to import into a service like Goodreads." msgstr "" #: bookwyrm/templates/preferences/export.html:20 @@ -4155,18 +4479,42 @@ msgstr "" msgid "Account" msgstr "" -#: bookwyrm/templates/preferences/layout.html:31 -msgid "Data" +#: bookwyrm/templates/preferences/layout.html:32 +msgid "Move Account" msgstr "" #: bookwyrm/templates/preferences/layout.html:39 -msgid "CSV export" +msgid "Data" msgstr "" -#: bookwyrm/templates/preferences/layout.html:42 +#: bookwyrm/templates/preferences/layout.html:58 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\"" @@ -4574,7 +4922,7 @@ msgid "Streams" msgstr "" #: bookwyrm/templates/settings/celery.html:32 -msgid "Broadcasts" +msgid "Broadcast" msgstr "" #: bookwyrm/templates/settings/celery.html:38 @@ -4629,7 +4977,8 @@ msgid "Active Tasks" msgstr "" #: bookwyrm/templates/settings/celery.html:131 -#: bookwyrm/templates/settings/imports/imports.html:113 +#: bookwyrm/templates/settings/imports/imports.html:146 +#: bookwyrm/templates/settings/imports/imports.html:236 msgid "ID" msgstr "" @@ -4925,7 +5274,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 "" @@ -5023,9 +5372,14 @@ msgid "No instances found" msgstr "" #: bookwyrm/templates/settings/imports/complete_import_modal.html:4 +#: bookwyrm/templates/settings/imports/complete_user_import_modal.html:4 msgid "Stop import?" msgstr "" +#: bookwyrm/templates/settings/imports/complete_user_import_modal.html:7 +msgid "This action will stop the user import before it is complete and cannot be un-done" +msgstr "" + #: bookwyrm/templates/settings/imports/imports.html:19 msgid "Disable starting new imports" msgstr "" @@ -5038,70 +5392,107 @@ msgstr "" 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 +#: bookwyrm/templates/settings/imports/imports.html:32 +msgid "This setting prevents both book imports and user imports." +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:37 msgid "Disable imports" msgstr "" -#: bookwyrm/templates/settings/imports/imports.html:50 +#: bookwyrm/templates/settings/imports/imports.html:51 msgid "Users are currently unable to start new imports" msgstr "" -#: bookwyrm/templates/settings/imports/imports.html:55 +#: bookwyrm/templates/settings/imports/imports.html:56 msgid "Enable imports" msgstr "" -#: bookwyrm/templates/settings/imports/imports.html:63 +#: bookwyrm/templates/settings/imports/imports.html:64 msgid "Limit the amount of imports" msgstr "" -#: bookwyrm/templates/settings/imports/imports.html:74 +#: bookwyrm/templates/settings/imports/imports.html:75 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 +#: bookwyrm/templates/settings/imports/imports.html:76 +#: bookwyrm/templates/settings/imports/imports.html:108 msgid "Set the value to 0 to not enforce any limit." msgstr "" -#: bookwyrm/templates/settings/imports/imports.html:78 +#: bookwyrm/templates/settings/imports/imports.html:79 msgid "Set import limit to" msgstr "" -#: bookwyrm/templates/settings/imports/imports.html:80 +#: bookwyrm/templates/settings/imports/imports.html:81 msgid "books every" msgstr "" -#: bookwyrm/templates/settings/imports/imports.html:82 +#: bookwyrm/templates/settings/imports/imports.html:83 msgid "days." msgstr "" -#: bookwyrm/templates/settings/imports/imports.html:86 +#: bookwyrm/templates/settings/imports/imports.html:87 msgid "Set limit" msgstr "" -#: bookwyrm/templates/settings/imports/imports.html:102 -msgid "Completed" +#: bookwyrm/templates/settings/imports/imports.html:96 +msgid "Limit how often users can import and export" msgstr "" -#: bookwyrm/templates/settings/imports/imports.html:116 -msgid "User" +#: bookwyrm/templates/settings/imports/imports.html:107 +msgid "Some users might try to run user imports or exports very frequently, which you want to limit." +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:111 +msgid "Restrict user imports and exports to once every " +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:113 +msgid "hours" +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:117 +msgid "Change limit" msgstr "" #: bookwyrm/templates/settings/imports/imports.html:125 -msgid "Date Updated" -msgstr "" - -#: bookwyrm/templates/settings/imports/imports.html:132 -msgid "Pending items" +msgid "Book Imports" msgstr "" #: bookwyrm/templates/settings/imports/imports.html:135 +#: bookwyrm/templates/settings/imports/imports.html:225 +msgid "Completed" +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:149 +#: bookwyrm/templates/settings/imports/imports.html:239 +msgid "User" +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:158 +#: bookwyrm/templates/settings/imports/imports.html:248 +msgid "Date Updated" +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:165 +msgid "Pending items" +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:168 msgid "Successful items" msgstr "" -#: bookwyrm/templates/settings/imports/imports.html:170 +#: bookwyrm/templates/settings/imports/imports.html:203 +#: bookwyrm/templates/settings/imports/imports.html:295 msgid "No matching imports found." msgstr "" +#: bookwyrm/templates/settings/imports/imports.html:215 +msgid "User Imports" +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 @@ -5113,7 +5504,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 "" @@ -5587,57 +5978,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 "" -#: 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 \n" "Language-Team: Esperanto\n" "Language: eo\n" @@ -42,15 +42,15 @@ msgstr "{i} uzoj" msgid "Unlimited" msgstr "Senlima" -#: bookwyrm/forms/edit_user.py:88 +#: bookwyrm/forms/edit_user.py:104 msgid "Incorrect password" msgstr "Malĝusta pasvorto" -#: bookwyrm/forms/edit_user.py:95 bookwyrm/forms/landing.py:90 +#: bookwyrm/forms/edit_user.py:111 bookwyrm/forms/landing.py:90 msgid "Password does not match" msgstr "Pasvorto ne kongruas" -#: bookwyrm/forms/edit_user.py:118 +#: bookwyrm/forms/edit_user.py:134 msgid "Incorrect Password" msgstr "Malĝusta pasvorto" @@ -102,8 +102,8 @@ msgstr "Ordo de listo" msgid "Book Title" msgstr "Titolo de la libro" -#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:156 -#: bookwyrm/templates/shelf/shelf.html:188 +#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:158 +#: bookwyrm/templates/shelf/shelf.html:190 #: bookwyrm/templates/snippets/create_status/review.html:32 msgid "Rating" msgstr "Takso" @@ -141,11 +141,11 @@ msgstr "Averto" msgid "Danger" msgstr "Danĝero" -#: bookwyrm/models/antispam.py:112 bookwyrm/models/antispam.py:146 +#: bookwyrm/models/antispam.py:113 bookwyrm/models/antispam.py:147 msgid "Automatically generated report" msgstr "Aŭtomate generita raporto" -#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:47 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:48 #: bookwyrm/models/link.py:72 bookwyrm/templates/import/import_status.html:214 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" @@ -171,23 +171,23 @@ msgstr "Forigo fare de kontrolanto" msgid "Domain block" msgstr "Blokado de domajno" -#: bookwyrm/models/book.py:283 +#: bookwyrm/models/book.py:282 msgid "Audiobook" msgstr "Sonlibro" -#: bookwyrm/models/book.py:284 +#: bookwyrm/models/book.py:283 msgid "eBook" msgstr "Bitlibro" -#: bookwyrm/models/book.py:285 +#: bookwyrm/models/book.py:284 msgid "Graphic novel" msgstr "Grafika romano" -#: bookwyrm/models/book.py:286 +#: bookwyrm/models/book.py:285 msgid "Hardcover" msgstr "Rigidkovrila" -#: bookwyrm/models/book.py:287 +#: bookwyrm/models/book.py:286 msgid "Paperback" msgstr "Poŝlibro" @@ -205,26 +205,26 @@ msgstr "Federaciita" msgid "Blocked" msgstr "Blokita" -#: bookwyrm/models/fields.py:29 +#: bookwyrm/models/fields.py:35 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "%(value)s ne estas valida remote_id" -#: bookwyrm/models/fields.py:38 bookwyrm/models/fields.py:47 +#: bookwyrm/models/fields.py:44 bookwyrm/models/fields.py:53 #, python-format msgid "%(value)s is not a valid username" msgstr "%(value)s ne estas valida uzantnomo" -#: bookwyrm/models/fields.py:192 bookwyrm/templates/layout.html:128 +#: bookwyrm/models/fields.py:198 bookwyrm/templates/layout.html:129 #: bookwyrm/templates/ostatus/error.html:29 msgid "username" msgstr "uzantnomo" -#: bookwyrm/models/fields.py:197 +#: bookwyrm/models/fields.py:203 msgid "A user with that username already exists." msgstr "Uzanto kun tiu uzantnomo jam ekzistas." -#: bookwyrm/models/fields.py:216 +#: bookwyrm/models/fields.py:222 #: bookwyrm/templates/snippets/privacy-icons.html:3 #: bookwyrm/templates/snippets/privacy-icons.html:4 #: bookwyrm/templates/snippets/privacy_select.html:11 @@ -232,7 +232,7 @@ msgstr "Uzanto kun tiu uzantnomo jam ekzistas." msgid "Public" msgstr "Publika" -#: bookwyrm/models/fields.py:217 +#: bookwyrm/models/fields.py:223 #: bookwyrm/templates/snippets/privacy-icons.html:7 #: bookwyrm/templates/snippets/privacy-icons.html:8 #: bookwyrm/templates/snippets/privacy_select.html:14 @@ -240,7 +240,7 @@ msgstr "Publika" msgid "Unlisted" msgstr "Nelistigita" -#: bookwyrm/models/fields.py:218 +#: bookwyrm/models/fields.py:224 #: bookwyrm/templates/snippets/privacy_select.html:17 #: bookwyrm/templates/user/relationships/followers.html:6 #: bookwyrm/templates/user/relationships/followers.html:11 @@ -249,7 +249,7 @@ msgstr "Nelistigita" msgid "Followers" msgstr "Sekvantoj" -#: bookwyrm/models/fields.py:219 +#: bookwyrm/models/fields.py:225 #: bookwyrm/templates/snippets/create_status/post_options_block.html:6 #: bookwyrm/templates/snippets/privacy-icons.html:15 #: bookwyrm/templates/snippets/privacy-icons.html:16 @@ -258,30 +258,29 @@ msgstr "Sekvantoj" msgid "Private" msgstr "Privata" -#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:174 +#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:174 #: bookwyrm/templates/settings/imports/imports.html:98 -#: bookwyrm/templates/settings/users/user_admin.html:81 -#: bookwyrm/templates/settings/users/user_info.html:28 +#: bookwyrm/templates/snippets/user_active_tag.html:8 msgid "Active" msgstr "Aktiva" -#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:172 +#: bookwyrm/models/import_job.py:50 bookwyrm/templates/import/import.html:172 msgid "Complete" msgstr "Finita" -#: bookwyrm/models/import_job.py:50 +#: bookwyrm/models/import_job.py:51 msgid "Stopped" msgstr "Haltigita" -#: bookwyrm/models/import_job.py:83 bookwyrm/models/import_job.py:91 +#: bookwyrm/models/import_job.py:84 bookwyrm/models/import_job.py:92 msgid "Import stopped" msgstr "Importo haltigita" -#: bookwyrm/models/import_job.py:363 bookwyrm/models/import_job.py:388 +#: bookwyrm/models/import_job.py:356 bookwyrm/models/import_job.py:381 msgid "Error loading book" msgstr "Eraro dum la importo de la libro" -#: bookwyrm/models/import_job.py:372 +#: bookwyrm/models/import_job.py:365 msgid "Could not find a match for book" msgstr "Kongrua libro ne troviĝis" @@ -310,164 +309,185 @@ msgstr "Komento" #: bookwyrm/models/report.py:85 msgid "Resolved report" -msgstr "" +msgstr "Solvis la raporton" #: bookwyrm/models/report.py:86 msgid "Re-opened report" -msgstr "" +msgstr "Remalfermis la raporton" #: bookwyrm/models/report.py:87 msgid "Messaged reporter" -msgstr "" +msgstr "Mesaĝis al la raportinto" #: bookwyrm/models/report.py:88 msgid "Messaged reported user" -msgstr "" +msgstr "Mesaĝis al la raportita uzanto" #: bookwyrm/models/report.py:89 msgid "Suspended user" -msgstr "" +msgstr "Provizore ĉesigis la uzanton" #: bookwyrm/models/report.py:90 msgid "Un-suspended user" -msgstr "" +msgstr "Malĉesigis la uzanton" #: bookwyrm/models/report.py:91 msgid "Changed user permission level" -msgstr "" +msgstr "Ŝanĝis permesnivelon de la uzanto" #: bookwyrm/models/report.py:92 msgid "Deleted user account" -msgstr "" +msgstr "Forigis la konton" #: bookwyrm/models/report.py:93 msgid "Blocked domain" -msgstr "" +msgstr "Blokis la domajnon" #: bookwyrm/models/report.py:94 msgid "Approved domain" -msgstr "" +msgstr "Aprobis la domajnon" #: bookwyrm/models/report.py:95 msgid "Deleted item" -msgstr "" +msgstr "Forigis la eron" -#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:307 +#: bookwyrm/models/user.py:33 bookwyrm/templates/book/book.html:307 msgid "Reviews" msgstr "Recenzoj" -#: bookwyrm/models/user.py:33 +#: bookwyrm/models/user.py:34 msgid "Comments" msgstr "Komentoj" -#: bookwyrm/models/user.py:34 +#: bookwyrm/models/user.py:35 msgid "Quotations" msgstr "Citaĵoj" -#: bookwyrm/models/user.py:35 +#: bookwyrm/models/user.py:36 msgid "Everything else" msgstr "Ĉio alia" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home Timeline" msgstr "Hejma novaĵfluo" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home" msgstr "Hejmo" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 msgid "Books Timeline" msgstr "Libra novaĵfluo" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 -#: bookwyrm/templates/user/layout.html:97 +#: bookwyrm/templates/user/layout.html:107 msgid "Books" msgstr "Libroj" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:313 msgid "English" msgstr "English (Angla)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:314 msgid "Català (Catalan)" msgstr "Català (Kataluna)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:315 msgid "Deutsch (German)" msgstr "Deutsch (Germana)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:316 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Esperanto)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:317 msgid "Español (Spanish)" msgstr "Español (Hispana)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:318 msgid "Euskara (Basque)" msgstr "Euskara (Eŭska)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:319 msgid "Galego (Galician)" msgstr "Galego (Galega)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:320 msgid "Italiano (Italian)" msgstr "Italiano (Itala)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:321 msgid "Suomi (Finnish)" msgstr "Suomi (Finna)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:322 msgid "Français (French)" msgstr "Français (Franca)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:323 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Litova)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:324 msgid "Nederlands (Dutch)" -msgstr "" +msgstr "Nederlands (Nederlanda)" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:325 msgid "Norsk (Norwegian)" msgstr "Norsk (Norvega)" -#: bookwyrm/settings.py:309 +#: bookwyrm/settings.py:326 msgid "Polski (Polish)" msgstr "Polski (Pola)" -#: bookwyrm/settings.py:310 +#: bookwyrm/settings.py:327 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Brazila portugala)" -#: bookwyrm/settings.py:311 +#: bookwyrm/settings.py:328 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Eŭropa portugala)" -#: bookwyrm/settings.py:312 +#: bookwyrm/settings.py:329 msgid "Română (Romanian)" msgstr "Română (Rumana)" -#: bookwyrm/settings.py:313 +#: bookwyrm/settings.py:330 msgid "Svenska (Swedish)" msgstr "Svenska (Sveda)" -#: bookwyrm/settings.py:314 +#: bookwyrm/settings.py:331 +msgid "Українська (Ukrainian)" +msgstr "" + +#: bookwyrm/settings.py:332 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Simpligita ĉina)" -#: bookwyrm/settings.py:315 +#: bookwyrm/settings.py:333 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Tradicia ĉina)" +#: bookwyrm/templates/403.html:5 +msgid "Oh no!" +msgstr "" + +#: bookwyrm/templates/403.html:9 bookwyrm/templates/landing/invite.html:21 +msgid "Permission Denied" +msgstr "Mankas permeso" + +#: bookwyrm/templates/403.html:11 +#, python-format +msgid "You do not have permission to view this page or perform this action. Your user permission level is %(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 \n" "Language-Team: Basque\n" "Language: eu\n" @@ -42,15 +42,15 @@ msgstr "{i} erabilera" msgid "Unlimited" msgstr "Mugagabea" -#: bookwyrm/forms/edit_user.py:88 +#: bookwyrm/forms/edit_user.py:104 msgid "Incorrect password" msgstr "Pasahitz okerra" -#: bookwyrm/forms/edit_user.py:95 bookwyrm/forms/landing.py:90 +#: bookwyrm/forms/edit_user.py:111 bookwyrm/forms/landing.py:90 msgid "Password does not match" msgstr "Pasahitzak ez datoz bat" -#: bookwyrm/forms/edit_user.py:118 +#: bookwyrm/forms/edit_user.py:134 msgid "Incorrect Password" msgstr "Pasahitz okerra" @@ -102,8 +102,8 @@ msgstr "Zerrendaren ordena" msgid "Book Title" msgstr "Liburuaren izenburua" -#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:156 -#: bookwyrm/templates/shelf/shelf.html:188 +#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:158 +#: bookwyrm/templates/shelf/shelf.html:190 #: bookwyrm/templates/snippets/create_status/review.html:32 msgid "Rating" msgstr "Balorazioa" @@ -141,11 +141,11 @@ msgstr "Kontuz" msgid "Danger" msgstr "Arriskua" -#: bookwyrm/models/antispam.py:112 bookwyrm/models/antispam.py:146 +#: bookwyrm/models/antispam.py:113 bookwyrm/models/antispam.py:147 msgid "Automatically generated report" msgstr "Automatikoki sortutako txostena" -#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:47 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:48 #: bookwyrm/models/link.py:72 bookwyrm/templates/import/import_status.html:214 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" @@ -171,23 +171,23 @@ msgstr "Moderatzaile ezabatzea" msgid "Domain block" msgstr "Domeinu blokeoa" -#: bookwyrm/models/book.py:283 +#: bookwyrm/models/book.py:282 msgid "Audiobook" msgstr "Audio-liburua" -#: bookwyrm/models/book.py:284 +#: bookwyrm/models/book.py:283 msgid "eBook" msgstr "eBook" -#: bookwyrm/models/book.py:285 +#: bookwyrm/models/book.py:284 msgid "Graphic novel" msgstr "Eleberri grafikoa" -#: bookwyrm/models/book.py:286 +#: bookwyrm/models/book.py:285 msgid "Hardcover" msgstr "Azal gogorra" -#: bookwyrm/models/book.py:287 +#: bookwyrm/models/book.py:286 msgid "Paperback" msgstr "Azal biguna" @@ -205,26 +205,26 @@ msgstr "Federatuta" msgid "Blocked" msgstr "Blokeatuta" -#: bookwyrm/models/fields.py:29 +#: bookwyrm/models/fields.py:35 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "%(value)s ez da baliozko remote_id" -#: bookwyrm/models/fields.py:38 bookwyrm/models/fields.py:47 +#: bookwyrm/models/fields.py:44 bookwyrm/models/fields.py:53 #, python-format msgid "%(value)s is not a valid username" msgstr "%(value)s ez da baliozko erabiltzaile-izena" -#: bookwyrm/models/fields.py:192 bookwyrm/templates/layout.html:128 +#: bookwyrm/models/fields.py:198 bookwyrm/templates/layout.html:129 #: bookwyrm/templates/ostatus/error.html:29 msgid "username" msgstr "erabiltzaile-izena" -#: bookwyrm/models/fields.py:197 +#: bookwyrm/models/fields.py:203 msgid "A user with that username already exists." msgstr "Erabiltzaile-izen hori duen erabiltzailea dagoeneko existitzen da." -#: bookwyrm/models/fields.py:216 +#: bookwyrm/models/fields.py:222 #: bookwyrm/templates/snippets/privacy-icons.html:3 #: bookwyrm/templates/snippets/privacy-icons.html:4 #: bookwyrm/templates/snippets/privacy_select.html:11 @@ -232,7 +232,7 @@ msgstr "Erabiltzaile-izen hori duen erabiltzailea dagoeneko existitzen da." msgid "Public" msgstr "Publikoa" -#: bookwyrm/models/fields.py:217 +#: bookwyrm/models/fields.py:223 #: bookwyrm/templates/snippets/privacy-icons.html:7 #: bookwyrm/templates/snippets/privacy-icons.html:8 #: bookwyrm/templates/snippets/privacy_select.html:14 @@ -240,7 +240,7 @@ msgstr "Publikoa" msgid "Unlisted" msgstr "Zerrendatu gabea" -#: bookwyrm/models/fields.py:218 +#: bookwyrm/models/fields.py:224 #: bookwyrm/templates/snippets/privacy_select.html:17 #: bookwyrm/templates/user/relationships/followers.html:6 #: bookwyrm/templates/user/relationships/followers.html:11 @@ -249,7 +249,7 @@ msgstr "Zerrendatu gabea" msgid "Followers" msgstr "Jarraitzaileak" -#: bookwyrm/models/fields.py:219 +#: bookwyrm/models/fields.py:225 #: bookwyrm/templates/snippets/create_status/post_options_block.html:6 #: bookwyrm/templates/snippets/privacy-icons.html:15 #: bookwyrm/templates/snippets/privacy-icons.html:16 @@ -258,30 +258,29 @@ msgstr "Jarraitzaileak" msgid "Private" msgstr "Pribatua" -#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:174 +#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:174 #: bookwyrm/templates/settings/imports/imports.html:98 -#: bookwyrm/templates/settings/users/user_admin.html:81 -#: bookwyrm/templates/settings/users/user_info.html:28 +#: bookwyrm/templates/snippets/user_active_tag.html:8 msgid "Active" msgstr "Aktiboa" -#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:172 +#: bookwyrm/models/import_job.py:50 bookwyrm/templates/import/import.html:172 msgid "Complete" msgstr "Osatuta" -#: bookwyrm/models/import_job.py:50 +#: bookwyrm/models/import_job.py:51 msgid "Stopped" msgstr "Geldituta" -#: bookwyrm/models/import_job.py:83 bookwyrm/models/import_job.py:91 +#: bookwyrm/models/import_job.py:84 bookwyrm/models/import_job.py:92 msgid "Import stopped" msgstr "Inportazioa gelditu da" -#: bookwyrm/models/import_job.py:363 bookwyrm/models/import_job.py:388 +#: bookwyrm/models/import_job.py:356 bookwyrm/models/import_job.py:381 msgid "Error loading book" msgstr "Errorea liburua kargatzean" -#: bookwyrm/models/import_job.py:372 +#: bookwyrm/models/import_job.py:365 msgid "Could not find a match for book" msgstr "Ezin izan da libururako parekorik aurkitu" @@ -310,164 +309,185 @@ msgstr "Iruzkina" #: bookwyrm/models/report.py:85 msgid "Resolved report" -msgstr "" +msgstr "Ebatzitako txostena" #: bookwyrm/models/report.py:86 msgid "Re-opened report" -msgstr "" +msgstr "Berrirekitako txostena" #: bookwyrm/models/report.py:87 msgid "Messaged reporter" -msgstr "" +msgstr "Salatzaileari mezua bidali zaio" #: bookwyrm/models/report.py:88 msgid "Messaged reported user" -msgstr "" +msgstr "Salatutako erabiltzaileari mezua bidali zaio" #: bookwyrm/models/report.py:89 msgid "Suspended user" -msgstr "" +msgstr "Erabiltzailea debekatu da" #: bookwyrm/models/report.py:90 msgid "Un-suspended user" -msgstr "" +msgstr "Erabiltzaileari debekua kendu zaio" #: bookwyrm/models/report.py:91 msgid "Changed user permission level" -msgstr "" +msgstr "Erabiltzailearen baimen-maila aldatu da" #: bookwyrm/models/report.py:92 msgid "Deleted user account" -msgstr "" +msgstr "Erabiltzaile-kontua ezabatu da" #: bookwyrm/models/report.py:93 msgid "Blocked domain" -msgstr "" +msgstr "Domeinua blokeatu da" #: bookwyrm/models/report.py:94 msgid "Approved domain" -msgstr "" +msgstr "Domeinua onartu da" #: bookwyrm/models/report.py:95 msgid "Deleted item" -msgstr "" +msgstr "Elementua ezabatu da" -#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:307 +#: bookwyrm/models/user.py:33 bookwyrm/templates/book/book.html:307 msgid "Reviews" msgstr "Kritikak" -#: bookwyrm/models/user.py:33 +#: bookwyrm/models/user.py:34 msgid "Comments" msgstr "Iruzkinak" -#: bookwyrm/models/user.py:34 +#: bookwyrm/models/user.py:35 msgid "Quotations" msgstr "Aipuak" -#: bookwyrm/models/user.py:35 +#: bookwyrm/models/user.py:36 msgid "Everything else" msgstr "Gainerako guztia" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home Timeline" msgstr "Hasierako denbora-lerroa" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home" msgstr "Hasiera" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 msgid "Books Timeline" msgstr "Liburuen denbora-lerroa" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 -#: bookwyrm/templates/user/layout.html:97 +#: bookwyrm/templates/user/layout.html:107 msgid "Books" msgstr "Liburuak" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:313 msgid "English" msgstr "English (Ingelesa)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:314 msgid "Català (Catalan)" msgstr "Català (katalana)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:315 msgid "Deutsch (German)" msgstr "Deutsch (alemana)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:316 msgid "Esperanto (Esperanto)" msgstr "Esperantoa" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:317 msgid "Español (Spanish)" msgstr "Español (espainiera)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:318 msgid "Euskara (Basque)" msgstr "Euskara" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:319 msgid "Galego (Galician)" msgstr "Galego (Galiziera)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:320 msgid "Italiano (Italian)" msgstr "Italiano (Italiera)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:321 msgid "Suomi (Finnish)" msgstr "Suomi (finlandiera)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:322 msgid "Français (French)" msgstr "Français (frantses)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:323 msgid "Lietuvių (Lithuanian)" msgstr "Lituano (lituaniera)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:324 msgid "Nederlands (Dutch)" -msgstr "" +msgstr "Herbehereak (nederlandera)" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:325 msgid "Norsk (Norwegian)" msgstr "Norsk (Norvegiera)" -#: bookwyrm/settings.py:309 +#: bookwyrm/settings.py:326 msgid "Polski (Polish)" msgstr "Polski (poloniera)" -#: bookwyrm/settings.py:310 +#: bookwyrm/settings.py:327 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Brasilgo Portugesa)" -#: bookwyrm/settings.py:311 +#: bookwyrm/settings.py:328 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Europako Portugesa)" -#: bookwyrm/settings.py:312 +#: bookwyrm/settings.py:329 msgid "Română (Romanian)" msgstr "Română (errumaniera)" -#: bookwyrm/settings.py:313 +#: bookwyrm/settings.py:330 msgid "Svenska (Swedish)" msgstr "Svenska (suediera)" -#: bookwyrm/settings.py:314 +#: bookwyrm/settings.py:331 +msgid "Українська (Ukrainian)" +msgstr "" + +#: bookwyrm/settings.py:332 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Txinera soildua)" -#: bookwyrm/settings.py:315 +#: bookwyrm/settings.py:333 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Txinera tradizionala)" +#: bookwyrm/templates/403.html:5 +msgid "Oh no!" +msgstr "" + +#: bookwyrm/templates/403.html:9 bookwyrm/templates/landing/invite.html:21 +msgid "Permission Denied" +msgstr "Baimena ukatu da" + +#: bookwyrm/templates/403.html:11 +#, python-format +msgid "You do not have permission to view this page or perform this action. Your user permission level is %(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 \n" "Language-Team: Finnish\n" "Language: fi\n" @@ -42,15 +42,15 @@ msgstr "{i} käyttökertaa" msgid "Unlimited" msgstr "rajattomasti" -#: bookwyrm/forms/edit_user.py:88 +#: bookwyrm/forms/edit_user.py:104 msgid "Incorrect password" msgstr "Väärä salasana" -#: bookwyrm/forms/edit_user.py:95 bookwyrm/forms/landing.py:90 +#: bookwyrm/forms/edit_user.py:111 bookwyrm/forms/landing.py:90 msgid "Password does not match" msgstr "Salasanat eivät täsmää" -#: bookwyrm/forms/edit_user.py:118 +#: bookwyrm/forms/edit_user.py:134 msgid "Incorrect Password" msgstr "Virheellinen salasana" @@ -102,8 +102,8 @@ msgstr "Lisäysjärjestys" msgid "Book Title" msgstr "Kirjan nimi" -#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:156 -#: bookwyrm/templates/shelf/shelf.html:188 +#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:158 +#: bookwyrm/templates/shelf/shelf.html:190 #: bookwyrm/templates/snippets/create_status/review.html:32 msgid "Rating" msgstr "Arvosana" @@ -141,11 +141,11 @@ msgstr "Varoitus" msgid "Danger" msgstr "Vaara" -#: bookwyrm/models/antispam.py:112 bookwyrm/models/antispam.py:146 +#: bookwyrm/models/antispam.py:113 bookwyrm/models/antispam.py:147 msgid "Automatically generated report" msgstr "Automaattisesti luotu raportti" -#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:47 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:48 #: bookwyrm/models/link.py:72 bookwyrm/templates/import/import_status.html:214 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" @@ -171,23 +171,23 @@ msgstr "Moderaattorin poistama" msgid "Domain block" msgstr "Verkkotunnuksen esto" -#: bookwyrm/models/book.py:283 +#: bookwyrm/models/book.py:282 msgid "Audiobook" msgstr "Äänikirja" -#: bookwyrm/models/book.py:284 +#: bookwyrm/models/book.py:283 msgid "eBook" msgstr "E-kirja" -#: bookwyrm/models/book.py:285 +#: bookwyrm/models/book.py:284 msgid "Graphic novel" msgstr "Sarjakuva" -#: bookwyrm/models/book.py:286 +#: bookwyrm/models/book.py:285 msgid "Hardcover" msgstr "Kovakantinen" -#: bookwyrm/models/book.py:287 +#: bookwyrm/models/book.py:286 msgid "Paperback" msgstr "Pehmeäkantinen" @@ -205,26 +205,26 @@ msgstr "Federoitu" msgid "Blocked" msgstr "Estetty" -#: bookwyrm/models/fields.py:29 +#: bookwyrm/models/fields.py:35 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "%(value)s ei ole kelvollinen remote_id" -#: bookwyrm/models/fields.py:38 bookwyrm/models/fields.py:47 +#: bookwyrm/models/fields.py:44 bookwyrm/models/fields.py:53 #, python-format msgid "%(value)s is not a valid username" msgstr "%(value)s ei ole kelvollinen käyttäjänimi" -#: bookwyrm/models/fields.py:192 bookwyrm/templates/layout.html:128 +#: bookwyrm/models/fields.py:198 bookwyrm/templates/layout.html:129 #: bookwyrm/templates/ostatus/error.html:29 msgid "username" msgstr "käyttäjänimi" -#: bookwyrm/models/fields.py:197 +#: bookwyrm/models/fields.py:203 msgid "A user with that username already exists." msgstr "Käyttäjänimi on jo käytössä." -#: bookwyrm/models/fields.py:216 +#: bookwyrm/models/fields.py:222 #: bookwyrm/templates/snippets/privacy-icons.html:3 #: bookwyrm/templates/snippets/privacy-icons.html:4 #: bookwyrm/templates/snippets/privacy_select.html:11 @@ -232,7 +232,7 @@ msgstr "Käyttäjänimi on jo käytössä." msgid "Public" msgstr "Julkinen" -#: bookwyrm/models/fields.py:217 +#: bookwyrm/models/fields.py:223 #: bookwyrm/templates/snippets/privacy-icons.html:7 #: bookwyrm/templates/snippets/privacy-icons.html:8 #: bookwyrm/templates/snippets/privacy_select.html:14 @@ -240,7 +240,7 @@ msgstr "Julkinen" msgid "Unlisted" msgstr "Ei jakelua" -#: bookwyrm/models/fields.py:218 +#: bookwyrm/models/fields.py:224 #: bookwyrm/templates/snippets/privacy_select.html:17 #: bookwyrm/templates/user/relationships/followers.html:6 #: bookwyrm/templates/user/relationships/followers.html:11 @@ -249,7 +249,7 @@ msgstr "Ei jakelua" msgid "Followers" msgstr "Seuraajat" -#: bookwyrm/models/fields.py:219 +#: bookwyrm/models/fields.py:225 #: bookwyrm/templates/snippets/create_status/post_options_block.html:6 #: bookwyrm/templates/snippets/privacy-icons.html:15 #: bookwyrm/templates/snippets/privacy-icons.html:16 @@ -258,30 +258,29 @@ msgstr "Seuraajat" msgid "Private" msgstr "Yksityinen" -#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:174 +#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:174 #: bookwyrm/templates/settings/imports/imports.html:98 -#: bookwyrm/templates/settings/users/user_admin.html:81 -#: bookwyrm/templates/settings/users/user_info.html:28 +#: bookwyrm/templates/snippets/user_active_tag.html:8 msgid "Active" msgstr "Aktiivinen" -#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:172 +#: bookwyrm/models/import_job.py:50 bookwyrm/templates/import/import.html:172 msgid "Complete" msgstr "Valmis" -#: bookwyrm/models/import_job.py:50 +#: bookwyrm/models/import_job.py:51 msgid "Stopped" msgstr "Keskeytetty" -#: bookwyrm/models/import_job.py:83 bookwyrm/models/import_job.py:91 +#: bookwyrm/models/import_job.py:84 bookwyrm/models/import_job.py:92 msgid "Import stopped" msgstr "Tuonti keskeytetty" -#: bookwyrm/models/import_job.py:363 bookwyrm/models/import_job.py:388 +#: bookwyrm/models/import_job.py:356 bookwyrm/models/import_job.py:381 msgid "Error loading book" msgstr "Virhe kirjan lataamisessa" -#: bookwyrm/models/import_job.py:372 +#: bookwyrm/models/import_job.py:365 msgid "Could not find a match for book" msgstr "Kirjaa ei löytynyt tietokannoista" @@ -352,122 +351,143 @@ msgstr "Verkkotunnus hyväksytty" msgid "Deleted item" msgstr "Kohde poistettu" -#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:307 +#: bookwyrm/models/user.py:33 bookwyrm/templates/book/book.html:307 msgid "Reviews" msgstr "Arviot" -#: bookwyrm/models/user.py:33 +#: bookwyrm/models/user.py:34 msgid "Comments" msgstr "Kommentit" -#: bookwyrm/models/user.py:34 +#: bookwyrm/models/user.py:35 msgid "Quotations" msgstr "Lainaukset" -#: bookwyrm/models/user.py:35 +#: bookwyrm/models/user.py:36 msgid "Everything else" msgstr "Muut" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home Timeline" msgstr "Oma aikajana" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home" msgstr "Etusivu" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 msgid "Books Timeline" msgstr "Kirjavirta" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 -#: bookwyrm/templates/user/layout.html:97 +#: bookwyrm/templates/user/layout.html:107 msgid "Books" msgstr "Kirjat" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:313 msgid "English" msgstr "English (englanti)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:314 msgid "Català (Catalan)" msgstr "Català (katalaani)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:315 msgid "Deutsch (German)" msgstr "Deutsch (saksa)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:316 msgid "Esperanto (Esperanto)" msgstr "Esperanto (esperanto)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:317 msgid "Español (Spanish)" msgstr "Español (espanja)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:318 msgid "Euskara (Basque)" msgstr "Euskara (baski)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:319 msgid "Galego (Galician)" msgstr "Galego (galego)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:320 msgid "Italiano (Italian)" msgstr "Italiano (italia)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:321 msgid "Suomi (Finnish)" msgstr "suomi" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:322 msgid "Français (French)" msgstr "Français (ranska)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:323 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (liettua)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:324 msgid "Nederlands (Dutch)" msgstr "Nederlands (hollanti)" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:325 msgid "Norsk (Norwegian)" msgstr "Norsk (norja)" -#: bookwyrm/settings.py:309 +#: bookwyrm/settings.py:326 msgid "Polski (Polish)" msgstr "Polski (puola)" -#: bookwyrm/settings.py:310 +#: bookwyrm/settings.py:327 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (brasilianportugali)" -#: bookwyrm/settings.py:311 +#: bookwyrm/settings.py:328 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (portugali)" -#: bookwyrm/settings.py:312 +#: bookwyrm/settings.py:329 msgid "Română (Romanian)" msgstr "Română (romania)" -#: bookwyrm/settings.py:313 +#: bookwyrm/settings.py:330 msgid "Svenska (Swedish)" msgstr "Svenska (ruotsi)" -#: bookwyrm/settings.py:314 +#: bookwyrm/settings.py:331 +msgid "Українська (Ukrainian)" +msgstr "" + +#: bookwyrm/settings.py:332 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (yksinkertaistettu kiina)" -#: bookwyrm/settings.py:315 +#: bookwyrm/settings.py:333 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (perinteinen kiina)" +#: bookwyrm/templates/403.html:5 +msgid "Oh no!" +msgstr "" + +#: bookwyrm/templates/403.html:9 bookwyrm/templates/landing/invite.html:21 +msgid "Permission Denied" +msgstr "Pääsy kielletty" + +#: bookwyrm/templates/403.html:11 +#, python-format +msgid "You do not have permission to view this page or perform this action. Your user permission level is %(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%(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 \n" "Language-Team: French\n" "Language: fr\n" @@ -42,15 +42,15 @@ msgstr "{i} utilisations" msgid "Unlimited" msgstr "Sans limite" -#: bookwyrm/forms/edit_user.py:88 +#: bookwyrm/forms/edit_user.py:104 msgid "Incorrect password" msgstr "Mot de passe incorrect" -#: bookwyrm/forms/edit_user.py:95 bookwyrm/forms/landing.py:90 +#: bookwyrm/forms/edit_user.py:111 bookwyrm/forms/landing.py:90 msgid "Password does not match" msgstr "Le mot de passe ne correspond pas" -#: bookwyrm/forms/edit_user.py:118 +#: bookwyrm/forms/edit_user.py:134 msgid "Incorrect Password" msgstr "Mot de passe incorrect" @@ -102,8 +102,8 @@ msgstr "Ordre de la liste" msgid "Book Title" msgstr "Titre du livre" -#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:156 -#: bookwyrm/templates/shelf/shelf.html:188 +#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:158 +#: bookwyrm/templates/shelf/shelf.html:190 #: bookwyrm/templates/snippets/create_status/review.html:32 msgid "Rating" msgstr "Note" @@ -141,11 +141,11 @@ msgstr "Avertissement" msgid "Danger" msgstr "Danger" -#: bookwyrm/models/antispam.py:112 bookwyrm/models/antispam.py:146 +#: bookwyrm/models/antispam.py:113 bookwyrm/models/antispam.py:147 msgid "Automatically generated report" msgstr "Rapport généré automatiquement" -#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:47 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:48 #: bookwyrm/models/link.py:72 bookwyrm/templates/import/import_status.html:214 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" @@ -171,23 +171,23 @@ msgstr "Suppression par un modérateur" msgid "Domain block" msgstr "Blocage de domaine" -#: bookwyrm/models/book.py:283 +#: bookwyrm/models/book.py:282 msgid "Audiobook" msgstr "Livre audio" -#: bookwyrm/models/book.py:284 +#: bookwyrm/models/book.py:283 msgid "eBook" msgstr "eBook" -#: bookwyrm/models/book.py:285 +#: bookwyrm/models/book.py:284 msgid "Graphic novel" msgstr "Roman graphique" -#: bookwyrm/models/book.py:286 +#: bookwyrm/models/book.py:285 msgid "Hardcover" msgstr "Livre relié" -#: bookwyrm/models/book.py:287 +#: bookwyrm/models/book.py:286 msgid "Paperback" msgstr "Livre broché" @@ -205,26 +205,26 @@ msgstr "Fédéré" msgid "Blocked" msgstr "Bloqué" -#: bookwyrm/models/fields.py:29 +#: bookwyrm/models/fields.py:35 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "%(value)s n’est pas une remote_id valide." -#: bookwyrm/models/fields.py:38 bookwyrm/models/fields.py:47 +#: bookwyrm/models/fields.py:44 bookwyrm/models/fields.py:53 #, python-format msgid "%(value)s is not a valid username" msgstr "%(value)s n’est pas un nom de compte valide." -#: bookwyrm/models/fields.py:192 bookwyrm/templates/layout.html:128 +#: bookwyrm/models/fields.py:198 bookwyrm/templates/layout.html:129 #: bookwyrm/templates/ostatus/error.html:29 msgid "username" msgstr "nom du compte :" -#: bookwyrm/models/fields.py:197 +#: bookwyrm/models/fields.py:203 msgid "A user with that username already exists." msgstr "Ce nom est déjà associé à un compte." -#: bookwyrm/models/fields.py:216 +#: bookwyrm/models/fields.py:222 #: bookwyrm/templates/snippets/privacy-icons.html:3 #: bookwyrm/templates/snippets/privacy-icons.html:4 #: bookwyrm/templates/snippets/privacy_select.html:11 @@ -232,7 +232,7 @@ msgstr "Ce nom est déjà associé à un compte." msgid "Public" msgstr "Public" -#: bookwyrm/models/fields.py:217 +#: bookwyrm/models/fields.py:223 #: bookwyrm/templates/snippets/privacy-icons.html:7 #: bookwyrm/templates/snippets/privacy-icons.html:8 #: bookwyrm/templates/snippets/privacy_select.html:14 @@ -240,7 +240,7 @@ msgstr "Public" msgid "Unlisted" msgstr "Non listé" -#: bookwyrm/models/fields.py:218 +#: bookwyrm/models/fields.py:224 #: bookwyrm/templates/snippets/privacy_select.html:17 #: bookwyrm/templates/user/relationships/followers.html:6 #: bookwyrm/templates/user/relationships/followers.html:11 @@ -249,7 +249,7 @@ msgstr "Non listé" msgid "Followers" msgstr "Abonné(e)s" -#: bookwyrm/models/fields.py:219 +#: bookwyrm/models/fields.py:225 #: bookwyrm/templates/snippets/create_status/post_options_block.html:6 #: bookwyrm/templates/snippets/privacy-icons.html:15 #: bookwyrm/templates/snippets/privacy-icons.html:16 @@ -258,30 +258,29 @@ msgstr "Abonné(e)s" msgid "Private" msgstr "Privé" -#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:174 +#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:174 #: bookwyrm/templates/settings/imports/imports.html:98 -#: bookwyrm/templates/settings/users/user_admin.html:81 -#: bookwyrm/templates/settings/users/user_info.html:28 +#: bookwyrm/templates/snippets/user_active_tag.html:8 msgid "Active" msgstr "Actif" -#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:172 +#: bookwyrm/models/import_job.py:50 bookwyrm/templates/import/import.html:172 msgid "Complete" msgstr "Terminé" -#: bookwyrm/models/import_job.py:50 +#: bookwyrm/models/import_job.py:51 msgid "Stopped" msgstr "Interrompu" -#: bookwyrm/models/import_job.py:83 bookwyrm/models/import_job.py:91 +#: bookwyrm/models/import_job.py:84 bookwyrm/models/import_job.py:92 msgid "Import stopped" msgstr "Import arrêté" -#: bookwyrm/models/import_job.py:363 bookwyrm/models/import_job.py:388 +#: bookwyrm/models/import_job.py:356 bookwyrm/models/import_job.py:381 msgid "Error loading book" msgstr "Erreur lors du chargement du livre" -#: bookwyrm/models/import_job.py:372 +#: bookwyrm/models/import_job.py:365 msgid "Could not find a match for book" msgstr "Impossible de trouver une correspondance pour le livre" @@ -310,164 +309,185 @@ msgstr "Commentaire" #: bookwyrm/models/report.py:85 msgid "Resolved report" -msgstr "" +msgstr "Signalement résolu" #: bookwyrm/models/report.py:86 msgid "Re-opened report" -msgstr "" +msgstr "Ouvrir le signalement de nouveau" #: bookwyrm/models/report.py:87 msgid "Messaged reporter" -msgstr "" +msgstr "Rapporteur contacté" #: bookwyrm/models/report.py:88 msgid "Messaged reported user" -msgstr "" +msgstr "Compte signalé contacté" #: bookwyrm/models/report.py:89 msgid "Suspended user" -msgstr "" +msgstr "Compte suspendu" #: bookwyrm/models/report.py:90 msgid "Un-suspended user" -msgstr "" +msgstr "Compte non‑suspendu" #: bookwyrm/models/report.py:91 msgid "Changed user permission level" -msgstr "" +msgstr "Niveau des permissions utilisateur modifié" #: bookwyrm/models/report.py:92 msgid "Deleted user account" -msgstr "" +msgstr "Compte supprimé" #: bookwyrm/models/report.py:93 msgid "Blocked domain" -msgstr "" +msgstr "Domaine bloqué" #: bookwyrm/models/report.py:94 msgid "Approved domain" -msgstr "" +msgstr "Domaine approuvé" #: bookwyrm/models/report.py:95 msgid "Deleted item" -msgstr "" +msgstr "Item supprimé" -#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:307 +#: bookwyrm/models/user.py:33 bookwyrm/templates/book/book.html:307 msgid "Reviews" msgstr "Critiques" -#: bookwyrm/models/user.py:33 +#: bookwyrm/models/user.py:34 msgid "Comments" msgstr "Commentaires" -#: bookwyrm/models/user.py:34 +#: bookwyrm/models/user.py:35 msgid "Quotations" msgstr "Citations" -#: bookwyrm/models/user.py:35 +#: bookwyrm/models/user.py:36 msgid "Everything else" msgstr "Tout le reste" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home Timeline" msgstr "Mon fil d’actualité" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home" msgstr "Accueil" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 msgid "Books Timeline" -msgstr "Actualité de mes livres" +msgstr "Mon fil d’actualité littéraire" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 -#: bookwyrm/templates/user/layout.html:97 +#: bookwyrm/templates/user/layout.html:107 msgid "Books" msgstr "Livres" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:313 msgid "English" msgstr "English" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:314 msgid "Català (Catalan)" msgstr "Català (Catalan)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:315 msgid "Deutsch (German)" msgstr "Deutsch" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:316 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Espéranto)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:317 msgid "Español (Spanish)" msgstr "Español" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:318 msgid "Euskara (Basque)" msgstr "Euskara (Basque)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:319 msgid "Galego (Galician)" msgstr "Galego (Galicien)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:320 msgid "Italiano (Italian)" msgstr "Italiano (Italien)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:321 msgid "Suomi (Finnish)" msgstr "Suomi (Finnois)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:322 msgid "Français (French)" msgstr "Français" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:323 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Lituanien)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:324 msgid "Nederlands (Dutch)" -msgstr "" +msgstr "Pays‑Bas (Néerlandais)" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:325 msgid "Norsk (Norwegian)" msgstr "Norsk (Norvégien)" -#: bookwyrm/settings.py:309 +#: bookwyrm/settings.py:326 msgid "Polski (Polish)" msgstr "Polski (Polonais)" -#: bookwyrm/settings.py:310 +#: bookwyrm/settings.py:327 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Portugais brésilien)" -#: bookwyrm/settings.py:311 +#: bookwyrm/settings.py:328 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Portugais européen)" -#: bookwyrm/settings.py:312 +#: bookwyrm/settings.py:329 msgid "Română (Romanian)" msgstr "Română (Roumain)" -#: bookwyrm/settings.py:313 +#: bookwyrm/settings.py:330 msgid "Svenska (Swedish)" msgstr "Svenska (Suédois)" -#: bookwyrm/settings.py:314 +#: bookwyrm/settings.py:331 +msgid "Українська (Ukrainian)" +msgstr "" + +#: bookwyrm/settings.py:332 msgid "简体中文 (Simplified Chinese)" msgstr "简化字" -#: bookwyrm/settings.py:315 +#: bookwyrm/settings.py:333 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (chinois traditionnel)" +#: bookwyrm/templates/403.html:5 +msgid "Oh no!" +msgstr "" + +#: bookwyrm/templates/403.html:9 bookwyrm/templates/landing/invite.html:21 +msgid "Permission Denied" +msgstr "Autorisation refusée" + +#: bookwyrm/templates/403.html:11 +#, python-format +msgid "You do not have permission to view this page or perform this action. Your user permission level is %(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 \n" "Language-Team: Galician\n" "Language: gl\n" @@ -42,15 +42,15 @@ msgstr "{i} usos" msgid "Unlimited" msgstr "Sen límite" -#: bookwyrm/forms/edit_user.py:88 +#: bookwyrm/forms/edit_user.py:104 msgid "Incorrect password" msgstr "Contrasinal incorrecto" -#: bookwyrm/forms/edit_user.py:95 bookwyrm/forms/landing.py:90 +#: bookwyrm/forms/edit_user.py:111 bookwyrm/forms/landing.py:90 msgid "Password does not match" msgstr "O contrasinal non concorda" -#: bookwyrm/forms/edit_user.py:118 +#: bookwyrm/forms/edit_user.py:134 msgid "Incorrect Password" msgstr "Contrasinal incorrecto" @@ -102,8 +102,8 @@ msgstr "Orde da lista" msgid "Book Title" msgstr "Título do libro" -#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:156 -#: bookwyrm/templates/shelf/shelf.html:188 +#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:158 +#: bookwyrm/templates/shelf/shelf.html:190 #: bookwyrm/templates/snippets/create_status/review.html:32 msgid "Rating" msgstr "Valoración" @@ -141,11 +141,11 @@ msgstr "Advertencia" msgid "Danger" msgstr "Perigo" -#: bookwyrm/models/antispam.py:112 bookwyrm/models/antispam.py:146 +#: bookwyrm/models/antispam.py:113 bookwyrm/models/antispam.py:147 msgid "Automatically generated report" msgstr "Denuncia creada automáticamente" -#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:47 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:48 #: bookwyrm/models/link.py:72 bookwyrm/templates/import/import_status.html:214 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" @@ -171,23 +171,23 @@ msgstr "Eliminado pola moderación" msgid "Domain block" msgstr "Bloqueo de dominio" -#: bookwyrm/models/book.py:283 +#: bookwyrm/models/book.py:282 msgid "Audiobook" msgstr "Audiolibro" -#: bookwyrm/models/book.py:284 +#: bookwyrm/models/book.py:283 msgid "eBook" msgstr "eBook" -#: bookwyrm/models/book.py:285 +#: bookwyrm/models/book.py:284 msgid "Graphic novel" msgstr "Novela gráfica" -#: bookwyrm/models/book.py:286 +#: bookwyrm/models/book.py:285 msgid "Hardcover" msgstr "Tapa dura" -#: bookwyrm/models/book.py:287 +#: bookwyrm/models/book.py:286 msgid "Paperback" msgstr "Libro de bolso" @@ -205,26 +205,26 @@ msgstr "Federado" msgid "Blocked" msgstr "Bloqueado" -#: bookwyrm/models/fields.py:29 +#: bookwyrm/models/fields.py:35 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "%(value)s non é un remote_id válido" -#: bookwyrm/models/fields.py:38 bookwyrm/models/fields.py:47 +#: bookwyrm/models/fields.py:44 bookwyrm/models/fields.py:53 #, python-format msgid "%(value)s is not a valid username" msgstr "%(value)s non é un nome de usuaria válido" -#: bookwyrm/models/fields.py:192 bookwyrm/templates/layout.html:128 +#: bookwyrm/models/fields.py:198 bookwyrm/templates/layout.html:129 #: bookwyrm/templates/ostatus/error.html:29 msgid "username" msgstr "identificador" -#: bookwyrm/models/fields.py:197 +#: bookwyrm/models/fields.py:203 msgid "A user with that username already exists." msgstr "Xa existe unha usuaria con ese identificador." -#: bookwyrm/models/fields.py:216 +#: bookwyrm/models/fields.py:222 #: bookwyrm/templates/snippets/privacy-icons.html:3 #: bookwyrm/templates/snippets/privacy-icons.html:4 #: bookwyrm/templates/snippets/privacy_select.html:11 @@ -232,7 +232,7 @@ msgstr "Xa existe unha usuaria con ese identificador." msgid "Public" msgstr "Público" -#: bookwyrm/models/fields.py:217 +#: bookwyrm/models/fields.py:223 #: bookwyrm/templates/snippets/privacy-icons.html:7 #: bookwyrm/templates/snippets/privacy-icons.html:8 #: bookwyrm/templates/snippets/privacy_select.html:14 @@ -240,7 +240,7 @@ msgstr "Público" msgid "Unlisted" msgstr "Non listado" -#: bookwyrm/models/fields.py:218 +#: bookwyrm/models/fields.py:224 #: bookwyrm/templates/snippets/privacy_select.html:17 #: bookwyrm/templates/user/relationships/followers.html:6 #: bookwyrm/templates/user/relationships/followers.html:11 @@ -249,7 +249,7 @@ msgstr "Non listado" msgid "Followers" msgstr "Seguidoras" -#: bookwyrm/models/fields.py:219 +#: bookwyrm/models/fields.py:225 #: bookwyrm/templates/snippets/create_status/post_options_block.html:6 #: bookwyrm/templates/snippets/privacy-icons.html:15 #: bookwyrm/templates/snippets/privacy-icons.html:16 @@ -258,30 +258,29 @@ msgstr "Seguidoras" msgid "Private" msgstr "Privado" -#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:174 +#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:174 #: bookwyrm/templates/settings/imports/imports.html:98 -#: bookwyrm/templates/settings/users/user_admin.html:81 -#: bookwyrm/templates/settings/users/user_info.html:28 +#: bookwyrm/templates/snippets/user_active_tag.html:8 msgid "Active" msgstr "Activa" -#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:172 +#: bookwyrm/models/import_job.py:50 bookwyrm/templates/import/import.html:172 msgid "Complete" msgstr "Completa" -#: bookwyrm/models/import_job.py:50 +#: bookwyrm/models/import_job.py:51 msgid "Stopped" msgstr "Detida" -#: bookwyrm/models/import_job.py:83 bookwyrm/models/import_job.py:91 +#: bookwyrm/models/import_job.py:84 bookwyrm/models/import_job.py:92 msgid "Import stopped" msgstr "Importación detida" -#: bookwyrm/models/import_job.py:363 bookwyrm/models/import_job.py:388 +#: bookwyrm/models/import_job.py:356 bookwyrm/models/import_job.py:381 msgid "Error loading book" msgstr "Erro ao cargar o libro" -#: bookwyrm/models/import_job.py:372 +#: bookwyrm/models/import_job.py:365 msgid "Could not find a match for book" msgstr "Non se atopan coincidencias para o libro" @@ -352,122 +351,143 @@ msgstr "Dominio aprobado" msgid "Deleted item" msgstr "Elemento eliminado" -#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:307 +#: bookwyrm/models/user.py:33 bookwyrm/templates/book/book.html:307 msgid "Reviews" msgstr "Recensións" -#: bookwyrm/models/user.py:33 +#: bookwyrm/models/user.py:34 msgid "Comments" msgstr "Comentarios" -#: bookwyrm/models/user.py:34 +#: bookwyrm/models/user.py:35 msgid "Quotations" msgstr "Citas" -#: bookwyrm/models/user.py:35 +#: bookwyrm/models/user.py:36 msgid "Everything else" msgstr "As outras cousas" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home Timeline" msgstr "Cronoloxía de Inicio" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home" msgstr "Inicio" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 msgid "Books Timeline" msgstr "Cronoloxía de libros" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 -#: bookwyrm/templates/user/layout.html:97 +#: bookwyrm/templates/user/layout.html:107 msgid "Books" msgstr "Libros" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:313 msgid "English" msgstr "English (Inglés)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:314 msgid "Català (Catalan)" msgstr "Català (Catalan)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:315 msgid "Deutsch (German)" msgstr "Deutsch (Alemán)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:316 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Esperanto)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:317 msgid "Español (Spanish)" msgstr "Español (Español)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:318 msgid "Euskara (Basque)" msgstr "Euskara (Éuscaro)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:319 msgid "Galego (Galician)" msgstr "Galego (Galego)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:320 msgid "Italiano (Italian)" msgstr "Italiano (Italiano)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:321 msgid "Suomi (Finnish)" msgstr "Suomi (Finés)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:322 msgid "Français (French)" msgstr "Français (Francés)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:323 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Lituano)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:324 msgid "Nederlands (Dutch)" msgstr "Paises Baixos (Dutch)" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:325 msgid "Norsk (Norwegian)" msgstr "Norsk (Noruegués)" -#: bookwyrm/settings.py:309 +#: bookwyrm/settings.py:326 msgid "Polski (Polish)" msgstr "Polski (Polaco)" -#: bookwyrm/settings.py:310 +#: bookwyrm/settings.py:327 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Portugués brasileiro)" -#: bookwyrm/settings.py:311 +#: bookwyrm/settings.py:328 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Portugués europeo)" -#: bookwyrm/settings.py:312 +#: bookwyrm/settings.py:329 msgid "Română (Romanian)" msgstr "Română (Rumanés)" -#: bookwyrm/settings.py:313 +#: bookwyrm/settings.py:330 msgid "Svenska (Swedish)" msgstr "Svenska (Sueco)" -#: bookwyrm/settings.py:314 +#: bookwyrm/settings.py:331 +msgid "Українська (Ukrainian)" +msgstr "" + +#: bookwyrm/settings.py:332 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Chinés simplificado)" -#: bookwyrm/settings.py:315 +#: bookwyrm/settings.py:333 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Chinés tradicional)" +#: bookwyrm/templates/403.html:5 +msgid "Oh no!" +msgstr "" + +#: bookwyrm/templates/403.html:9 bookwyrm/templates/landing/invite.html:21 +msgid "Permission Denied" +msgstr "Permiso denegado" + +#: bookwyrm/templates/403.html:11 +#, python-format +msgid "You do not have permission to view this page or perform this action. Your user permission level is %(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,
    and achieved %(goal_percent)s%% of that goal" msgid_plural "%(display_name)s set a goal of reading %(goal)s books in %(year)s,
    and achieved %(goal_percent)s%% of that goal" -msgstr[0] "%(display_name)s ten como obxectivo ler %(goal)s libro en %(year)s,
    e vai polo %(goal_percent)s dese obxectivo" -msgstr[1] "%(display_name)s ten como obxectivo ler %(goal)s libros en %(year)s,
    e vai polo %(goal_percent)s dese obxectivo" +msgstr[0] "%(display_name)s ten como obxectivo ler %(goal)s libro en %(year)s,
    e vai polo %(goal_percent)s%% dese obxectivo" +msgstr[1] "%(display_name)s ten como obxectivo ler %(goal)s libros en %(year)s,
    e vai polo %(goal_percent)s%% dese obxectivo" #: bookwyrm/templates/annual_summary/layout.html:211 msgid "Way to go!" @@ -768,24 +802,24 @@ msgid "View ISNI record" msgstr "Ver rexistro 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 a entrada 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 "Non se pode conectar coa 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 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 "Preme para engadir portada" -#: bookwyrm/templates/book/book.html:106 +#: bookwyrm/templates/book/book.html:108 msgid "Failed to load cover" msgstr "Fallou a carga da portada" -#: bookwyrm/templates/book/book.html:117 +#: bookwyrm/templates/book/book.html:119 msgid "Click to enlarge" msgstr "Preme para agrandar" @@ -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 "Cargar portada desde 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 "Engade outra 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 "Portada" @@ -1372,8 +1402,8 @@ msgstr "Edicións de %(book_title)s" #: bookwyrm/templates/book/editions/editions.html:8 #, python-format -msgid "Editions of \"%(work_title)s\"" -msgstr "Edicións de %(work_title)s" +msgid "Editions of %(work_title)s" +msgstr "Edicións 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 "Accións" @@ -1529,22 +1560,22 @@ msgstr "%(pages)s páxinas" 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 en %(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 o %(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 "valorouno" @@ -1552,12 +1583,12 @@ msgstr "valorouno" msgid "Series by" msgstr "Unha Serie 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 non ordenado" @@ -1681,6 +1712,7 @@ msgstr "Suxerido" #: 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 "Mensaxes Directas 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 "Mensaxes Directas" @@ -1948,7 +1980,7 @@ msgstr "Actualizacións" #: 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 libros" @@ -1996,19 +2028,19 @@ msgid "Add to your books" msgstr "Engadir aos teus 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 "Pendentes" #: 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 "Lectura actual" #: 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 "Lidos" #: 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 "Abandonados" @@ -2027,7 +2059,7 @@ msgid "What are you reading?" msgstr "Que estás 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 "Buscar un libro" @@ -2046,8 +2078,8 @@ msgstr "Podes engadir libros cando comeces 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 "Lector 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 "Usa as ligazóns a Cronoloxía, Listas e Descubrir para ver as últimas novas na túa cronoloxía, listas de libros por tema, e as últimas actualizacións neste servidor 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 campá acenderase cando teñas notificacións novas. Preme nela para ver iso tan emocionante que 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 "Notificacións" #: 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, libros, mensaxes directas e axustes son accesibles premendo no teu nome neste 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 "Podes crear ou unirte a un grupo con outras persoas. Os grupos poden cre #: 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 usuaria. A túas últimas actividades aparecerán aquí. Outras usuarias de Bookwyrm poden ver certas partes desta páxina - o que vexan depende dos teus axustes 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 da usuaria" @@ -2756,7 +2788,7 @@ msgid "This tab shows everything you have read towards your annual reading goal, msgstr "Este apartado mostra todo o que leches este ano e permiteche establecer un obxectivo de lectura. Non tes que establecer un obxectivo se non queres!" #: 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 "Obxectivo de lectura" @@ -2795,7 +2827,7 @@ msgstr "Aínda non hai actividade para este cancelo!" #: 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 "Non é un 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" -" " -msgstr[0] "\n" -" Actualmente, tes permiso para importar %(display_size)s libros cada %(import_limit_reset)s día.\n" -" " -msgstr[1] "\n" -" Actualmente, tes permiso para 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 podes importar %(display_size)s libros cada %(import_limit_reset)s día." +msgstr[1] "Actualmente podes 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 "Axuste de privacidade para recensións 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 "Chave en 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" @@ -3095,10 +3119,6 @@ msgstr "Contacta coa administración ou DATA_UPLOAD_MAX_MEMORY_SIZE setting.\n" +" " +msgstr "" + #: bookwyrm/templates/500.html:4 msgid "Oops!" msgstr "Ops!" @@ -512,7 +546,7 @@ msgstr "%(title)s è il libro più amato #: bookwyrm/templates/about/about.html:64 #, python-format msgid "More %(site_name)s users want to read %(title)s than any other book." -msgstr "Più utenti di %(site_name) vogliono leggere %(title)s rispetto a qualsiasi altro libro." +msgstr "Più utenti di %(site_name)s vogliono leggere %(title)s rispetto a qualsiasi altro libro." #: bookwyrm/templates/about/about.html:83 #, python-format @@ -536,12 +570,12 @@ msgstr "I moderatori e gli amministratori di %(site_name)s mantengono il sito at msgid "Moderator" msgstr "Moderatori" -#: 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 "Versione 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 "La loro lettura più breve quest’anno…" #: 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 "Visualizza record ISNI" #: bookwyrm/templates/author/author.html:95 -#: bookwyrm/templates/book/book.html:173 +#: bookwyrm/templates/book/book.html:175 msgid "View on ISFDB" msgstr "Vedi su 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 "Carica dati" #: bookwyrm/templates/author/author.html:104 -#: bookwyrm/templates/book/book.html:144 +#: bookwyrm/templates/book/book.html:146 msgid "View on OpenLibrary" msgstr "Visualizza su OpenLibrary" #: bookwyrm/templates/author/author.html:119 -#: bookwyrm/templates/book/book.html:158 +#: bookwyrm/templates/book/book.html:160 msgid "View on Inventaire" msgstr "Visualizza su Inventaire" @@ -797,11 +831,7 @@ msgstr "Visualizza su LibraryThing" msgid "View on Goodreads" msgstr "Visualizza su Goodreads" -#: bookwyrm/templates/author/author.html:151 -msgid "View ISFDB entry" -msgstr "Vedi voce ISFDB" - -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:158 #, python-format msgid "Books by %(name)s" msgstr "Libri di %(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 "Conferma" msgid "Unable to connect to remote source." msgstr "Impossibile connettersi alla sorgente 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 "Modifica 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 "Clicca per aggiungere una copertina" -#: bookwyrm/templates/book/book.html:106 +#: bookwyrm/templates/book/book.html:108 msgid "Failed to load cover" msgstr "Impossibile caricare la copertina" -#: bookwyrm/templates/book/book.html:117 +#: bookwyrm/templates/book/book.html:119 msgid "Click to enlarge" msgstr "Clicca per ingrandire" @@ -1046,13 +1076,13 @@ msgstr "Luoghi" #: 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" @@ -1117,8 +1147,8 @@ msgstr "Carica la copertina:" #: bookwyrm/templates/book/cover_add_modal.html:23 #: bookwyrm/templates/book/edit/edit_book_form.html:250 -msgid "Load cover from url:" -msgstr "Carica la copertina dall'url:" +msgid "Load cover from URL:" +msgstr "Carica la copertina dall'URL:" #: bookwyrm/templates/book/cover_show_modal.html:6 msgid "Book cover preview" @@ -1328,7 +1358,7 @@ msgid "Add Another Author" msgstr "Aggiungi un altro autore" #: bookwyrm/templates/book/edit/edit_book_form.html:231 -#: bookwyrm/templates/shelf/shelf.html:147 +#: bookwyrm/templates/shelf/shelf.html:149 msgid "Cover" msgstr "Copertina" @@ -1372,8 +1402,8 @@ msgstr "Edizioni di %(book_title)s" #: bookwyrm/templates/book/editions/editions.html:8 #, python-format -msgid "Editions of \"%(work_title)s\"" -msgstr "Edizioni di \"%(work_title)s\"" +msgid "Editions of %(work_title)s" +msgstr "Edizioni di %(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 "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 "Azioni" @@ -1529,22 +1560,22 @@ msgstr "%(pages)s, pagine" msgid "%(languages)s language" msgstr "lingua %(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 "Pubblicato il %(date)s da %(publisher)s." +#: bookwyrm/templates/book/publisher_info.html:65 +#, python-format +msgid "Published by %(publisher)s." +msgstr "Pubblicato da %(publisher)s." + #: bookwyrm/templates/book/publisher_info.html:67 #, python-format msgid "Published %(date)s" msgstr "Pubblicato il %(date)s" -#: bookwyrm/templates/book/publisher_info.html:69 -#, python-format -msgid "Published by %(publisher)s." -msgstr "Pubblicato da %(publisher)s." - -#: bookwyrm/templates/book/rating.html:13 +#: bookwyrm/templates/book/rating.html:19 msgid "rated it" msgstr "Valuta" @@ -1552,12 +1583,12 @@ msgstr "Valuta" msgid "Series by" msgstr "Serie di" -#: 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 non ordinato" @@ -1681,6 +1712,7 @@ msgstr "Suggerimenti" #: 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 citato %(username)s" msgstr "Messaggi diretti 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 "Messaggi diretti" @@ -1948,7 +1980,7 @@ msgstr "Aggiornamenti" #: 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 "I tuoi libri" @@ -1996,19 +2028,19 @@ msgid "Add to your books" msgstr "Aggiungi ai tuoi libri" #: 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 "Da leggere" #: 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 "Letture correnti" #: 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 "Letti" #: 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 "Lettura in pausa" @@ -2027,7 +2059,7 @@ msgid "What are you reading?" msgstr "Cosa stai leggendo?" #: 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 "Cerca un libro" @@ -2046,8 +2078,8 @@ msgstr "Puoi aggiungere libri quando inizi a usare %(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 "Lettore di codici a barre" #: 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 i link Feed, Liste e Scopri per scoprire le ultime novità del tuo feed, elenchi di libri per argomento, e gli ultimi avvenimenti su questo server 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 si illuminerà alla ricezione di una nuova notifica. Quando lo fa, clicci sopra per scoprire cosa è successo di emozionante!" #: 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 "Notifiche" #: 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 "Il tuo profilo, i libri, i messaggi diretti e le impostazioni possono essere consultati cliccando sul tuo nome nel 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." @@ -2702,7 +2734,7 @@ msgstr "Puoi creare o unirti a un gruppo con altri utenti. I gruppi possono cond #: 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 "Gruppi" @@ -2747,7 +2779,7 @@ msgid "This is your user profile. All your latest activities will be listed here msgstr "Questo è il tuo profilo utente. Tutte le tue ultime attività saranno elencate qui. Anche altri utenti di Bookwyrm possono vedere parti di questa pagina - ciò che possono vedere dipende dalle impostazioni sulla privacy." #: 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 utente" @@ -2756,7 +2788,7 @@ msgid "This tab shows everything you have read towards your annual reading goal, msgstr "Questa scheda mostra tutto quello che hai letto per raggiungere il tuo obiettivo di lettura annuale, o ti permette di impostarne uno. Non devi impostare un obiettivo di lettura se non vuoi!" #: 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 "Obiettivo di lettura" @@ -2795,7 +2827,7 @@ msgstr "Non c'è ancora nessuna attività per questo 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 "Importa libri" @@ -2805,14 +2837,10 @@ msgstr "Non è un file di csv valido" #: 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[1] "Al momento puoi importare %(import_size_limit)s libri ogni %(import_limit_reset)s giorni." #: bookwyrm/templates/import/import.html:27 #, python-format @@ -2871,7 +2899,7 @@ msgstr "Impostazione della privacy per le recensioni 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" @@ -2970,8 +2998,8 @@ msgid "Row" msgstr "Riga" #: 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 "Chiave 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 "Autore" @@ -3091,10 +3119,6 @@ msgstr "Contatta il tuo amministratore o user@example.com :" +msgstr "Inserisci il nome utente per l'account che vuoi aggiungere come alias, ad esempio user@example.com :" + +#: bookwyrm/templates/preferences/alias_user.html:30 +#: bookwyrm/templates/preferences/move_user.html:35 +msgid "Confirm your password:" +msgstr "Conferma la password:" + +#: bookwyrm/templates/preferences/alias_user.html:39 +#: bookwyrm/templates/preferences/layout.html:28 +msgid "Aliases" +msgstr "Alias" + +#: bookwyrm/templates/preferences/alias_user.html:49 +msgid "Remove alias" +msgstr "Rimuovi alias" + #: 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 "Utenti bloccati" @@ -4036,7 +4137,7 @@ msgstr "Nuova password:" #: 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 "Elimina account" @@ -4081,7 +4182,7 @@ msgstr "Modifica profilo" #: 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 "Profilo" @@ -4158,18 +4259,47 @@ msgstr "Scarica il file" msgid "Account" msgstr "Profilo" -#: bookwyrm/templates/preferences/layout.html:31 +#: bookwyrm/templates/preferences/layout.html:32 +msgid "Move Account" +msgstr "Sposta account" + +#: bookwyrm/templates/preferences/layout.html:39 msgid "Data" msgstr "Dati" -#: bookwyrm/templates/preferences/layout.html:39 +#: bookwyrm/templates/preferences/layout.html:47 msgid "CSV export" msgstr "Esportazione CSV" -#: bookwyrm/templates/preferences/layout.html:42 +#: bookwyrm/templates/preferences/layout.html:50 msgid "Relationships" msgstr "Relazioni" +#: bookwyrm/templates/preferences/move_user.html:12 +msgid "Migrate account to another server" +msgstr "Migra l'account su un altro server" + +#: 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 "Spostare il tuo account avviserà tutti i tuoi follower e li dirigerà a seguire il nuovo account." + +#: 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" +" %(user)s sarà contrassegnato come spostato e non sarà individuabile o utilizzabile a meno che non annulli lo spostamento.\n" +" " + +#: 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 "Ricordati di aggiungere questo utente come alias dell'account di destinazione prima di provare a spostarti." + +#: 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 "Inserisci il nome utente per l'account verso cui ti spostare ad es. user@example.com:" + #: bookwyrm/templates/reading_progress/finish.html:5 #, python-format msgid "Finish \"%(book_title)s\"" @@ -4578,8 +4708,8 @@ msgid "Streams" msgstr "" #: bookwyrm/templates/settings/celery.html:32 -msgid "Broadcasts" -msgstr "Broadcast" +msgid "Broadcast" +msgstr "Trasmissione" #: bookwyrm/templates/settings/celery.html:38 msgid "Inbox" @@ -4929,7 +5059,7 @@ msgid "Details" msgstr "Dettagli" #: bookwyrm/templates/settings/federation/instance.html:53 -#: bookwyrm/templates/user/layout.html:69 +#: bookwyrm/templates/user/layout.html:79 msgid "Activity" msgstr "Attività" @@ -5117,7 +5247,7 @@ msgstr "Invia richiesta di invito" #: 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 "Inviti" @@ -5591,57 +5721,73 @@ msgid "Set instance default theme" msgstr "Imposta il tema predefinito dell'istanza" #: 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 aggiunto con successo" -#: bookwyrm/templates/settings/themes.html:26 +#: bookwyrm/templates/settings/themes.html:35 msgid "How to add a theme" msgstr "Come aggiungere un tema" -#: 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 "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 \n" "Language-Team: Lithuanian\n" "Language: lt\n" @@ -42,15 +42,15 @@ msgstr "{i} naudoja" msgid "Unlimited" msgstr "Neribota" -#: bookwyrm/forms/edit_user.py:88 +#: bookwyrm/forms/edit_user.py:104 msgid "Incorrect password" msgstr "Neteisingas slaptažodis" -#: bookwyrm/forms/edit_user.py:95 bookwyrm/forms/landing.py:90 +#: bookwyrm/forms/edit_user.py:111 bookwyrm/forms/landing.py:90 msgid "Password does not match" msgstr "Slaptažodis nesutampa" -#: bookwyrm/forms/edit_user.py:118 +#: bookwyrm/forms/edit_user.py:134 msgid "Incorrect Password" msgstr "Neteisingas slaptažodis" @@ -102,8 +102,8 @@ msgstr "Kaip pridėta į sąrašą" msgid "Book Title" msgstr "Knygos antraštė" -#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:156 -#: bookwyrm/templates/shelf/shelf.html:188 +#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:158 +#: bookwyrm/templates/shelf/shelf.html:190 #: bookwyrm/templates/snippets/create_status/review.html:32 msgid "Rating" msgstr "Įvertinimas" @@ -141,11 +141,11 @@ msgstr "Įspėjimas" msgid "Danger" msgstr "Pavojus" -#: bookwyrm/models/antispam.py:112 bookwyrm/models/antispam.py:146 +#: bookwyrm/models/antispam.py:113 bookwyrm/models/antispam.py:147 msgid "Automatically generated report" msgstr "Automatiškai sugeneruota ataskaita" -#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:47 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:48 #: bookwyrm/models/link.py:72 bookwyrm/templates/import/import_status.html:214 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" @@ -171,23 +171,23 @@ msgstr "Moderatorius ištrynė" msgid "Domain block" msgstr "Blokuoti pagal domeną" -#: bookwyrm/models/book.py:283 +#: bookwyrm/models/book.py:282 msgid "Audiobook" msgstr "Audioknyga" -#: bookwyrm/models/book.py:284 +#: bookwyrm/models/book.py:283 msgid "eBook" msgstr "Elektroninė knyga" -#: bookwyrm/models/book.py:285 +#: bookwyrm/models/book.py:284 msgid "Graphic novel" msgstr "Grafinė novelė" -#: bookwyrm/models/book.py:286 +#: bookwyrm/models/book.py:285 msgid "Hardcover" msgstr "Knyga kietais viršeliais" -#: bookwyrm/models/book.py:287 +#: bookwyrm/models/book.py:286 msgid "Paperback" msgstr "Knyga minkštais viršeliais" @@ -205,26 +205,26 @@ msgstr "Susijungę" msgid "Blocked" msgstr "Užblokuoti" -#: bookwyrm/models/fields.py:29 +#: bookwyrm/models/fields.py:35 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "%(value)s yra negaliojantis remote_id" -#: bookwyrm/models/fields.py:38 bookwyrm/models/fields.py:47 +#: bookwyrm/models/fields.py:44 bookwyrm/models/fields.py:53 #, python-format msgid "%(value)s is not a valid username" msgstr "%(value)s yra negaliojantis naudotojo vardas" -#: bookwyrm/models/fields.py:192 bookwyrm/templates/layout.html:128 +#: bookwyrm/models/fields.py:198 bookwyrm/templates/layout.html:129 #: bookwyrm/templates/ostatus/error.html:29 msgid "username" msgstr "naudotojo vardas" -#: bookwyrm/models/fields.py:197 +#: bookwyrm/models/fields.py:203 msgid "A user with that username already exists." msgstr "Toks naudotojo vardas jau egzistuoja." -#: bookwyrm/models/fields.py:216 +#: bookwyrm/models/fields.py:222 #: bookwyrm/templates/snippets/privacy-icons.html:3 #: bookwyrm/templates/snippets/privacy-icons.html:4 #: bookwyrm/templates/snippets/privacy_select.html:11 @@ -232,7 +232,7 @@ msgstr "Toks naudotojo vardas jau egzistuoja." msgid "Public" msgstr "Viešas" -#: bookwyrm/models/fields.py:217 +#: bookwyrm/models/fields.py:223 #: bookwyrm/templates/snippets/privacy-icons.html:7 #: bookwyrm/templates/snippets/privacy-icons.html:8 #: bookwyrm/templates/snippets/privacy_select.html:14 @@ -240,7 +240,7 @@ msgstr "Viešas" msgid "Unlisted" msgstr "Slaptas" -#: bookwyrm/models/fields.py:218 +#: bookwyrm/models/fields.py:224 #: bookwyrm/templates/snippets/privacy_select.html:17 #: bookwyrm/templates/user/relationships/followers.html:6 #: bookwyrm/templates/user/relationships/followers.html:11 @@ -249,7 +249,7 @@ msgstr "Slaptas" msgid "Followers" msgstr "Sekėjai" -#: bookwyrm/models/fields.py:219 +#: bookwyrm/models/fields.py:225 #: bookwyrm/templates/snippets/create_status/post_options_block.html:6 #: bookwyrm/templates/snippets/privacy-icons.html:15 #: bookwyrm/templates/snippets/privacy-icons.html:16 @@ -258,30 +258,29 @@ msgstr "Sekėjai" msgid "Private" msgstr "Privatu" -#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:174 +#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:174 #: bookwyrm/templates/settings/imports/imports.html:98 -#: bookwyrm/templates/settings/users/user_admin.html:81 -#: bookwyrm/templates/settings/users/user_info.html:28 +#: bookwyrm/templates/snippets/user_active_tag.html:8 msgid "Active" msgstr "Aktyvus" -#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:172 +#: bookwyrm/models/import_job.py:50 bookwyrm/templates/import/import.html:172 msgid "Complete" msgstr "Užbaigti" -#: bookwyrm/models/import_job.py:50 +#: bookwyrm/models/import_job.py:51 msgid "Stopped" msgstr "Sustabdyta" -#: bookwyrm/models/import_job.py:83 bookwyrm/models/import_job.py:91 +#: bookwyrm/models/import_job.py:84 bookwyrm/models/import_job.py:92 msgid "Import stopped" msgstr "Importavimas sustojo" -#: bookwyrm/models/import_job.py:363 bookwyrm/models/import_job.py:388 +#: bookwyrm/models/import_job.py:356 bookwyrm/models/import_job.py:381 msgid "Error loading book" msgstr "Klaida įkeliant knygą" -#: bookwyrm/models/import_job.py:372 +#: bookwyrm/models/import_job.py:365 msgid "Could not find a match for book" msgstr "Nepavyko rasti tokios knygos" @@ -352,122 +351,143 @@ msgstr "" msgid "Deleted item" msgstr "" -#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:307 +#: bookwyrm/models/user.py:33 bookwyrm/templates/book/book.html:307 msgid "Reviews" msgstr "Apžvalgos" -#: bookwyrm/models/user.py:33 +#: bookwyrm/models/user.py:34 msgid "Comments" msgstr "Komentarai" -#: bookwyrm/models/user.py:34 +#: bookwyrm/models/user.py:35 msgid "Quotations" msgstr "Citatos" -#: bookwyrm/models/user.py:35 +#: bookwyrm/models/user.py:36 msgid "Everything else" msgstr "Visa kita" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home Timeline" msgstr "Pagrindinė siena" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home" msgstr "Pagrindinis" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 msgid "Books Timeline" msgstr "Knygų siena" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 -#: bookwyrm/templates/user/layout.html:97 +#: bookwyrm/templates/user/layout.html:107 msgid "Books" msgstr "Knygos" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:313 msgid "English" msgstr "English (Anglų)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:314 msgid "Català (Catalan)" msgstr "Català (kataloniečių)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:315 msgid "Deutsch (German)" msgstr "Deutsch (Vokiečių)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:316 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Esperanto)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:317 msgid "Español (Spanish)" msgstr "Español (Ispanų)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:318 msgid "Euskara (Basque)" msgstr "Euskara (Baskų kalba)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:319 msgid "Galego (Galician)" msgstr "Galego (galisų)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:320 msgid "Italiano (Italian)" msgstr "Italų (Italian)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:321 msgid "Suomi (Finnish)" msgstr "Suomi (suomių)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:322 msgid "Français (French)" msgstr "Français (Prancūzų)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:323 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:324 msgid "Nederlands (Dutch)" msgstr "" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:325 msgid "Norsk (Norwegian)" msgstr "Norvegų (Norwegian)" -#: bookwyrm/settings.py:309 +#: bookwyrm/settings.py:326 msgid "Polski (Polish)" msgstr "Polski (lenkų)" -#: bookwyrm/settings.py:310 +#: bookwyrm/settings.py:327 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português brasileiro (Brazilijos portugalų)" -#: bookwyrm/settings.py:311 +#: bookwyrm/settings.py:328 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Europos portugalų)" -#: bookwyrm/settings.py:312 +#: bookwyrm/settings.py:329 msgid "Română (Romanian)" msgstr "Română (rumunų)" -#: bookwyrm/settings.py:313 +#: bookwyrm/settings.py:330 msgid "Svenska (Swedish)" msgstr "Svenska (Švedų)" -#: bookwyrm/settings.py:314 +#: bookwyrm/settings.py:331 +msgid "Українська (Ukrainian)" +msgstr "" + +#: bookwyrm/settings.py:332 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Supaprastinta kinų)" -#: bookwyrm/settings.py:315 +#: bookwyrm/settings.py:333 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Tradicinė kinų)" +#: bookwyrm/templates/403.html:5 +msgid "Oh no!" +msgstr "" + +#: bookwyrm/templates/403.html:9 bookwyrm/templates/landing/invite.html:21 +msgid "Permission Denied" +msgstr "Prieiga draudžiama" + +#: bookwyrm/templates/403.html:11 +#, python-format +msgid "You do not have permission to view this page or perform this action. Your user permission level is %(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 \n" "Language-Team: Dutch\n" "Language: nl\n" @@ -42,15 +42,15 @@ msgstr "{i} keer gebruikt" msgid "Unlimited" msgstr "Onbeperkt" -#: bookwyrm/forms/edit_user.py:88 +#: bookwyrm/forms/edit_user.py:104 msgid "Incorrect password" msgstr "Onjuist wachtwoord" -#: bookwyrm/forms/edit_user.py:95 bookwyrm/forms/landing.py:90 +#: bookwyrm/forms/edit_user.py:111 bookwyrm/forms/landing.py:90 msgid "Password does not match" msgstr "Wachtwoord komt niet overeen" -#: bookwyrm/forms/edit_user.py:118 +#: bookwyrm/forms/edit_user.py:134 msgid "Incorrect Password" msgstr "Onjuist wachtwoord" @@ -102,8 +102,8 @@ msgstr "Lijst volgorde" msgid "Book Title" msgstr "Boektitel" -#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:156 -#: bookwyrm/templates/shelf/shelf.html:188 +#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:158 +#: bookwyrm/templates/shelf/shelf.html:190 #: bookwyrm/templates/snippets/create_status/review.html:32 msgid "Rating" msgstr "Beoordeling" @@ -141,11 +141,11 @@ msgstr "Waarschuwing" msgid "Danger" msgstr "Gevaar" -#: bookwyrm/models/antispam.py:112 bookwyrm/models/antispam.py:146 +#: bookwyrm/models/antispam.py:113 bookwyrm/models/antispam.py:147 msgid "Automatically generated report" msgstr "Automatisch gegenereerd rapport" -#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:47 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:48 #: bookwyrm/models/link.py:72 bookwyrm/templates/import/import_status.html:214 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" @@ -171,23 +171,23 @@ msgstr "Verwijdering moderator" msgid "Domain block" msgstr "Domeinblokkade" -#: bookwyrm/models/book.py:283 +#: bookwyrm/models/book.py:282 msgid "Audiobook" msgstr "Luisterboek" -#: bookwyrm/models/book.py:284 +#: bookwyrm/models/book.py:283 msgid "eBook" msgstr "eBook" -#: bookwyrm/models/book.py:285 +#: bookwyrm/models/book.py:284 msgid "Graphic novel" msgstr "Striproman" -#: bookwyrm/models/book.py:286 +#: bookwyrm/models/book.py:285 msgid "Hardcover" msgstr "Harde kaft" -#: bookwyrm/models/book.py:287 +#: bookwyrm/models/book.py:286 msgid "Paperback" msgstr "Zachte kaft" @@ -205,26 +205,26 @@ msgstr "Gefedereerd" msgid "Blocked" msgstr "Geblokkeerd" -#: bookwyrm/models/fields.py:29 +#: bookwyrm/models/fields.py:35 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "%(value)s is geen geldige remote_id" -#: bookwyrm/models/fields.py:38 bookwyrm/models/fields.py:47 +#: bookwyrm/models/fields.py:44 bookwyrm/models/fields.py:53 #, python-format msgid "%(value)s is not a valid username" msgstr "%(value)s is geen geldige gebruikersnaam" -#: bookwyrm/models/fields.py:192 bookwyrm/templates/layout.html:128 +#: bookwyrm/models/fields.py:198 bookwyrm/templates/layout.html:129 #: bookwyrm/templates/ostatus/error.html:29 msgid "username" msgstr "gebruikersnaam" -#: bookwyrm/models/fields.py:197 +#: bookwyrm/models/fields.py:203 msgid "A user with that username already exists." msgstr "Er bestaat al een gebruiker met deze gebruikersnaam." -#: bookwyrm/models/fields.py:216 +#: bookwyrm/models/fields.py:222 #: bookwyrm/templates/snippets/privacy-icons.html:3 #: bookwyrm/templates/snippets/privacy-icons.html:4 #: bookwyrm/templates/snippets/privacy_select.html:11 @@ -232,7 +232,7 @@ msgstr "Er bestaat al een gebruiker met deze gebruikersnaam." msgid "Public" msgstr "Openbaar" -#: bookwyrm/models/fields.py:217 +#: bookwyrm/models/fields.py:223 #: bookwyrm/templates/snippets/privacy-icons.html:7 #: bookwyrm/templates/snippets/privacy-icons.html:8 #: bookwyrm/templates/snippets/privacy_select.html:14 @@ -240,7 +240,7 @@ msgstr "Openbaar" msgid "Unlisted" msgstr "Niet vermeld" -#: bookwyrm/models/fields.py:218 +#: bookwyrm/models/fields.py:224 #: bookwyrm/templates/snippets/privacy_select.html:17 #: bookwyrm/templates/user/relationships/followers.html:6 #: bookwyrm/templates/user/relationships/followers.html:11 @@ -249,7 +249,7 @@ msgstr "Niet vermeld" msgid "Followers" msgstr "Volgers" -#: bookwyrm/models/fields.py:219 +#: bookwyrm/models/fields.py:225 #: bookwyrm/templates/snippets/create_status/post_options_block.html:6 #: bookwyrm/templates/snippets/privacy-icons.html:15 #: bookwyrm/templates/snippets/privacy-icons.html:16 @@ -258,30 +258,29 @@ msgstr "Volgers" msgid "Private" msgstr "Privé" -#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:174 +#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:174 #: bookwyrm/templates/settings/imports/imports.html:98 -#: bookwyrm/templates/settings/users/user_admin.html:81 -#: bookwyrm/templates/settings/users/user_info.html:28 +#: bookwyrm/templates/snippets/user_active_tag.html:8 msgid "Active" msgstr "Actief" -#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:172 +#: bookwyrm/models/import_job.py:50 bookwyrm/templates/import/import.html:172 msgid "Complete" msgstr "Voltooid" -#: bookwyrm/models/import_job.py:50 +#: bookwyrm/models/import_job.py:51 msgid "Stopped" msgstr "Gestopt" -#: bookwyrm/models/import_job.py:83 bookwyrm/models/import_job.py:91 +#: bookwyrm/models/import_job.py:84 bookwyrm/models/import_job.py:92 msgid "Import stopped" msgstr "Import gestopt" -#: bookwyrm/models/import_job.py:363 bookwyrm/models/import_job.py:388 +#: bookwyrm/models/import_job.py:356 bookwyrm/models/import_job.py:381 msgid "Error loading book" msgstr "Fout bij laden boek" -#: bookwyrm/models/import_job.py:372 +#: bookwyrm/models/import_job.py:365 msgid "Could not find a match for book" msgstr "Kan geen match vinden voor het boek" @@ -352,122 +351,143 @@ msgstr "Domein goedgekeurd" msgid "Deleted item" msgstr "Item verwijderd" -#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:307 +#: bookwyrm/models/user.py:33 bookwyrm/templates/book/book.html:307 msgid "Reviews" msgstr "Recensies" -#: bookwyrm/models/user.py:33 +#: bookwyrm/models/user.py:34 msgid "Comments" msgstr "Opmerkingen" -#: bookwyrm/models/user.py:34 +#: bookwyrm/models/user.py:35 msgid "Quotations" msgstr "Quotes" -#: bookwyrm/models/user.py:35 +#: bookwyrm/models/user.py:36 msgid "Everything else" msgstr "Overig" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home Timeline" msgstr "Tijdlijnen" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home" msgstr "Start" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 msgid "Books Timeline" msgstr "Boeken tijdlijn" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 -#: bookwyrm/templates/user/layout.html:97 +#: bookwyrm/templates/user/layout.html:107 msgid "Books" msgstr "Boeken" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:313 msgid "English" msgstr "Engels (English)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:314 msgid "Català (Catalan)" msgstr "Català (Catalaans)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:315 msgid "Deutsch (German)" msgstr "Duits (Deutsch)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:316 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Esperanto)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:317 msgid "Español (Spanish)" msgstr "Spaans (Español)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:318 msgid "Euskara (Basque)" msgstr "Euskara (Baskisch)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:319 msgid "Galego (Galician)" msgstr "Galego (Galicisch)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:320 msgid "Italiano (Italian)" msgstr "Italiano (Italiaans)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:321 msgid "Suomi (Finnish)" msgstr "Suomi (Fins)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:322 msgid "Français (French)" msgstr "Frans (Français)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:323 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Litouws)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:324 msgid "Nederlands (Dutch)" msgstr "Nederlands" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:325 msgid "Norsk (Norwegian)" msgstr "Norsk (Noors)" -#: bookwyrm/settings.py:309 +#: bookwyrm/settings.py:326 msgid "Polski (Polish)" msgstr "Polski (Pools)" -#: bookwyrm/settings.py:310 +#: bookwyrm/settings.py:327 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Braziliaans-Portugees)" -#: bookwyrm/settings.py:311 +#: bookwyrm/settings.py:328 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Europeaans Portugees)" -#: bookwyrm/settings.py:312 +#: bookwyrm/settings.py:329 msgid "Română (Romanian)" msgstr "Română (Roemeens)" -#: bookwyrm/settings.py:313 +#: bookwyrm/settings.py:330 msgid "Svenska (Swedish)" msgstr "Svenska (Zweeds)" -#: bookwyrm/settings.py:314 +#: bookwyrm/settings.py:331 +msgid "Українська (Ukrainian)" +msgstr "" + +#: bookwyrm/settings.py:332 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Vereenvoudigd Chinees)" -#: bookwyrm/settings.py:315 +#: bookwyrm/settings.py:333 msgid "繁體中文 (Traditional Chinese)" msgstr "简体中文 (Traditioneel Chinees)" +#: bookwyrm/templates/403.html:5 +msgid "Oh no!" +msgstr "" + +#: bookwyrm/templates/403.html:9 bookwyrm/templates/landing/invite.html:21 +msgid "Permission Denied" +msgstr "Toestemming geweigerd" + +#: bookwyrm/templates/403.html:11 +#, python-format +msgid "You do not have permission to view this page or perform this action. Your user permission level is %(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 \n" "Language-Team: Norwegian\n" "Language: no\n" @@ -42,15 +42,15 @@ msgstr "{i} ganger" msgid "Unlimited" msgstr "Ubegrenset" -#: bookwyrm/forms/edit_user.py:88 +#: bookwyrm/forms/edit_user.py:104 msgid "Incorrect password" msgstr "Feil passord" -#: bookwyrm/forms/edit_user.py:95 bookwyrm/forms/landing.py:90 +#: bookwyrm/forms/edit_user.py:111 bookwyrm/forms/landing.py:90 msgid "Password does not match" msgstr "Passordet samsvarer ikke" -#: bookwyrm/forms/edit_user.py:118 +#: bookwyrm/forms/edit_user.py:134 msgid "Incorrect Password" msgstr "Feil passord" @@ -102,8 +102,8 @@ msgstr "Liste rekkefølge" msgid "Book Title" msgstr "Boktittel" -#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:156 -#: bookwyrm/templates/shelf/shelf.html:188 +#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:158 +#: bookwyrm/templates/shelf/shelf.html:190 #: bookwyrm/templates/snippets/create_status/review.html:32 msgid "Rating" msgstr "Vurdering" @@ -141,11 +141,11 @@ msgstr "Advarsel" msgid "Danger" msgstr "Fare" -#: bookwyrm/models/antispam.py:112 bookwyrm/models/antispam.py:146 +#: bookwyrm/models/antispam.py:113 bookwyrm/models/antispam.py:147 msgid "Automatically generated report" msgstr "Automatisk generert rapport" -#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:47 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:48 #: bookwyrm/models/link.py:72 bookwyrm/templates/import/import_status.html:214 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" @@ -171,23 +171,23 @@ msgstr "Moderatør sletting" msgid "Domain block" msgstr "Domeneblokkering" -#: bookwyrm/models/book.py:283 +#: bookwyrm/models/book.py:282 msgid "Audiobook" msgstr "Lydbok" -#: bookwyrm/models/book.py:284 +#: bookwyrm/models/book.py:283 msgid "eBook" msgstr "e-bok" -#: bookwyrm/models/book.py:285 +#: bookwyrm/models/book.py:284 msgid "Graphic novel" msgstr "Tegneserie" -#: bookwyrm/models/book.py:286 +#: bookwyrm/models/book.py:285 msgid "Hardcover" msgstr "Innbundet" -#: bookwyrm/models/book.py:287 +#: bookwyrm/models/book.py:286 msgid "Paperback" msgstr "Paperback" @@ -205,26 +205,26 @@ msgstr "Føderert" msgid "Blocked" msgstr "Blokkert" -#: bookwyrm/models/fields.py:29 +#: bookwyrm/models/fields.py:35 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "%(value)s er en ugyldig remote_id" -#: bookwyrm/models/fields.py:38 bookwyrm/models/fields.py:47 +#: bookwyrm/models/fields.py:44 bookwyrm/models/fields.py:53 #, python-format msgid "%(value)s is not a valid username" msgstr "%(value)s er et ugyldig brukernavn" -#: bookwyrm/models/fields.py:192 bookwyrm/templates/layout.html:128 +#: bookwyrm/models/fields.py:198 bookwyrm/templates/layout.html:129 #: bookwyrm/templates/ostatus/error.html:29 msgid "username" msgstr "brukernavn" -#: bookwyrm/models/fields.py:197 +#: bookwyrm/models/fields.py:203 msgid "A user with that username already exists." msgstr "En bruker med det brukernavnet eksisterer allerede." -#: bookwyrm/models/fields.py:216 +#: bookwyrm/models/fields.py:222 #: bookwyrm/templates/snippets/privacy-icons.html:3 #: bookwyrm/templates/snippets/privacy-icons.html:4 #: bookwyrm/templates/snippets/privacy_select.html:11 @@ -232,7 +232,7 @@ msgstr "En bruker med det brukernavnet eksisterer allerede." msgid "Public" msgstr "Offentlig" -#: bookwyrm/models/fields.py:217 +#: bookwyrm/models/fields.py:223 #: bookwyrm/templates/snippets/privacy-icons.html:7 #: bookwyrm/templates/snippets/privacy-icons.html:8 #: bookwyrm/templates/snippets/privacy_select.html:14 @@ -240,7 +240,7 @@ msgstr "Offentlig" msgid "Unlisted" msgstr "Uoppført" -#: bookwyrm/models/fields.py:218 +#: bookwyrm/models/fields.py:224 #: bookwyrm/templates/snippets/privacy_select.html:17 #: bookwyrm/templates/user/relationships/followers.html:6 #: bookwyrm/templates/user/relationships/followers.html:11 @@ -249,7 +249,7 @@ msgstr "Uoppført" msgid "Followers" msgstr "Følgere" -#: bookwyrm/models/fields.py:219 +#: bookwyrm/models/fields.py:225 #: bookwyrm/templates/snippets/create_status/post_options_block.html:6 #: bookwyrm/templates/snippets/privacy-icons.html:15 #: bookwyrm/templates/snippets/privacy-icons.html:16 @@ -258,30 +258,29 @@ msgstr "Følgere" msgid "Private" msgstr "Privat" -#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:174 +#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:174 #: bookwyrm/templates/settings/imports/imports.html:98 -#: bookwyrm/templates/settings/users/user_admin.html:81 -#: bookwyrm/templates/settings/users/user_info.html:28 +#: bookwyrm/templates/snippets/user_active_tag.html:8 msgid "Active" msgstr "Aktiv" -#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:172 +#: bookwyrm/models/import_job.py:50 bookwyrm/templates/import/import.html:172 msgid "Complete" msgstr "Ferdig" -#: bookwyrm/models/import_job.py:50 +#: bookwyrm/models/import_job.py:51 msgid "Stopped" msgstr "Stoppet" -#: bookwyrm/models/import_job.py:83 bookwyrm/models/import_job.py:91 +#: bookwyrm/models/import_job.py:84 bookwyrm/models/import_job.py:92 msgid "Import stopped" msgstr "Importering stoppet" -#: bookwyrm/models/import_job.py:363 bookwyrm/models/import_job.py:388 +#: bookwyrm/models/import_job.py:356 bookwyrm/models/import_job.py:381 msgid "Error loading book" msgstr "Feilet ved lasting av bok" -#: bookwyrm/models/import_job.py:372 +#: bookwyrm/models/import_job.py:365 msgid "Could not find a match for book" msgstr "Fant ikke den boka" @@ -314,31 +313,31 @@ msgstr "" #: bookwyrm/models/report.py:86 msgid "Re-opened report" -msgstr "" +msgstr "Gjenåpnet rapport" #: bookwyrm/models/report.py:87 msgid "Messaged reporter" -msgstr "" +msgstr "Melding sendt til rapportør" #: bookwyrm/models/report.py:88 msgid "Messaged reported user" -msgstr "" +msgstr "Melding sendt til rapportert bruker" #: bookwyrm/models/report.py:89 msgid "Suspended user" -msgstr "" +msgstr "Deaktivert bruker" #: bookwyrm/models/report.py:90 msgid "Un-suspended user" -msgstr "" +msgstr "Reaktivert bruker" #: bookwyrm/models/report.py:91 msgid "Changed user permission level" -msgstr "" +msgstr "Endret brukerens rettighetsnivå" #: bookwyrm/models/report.py:92 msgid "Deleted user account" -msgstr "" +msgstr "Slettet brukerkonto" #: bookwyrm/models/report.py:93 msgid "Blocked domain" @@ -352,122 +351,143 @@ msgstr "" msgid "Deleted item" msgstr "" -#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:307 +#: bookwyrm/models/user.py:33 bookwyrm/templates/book/book.html:307 msgid "Reviews" msgstr "Anmeldelser" -#: bookwyrm/models/user.py:33 +#: bookwyrm/models/user.py:34 msgid "Comments" msgstr "Kommentarer" -#: bookwyrm/models/user.py:34 +#: bookwyrm/models/user.py:35 msgid "Quotations" msgstr "Sitater" -#: bookwyrm/models/user.py:35 +#: bookwyrm/models/user.py:36 msgid "Everything else" msgstr "Andre ting" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home Timeline" msgstr "Lokal tidslinje" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home" msgstr "Hjem" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 msgid "Books Timeline" msgstr "Boktidslinja" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 -#: bookwyrm/templates/user/layout.html:97 +#: bookwyrm/templates/user/layout.html:107 msgid "Books" msgstr "Bøker" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:313 msgid "English" msgstr "English (Engelsk)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:314 msgid "Català (Catalan)" msgstr "Català (katalansk)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:315 msgid "Deutsch (German)" msgstr "Deutsch (Tysk)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:316 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Esperanto)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:317 msgid "Español (Spanish)" msgstr "Español (Spansk)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:318 msgid "Euskara (Basque)" msgstr "Euskara (Baskisk)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:319 msgid "Galego (Galician)" msgstr "Galego (Gallisk)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:320 msgid "Italiano (Italian)" msgstr "Italiano (Italiensk)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:321 msgid "Suomi (Finnish)" msgstr "Suomi (finsk)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:322 msgid "Français (French)" msgstr "Français (Fransk)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:323 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Litauisk)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:324 msgid "Nederlands (Dutch)" msgstr "" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:325 msgid "Norsk (Norwegian)" msgstr "Norsk (Norsk)" -#: bookwyrm/settings.py:309 +#: bookwyrm/settings.py:326 msgid "Polski (Polish)" msgstr "Polski (Polsk)" -#: bookwyrm/settings.py:310 +#: bookwyrm/settings.py:327 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português - Brasil (Brasiliansk portugisisk)" -#: bookwyrm/settings.py:311 +#: bookwyrm/settings.py:328 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Europeisk Portugisisk)" -#: bookwyrm/settings.py:312 +#: bookwyrm/settings.py:329 msgid "Română (Romanian)" msgstr "Română (romansk)" -#: bookwyrm/settings.py:313 +#: bookwyrm/settings.py:330 msgid "Svenska (Swedish)" msgstr "Svenska (Svensk)" -#: bookwyrm/settings.py:314 +#: bookwyrm/settings.py:331 +msgid "Українська (Ukrainian)" +msgstr "" + +#: bookwyrm/settings.py:332 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Forenklet kinesisk)" -#: bookwyrm/settings.py:315 +#: bookwyrm/settings.py:333 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Tradisjonelt kinesisk)" +#: bookwyrm/templates/403.html:5 +msgid "Oh no!" +msgstr "" + +#: bookwyrm/templates/403.html:9 bookwyrm/templates/landing/invite.html:21 +msgid "Permission Denied" +msgstr "Tilgang nektet" + +#: bookwyrm/templates/403.html:11 +#, python-format +msgid "You do not have permission to view this page or perform this action. Your user permission level is %(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 \n" "Language-Team: Portuguese, Brazilian\n" "Language: pt\n" @@ -42,15 +42,15 @@ msgstr "{i} usos" msgid "Unlimited" msgstr "Ilimitado" -#: bookwyrm/forms/edit_user.py:88 +#: bookwyrm/forms/edit_user.py:104 msgid "Incorrect password" msgstr "Senha incorreta" -#: bookwyrm/forms/edit_user.py:95 bookwyrm/forms/landing.py:90 +#: bookwyrm/forms/edit_user.py:111 bookwyrm/forms/landing.py:90 msgid "Password does not match" msgstr "As senhas não correspondem" -#: bookwyrm/forms/edit_user.py:118 +#: bookwyrm/forms/edit_user.py:134 msgid "Incorrect Password" msgstr "Senha incorreta" @@ -102,8 +102,8 @@ msgstr "Ordem de inserção" msgid "Book Title" msgstr "Título do livro" -#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:156 -#: bookwyrm/templates/shelf/shelf.html:188 +#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:158 +#: bookwyrm/templates/shelf/shelf.html:190 #: bookwyrm/templates/snippets/create_status/review.html:32 msgid "Rating" msgstr "Avaliação" @@ -141,11 +141,11 @@ msgstr "Atenção" msgid "Danger" msgstr "Perigo" -#: bookwyrm/models/antispam.py:112 bookwyrm/models/antispam.py:146 +#: bookwyrm/models/antispam.py:113 bookwyrm/models/antispam.py:147 msgid "Automatically generated report" msgstr "Relatório gerado automaticamente" -#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:47 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:48 #: bookwyrm/models/link.py:72 bookwyrm/templates/import/import_status.html:214 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" @@ -171,23 +171,23 @@ msgstr "Exclusão de moderador" msgid "Domain block" msgstr "Bloqueio de domínio" -#: bookwyrm/models/book.py:283 +#: bookwyrm/models/book.py:282 msgid "Audiobook" msgstr "Audiolivro" -#: bookwyrm/models/book.py:284 +#: bookwyrm/models/book.py:283 msgid "eBook" msgstr "e-book" -#: bookwyrm/models/book.py:285 +#: bookwyrm/models/book.py:284 msgid "Graphic novel" msgstr "Graphic novel" -#: bookwyrm/models/book.py:286 +#: bookwyrm/models/book.py:285 msgid "Hardcover" msgstr "Capa dura" -#: bookwyrm/models/book.py:287 +#: bookwyrm/models/book.py:286 msgid "Paperback" msgstr "Capa mole" @@ -205,26 +205,26 @@ msgstr "Federado" msgid "Blocked" msgstr "Bloqueado" -#: bookwyrm/models/fields.py:29 +#: bookwyrm/models/fields.py:35 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "%(value)s não é um remote_id válido" -#: bookwyrm/models/fields.py:38 bookwyrm/models/fields.py:47 +#: bookwyrm/models/fields.py:44 bookwyrm/models/fields.py:53 #, python-format msgid "%(value)s is not a valid username" msgstr "%(value)s não é um nome de usuário válido" -#: bookwyrm/models/fields.py:192 bookwyrm/templates/layout.html:128 +#: bookwyrm/models/fields.py:198 bookwyrm/templates/layout.html:129 #: bookwyrm/templates/ostatus/error.html:29 msgid "username" msgstr "nome de usuário" -#: bookwyrm/models/fields.py:197 +#: bookwyrm/models/fields.py:203 msgid "A user with that username already exists." msgstr "Já existe um usuário com este nome." -#: bookwyrm/models/fields.py:216 +#: bookwyrm/models/fields.py:222 #: bookwyrm/templates/snippets/privacy-icons.html:3 #: bookwyrm/templates/snippets/privacy-icons.html:4 #: bookwyrm/templates/snippets/privacy_select.html:11 @@ -232,7 +232,7 @@ msgstr "Já existe um usuário com este nome." msgid "Public" msgstr "Público" -#: bookwyrm/models/fields.py:217 +#: bookwyrm/models/fields.py:223 #: bookwyrm/templates/snippets/privacy-icons.html:7 #: bookwyrm/templates/snippets/privacy-icons.html:8 #: bookwyrm/templates/snippets/privacy_select.html:14 @@ -240,7 +240,7 @@ msgstr "Público" msgid "Unlisted" msgstr "Não listado" -#: bookwyrm/models/fields.py:218 +#: bookwyrm/models/fields.py:224 #: bookwyrm/templates/snippets/privacy_select.html:17 #: bookwyrm/templates/user/relationships/followers.html:6 #: bookwyrm/templates/user/relationships/followers.html:11 @@ -249,7 +249,7 @@ msgstr "Não listado" msgid "Followers" msgstr "Seguidores" -#: bookwyrm/models/fields.py:219 +#: bookwyrm/models/fields.py:225 #: bookwyrm/templates/snippets/create_status/post_options_block.html:6 #: bookwyrm/templates/snippets/privacy-icons.html:15 #: bookwyrm/templates/snippets/privacy-icons.html:16 @@ -258,30 +258,29 @@ msgstr "Seguidores" msgid "Private" msgstr "Particular" -#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:174 +#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:174 #: bookwyrm/templates/settings/imports/imports.html:98 -#: bookwyrm/templates/settings/users/user_admin.html:81 -#: bookwyrm/templates/settings/users/user_info.html:28 +#: bookwyrm/templates/snippets/user_active_tag.html:8 msgid "Active" msgstr "Ativo" -#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:172 +#: bookwyrm/models/import_job.py:50 bookwyrm/templates/import/import.html:172 msgid "Complete" msgstr "Completo" -#: bookwyrm/models/import_job.py:50 +#: bookwyrm/models/import_job.py:51 msgid "Stopped" msgstr "Parado" -#: bookwyrm/models/import_job.py:83 bookwyrm/models/import_job.py:91 +#: bookwyrm/models/import_job.py:84 bookwyrm/models/import_job.py:92 msgid "Import stopped" msgstr "Importação interrompida" -#: bookwyrm/models/import_job.py:363 bookwyrm/models/import_job.py:388 +#: bookwyrm/models/import_job.py:356 bookwyrm/models/import_job.py:381 msgid "Error loading book" msgstr "Erro ao carregar livro" -#: bookwyrm/models/import_job.py:372 +#: bookwyrm/models/import_job.py:365 msgid "Could not find a match for book" msgstr "Não foi possível encontrar o livro" @@ -352,122 +351,143 @@ msgstr "" msgid "Deleted item" msgstr "" -#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:307 +#: bookwyrm/models/user.py:33 bookwyrm/templates/book/book.html:307 msgid "Reviews" msgstr "Resenhas" -#: bookwyrm/models/user.py:33 +#: bookwyrm/models/user.py:34 msgid "Comments" msgstr "Comentários" -#: bookwyrm/models/user.py:34 +#: bookwyrm/models/user.py:35 msgid "Quotations" msgstr "Citações" -#: bookwyrm/models/user.py:35 +#: bookwyrm/models/user.py:36 msgid "Everything else" msgstr "Todo o resto" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home Timeline" msgstr "Linha do tempo" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home" msgstr "Página inicial" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 msgid "Books Timeline" msgstr "Linha do tempo dos livros" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 -#: bookwyrm/templates/user/layout.html:97 +#: bookwyrm/templates/user/layout.html:107 msgid "Books" msgstr "Livros" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:313 msgid "English" msgstr "English (Inglês)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:314 msgid "Català (Catalan)" msgstr "Català (Catalão)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:315 msgid "Deutsch (German)" msgstr "Deutsch (Alemão)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:316 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Esperanto)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:317 msgid "Español (Spanish)" msgstr "Español (Espanhol)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:318 msgid "Euskara (Basque)" msgstr "Euskara (Basco)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:319 msgid "Galego (Galician)" msgstr "Galego (Galego)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:320 msgid "Italiano (Italian)" msgstr "Italiano (Italiano)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:321 msgid "Suomi (Finnish)" msgstr "Suomi (Finlandês)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:322 msgid "Français (French)" msgstr "Français (Francês)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:323 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Lituano)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:324 msgid "Nederlands (Dutch)" msgstr "" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:325 msgid "Norsk (Norwegian)" msgstr "Norsk (Norueguês)" -#: bookwyrm/settings.py:309 +#: bookwyrm/settings.py:326 msgid "Polski (Polish)" msgstr "Polski (Polonês)" -#: bookwyrm/settings.py:310 +#: bookwyrm/settings.py:327 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Português do Brasil)" -#: bookwyrm/settings.py:311 +#: bookwyrm/settings.py:328 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Português Europeu)" -#: bookwyrm/settings.py:312 +#: bookwyrm/settings.py:329 msgid "Română (Romanian)" msgstr "Română (Romeno)" -#: bookwyrm/settings.py:313 +#: bookwyrm/settings.py:330 msgid "Svenska (Swedish)" msgstr "Svenska (Sueco)" -#: bookwyrm/settings.py:314 +#: bookwyrm/settings.py:331 +msgid "Українська (Ukrainian)" +msgstr "" + +#: bookwyrm/settings.py:332 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Chinês simplificado)" -#: bookwyrm/settings.py:315 +#: bookwyrm/settings.py:333 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Chinês tradicional)" +#: bookwyrm/templates/403.html:5 +msgid "Oh no!" +msgstr "" + +#: bookwyrm/templates/403.html:9 bookwyrm/templates/landing/invite.html:21 +msgid "Permission Denied" +msgstr "Permissão negada" + +#: bookwyrm/templates/403.html:11 +#, python-format +msgid "You do not have permission to view this page or perform this action. Your user permission level is %(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
    for a total of %(pages_total)s pages!" +msgid_plural "In %(year)s, %(display_name)s read %(books_total)s books
    for a total of %(pages_total)s pages!" +msgstr[0] "У %(year)s, користувачем %(display_name)s була прочитана %(books_total)s книга
    або %(pages_total)s сторінок загалом!" +msgstr[1] "У %(year)s, користувачем %(display_name)s було прочитано %(books_total)s книги
    або %(pages_total)s сторінок загалом!" +msgstr[2] "У %(year)s, користувачем %(display_name)s було прочитано %(books_total)s книг
    або %(pages_total)s сторінок загалом!" +msgstr[3] "У %(year)s, користувачем %(display_name)s було прочитано %(books_total)s книг
    або %(pages_total)s сторінок загалом!" + +#: bookwyrm/templates/annual_summary/layout.html:124 +msgid "That’s great!" +msgstr "Чудово!" + +#: bookwyrm/templates/annual_summary/layout.html:128 +#, python-format +msgid "That makes an average of %(pages)s pages per book." +msgstr "Це становить в середньому %(pages)s сторінок на книгу." + +#: bookwyrm/templates/annual_summary/layout.html:134 +#, 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] "(Дані про кількість сторінок не було знайдено для %(no_page_number)s книги)" +msgstr[1] "(Дані про кількість сторінок не було знайдено для %(no_page_number)s книг)" +msgstr[2] "(Дані про кількість сторінок не було знайдено для %(no_page_number)s книг)" +msgstr[3] "(Дані про кількість сторінок не було знайдено для %(no_page_number)s книг)" + +#: bookwyrm/templates/annual_summary/layout.html:150 +msgid "Their shortest read this year…" +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:65 +#: bookwyrm/templates/discover/large-book.html:22 +#: bookwyrm/templates/landing/large-book.html:26 +#: bookwyrm/templates/landing/small-book.html:18 +msgid "by" +msgstr "від" + +#: bookwyrm/templates/annual_summary/layout.html:163 +#: bookwyrm/templates/annual_summary/layout.html:184 +#, python-format +msgid "%(pages)s pages" +msgstr "%(pages)s сторінок" + +#: bookwyrm/templates/annual_summary/layout.html:171 +msgid "…and the longest" +msgstr "…і найдовший" + +#: bookwyrm/templates/annual_summary/layout.html:202 +#, python-format +msgid "%(display_name)s set a goal of reading %(goal)s book in %(year)s,
    and achieved %(goal_percent)s%% of that goal" +msgid_plural "%(display_name)s set a goal of reading %(goal)s books in %(year)s,
    and achieved %(goal_percent)s%% of that goal" +msgstr[0] "%(display_name)s встановив(-ла) ціль прочитати %(goal)s книгу в %(year)s,
    і досяг(-ла) %(goal_percent)s%% від цієї мети" +msgstr[1] "%(display_name)s встановив(-ла) ціль прочитати %(goal)s книги в %(year)s,
    і досяг(-ла) %(goal_percent)s%% від цієї мети" +msgstr[2] "%(display_name)s встановив(-ла) ціль прочитати %(goal)s книги в %(year)s,
    і досяг(-ла) %(goal_percent)s%% від цієї мети" +msgstr[3] "%(display_name)s встановив(-ла) ціль прочитати %(goal)s книги в %(year)s,
    і досяг(-ла) %(goal_percent)s%% від цієї мети" + +#: bookwyrm/templates/annual_summary/layout.html:211 +msgid "Way to go!" +msgstr "Так тримати!" + +#: bookwyrm/templates/annual_summary/layout.html:226 +#, python-format +msgid "%(display_name)s left %(ratings_total)s rating,
    their average rating is %(rating_average)s" +msgid_plural "%(display_name)s left %(ratings_total)s ratings,
    their average rating is %(rating_average)s" +msgstr[0] "%(display_name)s залишив(-ла) %(ratings_total)s оцінку,
    вона дорівнює %(rating_average)s" +msgstr[1] "%(display_name)s залишив(-ла) %(ratings_total)s оцінок,
    їх середнє значення - %(rating_average)s" +msgstr[2] "%(display_name)s залишив(-ла) %(ratings_total)s оцінок,
    їх середнє значення - %(rating_average)s" +msgstr[3] "%(display_name)s залишив(-ла) %(ratings_total)s оцінок,
    їх середнє значення - %(rating_average)s" + +#: bookwyrm/templates/annual_summary/layout.html:240 +msgid "Their best rated review" +msgstr "Їх найкраща рецензія" + +#: bookwyrm/templates/annual_summary/layout.html:253 +#, python-format +msgid "Their rating: %(rating)s" +msgstr "Їхній рейтинг: %(rating)s" + +#: bookwyrm/templates/annual_summary/layout.html:270 +#, python-format +msgid "All the books %(display_name)s read in %(year)s" +msgstr "Всі книжки %(display_name)s прочитані в %(year)s" + +#: bookwyrm/templates/author/author.html:19 +#: bookwyrm/templates/author/author.html:20 +msgid "Edit Author" +msgstr "Редагувати Автора" + +#: bookwyrm/templates/author/author.html:36 +msgid "Author details" +msgstr "Подробиці про автора" + +#: bookwyrm/templates/author/author.html:40 +#: bookwyrm/templates/author/edit_author.html:42 +msgid "Aliases:" +msgstr "Псевдоніми:" + +#: bookwyrm/templates/author/author.html:49 +msgid "Born:" +msgstr "Дата народження:" + +#: bookwyrm/templates/author/author.html:56 +msgid "Died:" +msgstr "Дата смерті:" + +#: bookwyrm/templates/author/author.html:66 +msgid "External links" +msgstr "Зовнішні посилання" + +#: bookwyrm/templates/author/author.html:71 +msgid "Wikipedia" +msgstr "Вікіпедія" + +#: bookwyrm/templates/author/author.html:79 +msgid "Website" +msgstr "Вебсайт" + +#: bookwyrm/templates/author/author.html:87 +msgid "View ISNI record" +msgstr "Переглянути запис ISNI" + +#: bookwyrm/templates/author/author.html:95 +#: 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:142 +#: bookwyrm/templates/book/sync_modal.html:5 +msgid "Load data" +msgstr "Завантажити данні" + +#: bookwyrm/templates/author/author.html:104 +#: bookwyrm/templates/book/book.html:146 +msgid "View on OpenLibrary" +msgstr "Переглянути на OpenLibrary" + +#: bookwyrm/templates/author/author.html:119 +#: bookwyrm/templates/book/book.html:160 +msgid "View on Inventaire" +msgstr "Переглянути на Inventaire" + +#: bookwyrm/templates/author/author.html:135 +msgid "View on LibraryThing" +msgstr "Переглянути на LibraryThing" + +#: bookwyrm/templates/author/author.html:143 +msgid "View on Goodreads" +msgstr "Переглянути на Goodreads" + +#: bookwyrm/templates/author/author.html:158 +#, python-format +msgid "Books by %(name)s" +msgstr "Книги за авторством %(name)s" + +#: bookwyrm/templates/author/edit_author.html:5 +msgid "Edit Author:" +msgstr "Редагування автора:" + +#: bookwyrm/templates/author/edit_author.html:13 +#: bookwyrm/templates/book/edit/edit_book.html:25 +msgid "Added:" +msgstr "Додано:" + +#: bookwyrm/templates/author/edit_author.html:14 +#: bookwyrm/templates/book/edit/edit_book.html:28 +msgid "Updated:" +msgstr "Оновлено:" + +#: bookwyrm/templates/author/edit_author.html:16 +#: bookwyrm/templates/book/edit/edit_book.html:32 +msgid "Last edited by:" +msgstr "Востаннє відредаговано:" + +#: bookwyrm/templates/author/edit_author.html:33 +#: bookwyrm/templates/book/edit/edit_book_form.html:21 +msgid "Metadata" +msgstr "Метадані" + +#: bookwyrm/templates/author/edit_author.html:35 +#: bookwyrm/templates/lists/form.html:9 +#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:14 +#: bookwyrm/templates/shelf/form.html:9 +msgid "Name:" +msgstr "Ім'я:" + +#: bookwyrm/templates/author/edit_author.html:44 +#: bookwyrm/templates/book/edit/edit_book_form.html:89 +#: bookwyrm/templates/book/edit/edit_book_form.html:159 +msgid "Separate multiple values with commas." +msgstr "Якщо значень багато, розділіть їх комами." + +#: bookwyrm/templates/author/edit_author.html:50 +msgid "Bio:" +msgstr "Біографія:" + +#: bookwyrm/templates/author/edit_author.html:56 +msgid "Wikipedia link:" +msgstr "Посилання на Вікіпедію:" + +#: bookwyrm/templates/author/edit_author.html:60 +msgid "Website:" +msgstr "Вебсайт:" + +#: bookwyrm/templates/author/edit_author.html:65 +msgid "Birth date:" +msgstr "Дата народження:" + +#: bookwyrm/templates/author/edit_author.html:72 +msgid "Death date:" +msgstr "Дата смерті:" + +#: bookwyrm/templates/author/edit_author.html:79 +msgid "Author Identifiers" +msgstr "Ідентифікатори Автора" + +#: bookwyrm/templates/author/edit_author.html:81 +msgid "Openlibrary key:" +msgstr "Ключ Openlibrary:" + +#: bookwyrm/templates/author/edit_author.html:88 +#: bookwyrm/templates/book/edit/edit_book_form.html:334 +msgid "Inventaire ID:" +msgstr "Inventaire ID:" + +#: bookwyrm/templates/author/edit_author.html:95 +msgid "Librarything key:" +msgstr "Ключ Librarything:" + +#: bookwyrm/templates/author/edit_author.html:102 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 +msgid "Goodreads key:" +msgstr "Ключ Goodreads:" + +#: bookwyrm/templates/author/edit_author.html:109 +msgid "ISFDB:" +msgstr "ISFDB:" + +#: bookwyrm/templates/author/edit_author.html:116 +msgid "ISNI:" +msgstr "ISNI:" + +#: bookwyrm/templates/author/edit_author.html:126 +#: bookwyrm/templates/book/book.html:220 +#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/file_links/add_link_modal.html:60 +#: bookwyrm/templates/book/file_links/edit_links.html:86 +#: bookwyrm/templates/groups/form.html:32 +#: bookwyrm/templates/lists/bookmark_button.html:15 +#: bookwyrm/templates/lists/edit_item_form.html:15 +#: bookwyrm/templates/lists/form.html:130 +#: bookwyrm/templates/preferences/edit_user.html:140 +#: bookwyrm/templates/readthrough/readthrough_modal.html:81 +#: bookwyrm/templates/settings/announcements/edit_announcement.html:120 +#: bookwyrm/templates/settings/federation/edit_instance.html:98 +#: bookwyrm/templates/settings/federation/instance.html:105 +#: 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:89 +#: bookwyrm/templates/shelf/form.html:25 +#: bookwyrm/templates/snippets/reading_modals/layout.html:18 +msgid "Save" +msgstr "Зберегти" + +#: bookwyrm/templates/author/edit_author.html:127 +#: bookwyrm/templates/author/sync_modal.html:23 +#: bookwyrm/templates/book/book.html:221 +#: bookwyrm/templates/book/cover_add_modal.html:33 +#: bookwyrm/templates/book/edit/edit_book.html:152 +#: bookwyrm/templates/book/edit/edit_book.html:155 +#: bookwyrm/templates/book/file_links/add_link_modal.html:59 +#: bookwyrm/templates/book/file_links/verification_modal.html:25 +#: bookwyrm/templates/book/sync_modal.html:23 +#: bookwyrm/templates/groups/delete_group_modal.html:15 +#: bookwyrm/templates/lists/add_item_modal.html:36 +#: bookwyrm/templates/lists/delete_list_modal.html:16 +#: bookwyrm/templates/preferences/disable-2fa.html:19 +#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:27 +#: bookwyrm/templates/readthrough/readthrough_modal.html:80 +#: 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/link_domains/edit_domain_modal.html:22 +#: bookwyrm/templates/snippets/report_modal.html:52 +msgid "Cancel" +msgstr "Скасувати" + +#: bookwyrm/templates/author/sync_modal.html:15 +#, python-format +msgid "Loading data will connect to %(source_name)s and check for any metadata about this author which aren't present here. Existing metadata will not be overwritten." +msgstr "Процес завантаження даних з'єднається з %(source_name)s та перевірить наявність метаданих про цього автора, яких тут немає. Наявні метадані не буде перезаписано." + +#: bookwyrm/templates/author/sync_modal.html:24 +#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/sync_modal.html:24 +#: bookwyrm/templates/groups/members.html:29 +#: bookwyrm/templates/landing/password_reset.html:52 +#: bookwyrm/templates/preferences/2fa.html:77 +#: bookwyrm/templates/settings/imports/complete_import_modal.html:19 +#: bookwyrm/templates/snippets/remove_from_group_button.html:17 +msgid "Confirm" +msgstr "Підтвердити" + +#: bookwyrm/templates/book/book.html:20 +msgid "Unable to connect to remote source." +msgstr "Не вдалося під'єднатися до віддаленого джерела." + +#: bookwyrm/templates/book/book.html:73 bookwyrm/templates/book/book.html:74 +msgid "Edit Book" +msgstr "Редагувати Книгу" + +#: bookwyrm/templates/book/book.html:99 bookwyrm/templates/book/book.html:102 +msgid "Click to add cover" +msgstr "Натисніть, щоб додати обкладинку" + +#: bookwyrm/templates/book/book.html:108 +msgid "Failed to load cover" +msgstr "Не вдалося завантажити обкладинку" + +#: bookwyrm/templates/book/book.html:119 +msgid "Click to enlarge" +msgstr "Натисніть для збільшення" + +#: bookwyrm/templates/book/book.html:196 +#, python-format +msgid "(%(review_count)s review)" +msgid_plural "(%(review_count)s reviews)" +msgstr[0] "(%(review_count)s рецензія)" +msgstr[1] "(%(review_count)s рецензії)" +msgstr[2] "(%(review_count)s рецензій)" +msgstr[3] "(%(review_count)s рецензій)" + +#: bookwyrm/templates/book/book.html:209 +msgid "Add Description" +msgstr "Додати Опис" + +#: bookwyrm/templates/book/book.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:53 +#: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 +msgid "Description:" +msgstr "Опис:" + +#: bookwyrm/templates/book/book.html:232 +#, python-format +msgid "%(count)s edition" +msgid_plural "%(count)s editions" +msgstr[0] "%(count)s видання" +msgstr[1] "%(count)s видання" +msgstr[2] "%(count)s видань" +msgstr[3] "%(count)s видань" + +#: bookwyrm/templates/book/book.html:246 +msgid "You have shelved this edition in:" +msgstr "Ви відклали це видання на полицю:" + +#: bookwyrm/templates/book/book.html:261 +#, python-format +msgid "A different edition of this book is on your %(shelf_name)s shelf." +msgstr "Інше видання цієї книги знаходиться на вашій %(shelf_name)s полиці." + +#: bookwyrm/templates/book/book.html:272 +msgid "Your reading activity" +msgstr "Ваша читацька активність" + +#: bookwyrm/templates/book/book.html:278 +#: bookwyrm/templates/guided_tour/book.html:56 +msgid "Add read dates" +msgstr "Додати дати коли прочитано" + +#: bookwyrm/templates/book/book.html:286 +msgid "You don't have any reading activity for this book." +msgstr "Ви не маєте жодної читацької активності для цієї книги." + +#: bookwyrm/templates/book/book.html:312 +msgid "Your reviews" +msgstr "Ваші відгуки" + +#: bookwyrm/templates/book/book.html:318 +msgid "Your comments" +msgstr "Ваші коментарі" + +#: bookwyrm/templates/book/book.html:324 +msgid "Your quotes" +msgstr "Ваші цитати" + +#: bookwyrm/templates/book/book.html:360 +msgid "Subjects" +msgstr "Теми" + +#: bookwyrm/templates/book/book.html:372 +msgid "Places" +msgstr "Місця" + +#: bookwyrm/templates/book/book.html:383 +#: bookwyrm/templates/groups/group.html:19 +#: 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: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:101 bookwyrm/templates/user/lists.html:6 +msgid "Lists" +msgstr "Списки" + +#: bookwyrm/templates/book/book.html:395 +msgid "Add to list" +msgstr "Додати до списку" + +#: bookwyrm/templates/book/book.html:405 +#: bookwyrm/templates/book/cover_add_modal.html:32 +#: bookwyrm/templates/lists/add_item_modal.html:39 +#: bookwyrm/templates/lists/list.html:255 +#: bookwyrm/templates/settings/email_blocklist/domain_form.html:24 +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:32 +msgid "Add" +msgstr "Додати" + +#: bookwyrm/templates/book/book_identifiers.html:8 +msgid "ISBN:" +msgstr "ISBN:" + +#: bookwyrm/templates/book/book_identifiers.html:12 +#: bookwyrm/templates/book/book_identifiers.html:13 +msgid "Copy ISBN" +msgstr "Скопіювати ISBN" + +#: bookwyrm/templates/book/book_identifiers.html:16 +msgid "Copied ISBN!" +msgstr "ISBN скопійовано!" + +#: bookwyrm/templates/book/book_identifiers.html:23 +#: bookwyrm/templates/book/edit/edit_book_form.html:352 +msgid "OCLC Number:" +msgstr "Номер OCLC:" + +#: bookwyrm/templates/book/book_identifiers.html:30 +#: bookwyrm/templates/book/edit/edit_book_form.html:361 +msgid "ASIN:" +msgstr "ASIN:" + +#: bookwyrm/templates/book/book_identifiers.html:37 +#: bookwyrm/templates/book/edit/edit_book_form.html:370 +msgid "Audible ASIN:" +msgstr "Audible ASIN:" + +#: bookwyrm/templates/book/book_identifiers.html:44 +#: bookwyrm/templates/book/edit/edit_book_form.html:379 +msgid "ISFDB ID:" +msgstr "ISFDB ID:" + +#: bookwyrm/templates/book/book_identifiers.html:51 +msgid "Goodreads:" +msgstr "Goodreads:" + +#: bookwyrm/templates/book/cover_add_modal.html:5 +msgid "Add cover" +msgstr "Додати обкладинку" + +#: bookwyrm/templates/book/cover_add_modal.html:17 +#: bookwyrm/templates/book/edit/edit_book_form.html:244 +msgid "Upload cover:" +msgstr "Завантажити обкладинку:" + +#: bookwyrm/templates/book/cover_add_modal.html:23 +#: bookwyrm/templates/book/edit/edit_book_form.html:250 +msgid "Load cover from URL:" +msgstr "Завантажити обкладинку з посилання:" + +#: bookwyrm/templates/book/cover_show_modal.html:6 +msgid "Book cover preview" +msgstr "Попередній перегляд обкладинки книги" + +#: bookwyrm/templates/book/cover_show_modal.html:11 +#: bookwyrm/templates/components/inline_form.html:8 +#: bookwyrm/templates/components/modal.html:13 +#: bookwyrm/templates/components/modal.html:30 +#: bookwyrm/templates/feed/suggested_books.html:67 +#: bookwyrm/templates/get_started/layout.html:27 +#: bookwyrm/templates/get_started/layout.html:60 +msgid "Close" +msgstr "Закрити" + +#: bookwyrm/templates/book/edit/edit_book.html:8 +#: bookwyrm/templates/book/edit/edit_book.html:18 +#, python-format +msgid "Edit \"%(book_title)s\"" +msgstr "Редагувати \"%(book_title)s\"" + +#: bookwyrm/templates/book/edit/edit_book.html:10 +#: bookwyrm/templates/book/edit/edit_book.html:20 +msgid "Add Book" +msgstr "Додати книгу" + +#: bookwyrm/templates/book/edit/edit_book.html:43 +msgid "Failed to save book, see errors below for more information." +msgstr "Не вдалося зберегти книгу, дивіться помилки нижче для додаткової інформації." + +#: bookwyrm/templates/book/edit/edit_book.html:70 +msgid "Confirm Book Info" +msgstr "Підтвердити інформацію" + +#: bookwyrm/templates/book/edit/edit_book.html:78 +#, python-format +msgid "Is \"%(name)s\" one of these authors?" +msgstr "Чи є \"%(name)s одним з цих авторів?" + +#: bookwyrm/templates/book/edit/edit_book.html:89 +#, python-format +msgid "Author of %(book_title)s" +msgstr "Автор %(book_title)s" + +#: bookwyrm/templates/book/edit/edit_book.html:93 +#, python-format +msgid "Author of %(alt_title)s" +msgstr "Автор %(alt_title)s" + +#: bookwyrm/templates/book/edit/edit_book.html:95 +msgid "Find more information at isni.org" +msgstr "Знайти більше інформації на isni.org" + +#: bookwyrm/templates/book/edit/edit_book.html:105 +msgid "This is a new author" +msgstr "Це новий автор" + +#: bookwyrm/templates/book/edit/edit_book.html:115 +#, python-format +msgid "Creating a new author: %(name)s" +msgstr "Створення нового автора: %(name)s" + +#: bookwyrm/templates/book/edit/edit_book.html:122 +msgid "Is this an edition of an existing work?" +msgstr "Це видання вже існуючого твору?" + +#: bookwyrm/templates/book/edit/edit_book.html:130 +msgid "This is a new work" +msgstr "Це новий твір" + +#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/feed/status.html:19 +#: bookwyrm/templates/guided_tour/book.html:44 +#: bookwyrm/templates/guided_tour/book.html:68 +#: bookwyrm/templates/guided_tour/book.html:91 +#: bookwyrm/templates/guided_tour/book.html:116 +#: bookwyrm/templates/guided_tour/book.html:140 +#: bookwyrm/templates/guided_tour/book.html:164 +#: bookwyrm/templates/guided_tour/book.html:188 +#: bookwyrm/templates/guided_tour/book.html:213 +#: bookwyrm/templates/guided_tour/book.html:237 +#: bookwyrm/templates/guided_tour/book.html:262 +#: bookwyrm/templates/guided_tour/book.html:290 +#: bookwyrm/templates/guided_tour/group.html:43 +#: bookwyrm/templates/guided_tour/group.html:66 +#: bookwyrm/templates/guided_tour/group.html:89 +#: bookwyrm/templates/guided_tour/group.html:108 +#: bookwyrm/templates/guided_tour/home.html:91 +#: bookwyrm/templates/guided_tour/home.html:115 +#: bookwyrm/templates/guided_tour/home.html:140 +#: bookwyrm/templates/guided_tour/home.html:165 +#: bookwyrm/templates/guided_tour/home.html:189 +#: bookwyrm/templates/guided_tour/home.html:212 +#: bookwyrm/templates/guided_tour/lists.html:47 +#: bookwyrm/templates/guided_tour/lists.html:70 +#: bookwyrm/templates/guided_tour/lists.html:94 +#: bookwyrm/templates/guided_tour/lists.html:117 +#: bookwyrm/templates/guided_tour/lists.html:136 +#: bookwyrm/templates/guided_tour/search.html:83 +#: bookwyrm/templates/guided_tour/search.html:110 +#: bookwyrm/templates/guided_tour/search.html:134 +#: bookwyrm/templates/guided_tour/search.html:155 +#: bookwyrm/templates/guided_tour/user_books.html:44 +#: bookwyrm/templates/guided_tour/user_books.html:67 +#: bookwyrm/templates/guided_tour/user_books.html:90 +#: bookwyrm/templates/guided_tour/user_books.html:118 +#: bookwyrm/templates/guided_tour/user_groups.html:44 +#: bookwyrm/templates/guided_tour/user_groups.html:67 +#: bookwyrm/templates/guided_tour/user_groups.html:91 +#: bookwyrm/templates/guided_tour/user_groups.html:110 +#: bookwyrm/templates/guided_tour/user_profile.html:43 +#: bookwyrm/templates/guided_tour/user_profile.html:66 +#: bookwyrm/templates/guided_tour/user_profile.html:89 +#: bookwyrm/templates/guided_tour/user_profile.html:112 +#: bookwyrm/templates/guided_tour/user_profile.html:135 +#: bookwyrm/templates/user/user.html:93 bookwyrm/templates/user_menu.html:18 +msgid "Back" +msgstr "Назад" + +#: bookwyrm/templates/book/edit/edit_book_form.html:26 +#: bookwyrm/templates/snippets/create_status/review.html:15 +msgid "Title:" +msgstr "Назва:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:35 +msgid "Sort Title:" +msgstr "Назва Для Сортування:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:44 +msgid "Subtitle:" +msgstr "Підзаголовок:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:64 +msgid "Series:" +msgstr "Серії:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:74 +msgid "Series number:" +msgstr "Номер серії:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:85 +msgid "Languages:" +msgstr "Мови:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:97 +msgid "Subjects:" +msgstr "Теми:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:101 +msgid "Add subject" +msgstr "Додати тему" + +#: bookwyrm/templates/book/edit/edit_book_form.html:119 +msgid "Remove subject" +msgstr "Видалити тему" + +#: bookwyrm/templates/book/edit/edit_book_form.html:142 +msgid "Add Another Subject" +msgstr "Додати іншу тему" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +msgid "Publication" +msgstr "Видання" + +#: bookwyrm/templates/book/edit/edit_book_form.html:155 +msgid "Publisher:" +msgstr "Видавець:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:167 +msgid "First published date:" +msgstr "Дата першого видання:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Published date:" +msgstr "Дата видання:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +msgid "Authors" +msgstr "Автори" + +#: bookwyrm/templates/book/edit/edit_book_form.html:197 +#, python-format +msgid "Remove %(name)s" +msgstr "Видалити %(name)s" + +#: bookwyrm/templates/book/edit/edit_book_form.html:200 +#, python-format +msgid "Author page for %(name)s" +msgstr "Сторінка автора для %(name)s" + +#: bookwyrm/templates/book/edit/edit_book_form.html:208 +msgid "Add Authors:" +msgstr "Додати авторів:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:211 +#: bookwyrm/templates/book/edit/edit_book_form.html:214 +msgid "Add Author" +msgstr "Додати автора" + +#: bookwyrm/templates/book/edit/edit_book_form.html:212 +#: bookwyrm/templates/book/edit/edit_book_form.html:215 +msgid "Jane Doe" +msgstr "Ілона Павлюк" + +#: bookwyrm/templates/book/edit/edit_book_form.html:221 +msgid "Add Another Author" +msgstr "Додати іншого автора" + +#: bookwyrm/templates/book/edit/edit_book_form.html:231 +#: bookwyrm/templates/shelf/shelf.html:149 +msgid "Cover" +msgstr "Обкладинка" + +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +msgid "Physical Properties" +msgstr "Фізичні властивості" + +#: bookwyrm/templates/book/edit/edit_book_form.html:270 +#: bookwyrm/templates/book/editions/format_filter.html:6 +msgid "Format:" +msgstr "Формат:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:280 +msgid "Format details:" +msgstr "Деталі формату:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:291 +msgid "Pages:" +msgstr "Сторінок:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:302 +msgid "Book Identifiers" +msgstr "Ідентифікатори книги" + +#: bookwyrm/templates/book/edit/edit_book_form.html:307 +msgid "ISBN 13:" +msgstr "ISBN 13:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:316 +msgid "ISBN 10:" +msgstr "ISBN 10:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:325 +msgid "Openlibrary ID:" +msgstr "Openlibrary ID:" + +#: bookwyrm/templates/book/editions/editions.html:4 +#, python-format +msgid "Editions of %(book_title)s" +msgstr "Видання %(book_title)s" + +#: bookwyrm/templates/book/editions/editions.html:8 +#, python-format +msgid "Editions of %(work_title)s" +msgstr "Видання %(work_title)s" + +#: bookwyrm/templates/book/editions/editions.html:55 +msgid "Can't find the edition you're looking for?" +msgstr "Не можете знайти потрібне видання?" + +#: bookwyrm/templates/book/editions/editions.html:76 +msgid "Add another edition" +msgstr "Додати інше видання" + +#: bookwyrm/templates/book/editions/format_filter.html:9 +#: bookwyrm/templates/book/editions/language_filter.html:9 +msgid "Any" +msgstr "Будь-яка" + +#: bookwyrm/templates/book/editions/language_filter.html:6 +#: bookwyrm/templates/preferences/edit_user.html:95 +msgid "Language:" +msgstr "Мова:" + +#: bookwyrm/templates/book/editions/search_filter.html:6 +msgid "Search editions" +msgstr "Пошук видань" + +#: bookwyrm/templates/book/file_links/add_link_modal.html:6 +msgid "Add file link" +msgstr "Додати посилання на файл" + +#: bookwyrm/templates/book/file_links/add_link_modal.html:19 +msgid "Links from unknown domains will need to be approved by a moderator before they are added." +msgstr "Посилання з невідомих доменів необхідно затвердити модератором перед тим, як вони додадуться." + +#: bookwyrm/templates/book/file_links/add_link_modal.html:24 +msgid "URL:" +msgstr "URL:" + +#: bookwyrm/templates/book/file_links/add_link_modal.html:29 +msgid "File type:" +msgstr "Тип файлу:" + +#: bookwyrm/templates/book/file_links/add_link_modal.html:48 +msgid "Availability:" +msgstr "Наявність:" + +#: bookwyrm/templates/book/file_links/edit_links.html:5 +#: bookwyrm/templates/book/file_links/edit_links.html:21 +#: bookwyrm/templates/book/file_links/links.html:53 +msgid "Edit links" +msgstr "Редагування посилання" + +#: bookwyrm/templates/book/file_links/edit_links.html:11 +#, python-format +msgid "Links for \"%(title)s\"" +msgstr "Посилання для \"%(title)s\"" + +#: bookwyrm/templates/book/file_links/edit_links.html:32 +#: bookwyrm/templates/settings/link_domains/link_table.html:6 +msgid "URL" +msgstr "URL" + +#: bookwyrm/templates/book/file_links/edit_links.html:33 +#: bookwyrm/templates/settings/link_domains/link_table.html:7 +msgid "Added by" +msgstr "Додано" + +#: bookwyrm/templates/book/file_links/edit_links.html:34 +#: bookwyrm/templates/settings/link_domains/link_table.html:8 +msgid "Filetype" +msgstr "Тип файлу" + +#: bookwyrm/templates/book/file_links/edit_links.html:35 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:25 +#: bookwyrm/templates/settings/reports/report_links_table.html:5 +msgid "Domain" +msgstr "Домен" + +#: bookwyrm/templates/book/file_links/edit_links.html:36 +#: bookwyrm/templates/import/import.html:139 +#: bookwyrm/templates/import/import_status.html:134 +#: 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: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/reports/report_links_table.html:6 +#: bookwyrm/templates/settings/themes.html:108 +msgid "Actions" +msgstr "Дії" + +#: bookwyrm/templates/book/file_links/edit_links.html:48 +#: bookwyrm/templates/settings/link_domains/link_table.html:21 +msgid "Unknown user" +msgstr "Невідомий користувач" + +#: bookwyrm/templates/book/file_links/edit_links.html:57 +#: bookwyrm/templates/book/file_links/verification_modal.html:22 +msgid "Report spam" +msgstr "Повідомити про спам" + +#: bookwyrm/templates/book/file_links/edit_links.html:102 +msgid "No links available for this book." +msgstr "Немає посилань для цієї книги." + +#: bookwyrm/templates/book/file_links/edit_links.html:113 +#: bookwyrm/templates/book/file_links/links.html:18 +msgid "Add link to file" +msgstr "Додати посилання на файл" + +#: bookwyrm/templates/book/file_links/file_link_page.html:6 +msgid "File Links" +msgstr "Посилання на файли" + +#: bookwyrm/templates/book/file_links/links.html:9 +msgid "Get a copy" +msgstr "Отримати копію" + +#: bookwyrm/templates/book/file_links/links.html:47 +msgid "No links available" +msgstr "Немає доступних посиланнь" + +#: bookwyrm/templates/book/file_links/verification_modal.html:5 +msgid "Leaving BookWyrm" +msgstr "Ви покидаєте BookWyrm" + +#: bookwyrm/templates/book/file_links/verification_modal.html:11 +#, python-format +msgid "This link is taking you to: %(link_url)s.
    Is that where you'd like to go?" +msgstr "Це посилання веде на: %(link_url)s.
    Ви впевнені що хочете перейти за ним?" + +#: bookwyrm/templates/book/file_links/verification_modal.html:26 +#: bookwyrm/templates/setup/config.html:139 +msgid "Continue" +msgstr "Продовжити" + +#: bookwyrm/templates/book/publisher_info.html:23 +#, python-format +msgid "%(format)s, %(pages)s pages" +msgstr "%(format)s, %(pages)s сторінок" + +#: bookwyrm/templates/book/publisher_info.html:25 +#, python-format +msgid "%(pages)s pages" +msgstr "%(pages)s сторінок" + +#: bookwyrm/templates/book/publisher_info.html:38 +#, python-format +msgid "%(languages)s language" +msgstr "%(languages)s мова" + +#: 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/rating.html:19 +msgid "rated it" +msgstr "оцінив у" + +#: bookwyrm/templates/book/series.html:11 +msgid "Series by" +msgstr "Серія від" + +#: bookwyrm/templates/book/series.html:28 +#, python-format +msgid "Book %(series_number)s" +msgstr "Книга %(series_number)s" + +#: bookwyrm/templates/book/series.html:28 +msgid "Unsorted Book" +msgstr "Несортована Книга" + +#: bookwyrm/templates/book/sync_modal.html:15 +#, python-format +msgid "Loading data will connect to %(source_name)s and check for any metadata about this book which aren't present here. Existing metadata will not be overwritten." +msgstr "Процес завантаження даних з'єднається з %(source_name)s та перевірить наявність метаданих про цю книгу, яких тут немає. Наявні метадані не буде перезаписано." + +#: bookwyrm/templates/compose.html:5 bookwyrm/templates/compose.html:8 +msgid "Edit status" +msgstr "Редагувати статус" + +#: bookwyrm/templates/confirm_email/confirm_email.html:4 +msgid "Confirm email" +msgstr "Підтвердження email-адреси" + +#: bookwyrm/templates/confirm_email/confirm_email.html:7 +msgid "Confirm your email address" +msgstr "Підтвердьте свою email-адресу" + +#: bookwyrm/templates/confirm_email/confirm_email.html:13 +msgid "A confirmation code has been sent to the email address you used to register your account." +msgstr "На вашу електронну адресу надіслано код підтвердження." + +#: bookwyrm/templates/confirm_email/confirm_email.html:15 +msgid "Sorry! We couldn't find that code." +msgstr "Вибачте! Ми не змогли знайти цей код." + +#: bookwyrm/templates/confirm_email/confirm_email.html:19 +#: bookwyrm/templates/settings/users/user_info.html:92 +msgid "Confirmation code:" +msgstr "Код підтвердження:" + +#: bookwyrm/templates/confirm_email/confirm_email.html:25 +#: bookwyrm/templates/landing/layout.html:81 +#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/snippets/report_modal.html:53 +msgid "Submit" +msgstr "Надіслати" + +#: bookwyrm/templates/confirm_email/confirm_email.html:38 +msgid "Can't find your code?" +msgstr "Не вдалося знайти код?" + +#: bookwyrm/templates/confirm_email/resend.html:5 +#: bookwyrm/templates/confirm_email/resend_modal.html:5 +msgid "Resend confirmation link" +msgstr "Повторно надіслати підтвердження на електронну пошту" + +#: bookwyrm/templates/confirm_email/resend_modal.html:15 +#: bookwyrm/templates/landing/layout.html:68 +#: bookwyrm/templates/landing/password_reset_request.html:24 +#: bookwyrm/templates/preferences/edit_user.html:53 +#: bookwyrm/templates/snippets/register_form.html:27 +msgid "Email address:" +msgstr "Електронна пошта:" + +#: bookwyrm/templates/confirm_email/resend_modal.html:30 +msgid "Resend link" +msgstr "Надіслати посилання ще раз" + +#: bookwyrm/templates/directory/community_filter.html:5 +msgid "Community" +msgstr "Спільнота" + +#: bookwyrm/templates/directory/community_filter.html:8 +#: bookwyrm/templates/settings/users/user_admin.html:25 +msgid "Local users" +msgstr "Локальні користувачі" + +#: bookwyrm/templates/directory/community_filter.html:12 +#: bookwyrm/templates/settings/users/user_admin.html:33 +msgid "Federated community" +msgstr "Федеративна спільнота" + +#: bookwyrm/templates/directory/directory.html:4 +#: bookwyrm/templates/directory/directory.html:9 +#: bookwyrm/templates/user_menu.html:34 +msgid "Directory" +msgstr "Каталог" + +#: bookwyrm/templates/directory/directory.html:17 +msgid "Make your profile discoverable to other BookWyrm users." +msgstr "Зробити свій профіль видимим для інших користувачів BookWyrm." + +#: bookwyrm/templates/directory/directory.html:21 +msgid "Join Directory" +msgstr "Приєднатися до Каталогу" + +#: bookwyrm/templates/directory/directory.html:24 +#, python-format +msgid "You can opt-out at any time in your profile settings." +msgstr "Ви можете від'єднатися будь-коли в настройках профілю " + +#: bookwyrm/templates/directory/directory.html:29 +#: bookwyrm/templates/directory/directory.html:31 +#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/summary_card.html:12 +#: bookwyrm/templates/feed/summary_card.html:14 +#: bookwyrm/templates/snippets/announcement.html:31 +msgid "Dismiss message" +msgstr "Відхилити повідомлення" + +#: bookwyrm/templates/directory/sort_filter.html:5 +msgid "Order by" +msgstr "Сортувати за" + +#: bookwyrm/templates/directory/sort_filter.html:9 +msgid "Recently active" +msgstr "Нещодавно активні" + +#: bookwyrm/templates/directory/sort_filter.html:10 +msgid "Suggested" +msgstr "Рекомендовані" + +#: bookwyrm/templates/directory/user_card.html:17 +#: bookwyrm/templates/directory/user_card.html:18 +#: bookwyrm/templates/ostatus/remote_follow.html:21 +#: bookwyrm/templates/ostatus/remote_follow.html:22 +#: bookwyrm/templates/ostatus/subscribe.html:41 +#: 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" +msgstr "Акаунт заблоковано" + +#: bookwyrm/templates/directory/user_card.html:40 +msgid "follower you follow" +msgid_plural "followers you follow" +msgstr[0] "підписник, за яким ви стежите" +msgstr[1] "підписників, за якими ви стежите" +msgstr[2] "підписників, за якими ви стежите" +msgstr[3] "підписників, за якими ви стежите" + +#: bookwyrm/templates/directory/user_card.html:47 +msgid "book on your shelves" +msgid_plural "books on your shelves" +msgstr[0] "книга на ваших полицях" +msgstr[1] "книги на ваших полицях" +msgstr[2] "книги на ваших полицях" +msgstr[3] "книги на ваших полицях" + +#: bookwyrm/templates/directory/user_card.html:55 +msgid "posts" +msgstr "постів" + +#: bookwyrm/templates/directory/user_card.html:61 +msgid "last active" +msgstr "остання активність" + +#: bookwyrm/templates/directory/user_type_filter.html:5 +msgid "User type" +msgstr "Тип користувача" + +#: bookwyrm/templates/directory/user_type_filter.html:8 +msgid "BookWyrm users" +msgstr "Користувачі BookWyrm" + +#: bookwyrm/templates/directory/user_type_filter.html:12 +msgid "All known users" +msgstr "Усі відомі користувачі" + +#: bookwyrm/templates/discover/card-header.html:8 +#, python-format +msgid "%(username)s wants to read %(book_title)s" +msgstr "%(username)s хоче прочитати %(book_title)s" + +#: bookwyrm/templates/discover/card-header.html:13 +#, python-format +msgid "%(username)s finished reading %(book_title)s" +msgstr "%(username)s закінчив(-ла) читати %(book_title)s" + +#: bookwyrm/templates/discover/card-header.html:18 +#, python-format +msgid "%(username)s started reading %(book_title)s" +msgstr "%(username)s почав(-ла) читати %(book_title)s" + +#: bookwyrm/templates/discover/card-header.html:23 +#, python-format +msgid "%(username)s rated %(book_title)s" +msgstr "%(username)s оцінив(-ла) %(book_title)s" + +#: bookwyrm/templates/discover/card-header.html:27 +#, python-format +msgid "%(username)s reviewed %(book_title)s" +msgstr "%(username)s рецензував(-ла) %(book_title)s" + +#: bookwyrm/templates/discover/card-header.html:31 +#, python-format +msgid "%(username)s commented on %(book_title)s" +msgstr "%(username)s прокоментував(-ла) %(book_title)s" + +#: bookwyrm/templates/discover/card-header.html:35 +#, python-format +msgid "%(username)s quoted %(book_title)s" +msgstr "%(username)s процитував(-ла) %(book_title)s" + +#: bookwyrm/templates/discover/discover.html:4 +#: bookwyrm/templates/discover/discover.html:10 +#: bookwyrm/templates/layout.html:91 +msgid "Discover" +msgstr "Огляд" + +#: bookwyrm/templates/discover/discover.html:12 +#, python-format +msgid "See what's new in the local %(site_name)s community" +msgstr "Що нового коїться у місцевій спільноті %(site_name)s" + +#: bookwyrm/templates/discover/large-book.html:52 +#: bookwyrm/templates/discover/small-book.html:36 +msgid "View status" +msgstr "Переглянути статус" + +#: bookwyrm/templates/email/confirm/html_content.html:6 +#: bookwyrm/templates/email/confirm/text_content.html:4 +#, python-format +msgid "One last step before you join %(site_name)s! Please confirm your email address by clicking the link below:" +msgstr "Це останнє що треба зробити перед приєднанням до %(site_name)s! Будь ласка, підтвердьте вашу адресу електронної пошти, натиснувши на посилання нижче:" + +#: bookwyrm/templates/email/confirm/html_content.html:11 +msgid "Confirm Email" +msgstr "Підтвердження email-адреси" + +#: bookwyrm/templates/email/confirm/html_content.html:15 +#, python-format +msgid "Or enter the code \"%(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!

    Would you like to take the guided tour to help you get started?" +msgstr "Ласкаво просимо на Bookwyrm!

    Бажаєте пройти екскурсію, щоб почати користуватись сервісом?" + +#: bookwyrm/templates/guided_tour/home.html:17 +#: bookwyrm/templates/guided_tour/home.html:39 +#: bookwyrm/templates/snippets/footer.html:20 +msgid "Guided Tour" +msgstr "Вступний Тур" + +#: bookwyrm/templates/guided_tour/home.html:25 +#: bookwyrm/templates/two_factor_auth/two_factor_prompt.html:36 +msgid "No thanks" +msgstr "Ні, дякую" + +#: bookwyrm/templates/guided_tour/home.html:33 +msgid "Yes please!" +msgstr "Так, будь ласка!" + +#: bookwyrm/templates/guided_tour/home.html:38 +msgid "If you ever change your mind, just click on the Guided Tour link to start your tour" +msgstr "Якщо передумаєте, просто натисніть на \"Екскурсія\", щоб розпочати знайомство" + +#: bookwyrm/templates/guided_tour/home.html:62 +msgid "Search for books, users, or lists using this search box." +msgstr "Шукайте книги, користувачів або списки за допомогою цього поля." + +#: bookwyrm/templates/guided_tour/home.html:63 +msgid "Search box" +msgstr "Поле пошуку" + +#: bookwyrm/templates/guided_tour/home.html:79 +msgid "Search book records by scanning an ISBN barcode using your device's camera - great when you're in the bookstore or library!" +msgstr "Шукайте книги, скануючи штрих-код ISBN за допомогою камери вашого пристрою - корисно, коли ви у книжному або бібліотеці!" + +#: bookwyrm/templates/guided_tour/home.html:80 +msgid "Barcode reader" +msgstr "Сканер штрих-кодів" + +#: bookwyrm/templates/guided_tour/home.html:102 +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" +msgstr "Панель навігації" + +#: bookwyrm/templates/guided_tour/home.html:126 +msgid "Books on your reading status shelves will be shown here." +msgstr "Книги з полиць статусу читання будуть показуватися тут." + +#: bookwyrm/templates/guided_tour/home.html:151 +msgid "Updates from people you are following will appear in your Home timeline.

    The Books tab shows activity from anyone, related to your books." +msgstr "Оновлення від користувачів, за якими ви слідкуєте, будуть з'являтися у вашій Головній стрічці.

    Вкладинка Книги міститиме активність від будь-кого, пов'язаного з вашими книгами." + +#: bookwyrm/templates/guided_tour/home.html:152 +msgid "Timelines" +msgstr "Стрічки" + +#: bookwyrm/templates/guided_tour/home.html:176 +msgid "The bell will light up when you have a new notification. When it does, click on it to find out what exciting thing has happened!" +msgstr "Дзвіночок підсвітиться при новому сповіщенні. Коли це станеться, натисніть на нього щоб дізнатися що прикольного сталося!" + +#: bookwyrm/templates/guided_tour/home.html:177 +#: 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, 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." +msgstr "Спробуйте вибрати Профіль з випадаючого меню, щоб продовжити екскурсію." + +#: bookwyrm/templates/guided_tour/home.html:201 +msgid "Profile and settings menu" +msgstr "Меню профілю та налаштувань" + +#: bookwyrm/templates/guided_tour/lists.html:13 +msgid "This is the lists page where you can discover book lists created by any user. A List is a collection of books, similar to a shelf." +msgstr "На цій сторінці ви можете знайти списки книг, створені будь-яким користувачем. Список - це набір книг, схожий на полицю." + +#: bookwyrm/templates/guided_tour/lists.html:13 +msgid "Shelves are for organising books for yourself, whereas Lists are generally for sharing with others." +msgstr "Полиці призначені для організації книг для себе, тоді як Списки, як правило, для обміну з іншими." + +#: bookwyrm/templates/guided_tour/lists.html:34 +msgid "Let's see how to create a new list." +msgstr "Подивімось, як створити новий список." + +#: bookwyrm/templates/guided_tour/lists.html:34 +msgid "Click the Create List button, then Next to continue the tour" +msgstr "Натисніть на кнопку Створити Список, а потім Далі для продовження екскурсії" + +#: bookwyrm/templates/guided_tour/lists.html:35 +#: bookwyrm/templates/guided_tour/lists.html:59 +msgid "Creating a new list" +msgstr "Створення нового списку" + +#: bookwyrm/templates/guided_tour/lists.html:58 +msgid "You must give your list a name and can optionally give it a description to help other people understand what your list is about." +msgstr "Ви повинні дати своєму списку ім'я та, за бажанням, опис, щоб допомогти іншим людям зрозуміти, про що ваш список." + +#: bookwyrm/templates/guided_tour/lists.html:81 +msgid "Choose who can see your list here. List privacy options work just like we saw when posting book reviews. This is a common pattern throughout Bookwyrm." +msgstr "Виберіть, хто може бачити ваш список. Опції конфіденційності списків працюють так само, як і для рецензій. Це типовий підхід усюди в BookWyrm." + +#: bookwyrm/templates/guided_tour/lists.html:82 +msgid "List privacy" +msgstr "Конфіденційність списків" + +#: bookwyrm/templates/guided_tour/lists.html:105 +msgid "You can also decide how your list is to be curated - only by you, by anyone, or by a group." +msgstr "Ви також можете вирішити, ким ваш список буде куруватися - тільки вами, ким завгодно, або групою." + +#: bookwyrm/templates/guided_tour/lists.html:106 +msgid "List curation" +msgstr "Кураторство списку" + +#: bookwyrm/templates/guided_tour/lists.html:128 +msgid "Next in our tour we will explore Groups!" +msgstr "Далі в екскурсії ми вивчатимемо Групи!" + +#: bookwyrm/templates/guided_tour/lists.html:129 +msgid "Next: Groups" +msgstr "Далі: Групи" + +#: bookwyrm/templates/guided_tour/lists.html:143 +msgid "Take me there" +msgstr "Перейти" + +#: bookwyrm/templates/guided_tour/search.html:16 +msgid "If the book you are looking for is available on a remote catalogue such as Open Library, click on Import book." +msgstr "Якщо книга, яку ви шукаєте, доступна на віддаленому каталозі, наприклад Open Library, натисніть на Імпортувати книгу." + +#: bookwyrm/templates/guided_tour/search.html:17 +#: bookwyrm/templates/guided_tour/search.html:44 +msgid "Searching" +msgstr "Пошук" + +#: bookwyrm/templates/guided_tour/search.html:43 +msgid "If the book you are looking for is already on this Bookwyrm instance, you can click on the title to go to the book's page." +msgstr "Якщо книжка, яку ви шукаєте, вже знаходиться на цьому інстансі Bookwyrm, ви можете натиснути на заголовок, щоб перейти на сторінку книги." + +#: bookwyrm/templates/guided_tour/search.html:71 +msgid "If the book you are looking for is not listed, try loading more records from other sources like Open Library or Inventaire." +msgstr "Якщо книжки, яку ви шукаєте, немає в списку, спробуйте завантажити більше записів з інших джерел, таких як Open Library чи Inventaire." + +#: bookwyrm/templates/guided_tour/search.html:72 +msgid "Load more records" +msgstr "Завантажити більше записів" + +#: bookwyrm/templates/guided_tour/search.html:98 +msgid "If your book is not in the results, try adjusting your search terms." +msgstr "Якщо вашої книги немає в результатах, спробуйте змінити пошуковий запит." + +#: bookwyrm/templates/guided_tour/search.html:99 +msgid "Search again" +msgstr "Шукати знов" + +#: bookwyrm/templates/guided_tour/search.html:121 +msgid "If you still can't find your book, you can add a record manually." +msgstr "Якщо ви все ще не можете знайти свою книгу, ви можете додати запис вручну." + +#: bookwyrm/templates/guided_tour/search.html:122 +msgid "Add a record manually" +msgstr "Створення запису вручну" + +#: bookwyrm/templates/guided_tour/search.html:147 +msgid "Import, manually add, or view an existing book to continue the tour." +msgstr "Імпортуйте, додайте вручну або перегляньте наявну книгу для продовження екскурсії." + +#: bookwyrm/templates/guided_tour/search.html:148 +msgid "Continue the tour" +msgstr "Продовжити екскурсію" + +#: bookwyrm/templates/guided_tour/user_books.html:10 +msgid "This is the page where your books are listed, organised into shelves." +msgstr "Це сторінка з переліком ваших книг, які організовані в полиці." + +#: bookwyrm/templates/guided_tour/user_books.html:11 +#: bookwyrm/templates/user/books_header.html:4 +msgid "Your books" +msgstr "Ваші книги" + +#: 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 "Прочитати, Зараз Читаю, Прочитано, і Читання Зупинено - це стандартні полиці. При зміні статусу читання книги вона автоматично буде перенесена в відповідну полицю. Книжка може бути лише на одній стандартній полиці одночасно." + +#: bookwyrm/templates/guided_tour/user_books.html:32 +msgid "Reading status shelves" +msgstr "Полиці статусу читання" + +#: bookwyrm/templates/guided_tour/user_books.html:55 +msgid "You can create additional custom shelves to organise your books. A book on a custom shelf can be on any number of other shelves simultaneously, including one of the default reading status shelves" +msgstr "Ви можете організувати ваші книжки створивши додаткові власні полиці. Книга на власній полиці може одночасно бути на будь-яких інших полицях, в тому числі стандартних (Прочитати, Читаю Зараз, і. т. д.)" + +#: bookwyrm/templates/guided_tour/user_books.html:56 +msgid "Adding custom shelves." +msgstr "Додавання власних полиць." + +#: bookwyrm/templates/guided_tour/user_books.html:78 +msgid "If you have an export file from another service like Goodreads or LibraryThing, you can import it here." +msgstr "Якщо у вас є файл експорту з іншого сервісу, наприклад Goodreads чи LibraryThing, ви можете імпортувати його тут." + +#: bookwyrm/templates/guided_tour/user_books.html:79 +msgid "Import from another service" +msgstr "Імпорт з іншого сервісу" + +#: bookwyrm/templates/guided_tour/user_books.html:101 +msgid "Now that we've explored book shelves, let's take a look at a related concept: book lists!" +msgstr "Тепер, коли ми дослідили книжкові полиці, погляньмо на пов'язану концепцію: списки книг!" + +#: bookwyrm/templates/guided_tour/user_books.html:101 +msgid "Click on the Lists link here to continue the tour." +msgstr "Натисніть на Списки тут, щоб продовжити екскурсію." + +#: bookwyrm/templates/guided_tour/user_groups.html:10 +msgid "You can create or join a group with other users. Groups can share group-curated book lists, and in future will be able to do other things." +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:95 +msgid "Groups" +msgstr "Групи" + +#: bookwyrm/templates/guided_tour/user_groups.html:31 +msgid "Let's create a new group!" +msgstr "Створімо нову групу!" + +#: bookwyrm/templates/guided_tour/user_groups.html:31 +msgid "Click the Create group button, then Next to continue the tour" +msgstr "Натисніть на кнопку Створити групу, а потім Далі для продовження туру" + +#: bookwyrm/templates/guided_tour/user_groups.html:55 +msgid "Give your group a name and describe what it is about. You can make user groups for any purpose - a reading group, a bunch of friends, whatever!" +msgstr "Дайте назву вашій групі та опишіть її. Ви можете створити групи користувачів з будь-якої мети - група для читання, групи друзів, що завгодно!" + +#: bookwyrm/templates/guided_tour/user_groups.html:56 +msgid "Creating a group" +msgstr "Створення групи" + +#: bookwyrm/templates/guided_tour/user_groups.html:78 +msgid "Groups have privacy settings just like posts and lists, except that group privacy cannot be Followers." +msgstr "Групи мають налаштування конфіденційності, як і публікації та списки, за винятком того, що конфіденційність групи не може бути Підписникам." + +#: bookwyrm/templates/guided_tour/user_groups.html:79 +msgid "Group visibility" +msgstr "Видимість групи" + +#: bookwyrm/templates/guided_tour/user_groups.html:102 +msgid "Once you're happy with how everything is set up, click the Save button to create your new group." +msgstr "Якщо ви задоволені тим, як все налаштовано, натисніть кнопку Зберегти, щоб створити нову групу." + +#: bookwyrm/templates/guided_tour/user_groups.html:102 +msgid "Create and save a group to continue the tour." +msgstr "Створити та зберегти групу для продовження туру." + +#: bookwyrm/templates/guided_tour/user_groups.html:103 +msgid "Save your group" +msgstr "Зберегти свою групу" + +#: bookwyrm/templates/guided_tour/user_profile.html:10 +msgid "This is your user profile. All your latest activities will be listed here. Other Bookwyrm users can see parts of this page too - what they can see depends on your privacy settings." +msgstr "Це ваш профіль користувача. Усі ваші останні дії будуть перераховані тут. Інші користувачі Bookwyrm можуть також бачити частини цієї сторінки - те, що вони можуть бачити, залежить від ваших налаштувань конфіденційності." + +#: bookwyrm/templates/guided_tour/user_profile.html:11 +#: bookwyrm/templates/user/layout.html:20 bookwyrm/templates/user/user.html:14 +msgid "User Profile" +msgstr "Профіль Користувача" + +#: bookwyrm/templates/guided_tour/user_profile.html:31 +msgid "This tab shows everything you have read towards your annual reading goal, or allows you to set one. You don't have to set a reading goal if that's not your thing!" +msgstr "Ця вкладка показує все, що ви прочитали у рамках річної мети читання, або дозволяє її встановити. Це не обов'язково. Тільки якщо вам таке подобається." + +#: bookwyrm/templates/guided_tour/user_profile.html:32 +#: bookwyrm/templates/user/goal.html:6 bookwyrm/templates/user/layout.html:89 +msgid "Reading Goal" +msgstr "Мета Читання" + +#: bookwyrm/templates/guided_tour/user_profile.html:54 +msgid "Here you can see your groups, or create a new one. A group brings together Bookwyrm users and allows them to curate lists together." +msgstr "Тут ви можете переглянути свої групи, або створити нову. Група об'єднує користувачів Bookwyrm і дозволяє керувати списками разом." + +#: bookwyrm/templates/guided_tour/user_profile.html:77 +msgid "You can see your lists, or create a new one, here. A list is a collection of books that have something in common." +msgstr "Ви можете переглянути списки або створити новий. Список - це колекція книг, що мають щось спільне." + +#: bookwyrm/templates/guided_tour/user_profile.html:100 +msgid "The Books tab shows your book shelves. We'll explore this later in the tour." +msgstr "Вкладка Книги показує ваші книжкові полиці. Ми дослідимо це пізніше в екскурсії." + +#: bookwyrm/templates/guided_tour/user_profile.html:123 +msgid "Now you understand the basics of your profile page, let's add a book to your shelves." +msgstr "Тепер, коли ви розібралися у сторінці вашого профілю, нумо додамо книгу до ваших полиць." + +#: bookwyrm/templates/guided_tour/user_profile.html:123 +msgid "Search for a title or author to continue the tour." +msgstr "Пошукайте назву книги або автора, щоб продовжити екскурсію." + +#: bookwyrm/templates/guided_tour/user_profile.html:124 +msgid "Find a book" +msgstr "Пошук книг" + +#: bookwyrm/templates/hashtag.html:12 +#, python-format +msgid "See tagged statuses in the local %(site_name)s community" +msgstr "Дивіться відмічені статуси у локальній спільноті %(site_name)s" + +#: bookwyrm/templates/hashtag.html:25 +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:66 +msgid "Import Books" +msgstr "Імпортувати Книги" + +#: bookwyrm/templates/import/import.html:13 +msgid "Not a valid CSV file" +msgstr "Некоректний CSV-файл" + +#: bookwyrm/templates/import/import.html:21 +#, 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 %(display_size)s books every %(import_limit_reset)s days." +msgstr[0] "Наразі ви можете імпортувати тільки %(display_size)s книгу впродовж кожних %(import_limit_reset)s днів." +msgstr[1] "Наразі ви можете імпортувати тільки %(display_size)s книги впродовж кожних %(import_limit_reset)s днів." +msgstr[2] "Наразі ви можете імпортувати тільки %(display_size)s книг впродовж кожних %(import_limit_reset)s днів." +msgstr[3] "Наразі ви можете імпортувати тільки %(display_size)s книг впродовж кожних %(import_limit_reset)s днів." + +#: bookwyrm/templates/import/import.html:27 +#, python-format +msgid "You have %(display_left)s left." +msgstr "Залишилось %(display_left)s." + +#: bookwyrm/templates/import/import.html:34 +#, python-format +msgid "On average, recent imports have taken %(hours)s hours." +msgstr "В середньому, недавні імпорти зайняли %(hours)s годин." + +#: bookwyrm/templates/import/import.html:38 +#, python-format +msgid "On average, recent imports have taken %(minutes)s minutes." +msgstr "В середньому, недавні імпорти зайняли %(minutes)s хвилин." + +#: bookwyrm/templates/import/import.html:53 +msgid "Data source:" +msgstr "Джерело даних:" + +#: bookwyrm/templates/import/import.html:59 +msgid "Goodreads (CSV)" +msgstr "Goodreads (CSV)" + +#: bookwyrm/templates/import/import.html:62 +msgid "Storygraph (CSV)" +msgstr "Storygraph (CSV)" + +#: bookwyrm/templates/import/import.html:65 +msgid "LibraryThing (TSV)" +msgstr "LibraryThing (TSV)" + +#: bookwyrm/templates/import/import.html:68 +msgid "OpenLibrary (CSV)" +msgstr "OpenLibrary (CSV)" + +#: bookwyrm/templates/import/import.html:71 +msgid "Calibre (CSV)" +msgstr "Calibre (CSV)" + +#: bookwyrm/templates/import/import.html:77 +msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." +msgstr "Ви можете завантажити дані Goodreads на сторінці Import/Export вашого облікового запису Goodreads." + +#: bookwyrm/templates/import/import.html:86 +msgid "Data file:" +msgstr "Файл даних:" + +#: bookwyrm/templates/import/import.html:94 +msgid "Include reviews" +msgstr "Разом з рецензіями" + +#: bookwyrm/templates/import/import.html:99 +msgid "Privacy setting for imported reviews:" +msgstr "Налаштування приватності для імпортованих рецензій:" + +#: bookwyrm/templates/import/import.html:106 +#: bookwyrm/templates/import/import.html:108 +#: bookwyrm/templates/preferences/layout.html:43 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:78 +msgid "Import" +msgstr "Імпортувати" + +#: bookwyrm/templates/import/import.html:109 +msgid "You've reached the import limit." +msgstr "Ви досягли ліміту на імпорт." + +#: bookwyrm/templates/import/import.html:118 +msgid "Imports are temporarily disabled; thank you for your patience." +msgstr "Імпортування тимчасово відключено; дякуємо за терпіння." + +#: bookwyrm/templates/import/import.html:125 +msgid "Recent Imports" +msgstr "Останні Імпорти" + +#: bookwyrm/templates/import/import.html:130 +#: bookwyrm/templates/settings/imports/imports.html:120 +msgid "Date Created" +msgstr "Дата Створення" + +#: bookwyrm/templates/import/import.html:133 +msgid "Last Updated" +msgstr "Останнє Оновлення" + +#: bookwyrm/templates/import/import.html:136 +#: bookwyrm/templates/settings/imports/imports.html:129 +msgid "Items" +msgstr "Одиниць" + +#: bookwyrm/templates/import/import.html:145 +msgid "No recent imports" +msgstr "Останнім часом імпортів не було" + +#: bookwyrm/templates/import/import_status.html:6 +#: bookwyrm/templates/import/import_status.html:15 +#: bookwyrm/templates/import/import_status.html:29 +msgid "Import Status" +msgstr "Статус Імпорту" + +#: bookwyrm/templates/import/import_status.html:13 +#: bookwyrm/templates/import/import_status.html:27 +msgid "Retry Status" +msgstr "Статус Повторення" + +#: bookwyrm/templates/import/import_status.html:22 +#: bookwyrm/templates/settings/celery.html:45 +#: bookwyrm/templates/settings/imports/imports.html:6 +#: bookwyrm/templates/settings/imports/imports.html:9 +#: bookwyrm/templates/settings/layout.html:82 +msgid "Imports" +msgstr "Імпорти" + +#: bookwyrm/templates/import/import_status.html:39 +msgid "Import started:" +msgstr "Імпорт розпочато:" + +#: bookwyrm/templates/import/import_status.html:48 +msgid "In progress" +msgstr "Триває" + +#: bookwyrm/templates/import/import_status.html:50 +msgid "Refresh" +msgstr "Оновити" + +#: bookwyrm/templates/import/import_status.html:72 +#: bookwyrm/templates/settings/imports/imports.html:161 +msgid "Stop import" +msgstr "Зупинити імпорт" + +#: bookwyrm/templates/import/import_status.html:78 +#, python-format +msgid "%(display_counter)s item needs manual approval." +msgid_plural "%(display_counter)s items need manual approval." +msgstr[0] "%(display_counter)s елемент потребує ручного підтвердження." +msgstr[1] "%(display_counter)s елементів потребують ручного підтвердження." +msgstr[2] "%(display_counter)s елементів потребують ручного підтвердження." +msgstr[3] "%(display_counter)s елементів потребують ручного підтвердження." + +#: bookwyrm/templates/import/import_status.html:83 +#: bookwyrm/templates/import/manual_review.html:8 +msgid "Review items" +msgstr "Огляд елементів" + +#: bookwyrm/templates/import/import_status.html:89 +#, python-format +msgid "%(display_counter)s item failed to import." +msgid_plural "%(display_counter)s items failed to import." +msgstr[0] "Не вдалося імпортувати %(display_counter)s елемент." +msgstr[1] "Не вдалося імпортувати %(display_counter)s елементів." +msgstr[2] "Не вдалося імпортувати %(display_counter)s елементів." +msgstr[3] "Не вдалося імпортувати %(display_counter)s елементів." + +#: bookwyrm/templates/import/import_status.html:95 +msgid "View and troubleshoot failed items" +msgstr "Переглянути та виправити невдалі елементи." + +#: bookwyrm/templates/import/import_status.html:107 +msgid "Row" +msgstr "Рядок" + +#: bookwyrm/templates/import/import_status.html:110 +#: bookwyrm/templates/shelf/shelf.html:150 +#: bookwyrm/templates/shelf/shelf.html:172 +msgid "Title" +msgstr "Назва" + +#: bookwyrm/templates/import/import_status.html:113 +msgid "ISBN" +msgstr "ISBN" + +#: bookwyrm/templates/import/import_status.html:117 +msgid "Openlibrary key" +msgstr "Ключ Openlibrary" + +#: bookwyrm/templates/import/import_status.html:121 +#: bookwyrm/templates/shelf/shelf.html:151 +#: bookwyrm/templates/shelf/shelf.html:175 +msgid "Author" +msgstr "Автор" + +#: bookwyrm/templates/import/import_status.html:124 +msgid "Shelf" +msgstr "Полиця" + +#: bookwyrm/templates/import/import_status.html:127 +#: bookwyrm/templates/import/manual_review.html:13 +#: bookwyrm/templates/snippets/create_status.html:16 +msgid "Review" +msgstr "Рецензія" + +#: bookwyrm/templates/import/import_status.html:131 +#: bookwyrm/templates/settings/link_domains/link_table.html:9 +msgid "Book" +msgstr "Книга" + +#: bookwyrm/templates/import/import_status.html:142 +msgid "Import preview unavailable." +msgstr "Попередній перегляд імпорту недоступний." + +#: bookwyrm/templates/import/import_status.html:150 +msgid "No items currently need review" +msgstr "Наразі жоден елемент не потребує перевірки" + +#: bookwyrm/templates/import/import_status.html:186 +msgid "View imported review" +msgstr "Показати імпортовану рецензію" + +#: bookwyrm/templates/import/import_status.html:200 +msgid "Imported" +msgstr "Імпортовано" + +#: bookwyrm/templates/import/import_status.html:206 +msgid "Needs manual review" +msgstr "Потребує ручної перевірки" + +#: bookwyrm/templates/import/import_status.html:219 +msgid "Retry" +msgstr "Спробувати знову" + +#: bookwyrm/templates/import/import_status.html:237 +msgid "This import is in an old format that is no longer supported. If you would like to troubleshoot missing items from this import, click the button below to update the import format." +msgstr "Це імпорт старого формату, який більше не підтримується. Якщо ви хочете виправити невдалі елементи з цього імпорту, натисніть на кнопку нижче, щоб оновити формат імпорту." + +#: bookwyrm/templates/import/import_status.html:239 +msgid "Update import" +msgstr "Оновити імпорт" + +#: bookwyrm/templates/import/manual_review.html:5 +#: bookwyrm/templates/import/troubleshoot.html:4 +msgid "Import Troubleshooting" +msgstr "Виправлення Імпорту" + +#: bookwyrm/templates/import/manual_review.html:21 +msgid "Approving a suggestion will permanently add the suggested book to your shelves and associate your reading dates, reviews, and ratings with that book." +msgstr "Підтвердження пропозиції назавжди додасть запропоновану книгу до ваших полиць та асоціює ваші дати читання, рецензії та рейтинги з цією книгою." + +#: bookwyrm/templates/import/manual_review.html:58 +#: bookwyrm/templates/lists/curate.html:71 +#: bookwyrm/templates/settings/link_domains/link_domains.html:76 +msgid "Approve" +msgstr "Підтвердити" + +#: bookwyrm/templates/import/manual_review.html:66 +msgid "Reject" +msgstr "Відхилити" + +#: bookwyrm/templates/import/troubleshoot.html:7 +#: bookwyrm/templates/settings/imports/imports.html:138 +msgid "Failed items" +msgstr "Невдалі елементи" + +#: bookwyrm/templates/import/troubleshoot.html:12 +msgid "Troubleshooting" +msgstr "Виправлення невдалого імпорту" + +#: bookwyrm/templates/import/troubleshoot.html:20 +msgid "Re-trying an import can fix missing items in cases such as:" +msgstr "Повторна спроба імпорту може виправити пропущені елементи у таких випадках, як:" + +#: bookwyrm/templates/import/troubleshoot.html:23 +msgid "The book has been added to the instance since this import" +msgstr "Книга була додана до інстансу з моменту імпорту" + +#: bookwyrm/templates/import/troubleshoot.html:24 +msgid "A transient error or timeout caused the external data source to be unavailable." +msgstr "Непостійна помилка або тайм-аут призвела до недоступності зовнішнього джерела даних." + +#: bookwyrm/templates/import/troubleshoot.html:25 +msgid "BookWyrm has been updated since this import with a bug fix" +msgstr "З моменту цього імпорту, BookWyrm було оновлено з виправленням помилок" + +#: bookwyrm/templates/import/troubleshoot.html:28 +msgid "Contact your admin or open an issue if you are seeing unexpected failed items." +msgstr "Зв'яжіться з вашим адміністратором або сповістіть про проблему, якщо ви бачите неочікувані помилки." + +#: bookwyrm/templates/landing/invite.html:4 +#: bookwyrm/templates/landing/invite.html:8 +#: bookwyrm/templates/landing/login.html:48 +#: bookwyrm/templates/landing/reactivate.html:41 +msgid "Create an Account" +msgstr "Зареєструватися" + +#: bookwyrm/templates/landing/invite.html:22 +msgid "Sorry! This invite code is no longer valid." +msgstr "Вибачте! Цей код запрошення більше не дійсний." + +#: bookwyrm/templates/landing/landing.html:9 +msgid "Recent Books" +msgstr "Недавні Книги" + +#: bookwyrm/templates/landing/layout.html:17 +msgid "Decentralized" +msgstr "Децентралізовано" + +#: bookwyrm/templates/landing/layout.html:23 +msgid "Friendly" +msgstr "Дружньо" + +#: bookwyrm/templates/landing/layout.html:29 +msgid "Anti-Corporate" +msgstr "Антикорпоративно" + +#: bookwyrm/templates/landing/layout.html:46 +#, python-format +msgid "Join %(name)s" +msgstr "Приєднуйся до %(name)s" + +#: bookwyrm/templates/landing/layout.html:48 +msgid "Request an Invitation" +msgstr "Подати Заявку на Запрошення" + +#: bookwyrm/templates/landing/layout.html:50 +#, python-format +msgid "%(name)s registration is closed" +msgstr "реєстрація на %(name)s закрита" + +#: bookwyrm/templates/landing/layout.html:61 +msgid "Thank you! Your request has been received." +msgstr "Дякуємо, ваш запит отримано." + +#: bookwyrm/templates/landing/layout.html:90 +msgid "Your Account" +msgstr "Ваш Акаунт" + +#: bookwyrm/templates/landing/login.html:4 +msgid "Login" +msgstr "Авторизація" + +#: bookwyrm/templates/landing/login.html:7 +#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:142 +#: bookwyrm/templates/ostatus/error.html:37 +msgid "Log in" +msgstr "Увійти" + +#: bookwyrm/templates/landing/login.html:15 +msgid "Success! Email address confirmed." +msgstr "Адресу електронної пошти успішно підтверджено." + +#: bookwyrm/templates/landing/login.html:21 +#: bookwyrm/templates/landing/reactivate.html:17 +#: bookwyrm/templates/layout.html:128 bookwyrm/templates/ostatus/error.html:28 +#: bookwyrm/templates/snippets/register_form.html:4 +msgid "Username:" +msgstr "Ім'я користувача (username):" + +#: bookwyrm/templates/landing/login.html:27 +#: bookwyrm/templates/landing/password_reset.html:26 +#: bookwyrm/templates/landing/reactivate.html:23 +#: 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:139 +#: bookwyrm/templates/ostatus/error.html:34 +msgid "Forgot your password?" +msgstr "Забули пароль?" + +#: bookwyrm/templates/landing/login.html:61 +#: bookwyrm/templates/landing/reactivate.html:54 +msgid "More about this site" +msgstr "Докладніше про цей сайт" + +#: bookwyrm/templates/landing/password_reset.html:43 +#: bookwyrm/templates/preferences/change_password.html:33 +#: bookwyrm/templates/preferences/delete_user.html:35 +msgid "Confirm password:" +msgstr "Підтвердження паролю:" + +#: bookwyrm/templates/landing/password_reset_request.html:14 +#, python-format +msgid "A password reset link will be sent to %(email)s if there is an account using that email address." +msgstr "Посилання для відновлення паролю буде надіслано на %(email)s якщо існує обліковий запас з цим email." + +#: bookwyrm/templates/landing/password_reset_request.html:20 +msgid "A link to reset your password will be sent to your email address" +msgstr "Посилання для відновлення пароля було надіслано на вашу електронну адресу" + +#: bookwyrm/templates/landing/password_reset_request.html:34 +msgid "Reset password" +msgstr "Скинути пароль" + +#: bookwyrm/templates/landing/reactivate.html:4 +#: bookwyrm/templates/landing/reactivate.html:7 +msgid "Reactivate Account" +msgstr "Повторна Активація Облікового Запису" + +#: bookwyrm/templates/landing/reactivate.html:32 +msgid "Reactivate account" +msgstr "Реактивувати акаунт" + +#: bookwyrm/templates/layout.html:13 +#, python-format +msgid "%(site_name)s search" +msgstr "Пошук по %(site_name)s" + +#: bookwyrm/templates/layout.html:39 +msgid "Search for a book, user, or list" +msgstr "Шукати книгу, користувача або список" + +#: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +msgid "Scan Barcode" +msgstr "Сканувати Штрих-код" + +#: bookwyrm/templates/layout.html:69 +msgid "Main navigation menu" +msgstr "Головне меню навігації" + +#: bookwyrm/templates/layout.html:134 bookwyrm/templates/ostatus/error.html:33 +msgid "password" +msgstr "пароль" + +#: bookwyrm/templates/layout.html:136 +msgid "Show/Hide password" +msgstr "Показати/Приховати пароль" + +#: bookwyrm/templates/layout.html:150 +msgid "Join" +msgstr "Приєднатися" + +#: bookwyrm/templates/layout.html:196 +msgid "Successfully posted status" +msgstr "Статус успішно опубліковано" + +#: bookwyrm/templates/layout.html:197 +msgid "Error posting status" +msgstr "Помилка публікації статусу" + +#: bookwyrm/templates/lists/add_item_modal.html:8 +#, python-format +msgid "Add \"%(title)s\" to this list" +msgstr "Додати \"%(title)s\" до цього списку" + +#: bookwyrm/templates/lists/add_item_modal.html:12 +#, python-format +msgid "Suggest \"%(title)s\" for this list" +msgstr "Запропонувати додати \"%(title)s\" у цей список" + +#: bookwyrm/templates/lists/add_item_modal.html:41 +#: bookwyrm/templates/lists/list.html:257 +msgid "Suggest" +msgstr "Запропонувати" + +#: bookwyrm/templates/lists/bookmark_button.html:30 +msgid "Un-save" +msgstr "Видалити" + +#: bookwyrm/templates/lists/created_text.html:5 +#, python-format +msgid "Created by %(username)s and managed by %(groupname)s" +msgstr "Створено %(username)s і керується %(groupname)s" + +#: bookwyrm/templates/lists/created_text.html:7 +#, python-format +msgid "Created and curated by %(username)s" +msgstr "Створено та курується %(username)s" + +#: bookwyrm/templates/lists/created_text.html:9 +#, python-format +msgid "Created by %(username)s" +msgstr "Створено %(username)s" + +#: bookwyrm/templates/lists/curate.html:12 +msgid "Curate" +msgstr "Курувати" + +#: bookwyrm/templates/lists/curate.html:21 +msgid "Pending Books" +msgstr "Книги в Очікуванні" + +#: bookwyrm/templates/lists/curate.html:24 +msgid "You're all set!" +msgstr "Все готово!" + +#: bookwyrm/templates/lists/curate.html:45 +#: bookwyrm/templates/lists/list.html:93 +#, python-format +msgid "%(username)s says:" +msgstr "%(username)s пише:" + +#: bookwyrm/templates/lists/curate.html:55 +msgid "Suggested by" +msgstr "Запропоновано" + +#: bookwyrm/templates/lists/curate.html:77 +msgid "Discard" +msgstr "Скасувати" + +#: bookwyrm/templates/lists/delete_list_modal.html:4 +msgid "Delete this list?" +msgstr "Видалити цей список?" + +#: bookwyrm/templates/lists/edit_form.html:5 +#: bookwyrm/templates/lists/layout.html:23 +msgid "Edit List" +msgstr "Редагувати Список" + +#: bookwyrm/templates/lists/embed-list.html:8 +#, python-format +msgid "%(list_name)s, a list by %(owner)s" +msgstr "%(list_name)s, список від %(owner)s" + +#: bookwyrm/templates/lists/embed-list.html:20 +#, python-format +msgid "on %(site_name)s" +msgstr "на %(site_name)s" + +#: bookwyrm/templates/lists/embed-list.html:29 +msgid "This list is currently empty" +msgstr "Цей список наразі порожній" + +#: bookwyrm/templates/lists/form.html:19 +msgid "List curation:" +msgstr "Як буде куруватися список:" + +#: bookwyrm/templates/lists/form.html:31 +msgid "Closed" +msgstr "Закритий" + +#: bookwyrm/templates/lists/form.html:34 +msgid "Only you can add and remove books to this list" +msgstr "Тільки ви можете додавати та видаляти книги з цього списку" + +#: bookwyrm/templates/lists/form.html:48 +msgid "Curated" +msgstr "Курований" + +#: bookwyrm/templates/lists/form.html:51 +msgid "Anyone can suggest books, subject to your approval" +msgstr "Будь-хто може пропонувати книги, ви їх схвалюєте" + +#: bookwyrm/templates/lists/form.html:65 +msgctxt "curation type" +msgid "Open" +msgstr "Відкритий" + +#: bookwyrm/templates/lists/form.html:68 +msgid "Anyone can add books to this list" +msgstr "Будь-хто може додати книги до цього списку" + +#: bookwyrm/templates/lists/form.html:82 +msgid "Group" +msgstr "Груповий" + +#: bookwyrm/templates/lists/form.html:85 +msgid "Group members can add to and remove from this list" +msgstr "Учасники групи можуть додавати та видаляти книги з цього списку" + +#: bookwyrm/templates/lists/form.html:90 +msgid "Select Group" +msgstr "Вибрати Групу" + +#: bookwyrm/templates/lists/form.html:94 +msgid "Select a group" +msgstr "Виберіть групу" + +#: bookwyrm/templates/lists/form.html:105 +msgid "You don't have any Groups yet!" +msgstr "У вас немає жодної групи!" + +#: bookwyrm/templates/lists/form.html:107 +msgid "Create a Group" +msgstr "Створити Групу" + +#: bookwyrm/templates/lists/form.html:121 +msgid "Delete list" +msgstr "Видалити список" + +#: bookwyrm/templates/lists/item_notes_field.html:7 +#: bookwyrm/templates/settings/federation/edit_instance.html:86 +msgid "Notes:" +msgstr "Нотатки:" + +#: bookwyrm/templates/lists/item_notes_field.html:19 +msgid "An optional note that will be displayed with the book." +msgstr "Додаткові примітки, що показуватимуться з книгою." + +#: bookwyrm/templates/lists/list.html:37 +msgid "That book is already on this list." +msgstr "Ця книга вже є в цьому списку." + +#: bookwyrm/templates/lists/list.html:45 +msgid "You successfully suggested a book for this list!" +msgstr "Ви успішно запропонували книгу для цього списку!" + +#: bookwyrm/templates/lists/list.html:47 +msgid "You successfully added a book to this list!" +msgstr "Ви успішно додали книгу до цього списку!" + +#: bookwyrm/templates/lists/list.html:54 +msgid "This list is currently empty." +msgstr "Цей список наразі порожній." + +#: bookwyrm/templates/lists/list.html:104 +msgid "Edit notes" +msgstr "Редагувати нотатки" + +#: bookwyrm/templates/lists/list.html:119 +msgid "Add notes" +msgstr "Додати нотатки" + +#: bookwyrm/templates/lists/list.html:131 +#, python-format +msgid "Added by %(username)s" +msgstr "Додано %(username)s" + +#: bookwyrm/templates/lists/list.html:146 +msgid "List position" +msgstr "Позиція в списку" + +#: bookwyrm/templates/lists/list.html:152 +#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:23 +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 "Видалити" + +#: bookwyrm/templates/lists/list.html:181 +#: bookwyrm/templates/lists/list.html:198 +msgid "Sort List" +msgstr "Відсортувати Список" + +#: bookwyrm/templates/lists/list.html:191 +msgid "Direction" +msgstr "Напрямок сортування" + +#: bookwyrm/templates/lists/list.html:205 +msgid "Add Books" +msgstr "Додати Книги" + +#: bookwyrm/templates/lists/list.html:207 +msgid "Suggest Books" +msgstr "Запропонувати Книги" + +#: bookwyrm/templates/lists/list.html:218 +msgid "search" +msgstr "пошук" + +#: bookwyrm/templates/lists/list.html:224 +msgid "Clear search" +msgstr "Очистити пошук" + +#: bookwyrm/templates/lists/list.html:229 +#, python-format +msgid "No books found matching the query \"%(query)s\"" +msgstr "По запиту \"%(query)s\" не знайдено жодної книги" + +#: bookwyrm/templates/lists/list.html:268 +msgid "Embed this list on a website" +msgstr "Вставити цей список на сайт" + +#: bookwyrm/templates/lists/list.html:276 +msgid "Copy embed code" +msgstr "Скопіювати код вставки" + +#: bookwyrm/templates/lists/list.html:278 +#, python-format +msgid "%(list_name)s, a list by %(owner)s on %(site_name)s" +msgstr "%(list_name)s, список %(owner)s на %(site_name)s" + +#: bookwyrm/templates/lists/list_items.html:15 +msgid "Saved" +msgstr "Збережено" + +#: bookwyrm/templates/lists/list_items.html:50 +msgid "No lists found." +msgstr "Не знайдено жодного списку." + +#: bookwyrm/templates/lists/lists.html:14 bookwyrm/templates/user/lists.html:14 +msgid "Your Lists" +msgstr "Ваші Списки" + +#: bookwyrm/templates/lists/lists.html:36 +msgid "All Lists" +msgstr "Всі Списки" + +#: bookwyrm/templates/lists/lists.html:40 +msgid "Saved Lists" +msgstr "Збережені Списки" + +#: bookwyrm/templates/moved.html:27 +#, python-format +msgid "You have moved your account to %(username)s" +msgstr "Ви перемістили свій акаунт на %(username)s" + +#: 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\"" +msgstr "%(related_user)s прийняв(-ла) ваше запрошення до групи \"%(group_name)s\"" + +#: bookwyrm/templates/notifications/items/accept.html:26 +#, python-format +msgid "%(related_user)s and %(second_user)s accepted your invitation to join group \"%(group_name)s\"" +msgstr "%(related_user)s та %(second_user)s прийняли ваше запрошення до групи \"%(group_name)s\"" + +#: bookwyrm/templates/notifications/items/accept.html:36 +#, python-format +msgid "%(related_user)s and %(other_user_display_count)s others accepted your invitation to join group \"%(group_name)s\"" +msgstr "%(related_user)s та %(other_user_display_count)s інших прийняли ваше запрошення до групи \"%(group_name)s\"" + +#: bookwyrm/templates/notifications/items/add.html:33 +#, python-format +msgid "%(related_user)s added %(book_title)s to your list \"%(list_name)s\"" +msgstr "%(related_user)s додав(-ла) %(book_title)s до вашого списку \"%(list_name)s\"" + +#: bookwyrm/templates/notifications/items/add.html:39 +#, python-format +msgid "%(related_user)s suggested adding %(book_title)s to your list \"%(list_name)s\"" +msgstr "%(related_user)s пропонує додати %(book_title)s до вашого списку \"%(list_name)s\"" + +#: bookwyrm/templates/notifications/items/add.html:47 +#, python-format +msgid "%(related_user)s added %(book_title)s and %(second_book_title)s to your list \"%(list_name)s\"" +msgstr "%(related_user)s додав(-ла) %(book_title)s та %(second_book_title)s до вашого списку \"%(list_name)s\"" + +#: bookwyrm/templates/notifications/items/add.html:54 +#, python-format +msgid "%(related_user)s suggested adding %(book_title)s and %(second_book_title)s to your list \"%(list_name)s\"" +msgstr "%(related_user)s пропонує додати %(book_title)s та %(second_book_title)s до вашого списку \"%(list_name)s\"" + +#: bookwyrm/templates/notifications/items/add.html:66 +#, python-format +msgid "%(related_user)s added a book to one of your lists" +msgstr "%(related_user)s додав(-ла) книгу до одного з ваших списків" + +#: bookwyrm/templates/notifications/items/add.html:72 +#, python-format +msgid "%(related_user)s added %(book_title)s, %(second_book_title)s, and %(display_count)s other book to your list \"%(list_name)s\"" +msgid_plural "%(related_user)s added %(book_title)s, %(second_book_title)s, and %(display_count)s other books to your list \"%(list_name)s\"" +msgstr[0] "%(related_user)s додав(-ла) %(book_title)s, %(second_book_title)s, та %(display_count)s іншу книгу до вашого списку \"%(list_name)s\"" +msgstr[1] "%(related_user)s додав(-ла) %(book_title)s, %(second_book_title)s, та %(display_count)s інших книг до вашого списку \"%(list_name)s\"" +msgstr[2] "%(related_user)s додав(-ла) %(book_title)s, %(second_book_title)s, та %(display_count)s інших книг до вашого списку \"%(list_name)s\"" +msgstr[3] "%(related_user)s додав(-ла) %(book_title)s, %(second_book_title)s, та %(display_count)s інших книг до вашого списку \"%(list_name)s\"" + +#: bookwyrm/templates/notifications/items/add.html:88 +#, python-format +msgid "%(related_user)s suggested adding %(book_title)s, %(second_book_title)s, and %(display_count)s other book to your list \"%(list_name)s\"" +msgid_plural "%(related_user)s suggested adding %(book_title)s, %(second_book_title)s, and %(display_count)s other books to your list \"%(list_name)s\"" +msgstr[0] "%(related_user)s пропонує додати %(book_title)s, %(second_book_title)s, та %(display_count)s іншу книгу до вашого списку \"%(list_name)s\"" +msgstr[1] "%(related_user)s пропонує додати %(book_title)s, %(second_book_title)s, та %(display_count)s інших книг до вашого списку \"%(list_name)s\"" +msgstr[2] "%(related_user)s пропонує додати %(book_title)s, %(second_book_title)s, та %(display_count)s інших книг до вашого списку \"%(list_name)s\"" +msgstr[3] "%(related_user)s пропонує додати %(book_title)s, %(second_book_title)s, та %(display_count)s інших книг до вашого списку \"%(list_name)s\"" + +#: bookwyrm/templates/notifications/items/boost.html:21 +#, python-format +msgid "%(related_user)s boosted your review of %(book_title)s" +msgstr "%(related_user)s поширив(-ла) вау рецензію на %(book_title)s" + +#: bookwyrm/templates/notifications/items/boost.html:27 +#, python-format +msgid "%(related_user)s and %(second_user)s boosted your review of %(book_title)s" +msgstr "%(related_user)s та %(second_user)s поширили вашу рецензію на %(book_title)s" + +#: bookwyrm/templates/notifications/items/boost.html:36 +#, python-format +msgid "%(related_user)s and %(other_user_display_count)s others boosted your review of %(book_title)s" +msgstr "%(related_user)s та %(other_user_display_count)s інших поширили вашу рецензію на %(book_title)s" + +#: bookwyrm/templates/notifications/items/boost.html:44 +#, python-format +msgid "%(related_user)s boosted your comment on %(book_title)s" +msgstr "%(related_user)s поширив(-ла) ваш коментар до %(book_title)s" + +#: bookwyrm/templates/notifications/items/boost.html:50 +#, python-format +msgid "%(related_user)s and %(second_user)s boosted your comment on %(book_title)s" +msgstr "%(related_user)s та %(second_user)s поширили ваш коментар до %(book_title)s" + +#: bookwyrm/templates/notifications/items/boost.html:59 +#, python-format +msgid "%(related_user)s and %(other_user_display_count)s others boosted your comment on %(book_title)s" +msgstr "%(related_user)s та %(other_user_display_count)s інших поширили ваш коментар до %(book_title)s" + +#: bookwyrm/templates/notifications/items/boost.html:67 +#, python-format +msgid "%(related_user)s boosted your quote from %(book_title)s" +msgstr "%(related_user)s поширив(-ла) вашу цитату з %(book_title)s" + +#: bookwyrm/templates/notifications/items/boost.html:73 +#, python-format +msgid "%(related_user)s and %(second_user)s boosted your quote from %(book_title)s" +msgstr "%(related_user)s та %(second_user)s поширили вашу цитату з %(book_title)s" + +#: bookwyrm/templates/notifications/items/boost.html:82 +#, python-format +msgid "%(related_user)s and %(other_user_display_count)s others boosted your quote from %(book_title)s" +msgstr "%(related_user)s та %(other_user_display_count)s інших поширили вашу цитату з %(book_title)s" + +#: bookwyrm/templates/notifications/items/boost.html:90 +#, python-format +msgid "%(related_user)s boosted your status" +msgstr "%(related_user)s поширив(-ла) ваш статус" + +#: bookwyrm/templates/notifications/items/boost.html:96 +#, python-format +msgid "%(related_user)s and %(second_user)s boosted your status" +msgstr "%(related_user)s та %(second_user)s поширили ваш статус" + +#: bookwyrm/templates/notifications/items/boost.html:105 +#, python-format +msgid "%(related_user)s and %(other_user_display_count)s others boosted your status" +msgstr "%(related_user)s та %(other_user_display_count)s інших поширили ваш статус" + +#: bookwyrm/templates/notifications/items/fav.html:21 +#, python-format +msgid "%(related_user)s liked your review of %(book_title)s" +msgstr "%(related_user)s сподобалась ваша рецензія на %(book_title)s" + +#: bookwyrm/templates/notifications/items/fav.html:27 +#, python-format +msgid "%(related_user)s and %(second_user)s liked your review of %(book_title)s" +msgstr "%(related_user)s та %(second_user)s сподобалась ваша рецензія на %(book_title)s" + +#: bookwyrm/templates/notifications/items/fav.html:36 +#, python-format +msgid "%(related_user)s and %(other_user_display_count)s others liked your review of %(book_title)s" +msgstr "%(related_user)s та %(other_user_display_count)s іншим сподобалась ваша рецензія на %(book_title)s" + +#: bookwyrm/templates/notifications/items/fav.html:44 +#, python-format +msgid "%(related_user)s liked your comment on %(book_title)s" +msgstr "%(related_user)s сподобався ваш коментар до %(book_title)s" + +#: bookwyrm/templates/notifications/items/fav.html:50 +#, python-format +msgid "%(related_user)s and %(second_user)s liked your comment on %(book_title)s" +msgstr "%(related_user)s та %(second_user)s сподобався ваш коментар до %(book_title)s" + +#: bookwyrm/templates/notifications/items/fav.html:59 +#, python-format +msgid "%(related_user)s and %(other_user_display_count)s others liked your comment on %(book_title)s" +msgstr "%(related_user)s та %(other_user_display_count)s іншим сподобався ваш коментар до %(book_title)s" + +#: bookwyrm/templates/notifications/items/fav.html:67 +#, python-format +msgid "%(related_user)s liked your quote from %(book_title)s" +msgstr "%(related_user)s сподобалась ваша цитата з %(book_title)s" + +#: bookwyrm/templates/notifications/items/fav.html:73 +#, python-format +msgid "%(related_user)s and %(second_user)s liked your quote from %(book_title)s" +msgstr "%(related_user)s та %(second_user)s сподобалась ваша цитата з %(book_title)s" + +#: bookwyrm/templates/notifications/items/fav.html:82 +#, python-format +msgid "%(related_user)s and %(other_user_display_count)s others liked your quote from %(book_title)s" +msgstr "%(related_user)s та %(other_user_display_count)s іншим сподобалась ваша цитата з %(book_title)s" + +#: bookwyrm/templates/notifications/items/fav.html:90 +#, python-format +msgid "%(related_user)s liked your status" +msgstr "%(related_user)s сподобався ваш статус" + +#: bookwyrm/templates/notifications/items/fav.html:96 +#, python-format +msgid "%(related_user)s and %(second_user)s liked your status" +msgstr "%(related_user)s та %(second_user)s сподобався ваш статус" + +#: bookwyrm/templates/notifications/items/fav.html:105 +#, python-format +msgid "%(related_user)s and %(other_user_display_count)s others liked your status" +msgstr "%(related_user)s та %(other_user_display_count)s іншим сподобався ваш статус" + +#: bookwyrm/templates/notifications/items/follow.html:16 +#, python-format +msgid "%(related_user)s followed you" +msgstr "%(related_user)s тепер слідкує за вами" + +#: bookwyrm/templates/notifications/items/follow.html:20 +#, python-format +msgid "%(related_user)s and %(second_user)s followed you" +msgstr "%(related_user)s та %(second_user)s тепер слідкують за вами" + +#: bookwyrm/templates/notifications/items/follow.html:25 +#, python-format +msgid "%(related_user)s and %(other_user_display_count)s others followed you" +msgstr "%(related_user)s та %(other_user_display_count)s інших тепер слідкують за вами" + +#: bookwyrm/templates/notifications/items/follow_request.html:15 +#, python-format +msgid "%(related_user)s sent you a follow request" +msgstr "%(related_user)s надіслав(-ла) вам запит на підписку" + +#: bookwyrm/templates/notifications/items/import.html:14 +#, python-format +msgid "Your import completed." +msgstr "Ваш імпорт завершено." + +#: bookwyrm/templates/notifications/items/invite.html:16 +#, python-format +msgid "%(related_user)s invited you to join the group \"%(group_name)s\"" +msgstr "%(related_user)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\"" +msgstr "приєднався до вашої групи \"%(group_name)s\"" + +#: bookwyrm/templates/notifications/items/leave.html:18 +#, python-format +msgid "%(related_user)s has left your group \"%(group_name)s\"" +msgstr "%(related_user)s вийшов(-ла) з вашої групи \"%(group_name)s\"" + +#: bookwyrm/templates/notifications/items/leave.html:26 +#, python-format +msgid "%(related_user)s and %(second_user)s have left your group \"%(group_name)s\"" +msgstr "%(related_user)s та %(second_user)s вийшли з вашої групи \"%(group_name)s\"" + +#: bookwyrm/templates/notifications/items/leave.html:36 +#, python-format +msgid "%(related_user)s and %(other_user_display_count)s others have left your group \"%(group_name)s\"" +msgstr "%(related_user)s та %(other_user_display_count)s інших вийшли з вашої групи \"%(group_name)s\"" + +#: bookwyrm/templates/notifications/items/link_domain.html:15 +#, python-format +msgid "A new link domain needs review" +msgid_plural "%(display_count)s new link domains need moderation" +msgstr[0] "Новий домен посилання потребує перевірки" +msgstr[1] "%(display_count)s нових доменів посилань потребують модерації" +msgstr[2] "%(display_count)s нових доменів посилань потребують модерації" +msgstr[3] "%(display_count)s нових доменів посилань потребують модерації" + +#: bookwyrm/templates/notifications/items/mention.html:20 +#, python-format +msgid "%(related_user)s mentioned you in a review of %(book_title)s" +msgstr "%(related_user)s згадав(-ла) вас в рецензії на %(book_title)s" + +#: bookwyrm/templates/notifications/items/mention.html:26 +#, python-format +msgid "%(related_user)s mentioned you in a comment on %(book_title)s" +msgstr "%(related_user)s згадав(-ла) вас в коментарі до %(book_title)s" + +#: bookwyrm/templates/notifications/items/mention.html:32 +#, python-format +msgid "%(related_user)s mentioned you in a quote from %(book_title)s" +msgstr "%(related_user)s згадав(-ла) вас в цитаті з %(book_title)s" + +#: bookwyrm/templates/notifications/items/mention.html:38 +#, python-format +msgid "%(related_user)s mentioned you in a status" +msgstr "%(related_user)s згадав(-ла) вас в статусі" + +#: bookwyrm/templates/notifications/items/move_user.html:18 +#, python-format +msgid "%(related_user)s has moved to %(username)s" +msgstr "%(related_user)s переміщено на %(username)s" + +#: bookwyrm/templates/notifications/items/move_user.html:25 +#, python-format +msgid "%(related_user)s has undone their move" +msgstr "%(related_user)s скасував своє переміщення" + +#: bookwyrm/templates/notifications/items/remove.html:17 +#, python-format +msgid "has been removed from your group \"%(group_name)s\"" +msgstr "видалено з вашої групи \"%(group_name)s\"" + +#: bookwyrm/templates/notifications/items/remove.html:23 +#, python-format +msgid "You have been removed from the \"%(group_name)s\" group" +msgstr "Ви були виключені з групи \"%(group_name)s\"" + +#: bookwyrm/templates/notifications/items/reply.html:21 +#, python-format +msgid "%(related_user)s replied to your review of %(book_title)s" +msgstr "%(related_user)s відповів(-ла) на вашу рецензію на %(book_title)s" + +#: bookwyrm/templates/notifications/items/reply.html:27 +#, python-format +msgid "%(related_user)s replied to your comment on %(book_title)s" +msgstr "%(related_user)s відповів(-ла) на ваш коментар до %(book_title)s" + +#: bookwyrm/templates/notifications/items/reply.html:33 +#, python-format +msgid "%(related_user)s replied to your quote from %(book_title)s" +msgstr "%(related_user)s відповів(-ла) на вашу цитату з %(book_title)s" + +#: bookwyrm/templates/notifications/items/reply.html:39 +#, python-format +msgid "%(related_user)s replied to your status" +msgstr "%(related_user)s відповів(-ла) на ваш статус" + +#: bookwyrm/templates/notifications/items/report.html:15 +#, python-format +msgid "A new report needs moderation" +msgid_plural "%(display_count)s new reports need moderation" +msgstr[0] "Нова скарга потребує модерації" +msgstr[1] "%(display_count)s нові скарги потребують модерації" +msgstr[2] "%(display_count)s нових скарг потребують модерації" +msgstr[3] "%(display_count)s нових скарг потребують модерації" + +#: bookwyrm/templates/notifications/items/status_preview.html:4 +#: bookwyrm/templates/snippets/status/content_status.html:62 +msgid "Content warning" +msgstr "Попередження про вміст" + +#: bookwyrm/templates/notifications/items/update.html:16 +#, python-format +msgid "has changed the privacy level for %(group_name)s" +msgstr "" + +#: bookwyrm/templates/notifications/items/update.html:20 +#, python-format +msgid "has changed the name of %(group_name)s" +msgstr "" + +#: bookwyrm/templates/notifications/items/update.html:24 +#, python-format +msgid "has changed the description of %(group_name)s" +msgstr "" + +#: bookwyrm/templates/notifications/notifications_page.html:19 +msgid "Delete notifications" +msgstr "" + +#: bookwyrm/templates/notifications/notifications_page.html:31 +msgid "All" +msgstr "" + +#: bookwyrm/templates/notifications/notifications_page.html:35 +msgid "Mentions" +msgstr "" + +#: bookwyrm/templates/notifications/notifications_page.html:47 +msgid "You're all caught up!" +msgstr "" + +#: bookwyrm/templates/ostatus/error.html:7 +#, python-format +msgid "%(account)s is not a valid username" +msgstr "" + +#: bookwyrm/templates/ostatus/error.html:8 +#: bookwyrm/templates/ostatus/error.html:13 +msgid "Check you have the correct username before trying again" +msgstr "" + +#: bookwyrm/templates/ostatus/error.html:12 +#, python-format +msgid "%(account)s could not be found or %(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 \n" "Language-Team: Chinese Simplified\n" "Language: zh\n" @@ -42,15 +42,15 @@ msgstr "{i} 次使用" msgid "Unlimited" msgstr "不受限" -#: bookwyrm/forms/edit_user.py:88 +#: bookwyrm/forms/edit_user.py:104 msgid "Incorrect password" msgstr "密码错误" -#: bookwyrm/forms/edit_user.py:95 bookwyrm/forms/landing.py:90 +#: bookwyrm/forms/edit_user.py:111 bookwyrm/forms/landing.py:90 msgid "Password does not match" msgstr "两次输入的密码不一致" -#: bookwyrm/forms/edit_user.py:118 +#: bookwyrm/forms/edit_user.py:134 msgid "Incorrect Password" msgstr "密码错误" @@ -102,8 +102,8 @@ msgstr "列表顺序" msgid "Book Title" msgstr "书名" -#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:156 -#: bookwyrm/templates/shelf/shelf.html:188 +#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:158 +#: bookwyrm/templates/shelf/shelf.html:190 #: bookwyrm/templates/snippets/create_status/review.html:32 msgid "Rating" msgstr "评价" @@ -141,11 +141,11 @@ msgstr "警告" msgid "Danger" msgstr "危险" -#: bookwyrm/models/antispam.py:112 bookwyrm/models/antispam.py:146 +#: bookwyrm/models/antispam.py:113 bookwyrm/models/antispam.py:147 msgid "Automatically generated report" msgstr "自动生成的举报" -#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:47 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:48 #: bookwyrm/models/link.py:72 bookwyrm/templates/import/import_status.html:214 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" @@ -171,23 +171,23 @@ msgstr "仲裁员删除" msgid "Domain block" msgstr "域名屏蔽" -#: bookwyrm/models/book.py:283 +#: bookwyrm/models/book.py:282 msgid "Audiobook" msgstr "有声书籍" -#: bookwyrm/models/book.py:284 +#: bookwyrm/models/book.py:283 msgid "eBook" msgstr "电子书" -#: bookwyrm/models/book.py:285 +#: bookwyrm/models/book.py:284 msgid "Graphic novel" msgstr "图像小说" -#: bookwyrm/models/book.py:286 +#: bookwyrm/models/book.py:285 msgid "Hardcover" msgstr "精装" -#: bookwyrm/models/book.py:287 +#: bookwyrm/models/book.py:286 msgid "Paperback" msgstr "平装" @@ -205,26 +205,26 @@ msgstr "跨站" msgid "Blocked" msgstr "已屏蔽" -#: bookwyrm/models/fields.py:29 +#: bookwyrm/models/fields.py:35 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "%(value)s 不是有效的 remote_id" -#: bookwyrm/models/fields.py:38 bookwyrm/models/fields.py:47 +#: bookwyrm/models/fields.py:44 bookwyrm/models/fields.py:53 #, python-format msgid "%(value)s is not a valid username" msgstr "%(value)s 不是有效的用户名" -#: bookwyrm/models/fields.py:192 bookwyrm/templates/layout.html:128 +#: bookwyrm/models/fields.py:198 bookwyrm/templates/layout.html:129 #: bookwyrm/templates/ostatus/error.html:29 msgid "username" msgstr "用户名" -#: bookwyrm/models/fields.py:197 +#: bookwyrm/models/fields.py:203 msgid "A user with that username already exists." msgstr "已经存在使用该用户名的用户。" -#: bookwyrm/models/fields.py:216 +#: bookwyrm/models/fields.py:222 #: bookwyrm/templates/snippets/privacy-icons.html:3 #: bookwyrm/templates/snippets/privacy-icons.html:4 #: bookwyrm/templates/snippets/privacy_select.html:11 @@ -232,7 +232,7 @@ msgstr "已经存在使用该用户名的用户。" msgid "Public" msgstr "公开" -#: bookwyrm/models/fields.py:217 +#: bookwyrm/models/fields.py:223 #: bookwyrm/templates/snippets/privacy-icons.html:7 #: bookwyrm/templates/snippets/privacy-icons.html:8 #: bookwyrm/templates/snippets/privacy_select.html:14 @@ -240,7 +240,7 @@ msgstr "公开" msgid "Unlisted" msgstr "不公开" -#: bookwyrm/models/fields.py:218 +#: bookwyrm/models/fields.py:224 #: bookwyrm/templates/snippets/privacy_select.html:17 #: bookwyrm/templates/user/relationships/followers.html:6 #: bookwyrm/templates/user/relationships/followers.html:11 @@ -249,7 +249,7 @@ msgstr "不公开" msgid "Followers" msgstr "关注者" -#: bookwyrm/models/fields.py:219 +#: bookwyrm/models/fields.py:225 #: bookwyrm/templates/snippets/create_status/post_options_block.html:6 #: bookwyrm/templates/snippets/privacy-icons.html:15 #: bookwyrm/templates/snippets/privacy-icons.html:16 @@ -258,30 +258,29 @@ msgstr "关注者" msgid "Private" msgstr "私密" -#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:174 +#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:174 #: bookwyrm/templates/settings/imports/imports.html:98 -#: bookwyrm/templates/settings/users/user_admin.html:81 -#: bookwyrm/templates/settings/users/user_info.html:28 +#: bookwyrm/templates/snippets/user_active_tag.html:8 msgid "Active" msgstr "活跃" -#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:172 +#: bookwyrm/models/import_job.py:50 bookwyrm/templates/import/import.html:172 msgid "Complete" msgstr "已完成" -#: bookwyrm/models/import_job.py:50 +#: bookwyrm/models/import_job.py:51 msgid "Stopped" msgstr "已停止" -#: bookwyrm/models/import_job.py:83 bookwyrm/models/import_job.py:91 +#: bookwyrm/models/import_job.py:84 bookwyrm/models/import_job.py:92 msgid "Import stopped" msgstr "导入停止" -#: bookwyrm/models/import_job.py:363 bookwyrm/models/import_job.py:388 +#: bookwyrm/models/import_job.py:356 bookwyrm/models/import_job.py:381 msgid "Error loading book" msgstr "加载书籍时出错" -#: bookwyrm/models/import_job.py:372 +#: bookwyrm/models/import_job.py:365 msgid "Could not find a match for book" msgstr "找不到匹配的书" @@ -352,122 +351,143 @@ msgstr "" msgid "Deleted item" msgstr "" -#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:307 +#: bookwyrm/models/user.py:33 bookwyrm/templates/book/book.html:307 msgid "Reviews" msgstr "书评" -#: bookwyrm/models/user.py:33 +#: bookwyrm/models/user.py:34 msgid "Comments" msgstr "评论" -#: bookwyrm/models/user.py:34 +#: bookwyrm/models/user.py:35 msgid "Quotations" msgstr "引用" -#: bookwyrm/models/user.py:35 +#: bookwyrm/models/user.py:36 msgid "Everything else" msgstr "所有其它内容" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home Timeline" msgstr "主页时间线" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home" msgstr "主页" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 msgid "Books Timeline" msgstr "书目时间线" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 -#: bookwyrm/templates/user/layout.html:97 +#: bookwyrm/templates/user/layout.html:107 msgid "Books" msgstr "书目" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:313 msgid "English" msgstr "English(英语)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:314 msgid "Català (Catalan)" msgstr "Català (加泰罗尼亚语)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:315 msgid "Deutsch (German)" msgstr "Deutsch(德语)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:316 msgid "Esperanto (Esperanto)" msgstr "" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:317 msgid "Español (Spanish)" msgstr "Español(西班牙语)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:318 msgid "Euskara (Basque)" msgstr "" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:319 msgid "Galego (Galician)" msgstr "Galego(加利西亚语)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:320 msgid "Italiano (Italian)" msgstr "Italiano(意大利语)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:321 msgid "Suomi (Finnish)" msgstr "Suomi (Finnish/芬兰语)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:322 msgid "Français (French)" msgstr "Français(法语)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:323 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių(立陶宛语)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:324 msgid "Nederlands (Dutch)" msgstr "" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:325 msgid "Norsk (Norwegian)" msgstr "Norsk(挪威语)" -#: bookwyrm/settings.py:309 +#: bookwyrm/settings.py:326 msgid "Polski (Polish)" msgstr "Polski (波兰语)" -#: bookwyrm/settings.py:310 +#: bookwyrm/settings.py:327 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil(巴西葡萄牙语)" -#: bookwyrm/settings.py:311 +#: bookwyrm/settings.py:328 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu(欧洲葡萄牙语)" -#: bookwyrm/settings.py:312 +#: bookwyrm/settings.py:329 msgid "Română (Romanian)" msgstr "Română (罗马尼亚语)" -#: bookwyrm/settings.py:313 +#: bookwyrm/settings.py:330 msgid "Svenska (Swedish)" msgstr "Svenska(瑞典语)" -#: bookwyrm/settings.py:314 +#: bookwyrm/settings.py:331 +msgid "Українська (Ukrainian)" +msgstr "" + +#: bookwyrm/settings.py:332 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文" -#: bookwyrm/settings.py:315 +#: bookwyrm/settings.py:333 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文(繁体中文)" +#: bookwyrm/templates/403.html:5 +msgid "Oh no!" +msgstr "" + +#: bookwyrm/templates/403.html:9 bookwyrm/templates/landing/invite.html:21 +msgid "Permission Denied" +msgstr "没有权限" + +#: bookwyrm/templates/403.html:11 +#, python-format +msgid "You do not have permission to view this page or perform this action. Your user permission level is %(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 \n" "Language-Team: Chinese Traditional\n" "Language: zh\n" @@ -42,15 +42,15 @@ msgstr "" msgid "Unlimited" msgstr "不受限" -#: bookwyrm/forms/edit_user.py:88 +#: bookwyrm/forms/edit_user.py:104 msgid "Incorrect password" msgstr "密碼不正確" -#: bookwyrm/forms/edit_user.py:95 bookwyrm/forms/landing.py:90 +#: bookwyrm/forms/edit_user.py:111 bookwyrm/forms/landing.py:90 msgid "Password does not match" msgstr "密碼不一致" -#: bookwyrm/forms/edit_user.py:118 +#: bookwyrm/forms/edit_user.py:134 msgid "Incorrect Password" msgstr "密碼不正確" @@ -102,8 +102,8 @@ msgstr "列表順序" msgid "Book Title" msgstr "書名" -#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:156 -#: bookwyrm/templates/shelf/shelf.html:188 +#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:158 +#: bookwyrm/templates/shelf/shelf.html:190 #: bookwyrm/templates/snippets/create_status/review.html:32 msgid "Rating" msgstr "評價" @@ -141,11 +141,11 @@ msgstr "警告" msgid "Danger" msgstr "危險" -#: bookwyrm/models/antispam.py:112 bookwyrm/models/antispam.py:146 +#: bookwyrm/models/antispam.py:113 bookwyrm/models/antispam.py:147 msgid "Automatically generated report" msgstr "自動生成的報告" -#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:47 +#: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:48 #: bookwyrm/models/link.py:72 bookwyrm/templates/import/import_status.html:214 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" @@ -171,25 +171,25 @@ msgstr "" msgid "Domain block" msgstr "" -#: bookwyrm/models/book.py:283 +#: bookwyrm/models/book.py:282 msgid "Audiobook" -msgstr "" +msgstr "有聲書" -#: bookwyrm/models/book.py:284 +#: bookwyrm/models/book.py:283 msgid "eBook" msgstr "電子書" -#: bookwyrm/models/book.py:285 +#: bookwyrm/models/book.py:284 msgid "Graphic novel" -msgstr "" +msgstr "圖像小說" + +#: bookwyrm/models/book.py:285 +msgid "Hardcover" +msgstr "精裝書" #: bookwyrm/models/book.py:286 -msgid "Hardcover" -msgstr "" - -#: bookwyrm/models/book.py:287 msgid "Paperback" -msgstr "" +msgstr "平裝書" #: bookwyrm/models/federated_server.py:11 #: bookwyrm/templates/settings/federation/edit_instance.html:55 @@ -205,26 +205,26 @@ msgstr "跨站" msgid "Blocked" msgstr "已封鎖" -#: bookwyrm/models/fields.py:29 +#: bookwyrm/models/fields.py:35 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "%(value)s 不是有效的 remote_id" -#: bookwyrm/models/fields.py:38 bookwyrm/models/fields.py:47 +#: bookwyrm/models/fields.py:44 bookwyrm/models/fields.py:53 #, python-format msgid "%(value)s is not a valid username" msgstr "%(value)s 不是有效的使用者名稱" -#: bookwyrm/models/fields.py:192 bookwyrm/templates/layout.html:128 +#: bookwyrm/models/fields.py:198 bookwyrm/templates/layout.html:129 #: bookwyrm/templates/ostatus/error.html:29 msgid "username" msgstr "使用者名稱" -#: bookwyrm/models/fields.py:197 +#: bookwyrm/models/fields.py:203 msgid "A user with that username already exists." msgstr "已經存在使用該名稱的使用者。" -#: bookwyrm/models/fields.py:216 +#: bookwyrm/models/fields.py:222 #: bookwyrm/templates/snippets/privacy-icons.html:3 #: bookwyrm/templates/snippets/privacy-icons.html:4 #: bookwyrm/templates/snippets/privacy_select.html:11 @@ -232,7 +232,7 @@ msgstr "已經存在使用該名稱的使用者。" msgid "Public" msgstr "公開" -#: bookwyrm/models/fields.py:217 +#: bookwyrm/models/fields.py:223 #: bookwyrm/templates/snippets/privacy-icons.html:7 #: bookwyrm/templates/snippets/privacy-icons.html:8 #: bookwyrm/templates/snippets/privacy_select.html:14 @@ -240,7 +240,7 @@ msgstr "公開" msgid "Unlisted" msgstr "不公開" -#: bookwyrm/models/fields.py:218 +#: bookwyrm/models/fields.py:224 #: bookwyrm/templates/snippets/privacy_select.html:17 #: bookwyrm/templates/user/relationships/followers.html:6 #: bookwyrm/templates/user/relationships/followers.html:11 @@ -249,7 +249,7 @@ msgstr "不公開" msgid "Followers" msgstr "關注者" -#: bookwyrm/models/fields.py:219 +#: bookwyrm/models/fields.py:225 #: bookwyrm/templates/snippets/create_status/post_options_block.html:6 #: bookwyrm/templates/snippets/privacy-icons.html:15 #: bookwyrm/templates/snippets/privacy-icons.html:16 @@ -258,49 +258,48 @@ msgstr "關注者" msgid "Private" msgstr "私密" -#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:174 +#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:174 #: bookwyrm/templates/settings/imports/imports.html:98 -#: bookwyrm/templates/settings/users/user_admin.html:81 -#: bookwyrm/templates/settings/users/user_info.html:28 +#: bookwyrm/templates/snippets/user_active_tag.html:8 msgid "Active" msgstr "活躍" -#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:172 +#: bookwyrm/models/import_job.py:50 bookwyrm/templates/import/import.html:172 msgid "Complete" -msgstr "" +msgstr "已完成" -#: bookwyrm/models/import_job.py:50 +#: bookwyrm/models/import_job.py:51 msgid "Stopped" -msgstr "" +msgstr "已停止" -#: bookwyrm/models/import_job.py:83 bookwyrm/models/import_job.py:91 +#: bookwyrm/models/import_job.py:84 bookwyrm/models/import_job.py:92 msgid "Import stopped" -msgstr "" +msgstr "匯入已停止" -#: bookwyrm/models/import_job.py:363 bookwyrm/models/import_job.py:388 +#: bookwyrm/models/import_job.py:356 bookwyrm/models/import_job.py:381 msgid "Error loading book" msgstr "" -#: bookwyrm/models/import_job.py:372 +#: bookwyrm/models/import_job.py:365 msgid "Could not find a match for book" msgstr "" #: bookwyrm/models/link.py:51 msgid "Free" -msgstr "" +msgstr "免費" #: bookwyrm/models/link.py:52 msgid "Purchasable" -msgstr "" +msgstr "可購買" #: bookwyrm/models/link.py:53 msgid "Available for loan" -msgstr "" +msgstr "可借閱" #: bookwyrm/models/link.py:70 #: bookwyrm/templates/settings/link_domains/link_domains.html:23 msgid "Approved" -msgstr "" +msgstr "已核准" #: bookwyrm/models/report.py:84 #: bookwyrm/templates/settings/reports/report.html:115 @@ -310,11 +309,11 @@ msgstr "評論" #: bookwyrm/models/report.py:85 msgid "Resolved report" -msgstr "" +msgstr "已處理的舉報" #: bookwyrm/models/report.py:86 msgid "Re-opened report" -msgstr "" +msgstr "已重新打開的舉報" #: bookwyrm/models/report.py:87 msgid "Messaged reporter" @@ -352,122 +351,143 @@ msgstr "" msgid "Deleted item" msgstr "" -#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:307 +#: bookwyrm/models/user.py:33 bookwyrm/templates/book/book.html:307 msgid "Reviews" msgstr "書評" -#: bookwyrm/models/user.py:33 -msgid "Comments" -msgstr "" - #: bookwyrm/models/user.py:34 -msgid "Quotations" -msgstr "" +msgid "Comments" +msgstr "評論" #: bookwyrm/models/user.py:35 -msgid "Everything else" -msgstr "" +msgid "Quotations" +msgstr "引用" -#: bookwyrm/settings.py:223 +#: bookwyrm/models/user.py:36 +msgid "Everything else" +msgstr "所有其他內容" + +#: bookwyrm/settings.py:232 msgid "Home Timeline" msgstr "主頁時間線" -#: bookwyrm/settings.py:223 +#: bookwyrm/settings.py:232 msgid "Home" msgstr "主頁" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 msgid "Books Timeline" -msgstr "" +msgstr "書目時間線" -#: bookwyrm/settings.py:224 +#: bookwyrm/settings.py:233 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 -#: bookwyrm/templates/user/layout.html:97 +#: bookwyrm/templates/user/layout.html:107 msgid "Books" msgstr "書目" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:313 msgid "English" msgstr "English(英語)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:314 msgid "Català (Catalan)" -msgstr "" +msgstr "Català (加泰羅尼亞語)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:315 msgid "Deutsch (German)" msgstr "Deutsch(德語)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:316 msgid "Esperanto (Esperanto)" -msgstr "" +msgstr "Esperanto (世界語)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:317 msgid "Español (Spanish)" msgstr "Español(西班牙語)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:318 msgid "Euskara (Basque)" -msgstr "" +msgstr "Euskara (巴斯克語)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:319 msgid "Galego (Galician)" -msgstr "" +msgstr "Galego (加利西亞語)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:320 msgid "Italiano (Italian)" -msgstr "" +msgstr "Italiano (意大利語)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:321 msgid "Suomi (Finnish)" -msgstr "" +msgstr "Suomi (芬蘭語)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:322 msgid "Français (French)" msgstr "Français(法語)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:323 msgid "Lietuvių (Lithuanian)" -msgstr "" +msgstr "Lietuvių (立陶宛語)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:324 msgid "Nederlands (Dutch)" -msgstr "" +msgstr "Nederlands (荷蘭語)" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:325 msgid "Norsk (Norwegian)" -msgstr "" +msgstr "Norsk (挪威語)" -#: bookwyrm/settings.py:309 +#: bookwyrm/settings.py:326 msgid "Polski (Polish)" -msgstr "" +msgstr "Polski (波蘭語)" -#: bookwyrm/settings.py:310 +#: bookwyrm/settings.py:327 msgid "Português do Brasil (Brazilian Portuguese)" -msgstr "" +msgstr "Português do Brasil (巴西葡萄牙語)" -#: bookwyrm/settings.py:311 +#: bookwyrm/settings.py:328 msgid "Português Europeu (European Portuguese)" -msgstr "" +msgstr "Português Europeu (歐洲葡萄牙語)" -#: bookwyrm/settings.py:312 +#: bookwyrm/settings.py:329 msgid "Română (Romanian)" -msgstr "" +msgstr "Română (羅馬尼亞語)" -#: bookwyrm/settings.py:313 +#: bookwyrm/settings.py:330 msgid "Svenska (Swedish)" +msgstr "Svenska (瑞典語)" + +#: bookwyrm/settings.py:331 +msgid "Українська (Ukrainian)" msgstr "" -#: bookwyrm/settings.py:314 +#: bookwyrm/settings.py:332 msgid "简体中文 (Simplified Chinese)" msgstr "簡體中文" -#: bookwyrm/settings.py:315 +#: bookwyrm/settings.py:333 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文" +#: bookwyrm/templates/403.html:5 +msgid "Oh no!" +msgstr "" + +#: bookwyrm/templates/403.html:9 bookwyrm/templates/landing/invite.html:21 +msgid "Permission Denied" +msgstr "沒有權限" + +#: bookwyrm/templates/403.html:11 +#, python-format +msgid "You do not have permission to view this page or perform this action. Your user permission level is %(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,
    their average rating is %(rating_average)s" msgid_plural "%(display_name)s left %(ratings_total)s ratings,
    their average rating is %(rating_average)s" -msgstr[0] "" +msgstr[0] "%(display_name)s 留下了 %(ratings_total)s 條評分,
    他的平均評分是 %(rating_average)s" #: bookwyrm/templates/annual_summary/layout.html:240 msgid "Their best rated review" @@ -732,7 +766,7 @@ msgstr "編輯作者" #: bookwyrm/templates/author/author.html:36 msgid "Author details" -msgstr "" +msgstr "作者詳情" #: bookwyrm/templates/author/author.html:40 #: bookwyrm/templates/author/edit_author.html:42 @@ -749,7 +783,7 @@ msgstr "逝世:" #: bookwyrm/templates/author/author.html:66 msgid "External links" -msgstr "" +msgstr "外部連結" #: bookwyrm/templates/author/author.html:71 msgid "Wikipedia" @@ -757,47 +791,43 @@ msgstr "維基百科" #: bookwyrm/templates/author/author.html:79 msgid "Website" -msgstr "" +msgstr "網站" #: bookwyrm/templates/author/author.html:87 msgid "View ISNI record" -msgstr "" +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 "" +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 "" +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 檢視" #: bookwyrm/templates/author/author.html:135 msgid "View on LibraryThing" -msgstr "" +msgstr "在 LibraryThing 查看" #: bookwyrm/templates/author/author.html:143 msgid "View on Goodreads" -msgstr "" +msgstr "在 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 "%(name)s 所著的書" @@ -849,7 +879,7 @@ msgstr "維基百科連結:" #: bookwyrm/templates/author/edit_author.html:60 msgid "Website:" -msgstr "" +msgstr "網站:" #: bookwyrm/templates/author/edit_author.html:65 msgid "Birth date:" @@ -883,11 +913,11 @@ msgstr "Goodreads key:" #: bookwyrm/templates/author/edit_author.html:109 msgid "ISFDB:" -msgstr "" +msgstr "ISFDB:" #: bookwyrm/templates/author/edit_author.html:116 msgid "ISNI:" -msgstr "" +msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:126 #: bookwyrm/templates/book/book.html:220 @@ -906,7 +936,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" @@ -953,23 +983,23 @@ msgstr "確認" #: bookwyrm/templates/book/book.html:20 msgid "Unable to connect to remote source." -msgstr "" +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 "" +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 "" +msgstr "點擊放大" #: bookwyrm/templates/book/book.html:196 #, python-format @@ -991,7 +1021,7 @@ msgstr "描述:" #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" -msgstr[0] "" +msgstr[0] "%(count)s 版次" #: bookwyrm/templates/book/book.html:246 msgid "You have shelved this edition in:" @@ -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 "列表" @@ -1070,11 +1100,11 @@ msgstr "ISBN:" #: bookwyrm/templates/book/book_identifiers.html:12 #: bookwyrm/templates/book/book_identifiers.html:13 msgid "Copy ISBN" -msgstr "" +msgstr "複製ISBN" #: bookwyrm/templates/book/book_identifiers.html:16 msgid "Copied ISBN!" -msgstr "" +msgstr "已複製ISBN!" #: bookwyrm/templates/book/book_identifiers.html:23 #: bookwyrm/templates/book/edit/edit_book_form.html:352 @@ -1089,16 +1119,16 @@ msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 #: bookwyrm/templates/book/edit/edit_book_form.html:370 msgid "Audible ASIN:" -msgstr "" +msgstr "Audible ASIN:" #: bookwyrm/templates/book/book_identifiers.html:44 #: bookwyrm/templates/book/edit/edit_book_form.html:379 msgid "ISFDB ID:" -msgstr "" +msgstr "ISFDB ID:" #: bookwyrm/templates/book/book_identifiers.html:51 msgid "Goodreads:" -msgstr "" +msgstr "Goodreads:" #: bookwyrm/templates/book/cover_add_modal.html:5 msgid "Add cover" @@ -1111,12 +1141,12 @@ 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" -msgstr "" +msgstr "書籍封面預覽" #: bookwyrm/templates/book/cover_show_modal.html:11 #: bookwyrm/templates/components/inline_form.html:8 @@ -1310,19 +1340,19 @@ msgstr "新增作者:" #: bookwyrm/templates/book/edit/edit_book_form.html:211 #: bookwyrm/templates/book/edit/edit_book_form.html:214 msgid "Add Author" -msgstr "" +msgstr "新增作者" #: bookwyrm/templates/book/edit/edit_book_form.html:212 #: bookwyrm/templates/book/edit/edit_book_form.html:215 msgid "Jane Doe" -msgstr "" +msgstr "陳大文" #: bookwyrm/templates/book/edit/edit_book_form.html:221 msgid "Add Another Author" -msgstr "" +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 "封面" @@ -1337,7 +1367,7 @@ msgstr "格式:" #: bookwyrm/templates/book/edit/edit_book_form.html:280 msgid "Format details:" -msgstr "" +msgstr "裝訂詳情:" #: bookwyrm/templates/book/edit/edit_book_form.html:291 msgid "Pages:" @@ -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 "在 %(date)s 由 %(publisher)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 "" #: 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 "" @@ -1879,20 +1911,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 "" @@ -1902,7 +1934,7 @@ msgid "Direct Messages with %(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 "" #: 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 "" 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 "抱歉!此邀請碼已不再有效。" @@ -3129,7 +3153,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 "登入" @@ -3140,7 +3164,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 "使用者名稱:" @@ -3148,13 +3172,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 "忘記了密碼?" @@ -3197,35 +3221,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 "" @@ -3417,6 +3441,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 "移除" @@ -3484,6 +3509,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\"" @@ -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 -msgid "Data" +#: 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: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\"" @@ -4557,7 +4684,7 @@ msgid "Streams" msgstr "" #: bookwyrm/templates/settings/celery.html:32 -msgid "Broadcasts" +msgid "Broadcast" msgstr "" #: bookwyrm/templates/settings/celery.html:38 @@ -4904,7 +5031,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 "活動" @@ -5092,7 +5219,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 "邀請" @@ -5566,57 +5693,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 "" -#: 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